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

sile-typesetter / sile / 8288578143

14 Mar 2024 09:39PM UTC coverage: 64.155% (-10.6%) from 74.718%
8288578143

Pull #1904

github

alerque
chore(core): Fixup ec6ed657 which didn't shim old pack styles properly
Pull Request #1904: Merge develop into master (commit to next release being breaking)

1648 of 2421 new or added lines in 107 files covered. (68.07%)

1843 existing lines in 77 files now uncovered.

10515 of 16390 relevant lines covered (64.15%)

3306.56 hits per line

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

84.85
/packages/base.lua
1
--- SILE package class.
2
-- @interfaces packages
3

4
local package = pl.class()
49✔
5
package.type = "package"
49✔
6
package._name = "base"
49✔
7

8
package._initialized = false
49✔
9
package.class = nil
49✔
10

11
-- For shimming packages that used to have legacy exports
12
package.exports = {}
49✔
13

14
local function script_path ()
15
  local src = debug.getinfo(3, "S").source:sub(2)
309✔
16
  local base = src:match("(.*[/\\])")
309✔
17
  return base
309✔
18
end
19

20
local settingDeclarations = { }
49✔
21
local rawhandlerRegistrations = {}
49✔
22
local commandRegistrations = { }
49✔
23

24
function package:_init (_, reload)
49✔
25
  self.class = SILE.scratch.half_initialized_class or SILE.documentState.documentClass
309✔
26
  if not self.class then
309✔
27
    SU.error("Attempted to initialize package before class, should have been queued in the preamble", true)
×
28
  end
29
  self.basedir = script_path()
618✔
30
  -- Note string.format(%p) would be nicer than tostring() but only LuaJIT and Lua 5.4 support it
31
  local settingsDeclarator = tostring(self.declareSettings)
309✔
32
  if reload or not settingDeclarations[settingsDeclarator] then
309✔
33
    settingDeclarations[settingsDeclarator] = true
72✔
34
    self:declareSettings()
72✔
35
  end
36
  local rawhandlerRegistrator = tostring(self.registerRawHandlers)
309✔
37
  if reload or not rawhandlerRegistrations[rawhandlerRegistrator] then
309✔
38
    rawhandlerRegistrations[rawhandlerRegistrator] = true
53✔
39
    self:registerRawHandlers()
53✔
40
  end
41
  local commandRegistrator = tostring(self.registerCommands)
309✔
42
  if reload or not commandRegistrations[commandRegistrator] then
309✔
43
    commandRegistrations[commandRegistrator] = true
289✔
44
    self:registerCommands()
289✔
45
  end
46
end
47

48
function package:_post_init ()
49✔
49
  self._initialized = true
310✔
50
end
51

52
function package.declareSettings (_) end
100✔
53

54
function package.registerRawHandlers (_) end
100✔
55

56
function package:loadPackage (packname, options, reload)
49✔
57
  return self.class:loadPackage(packname, options, reload)
103✔
58
end
59

60
function package:reloadPackage (packname, options)
49✔
NEW
61
  return self.class:reloadPackage(packname, options)
×
62
end
63

64
function package.registerCommands (_) end
58✔
65

66
-- This gives us a hook to match commands with the packages that registered
67
-- them as opposed to core commands or class-provided commands
68

69
--- Register a function as a SILE command.
70
-- Takes any Lua function and registers it for use as a SILE command (which will in turn be used to process any content
71
-- nodes identified with the command name.
72
--
73
-- A similar method is available for classes, `classes:registerCommand`.
74
-- @tparam string name Name of cammand to register.
75
-- @tparam function func Callback function to use as command handler.
76
-- @tparam[opt] nil|string help User friendly short usage string for use in error messages, documentation, etc.
77
-- @tparam[opt] nil|string pack Information identifying the module registering the command for use in error and usage
78
-- messages. Usually auto-detected.
79
-- @see SILE.classes:registerCommand
80
function package:registerCommand (name, func, help, pack)
49✔
81
  self.class:registerCommand(name, func, help, pack)
1,262✔
82
end
83
function package:registerRawHandler (format, callback)
49✔
84
  self.class:registerRawHandler(format, callback)
2✔
85
end
86

87
-- Using this rather than doing the work directly will give us a way to
88
-- un-export them if we ever need to unload modules and revert functions
89
function package:export (name, func)
49✔
90
  self.class[name] = func
288✔
91
end
92

93
-- Shims for two possible kinds of legacy exports: blind direct stuffing into
94
-- the class but not expecting to be called as a method AND the exports table
95
-- to package modules...
96

97
local _deprecate_class_funcs = [[
98
  Please explicitly use functions provided by packages by referencing
99
  them in the document class's list of loaded packages rather than the
100
  legacy solution that added non-method functions to the class.]]
49✔
101

102
local _deprecate_exports_table = [[
103
  Please explicitly use functions provided by packages by referencing
104
  them in the document class's list of loaded packages rather than the
105
  legacy solution of calling them from an exports table.]]
49✔
106

107
function package:deprecatedExport (name, func, noclass, notable)
49✔
108

109
  if not noclass then
308✔
110
    self.class[name] = function (...)
308✔
111
      -- http://lua-users.org/wiki/VarargTheSecondClassCitizen
112
      local inputs = {...}
4✔
113
      -- local inputs = table.unpack({...}, 1, select("#", ...))
114
      if type(inputs[1]) ~= "table" or inputs[1].type ~= "class" then
4✔
115
        table.insert(inputs, 1, self.class)
×
116
      end
117
      SU.deprecated(("class.%s"):format(name),
8✔
118
                    ("class.packages.%s:%s"):format(self._name, name),
4✔
119
                    "0.14.0", "0.16.0", _deprecate_class_funcs)
4✔
120
      return func(pl.utils.unpack(inputs, 1, select("#", ...) + 1))
8✔
121
    end
122
  end
123

124
  if not notable then
308✔
125
    self.exports[name] = function (...)
308✔
126
      local inputs = {...}
×
127
      if type(inputs[1]) ~= "table" or inputs[1].type ~= "package" then
×
128
        table.insert(inputs, 1, self)
×
129
      end
130
      SU.deprecated(("require('packages.%s').exports.%s"):format(self._name, name),
×
131
                    ("class.packages.%s:%s"):format(self._name, name),
×
132
                    "0.14.0", "0.16.0", _deprecate_exports_table)
×
133
      return func(pl.utils.unpack(inputs, 1, select("#", ...) + 1))
×
134
    end
135
  end
136

137
end
138

139
return package
49✔
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