-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
- Loading branch information
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
# Project exclude paths | ||
/out/ |
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
<?xml version="1.0" encoding="UTF-8"?> | ||
<module type="JAVA_MODULE" version="4"> | ||
<component name="NewModuleRootManager" inherit-compiler-output="true"> | ||
<exclude-output /> | ||
<content url="file://$MODULE_DIR$"> | ||
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" /> | ||
</content> | ||
<orderEntry type="inheritedJdk" /> | ||
<orderEntry type="sourceFolder" forTests="false" /> | ||
<orderEntry type="library" name="KotlinJavaRuntime" level="project" /> | ||
<orderEntry type="library" name="org.jsoup:jsoup:1.12.1" level="project" /> | ||
<orderEntry type="library" name="com.google.code.gson:gson:2.8.6" level="project" /> | ||
</component> | ||
</module> |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
# 本项目试图降低接入门槛 | ||
|
||
## 愉快食用需要 | ||
|
||
1. 简单 Java 基础,Kotlin 入门:字符串处理、类的继承、方法重写 | ||
|
||
2. Jsoup 入门 | ||
|
||
## 食用方法 | ||
|
||
1. 继承抽象类 `Parser`,重写它的 `generateCourseList` 方法。 | ||
|
||
2. `Common` 中抽取了一些可能通用的解析函数,当然你也可以补充。 | ||
|
||
3. 重写好函数后,新建一个测试的kt文件,如示例中的 `ZhengFangTest.kt`,你运行一下就懂了。 | ||
|
||
## 注意 | ||
|
||
1. 建议从项目外引用 html 文件,提交时一定不要上传 html 文件,涉及隐私问题。 | ||
|
||
2. 其实继承该抽象类,数据来源不一定是 html,可以是 Excel、Json 等等(发挥下想象力)。 | ||
|
||
## Todo | ||
|
||
1. 增加模拟登录导入的模板 |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,109 @@ | ||
import bean.CourseBaseBean | ||
|
||
object Common { | ||
|
||
val nodePattern = Regex(""""\(\d{1,2}[-]*\d*节""") | ||
val weekPattern = Regex("""\{第\d{1,2}[-]*\d*周""") | ||
|
||
val chineseWeekList = arrayOf("", "周一", "周二", "周三", "周四", "周五", "周六", "周日") | ||
val otherHeader = arrayOf("时间", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日", "早晨", "上午", "下午", "晚上") | ||
val courseProperty = arrayOf("任选", "限选", "实践选修", "必修课", "选修课", "必修", "选修", "专基", "专选", "公必", "公选", "义修", "选", "必", "主干", "专限", "公基", "值班", "通选", | ||
"思政必", "思政选", "自基必", "自基选", "语技必", "语技选", "体育必", "体育选", "专业基础课", "双创必", "双创选", "新生必", "新生选", "学科必修", "学科选修", | ||
"通识必修", "通识选修", "公共基础", "第二课堂", "学科实践", "专业实践", "专业必修", "辅修", "专业选修", "外语", "方向", "专业必修课", "全选") | ||
|
||
private val headerNodePattern = Regex("""第.*节""") | ||
|
||
fun findExistedCourseId(list: List<CourseBaseBean>, name: String): Int { | ||
val result = list.findLast { | ||
it.courseName == name | ||
} | ||
return result?.id ?: -1 | ||
} | ||
|
||
fun parseHeaderNodeString(str: String): Int { | ||
var node = -1 | ||
if (headerNodePattern.matches(str)) { | ||
val nodeStr = str.substring(1, str.length - 1) | ||
node = try { | ||
nodeStr.toInt() | ||
} catch (e: Exception) { | ||
getNodeInt(nodeStr) | ||
} | ||
} | ||
return node | ||
} | ||
|
||
fun getWeekFromChinese(chineseWeek: String): Int { | ||
for (i in chineseWeekList.indices) { | ||
if (chineseWeekList[i] == chineseWeek) { | ||
return i | ||
} | ||
} | ||
return 0 | ||
} | ||
|
||
fun countStr(str1: String, str2: String): Int { | ||
var times = 0 | ||
var startIndex = 0 | ||
var findIndex = str1.indexOf(str2, startIndex) | ||
while (findIndex != -1 && findIndex != str1.length - 1) { | ||
times += 1 | ||
startIndex = findIndex + 1 | ||
findIndex = str1.indexOf(str2, startIndex) | ||
} | ||
if (findIndex == str1.length - 1) { | ||
times += 1 | ||
} | ||
return times | ||
} | ||
|
||
fun getNodeStr(node: Int): String { | ||
return when (node) { | ||
1 -> "一" | ||
2 -> "二" | ||
3 -> "三" | ||
4 -> "四" | ||
5 -> "五" | ||
6 -> "六" | ||
7 -> "七" | ||
8 -> "八" | ||
9 -> "九" | ||
10 -> "十" | ||
11 -> "十一" | ||
12 -> "十二" | ||
13 -> "十三" | ||
14 -> "十四" | ||
15 -> "十五" | ||
16 -> "十六" | ||
else -> "" | ||
} | ||
} | ||
|
||
private fun getNodeInt(nodeStr: String): Int { | ||
return when (nodeStr) { | ||
"一" -> 1 | ||
"二" -> 2 | ||
"三" -> 3 | ||
"四" -> 4 | ||
"五" -> 5 | ||
"六" -> 6 | ||
"七" -> 7 | ||
"日" -> 7 | ||
"八" -> 8 | ||
"九" -> 9 | ||
"十" -> 10 | ||
"十一" -> 11 | ||
"十二" -> 12 | ||
"十三" -> 13 | ||
"十四" -> 14 | ||
"十五" -> 15 | ||
"十六" -> 16 | ||
"十七" -> 17 | ||
"十八" -> 18 | ||
"十九" -> 19 | ||
"二十" -> 20 | ||
else -> -1 | ||
} | ||
} | ||
|
||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
fun main() { | ||
println("Hello World!") | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
import parser.ZhengFangParser | ||
import java.io.File | ||
|
||
fun main() { | ||
// 示例中用了相对路径,Windows 下可能需要修改 | ||
// 建议从项目外引用 html 文件 | ||
// 提交时一定不要上传 html 文件,涉及隐私问题 | ||
val file = File("苏大医学.html") | ||
val parser = ZhengFangParser(file.readText(), 0) | ||
parser.saveCourse() | ||
} |