Add MWMetaNode to clean up <meta>/<link> hack in the converter

Change-Id: I4c69bff4981eef78415b43d31c3fd2ee271450ef
This commit is contained in:
Catrope 2013-02-20 09:07:57 -08:00
parent 314817925a
commit 04c72f6871
6 changed files with 44 additions and 9 deletions

View file

@ -241,6 +241,7 @@ $wgResourceModules += array(
've/dm/nodes/ve.dm.ListNode.js',
've/dm/nodes/ve.dm.MetaNode.js',
've/dm/nodes/ve.dm.MWEntityNode.js',
've/dm/nodes/ve.dm.MWMetaNode.js',
've/dm/nodes/ve.dm.ParagraphNode.js',
've/dm/nodes/ve.dm.PreformattedNode.js',
've/dm/nodes/ve.dm.TableCellNode.js',

View file

@ -133,6 +133,7 @@ $html = file_get_contents( $page );
<script src="../../modules/ve/dm/nodes/ve.dm.ListNode.js"></script>
<script src="../../modules/ve/dm/nodes/ve.dm.MetaNode.js"></script>
<script src="../../modules/ve/dm/nodes/ve.dm.MWEntityNode.js"></script>
<script src="../../modules/ve/dm/nodes/ve.dm.MWMetaNode.js"></script>
<script src="../../modules/ve/dm/nodes/ve.dm.ParagraphNode.js"></script>
<script src="../../modules/ve/dm/nodes/ve.dm.PreformattedNode.js"></script>
<script src="../../modules/ve/dm/nodes/ve.dm.TableCellNode.js"></script>

View file

@ -0,0 +1,40 @@
/*!
* VisualEditor DataModel MWMetaNode class.
*
* @copyright 2011-2013 VisualEditor Team and others; see AUTHORS.txt
* @license The MIT License (MIT); see LICENSE.txt
*/
/**
* DataModel MW-specific meta node.
*
* @class
* @abstract
* @extends ve.dm.MetaNode
* @constructor
* @param {string} name Node name
* @param {number} [length] Length of content data in document; ignored and overridden to 0
* @param {Object} [element] Reference to element in linear model
*/
ve.dm.MWMetaNode = function VeDmMWMetaNode( name, length, element ) {
// Parent constructor
ve.dm.LeafNode.call( this, name, 0, element );
};
/* Inheritance */
ve.inheritClass( ve.dm.MWMetaNode, ve.dm.MetaNode );
/* Static Properties */
ve.dm.MWMetaNode.static.name = 'MWmeta';
ve.dm.MWMetaNode.static.matchRdfaTypes = [ /^mw:/ ];
// toDataElement inherited from MetaNode, will return regular metaBlock/metaInline elements but
// that's fine. This class is only here so that <meta>/<link> tags with an mw: type are correctly
// mapped to MetaNode and aren't alienated.
/* Registration */
ve.dm.modelRegistry.register( ve.dm.MWMetaNode );

View file

@ -16,7 +16,7 @@
* @param {number} [length] Length of content data in document; ignored and overridden to 0
* @param {Object} [element] Reference to element in linear model
*/
ve.dm.MetaNode = function VeDmMetaBlockNode( name, length, element ) {
ve.dm.MetaNode = function VeDmMetaNode( name, length, element ) {
// Parent constructor
ve.dm.LeafNode.call( this, name, 0, element );
};

View file

@ -260,14 +260,6 @@ ve.dm.Converter.prototype.getDataFromDomRecursion = function ( domElement, annot
case Node.ELEMENT_NODE:
modelName = this.modelRegistry.matchElement( childDomElement );
modelClass = this.modelRegistry.lookup( modelName ) || ve.dm.AlienNode;
// HACK: force MetaNode for <meta>/<link> even if they have an mw: type
// FIXME EWWWWWW find a better way to handle this
if (
( childDomElement.nodeName.toLowerCase() === 'meta' || childDomElement.nodeName.toLowerCase() === 'link' ) &&
( modelClass.prototype instanceof ve.dm.AlienNode || modelClass === ve.dm.AlienNode )
) {
modelClass = ve.dm.MetaNode;
}
if ( modelClass.prototype instanceof ve.dm.Annotation ) {
annotation = this.annotationFactory.create( modelName, childDomElement );

View file

@ -80,6 +80,7 @@
<script src="../../ve/dm/nodes/ve.dm.ListNode.js"></script>
<script src="../../ve/dm/nodes/ve.dm.MetaNode.js"></script>
<script src="../../ve/dm/nodes/ve.dm.MWEntityNode.js"></script>
<script src="../../ve/dm/nodes/ve.dm.MWMetaNode.js"></script>
<script src="../../ve/dm/nodes/ve.dm.ParagraphNode.js"></script>
<script src="../../ve/dm/nodes/ve.dm.PreformattedNode.js"></script>
<script src="../../ve/dm/nodes/ve.dm.TableCellNode.js"></script>