Parser of berki style problems and generator of latex file
Samo Penic
2018-11-24 e0e8d373e6ebd897010753d0259468b68509a5bf
commit | author | age
d89217 1 # from .Problem import Problem
404823 2 from .Generators import VariableGeneratorFactory
d89217 3
7c2a8f 4
SP 5 class BerkiParse:
6     def __init__(self, text=None):
7         self.text = text.split("\n")
8         self.introduction = None
7029ac 9         self.picture=None
SP 10         self.parsedPicture=None
7c2a8f 11         self.subproblems = []
SP 12         self.solutions = None
d89217 13         self.parsedSolutions = None
7c2a8f 14         self.variables = []
SP 15         self.parsedVariables = None
d89217 16         self.variableGenerator = None
7c2a8f 17         self._Error = []
SP 18         self._Warning = []
19         self._Info = []
20
21     def findStartEndMarkers(self, marker):
22         start = -1
23         end = -1
24         for i, l in enumerate(self.text):
25             if l.strip("\n\r") == "#Start" + marker:
26                 start = i + 1
27             if l.strip("\n\r") == "#End" + marker:
28                 end = i
29             if start >= 0 and end >= 0:
30                 yield (start, end)
31                 start = -1
32                 end = -1
33
34     def findIntroduction(self):
35         gen = self.findStartEndMarkers("Uvod")
36         try:
37             (start, end) = next(gen)
38         except StopIteration:
39             return None
40         return "\n".join(self.text[start:end])
41
42     def findVariables(self):
43         gen = self.findStartEndMarkers("Skalar")
44         varlist = []
45         for start, end in gen:
46             varlist.append("\n".join(self.text[start:end]))
47         return varlist
48
49     def findSubproblems(self):
50         gen = self.findStartEndMarkers("Podnaloga")
51         varlist = []
52         for start, end in gen:
53             varlist.append("\n".join(self.text[start:end]))
54         return varlist
55
56     def findSolutions(self):
57         gen = self.findStartEndMarkers("Rezultat")
58         varlist = []
59         for start, end in gen:
60             varlist.append("\n".join(self.text[start:end]))
61         return varlist
62
7029ac 63     def findPicture(self):
SP 64         gen = self.findStartEndMarkers("Pic")
65         varlist = []
66         for stat, end in gen:
67             varlist.append("\n".join(self.text[start:end]))
68         return varlist
69
7c2a8f 70     def parseSections(self):
SP 71         self.introduction = self.findIntroduction()
72         self.subproblems = self.findSubproblems()
73         self.solutions = self.findSolutions()
d89217 74         self.parsedSolutions = self.parseSolutions()
7c2a8f 75         self.variables = self.findVariables()
SP 76         self.parsedVariables = self.parseVariables()
d89217 77         self.variableGenerator = self.prepareGenerators()
7029ac 78         self.picture = self.findPicture()
SP 79         self.parsedPicture = self.parsePicture()
80
81     def parsePicture(self):
82         parsedPictures = []
83         for p in self.picture:
84             retval = {"filename": [], "size:": [], "position": []}
85             for r in p.split("\n"):
86                 sp = r.split(":")
87                 if sp[0].strip("\n\t'") == "ime":
88                     retval["filename"].append(sp[1].strip("\n\t"))
89                 elif sp[0].strip("\n\t'") == "sirina":
90                     retval["size"].append(sp[1].strip("\n\t"))
91                 elif sp[0].strip("\n\t'") == "polozaj":
92                     retval["position"].append(sp[1].strip("\n\t"))
93             parsedPictures.append(retval)
94         return parsedPictures
7c2a8f 95
SP 96     def parseSolutions(self):
97         parsedSolutions = []
98         for s in self.solutions:
99             retval = {
100                 "correct": [],
101                 "wrong": [],
102                 "glyph": None,
103                 "type": None,
104                 "unit": None,
105             }
106             for r in s.split("\n"):
e0e8d3 107                 sp = r.split(":", 1)
7c2a8f 108                 if sp[0].strip("\n\t'") == "formula":
ef19a9 109                     retval["correct"].append(sp[1].strip("\n\t"))
7c2a8f 110                 elif sp[0].strip() == "napacna":
ef19a9 111                     retval["wrong"].append(sp[1].strip("\n\t"))
SP 112                 elif sp[0].strip() == "izpis":
78d798 113                     retval["type"] = sp[1].strip("\n\t'")
ef19a9 114                 elif sp[0].strip() == "enota":
78d798 115                     retval["unit"] = sp[1].strip("\n\t")
ef19a9 116                 elif sp[0].strip() == "TeX":
78d798 117                     retval["glyph"] = sp[1].strip("\n\t")
7c2a8f 118             parsedSolutions.append(retval)
SP 119         return parsedSolutions
120
121     def parseVariables(self):
122         parsedVariables = {}
123         for v in self.variables:
124             retval = {
125                 "name": None,
126                 "type": None,
127                 "generator_type": None,
128                 "generator": None,
129             }
130             for r in v.split("\n"):
e0e8d3 131                 sp = r.split(":", 1)
7c2a8f 132                 if sp[0].strip("\n\t'") == "ime":
SP 133                     name = sp[1].strip("\n\t'")
134                     retval["name"] = name
135                 elif sp[0].strip("\n\t'") == "izpis":
136                     retval["type"] = sp[1].strip("\n\t'")
137                 elif sp[0].strip("\n\t'") == "nacin":
138                     retval["generator_type"] = sp[1].strip("\n\t'")
139             parsedVariables[name] = retval
140         return parsedVariables
141
142     def prepareGenerators(self):
d89217 143         variableGenerator = {}
SP 144         for key, value in self.parsedVariables.items():
145             variableGenerator[key] = VariableGeneratorFactory.get_generator(
146                 value["generator_type"]
147             )
7c2a8f 148         return variableGenerator
SP 149
150     def get_parsed_sections(self):
d89217 151         return (
SP 152             self.introduction,
7029ac 153             self.parsedPicture,
d89217 154             self.subproblems,
SP 155             self.parsedVariables,
156             self.parsedSolutions,
157             self.variableGenerator,
158         )