Esanders has uploaded a new change for review.
https://gerrit.wikimedia.org/r/192244
Change subject: Add clipboard tests and fix transclusion clipboard logic
......................................................................
Add clipboard tests and fix transclusion clipboard logic
Run isForClipboard path in MWTransclusion node
even if we have originalDomElements.
Change-Id: Ib5c77888ef41d26e827dbb9a20925e251527a99a
---
M modules/ve-mw/dm/nodes/ve.dm.MWTransclusionNode.js
M modules/ve-mw/tests/dm/ve.dm.Converter.test.js
M modules/ve-mw/tests/dm/ve.dm.mwExample.js
3 files changed, 77 insertions(+), 21 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/VisualEditor
refs/changes/44/192244/1
diff --git a/modules/ve-mw/dm/nodes/ve.dm.MWTransclusionNode.js
b/modules/ve-mw/dm/nodes/ve.dm.MWTransclusionNode.js
index 61cf5a2..e86d265 100644
--- a/modules/ve-mw/dm/nodes/ve.dm.MWTransclusionNode.js
+++ b/modules/ve-mw/dm/nodes/ve.dm.MWTransclusionNode.js
@@ -97,9 +97,18 @@
};
ve.dm.MWTransclusionNode.static.toDomElements = function ( dataElement, doc,
converter ) {
- var els, currentDom, i, len, wrapper, span,
+ var els, i, len, span,
index = converter.getStore().indexOfHash( OO.getHash( [
this.getHashObject( dataElement ), undefined ] ) ),
originalMw = dataElement.attributes.originalMw;
+
+ function wrapTextNode( node ) {
+ if ( node.nodeType === Node.TEXT_NODE ) {
+ var wrapper = doc.createElement( 'span' );
+ wrapper.appendChild( node );
+ return wrapper;
+ }
+ return node;
+ }
// If the transclusion is unchanged just send back the
// original DOM elements so selser can skip over it
@@ -112,19 +121,15 @@
// The object in the store is also used for CE rendering so
return a copy
els = ve.copyDomElements( dataElement.originalDomElements, doc
);
} else {
- if ( dataElement.originalDomElements ) {
+ if ( converter.isForClipboard() && index !== null ) {
+ // For the clipboard use the current DOM contents so
the user has something
+ // meaningful to paste into external applications
+ els = ve.copyDomElements( converter.getStore().value(
index ), doc );
+ els[0] = wrapTextNode( els[0] );
+ } else if ( dataElement.originalDomElements ) {
els = [ doc.createElement(
dataElement.originalDomElements[0].nodeName ) ];
} else {
els = [ doc.createElement( 'span' ) ];
- if ( converter.isForClipboard() ) {
- // For the clipboard use the current DOM
contents so the user has something
- // meaningful to paste into external
applications
- currentDom = converter.getStore().value( index
);
- if ( currentDom ) {
- // Ignore currentDom[0] as that is the
data-mw span we are recreating
- els = els.concat( ve.copyDomElements(
currentDom.slice( 1 ), doc ) );
- }
- }
}
// All we need to send back to Parsoid is the original
transclusion marker, with a
// reconstructed data-mw property.
@@ -153,11 +158,7 @@
// ... and mark all but the first child as ignorable
for ( i = 1, len = els.length; i < len; i++ ) {
// Wrap plain text nodes so we can give them an
attribute
- if ( els[i].nodeType === Node.TEXT_NODE ) {
- wrapper = doc.createElement( 'span' );
- wrapper.appendChild( els[i] );
- els[i] = wrapper;
- }
+ els[i] = wrapTextNode( els[i] );
els[i].setAttribute( 'data-ve-ignore', 'true' );
}
}
diff --git a/modules/ve-mw/tests/dm/ve.dm.Converter.test.js
b/modules/ve-mw/tests/dm/ve.dm.Converter.test.js
index e7d84e5..7a51bf8 100644
--- a/modules/ve-mw/tests/dm/ve.dm.Converter.test.js
+++ b/modules/ve-mw/tests/dm/ve.dm.Converter.test.js
@@ -41,7 +41,7 @@
var msg, caseItem,
cases = ve.dm.mwExample.domToDataCases;
- QUnit.expect( 2 * ve.getObjectKeys( cases ).length );
+ QUnit.expect( 3 * ve.getObjectKeys( cases ).length );
ve.test.utils.modelRegistrySetup();
for ( msg in cases ) {
diff --git a/modules/ve-mw/tests/dm/ve.dm.mwExample.js
b/modules/ve-mw/tests/dm/ve.dm.mwExample.js
index 45c6bd6..558e43b 100644
--- a/modules/ve-mw/tests/dm/ve.dm.mwExample.js
+++ b/modules/ve-mw/tests/dm/ve.dm.mwExample.js
@@ -32,12 +32,27 @@
'
data-mw="{"parts":[{"template":{"target":{"wt":"Test","href":"./Template:Test"},"params":{"1":{"wt":"Hello,
world!"}},"i":0}}]}"' +
'>' +
'</span>',
+ blockOpenClipboard:
+ '<div about="#mwt1" typeof="mw:Transclusion"' +
+ '
data-mw="{"parts":[{"template":{"target":{"wt":"Test","href":"./Template:Test"},"params":{"1":{"wt":"Hello,
world!"}},"i":0}}]}"' +
+ ' data-ve-no-generated-contents="true"' +
+ '>' +
+ ' ' +
+ '</div>',
blockOpenFromDataModified:
'<span typeof="mw:Transclusion"' +
'
data-mw="{"parts":[{"template":{"target":{"wt":"Test","href":"./Template:Test"},"params":{"1":{"wt":"Hello,
globe!"}},"i":0}}]}"' +
'>' +
'</span>',
+ blockOpenModifiedClipboard:
+ '<span typeof="mw:Transclusion"' +
+ '
data-mw="{"parts":[{"template":{"target":{"wt":"Test","href":"./Template:Test"},"params":{"1":{"wt":"Hello,
globe!"}},"i":0}}]}"' +
+ ' data-ve-no-generated-contents="true"' +
+ '>' +
+ ' ' +
+ '</span>',
blockContent: '<p about="#mwt1" data-parsoid="{}">Hello, world!</p>',
+ blockContentClipboard: '<p about="#mwt1" data-parsoid="{}"
data-ve-ignore="true">Hello, world!</p>',
inlineOpen:
'<span about="#mwt1" typeof="mw:Transclusion"' +
'
data-mw="{"parts":[{"template":{"target":{"wt":"Inline","href":"./Template:Inline"},"params":{"1":{"wt":"1,234"}},"i":0}}]}"'
+
@@ -50,10 +65,21 @@
'<span typeof="mw:Transclusion"' +
'
data-mw="{"parts":[{"template":{"target":{"wt":"Inline","href":"./Template:Inline"},"params":{"1":{"wt":"1,234"}},"i":0}}]}"'
+
'>',
+ inlineOpenClipboard:
+ '<span about="#mwt1" typeof="mw:Transclusion"' +
+ '
data-mw="{"parts":[{"template":{"target":{"wt":"Inline","href":"./Template:Inline"},"params":{"1":{"wt":"1,234"}},"i":0}}]}"'
+
+ ' data-ve-no-generated-contents="true"' +
+ '>',
inlineOpenFromDataModified:
'<span typeof="mw:Transclusion"' +
'
data-mw="{"parts":[{"template":{"target":{"wt":"Inline","href":"./Template:Inline"},"params":{"1":{"wt":"5,678"}},"i":0}}]}"'
+
'>',
+ inlineOpenModifiedClipboard:
+ '<span typeof="mw:Transclusion"' +
+ '
data-mw="{"parts":[{"template":{"target":{"wt":"Inline","href":"./Template:Inline"},"params":{"1":{"wt":"5,678"}},"i":0}}]}"'
+
+ ' data-ve-no-generated-contents="true"' +
+ '>' +
+ ' ',
inlineContent: '$1,234.00',
inlineClose: '</span>',
mixed:
@@ -65,6 +91,12 @@
'<span typeof="mw:Transclusion"' +
'
data-mw="{"parts":[{"template":{"target":{"wt":"Inline","href":"./Template:Inline"},"params":{"1":{"wt":"5,678"}},"i":0}}]}"'
+
'></span>',
+ mixedClipboard:
+ '<span typeof="mw:Transclusion"' +
+ '
data-mw="{"parts":[{"template":{"target":{"wt":"Inline","href":"./Template:Inline"},"params":{"1":{"wt":"5,678"}},"i":0}}]}"'
+
+ ' data-ve-no-generated-contents="true"' +
+ '> </span>' +
+ '<span about="#mwt1" data-ve-ignore="true">Foo</span>',
pairOne:
'<p about="#mwt1" typeof="mw:Transclusion"' +
'
data-mw="{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"foo"}},"i":0}}]}"
data-parsoid="1"' +
@@ -77,6 +109,12 @@
'<span typeof="mw:Transclusion"' +
'
data-mw="{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"foo"}},"i":0}}]}"'
+
'></span>',
+ pairClipboard:
+ '<p about="#mwt1" typeof="mw:Transclusion"' +
+ '
data-mw="{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"foo"}},"i":0}}]}"'
+
+ ' data-parsoid="1"' +
+ ' data-ve-no-generated-contents="true"' +
+ '>foo</p>',
meta:
'<link rel="mw:PageProp/Category" href="./Category:Page"
about="#mwt1" typeof="mw:Transclusion"' +
'
data-mw="{"parts":[{"template":{"target":{"wt":"Template:Echo","href":"./Template:Echo"},"params":{"1":{"wt":"[[Category:Page]]\\n[[Category:Book]]"}},"i":0}}]}">'
+
@@ -861,7 +899,8 @@
ve.dm.mwExample.MWTransclusion.blockStoreItems
],
normalizedBody: ve.dm.mwExample.MWTransclusion.blockOpen +
ve.dm.mwExample.MWTransclusion.blockContent,
- fromDataBody: ve.dm.mwExample.MWTransclusion.blockOpenFromData
+ fromDataBody: ve.dm.mwExample.MWTransclusion.blockOpenFromData,
+ clipboardBody:
ve.dm.mwExample.MWTransclusion.blockOpenClipboard +
ve.dm.mwExample.MWTransclusion.blockContentClipboard
},
'mw:Transclusion (block level - modified)': {
body: ve.dm.mwExample.MWTransclusion.blockOpen +
ve.dm.mwExample.MWTransclusion.blockContent,
@@ -878,7 +917,8 @@
model.data.data[0].attributes.mw.parts[0].template.params['1'].wt = 'Hello,
globe!';
},
normalizedBody:
ve.dm.mwExample.MWTransclusion.blockOpenModified,
- fromDataBody:
ve.dm.mwExample.MWTransclusion.blockOpenFromDataModified
+ fromDataBody:
ve.dm.mwExample.MWTransclusion.blockOpenFromDataModified,
+ clipboardBody:
ve.dm.mwExample.MWTransclusion.blockOpenModifiedClipboard
},
'mw:Transclusion (inline)': {
body: ve.dm.mwExample.MWTransclusion.inlineOpen +
ve.dm.mwExample.MWTransclusion.inlineContent +
ve.dm.mwExample.MWTransclusion.inlineClose,
@@ -894,7 +934,8 @@
ve.dm.mwExample.MWTransclusion.inlineStoreItems
],
normalizedBody: ve.dm.mwExample.MWTransclusion.inlineOpen +
ve.dm.mwExample.MWTransclusion.inlineContent +
ve.dm.mwExample.MWTransclusion.inlineClose,
- fromDataBody: ve.dm.mwExample.MWTransclusion.inlineOpenFromData
+ ve.dm.mwExample.MWTransclusion.inlineClose
+ fromDataBody: ve.dm.mwExample.MWTransclusion.inlineOpenFromData
+ ve.dm.mwExample.MWTransclusion.inlineClose,
+ clipboardBody:
ve.dm.mwExample.MWTransclusion.inlineOpenClipboard +
ve.dm.mwExample.MWTransclusion.inlineContent +
ve.dm.mwExample.MWTransclusion.inlineClose
},
'mw:Transclusion (inline - modified)': {
body: ve.dm.mwExample.MWTransclusion.inlineOpen +
ve.dm.mwExample.MWTransclusion.inlineContent +
ve.dm.mwExample.MWTransclusion.inlineClose,
@@ -913,11 +954,13 @@
model.data.data[1].attributes.mw.parts[0].template.params['1'].wt = '5,678';
},
normalizedBody:
ve.dm.mwExample.MWTransclusion.inlineOpenModified +
ve.dm.mwExample.MWTransclusion.inlineClose,
- fromDataBody:
ve.dm.mwExample.MWTransclusion.inlineOpenFromDataModified +
ve.dm.mwExample.MWTransclusion.inlineClose
+ fromDataBody:
ve.dm.mwExample.MWTransclusion.inlineOpenFromDataModified +
ve.dm.mwExample.MWTransclusion.inlineClose,
+ clipboardBody:
ve.dm.mwExample.MWTransclusion.inlineOpenModifiedClipboard +
ve.dm.mwExample.MWTransclusion.inlineClose
},
'two mw:Transclusion nodes with identical params but different
htmlAttributes': {
body: ve.dm.mwExample.MWTransclusion.pairOne +
ve.dm.mwExample.MWTransclusion.pairTwo,
fromDataBody: ve.dm.mwExample.MWTransclusion.pairFromData +
ve.dm.mwExample.MWTransclusion.pairFromData,
+ clipboardBody: ve.dm.mwExample.MWTransclusion.pairClipboard +
ve.dm.mwExample.MWTransclusion.pairClipboard,
data: [
{
type: 'mwTransclusionBlock',
@@ -1266,6 +1309,11 @@
'data-mw="{"name":"ref","body":' +
'{"html":"Foo<!-- bar
-->"},"attrs":{}}" ' +
'typeof="mw:Extension/ref"></span></p>',
+ clipboardBody: '<p><span typeof="mw:Extension/ref" ' +
+ 'data-mw="{"attrs":{},"body":' +
+ '{"html":"Foo<span
rel=\\"ve:Comment\\" data-ve-comment=\\" bar
\\"></span>"},"name":"ref"}" ' +
+ '>' +
+ '<sup>[1]</sup></span></p>',
head: '<base href="http://example.com" />',
data: [
{ type: 'paragraph' },
@@ -1522,12 +1570,19 @@
'<meta property="mw:bar" content="baz" /><!--barbaz-->'
+
'<link rel="mw:PageProp/Category"
href="./Category:Foo_foo#Bar baz%23quux" />' +
'<meta typeof="mw:Placeholder" data-parsoid="foobar"
/>',
+ clipboardBody: '<span rel="ve:Comment" data-ve-comment=" No
content conversion "></span><meta property="mw:ThisIsAnAlien" /><p>Foo' +
+ '<link rel="mw:PageProp/Category" href="./Category:Bar"
/>Bar' +
+ '<meta property="mw:foo" content="bar" />Ba<span
rel="ve:Comment" data-ve-comment=" inline "></span>z</p>' +
+ '<meta property="mw:bar" content="baz" /><span
rel="ve:Comment" data-ve-comment="barbaz"></span>' +
+ '<link rel="mw:PageProp/Category"
href="./Category:Foo_foo#Bar baz%23quux" />' +
+ '<meta typeof="mw:Placeholder" data-parsoid="foobar"
/>',
head: '<base href="http://example.com" />',
data: ve.dm.mwExample.withMeta
},
'RDFa types spread across two attributes, about grouping is forced': {
body: ve.dm.mwExample.MWTransclusion.mixed,
fromDataBody: ve.dm.mwExample.MWTransclusion.mixedFromData,
+ clipboardBody: ve.dm.mwExample.MWTransclusion.mixedClipboard,
data: [
{ type: 'paragraph', internal: { generated: 'wrapper' }
},
ve.dm.mwExample.MWTransclusion.mixedDataOpen,
--
To view, visit https://gerrit.wikimedia.org/r/192244
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: Ib5c77888ef41d26e827dbb9a20925e251527a99a
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