jenkins-bot has submitted this change and it was merged.
Change subject: Link pasting: Match RDFa-less links as external
......................................................................
Link pasting: Match RDFa-less links as external
Now that some targets support link pasting (Flow) we need to
make sure that pasted links match to an allowed type ('link/mwExternal')
instead of plain 'link' annotations which should never exist
in an MW document.
In a later commit we should auto-detect internal links.
Change-Id: I7faae834aa6e730c3cf93a691331a05fd0fe3d5c
---
M modules/ve-mw/dm/annotations/ve.dm.MWExternalLinkAnnotation.js
M modules/ve-mw/dm/nodes/ve.dm.MWNumberedExternalLinkNode.js
M modules/ve-mw/tests/dm/ve.dm.mwExample.js
M modules/ve-mw/tests/ve.test.utils.js
4 files changed, 72 insertions(+), 10 deletions(-)
Approvals:
Jforrester: Looks good to me, approved
Esanders: Looks good to me, but someone else must approve
jenkins-bot: Verified
diff --git a/modules/ve-mw/dm/annotations/ve.dm.MWExternalLinkAnnotation.js
b/modules/ve-mw/dm/annotations/ve.dm.MWExternalLinkAnnotation.js
index 055594c..5ab1301 100644
--- a/modules/ve-mw/dm/annotations/ve.dm.MWExternalLinkAnnotation.js
+++ b/modules/ve-mw/dm/annotations/ve.dm.MWExternalLinkAnnotation.js
@@ -33,18 +33,26 @@
ve.dm.MWExternalLinkAnnotation.static.name = 'link/mwExternal';
-ve.dm.MWExternalLinkAnnotation.static.matchRdfaTypes = [ 'mw:ExtLink' ];
+ve.dm.MWExternalLinkAnnotation.static.matchFunction = function ( domElement ) {
+ var rel = domElement.getAttribute( 'rel' );
+ // Match explicity mw:ExtLink, or plain RDFa-less links (e.g. from
external paste)
+ return !rel || rel === 'mw:ExtLink';
+};
ve.dm.MWExternalLinkAnnotation.static.toDataElement = function ( domElements )
{
- var parentResult = ve.dm.LinkAnnotation.static.toDataElement.apply(
this, arguments );
- parentResult.attributes.rel = domElements[ 0 ].getAttribute( 'rel' );
- return parentResult;
+ // Parent method
+ var dataElement =
ve.dm.MWExternalLinkAnnotation.super.static.toDataElement.apply( this,
arguments );
+
+ dataElement.attributes.rel = domElements[ 0 ].getAttribute( 'rel' );
+ return dataElement;
};
ve.dm.MWExternalLinkAnnotation.static.toDomElements = function ( dataElement )
{
- var parentResult = ve.dm.LinkAnnotation.static.toDomElements.apply(
this, arguments );
- parentResult[ 0 ].setAttribute( 'rel', dataElement.attributes.rel ||
'mw:ExtLink' );
- return parentResult;
+ // Parent method
+ var domElements =
ve.dm.MWExternalLinkAnnotation.super.static.toDomElements.apply( this,
arguments );
+
+ domElements[ 0 ].setAttribute( 'rel', dataElement.attributes.rel ||
'mw:ExtLink' );
+ return domElements;
};
/* Methods */
diff --git a/modules/ve-mw/dm/nodes/ve.dm.MWNumberedExternalLinkNode.js
b/modules/ve-mw/dm/nodes/ve.dm.MWNumberedExternalLinkNode.js
index 7f37dc1..9011b9a 100644
--- a/modules/ve-mw/dm/nodes/ve.dm.MWNumberedExternalLinkNode.js
+++ b/modules/ve-mw/dm/nodes/ve.dm.MWNumberedExternalLinkNode.js
@@ -41,9 +41,9 @@
ve.dm.MWNumberedExternalLinkNode.static.blacklistedAnnotationTypes = [ 'link'
];
-ve.dm.MWNumberedExternalLinkNode.static.matchFunction = function ( element ) {
+ve.dm.MWNumberedExternalLinkNode.static.matchFunction = function ( domElement
) {
// Must be empty
- return element.childNodes.length === 0;
+ return domElement.childNodes.length === 0;
};
ve.dm.MWNumberedExternalLinkNode.static.toDataElement = function ( domElements
) {
diff --git a/modules/ve-mw/tests/dm/ve.dm.mwExample.js
b/modules/ve-mw/tests/dm/ve.dm.mwExample.js
index 7857f63..66f67ae 100644
--- a/modules/ve-mw/tests/dm/ve.dm.mwExample.js
+++ b/modules/ve-mw/tests/dm/ve.dm.mwExample.js
@@ -1515,5 +1515,57 @@
doc.metadata.data[ 1 ].splice( 0, 1 );
},
normalizedBody: '<h1></h1>'
+ },
+ 'Plain links (e.g. on paste) are converted to link/mwExternal': {
+ body: 'Foo<a href="Bar">bar</a>',
+ data: [
+ {
+ type: 'paragraph',
+ internal: {
+ generated: 'wrapper'
+ }
+ },
+ 'F', 'o', 'o',
+ [
+ 'b',
+ [ {
+ type: 'link/mwExternal',
+ attributes: {
+ href: 'Bar',
+ rel: null
+ }
+ } ]
+ ],
+ [
+ 'a',
+ [ {
+ type: 'link/mwExternal',
+ attributes: {
+ href: 'Bar',
+ rel: null
+ }
+ } ]
+ ],
+ [
+ 'r',
+ [ {
+ type: 'link/mwExternal',
+ attributes: {
+ href: 'Bar',
+ rel: null
+ }
+ } ]
+ ],
+ {
+ type: '/paragraph'
+ },
+ {
+ type: 'internalList'
+ },
+ {
+ type: '/internalList'
+ }
+ ],
+ normalizedBody: 'Foo<a href="Bar" rel="mw:ExtLink">bar</a>'
}
};
diff --git a/modules/ve-mw/tests/ve.test.utils.js
b/modules/ve-mw/tests/ve.test.utils.js
index ec19af3..ce6859b 100644
--- a/modules/ve-mw/tests/ve.test.utils.js
+++ b/modules/ve-mw/tests/ve.test.utils.js
@@ -30,6 +30,7 @@
ve.dm.modelRegistry.unregister( ve.dm.MWHeadingNode );
ve.dm.modelRegistry.unregister( ve.dm.MWPreformattedNode );
ve.dm.modelRegistry.unregister( ve.dm.MWTableNode );
+ve.dm.modelRegistry.unregister( ve.dm.MWExternalLinkAnnotation );
// Re-register unregistered nodes.
ve.dm.modelRegistry.register( ve.dm.InlineImageNode );
ve.dm.modelRegistry.register( ve.dm.BlockImageNode );
@@ -38,7 +39,8 @@
var overrides = [
ve.dm.MWHeadingNode,
ve.dm.MWPreformattedNode,
- ve.dm.MWTableNode
+ ve.dm.MWTableNode,
+ ve.dm.MWExternalLinkAnnotation
],
overridden = [
ve.dm.InlineImageNode,
--
To view, visit https://gerrit.wikimedia.org/r/278011
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: merged
Gerrit-Change-Id: I7faae834aa6e730c3cf93a691331a05fd0fe3d5c
Gerrit-PatchSet: 2
Gerrit-Project: mediawiki/extensions/VisualEditor
Gerrit-Branch: master
Gerrit-Owner: Esanders <[email protected]>
Gerrit-Reviewer: Esanders <[email protected]>
Gerrit-Reviewer: Jforrester <[email protected]>
Gerrit-Reviewer: jenkins-bot <>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits