From 01eda7f36ad206e3ec47fbc90c5b414517a8746b Mon Sep 17 00:00:00 2001 From: Ed Sanders Date: Wed, 10 Apr 2013 19:15:15 +0100 Subject: [PATCH] Create MWTemplateNode This node stores the rendered in the index-value store, hashed on a custom hash of the dm (type + mw) which makes it unique it its parameters. Bug: 46571 Change-Id: I0ab4c9f7bca207121d5b42e83c821771b6139da8 --- VisualEditor.php | 2 + demos/ve/index.php | 4 +- modules/ve/ce/nodes/ve.ce.MWTemplateNode.js | 42 +++++++++++++ modules/ve/dm/nodes/ve.dm.MWTemplateNode.js | 67 +++++++++++++++++++++ modules/ve/test/dm/ve.dm.Converter.test.js | 4 +- modules/ve/test/dm/ve.dm.example.js | 28 +++++++++ modules/ve/test/index.php | 2 + 7 files changed, 146 insertions(+), 3 deletions(-) create mode 100644 modules/ve/ce/nodes/ve.ce.MWTemplateNode.js create mode 100644 modules/ve/dm/nodes/ve.dm.MWTemplateNode.js diff --git a/VisualEditor.php b/VisualEditor.php index 469a029ede..47305a9359 100644 --- a/VisualEditor.php +++ b/VisualEditor.php @@ -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', diff --git a/demos/ve/index.php b/demos/ve/index.php index bbb499f67c..d2d29069a8 100644 --- a/demos/ve/index.php +++ b/demos/ve/index.php @@ -161,6 +161,7 @@ $html = file_get_contents( $page ); + @@ -204,8 +205,9 @@ $html = file_get_contents( $page ); - + + diff --git a/modules/ve/ce/nodes/ve.ce.MWTemplateNode.js b/modules/ve/ce/nodes/ve.ce.MWTemplateNode.js new file mode 100644 index 0000000000..fab1119a3c --- /dev/null +++ b/modules/ve/ce/nodes/ve.ce.MWTemplateNode.js @@ -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 ); diff --git a/modules/ve/dm/nodes/ve.dm.MWTemplateNode.js b/modules/ve/dm/nodes/ve.dm.MWTemplateNode.js new file mode 100644 index 0000000000..22d1ee7ee4 --- /dev/null +++ b/modules/ve/dm/nodes/ve.dm.MWTemplateNode.js @@ -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 ); diff --git a/modules/ve/test/dm/ve.dm.Converter.test.js b/modules/ve/test/dm/ve.dm.Converter.test.js index 88a03de574..6c994371fc 100644 --- a/modules/ve/test/dm/ve.dm.Converter.test.js +++ b/modules/ve/test/dm/ve.dm.Converter.test.js @@ -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 ); diff --git a/modules/ve/test/dm/ve.dm.example.js b/modules/ve/test/dm/ve.dm.example.js index 093459b1a8..e2ad6a001a 100644 --- a/modules/ve/test/dm/ve.dm.example.js +++ b/modules/ve/test/dm/ve.dm.example.js @@ -715,6 +715,8 @@ ve.dm.example.conversions = { }; ve.dm.example.MWImageHtml = 'Wiki.png'; +ve.dm.example.MWTemplateSpan = ''; +ve.dm.example.MWTemplateContent = '

Hello, world!

'; ve.dm.example.domToDataCases = { 'paragraph with plain text': { @@ -775,6 +777,32 @@ ve.dm.example.domToDataCases = { { 'type': '/paragraph' } ] }, + 'mw:Template': { + 'html': '' + ve.dm.example.MWTemplateSpan + ve.dm.example.MWTemplateContent + '', + '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': '

abc

', 'data': [ diff --git a/modules/ve/test/index.php b/modules/ve/test/index.php index 7ec6876289..13910bbdd7 100644 --- a/modules/ve/test/index.php +++ b/modules/ve/test/index.php @@ -104,6 +104,7 @@ + @@ -149,6 +150,7 @@ +