jenkins-bot has submitted this change and it was merged. ( 
https://gerrit.wikimedia.org/r/394347 )

Change subject: Improve parameter aliases handling when ordering template 
parameters
......................................................................


Improve parameter aliases handling when ordering template parameters

The original implementation treated aliases as parameters ordered after
their canonical form.  This could distort the "distance" metric used to
group new parameters near parameters in the original wikitext, causing
new parameters to bind "less tight" to templatedata parameters with
many aliases.

Here is an implementation which avoids this distortion by being more
careful to distinguish canonical parameter keys from aliased keys.

Change-Id: Id4d9b50868066a15407e72797aec7372ac9ff4b5
---
M lib/html2wt/WikitextSerializer.js
1 file changed, 26 insertions(+), 13 deletions(-)

Approvals:
  jenkins-bot: Verified
  Arlolra: Looks good to me, approved



diff --git a/lib/html2wt/WikitextSerializer.js 
b/lib/html2wt/WikitextSerializer.js
index ad503fc..bdaba5e 100644
--- a/lib/html2wt/WikitextSerializer.js
+++ b/lib/html2wt/WikitextSerializer.js
@@ -418,26 +418,35 @@
        var newOrder = new Map(Array.from(dataMwKeys).map(function(key, i) {
                return [key, { order: i }];
        }));
-       // Record order of parameters in original wikitext (from data-parsoid)
-       var origOrder = new Map(dpArgInfo.map(function(argInfo, i) {
-               return [argInfo.k, { order: i, dist: 0 }];
-       }));
        // Record order of parameters in templatedata (if present)
        var tplDataOrder = new Map();
+       var aliasMap = new Map();
        var keys = [];
        if (tplData && Array.isArray(tplData.paramOrder)) {
                var params = tplData.params;
                tplData.paramOrder.forEach(function(k, i) {
-                       tplDataOrder.set(k, { order: keys.length });
+                       tplDataOrder.set(k, { order: i });
+                       aliasMap.set(k, { key: k, order: -1 });
                        keys.push(k);
                        // Aliases have the same sort order as the main name.
                        var aliases = params && params[k] && params[k].aliases;
-                       (aliases || []).forEach(function(a) {
-                               tplDataOrder.set(a, { order: keys.length });
-                               keys.push(a);
+                       (aliases || []).forEach(function(a, j) {
+                               aliasMap.set(a, { key: k, order: j });
                        });
                });
        }
+       // Record order of parameters in original wikitext (from data-parsoid)
+       var origOrder = new Map(dpArgInfo.map(function(argInfo, i) {
+               return [argInfo.k, { order: i, dist: 0 }];
+       }));
+       // Canonical parameter key gets the same order as an alias parameter
+       // found in the original wikitext.
+       dpArgInfo.forEach(function(argInfo, i) {
+               var canon = aliasMap.get(argInfo.k);
+               if (canon && !origOrder.has(canon.key)) {
+                       origOrder.set(canon.key, origOrder.get(argInfo.k));
+               }
+       });
        // Find the closest "original parameter" for each templatedata 
parameter,
        // so that newly-added parameters are placed near the parameters which
        // templatedata says they should be adjacent to.
@@ -459,18 +468,22 @@
        // Helper function to return a large number if the given key isn't
        // in the sort order map
        var big = Math.max(nearestOrder.size, newOrder.size);
-       var defaultGet = function(map, key) {
+       var defaultGet = function(map, key1, key2) {
+               var key = ((!key2) || map.has(key1)) ? key1 : key2;
                return map.has(key) ? map.get(key).order : big;
        };
 
        return function cmp(a, b) {
+               var acanon = aliasMap.get(a) || { key: a, order: -1 };
+               var bcanon = aliasMap.get(b) || { key: b, order: -1 };
                // primary key is `nearestOrder` (nearest original parameter)
-               var aOrder = defaultGet(nearestOrder, a);
-               var bOrder = defaultGet(nearestOrder, b);
+               var aOrder = defaultGet(nearestOrder, a, acanon.key);
+               var bOrder = defaultGet(nearestOrder, b, bcanon.key);
                if (aOrder !== bOrder) { return aOrder - bOrder; }
                // secondary key is templatedata order
-               aOrder = defaultGet(tplDataOrder, a);
-               bOrder = defaultGet(tplDataOrder, b);
+               if (acanon.key === bcanon.key) { return acanon.order - 
bcanon.order; }
+               aOrder = defaultGet(tplDataOrder, acanon.key);
+               bOrder = defaultGet(tplDataOrder, bcanon.key);
                if (aOrder !== bOrder) { return aOrder - bOrder; }
                // tertiary key is original input order (makes sort stable)
                aOrder = defaultGet(newOrder, a);

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

Gerrit-MessageType: merged
Gerrit-Change-Id: Id4d9b50868066a15407e72797aec7372ac9ff4b5
Gerrit-PatchSet: 5
Gerrit-Project: mediawiki/services/parsoid
Gerrit-Branch: master
Gerrit-Owner: C. Scott Ananian <canan...@wikimedia.org>
Gerrit-Reviewer: Arlolra <abrea...@wikimedia.org>
Gerrit-Reviewer: C. Scott Ananian <canan...@wikimedia.org>
Gerrit-Reviewer: Sbailey <sbai...@wikimedia.org>
Gerrit-Reviewer: Subramanya Sastry <ssas...@wikimedia.org>
Gerrit-Reviewer: jenkins-bot <>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to