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