Wikidot 的编辑栏过于反人类,试试这个
点开编辑栏后加载可能有点慢,就算加载出来了如果是空就说明在同步内容,请您耐心等待
由于wikidot的加载速度,请您耐心等待gif加载好,可能时间有点长
本项目采用AGPLv3协议授权
测试已通过,脚本和编辑器源代码仓库
点这里直接前往网页版编辑器
重要:这不是批量编辑脚本,这这是一个用于数据连接、改善编辑体验的脚本,请不要使用此脚本进行批量编辑,请不要违反站规
一键夺舍展示
代码补全
这里是wasd243, 对脚本性能,“夺舍”暴力覆盖wikidot原窗口测试完毕。
正如你所见,这个基于GitHub Page的脚本可以完全“夺舍”wikidot的原生编辑栏,打开即用
唯一缺点是无法重制wikidot的编辑锁定,时间会一直进行,所以请在15分钟到了以后及时按下“重新创建编辑锁定”按钮
感谢:
OxygenNine的版式授权,为版本测试节省了很多时间
Dr Hormress的缩进提案反馈,为我节省了大量的时间
页面版式:过氧化物 基础版式
代码编辑:Code Mirror 6 lezer
代码高亮数据:
Wikidot代码高亮为我,也就是wasd243,参考浏览器配色自制
CSS和HTML代码高亮引用源代码:
import { cssLanguage } from "@codemirror/lang-css"
import { htmlLanguage} from "@codemirror/lang-html"// ==UserScript==
// @name H2O2 Wikidot Editor (Universal)
// @namespace https://github.com/wasd243/SCP-Foundation-editor-web
// @version 2.0.0
// @description 加了个看门狗
// @icon https://scpsandboxcn.wikidot.com/local--files/peroxide-hyroperoxide/%E6%97%A0%E5%B0%BD%E5%82%AC%E5%8C%96%E5%89%82%EF%BC%88%E7%8E%84%E5%AD%A6%E4%BB%A3%E7%A0%81%E9%95%87%E5%9C%BA%E5%AD%90%EF%BC%89
// @author wasd243
// @match *://*.wikidot.com/*
// @grant none
// @run-at document-end
// ==/UserScript==
(function () {
'use strict';
var EDITOR_URL = 'https://wasd243.github.io/SCP-Foundation-editor-web/test.html';
var IFRAME_ID = 'h2o2-editor-frame';
var OBSERVER_KEY = '__h2o2_observer__';
// ── 消息同步:iframe → textarea ───────────────────────────
window.addEventListener('message', function (event) {
if (event.origin !== 'https://wasd243.github.io') return;
if (!event.data || event.data.type !== 'h2o2-update') return;
var ta = document.getElementById('edit-page-textarea');
if (!ta) return;
ta.value = event.data.payload;
ta.dispatchEvent(new Event('input', { bubbles: true }));
});
// ── 注入逻辑 ──────────────────────────────────────────────
function inject(ta) {
if (document.getElementById(IFRAME_ID)) return;
var waited = 0;
var poller = setInterval(function () {
waited += 100;
var content = ta.value;
if (content.length > 0 || waited >= 3000) {
clearInterval(poller);
doInject(ta, content);
}
}, 100);
}
function doInject(ta, content) {
if (document.getElementById(IFRAME_ID)) return;
console.log('H2O2: 注入,内容长度', content.length);
ta.style.setProperty('display', 'none', 'important');
var toolbar = document.getElementById('wd-editor-toolbar-panel');
if (toolbar) toolbar.style.setProperty('display', 'none', 'important');
document.querySelectorAll('.change-textarea-size').forEach(function (el) {
el.style.setProperty('display', 'none', 'important');
});
var iframe = document.createElement('iframe');
iframe.id = IFRAME_ID;
iframe.src = EDITOR_URL;
iframe.style.cssText = [
'width: 100%',
'height: 70vh',
'min-height: 520px',
'border: none',
'border-radius: 4px',
'display: block',
'margin-bottom: 8px'
].join('; ');
ta.parentNode.insertBefore(iframe, ta);
iframe.addEventListener('load', function () {
setTimeout(function () {
try {
iframe.contentWindow.postMessage(
{ type: 'h2o2-init', payload: content }, '*'
);
console.log('H2O2: 内容已推送,长度', content.length);
} catch (e) {
console.warn('H2O2: postMessage 失败', e);
}
}, 500);
});
}
// ── 启动一个 MutationObserver 实例 ───────────────────────
function startObserver() {
// 断开旧的
if (window[OBSERVER_KEY]) {
try { window[OBSERVER_KEY].disconnect(); } catch (e) {}
}
var obs = new MutationObserver(function () {
var ta = document.getElementById('edit-page-textarea');
var iframe = document.getElementById(IFRAME_ID);
if (!ta && iframe) {
console.log('H2O2: 编辑结束,清理 iframe');
iframe.remove();
return;
}
if (ta && !iframe) {
inject(ta);
}
if (ta) {
ta.style.setProperty('display', 'none', 'important');
}
});
obs.observe(document.documentElement, { childList: true, subtree: true });
window[OBSERVER_KEY] = obs;
console.log('H2O2: Observer 已(重)启动');
}
// ── 看门狗:每秒检查 Observer 是否还活着 ─────────────────
// Warning: Wikidot AJAX is a monster. Do NOT remove this watchdog unless you want to lose your soul (and your drafts).
// 原理:给 Observer 实例打一个存活标记,
// 如果标记消失或 Observer 对象丢失,立刻重建。
setInterval(function () {
// 检查 Observer 是否还挂在 window 上
if (!window[OBSERVER_KEY]) {
console.warn('H2O2: Observer 丢失,重建中...');
startObserver();
return;
}
// 顺带检查:有 textarea 但没有 iframe,说明注入失败了,补注入
var ta = document.getElementById('edit-page-textarea');
var iframe = document.getElementById(IFRAME_ID);
if (ta && !iframe) {
console.warn('H2O2: 发现未注入的 textarea,补注入');
inject(ta);
}
// 有 textarea 就持续压制
if (ta) {
ta.style.setProperty('display', 'none', 'important');
}
// 没有 textarea 就清理僵尸 iframe
if (!ta && iframe) {
iframe.remove();
}
}, 1000);
// ── 启动 ──────────────────────────────────────────────────
startObserver();
// 页面加载时立即检查一次
var ta = document.getElementById('edit-page-textarea');
if (ta) inject(ta);
console.log('H2O2: v2.0.0 已启动');
})();卧槽gif太多把浏览器卡爆了,放不下了就先不放了
上手这玩意儿有多简单?
点这里下载油猴并安装对脚本1
1. 点击GitHub右上方的RAW按钮
2. 会进入一个油猴TamperMonkey界面
3. 点击Install或者Reinstall
好了,可以用了
前面的一键夺舍已经演示了如何启用油猴子脚本,为了防止你还是不太明白,在这里留了一个图片版说明。
油猴TamperMonkey的GUI
可以看到啊,这里的油猴GUI有这么几个选项:
装好脚本以后来到一个wikidot页面是可以看到这个无尽催化剂8标志的脚本,把它打开,如果没有的话请检查是否在wikidot并等待一会刷新页面?可能会有延迟。
这里需要注意,在wikidot.com结尾的页面显示可以使用了以后,
✅Enabled并不是开启脚本按钮,而是“脚本已开启”的意思
❌Disabled也不是关闭脚本按钮,而是“脚本已关闭”的意思9
这也是之前脚本启动比较玄学的根本原因
每次开启脚本的时候,记得强制刷新一次页面:
ctrl+F5 或 command+shift+r
一个在点击编辑之前判断脚本是否运行的好方法
按下 F12 或者 command+option+I 打开浏览器开发工具界面,这里以Microsoft edge为例。
可以看到这里的日志:
Observer 已经(重)启动
v2.0.0 已启动
简易看门狗的提示,防止wikidot的AJAX局部刷新删掉注入的脚本,避免重复开关脚本,用户可以手动在油猴的GUI里关闭
另外的一些日志
H2O2: 发现未注入的 textarea,补注入
暴力逻辑,注入所有没有被注入的 textarea
H2O2: 注入,内容长度 3321
H2O2: 内容已推送,长度 3321
注入/推送日志
位置: 2944-2963, 内容位置: 2954-2961
匹配到Wikidot颜色标签: Disabled
颜色代码:xxxxx, 内容:"xxxxx"
颜色代码实时渲染日志,用于在用户更改颜色后进行同步
如果页面卡死或者怎么也加载不出来编辑栏,记得关闭油猴脚本并刷新|两次|页面10可回到wikidot原版编辑栏
这个更简单
点击上方的 CODE TOOLS即可进入快捷代码界面
功能和wikidot原生差不多,用来替代被夺舍的wikidot原生代码界面
更多的功能:
1. 代码补全:你只需要输入[中括号——[中括号便可以触发简易的代码补全机制,比如输入f自动补全对应的代码,操作大概是:
[ —> [f -> Enter -> [[footnote]]这是一条脚注[[/footnote]]
2. 代码高亮:自动识别对应的维基代码进行高亮,在css模块中自动启动css高亮库,在html模块中自动启用html高亮库
3. 代码折叠:点击行数旁边的小箭头,找到对应的代码,块,根据对应的闭合标签渲染折叠,折叠后的代码可以随意复制,不受影响11
4. 调色板:当你输入16进制颜色时,比如这一段:
###FF0000|123##
gif太多卡死了卧槽
请在这个链接查看对应的gif图片
关于这个名字:
这个名字其实是我看到了OxygenNine的过氧化物版式想做一个子版式替换掉编辑栏。结果可想而知,失败了。
就算请管理员开放script权限也没用,因为有一个很明显的安全问题:
script不能被恶意修改,
没有低调的黑客去黑一个小说网站,但不排除黑掉的迪克
会出现很大的问题。
所以就做了一个油猴脚本在本地浏览器连接GitHub和Wikidot的页面,保留了这个名字也是为了感谢他当时授权了我用这个版式进行AGPLv3项目的开发。
关于“暴力”逻辑
在这里留的一个简易看门狗逻辑比较“暴力”的原因是Wikidot的AJAX局部更新可能会让脚本被刷新掉,
从而丧失持续替换Wikidot原版编辑栏的能力
所以直接把所有没有被注入的textarea再次注入
注意⚠️:这里的注入环节均在本地进行,不会对服务器造成任何损伤,仅用于替换Wikidot原版编辑页面在浏览器的渲染,让各位作者/译者拥有更好的编辑体验
大家好,这里再介绍一下我自己,我是wasd243,新人译者,AI写代码我超级拼装的新人开发者,一个有一点python基础,学了20-30天js的萌新。
一路从WYSIWYG更新过来,非常感谢大家的反馈和upvote,这个编辑器将作为WYSIWYG编辑器的2.1.0版本更新,针对国内的加速页面也将会在之后搞12,因为我高中学业原因有时候可能来不及快速更新,13
但是我已经很快了哈哈哈哈,这里如果你们夺舍wikidot失败了或者有什么安全漏洞需要反馈的,欢迎联系我。
我们讨论区和issues里再见
祝大家夺舍wikidot愉快,花来~🌹👋





