jenkins-bot has submitted this change and it was merged.

Change subject: Create MediaWiki specific nodes to contain MW specific rules.
......................................................................


Create MediaWiki specific nodes to contain MW specific rules.

Heading and Preformatted nodes have rules that should only
exist under a document node in MediaWiki.

Two new node types have been created as has a new DropdownTool which
uses these. The MW init options have been changed to use the new
DropdownTool.

Bug: 45295

Change-Id: I3f47e1ae1f5c1415bde58a75385e4bf5f4b8fffc
---
M VisualEditor.php
A modules/ve/ce/nodes/ve.ce.MWHeadingNode.js
A modules/ve/ce/nodes/ve.ce.MWPreformattedNode.js
A modules/ve/dm/nodes/ve.dm.MWHeadingNode.js
A modules/ve/dm/nodes/ve.dm.MWPreformattedNode.js
M modules/ve/dm/ve.dm.Node.js
M modules/ve/dm/ve.dm.NodeFactory.js
M modules/ve/init/mw/targets/ve.init.mw.ViewPageTarget.js
M modules/ve/test/dm/ve.dm.Converter.test.js
M modules/ve/test/index.php
A modules/ve/ui/tools/dropdowns/ve.ui.MWFormatDropdownTool.js
M modules/ve/ui/tools/ve.ui.DropdownTool.js
M modules/ve/ui/ve.ui.Tool.js
13 files changed, 259 insertions(+), 8 deletions(-)

Approvals:
  Catrope: Looks good to me, approved
  jenkins-bot: Verified



diff --git a/VisualEditor.php b/VisualEditor.php
index f42e4e5..52155f9 100644
--- a/VisualEditor.php
+++ b/VisualEditor.php
@@ -242,8 +242,6 @@
                        've/dm/nodes/ve.dm.ListItemNode.js',
                        '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',
@@ -251,6 +249,11 @@
                        've/dm/nodes/ve.dm.TableRowNode.js',
                        've/dm/nodes/ve.dm.TableSectionNode.js',
                        've/dm/nodes/ve.dm.TextNode.js',
+
+                       've/dm/nodes/ve.dm.MWEntityNode.js',
+                       've/dm/nodes/ve.dm.MWHeadingNode.js',
+                       've/dm/nodes/ve.dm.MWMetaNode.js',
+                       've/dm/nodes/ve.dm.MWPreformattedNode.js',
 
                        've/dm/annotations/ve.dm.LinkAnnotation.js',
                        've/dm/annotations/ve.dm.MWExternalLinkAnnotation.js',
@@ -281,7 +284,6 @@
                        've/ce/nodes/ve.ce.ImageNode.js',
                        've/ce/nodes/ve.ce.ListItemNode.js',
                        've/ce/nodes/ve.ce.ListNode.js',
-                       've/ce/nodes/ve.ce.MWEntityNode.js',
                        've/ce/nodes/ve.ce.ParagraphNode.js',
                        've/ce/nodes/ve.ce.PreformattedNode.js',
                        've/ce/nodes/ve.ce.TableCellNode.js',
@@ -289,6 +291,9 @@
                        've/ce/nodes/ve.ce.TableRowNode.js',
                        've/ce/nodes/ve.ce.TableSectionNode.js',
                        've/ce/nodes/ve.ce.TextNode.js',
+                       've/ce/nodes/ve.ce.MWEntityNode.js',
+                       've/ce/nodes/ve.ce.MWHeadingNode.js',
+                       've/ce/nodes/ve.ce.MWPreformattedNode.js',
 
                        // ui
                        've/ui/ve.ui.js',
@@ -337,6 +342,7 @@
                        've/ui/tools/buttons/ve.ui.UndoButtonTool.js',
 
                        've/ui/tools/dropdowns/ve.ui.FormatDropdownTool.js',
+                       've/ui/tools/dropdowns/ve.ui.MWFormatDropdownTool.js',
 
                        've/ui/inspectors/ve.ui.LinkInspector.js',
                        've/ui/inspectors/ve.ui.MWLinkInspector.js',
