• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

sile-typesetter / sile / 9304060604

30 May 2024 02:07PM UTC coverage: 74.124% (-0.6%) from 74.707%
9304060604

push

github

alerque
style: Reformat Lua with stylua

8104 of 11995 new or added lines in 184 files covered. (67.56%)

15 existing lines in 11 files now uncovered.

12444 of 16788 relevant lines covered (74.12%)

7175.1 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

82.57
/core/settings.lua
1
local deprecator = function ()
NEW
2
   SU.deprecated("SILE.settings.*", "SILE.settings:*", "0.13.0", "0.15.0")
×
NEW
3
   return SILE.settings
×
4
end
5

6
local settings = pl.class()
181✔
7

8
function settings:_init ()
181✔
9
   self.state = {}
181✔
10
   self.declarations = {}
181✔
11
   self.stateQueue = {}
181✔
12
   self.defaults = {}
181✔
13

14
   self:declare({
181✔
15
      parameter = "document.language",
16
      type = "string",
17
      default = "en",
18
      help = "Locale for localized language support",
19
   })
20

21
   self:declare({
362✔
22
      parameter = "document.parindent",
23
      type = "glue",
24
      default = SILE.nodefactory.glue("20pt"),
362✔
25
      help = "Glue at start of paragraph",
26
   })
27

28
   self:declare({
362✔
29
      parameter = "document.baselineskip",
30
      type = "vglue",
31
      default = SILE.nodefactory.vglue("1.2em plus 1pt"),
362✔
32
      help = "Leading",
33
   })
34

35
   self:declare({
362✔
36
      parameter = "document.lineskip",
37
      type = "vglue",
38
      default = SILE.nodefactory.vglue("1pt"),
362✔
39
      help = "Leading",
40
   })
41

42
   self:declare({
362✔
43
      parameter = "document.parskip",
44
      type = "vglue",
45
      default = SILE.nodefactory.vglue("0pt plus 1pt"),
362✔
46
      help = "Leading",
47
   })
48

49
   self:declare({
181✔
50
      parameter = "document.spaceskip",
51
      type = "length or nil",
52
      default = nil,
53
      help = "The length of a space (if nil, then measured from the font)",
54
   })
55

56
   self:declare({
181✔
57
      parameter = "document.rskip",
58
      type = "glue or nil",
59
      default = nil,
60
      help = "Skip to be added to right side of line",
61
   })
62

63
   self:declare({
181✔
64
      parameter = "document.lskip",
65
      type = "glue or nil",
66
      default = nil,
67
      help = "Skip to be added to left side of line",
68
   })
69

70
   self:declare({
181✔
71
      parameter = "document.zenkakuchar",
72
      default = "あ",
73
      type = "string",
74
      help = "The character measured to determine the length of a zenkaku width (全角幅)",
75
   })
76

77
   SILE.registerCommand(
362✔
78
      "set",
181✔
79
      function (options, content)
80
         local parameter = SU.required(options, "parameter", "\\set command")
95✔
81
         local makedefault = SU.boolean(options.makedefault, false)
95✔
82
         local reset = SU.boolean(options.reset, false)
95✔
83
         local value = options.value
95✔
84
         if content and (type(content) == "function" or content[1]) then
95✔
85
            if makedefault then
9✔
NEW
86
               SU.warn(
×
87
                  "Are you sure meant to set default settings *and* pass content to ostensibly apply them to temporarily?"
88
               )
89
            end
90
            self:temporarily(function ()
18✔
91
               self:set(parameter, value, makedefault, reset)
9✔
92
               SILE.process(content)
9✔
93
            end)
94
         else
95
            self:set(parameter, value, makedefault, reset)
86✔
96
         end
97
      end,
98
      "Set a SILE parameter <parameter> to value <value> (restoring the value afterwards if <content> is provided)",
181✔
99
      nil,
181✔
100
      true
101
   )
181✔
102
end
103

104
function settings:pushState ()
181✔
105
   if not self then
1,645✔
NEW
106
      self = deprecator()
×
107
   end
108
   table.insert(self.stateQueue, self.state)
1,645✔
109
   self.state = pl.tablex.copy(self.state)
3,290✔
110
end
111

112
function settings:popState ()
181✔
113
   if not self then
1,649✔
NEW
114
      self = deprecator()
×
115
   end
116
   self.state = table.remove(self.stateQueue)
3,298✔
117
end
118

119
function settings:declare (spec)
181✔
120
   if not spec then
12,514✔
NEW
121
      self, spec = deprecator(), self
×
122
   end
123
   if spec.name then
12,514✔
NEW
124
      SU.deprecated(
×
125
         "'name' argument of SILE.settings:declare",
126
         "'parameter' argument of SILE.settings:declare",
127
         "0.10.10",
128
         "0.11.0"
129
      )
130
   end
131
   if self.declarations[spec.parameter] then
12,514✔
132
      SU.debug("settings", "Attempt to re-declare setting: " .. spec.parameter)
1,622✔
133
      return
1,622✔
134
   end
135
   self.declarations[spec.parameter] = spec
