Merge "Create MWTemplateNode"

This commit is contained in:
jenkins-bot 2013-04-12 19:06:43 +00:00 committed by Gerrit Code Review
commit b9412011cb
7 changed files with 146 additions and 3 deletions

View file

@ -274,6 +274,7 @@ $wgResourceModules += array(
've/dm/nodes/ve.dm.MWHeadingNode.js',
've/dm/nodes/ve.dm.MWImageNode.js',
've/dm/nodes/ve.dm.MWPreformattedNode.js',
've/dm/nodes/ve.dm.MWTemplateNode.js',
've/dm/annotations/ve.dm.LinkAnnotation.js',
've/dm/annotations/ve.dm.MWExternalLinkAnnotation.js',
@ -325,6 +326,7 @@ $wgResourceModules += array(
've/ce/nodes/ve.ce.MWHeadingNode.js',
've/ce/nodes/ve.ce.MWImageNode.js',
've/ce/nodes/ve.ce.MWPreformattedNode.js',
've/ce/nodes/ve.ce.MWTemplateNode.js',
've/ce/annotations/ve.ce.LinkAnnotation.js',
've/ce/annotations/ve.ce.MWExternalLinkAnnotation.js',

View file

@ -161,6 +161,7 @@ $html = file_get_contents( $page );
<script src="../../modules/ve/dm/nodes/ve.dm.MWHeadingNode.js"></script>
<script src="../../modules/ve/dm/nodes/ve.dm.MWImageNode.js"></script>
<script src="../../modules/ve/dm/nodes/ve.dm.MWPreformattedNode.js"></script>
<script src="../../modules/ve/dm/nodes/ve.dm.MWTemplateNode.js"></script>
<script src="../../modules/ve/dm/annotations/ve.dm.LinkAnnotation.js"></script>
<script src="../../modules/ve/dm/annotations/ve.dm.MWExternalLinkAnnotation.js"></script>
<script src="../../modules/ve/dm/annotations/ve.dm.MWInternalLinkAnnotation.js"></script>
@ -204,8 +205,9 @@ $html = file_get_contents( $page );
<script src="../../modules/ve/ce/nodes/ve.ce.TextNode.js"></script>
<script src="../../modules/ve/ce/nodes/ve.ce.MWEntityNode.js"></script>
<script src="../../modules/ve/ce/nodes/ve.ce.MWHeadingNode.js"></script>
<script src="../../modules/ve/ce/nodes/ve.ce.MWPreformattedNode.js"></script>
<script src="../../modules/ve/ce/nodes/ve.ce.MWImageNode.js"></script>
<script src="../../modules/ve/ce/nodes/ve.ce.MWPreformattedNode.js"></script>
<script src="../../modules/ve/ce/nodes/ve.ce.MWTemplateNode.js"></script>
<script src="../../modules/ve/ce/annotations/ve.ce.LinkAnnotation.js"></script>
<script src="../../modules/ve/ce/annotations/ve.ce.MWExternalLinkAnnotation.js"></script>
<script src="../../modules/ve/ce/annotations/ve.ce.MWInternalLinkAnnotation.js"></script>

View file

@ -0,0 +1,42 @@
/*!
* VisualEditor ContentEditable MWTemplate class.
*
* @copyright 2011-2013 VisualEditor Team and others; see AUTHORS.txt
* @license The MIT License (MIT); see LICENSE.txt
*/
/**
* ContentEditable MediaWiki template node.
*
* @class
* @abstract
* @extends ve.ce.GeneratedContentNode
* @constructor
* @param {ve.dm.MWTemplateNode} model Model to observe
*/
ve.ce.MWTemplateNode = function VeCeMWTemplateNode( model ) {
// Parent constructor
ve.ce.GeneratedContentNode.call( this, model );
// DOM Changes
this.$.addClass( 've-ce-MWTemplateNode' );
};
/* Inheritance */
ve.inheritClass( ve.ce.MWTemplateNode, ve.ce.GeneratedContentNode );
/* Static Properties */
ve.ce.MWTemplateNode.static.name = 'MWtemplate';
/* Methods */
ve.ce.MWTemplateNode.prototype.generateContents = function () {
// TODO: return $.ajax( api call to get new contents )
return new $.Deferred();
};
/* Registration */
ve.ce.nodeFactory.register( ve.ce.MWTemplateNode );

View file

@ -0,0 +1,67 @@
/*!
* VisualEditor DataModel MWTemplateNode class.
*
* @copyright 2011-2013 VisualEditor Team and others; see AUTHORS.txt
* @license The MIT License (MIT); see LICENSE.txt
*/
/**
* DataModel MediaWiki template node.
*
* @class
* @abstract
* @extends ve.dm.GeneratedContentNode
* @constructor
* @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.MWTemplateNode = function VeDmMWTemplateNode( length, element ) {
// Parent constructor
ve.dm.GeneratedContentNode.call( this, 0, element );
};
/* Inheritance */
ve.inheritClass( ve.dm.MWTemplateNode, ve.dm.GeneratedContentNode );
/* Static members */
ve.dm.MWTemplateNode.static.name = 'MWtemplate';
ve.dm.MWTemplateNode.static.matchTagNames = null;
ve.dm.MWTemplateNode.static.matchRdfaTypes = [ 'mw:Object/Template' ];
ve.dm.MWTemplateNode.static.getHashObject = function ( dataElement ) {
return {
type: dataElement.type,
mw: dataElement.mw
};
};
ve.dm.MWTemplateNode.static.toDataElement = function ( domElements, converter ) {
var dataElement,
about = domElements[0].getAttribute( 'about' ),
mw = JSON.parse( domElements[0].getAttribute( 'data-mw' ) );
dataElement = {
'type': this.name,
'mw': mw,
'about': about
};
this.storeHtml( dataElement, domElements, converter.getStore() );
return dataElement;
};
ve.dm.MWTemplateNode.static.toDomElements = function ( dataElement, doc ) {
var span = doc.createElement( 'span' );
// All we need to send back to Parsoid is the original template marker,
// with a reconstructed data-mw property.
span.setAttribute( 'about', dataElement.about );
span.setAttribute( 'typeof', 'mw:Object/Template' );
span.setAttribute( 'data-mw', JSON.stringify( dataElement.mw ) );
return [ span ];
};
/* Registration */
ve.dm.modelRegistry.register( ve.dm.MWTemplateNode );

View file

@ -39,7 +39,7 @@ QUnit.test( 'getDomElementsFromDataElement', 20, function ( assert ) {
}
} );
QUnit.test( 'getDataFromDom', 51, function ( assert ) {
QUnit.test( 'getDataFromDom', 52, function ( assert ) {
var msg,
store = new ve.dm.IndexValueStore(),
cases = ve.copyObject( ve.dm.example.domToDataCases );
@ -61,7 +61,7 @@ QUnit.test( 'getDataFromDom', 51, function ( assert ) {
}
} );
QUnit.test( 'getDomFromData', 55, function ( assert ) {
QUnit.test( 'getDomFromData', 56, function ( assert ) {
var msg,
store = new ve.dm.IndexValueStore(),
cases = ve.copyObject( ve.dm.example.domToDataCases );

View file

@ -715,6 +715,8 @@ ve.dm.example.conversions = {
};
ve.dm.example.MWImageHtml = '<a rel="mw:Image" href="./File:Wiki.png" data-parsoid="{&quot;tsr&quot;:[158,216],&quot;src&quot;:&quot;[[Image:Wiki.png|500px|thumb|center|Example wiki file]]&quot;,&quot;optNames&quot;:{&quot;width&quot;:&quot;$1px&quot;},&quot;dsr&quot;:[158,216,null,null]}"><img height="" width="500" src="/index.php?title=Special:FilePath/Wiki.png&amp;width=500" alt="Wiki.png"></a>';
ve.dm.example.MWTemplateSpan = '<span about="#mwt1" typeof="mw:Object/Template" data-mw="{&quot;id&quot;:&quot;mwt1&quot;,&quot;target&quot;:{&quot;wt&quot;:&quot;Test&quot;},&quot;params&quot;:{&quot;1&quot;:{&quot;wt&quot;:&quot;Hello, world!&quot;}}}" data-parsoid="{&quot;tsr&quot;:[18,40],&quot;src&quot;:&quot;{{Test|Hello, world!}}&quot;,&quot;dsr&quot;:[18,40,null,null]}"></span>';
ve.dm.example.MWTemplateContent = '<p about="#mwt1" data-parsoid="{}">Hello, world!</p>';
ve.dm.example.domToDataCases = {
'paragraph with plain text': {
@ -775,6 +777,32 @@ ve.dm.example.domToDataCases = {
{ 'type': '/paragraph' }
]
},
'mw:Template': {
'html': '<body>' + ve.dm.example.MWTemplateSpan + ve.dm.example.MWTemplateContent + '</body>',
'data': [
{
'type': 'MWtemplate',
'mw': {
'id': 'mwt1',
'target': { 'wt' : 'Test' },
'params': {
'1': { 'wt': 'Hello, world!' }
}
},
'about': '#mwt1',
'attributes': {
'html/0/about': '#mwt1',
'html/0/data-mw': '{\"id\":\"mwt1\",\"target\":{\"wt\":\"Test\"},\"params\":{\"1\":{\"wt\":\"Hello, world!\"}}}',
'html/0/data-parsoid': '{\"tsr\":[18,40],\"src\":\"{{Test|Hello, world!}}\",\"dsr\":[18,40,null,null]}',
'html/0/typeof': 'mw:Object/Template',
'html/1/about': '#mwt1',
'html/1/data-parsoid': '{}'
},
},
{ 'type': '/MWtemplate' },
],
'normalizedHtml': ve.dm.example.MWTemplateSpan
},
'paragraph with alienInline inside': {
'html': '<body><p>a<tt class="foo">b</tt>c</p></body>',
'data': [

View file

@ -104,6 +104,7 @@
<script src="../../ve/dm/nodes/ve.dm.MWHeadingNode.js"></script>
<script src="../../ve/dm/nodes/ve.dm.MWImageNode.js"></script>
<script src="../../ve/dm/nodes/ve.dm.MWPreformattedNode.js"></script>
<script src="../../ve/dm/nodes/ve.dm.MWTemplateNode.js"></script>
<script src="../../ve/dm/annotations/ve.dm.LinkAnnotation.js"></script>
<script src="../../ve/dm/annotations/ve.dm.MWExternalLinkAnnotation.js"></script>
<script src="../../ve/dm/annotations/ve.dm.MWInternalLinkAnnotation.js"></script>
@ -149,6 +150,7 @@
<script src="../../ve/ce/nodes/ve.ce.MWHeadingNode.js"></script>
<script src="../../ve/ce/nodes/ve.ce.MWImageNode.js"></script>
<script src="../../ve/ce/nodes/ve.ce.MWPreformattedNode.js"></script>
<script src="../../ve/ce/nodes/ve.ce.MWTemplateNode.js"></script>
<script src="../../ve/ce/annotations/ve.ce.LinkAnnotation.js"></script>
<script src="../../ve/ce/annotations/ve.ce.MWExternalLinkAnnotation.js"></script>
<script src="../../ve/ce/annotations/ve.ce.MWInternalLinkAnnotation.js"></script>