Skip to content

Commit 514baff

Browse files
committed
refactor: move theorems.lua to a require() module to avoid Lua local variable limit
The import()-based common/theorems.lua added locals to the main chunk scope, pushing past Lua's 200-variable limit and breaking CI. Move the logic to modules/theorems.lua loaded via require(), which runs in its own scope.
1 parent 079115a commit 514baff

File tree

5 files changed

+108
-97
lines changed

5 files changed

+108
-97
lines changed
Lines changed: 0 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -1,93 +1,2 @@
11
-- theorems.lua
22
-- Copyright (C) 2020-2022 Posit Software, PBC
3-
4-
local typst_theorem_appearance_imported = false
5-
local typst_theorem_like_frames = {}
6-
local typst_simple_renderers = {}
7-
8-
function theoremTypstAppearance()
9-
local appearance = option("theorem-appearance", "simple")
10-
if type(appearance) == "table" then
11-
appearance = pandoc.utils.stringify(appearance)
12-
end
13-
return appearance or "simple"
14-
end
15-
16-
function ensureTheoremTypstAppearanceImports()
17-
local appearance = theoremTypstAppearance()
18-
if typst_theorem_appearance_imported then
19-
return appearance
20-
end
21-
22-
typst_theorem_appearance_imported = true
23-
if appearance == "fancy" then
24-
quarto.doc.include_text("in-header", [[
25-
#import "@preview/theorion:0.4.1": make-frame, cosmos
26-
#import cosmos.fancy: fancy-box, set-primary-border-color, set-primary-body-color, set-secondary-border-color, set-secondary-body-color, set-tertiary-border-color, set-tertiary-body-color, get-primary-border-color, get-primary-body-color, get-secondary-border-color, get-secondary-body-color, get-tertiary-border-color, get-tertiary-body-color
27-
]])
28-
quarto.doc.include_text("before-body", [[
29-
#set-primary-border-color(brand-color.at("primary", default: green.darken(30%)))
30-
#set-primary-body-color(brand-color.at("primary", default: green).lighten(90%))
31-
#set-secondary-border-color(brand-color.at("secondary", default: orange))
32-
#set-secondary-body-color(brand-color.at("secondary", default: orange).lighten(90%))
33-
#set-tertiary-border-color(brand-color.at("tertiary", default: blue.darken(30%)))
34-
#set-tertiary-body-color(brand-color.at("tertiary", default: blue).lighten(90%))
35-
]])
36-
elseif appearance == "clouds" then
37-
quarto.doc.include_text("in-header", [[
38-
#import "@preview/theorion:0.4.1": make-frame, cosmos
39-
#import cosmos.clouds: render-fn as clouds-render
40-
]])
41-
elseif appearance == "rainbow" then
42-
quarto.doc.include_text("in-header", [[
43-
#import "@preview/theorion:0.4.1": make-frame, cosmos
44-
#import cosmos.rainbow: render-fn as rainbow-render
45-
]])
46-
else
47-
quarto.doc.include_text("in-header", [[
48-
#import "@preview/theorion:0.4.1": make-frame
49-
]])
50-
end
51-
52-
return appearance
53-
end
54-
55-
function ensureTheoremTypstSimpleRender(render_name, italic_body)
56-
if typst_simple_renderers[render_name] then
57-
return
58-
end
59-
60-
typst_simple_renderers[render_name] = true
61-
local body_render = "body"
62-
if italic_body then
63-
body_render = "emph(body)"
64-
end
65-
66-
quarto.doc.include_text("in-header", "#let " .. render_name .. [[(prefix: none, title: "", full-title: auto, body) = {
67-
if full-title != "" and full-title != auto and full-title != none {
68-
strong[#full-title.]
69-
h(0.5em)
70-
}
71-
]] .. body_render .. "\n" .. [[
72-
parbreak()
73-
}
74-
]])
75-
end
76-
77-
function ensureTheoremTypstFrame(env_name, title, render_code)
78-
if typst_theorem_like_frames[env_name] then
79-
return false
80-
end
81-
82-
typst_theorem_like_frames[env_name] = true
83-
quarto.doc.include_text("in-header", "#let (" .. env_name .. "-counter, " .. env_name .. "-box, " ..
84-
env_name .. ", show-" .. env_name .. ") = make-frame(\n" ..
85-
" \"" .. env_name .. "\",\n" ..
86-
" text(weight: \"bold\")[" .. title .. "],\n" ..
87-
" inherited-levels: theorem-inherited-levels,\n" ..
88-
" numbering: theorem-numbering,\n" ..
89-
render_code ..
90-
")")
91-
quarto.doc.include_text("in-header", "#show: show-" .. env_name)
92-
return true
93-
end

src/resources/filters/customnodes/proof.lua

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ local proof_theme_colors = {
6767
}
6868

6969
local function ensure_typst_proofs(proof_env)
70-
local appearance = ensureTheoremTypstAppearanceImports()
70+
local appearance = _quarto.modules.theorems.ensure_appearance_imports()
7171
local proof_info = proof_types[proof_env]
7272
local title = envTitle(proof_env, proof_info.title)
7373
local render_code
@@ -85,11 +85,11 @@ local function ensure_typst_proofs(proof_env)
8585
local color = proof_theme_colors[proof_env] or "gray"
8686
render_code = " render: rainbow-render.with(fill: " .. color .. ".darken(20%)),\n"
8787
else
88-
ensureTheoremTypstSimpleRender("simple-proof-render", false)
88+
_quarto.modules.theorems.ensure_simple_render("simple-proof-render", false)
8989
render_code = " render: simple-proof-render,\n"
9090
end
9191

92-
ensureTheoremTypstFrame(proof_env, title, render_code)
92+
_quarto.modules.theorems.ensure_frame(proof_env, title, render_code)
9393
end
9494

9595
function is_proof_div(div)

src/resources/filters/customnodes/theorem.lua

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ local theme_colors = {
100100
}
101101

102102
local function ensure_typst_theorems(reftype)
103-
local appearance = ensureTheoremTypstAppearanceImports()
103+
local appearance = _quarto.modules.theorems.ensure_appearance_imports()
104104
local theorem_type = theorem_types[reftype]
105105
local title = titleString(reftype, theorem_type.title)
106106
local render_code
@@ -124,11 +124,11 @@ local function ensure_typst_theorems(reftype)
124124
local color = theme_colors[reftype] or "gray"
125125
render_code = " render: rainbow-render.with(fill: " .. color .. ".darken(20%)),\n"
126126
else
127-
ensureTheoremTypstSimpleRender("simple-theorem-render", true)
127+
_quarto.modules.theorems.ensure_simple_render("simple-theorem-render", true)
128128
render_code = " render: simple-theorem-render,\n"
129129
end
130130

131-
ensureTheoremTypstFrame(theorem_type.env, title, render_code)
131+
_quarto.modules.theorems.ensure_frame(theorem_type.env, title, render_code)
132132
end
133133

134134

src/resources/filters/modules/import_all.lua

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ _quarto.modules = {
2020
scope = require("modules/scope"),
2121
string = require("modules/string"),
2222
tablecolwidths = require("modules/tablecolwidths"),
23+
theorems = require("modules/theorems"),
2324
typst = require("modules/typst"),
2425
listtable = require("modules/listtable"),
2526
tableutils = require("modules/tableutils"),
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
-- theorems.lua
2+
-- Shared Typst theorem/proof setup logic using theorion
3+
-- Copyright (C) 2020-2022 Posit Software, PBC
4+
5+
local typst_theorem_appearance_imported = false
6+
local typst_theorem_like_frames = {}
7+
local typst_simple_renderers = {}
8+
9+
local function appearance()
10+
local val = option("theorem-appearance", "simple")
11+
if type(val) == "table" then
12+
val = pandoc.utils.stringify(val)
13+
end
14+
return val or "simple"
15+
end
16+
17+
local function ensure_appearance_imports()
18+
local val = appearance()
19+
if typst_theorem_appearance_imported then
20+
return val
21+
end
22+
23+
typst_theorem_appearance_imported = true
24+
if val == "fancy" then
25+
quarto.doc.include_text("in-header", [[
26+
#import "@preview/theorion:0.4.1": make-frame, cosmos
27+
#import cosmos.fancy: fancy-box, set-primary-border-color, set-primary-body-color, set-secondary-border-color, set-secondary-body-color, set-tertiary-border-color, set-tertiary-body-color, get-primary-border-color, get-primary-body-color, get-secondary-border-color, get-secondary-body-color, get-tertiary-border-color, get-tertiary-body-color
28+
]])
29+
quarto.doc.include_text("before-body", [[
30+
#set-primary-border-color(brand-color.at("primary", default: green.darken(30%)))
31+
#set-primary-body-color(brand-color.at("primary", default: green).lighten(90%))
32+
#set-secondary-border-color(brand-color.at("secondary", default: orange))
33+
#set-secondary-body-color(brand-color.at("secondary", default: orange).lighten(90%))
34+
#set-tertiary-border-color(brand-color.at("tertiary", default: blue.darken(30%)))
35+
#set-tertiary-body-color(brand-color.at("tertiary", default: blue).lighten(90%))
36+
]])
37+
elseif val == "clouds" then
38+
quarto.doc.include_text("in-header", [[
39+
#import "@preview/theorion:0.4.1": make-frame, cosmos
40+
#import cosmos.clouds: render-fn as clouds-render
41+
]])
42+
elseif val == "rainbow" then
43+
quarto.doc.include_text("in-header", [[
44+
#import "@preview/theorion:0.4.1": make-frame, cosmos
45+
#import cosmos.rainbow: render-fn as rainbow-render
46+
]])
47+
else
48+
quarto.doc.include_text("in-header", [[
49+
#import "@preview/theorion:0.4.1": make-frame
50+
]])
51+
end
52+
53+
return val
54+
end
55+
56+
local function ensure_simple_render(render_name, italic_body)
57+
if typst_simple_renderers[render_name] then
58+
return
59+
end
60+
61+
typst_simple_renderers[render_name] = true
62+
local body_render = "body"
63+
if italic_body then
64+
body_render = "emph(body)"
65+
end
66+
67+
quarto.doc.include_text("in-header", "#let " .. render_name .. [[(prefix: none, title: "", full-title: auto, body) = {
68+
if full-title != "" and full-title != auto and full-title != none {
69+
strong[#full-title.]
70+
h(0.5em)
71+
}
72+
]] .. body_render .. "\n" .. [[
73+
parbreak()
74+
}
75+
]])
76+
end
77+
78+
local function ensure_frame(env_name, title, render_code)
79+
if typst_theorem_like_frames[env_name] then
80+
return false
81+
end
82+
83+
typst_theorem_like_frames[env_name] = true
84+
quarto.doc.include_text("in-header", "#let (" .. env_name .. "-counter, " .. env_name .. "-box, " ..
85+
env_name .. ", show-" .. env_name .. ") = make-frame(\n" ..
86+
" \"" .. env_name .. "\",\n" ..
87+
" text(weight: \"bold\")[" .. title .. "],\n" ..
88+
" inherited-levels: theorem-inherited-levels,\n" ..
89+
" numbering: theorem-numbering,\n" ..
90+
render_code ..
91+
")")
92+
quarto.doc.include_text("in-header", "#show: show-" .. env_name)
93+
return true
94+
end
95+
96+
return {
97+
appearance = appearance,
98+
ensure_appearance_imports = ensure_appearance_imports,
99+
ensure_simple_render = ensure_simple_render,
100+
ensure_frame = ensure_frame,
101+
}

0 commit comments

Comments
 (0)