aboutsummaryrefslogtreecommitdiff
path: root/exsh_lexercise.lua
blob: 85a298be3c00c85d5b169392beaaaacd7ed2cbd7 (plain)
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
exsh_texprintlines = function(s)
  for line in s:gmatch("[^\n]*") do
    tex.print(line)
  end
end


solution = function(sol)
  if type(sol) ~= "string" then
    local solt = sol
    sol = "["
    if solt.idea then
      sol = sol .. "idea,"
    end
    if solt.name then
      sol = sol .. "strings/solution={"..solt.name.."},"
    end
    sol = sol .. "] " .. (solt.text or "") 
  end
  return [[\begin{solution}]]..sol..[[\end{solution}]]
end

subexercise = function(se)
  local pts,p,bp = ""
  local sols = ""
  if type(se) ~= "string" then
    local set = se
    local po = ""
    if set.pointoptions then
      po = po .. set.pointoptions
    end
    p,bp = set.points,set.bonuspoints 
    if  p and bp then
      pts = [[\points[]] .. po .. "]{" .. set.points .. "+" ..
        set.bonuspoints .. "}"
    elseif bp then
      pts = [[\points[bonus,]] .. po .. "]{" .. set.bonuspoints .. "}"
    elseif p then
      pts = [[\points[]] .. po .. "]{" .. set.points .. "}"
    end
    
    if set.solution then
      sols = sols .. solution(set.solution)
    end
    if set.altsolutions then
      for _,sol in ipairs(set.altsolutions) do
        sols = sols .. solution(sol)
      end
    end
    
    se = "["
    if set.options then
      se = se .. set.options
    end
    se = se .. "]{" .. (set.task or "") .. "}"
  else
    se = "{" .. se .. "}"
  end
  return [[\subtask]]..se .. pts .. sols, p, bp
end

exercise = function(ex)
  local subex = ""
  local pts,bpts = 0,0
  if ex.subexercises then
    subex =  [[\begin{subtasks}]]
    for _,se in ipairs(ex.subexercises) do
      local s,p,bp = subexercise(se)
      subex = subex .. s
      pts = pts + (p or 0)
      bpts = bpts + (bp or 0)
    end
    subex = subex .. [[\end{subtasks}]]
  end
  if ex.points and ex.points == "sum" then
    if  pts > 0  and bpts > 0 then
      pts = pts .. "+" .. bpts
    elseif bpts > 0 then --and pts = 0
      pts = bpts
      ex.options = (ex.options or "") .. ",bonus"
    --else bpts = 0 thus pts is all points 
    end
  else
    pts = ex.points
  end

  local ece = [[\begin{exercise}[]]
  if ex.firstline then
    ece = ece .. [[firstline={]] .. ex.firstline .. [[},]]
  end
  if pts then
    ece = ece .. [[points={]] .. pts .. [[},]]
  end
  if ex.name then
    ece = ece .. [[name={]] .. ex.name .. [[},]]
  end
  if ex.options then
    ece = ece .. ex.options .. ","
  end
  ece = ece .. "]{}"
  if ex.task then
    ece = ece .. [[\begin{maintask}]]  .. ex.task 
      .. [[\end{maintask}]]
  end
  if ex.solution then
    ece = ece .. solution(ex.solution)
  end
  if ex.altsolutions then
    for _,sol in ipairs(ex.altsolutions) do
      ece = ece .. solution(sol)
    end
  end
  
  ece = ece .. subex

  ece = ece .. "\n" .. [[\end{exercise}]]
  return ece
end

fragileframed = function(s)
  local frames,p,pn,n,i = {},1,1,#s,0
  pn = s:find([[\newframe]],p) or n+1
  while p < n do
    i = i+1
    frames[i] = [[
      \begin{frame}[t,fragile] 
      \solutiontitle[\textwidth]
      ]] .. s:sub(p,pn-1) .. [[
      \end{frame}
    ]] 
    p = pn + 9
    pn = s:find([[\newframe]],p) or n+1
  end
  return table.concat(frames,"")
end