GWicke has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/71162


Change subject: Bug 46027: Drop mw:ExtLink/URL
......................................................................

Bug 46027: Drop mw:ExtLink/URL

* Changes to the content of URL links in VE were not properly handled, as the
  VE never changed the type to mw:ExtLink on such change.

* Instead of requiring clients to implement such a type change, abstract
  syntactical detail about URL link vs. bracketed external link in Parsoid.
  Automatically switch between formats as required, but preserve non-minimal
  links of the form [http://example.com http://example.com].

* Serializer support for mw:ExtLink/URL remains, so cached HTML will continue
  to work for now. This can be dropped after cache clearing.

* The VE handles mw:ExtLink content well, and will also do so for links that
  were formerly marked as mw:ExtLink/URL. Once cached HTML is cleared the VE
  can also drop mw:ExtLink/URL handling.

Change-Id: Ibb4c27b799016c7a41efb23c03978794c1d2f012
---
M js/lib/ext.core.LinkHandler.js
M js/lib/mediawiki.DOMPostProcessor.js
M js/lib/mediawiki.Util.js
M js/lib/mediawiki.WikitextSerializer.js
M js/lib/pegTokenizer.pegjs.txt
5 files changed, 43 insertions(+), 26 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Parsoid 
refs/changes/62/71162/1

diff --git a/js/lib/ext.core.LinkHandler.js b/js/lib/ext.core.LinkHandler.js
index 86dff08..71db862 100644
--- a/js/lib/ext.core.LinkHandler.js
+++ b/js/lib/ext.core.LinkHandler.js
@@ -789,7 +789,8 @@
                                                // Reset the optInfo since 
we're changing the nature of it
                                                optInfo = undefined;
                                                // Figure out the proper string 
to put here and break.
-                                               if ( tokenType === 
'mw:ExtLink/URL' ) {
+                                               if ( tokenType === 'mw:ExtLink' 
&&
+                                                               
currentToken.dataAttribs.stx === 'url' ) {
                                                        // Add the URL
                                                        resultStr += tkHref;
                                                        // Tell our loop to 
skip to the end of this tag
@@ -1261,13 +1262,14 @@
                cb( { tokens: [ new SelfclosingTagTk('img', tagAttrs, 
dataAttribs) ] } );
        } else {
                tagAttrs = [
-                       new KV( 'rel', 'mw:ExtLink/URL' )
+                       new KV( 'rel', 'mw:ExtLink' )
                        // href is set explicitly below
                ];
 
                // combine with existing rdfa attrs
                tagAttrs = buildLinkAttrs(token.attribs, false, null, 
tagAttrs).attribs;
                builtTag = new TagTk( 'a', tagAttrs, dataAttribs );
+               dataAttribs.stx = 'url';
 
                if (origTxt) {
                        // origTxt will be null for content from templates
@@ -1283,7 +1285,7 @@
                        tokens: [
                                builtTag,
                                txt,
-                               new EndTagTk( 'a' )
+                               new EndTagTk( 'a', [], {tsr: 
[dataAttribs.tsr[1], dataAttribs.tsr[1]]} )
                        ]
                } );
        }
diff --git a/js/lib/mediawiki.DOMPostProcessor.js 
b/js/lib/mediawiki.DOMPostProcessor.js
index dd534f3..1a66490 100644
--- a/js/lib/mediawiki.DOMPostProcessor.js
+++ b/js/lib/mediawiki.DOMPostProcessor.js
@@ -1995,7 +1995,7 @@
                                } else {
                                        return [2, 2];
                                }
-                       } else if (aType === "mw:ExtLink" && dp.tsr) {
+                       } else if (aType === "mw:ExtLink" && dp.tsr && dp.stx 
!== 'url') {
                                return [dp.targetOff - dp.tsr[0], 1];
                        } else {
                                return null;
diff --git a/js/lib/mediawiki.Util.js b/js/lib/mediawiki.Util.js
index 8c22ce6..0e4fe18 100644
--- a/js/lib/mediawiki.Util.js
+++ b/js/lib/mediawiki.Util.js
@@ -1539,6 +1539,20 @@
                html_old_names[name] === true;
 };
 
+/**
+ * Determine whether the protocol of a link is potentially valid. Use the
+ * environment's per-wiki config to do so.
+ */
+Util.isProtocolValid = function ( linkTarget, env ) {
+       var wikiConf = env.conf.wiki;
+       if ( typeof linkTarget === 'string' ) {
+               return wikiConf.hasValidProtocol( linkTarget );
+       } else {
+               return true;
+       }
+};
+
+
 if (typeof module === "object") {
        module.exports.Util = Util;
 }
