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

Change subject: Detect the type of plain pasted links
......................................................................


Detect the type of plain pasted links

Using the same logic we used for converting pasted URLs, detect
internal links by matching their base.

Currently link pasting is still disabled in the VE target, but
has been enabled elsewhere (Flow).

Change-Id: Iebd61abbe1fe82fd18d129e1dbc815ca75f44e87
---
M modules/ve-mw/dm/annotations/ve.dm.MWExternalLinkAnnotation.js
M modules/ve-mw/tests/dm/ve.dm.mwExample.js
M modules/ve-mw/ui/actions/ve.ui.MWLinkAction.js
3 files changed, 100 insertions(+), 45 deletions(-)

Approvals:
  Jforrester: Looks good to me, approved
  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 5ab1301..a5e6887 100644
--- a/modules/ve-mw/dm/annotations/ve.dm.MWExternalLinkAnnotation.js
+++ b/modules/ve-mw/dm/annotations/ve.dm.MWExternalLinkAnnotation.js
@@ -39,11 +39,20 @@
        return !rel || rel === 'mw:ExtLink';
 };
 
-ve.dm.MWExternalLinkAnnotation.static.toDataElement = function ( domElements ) 
{
-       // Parent method
-       var dataElement = 
ve.dm.MWExternalLinkAnnotation.super.static.toDataElement.apply( this, 
arguments );
+ve.dm.MWExternalLinkAnnotation.static.toDataElement = function ( domElements, 
converter ) {
+       var dataElement, annotation,
+               rel = domElements[ 0 ].getAttribute( 'rel' );
 
-       dataElement.attributes.rel = domElements[ 0 ].getAttribute( 'rel' );
+       // If a plain link is pasted, auto-convert it to the correct type 
(internal/external)
+       if ( !rel ) {
+               annotation = ve.ui.MWLinkAction.static.getLinkAnnotation( 
domElements[ 0 ].getAttribute( 'href' ), converter.getHtmlDocument() );
+               return annotation.element;
+       }
+
+       // Parent method
+       dataElement = 
ve.dm.MWExternalLinkAnnotation.super.static.toDataElement.apply( this, 
arguments );
+
+       dataElement.attributes.rel = rel;
        return dataElement;
 };
 
diff --git a/modules/ve-mw/tests/dm/ve.dm.mwExample.js 
b/modules/ve-mw/tests/dm/ve.dm.mwExample.js
index 66f67ae..73d8c43 100644
--- a/modules/ve-mw/tests/dm/ve.dm.mwExample.js
+++ b/modules/ve-mw/tests/dm/ve.dm.mwExample.js
@@ -1516,8 +1516,8 @@
                },
                normalizedBody: '<h1></h1>'
        },
-       'Plain links (e.g. on paste) are converted to link/mwExternal': {
-               body: 'Foo<a href="Bar">bar</a>',
+       'Plain external links (e.g. on paste) are converted to 
link/mwExternal': {
+               body: '<a href="http://www.mediawiki.org/";>ab</a>',
                data: [
                        {
                                type: 'paragraph',
@@ -1525,34 +1525,21 @@
                                        generated: 'wrapper'
                                }
                        },
-                       'F', 'o', 'o',
-                       [
-                               'b',
-                               [ {
-                                       type: 'link/mwExternal',
-                                       attributes: {
-                                               href: 'Bar',
-                                               rel: null
-                                       }
-                               } ]
-                       ],
                        [
                                'a',
                                [ {
                                        type: 'link/mwExternal',
                                        attributes: {
-                                               href: 'Bar',
-                                               rel: null
+                                               href: 
'http://www.mediawiki.org/'
                                        }
                                } ]
                        ],
                        [
-                               'r',
+                               'b',
                                [ {
                                        type: 'link/mwExternal',
                                        attributes: {
-                                               href: 'Bar',
-                                               rel: null
+                                               href: 
'http://www.mediawiki.org/'
                                        }
                                } ]
                        ],
@@ -1566,6 +1553,52 @@
                                type: '/internalList'
                        }
                ],
