<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh">
	<id>https://arolstar52-zhtest.hf.space/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-EditorAPIs.js</id>
	<title>MediaWiki:Gadget-EditorAPIs.js - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://arolstar52-zhtest.hf.space/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-EditorAPIs.js"/>
	<link rel="alternate" type="text/html" href="https://arolstar52-zhtest.hf.space/index.php?title=MediaWiki:Gadget-EditorAPIs.js&amp;action=history"/>
	<updated>2026-07-16T03:26:40Z</updated>
	<subtitle>在这个wiki上该页的修订历史</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>https://arolstar52-zhtest.hf.space/index.php?title=MediaWiki:Gadget-EditorAPIs.js&amp;diff=2940229&amp;oldid=prev</id>
		<title>imported&gt;Shizhao：​ep</title>
		<link rel="alternate" type="text/html" href="https://arolstar52-zhtest.hf.space/index.php?title=MediaWiki:Gadget-EditorAPIs.js&amp;diff=2940229&amp;oldid=prev"/>
		<updated>2023-03-14T03:07:33Z</updated>

		<summary type="html">&lt;p&gt;ep&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;/**&lt;br /&gt;
 * 取自 oldid=45922557&lt;br /&gt;
 * hook 維基百科所有編輯器！&lt;br /&gt;
 *&lt;br /&gt;
 * 用法：&lt;br /&gt;
 * mw.hook(&amp;#039;editorapi.ready&amp;#039;).add(function (editor) {&lt;br /&gt;
 *     // 指令...使用editor或window.wikitextEditor&lt;br /&gt;
 * });&lt;br /&gt;
 * mw.loader.load(&amp;#039;https://zh.wikipedia.org/w/index.php?title=User:逆襲的天邪鬼/js/EditorAPIs.js&amp;amp;action=raw&amp;amp;ctype=text/javascript&amp;#039;);&lt;br /&gt;
 *&lt;br /&gt;
 * 注意事項：&lt;br /&gt;
 * 1. 這是個構件，直接拿去importScript沒有任何意義。&lt;br /&gt;
 * 2. 建議不要直接copy內容。請注意原始碼中的TODO，並且根據實際需要來fork。&lt;br /&gt;
 * 3. 不支援IE&amp;lt;10，不支援Wikiplus，CodeEditor (AceEditor)不支援selection功能。&lt;br /&gt;
 * 4. 不支援VisualEditor的視覺化模式。請注意檢查 wikitextEditor.mode&lt;br /&gt;
 * 5. 透過 wikitextEditor.mode 可以檢查目前的編輯器模式。mode值包括：none（不是編輯器，各介面不可用）、wikitext（經典）、wikEd（wikEd編輯器）、wikitext2017（2017原始碼編輯）、codemirror（CodeMirror编辑器）、view（處於「閱讀」模式，實際上沒有編輯器，需要手動開啟）、visual（可識別但不支援，注意！）。&lt;br /&gt;
 * 6. 注意VisualEditor的問題：&lt;br /&gt;
 *    (1) 因為VisualEditor不會立刻載入，因此使用者使用VE的話 editorapi.ready 會觸發兩遍。&lt;br /&gt;
 *    (2) 在使用者切換視覺化編輯與原始碼2017編輯模式時，VE的ready會被再次觸發，因此editorapi.ready也會跟著觸發。&lt;br /&gt;
 * 7. window.editorapi = { useViewMode: true };    // 開啟view模式&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
$(function () {&lt;br /&gt;
    &amp;#039;use strict&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
    if (window.wikitextEditor) {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    window.wikitextEditor = { mode: &amp;#039;none&amp;#039; };&lt;br /&gt;
&lt;br /&gt;
    if ([&amp;#039;submit&amp;#039;, &amp;#039;edit&amp;#039;].indexOf(mw.config.get(&amp;#039;wgAction&amp;#039;)) !== -1) {&lt;br /&gt;
        // CodeMirror&lt;br /&gt;
        if ($(&amp;#039;#wpTextbox1 + .CodeMirror&amp;#039;).length &amp;gt; 0) {&lt;br /&gt;
            window.wikitextEditor = {&lt;br /&gt;
                get mode() {&lt;br /&gt;
                    return &amp;#039;codemirror&amp;#039;;&lt;br /&gt;
                },&lt;br /&gt;
                get text() {&lt;br /&gt;
                    return $(&amp;#039;#wpTextbox1&amp;#039;).val();&lt;br /&gt;
                },&lt;br /&gt;
                set text(t) {&lt;br /&gt;
                    $(&amp;#039;#wpTextbox1&amp;#039;).val(t);&lt;br /&gt;
                },&lt;br /&gt;
                get summary() {&lt;br /&gt;
                    return $(&amp;#039;#wpSummary&amp;#039;).val();&lt;br /&gt;
                },&lt;br /&gt;
                set summary(text) {&lt;br /&gt;
                    $(&amp;#039;#wpSummary&amp;#039;).val(text);&lt;br /&gt;
                },&lt;br /&gt;
                get minorEdit() {&lt;br /&gt;
                    return $(&amp;#039;#wpMinoredit&amp;#039;).prop(&amp;#039;checked&amp;#039;);&lt;br /&gt;
                },&lt;br /&gt;
                set minorEdit(v) {&lt;br /&gt;
                    $(&amp;#039;#wpMinoredit&amp;#039;).prop(&amp;#039;checked&amp;#039;, v);&lt;br /&gt;
                },&lt;br /&gt;
                submit: function () {&lt;br /&gt;
                    $(&amp;#039;#wpSave&amp;#039;).click();&lt;br /&gt;
                },&lt;br /&gt;
                showPreview: function () {&lt;br /&gt;
                    $(&amp;#039;#wpPreview&amp;#039;).click();&lt;br /&gt;
                },&lt;br /&gt;
                showDiff: function () {&lt;br /&gt;
                    $(&amp;#039;#wpDiff&amp;#039;).click();&lt;br /&gt;
                },&lt;br /&gt;
                get selectionStart() {&lt;br /&gt;
                    return $(&amp;#039;#wpTextbox1&amp;#039;).textSelection(&amp;#039;getCaretPosition&amp;#039;);&lt;br /&gt;
                },&lt;br /&gt;
                set selectionStart(pos) {&lt;br /&gt;
                    var end = $(&amp;#039;#wpTextbox1&amp;#039;).textSelection(&amp;#039;getCaretPosition&amp;#039;, {startAndEnd:true})[1];&lt;br /&gt;
                    $(&amp;#039;#wpTextbox1&amp;#039;).textSelection(&amp;#039;setSelection&amp;#039;, {&lt;br /&gt;
                        start: pos,&lt;br /&gt;
                        end: end&lt;br /&gt;
                    });&lt;br /&gt;
                },&lt;br /&gt;
                get selectionEnd() {&lt;br /&gt;
                    return $(&amp;#039;#wpTextbox1&amp;#039;).textSelection(&amp;#039;getCaretPosition&amp;#039;, {startAndEnd:true})[1];&lt;br /&gt;
                },&lt;br /&gt;
                set selectionEnd(pos) {&lt;br /&gt;
                    var start = $(&amp;#039;#wpTextbox1&amp;#039;).textSelection(&amp;#039;getCaretPosition&amp;#039;);&lt;br /&gt;
                    $(&amp;#039;#wpTextbox1&amp;#039;).textSelection(&amp;#039;setSelection&amp;#039;, {&lt;br /&gt;
                        start: start,&lt;br /&gt;
                        end: pos&lt;br /&gt;
                    });&lt;br /&gt;
                },&lt;br /&gt;
                get selectionText() {&lt;br /&gt;
                    return $(&amp;#039;#wpTextbox1&amp;#039;).textSelection(&amp;#039;getSelection&amp;#039;);&lt;br /&gt;
                },&lt;br /&gt;
                set selectionText(text) {&lt;br /&gt;
                    $(&amp;#039;#wpTextbox1&amp;#039;).textSelection(&amp;#039;encapsulateSelection&amp;#039;, {&lt;br /&gt;
                        replace: true,&lt;br /&gt;
                        peri: text,&lt;br /&gt;
                    });&lt;br /&gt;
                },&lt;br /&gt;
            };&lt;br /&gt;
            mw.hook(&amp;#039;editorapi.ready&amp;#039;).fire(window.wikitextEditor);&lt;br /&gt;
        } else if ($(&amp;#039;.ace_editor&amp;#039;).length &amp;gt; 0) {&lt;br /&gt;
			// CodeEditor or AceEditor&lt;br /&gt;
			mw.hook(&amp;#039;codeEditor.configure&amp;#039;).add(function(editor) {&lt;br /&gt;
				window.wikitextEditor = {&lt;br /&gt;
					get mode() {&lt;br /&gt;
						return &amp;#039;codeeditor&amp;#039;;&lt;br /&gt;
					},&lt;br /&gt;
					get text() {&lt;br /&gt;
						return editor.getValue();&lt;br /&gt;
					},&lt;br /&gt;
					set text(t) {&lt;br /&gt;
						editor.setValue(t)&lt;br /&gt;
					},&lt;br /&gt;
					get summary() {&lt;br /&gt;
						return $(&amp;#039;#wpSummary&amp;#039;).val();&lt;br /&gt;
					},&lt;br /&gt;
					set summary(text) {&lt;br /&gt;
						$(&amp;#039;#wpSummary&amp;#039;).val(text);&lt;br /&gt;
					},&lt;br /&gt;
					get minorEdit() {&lt;br /&gt;
						return $(&amp;#039;#wpMinoredit&amp;#039;).prop(&amp;#039;checked&amp;#039;);&lt;br /&gt;
					},&lt;br /&gt;
					set minorEdit(v) {&lt;br /&gt;
						$(&amp;#039;#wpMinoredit&amp;#039;).prop(&amp;#039;checked&amp;#039;, v);&lt;br /&gt;
					},&lt;br /&gt;
					submit: function () {&lt;br /&gt;
						$(&amp;#039;#wpSave&amp;#039;).click();&lt;br /&gt;
					},&lt;br /&gt;
					showPreview: function () {&lt;br /&gt;
						$(&amp;#039;#wpPreview&amp;#039;).click();&lt;br /&gt;
					},&lt;br /&gt;
					showDiff: function () {&lt;br /&gt;
						$(&amp;#039;#wpDiff&amp;#039;).click();&lt;br /&gt;
					},&lt;br /&gt;
					get selectionStart() {&lt;br /&gt;
						throw new Error(&amp;#039;NotImplementedError&amp;#039;)&lt;br /&gt;
					},&lt;br /&gt;
					set selectionStart(pos) {&lt;br /&gt;
						throw new Error(&amp;#039;NotImplementedError&amp;#039;)&lt;br /&gt;
					},&lt;br /&gt;
					get selectionEnd() {&lt;br /&gt;
						throw new Error(&amp;#039;NotImplementedError&amp;#039;)&lt;br /&gt;
					},&lt;br /&gt;
					set selectionEnd(pos) {&lt;br /&gt;
						throw new Error(&amp;#039;NotImplementedError&amp;#039;)&lt;br /&gt;
					},&lt;br /&gt;
					get selectionText() {&lt;br /&gt;
						return editor.getTextRange();&lt;br /&gt;
					},&lt;br /&gt;
					set selectionText(text) {&lt;br /&gt;
						throw new Error(&amp;#039;NotImplementedError&amp;#039;)&lt;br /&gt;
					},&lt;br /&gt;
				};&lt;br /&gt;
				mw.hook(&amp;#039;editorapi.ready&amp;#039;).fire(window.wikitextEditor);&lt;br /&gt;
			})&lt;br /&gt;
        } else {&lt;br /&gt;
            // 傳統原始碼編輯器&lt;br /&gt;
            var textbox = document.getElementById(&amp;#039;wpTextbox1&amp;#039;);&lt;br /&gt;
            window.wikitextEditor = {&lt;br /&gt;
                get mode() {&lt;br /&gt;
                    if (window.wikEd &amp;amp;&amp;amp; wikEd.useWikEd) {&lt;br /&gt;
                        return &amp;#039;wikEd&amp;#039;;&lt;br /&gt;
                    } else {&lt;br /&gt;
                        return &amp;#039;wikitext&amp;#039;;&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                get text() {&lt;br /&gt;
                    if (window.wikEd &amp;amp;&amp;amp; wikEd.useWikEd) {&lt;br /&gt;
                        wikEd.UpdateTextarea();&lt;br /&gt;
                    }&lt;br /&gt;
                    return $(&amp;#039;#wpTextbox1&amp;#039;).val();&lt;br /&gt;
                },&lt;br /&gt;
                set text(t) {&lt;br /&gt;
                    $(&amp;#039;#wpTextbox1&amp;#039;).val(t);&lt;br /&gt;
                    if (window.wikEd &amp;amp;&amp;amp; wikEd.useWikEd) {&lt;br /&gt;
                        wikEd.UpdateFrame();&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                get summary() {&lt;br /&gt;
                    return $(&amp;#039;#wpSummary&amp;#039;).val();&lt;br /&gt;
                },&lt;br /&gt;
                set summary(text) {&lt;br /&gt;
                    $(&amp;#039;#wpSummary&amp;#039;).val(text);&lt;br /&gt;
                },&lt;br /&gt;
                get minorEdit() {&lt;br /&gt;
                    return $(&amp;#039;#wpMinoredit&amp;#039;).prop(&amp;#039;checked&amp;#039;);&lt;br /&gt;
                },&lt;br /&gt;
                set minorEdit(v) {&lt;br /&gt;
                    $(&amp;#039;#wpMinoredit&amp;#039;).prop(&amp;#039;checked&amp;#039;, v);&lt;br /&gt;
                },&lt;br /&gt;
                submit: function () {&lt;br /&gt;
                    $(&amp;#039;#wpSave&amp;#039;).click();&lt;br /&gt;
                },&lt;br /&gt;
                showPreview: function () {&lt;br /&gt;
                    $(&amp;#039;#wpPreview&amp;#039;).click();&lt;br /&gt;
                },&lt;br /&gt;
                showDiff: function () {&lt;br /&gt;
                    $(&amp;#039;#wpDiff&amp;#039;).click();&lt;br /&gt;
                },&lt;br /&gt;
                get selectionStart() {&lt;br /&gt;
                    // TODO: WikEd支援。後面selectionEnd同。&lt;br /&gt;
                    return textbox.selectionStart;&lt;br /&gt;
                },&lt;br /&gt;
                set selectionStart(pos) {&lt;br /&gt;
                    textbox.selectionStart = pos;&lt;br /&gt;
                },&lt;br /&gt;
                get selectionEnd() {&lt;br /&gt;
                    return textbox.selectionEnd;&lt;br /&gt;
                },&lt;br /&gt;
                set selectionEnd(pos) {&lt;br /&gt;
                    textbox.selectionEnd = pos;&lt;br /&gt;
                },&lt;br /&gt;
                get selectionText() {&lt;br /&gt;
                    if (window.wikEd &amp;amp;&amp;amp; wikEd.useWikEd) {&lt;br /&gt;
                        var obj = {};&lt;br /&gt;
                        wikEd.GetText(obj, &amp;#039;selection, cursor&amp;#039;);&lt;br /&gt;
                        return obj.selection.plain || &amp;#039;&amp;#039;;&lt;br /&gt;
                    } else {&lt;br /&gt;
                        return textbox.value.substring(textbox.selectionStart, textbox.selectionEnd);&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                set selectionText(text) {&lt;br /&gt;
                    if (window.wikEd &amp;amp;&amp;amp; wikEd.useWikEd) {&lt;br /&gt;
                        wikEd.EditButton(null, null, null, function (obj) {&lt;br /&gt;
                            wikEd.GetText(obj, &amp;#039;selection, cursor&amp;#039;);&lt;br /&gt;
                            if (obj.selection.plain !== &amp;#039;&amp;#039;) {&lt;br /&gt;
                                obj.changed = obj.selection;&lt;br /&gt;
                            } else {&lt;br /&gt;
                                obj.changed = obj.cursor;&lt;br /&gt;
                            }&lt;br /&gt;
                            obj.changed.plain = text;&lt;br /&gt;
                            obj.changed.keepSel = true;&lt;br /&gt;
                            return;&lt;br /&gt;
                        });&lt;br /&gt;
                    } else {&lt;br /&gt;
                        textbox.setRangeText(text);&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
            };&lt;br /&gt;
            mw.hook(&amp;#039;editorapi.ready&amp;#039;).fire(window.wikitextEditor);&lt;br /&gt;
        }&lt;br /&gt;
    } else if (window.editorapi &amp;amp;&amp;amp; window.editorapi.useViewMode) {&lt;br /&gt;
        // 直接在頁面上提交。頁面名稱為目前頁面。&lt;br /&gt;
        var submitForm = function (options) {&lt;br /&gt;
            $(&amp;#039;&amp;lt;form method=&amp;quot;post&amp;quot; style=&amp;quot;display:none;&amp;quot;&amp;gt;&amp;#039;)&lt;br /&gt;
                .attr(&amp;#039;action&amp;#039;, mw.util.getUrl(mw.config.get(&amp;#039;wgPageName&amp;#039;), {action: &amp;#039;submit&amp;#039;}))&lt;br /&gt;
                .attr(&amp;#039;enctype&amp;#039;, &amp;#039;multipart/form-data&amp;#039;)&lt;br /&gt;
                .append($(&amp;#039;&amp;lt;textarea name=&amp;quot;wpTextbox1&amp;quot;&amp;gt;&amp;#039;).val(options.text || &amp;#039;&amp;#039;),&lt;br /&gt;
                    $(&amp;#039;&amp;lt;input name=&amp;quot;wpSummary&amp;quot;&amp;gt;&amp;#039;).val(options.summary || &amp;#039;&amp;#039;),&lt;br /&gt;
                    &amp;#039;&amp;lt;input name=&amp;quot;wpMinoredit&amp;quot; type=&amp;quot;checkbox&amp;quot; value=&amp;quot;1&amp;quot;&amp;#039; + (options.minorEdit ? &amp;#039; checked=&amp;quot;checked&amp;quot;&amp;#039; : &amp;#039;&amp;#039;) + &amp;#039;&amp;gt;&amp;#039;,&lt;br /&gt;
                    &amp;#039;&amp;lt;input name=&amp;quot;format&amp;quot; value=&amp;quot;text/x-wiki&amp;quot;&amp;gt;&amp;#039;,&lt;br /&gt;
                    &amp;#039;&amp;lt;input name=&amp;quot;wpAutoSummary&amp;quot; value=&amp;quot;hashhashhashhash&amp;quot;&amp;gt;&amp;#039;,    // 防止「未填寫摘要」的提示&lt;br /&gt;
                    &amp;#039;&amp;lt;input name=&amp;quot;model&amp;quot; value=&amp;quot;wikitext&amp;quot;&amp;gt;&amp;#039;,&lt;br /&gt;
                    &amp;#039;&amp;lt;input name=&amp;quot;wpEditToken&amp;quot; value=&amp;quot;&amp;#039; + mw.user.tokens.get(&amp;#039;csrfToken&amp;#039;) + &amp;#039;&amp;quot;&amp;gt;&amp;#039;,&lt;br /&gt;
                    &amp;#039;&amp;lt;input name=&amp;quot;wpUltimateParam&amp;quot; value=&amp;quot;1&amp;quot;&amp;gt;&amp;#039;,&lt;br /&gt;
                    &amp;#039;&amp;lt;input name=&amp;quot;&amp;#039; + (options.button || &amp;#039;wpSave&amp;#039;) + &amp;#039;&amp;quot; type=&amp;quot;submit&amp;quot; value=&amp;quot;1&amp;quot;&amp;gt;&amp;#039;,&lt;br /&gt;
                    &amp;#039;&amp;lt;input name=&amp;quot;mode&amp;quot; value=&amp;quot;text&amp;quot;&amp;gt;&amp;#039;)&lt;br /&gt;
                .appendTo(&amp;#039;body&amp;#039;).submit();&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
        var e = {&lt;br /&gt;
            mode: &amp;#039;view&amp;#039;,&lt;br /&gt;
            text: null,    // 稍後會嘗試取得目前頁面的原始碼&lt;br /&gt;
            summary: &amp;#039;&amp;#039;,&lt;br /&gt;
            minorEdit: false,&lt;br /&gt;
            submit: function () {&lt;br /&gt;
                submitForm({&lt;br /&gt;
                    text: this.text,&lt;br /&gt;
                    summary: this.summary,&lt;br /&gt;
                    minorEdit: this.minorEdit,&lt;br /&gt;
                    button: &amp;#039;wpSave&amp;#039;,&lt;br /&gt;
                });&lt;br /&gt;
            },&lt;br /&gt;
            showPreview: function () {&lt;br /&gt;
                submitForm({&lt;br /&gt;
                    text: this.text,&lt;br /&gt;
                    summary: this.summary,&lt;br /&gt;
                    minorEdit: this.minorEdit,&lt;br /&gt;
                    button: &amp;#039;wpPreview&amp;#039;,&lt;br /&gt;
                });&lt;br /&gt;
            },&lt;br /&gt;
            showDiff: function () {&lt;br /&gt;
                submitForm({&lt;br /&gt;
                    text: this.text,&lt;br /&gt;
                    summary: this.summary,&lt;br /&gt;
                    minorEdit: this.minorEdit,&lt;br /&gt;
                    button: &amp;#039;wpDiff&amp;#039;,&lt;br /&gt;
                });&lt;br /&gt;
            },&lt;br /&gt;
            selectionStart: 0,&lt;br /&gt;
            selectionEnd: 0,&lt;br /&gt;
            get selectionText() {&lt;br /&gt;
                return this.text.substring(this.selectionStart, this.selectionEnd);&lt;br /&gt;
            },&lt;br /&gt;
            set selectionText(text) {&lt;br /&gt;
                this.text = this.text.substring(0, this.selectionStart) + text + this.text.substring(this.selectionEnd);&lt;br /&gt;
            },&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
        // 取得頁面內容&lt;br /&gt;
        $.ajax({&lt;br /&gt;
            url: mw.util.wikiScript(&amp;#039;api&amp;#039;),&lt;br /&gt;
            data: {&lt;br /&gt;
                action: &amp;#039;query&amp;#039;,&lt;br /&gt;
                prop: &amp;#039;revisions&amp;#039;,&lt;br /&gt;
                rvprop: &amp;#039;content&amp;#039;,&lt;br /&gt;
                titles: mw.config.get(&amp;#039;wgPageName&amp;#039;),&lt;br /&gt;
                format: &amp;#039;json&amp;#039;,&lt;br /&gt;
            },&lt;br /&gt;
            dataType: &amp;#039;json&amp;#039;,&lt;br /&gt;
            type: &amp;#039;POST&amp;#039;,&lt;br /&gt;
            success: function (data) {&lt;br /&gt;
                if (data.query) {&lt;br /&gt;
                    var pages = data.query.pages;&lt;br /&gt;
                    for (var pageid in pages) {&lt;br /&gt;
                        var page = pages[pageid];&lt;br /&gt;
                        if (e.text === null &amp;amp;&amp;amp; !(&amp;#039;missing&amp;#039; in page)) {&lt;br /&gt;
                            e.text = page.revisions[0][&amp;#039;*&amp;#039;];&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        window.wikitextEditor = e;&lt;br /&gt;
        mw.hook(&amp;#039;editorapi.ready&amp;#039;).fire(window.wikitextEditor);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    mw.hook(&amp;#039;mobileFrontend.editorOpened&amp;#039;).add(function () {&lt;br /&gt;
    	var textbox = document.getElementById(&amp;#039;wikitext-editor&amp;#039;);&lt;br /&gt;
    	window.wikitextEditor = {&lt;br /&gt;
    		get mode() {&lt;br /&gt;
    			return &amp;#039;mobileFrontend&amp;#039;;&lt;br /&gt;
    		},&lt;br /&gt;
    		get text() {&lt;br /&gt;
    			return $(&amp;#039;#wikitext-editor&amp;#039;).val();&lt;br /&gt;
    		},&lt;br /&gt;
    		set text(t) {&lt;br /&gt;
    			$(&amp;#039;#wikitext-editor&amp;#039;).val(t);&lt;br /&gt;
    		},&lt;br /&gt;
    		get summary() {&lt;br /&gt;
    			return $(&amp;#039;textarea.summary&amp;#039;).val();&lt;br /&gt;
    		},&lt;br /&gt;
    		set summary(text) {&lt;br /&gt;
    			$(&amp;#039;textarea.summary&amp;#039;).val(text);&lt;br /&gt;
    		},&lt;br /&gt;
    		get minorEdit() {&lt;br /&gt;
    			return;&lt;br /&gt;
    		},&lt;br /&gt;
    		set minorEdit(v) {&lt;br /&gt;
    			return;&lt;br /&gt;
    		},&lt;br /&gt;
    		submit: function () {&lt;br /&gt;
    			$(&amp;#039;button.continue&amp;#039;).click();&lt;br /&gt;
    			$(&amp;#039;button.submit&amp;#039;).click();&lt;br /&gt;
    		},&lt;br /&gt;
    		showPreview: function() {&lt;br /&gt;
    			$(&amp;#039;button.continue&amp;#039;).click();&lt;br /&gt;
    		},&lt;br /&gt;
    		showDiff: function() {&lt;br /&gt;
    			return;&lt;br /&gt;
    		},&lt;br /&gt;
    		get selectionStart() {&lt;br /&gt;
    			return textbox.selectionStart;&lt;br /&gt;
    		},&lt;br /&gt;
    		set selectionStart(pos) {&lt;br /&gt;
    			textbox.selectionStart = pos;&lt;br /&gt;
    		},&lt;br /&gt;
    		get selectionEnd() {&lt;br /&gt;
    			return textbox.selectionEnd;&lt;br /&gt;
    		},&lt;br /&gt;
    		set selectionEnd(pos) {&lt;br /&gt;
    			textbox.selectionEnd = pos;&lt;br /&gt;
    		},&lt;br /&gt;
    		get selectionText() {&lt;br /&gt;
    			return textbox.value.substring(textbox.selectionStart, textbox.selectionEnd);&lt;br /&gt;
    		},&lt;br /&gt;
    		set selectionText(text) {&lt;br /&gt;
    			textbox.setRangeText(text);&lt;br /&gt;
    		}&lt;br /&gt;
    	};&lt;br /&gt;
    	mw.hook(&amp;#039;editorapi.ready&amp;#039;).fire(window.wikitextEditor);&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    (function () {&lt;br /&gt;
        var data2text = function (data) {&lt;br /&gt;
            var r = [];&lt;br /&gt;
            if (data) {&lt;br /&gt;
                for (var i=0; i&amp;lt;data.length; i++) {&lt;br /&gt;
                    if (typeof data[i] === &amp;#039;string&amp;#039;) {&lt;br /&gt;
                        r.push(data[i]);&lt;br /&gt;
                    } else if (data[i] &amp;amp;&amp;amp; data[i].type === &amp;#039;/paragraph&amp;#039;) {&lt;br /&gt;
                        r.push(&amp;#039;\n&amp;#039;);&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                return r.join(&amp;#039;&amp;#039;);&lt;br /&gt;
            } else {&lt;br /&gt;
                return &amp;#039;&amp;#039;;&lt;br /&gt;
            }&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
        var pendingSummary = &amp;#039;&amp;#039;;&lt;br /&gt;
        var pendingMinoredit = false;&lt;br /&gt;
        var pendingAction = &amp;#039;&amp;#039;;&lt;br /&gt;
        var addedHook = false;&lt;br /&gt;
&lt;br /&gt;
        mw.hook(&amp;#039;ve.activationComplete&amp;#039;).add(function () {&lt;br /&gt;
            // 視覺化編輯器。注意，切換視覺化與原始碼2017模式也會執行&lt;br /&gt;
            var surface = ve.init.target.getSurface();&lt;br /&gt;
            var surfaceModel = surface.getModel();&lt;br /&gt;
&lt;br /&gt;
            var processed = false;&lt;br /&gt;
            var addHook = function () {&lt;br /&gt;
                if (!addedHook) {&lt;br /&gt;
                    mw.hook(&amp;#039;ve.saveDialog.stateChanged&amp;#039;).add(function() {&lt;br /&gt;
                        if (ve.init.target.saveDialog &amp;amp;&amp;amp; !processed) {&lt;br /&gt;
                            var dialog = ve.init.target.saveDialog;&lt;br /&gt;
                            dialog.setEditSummary(pendingSummary || &amp;#039;&amp;#039;);&lt;br /&gt;
                            dialog.checkboxesByName.wpMinoredit.setSelected(pendingMinoredit &amp;amp;&amp;amp; true);&lt;br /&gt;
                            // 另一個叫做wpWatchthis&lt;br /&gt;
&lt;br /&gt;
                            setTimeout(function () {&lt;br /&gt;
                                if (!ve.init.target.saveDialog) { return; }&lt;br /&gt;
                                switch (pendingAction) {&lt;br /&gt;
                                    case &amp;#039;submit&amp;#039;:&lt;br /&gt;
                                        dialog.executeAction(&amp;#039;save&amp;#039;);&lt;br /&gt;
                                        break;&lt;br /&gt;
                                    case &amp;#039;diff&amp;#039;:&lt;br /&gt;
                                        dialog.executeAction(&amp;#039;review&amp;#039;);&lt;br /&gt;
                                        break;&lt;br /&gt;
                                    case &amp;#039;preview&amp;#039;:&lt;br /&gt;
                                        dialog.executeAction(&amp;#039;preview&amp;#039;);&lt;br /&gt;
                                        break;&lt;br /&gt;
                                }&lt;br /&gt;
                            }, 500);&lt;br /&gt;
                            processed = true;&lt;br /&gt;
                        }&lt;br /&gt;
                    });&lt;br /&gt;
                    addedHook = true;&lt;br /&gt;
                }&lt;br /&gt;
            };&lt;br /&gt;
&lt;br /&gt;
            // FIXME: HACK&lt;br /&gt;
            var keepSel = false;&lt;br /&gt;
            var lastSel;&lt;br /&gt;
&lt;br /&gt;
            window.wikitextEditor = {&lt;br /&gt;
                get mode() {&lt;br /&gt;
                    if (surface.getMode() === &amp;#039;visual&amp;#039;) {&lt;br /&gt;
                        return &amp;#039;visual&amp;#039;;&lt;br /&gt;
                    } else {&lt;br /&gt;
                        return &amp;#039;wikitext2017&amp;#039;;&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                get text() {&lt;br /&gt;
                    // TODO: 視覺化模式支援&lt;br /&gt;
                    if (surface.getMode() === &amp;#039;visual&amp;#039;) {&lt;br /&gt;
                        return null;&lt;br /&gt;
                    }&lt;br /&gt;
                    var data = surfaceModel.documentModel.data;&lt;br /&gt;
                    if (data &amp;amp;&amp;amp; data.data) {&lt;br /&gt;
                        return data2text(data.data);&lt;br /&gt;
                    } else {&lt;br /&gt;
                        return &amp;#039;&amp;#039;;&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                set text(text) {&lt;br /&gt;
                    if (surface.getMode() === &amp;#039;visual&amp;#039;) {&lt;br /&gt;
                        return;&lt;br /&gt;
                    }&lt;br /&gt;
                    var rangeToRemove = new ve.Range(0, surfaceModel.documentModel.getLength());&lt;br /&gt;
                    var fragment = surfaceModel.getLinearFragment(rangeToRemove);&lt;br /&gt;
                    fragment.insertContent(text);&lt;br /&gt;
                },&lt;br /&gt;
                get summary() {&lt;br /&gt;
                    if (ve.init.target.saveDialog) {&lt;br /&gt;
                        return ve.init.target.saveDialog.editSummaryInput.$input.val();&lt;br /&gt;
                    } else {&lt;br /&gt;
                        return pendingSummary || &amp;#039;&amp;#039;;&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                set summary(text) {&lt;br /&gt;
                    if (ve.init.target.saveDialog) {&lt;br /&gt;
                        ve.init.target.saveDialog.setEditSummary(text);&lt;br /&gt;
                    } else {&lt;br /&gt;
                        pendingSummary = text;&lt;br /&gt;
                        addHook();&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                get minorEdit() {&lt;br /&gt;
                    if (ve.init.target.saveDialog) {&lt;br /&gt;
                        return ve.init.target.saveDialog.checkboxesByName.wpMinoredit.selected;&lt;br /&gt;
                    } else {&lt;br /&gt;
                        return pendingMinoredit &amp;amp;&amp;amp; true;&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                set minorEdit(v) {&lt;br /&gt;
                    if (ve.init.target.saveDialog) {&lt;br /&gt;
                        ve.init.target.saveDialog.checkboxesByName.wpMinoredit.setSelected(v &amp;amp;&amp;amp; true);&lt;br /&gt;
                    } else {&lt;br /&gt;
                        pendingMinoredit = v &amp;amp;&amp;amp; true;&lt;br /&gt;
                        addHook();&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                submit: function () {&lt;br /&gt;
                    // TODO：改成聰明的做法&lt;br /&gt;
                    // TODO：如果沒對文字做過修改，對話方塊是叫不出來的&lt;br /&gt;
                    if (ve.init.target.saveDialog) {&lt;br /&gt;
                        if (!ve.init.target.saveDialog.visible) {&lt;br /&gt;
                            ve.init.target.saveDialog.open().then(function() {&lt;br /&gt;
                                ve.init.target.saveDialog.executeAction(&amp;#039;save&amp;#039;);&lt;br /&gt;
                            });&lt;br /&gt;
                        } else {&lt;br /&gt;
                            ve.init.target.saveDialog.executeAction(&amp;#039;save&amp;#039;);&lt;br /&gt;
                        }&lt;br /&gt;
                    } else {&lt;br /&gt;
                        pendingAction = &amp;#039;submit&amp;#039;;&lt;br /&gt;
                        addHook();&lt;br /&gt;
                        ve.init.target.toolbarSaveButton.emit(&amp;#039;click&amp;#039;);&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                showPreview: function () {&lt;br /&gt;
                    if (ve.init.target.saveDialog) {&lt;br /&gt;
                        if (!ve.init.target.saveDialog.visible) {&lt;br /&gt;
                            ve.init.target.saveDialog.open().then(function() {&lt;br /&gt;
                                ve.init.target.saveDialog.executeAction(&amp;#039;preview&amp;#039;);&lt;br /&gt;
                            });&lt;br /&gt;
                        } else {&lt;br /&gt;
                            ve.init.target.saveDialog.executeAction(&amp;#039;preview&amp;#039;);&lt;br /&gt;
                        }&lt;br /&gt;
                    } else {&lt;br /&gt;
                        pendingAction = &amp;#039;preview&amp;#039;;&lt;br /&gt;
                        addHook();&lt;br /&gt;
                        ve.init.target.toolbarSaveButton.emit(&amp;#039;click&amp;#039;);&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                showDiff: function () {&lt;br /&gt;
                    if (ve.init.target.saveDialog) {&lt;br /&gt;
                        if (!ve.init.target.saveDialog.visible) {&lt;br /&gt;
                            ve.init.target.saveDialog.open().then(function() {&lt;br /&gt;
                                ve.init.target.saveDialog.executeAction(&amp;#039;review&amp;#039;);&lt;br /&gt;
                            });&lt;br /&gt;
                        } else {&lt;br /&gt;
                            ve.init.target.saveDialog.executeAction(&amp;#039;review&amp;#039;);&lt;br /&gt;
                        }&lt;br /&gt;
                    } else {&lt;br /&gt;
                        pendingAction = &amp;#039;diff&amp;#039;;&lt;br /&gt;
                        addHook();&lt;br /&gt;
                        ve.init.target.toolbarSaveButton.emit(&amp;#039;click&amp;#039;);&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                get selectionStart() {&lt;br /&gt;
                    // 注意：&lt;br /&gt;
                    // 1. 此位置是編輯框的位置，而非文字位置。後面selectionEnd同。&lt;br /&gt;
                    // 2. 編輯器失去焦點時，選中區域會變為NullSelection！&lt;br /&gt;
                    var selection = surfaceModel.getSelection();&lt;br /&gt;
                    if (selection instanceof ve.dm.LinearSelection) {&lt;br /&gt;
                        return selection.getRange().start;&lt;br /&gt;
                    } else {&lt;br /&gt;
                        return null;&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                set selectionStart(pos) {&lt;br /&gt;
                    var selection = surfaceModel.getSelection();&lt;br /&gt;
                    if (selection instanceof ve.dm.LinearSelection) {&lt;br /&gt;
                        surfaceModel.setLinearSelection(new ve.Range(pos, selection.getRange().end));&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                get selectionEnd() {&lt;br /&gt;
                    var selection = surfaceModel.getSelection();&lt;br /&gt;
                    if (selection instanceof ve.dm.LinearSelection) {&lt;br /&gt;
                        return selection.getRange().end;&lt;br /&gt;
                    } else {&lt;br /&gt;
                        return null;&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                set selectionEnd(pos) {&lt;br /&gt;
                    var selection = keepSel ? lastSel : surfaceModel.getSelection();&lt;br /&gt;
                    if (selection instanceof ve.dm.LinearSelection) {&lt;br /&gt;
                        surfaceModel.setLinearSelection(new ve.Range(selection.getRange().start, pos));&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                get selectionText() {&lt;br /&gt;
                    // 注意：編輯器失去焦點時，選中區域會變為NullSelection！&lt;br /&gt;
                    var selection = surfaceModel.getSelection();&lt;br /&gt;
                    if (selection instanceof ve.dm.LinearSelection) {&lt;br /&gt;
                        var fragment = surfaceModel.getLinearFragment(selection.getRange());&lt;br /&gt;
                        return data2text(fragment.getData());&lt;br /&gt;
                    } else {&lt;br /&gt;
                        return &amp;#039;&amp;#039;;&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                set selectionText(text) {&lt;br /&gt;
                    var selection = keepSel ? lastSel : surfaceModel.getSelection();&lt;br /&gt;
                    if (selection instanceof ve.dm.LinearSelection) {&lt;br /&gt;
                        var fragment = surfaceModel.getLinearFragment(selection.getRange());&lt;br /&gt;
                        fragment.insertContent(text);&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                set keepSelection(v) {&lt;br /&gt;
                    // FIXME: 這裡是Hack，因為編輯器失去焦點時會同時失去選區，&lt;br /&gt;
                    // 不處理的話在$.dialog()之後會無法取得選區內容&lt;br /&gt;
                    if (v) {&lt;br /&gt;
                        keepSel = true;&lt;br /&gt;
                        lastSel = surfaceModel.getSelection();&lt;br /&gt;
                    } else {&lt;br /&gt;
                        keepSel = false;&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            };&lt;br /&gt;
            mw.hook(&amp;#039;editorapi.ready&amp;#039;).fire(window.wikitextEditor);&lt;br /&gt;
        });&lt;br /&gt;
    })();&lt;br /&gt;
&lt;br /&gt;
});&lt;/div&gt;</summary>
		<author><name>imported&gt;Shizhao</name></author>
	</entry>
</feed>