Esanders has uploaded a new change for review.
https://gerrit.wikimedia.org/r/58549
Change subject: Create MWTemplateNode.
......................................................................
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.
Change-Id: I0ab4c9f7bca207121d5b42e83c821771b6139da8
---
M VisualEditor.php
M demos/ve/index.php
A modules/ve/ce/nodes/ve.ce.MWTemplateNode.js
A modules/ve/dm/nodes/ve.dm.MWTemplateNode.js
M modules/ve/test/dm/ve.dm.Converter.test.js
M modules/ve/test/dm/ve.dm.example.js
M modules/ve/test/index.php
7 files changed, 146 insertions(+), 3 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/VisualEditor
refs/changes/49/58549/1
diff --git a/VisualEditor.php b/VisualEditor.php
index 19bdc3d..7a71d8a 100644
--- a/VisualEditor.php
+++ b/VisualEditor.php
@@ -274,6 +274,7 @@
'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 @@
'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 c0da99d..457a240 100644
--- a/demos/ve/index.php
+++ b/demos/ve/index.php
@@ -160,6 +160,7 @@
<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>
@@ -203,8 +204,9 @@
<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>
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 0000000..fab1119
--- /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 0000000..69c8bb4
--- /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, context,
store ) {
+ 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, store );
+ 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 88a03de..6c99437 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( '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( '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 48111d6..3cfb7f1 100644
--- a/modules/ve/test/dm/ve.dm.example.js
+++ b/modules/ve/test/dm/ve.dm.example.js
@@ -710,6 +710,8 @@
};
ve.dm.example.MWImageHtml = '<a rel="mw:Image" href="./File:Wiki.png"
data-parsoid="{"tsr":[158,216],"src":"[[Image:Wiki.png|500px|thumb|center|Example
wiki
file]]","optNames":{"width":"$1px"},"dsr":[158,216,null,null]}"><img
height="" width="500"
src="/index.php?title=Special:FilePath/Wiki.png&width=500"
alt="Wiki.png"></a>';
+ve.dm.example.MWTemplateSpan = '<span about="#mwt1"
typeof="mw:Object/Template"
data-mw="{"id":"mwt1","target":{"wt":"Test"},"params":{"1":{"wt":"Hello,
world!"}}}"
data-parsoid="{"tsr":[18,40],"src":"{{Test|Hello,
world!}}","dsr":[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': {
@@ -758,6 +760,32 @@
{ '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': [
diff --git a/modules/ve/test/index.php b/modules/ve/test/index.php
index 7ec6876..13910bb 100644
--- a/modules/ve/test/index.php
+++ b/modules/ve/test/index.php
@@ -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>
--
To view, visit https://gerrit.wikimedia.org/r/58549
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I0ab4c9f7bca207121d5b42e83c821771b6139da8
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/VisualEditor
Gerrit-Branch: master
Gerrit-Owner: Esanders <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits