User:OctoberSama/common.js:修订间差异
来自OTTOWiki
更多操作
![]() OctoberSama(留言 | 贡献) 小 |
![]() OctoberSama(留言 | 贡献) 小 |
||
第31行: | 第31行: | ||
//辅助工具ListEnhancer | //辅助工具ListEnhancer | ||
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() { | |||
// 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(); | |||
} | |||
} | |||
})(); |
2025年7月5日 (六) 13:50的版本
//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();
}
}
})();