如果你看到本段文字,说明该页面未正常加载全局JS,部分功能将无法使用,请点击 刷新 重新加载页面。
如果打开页面显示缩略图创建出错,请点击刷新或页面右上WIKI功能中的刷新按钮清除页面缓存并刷新,如果还有问题,请多尝试几次。
全站通知:

批量页面覆盖式编辑工具

阅读

    

2022-09-05更新

    

最新编辑:丩卩夂忄

阅读:

  

更新日期:2022-09-05

  

最新编辑:丩卩夂忄

来自碧蓝航线WIKI_BWIKI_哔哩哔哩
跳到导航 跳到搜索

此模板为一键安装导入,不建议手动修改。

简单说明

版本:1.0

说明:将整理好的内容批量添加到大量wiki页面,允许覆盖或追加。

安装方法

  • 自动安装:拥有站点管理员权限的同学可以在本页面使用一键安装功能
  • 手动安装:复制以下依赖页面中的内容到相同页面名称的页面中

使用说明

典型案例:

  • 批量创建人物/武器页面,格式基本相同
  • 向部分页面头部增加导航栏/施工中模板。
  • 为一些页面尾部添加分类导航模板。

0. 准备模板和数据

本工具将基于指定的模板生成页面。

请在Excel中按以下格式准备数据:

模板名 参数1名 参数2名 ……
页面1名 参数1 参数2 ……
页面2名 参数1 参数2 ……
……
  • 如果模板没有指定参数名,将“参数1名”等留空即可
  • 如果某参数为空,对应位置留空即可
  • 如果页面名重复,将以最后一条数据为准

1.选择模式

选择需要的模式:

  • 新建页面 / 覆盖已有页面
  • 在页面开头追加内容
  • 在页面末尾追加内容

2. 粘贴数据

打开要操作的wiki,进入 Widget:BatchCreateByTemplate 工具页面

复制Excel中的数据,粘贴到工具页面中的文本框。

文本框下方将立即出现页面内容预览。

请检查预览是否符合预期。如有需要可以反复删除重新粘贴。

3. 创建页面

点击页面底部的“提交”按钮。稍等片刻,工具创建完页面后会再次弹出提示框。

这一步根据页面数量和网络情况可能需要一定时间,请耐心等待。

创建完成后,页面会弹出窗口:

文件:批量页面覆盖式编辑工具完成提示框.png

例子

例子一

文件:批量页面覆盖式编辑工具例子1.png

例子二

文件:批量页面覆盖式编辑工具例子2.png

作者

丩卩夂忄


依赖页面

<div class="BCBT"> <div class="title"> <span>从Excel中复制粘贴↓</span> <div class="modeOption"> 模式: <label><input type="radio" name="bcbtMode" value="text" checked><b>新建</b>页面/<b>覆盖</b>已有页面</label> <label><input type="radio" name="bcbtMode" value="prependtext">在页面<b>开头</b>追加内容</label> <label><input type="radio" name="bcbtMode" value="appendtext">在页面<b>末尾</b>追加内容</label> </div> </div> <textarea class="input"></textarea> <div class="display row"></div> <button class="submit">提交</button> </div> <style> .BCBT .title { display: flex; } .BCBT .title .modeOption { margin-left: 2em; display: flex; } .BCBT .title .modeOption { margin-left: 2em; } .BCBT .title .modeOption label { margin-right: 0.5em; font-weight: normal; } .BCBT .display pre.created { background: #5CB85C; } .BCBT .input { width: 100%; height: 300px; } .BCBT .submit, .BCBT .reset { padding: 0.5em 1em; } </style> <script> class BCBT { state = "ready" option = { mode: "text" } data = { template: "", key: [], page: {}, } promise = Promise.resolve() constructor(dom, wiki) { this.dom = $(dom) this.dom.data("BCBT", this) this.wiki = wiki || mw.config.values.wgScriptPath } update() { this.parse() let $display = this.dom.find(".display") $display.empty() for (let key in this.data.page) { let $pre = $(`<pre class="col-md-3" data-title="${encodeURIComponent(key)}">`) $pre.append(`[[${key}]]`) $pre.append("<hr>") $pre.append(this.stringify(`${key}`).replace(new RegExp(`^{{${this.data.template}\n`), `{{${this.data.template}\n`)) $display.append($pre) } } parse() { let text = this.dom.find(".input").val() let pages = text.split("\n") let key = pages.shift().split("\t") key.forEach((e, i, a) => { a[i] = e.trim() }) this.data.template = key.shift() this.data.key = key this.data.page = {} pages.forEach((e) => { let value = e.split("\t") value.forEach((e, i, a) => { a[i] = e.trim() }) let page = value.shift() if (!page) { return } this.data.page[page] = value }) } stringify(page) { let str = `{{${this.data.template}` this.data.key.forEach((e, i) => { str += `\n|${e ? `${e}=` : ""}${this.data.page[page][i] || ""}` }) str += "\n}}" return str } submit() { this.state = "busy" this.dom.find(".input,.modeOption input").attr("disabled", true) let url = `${this.wiki}/api.php` for (let key in this.data.page) { this.promise = this.promise.finally(() => { return new Promise((resolve, reject) => { checkToken().then((token) => { $.ajax({ url: url, type: "POST", data: { token: token, action: "edit", title: key, summary: "通过批量创建工具BCBT创建/编辑", [this.option.mode]: this.stringify(key) }, success: () => { $.get(`${this.wiki}${decodeURI(key)}`, () => { this.dom.find(`.display pre[data-title="${encodeURIComponent(key)}"]`).addClass("created") resolve() }) } }) }) }) }) } this.promise = this.promise.finally(() => { if (confirm("创建完毕,是否重置?")) { this.reset() } else { this.dom.find(".submit") .removeClass("submit") .addClass("reset") .html("重置") } }) function checkToken() { return new Promise((resolve, reject) => { $.ajax({ url: url, type: "GET", data: { action: "query", meta: "tokens", format: "json" }, success(data) { resolve(data.query.tokens.csrftoken) } }) }) } } reset() { this.state = "ready" this.dom.find(".input,.modeOption input").attr("disabled", false) this.dom.find(".input").val("") this.update() this.dom.find(".reset") .removeClass("reset") .addClass("submit") .html("提交") } } window.addEventListener("load", () => { $(() => { let bcbt = $(".BCBT") if (mw.config.get('wgUserGroups').indexOf("sysop") === -1) { bcbt.html("你无权使用这个功能。") return } bcbt.each((i, e) => { new BCBT(e) }) $(document).on("input", ".BCBT .input", function () { $(this).closest(".BCBT").data("BCBT").update() }) $(document).on("input", `.BCBT .modeOption input[name="bcbtMode"]`, function () { $(this).closest(".BCBT").data("BCBT").option.mode = $(this).val() }) $(document).on("click", `.BCBT .submit`, function () { let bcbt = $(this).closest(".BCBT").data("BCBT") if (bcbt.state === "ready" && confirm("真的确认了吗?")) { bcbt.submit() } }) $(document).on("click", `.BCBT .reset`, function () { $(this).closest(".BCBT").data("BCBT").reset() }) }) }) </script>

更新日志

1.0