| 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"): | |
| 107 | sp = r.split(":") | |
| 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"): | |
| 131 | sp = r.split(":") | |
| 132 | if sp[0].strip("\n\t'") == "ime": | |
| 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 | ) | |