打开/关闭菜单
打开/关闭外观设置菜单
打开/关闭个人菜单
未登录
未登录用户的IP地址会在进行任意编辑后公开展示。

注意:在发布之后,您可能需要清除浏览器缓存才能看到所作出的更改的影响。

  • Firefox或Safari:按住Shift的同时单击刷新,或按Ctrl-F5Ctrl-R(Mac为⌘-R
  • Google Chrome:Ctrl-Shift-R(Mac为⌘-Shift-R
  • Edge:按住Ctrl的同时单击刷新,或按Ctrl-F5
//IPE配置
/** InPageEdit Preferences */
;(window.InPageEdit = window.InPageEdit || {}).myPreference = {
  "doNotCollectMyInfo": false,
  "editMinor": true,
  "editSummary": "$section ",
  "lockToolBox": false,
  "redLinkQuickEdit": false,
  "outSideClose": false,
  "watchList": "watch",
  "noConfirmEdit": false,
  "plugins": [
    "toolbox.js",
    "wiki-editor.js",
    "code-mirror/cm6.js"
  ]
}

//IPE
mw.loader.load('https://cdn.jsdelivr.net/npm/mediawiki-inpageedit');

//批量编辑
mw.loader.load("/index.php?title=User:OctoberSama/MassEdit.js&action=raw&ctype=text/javascript");

//缓存清除
mw.loader.load("https://cdn.jsdelivr.net/gh/BearBin1215/MoegirlPedia@master/dist/gadgets/OneKeyPurge.min.js");

//高级搜索
mw.loader.load("https://cdn.jsdelivr.net/gh/BearBin1215/MoegirlPedia@master/dist/gadgets/AdvancedSearch.min.js");

//辅助工具ListEnhancer
mw.loader.load("https://zh.moegirl.org.cn/index.php?title=User:BearBin/js/ListEnhancer.js&action=raw&ctype=text/javascript");

(async function() {
  // Constants
  const CM_CDN = 'https://testingcf.jsdelivr.net/npm/@bhsd/codemirror-mediawiki';

  // Function to load external scripts
  function loadScript(url) {
    return new Promise((resolve, reject) => {
      const script = document.createElement('script');
      script.src = url;
      script.onload = resolve;
      script.onerror = reject;
      document.head.appendChild(script);
    });
  }

  // LocalObjectStorage class for managing user preferences
  class LocalObjectStorage {
    constructor(prefix) {
      this.prefix = prefix;
    }
    getItem(key, defaultValue) {
      const value = localStorage.getItem(this.prefix + key);
      return value !== null ? JSON.parse(value) : defaultValue;
    }
    setItem(key, value) {
      localStorage.setItem(this.prefix + key, JSON.stringify(value));
    }
  }

  // Determine the editing mode based on page namespace and extension
  function getPageMode(page) {
    const {namespace, title} = page;
    const ext = page.getExtension()?.toLowerCase();
    const isSubject = namespace % 2 === 0;
    if (ext === 'css' && isSubject) {
      return [2, 8, 2300].includes(namespace) ? 'css' : 'sanitized-css';
    } else if (ext === 'js' && isSubject) {
      return 'javascript';
    } else if (ext === 'json' && isSubject) {
      return 'json';
    } else if (namespace === 828 && !title.endsWith('/doc')) {
      return 'lua';
    } else if (namespace === 274 && !title.endsWith('/doc')) {
      return 'html';
    }
    return 'mediawiki';
  }

  // Render the CodeMirror6 editor
  async function renderEditor(target, page) {
    if (target.length) {
      const mode = getPageMode(page);
      const cm = await CodeMirror6.fromTextArea(target[0], mode);
      return cm;
    }
  }

  // Exit if not an edit or submit page
  if (!["edit", "submit"].includes(mw.config.get("wgAction"))) {
    return;
  }

  // Wait for the page to load
  await $.ready;

  // Load MediaWiki Title module
  await mw.loader.using('mediawiki.Title');

  // Load CodeMirror6 if not already present
  if (!window.CodeMirror6) {
    await loadScript(`${CM_CDN}/dist/mw.min.js`);
  }

  // Get page title and namespace
  const pageTitle = mw.config.get("wgPageName");
  const namespace = mw.config.get("wgNamespaceNumber");
  const page = new mw.Title(pageTitle, namespace);

  // Target the default text area
  const $textarea = $("#wpTextbox1");

  // Check if WikiEditor is enabled
  const isAdvanced = ["loading", "loaded", "executing", "ready"].includes(mw.loader.getState("ext.wikiEditor"));

  // Initialize local storage for user preferences
  const localObjectStorage = new LocalObjectStorage("my-codemirror-");
  let state = localObjectStorage.getItem("enabled", true);

  // Create a toggle button
  const $switchDiv = $('<div>').prependTo('#editform');
  const $button = $('<button>').text('Toggle CodeMirror6').appendTo($switchDiv);
  let cm = null;

  // Toggle button click handler
  $button.on('click', async function() {
    state = !state;
    localObjectStorage.setItem("enabled", state);
    if (state) {
      cm = await renderEditor($textarea, page);
      if (isAdvanced) {
        $('#wikiEditor-ui-toolbar').hide();
      }
    } else {
      if (cm) {
        cm.toTextArea(); // Note: Confirm this method exists in CodeMirror6
        cm = null;
      }
      if (isAdvanced) {
        $('#wikiEditor-ui-toolbar').show();
      }
    }
  });

  // Apply initial state
  if (state) {
    cm = await renderEditor($textarea, page);
    if (isAdvanced) {
      $('#wikiEditor-ui-toolbar').hide();
    }
  }
})();