更多操作
无编辑摘要 |
无编辑摘要 |
||
(未显示同一用户的1个中间版本) | |||
第230行: | 第230行: | ||
for(var i in fullData){ | for(var i in fullData){ | ||
var data = fullData[i] | var data = fullData[i] | ||
var title = data. | var title = data.list.title | ||
if(searchTitle === title){ | if(searchTitle === title){ | ||
latestTime = data.list.time | latestTime = data.list.time | ||
第315行: | 第315行: | ||
for(var i in fullData){ | for(var i in fullData){ | ||
var data = fullData[i] | var data = fullData[i] | ||
var title = data. | var title = data.list.title | ||
if(titlesSet.indexOf(title)!==-1){continue} | if(titlesSet.indexOf(title)!==-1){continue} | ||
var singleDataSet = $('<div id="dataset-'+i+'" class="single-data-set data-folded"></div>') | var singleDataSet = $('<div id="dataset-'+i+'" class="single-data-set data-folded"></div>') |
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()