Esanders has uploaded a new change for review.
https://gerrit.wikimedia.org/r/87547
Change subject: Use FlatLinearData for storing converter results
......................................................................
Use FlatLinearData for storing converter results
Previously we returned ElementLinearData from the converter, then
stripped out the MetaLinearData. This meant that before processing
the ElementLinearData from the converter actually contained metadata
which is confusing.
The new document constructor stores the converter results in a
FlatLinearData object and simultaneously populates element and meta
data stores.
Also in this commit I have moved various methods from ElementLinearData
to FlatLinearData, from which ElementLinearData inherits.
Change-Id: I64561bde2c31d8f703c13ac7b0a0c5f7ade9f3d4
---
M VisualEditor.php
M demos/ve/index.php
M modules/ve/dm/lineardata/ve.dm.ElementLinearData.js
A modules/ve/dm/lineardata/ve.dm.FlatLinearData.js
M modules/ve/dm/ve.dm.Converter.js
M modules/ve/dm/ve.dm.Document.js
M modules/ve/dm/ve.dm.LinearData.js
M modules/ve/test/index.php
8 files changed, 113 insertions(+), 69 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/VisualEditor
refs/changes/47/87547/1
diff --git a/VisualEditor.php b/VisualEditor.php
index 3aa6200..c55e914 100644
--- a/VisualEditor.php
+++ b/VisualEditor.php
@@ -298,6 +298,7 @@
've/dm/ve.dm.Converter.js',
've/dm/lineardata/ve.dm.SlicedLinearData.js',
+ 've/dm/lineardata/ve.dm.FlatLinearData.js',
've/dm/lineardata/ve.dm.ElementLinearData.js',
've/dm/lineardata/ve.dm.MetaLinearData.js',
diff --git a/demos/ve/index.php b/demos/ve/index.php
index 3d7963c..8e09a00 100644
--- a/demos/ve/index.php
+++ b/demos/ve/index.php
@@ -150,6 +150,7 @@
<script
src="../../modules/ve/dm/ve.dm.IndexValueStore.js"></script>
<script src="../../modules/ve/dm/ve.dm.Converter.js"></script>
<script
src="../../modules/ve/dm/lineardata/ve.dm.SlicedLinearData.js"></script>
+ <script
src="../../modules/ve/dm/lineardata/ve.dm.FlatLinearData.js"></script>
<script
src="../../modules/ve/dm/lineardata/ve.dm.ElementLinearData.js"></script>
<script
src="../../modules/ve/dm/lineardata/ve.dm.MetaLinearData.js"></script>
<script
src="../../modules/ve/dm/nodes/ve.dm.GeneratedContentNode.js"></script>
diff --git a/modules/ve/dm/lineardata/ve.dm.ElementLinearData.js
b/modules/ve/dm/lineardata/ve.dm.ElementLinearData.js
index 96df182..f1e3f95 100644
--- a/modules/ve/dm/lineardata/ve.dm.ElementLinearData.js
+++ b/modules/ve/dm/lineardata/ve.dm.ElementLinearData.js
@@ -11,7 +11,7 @@
* Element linear data storage
*
* @class
- * @extends ve.dm.LinearData
+ * @extends ve.dm.FlatLinearData
* @constructor
* @param {ve.dm.IndexValueStore} store Index-value store
* @param {Array} [data] Linear data
@@ -22,49 +22,7 @@
/* Inheritance */
-ve.inheritClass( ve.dm.ElementLinearData, ve.dm.LinearData );
-
-/* Methods */
-
-/**
- * Get the type of the element at a specified offset
- * @method
- * @param {number} offset Document offset
- * @returns {string} Type of the element
- */
-ve.dm.ElementLinearData.prototype.getType = function ( offset ) {
- return ve.dm.LinearData.static.getType( this.getData( offset ) );
-};
-
-/**
- * Check if data at a given offset is an element.
- * @method
- * @param {number} offset Document offset
- * @returns {boolean} Data at offset is an element
- */
-ve.dm.ElementLinearData.prototype.isElementData = function ( offset ) {
- return ve.dm.LinearData.static.isElementData( this.getData( offset ) );
-};
-
-/**
- * Checks if data at a given offset is an open element.
- * @method
- * @param {number} offset Document offset
- * @returns {boolean} Data at offset is an open element
- */
-ve.dm.ElementLinearData.prototype.isOpenElementData = function ( offset ) {
- return ve.dm.LinearData.static.isOpenElementData( this.getData( offset
) );
-};
-
-/**
- * Checks if data at a given offset is a close element.
- * @method
- * @param {number} offset Document offset
- * @returns {boolean} Data at offset is a close element
- */
-ve.dm.ElementLinearData.prototype.isCloseElementData = function ( offset ) {
- return ve.dm.LinearData.static.isCloseElementData( this.getData( offset
) );
-};
+ve.inheritClass( ve.dm.ElementLinearData, ve.dm.FlatLinearData );
/**
* Check if content can be inserted at an offset in document data.
diff --git a/modules/ve/dm/lineardata/ve.dm.FlatLinearData.js
b/modules/ve/dm/lineardata/ve.dm.FlatLinearData.js
new file mode 100644
index 0000000..347331c
--- /dev/null
+++ b/modules/ve/dm/lineardata/ve.dm.FlatLinearData.js
@@ -0,0 +1,67 @@
+/*!
+ * VisualEditor FlatLinearData classes.
+ *
+ * Class containing Flat linear data and an index-value store.
+ *
+ * @copyright 2011-2013 VisualEditor Team and others; see AUTHORS.txt
+ * @license The MIT License (MIT); see LICENSE.txt
+ */
+
+/**
+ * Flat linear data storage
+ *
+ * @class
+ * @extends ve.dm.LinearData
+ * @constructor
+ * @param {ve.dm.IndexValueStore} store Index-value store
+ * @param {Array} [data] Linear data
+ */
+ve.dm.FlatLinearData = function VeDmFlatLinearData( store, data ) {
+ ve.dm.LinearData.call( this, store, data );
+};
+
+/* Inheritance */
+
+ve.inheritClass( ve.dm.FlatLinearData, ve.dm.LinearData );
+
+/* Methods */
+
+/**
+ * Get the type of the element at a specified offset
+ * @method
+ * @param {number} offset Document offset
+ * @returns {string} Type of the element
+ */
+ve.dm.FlatLinearData.prototype.getType = function ( offset ) {
+ return ve.dm.LinearData.static.getType( this.getData( offset ) );
+};
+
+/**
+ * Check if data at a given offset is an element.
+ * @method
+ * @param {number} offset Document offset
+ * @returns {boolean} Data at offset is an element
+ */
+ve.dm.FlatLinearData.prototype.isElementData = function ( offset ) {
+ return ve.dm.LinearData.static.isElementData( this.getData( offset ) );
+};
+
+/**
+ * Checks if data at a given offset is an open element.
+ * @method
+ * @param {number} offset Document offset
+ * @returns {boolean} Data at offset is an open element
+ */
+ve.dm.FlatLinearData.prototype.isOpenElementData = function ( offset ) {
+ return ve.dm.LinearData.static.isOpenElementData( this.getData( offset
) );
+};
+
+/**
+ * Checks if data at a given offset is a close element.
+ * @method
+ * @param {number} offset Document offset
+ * @returns {boolean} Data at offset is a close element
+ */
+ve.dm.FlatLinearData.prototype.isCloseElementData = function ( offset ) {
+ return ve.dm.LinearData.static.isCloseElementData( this.getData( offset
) );
+};
diff --git a/modules/ve/dm/ve.dm.Converter.js b/modules/ve/dm/ve.dm.Converter.js
index e2b1169..736502c 100644
--- a/modules/ve/dm/ve.dm.Converter.js
+++ b/modules/ve/dm/ve.dm.Converter.js
@@ -366,7 +366,7 @@
* @param {HTMLDocument} doc HTML document to convert
* @param {ve.dm.IndexValueStore} store Index-value store
* @param {ve.dm.InternalList} internalList Internal list
- * @returns {ve.dm.ElementLinearData} Linear model data
+ * @returns {ve.dm.FlatLinearData} Linear model data
*/
ve.dm.Converter.prototype.getDataFromDom = function ( doc, store, internalList
) {
var linearData, refData;
@@ -378,7 +378,7 @@
this.contextStack = [];
// Possibly do things with doc and the head in the future
- linearData = new ve.dm.ElementLinearData(
+ linearData = new ve.dm.FlatLinearData(
store,
this.getDataFromDomRecursion( doc.body )
);
diff --git a/modules/ve/dm/ve.dm.Document.js b/modules/ve/dm/ve.dm.Document.js
index 00cbedf..c38679c 100644
--- a/modules/ve/dm/ve.dm.Document.js
+++ b/modules/ve/dm/ve.dm.Document.js
@@ -30,7 +30,7 @@
* then from the bottom up add nodes to their potential parents. This
avoids massive length
* updates being broadcast upstream constantly while building is
underway.
*/
- var i, node, children, meta,
+ var i, len, offset, node, children, meta, fullData,
doc = parentDocument || this,
root = this.getDocumentNode(),
textLength = 0,
@@ -49,28 +49,28 @@
this.completeHistory = [];
if ( documentOrData instanceof ve.dm.LinearData ) {
- this.data = documentOrData;
+ fullData = documentOrData;
} else if ( !ve.isArray( documentOrData ) && typeof documentOrData ===
'object' ) {
- this.data = ve.dm.converter.getDataFromDom( documentOrData, new
ve.dm.IndexValueStore(), this.getInternalList() );
+ fullData = ve.dm.converter.getDataFromDom( documentOrData, new
ve.dm.IndexValueStore(), this.getInternalList() );
} else {
- this.data = new ve.dm.ElementLinearData(
+ fullData = new ve.dm.FlatLinearData(
new ve.dm.IndexValueStore(),
ve.isArray( documentOrData ) ? documentOrData : []
);
}
- this.store = this.data.getStore();
+ this.store = fullData.getStore();
+ this.data = new ve.dm.ElementLinearData( this.getStore() );
// Sparse array containing the metadata for each offset
// Each element is either undefined, or an array of metadata elements
// Because the indexes in the metadata array represent offsets in the
data array, the
// metadata array has one element more than the data array.
- this.metadata = new ve.dm.MetaLinearData( this.getStore(), [] );
+ this.metadata = new ve.dm.MetaLinearData( this.getStore() );
- // extract metadata and build node tree
- // NB: this.data.getLength() will change as data is spliced out
- for ( i = 0; i < this.data.getLength(); i++ ) {
+ // Seprate element data and metadata and build node tree
+ for ( i = 0, len = fullData.getLength(); i < len; i++ ) {
// Infer that if an item in the linear model has a type
attribute than it must be an element
- if ( !this.data.isElementData( i ) ) {
+ if ( !fullData.isElementData( i ) ) {
// Text node opening
if ( !inTextNode ) {
// Create a lengthless text node
@@ -84,24 +84,29 @@
}
// Track the length
textLength++;
+
+ // Add to element linear data
+ this.data.push( fullData.getData( i ) );
} else {
// Element data
- if ( !this.data.isCloseElementData( i ) &&
- ve.dm.metaItemFactory.lookup(
this.data.getData( i ).type )
+ if ( fullData.isOpenElementData( i ) &&
+ ve.dm.metaItemFactory.lookup( fullData.getType(
i ) )
) {
// Metadata
- // Splice the meta element and its closing out
of the linmod
- meta = this.data.getData( i );
- this.data.splice( i, 2 );
+ meta = fullData.getData( i );
+ offset = this.data.getLength();
// Put the metadata in the meta-linmod
- if ( !this.metadata.getData( i ) ) {
- this.metadata.setData( i, [] );
+ if ( !this.metadata.getData( offset ) ) {
+ this.metadata.setData( offset, [] );
}
- this.metadata.getData( i ).push( meta );
- // Make sure the loop doesn't skip the next
element
- i--;
+ this.metadata.getData( offset ).push( meta );
+ // Skip close element
+ i++;
continue;
}
+
+ // Add to element linear data
+ this.data.push( fullData.getData( i ) );
// Text node closing
if ( inTextNode ) {
@@ -113,11 +118,11 @@
textLength = 0;
}
// Element open/close
- if ( !this.data.isCloseElementData( i ) ) {
+ if ( fullData.isOpenElementData( i ) ) {
// Branch or leaf node opening
// Create a childless node
node = ve.dm.nodeFactory.create(
- this.data.getData( i ).type, [],
this.data.getData( i )
+ fullData.getType( i ), [],
fullData.getData( i )
);
node.setDocument( doc );
// Put the childless node on the current inner
stack
@@ -148,7 +153,7 @@
}
}
}
- // pad out the metadata array
+ // Pad out the metadata length to element data length + 1
if ( this.metadata.getLength() < this.data.getLength() + 1 ) {
this.metadata.data = this.metadata.data.concat(
new Array( 1 + this.data.getLength() -
this.metadata.getLength() )
diff --git a/modules/ve/dm/ve.dm.LinearData.js
b/modules/ve/dm/ve.dm.LinearData.js
index 462b496..a2f1f61 100644
--- a/modules/ve/dm/ve.dm.LinearData.js
+++ b/modules/ve/dm/ve.dm.LinearData.js
@@ -101,6 +101,17 @@
};
/**
+ * Push data to the end of the array
+ *
+ * @method
+ * @param {Object|string} value Value to store
+ * @returns {number} The new length of the linear data
+ */
+ve.dm.LinearData.prototype.push = function ( value ) {
+ return this.data.push( value );
+};
+
+/**
* Gets length of the linear data
*
* @method
diff --git a/modules/ve/test/index.php b/modules/ve/test/index.php
index ff3ad82..7979af1 100644
--- a/modules/ve/test/index.php
+++ b/modules/ve/test/index.php
@@ -95,6 +95,7 @@
<script src="../../ve/dm/ve.dm.IndexValueStore.js"></script>
<script src="../../ve/dm/ve.dm.Converter.js"></script>
<script
src="../../ve/dm/lineardata/ve.dm.SlicedLinearData.js"></script>
+ <script
src="../../ve/dm/lineardata/ve.dm.FlatLinearData.js"></script>
<script
src="../../ve/dm/lineardata/ve.dm.ElementLinearData.js"></script>
<script
src="../../ve/dm/lineardata/ve.dm.MetaLinearData.js"></script>
<script
src="../../ve/dm/nodes/ve.dm.GeneratedContentNode.js"></script>
--
To view, visit https://gerrit.wikimedia.org/r/87547
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I64561bde2c31d8f703c13ac7b0a0c5f7ade9f3d4
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