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

User:OctoberSama/common.js:修订间差异

来自OTTOWiki
第32行: 第32行:
mw.loader.load("https://zh.moegirl.org.cn/index.php?title=User:BearBin/js/ListEnhancer.js&action=raw&ctype=text/javascript");
mw.loader.load("https://zh.moegirl.org.cn/index.php?title=User:BearBin/js/ListEnhancer.js&action=raw&ctype=text/javascript");


$(async function () {
/* eslint-env browser, jquery */
   // 确保是编辑页面,并且存在编辑器
/* global mw, OO, CodeMirror6 */
   const $textarea = $('#wpTextbox1')
/**
* @name codemirror6 主编辑器支持
* @author -
*/
 
"use strict";
 
(async function () {
   if (!["edit", "submit"].includes(mw.config.get("wgAction"))) return
 
  await $.ready
 
  const TEXTAREA_SELECTOR = "#wpTextbox1"
   const $textarea = $(TEXTAREA_SELECTOR)
   if (!$textarea.length) return
   if (!$textarea.length) return


   const page = mw.config.get('wgPageName')
   const CM_CDN = 'https://testingcf.jsdelivr.net/npm/@bhsd/codemirror-mediawiki@latest'
   const namespace = mw.config.get('wgNamespaceNumber')
  const localStorageKey = "codemirror6-enabled"
  const namespace = mw.config.get("wgNamespaceNumber")
   const pageName = mw.config.get("wgPageName")
  let cmInstance = null
 
  const state = JSON.parse(localStorage.getItem(localStorageKey) || "true")


   const CM_CDN = 'https://testingcf.jsdelivr.net/npm/@bhsd/codemirror-mediawiki'
   /** 判断页面模式 */
   await Promise.all([
   function getPageMode(pageName, ns) {
     mw.loader.using('mediawiki.Title'),
     const ext = pageName.split(".").pop().toLowerCase()
    window.CodeMirror6 || import(`${CM_CDN}/dist/mw.min.js`),
    const isSubject = ns % 2 === 0
  ])


  const title = new mw.Title(page)
    if (ext === "css" && isSubject) return [2, 8, 2300].includes(ns) ? "css" : "sanitized-css"
  title.namespace = namespace
    if (ext === "js" && isSubject) return "javascript"
    if (ext === "json" && isSubject) return "json"
    if (ns === 828 && !pageName.endsWith("/doc")) return "lua"
    if (ns === 274 && !pageName.endsWith("/doc")) return "html"
    return "mediawiki"
  }


   const mode = (function getPageMode(page) {
   /** 加载 CodeMirror6 编辑器 */
    const { namespace, title } = page
  async function initEditor() {
    const ext = page.getExtension()?.toLowerCase()
     if (!window.CodeMirror6) {
    const isSubject = namespace % 2 === 0
       await import(`${CM_CDN}/dist/mw.min.js`)
     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'
     const mode = getPageMode(pageName, namespace)
  })(title)
    cmInstance = await CodeMirror6.fromTextArea($textarea[0], mode, namespace)


  const cm = await CodeMirror6.fromTextArea($textarea[0], mode, namespace)
    // mediawiki 模式需要修复 urlProtocols 可能的转义问题
    if (mode === 'mediawiki') {
      const config = mw.config.get('extCodeMirrorConfig')
      if (config?.urlProtocols?.includes('\\:')) {
        config.urlProtocols = config.urlProtocols.replace(/\\:/g, ':')
        cmInstance.setLanguage('mediawiki', config)
      }
    }


   if (mode === 'mediawiki') {
    $(".group-codeeditor-main").hide()
     const config = mw.config.get('extCodeMirrorConfig')
  }
    if (config?.urlProtocols.includes('\\:')) {
 
       config.urlProtocols = config.urlProtocols.replace(/\\:/g, ':')
   /** 初始化按钮 */
       cm.setLanguage('mediawiki', config)
  function addButtons() {
    const btnSettings = new OO.ui.ButtonWidget({
      classes: ["tool"],
      icon: "settings",
      framed: false,
      title: "CodeMirror 设置"
    }).on("click", () => {
      $("#cm-settings").trigger("click")
    })
 
     const btnToggle = new OO.ui.ButtonWidget({
      classes: ["tool"],
      icon: "highlight",
      framed: false,
      title: "切换 CodeMirror 编辑器"
    }).on("click", async () => {
      if (cmInstance) {
        cmInstance.toggle()
        $(".group-codeeditor-main").toggle()
        btnSettings.$element.toggle()
      } else {
        await initEditor()
        btnToggle.$element.after(btnSettings.$element)
      }
 
       btnToggle.$element.toggleClass("tool-active")
      const newState = !JSON.parse(localStorage.getItem(localStorageKey) || "true")
      localStorage.setItem(localStorageKey, newState)
    })
 
    $textarea.on("wikiEditor-toolbar-doneInitialSections", () => {
      btnToggle.$element.appendTo("#wikiEditor-section-main > .group-insert")
    })
 
    const $group = $("#wikiEditor-section-main > .group-insert")
    if ($group.length && !$group[0].contains(btnToggle.$element[0])) {
       btnToggle.$element.appendTo($group)
     }
     }
    return { btnToggle, btnSettings }
   }
   }


   // 可选:加入自定义钩子供其他模块使用
   // 加载 wikiEditor 和 UI 图标
   mw.hook('CodeMirror6.global').fire({ cm })
   await mw.loader.using(["ext.wikiEditor", "oojs-ui.styles.icons-interactions"])
})
 
  const { btnToggle, btnSettings } = addButtons()
 
  if (mw.config.get("wgPageContentModel") !== "wikitext" && mw.user.options.get("usecodeeditor")) {
    // 非 wikitext 页面禁用
    localStorage.setItem(localStorageKey, "false")
    return
  }
 
  if (state) {
    await initEditor()
    btnToggle.$element.addClass("tool-active")
    btnToggle.$element.after(btnSettings.$element)
  }
})()

2025年7月5日 (六) 13:36的版本

//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");

/* eslint-env browser, jquery */
/* global mw, OO, CodeMirror6 */
/**
 * @name codemirror6 主编辑器支持
 * @author -
 */

"use strict";

(async function () {
  if (!["edit", "submit"].includes(mw.config.get("wgAction"))) return

  await $.ready

  const TEXTAREA_SELECTOR = "#wpTextbox1"
  const $textarea = $(TEXTAREA_SELECTOR)
  if (!$textarea.length) return

  const CM_CDN = 'https://testingcf.jsdelivr.net/npm/@bhsd/codemirror-mediawiki@latest'
  const localStorageKey = "codemirror6-enabled"
  const namespace = mw.config.get("wgNamespaceNumber")
  const pageName = mw.config.get("wgPageName")
  let cmInstance = null

  const state = JSON.parse(localStorage.getItem(localStorageKey) || "true")

  /** 判断页面模式 */
  function getPageMode(pageName, ns) {
    const ext = pageName.split(".").pop().toLowerCase()
    const isSubject = ns % 2 === 0

    if (ext === "css" && isSubject) return [2, 8, 2300].includes(ns) ? "css" : "sanitized-css"
    if (ext === "js" && isSubject) return "javascript"
    if (ext === "json" && isSubject) return "json"
    if (ns === 828 && !pageName.endsWith("/doc")) return "lua"
    if (ns === 274 && !pageName.endsWith("/doc")) return "html"
    return "mediawiki"
  }

  /** 加载 CodeMirror6 编辑器 */
  async function initEditor() {
    if (!window.CodeMirror6) {
      await import(`${CM_CDN}/dist/mw.min.js`)
    }
    const mode = getPageMode(pageName, namespace)
    cmInstance = await CodeMirror6.fromTextArea($textarea[0], mode, namespace)

    // mediawiki 模式需要修复 urlProtocols 可能的转义问题
    if (mode === 'mediawiki') {
      const config = mw.config.get('extCodeMirrorConfig')
      if (config?.urlProtocols?.includes('\\:')) {
        config.urlProtocols = config.urlProtocols.replace(/\\:/g, ':')
        cmInstance.setLanguage('mediawiki', config)
      }
    }

    $(".group-codeeditor-main").hide()
  }

  /** 初始化按钮 */
  function addButtons() {
    const btnSettings = new OO.ui.ButtonWidget({
      classes: ["tool"],
      icon: "settings",
      framed: false,
      title: "CodeMirror 设置"
    }).on("click", () => {
      $("#cm-settings").trigger("click")
    })

    const btnToggle = new OO.ui.ButtonWidget({
      classes: ["tool"],
      icon: "highlight",
      framed: false,
      title: "切换 CodeMirror 编辑器"
    }).on("click", async () => {
      if (cmInstance) {
        cmInstance.toggle()
        $(".group-codeeditor-main").toggle()
        btnSettings.$element.toggle()
      } else {
        await initEditor()
        btnToggle.$element.after(btnSettings.$element)
      }

      btnToggle.$element.toggleClass("tool-active")
      const newState = !JSON.parse(localStorage.getItem(localStorageKey) || "true")
      localStorage.setItem(localStorageKey, newState)
    })

    $textarea.on("wikiEditor-toolbar-doneInitialSections", () => {
      btnToggle.$element.appendTo("#wikiEditor-section-main > .group-insert")
    })

    const $group = $("#wikiEditor-section-main > .group-insert")
    if ($group.length && !$group[0].contains(btnToggle.$element[0])) {
      btnToggle.$element.appendTo($group)
    }

    return { btnToggle, btnSettings }
  }

  // 加载 wikiEditor 和 UI 图标
  await mw.loader.using(["ext.wikiEditor", "oojs-ui.styles.icons-interactions"])

  const { btnToggle, btnSettings } = addButtons()

  if (mw.config.get("wgPageContentModel") !== "wikitext" && mw.user.options.get("usecodeeditor")) {
    // 非 wikitext 页面禁用
    localStorage.setItem(localStorageKey, "false")
    return
  }

  if (state) {
    await initEditor()
    btnToggle.$element.addClass("tool-active")
    btnToggle.$element.after(btnSettings.$element)
  }
})()