-               normalizedBody: 'Foo<a href="Bar" rel="mw:ExtLink">bar</a>'
+               normalizedBody: '<a href="http://www.mediawiki.org/"; 
rel="mw:ExtLink">ab</a>'
+       },
+       'Plain internal links (e.g. on paste) are converted to 
link/mwInternal': {
+               body: '<a href="' + ve.dm.mwExample.MWInternalLink.absoluteHref 
+ '">ab</a>',
+               data: [
+                       {
+                               type: 'paragraph',
+                               internal: {
+                                       generated: 'wrapper'
+                               }
+                       },
+                       [
+                               'a',
+                               [ {
+                                       type: 'link/mwInternal',
+                                       attributes: {
+                                               title: 'Foo/Bar',
+                                               normalizedTitle: 'Foo/Bar',
+                                               lookupTitle: 'Foo/Bar'
+                                       }
+                               } ]
+                       ],
+                       [
+                               'b',
+                               [ {
+                                       type: 'link/mwInternal',
+                                       attributes: {
+                                               title: 'Foo/Bar',
+                                               normalizedTitle: 'Foo/Bar',
+                                               lookupTitle: 'Foo/Bar'
+                                       }
+                               } ]
+                       ],
+                       {
+                               type: '/paragraph'
+                       },
+                       {
+                               type: 'internalList'
+                       },
+                       {
+                               type: '/internalList'
+                       }
+               ],
+               normalizedBody: '<a href="Foo/Bar" rel="mw:WikiLink">ab</a>',
+               mwConfig: {
+                       wgArticlePath: '/wiki/$1'
+               }
        }
 };
diff --git a/modules/ve-mw/ui/actions/ve.ui.MWLinkAction.js 
b/modules/ve-mw/ui/actions/ve.ui.MWLinkAction.js
index ba5100c..9cc7ddd 100644
--- a/modules/ve-mw/ui/actions/ve.ui.MWLinkAction.js
+++ b/modules/ve-mw/ui/actions/ve.ui.MWLinkAction.js
@@ -33,6 +33,39 @@
  */
 ve.ui.MWLinkAction.static.methods = 
ve.ui.MWLinkAction.super.static.methods.concat( [ 'open', 'autolinkMagicLink' ] 
);
 
+/* Static methods */
+
+/**
+ * Get a link annotation from specified link text
+ *
+ * This is a static version of the method that can be used in the converter.
+ *
+ * @static
+ * @param {string} linktext Link text
+ * @param {HTMLDocument} doc Document
+ * @return {ve.dm.MWExternalLinkAnnotation|ve.dm.MWInternalLinkAnnotation} The 
annotation to use
+ */
+ve.ui.MWLinkAction.static.getLinkAnnotation = function ( linktext, doc ) {
+       var title, targetData,
+               href = linktext;
+
+       // Is this a "magic link"?
+       if ( ve.dm.MWMagicLinkNode.static.validateContent( linktext ) ) {
+               return ve.dm.MWMagicLinkNode.static.annotationFromContent( 
linktext );
+       }
+       // Is this an internal link?
+       targetData = 
ve.dm.MWInternalLinkAnnotation.static.getTargetDataFromHref( href, doc );
+       if ( targetData.isInternal ) {
+               title = mw.Title.newFromText( targetData.title );
+               return ve.dm.MWInternalLinkAnnotation.static.newFromTitle( 
title );
+       }
+       // It's an external link.
+       return new ve.dm.MWExternalLinkAnnotation( {
+               type: 'link/mwExternal',
+               attributes: { href: href }
+       } );
+};
+
 /* Methods */
 
 /**
@@ -59,30 +92,10 @@
 /**
  * @method
  * @inheritdoc
- * @return {ve.dm.MWExternalLinkAnnotation} The annotation to use.
+ * @return {ve.dm.MWExternalLinkAnnotation|ve.dm.MWInternalLinkAnnotation} The 
annotation to use
  */
 ve.ui.MWLinkAction.prototype.getLinkAnnotation = function ( linktext ) {
-       var title, targetData,
-               href = linktext;
-
-       // Is this a "magic link"?
-       if ( ve.dm.MWMagicLinkNode.static.validateContent( linktext ) ) {
-               return ve.dm.MWMagicLinkNode.static.annotationFromContent( 
linktext );
-       }
-       // Is this an internal link?
-       targetData = 
ve.dm.MWInternalLinkAnnotation.static.getTargetDataFromHref(
-               href,
-               this.surface.getModel().getDocument().getHtmlDocument()
-       );
-       if ( targetData.isInternal ) {
-               title = mw.Title.newFromText( targetData.title );
-               return ve.dm.MWInternalLinkAnnotation.static.newFromTitle( 
title );
-       }
-       // It's an external link.
-       return new ve.dm.MWExternalLinkAnnotation( {
-               type: 'link/mwExternal',
-               attributes: { href: href }
-       } );
+       return this.constructor.static.getLinkAnnotation( linktext, 
this.surface.getModel().getDocument().getHtmlDocument() );
 };
 
 /**

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

Gerrit-MessageType: merged
Gerrit-Change-Id: Iebd61abbe1fe82fd18d129e1dbc815ca75f44e87
Gerrit-PatchSet: 2
Gerrit-Project: mediawiki/extensions/VisualEditor
Gerrit-Branch: master
Gerrit-Owner: 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

Reply via email to