<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>