-
Notifications
You must be signed in to change notification settings - Fork 0
/
starterGenerator.py
190 lines (162 loc) · 5.82 KB
/
starterGenerator.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
from math import ceil, floor
import re
# Constants
colNum = 5
categorizeLowerBound = 2
class Subject:
# Static variables
# Dictionary of all subjects. Key: subjectName, Val: subject object
subjects = {}
def __init__(self, subjectName):
# Name of the subject
self.name = subjectName
# Array of classes the subject have
self.__subClasses = []
def __addClass(self, classNumber):
c = Class(classNumber)
self.__subClasses = self.__subClasses + [c]
return c
def __moveClass(self, c):
self.__subClasses = self.__subClasses + [c]
def getSubClasses(self):
return self.__subClasses
@staticmethod
def __add(className):
ref = re.search("[a-zA-Z]+", className)
subjectName = ref.group(0).upper()
ref = re.search("[0-9&]+", className)
classNumber = ref.group(0)
assert subjectName != "" and classNumber != "" and subjectName != "OTHER", "Wrong class name"
if subjectName not in Subject.subjects:
s = Subject(subjectName)
Subject.subjects[subjectName] = s
c = s.__addClass(classNumber)
else:
c = Subject.subjects[subjectName].__addClass(classNumber)
return c
@staticmethod
def processClassData():
f = open("courseDetails.bin", "r")
subjectLinkList = f.read().strip().split("\n\n")
for item in subjectLinkList:
subjectLink = item.strip().split("\n")
c = Subject.__add(subjectLink[0].strip())
for i in range(1, len(subjectLink)):
temp = subjectLink[i].split(",")
description = temp[0].strip()
link = temp[1].strip()
c.addLink(description, link)
s = Subject("OTHER")
subjectList = list(Subject.subjects.values())
toRemove = set()
for i in range(len(subjectList)):
subject : Subject = subjectList[i]
subClasses = subject.getSubClasses()
if len(subClasses) <= categorizeLowerBound:
item : Class
for item in subClasses:
item.setAlternativeName(subject.name)
s.__moveClass(item)
toRemove.add(subject.name)
for remove in toRemove:
Subject.subjects.pop(remove)
Subject.subjects["OTHER"] = s
@staticmethod
def getTopMenu():
subjects = sorted(Subject.subjects.keys())
res = ""
for subject in subjects:
res += f"""\t\t<button onclick='goToAndHighlight("{subject}");'>{subject}</button><br>\n"""
return res[:-1]
@staticmethod
def getDetails():
subjects = sorted(Subject.subjects.keys())
res = ""
for name in subjects:
res += f"""\t\t<div id="{name}" style="height: 100%; width: 100%; display: flex; flex-wrap: wrap; user-select: none;">\n"""
subClasses = Subject.subjects[name].getSubClasses()
subClasses = sorted(subClasses, key=lambda item : item.getClassNumber())
length = len(subClasses)
rowNum = ceil(length / colNum)
for i in range(rowNum):
start = i * colNum
end = min((i + 1) * colNum, length)
res += """\t\t\t<div id="row" style="width: 100%; display: flex;">\n"""
for j in range(start, end):
currentClass : Class = subClasses[j]
links = currentClass.getLinks()
# links = currentClass.getSortedLinks()
if (currentClass.getAlternativeName() == ""):
preferredName = name
else:
preferredName = currentClass.getAlternativeName()
res += f"""\t\t\t\t<div id="column" style="width: {floor(100 / colNum)}%">\n\t\t\t\t\t<b>{preferredName} {currentClass.getClassNumber()}</b><br>\n"""
res += """\t\t\t\t\t<div id="linksContainer">\n"""
for k in range(len(links)):
res += f"""\t\t\t\t\t\t<a href="{links[k][1]}">{links[k][0]}</a><br>\n"""
res += """\t\t\t\t\t</div>\n\t\t\t\t</div>\n"""
res += """\t\t\t</div><div style="width:100%; height: 10px"></div>\n"""
res += """\t\t</div><hr>\n\n"""
return res[:-2]
class Class:
def __init__(self, classNumber):
# Class number
self.__number = classNumber
# All urls that a class have
self.__urls = {}
# Alternative name used in OTHER category
self.__alternativeName = ""
def addLink(self, description, link):
assert description not in self.__urls, "Class link duplication"
self.__urls[description] = link
def getClassNumber(self):
return self.__number
def getLinks(self):
return list(self.__urls.items())
def getSortedLinks(self):
return sorted(self.__urls.items(), key=lambda item : item[0].lower())
def setAlternativeName(self, name):
self.__alternativeName = name
def getAlternativeName(self):
return self.__alternativeName
class QuickLink:
# Static variables
# All urls that quick link have
urls = {}
@staticmethod
def getQuickLink():
f = open("quickLinks.bin", "r")
linkList = f.read().strip().split("\n")
for item in linkList:
temp = item.split(",")
description = temp[0].strip()
link = temp[1].strip()
assert description not in QuickLink.urls, "Quicklink duplication"
QuickLink.urls[description] = link
res = ""
sortedList = sorted(QuickLink.urls.items(), key=lambda item : item[0].lower())
length = len(sortedList)
rowNum = ceil(length / colNum)
for i in range(colNum):
start = i * rowNum
end = min((i + 1) * rowNum, length)
res += f"""\t\t\t<div id="column" style="width: {floor(100 / colNum)}%; user-select: none;">\n\t\t\t\t<b>{sortedList[start][0][0]}-{sortedList[end - 1][0][0]}</b><br>\n"""
res += """\t\t\t\t<div id="linksContainer">\n"""
for j in range(start, end):
res += f"""\t\t\t\t\t<a href="{sortedList[j][1]}">{sortedList[j][0]}</a><br>\n"""
res += """\t\t\t\t</div>\n\t\t\t</div>\n\n"""
return res[:-2]
Subject.processClassData()
f = open("template.html", "r")
strRead = f.read().split("<!-- DIV -->")
strRes = ""
# Top menu
strRes += strRead[0]
strRes += Subject.getTopMenu()
strRes += strRead[1]
strRes += QuickLink.getQuickLink()
strRes += strRead[2]
strRes += Subject.getDetails()
strRes += strRead[3]
f = open("index.html", "w")
f.write(strRes)