10,892✔
136
   self:set(spec.parameter, spec.default, true)
10,892✔
137
end
138

139
--- Reset all settings to their default value.
140
function settings:reset ()
181✔
NEW
141
   if not self then
×
NEW
142
      self = deprecator()
×
143
   end
NEW
144
   for k, _ in pairs(self.state) do
×
NEW
145
      self:set(k, self.defaults[k])
×
146
   end
147
end
148

149
--- Restore all settings to the value they had in the top-level state,
150
-- that is at the head of the settings stack (normally the document
151
-- level).
152
function settings:toplevelState ()
181✔
153
   if not self then
133✔
NEW
154
      self = deprecator()
×
155
   end
156
   if #self.stateQueue ~= 0 then
133✔
157
      for parameter, _ in pairs(self.state) do
6,717✔
158
         -- Bypass self:set() as the latter performs some tests and a cast,
159
         -- but the setting might not have been defined in the top level state
160
         -- (in which case, assume the default value).
161
         self.state[parameter] = self.stateQueue[1][parameter] or self.defaults[parameter]
6,584✔
162
      end
163
   end
164
end
165

166
function settings:get (parameter)
181✔
167
   -- HACK FIXME https://github.com/sile-typesetter/sile/issues/1699
168
   -- See comment on set() below.
169
   if parameter == "current.parindent" then
230,739✔
170
      return SILE.typesetter and SILE.typesetter.state.parindent
853✔
171
   end
172
   if not parameter then
229,886✔
NEW
173
      self, parameter = deprecator(), self
×
174
   end
175
   if not self.declarations[parameter] then
229,886✔
NEW
176
      SU.error("Undefined setting '" .. parameter .. "'")
×
177
   end
178
   if type(self.state[parameter]) ~= "nil" then
229,886✔
179
      return self.state[parameter]
147,724✔
180
   else
181
      return self.defaults[parameter]
82,162✔
182
   end
183
end
184

185
function settings:set (parameter, value, makedefault, reset)
181✔
186
   -- HACK FIXME https://github.com/sile-typesetter/sile/issues/1699
187
   -- Anything dubbed current.xxx should likely NOT be a "setting" (subject
188
   -- to being pushed/popped via temporary stacking) and actually has its
189
   -- own lifecycle (e.g. reset for the next paragraph).
190
   -- These should be rather typesetter states, or something to that extent
191
   -- yet to clarify. Notably, current.parindent falls in that category,
192
   -- BUT probably current.hangAfter and current.hangIndent too.
193
   -- To avoid breaking too much code yet without being sure of the solution,
194
   -- we implement a hack of sorts for current.parindent only.
195
   -- Note moreover that current.parindent is currently probably a bad concept
196
   -- anyway:
197
   --   - It can be nil (= document.parindent applies)
198
   --   - It can be a zero-glue (\noindent, ragged environments, etc.)
199
   --   - It can be a valued glue set to document.parindent
200
   --     (e.g. from \indent, and document.parindent thus applies)
201
   --   - It could be another valued glue (uh, use case to ascertain)
202
   -- What we would _likely_ only need to track is whether document.parindent
203
   -- applies or not on the paragraph just composed afterwards...
204
   if parameter == "current.parindent" then
22,615✔
205
      if SILE.typesetter and not SILE.typesetter.state.hmodeOnly then
1,365✔
206
         SILE.typesetter.state.parindent = SU.cast("glue or nil", value)
2,338✔
207
      end
208
      return
1,365✔
209
   end
210
   if type(self) ~= "table" then
21,250✔
NEW
211
      self, parameter, value, makedefault, reset = deprecator(), self, parameter, value, makedefault
×
212
   end
213
   if not self.declarations[parameter] then
21,250✔
NEW
214
      SU.error("Undefined setting '" .. parameter .. "'")
×
215
   end
216
   if reset then
21,250✔
217
      if makedefault then
4✔
NEW
218
         SU.error("Can't set a new default and revert to and old default setting at the same time!")
×
219
      end
220
      value = self.defaults[parameter]
4✔
221
   else
222
      value = SU.cast(self.declarations[parameter].type, value)
42,492✔
223
   end
224
   self.state[parameter] = value
21,250✔
225
   if makedefault then
21,250✔
226
      self.defaults[parameter] = value
10,737✔
227
   end
228
end
229

230
function settings:temporarily (func)
181✔
231
   if not func then
1,299✔
NEW
232
      self, func = deprecator(), self
×
233
   end
234
   self:pushState()
1,299✔
235
   func()
1,299✔
236
   self:popState()
1,299✔
237
end
238

239
function settings:wrap () -- Returns a closure which applies the current state, later
181✔
240
   if not self then
13✔
NEW
241
      self = deprecator()
×
242
   end
243
   local clSettings = pl.tablex.copy(self.state)
13✔
244
   return function (content)
245
      table.insert(self.stateQueue, self.state)
4✔
246
      self.state = clSettings
4✔
247
      SILE.process(content)
4✔
248
      self:popState()
4✔
249
   end
250
end
251

252
return settings
181✔
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc