更多操作
无编辑摘要  | 
				无编辑摘要  | 
				||
| 第1行: | 第1行: | ||
/*<%-- [PAGE_INFO]  | |||
    comment = #Please do not remove this struct. It's record contains some important information of edit. This struct will be removed automatically after you push edits.#  | |||
    pageTitle = #MediaWiki:Gadget-tikuRenderModule.js#  | |||
    pageID = #3426#  | |||
    revisionID = #69839#  | |||
    contentModel = #javascript#  | |||
    contentFormat = #text/javascript#  | |||
[END_PAGE_INFO] --%>*/  | |||
//主函数  | |||
function renderTimuFromSessionStorage(){  | function renderTimuFromSessionStorage(){  | ||
	var timuList = gDomTimuList()  | 	var timuList = gDomTimuList()  | ||
	console.log(timuList)  | |||
	var order = timuList.order  | 	var order = timuList.order  | ||
	var timu = timuList.timu  | 	var timu = timuList.timu  | ||
	var errors = timuList.errors  | 	var errors = timuList.errors  | ||
	var repeatSource = timuList.repeatSource  | 	var repeatSource = timuList.repeatSource  | ||
	for(var i=0;i<order.length;i++){  | 	for(var i=0;i<order.length;i++){  | ||
		if(order[i].isError){  | |||
			var errorWidget = new OO.ui.MessageWidget( {  | 			var errorWidget = new OO.ui.MessageWidget( {  | ||
				type: 'error',  | 				type: 'error',  | ||
| 第18行: | 第25行: | ||
		}else{  | 		}else{  | ||
			var dataJSON = timu[i].dataJSON  | 			var dataJSON = timu[i].dataJSON  | ||
            var o = newTimu(i,dataJSON,{})[dataJSON.type]()  | |||
             render(i,dataJSON.type,o)  |              render(i,dataJSON.type,o)  | ||
             var needCheck = $('#noRepeatCheck').length<=0  |              var needCheck = $('#noRepeatCheck').length<=0  | ||
| 第28行: | 第35行: | ||
				render(i,'A',warningWidget.$element)  | 				render(i,'A',warningWidget.$element)  | ||
             }  |              }  | ||
		}	  | 		}  | ||
	}  | 	}  | ||
}  | }  | ||
function   | |||
//题目渲染函数  | |||
//生成info  | |||
function infoInline(info){  | |||
     return $('<div class="info">'+info+'</div>')  | |||
}  | }  | ||
//单行题干的处理titleInline(type, source, title)  | |||
//生成titleGroup  | |||
function titlesGroup(titlesList){  | |||
    var group = $('<div class="titlesGroup"></div>')  | |||
     for(var i=0;i<titlesList.length;i++){  | |||
         group.append(titlesList[i])  | |||
     }  |      }  | ||
    return group  | |||
}  | }  | ||
function   | //生成titleInline  | ||
function titleInline(id, type,originalSource, sourceSuffix,title, classes){  | |||
    classes = classes===undefined?'':classes  | |||
    return $('<div id="title-'+id+'" class="'+classes+'"></div>').append(  | |||
            titleInlineType(type),  | |||
            titleInlineSource(originalSource,sourceSuffix),  | |||
            titleInlineTitle(title)  | |||
        )  | |||
}  | }  | ||
function   | function titleInlineType(type){  | ||
     var   |      var typeChinese = {  | ||
        A:'A',  | |||
        A2:'A2',  | |||
        A3:'A3',  | |||
        B:'B',  | |||
        C:'C',  | |||
        X:'X',  | |||
        TK:'填空',  | |||
        PD:'判断',  | |||
         MJ:'名解'  | |||
     }  |      }  | ||
     return   |      return $('<p class="type">'+typeChinese[type]+'</p>')  | ||
}  | }  | ||
//从有中文的source中提取最后一个连续数字作为真实的source  | //从有中文的source中提取最后一个连续数字作为真实的source  | ||
| 第88行: | 第87行: | ||
     }  |      }  | ||
     return {prefix:prefix,source:realSource}  |      return {prefix:prefix,source:realSource}  | ||
}  | |||
//返回source的obj  | |||
function titleInlineSource(originalSource, suffix){  | |||
    var realSource = getRealSource(originalSource)  | |||
    var prefix = realSource.prefix  | |||
    var source = realSource.source  | |||
    var suffix = suffix === undefined ? '':'-'+suffix  | |||
    return $('<p class="source">'+prefix+source+suffix+'</p>')  | |||
}  | }  | ||
function   | //返回sourceRange的obj  | ||
function rangeInline(originalSource, sourceRange, type){  | |||
     if(  |     var source = getRealSource(originalSource).source  | ||
     if(  |     var end = source*1+sourceRange*1 -1  | ||
    var rangeText = '第 '+source +' 到 ' + end + ' 题'  | |||
    var suffix = type==='B'?'共用备选答案':'共用题干'  | |||
    return $('<div class="sourceRange">'+rangeText + suffix +'</div>')  | |||
}  | |||
//返回title 的 obj  | |||
function titleInlineTitle(title){  | |||
    return $('<p class="title">'+title+'</p>')  | |||
}  | |||
//生成B、C型题的选择框  | |||
function dropDownInputWidget(id, availabelOptions){  | |||
    var options = []  | |||
    for(var i=0;i<availabelOptions.length;i++){  | |||
        options.push({  | |||
            data:availabelOptions[i],  | |||
            label:availabelOptions[i]  | |||
        })  | |||
    }  | |||
    return new OO.ui.DropdownInputWidget( {  | |||
        name:'dropdown-input-'+id,  | |||
        options: options,  | |||
        classes:['dorpdown']  | |||
    } ).$element  | |||
}  | |||
//生成options(options 是 Map对象)  | |||
function optionsGroup(type,id,options){  | |||
     var flexClass = (type==='B')||(type==='C') ? 'optionsGroup-flex':''  | |||
    var inputType = type==='X' ? 'checkbox':'radio'  | |||
    var optionGroupObj = $('<div class="optionsGroup '+flexClass+'"></div>')  | |||
    options.forEach(function(value, key, map){  | |||
        optionGroupObj.append(optionInline(id, key, value, !((type==='B')||(type==='C')), inputType))  | |||
    })  | |||
    return optionGroupObj  | |||
}  | |||
//生成optionInline  | |||
function optionInline(id, option, content,input,inputType){  | |||
    console.log(input)  | |||
    var input = input ? $('<input id="option-input-'+id+'-'+option+'" name="optionsGroup-' + id + '" type="'+inputType+'" value="' + option + '" />'):''  | |||
    var optionLabel = $('<label for="option-input-'+id+'-'+option+'">'+option+'. </label>')  | |||
    var contentLabel = $('<label for="option-input-'+id+'-'+option+'">'+content+'</label>')  | |||
    return $('<div id="option-'+id+'-'+option+'" class="optionInline"></div>').append(input,optionLabel,contentLabel)  | |||
}  | |||
//清理json中的choice(清除空项并排序),接收Obj,  | |||
function cleanOptions(options){  | |||
    return sortDicByKey(filterEmptyEntries(options)) //返回一个 Map 对象  | |||
}  | |||
//生成buttonGroup  | |||
function buttonGroup(showSubmitBtn, showEditBtn, id, type, correctAnswer, hoverTarget){  | |||
    console.log(showEditBtn)  | |||
    var buttonGroupObj = $('<div class="buttonGroup"></div>')  | |||
    if(showSubmitBtn){buttonGroupObj.append(  | |||
        new OO.ui.ButtonWidget( {  | |||
            id:'showThisAnswer-'+id,  | |||
            label: '提交',  | |||
            flags: [  | |||
                'progressive'  | |||
            ]  | |||
        } ).$element.bind("click",function (){  | |||
            showThisAnswer(id,type,correctAnswer)  | |||
        })  | |||
    )}  | |||
     if(showEditBtn){  | |||
        buttonGroupObj.append(  | |||
            // $('<a class="editThisBtn" style="" href="javascript:void(0)"><span class="" id="editThis-' + id + '">题目有误?点击编辑本题</span></a>'),  | |||
            new OO.ui.ButtonWidget( {  | |||
                id:'editThis-' + id,  | |||
                classes:['editThisBtn'],  | |||
                framed: false,  | |||
                flags: [  | |||
                    'progressive'  | |||
                ],  | |||
                icon: 'edit',  | |||
                label: '题目有误?点击编辑本题'  | |||
            } ).$element.bind("click",function (){  | |||
                editThis(id)  | |||
            })  | |||
        )  | |||
        hoverTarget.hover(function () {  | |||
            buttonGroupObj.children('.editThisBtn').fadeIn(10)  | |||
        },function (){  | |||
            buttonGroupObj.children('.editThisBtn').fadeOut(70)  | |||
        })  | |||
    }  | |||
    return buttonGroupObj  | |||
}  | |||
//生成subject 的form, 顺序items顺序添加 (title, options, buttonGroup)  | |||
function subjectFrom(id, items, title, options, buttonGroup){  | |||
    var form =  $('<form id="timuFrom-'+id+'" class="subjectForm"></form>')  | |||
    for(var i=0;i<items.length;i++){  | |||
        form.append(items[i])  | |||
    }  | |||
    return form  | |||
}  | |||
//resultGroup: answer和explain的显示框  | |||
function resultGroup(id, items, answerInline,explainInline){  | |||
    var group = $('<div id="resultGroup-'+id+'" class="resultGroup"></div>')  | |||
    for(var i=0;i<items.length;i++){  | |||
        group.append(items[i])  | |||
    }  | |||
    return group  | |||
}  | |||
//生成answerInline  | |||
function answerInline(answer){  | |||
    return $('<div class="answerInline"><label>正确答案:</label>'+answer+'</div>')  | |||
}  | |||
//生成explainInline  | |||
function explainInline(explain){  | |||
    return $('<div class="explainInline"><label>解析:</label>'+explain+'</div>')  | |||
}  | |||
//生成填空输入框  | |||
function fillBlank(id, title, pos, classes){  | |||
    console.log(pos)  | |||
    var posReg = new RegExp(pos,'g')  | |||
    var blankLen = title.match(posReg).length  | |||
    var split = title.split(posReg)  | |||
    console.log(blankLen)  | |||
     var newTitle = ''  | |||
    for(var i=0;i<(blankLen+split.length);i++){  | |||
        if(i%2===0){  | |||
            newTitle +=  '<p class="title">'+split[Math.floor(i/2)]+'</div>'  | |||
        }else{  | |||
            newTitle +=  new OO.ui.TextInputWidget( {  | |||
                name:'textInput-'+id+'-'+Math.floor(i/2),  | |||
                id:'textInput-'+id+'-'+Math.floor(i/2),  | |||
                classes:classes  | |||
            } ).$element.prop('outerHTML')  | |||
        }  | |||
    }  | |||
    return newTitle  | |||
}  | |||
function newTimu(id,json, settings){  | |||
     settings = json.settings===undefined||json.isA3 ? settings:json.settings//检测json是否带有settings或者是否为A3子题目  | |||
    parent = settings.parent === undefined ? '' : settings.parent  | |||
    showHr = settings.showHr == undefined ? true : settings.showHr  | |||
    showSubmitBtn = settings.showSubmitBtn === undefined ? true : settings.showSubmitBtn  | |||
    showEditBtn = settings.showEditBtn === undefined ? true : settings.showEditBtn  | |||
    showBtnGroup = settings.showBtnGroup === undefined? true:settings.showBtnGroup  | |||
     var o = new Object()  |      var o = new Object()  | ||
     o.type = json.type  | |||
     //将choice   |     o.pos = json.pos  | ||
     if(typeOfObj(  |     o.inputBox = json.inputBox  | ||
    o.source = json.source  | |||
    o.sourceRange = json.sourceRange  | |||
    o.info = json.info  | |||
    o.title = json.title  | |||
    o.options = json.choices  | |||
    console.log(o.options)  | |||
     //将choice 统一为Array的转换为obj  | |||
     if(typeOfObj(o.options)==='[object Array]'&&o.options.length===1&&o.type!=='A3'){  | |||
     	o.options = o.options[0]  | |||
     }  |      }  | ||
     o.options = o.options!==undefined? cleanOptions(o.options):''  | |||
    console.log(o.options)  | |||
    o.answer = json.answer  | |||
    o.explain = json.explain  | |||
     o.temp = {  |      o.temp = {  | ||
         main:$('<div name="timu-'+(id+1)+'" id="'+id+'" class="type'+type+' timuContainer"><p class="timuID">'+id+'</p></div>'),  |          main:$('<div name="timu-'+(id+1)+'" id="'+id+'" class="type'+o.type+' timuContainer"><p class="timuID">'+id+'</p></div>'),  | ||
         subject:$('<  |          subject:$('<form class="subject"></form>'),  | ||
         range:$('<div class="sourceRange"></div>'),  |          range:$('<div class="sourceRange"></div>'),  | ||
         info:$('<div class="info"></div>'),  |          info:$('<div class="info"></div>'),  | ||
| 第112行: | 第277行: | ||
         title:$('<p class="title"></p>'),  |          title:$('<p class="title"></p>'),  | ||
         options:$('<div class="options"></div>'),  |          options:$('<div class="options"></div>'),  | ||
         btn:$('<button class="button-small button-pill button button-caution" id="showSingle-' + id + '" class="showSingleBtn">提交</button>'),  |          btn:$('<button type="button" class="button-small button-pill button button-caution" id="showSingle-' + id + '" class="showSingleBtn">提交</button>'),  | ||
         editBtn:$('<a class="editThisButton" style="display:none;font-size: 14px;margin-left: 5px" href="javascript:void(0)"><span class="" id="editThis-' + id + '">题目有误?点击编辑本题</span></a>'),  |          editBtn:$('<a class="editThisButton" style="display:none;font-size: 14px;margin-left: 5px" href="javascript:void(0)"><span class="" id="editThis-' + id + '">题目有误?点击编辑本题</span></a>'),  | ||
         ansCon:$('<div id="ansContainer" class="ansContainer noDisplay"></div>'),  |          ansCon:$('<div id="ansContainer" class="ansContainer noDisplay"></div>'),  | ||
| 第120行: | 第285行: | ||
         subTitle:$('<div id=""></div>')  |          subTitle:$('<div id=""></div>')  | ||
     }  |      }  | ||
     o.parent = parent  |      o.parent = parent  | ||
     if(  |      // if(this.type==='A3'){  | ||
    //     	$(this).children('.subject').children('.editThisButton').fadeIn(1)  | |||
    //     }  | |||
     o.temp.main.hover(function () {  |      o.temp.main.hover(function () {  | ||
         $  |          $('editThis-' + id).fadeIn(10)  | ||
     },function (){  |      },function (){  | ||
         $  |          $('editThis-' + id).fadeOut(70)  | ||
     })  |      })  | ||
     o.A = function () {  |      o.A = function () {  | ||
         this  |          //subjectForm   | ||
         this.  |         var optionsGroupObj = optionsGroup(this.type, id, this.options)  | ||
         var titleInlineObj = titleInline(id, this.type,this.source,undefined,this.title,'titleInline')  | |||
         this.  |          var buttonGroupObj = showBtnGroup? buttonGroup(showSubmitBtn, showEditBtn, id, this.type, this.answer, this.temp.main):''  | ||
         var subjectForm = subjectFrom(id, [titleInlineObj, optionsGroupObj, buttonGroupObj])  | |||
         var   |          //resultGroupObj  | ||
         var answerInlineObj = answerInline(this.answer)  | |||
         var explainInlineObj = this.explain === undefined || this.explain === '' ? '暂无解析' : explainInline(this.explain)  | |||
         var resultGroupObj = resultGroup(id, [answerInlineObj, explainInlineObj])  | |||
         this.temp.main.append(subjectForm,resultGroupObj)  | |||
         this.  | |||
         this.temp.main.append(  | |||
         if(  |          if(showHr){this.temp.main.append('<hr>')}  | ||
         return this.temp.main  |          return this.temp.main  | ||
     }  |      }  | ||
     o.A2 = function () {  |      o.A2 = function () {  | ||
         this  |          //subjectForm   | ||
         this.  |         var optionsGroupObj = optionsGroup(this.type, id, this.options)  | ||
         var titleInlineObj = titleInline(id, this.type,this.source,undefined,this.title,'titleInline')  | |||
         this.  |          var buttonGroupObj = buttonGroup(showSubmitBtn, showEditBtn, id, this.type, this.answer, this.temp.main)  | ||
         var subjectForm = subjectFrom(id, [titleInlineObj, optionsGroupObj, buttonGroupObj])  | |||
         var   |          //resultGroupObj  | ||
         var answerInlineObj = answerInline(this.answer)  | |||
         var explainInlineObj = this.explain === undefined || this.explain === '' ? '暂无解析' : explainInline(this.explain)  | |||
         var resultGroupObj = resultGroup(id, [answerInlineObj, explainInlineObj])  | |||
         this.temp.main.append(subjectForm,resultGroupObj)  | |||
         this.  | |||
         this.temp.main.append(  | |||
         if(  |          if(showHr){this.temp.main.append('<hr>')}  | ||
         return this.temp.main  |          return this.temp.main  | ||
     }  |      }  | ||
     o.A3 = function () {  |      o.A3 = function () {  | ||
         console.log(settings)  | |||
         var realSource = getRealSource(json.source)  |          var realSource = getRealSource(json.source)  | ||
         //subjectForm   | |||
         var range = rangeInline(this.source, this.sourceRange)  | |||
         var info = infoInline(this.info)  | |||
         var   | |||
         this.  |         var subTitlesList = []  | ||
         for(var i=0;i<  |          for(var i=0;i<this.title.length;i++){  | ||
             if(this.explain[i]==undefined){  | |||
             if(  |                  this.explain[i] = '暂无解析'  | ||
             }  |              }  | ||
             var data = {  |              var data = {  | ||
                'isA3':true,  | |||
                 "type":"A",  |                  "type":"A",  | ||
                 "source":prefix+  |                  "source":realSource.prefix+realSource.source+'-'+(i+1),  | ||
                 "title":  |                  "title":this.title[i],  | ||
                 "answer":  |                  "answer":this.answer[i],  | ||
                 "explain":  |                  "explain":this.explain[i],  | ||
                 "choices":  |                  "choices":this.options.get(i+''),  | ||
             }  |              }  | ||
             console.log(data)  | |||
            console.log(this.options)  | |||
            subTitlesList.push(newTimu(id+'-'+i,data,{  | |||
                showHr:false,  | |||
                showEditBtn:false,  | |||
                showSubmitBtn:false,  | |||
                showBtnGroup:false  | |||
            }).A())  | |||
         }  |          }  | ||
         console.log(this.answer)  | |||
         var buttonGroupObj  = buttonGroup(true, false, id, this.type, this.answer, this.temp.main)  | |||
         console.log(buttonGroupObj)  | |||
        var subjectFormObj = subjectFrom(id, [subTitlesList,buttonGroupObj])  | |||
         this.temp.main.append(range,info, subjectFormObj)  | |||
         this.temp.main.append(  | |||
         this.temp.main.append('<hr>')  | |||
         return this.temp.main  |          return this.temp.main  | ||
     }  |      }  | ||
     o.B = function () {  |      o.B = function () {  | ||
         var realSource = getRealSource(json.source)  |          var realSource = getRealSource(json.source)  | ||
         var   |         //subjectForm   | ||
         var range = rangeInline(this.source, this.sourceRange)  | |||
         var optionsGroupObj = optionsGroup(this.type, id, this.options)  | |||
         var   |          var titleInlineList = []  | ||
         this.temp.  |          for(var i=0;i<this.title.length;i++){  | ||
            var dropdown = dropDownInputWidget(id+'-'+i, mapKeysList(this.options))  | |||
            var titleInlineObj = titleInline(id+'-'+i, this.type, json.source, i, this.title[i],'titleInline')  | |||
            titleInlineObj.append(dropdown)  | |||
            titleInlineList.push(titleInlineObj)  | |||
        }  | |||
        var titlesGroupObj = titlesGroup(titleInlineList)  | |||
         var buttonGroupObj = buttonGroup(showSubmitBtn, showEditBtn, id, this.type, this.answer, this.temp.main)  | |||
        var subjectForm = subjectFrom(id, [optionsGroupObj, titlesGroupObj, buttonGroupObj])  | |||
         //resultGroupObj  | |||
         var resultGroupList = []  | |||
         for(var i=0;i<this.answer.length;i++){  | |||
             var answerInlineObj = answerInline(this.answer[i])  | |||
             var explainInlineObj = this.explain[i] === undefined || this.explain[i] === '' ? '暂无解析' : explainInline(this.explain[i])  | |||
             resultGroupList.push(  | |||
         for(var i=0;i<  |                     '<b>'+realSource.prefix+realSource.source+'-'+i+'</b>',  | ||
             var   |                     $('<div style="margin-left:10px"></div>').append(answerInlineObj),  | ||
             var   |                     $('<div style="margin-left:10px"></div>').append(explainInlineObj)  | ||
                )  | |||
         }  |          }  | ||
        var resultGroupObj = resultGroup(id, resultGroupList)  | |||
         this.temp.  |          this.temp.main.append(range ,subjectForm,resultGroupObj)  | ||
         if(  |          if(showHr){this.temp.main.append('<hr>')}  | ||
         return this.temp.main  |          return this.temp.main  | ||
     }  |      }  | ||
     o.C = function () {  |      o.C = function () {  | ||
         var realSource = getRealSource(json.source)  |          var realSource = getRealSource(json.source)  | ||
         var   |         //subjectForm   | ||
         var range = rangeInline(this.source, this.sourceRange)  | |||
         var optionsGroupObj = optionsGroup(this.type, id, this.options)  | |||
         var titleInlineList = []  | |||
         for(var i=0;i<this.title.length;i++){  | |||
         this.temp.  |             var dropdown = dropDownInputWidget(id+'-'+i, mapKeysList(this.options))  | ||
            var titleInlineObj = titleInline(id+'-'+i, this.type, json.source, i, this.title[i],'titleInline')  | |||
            titleInlineObj.append(dropdown)  | |||
            titleInlineList.push(titleInlineObj)  | |||
        }  | |||
        var titlesGroupObj = titlesGroup(titleInlineList)  | |||
         var buttonGroupObj = buttonGroup(showSubmitBtn, showEditBtn, id, this.type, this.answer, this.temp.main)  | |||
        var subjectForm = subjectFrom(id, [titlesGroupObj, optionsGroupObj, buttonGroupObj])  | |||
         //resultGroupObj  | |||
         var resultGroupList = []  | |||
         for(var i=0;i<this.answer.length;i++){  | |||
             var answerInlineObj = answerInline(this.answer[i])  | |||
             var explainInlineObj = this.explain[i] === undefined || this.explain[i] === '' ? '暂无解析' : explainInline(this.explain[i])  | |||
             resultGroupList.push(  | |||
         for(var i=0;i<  |                     '<b>'+realSource.prefix+realSource.source+'-'+i+'</b>',  | ||
             var   |                     $('<div style="margin-left:10px"></div>').append(answerInlineObj),  | ||
             var   |                     $('<div style="margin-left:10px"></div>').append(explainInlineObj)  | ||
                )  | |||
         }  |          }  | ||
        var resultGroupObj = resultGroup(id, resultGroupList)  | |||
         this.temp.  |          this.temp.main.append(range ,subjectForm,resultGroupObj)  | ||
         if(  |          if(showHr){this.temp.main.append('<hr>')}  | ||
         return this.temp.main  |          return this.temp.main  | ||
     }  |      }  | ||
     o.X = function () {  |      o.X = function () {  | ||
         this  |          //subjectForm   | ||
         this.  |         var optionsGroupObj = optionsGroup(this.type, id, this.options)  | ||
         var titleInlineObj = titleInline(id, this.type,this.source,undefined,this.title,'titleInline')  | |||
         this.  |          var buttonGroupObj = showBtnGroup? buttonGroup(showSubmitBtn, showEditBtn, id, this.type, this.answer, this.temp.main):''  | ||
        var subjectForm = subjectFrom(id, [titleInlineObj, optionsGroupObj, buttonGroupObj])  | |||
         var   |         //resultGroupObj  | ||
         var answerInlineObj = answerInline(this.answer)  | |||
         var explainInlineObj = this.explain === undefined || this.explain === '' ? '暂无解析' : explainInline(this.explain)  | |||
         var resultGroupObj = resultGroup(id, [answerInlineObj, explainInlineObj])  | |||
         this.temp.main.append(subjectForm,resultGroupObj)  | |||
         this.temp.main.append(  | |||
         if(  |          if(showHr){this.temp.main.append('<hr>')}  | ||
         return this.temp.main  |          return this.temp.main  | ||
     }  |      }  | ||
| 第344行: | 第464行: | ||
         this.temp.explain.nextAll('.explain').html(json.explain)  |          this.temp.explain.nextAll('.explain').html(json.explain)  | ||
         var ans = ''  |          var ans = ''  | ||
        var ansOption = ''  | |||
         if(isInArray(dic.right, json.answer.toLowerCase())){  |          if(isInArray(dic.right, json.answer.toLowerCase())){  | ||
             ans = '正确'  |              ans = '正确'  | ||
            ansOption = 'A'  | |||
         }else if(isInArray(dic.wrong, json.answer.toLowerCase())){  |          }else if(isInArray(dic.wrong, json.answer.toLowerCase())){  | ||
             ans = '错误'  |              ans = '错误'  | ||
            ansOption = 'B'  | |||
         }else {  |          }else {  | ||
         	ans = '系统错误:该判断题答案不符合标准格式'  |          	ans = '系统错误:该判断题答案不符合标准格式'  | ||
         }  |          }  | ||
         if(  |         //subjectForm   | ||
        var option = new Map()  | |||
        option.set('A', '正确')  | |||
        option.set('B', '错误')  | |||
        var optionsGroupObj = optionsGroup(this.type, id, option)  | |||
        var titleInlineObj = titleInline(id, this.type,this.source,undefined,this.title,'titleInline')  | |||
        var buttonGroupObj = showBtnGroup? buttonGroup(showSubmitBtn, showEditBtn, id, 'A', ansOption, this.temp.main):''  | |||
        var subjectForm = subjectFrom(id, [titleInlineObj, optionsGroupObj, buttonGroupObj])  | |||
        //resultGroupObj  | |||
        var answerInlineObj = answerInline(ans)  | |||
        var explainInlineObj = this.explain === undefined || this.explain === '' ? '暂无解析' : explainInline(this.explain)  | |||
        var resultGroupObj = resultGroup(id, [answerInlineObj, explainInlineObj])  | |||
        this.temp.main.append(subjectForm,resultGroupObj)  | |||
         if(showHr){this.temp.main.append('<hr>')}  | |||
         return this.temp.main  |          return this.temp.main  | ||
     }  |      }  | ||
     o.TK = function () {  |      o.TK = function () {  | ||
         this.  |          var tkTitle = fillBlank(id, this.title, this.pos, ['textInput-tk'])  | ||
         this.  |          var titleInlineObj = titleInline(id, this.type,this.source,undefined,tkTitle, 'titleInline-no-flex')  | ||
         titleInlineObj.children('.textInput-tk').each(function(i,v){  | |||
            console.log(i,v)  | |||
             $(this).children('input').css(  | |||
                'display','inline'  | |||
            )  | |||
            $(this).children('input').css(  | |||
         }  |                 'width','200px'  | ||
            )  | |||
         })  | |||
         var buttonGroupObj = showBtnGroup? buttonGroup(showSubmitBtn, showEditBtn, id, this.type, this.answer, this.temp.main):''  | |||
         var subjectForm = subjectFrom(id, [titleInlineObj, buttonGroupObj])  | |||
         this.temp.main.append(subjectForm)  | |||
         this.temp.main.append(  | |||
         if(  |          if(showHr){this.temp.main.append('<hr>')}  | ||
         return this.temp.main  |          return this.temp.main  | ||
     }  |      }  | ||
     o.MJ = function () {  |      o.MJ = function () {  | ||
         var mjTitle = ''  | |||
         this.  |          if(this.inputBox===0){  | ||
            mjTitle = json.title + ':<span class="blur" tabindex="0" style="display:inline;outline=0;" onclick="">' + json.answer +'</span>'  | |||
         this.  |          }else{  | ||
            mjTitle = fillBlank(id, this.title+':()', '()', ['textInput-mj'])  | |||
         this.  |         }  | ||
        var titleInlineObj = titleInline(id, this.type,this.source,undefined,mjTitle, 'titleInline-no-flex')  | |||
         titleInlineObj.children('.textInput-mj').each(function(i,v){  | |||
            console.log(i,v)  | |||
            $(this).children('input').css(  | |||
                'display','inline'  | |||
            )  | |||
            $(this).children('input').css(  | |||
                'width','auto'  | |||
            )  | |||
         })  | |||
        var buttonGroupObj = this.inputBox!==0 ? buttonGroup(showSubmitBtn, showEditBtn, id, 'TK', [this.answer], this.temp.main):''  | |||
        var subjectForm = subjectFrom(id, [titleInlineObj, buttonGroupObj])  | |||
         if(  |         this.temp.main.append(subjectForm)  | ||
         if(showHr){this.temp.main.append('<hr>')}  | |||
         return this.temp.main  |          return this.temp.main  | ||
     }  |      }  | ||
     return o  |      return o  | ||
}  | }  | ||
function   | |||
     var   | function getSelectedAnswer(id){  | ||
     var data = formToJSON('#timuFrom-'+id,true)  | |||
     return data  | |||
     return   | |||
}  | }  | ||
function   | function showThisAnswer(id,type,correctAnswer){  | ||
     var subjectCon = $('#'+id)  |      var subjectCon = $('#'+id)  | ||
     var titleCon = subjectCon.children('.subject').children('.titleContainer')  |      var titleCon = subjectCon.children('.subject').children('.titleContainer')  | ||
     var   |      var resultGroup = $('#resultGroup-'+id)  | ||
    resultGroup.fadeIn(100)  | |||
     var answers = subjectCon.children('.subject').children('.options')  |      var answers = subjectCon.children('.subject').children('.options')  | ||
     $('#showThisAnswer-'+id).fadeOut(1)  | |||
     if(type==="A" || type ==='A2'){  |      if(type==="A" || type ==='A2'){  | ||
         var   |          var optionGroupID = 'optionsGroup-'+id  | ||
         var   |          var optionInlinePrefixID = 'option-'+id  | ||
         var usersChoice = getSelectedAnswer(id)[optionGroupID]  | |||
         var   | |||
         var   |          var correctDivObj = $('#'+optionInlinePrefixID + '-' + correctAnswer)  | ||
         var usersChoiceDivObj = $('#'+optionInlinePrefixID + '-' + usersChoice)  | |||
         $('#  | |||
         if(usersChoice===correctAnswer){  | |||
         if(  |              correctDivObj.addClass('correct')  | ||
         }else{  |          }else{  | ||
             correctDivObj.addClass('correct')  | |||
             usersChoiceDivObj.addClass('wrong')  | |||
         }  |          }  | ||
     }else if(type==='A3'){  |      }else if(type==='A3'){  | ||
         for(var i=0;i<correctAnswer.length;i++){  | |||
         for(var i=0;i<  | |||
             //以下与A型题时一样的代码,知识用subID替换ID变量  |              //以下与A型题时一样的代码,知识用subID替换ID变量  | ||
             showThisAnswer(id+'-'+i,'A',correctAnswer[i])  | |||
         }  |          }  | ||
    } else if(type==='B'){  | |||
        var dropDownInputPrefix = 'dropdown-input-'+id +'-'  | |||
        var usersChoice = getSelectedAnswer(id)  | |||
        console.log(usersChoice)  | |||
         for(var i in usersChoice){  | |||
             var dorpdownID = i.replace(dropDownInputPrefix,'')//获取子ID  | |||
             var subTimuID = id+'-'+dorpdownID  | |||
             var thisTimuUsersChoice = usersChoice[i]  | |||
             var   |              var thisTimuCorrectAnswer = correctAnswer[dorpdownID]  | ||
             var   |              var subTimuDiv = $('#title-'+subTimuID)  | ||
            if(thisTimuUsersChoice===thisTimuCorrectAnswer){  | |||
                subTimuDiv.addClass('correct')  | |||
            }else{  | |||
                subTimuDiv.addClass('wrong')  | |||
                subTimuDiv.append('<label class="answerTip">正确答案:'+thisTimuCorrectAnswer+'</label>')  | |||
             }  |              }  | ||
         }  | |||
         }  | |||
     } else if(type=="C"){  |      } else if(type=="C"){  | ||
         var dropDownInputPrefix = 'dropdown-input-'+id +'-'  | |||
        var usersChoice = getSelectedAnswer(id)  | |||
         console.log(usersChoice)  | |||
         for(var i in usersChoice){  | |||
             var   |              var dorpdownID = i.replace(dropDownInputPrefix,'')//获取子ID  | ||
             var   |              var subTimuID = id+'-'+dorpdownID  | ||
             var thisTimuUsersChoice = usersChoice[i]  | |||
             var thisTimuCorrectAnswer = correctAnswer[dorpdownID]  | |||
             var subTimuDiv = $('#title-'+subTimuID)  | |||
            if(thisTimuUsersChoice===thisTimuCorrectAnswer){  | |||
                subTimuDiv.addClass('correct')  | |||
            }else{  | |||
                subTimuDiv.addClass('wrong')  | |||
                subTimuDiv.append('<label class="answerTip">正确答案:'+thisTimuCorrectAnswer+'</label>')  | |||
             }  |              }  | ||
         }  | |||
         }  | |||
     }else if(type=="X"){  |      }else if(type=="X"){  | ||
         var   |          var optionGroupID = 'optionsGroup-'+id  | ||
         var   |          var optionInlinePrefixID = 'option-'+id  | ||
        var usersChoice = getCheckBoxValue(optionGroupID).sort()  | |||
         correctAnswer = correctAnswer.match(/[A-Z]/g).sort()  | |||
         var lenCorrect = correctAnswer.length  | |||
         var lenUser = usersChoice.length  | |||
         console.log(correctAnswer)  | |||
         for(var i=0;i<lenUser;i++){  | |||
             console.log(isInArray(correctAnswer, usersChoice[i]),usersChoice[i] ,correctAnswer)  | |||
         for(var i=0;i<  |              if(!isInArray(correctAnswer, usersChoice[i])){  | ||
                 $('#'+optionInlinePrefixID + '-' + usersChoice[i]).addClass('wrong')  | |||
             if(  | |||
             }  |              }  | ||
         }  |          }  | ||
         for(var i=0;i<  | |||
         for(var i=0;i<lenCorrect;i++){  | |||
             if(!isInArray(usersChoice,correctAnswer[i])){  | |||
             $('  |                 $('#'+optionInlinePrefixID + '-' + correctAnswer[i]).addClass('notChoiced')  | ||
             }else {  | |||
                $('#'+optionInlinePrefixID + '-' + correctAnswer[i]).addClass('correct')  | |||
            }  | |||
         }  |          }  | ||
     }else if(type=="TK"){  |      }else if(type=="TK"){  | ||
         var textInputPrefix = 'textInput-'+id+'-'  | |||
         var usersChoice = getSelectedAnswer(id)  | |||
         for(var i in usersChoice){  | |||
             var inputID = i.replace(textInputPrefix,'')  | |||
            console.log('#'+i)  | |||
         var   |             var corrcetAnswerText = correctAnswer[inputID]===undefined?'暂无答案':correctAnswer[inputID]  | ||
             if(usersChoice[i]===correctAnswer[inputID]){  | |||
         for(var i  |                  $('#'+i).html('<label class="answerTip correct">'+corrcetAnswerText+'</label>')  | ||
             var   | |||
             if(  | |||
                 $('<  | |||
             }else{  |              }else{  | ||
                 $('<  |                  $('#'+i).after('<label class="answerTip wrong">'+corrcetAnswerText+'</label>')  | ||
             }  |              }  | ||
         }  |          }  | ||
| 第562行: | 第652行: | ||
function removeBackground(obj){  | function removeBackground(obj){  | ||
     obj.addClass('no-background')  |      obj.addClass('no-background')  | ||
}  | |||
//DOM操作  | |||
//获取checkbox值  | |||
function  getCheckBoxValue(name) {  | |||
    var  ids = $('input:checkbox[name="'+name+'"]:checked');  | |||
    var data = [];  | |||
     for (var i = 0; i < ids.length; i ++) {  | |||
         //利用三元运算符去点  | |||
         data.push(ids[i].value)  | |||
     }  | |||
     return data  | |||
}  | |||
//将题目放在模板加载位置  | |||
function addAfterIDData(id,content) {  | |||
    var data = $('.data')  | |||
    content.insertAfter(data[id])  | |||
}  | |||
//渲染题目  | |||
function render(id,type,obj,parent,isAfter){  | |||
    parent =parent !==undefined ?parent : '#subjectContainer-'+type  | |||
    if(typeof(parent)!=='object'){  | |||
        parent = $(parent)  | |||
    }  | |||
    if(isObjExist(parent)){  | |||
        if(isAfter){  | |||
            parent.after(obj)  | |||
        }else {  | |||
            obj.appendTo(parent)  | |||
        }  | |||
    }else {  | |||
        addAfterIDData(id,obj)  | |||
    }  | |||
}  | |||
//基础函数  | |||
//判断函数  | |||
function isObjExist(t){  | |||
    return $(t).length>0  | |||
}  | |||
function isInArray (arr, value) {  | |||
  for (var i = 0; i < arr.length; i++) {  | |||
    if (value === arr[i]) {  | |||
      return true  | |||
    }  | |||
  }  | |||
  return false  | |||
}  | |||
//数据查询函数  | |||
function dicLen(dic){  | |||
    var count=0;  | |||
    for(var key in dic){  | |||
        console.log(key+'='+dic[key]);  | |||
        count++;  | |||
    }  | |||
    return count  | |||
}  | |||
//html操作函数  | |||
function entityToString(entity){  | |||
    var div=$('<div></div>');  | |||
    div.html(entity)  | |||
    var res=div.html();  | |||
    console.log(entity,'->',res);  | |||
    return res;  | |||
}  | |||
//获取map中键的列表  | |||
function mapKeysList(map){  | |||
    return Array.from(map.keys())  | |||
}  | |||
//数据清理  | |||
//去除字典中的空值  | |||
function filterEmptyEntries(dic){  | |||
    console.log(Object.fromEntries(  | |||
        Object.entries(dic).filter(function(key, value){return value !== null && value !== undefined && value.length !== 0})  | |||
    ))  | |||
    return Object.fromEntries(  | |||
        Object.entries(dic).filter(function(key, value){return value !== null && value !== undefined && value.length !== 0})  | |||
    )  | |||
}  | |||
//排序字典并返回一个map对象  | |||
function sortDicByKey(dic){  | |||
    var sort = Object.keys(dic).sort()  | |||
    var map = new Map()  | |||
    for(var i=0;i<sort.length;i++){  | |||
        map.set(sort[i],dic[sort[i]])  | |||
    }  | |||
    return map  | |||
}  | }  | ||
2023年6月22日 (四) 16:48的版本
/*<%-- [PAGE_INFO]
    comment = #Please do not remove this struct. It's record contains some important information of edit. This struct will be removed automatically after you push edits.#
    pageTitle = #MediaWiki:Gadget-tikuRenderModule.js#
    pageID = #3426#
    revisionID = #69839#
    contentModel = #javascript#
    contentFormat = #text/javascript#
[END_PAGE_INFO] --%>*/
//主函数
function renderTimuFromSessionStorage(){
	var timuList = gDomTimuList()
	console.log(timuList)
	var order = timuList.order
	var timu = timuList.timu
	var errors = timuList.errors
	var repeatSource = timuList.repeatSource
	for(var i=0;i<order.length;i++){
		if(order[i].isError){
			var errorWidget = new OO.ui.MessageWidget( {
				type: 'error',
				showClose:true,
				label: 'id='+i+'的题目加载错误,错误信息:'+errors[i].info.name+':'+errors[i].info.message+'\n'+'对应文本:'+errors[i].dataText
			} )
			render(i,'A',$('<di></div>').append(errorWidget.$element,'<hr>'))
		}else{
			var dataJSON = timu[i].dataJSON
            var o = newTimu(i,dataJSON,{})[dataJSON.type]()
            render(i,dataJSON.type,o)
            var needCheck = $('#noRepeatCheck').length<=0
            if(repeatSource[i]!==undefined&&needCheck){
            	var warningWidget = new OO.ui.MessageWidget( {
					type: 'warning',
					label: '本题与本页面id为'+repeatSource[i]+'的题目source参数重复,本参数重复可能引起错误,请检查并修改!'
				} )
				render(i,'A',warningWidget.$element)
            }
		}
	}
}
//题目渲染函数
//生成info
function infoInline(info){
    return $('<div class="info">'+info+'</div>')
}
//单行题干的处理titleInline(type, source, title)
//生成titleGroup
function titlesGroup(titlesList){
    var group = $('<div class="titlesGroup"></div>')
    for(var i=0;i<titlesList.length;i++){
        group.append(titlesList[i])
    }
    return group
}
//生成titleInline
function titleInline(id, type,originalSource, sourceSuffix,title, classes){
    classes = classes===undefined?'':classes
    return $('<div id="title-'+id+'" class="'+classes+'"></div>').append(
            titleInlineType(type),
            titleInlineSource(originalSource,sourceSuffix),
            titleInlineTitle(title)
        )
}
function titleInlineType(type){
    var typeChinese = {
        A:'A',
        A2:'A2',
        A3:'A3',
        B:'B',
        C:'C',
        X:'X',
        TK:'填空',
        PD:'判断',
        MJ:'名解'
    }
    return $('<p class="type">'+typeChinese[type]+'</p>')
}
//从有中文的source中提取最后一个连续数字作为真实的source
function getRealSource(source){
	var getContinueNumber = source.match(/[0-9]+/g)
	var splitContinueNumber = source.split(/[0-9]+/g)
    var realSource = getContinueNumber[getContinueNumber.length-1]*1
    var prefix = ''
    for(var i=0;i<getContinueNumber.length;i++){
    	prefix += splitContinueNumber[i]
    }
    return {prefix:prefix,source:realSource}
}
//返回source的obj
function titleInlineSource(originalSource, suffix){
    var realSource = getRealSource(originalSource)
    
    var prefix = realSource.prefix
    var source = realSource.source
    var suffix = suffix === undefined ? '':'-'+suffix
    return $('<p class="source">'+prefix+source+suffix+'</p>')
}
//返回sourceRange的obj
function rangeInline(originalSource, sourceRange, type){
    var source = getRealSource(originalSource).source
    var end = source*1+sourceRange*1 -1
    var rangeText = '第 '+source +' 到 ' + end + ' 题'
    var suffix = type==='B'?'共用备选答案':'共用题干'
    return $('<div class="sourceRange">'+rangeText + suffix +'</div>')
}
//返回title 的 obj
function titleInlineTitle(title){
    return $('<p class="title">'+title+'</p>')
}
//生成B、C型题的选择框
function dropDownInputWidget(id, availabelOptions){
    var options = []
    for(var i=0;i<availabelOptions.length;i++){
        options.push({
            data:availabelOptions[i],
            label:availabelOptions[i]
        })
    }
    return new OO.ui.DropdownInputWidget( {
        name:'dropdown-input-'+id,
        options: options,
        classes:['dorpdown']
    } ).$element
}
//生成options(options 是 Map对象)
function optionsGroup(type,id,options){
    var flexClass = (type==='B')||(type==='C') ? 'optionsGroup-flex':''
    var inputType = type==='X' ? 'checkbox':'radio'
    var optionGroupObj = $('<div class="optionsGroup '+flexClass+'"></div>')
    options.forEach(function(value, key, map){
        optionGroupObj.append(optionInline(id, key, value, !((type==='B')||(type==='C')), inputType))
    })
    return optionGroupObj
}
//生成optionInline
function optionInline(id, option, content,input,inputType){
    console.log(input)
    var input = input ? $('<input id="option-input-'+id+'-'+option+'" name="optionsGroup-' + id + '" type="'+inputType+'" value="' + option + '" />'):''
    var optionLabel = $('<label for="option-input-'+id+'-'+option+'">'+option+'. </label>')
    var contentLabel = $('<label for="option-input-'+id+'-'+option+'">'+content+'</label>')
    return $('<div id="option-'+id+'-'+option+'" class="optionInline"></div>').append(input,optionLabel,contentLabel)
}
//清理json中的choice(清除空项并排序),接收Obj,
function cleanOptions(options){
    return sortDicByKey(filterEmptyEntries(options)) //返回一个 Map 对象
}
//生成buttonGroup
function buttonGroup(showSubmitBtn, showEditBtn, id, type, correctAnswer, hoverTarget){
    console.log(showEditBtn)
    var buttonGroupObj = $('<div class="buttonGroup"></div>')
    if(showSubmitBtn){buttonGroupObj.append(
        new OO.ui.ButtonWidget( {
            id:'showThisAnswer-'+id,
            label: '提交',
            flags: [
                'progressive'
            ]
        } ).$element.bind("click",function (){
            showThisAnswer(id,type,correctAnswer)
        })
    )}
    if(showEditBtn){
        buttonGroupObj.append(
            // $('<a class="editThisBtn" style="" href="javascript:void(0)"><span class="" id="editThis-' + id + '">题目有误?点击编辑本题</span></a>'),
            new OO.ui.ButtonWidget( {
                id:'editThis-' + id,
                classes:['editThisBtn'],
                framed: false,
                flags: [
                    'progressive'
                ],
                icon: 'edit',
                label: '题目有误?点击编辑本题'
            } ).$element.bind("click",function (){
                editThis(id)
            })
        )
        hoverTarget.hover(function () {
            buttonGroupObj.children('.editThisBtn').fadeIn(10)
        },function (){
            buttonGroupObj.children('.editThisBtn').fadeOut(70)
        })
    }
    return buttonGroupObj
}
//生成subject 的form, 顺序items顺序添加 (title, options, buttonGroup)
function subjectFrom(id, items, title, options, buttonGroup){
    var form =  $('<form id="timuFrom-'+id+'" class="subjectForm"></form>')
    for(var i=0;i<items.length;i++){
        form.append(items[i])
    }
    return form
}
//resultGroup: answer和explain的显示框
function resultGroup(id, items, answerInline,explainInline){
    var group = $('<div id="resultGroup-'+id+'" class="resultGroup"></div>')
    for(var i=0;i<items.length;i++){
        group.append(items[i])
    }
    return group
}
//生成answerInline
function answerInline(answer){
    return $('<div class="answerInline"><label>正确答案:</label>'+answer+'</div>')
}
//生成explainInline
function explainInline(explain){
    return $('<div class="explainInline"><label>解析:</label>'+explain+'</div>')
}
//生成填空输入框
function fillBlank(id, title, pos, classes){
    console.log(pos)
    var posReg = new RegExp(pos,'g')
    var blankLen = title.match(posReg).length
    var split = title.split(posReg)
    console.log(blankLen)
    var newTitle = ''
    for(var i=0;i<(blankLen+split.length);i++){
        if(i%2===0){
            newTitle +=  '<p class="title">'+split[Math.floor(i/2)]+'</div>'
        }else{
            newTitle +=  new OO.ui.TextInputWidget( {
                name:'textInput-'+id+'-'+Math.floor(i/2),
                id:'textInput-'+id+'-'+Math.floor(i/2),
                classes:classes
            } ).$element.prop('outerHTML')
        }
        
    }
    return newTitle
}
function newTimu(id,json, settings){
    settings = json.settings===undefined||json.isA3 ? settings:json.settings//检测json是否带有settings或者是否为A3子题目
    parent = settings.parent === undefined ? '' : settings.parent
    showHr = settings.showHr == undefined ? true : settings.showHr
    showSubmitBtn = settings.showSubmitBtn === undefined ? true : settings.showSubmitBtn
    showEditBtn = settings.showEditBtn === undefined ? true : settings.showEditBtn
    showBtnGroup = settings.showBtnGroup === undefined? true:settings.showBtnGroup
    var o = new Object()
    o.type = json.type
    o.pos = json.pos
    o.inputBox = json.inputBox
    o.source = json.source
    o.sourceRange = json.sourceRange
    o.info = json.info
    o.title = json.title
    o.options = json.choices
    console.log(o.options)
    //将choice 统一为Array的转换为obj
    if(typeOfObj(o.options)==='[object Array]'&&o.options.length===1&&o.type!=='A3'){
    	o.options = o.options[0]
    }
    o.options = o.options!==undefined? cleanOptions(o.options):''
    console.log(o.options)
    o.answer = json.answer
    o.explain = json.explain
    o.temp = {
        main:$('<div name="timu-'+(id+1)+'" id="'+id+'" class="type'+o.type+' timuContainer"><p class="timuID">'+id+'</p></div>'),
        subject:$('<form class="subject"></form>'),
        range:$('<div class="sourceRange"></div>'),
        info:$('<div class="info"></div>'),
        titleCon:$('<div class="titleContainer"></div>'),
        type:$('<p class="source"></p>'),
        source:$('<p class="source"></p>'),
        title:$('<p class="title"></p>'),
        options:$('<div class="options"></div>'),
        btn:$('<button type="button" class="button-small button-pill button button-caution" id="showSingle-' + id + '" class="showSingleBtn">提交</button>'),
        editBtn:$('<a class="editThisButton" style="display:none;font-size: 14px;margin-left: 5px" href="javascript:void(0)"><span class="" id="editThis-' + id + '">题目有误?点击编辑本题</span></a>'),
        ansCon:$('<div id="ansContainer" class="ansContainer noDisplay"></div>'),
        correct:$('<p style="display:inline;"><b>正确答案:</b></p><p class="correctAnswer"></p><br>'),
        explain:$('<p style="display:inline;"><b>解析: </b></p><p class="explain"></p><br>'),
        select:$('<select class="button-small button-rounded button"></select>'),
        subTitle:$('<div id=""></div>')
    }
    o.parent = parent
    // if(this.type==='A3'){
    //     	$(this).children('.subject').children('.editThisButton').fadeIn(1)
    //     }
    o.temp.main.hover(function () {
        $('editThis-' + id).fadeIn(10)
    },function (){
        $('editThis-' + id).fadeOut(70)
    })
    o.A = function () {
        //subjectForm 
        var optionsGroupObj = optionsGroup(this.type, id, this.options)
        var titleInlineObj = titleInline(id, this.type,this.source,undefined,this.title,'titleInline')
        var buttonGroupObj = showBtnGroup? buttonGroup(showSubmitBtn, showEditBtn, id, this.type, this.answer, this.temp.main):''
        var subjectForm = subjectFrom(id, [titleInlineObj, optionsGroupObj, buttonGroupObj])
        //resultGroupObj
        var answerInlineObj = answerInline(this.answer)
        var explainInlineObj = this.explain === undefined || this.explain === '' ? '暂无解析' : explainInline(this.explain)
        var resultGroupObj = resultGroup(id, [answerInlineObj, explainInlineObj])
        this.temp.main.append(subjectForm,resultGroupObj)
        if(showHr){this.temp.main.append('<hr>')}
        return this.temp.main
    }
    o.A2 = function () {
        //subjectForm 
        var optionsGroupObj = optionsGroup(this.type, id, this.options)
        var titleInlineObj = titleInline(id, this.type,this.source,undefined,this.title,'titleInline')
        var buttonGroupObj = buttonGroup(showSubmitBtn, showEditBtn, id, this.type, this.answer, this.temp.main)
        var subjectForm = subjectFrom(id, [titleInlineObj, optionsGroupObj, buttonGroupObj])
        //resultGroupObj
        var answerInlineObj = answerInline(this.answer)
        var explainInlineObj = this.explain === undefined || this.explain === '' ? '暂无解析' : explainInline(this.explain)
        var resultGroupObj = resultGroup(id, [answerInlineObj, explainInlineObj])
        this.temp.main.append(subjectForm,resultGroupObj)
        if(showHr){this.temp.main.append('<hr>')}
        return this.temp.main
    }
    o.A3 = function () {
        console.log(settings)
        var realSource = getRealSource(json.source)
        //subjectForm 
        var range = rangeInline(this.source, this.sourceRange)
        var info = infoInline(this.info)
        var subTitlesList = []
        for(var i=0;i<this.title.length;i++){
            if(this.explain[i]==undefined){
                this.explain[i] = '暂无解析'
            }
            var data = {
                'isA3':true,
                "type":"A",
                "source":realSource.prefix+realSource.source+'-'+(i+1),
                "title":this.title[i],
                "answer":this.answer[i],
                "explain":this.explain[i],
                "choices":this.options.get(i+''),
            }
            console.log(data)
            console.log(this.options)
            subTitlesList.push(newTimu(id+'-'+i,data,{
                showHr:false,
                showEditBtn:false,
                showSubmitBtn:false,
                showBtnGroup:false
            }).A())
        }
        
        console.log(this.answer)
        var buttonGroupObj  = buttonGroup(true, false, id, this.type, this.answer, this.temp.main)
        console.log(buttonGroupObj)
        var subjectFormObj = subjectFrom(id, [subTitlesList,buttonGroupObj])
        this.temp.main.append(range,info, subjectFormObj)
        this.temp.main.append('<hr>')
        return this.temp.main
    }
    o.B = function () {
        var realSource = getRealSource(json.source)
        //subjectForm 
        var range = rangeInline(this.source, this.sourceRange)
        var optionsGroupObj = optionsGroup(this.type, id, this.options)
        var titleInlineList = []
        for(var i=0;i<this.title.length;i++){
            var dropdown = dropDownInputWidget(id+'-'+i, mapKeysList(this.options))
            var titleInlineObj = titleInline(id+'-'+i, this.type, json.source, i, this.title[i],'titleInline')
            titleInlineObj.append(dropdown)
            titleInlineList.push(titleInlineObj)
        }
        var titlesGroupObj = titlesGroup(titleInlineList)
        var buttonGroupObj = buttonGroup(showSubmitBtn, showEditBtn, id, this.type, this.answer, this.temp.main)
        var subjectForm = subjectFrom(id, [optionsGroupObj, titlesGroupObj, buttonGroupObj])
        //resultGroupObj
        var resultGroupList = []
        for(var i=0;i<this.answer.length;i++){
            var answerInlineObj = answerInline(this.answer[i])
            var explainInlineObj = this.explain[i] === undefined || this.explain[i] === '' ? '暂无解析' : explainInline(this.explain[i])
            resultGroupList.push(
                    '<b>'+realSource.prefix+realSource.source+'-'+i+'</b>',
                    $('<div style="margin-left:10px"></div>').append(answerInlineObj),
                    $('<div style="margin-left:10px"></div>').append(explainInlineObj)
                )
        }
        var resultGroupObj = resultGroup(id, resultGroupList)
        this.temp.main.append(range ,subjectForm,resultGroupObj)
        if(showHr){this.temp.main.append('<hr>')}
        return this.temp.main
    }
    o.C = function () {
        var realSource = getRealSource(json.source)
        //subjectForm 
        var range = rangeInline(this.source, this.sourceRange)
        var optionsGroupObj = optionsGroup(this.type, id, this.options)
        var titleInlineList = []
        for(var i=0;i<this.title.length;i++){
            var dropdown = dropDownInputWidget(id+'-'+i, mapKeysList(this.options))
            var titleInlineObj = titleInline(id+'-'+i, this.type, json.source, i, this.title[i],'titleInline')
            titleInlineObj.append(dropdown)
            titleInlineList.push(titleInlineObj)
        }
        var titlesGroupObj = titlesGroup(titleInlineList)
        var buttonGroupObj = buttonGroup(showSubmitBtn, showEditBtn, id, this.type, this.answer, this.temp.main)
        var subjectForm = subjectFrom(id, [titlesGroupObj, optionsGroupObj, buttonGroupObj])
        //resultGroupObj
        var resultGroupList = []
        for(var i=0;i<this.answer.length;i++){
            var answerInlineObj = answerInline(this.answer[i])
            var explainInlineObj = this.explain[i] === undefined || this.explain[i] === '' ? '暂无解析' : explainInline(this.explain[i])
            resultGroupList.push(
                    '<b>'+realSource.prefix+realSource.source+'-'+i+'</b>',
                    $('<div style="margin-left:10px"></div>').append(answerInlineObj),
                    $('<div style="margin-left:10px"></div>').append(explainInlineObj)
                )
        }
        var resultGroupObj = resultGroup(id, resultGroupList)
        this.temp.main.append(range ,subjectForm,resultGroupObj)
        if(showHr){this.temp.main.append('<hr>')}
        return this.temp.main
    }
    o.X = function () {
        //subjectForm 
        var optionsGroupObj = optionsGroup(this.type, id, this.options)
        var titleInlineObj = titleInline(id, this.type,this.source,undefined,this.title,'titleInline')
        var buttonGroupObj = showBtnGroup? buttonGroup(showSubmitBtn, showEditBtn, id, this.type, this.answer, this.temp.main):''
        var subjectForm = subjectFrom(id, [titleInlineObj, optionsGroupObj, buttonGroupObj])
        //resultGroupObj
        var answerInlineObj = answerInline(this.answer)
        var explainInlineObj = this.explain === undefined || this.explain === '' ? '暂无解析' : explainInline(this.explain)
        var resultGroupObj = resultGroup(id, [answerInlineObj, explainInlineObj])
        this.temp.main.append(subjectForm,resultGroupObj)
        if(showHr){this.temp.main.append('<hr>')}
        return this.temp.main
    }
    o.PD = function () {
    	var dic = {
		      right: ['对', '正确', 't', '✓', '√', '1', 'true'],
		      wrong: ['错', '错误', '×', 'x', 'f', 'false', 'wrong', '0']
		    }
        this.temp.type.text('判断')
        this.temp.source.text(json.source)
        this.temp.title.html(json.title)
        this.temp.explain.nextAll('.explain').html(json.explain)
        var ans = ''
        var ansOption = ''
        if(isInArray(dic.right, json.answer.toLowerCase())){
            ans = '正确'
            ansOption = 'A'
        }else if(isInArray(dic.wrong, json.answer.toLowerCase())){
            ans = '错误'
            ansOption = 'B'
        }else {
        	ans = '系统错误:该判断题答案不符合标准格式'
        }
        //subjectForm 
        var option = new Map()
        option.set('A', '正确')
        option.set('B', '错误')
        var optionsGroupObj = optionsGroup(this.type, id, option)
        var titleInlineObj = titleInline(id, this.type,this.source,undefined,this.title,'titleInline')
        var buttonGroupObj = showBtnGroup? buttonGroup(showSubmitBtn, showEditBtn, id, 'A', ansOption, this.temp.main):''
        var subjectForm = subjectFrom(id, [titleInlineObj, optionsGroupObj, buttonGroupObj])
        //resultGroupObj
        var answerInlineObj = answerInline(ans)
        var explainInlineObj = this.explain === undefined || this.explain === '' ? '暂无解析' : explainInline(this.explain)
        var resultGroupObj = resultGroup(id, [answerInlineObj, explainInlineObj])
        this.temp.main.append(subjectForm,resultGroupObj)
        if(showHr){this.temp.main.append('<hr>')}
        return this.temp.main
    }
    o.TK = function () {
        var tkTitle = fillBlank(id, this.title, this.pos, ['textInput-tk'])
        var titleInlineObj = titleInline(id, this.type,this.source,undefined,tkTitle, 'titleInline-no-flex')
        titleInlineObj.children('.textInput-tk').each(function(i,v){
            console.log(i,v)
            $(this).children('input').css(
                'display','inline'
            )
            $(this).children('input').css(
                'width','200px'
            )
        })
        var buttonGroupObj = showBtnGroup? buttonGroup(showSubmitBtn, showEditBtn, id, this.type, this.answer, this.temp.main):''
        var subjectForm = subjectFrom(id, [titleInlineObj, buttonGroupObj])
        this.temp.main.append(subjectForm)
        if(showHr){this.temp.main.append('<hr>')}
        return this.temp.main
    }
    o.MJ = function () {
        var mjTitle = ''
        if(this.inputBox===0){
            mjTitle = json.title + ':<span class="blur" tabindex="0" style="display:inline;outline=0;" onclick="">' + json.answer +'</span>'
        }else{
            mjTitle = fillBlank(id, this.title+':()', '()', ['textInput-mj'])
        }
        var titleInlineObj = titleInline(id, this.type,this.source,undefined,mjTitle, 'titleInline-no-flex')
        titleInlineObj.children('.textInput-mj').each(function(i,v){
            console.log(i,v)
            $(this).children('input').css(
                'display','inline'
            )
            $(this).children('input').css(
                'width','auto'
            )
        })
        var buttonGroupObj = this.inputBox!==0 ? buttonGroup(showSubmitBtn, showEditBtn, id, 'TK', [this.answer], this.temp.main):''
        var subjectForm = subjectFrom(id, [titleInlineObj, buttonGroupObj])
        this.temp.main.append(subjectForm)
        if(showHr){this.temp.main.append('<hr>')}
        return this.temp.main
    }
    return o
}
function getSelectedAnswer(id){
    var data = formToJSON('#timuFrom-'+id,true)
    return data
}
function showThisAnswer(id,type,correctAnswer){
    var subjectCon = $('#'+id)
    var titleCon = subjectCon.children('.subject').children('.titleContainer')
    var resultGroup = $('#resultGroup-'+id)
    resultGroup.fadeIn(100)
    var answers = subjectCon.children('.subject').children('.options')
    $('#showThisAnswer-'+id).fadeOut(1)
    if(type==="A" || type ==='A2'){
        var optionGroupID = 'optionsGroup-'+id
        var optionInlinePrefixID = 'option-'+id
        var usersChoice = getSelectedAnswer(id)[optionGroupID]
        var correctDivObj = $('#'+optionInlinePrefixID + '-' + correctAnswer)
        var usersChoiceDivObj = $('#'+optionInlinePrefixID + '-' + usersChoice)
        
        if(usersChoice===correctAnswer){
            correctDivObj.addClass('correct')
        }else{
            correctDivObj.addClass('correct')
            usersChoiceDivObj.addClass('wrong')
        }
    }else if(type==='A3'){
        for(var i=0;i<correctAnswer.length;i++){
            //以下与A型题时一样的代码,知识用subID替换ID变量
            showThisAnswer(id+'-'+i,'A',correctAnswer[i])
        }
    } else if(type==='B'){
        var dropDownInputPrefix = 'dropdown-input-'+id +'-'
        var usersChoice = getSelectedAnswer(id)
        console.log(usersChoice)
        for(var i in usersChoice){
            var dorpdownID = i.replace(dropDownInputPrefix,'')//获取子ID
            var subTimuID = id+'-'+dorpdownID
            var thisTimuUsersChoice = usersChoice[i]
            var thisTimuCorrectAnswer = correctAnswer[dorpdownID]
            var subTimuDiv = $('#title-'+subTimuID)
            if(thisTimuUsersChoice===thisTimuCorrectAnswer){
                subTimuDiv.addClass('correct')
            }else{
                subTimuDiv.addClass('wrong')
                subTimuDiv.append('<label class="answerTip">正确答案:'+thisTimuCorrectAnswer+'</label>')
            }
        }
    } else if(type=="C"){
        var dropDownInputPrefix = 'dropdown-input-'+id +'-'
        var usersChoice = getSelectedAnswer(id)
        console.log(usersChoice)
        for(var i in usersChoice){
            var dorpdownID = i.replace(dropDownInputPrefix,'')//获取子ID
            var subTimuID = id+'-'+dorpdownID
            var thisTimuUsersChoice = usersChoice[i]
            var thisTimuCorrectAnswer = correctAnswer[dorpdownID]
            var subTimuDiv = $('#title-'+subTimuID)
            if(thisTimuUsersChoice===thisTimuCorrectAnswer){
                subTimuDiv.addClass('correct')
            }else{
                subTimuDiv.addClass('wrong')
                subTimuDiv.append('<label class="answerTip">正确答案:'+thisTimuCorrectAnswer+'</label>')
            }
        }
    }else if(type=="X"){
        var optionGroupID = 'optionsGroup-'+id
        var optionInlinePrefixID = 'option-'+id
        var usersChoice = getCheckBoxValue(optionGroupID).sort()
        correctAnswer = correctAnswer.match(/[A-Z]/g).sort()
        var lenCorrect = correctAnswer.length
        var lenUser = usersChoice.length
        console.log(correctAnswer)
        for(var i=0;i<lenUser;i++){
            console.log(isInArray(correctAnswer, usersChoice[i]),usersChoice[i] ,correctAnswer)
            if(!isInArray(correctAnswer, usersChoice[i])){
                $('#'+optionInlinePrefixID + '-' + usersChoice[i]).addClass('wrong')
            }
        }
        for(var i=0;i<lenCorrect;i++){
            if(!isInArray(usersChoice,correctAnswer[i])){
                $('#'+optionInlinePrefixID + '-' + correctAnswer[i]).addClass('notChoiced')
            }else {
                $('#'+optionInlinePrefixID + '-' + correctAnswer[i]).addClass('correct')
            }
        }
        
    }else if(type=="TK"){
        var textInputPrefix = 'textInput-'+id+'-'
        var usersChoice = getSelectedAnswer(id)
        for(var i in usersChoice){
            var inputID = i.replace(textInputPrefix,'')
            console.log('#'+i)
            var corrcetAnswerText = correctAnswer[inputID]===undefined?'暂无答案':correctAnswer[inputID]
            if(usersChoice[i]===correctAnswer[inputID]){
                $('#'+i).html('<label class="answerTip correct">'+corrcetAnswerText+'</label>')
            }else{
                $('#'+i).after('<label class="answerTip wrong">'+corrcetAnswerText+'</label>')
            }
        }
    }
}
function removeBackground(obj){
    obj.addClass('no-background')
}
//DOM操作
//获取checkbox值
function  getCheckBoxValue(name) {
    var  ids = $('input:checkbox[name="'+name+'"]:checked');
    var data = [];
     for (var i = 0; i < ids.length; i ++) {
         //利用三元运算符去点
         data.push(ids[i].value)
     }
     return data
}
//将题目放在模板加载位置
function addAfterIDData(id,content) {
    var data = $('.data')
    content.insertAfter(data[id])
}
//渲染题目
function render(id,type,obj,parent,isAfter){
    parent =parent !==undefined ?parent : '#subjectContainer-'+type
    if(typeof(parent)!=='object'){
        parent = $(parent)
    }
    if(isObjExist(parent)){
        if(isAfter){
            parent.after(obj)
        }else {
            obj.appendTo(parent)
        }
    }else {
        addAfterIDData(id,obj)
    }
}
//基础函数
//判断函数
function isObjExist(t){
    return $(t).length>0
}
function isInArray (arr, value) {
  for (var i = 0; i < arr.length; i++) {
    if (value === arr[i]) {
      return true
    }
  }
  return false
}
//数据查询函数
function dicLen(dic){
    var count=0;
    for(var key in dic){
        console.log(key+'='+dic[key]);
        count++;
    }
    return count
}
//html操作函数
function entityToString(entity){
    var div=$('<div></div>');
    div.html(entity)
    var res=div.html();
    console.log(entity,'->',res);
    return res;
}
//获取map中键的列表
function mapKeysList(map){
    return Array.from(map.keys())
}
//数据清理
//去除字典中的空值
function filterEmptyEntries(dic){
    console.log(Object.fromEntries(
        Object.entries(dic).filter(function(key, value){return value !== null && value !== undefined && value.length !== 0})
    ))
    return Object.fromEntries(
        Object.entries(dic).filter(function(key, value){return value !== null && value !== undefined && value.length !== 0})
    )
}
//排序字典并返回一个map对象
function sortDicByKey(dic){
    var sort = Object.keys(dic).sort()
    var map = new Map()
    for(var i=0;i<sort.length;i++){
        map.set(sort[i],dic[sort[i]])
    }
    return map
}