全站通知:

批量页面覆盖式编辑工具

阅读

    

2022-08-21更新

    

最新编辑:残天大魔王

阅读:

  

更新日期:2022-08-21

  

最新编辑:残天大魔王

来自星瞳_OfficialWIKI_BWIKI_哔哩哔哩
跳到导航 跳到搜索

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

简单说明

版本:1.0

说明:本工具可以快速将已经整理好的内容上传到wiki页面上,但是会完全覆盖旧有页面内容

安装方法

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

使用说明

1,在 Widget:BatchCreateByTemplate 页面中将Excel里建表格复制进来,表格格式如下

模板名 参数1名 参数2名 ……
页面1名 参数1 参数2 ……
页面2名 参数1 参数2 ……
……

2,点击创建页面,时间较长需要等待一会,刷新完会有提示

作者

丩卩夂忄


依赖页面

<div id="BatchCreateByTemplate"> <textarea id="BCBTexcel" style="width:100%;height:300px"></textarea> <div id="BCBTdisplay" class="row"></div> <button id="BCBTsubmit" style="padding:0.5em 1em">确认创建</button> <script> BCBTMeta={ "wiki":"", "state":"ready", "queue":[], "data":{/* "template":"", "key":[], "page":{}, */} } BCBTFun={ "initialize":function(){ if(mw.config.get('wgUserGroups').indexOf("sysop")==-1){ document.getElementById("BatchCreateByTemplate").innerHTML="你无权使用这个功能。" return } BCBTMeta.wiki=mw.config.values.wgScriptPath document.getElementById("BCBTexcel").oninput=function(){ let row=this.value.split("\n") let title=row[0].split("\t") title=title.map(function(e){return e.trim()}) BCBTMeta.data.template=title[0] BCBTMeta.data.key=[] BCBTMeta.data.page={} for(let i=1,ilen=title.length;i<ilen;i++){ BCBTMeta.data.key.push(title[i]) } for(let i=1,ilen=row.length;i<ilen;i++){ let cell=row[i].split("\t") cell=cell.map(function(e){return e.trim()}) if(cell[0]){ let page=cell[0].replace(/^(.)/,function(s){return s.toUpperCase()}) BCBTMeta.data.page[page]=[] for(let j=1,jlen=title.length;j<jlen;j++){ BCBTMeta.data.page[page].push(cell[j]||"") } } } let BCBTdisplay=document.getElementById("BCBTdisplay") BCBTdisplay.innerHTML="" for(let key in BCBTMeta.data.page){ let text="[["+key+"]]" text+="\n\n{{"+(BCBTMeta.data.template?""+BCBTMeta.data.template+"":"<span style='color:red'>请确认模板</span>") for(let i=0,ilen=BCBTMeta.data.key.length;i<ilen;i++){ text+="\n|"+(BCBTMeta.data.key[i]?BCBTMeta.data.key[i]+"=":"")+BCBTMeta.data.page[key][i] } text+="\n}}" let pre=document.createElement("pre") pre.classList.add("col-md-3") pre.dataset.title=key pre.innerHTML=text BCBTdisplay.appendChild(pre) } } document.getElementById("BCBTsubmit").onclick=function(){ if(BCBTMeta.state=="ready"&&confirm("真的确认了吗?")){ document.getElementById("BCBTexcel").readOnly=true BCBTMeta.state="busy" for(let key in BCBTMeta.data.page){ let text="{{"+BCBTMeta.data.template for(let i=0,ilen=BCBTMeta.data.key.length;i<ilen;i++){ text+="\n|"+(BCBTMeta.data.key[i]?BCBTMeta.data.key[i]+"=":"")+BCBTMeta.data.page[key][i] } text+="\n}}" let fd=new FormData() fd.append("action","edit") fd.append("title",key) fd.append("summary","通过批量创建工具创建") fd.append("text",text) fd.append("format","json") BCBTMeta.queue.push(fd) } BCBTFun.checkToken() } } }, "checkToken":function(oToken){ if(!oToken){ getApi("https://wiki.biligame.com"+BCBTMeta.wiki+"/api.php?action=query&meta=tokens&format=json",function(json){ let token=JSON.parse(json).query.tokens.csrftoken BCBTFun.sendFd(token) }) } else{ BCBTFun.sendFd(oToken) } }, "sendFd":function(token){ let url="https://wiki.biligame.com"+BCBTMeta.wiki+"/api.php" let fd=BCBTMeta.queue.shift() try{ fd.append("token",token) postFdApi(url,fd,function(json){ let title=JSON.parse(json).edit.title getApi("https://wiki.biligame.com"+BCBTMeta.wiki+"/"+encodeURIComponent(title),function(){}) document.querySelector("#BCBTdisplay pre[data-title=\""+title+"\"]").classList.add("created") BCBTFun.checkToken(token) }) } catch(e){ document.getElementById("BCBTsubmit").innerHTML="创建完毕,如需再次使用请刷新页面" alert("创建完毕,如需再次使用请刷新页面") } }, } window.addEventListener("load",function(){ BCBTFun.initialize() }) function getApi(url,callback=false,callbackE=false){ let ajax=new XMLHttpRequest() if(!callback){ ajax.open("GET",url,false) ajax.send() let json=JSON.parse(ajax.responseText) return json } ajax.open("GET",url) ajax.send() ajax.onreadystatechange=function(){ if(ajax.readyState==4){ if(ajax.status==200){ callback(ajax.responseText) } else if(ajax.status==404&&callbackE){ callbackE(true) } } } } function postFdApi(url,fd,callback=false,callbackE=false){ let ajax=new XMLHttpRequest() if(!callback){ ajax.open("POST",url,false) ajax.send(fd) let json=JSON.parse(ajax.responseText) return json } ajax.open("POST",url) ajax.send(fd) ajax.onreadystatechange=function(){ if(ajax.readyState==4){ if(ajax.status==200){ callback(ajax.responseText) } else if(ajax.status==404&&callbackE){ callbackE(true) } } } } </script> <style> textarea[readonly]{ color:lightgray; } .created{ background:#5CB85C; } </style> </div>

更新日志

1.0