diff --git a/modules/ve/ce/nodes/ve.ce.MWHeadingNode.js 
b/modules/ve/ce/nodes/ve.ce.MWHeadingNode.js
new file mode 100644
index 0000000..61cff3f
--- /dev/null
+++ b/modules/ve/ce/nodes/ve.ce.MWHeadingNode.js
@@ -0,0 +1,34 @@
+/*!
+ * VisualEditor ContentEditable MWHeadingNode class.
+ *
+ * @copyright 2011-2013 VisualEditor Team and others; see AUTHORS.txt
+ * @license The MIT License (MIT); see LICENSE.txt
+ */
+
+/**
+ * ContentEditable MW heading node.
+ *
+ * @class
+ * @extends ve.ce.HeadingNode
+ * @constructor
+ * @param {ve.dm.MWHeadingNode} model Model to observe
+ */
+ve.ce.MWHeadingNode = function VeCeMWHeadingNode( model ) {
+       // Parent constructor
+       ve.ce.HeadingNode.call( this, model );
+};
+
+/* Inheritance */
+
+ve.inheritClass( ve.ce.MWHeadingNode, ve.ce.HeadingNode );
+
+/* Static Properties */
+
+// TODO: Make this static
+ve.ce.MWHeadingNode.domWrapperElementTypes = 
ve.ce.HeadingNode.domWrapperElementTypes;
+
+ve.ce.MWHeadingNode.static.name = 'MWheading';
+
+/* Registration */
+
+ve.ce.nodeFactory.register( ve.ce.MWHeadingNode );
diff --git a/modules/ve/ce/nodes/ve.ce.MWPreformattedNode.js 
b/modules/ve/ce/nodes/ve.ce.MWPreformattedNode.js
new file mode 100644
index 0000000..6dc20ff
--- /dev/null
+++ b/modules/ve/ce/nodes/ve.ce.MWPreformattedNode.js
@@ -0,0 +1,31 @@
+/*!
+ * VisualEditor ContentEditable MWPreformattedNode class.
+ *
+ * @copyright 2011-2013 VisualEditor Team and others; see AUTHORS.txt
+ * @license The MIT License (MIT); see LICENSE.txt
+ */
+
+/**
+ * ContentEditable MW preformatted node.
+ *
+ * @class
+ * @extends ve.ce.PreformattedNode
+ * @constructor
+ * @param {ve.dm.MWPreformattedNode} model Model to observe
+ */
+ve.ce.MWPreformattedNode = function VeCeMWPreformattedNode( model ) {
+       // Parent constructor
+       ve.ce.PreformattedNode.call( this, model );
+};
+
+/* Inheritance */
+
+ve.inheritClass( ve.ce.MWPreformattedNode, ve.ce.PreformattedNode );
+
+/* Static Properties */
+
+ve.ce.MWPreformattedNode.static.name = 'MWpreformatted';
+
+/* Registration */
+
+ve.ce.nodeFactory.register( ve.ce.MWPreformattedNode );
diff --git a/modules/ve/dm/nodes/ve.dm.MWHeadingNode.js 
b/modules/ve/dm/nodes/ve.dm.MWHeadingNode.js
new file mode 100644
index 0000000..5fba677
--- /dev/null
+++ b/modules/ve/dm/nodes/ve.dm.MWHeadingNode.js
@@ -0,0 +1,40 @@
+/*!
+ * VisualEditor DataModel MWHeadingNode class.
+ *
+ * @copyright 2011-2013 VisualEditor Team and others; see AUTHORS.txt
+ * @license The MIT License (MIT); see LICENSE.txt
+ */
+
+/**
+ * DataModel MW heading node.
+ *
+ * @class
+ * @extends ve.dm.HeadingNode
+ * @constructor
+ * @param {ve.dm.LeafNode[]} [children] Child nodes to attach
+ * @param {Object} [element] Reference to element in linear model
+ */
+ve.dm.MWHeadingNode = function VeDmMWHeadingNode( children, element ) {
+       // Parent constructor
+       ve.dm.HeadingNode.call( this, children, element );
+};
+
+/* Inheritance */
+
+ve.inheritClass( ve.dm.MWHeadingNode, ve.dm.HeadingNode );
+
+/* Static Properties */
+
+ve.dm.MWHeadingNode.static.name = 'MWheading';
+
+ve.dm.MWHeadingNode.static.suggestedParentNodeTypes = [ 'document' ];
+
+ve.dm.MWHeadingNode.static.toDataElement = function () {
+       var parentElement = ve.dm.HeadingNode.static.toDataElement.apply( this, 
arguments );
+       parentElement.type = 'MWheading';
+       return parentElement;
+};
+
+/* Registration */
+
+ve.dm.modelRegistry.register( ve.dm.MWHeadingNode );
diff --git a/modules/ve/dm/nodes/ve.dm.MWPreformattedNode.js 
b/modules/ve/dm/nodes/ve.dm.MWPreformattedNode.js
new file mode 100644
index 0000000..210d18f
--- /dev/null
+++ b/modules/ve/dm/nodes/ve.dm.MWPreformattedNode.js
@@ -0,0 +1,38 @@
+/*!
+ * VisualEditor DataModel MWPreformattedNode class.
+ *
+ * @copyright 2011-2013 VisualEditor Team and others; see AUTHORS.txt
+ * @license The MIT License (MIT); see LICENSE.txt
+ */
+
+/**
+ * DataModel MW preformatted node.
+ *
+ * @class
+ * @extends ve.dm.PreformattedNode
+ * @constructor
+ * @param {ve.dm.LeafNode[]} [children] Child nodes to attach
+ * @param {Object} [element] Reference to element in linear model
+ */
+ve.dm.MWPreformattedNode = function VeDmMWPreformattedNode( children, element 
) {
+       // Parent constructor
+       ve.dm.PreformattedNode.call( this, children, element );
+};
+
+/* Inheritance */
+
+ve.inheritClass( ve.dm.MWPreformattedNode, ve.dm.PreformattedNode );
+
+/* Static Properties */
+
+ve.dm.MWPreformattedNode.static.name = 'MWpreformatted';
+
+ve.dm.MWPreformattedNode.static.suggestedParentNodeTypes = [ 'document' ];
+
+ve.dm.MWPreformattedNode.static.toDataElement = function () {
+       return { 'type': 'MWpreformatted' };
+};
+
+/* Registration */
+
+ve.dm.modelRegistry.register( ve.dm.MWPreformattedNode );
diff --git a/modules/ve/dm/ve.dm.Node.js b/modules/ve/dm/ve.dm.Node.js
index 9daa4d9..0878a0b 100644
--- a/modules/ve/dm/ve.dm.Node.js
+++ b/modules/ve/dm/ve.dm.Node.js
@@ -245,6 +245,20 @@
 ve.dm.Node.static.parentNodeTypes = null;
 
 /**
+ * Array of suggested parent node types for this node type.
+ *
+ * These parent node types are allowed but the editor will avoid creating them.
+ *
+ * An empty array means this node type should not be the child of any node. 
null means this node type
+ * can be the child of any node type.
+ *
+ * @static
+ * @property {string[]|null} static.suggestedParentNodeTypes
+ * @inheritable
+ */
+ve.dm.Node.static.suggestedParentNodeTypes = null;
+
+/**
  * Default attributes to set for newly created linear model elements. These 
defaults will be used
  * when creating a new element in ve.dm.NodeFactory#getDataElement when there 
is no DOM node or
  * existing linear model element to base the attributes on.
@@ -281,6 +295,16 @@
 };
 
 /**
+ * Get suggested parent node types.
+ *
+ * @method
+ * @returns {string[]|null} List of node types suggested as parents or null if 
any type is suggested
+ */
+ve.dm.Node.prototype.getSuggestedParentNodeTypes = function () {
+       return this.constructor.static.suggestedParentNodeTypes;
+};
+
+/**
  * Check if the node can have children.
  *
  * @method
diff --git a/modules/ve/dm/ve.dm.NodeFactory.js 
b/modules/ve/dm/ve.dm.NodeFactory.js
index 0af0509..df364e1 100644
--- a/modules/ve/dm/ve.dm.NodeFactory.js
+++ b/modules/ve/dm/ve.dm.NodeFactory.js
@@ -75,6 +75,21 @@
 };
 
 /**
+ * Get suggested parent node types for a node.
+ *
+ * @method
+ * @param {string} type Node type
+ * @returns {string[]|null} List of node types suggested as parents or null if 
any type is suggested
+ * @throws {Error} Unknown node type
+ */
+ve.dm.NodeFactory.prototype.getSuggestedParentNodeTypes = function ( type ) {
+       if ( type in this.registry ) {
+               return this.registry[type].static.suggestedParentNodeTypes;
+       }
+       throw new Error( 'Unknown node type: ' + type );
+};
+
+/**
  * Check if a node can have children.
  *
  * @method
diff --git a/modules/ve/init/mw/targets/ve.init.mw.ViewPageTarget.js 
b/modules/ve/init/mw/targets/ve.init.mw.ViewPageTarget.js
index 4d32f75..793b165 100644
--- a/modules/ve/init/mw/targets/ve.init.mw.ViewPageTarget.js
+++ b/modules/ve/init/mw/targets/ve.init.mw.ViewPageTarget.js
@@ -60,7 +60,7 @@
                                // copy-pasted from ve.Surface except using 
mwLink for the link tool
                                'tools': [
                                        { 'name': 'history', 'items' : ['undo', 
'redo'] },
-                                       { 'name': 'textStyle', 'items' : 
['format'] },
+                                       { 'name': 'textStyle', 'items' : 
['mwFormat'] },
                                        { 'name': 'textStyle', 'items' : 
['bold', 'italic', 'mwLink', 'clear'] },
                                        { 'name': 'list', 'items' : ['number', 
'bullet', 'outdent', 'indent'] }
                                ]
diff --git a/modules/ve/test/dm/ve.dm.Converter.test.js 
b/modules/ve/test/dm/ve.dm.Converter.test.js
index e3ad994..f45855f 100644
--- a/modules/ve/test/dm/ve.dm.Converter.test.js
+++ b/modules/ve/test/dm/ve.dm.Converter.test.js
@@ -42,6 +42,11 @@
        var msg,
                cases = ve.dm.example.domToDataCases;
 
+       // TODO: this is a hack to make normal heading/preformatted
+       // nodes the most recently registered, instead of the MW versions
+       ve.dm.modelRegistry.register( ve.dm.HeadingNode );
+       ve.dm.modelRegistry.register( ve.dm.PreformattedNode );
+
        for ( msg in cases ) {
                if ( cases[msg].html !== null ) {
                        ve.dm.example.preprocessAnnotations( cases[msg].data );
diff --git a/modules/ve/test/index.php b/modules/ve/test/index.php
index 4a45302..e6f4250 100644
--- a/modules/ve/test/index.php
+++ b/modules/ve/test/index.php
@@ -82,8 +82,6 @@
                <script src="../../ve/dm/nodes/ve.dm.ListItemNode.js"></script>
                <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>
@@ -91,6 +89,10 @@
                <script src="../../ve/dm/nodes/ve.dm.TableRowNode.js"></script>
                <script 
src="../../ve/dm/nodes/ve.dm.TableSectionNode.js"></script>
                <script src="../../ve/dm/nodes/ve.dm.TextNode.js"></script>
+               <script src="../../ve/dm/nodes/ve.dm.MWEntityNode.js"></script>
+               <script src="../../ve/dm/nodes/ve.dm.MWHeadingNode.js"></script>
+               <script src="../../ve/dm/nodes/ve.dm.MWMetaNode.js"></script>
+               <script 
src="../../ve/dm/nodes/ve.dm.MWPreformattedNode.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>
@@ -117,7 +119,6 @@
                <script src="../../ve/ce/nodes/ve.ce.ImageNode.js"></script>
                <script src="../../ve/ce/nodes/ve.ce.ListItemNode.js"></script>
                <script src="../../ve/ce/nodes/ve.ce.ListNode.js"></script>
-               <script src="../../ve/ce/nodes/ve.ce.MWEntityNode.js"></script>
                <script src="../../ve/ce/nodes/ve.ce.ParagraphNode.js"></script>
                <script 
src="../../ve/ce/nodes/ve.ce.PreformattedNode.js"></script>
                <script src="../../ve/ce/nodes/ve.ce.TableCellNode.js"></script>
@@ -125,6 +126,9 @@
                <script src="../../ve/ce/nodes/ve.ce.TableRowNode.js"></script>
                <script 
src="../../ve/ce/nodes/ve.ce.TableSectionNode.js"></script>
                <script src="../../ve/ce/nodes/ve.ce.TextNode.js"></script>
+               <script src="../../ve/ce/nodes/ve.ce.MWEntityNode.js"></script>
+               <script src="../../ve/ce/nodes/ve.ce.MWHeadingNode.js"></script>
+               <script 
src="../../ve/ce/nodes/ve.ce.MWPreformattedNode.js"></script>
                <script src="../../ve/ui/ve.ui.js"></script>
                <script src="../../ve/ui/ve.ui.Context.js"></script>
                <script src="../../ve/ui/ve.ui.Frame.js"></script>
@@ -166,6 +170,7 @@
                <script 
src="../../ve/ui/tools/buttons/ve.ui.RedoButtonTool.js"></script>
                <script 
src="../../ve/ui/tools/buttons/ve.ui.UndoButtonTool.js"></script>
                <script 
src="../../ve/ui/tools/dropdowns/ve.ui.FormatDropdownTool.js"></script>
+               <script 
src="../../ve/ui/tools/dropdowns/ve.ui.MWFormatDropdownTool.js"></script>
                <script 
src="../../ve/ui/inspectors/ve.ui.LinkInspector.js"></script>
                <script 
src="../../ve/ui/inspectors/ve.ui.MWLinkInspector.js"></script>
 
diff --git a/modules/ve/ui/tools/dropdowns/ve.ui.MWFormatDropdownTool.js 
b/modules/ve/ui/tools/dropdowns/ve.ui.MWFormatDropdownTool.js
new file mode 100644
index 0000000..14d0878
--- /dev/null
+++ b/modules/ve/ui/tools/dropdowns/ve.ui.MWFormatDropdownTool.js
@@ -0,0 +1,41 @@
+/*!
+ * VisualEditor UserInterface MWFormatDropdownTool class.
+ *
+ * @copyright 2011-2013 VisualEditor Team and others; see AUTHORS.txt
+ * @license The MIT License (MIT); see LICENSE.txt
+ */
+
+/**
+ * UserInterface format dropdown tool.
+ *
+ * @class
+ * @extends ve.ui.FormatDropdownTool
+ * @constructor
+ * @param {ve.ui.Toolbar} toolbar
+ */
+ve.ui.MWFormatDropdownTool = function VeUiMwFormatDropdownTool( toolbar, 
config ) {
+       // Parent constructor
+       ve.ui.FormatDropdownTool.call( this, toolbar, config );
+};
+
+/* Inheritance */
+
+ve.inheritClass( ve.ui.MWFormatDropdownTool, ve.ui.FormatDropdownTool );
+
+/* Static Properties */
+
+ve.ui.MWFormatDropdownTool.static.name = 'mwFormat';
+
+ve.ui.MWFormatDropdownTool.static.cssName = 'format';
+
+ve.ui.MWFormatDropdownTool.static.items[1].data.type = 'MWheading';
+ve.ui.MWFormatDropdownTool.static.items[2].data.type = 'MWheading';
+ve.ui.MWFormatDropdownTool.static.items[3].data.type = 'MWheading';
+ve.ui.MWFormatDropdownTool.static.items[4].data.type = 'MWheading';
+ve.ui.MWFormatDropdownTool.static.items[5].data.type = 'MWheading';
+ve.ui.MWFormatDropdownTool.static.items[6].data.type = 'MWheading';
+ve.ui.MWFormatDropdownTool.static.items[7].data.type = 'MWpreformatted';
+
+/* Registration */
+
+ve.ui.toolFactory.register( 'mwFormat', ve.ui.MWFormatDropdownTool );
diff --git a/modules/ve/ui/tools/ve.ui.DropdownTool.js 
b/modules/ve/ui/tools/ve.ui.DropdownTool.js
index ff0ca9d..6387a17 100644
--- a/modules/ve/ui/tools/ve.ui.DropdownTool.js
+++ b/modules/ve/ui/tools/ve.ui.DropdownTool.js
@@ -38,7 +38,7 @@
        // Initialization
        this.$
                .append( this.$icon, this.$label, this.menu.$ )
