From ea4c8d8ae5700399f7b7e8b4b76588e4efae125a Mon Sep 17 00:00:00 2001 From: yozu Date: Mon, 20 Mar 2017 20:37:16 +0900 Subject: [PATCH] implemented class command --- README.md | 8 +++- app.js | 46 +++++++++++++++++++- convert.js | 118 -------------------------------------------------- get_gakubu.js | 102 ------------------------------------------- lib/class.js | 101 ++++++++++++++++++++++++++++++++++++++++++ lib/gakubu.js | 10 +---- package.json | 1 - 7 files changed, 154 insertions(+), 232 deletions(-) delete mode 100644 convert.js delete mode 100644 get_gakubu.js create mode 100644 lib/class.js diff --git a/README.md b/README.md index 22aca1e..857f3bb 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,13 @@ node app searchGakubu 基幹理工 node app listGakubu # 2. Get Page ID(pid)s to get clas details -node app fetchGakubu ???? > dest/g_????.txt +node app fetchGakubu 111973 > dest/g_111973.txt + +# 3. Preview JSON output +node app fetchClass 2600001002012017260000100226 + +# 4. dump all data +cat dest/g_111973.txt | node app fetchClass - > dest/o_111973.txt ``` diff --git a/app.js b/app.js index 69f9e2a..d115e66 100644 --- a/app.js +++ b/app.js @@ -1,4 +1,5 @@ let gakubu = require('./lib/gakubu'); +let classes = require('./lib/class'); if (process.argv[2] == "searchGakubu" && process.argv[3]) { let list = gakubu.search(process.argv[3]); @@ -21,7 +22,7 @@ if (process.argv[2] == "searchGakubu" && process.argv[3]) { } else { gidList = [process.argv[3]]; } - function loop() { + (function loop() { let gid = gidList.shift(); process.stderr.write("fetching gakubu " + gid + "...\n"); if (!gakubu.getPageIDList(gid, function(data){ @@ -36,11 +37,52 @@ if (process.argv[2] == "searchGakubu" && process.argv[3]) { })) { process.stderr.write("error: " + gid + " not found\n"); } + })(); +} else if (process.argv[2] == "fetchClass" && process.argv[3]) { + let pidList = []; + let res = []; + let loop = function loop() { + let pid = pidList.shift(); + process.stderr.write("fetching page " + pid + "...\n"); + classes.fetch(pid, function(data){ + if (data) { + res.push(data); + if (pidList.length) { + loop(); + } else { + process.stdout.write(JSON.stringify(res)); + } + } else { + process.stderr.write("error: some error occurs when fetching or parsing " + pid + "\n"); + } + }); + }; + if (process.argv[3] == "-") { + process.stdin.resume(); + let str = "", ind; + process.stdin.on('data', function(chunk) { + str += chunk; + if (ind = str.indexOf("\n") > -1) { + let line = str.splice(0, ind); + str.splice(0, 1); + pidList.push(line); + } + }); + process.stdin.on('end', function() { + if (str) { + pidList.push(str); + } + loop(); + }); + } else { + pidList = [process.argv[3]]; + loop(); } - loop(); } else { console.log("node app searchGakubu "); console.log("node app listGakubu"); console.log("node app fetchGakubu "); console.log("node app fetchGakubu '*'"); + console.log("node app fetchClass "); + console.log("node app fetchClass -"); } diff --git a/convert.js b/convert.js deleted file mode 100644 index 1467261..0000000 --- a/convert.js +++ /dev/null @@ -1,118 +0,0 @@ -var fs = require('fs'); -//require('./ext.js'); - -var gakubuID = "262006"; - -function findData(m0, mp, me, env){ - var s, t; - env.p = env.text.indexOf(m0, env.p + 1) + m0.length - 1; - env.p = env.text.indexOf(mp, env.p + 1); - s = env.p + mp.length; - env.p = env.text.indexOf(me, env.p + 1); - t = env.p; - return env.text.substring(s, t); -} - -var youbiList = ['日', '月', '火', '水', '木', '金', '土']; -var pNumList = ['0', '1', '2', '3', '4', '5', '6']; - -function getPeriodList(pStr){ - var pList0 = pStr.split('/'); - var pList1 = new Array(); - var d, p, p1, p2; - for(var i = 0; i < pList0.length; i++){ - if(pList0[i].indexOf(":") != -1){ - pList0[i] = pList0[i].substring(3); - } - d = youbiList.indexOf(pList0[i][0]); - if(d != -1){ - if(pList0[i].indexOf('-') == -1){ - p = pNumList.indexOf(pList0[i][1]); - if(p != -1){ - pList1.push([d, p]); - } - } else{ - p1 = pNumList.indexOf(pList0[i][1]); - p2 = pNumList.indexOf(pList0[i][3]); - for(p = p1; p <= p2; p++){ - pList1.push([d, p]); - } - } - } - } - return pList1; -} - -fs.readFile('2016_pages_' + gakubuID + ".json", 'utf8', function (err, text) { - if(err){ - console.log("File open error."); - return; - } - var env = new Object(); - var tList = new Object(); - var tMinList = new Object(); - var uqList = new Array(); - var tIndexTable = [[], [], [], [], [], [], []]; - env.p = -1; - env.text = text; - for(;;){ - var t = new Object(); - var tmp; - env.p = text.indexOf("授業情報", env.p + 1); - if(env.p == -1){ - break; - } - t["開講年度"] = findData("", "<", env); - t["開講箇所"] = findData("", "<", env); - t["科目名"] = findData("", "<", env); - t["担当教員"] = findData("", "<", env); - t["学期曜日時限"] = findData("", "<", env); - tmp = t["学期曜日時限"].split("  "); - t["学期"] = tmp[0]; - t["曜日時限"] = tmp[1]; - t["pList"] = getPeriodList(t["曜日時限"]); - t["科目区分"] = findData("", "<", env); - //uqList.pushUnique(t["科目区分"]); - t["配当年次"] = pNumList.indexOf(findData("", "<", env)[0]); - t["単位数"] = parseInt(findData("", "<", env)); - t["使用教室"] = findData("", "<", env); - t["キャンパス"] = findData("", "<", env); - t["科目キー"] = findData("", "<", env); - t["科目クラスコード"] = findData("", "<", env); - t["授業で使用する言語"] = findData("", "<", env); - t["コース・コード"] = findData("", "<", env); - t["大分野名称"] = findData("", "<", env); - t["中分野名称"] = findData("", "<", env); - t["小分野名称"] = findData("", "<", env); - t["レベル"] = findData("", "<", env); - t["授業形態"] = findData("", "<", env); - t["pKey"] = findData('政経 -773 -774 -775 -776 -777 -778 -779 -780 -781 -782 -783 -784 -785 -786 -787 -788 -789 -790 -791 -792 -793 -794 -795 -796 -797 -798 -799 -800 -801 -802 -803 -804 -805 -806 -807 -808 -809 -810 -811 -812 -813 -814 -815 -816 -*/ - - - -var idList = []; -var htmlStr = ""; - -function getClassPage(index){ - opt.uri = URIBase + idList[index]; - if(index >= idList.length){ - console.log("sum: " + idList.length); - fs.writeFile('2016_pages_' + gakubuID + ".json", htmlStr); - return; - } - console.log(index); - request.get(opt, function(error, res, body){ - if (!error && res.statusCode == 200) { - console.log("200 OK"); - htmlStr += body; - getClassPage(index + 1); - } else { - console.log('error: '+ res.statusCode); - return; - } - }); -} - -fs.readFile('./2016_id_' + gakubuID + ".json", 'utf8', function (err, text) { - if(err){ - console.log("File open error." + err); - return; - } - idList = JSON.parse(text); - getClassPage(0); -}); diff --git a/lib/class.js b/lib/class.js new file mode 100644 index 0000000..ce696b7 --- /dev/null +++ b/lib/class.js @@ -0,0 +1,101 @@ +;(function(exports, require) { + "use strict"; + + let request = require('request'); + + function findData(m0, mp, me, env){ + var s, t; + env.p = env.text.indexOf(m0, env.p + 1) + m0.length - 1; + env.p = env.text.indexOf(mp, env.p + 1); + s = env.p + mp.length; + env.p = env.text.indexOf(me, env.p + 1); + t = env.p; + return env.text.substring(s, t); + } + + var youbiList = ['日', '月', '火', '水', '木', '金', '土']; + var pNumList = ['0', '1', '2', '3', '4', '5', '6']; + + function getPeriodList(pStr){ + var pList0 = pStr.split('/'); + var pList1 = new Array(); + var d, p, p1, p2; + for(var i = 0; i < pList0.length; i++){ + if(pList0[i].indexOf(":") != -1){ + pList0[i] = pList0[i].substring(3); + } + d = youbiList.indexOf(pList0[i][0]); + if(d != -1){ + if(pList0[i].indexOf('-') == -1){ + p = pNumList.indexOf(pList0[i][1]); + if(p != -1){ + pList1.push([d, p]); + } + } else{ + p1 = pNumList.indexOf(pList0[i][1]); + p2 = pNumList.indexOf(pList0[i][3]); + for(p = p1; p <= p2; p++){ + pList1.push([d, p]); + } + } + } + } + return pList1; + } + + function parsePageHtml(text) { + let t = {}; + let env = { + p: text.indexOf("授業情報", 0), + text: text + }; + t["開講年度"] = findData("", "<", env); + t["開講箇所"] = findData("", "<", env); + t["科目名"] = findData("", "<", env); + t["担当教員"] = findData("", "<", env); + t["学期曜日時限"] = findData("", "<", env); + let tmp = t["学期曜日時限"].split("  "); + t["学期"] = tmp[0]; + t["曜日時限"] = tmp[1]; + t["pList"] = getPeriodList(t["曜日時限"]); + t["科目区分"] = findData("", "<", env); + t["配当年次"] = pNumList.indexOf(findData("", "<", env)[0]); + t["単位数"] = parseInt(findData("", "<", env)); + t["使用教室"] = findData("", "<", env); + t["キャンパス"] = findData("", "<", env); + t["科目キー"] = findData("", "<", env); + t["科目クラスコード"] = findData("", "<", env); + t["授業で使用する言語"] = findData("", "<", env); + t["コース・コード"] = findData("", "<", env); + t["大分野名称"] = findData("", "<", env); + t["中分野名称"] = findData("", "<", env); + t["小分野名称"] = findData("", "<", env); + t["レベル"] = findData("", "<", env); + t["授業形態"] = findData("", "<", env); + t["pKey"] = findData('