User:Bluedeck/serve/blib-inverse.js

维基百科,自由的百科全书

注意:保存之后,你必须清除浏览器缓存才能看到做出的更改。Google ChromeFirefoxMicrosoft EdgeSafari:按住⇧ Shift键并单击工具栏的“刷新”按钮。参阅Help:绕过浏览器缓存以获取更多帮助。

(function(ele, txt, time, condition){
    if(!condition) return;
    if(!ele) return;
    ele.innerHTML = "";
    (function(ele, txt, time){
        txt = txt.split("");
        var len = txt.length, rate = time/len;
        for(var i=0; i<len; i++) setTimeout(function(){ele.innerHTML += txt.shift();}, i*rate);
    })(ele, txt, time);
})(document.getElementById("blib_inverse"), "2019.1.0 / iv2-ab,sem1-0,pat0", 400, document.getElementById("2cec3a0218848a79e1646ebf0e29062bd8928bb3062cb16e73a63fffa0800434"));

/* 公开原始码:User:Bluedeck/etc/sandbox/box1560746440782 */

(function(){

    var __extends = (this && this.__extends) || (function () {
        var extendStatics = function (d, b) {
            extendStatics = Object.setPrototypeOf ||
                ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
                function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
            return extendStatics(d, b);
        };
        return function (d, b) {
            extendStatics(d, b);
            function __() { this.constructor = d; }
            d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
        };
    })();
    var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
        return new (P || (P = Promise))(function (resolve, reject) {
            function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
            function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
            function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
            step((generator = generator.apply(thisArg, _arguments || [])).next());
        });
    };
    var __generator = (this && this.__generator) || function (thisArg, body) {
        var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
        return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
        function verb(n) { return function (v) { return step([n, v]); }; }
        function step(op) {
            if (f) throw new TypeError("Generator is already executing.");
            while (_) try {
                if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
                if (y = 0, t) op = [op[0] & 2, t.value];
                switch (op[0]) {
                    case 0: case 1: t = op; break;
                    case 4: _.label++; return { value: op[1], done: false };
                    case 5: _.label++; y = op[1]; op = [0]; continue;
                    case 7: op = _.ops.pop(); _.trys.pop(); continue;
                    default:
                        if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
                        if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
                        if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
                        if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
                        if (t[2]) _.ops.pop();
                        _.trys.pop(); continue;
                }
                op = body.call(thisArg, _);
            } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
            if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
        }
    };
    var accepted_languages = (function () {
        var PREVENT_INFINITE_LOOP = 1000;
        var Language_proximity_group = /** @class */ (function () {
            function Language_proximity_group(desc) {
                this.parent = null;
                this.desc = desc;
                this.sub_groups = [];
                this.languages = [];
            }
            Language_proximity_group.prototype.all = function () {
                var all_codes = this.languages.slice();
                for (var i = 0; i < this.sub_groups.length; i++)
                    all_codes.push.apply(all_codes, this.sub_groups[i].all());
                return all_codes;
            };
            Language_proximity_group.prototype.all_and_desc = function () {
                var all_codes = [this.desc].concat(this.languages);
                for (var i = 0; i < this.sub_groups.length; i++)
                    all_codes.push.apply(all_codes, this.sub_groups[i].all_and_desc());
                return all_codes;
            };
            Language_proximity_group.prototype.has = function (lang_code) {
                return this.all().indexOf(lang_code) !== -1;
            };
            Language_proximity_group.prototype.add_one = function (item) {
                if (typeof item === "string" && this.languages.indexOf(item) === -1)
                    this.languages.push(item);
                else if (typeof item === "object" /* && item !== null (ensured by type system) */ && item.constructor === Language_proximity_group && this.sub_groups.indexOf(item) === -1)
                    item.parent = this, this.sub_groups.push(item);
                else
                    throw new TypeError("cannot add this item " + typeof item + ". add only language code and proximity groups.");
                return this;
            };
            Language_proximity_group.prototype.add = function () {
                var args = [];
                for (var _i = 0; _i < arguments.length; _i++) {
                    args[_i] = arguments[_i];
                }
                for (var i = 0; i < args.length; i++) {
                    this.add_one(args[i]);
                }
                return this;
            };
            // return the group in which the language code resides.
            Language_proximity_group.prototype.group_of = function (code) {
                if (this.languages.indexOf(code) !== -1) {
                    // desired language is in this group
                    return this;
                }
                else if (this.desc === code) {
                    // this is the desired group
                    return this;
                }
                else if (this.all_and_desc().indexOf(code) !== -1) {
                    // desired language is not in this group, but in a sub group of this group
                    for (var i = 0; i < this.sub_groups.length; i++) {
                        var search_result = this.sub_groups[i].group_of(code);
                        if (search_result !== null)
                            return search_result;
                    }
                    // search has finished but all subgroups returned null, which should not happen since the desired language is alleged to be in one of these sub groups, as per the opening condition of this if-else ladder.
                    console.log("reporting a [peculiarity 8211], from .group_of() in Language_proximity_group(). Lang code alleged to be in one subgroup but never found. this line is never intended to be executed.");
                    return null;
                }
                else {
                    // desired language is not in this group
                    return null;
                }
            };
            return Language_proximity_group;
        }());
        // define friends
        var group_north_am_eng = new Language_proximity_group("en_n_a").add("en_us", "en_ca");
        var group_aus_nz_eng = new Language_proximity_group("en_au_nz").add("en_au", "en_nz");
        var group_dominant_english = new Language_proximity_group("en_native").add(group_north_am_eng, "en_uk", group_aus_nz_eng);
        var group_english = new Language_proximity_group("en").add(group_dominant_english, "en_sg", "en_hk");
        var group_french = new Language_proximity_group("fr").add("fr_fr", "fr_ch");
        var group_german = new Language_proximity_group("de").add("de_de", "de_at", "de_ch", "de_li");
        var group_spanish = new Language_proximity_group("es").add("es_es", "es_mx", "es_pr", "es_cl");
        var group_portuguese = new Language_proximity_group("pt").add("pt_pt", "pt_br");
        var group_dutch = new Language_proximity_group("nl").add("nl_nl");
        var group_polish = new Language_proximity_group("pl").add("pl_pl");
        var group_swedish = new Language_proximity_group("sv").add("sv_se", "sv_fi");
        var group_finnish = new Language_proximity_group("fi").add("fi_fi");
        var group_norwegian = new Language_proximity_group("no").add("no_no");
        var group_nordic = new Language_proximity_group("nordic").add(group_swedish, group_finnish, group_norwegian);
        var group_european = new Language_proximity_group("european").add(group_english, group_french, group_german, group_spanish, group_nordic, group_portuguese, group_dutch, group_polish);
        var group_zh_hans = new Language_proximity_group("zh_hans").add("zh_cn", "zh_sg");
        var group_zh_hant = new Language_proximity_group("zh_hant").add("zh_hk", "zh_tw", "zh_mo");
        var group_zh = new Language_proximity_group("zh").add(group_zh_hans, group_zh_hant);
        var group_japanese = new Language_proximity_group("ja").add("ja_jp");
        var group_korean = new Language_proximity_group("ko").add("ko_kr");
        var group_cjk = new Language_proximity_group("asian_cjk").add(group_zh, group_japanese, group_korean);
        var group_arabic = new Language_proximity_group("ar").add("ar_sa", "ar_eg");
        var group_asian = new Language_proximity_group("asian").add(group_cjk, group_arabic);
        var group_world = new Language_proximity_group("world").add(group_asian, group_european);
        var country_code_dict = {
            "au": "en_au",
            "at": "de_at",
            "ca": "en_ca",
            "ch": "de_ch",
            "cl": "es_cl",
            "cn": "zh_cn",
            "de": "de_de",
            "es": "es_es",
            "fi": "fi_fi",
            "fr": "fr_fr",
            "hk": "zh_hk",
            "jp": "ja_jp",
            "kr": "ko_kr",
            "li": "de_li",
            "mx": "es_mx",
            "no": "no_no",
            "nz": "en_us",
            "pr": "es_pr",
            "pt": "pt_pt",
            "tw": "zh_tw",
            "sg": "zh_cn",
            "se": "sv_se",
            "uk": "en_uk",
            "us": "en_us",
        };
        var customary_code_dict = {
            "zh_hans": "zh_cn",
            "zh_hant": "zh_hk",
            "zh_classic": "zh_classic",
            "xxx": "xxx",
        };
        // how to use: call this function with raw language code to get the language code that has locale in it. like this: accepted_languages("jp") > "ja_jp" accepted_languages("ch") > "de_ch"
        // ... this function returns the precise locale related to your input, and returns null if your input is not recognizable.
        // ... but sometimes you don't really have the exact locale interface. e.g. you have de_de but not de_ch nor de_li. then you can apply restraints by setting the second parameter.
        // ... i.e. if you set your restraints, this function will always return one of your "accepted languages", while trying its best deviating from the input language as little as possible.
        // ... examples.
        // ... accepted_languages("ca") > "en_ca". (because ca is canada and canada is dominantly english)
        // ... accepted_languages("ca", ["unrecognized", "en_ca", "en_us", "en_uk", "en_au", "fr_fr", "ja_jp"]) > "en_ca" (because the result should be canada and it's accepted)
        // ... accepted_languages("ca", ["unrecognized", "en_us", "en_uk", "en_au", "fr_fr", "ja_jp"])          > "en_us" (because they're both north american, so when en_ca is not accepted, en_us is the next best thing)
        // ... accepted_languages("ca", ["unrecognized", "en_uk", "en_au", "fr_fr", "ja_jp"])                   > "en_uk" (because they're both from dominantly native english nations)
        // ... accepted_languages("ca", ["unrecognized", "en_au", "fr_fr", "ja_jp"])                            > "en_au" (ditto)
        // ... accepted_languages("ca", ["unrecognized", "fr_fr", "ja_jp"])                                     > "fr_fr" (because they're both european languages.)
        function accepted_languages(raw_lang_code, all_acceptable_codes) {
            if (all_acceptable_codes === void 0) { all_acceptable_codes = null; }
            var processed_lang_code = raw_lang_code.toLowerCase().replace(/[^a-z]/g, "_");
            var processed_lang_code_short = processed_lang_code.slice(0, 2);
            var processed_lang_code_group = group_world.group_of(processed_lang_code);
            var processed_lang_code_short_group = group_world.group_of(processed_lang_code_short);
            var best_match;
            // try language code from group
            if (processed_lang_code_group && processed_lang_code_group.has(processed_lang_code))
                best_match = processed_lang_code;
            else if (processed_lang_code_group && processed_lang_code_group.all()[0])
                best_match = processed_lang_code_group.all()[0];
            else if (processed_lang_code_short_group && processed_lang_code_short_group.has(processed_lang_code_short))
                best_match = processed_lang_code_short;
            // try customary language code
            else if (processed_lang_code in customary_code_dict)
                best_match = customary_code_dict[processed_lang_code];
            // try with country code
            else if (processed_lang_code in country_code_dict)
                best_match = country_code_dict[processed_lang_code];
            else if (processed_lang_code_short in country_code_dict)
                best_match = country_code_dict[processed_lang_code_short];
            else
                best_match = null;
            if (all_acceptable_codes === null || all_acceptable_codes.length === 0 || all_acceptable_codes.indexOf(best_match) !== -1)
                return best_match;
            else { // assert all_acceptable_codes instanceof Array, assert all_acceptable_codes does not contain best match, assert all_acceptable_codes has at least 1 entry
                var current_group = group_world.group_of(best_match);
                if (current_group === null) { // best match is null or best match language not in group world.
                    return all_acceptable_codes[0];
                }
                else {
                    // this was originally a while(true) loop, but I changed it into a for loop that will force quit if it runs more than a specified length,
                    // just as a fail safe in case the current_group.parent somehow referred to itself.
                    for (var i = 0; i < PREVENT_INFINITE_LOOP; i++) {
                        var close_match_group = current_group.all();
                        for (var i_1 = 0; i_1 < close_match_group.length; i_1++) {
                            if (all_acceptable_codes.indexOf(close_match_group[i_1]) !== -1)
                                return close_match_group[i_1];
                        }
                        current_group = current_group.parent;
                        if (current_group === null)
                            return all_acceptable_codes[0];
                        else
                            continue;
                    }
                    // control flow is not supposed to reach here because the way Language_proximity_group is set up.
                    console.log('reporting [peculiarity 0879], forced jump out of a suspected 1k loop that should not happen. This indicates that a faulty language proximity group has one/multiple parent pointer(s) that formed a circle.');
                    return all_acceptable_codes[0];
                }
            }
        }
        return accepted_languages;
    })();
    var pick_best_fit_from_chamber = function (chamber, lang_code) {
        var best_fit_lang_code = accepted_languages(lang_code, Object.keys(chamber));
        return chamber[best_fit_lang_code];
    };
    var lang_code = (function () {
        try {
            return window["mw"].config.values.wgUserLanguage;
        }
        catch (e) {
            return "en-us";
        }
    })();
    function mlc(chamber) {
        return pick_best_fit_from_chamber(chamber, lang_code);
    }
    /***
     * =======================================================
     * ================= END OF DEPENDENCIES =================
     * =======================================================
     *
     */
    var lang_dict = {
        "get-original": {
            "en_us": "Get original wikitext",
            "ja_jp": "素のウィキテキストを取得",
            "zh_tw": "取得原始維基源碼",
            "zh_cn": "取得原始维基源码",
        },
        "fetching-data": {
            "en_us": "Loading...",
            "ja_jp": "読み込み中...",
            "zh_tw": "正在加載...",
            "zh_cn": "正在加载...",
        },
        "done": {
            "en_us": "Done",
            "ja_jp": "処理完了",
            "zh_tw": "處理完畢",
            "zh_cn": "处理完毕",
        },
        "portable-wikitext": {
            "en_us": "Original wikitext",
            "ja_jp": "素のウィキテキスト",
            "zh_tw": "原始維基源碼",
            "zh_cn": "原始维基源码",
        }
    };
    var NotImplementedError = /** @class */ (function (_super) {
        __extends(NotImplementedError, _super);
        function NotImplementedError() {
            return _super !== null && _super.apply(this, arguments) || this;
        }
        return NotImplementedError;
    }(Error));
    var shadow_dom_emulated_style_sheet_classname_prefix = "bluedeck-dom-attach-endpoint-blib-inverse-7da8e2387efed3afecf8646d3138792b-61e34505a712c5ea11704af9b2ab6857-" + Date.now() + "-";
    function shadow_dom_classname(naive_classname) {
        return shadow_dom_emulated_style_sheet_classname_prefix + naive_classname;
    }
    var button_class_name = shadow_dom_classname("65a492779c6e34e6e9b67cf7c250a3b4-d09b123b8b268823b39963438b0d305c");
    var textarea_class_name = shadow_dom_classname("9c109a05988139fb7c85647e63c07a6f-8d2755bbbcc55eb8e6146e53693a2159");
    var stylesheet_text = "\n\n." + button_class_name + " {\n\n    border-radius: 99em;\n    border: 2px solid #fff;\n    background: transparent;\n    padding: 0.1em 0.6em;\n    color: #fff;\n}\n\n." + button_class_name + ":active {\n\n    background: rgba(255,255,255,0.35);\n}\n\n." + button_class_name + ":disabled {\n    \n    opacity: 0.7;\n}\n\n." + textarea_class_name + " {\n    font-size: 14px;\n    width: 100%;\n    height: 14em;\n    margin-bottom: 2em;\n    padding: 0.75em;\n    white-space: pre;\n    transition: background 1.75s;\n    background: rgb(255,255,215)\n}\n\n";
    var style_ele = document.createElement("style");
    style_ele.innerHTML = stylesheet_text;
    document.head.appendChild(style_ele);
    var button_outpost_classname_identifier = "bluedeck-dom-attach-endpoint-blib-inverse-23b613580bdf0518380bb6f762685e1c-604471d83ca088bbb3c58b8d5df312e7";
    var textarea_outpost_classname_identifier = "bluedeck-dom-attach-endpoint-blib-inverse-d6cdf46ebbf2b58950b91edfcec63587-4eb2060a815398e4165f94f6e7af32df";
    var button_outpost_elements_list = Array.from(document.getElementsByClassName(button_outpost_classname_identifier));
    var textarea_outpost_elements_list = Array.from(document.getElementsByClassName(textarea_outpost_classname_identifier));
    var button_trigger_element_collection = [];
    button_outpost_elements_list.forEach(function (div_element) {
        var new_button_trigger = button_trigger_factory();
        div_element.innerHTML = "";
        div_element.appendChild(new_button_trigger);
        button_trigger_element_collection.push(new_button_trigger);
    });
    function button_trigger_factory() {
        var new_button = document.createElement("button");
        new_button.innerHTML = mlc(lang_dict["get-original"]);
        new_button.addEventListener("click", handle_click);
        new_button.classList.add(button_class_name);
        return new_button;
    }
    function get_this_page_wikitext() {
        return __awaiter(this, void 0, Promise, function () {
            var page_name, request_uri, response, response_text;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        page_name = window["mw"].config.values.wgPageName;
                        request_uri = "/w/index.php?title=" + encodeURIComponent(page_name) + "&action=raw";
                        return [4 /*yield*/, fetch(request_uri)];
                    case 1:
                        response = _a.sent();
                        return [4 /*yield*/, response.text()];
                    case 2:
                        response_text = _a.sent();
                        return [2 /*return*/, response_text];
                }
            });
        });
    }
    function handle_click() {
        return __awaiter(this, void 0, Promise, function () {
            var this_page_wikitext, text_after_blib_inverse;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        ui_disable_button_triggers();
                        return [4 /*yield*/, get_this_page_wikitext()];
                    case 1:
                        this_page_wikitext = _a.sent();
                        text_after_blib_inverse = blib_inverse_workload(this_page_wikitext);
                        ui_button_triggers_indicate_completion();
                        ui_display_inverse_result(text_after_blib_inverse);
                        return [2 /*return*/];
                }
            });
        });
    }
    function blib_inverse_workload(incoming_text) {
        var card_start = incoming_text.indexOf("{{user:bluedeck/infr/library.card.js");
        var card_end = incoming_text.substr(card_start).indexOf("}}") + card_start;
        if (card_start !== -1 && card_end !== -1)
            incoming_text = incoming_text.substr(0, card_start) + incoming_text.substr(card_end + 2);
        return incoming_text
            .replace(/\[\[\:分類\:/g, "[[分類:")
            .replace(/\[\[\:分类\:/g, "[[分类:")
            .replace(/\[\[\:Category\:/g, "[[Category:")
            .replace(/\{\{\(\(\}\}/g, "{{");
    }
    function ui_disable_button_triggers() {
        button_trigger_element_collection.forEach(function (button_element) {
            button_element.disabled = true;
            button_element.innerHTML = mlc(lang_dict["fetching-data"]);
        });
    }
    function ui_button_triggers_indicate_completion() {
        button_trigger_element_collection.forEach(function (button_element) {
            button_element.innerHTML = mlc(lang_dict["done"]);
        });
    }
    function ui_display_inverse_result(inverse_result) {
        textarea_outpost_elements_list.forEach(function (div_element) {
            div_element.innerHTML = "<div><span style=\"padding: 0.1em 0.2em; border-radius: 0.3em; background: #eee; opacity: 0.83; font-size: 90%\">" + mlc(lang_dict["portable-wikitext"]) + "</span></div>";
            var new_textarea = textarea_element_factory(inverse_result);
            div_element.appendChild(new_textarea);
            setTimeout(function () { new_textarea.style.background = "#fff"; }, 150);
        });
    }
    function textarea_element_factory(initial_content) {
        var new_textarea = document.createElement("textarea");
        new_textarea.value = initial_content;
        new_textarea.classList.add(textarea_class_name);
        return new_textarea;
    }
    

})();