-               .addClass( 've-ui-dropdownTool ve-ui-dropdownTool-' + 
this.constructor.static.name )
+               .addClass( 've-ui-dropdownTool ve-ui-dropdownTool-' + ( 
this.constructor.static.cssName || this.constructor.static.name ) )
                .attr( 'title', ve.msg( this.constructor.static.titleMessage ) 
);
        this.$label.append( this.$labelText );
 };
diff --git a/modules/ve/ui/ve.ui.Tool.js b/modules/ve/ui/ve.ui.Tool.js
index a54e264..771ba30 100644
--- a/modules/ve/ui/ve.ui.Tool.js
+++ b/modules/ve/ui/ve.ui.Tool.js
@@ -53,6 +53,18 @@
 ve.ui.Tool.static.name = '';
 
 /**
+ * CSS class name, rendered as ve-ui-dropdownTool-cssName
+ *
+ * If this is left as null, static.name is used instead.
+ *
+ * @abstract
+ * @static
+ * @property
+ * @type {string}
+ */
+ve.ui.Tool.static.cssName = null;
+
+/**
  * Message key for tool title.
  *
  * @abstract

-- 
To view, visit https://gerrit.wikimedia.org/r/51621
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: I3f47e1ae1f5c1415bde58a75385e4bf5f4b8fffc
Gerrit-PatchSet: 8
Gerrit-Project: mediawiki/extensions/VisualEditor
Gerrit-Branch: master
Gerrit-Owner: Esanders <[email protected]>
Gerrit-Reviewer: Catrope <[email protected]>
Gerrit-Reviewer: Esanders <[email protected]>
Gerrit-Reviewer: Trevor Parscal <[email protected]>
Gerrit-Reviewer: jenkins-bot

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to