Parser of berki style problems and generator of latex file
Samo Penic
2018-11-03 c9c8d5997209b1f00b25a6bc2b7fa2b3fb186640
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
from aoi_gen.BerkiParse import BerkiParse
from aoi_gen.Problem import ProblemSource, Problem
from aoi_gen.Template import TemplateEngine
from random import shuffle
from glob import glob
 
 
class Paper:
    def __init__(
        self, problem_source_list, paper_id=None, student_id=None, template=None
    ):
        self.problem_source_list = problem_source_list
        self.problem_list = []
        self.paper_id = paper_id
        self.student_id = student_id
        self.template = template
        self.generate_problems()
 
    def generate_problems(self, reorder=True):
        for problem_source in self.problem_source_list:
            self.problem_list.append(Problem(problem_source))
        if reorder:
            shuffle(self.problem_list)
 
    def to_template(self):
        if self.student_id is None:
            text = self.template.start_paper()
        else:
            text = self.template.start_paper(self.student_id[0], self.student_id[1])
 
        for i, problem in enumerate(self.problem_list):
            text += self.template.put_problem_into_template(
                problem.problem, problem_number=i + 1
            )
        text += "\\vfill\\break"
        return text
 
    def get_answer_matrix(self):
        retval = []
        for problem in self.problem_list:
            for solution in problem.problem["solutions"]:
                retval.append([i[1] for i in solution["shuffled"]])
        return retval
 
 
class Exam:
    def __init__(
        self, settings, problem_source_list=None, number_of_papers=5, student_list=None
    ):
        self.settings = settings
        self.problem_source_list = problem_source_list
        self.paper_list = []
        self.student_list = student_list
        self.paper_start = settings["start_number"]
        self.number_of_papers = number_of_papers
 
        if student_list is not None:
            self.student_iterator = iter(self.student_list)
        else:
            self.student_list = None
        self.template = TemplateEngine("aoi_gen/textemplates")
 
    def loadProblemsFromDirectory(self, dir, Parser=None):
        if Parser is None:
            Parser = BerkiParse
        self.problem_source_list = []
        filelist = glob(dir)
        files = []
        for i, f in enumerate(filelist):
            with open(f) as fd:
                cont = fd.read()
            files.append((i, cont))
        self.problem_source_list = []
        for nal in files:
            par = Parser(nal[1])
            par.parseSections()
            self.problem_source_list.append(ProblemSource(parser=par))
 
    def generatePapers(self):
        for i in range(self.paper_start, self.paper_start + self.number_of_papers):
            try:
                student_id = next(self.student_iterator)
            except (StopIteration, TypeError):
                student_id = None
            self.paper_list.append(
                Paper(
                    self.problem_source_list,
                    paper_id=i,
                    student_id=student_id,
                    template=self.template,
                )
            )
 
    def paper_to_template(self):
        text = ""
        for paper in self.paper_list:
            text += paper.to_template()
            text += "\\vfill\\break"
        return text
 
    def head_to_template(self):
        return self.template.head(settings=self.settings)
 
    def tail_to_template(self):
        return self.template.tail()
 
    def exam_to_template(self):
        text = self.head_to_template()
        text += self.paper_to_template()
        text += self.tail_to_template()
        self.text = text
        return text
 
    def get_answers(self):
        retval=[]
        for paper in self.paper_list:
            paper_matrix=paper.get_answer_matrix()
            retval.append(paper_matrix)
 
        return retval