C. Scott Ananian has uploaded a new change for review. ( 
https://gerrit.wikimedia.org/r/402439 )

Change subject: Promisify LanguageVariantHandler.
......................................................................

Promisify LanguageVariantHandler.

Change-Id: I5552e1d9c046e84bc0294ea5e7588a3f11697e13
Depends-On: If175d8e4cff38e8de59a5636ab1f1d9da44c7460
---
M lib/wt2html/tt/LanguageVariantHandler.js
1 file changed, 132 insertions(+), 138 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/services/parsoid 
refs/changes/39/402439/1

diff --git a/lib/wt2html/tt/LanguageVariantHandler.js 
b/lib/wt2html/tt/LanguageVariantHandler.js
index cb9c7fe..a4afe4b 100644
--- a/lib/wt2html/tt/LanguageVariantHandler.js
+++ b/lib/wt2html/tt/LanguageVariantHandler.js
@@ -25,7 +25,7 @@
  */
 function LanguageVariantHandler(manager, options) {
        this.manager = manager;
-       this.manager.addTransform(this.onLanguageVariant.bind(this), 
"LanguageVariantHandler:onLanguageVariant", this.rank, 'tag', 
'language-variant');
+       this.manager.addTransformP(this, this.onLanguageVariant, 
"LanguageVariantHandler:onLanguageVariant", this.rank, 'tag', 
'language-variant');
 }
 
 // Indicates where in the pipeline this handler should be run.
@@ -35,7 +35,7 @@
  * Main handler.
  * See {@link TokenTransformManager#addTransform}'s transformation parameter
  */
-LanguageVariantHandler.prototype.onLanguageVariant = function(token, frame, 
cb) {
+LanguageVariantHandler.prototype.onLanguageVariant = Promise.async(function 
*(token, frame) {
        var manager = this.manager;
        var attribs = token.attribs;
        var dataAttribs = token.dataAttribs;
@@ -45,15 +45,13 @@
        var isMeta = false;
        var sawFlagA = false;
 
-       cb({ async: true });
-
        // convert one variant text to dom.
-       var convertOne = function(t) {
+       var convertOne = Promise.async(function *(t) {
                // we're going to fetch the actual token list from attribs
                // (this ensures that it has gone through the earlier stages
                // of the pipeline already to be expanded)
                t = +(t.replace(/^mw:lv/, ''));
-               return Util.promiseToProcessContent(
+               var doc = yield Util.promiseToProcessContent(
                        manager.env, manager.frame, attribs[t].v.concat([new 
EOFTk()]),
                        {
                                pipelineType: 'tokens/x-mediawiki/expanded',
@@ -64,13 +62,12 @@
                                },
                                srcOffsets: attribs[t].srcOffsets,
                        }
-               ).then(function(doc) {
-                       return {
-                               xmlstr: DU.ppToXML(doc.body, { innerXML: true 
}),
-                               isBlock: DU.hasBlockElementDescendant(doc.body)
-                       };
-               });
-       };
+               );
+               return {
+                       xmlstr: DU.ppToXML(doc.body, { innerXML: true }),
+                       isBlock: DU.hasBlockElementDescendant(doc.body)
+               };
+       });
        // compress a whitespace sequence
        var compressSpArray = function(a) {
                var result = [];
@@ -102,146 +99,143 @@
        }
        // convert all variant texts to DOM
        var isBlock = false;
-       return Promise.map(dataAttribs.texts, function(t) {
+       var texts = yield Promise.map(dataAttribs.texts, Promise.async(function 
*(t) {
+               var text, from, to;
                if (t.twoway) {
-                       return convertOne(t.text).then(function(text) {
-                               isBlock = isBlock || text.isBlock;
-                               return { lang: t.lang, text: text.xmlstr, 
twoway: true, sp: t.sp };
-                       });
+                       text = yield convertOne(t.text);
+                       isBlock = isBlock || text.isBlock;
+                       return { lang: t.lang, text: text.xmlstr, twoway: true, 
sp: t.sp };
                } else if (t.lang) {
-                       return Promise.all([convertOne(t.from), 
convertOne(t.to)]).
-                               spread(function(from, to) {
-                                       isBlock = isBlock || from.isBlock || 
to.isBlock;
-                                       return { lang: t.lang, from: 
from.xmlstr, to: to.xmlstr, sp: t.sp };
-                               });
+                       from = yield convertOne(t.from);
+                       to = yield convertOne(t.to);
+                       isBlock = isBlock || from.isBlock || to.isBlock;
+                       return { lang: t.lang, from: from.xmlstr, to: 
to.xmlstr, sp: t.sp };
                } else {
-                       return convertOne(t.text).then(function(text) {
-                               isBlock = isBlock || text.isBlock;
-                               return { text: text.xmlstr, sp: [] };
-                       });
+                       text = yield convertOne(t.text);
+                       isBlock = isBlock || text.isBlock;
+                       return { text: text.xmlstr, sp: [] };
                }
-       }).then(function(texts) {
-               // collect two-way/one-way conversion rules
-               var oneway = [];
-               var twoway = [];
-               var sawTwoway = false;
-               var sawOneway = false;
-               var textSp;
-               var twowaySp = [];
-               var onewaySp = [];
-               texts.forEach(function(t) {
-                       if (t.twoway) {
-                               twoway.push({ l: t.lang, t: t.text });
-                               twowaySp.push(t.sp[0], t.sp[1], t.sp[2]);
-                               sawTwoway = true;
-                       } else if (t.lang) {
-                               oneway.push({ l: t.lang, f: t.from, t: t.to });
-                               onewaySp.push(t.sp[0], t.sp[1], t.sp[2], 
t.sp[3]);
-                               sawOneway = true;
-                       }
-               });
+       }));
+       // collect two-way/one-way conversion rules
+       var oneway = [];
+       var twoway = [];
+       var sawTwoway = false;
+       var sawOneway = false;
+       var textSp;
+       var twowaySp = [];
+       var onewaySp = [];
+       texts.forEach(function(t) {
+               if (t.twoway) {
+                       twoway.push({ l: t.lang, t: t.text });
+                       twowaySp.push(t.sp[0], t.sp[1], t.sp[2]);
+                       sawTwoway = true;
+               } else if (t.lang) {
+                       oneway.push({ l: t.lang, f: t.from, t: t.to });
+                       onewaySp.push(t.sp[0], t.sp[1], t.sp[2], t.sp[3]);
+                       sawOneway = true;
+               }
+       });
 
-               // To avoid too much data-mw bloat, only the top level keys in
-               // data-mw-variant as "human readable".  Nested keys are 
single-letter:
-               // `l` for `language`, `t` for `text` or `to`, `f` for `from`.
-               var dataMWV;
-               if (flags.length === 0 && dataAttribs.variants.length > 0) {
-                       // "Restrict possible variants to a limited set"
-                       dataMWV = {
-                               filter: { l: dataAttribs.variants, t: 
texts[0].text },
-                               show: true
-                       };
-               } else {
-                       dataMWV = flags.reduce(function(dmwv, f) {
-                               if (Consts.LCFlagMap.has(f)) {
-                                       if (Consts.LCFlagMap.get(f)) {
-                                               dmwv[Consts.LCFlagMap.get(f)] = 
true;
-                                               if (f === 'A') {
-                                                       sawFlagA = true;
-                                               }
+       // To avoid too much data-mw bloat, only the top level keys in
+       // data-mw-variant as "human readable".  Nested keys are single-letter:
+       // `l` for `language`, `t` for `text` or `to`, `f` for `from`.
+       var dataMWV;
+       if (flags.length === 0 && dataAttribs.variants.length > 0) {
+               // "Restrict possible variants to a limited set"
+               dataMWV = {
+                       filter: { l: dataAttribs.variants, t: texts[0].text },
+                       show: true
+               };
+       } else {
+               dataMWV = flags.reduce(function(dmwv, f) {
+                       if (Consts.LCFlagMap.has(f)) {
+                               if (Consts.LCFlagMap.get(f)) {
+                                       dmwv[Consts.LCFlagMap.get(f)] = true;
+                                       if (f === 'A') {
+                                               sawFlagA = true;
                                        }
-                               } else {
-                                       dmwv.error = true;
                                }
-                               return dmwv;
-                       }, {});
-                       // (this test is done at the top of 
ConverterRule::getRuleConvertedStr)
-                       // (also partially in ConverterRule::parse)
-                       if (texts.length === 1 && !texts[0].lang  && 
!dataMWV.name) {
-                               if (dataMWV.add || dataMWV.remove) {
-                                       var variants = [ '*' ];
-                                       twoway = variants.map(function(code) {
-                                               return { l: code, t: 
texts[0].text };
-                                       });
-                                       sawTwoway = true;
-                               } else {
-                                       dataMWV.disabled = true;
-                                       dataMWV.describe = undefined;
-                               }
-                       }
-                       if (dataMWV.describe) {
-                               if (!sawFlagA) { dataMWV.show = true; }
-                       }
-                       if (dataMWV.disabled || dataMWV.name) {
-                               if (dataMWV.disabled) {
-                                       dataMWV.disabled = { t: texts[0].text };
-                               } else {
-                                       dataMWV.name = { t: texts[0].text };
-                               }
-                               dataMWV.show =
-                                       (dataMWV.title || dataMWV.add) ? 
undefined : true;
-                       } else if (sawTwoway) {
-                               dataMWV.twoway = twoway;
-                               textSp = twowaySp;
-                               if (sawOneway) { dataMWV.error = true; }
                        } else {
-                               dataMWV.oneway = oneway;
-                               textSp = onewaySp;
-                               if (!sawOneway) { dataMWV.error = true; }
+                               dmwv.error = true;
+                       }
+                       return dmwv;
+               }, {});
+               // (this test is done at the top of 
ConverterRule::getRuleConvertedStr)
+               // (also partially in ConverterRule::parse)
+               if (texts.length === 1 && !texts[0].lang  && !dataMWV.name) {
+                       if (dataMWV.add || dataMWV.remove) {
+                               var variants = [ '*' ];
+                               twoway = variants.map(function(code) {
+                                       return { l: code, t: texts[0].text };
+                               });
+                               sawTwoway = true;
+                       } else {
+                               dataMWV.disabled = true;
+                               dataMWV.describe = undefined;
                        }
                }
-               // Use meta/not meta instead of explicit 'show' flag.
-               isMeta = !dataMWV.show;
-               dataMWV.show = undefined;
-               // Trim some data from data-parsoid if it matches the defaults
-               if (flagSp.length === 2 * dataAttribs.original.length) {
-                       if (flagSp.every(function(s) { return s === ''; })) {
-                               flagSp = undefined;
+               if (dataMWV.describe) {
+                       if (!sawFlagA) { dataMWV.show = true; }
+               }
+               if (dataMWV.disabled || dataMWV.name) {
+                       if (dataMWV.disabled) {
+                               dataMWV.disabled = { t: texts[0].text };
+                       } else {
+                               dataMWV.name = { t: texts[0].text };
                        }
+                       dataMWV.show =
+                               (dataMWV.title || dataMWV.add) ? undefined : 
true;
+               } else if (sawTwoway) {
+                       dataMWV.twoway = twoway;
+                       textSp = twowaySp;
+                       if (sawOneway) { dataMWV.error = true; }
+               } else {
+                       dataMWV.oneway = oneway;
+                       textSp = onewaySp;
+                       if (!sawOneway) { dataMWV.error = true; }
                }
-               if (trailingSemi !== false && textSp) {
-                       textSp.push(trailingSemi);
+       }
+       // Use meta/not meta instead of explicit 'show' flag.
+       isMeta = !dataMWV.show;
+       dataMWV.show = undefined;
+       // Trim some data from data-parsoid if it matches the defaults
+       if (flagSp.length === 2 * dataAttribs.original.length) {
+               if (flagSp.every(function(s) { return s === ''; })) {
+                       flagSp = undefined;
                }
+       }
+       if (trailingSemi !== false && textSp) {
+               textSp.push(trailingSemi);
+       }
 
-               // Our markup is always the same, except for the contents of
-               // the data-mw-variant attribute and whether it's a span, div, 
or a
-               // meta, depending on (respectively) whether conversion output
-               // contains only inline content, could contain block content,
-               // or never contains any content.
-               var tokens = [
-                       new TagTk(isMeta ? 'meta' : isBlock ? 'div' : 'span', [
-                               new KV('typeof', 'mw:LanguageVariant'),
-                               new KV(
-                                       'data-mw-variant',
-                                       
JSON.stringify(JSUtils.sortObject(dataMWV))
-                               ),
-                       ], {
-                               fl: dataAttribs.original, // original "fl"ags
-                               flSp: compressSpArray(flagSp), // spaces around 
flags
-                               src: dataAttribs.src,
-                               tSp: compressSpArray(textSp), // spaces around 
texts
-                               tsr: [ tsr[0], isMeta ? tsr[1] : (tsr[1] - 2) ],
-                       }),
-               ];
-               if (!isMeta) {
-                       tokens.push(new EndTagTk(isBlock ? 'div' : 'span', [], {
-                               tsr: [ tsr[1] - 2, tsr[1] ],
-                       }));
-               }
+       // Our markup is always the same, except for the contents of
+       // the data-mw-variant attribute and whether it's a span, div, or a
+       // meta, depending on (respectively) whether conversion output
+       // contains only inline content, could contain block content,
+       // or never contains any content.
+       var tokens = [
+               new TagTk(isMeta ? 'meta' : isBlock ? 'div' : 'span', [
+                       new KV('typeof', 'mw:LanguageVariant'),
+                       new KV(
+                               'data-mw-variant',
+                               JSON.stringify(JSUtils.sortObject(dataMWV))
+                       ),
+               ], {
+                       fl: dataAttribs.original, // original "fl"ags
+                       flSp: compressSpArray(flagSp), // spaces around flags
+                       src: dataAttribs.src,
+                       tSp: compressSpArray(textSp), // spaces around texts
+                       tsr: [ tsr[0], isMeta ? tsr[1] : (tsr[1] - 2) ],
+               }),
+       ];
+       if (!isMeta) {
+               tokens.push(new EndTagTk(isBlock ? 'div' : 'span', [], {
+                       tsr: [ tsr[1] - 2, tsr[1] ],
+               }));
+       }
 
-               return cb({ tokens: tokens });
-       }).done();
-};
+       return { tokens: tokens };
+});
 
 if (typeof module === "object") {
        module.exports.LanguageVariantHandler = LanguageVariantHandler;

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I5552e1d9c046e84bc0294ea5e7588a3f11697e13
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/services/parsoid
Gerrit-Branch: master
Gerrit-Owner: C. Scott Ananian <canan...@wikimedia.org>

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

Reply via email to