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