打开/关闭菜单
Toggle preferences menu
打开/关闭个人菜单
未登录
未登录用户的IP地址会在进行任意编辑后公开展示。

MediaWiki:Gadget-tikuGuide.js

MediaWiki界面页面
Cirno.9讨论 | 贡献2022年9月20日 (二) 08:10的版本

注意:在发布之后,您可能需要清除浏览器缓存才能看到所作出的变更的影响。

  • Firefox或Safari:按住Shift的同时单击刷新,或按Ctrl-F5Ctrl-R(Mac为⌘-R
  • Google Chrome:Ctrl-Shift-R(Mac为⌘-Shift-R
  • Internet Explorer或Edge:按住Ctrl的同时单击刷新,或按Ctrl-F5
  • Opera:Ctrl-F5
setTimeout(function(){
	dashboardInterface()
	console.log('interface')
},0)
$.fn.serializeObject = function()
{
    var result = {}
    var a = this.serializeArray()
    console.log(a)
    $.each(a,function (e,t) {
        result[t['name']] = t['value']
    })
    return result
}
jQuery.fn.extend({
    getCurPos: function(){
        var e=$(this).get(0);
        e.focus();
        if(e.selectionStart){    //FF
            return e.selectionStart;
        }
        if(document.selection){    //IE
            var r = document.selection.createRange();
            if (r == null) {
                return e.value.length;
            }
            var re = e.createTextRange();
            var rc = re.duplicate();
            re.moveToBookmark(r.getBookmark());
            rc.setEndPoint('EndToStart', re);
            return rc.text.length;
        }
        return e.value.length;
    },
    setCurPos: function(pos) {
        var e=$(this).get(0);
        e.focus();
        if (e.setSelectionRange) {
            e.setSelectionRange(pos, pos);
        } else if (e.createTextRange) {
            var range = e.createTextRange();
            range.collapse(true);
            range.moveEnd('character', pos);
            range.moveStart('character', pos);
            range.select();
        }
    }
});

tikuCreateConfig = {
    rl:'参与编辑的题库',
    project:'https://www.medforest.cn/dic/',
    url:'https://www.medforest.cn/medf/api.php',
    des:'本列表包含您创建或者参与编辑的题库'
}

function readlistCreat(name,des,token){
    var isSuccess = false
    var PARAMS = {
        "action": "readinglists",
        "format": "json",
        "command": "create",
        "utf8": 1,
        "token": token,
        "name": name,
        "description": des,
        'origin':'*'
    }
    $.ajax({
        url: tikuCreateConfig.url,
        method: "post",
        async: false,
        data: PARAMS,
        timeout: 5000,
        success: function (results){
            var apiResult = results['edit']['result']
            if(apiResult==="Success"){
                isSuccess = [true,results["create"]["result"]]
            }else{
                isSuccess = [false,results["create"]["result"]]
            }
        }
    })
    return isSuccess
}
function readlistCreatEntry(list,project,title,token){
    var isSuccess = false
    var PARAMS = {
        "action": "readinglists",
        "format": "json",
        "command": "createentry",
        "utf8": 1,
        "token": token,
        "list": list,
        "project": project,
        "title": title,
        'origin':'*'
    }
    $.ajax({
        url: tikuCreateConfig.url,
        method: "post",
        async: false,
        data: PARAMS,
        timeout: 5000,
        success: function (results){
            var apiResult = results['edit']['result']
            if(apiResult==="Success"){
                isSuccess = [true,results["create"]["result"]]
            }else{
                isSuccess = [false,results["create"]["result"]]
            }
        }
    })
    return isSuccess
}
function readlistSetup(token){
    var isSuccess = false
    var PARAMS = {
        "action": "readinglists",
        "format": "json",
        "command": "setup",
        "utf8": 1,
        "token": token,
        'origin':'*'
    }
    $.ajax({
        url: tikuCreateConfig.url,
        method: "post",
        async: false,
        data: PARAMS,
        timeout: 5000,
        success: function (results){
            isSuccess = results
        }
    })
    return isSuccess
}
function readlistDelEntry(entry,token){
    var isSuccess = false
    var PARAMS = {
        "action": "readinglists",
        "format": "json",
        "command": "deleteentry",
        "utf8": 1,
        "token": token,
        "entry": entry
    }
    $.ajax({
        url: tikuCreateConfig.url,
        method: "post",
        async: false,
        data: PARAMS,
        timeout: 5000,
        success: function (results){
            if (results["deleteentry"]['result']==="Success"){
                isSuccess = true
            }
        }
    })
    return isSuccess
}
function isRLExist(name){
    var exist = false
    var PARAMS = {
        "action": "query",
        "format": "json",
        "meta": "readinglists",
        "utf8": 1,
        'origin':'*'

    }
    $.ajax({
        url: tikuCreateConfig.url,
        method: "post",
        async: false,
        data: PARAMS,
        timeout: 5000,
        success: function (results){
            var rls = results.query.readinglists
            for(var i=0;i<rls.length;i++){
                var rl = rls[i]
                if(rl.name === name){
                    exist = rl
                }
            }
        }
    })
    return exist
}

function clean() {
    $('#tiku-guide-container').html('')
}
function dashboardInterface(){
    clean()
    var container = $('#tiku-guide-container')
    var html = $('<div id="myTikuList"><div id="header"><div id="heading"></div>' +
        '<div id="actions"><button type="button" id="createTiku">创建一个新题库</button>' +
        '<button type="button" id="addTiku">添加题库到我的列表</button> </div></div><div id="body"></div></div>').appendTo(container)
    $('#createTiku').bind('click',function () {
        createInterface()
    })
    $('#addTiku').bind('click',function () {
        addInterface()
    })
    var rls = isRLExist(tikuCreateConfig.rl)
    if(!rls){
        $('#myTikuList').children('#header').children('#heading').html('<h3>您还没有参与编辑任何题库!</h3>')
    }

}
function addInterface(){
    clean()
    var container = $('#tiku-guide-container')
    $('<button type="button" id="backDashboard">返回</button>').appendTo(container)
    $('#backDashboard').bind('click',function () {
        dashboardInterface()
    })
    var html = $('<div id="addTikuContainer"><div id="header"><div id="heading"><h3>参与编辑一个题库</h3></div>' +
        '<div id="body"><input id="addName" type="text" placeholder="题库名称"><button type="button" id="addTiku">添加</button></div></div>').appendTo(container)
    $('#addTiku').bind('click',function () {
        var inputName = '题库:'+ $('#addName').val()
        var listID = isRLExist(tikuCreateConfig.rl)
        console.log(listID)
        var token = get_token(tikuCreateConfig.url)
        console.log(token)
        if(!listID) {
            alert('你还没有创建您的阅读列表,即将创建并启用')
            readlistSetup(token)
            readlistCreat(tikuCreateConfig.rl, tikuCreateConfig.des, token)
            alert('创建完成')
        }
        var result = readlistCreatEntry(listID,tikuCreateConfig.project,inputName,token)
        alert(result)
    })
}
function createInterface(title){
    clean()
var container = $('#tiku-guide-container')
    $('<button type="button" id="backDashboard">返回</button>').appendTo(container)
    $('#backDashboard').bind('click',function () {
        dashboardInterface()
    })
    var titleContent = resolve(title)
var form = $('<form id="tikuInfo">\n' +
    ' 题库名称:<br>\n' +
    '<input type="text" name="name" value="'+titleContent.name+'">\n' +
    '<br>\n' +
    ' 封面(请先在维基中上传对应封面):<br>\n' +
    '<input type="text" name="cover" value="'+titleContent.cover+'">\n' +
    '<br>\n' +
    ' 发型年份(或者录入时间,默认当前时间):<br>\n' +
    '<input type="text" name="time" value="'+titleContent.time+'">\n' +
    '<br>\n' +
    ' 作者(默认创建者):<br>\n' +
    '<input type="text" name="author" value="'+titleContent.author+'">\n' +
    '<br>\n' +
    ' 出版社:<br>\n' +
    '<input type="text" name="publisher" value="'+titleContent.publisher+'">\n' +
    '<br>\n' +
    ' 备注:<br>\n' +
    '<input type="text" name="ps" value="'+titleContent.ps+'">\n' +
    '<br>\n' +
    '目录信息(一行一个目录项,每行首添加 * 区分层级,章节名称与编号用|区分,示例:* 第一章|绪 论):<br>\n' +
    '<div>' +
    '<select name="level"><option value="*">*</option><option value="**">**</option><option value="***">***</option></select>' +
    '<input name="chapID" type="text" placeholder="章节号"/><input id="chapName" name="chapName" type="text" placeholder="章节名"/>'+
    '<button type="button" id="addIndex">添加到末尾</button>'+
    '</div>' +
    '<textarea name="index" id="indexContainer" placeholder="* 第一章|绪 论\n**第一节|xxX\n* 第二章|222" style="width: 300px;height: 500px"></textarea>\n' +
    '</form> ').appendTo(container)
    $('#indexContainer').val(titleContent.index)
$('<button id="submitIndex">提交</button>').appendTo(container)
    $('<button id="prevIndex">预览</button>').appendTo(container)
    $('#addIndex').bind("click",function (){addIndex()})
    $('#prevIndex').bind('click',function(){submit(false)})
    }
function addIndex(){
    var info = $('#tikuInfo').serializeObject()
    var reg = new RegExp('\\s','g')
    if(reg.test(info.chapID)||reg.test(info.chapName)){
        alert('不能包含空格')
        return false
    }
    var text = info.level + ' ' + info.chapID+'|'+info.chapName +'\n'
    var val = $('#indexContainer').val()
    $('#indexContainer').val(val + text)
    $('#chapName').val('')
    return text
}
function pIndex(text,title){
    console.log(text)
    text = text.split('\n')
    var l = {}
    var final = ''
    for (var i=0;i<text.length;i++){
        var t = '题库:' + title
        console.log(text[i])
        console.log(text[i].split(' '))
        if(text[i].length>0){
            var level = text[i].split(' ')[0].length
            var chapID = text[i].split(' ')[1].split('|')[0]
            var chapName = text[i].split(' ')[1].split('|')[1]
            if(!l.hasOwnProperty(level)){
                l[level] = chapID
            }else if(l[level] !== chapID){
                l[level] = chapID
            }
            for(var n=0;n<level;n++){
                t+='/'+l[level]
                final += '*'
            }
            final += ' '+'{{目录项|'+t+'|'+chapName+'}}\n'
        }
    }
    console.log(final)
    return final
}
function editpage(url,token,title, content,model,tags,summary) {
    model =model !==undefined ?model : 'wikitext'
    tags = tags !== undefined?tags:''
    summary = summary !==undefined?summary:''
    var isSuccess = [false,0]
    var PARAMS = {
        "action": "edit",
        "format": "json",
        "title": title,
        "text": content,
        "token": token,
        'contentmodel':model,
        "summary": summary,
        "tags": tags,
    }
    $.ajax({
        url: url,
        method: "post",
        async: false,
        data: PARAMS,
        timeout: 5000,
        success: function (results){
            var apiResult = results['edit']['result']
            if(apiResult==="Success"){
                isSuccess = [true,results["edit"]["result"]]
                console.log("===editpage_common 成功===")
            }else{
                isSuccess = [false,results["edit"]["result"]]
            }
        },
    })

    return isSuccess
}

//获取某个页面的历史版本
function getPageRevision(url, title, pageCount){
    var PARAMS = {
        "action": "query",
        "format": "json",
        "prop": "revisions",
        "titles": title,
        "utf8": 1,
        "rvprop": "content",
        "rvlimit": pageCount,
        "rvdir": "older",
        'origin':'*',
    }
    var isSuccess = {}
    $.ajax(
        {
            url: url,
            method: "post",
            async: false,
            data: PARAMS,
            timeout: 5000,
            success: function (results){
                if('-1' in results.query.pages){
                    console.log('===无此页面===')
                    isSuccess = {isSuccess:false, result:results}
                }else {
                    isSuccess = {isSuccess:true, result:results}
                }
            }
        })
    return isSuccess
}
function get_token(url,origin){
    var isSuccess = [false, '0']
    var PARAMS = {
        "action": "query",
        "format": "json",
        'meta':'tokens',
        'origin':'*',
    }
    $.ajax(
        {
            url: url,
            method: "post",
            async: false,
            data: PARAMS,
            timeout: 5000,
            success: function (results) {
                var token = results.query.tokens.csrftoken
                if(token.length >= 5){
                    isSuccess = {isSuccess:true,token:token}
                }
            }
        })
    return isSuccess
}
//** {{目录项|题库:诊断学学习指导与习题集(第4版)/第一篇/第一节|第一节 发热}}
function rIndex(text){
    console.log(text)
    if(text.length>0){
        var reg1 = new RegExp('(?<=\\{\\{)(.+?)(?=\\}\\})','g')
        var reg2 = new RegExp('\\{\\{(.+?)\\}\\}','g')
        var content = text.match(reg1)[0]
        text=text.replace(reg2,'')
        var level = text.match(/\*/g).length
        content = content.split('/').slice(-1)
        var finalText = ''
        for(var i=0;i<level;i++){
            finalText+='*'
        }
        finalText+=' '+content+'\n'
        console.log(finalText)
        return finalText
    }else{
        return ''
    }
}
function resolve(title){
    var reg1 = new RegExp('index','g')
    var text = getPageRevision(tikuCreateConfig.url,title,1)
    if(text.isSuccess){
        text = text.result['query']['pages']
        for(var key in text){
            text = text[key]['revisions'][0]['*']
        }
    }else {
        return {'author':'','name':'','cover':'','publisher':'','index':'','ps':'','time':''}
    }

    var start = text.indexOf('{{目录')
    var end = text.lastIndexOf('}}')
    text = text.substring(start,end)
    console.log(start + '|' + end)
    text = text.split('|')
    var resolved = {}
    for(var i=3;i<text.length;i++){
        var line = text[i].split('=')
        if(reg1.test(line[0])){
            var temp = line[1]
            for(var n=i+1;n<text.length;n++){
                temp += '|' + text[n]
            }
            resolved[line[0]] = temp
            break
        }else{
            resolved[line[0]] = line[1]
        }
    }
    var index = resolved.index
    index = index.split('\n')
    var newIndex = ''
    console.log(index)
    for(var m=1;m<index.length;m++){
        newIndex += rIndex(index[m])
    }
    console.log(newIndex)
    resolved.index = newIndex
    console.log(text)
    console.log(resolved)
    return resolved
}
function submit(upload) {
    upload = upload !== undefined ? upload:true
    var url = 'https://www.medforest.cn/api.php'
    var token = get_token(url).token
    var info = $('#tikuInfo').serializeObject()
    console.log(info)
    var index = pIndex(info.index,info.name)
    var text = '{{目录\n' +
        '|display={{{display|}}}\n' +
        '|cover='+info.cover+'\n'+
        '|name='+info.name+'\n'+
        '|author='+info.author+'\n'+
        '|publisher='+info.publisher+'\n'+
        '|time='+info.time+'\n'+
        '|ps='+info.ps+'\n'+
        '|index=\n'+index+'\n}}'
    text += '<includeonly>[[分类:' + info.name + ']]</includeonly>'
    console.log(text)
    var templateName = '模板:目录-'+info.name
    var tikuName = '题库:'+info.name
    var tikuContent = '{{目录-'+info.name+'}}\n' +
        '[[分类:题库目录]]'
    if (upload){
        if(!getPageRevision(url,tikuName,1).isSuccess){
            editpage(false,url,token,tikuName,tikuContent)
        }
        editpage(false,url,token,templateName,text)

    }