更多操作
无编辑摘要 |
无编辑摘要 |
||
(未显示同一用户的27个中间版本) | |||
第6行: | 第6行: | ||
//检查是否为刷题云储存页面 | //检查是否为刷题云储存页面 | ||
function isRecordsPages(){ | function isRecordsPages(){ | ||
var url = window.location.href | |||
var isEditPage = url.indexOf('&') | |||
var regMatch = new RegExp('Records/') | |||
console.log(url) | |||
if(regMatch.test(url)&&isEditPage===-1){ | |||
var id = url.split(regMatch)[1] | |||
return id | |||
}else{ | |||
return false | |||
} | |||
} | |||
function downloadWrongTimu(title,time,result) { | |||
var counter = {} | |||
var url = window.location.href | |||
var reg = new RegExp('http[\\s\\S]+\\.cn') | |||
var apiURL = url.match(reg)[0] + '/medf/api.php' | |||
var script = getLatestPageRevision(apiURL,'MediaWiki:Gadget-tikuRenderModule.js') | |||
var css = getLatestPageRevision(apiURL,'MediaWiki:Gadget-tiku.css') | |||
var timu = getParsedWikiText(apiURL,title) | |||
var extractedTimu = $('<div></div>') | |||
console.log(result) | |||
if(timu.status){ | |||
$(timu.result).children('.data').each( | |||
function () { | |||
console.log(counter) | |||
console.log($(this).html()) | |||
console.log($(this).text()) | |||
var content = $.parseJSON($(this).text()) | |||
var type = content.type | |||
console.log(type) | |||
console.log(content) | |||
counter[type] = counter[type] !== undefined ? counter[type] : 0 | |||
console.log(result[type][counter[type]]) | |||
if(result[type][counter[type]].isDone&&(!result[type][counter[type]].isRight)){ | |||
extractedTimu.append($(this)) | |||
} | |||
counter[type] += 1 | |||
} | |||
) | |||
} | |||
var html = '<!DOCTYPE html>\n' + | |||
'<html lang="en">\n' + | |||
'<head>\n' + | |||
' <meta charset="UTF-8">\n' + | |||
' <title></title>\n' + | |||
' <script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>' + | |||
'<style>'+css+'</style>' + | |||
'</head>\n' + | |||
'<body>\n' + | |||
extractedTimu.html() + | |||
'<script>'+script+'</script>' + | |||
'</body>\n' + | |||
'</html>' | |||
console.log(html) | |||
downloadFile(title+'.html', html) | |||
} | |||
function downloadAllTimu(title,time) { | |||
var url = window.location.href | |||
var reg = new RegExp('http[\\s\\S]+\\.cn') | |||
var apiURL = url.match(reg)[0] + '/medf/api.php' | |||
var script = getLatestPageRevision(apiURL,'MediaWiki:Gadget-tikuRenderModule.js') | |||
var css = getLatestPageRevision(apiURL,'MediaWiki:Gadget-tiku.css') | |||
var timu = getParsedWikiText(apiURL,getLatestPageRevisionAsTime(apiURL,title,time)) | |||
var extractedTimu = $('<div></div>') | |||
if(timu.status){ | |||
$(timu.result).children('.data').each( | |||
function () { | |||
// var content = $.parseJSON($(this).text()) | |||
// var type = content.type | |||
extractedTimu.append($(this)) | |||
} | |||
) | |||
} | |||
var html = '<!DOCTYPE html>\n' + | |||
'<html lang="en">\n' + | |||
'<head>\n' + | |||
' <meta charset="UTF-8">\n' + | |||
' <title></title>\n' + | |||
' <script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>' + | |||
'<style>'+css+'</style>' + | |||
'</head>\n' + | |||
'<body>\n' + | |||
extractedTimu.html() + | |||
'<script>'+script+'</script>' + | |||
'</body>\n' + | |||
'</html>' | |||
console.log(html) | |||
downloadFile(title+'.html', html) | |||
} | |||
function downloadFile(fname,content) { | |||
var blob = new Blob([content], {type: 'text/plain' }); | |||
const url3 = window.URL.createObjectURL(blob); | |||
console.log(url3); | |||
var timestamp = new Date().getTime() | |||
var filename = fname | |||
const link = document.createElement('a'); | |||
link.style.display = 'none'; | |||
link.href = url3; | |||
link.setAttribute('download', filename); | |||
document.body.appendChild(link); | |||
link.click(); | |||
} | |||
function getFirstPageContent(obj){ | |||
obj = obj.result.query.pages | |||
for(var i in obj){ | |||
obj = obj[i] | |||
} | |||
obj = obj.revisions[0]['*'] | |||
return obj | |||
} | |||
//解析json | |||
function parseRecordsJSON(url,content){ | |||
var data | |||
var PARAMS = { | |||
"action": "parse", | |||
"format": "json", | |||
"text":content, | |||
"contentmodel": "json", | |||
"utf8": 1, | |||
"origin":"*" | |||
} | |||
$.ajax({ | |||
async: true, | |||
type: "post", | |||
url: url, | |||
data: PARAMS, | |||
datatype: 'json', | |||
success: function (datas) { | |||
data = datas['parse']['text']['*'] | |||
// $('#mw-content-text').html(data) | |||
} | |||
}); | |||
return data | |||
} | |||
function getFormatTime(timestamp, clean){ | |||
clean = clean !== undefined ? clean: true | |||
var nowDate | |||
if(timestamp===undefined){ | |||
nowDate= new Date(); | |||
}else { | |||
nowDate = new Date(timestamp); | |||
} | |||
var year = nowDate.getFullYear(); | |||
var month = nowDate.getMonth() + 1 < 10 ? "0" + (nowDate.getMonth() + 1) : nowDate.getMonth() + 1; | |||
var date = nowDate.getDate() < 10 ? "0" + nowDate.getDate() : nowDate.getDate(); | |||
var hour = nowDate.getHours()< 10 ? "0" + nowDate.getHours() : nowDate.getHours(); | |||
var minute = nowDate.getMinutes()< 10 ? "0" + nowDate.getMinutes() : nowDate.getMinutes(); | |||
var second = nowDate.getSeconds()< 10 ? "0" + nowDate.getSeconds() : nowDate.getSeconds(); | |||
var time = '' | |||
if(clean){ | |||
time = year + "-" + month + "-" + date+" "+hour+":"+minute+":"+second; | |||
}else { | |||
time = year + "-" + month + "-" + date+"T"+hour+":"+minute+":"+second+'Z' | |||
} | |||
return time | |||
} | |||
function dicToList(obj){ | |||
var result = [] | |||
for(var i in obj){ | |||
result.push(obj[i]) | |||
} | |||
return result | |||
} | |||
function progressBar() { | |||
var o = new Object() | |||
o.bar = function (title,percentage,data,colorBorder,color,parent) { | |||
var container = $('<div class="progress-bar-container"></div>') | |||
var titleText = $('<div class="progress-bar-title">'+title+'</div>') | |||
var progressbar = $('<div class="progress-bar"></div>') | |||
var progressbarContent = $('<div class="progress-bar-content"></div>') | |||
var dataText = $('<div class="progress-bar-data">'+data+'</div>') | |||
progressbar.css({ | |||
'outline': '1px solid '+colorBorder, | |||
}) | |||
progressbarContent.css({ | |||
'background-color':color, | |||
'width':percentage+'%' | |||
}) | |||
progressbar.append(progressbarContent) | |||
container.append(titleText,progressbar,dataText) | |||
return container | |||
} | |||
return o | |||
} | |||
function readResult(data) { | |||
var result = {all:0, notdone:0, right:0, wrong:0} | |||
for(var i in data.results){ | |||
if(typeof(data.results[i])=='object'){ | |||
data.results[i] = dicToList(data.results[i]) | |||
} | |||
if(data.results[i].length>0) { | |||
for (var n = 0; n < data.results[i].length; n++) { | |||
result.all += 1 | |||
if(data.results[i][n].isDone && data.results[i][n].isRight){ | |||
result.right += 1 | |||
}else if(!data.results[i][n].isDone){ | |||
result.notdone += 1 | |||
}else { | |||
result.wrong += 1 | |||
} | |||
} | |||
} | |||
} | |||
return result | |||
} | |||
function round(number,digit) { | |||
var result | |||
var dig = 1 | |||
for(var i=0;i<digit;i++){ | |||
dig = dig * 10 | |||
} | |||
result = Math.round(number * dig) / dig | |||
result = result.toString() | |||
return result | |||
} | |||
function getSameData(fullData, searchTitle, order) { | |||
var container = $('<div class="single-data-container"></div>') | |||
var counter = 1 | |||
var latestTime = '' | |||
for(var i in fullData){ | |||
var data = fullData[i] | |||
var title = data.list.title | |||
if(searchTitle === title){ | |||
latestTime = data.list.time | |||
var singleData = $('<div class="single-data data-folded"></div>') | |||
var header = $('<div class="single-header"></div>') | |||
var content = $('<div class="single-content"></div>') | |||
var ending = $('<div class="single-ending"></div>') | |||
var headerText = '' | |||
var result = readResult(data) | |||
//一些计算的参数 | |||
var calCorrect = (round(result.right/(result.all-result.notdone),4)*100).toFixed(2) | |||
var calFinish = (round((result.all-result.notdone)/result.all,4)*100).toFixed(2) | |||
headerText = '<p class="single-header-title-counter">第 ' + counter + ' 次</p>' + | |||
'<p class="single-header-title-time">'+data.list.time+'</p>' | |||
// '<p class="single-header-title-finish">完成度:'+(result.all-result.notdone)+'/'+result.all+'['+calFinish+'%]</p>' + | |||
// '<p class="single-header-title-correct">正确率:'+result.right+'/'+(result.all-result.notdone)+'['+calCorrect+'%]</p>' | |||
header.bind('click', function () { | |||
fold($(this).parent(),0) | |||
}) | |||
header.html(headerText) | |||
//生成内容 | |||
var functionModule = $('<div class="function-module"></div>') | |||
var graphs = $('<div class="graph-module"></div>') | |||
var bar = new progressBar() | |||
var finish = bar.bar('完成度',calFinish,(result.all-result.notdone)+'/'+result.all,'black','#36c') | |||
var correct = bar.bar('正确率',calCorrect,result.right+'/'+(result.all-result.notdone),'black','#36c') | |||
graphs.append(finish,correct) | |||
var bind = bindBtnData(data,searchTitle) | |||
functionModule.append(bind.all,bind.wrong,'<hr>',graphs,'<hr>') | |||
content.append(functionModule) | |||
singleData.append(header,content,ending) | |||
if(order){ | |||
container.append(singleData) | |||
}else { | |||
container.prepend(singleData) | |||
} | |||
counter += 1 | |||
} | |||
} | |||
return {container:container,counter:counter-1,latestTime:latestTime} | |||
} | |||
function bindBtnData(data,title) { | |||
var downloadWrongBtn = $('' + | |||
'<span class="blue-btn-container">' + | |||
'<a class="blue-btn-a">' + | |||
'<span>下载错题</span>' + | |||
'</a>' + | |||
'</span>') | |||
var downloadAllBtn = $('' + | |||
'<span class="blue-btn-container">' + | |||
'<a class="blue-btn-a">' + | |||
'<span>下载本题库</span>' + | |||
'</a>' + | |||
'</span>') | |||
downloadAllBtn.bind('click',function () { | |||
var wikiTime = data.list.time | |||
try{ | |||
downloadAllTimu(title,wikiTime) | |||
}catch (e) { | |||
alert('下载失败,请重试(本功能仍在测试,如果题目更新导致原题库数量有变化失败属正常现象)' + | |||
'错误原因:'+e) | |||
} | |||
}) | |||
console.log(data) | |||
downloadWrongBtn.bind('click',function () { | |||
var wikiTime = data.list.time | |||
console.log(data) | |||
try{ | |||
downloadWrongTimu(title,wikiTime,data.results) | |||
}catch (e) { | |||
alert('下载失败,请重试(本功能仍在测试,如果题目更新导致原题库数量有变化失败属正常现象)' + | |||
'错误原因:'+e) | |||
} | |||
}) | |||
return {all:downloadAllBtn,wrong:downloadWrongBtn} | |||
} | |||
function mainFrame(fullData) { | |||
var mainFrame = $('<div class="main-data-container"></div>') | |||
var titlesSet = [] | |||
for(var i in fullData){ | |||
var data = fullData[i] | |||
var title = data.list.title | |||
if(titlesSet.indexOf(title)!==-1){continue} | |||
var singleDataSet = $('<div id="dataset-'+i+'" class="single-data-set data-folded"></div>') | |||
var dataContainers = getSameData(fullData,title,true) | |||
var header = $('<div class="list-title">' + | |||
'<p class="title-id">'+i+'</p>' + | |||
'<span class="title-content">' + | |||
'<a href="https://www.medforest.cn/dic/'+title+'">'+title+'</a>' + | |||
'<p class="title-content-time">最近一次答题:'+dataContainers.latestTime+'</p>' + | |||
'<p class="title-content-counter">共 '+dataContainers.counter+' 条数据</p>' + | |||
'</span></div>') | |||
header.bind('click', function () { | |||
fold($(this).parent()) | |||
}) | |||
singleDataSet.append(header,dataContainers.container) | |||
singleDataSet.prependTo(mainFrame) | |||
} | |||
return mainFrame | |||
} | |||
function fold(selector,openSpeed,closeSpeed) { | |||
openSpeed = openSpeed !== undefined ? openSpeed : 'fast' | |||
closeSpeed = closeSpeed !== undefined ? closeSpeed : 'fast' | |||
var defaultHeight = $('.data-folded').height() | |||
var paddingHeight = 10 | |||
var targetHeight = defaultHeight + paddingHeight + selector.children('.single-data-container').height() | |||
var currentHeight = selector.height() | |||
if(defaultHeight === currentHeight){ | |||
selector.animate({ | |||
height: targetHeight | |||
}, openSpeed,function () { | |||
selector.removeClass('data-folded') | |||
selector.css('height','auto') | |||
}); | |||
}else { | |||
selector.animate({ | |||
height: defaultHeight | |||
}, closeSpeed); | |||
selector.addClass('data-folded') | |||
} | |||
} | } | ||
//维基交互 | |||
function getParsedWikiText(url, title){ | |||
var status = false | |||
var returnResult = '' | |||
var PARAMS = { | |||
"action": "parse", | |||
"format": "json", | |||
"page": title, | |||
"utf8": 1, | |||
'origin':'*', | |||
} | |||
$.ajax( | |||
{ | |||
url: url, | |||
method: "post", | |||
async: false, | |||
data: PARAMS, | |||
timeout: 5000, | |||
success: function (results){ | |||
if(results.parse.text['*'] !== undefined){ | |||
returnResult = results.parse.text['*'] | |||
status = true | |||
} | |||
} | |||
}) | |||
return {status:status,result:returnResult} | |||
} | |||
//获取某个页面的历史版本 | //获取某个页面的历史版本 | ||
function getPageRevision(url, title, pageCount){ | function getPageRevision(url, title, pageCount){ | ||
pageCount = pageCount !== undefined ? pageCount : 1 | |||
var PARAMS = { | var PARAMS = { | ||
"action": "query", | "action": "query", | ||
第28行: | 第397行: | ||
"rvlimit": pageCount, | "rvlimit": pageCount, | ||
"rvdir": "older", | "rvdir": "older", | ||
'origin':origin, | |||
} | } | ||
var isSuccess = {} | var isSuccess = {} | ||
第49行: | 第418行: | ||
return isSuccess | return isSuccess | ||
} | } | ||
// | function getLatestPageRevision(url, title) { | ||
function | 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 getLatestPageRevisionAsTime(url,title,timestamp){ | |||
var PARAMS = { | var PARAMS = { | ||
"action": "query", | |||
"format": "json", | |||
"prop": "revisions", | |||
"titles": title, | |||
"utf8": 1, | |||
"rvprop": "ids|timestamp|content", | |||
} | "rvlimit": "1", | ||
$.ajax({ | "rvstart": timestamp, | ||
"rvdir": "older", | |||
} | |||
var isSuccess = {} | |||
$.ajax( | |||
{ | |||
url: url, | |||
method: "post", | |||
async: false, | |||
data: PARAMS, | |||
timeout: 5000, | |||
return | success: function (results){ | ||
if('-1' in results.query.pages){ | |||
console.log('===无此页面===') | |||
isSuccess = false | |||
}else { | |||
var pages = results.query.pages | |||
console.log(pages) | |||
for (var key in pages) { | |||
var page = pages[key].revisions[0]['*'] | |||
} | |||
isSuccess=page | |||
} | |||
} | |||
}) | |||
return isSuccess | |||
} | } | ||
//主函数 | //主函数 | ||
function unzipRecords(){ | function unzipRecords(){ | ||
var id = isRecordsPages() | |||
console.log(id) | |||
if(!id){ | |||
return '非题库云储存页面!' | |||
} | |||
// var zippedContent = getFirstPageContent(getPageRevision('https://www.medforest.cn/medf/api.php','题库:Records/66',1)) | |||
// console.log(zippedContent) | |||
var zippedContent= $('#mw-content-text').text().replace('[标记此页面为已巡查]','') | |||
$('#mw-content-text').html('<h4 style="color:red;">正在分析做题数据</h4>') | |||
console.log(zippedContent) | |||
var unzipped = unzip(zippedContent) | |||
var jsonData = JSON.parse(unzipped) | |||
console.log(jsonData.archive) | |||
var parsed=parseRecordsJSON('https://www.medforest.cn/medf/api.php',unzipped) | |||
var id = 0 | |||
var mainContainer = $('<div class="data-list-container"></div>') | |||
mainFrame(jsonData.archive).appendTo(mainContainer) | |||
$('#mw-content-text').html('<div><h2>说明:</h2><p class="inline">数据按最后一次做题的时间倒序排列,第一列数字是对应存档的ID,显示的时间是最近一次做本题库的时间</p><hr></div>') | |||
$('#mw-content-text').append(mainContainer) | |||
} | } | ||
unzipRecords() | unzipRecords() |
2023年3月12日 (日) 13:45的最新版本
function unzip(b64Data) {
var strData = atob(b64Data);
strData = pako.ungzip(strData,{to: 'string'});
return decodeURIComponent(strData);
}
//检查是否为刷题云储存页面
function isRecordsPages(){
var url = window.location.href
var isEditPage = url.indexOf('&')
var regMatch = new RegExp('Records/')
console.log(url)
if(regMatch.test(url)&&isEditPage===-1){
var id = url.split(regMatch)[1]
return id
}else{
return false
}
}
function downloadWrongTimu(title,time,result) {
var counter = {}
var url = window.location.href
var reg = new RegExp('http[\\s\\S]+\\.cn')
var apiURL = url.match(reg)[0] + '/medf/api.php'
var script = getLatestPageRevision(apiURL,'MediaWiki:Gadget-tikuRenderModule.js')
var css = getLatestPageRevision(apiURL,'MediaWiki:Gadget-tiku.css')
var timu = getParsedWikiText(apiURL,title)
var extractedTimu = $('<div></div>')
console.log(result)
if(timu.status){
$(timu.result).children('.data').each(
function () {
console.log(counter)
console.log($(this).html())
console.log($(this).text())
var content = $.parseJSON($(this).text())
var type = content.type
console.log(type)
console.log(content)
counter[type] = counter[type] !== undefined ? counter[type] : 0
console.log(result[type][counter[type]])
if(result[type][counter[type]].isDone&&(!result[type][counter[type]].isRight)){
extractedTimu.append($(this))
}
counter[type] += 1
}
)
}
var html = '<!DOCTYPE html>\n' +
'<html lang="en">\n' +
'<head>\n' +
' <meta charset="UTF-8">\n' +
' <title></title>\n' +
' <script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>' +
'<style>'+css+'</style>' +
'</head>\n' +
'<body>\n' +
extractedTimu.html() +
'<script>'+script+'</script>' +
'</body>\n' +
'</html>'
console.log(html)
downloadFile(title+'.html', html)
}
function downloadAllTimu(title,time) {
var url = window.location.href
var reg = new RegExp('http[\\s\\S]+\\.cn')
var apiURL = url.match(reg)[0] + '/medf/api.php'
var script = getLatestPageRevision(apiURL,'MediaWiki:Gadget-tikuRenderModule.js')
var css = getLatestPageRevision(apiURL,'MediaWiki:Gadget-tiku.css')
var timu = getParsedWikiText(apiURL,getLatestPageRevisionAsTime(apiURL,title,time))
var extractedTimu = $('<div></div>')
if(timu.status){
$(timu.result).children('.data').each(
function () {
// var content = $.parseJSON($(this).text())
// var type = content.type
extractedTimu.append($(this))
}
)
}
var html = '<!DOCTYPE html>\n' +
'<html lang="en">\n' +
'<head>\n' +
' <meta charset="UTF-8">\n' +
' <title></title>\n' +
' <script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>' +
'<style>'+css+'</style>' +
'</head>\n' +
'<body>\n' +
extractedTimu.html() +
'<script>'+script+'</script>' +
'</body>\n' +
'</html>'
console.log(html)
downloadFile(title+'.html', html)
}
function downloadFile(fname,content) {
var blob = new Blob([content], {type: 'text/plain' });
const url3 = window.URL.createObjectURL(blob);
console.log(url3);
var timestamp = new Date().getTime()
var filename = fname
const link = document.createElement('a');
link.style.display = 'none';
link.href = url3;
link.setAttribute('download', filename);
document.body.appendChild(link);
link.click();
}
function getFirstPageContent(obj){
obj = obj.result.query.pages
for(var i in obj){
obj = obj[i]
}
obj = obj.revisions[0]['*']
return obj
}
//解析json
function parseRecordsJSON(url,content){
var data
var PARAMS = {
"action": "parse",
"format": "json",
"text":content,
"contentmodel": "json",
"utf8": 1,
"origin":"*"
}
$.ajax({
async: true,
type: "post",
url: url,
data: PARAMS,
datatype: 'json',
success: function (datas) {
data = datas['parse']['text']['*']
// $('#mw-content-text').html(data)
}
});
return data
}
function getFormatTime(timestamp, clean){
clean = clean !== undefined ? clean: true
var nowDate
if(timestamp===undefined){
nowDate= new Date();
}else {
nowDate = new Date(timestamp);
}
var year = nowDate.getFullYear();
var month = nowDate.getMonth() + 1 < 10 ? "0" + (nowDate.getMonth() + 1) : nowDate.getMonth() + 1;
var date = nowDate.getDate() < 10 ? "0" + nowDate.getDate() : nowDate.getDate();
var hour = nowDate.getHours()< 10 ? "0" + nowDate.getHours() : nowDate.getHours();
var minute = nowDate.getMinutes()< 10 ? "0" + nowDate.getMinutes() : nowDate.getMinutes();
var second = nowDate.getSeconds()< 10 ? "0" + nowDate.getSeconds() : nowDate.getSeconds();
var time = ''
if(clean){
time = year + "-" + month + "-" + date+" "+hour+":"+minute+":"+second;
}else {
time = year + "-" + month + "-" + date+"T"+hour+":"+minute+":"+second+'Z'
}
return time
}
function dicToList(obj){
var result = []
for(var i in obj){
result.push(obj[i])
}
return result
}
function progressBar() {
var o = new Object()
o.bar = function (title,percentage,data,colorBorder,color,parent) {
var container = $('<div class="progress-bar-container"></div>')
var titleText = $('<div class="progress-bar-title">'+title+'</div>')
var progressbar = $('<div class="progress-bar"></div>')
var progressbarContent = $('<div class="progress-bar-content"></div>')
var dataText = $('<div class="progress-bar-data">'+data+'</div>')
progressbar.css({
'outline': '1px solid '+colorBorder,
})
progressbarContent.css({
'background-color':color,
'width':percentage+'%'
})
progressbar.append(progressbarContent)
container.append(titleText,progressbar,dataText)
return container
}
return o
}
function readResult(data) {
var result = {all:0, notdone:0, right:0, wrong:0}
for(var i in data.results){
if(typeof(data.results[i])=='object'){
data.results[i] = dicToList(data.results[i])
}
if(data.results[i].length>0) {
for (var n = 0; n < data.results[i].length; n++) {
result.all += 1
if(data.results[i][n].isDone && data.results[i][n].isRight){
result.right += 1
}else if(!data.results[i][n].isDone){
result.notdone += 1
}else {
result.wrong += 1
}
}
}
}
return result
}
function round(number,digit) {
var result
var dig = 1
for(var i=0;i<digit;i++){
dig = dig * 10
}
result = Math.round(number * dig) / dig
result = result.toString()
return result
}
function getSameData(fullData, searchTitle, order) {
var container = $('<div class="single-data-container"></div>')
var counter = 1
var latestTime = ''
for(var i in fullData){
var data = fullData[i]
var title = data.list.title
if(searchTitle === title){
latestTime = data.list.time
var singleData = $('<div class="single-data data-folded"></div>')
var header = $('<div class="single-header"></div>')
var content = $('<div class="single-content"></div>')
var ending = $('<div class="single-ending"></div>')
var headerText = ''
var result = readResult(data)
//一些计算的参数
var calCorrect = (round(result.right/(result.all-result.notdone),4)*100).toFixed(2)
var calFinish = (round((result.all-result.notdone)/result.all,4)*100).toFixed(2)
headerText = '<p class="single-header-title-counter">第 ' + counter + ' 次</p>' +
'<p class="single-header-title-time">'+data.list.time+'</p>'
// '<p class="single-header-title-finish">完成度:'+(result.all-result.notdone)+'/'+result.all+'['+calFinish+'%]</p>' +
// '<p class="single-header-title-correct">正确率:'+result.right+'/'+(result.all-result.notdone)+'['+calCorrect+'%]</p>'
header.bind('click', function () {
fold($(this).parent(),0)
})
header.html(headerText)
//生成内容
var functionModule = $('<div class="function-module"></div>')
var graphs = $('<div class="graph-module"></div>')
var bar = new progressBar()
var finish = bar.bar('完成度',calFinish,(result.all-result.notdone)+'/'+result.all,'black','#36c')
var correct = bar.bar('正确率',calCorrect,result.right+'/'+(result.all-result.notdone),'black','#36c')
graphs.append(finish,correct)
var bind = bindBtnData(data,searchTitle)
functionModule.append(bind.all,bind.wrong,'<hr>',graphs,'<hr>')
content.append(functionModule)
singleData.append(header,content,ending)
if(order){
container.append(singleData)
}else {
container.prepend(singleData)
}
counter += 1
}
}
return {container:container,counter:counter-1,latestTime:latestTime}
}
function bindBtnData(data,title) {
var downloadWrongBtn = $('' +
'<span class="blue-btn-container">' +
'<a class="blue-btn-a">' +
'<span>下载错题</span>' +
'</a>' +
'</span>')
var downloadAllBtn = $('' +
'<span class="blue-btn-container">' +
'<a class="blue-btn-a">' +
'<span>下载本题库</span>' +
'</a>' +
'</span>')
downloadAllBtn.bind('click',function () {
var wikiTime = data.list.time
try{
downloadAllTimu(title,wikiTime)
}catch (e) {
alert('下载失败,请重试(本功能仍在测试,如果题目更新导致原题库数量有变化失败属正常现象)' +
'错误原因:'+e)
}
})
console.log(data)
downloadWrongBtn.bind('click',function () {
var wikiTime = data.list.time
console.log(data)
try{
downloadWrongTimu(title,wikiTime,data.results)
}catch (e) {
alert('下载失败,请重试(本功能仍在测试,如果题目更新导致原题库数量有变化失败属正常现象)' +
'错误原因:'+e)
}
})
return {all:downloadAllBtn,wrong:downloadWrongBtn}
}
function mainFrame(fullData) {
var mainFrame = $('<div class="main-data-container"></div>')
var titlesSet = []
for(var i in fullData){
var data = fullData[i]
var title = data.list.title
if(titlesSet.indexOf(title)!==-1){continue}
var singleDataSet = $('<div id="dataset-'+i+'" class="single-data-set data-folded"></div>')
var dataContainers = getSameData(fullData,title,true)
var header = $('<div class="list-title">' +
'<p class="title-id">'+i+'</p>' +
'<span class="title-content">' +
'<a href="https://www.medforest.cn/dic/'+title+'">'+title+'</a>' +
'<p class="title-content-time">最近一次答题:'+dataContainers.latestTime+'</p>' +
'<p class="title-content-counter">共 '+dataContainers.counter+' 条数据</p>' +
'</span></div>')
header.bind('click', function () {
fold($(this).parent())
})
singleDataSet.append(header,dataContainers.container)
singleDataSet.prependTo(mainFrame)
}
return mainFrame
}
function fold(selector,openSpeed,closeSpeed) {
openSpeed = openSpeed !== undefined ? openSpeed : 'fast'
closeSpeed = closeSpeed !== undefined ? closeSpeed : 'fast'
var defaultHeight = $('.data-folded').height()
var paddingHeight = 10
var targetHeight = defaultHeight + paddingHeight + selector.children('.single-data-container').height()
var currentHeight = selector.height()
if(defaultHeight === currentHeight){
selector.animate({
height: targetHeight
}, openSpeed,function () {
selector.removeClass('data-folded')
selector.css('height','auto')
});
}else {
selector.animate({
height: defaultHeight
}, closeSpeed);
selector.addClass('data-folded')
}
}
//维基交互
function getParsedWikiText(url, title){
var status = false
var returnResult = ''
var PARAMS = {
"action": "parse",
"format": "json",
"page": title,
"utf8": 1,
'origin':'*',
}
$.ajax(
{
url: url,
method: "post",
async: false,
data: PARAMS,
timeout: 5000,
success: function (results){
if(results.parse.text['*'] !== undefined){
returnResult = results.parse.text['*']
status = true
}
}
})
return {status:status,result:returnResult}
}
//获取某个页面的历史版本
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':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 getLatestPageRevisionAsTime(url,title,timestamp){
var PARAMS = {
"action": "query",
"format": "json",
"prop": "revisions",
"titles": title,
"utf8": 1,
"rvprop": "ids|timestamp|content",
"rvlimit": "1",
"rvstart": timestamp,
"rvdir": "older",
}
var isSuccess = {}
$.ajax(
{
url: url,
method: "post",
async: false,
data: PARAMS,
timeout: 5000,
success: function (results){
if('-1' in results.query.pages){
console.log('===无此页面===')
isSuccess = false
}else {
var pages = results.query.pages
console.log(pages)
for (var key in pages) {
var page = pages[key].revisions[0]['*']
}
isSuccess=page
}
}
})
return isSuccess
}
//主函数
function unzipRecords(){
var id = isRecordsPages()
console.log(id)
if(!id){
return '非题库云储存页面!'
}
// var zippedContent = getFirstPageContent(getPageRevision('https://www.medforest.cn/medf/api.php','题库:Records/66',1))
// console.log(zippedContent)
var zippedContent= $('#mw-content-text').text().replace('[标记此页面为已巡查]','')
$('#mw-content-text').html('<h4 style="color:red;">正在分析做题数据</h4>')
console.log(zippedContent)
var unzipped = unzip(zippedContent)
var jsonData = JSON.parse(unzipped)
console.log(jsonData.archive)
var parsed=parseRecordsJSON('https://www.medforest.cn/medf/api.php',unzipped)
var id = 0
var mainContainer = $('<div class="data-list-container"></div>')
mainFrame(jsonData.archive).appendTo(mainContainer)
$('#mw-content-text').html('<div><h2>说明:</h2><p class="inline">数据按最后一次做题的时间倒序排列,第一列数字是对应存档的ID,显示的时间是最近一次做本题库的时间</p><hr></div>')
$('#mw-content-text').append(mainContainer)
}
unzipRecords()