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

MediaWiki:Gadget-tikuGuide.js:修订间差异

MediaWiki界面页面
无编辑摘要
无编辑摘要
第566行: 第566行:
             editpage(url,token,templateName,text)
             editpage(url,token,templateName,text)
         }
         }
        alert('生成成功!')
     }else {
     }else {
             alert(text)
             alert(text)
     }
     }
}
}

2023年3月25日 (六) 02:11的版本

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,

    }
    $.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,

    }
    $.ajax({
        url: tikuCreateConfig.url,
        method: "post",
        async: false,
        data: PARAMS,
        timeout: 5000,
        success: function (results){
            isSuccess = results["createentry"]["result"]
        }
    })
    return isSuccess
}
function readlistSetup(token){
    var isSuccess = false
    var PARAMS = {
        "action": "readinglists",
        "format": "json",
        "command": "setup",
        "utf8": 1,
        "token": token,

    }
    $.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
    }
    $.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 readlistEntries(id){
    var isSuccess = false
    var PARAMS = {
        "action": "query",
        "format": "json",
        "list": "readinglistentries",
        "utf8": 1,
        "rlelists": id
    }
    $.ajax({
        url: tikuCreateConfig.url,
        method: "post",
        async: false,
        data: PARAMS,
        timeout: 5000,
        success: function (results){
            isSuccess = results['query']['readinglistentries']
        }
    })
    return isSuccess
}
function readlistEntriesMeta(project,name){
    var isSuccess = false
    var PARAMS = {
        "action": "query",
        "format": "json",
        "list": "readinglistentries",
        "utf8": 1,
        "rlelists": id
    }
    $.ajax({
        url: tikuCreateConfig.url,
        method: "post",
        async: false,
        data: PARAMS,
        timeout: 5000,
        success: function (results){
            isSuccess = results['query']['readinglistentries']
        }
    })
    return isSuccess
}
//编辑页面
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"
    }
    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'
    }
    $.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 = token
                }
            }
        })
    return isSuccess
}


function clean() {
    $('#tiku-guide-container').html('')
}
function dashboardInterface(){
    clean()
    var token = get_token(tikuCreateConfig.url)
    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>')
    }else{
        var enteries = readlistEntries(rls.id)
        for(var i=0;i<enteries.length;i++){
            var template = $('<div id="entry-'+i+'"><div class="entry-header"></div><div class="entry-body"></div><div class="entry-appendix"></div></div><hr>').appendTo($('#myTikuList').children('#body'))
            $('#entry-'+i).children('.entry-header').html('<a href="'+enteries[i].project+enteries[i].title+'"><h4>'+enteries[i].title+'</h4></a>')
            $('#entry-'+i).children('.entry-body').html('<button type="button" id="editEntry-'+i+'")">编辑此目录</button><button type="button" id="delEnrty-'+i+'">移除此条目</button>')
            $('#entry-'+i).children('.entry-appendix').html('<p>加入日期:'+enteries[i].created+'</p>')
            console.log(enteries[i])
            $('#editEntry-'+i).bind('click',{title:enteries[i].title},function (event) {
                var title = event.data.title
                console.log(title)
                createInterface(title)
            })
            $('#delEnrty-'+i).bind('click',{token:token,id:enteries[i].id},function (event) {
                if(confirm('即将从您的列表中去除此条目,此操作不会影响页面内容,确定吗?')){
                    readlistDelEntry(event.data.id,event.data.token)
                }
            })
        }
    }

}
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.id,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()
    })
    if(title!==undefined){
        title='模板:目录-'+title.split(':')[1]
    }
    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)})
    $('#submitIndex').bind('click',function(){submit(true)})
}
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
        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]
            console.log(chapName)
            if(!l.hasOwnProperty(level)){
                l[level] = chapID
            }else if(l[level] !== chapID){
                l[level] = chapID
            }
            for(var n=0;n<level;n++){
                t+='/'+l[(n+1).toString()]
                final += '*'
            }
            console.log(l)
            final += ' '+'{{目录项|'+t+'|'+chapName+'}}\n'
            console.log('{{目录项|'+t+'|'+chapName+'}}\n')
        }
    }
    console.log(final)
    return final
}

//** {{目录项|题库:诊断学学习指导与习题集(第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 = tikuCreateConfig.url
    var token = get_token(url)
    var info = $('#tikuInfo').serializeObject()
    console.log(info)
    var index = pIndex(info.index,info.name)
    console.log(index)
    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}}\n'
    text += '<includeonly>[[分类:' + info.name + ']]</includeonly>'
    text = text.replace(/\r/g,'')
    console.log(text)
    var templateName = '模板:目录-'+info.name
    var tikuName = '题库:'+info.name
    var tikuContent = '{{目录-'+info.name+'}}\n' +
        '[[分类:题库目录]]'
    if (upload){
        var rls = isRLExist(tikuCreateConfig.rl)
        if(confirm('即将开始上传,确认?')){
            if(!getPageRevision(url,tikuName,1).isSuccess){
                editpage(url,token,tikuName,tikuContent)
                readlistCreatEntry(rls.id,tikuCreateConfig.project,tikuName,token)
            }
            editpage(url,token,templateName,text)
        }
        alert('生成成功!')
    }else {
            alert(text)
    }
}