注意:在发布之后,您可能需要清除浏览器缓存才能看到所作出的变更的影响。
- Firefox或Safari:按住Shift的同时单击刷新,或按Ctrl-F5或Ctrl-R(Mac为⌘-R)
- Google Chrome:按Ctrl-Shift-R(Mac为⌘-Shift-R)
- Internet Explorer或Edge:按住Ctrl的同时单击刷新,或按Ctrl-F5
- Opera:按 Ctrl-F5。
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)
}
}
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+'">'+
'<b>功能升级中,暂时无法使用</b><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 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'){
console.log('1111')
}
if ( action ) {
return new OO.ui.Process( function () {
dialog.close( { action: action } );
windowManager.remove(dialog)
} );
}
return MyProcessDialog.super.prototype.getActionProcess.call( this, action );
};
openWindows(MyProcessDialog,windowManager)
//获取页面内容
var namespace = $('.mw-page-title-namespace').text()===''?'':$('.mw-page-title-namespace').text()+':'
var pageName = namespace+$('.mw-page-title-main').text()
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 = latestPageData.match(regMatchInner)
var full = latestPageData.match(regMatchFull)
console.log(inner)
console.log(full)
$('#oldWikiText').html('<pre>'+inner+'</pre>')
}
} );
}
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.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><div id="oldWikiText"></div><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:[],
choicesDicList:[],
choicesTextList:[],
choices:''
}
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){
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 getPageRevision(url, title, pageCount) {
pageCount = pageCount !== undefined ? pageCount : 1
var PARAMS = {
"action": "query",
"format": "json",
"prop": "revisions",
"titles": title,
"utf8": 1,
"rvprop": "content",
"rvlimit": pageCount,
"rvdir": "older",
'origin': '*',
}
var isSuccess = {}
$.ajax(
{
url: url,
method: "post",
async: false,
data: PARAMS,
timeout: 5000,
success: function (results) {
if ('-1' in results.query.pages) {
console.log('===无此页面===')
isSuccess = {isSuccess: false, result: results}
} else {
isSuccess = {isSuccess: true, result: results}
}
}
})
return isSuccess
}
function getLatestPageRevision(url, title) {
var pages = getPageRevision(url, title, 1)
if (pages.isSuccess) {
pages = pages.result.query.pages
for (var key in pages) {
var page = pages[key].revisions[0]['*']
}
return page
} else {
return false
}
}
//编辑页面
function editpage_common(async, url, token, title, content, model, tags, summary, message) {
async = async !== undefined ? async : true
model = model !== undefined ? model : 'wikitext'
tags = tags !== undefined ? tags : ''
summary = summary !== undefined ? summary : ''
message = message !== undefined ? message : ''
var isSuccess = false
var PARAMS = {
"action": "edit",
"format": "json",
"title": title,
"text": content,
"token": token,
'contentmodel': model,
"summary": summary,
"tags": tags,
}
$.ajax({
url: url,
method: "post",
async: async,
data: PARAMS,
timeout: 5000,
success: function (results) {
var apiResult = results['edit']['result']
if (apiResult == "Success") {
isSuccess = [true]
console.log("===editpage_common 成功===")
// newMessage('成功:上传成功','#88F888')
} else {
isSuccess = [false,results['error']]
}
processingOff()
},
error: function () {
// newMessage('失败:上传失败','#ffaca6')
}
})
return isSuccess
}
//获取token
function get_token(url, origin) {
var isSuccess = [false, '0']
var PARAMS = {
"action": "query",
"format": "json",
'meta': 'tokens',
'origin': origin,
}
$.ajax(
{
url: url,
method: "post",
async: false,
data: PARAMS,
timeout: 5000,
success: function (results) {
var token = results.query.tokens.csrftoken
if (token.length >= 5) {
isSuccess = {isSuccess: true, token: token}
}
}
})
return isSuccess
}