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