diff --git a/js/lib/mediawiki.WikitextSerializer.js 
b/js/lib/mediawiki.WikitextSerializer.js
index 114ef4f..e3ee10c 100644
--- a/js/lib/mediawiki.WikitextSerializer.js
+++ b/js/lib/mediawiki.WikitextSerializer.js
@@ -809,7 +809,7 @@
                                        console.warn("Toks: " + 
JSON.stringify(tokens));
                                }
                                var tkSrc = arg.substring(da.tsr[0], da.tsr[1]);
-                               // Replace pipe by an entity
+                               // Replace pipe by an entity. This is not 
completely safe.
                                if (t.name === 'extlink' || t.name === 
'urllink') {
                                        var tkBits = 
tkSrc.split(/({{(?:(?!}})[^])+}})/g),
                                                res = [];
@@ -1662,12 +1662,21 @@
                                return;
                        }
                } else if ( rel === 'mw:ExtLink' ) {
-                       // We expect modified hrefs to be percent-encoded 
already, so
-                       // don't need to encode them here any more. Unmodified 
hrefs are
-                       // just using the original encoding anyway.
-                       cb( '[' + target.value + ' ' +
-                               state.serializeChildrenToString(node, 
this.wteHandlers.aHandler, false) +
-                               ']', node );
+                       var content = state.serializeChildrenToString(node, 
this.wteHandlers.aHandler, false);
+                       if (( target.value === content && 
Util.isProtocolValid(content, env) ||
+                                       node.getAttribute('href') === content) 
&&
+                                       (target.modified || dp.stx === 'url'))
+                       {
+                               // Serialize as URL link
+                               cb(target.value, node);
+                       } else {
+                               // We expect modified hrefs to be 
percent-encoded already, so
+                               // don't need to encode them here any more. 
Unmodified hrefs are
+                               // just using the original encoding anyway.
+                               cb( '[' + target.value + ' ' +
+                                       state.serializeChildrenToString(node, 
this.wteHandlers.aHandler, false) +
+                                       ']', node );
+                       }
                } else if ( rel.match( /mw:ExtLink\/(?:ISBN|RFC|PMID)/ ) ) {
                        cb( node.firstChild.nodeValue, node );
                } else if ( rel === 'mw:ExtLink/URL' ) {
diff --git a/js/lib/pegTokenizer.pegjs.txt b/js/lib/pegTokenizer.pegjs.txt
index 105087f..7a1f6c3 100644
--- a/js/lib/pegTokenizer.pegjs.txt
+++ b/js/lib/pegTokenizer.pegjs.txt
@@ -162,19 +162,6 @@
         return false;
     };
 
-    /**
-     * Determine whether the protocol of a link is potentially valid. Use the 
environment's per-wiki config to do so.
-     */
-    function isProtocolValid( linkTarget ) {
-        var env = pegArgs.env,
-            wikiConf = env.conf.wiki;
-
-        if ( typeof linkTarget === 'string' ) {
-            return wikiConf.hasValidProtocol( linkTarget );
-        } else {
-            return true;
-        }
-    }
 
     /**
     * Get an attribute value and source, given a start and end position.  
Returned object will have a 'value' property
@@ -806,7 +793,7 @@
         & { return stops.push('extlink', true); }
         //target:urllink
         target:extlink_preprocessor_text
-        & { return isProtocolValid( target ); }
+        & { return Util.isProtocolValid( target, pegArgs.env ); }
         sp:( space / [\u00A0\u1680\u180E\u2000-\u200A\u202F\u205F\u3000] )*
         targetOff:({ return pos; })
         content:(
@@ -895,7 +882,12 @@
 /* Default URL protocols in MediaWiki (see DefaultSettings). Normally
  * these can be configured dynamically. */
 
-url_protocol = & { return isProtocolValid( input.substr( pos ) ); } 
h:[a-zA-Z\/]+ c:':'? s:'//'? { return h.join( '' ) + c + s; }
+url_protocol = 
+    & { return Util.isProtocolValid( input.substr( pos ), pegArgs.env ); } 
+    h:[a-zA-Z\/]+ c:':'? s:'//'? 
+{ 
+    return h.join( '' ) + c + s; 
+}
 
 // javascript does not support unicode features..
 unicode_separator_space = [ \u00A0\u1680\u180E\u2000-\u200A\u202F\u205F\u3000]

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ibb4c27b799016c7a41efb23c03978794c1d2f012
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/Parsoid
Gerrit-Branch: master
Gerrit-Owner: GWicke <[email protected]>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to