打开/关闭搜索
搜索
打开/关闭菜单
1.3K
143
375
74K
医林拾薪
导航
首页
医林拾薪论坛
最近更改
随机页面
特殊页面
上传文件
快捷入口
医学本科题库
待翻译的英语单词
待补充英文的名词
小工具
导出ANKI卡组
本科题库创建向导
题库录入工具
录入英语单词
录入名称解释
Toggle preferences menu
通知
打开/关闭个人菜单
未登录
未登录用户的IP地址会在进行任意编辑后公开展示。
user-interface-preferences
个人工具
登录
查看“MediaWiki:Gadget-unziprecords.js”的源代码
MediaWiki界面页面
分享此页面
查看
阅读
查看源代码
查看历史
associated-pages
消息
讨论
更多操作
←
MediaWiki:Gadget-unziprecords.js
因为以下原因,您没有权限编辑本页:
您请求的操作仅限属于该用户组的用户执行:
用户
此页面为本wiki上的软件提供界面文本,并受到保护以防止滥用。 如欲修改所有wiki的翻译,请访问
translatewiki.net
上的MediaWiki本地化项目。
您无权编辑此JavaScript页面,因为编辑此页面可能会影响所有访问者。
您可以查看和复制此页面的源代码。
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('&action=edit') 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.info.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.info.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()
返回
MediaWiki:Gadget-unziprecords.js
。