(Translated by https://www.hiragana.jp/)
MediaWiki:Gadget-fixlinkstyle.js - 维基百科,自由的百科全书

MediaWiki:Gadget-fixlinkstyle.js

注意ちゅうい保存ほぞんきさき,你必须清じょ浏览缓存才能さいのういた做出てき更改こうかいGoogle ChromeFirefoxMicrosoft EdgeSafari:按住⇧ Shift键并单击工具こうぐ栏的“刷新さっしん”按钮。まいりHelp:绕过浏览缓存以获取さら帮助。

// <nowiki>
/**
 * 維基百科ひゃっか{{link style}}修復しゅうふく工具こうぐ ver: 0.5
 *
 * Author: [[User:逆襲ぎゃくしゅうてき天邪鬼あまのじゃく]]
 *
 * 該工具こうぐかいざい{{link style}}ばん下面かめん顯示けんじ按鈕,あるものざい編輯へんしゅうしきぺーじめんさいそこいち修復しゅうふくlink style」按鈕。
 *
 * 查看やめbugある報告ほうこくbug:[[User talk:逆襲ぎゃくしゅうてき天邪鬼あまのじゃく/fixlinkstyle.js]]
 *
 * 更新こうしん日誌にっし
 * 0.1(2016-10-14):修復しゅうふく部分ぶぶん連結れんけつゆうちゅうぶんただし找到てきbug;加入かにゅういち些細ささいぶしれい如查差異さい突出とっしゅつ顯示けんじぶん內的またがげん連結れんけつ
 * 0.2(2016-10-15):のう直接ちょくせつおさむあらため上下じょうげぶん
 * 0.3(2016-10-16):修復しゅうふくbug
 * 0.4(2016-11-06):加入かにゅう簡體ちゅうぶん界面かいめんなみ处理[[Special:Permalink/42067088]]
 * 0.5(2017-03-06):修復しゅうふくいち些小bug
 *
 * WHAT SHOULD I DO IF I HAD AN EGGPAIN:
 * 1. じゅううつし article.scanInterLinks()
 */

(function($, mw) {
    'use strict';

    mw.loader.using('jquery.ui');

    var UI;
    // あきら顧一下看不懂繁體字的簡體字用戶
    switch (mw.config.get('wgUserLanguage')) {
        case 'zh-cn':
        case 'zh-hans':
        case 'zh-my':
        case 'zh-sg':
            UI = {
                CLEARBUTTON: 'せいさとし',
                CLEARBUTTON2: 'きよし{{link style}}',
                TITLE: '维基百科ひゃっか{{link style}}おさむ复工',
                LOADING: 'せいざい载...',
                CHECKINGTITLE: 'せいざい检查存在そんざい同名どうめい条目じょうもく...',
                TRANSLATING: 'せいざい尝试搜索そうさく对应ちゅうぶん条目じょうもく...',
                FOUND: '找到$1个跨语言链接',
                NETWORKERROR: '网络错误',
                TITLELINKSCLEAN: 'ほん工具こうぐよう于处<a href="https://zh.wikipedia.org/wiki/WP:MOSIW" target="_blank">またが语言链接</a>かずあきら节标题上てき链接,摘掉条目じょうもくてき{{<a href="https://zh.wikipedia.org/wiki/Template:Link_style" target="_blank">link style</a>}}ばん。<br><br>本文ほんぶんざいあきら节标题处ゆう$1个链せっ,它们はた条件じょうけんきよしじょ:<br>',
                OLDTITLE: 'きゅう标题',
                NEWTITLE: 'しん标题',
                TITLELINKSCLEAN2: '<br>注意ちゅうい,如果希望きぼう对这些标题进ぎょう其他おさむあらため,请在てん击“したいちきさきてん击“查看异”进行こう对和修正しゅうせい。<br>',
                NEXT: 'したいち',
                WELCOME: '<div style="padding: 12px;margin-bottom: 10px;background-color: #d9edf7;border-color: #bce8f1;color: #31708f;">现有大量たいりょう不正ふせい确的またが语言链接(绿链)需要じゅようおさむ复,欢迎协助处理:<a href="https://zh.wikipedia.org/wiki/User:Cewbot/需要じゅよう修正しゅうせいてきまたがげん連結れんけつ" target="_blank">User:Cewbot/需要じゅよう修正しゅうせいてきまたがげん連結れんけつ</a></div>ほん工具こうぐよう于处<a href="https://zh.wikipedia.org/wiki/WP:MOSIW" target="_blank">またが语言链接</a>かずあきら节标题上てき链接,摘掉条目じょうもくてき{{<a href="https://zh.wikipedia.org/wiki/Template:Link_style" target="_blank">link style</a>}}ばん。<span style="color:red;">ざいきよし过程ちゅう请认检查上下じょうげぶん!</span><br><br>请选择各またが语言链接てき处理方法ほうほう:',
                NONE: 'ぼつゆう发现跨语言链接。这通常つうじょう可能かのう:<br>① またが语言链接やめきよしただしぼっゆう掉{{link style}}ばん;<br>② 条目じょうもくちゅうぼつゆうまたが语言链接,ただし条目じょうもくちゅう所用しょようてきばんゆう以通过检查文章ぶんしょうちゅうこうあきらてき部分ぶぶんらい确认;<br><br>',
                LINK: '链接',
                CHINESEARTICLE: '对应ちゅうぶん条目じょうもく:',
                CHINESETEST2: '注意ちゅうい同名どうめいちゅうぶん条目じょうもく:',
                CHINESETEST: '搜索そうさくちゅうぶん维基条目じょうもく:',
                QUICKSEARCH: '按回车键搜索そうさくちゅうぶん维基',
                GOOGLEIT: 'Google搜索そうさく原名げんめい+‘ちゅうぶん’”',
                GOOGLEIT2: 'Google搜索そうさくざい维基ちゅうてきげん条目じょうもく',
                MISSING: 'そとぶん维基百科ひゃっか无此条目じょうもく',
                PAGENOTFOUND: '页面找到',
                GOOGLETRANSLATE: 'Googleこぼし译',
                GOOGLELANG: 'zh-CN',
                ACTION: '处理',
                DONTMODIFY: 'おさむあらため',
                REMOVELINK: 'じょ链接',
                ORIGINALNAME: '原名げんめい',
                ARTICLENAME: '条目じょうもくめい',
                LANGUAGE: '语言',
                DISPLAYTEXT: '显示ぶんほん',
                REPLACETO: 'がえ换成',
                WIKICODE: '维基だい码',
                CHINESE: 'ちゅうぶん',
                REPLACECONTEXT: '查看/おさむあらため上下じょうげぶん',
                QUICKREPLACE: '<strong>快速かいそくがえ换:</strong>',
                SHOWDIFF: '显示更改こうかい',
                SUBMIT: '直接ちょくせつ保存ほぞん',
                BUGREPORT: '<a href="https://zh.wikipedia.org/wiki/User_talk:逆襲ぎゃくしゅうてき天邪鬼あまのじゃく/fixlinkstyle.js" target="_blank" style="display:inline-block;float:right;"><small>提出ていしゅつ见/报告Bug</small></a>',
                SAVING: 'せいざい保存ほぞん...',
                PAGENOTCHANGED: '无法更改こうかい页面',
                SUCCESS: '成功せいこう',
                WARNING: '警告けいこくざい您决ていひさげ交之まえ,请您认真检查上下じょうげぶんいやせい确,并且您需要じゅようぬし动承担编辑错误的きさきはて(如果ほどじょ正常せいじょうてき话)。けん议先てん击“显示更改こうかい”以检查变さら决定直接ちょくせつひさげ交?',
                SUMMARY: '[[MediaWiki:Gadget-fixlinkstyle.js|摘掉]]{{Link Style}}:とも$1个跨语言链接',
                SUMMARY2: '[[MediaWiki:Gadget-fixlinkstyle.js|きよし]]$1个跨语言链接',
                AND: '',
                UNDO: '撤销',
                TITLELINKS: '$1个标题链せっ'
            };
            break;
        default:
            UI = {
                CLEARBUTTON: 'せいさとし',
                CLEARBUTTON2: 'きよし{{link style}}',
                TITLE: '維基百科ひゃっか{{link style}}修復しゅうふく工具こうぐ',
                LOADING: 'せいざい...',
                CHECKINGTITLE: 'せいざいけん查是存在そんざい同名どうめい條目じょうもく...',
                TRANSLATING: 'せいざい嘗試さがせひろ對應たいおうちゅうぶん條目じょうもく...',
                FOUND: '找到$1個いっこまたがげん連結れんけつ',
                NETWORKERROR: 'もう錯誤さくご',
                TITLELINKSCLEAN: 'ほん工具こうぐよう處理しょり<a href="https://zh.wikipedia.org/wiki/WP:MOSIW" target="_blank">またがげん連結れんけつ</a>かず章節しょうせつ標題ひょうだいじょうてき連結れんけつ,摘掉條目じょうもくてき{{<a href="https://zh.wikipedia.org/wiki/Template:Link_style" target="_blank">link style</a>}}ばん。<br><br>本文ほんぶんざい章節しょうせつ標題ひょうだいしょゆう$1個いっこ連結れんけつ,它們はた無條件むじょうけんきよしじょ:<br>',
                OLDTITLE: 'きゅう標題ひょうだい',
                NEWTITLE: 'しん標題ひょうだい',
                TITLELINKSCLEAN2: '<br>注意ちゅうい,如果希望きぼうたい這些標題ひょうだい進行しんこう其他おさむあらため,請在てんげきしたいちこれてんげき「查看差異さい進行しんこうこうたい修正しゅうせい。<br>',
                NEXT: 'したいち',
                WELCOME: '<div style="padding: 12px;margin-bottom: 10px;background-color: #d9edf7;border-color: #bce8f1;color: #31708f;">現有げんゆう大量たいりょう不正ふせいかくてきまたがげん連結れんけつみどりれん需要じゅよう修復しゅうふく歡迎かんげいきょうじょ處理しょり:<a href="https://zh.wikipedia.org/wiki/User:Cewbot/需要じゅよう修正しゅうせいてきまたがげん連結れんけつ" target="_blank">User:Cewbot/需要じゅよう修正しゅうせいてきまたがげん連結れんけつ</a></div>ほん工具こうぐよう處理しょり<a href="https://zh.wikipedia.org/wiki/WP:MOSIW" target="_blank">またがげん連結れんけつ</a>かず章節しょうせつ標題ひょうだいじょうてき連結れんけつ,摘掉條目じょうもくてき{{<a href="https://zh.wikipedia.org/wiki/Template:Link_style" target="_blank">link style</a>}}ばん。<span style="color:red;">ざいきよし過程かていちゅう請認けん上下じょうげぶん!</span><br><br>請選擇せんたくかくまたがげん連結れんけつてき處理しょり方法ほうほう:',
                NONE: 'ぼつゆう發現はつげんまたがげん連結れんけつ。這通常つうじょう可能かのう:<br>① またがげん連結れんけつやめきよしただしぼっゆう掉{{link style}}ばん;<br>② 條目じょうもくちゅうぼつゆうまたがげん連結れんけつただし條目じょうもくちゅう所用しょようてきばんゆう通過つうかけん文章ぶんしょうちゅう突顯てき部分ぶぶんらい確認かくにん;<br><br>',
                LINK: '連結れんけつ',
                CHINESEARTICLE: '對應たいおうちゅうぶん條目じょうもく:',
                CHINESETEST2: '注意ちゅうい同名どうめいちゅうぶん條目じょうもく:',
                CHINESETEST: '檢索けんさくちゅうぶん維基條目じょうもく:',
                QUICKSEARCH: '按Enterさがせひろちゅうぶん維基',
                GOOGLEIT: 'Googleさがせひろ原名げんめい+『ちゅうぶん』」',
                GOOGLEIT2: 'Googleさがせひろざい維基內的げん條目じょうもく',
                MISSING: 'そとぶん維基百科ひゃっか此條',
                PAGENOTFOUND: 'ぺーじめん找到',
                GOOGLETRANSLATE: 'Google翻譯ほんやく',
                GOOGLELANG: 'zh-TW',
                ACTION: '處理しょり',
                DONTMODIFY: 'おさむあらため',
                REMOVELINK: 'じょ連結れんけつ',
                ORIGINALNAME: '原名げんめい',
                ARTICLENAME: '條目じょうもくめい',
                LANGUAGE: 'かたりごと',
                DISPLAYTEXT: '顯示けんじぶんほん',
                REPLACETO: 'かえかわしげる',
                WIKICODE: '維基原始げんし碼',
                CHINESE: 'ちゅうぶん',
                REPLACECONTEXT: '檢視けんし/おさむあらため上下じょうげぶん',
                QUICKREPLACE: '<strong>快速かいそくかえかわ:</strong>',
                SHOWDIFF: '檢視けんし差異さい',
                SUBMIT: '直接ちょくせつ储存',
                BUGREPORT: '<a href="https://zh.wikipedia.org/wiki/User_talk:逆襲ぎゃくしゅうてき天邪鬼あまのじゃく/fixlinkstyle.js" target="_blank" style="display:inline-block;float:right;"><small>提出ていしゅつ意見いけん/報告ほうこくBug</small></a>',
                SAVING: 'せいざい储存...',
                PAGENOTCHANGED: '無法むほう更改こうかいぺーじめん',
                SUCCESS: '成功せいこう',
                WARNING: '警告けいこくざい決定けっていひさげ交之まえ,請您みとめけん上下じょうげぶん正確せいかくなみ且您需要じゅよう主動しゅどううけたまわ編輯へんしゅう錯誤さくごてきはて(如果ほどしき正常せいじょうてきばなし)。建議けんぎさきてんげき「查看差異さい」以檢查變更へんこう決定けってい直接ちょくせつひさげ交?',
                SUMMARY: '[[MediaWiki:Gadget-fixlinkstyle.js|摘掉]]{{Link Style}}ばんとも$1個いっこまたがげん連結れんけつ',
                SUMMARY2: '[[MediaWiki:Gadget-fixlinkstyle.js|きよし]]$1個いっこまたがげん連結れんけつ',
                AND: '',
                UNDO: 'かえはら',
                TITLELINKS: '$1個いっこ標題ひょうだい連結れんけつ'
            };
    }

    // 各種かくしゅげん
    var LANGUAGES = {
'aa':'aa','ab':'ab','ace':'ace','ady':'ady','af':'af','ak':'ak','als':'als','am':'am','an':'an','ang':'ang','ar':'ar','arc':'arc','arz':'arz','as':'as','ast':'ast','av':'av','ay':'ay','az':'az','azb':'azb','ba':'ba','bar':'bar','bat-smg':'bat-smg','bcl':'bcl','be':'be','be-tarask':'be-x-old','be-x-old':'be-x-old','bg':'bg','bh':'bh','bi':'bi','bjn':'bjn','bm':'bm','bn':'bn','bo':'bo','bpy':'bpy','br':'br','bs':'bs','bug':'bug','bxr':'bxr','ca':'ca','cbk-zam':'cbk-zam','cdo':'cdo','ce':'ce','ceb':'ceb','ch':'ch','cho':'cho','chr':'chr','chy':'chy','ckb':'ckb','co':'co','cr':'cr','crh':'crh','cs':'cs','csb':'csb','cu':'cu','cv':'cv','cy':'cy','da':'da','de':'de','diq':'diq','dsb':'dsb','dv':'dv','dz':'dz','ee':'ee','egl':'eml','el':'el','eml':'eml','en':'en','eo':'eo','es':'es','et':'et','eu':'eu','ext':'ext','fa':'fa','ff':'ff','fi':'fi','fiu-vro':'fiu-vro','fj':'fj','fo':'fo','fr':'fr','frp':'frp','frr':'frr','fur':'fur','fy':'fy','ga':'ga','gag':'gag','gan':'gan','gd':'gd','gl':'gl','glk':'glk','gn':'gn','gom':'gom','got':'got','gsw':'als','gu':'gu','gv':'gv','ha':'ha','hak':'hak','haw':'haw','he':'he','hi':'hi','hif':'hif','ho':'ho','hr':'hr','hsb':'hsb','ht':'ht','hu':'hu','hy':'hy','hz':'hz','ia':'ia','id':'id','ie':'ie','ig':'ig','ii':'ii','ik':'ik','ilo':'ilo','io':'io','is':'is','it':'it','iu':'iu','ja':'ja','jam':'jam','jbo':'jbo','jv':'jv','ka':'ka','kaa':'kaa','kab':'kab','kbd':'kbd','kg':'kg','ki':'ki','kj':'kj','kk':'kk','kl':'kl','km':'km','kn':'kn','ko':'ko','koi':'koi','kr':'kr','krc':'krc','ks':'ks','ksh':'ksh','ku':'ku','kv':'kv','kw':'kw','ky':'ky','la':'la','lad':'lad','lb':'lb','lbe':'lbe','lez':'lez','lg':'lg','li':'li','lij':'lij','lmo':'lmo','ln':'ln','lo':'lo','lrc':'lrc','lt':'lt','ltg':'ltg','lv':'lv','lzh':'zh-classical','mai':'mai','map-bms':'map-bms','mdf':'mdf','mg':'mg','mh':'mh','mhr':'mhr','mi':'mi','min':'min','mk':'mk','ml':'ml','mn':'mn','mo':'mo','mr':'mr','mrj':'mrj','ms':'ms','mt':'mt','mus':'mus','mwl':'mwl','my':'my','myv':'myv','mzn':'mzn','na':'na','nah':'nah','nan':'zh-min-nan','nap':'nap','nb':'no','nds':'nds','nds-nl':'nds-nl','ne':'ne','new':'new','ng':'ng','nl':'nl','nn':'nn','no':'no','nov':'nov','nrm':'nrm','nso':'nso','nv':'nv','ny':'ny','oc':'oc','olo':'olo','om':'om','or':'or','os':'os','pa':'pa','pag':'pag','pam':'pam','pap':'pap','pcd':'pcd','pdc':'pdc','pfl':'pfl','pi':'pi','pih':'pih','pl':'pl','pms':'pms','pnb':'pnb','pnt':'pnt','ps':'ps','pt':'pt','qu':'qu','rm':'rm','rmy':'rmy','rn':'rn','ro':'ro','roa-rup':'roa-rup','roa-tara':'roa-tara','ru':'ru','rue':'rue','rup':'roa-rup','rw':'rw','sa':'sa','sah':'sah','sc':'sc','scn':'scn','sco':'sco','sd':'sd','se':'se','sg':'sg','sgs':'bat-smg','sh':'sh','si':'si','simple':'simple','sk':'sk','sl':'sl','sm':'sm','sn':'sn','so':'so','sq':'sq','sr':'sr','srn':'srn','ss':'ss','st':'st','stq':'stq','su':'su','sv':'sv','sw':'sw','szl':'szl','ta':'ta','tcy':'tcy','te':'te','tet':'tet','tg':'tg','th':'th','ti':'ti','tk':'tk','tl':'tl','tn':'tn','to':'to','tpi':'tpi','tr':'tr','ts':'ts','tt':'tt','tum':'tum','tw':'tw','ty':'ty','tyv':'tyv','udm':'udm','ug':'ug','uk':'uk','ur':'ur','uz':'uz','ve':'ve','vec':'vec','vep':'vep','vi':'vi','vls':'vls','vo':'vo','vro':'fiu-vro','wa':'wa','war':'war','wo':'wo','wuu':'wuu','xal':'xal','xh':'xh','xmf':'xmf','yi':'yi','yo':'yo','yue':'zh-yue','za':'za','zea':'zea','zh':'zh','zh-classical':'zh-classical','zh-cn':'zh','zh-min-nan':'zh-min-nan','zh-tw':'zh','zh-yue':'zh-yue','zu':'zu'
    };
    // 修復しゅうふく不正ふせいかくてきげんだい
    var BADLANGS = {
        'jp': 'ja',
        'zh': ''
    };
    // 不要ふよう處理しょりうらめんてき連結れんけつ
    // 注意ちゅうい目前もくぜんただ處理しょりIGNOREAREA[0],如果需要じゅよう添加てんか麼需ようおさむあらためarticle.scaninnerlinkちゅうてき相關そうかん部分ぶぶん
    var IGNOREAREA = [
        /{{\s*(expand language|request translation|translation request|transexpan|請求せいきゅう翻譯ほんやく|请求こぼし译|こぼし译请もとむ|翻譯ほんやく請求せいきゅう|もとめ翻譯ほんやく|もとめこぼし译|需要じゅよう翻譯ほんやく|需要じゅようこぼし译).*?}}/gi
    ];
    // 檢視けんし上下じょうげぶんてき快速かいそくかえかわ
    var QUICKREPLACES = [
        {
            search: /([“‘「『《〈]?)\[\[([^\[\]]*?)\]\]([”’」』》〉]?)(\[\[:([^\[\]]*?):([^\[\]]*?)\]\]()?)/,
            schemas: [
                {
                    name: '[[ちゅうぶん]]',
                    replace: function (text) {
                        return text.replace(/([“‘「『《〈]?)\[\[([^\[\]]*?)\]\]([”’」』》〉]?)(\[\[:([^\[\]]*?):([^\[\]]*?)\]\]()?)/, function (match, p1, p2, p3, p4, p5, p6) {
                            return p1 + '[[' + p2 + ']]' + p3;
                        });
                    }
                },
                {
                    name: '[[ちゅうぶん]]({{lang|xx|そとぶん}})',
                    replace: function (text) {
                        return text.replace(/([“‘「『《〈]?)\[\[([^\[\]]*?)\]\]([”’」』》〉]?)(\[\[:([^\[\]]*?):([^\[\]]*?)\]\]()?)/, function (match, p1, p2, p3, p4, p5, p6) {
                            var p5s = p5.split('|');
                            var p5t = p5s.length>1 ? p5s[1] : p5s[0];
                            return p1 + '[[' + p2 + ']]' + p3 + '({{lang|' + p4 + '|' + p5t + '}}' + p6;
                        });
                    }
                },
                {
                    name: '[[ちゅうぶん]](そとぶん)',
                    replace: function (text) {
                        return text.replace(/([“‘「『《〈]?)\[\[([^\[\]]*?)\]\]([”’」』》〉]?)(\[\[:([^\[\]]*?):([^\[\]]*?)\]\]()?)/, function (match, p1, p2, p3, p4, p5, p6) {
                            var p5s = p5.split('|');
                            var p5t = p5s.length>1 ? p5s[1] : p5s[0];
                            return p1 + '[[' + p2 + ']]' + p3 + '(' + p5t + p6;
                        });
                    }
                },
                {
                    name: '{{tsl|xx|そとぶん|ちゅうぶん}}',
                    replace: function (text) {
                        return text.replace(/([“‘「『《〈]?)\[\[([^\[\]]*?)\]\]([”’」』》〉]?)(\[\[:([^\[\]]*?):([^\[\]]*?)\]\]()?)/, function (match, p1, p2, p3, p4, p5, p6) {
                            return p1 + '{{tsl|' + p4 + '|' + p5.split('|')[0] + '|' + p2 + '}}' + p3;
                        });
                    }
                },
                {
                    name: '{{link-xx|ちゅうぶん|そとぶん}}',
                    replace: function (text) {
                        return text.replace(/([“‘「『《〈]?)\[\[([^\[\]]*?)\]\]([”’」』》〉]?)(\[\[:([^\[\]]*?):([^\[\]]*?)\]\]()?)/, function (match, p1, p2, p3, p4, p5, p6) {
                            var p2s = p2.split('|');
                            var p2a = p2s[0];
                            var p2b = p2s.length>1 ? ('|' + p2s[1]) : '';
                            return p1 + '{{link-' + p4 + '|' + p2a + '|' + p5.split('|')[0] + p2b + '}}' + p3;
                        });
                    }
                }
            ]
        },
        {
            search: /\[\[:([^\[\]]*?):([^\[\]]*?)\|([^\[\]]*?)\]\]/,
            schemas: [
                {
                    name: '{{tsl|xx|そとぶん|ちゅうぶん}}',
                    replace: function (text) {
                        return text.replace(/\[\[:([^\[\]]*?):([^\[\]]*?)\|([^\[\]]*?)\]\]/, function (match, p1, p2, p3) {
                            return '{{tsl|' + p1 + '|' + p2 + '|' + p3 + '}}';
                        });
                    }
                },
                {
                    name: '{{link-xx|ちゅうぶん|そとぶん}}',
                    replace: function (text) {
                        return text.replace(/\[\[:([^\[\]]*?):([^\[\]]*?)\|([^\[\]]*?)\]\]/, function (match, p1, p2, p3) {
                            return '{{link-' + p1 + '|' + p3 + '|' + p2 + '}}';
                        });
                    }
                },
                {
                    name: '[[ちゅうぶん]](そとぶん)',
                    replace: function (text) {
                        return text.replace(/\[\[:([^\[\]]*?):([^\[\]]*?)\|([^\[\]]*?)\]\]/, function (match, p1, p2, p3) {
                            return '[[' + p3 + ']](' + p2 + ')';
                        });
                    }
                },
                {
                    name: '[[ちゅうぶん]]({{lang|xx|そとぶん}})',
                    replace: function (text) {
                        return text.replace(/\[\[:([^\[\]]*?):([^\[\]]*?)\|([^\[\]]*?)\]\]/, function (match, p1, p2, p3) {
                            return '[[' + p3 + ']]({{lang|' + p1 + '|' + p2 + '}})';
                        });
                    }
                },
                {
                    name: 'ちゅうぶんそとぶん)',
                    replace: function (text) {
                        return text.replace(/\[\[:([^\[\]]*?):([^\[\]]*?)\|([^\[\]]*?)\]\]/, function (match, p1, p2, p3) {
                            return p3 + '(' + p2 + ')';
                        });
                    }
                },
                {
                    name: 'ちゅうぶん({{lang|xx|そとぶん}})',
                    replace: function (text) {
                        return text.replace(/\[\[:([^\[\]]*?):([^\[\]]*?)\|([^\[\]]*?)\]\]/, function (match, p1, p2, p3) {
                            return p3 + '({{lang|' + p1 + '|' + p2 + '}})';
                        });
                    }
                }
            ]
        }
    ];



    /*
     * じょ維基百科ひゃっかAPI讀寫內容
     */
    var wiki = {
        loadPage: function (pageName, success, failure) {
            $.ajax({
                url: mw.util.wikiScript('api'),
                data: {
                    action: 'query',
                    prop: 'revisions',
                    rvprop: 'content',
                    titles: pageName,
                    redirects: true,
                    format: 'json'
                },
                dataType: 'json',
                type: 'POST',
                success: function (data) {
                    if (data.query) {
                        // var r = {};
                        var pages = data.query.pages;
                        for (var pageid in pages) {
                            var page = pages[pageid];
                            if (!('missing' in page)) {
                                // r[page.title] = page.revisions[0]['*'];
                                if (typeof success === 'function') {
                                    success(page.revisions[0]['*']);
                                    return;
                                }
                            }
                        }
                        /*
                        if (typeof success === 'function') {
                            success(r);
                        }
                        */
                    }

                    if (typeof failure === 'function') {
                        failure(UI.PAGENOTFOUND);
                    }
                },
                error: function (xhr) {
                    if (typeof failure === 'function') {
                        failure(UI.NETWORKERROR);
                    }
                }
            });
        },
        savePage: function (title, content, summary, success, failure) {
            // 保存ほぞんぺーじめん
            // 該編輯へんしゅうかい標記ひょうきためしょう編輯へんしゅう
            $.ajax({
                url: mw.util.wikiScript('api'),
                data: {
                    format: 'json',
                    action: 'edit',
                    title: title,
                    summary: summary,
                    minor: true,
                    text: content,
                    token: mw.user.tokens.get('csrfToken')
                },
                dataType: 'json',
                type: 'POST',
                success: function (data) {
                    if (data && data.edit && data.edit.result === 'Success') {
                        if (typeof success === 'function') {
                            success();
                        }
                    } else {
                        if (typeof failure === 'function') {
                            failure(UI.PAGENOTCHANGED);
                        }
                    }
                },
                error: function (xhr) {
                    if (typeof failure === 'function') {
                        failure(UI.NETWORKERROR);
                    }
                }
            });
        },
        translateTitle: function (titles, fromLang, toLang, transTable, success) {
            $.ajax({
                url: 'https://' + LANGUAGES[fromLang] + '.wikipedia.org/w/api.php',
                data: {
                    action: 'query',
                    prop: 'langlinks',
                    lllang: toLang,
                    format: 'json',
                    redirects: true,
                    lllimit: 50,
                    titles: titles
                },
                dataType: 'jsonp',
                type: 'POST',
                success: function (data) {
                    if (data.query) {
                        // げんてき標題ひょうだい
                        var orinTitle = {};
                        var convert = function (arr) {
                            if (arr) {
                                for (var i=0; i<arr.length; i++) {
                                    if (orinTitle[arr[i].from]) {
                                        orinTitle[arr[i].to] = orinTitle[arr[i].from];
                                    } else {
                                        orinTitle[arr[i].to] = arr[i].from;
                                    }
                                }
                            }
                        };
                        convert(data.query.normalized);
                        convert(data.query.redirects);

                        // しめぎあきら翻譯ほんやく情況じょうきょう
                        var pages = data.query.pages;
                        for (var pageid in pages) {
                            var page = pages[pageid];
                            var title = page.title;
                            if (orinTitle[title]) {
                                title = orinTitle[title];
                            }

                            if (page.missing !== undefined) {
                                transTable[fromLang + ':' + title] = null;
                            } else if (page.langlinks) {
                                transTable[fromLang + ':' + title] = page.langlinks[0]['*'];
                            }
                        }
                    }
                    if (typeof success === 'function') {
                        success();
                    }
                }
            });
        },
        checkTitle: function (titles, checkTable, success, failure) {
            $.ajax({
                url: mw.util.wikiScript('api'),
                data: {
                    action: 'query',
                    format: 'json',
                    redirects: true,
                    titles: titles
                },
                dataType: 'json',
                type: 'POST',
                success: function (data) {
                    if (data.query) {
                        // げんてき標題ひょうだい
                        var orinTitle = {};
                        var convert = function (arr) {
                            if (arr) {
                                for (var i=0; i<arr.length; i++) {
                                    if (orinTitle[arr[i].from]) {
                                        orinTitle[arr[i].to] = orinTitle[arr[i].from];
                                    } else {
                                        orinTitle[arr[i].to] = arr[i].from;
                                    }
                                }
                            }
                        };
                        convert(data.query.normalized);
                        convert(data.query.redirects);

                        // しめぎあきら翻譯ほんやく情況じょうきょう
                        var pages = data.query.pages;
                        for (var pageid in pages) {
                            var page = pages[pageid];
                            var title = page.title;
                            if (orinTitle[title]) {
                                title = orinTitle[title];
                            }

                            if (page.pageid) {
                                checkTable[title] = true;
                            }
                        }
                    }
                    if (typeof success === 'function') {
                        success();
                    }
                },
                error: function (xhr) {
                    if (typeof failure === 'function') {
                        failure(UI.NETWORKERROR);
                    }
                }
            });
        }
    };



    /*
     * たい條目じょうもく內容進行しんこう處理しょり
     */
    var article = {
        title: '',
        content: '',
        interlinks: [],
        _segments: [],
        scanInterLinks: function() {
            // TODO じゅううつしあらためなり逐字ちくじ分析ぶんせきてき版本はんぽん
            var i;

            // はた文章ぶんしょう內容按照 \n 連結れんけつ分解ぶんかいなり若干じゃっかんかたまり分段ぶんだん),なみ記錄きろくかくまたがげん連結れんけつ於哪かたまりなか
            // ざい連結れんけつおさむあらため完成かんせいこれさい按照維基百科格式將其轉換為維基代碼,なみしょう所有しょゆうぶんかたまり合併がっぺいなりいちくし
            this._segments = [];
            this._linkpos = [];
            this.interlinks = [];

            var segments = this._segments;
            var linkpos = this._linkpos;
            var interlinks = this.interlinks;

            // はた文字もじ按 \n 分割ぶんかつ
            var splitLines = function (str) {
                var seq = str.split('\n');

                for (i=0; i<seq.length-1; i++) {
                    segments.push(seq[i]);
                    segments.push('\n');
                }
                segments.push(seq[seq.length-1]);
            };

            var text = this.content;

            // ゆるがせりゃくいち些模ばん
            // よし於只ゆるがせりゃく一個模板所以暫時不用for
            //var ignorearea = [];
            var ignorearea = {from: -1000, to: -1000};
            var match;
            var re;
            //for (i=0; i<IGNOREAREA.length; i++) {
            //    var re = IGNOREAREA[i];
                re = IGNOREAREA[0];
                re.lastIndex = 0;

                while ((match = re.exec(text)) !== null) {
                    //ignorearea.push({from: re.lastIndex, to: re.lastIndex + match[0].length});
                    ignorearea = {from: re.lastIndex - match[0].length, to: re.lastIndex};
                }
            //}

            // 正式せいしき開始かいし分析ぶんせき
            re = /\[\[:([^\[\]]*?)\]\]/g;
            var extract = /(.*?):(.*)/;
            var lastPos = 0;
            while ((match = re.exec(text)) !== null) {
                // けん查是いやようゆるがせりゃく
                //for (i=0; i<ignorearea.length; i++) {
                    //if (re.lastIndex >= ignorearea[i].from && re.lastIndex <= ignorearea[i].to) {
                    if (re.lastIndex >= ignorearea.from && re.lastIndex <= ignorearea.to) {
                        continue;
                    }
                //}

                // はたoutertext以\n劃塊
                splitLines(text.substring(lastPos, re.lastIndex-match[0].length));

                // はたまたがげん連結れんけつにゅう分段ぶんだんなかよしため合併がっぺいかいじゅうしん生成せいせい文字もじ所以ゆえん它只おこり佔位作用さよう
                segments.push(match[0]);
                lastPos = re.lastIndex;

                // ぶん析跨げん連結れんけつちゅうてき元素げんそかたりごと條目じょうもくめい顯示けんじ文字もじ
                // ゆるがせりゃく存在そんざいてきげんだい碼並糾正錯誤さくごてきげんだい
                var match2 = extract.exec(match[1]);
                var lang = null;
                if (match2 !== null && match2[1]) {
                    lang = match2[1].toLowerCase();
                    if (BADLANGS[lang]) {
                        lang = BADLANGS[lang];
                    }
                    if (!LANGUAGES[lang]) {
                        lang = null;
                    }
                }

                // 如果確實かくじつまたがげん連結れんけつそく加入かにゅういた連結れんけつれつひょうちゅう
                if (lang !== null) {
                    var link = {
                        type: 'link',
                        lang: lang,
                        original: match[0],
                        index: this._segments.length - 1    // 記錄きろく連結れんけつざい分段ぶんだんちゅうてき位置いち便びん合併がっぺい
                    };
                    var sepPos = match2[2].indexOf('|');

                    if (sepPos === -1) {
                        link.target = match2[2];
                        link.text = '';
                    } else {
                        link.target = match2[2].substring(0, sepPos);
                        link.text = match2[2].substring(sepPos+1);
                    }

                    // 「_」かわなる空白くうはく
                    link.target = link.target.replace(/_/g, ' ');

                    interlinks.push(link);
                }
            }

            // 處理しょり結尾けつびてき文字もじ
            splitLines(text.substring(lastPos));

            // 找到かく連結れんけつてき上下じょうげぶん
            for (i=0; i<interlinks.length; i++) {
                var ilink = interlinks[i];

                // うえぶん不能ふのう碰到じょうlink
                var pos1 = 0;
                if (i>0) {
                    pos1 = interlinks[i-1].context.to + 1;
                }

                var p = interlinks[i].index;
                while (p >= 0 && segments[p] !== '\n') {
                    p--;
                }
                p++;

                var from = pos1>p ? pos1 : p;

                // しもぶん不能ふのう碰到link
                pos1 = segments.length;
                if (i < interlinks.length-1) {
                    pos1 = interlinks[i+1].index - 1;
                }

                p = interlinks[i].index;
                while (p < segments.length && segments[p] !== '\n') {
                    p++;
                }
                p--;

                var to = pos1<p ? pos1 : p;

                ilink.context = {from: from, to: to};
            }
        },
        getContext: function (linkid) {
            // 取上とりあげぶん
            var pos = article.interlinks[linkid].context;
            return article._segments.slice(pos.from, pos.to+1).join('');
        },
        setContext: function (linkid, text) {
            // 設置せっち上下じょうげぶんため防止ぼうし混亂こんらん設置せっち改變かいへん分段ぶんだん個數こすうはたわたる及到てき分段ぶんだん合併がっぺいいたlink身上しんじょうしかこうようそらくし代替だいたい其他分段ぶんだん
            var link = article.interlinks[linkid];
            var pos = link.context;
            link.type = 'plain';
            link.text = text;
            article._segments.fill('', pos.from, pos.to+1);
        },


        toString: function () {
            // 合併がっぺい文字もじ
            var segments = this._segments;
            var links = this.interlinks;

            for (var i=0; i<links.length; i++) {
                var r;
                var link = links[i];

                switch (link.type) {
                    case 'link':
                        r = ['[['];
                        if (link.lang && link.lang.length > 0) {
                            r.push(':', link.lang, ':');
                        }
                        r.push(link.target);
                        if (link.text && link.text.length > 0) {
                            if (link.target && link.target.length > 0) {
                                r.push('|');
                            }
                            r.push(link.text);
                        }
                        r.push(']]');
                        break;
                    case 'tsl':
                        r = ['{{tsl|', link.lang, '|', link.source, '|', link.target];
                        if (link.text && link.text.length > 0) {
                            r.push('|', link.text);
                        }
                        r.push('}}');
                        break;
                    case 'ilh':
                        r = ['{{link-', link.lang, '|', link.target, '|', link.source];
                        if (link.text && link.text.length > 0) {
                            r.push('|', link.text);
                        }
                        r.push('}}');
                        break;
                    case 'plain':
                        r = [link.text];
                        break;
                }

                segments[link.index] = r.join('');
            }

            return segments.join('');
        },
        update: function () {
            this.content = this.toString();
        },


        translateTitle: function (callback) {
            var transTable = {};
            var counter = 0;
            var queue = {};
            var queue2 = [];
            var i;
            var links = article.interlinks;

            // 根據こんきょげん整理せいり隊列たいれつ
            for (i = 0; i<links.length; i++) {
                var link = links[i];
                if (!queue[link.lang]) {
                    queue[link.lang] = [];
                }
                queue[link.lang].push(link.target);
            }
            // 以50標題ひょうだいためいちくみ進行しんこう分割ぶんかつ(APIげんせい
            // 計算けいさん需要じゅよう執行しっこうてき次數じすう次數じすうため0これ整理せいり結果けっかなみ執行しっこうcallback
            for (var lang in queue) {
                var len = queue[lang].length;
                var l2 = parseInt((len+50)/50);
                counter += l2;

                for (var j = 0; j<l2; j++) {
                    queue2.push({
                        lang: lang,
                        titles: queue[lang].slice(50*j, 50*(j+1)).join('|')
                    });
                }
            }

            var stop = false;
            // 整理せいり翻譯ほんやく結果けっか
            var tide = function () {
                for (i=0; i<links.length; i++) {
                    var link = links[i];
                    var key = link.lang + ':' + link.target;
                    if (transTable[key] === null) {
                        link.missing = true;
                    } else if (transTable[key]) {
                        link.translation = transTable[key];
                    }
                }
            };

            // よし於JSONPかい觸發しょくはつ請求せいきゅう失敗しっぱい事件じけんいん此認ためちょう就是
            var errorTimer = [];
            // 正確せいかくいたいちくみしんじいき。如果しょ有信ありのぶいきいた說明せつめい結束けっそく
            var proc = function () {
                if (stop) {
                    return;
                }
                counter--;
                clearTimeout(errorTimer.shift());
                if (counter <= 0) {
                    stop = true;
                    tide();

                    if (typeof callback === 'function') {
                        callback();
                    }
                }
            };
            // 發生はっせい錯誤さくご直接ちょくせつ結束けっそく翻譯ほんやく
            var error = function () {
                if (stop) {
                    return;
                }
                stop = true;
                tide();
                if (typeof callback === 'function') {
                    callback();
                }
            };

            // 開始かいし翻譯ほんやく標題ひょうだい
            if (queue2.length > 0) {
                for (i = 0; i<queue2.length; i++) {
                    if (stop) {
                        break;
                    }
                    errorTimer.push(setTimeout(error, 2000));
                    wiki.translateTitle(queue2[i].titles, queue2[i].lang, 'zh', transTable, proc);
                }
            } else {
                proc();
            }
        },

        titleCheckTable: {},

        checkTitle: function (callback) {
            // けん查中ぶん維基百科是否有同標題而主題不同的條目
            article.titleCheckTable = {};
            var counter = 0;
            var queue = {};
            var queue2 = [];
            var i;
            var links = article.interlinks;

            // 整理せいり所有しょゆう標題ひょうだい
            for (i = 0; i<links.length; i++) {
                var link = links[i];
                queue[link.target] = true;
                queue[link.text] = true;
            }
            queue[''] = undefined;

            for (var title in queue) {
                queue2.push(title);
            }

            // 以50ためいちくみ進行しんこう查詢
            queue = [];
            counter = parseInt((queue2.length+50)/50);

            for (i=0; i<counter; i++) {
                queue.push(queue2.slice(50*i, 50*(i+1)).join('|'));
            }

            var stop = false;
            var proc = function () {
                if (stop) {
                    return;
                }
                counter--;
                if (counter <= 0) {
                    if (typeof callback === 'function') {
                        callback();
                    }
                }
            };
            var error = function () {
                if (stop) {
                    return;
                }
                stop = true;
                if (typeof callback === 'function') {
                    callback();
                }
            };

            if (queue.length > 0) {
                for (i = 0; i<queue.length; i++) {
                    if (stop) {
                        break;
                    }
                    wiki.checkTitle(queue[i], article.titleCheckTable, proc, error);
                }
            } else {
                if (typeof callback === 'function') {
                    callback();
                }
            }
        },



        titlelinks: [],
        titleLinksCount: 0,

        scanTitleLinks: function () {
            // 目前もくぜんかい自動じどうきよし標題ひょうだいじょうてき連結れんけつ
            // TODO ゆずるよう手動しゅどうきよし
            article.titlelinks = [];
            article.titleLinksCount = 0;

            article.content = article.content.replace(/\n *={2,5} *.*? *={2,5} */g, function (str) {
                var wrongtitle = false;
                var newtitle = str.replace(/\[\[.*?\]\]/g, function (link) {
                    if (link.toLowerCase().indexOf('file:') === 0 || link.toLowerCase().indexOf('image:') === 0 || link.indexOf('ぶんけん:') === 0 || link.indexOf('檔案:') === 0) {
                        return link;
                    }

                    wrongtitle = true;
                    article.titleLinksCount++;
                    return link.replace(/\[\[(.*?)\]\]/, '$1').replace(/:.*?:(.*)/, '$1').replace(/.*?\|(.*)/, '$1');
                });
                if (wrongtitle) {
                    article.titlelinks.push({oldtitle: str, newtitle: newtitle});
                }
                return newtitle;
            });

            return article.titleLinksCount > 0;
        },

        removeTitleLinks: function () {
            // TODO ゆずるよう手動しゅどうきよし
            //article.titlelinks = 0;
            //article.content = article.content.replace(/\n *={2,5} *.*? *={2,5} */g, function (str) {
            //    return str.replace(/\[\[.*?\]\]/g, function (link) {
            //        article.titlelinks++;
            //        return link.replace(/\[\[(.*?)\]\]/, '$1').replace(/:.*?:(.*)/, '$1').replace(/.*\|(.*)/, '$1');
            //    });
            //});
        }
    };



    /*
     * UI
     */
    var jobid = 0;
    var curjobid = 0;
    var dialog = {
        // 構建界面かいめん
        createRadio: function (name, value, checked) {
            var $e = $('<input>')
                .attr('id', name + '_' + value)
                .attr('name', name)
                .attr('value', value)
                .attr('type', 'radio');
            if (checked) {
                $e.attr('checked', 'checked');
            }
            return $e;
        },
        createTextBox: function (name, value, placeholder, size) {
            return $('<input>')
                .attr('id', name)
                .attr('name', name)
                .attr('value', value)
                .attr('size', size ? size : '15')
                .attr('placeholder', placeholder ? placeholder : '');
        },
        createLink: function (text, href) {
            return $('<a>')
                .attr('href', href)
                .attr('target', '_blank')
                .html(text);
        },
        createRow: function (link, index) {
            var $row = $('<tr>');
            var $tmp;
            var translation = '';
            var name = 'ilf_' + index;
            $row.append('<td>'+(index+1)+'</td>');

            $tmp = $('<td>').append(
                dialog.createLink('<span class="ilh-tool">' + link.original + '</span>', 'https://' + LANGUAGES[link.lang] + '.wikipedia.org/wiki/' + link.target)
            );
            if (link.missing) {
                // そとぶん維基百科ひゃっか此條
                $tmp.append('<br><br><small style="color:red;">' + UI.MISSING + '</small>');
            }
            if (link.translation) {
                // ゆうちゅうぶん對應たいおう條目じょうもく直接ちょくせつきゅうちゅうぶん標題ひょうだい
                translation = link.translation;
                $tmp.append('<br><br>', $('<small style="color:green;">').append(
                                UI.CHINESEARTICLE,
                                dialog.createLink(link.translation, 'https://zh.wikipedia.org/wiki/' + link.translation)
                            ));
            } else {
                if (article.titleCheckTable[link.target]) {
                    // ちゅうぶんゆう同名どうめい條目じょうもくただし主題しゅだい不同ふどう需要じゅよう注意ちゅうい
                    $tmp.append('<br><br>', $('<small style="color:red;">').append(
                                    UI.CHINESETEST2,
                                    dialog.createLink(link.target, 'https://zh.wikipedia.org/wiki/' + link.target)
                                ));
                } else {
                    // ちゅうぶんぼつゆう對應たいおう條目じょうもく同名どうめい條目じょうもく快速かいそく檢索けんさくいやゆう相關そうかん話題わだいてき條目じょうもく
                    $tmp.append('<br><br>', $('<small>').append(
                                    UI.CHINESETEST,
                                    dialog.createLink(link.target, 'https://zh.wikipedia.org/w/index.php?search=' + link.target)
                                ));
                }

                // たい於[[:en:A|B]],上面うわつらいちだんifA,這いちだんB
                if (link.text && link.text !== link.target) {
                    if (article.titleCheckTable[link.text]) {
                        $tmp.append('<br>', $('<small style="color:red;">').append(
                                        UI.CHINESETEST2,
                                        dialog.createLink(link.text, 'https://zh.wikipedia.org/wiki/' + link.text)
                                    ));
                    } else {
                        $tmp.append('<br>', $('<small>').append(
                                        UI.CHINESETEST,
                                        dialog.createLink(link.text, 'https://zh.wikipedia.org/w/index.php?search=' + link.text)
                                    ));
                    }
                }
            }
            // 快速かいそく檢索けんさく定義ていぎ標題ひょうだい
            $tmp.append('<br><small>' + UI.CHINESETEST + '</small><input type="search" placeholder="' + UI.QUICKSEARCH + '" class="fixlinkstyle-quicksearch">');

            // 快速かいそく調ちょうようGoogle進行しんこうさがせひろ
            $tmp.append('<br><br>',
                        $('<small>').append(dialog.createLink(UI.GOOGLEIT, 'https://www.google.com/search?q=' + encodeURIComponent(link.target + ' ' + UI.CHINESE))),
                        '<br>',
                        $('<small>').append(dialog.createLink(UI.GOOGLEIT2, 'https://www.google.com/search?as_sitesearch=wikipedia.org&q=' + encodeURIComponent(link.target))),
                        '<br>',
                        $('<small>').append(dialog.createLink(UI.GOOGLETRANSLATE, 'https://translate.google.com/#auto/' + UI.GOOGLELANG + '/' + encodeURIComponent(link.target)))
                       );
            $row.append($tmp);

            $tmp = $('<td>').append(
                dialog.createRadio(name, '0'),
                    '<label for="' + name + '_0">' + UI.DONTMODIFY + '</label>',
                    '<br>',
                dialog.createRadio(name, '1'),
                    '<label for="' + name + '_1">' + UI.REMOVELINK + '</label>',
                    '<br>',
                dialog.createRadio(name, '2'),
                    '[[',
                    dialog.createTextBox(name+'_21', translation, UI.ARTICLENAME),
                    '|',
                    dialog.createTextBox(name+'_22', link.text === translation ? '' : link.text, UI.DISPLAYTEXT),
                    ']]',
                    '<br>',
                dialog.createRadio(name, '3'),
                    '{{tsl|',
                    dialog.createTextBox(name+'_31', link.lang, UI.LANGUAGE, '5'),
                    '|',
                    dialog.createTextBox(name+'_32', link.target, UI.ORIGINALNAME),
                    '|',
                    dialog.createTextBox(name+'_33', translation.length>0 ? translation : link.text, UI.ARTICLENAME),
                    '|',
                    dialog.createTextBox(name+'_34', (translation.length===0 || link.text===translation) ? '' : link.text, UI.DISPLAYTEXT),
                    '}}',
                    '<br>',
                dialog.createRadio(name, '4'),
                    '{{link-',
                    dialog.createTextBox(name+'_41', link.lang, UI.LANGUAGE, '5'),
                    '|',
                    dialog.createTextBox(name+'_42', translation.length>0 ? translation : link.text, UI.ARTICLENAME),
                    '|',
                    dialog.createTextBox(name+'_43', link.target, UI.ORIGINALNAME),
                    '|',
                    dialog.createTextBox(name+'_44', (translation.length===0 || link.text===translation) ? '' : link.text, UI.DISPLAYTEXT),
                    '}}',
                    '<br>',
                dialog.createRadio(name, '5'),
                    UI.REPLACETO + ': ',
                    dialog.createTextBox(name+'_51', '{{lang|' + link.lang + '|' + (link.text ? link.text : link.target) + '}}', UI.WIKICODE, '30'),
                    '<br>',
                dialog.createRadio(name, '6', true),
                    '<label for="' + name + '_6">' + UI.REPLACECONTEXT + '</label>'
            );

            $row.append($tmp);

            return $row;
        },
        createRow2: function (link, index) {
            var name = 'ilf_' + index;
            var $row = $('<tr>')
                            .attr('id', name + '_6_row');
            $row.append('<td>');

            var $tmp = $('<td>').attr('colspan', '2');
            var text = article.getContext(index);
            $tmp.append($('<textarea>')
                            .attr('id', name + '_6_t')
                            .attr('rows', '3')
                            .attr('data-link-id', index)
                            .attr('data-orintext', text)
                            .val(text)
                       );

            // けん查能快速かいそくかえかわ
            var $quickReplaces = $('<div>').append($('<a href="#" class="fixlinkstyle-quickreplace-undo">' + UI.UNDO + '</a><br>')
                    .attr('data-link-id', index)
                );
            for (var i=0; i<QUICKREPLACES.length; i++) {
                var $quickReplace = $('<div id="fixlinkstyle-quickreplace-'+index+'-'+i+'">');
                var schema = QUICKREPLACES[i];
                $quickReplace.append('<br>',
                    UI.QUICKREPLACE,
                    '<span id="fixlinkstyle-quickreplace-'+index+'-'+i+'-text"></span>',
                    '<br><br>',
                    UI.REPLACETO, ':'
                );

                for (var j=0; j<schema.schemas.length; j++) {
                    $quickReplace.append($('<a href="#" class="fixlinkstyle-quickreplace-link">')
                        .text(schema.schemas[j].name)
                        .attr('data-quickreplace-id', i)
                        .attr('data-schema-id', j)
                        .attr('data-link-id', index)
                    );
                    if (j<schema.schemas.length-1) {
                        $quickReplace.append('、');
                    }
                }

                $quickReplace.append('<br>');
                $quickReplaces.append($quickReplace);

                schema.search.lastIndex = 0;
                var match = schema.search.exec(text);
                if (match === null) {
                    $quickReplace.hide();
                }
            }
            $tmp.append($quickReplaces);

            $row.append($tmp);

            return $row;
        },

        // 指定していもうかそんとう操作そうさてき執行しっこう方式ほうしき
        handlers: {
            api: {
                name: 'api',
                load: function (complete, error) {
                    wiki.loadPage(mw.config.get('wgPageName'), complete, error);
                },
                save: function (summary, complete, error) {
                    wiki.savePage(article.title, article.content, summary, complete, error);
                },
                warn: function () {
                    if (!localStorage.fixlinkstyle_warned) {
                        if (confirm(UI.WARNING)) {
                            localStorage.fixlinkstyle_warned = true;
                            return true;
                        } else {
                            return false;
                        }
                    } else {
                        return true;
                    }
                },
                diff: function (summary) {
                    var frm = $('<form method="post" style="display:none;">')
                        .attr('action', mw.util.getUrl(mw.config.get('wgPageName'), {action: 'submit'}))
                        .attr('enctype', 'multipart/form-data')
                        .append($('<textarea name="wpTextbox1">').val(article.content),
                                $('<input name="wpSummary">').val(summary),
                                '<input name="wpMinoredit" type="checkbox" value="1" checked="checked">',
                                '<input name="format" value="text/x-wiki">',
                                '<input name="wpAutoSummary" value="hashhashhashhash">',    // 防止ぼうしはまうつし摘要てきようてき提示ていじ
                                '<input name="model" value="wikitext">',
                                '<input name="wpEditToken" value="' + mw.user.tokens.get('csrfToken') + '">',
                                '<input name="wpUltimateParam" value="1">',
                                '<input name="wpDiff" value="aa">',
                                '<input name="mode" value="text">');
                    $('body').append(frm);
                    frm.submit();
                },
                end: function () {
                    setTimeout(function () {
                        history.go(0);
                    }, 500);
                }
            },
            text: {
                name: 'text',
                load: function (complete) {
                    if (typeof complete === 'function') {
                        complete($('#wpTextbox1').val());
                    }
                },
                save: function (summary, complete) {
                    $('#wpTextbox1').val(article.content);
                    $('#wpSummary').val(summary);
                    $('#wpMinoredit').attr('checked', 'checked');

                    if (typeof complete === 'function') {
                        complete();
                    }
                },
                diff: function (summary, complete) {
                    $('#wpTextbox1').val(article.content);
                    $('#wpSummary').val(summary);
                    $('#wpMinoredit').attr('checked', 'checked');

                    $('#wpDiff').click();

                    if (typeof complete === 'function') {
                        complete();
                    }
                },
                end: function () {
                    setTimeout(function () {
                        $('#fixlinkstyle_dialog').dialog('close');
                        $('#wpTextbox1').focus();
                    }, 500);
                }
            }
        },
        handler: {},

        // 閃爍跨げん連結れんけつ
        // TODO あらためためCSS
        links: {
            list: null,
            border: false,
            blink: function () {
                var i;
                var links = dialog.links.list;
                dialog.links.border = !dialog.links.border;
                if (dialog.links.border) {
                    for (i=0; i<links.length; i++) {
                        links[i].style.border = '1px solid red';
                    }
                } else {
                    for (i=0; i<links.length; i++) {
                        links[i].style.border = 'none';
                    }
                }
            },
            get: function () {
                dialog.links.list = $('.extiw', '#mw-content-text').filter(function () {
                    return this.parentNode.className.indexOf('ilh-link') === -1 && this.href && this.href.indexOf('.wikipedia.org') > -1;
                });
            },
            highlight: function (value) {
                if (value && dialog.links.timerId === null) {
                    dialog.links.timerId = setInterval(dialog.links.blink, 1000);
                } else if (!value) {
                    dialog.links.border = true;
                    dialog.links.blink();
                    clearInterval(dialog.links.timerId);
                    dialog.links.timerId = null;
                }
            },
            timerId: null
        },

        // 對話たいわかまち操作そうさ
        init: function () {
            if (document.getElementById('fixlinkstyle_dialog') === null) {
                $('body').append('<div id="fixlinkstyle_dialog" style="display:none;" title="' + UI.TITLE + '"></div>');
            }

            dialog.links.get();
            dialog.links.highlight(true);
            $('#fixlinkstyle_dialog').html(UI.LOADING);

            jobid++;
            curjobid = jobid;

            $('#fixlinkstyle_dialog').dialog({
                modal: false,
                close: function() {
                    dialog.links.highlight(false);
                    jobid++;
                },
                draggable: true,
                width: 700,
                height: 500,
                buttons: []
            });

            article.title = mw.config.get('wgPageName');
            dialog.handler.load(function (content) {
                if (curjobid !== jobid) {
                    return;
                }

                article.content = content;

                article.scanTitleLinks();
                article.scanInterLinks();
                $('#fixlinkstyle_dialog').append('<br>', UI.FOUND.replace('$1', article.interlinks.length), '<br>', UI.TRANSLATING);

                article.translateTitle(function () {
                    if (curjobid !== jobid) {
                        return;
                    }

                    $('#fixlinkstyle_dialog').append('<br>', UI.CHECKINGTITLE);
                    article.checkTitle(function () {
                        if (curjobid !== jobid) {
                            return;
                        }

                        if (article.titleLinksCount > 0) {
                            dialog.puttitles();
                        } else {
                            dialog.putlinks();
                        }
                    });
                });
            }, function (e) {
                if (curjobid !== jobid) {
                    return;
                }
                $('#fixlinkstyle_dialog').append('<br><span style="color:red;">' + e + '</span>');
            });
        },
        puttitles: function () {
            $('#fixlinkstyle_dialog').html(UI.TITLELINKSCLEAN.replace('$1', article.titleLinksCount));

            var $table = $('<table class="wikitable">').append('<tr><th>#</th><th>'+UI.OLDTITLE+'</th><th>'+UI.NEWTITLE+'</th></tr>');

            for (var i=0; i<article.titlelinks.length; i++) {
                $table.append($('<tr>').append(
                    '<td>' + (i+1) + '</td>',
                    $('<td>').text(article.titlelinks[i].oldtitle),
                    $('<td>').text(article.titlelinks[i].newtitle)
                ));
            }

            $('#fixlinkstyle_dialog').append(
                $table,
                UI.TITLELINKSCLEAN2,
                '<br>',
                UI.BUGREPORT
            );

            $('#fixlinkstyle_dialog').dialog('option', 'buttons', [
                {
                    text: UI.NEXT,
                    click: function() {
                        dialog.putlinks();
                    },
                },
            ]);
        },
        putlinks: function () {
            var $table = $('<table class="wikitable">').append('<tr><th>#</th><th>'+UI.LINK+'</th><th>'+UI.ACTION+'</th></tr>');

            for (var i=0; i<article.interlinks.length; i++) {
                $table.append(dialog.createRow(article.interlinks[i], i));
                $table.append(dialog.createRow2(article.interlinks[i], i));
            }

            $('#fixlinkstyle_dialog').html(UI.WELCOME);

            if (article.interlinks.length === 0) {
                $('#fixlinkstyle_dialog').append('<br><br>', UI.NONE);
            } else {
                $('#fixlinkstyle_dialog').append($('<form id="ilf_frm">').append($table));
            }

            $('#fixlinkstyle_dialog').append(
                '<br>',
                UI.BUGREPORT
            );

            // 快速かいそく檢索けんさく
            $('.fixlinkstyle-quicksearch').keyup(function (e) {
                if (e.which === 13) {
                    var frm = $('<form method="get" target="_blank" style="display:none;">')
                        .append($('<input type="text" name="search">').val(this.value))
                        .attr('action', 'https://zh.wikipedia.org/w/index.php');
                    $('body').append(frm);
                    frm.submit();
                }
            });

            // てんげき對話たいわかまちじょうてきぶんほんかまち自動じどうせんちゅう對應たいおうてきたんせん按鈕
            $('input:text', '#ilf_frm').click(function () {
                var name = this.name;
                var i = name.lastIndexOf('_');
                var radioname = name.slice(0, i);
                var key = name.charAt(i+1);
                document.forms.ilf_frm[radioname].value = key;
                $('#' + radioname + '_6_row').hide();
            });

            // 顯示けんじ/かくれぞう檢視けんし上下じょうげぶんてきぶんほんかまち
            $('input:radio', '#ilf_frm').click(function () {
                var name = this.name;
                var value = this.value;
                if (value === '6') {
                    $('#' + name + '_6_row').show();
                    $('#' + name + '_6_t').change().focus();
                } else {
                    $('#' + name + '_6_row').hide();
                }
            });

            // けん查能快速かいそくかえかわ
            var checkQuickReplace = function () {
                var $e = $(this);
                var text = $e.val();
                var index = $e.attr('data-link-id');

                for (var i=0; i<QUICKREPLACES.length; i++) {
                    var schema = QUICKREPLACES[i];
                    schema.search.lastIndex = 0;
                    var match = schema.search.exec(text);

                    if (match) {
                        $('#fixlinkstyle-quickreplace-'+index+'-'+i+'-text').text(match[0]);
                        $('#fixlinkstyle-quickreplace-'+index+'-'+i).slideDown();
                    } else {
                        $('#fixlinkstyle-quickreplace-'+index+'-'+i).slideUp();
                    }
                }
            };
            $('textarea', '#ilf_frm').change(checkQuickReplace).keyup(checkQuickReplace).change();

            // 執行しっこう快速かいそくかえかわ
            $('.fixlinkstyle-quickreplace-link').click(function (e) {
                e.preventDefault();
                var $e = $(this);
                var index = $e.attr('data-link-id');
                var qrid = parseInt($e.attr('data-quickreplace-id'));
                var sid = parseInt($e.attr('data-schema-id'));
                var text = $('#ilf_' + index + '_6_t').val();

                $('#ilf_' + index + '_6_t').val(QUICKREPLACES[qrid].schemas[sid].replace(text)).change();
            });

            $('.fixlinkstyle-quickreplace-undo').click(function (e) {
                e.preventDefault();
                var $e = $(this);
                var index = $e.attr('data-link-id');
                var text = $('#ilf_' + index + '_6_t').attr('data-orintext');

                $('#ilf_' + index + '_6_t').val(text).change();
            });

            // 檢視けんし差異さいひさげ
            $('#fixlinkstyle_dialog').dialog('option', 'buttons', [
                {
                    text: UI.SHOWDIFF,
                    click: function() {
                        dialog.check(dialog.diff);
                    },
                },
                {
                    text: UI.SUBMIT,
                    click: function() {
                        if (!dialog.handler.warn || (dialog.handler.warn && dialog.handler.warn())) {
                            dialog.check(dialog.submit);
                        }
                    },
                },
            ]);
        },
        check: function (complete) {
            var frm = document.forms.ilf_frm;
            var links = article.interlinks;
            var oldlinkscount = links.length;

            $('#fixlinkstyle_dialog').dialog('option', 'buttons', []);

            for (var i=0; i<links.length; i++) {
                var link = links[i];
                switch (frm['ilf_' + i].value) {
                    case '0':
                        break;
                    case '1':
                        link.type = 'plain';
                        if ((!link.text) || (link.text === '')) {
                            link.text = link.target;
                        }
                        break;
                    case '2':
                        link.type = 'link';
                        link.lang = '';
                        link.target = frm['ilf_' + i + '_21'].value;
                        link.text = frm['ilf_' + i + '_22'].value;
                        break;
                    case '3':
                        link.type = 'tsl';
                        link.lang = frm['ilf_' + i + '_31'].value;
                        link.source = frm['ilf_' + i + '_32'].value;
                        link.target = frm['ilf_' + i + '_33'].value;
                        link.text = frm['ilf_' + i + '_34'].value;
                        break;
                    case '4':
                        link.type = 'ilh';
                        link.lang = frm['ilf_' + i + '_41'].value;
                        link.target = frm['ilf_' + i + '_42'].value;
                        link.source = frm['ilf_' + i + '_43'].value;
                        link.text = frm['ilf_' + i + '_44'].value;
                        break;
                    case '5':
                        link.type = 'plain';
                        link.text = frm['ilf_' + i + '_51'].value;
                        break;
                    case '6':
                        article.setContext(i, $('#ilf_' + i + '_6_t').val());
                        break;
                }
            }

            article.update();

            // けん查是仍有またがげん連結れんけつ,如果ぼつゆう,摘掉link styleばん
            article.scanInterLinks();

            var linkstyleTemplate = /{{\s*link style.*?}}\s*/i;
            var newlinkscount = article.interlinks.length;
            var summary = UI.SUMMARY2.replace('$1', oldlinkscount-newlinkscount);
            if (newlinkscount === 0 && linkstyleTemplate.test(article.content)) {
                article.content = article.content.replace(linkstyleTemplate, '');
                // かわなり「摘掉ばん
                summary = UI.SUMMARY.replace('$1', oldlinkscount-newlinkscount);
            }

            if (article.titleLinksCount > 0) {
                summary = summary + UI.AND + UI.TITLELINKS.replace('$1', article.titleLinksCount);
            }

            if (typeof complete === 'function') {
                complete(summary);
            }
        },
        submit: function (summary) {
            $('#fixlinkstyle_dialog').html(UI.SAVING);
            dialog.handler.save(summary, function () {
                $('#fixlinkstyle_dialog').append('<br><span style="color:green;">'+UI.SUCCESS+'</span>');
                dialog.handler.end();
            }, function (e) {
                $('#fixlinkstyle_dialog').append('<br><span style="color:red;">'+e+'</span>');
            });
        },
        diff: function (summary) {
            $('#fixlinkstyle_dialog').html(UI.SAVING);
            dialog.handler.diff(summary, function () {
                $('#fixlinkstyle_dialog').dialog('close');
            });
        }
    };



    /*
     * ざい維基百科中添加按鈕和菜單
     */
    var wgaction = mw.config.get('wgAction');

    if (!window.fixlinkstyle) {
        window.fixlinkstyle = {};
    }

    var addfixbutton = function () {
        $('#p-fixlinkstyle').remove();
        $(mw.util.addPortletLink('p-cactions', '#', UI.CLEARBUTTON2, 'p-fixlinkstyle')).click(function (e) {
            e.preventDefault();
            dialog.init();
        });

        var $ambox = $('.mbox-text-span', '.ambox-link-style');
        switch (wgaction) {
            case 'view':
                $('#fixlinkstyle').remove();

                dialog.handler = dialog.handlers.api;

                if ($ambox.length > 0) {
                    $ambox.append('<center><a id="fixlinkstyle" href="#"><span class="mw-ui-button mw-ui-progressive">' + UI.CLEARBUTTON + '</span></a></center>');
                }

                $('#fixlinkstyle').click(function () {
                    dialog.init();
                });

                break;

            case 'submit':
            case 'edit':
                $('#fixlinkstyle').remove();
                $('#fixlinkstyle_button').remove();

                dialog.handler = dialog.handlers.text;

                $ambox.append('<center><a id="fixlinkstyle" href="#"><span class="mw-ui-button mw-ui-progressive">' + UI.CLEARBUTTON + '</span></a></center>');
                $('#fixlinkstyle').click(function (e) {
                    e.preventDefault();
                    dialog.init();
                });

                if (!window.fixlinkstyle.hideFromBottom) {
                    $('#wpDiff').after('<input id="fixlinkstyle_button" value="' + UI.CLEARBUTTON2 + '" type="button">');
                    $('#fixlinkstyle_button').click(function () {
                        dialog.init();
                    });
                }
            break;
        }
    };

    if (mw.config.get('wgCanonicalNamespace') === '') {
        switch (wgaction) {
            case 'view':
                dialog.handler = dialog.handlers.api;

                var linklist = $('.extiw', '#mw-content-text').filter(function () {
                    return this.parentNode.className.indexOf('ilh-link') === -1 && this.href && this.href.indexOf('.wikipedia.org') > -1;
                });
                var $ambox = $('.mbox-text-span', '.ambox-link-style');

                if (linklist.length > 0 || $ambox.length > 0) {
                    addfixbutton();
                }
                break;

            case 'submit':
            case 'edit':
                dialog.handler = dialog.handlers.text;

                article.content = $('#wpTextbox1').val();
                article.scanInterLinks();
                if (article.interlinks.length > 0 || article.content.match(/{{\s*link style.*?}}\s*/i)) {
                    addfixbutton();
                }
                break;
        }
    }

    window.fixlinkstyle.addButton = addfixbutton;
    window.fixlinkstyle.show = function () {
        switch (wgaction) {
            case 'view':
                dialog.handler = dialog.handlers.api;
                break;
            case 'submit':
            case 'edit':
                dialog.handler = dialog.handlers.text;
        }
        dialog.init();
    };
})(jQuery, mw);

// </nowiki>