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

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

MediaWiki界面页面
无编辑摘要
(导入1个版本)
 
(未显示同一用户的109个中间版本)
第1行: 第1行:
function editThis(id){
editUrl = 'https://www.medforest.cn/medf/api.php'
    $('#'+id).fadeOut(100)
editOrigin = 'https://www.medforest.cn'
     var data = $('.data')
inlineEditorPageText = {}
    var dataLength = data.length
 
     var singleData = $(data[id])
function editThis(id) {
     var singleDataHTML = singleData.html()
$('#'+id).fadeOut('fast')
     console.log(singleData)
     var timuList = gDomTimuList()
     var jsonData = $.parseJSON(singleDataHTML)
console.log(timuList)
     console.log(jsonData)
var order = timuList.order
     var o = eval('newInlineEditor('+id+','+JSON.stringify(jsonData)+').'+jsonData.type+'()')
var timu = timuList.timu
     render(id,jsonData.type,o)
     var dataJSON = timu[id].dataJSON
     console.log('加载题目:'+(id+1)+'/'+dataLength)
     var inputBoxes = loadPreview(dataJSON)
      
     var form = renderPreviewInputBoxes(inputBoxes, id)
     render(id, dataJSON.type, form,'#'+id,true)
    setTimeout(function(){
     $("html,body").animate({scrollTop:$("#edit-"+id).position().top},500)
     },250)
      
}
}
function confirmEdit(id) {
 
    var data = formToJSON('#edit-'+id, true,'s')
function typeOfObj(object){
    console.log(data)
return Object.prototype.toString.call(object);
    var formatedData = formatEditText(data)
    var template = JSONtoTemplate(formatedData)
    console.log(template)
}
}
function processUploadText(pageTitle,replaceText) {
    var latestPageData = getLatestPageRevision('https://www.medforest.cn/medf/api.php',pageTitle)


}
function loadPreview(dataJSON){
function formatEditText(json) {
     var timuJSON = dataJSON
     var result = {}
     console.log(timuJSON)
     var choices = {}
    var order = ['source', 'pos', 'inputbox', 'sourceRange', 'title', 'choices', 'answer', 'explain', 'info']
    for(var i in json){
    var chineseName = {
        var data = formToJSON(i,true,'t')
        'source':'编号'
        if((result.id&&result.type) !== undefined){
        , 'pos':'挖空点符号'
            result.id = data.id
         , 'inputbox':'是否显示输入框'
            result.type = data.type
         , 'sourceRange':'子题目数'
         }
        , 'title':'题目'
         if(data.key==='choices'){
         , 'choices':'选项'
            choices[data.value] = json[i]
        , 'answer':'答案'
         }else {
         , 'explain':'解释'
            result[data.key] = json[i].replace(/\\/g,'\\'+'\\').replace(/"/g,'\\'+'"')
         , 'info':'信息'
         }
         console.log(data)
     }
     }
     JSON.stringify(choices).match(/(?<=\{)([^}]*)(?=\})/g)
     var sametypes = [ 'pos', 'inputbox', 'sourceRange', 'info']
     result.choices = RegExp.$1
     var notsametypes = ['title', 'titlesList', 'optionsDic','optionsList', 'answer', 'answersList', 'explain', 'explainsList']
    console.log(result)
     var inputboxes = {
    return result
        type:timuJSON.type
}
        ,typeHTML:'<input style="display:none" name="edit-type" value="'+timuJSON.type+'">'
function formToJSON(selector,decode,mode) {
         ,source: '<p class="source">'+timuJSON.type+'型题 '+timuJSON.source+'</p><input style="display:none" name="edit-source" value="'+timuJSON.source+'">'
     var result = {}
        ,title:[]
    var data = ''
        ,choices:[]
    if(mode === 's'){
        , answer:[]
         data = $(selector).serialize()
         , explain:[]
    }else if(mode === 't'){
         data = selector
     }
     }
 
     for(var i=0;i<sametypes.length;i++){
    console.log(data)
         if(timuJSON[sametypes[i]]===undefined){
    var dataSplitted = data.split('&')
            continue
     for (var i=0;i<dataSplitted.length;i++){
         }else if(sametypes[i]==='info'){
         var value = dataSplitted[i].split('=')[1]
             inputboxes[sametypes[i]] = textareaGroup(chineseName[sametypes[i]],timuJSON[sametypes[i]],  'edit-'+sametypes[i])
        var key = dataSplitted[i].split('=')[0]
        }else{
         if(decode===true){
             inputboxes[sametypes[i]] = inputGroup(chineseName[sametypes[i]],timuJSON[sametypes[i]],  'edit-'+sametypes[i])
             key = decodeURIComponent(key)
             value = decodeURIComponent(value)
         }
         }
         result[key] = value
          
     }
     }
    return result
 
}
     //处理题目
function JSONtoTemplate(json, templateName) {
     var isTitleList = typeOfObj(timuJSON.title)==='[object Array]' ? true:false
    var order = ['source','inputbox','sourceRange','title','choices','answer','explain','info']
     var titles = !isTitleList ? [timuJSON.title] : timuJSON.title
     // var result = '{{'+templateName +'\n'
     console.log(titles )
     var result = ''
     inputboxes.titlesNum = titles.length
    for(var i=0;i<order.length;i++){
    for(var i=0;i<titles.length;i++){
        if (json[order[i]]!==undefined){
         inputboxes.title.push(textareaGroup(chineseName['title'],titles[i], 'edit-title-'+i))
            result += '|' + order[i] + '=' + json[order[i]].replace('\n') + '\n'
        }
    }
    // result += '}}\n\n'
    return result
}
function submitAction(){}
function newInlineEditor(id,json,hideButton,addHr,parent){
    parent = parent !== undefined ? parent : ''
    // addHr = addHr !== undefined ? addHr : true
     hideButton = hideButton !== undefined ? hideButton : false
     var type = json.type
    var o = new Object()
     o.temp = {
        main:$('<form id="edit-'+id+'" class="type'+type+' timuEditContainer"></form>'),
        subject:$('<div class="subject"></div>'),
        range:$('<div class="sourceRange"></div>'),
        info:$('<textarea name="id='+id+'&type='+type+'&key=info" class="info oo-ui-inputWidget-input"></textarea>'),
         titleCon:$('<div class="titleContainer"></div>'),
        source:$('<p class="source"></p>'),
        title:$('<textarea name="id='+id+'&type='+type+'&key=title" class="title-edit oo-ui-inputWidget-input" ></textarea>'),
        options:$('<div class="options"></div>'),
        btn:$('<button onclick="submitAction();return false;" class="button-small button-pill button button-caution" id="showSingle-' + id + '" class="showSingleBtn">确认更改</button>'),
        ansCon:$('<div id="ansContainer" class="ansContainer"></div>'),
        correct:$('<p style="display:inline;"><b>正确答案:</b></p><textarea name="id='+id+'&type='+type+'&key=answer" class="correctAnswer oo-ui-inputWidget-input"></textarea><br>'),
        explain:$('<p style="display:inline;"><b>解析: </b></p><textarea name="id='+id+'&type='+type+'&key=explain" class="explain oo-ui-inputWidget-input"></textarea><br>'),
        select:$('<select class="button-small button-rounded button"></select>'),
        subTitle:$('<div id=""></div>')
    }
    o.hideButton = hideButton
    o.parent = parent
    if(type!=='A3'&&type!=='PD'){
        o.temp.btn.bind("click",function (){
            confirmEdit(id)
        })
     }
     }


     o.A = function () {
     //处理答案
        this.temp.source.text(json.source)
    var isAnswerList = typeOfObj(timuJSON.answer)==='[object Array]' ? true:false
        this.temp.title.html(json.title)
    var answers = !isAnswerList ? [timuJSON.answer] :  timuJSON.answer
        this.temp.correct.nextAll('.correctAnswer').val(json.answer)
    console.log(answers)
        this.temp.explain.nextAll('.explain').val(json.explain)
    inputboxes.answersNum = answers.length
        var options = formatAnsDic(json.choices)
    for(var i=0;i<inputboxes.titlesNum;i++){//此处以题目数为准,有几个题目生成几个答案和解释框
        for(var k in options) {
    var answerText = answers[i]===undefined?'':answers[i]
            var label = '<label id="' + k + '">'+k+':<input class="oo-ui-inputWidget-input" name="id='+id+'&type='+type+'&key=choices&value='+ k +'"  class="options-edit" type="text" value="' + options[k] + '" /></label>'
         inputboxes.answer.push(inputGroup(chineseName['answer'],answerText, 'edit-answer-'+i))
            this.temp.options.append(label)
         }
        this.temp.titleCon.append(this.temp.source,this.temp.title)
        this.temp.ansCon.append(this.temp.correct,this.temp.explain)
        this.temp.subject.append(this.temp.titleCon,this.temp.options)
        this.temp.main.append(this.temp.subject,this.temp.ansCon)
        if(!hideButton){this.temp.main.append(this.temp.btn)}
        if(addHr){this.temp.main.append('<hr>')}
        return this.temp.main
     }
     }
    o.A3 = function () {
        var subIDs = []
        var s = json.source*1;var e = json.source*1+json.sourceRange*1 -1
        this.temp.range.text('第 '+s+' 到 '+e+' 题')
        for(var i=0;i<json.title.length;i++){
            subIDs.push(id+'-'+i)
            if(json.explain[i]==undefined){
                json.explain[i] = '暂无解析'
            }
            var data = {
                "type":"A",
                "source":json.source+'-'+(i+1),
                "title":json.title[i],
                "answer":json.answer[i],
                "explain":json.explain[i],
                "choices":json.choices[i],
            }
            var newA = newTimu(id+'-'+i,data,true,false).A()
            render(id+'-'+i,'A',newA,this.temp.titleCon)
        }
        o.temp.btn.bind("click",function (){
            showChoiceAnswer(subIDs,type,json.answer)
        })
        this.temp.info.text(json.info)
        this.temp.subject.append(this.temp.range,this.temp.info,this.temp.titleCon)
        if(!hideButton){this.temp.main.append(this.temp.btn)}
        this.temp.main.append(this.temp.subject)


        if(addHr){this.temp.main.append('<hr>')}
    //处理解释
         return this.temp.main
    var isExplainList = typeOfObj(timuJSON.explain)==='[object Array]' ? true:false
    var explains = !isExplainList ? [timuJSON.explain] :  timuJSON.explain
    console.log(explains)
    inputboxes.explainsNum = explains.length
    for(var i=0;i<inputboxes.titlesNum;i++){//此处以题目数为准,有几个题目生成几个答案和解释框
    var explainText = explains[i]===undefined?'':explains[i]
         inputboxes.explain.push(textareaGroup(chineseName['explain'],explainText, 'edit-explain-'+i))
     }
     }
    o.B = function () {
        var s = json.source*1;var e = json.source*1+json.sourceRange*1 -1
        this.temp.range.text('第 '+s+' 到 '+e+' 题')


        var options = formatAnsDic(json.choices)
    //处理选项
         for(var k in options){
    var isOptionList = typeOfObj(timuJSON.choices)==='[object Array]' ? true:false
             var label = '<li id="'+k+'">'+k+':<input name="singelChoice-' + id +'-'+ k +'"  class="options-edit" type="text" value="' + options[k] + '" /></li>'
    var options = !isOptionList ? [timuJSON.choices] :  timuJSON.choices
            this.temp.options.append(label)
    console.log(options)
            this.temp.select.append('<option value="'+k+'">'+k+'</option>')
    for(var i=0;i<options.length;i++){
        var dic = options[i]
         for(var k in dic){
             options[i][k] = inputGroup(chineseName['choices']+' '+k,options[i][k], 'edit-choice-'+i+'-'+k)
         }
         }
        for(var i=0;i<json.title.length;i++){
            var reg1 = /\(\)/g
            var text = '<textarea name="title-'+id+'-'+i+'" class="title-edit oo-ui-inputWidget-input" >'+json.title[i]+'</textarea>'
            this.temp.subTitle.attr('id',id+'-'+i)
            this.temp.source.text(s+i)
            this.temp.subTitle.html(this.temp.source.prop("outerHTML")+text)
            this.temp.titleCon.append(this.temp.subTitle.prop("outerHTML"))
        }
        for(var i=0;i<json.answer.length;i++){
            this.temp.correct.nextAll('.correctAnswer').append('<p id="ans-'+id +'-'+i+'">'+(id+i)+':'+json.answer[i]+'</p>')
        }
        for(var i=0;i<json.explain.length;i++){
            this.temp.explain.nextAll('.explain').append('<p id="exp-'+id +'-'+i+'">'+(id+i)+':'+json.explain[i]+'</p>')
        }
        this.temp.subject.append(this.temp.range,this.temp.options,this.temp.titleCon)
        this.temp.ansCon.append(this.temp.correct,this.temp.explain)
        this.temp.main.append(this.temp.subject,this.temp.ansCon)
        if(!hideButton){this.temp.main.append(this.temp.btn)}
        if(addHr){this.temp.main.append('<hr>')}
        return this.temp.main
     }
     }
     o.C = function () {
     //检测是否有选项,如果没有则不加
        var s = json.source*1;var e = json.source*1+json.sourceRange*1 -1
    if(options.length>0){
        this.temp.range.text('第 '+s+' 到 '+e+' 题')
    inputboxes.choices = options
    }
   
    console.log(inputboxes)


        var options = formatAnsDic(json.choices)
    return inputboxes
        for(var k in options){
}
            var label = '<li id="'+k+'">'+k+':<input name="singelChoice-' + id +'-'+ k +'"  class="options-edit" type="text" value="' + options[k] + '" /></li>'
            this.temp.options.append(label)
            this.temp.select.append('<option value="'+k+'">'+k+'</option>')
        }
        for(var i=0;i<json.title.length;i++){
            var reg1 = /\(\)/g
            var text = '<textarea name="title-'+id+'-'+i+'" class="title-edit oo-ui-inputWidget-input" >'+json.title[i]+'</textarea>'
            this.temp.subTitle.attr('id',id+'-'+i)
            this.temp.source.text(s+i)
            this.temp.subTitle.html(this.temp.source.prop("outerHTML")+text)
            this.temp.titleCon.append(this.temp.subTitle.prop("outerHTML"))
        }
        for(var i=0;i<json.answer.length;i++){
            this.temp.correct.nextAll('.correctAnswer').append('<p id="ans-'+id +'-'+i+'">'+(id+i)+':'+json.answer[i]+'</p>')
        }
        for(var i=0;i<json.explain.length;i++){
            this.temp.explain.nextAll('.explain').append('<p id="exp-'+id +'-'+i+'">'+(id+i)+':'+json.explain[i]+'</p>')
        }


        this.temp.subject.append(this.temp.range,this.temp.titleCon,this.temp.options)
function inputGroup(label, value, name, id, classes , placeholder){
        this.temp.ansCon.append(this.temp.correct,this.temp.explain)
id = id === undefined ?'':id
        this.temp.main.append(this.temp.subject,this.temp.ansCon)
classes = classes ===undefined ?'':classes
         if(!hideButton){this.temp.main.append(this.temp.btn)}
placeholder = placeholder===undefined ? '':placeholder
        if(addHr){this.temp.main.append('<hr>')}
    return $('<div class="mb-1">'+
         return this.temp.main
    '<div class="input-group">'+
    '<div class="input-group-prepend">'+
    ' <div class="input-group-text"><b>'+label+'</b></div>'+
    '</div>'+
    '<input type="text" class="m-0 form-control '+classes+'" id="'+id+'" name="'+name+'" style="height:25px" placeholder="'+ placeholder +'" value="'+value+'">'+
    '</div>'+
    '</div>')
}
function textareaGroup(label, value, name, id, classes){
id = id === undefined ?'':id
classes = classes ===undefined ?'':classes
    return $('<div class="mb-1"><div class="input-group">'+
    '<div class="input-group-prepend">'+
      '<span class="input-group-text"><b>'+label+'</b></span>'+
    '</div>'+
         '<textarea class="form-control" '+classes+'" id="'+id+'" name="'+name+'">'+value+'</textarea>'+
    '</div></div>')
}
function renderPreviewInputBoxes(inputBoxes,id){
console.log(id,inputBoxes)
    var form = $('<form id="edit-'+id+'" name="edit-'+id+'"><input name="edit-titleCount" style="display:none" value="'+inputBoxes.titlesNum+'">'+
    '<br>正在编辑:</form>')
    console.log(form)
    var sametypes = ['typeHTML','source','pos', 'inputbox', 'sourceRange', 'info']
    var differenttypes = ['title', 'choices', 'answer', 'explain']
    for(var i=0;i<sametypes.length;i++){
         form.append(inputBoxes[sametypes[i]])
     }
     }
     o.X = function () {
     if('B,C'.includes(inputBoxes.type)){
        this.temp.source.text(json.source)
         for(var i in inputBoxes.choices){
        this.temp.title.text(json.title)
            console.log(i)
         this.temp.correct.nextAll('.correctAnswer').text(json.answer)
            for(k in inputBoxes.choices[i]){
        this.temp.explain.nextAll('.correctAnswer').text(json.explain)
              form.append(inputBoxes.choices[i][k]
        var options = formatAnsDic(json.choices)
             }
        for(var k in options){
            var label = '<label id="'+k+'">'+k+':<input name="singelChoice-' + id +'-'+ k +'" type="text" class="options-edit" value="' + options[k] + '" /></label>'
             this.temp.options.append(label)
         }
         }
        this.temp.titleCon.append(this.temp.source,this.temp.title)
        this.temp.ansCon.append(this.temp.correct,this.temp.explain)
        this.temp.subject.append(this.temp.titleCon,this.temp.options)
        this.temp.main.append(this.temp.subject,this.temp.ansCon)
        if(!hideButton){this.temp.main.append(this.temp.btn)}
        if(addHr){this.temp.main.append('<hr>')}
        return this.temp.main
     }
     }
     o.PD = function () {
     for(var i=0;i<inputBoxes.titlesNum;i++){
        this.temp.source.text(json.source)
        var card =  
        this.temp.title.text(json.title)
            $('<div class="card mt-2">'+
         this.temp.explain.nextAll('.correctAnswer').text(json.explain)
                '<div class="card-body p-2">'+
        var ans = ''
                '</div>'+
         if(json.answer=='T' || json.answer=='正确' || json.answer=='1' || json.answer=='√'){
            '</div>')
             ans = '正确'
if(inputBoxes.titlesNum>1){
        }else if(json.answer=='F' || json.answer=='错误' || json.answer=='0' || json.answer=='×'){
card.children('.card-body').append('<h6 class="card-title m-1">子题目-'+(i+1)+'</h5>')
             ans = '错误'
}
         card.children('.card-body').append(inputBoxes.title[i])
         if('A,A2,A3,X'.includes(inputBoxes.type)){
             for(k in inputBoxes.choices[i]){
                card.children('.card-body').append(inputBoxes.choices[i][k])
             }
         }
         }
         this.temp.correct.nextAll('.correctAnswer').text(ans)
         card.children('.card-body').append(inputBoxes.answer[i])
         o.temp.btn.bind("click",function (){
         card.children('.card-body').append(inputBoxes.explain[i])
            showChoiceAnswer(id,'A',ans)
         form.append(card)
        })
        this.temp.options.append('<label id="正确" style="display: inline;"><input name="singelChoice-'+id+'" type="radio" value="正确" />正确</label>' +
            '<label id="错误" style="display: inline;"><input name="singelChoice-'+id+'" type="radio" value="错误" />错误</label>')
        this.temp.titleCon.append(this.temp.source,this.temp.title)
        this.temp.ansCon.append(this.temp.correct,this.temp.explain)
         this.temp.subject.append(this.temp.titleCon,this.temp.options)
        if(!hideButton){this.temp.main.append(this.temp.btn)}
        this.temp.main.append(this.temp.subject,this.temp.ansCon)
 
        if(addHr){this.temp.main.append('<hr>')}
        return this.temp.main
     }
     }
     o.TK = function () {
     var submitBtn = new OO.ui.ButtonWidget( {
        this.temp.source.text(json.source)
label: '提交',
        var form = $('<form id="form-'+id+'" class="title"></form>')
flags: [
        var pos = json.pos
'primary',
        var posReg = new RegExp(pos,'g')
'progressive'
        var posCount = json.title.match(posReg).length
]
        for(var i=0;i<posCount;i++){
} )
            json.title = json.title.replace(pos,'<input name="'+id+'-'+i+'" id="'+id+'-'+i+'" type="text" form="form-'+id+'"/>')
var cancelBtn = new OO.ui.ButtonWidget( {
        }
label: '取消',
        form.html(json.title)
flags: [
        this.temp.title.text(json.title)
'destructive'
        this.temp.correct.nextAll('.correctAnswer').text(json.answer)
]
        this.temp.explain.nextAll('.correctAnswer').text(json.explain)
} )
submitBtn.$element.bind('click',function(){confirmEditAndCheckDifference(id)})
cancelBtn.$element.bind('click',function(){cancelEdit(id)})
var btns = $('<div class="m-1"></div>')
btns.append(submitBtn.$element, cancelBtn.$element)
form.append(btns,'<hr>')
    console.log(form)
    return form
}
function cancelEdit(id){
$('#'+id).fadeIn('fast')
$('#edit-'+id).fadeOut('fast')
setTimeout(function(){
    $("html,body").animate({scrollTop:$("#"+id).position().top},500)
    },250)
}
function confirmEditAndCheckDifference(id){
var formatedData = formatEditText(id)
var oldData = gDomTimuList().timu[id].dataJSON
var compareChanges = findChangedItem(oldData,formatedData )
console.log(formatedData, oldData, compareChanges)
var afterEditWikiText = JSONtoTemplate(formatedData)
console.log(afterEditWikiText)
var namespace = $('.mw-page-title-namespace').text()===''?'':$('.mw-page-title-namespace').text()+':'
var pageName = namespace+$('.mw-page-title-main').text()
//设置弹出框按钮功能
var processDialog = newProcessDialog()
var MyProcessDialog = processDialog.MyProcessDialog
$('.oo-ui-windowManager').remove()
var windowManager = new OO.ui.WindowManager();
$( document.body ).append( windowManager.$element );
MyProcessDialog.prototype.getActionProcess = function ( action ) {
    var dialog = this;
    if( action === 'submit'){
    submitChange(pageName,afterEditWikiText)
    }
    if ( action ) {
        return new OO.ui.Process( function () {
            dialog.close( { action: action } );
        } );
    }
    return MyProcessDialog.super.prototype.getActionProcess.call( this, action );
};
openWindows(MyProcessDialog,windowManager)
//获取页面内容


        this.temp.titleCon.append(this.temp.source,form)
getOriginalText(pageName,formatedData)
        this.temp.ansCon.append(this.temp.correct,this.temp.explain)
$('#newWikiText').html('<pre>'+afterEditWikiText+'</pre>')
        this.temp.subject.append(this.temp.titleCon,this.temp.options)
        if(!hideButton){this.temp.main.append(this.temp.btn)}
        this.temp.main.append(this.temp.subject,this.temp.ansCon)
 
        if(addHr){this.temp.main.append('<hr>')}
        return this.temp.main
    }
    o.MJ = function () {
        this.temp.source.text(json.source)
        this.temp.title.html(json.title + '<span class="blur" tabindex="0" style="display:inline;outline=0;" onclick="">' + json.answer +'</span>')
        this.temp.titleCon.append(this.temp.source,this.temp.title)
        this.temp.subject.append(this.temp.titleCon,this.temp.options)
        this.temp.main.append(this.temp.subject)
 
        if(addHr){this.temp.main.append('<hr>')}
        return this.temp.main
    }
    return o
}
}
 
function getOriginalText(pageTitle, timuData, editedText) {
//获取某个页面的历史版本
var api = new mw.Api();
function getPageRevision(url, title, pageCount){
api.get( {
pageCount = pageCount !== undefined ? pageCount :1
    var PARAMS = {
         "action": "query",
         "action": "query",
         "format": "json",
         "format": "json",
         "prop": "revisions",
         "prop": "revisions",
         "titles": title,
         "titles": pageTitle,
         "utf8": 1,
         "utf8": 1,
         "rvprop": "content",
         "rvprop": "content",
         "rvlimit": pageCount,
         "rvlimit": 1,
         "rvdir": "older",
        "rvslots": "*",
         'origin':origin,
         "rvdir": "older"
    } ).done( function ( data ) {
    var pages = data.query.pages
    console.log( data );
    if(pages[-1]===undefined){
    var wikitext = ''
    for(var i in pages){wikitext = pages[i].revisions[0].slots.main['*']}
    console.log(wikitext)
    var regMatchInner = new RegExp('(?<=\\{\\{' + timuData.type + '型题\\n\\|source=' + timuData.source + '\\n)[^}}]*(?=\\}\\}?)', 'g')
    var regMatchFull = new RegExp('(\\{\\{' + timuData.type + '型题\\n\\|source=' + timuData.source + '\\n)[^}}]*(\\}\\})', 'g')
   
    console.log(regMatchInner)
    var inner = wikitext.match(regMatchInner)
    sInnerMatchList(inner)
    console.log(inner)
var options = $('<div></div>')
if(inner.length>0){
for(var i=0;i<inner.length;i++){
if(i===0){
options.append($('<label style="display: flex;"><input checked type="radio" style="margin-right:5px" name="multiMatchInner" value="'+i+'"><pre>'+inner[i]+'</pre></label>'))
}else{
options.append($('<label style="display: flex;"><input type="radio" style="margin-right:5px" name="multiMatchInner" value="'+i+'"><pre>'+inner[i]+'</pre></label>'))
}
}
}
    $('#oldWikiText').html(options)
    }
   
} );
   
}
function submitChange(pageTitle,newText){
var selectedOldText = gInnerMatchList()[$('input:radio[name="multiMatchInner"]:checked').val()]
console.log(selectedOldText)
new mw.Api().edit(
    pageTitle,
    function ( revision ) {
         return {
            text: revision.content.replace( selectedOldText, newText ),
            summary: newText+'替换'+selectedOldText,
            tags:"tiku-inline-editor"
        };
    }
)
.then( function () {
alertDialog('成功',"编辑成功",'三秒后将自动刷新页面',false)
setTimeout(function(){location.reload()},3000)
    console.log( 'Saved!' );
} );
}
function findChangedItem(oldObj, newObj ){
var lenOld = dicLen(oldObj)
var lenNew = dicLen(newObj)
var result = []
for(var i in oldObj){
if(newObj[i] === undefined){
result.push({key:i,status:'deleted'})
}
if(oldObj[i]!==newObj[i]){
result.push({key:i,status:'changed'})
}
}
for(var i in newObj){
if(oldObj[i] === undefined){
result.push({key:i,status:'new'})
}
}
return result
}
function newProcessDialog(){
// Example: Creating and opening a process dialog window.
MyProcessDialog = function ( config ) {
    MyProcessDialog.super.call( this, config );
}
OO.inheritClass( MyProcessDialog, OO.ui.ProcessDialog );
MyProcessDialog.static.name = 'myProcessDialog';
MyProcessDialog.static.title = '上传前检查';
MyProcessDialog.static.actions = [
    { action: 'submit', label: '确认提交', flags: [ 'primary', 'progressive' ] },
    { label: '返回', flags: 'safe' }
];
MyProcessDialog.static.size='full'
MyProcessDialog.prototype.initialize = function () {
    MyProcessDialog.super.prototype.initialize.apply( this, arguments );
    this.content = new OO.ui.PanelLayout( { padded: true, expanded: false } );
    this.content.$element.append( '<div id="process-header"></div><div id="process-content"><h3>编辑前的文本(如有多个可能是编号相同,请选择与本题相应文本)</h3><form id="oldWikiText"></form><h3>编辑后</h3><div id="newWikiText"></div></div><div id="process-append"></div>' );
    this.$body.append( this.content.$element );
};
 
return {MyProcessDialog:MyProcessDialog}
}
function openWindows(MyProcessDialog,windowManager){
var dialog = new MyProcessDialog();
windowManager.addWindows( [ dialog ] );
windowManager.openWindow( dialog );
return windowManager
}
function formatEditText(id) {
var formData = formToJSON($('#edit-'+id),true)
var titleCount = formData['edit-titleCount']*1
console.log(titleCount,formData)
var sametypes = [ 'type','source','pos', 'inputbox', 'sourceRange', 'info']
var result = {
titlesList:[],
answersList:[],
explainsList:[],
}
for(var i=0;i<sametypes.length;i++){
if(formData['edit-'+sametypes[i]]!==undefined){
result[sametypes[i]] = formData['edit-'+sametypes[i]]
}
}
//处理title,answers,explain
for(var i=0;i<titleCount;i++){
result.titlesList.push(formData['edit-title-'+i])
result.answersList.push(formData['edit-answer-'+i])
result.explainsList.push(formData['edit-explain-'+i])
}
result.title = arrayToString(result.titlesList, false)
result.answer = arrayToString(result.answersList, false)
result.explain = arrayToString(result.explainsList, false)
//处理选项
console.log(getItemByPrefix(formData,'edit-choice-',true))
if(dicLen(getItemByPrefix(formData,'edit-choice-',true))>0){
result.choicesDicList=[],
result.choicesTextList=[],
result.choices=''
for(var i=0;i<titleCount;i++){
var optionsRelatedToThis = getItemByPrefix(formData,'edit-choice-'+i+'-',true)
result.choicesDicList.push(optionsRelatedToThis)
console.log(formData.type)
if(formData['edit-type']==='A3'){
result.choicesTextList.push('{'+JSON.stringify(optionsRelatedToThis).match(RegExp(/(?<=\{).+(?=\})/))[0]+'}')
}else{
console.log(JSON.stringify(optionsRelatedToThis))
result.choicesTextList.push(JSON.stringify(optionsRelatedToThis).match(RegExp(/(?<=\{).+(?=\})/))[0])
}
}
result.choices =  arrayToString(result.choicesTextList,false)
}
console.log(result)
return result
}
function getItemByPrefix(obj, prefix, removePrefix){
var result = {}
for(var key in obj){
if(key.includes(prefix)){
if(removePrefix){
result[key.replace(prefix,'')] = obj[key]
}else{
result[key] = obj[key]
}
}
}
return result
}
function arrayToString(array,needQuote){
needQuote = needQuote===undefined?'':needQuote
  if(needQuote){
    return '"' +  array.join('","') + '"'
  }
  return array.join(',')
}
 
 
 
function dicValueToList(obj) {
    var result = []
    for (var i in obj) {
        result.push(obj[i])
     }
     }
     var isSuccess = {}
     return result
     $.ajax(
}
        {
 
            url: url,
function formToJSON (selector, decode) {
            method: "post",
  var result = {}
            async: false,
  var data
            data: PARAMS,
  if (typeof selector === 'object') {
            timeout: 5000,
     data = selector.serialize()
            success: function (results){
  } else {
                if('-1' in results.query.pages){
    data = $(selector).serialize()
                    console.log('===无此页面===')
  }
                    isSuccess = {isSuccess:false, result:results}
 
                }else {
  var dataSplitted = data.split('&')
                    isSuccess = {isSuccess:true, result:results}
  for (var i = 0; i < dataSplitted.length; i++) {
                }
    var value = dataSplitted[i].split('=')[1]
            }
    if (decode === true) {
        })
      value = decodeURIComponent(value)
    return isSuccess
    }
    result[dataSplitted[i].split('=')[0]] = value
  }
  return result
}
}
function getLatestPageRevision(url, title) {
 
     var pages = getPageRevision(url,title,1)
function JSONtoTemplate(json, templateName) {
     if (pages.isSuccess) {
     var order = ['pos', 'inputbox', 'sourceRange', 'title', 'choices', 'answer', 'explain', 'info']
         pages = pages.result.query.pages
    // var result = '{{'+templateName +'\n'
        for (var key in pages) {
    var result = ''
             var page = pages[key].revisions[0]['*']
     for (var i = 0; i < order.length; i++) {
         if (json[order[i]] !== undefined) {
             result += '|' + order[i] + '=' + json[order[i]].replace('\n') + '\n'
         }
         }
        return page
    }else {
        return false
     }
     }
    // result += '}}\n\n'
    return result
}
function alertDialog(title, message, btnLabel, disabled){
    var messageDialog = new OO.ui.MessageDialog();
    var windowManager = new OO.ui.WindowManager();
    $( 'body' ).append( windowManager.$element );
    windowManager.addWindows( [ messageDialog ] );
    windowManager.openWindow( messageDialog, {
        title:title,
        message: message,
        actions: [
            {
            action: 'accept',
            label:  btnLabel,
            flags: 'primary',
            disabled: disabled,
            }
        ]
        });
    return windowManager
}
function sInnerMatchList(obj){
sessionStorage.setItem("edit-innerMatchList", JSON.stringify(obj));
}
function gInnerMatchList(){
return JSON.parse(sessionStorage.getItem("edit-innerMatchList"));
}
}

2023年6月29日 (四) 15:04的最新版本

editUrl = 'https://www.medforest.cn/medf/api.php'
editOrigin = 'https://www.medforest.cn'
inlineEditorPageText = {}

function editThis(id) {
	$('#'+id).fadeOut('fast')
    var timuList = gDomTimuList()
	console.log(timuList)
	var order = timuList.order
	var timu = timuList.timu
    var dataJSON = timu[id].dataJSON
    var inputBoxes = loadPreview(dataJSON)
    
    var form = renderPreviewInputBoxes(inputBoxes, id)
    render(id, dataJSON.type, form,'#'+id,true)
    setTimeout(function(){
    $("html,body").animate({scrollTop:$("#edit-"+id).position().top},500)	
    },250)
    
}

function typeOfObj(object){
	return Object.prototype.toString.call(object);
}

function loadPreview(dataJSON){
    var timuJSON = dataJSON
    console.log(timuJSON)
    var order = ['source', 'pos', 'inputbox', 'sourceRange', 'title', 'choices', 'answer', 'explain', 'info']
    var chineseName = {
        'source':'编号'
        , 'pos':'挖空点符号'
        , 'inputbox':'是否显示输入框'
        , 'sourceRange':'子题目数'
        , 'title':'题目'
        , 'choices':'选项'
        , 'answer':'答案'
        , 'explain':'解释'
        , 'info':'信息'
    }
    var sametypes = [ 'pos', 'inputbox', 'sourceRange', 'info']
    var notsametypes = ['title', 'titlesList', 'optionsDic','optionsList', 'answer', 'answersList', 'explain', 'explainsList']
    var inputboxes = {
        type:timuJSON.type
        ,typeHTML:'<input style="display:none" name="edit-type" value="'+timuJSON.type+'">'
        ,source: '<p class="source">'+timuJSON.type+'型题 '+timuJSON.source+'</p><input style="display:none" name="edit-source" value="'+timuJSON.source+'">'
        ,title:[]
        ,choices:[]
        , answer:[]
        , explain:[]
    }
    for(var i=0;i<sametypes.length;i++){
        if(timuJSON[sametypes[i]]===undefined){
            continue
        }else if(sametypes[i]==='info'){
            inputboxes[sametypes[i]] = textareaGroup(chineseName[sametypes[i]],timuJSON[sametypes[i]],  'edit-'+sametypes[i])
        }else{
            inputboxes[sametypes[i]] = inputGroup(chineseName[sametypes[i]],timuJSON[sametypes[i]],  'edit-'+sametypes[i])
        }
        
    }

    //处理题目
    var isTitleList = typeOfObj(timuJSON.title)==='[object Array]' ? true:false
    var titles = !isTitleList ? [timuJSON.title] :  timuJSON.title
    console.log(titles )
    inputboxes.titlesNum = titles.length
    for(var i=0;i<titles.length;i++){
        inputboxes.title.push(textareaGroup(chineseName['title'],titles[i], 'edit-title-'+i))
    }

    //处理答案
    var isAnswerList = typeOfObj(timuJSON.answer)==='[object Array]' ? true:false
    var answers = !isAnswerList ? [timuJSON.answer] :  timuJSON.answer
    console.log(answers)
    inputboxes.answersNum = answers.length
    for(var i=0;i<inputboxes.titlesNum;i++){//此处以题目数为准,有几个题目生成几个答案和解释框
    	var answerText = answers[i]===undefined?'':answers[i]
        inputboxes.answer.push(inputGroup(chineseName['answer'],answerText, 'edit-answer-'+i))
    }

    //处理解释
    var isExplainList = typeOfObj(timuJSON.explain)==='[object Array]' ? true:false
    var explains = !isExplainList ? [timuJSON.explain] :  timuJSON.explain
    console.log(explains)
    inputboxes.explainsNum = explains.length
    for(var i=0;i<inputboxes.titlesNum;i++){//此处以题目数为准,有几个题目生成几个答案和解释框
    	var explainText = explains[i]===undefined?'':explains[i]
        inputboxes.explain.push(textareaGroup(chineseName['explain'],explainText, 'edit-explain-'+i))
    }

    //处理选项
    var isOptionList = typeOfObj(timuJSON.choices)==='[object Array]' ? true:false
    var options = !isOptionList ? [timuJSON.choices] :  timuJSON.choices
    console.log(options)
    for(var i=0;i<options.length;i++){
        var dic = options[i]
        for(var k in dic){
            options[i][k] = inputGroup(chineseName['choices']+' '+k,options[i][k], 'edit-choice-'+i+'-'+k)
        }
    }
    //检测是否有选项,如果没有则不加
    if(options.length>0){
    	inputboxes.choices = options
    }
    
    console.log(inputboxes)

    return inputboxes
}

function inputGroup(label, value, name, id, classes , placeholder){
	id = id === undefined ?'':id
	classes = classes ===undefined ?'':classes
	placeholder = placeholder===undefined ? '':placeholder
    return $('<div class="mb-1">'+
    '<div class="input-group">'+
    '<div class="input-group-prepend">'+
    ' <div class="input-group-text"><b>'+label+'</b></div>'+
    '</div>'+
    '<input type="text" class="m-0 form-control '+classes+'" id="'+id+'" name="'+name+'" style="height:25px" placeholder="'+ placeholder +'" value="'+value+'">'+
    '</div>'+
    '</div>')
}
function textareaGroup(label, value, name, id, classes){
	id = id === undefined ?'':id
	classes = classes ===undefined ?'':classes
    return $('<div class="mb-1"><div class="input-group">'+
    '<div class="input-group-prepend">'+
      '<span class="input-group-text"><b>'+label+'</b></span>'+
    '</div>'+
        '<textarea class="form-control" '+classes+'" id="'+id+'" name="'+name+'">'+value+'</textarea>'+
    '</div></div>')
}
function renderPreviewInputBoxes(inputBoxes,id){
	console.log(id,inputBoxes)
    var form = $('<form id="edit-'+id+'" name="edit-'+id+'"><input name="edit-titleCount" style="display:none" value="'+inputBoxes.titlesNum+'">'+
    '<br>正在编辑:</form>')
    console.log(form)
    var sametypes = ['typeHTML','source','pos', 'inputbox', 'sourceRange', 'info']
    var differenttypes = ['title', 'choices', 'answer', 'explain']
    for(var i=0;i<sametypes.length;i++){
        form.append(inputBoxes[sametypes[i]])
    }
    if('B,C'.includes(inputBoxes.type)){
        for(var i in inputBoxes.choices){
            console.log(i)
            for(k in inputBoxes.choices[i]){
              form.append(inputBoxes.choices[i][k])  
            }
        }
    }
    for(var i=0;i<inputBoxes.titlesNum;i++){
        var card = 
            $('<div class="card mt-2">'+
                '<div class="card-body p-2">'+
                '</div>'+
            '</div>')
		if(inputBoxes.titlesNum>1){
			card.children('.card-body').append('<h6 class="card-title m-1">子题目-'+(i+1)+'</h5>')
		}
        card.children('.card-body').append(inputBoxes.title[i])
        if('A,A2,A3,X'.includes(inputBoxes.type)){
            for(k in inputBoxes.choices[i]){
                card.children('.card-body').append(inputBoxes.choices[i][k])  
            }
        }
        card.children('.card-body').append(inputBoxes.answer[i])
        card.children('.card-body').append(inputBoxes.explain[i])
        form.append(card)
    }
    var submitBtn = new OO.ui.ButtonWidget( {
	label: '提交',
	flags: [
		'primary',
		'progressive'
			]
		} )
	var cancelBtn = new OO.ui.ButtonWidget( {
	label: '取消',
	flags: [
		'destructive'
			]
		} )
	submitBtn.$element.bind('click',function(){confirmEditAndCheckDifference(id)})
	cancelBtn.$element.bind('click',function(){cancelEdit(id)})
	var btns = $('<div class="m-1"></div>')
	btns.append(submitBtn.$element, cancelBtn.$element)
	form.append(btns,'<hr>')
    console.log(form)
    return form
}
function cancelEdit(id){
	$('#'+id).fadeIn('fast')
	$('#edit-'+id).fadeOut('fast')
	setTimeout(function(){
    	$("html,body").animate({scrollTop:$("#"+id).position().top},500)	
    },250)
}
function confirmEditAndCheckDifference(id){
	var formatedData = formatEditText(id)
	var oldData = gDomTimuList().timu[id].dataJSON
	var compareChanges = findChangedItem(oldData,formatedData )
	console.log(formatedData, oldData, compareChanges)
	var afterEditWikiText = JSONtoTemplate(formatedData)
	console.log(afterEditWikiText)
	var namespace = $('.mw-page-title-namespace').text()===''?'':$('.mw-page-title-namespace').text()+':'
	var pageName = namespace+$('.mw-page-title-main').text()
	//设置弹出框按钮功能
	var processDialog = newProcessDialog()
	var MyProcessDialog = processDialog.MyProcessDialog
	$('.oo-ui-windowManager').remove()
	var windowManager = new OO.ui.WindowManager();
	$( document.body ).append( windowManager.$element );
	
	MyProcessDialog.prototype.getActionProcess = function ( action ) {
	    var dialog = this;
	    if( action === 'submit'){
	    	submitChange(pageName,afterEditWikiText)
	    }
	    if ( action ) {
	        return new OO.ui.Process( function () {
	            dialog.close( { action: action } );
	        } );
	    }
	    return MyProcessDialog.super.prototype.getActionProcess.call( this, action );
	};
	openWindows(MyProcessDialog,windowManager)
	
	//获取页面内容

	getOriginalText(pageName,formatedData)
	$('#newWikiText').html('<pre>'+afterEditWikiText+'</pre>')
}
function getOriginalText(pageTitle, timuData, editedText) {
	var api = new mw.Api();
	api.get( {
        "action": "query",
        "format": "json",
        "prop": "revisions",
        "titles": pageTitle,
        "utf8": 1,
        "rvprop": "content",
        "rvlimit": 1,
        "rvslots": "*",
        "rvdir": "older"
    } ).done( function ( data ) {
    	var pages = data.query.pages
	    console.log( data );
	    if(pages[-1]===undefined){
	    	var wikitext = ''
	    	for(var i in pages){wikitext = pages[i].revisions[0].slots.main['*']}
	    	console.log(wikitext)
	    	var regMatchInner = new RegExp('(?<=\\{\\{' + timuData.type + '型题\\n\\|source=' + timuData.source + '\\n)[^}}]*(?=\\}\\}?)', 'g')
		    var regMatchFull = new RegExp('(\\{\\{' + timuData.type + '型题\\n\\|source=' + timuData.source + '\\n)[^}}]*(\\}\\})', 'g')
		    
		    console.log(regMatchInner)
		    var inner = wikitext.match(regMatchInner)
		    sInnerMatchList(inner)
		    console.log(inner)
			var options = $('<div></div>')
			if(inner.length>0){
				for(var i=0;i<inner.length;i++){
					if(i===0){
						options.append($('<label style="display: flex;"><input checked type="radio" style="margin-right:5px" name="multiMatchInner" value="'+i+'"><pre>'+inner[i]+'</pre></label>'))
					}else{
						options.append($('<label style="display: flex;"><input type="radio" style="margin-right:5px" name="multiMatchInner" value="'+i+'"><pre>'+inner[i]+'</pre></label>'))
					}
				}
			}
			
		    $('#oldWikiText').html(options)
	    }
	    
	} );
    
}
function submitChange(pageTitle,newText){
	var selectedOldText = gInnerMatchList()[$('input:radio[name="multiMatchInner"]:checked').val()]
	console.log(selectedOldText)
	new mw.Api().edit(
    pageTitle,
    function ( revision ) {
        return {
            text: revision.content.replace( selectedOldText, newText ),
            summary: newText+'替换'+selectedOldText,
            tags:"tiku-inline-editor"
	        };
	    }
	)
	.then( function () {
		alertDialog('成功',"编辑成功",'三秒后将自动刷新页面',false)
		setTimeout(function(){location.reload()},3000)
	    console.log( 'Saved!' );
	} );
}
function findChangedItem(oldObj, newObj ){
	var lenOld = dicLen(oldObj)
	var lenNew = dicLen(newObj)
	var result = []
	for(var i in oldObj){
		if(newObj[i] === undefined){
			result.push({key:i,status:'deleted'})
		}
		if(oldObj[i]!==newObj[i]){
			result.push({key:i,status:'changed'})
		}
	}
	for(var i in newObj){
		if(oldObj[i] === undefined){
			result.push({key:i,status:'new'})
		}
	}
	return result
}
function newProcessDialog(){
	// Example: Creating and opening a process dialog window.
	MyProcessDialog = function ( config ) {
	    MyProcessDialog.super.call( this, config );
	}
	OO.inheritClass( MyProcessDialog, OO.ui.ProcessDialog );
	
	MyProcessDialog.static.name = 'myProcessDialog';
	MyProcessDialog.static.title = '上传前检查';
	MyProcessDialog.static.actions = [
	    { action: 'submit', label: '确认提交', flags: [ 'primary', 'progressive' ] },
	    { label: '返回', flags: 'safe' }
	];
	MyProcessDialog.static.size='full'
	
	MyProcessDialog.prototype.initialize = function () {
	    MyProcessDialog.super.prototype.initialize.apply( this, arguments );
	    this.content = new OO.ui.PanelLayout( { padded: true, expanded: false } );
	    this.content.$element.append( '<div id="process-header"></div><div id="process-content"><h3>编辑前的文本(如有多个可能是编号相同,请选择与本题相应文本)</h3><form id="oldWikiText"></form><h3>编辑后</h3><div id="newWikiText"></div></div><div id="process-append"></div>' );
	    this.$body.append( this.content.$element );
	};

	return {MyProcessDialog:MyProcessDialog}
}
function openWindows(MyProcessDialog,windowManager){
	var dialog = new MyProcessDialog();
	windowManager.addWindows( [ dialog ] );
	windowManager.openWindow( dialog );
	return windowManager
}
function formatEditText(id) {
	var formData = formToJSON($('#edit-'+id),true)
	var titleCount = formData['edit-titleCount']*1
	console.log(titleCount,formData)
	var sametypes = [ 'type','source','pos', 'inputbox', 'sourceRange', 'info']
	
	var result = {
		titlesList:[],
		answersList:[],
		explainsList:[],
	}
	for(var i=0;i<sametypes.length;i++){
		if(formData['edit-'+sametypes[i]]!==undefined){
			result[sametypes[i]] = formData['edit-'+sametypes[i]]
		}
	}
	
	//处理title,answers,explain
	for(var i=0;i<titleCount;i++){
		result.titlesList.push(formData['edit-title-'+i])
		result.answersList.push(formData['edit-answer-'+i])
		result.explainsList.push(formData['edit-explain-'+i])
	}
	result.title = arrayToString(result.titlesList, false)
	result.answer = arrayToString(result.answersList, false)
	result.explain = arrayToString(result.explainsList, false)
	
	//处理选项
	console.log(getItemByPrefix(formData,'edit-choice-',true))
	if(dicLen(getItemByPrefix(formData,'edit-choice-',true))>0){
		result.choicesDicList=[],
		result.choicesTextList=[],
		result.choices=''
		for(var i=0;i<titleCount;i++){
			var optionsRelatedToThis = getItemByPrefix(formData,'edit-choice-'+i+'-',true)
			result.choicesDicList.push(optionsRelatedToThis)
			console.log(formData.type)
			if(formData['edit-type']==='A3'){
				result.choicesTextList.push('{'+JSON.stringify(optionsRelatedToThis).match(RegExp(/(?<=\{).+(?=\})/))[0]+'}')
			}else{
				console.log(JSON.stringify(optionsRelatedToThis))
				result.choicesTextList.push(JSON.stringify(optionsRelatedToThis).match(RegExp(/(?<=\{).+(?=\})/))[0])
			}
	
		}
	result.choices =  arrayToString(result.choicesTextList,false)
	}
	
	console.log(result)
	return result
}
function getItemByPrefix(obj, prefix, removePrefix){
	var result = {}
	for(var key in obj){
		if(key.includes(prefix)){
			if(removePrefix){
				result[key.replace(prefix,'')] = obj[key]
			}else{
				result[key] = obj[key]
			}
		}
	}
	return result
}
function arrayToString(array,needQuote){
	needQuote = needQuote===undefined?'':needQuote
  if(needQuote){
    return '"' +  array.join('","') + '"'
  }
  return array.join(',')
}



function dicValueToList(obj) {
    var result = []
    for (var i in obj) {
        result.push(obj[i])
    }
    return result
}

function formToJSON (selector, decode) {
  var result = {}
  var data
  if (typeof selector === 'object') {
    data = selector.serialize()
  } else {
    data = $(selector).serialize()
  }

  var dataSplitted = data.split('&')
  for (var i = 0; i < dataSplitted.length; i++) {
    var value = dataSplitted[i].split('=')[1]
    if (decode === true) {
      value = decodeURIComponent(value)
    }
    result[dataSplitted[i].split('=')[0]] = value
  }
  return result
}

function JSONtoTemplate(json, templateName) {
    var order = ['pos', 'inputbox', 'sourceRange', 'title', 'choices', 'answer', 'explain', 'info']
    // var result = '{{'+templateName +'\n'
    var result = ''
    for (var i = 0; i < order.length; i++) {
        if (json[order[i]] !== undefined) {
            result += '|' + order[i] + '=' + json[order[i]].replace('\n') + '\n'
        }
    }
    // result += '}}\n\n'
    return result
}

function alertDialog(title, message, btnLabel, disabled){
    var messageDialog = new OO.ui.MessageDialog();
    var windowManager = new OO.ui.WindowManager();
    $( 'body' ).append( windowManager.$element );
    windowManager.addWindows( [ messageDialog ] );
    windowManager.openWindow( messageDialog, {
        title:title,
        message: message,
        actions: [
            {
            action: 'accept',
            label:  btnLabel,
            flags: 'primary',
            disabled: disabled,
            }
        ]
        });
    return windowManager
}


function sInnerMatchList(obj){
	sessionStorage.setItem("edit-innerMatchList", JSON.stringify(obj));
}
function gInnerMatchList(){
	return JSON.parse(sessionStorage.getItem("edit-innerMatchList"));
}