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

sile-typesetter / sile / 11534409649

26 Oct 2024 07:27PM UTC coverage: 33.196% (-28.7%) from 61.897%
11534409649

push

github

alerque
chore(tooling): Update editor-config key for stylua as accepted upstream

Our setting addition is still not in a tagged release, but the PR was
accepted into the default branch of stylua. This means you no longer
need to run my fork of Stylua to get this project's style, you just nead
any build from the main development branch. However the config key was
renamed as part of the acceptance, so this is the relevant adjustment.

5810 of 17502 relevant lines covered (33.2%)

1300.57 hits per line

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

80.91
/types/length.lua
1
--- SILE length type.
2
-- Lengths are composed of 3 `measurement`s: a length, a stretch, and a shrink. Each part internally is just
3
-- a measurement, but combined describe a flexible length that is allowed to grow up to the amount defined by stretch or
4
-- compress up to the amount defined by shrink.
5
-- @types length
6

7
local function _error_if_not_number (a)
8
   if type(a) ~= "number" then
8✔
9
      SU.error("We tried to do impossible arithmetic on a " .. SU.type(a) .. ". (That's a bug)", true)
×
10
   end
11
end
12

13
--- @type length
14
local length = pl.class()
17✔
15
length.type = "length"
17✔
16

17
length.length = nil
17✔
18
length.stretch = nil
17✔
19
length.shrink = nil
17✔
20

21
--- Constructor.
22
-- @tparam measurement spec A measurement or value that can be cast to a measurement.
23
-- @tparam[opt=0] measurement stretch A measurement describing how much the length is allowed to grow.
24
-- @tparam[opt=0] measurement shrink A measurement describing how much the length is allowed to grow.
25
-- @treturn length
26
-- @usage
27
-- SILE.types.length("6em", "4pt", "2pt")
28
-- SILE.types.length("6em plus 4pt minus 2pt")
29
-- SILE.types.length(30, 4, 2)
30
function length:_init (spec, stretch, shrink)
17✔
31
   if stretch or shrink then
26,780✔
32
      self.length = SILE.types.measurement(spec or 0)
9,358✔
33
      self.stretch = SILE.types.measurement(stretch or 0)
9,358✔
34
      self.shrink = SILE.types.measurement(shrink or 0)
9,358✔
35
   elseif type(spec) == "number" then
22,101✔
36
      self.length = SILE.types.measurement(spec)
16,840✔
37
   elseif SU.type(spec) == "measurement" then
27,362✔
38
      self.length = spec
276✔
39
   elseif SU.type(spec) == "glue" then
26,810✔
40
      self.length = SILE.types.measurement(spec.width.length or 0)
×
41
      self.stretch = SILE.types.measurement(spec.width.stretch or 0)
×
42
      self.shrink = SILE.types.measurement(spec.width.shrink or 0)
×
43
   elseif type(spec) == "table" then
13,405✔
44
      self.length = SILE.types.measurement(spec.length or 0)
6,292✔
45
      self.stretch = SILE.types.measurement(spec.stretch or 0)
6,292✔
46
      self.shrink = SILE.types.measurement(spec.shrink or 0)
6,292✔
47
   elseif type(spec) == "string" then
10,259✔
48
      local amount = tonumber(spec)
202✔
49
      if type(amount) == "number" then
202✔
50
         self:_init(amount)
4✔
51
      else
52
         local parsed = SILE.parserBits.length:match(spec)
200✔
53
         if not parsed then
200✔
54
            SU.error("Could not parse length '" .. spec .. "'")
×
55
         end
56
         self:_init(parsed)
200✔
57
      end
58
   end
59
   if not self.length then
26,780✔
60
      self.length = SILE.types.measurement()
20,114✔
61
   end
62
   if not self.stretch then
26,780✔
63
      self.stretch = SILE.types.measurement()
37,506✔
64
   end
65
   if not self.shrink then
26,780✔
66
      self.shrink = SILE.types.measurement()
37,506✔
67
   end
68
end
69

70
function length:absolute ()
17✔
71
   return SILE.types.length(self.length:tonumber(), self.stretch:tonumber(), self.shrink:tonumber())
10,056✔
72
end
73

74
function length:negate ()
17✔
75
   return self:__unm()
×
76
end
77

78
function length:tostring ()
17✔
79
   return self:__tostring()
×
80
end
81

82
function length:tonumber ()
17✔
83
   return self.length:tonumber()
23,460✔
84
end
85

86
function length:__tostring ()
17✔
87
   local str = tostring(self.length)
2✔
88
   if self.stretch.amount ~= 0 then
2✔
89
      str = str .. " plus " .. tostring(self.stretch)
2✔
90
   end
91
   if self.shrink.amount ~= 0 then
2✔
92
      str = str .. " minus " .. tostring(self.shrink)
×
93
   end
94
   return str
2✔
95
end
96

97
function length:__add (other)
17✔
98
   if type(self) == "number" then
1,623✔
99
      self, other = other, self
1,305✔
100
   end
101
   other = SU.cast("length", other)
3,246✔
102
   return SILE.types.length(self.length + other.length, self.stretch + other.stretch, self.shrink + other.shrink)
6,492✔
103
end
104

105
-- See usage comments on SILE.types.measurement:___add()
106
function length:___add (other)
17✔
107
   if SU.type(other) ~= "length" then
16,838✔
108
      self.length:___add(other)
908✔
109
   else
110
      self.length:___add(other.length)
7,965✔
111
      self.stretch:___add(other.stretch)
7,965✔
112
      self.shrink:___add(other.shrink)
7,965✔
113
   end
114
   return nil
8,419✔
115
end
116

117
function length:__sub (other)
17✔
118
   local result = SILE.types.length(self)
1,261✔
119
   other = SU.cast("length", other)
2,522✔
120
   result.length = result.length - other.length
2,522✔
121
   result.stretch = result.stretch - other.stretch
2,522✔
122
   result.shrink = result.shrink - other.shrink
2,522✔
123
   return result
1,261✔
124
end
125

126
-- See usage comments on SILE.types.measurement:___add()
127
function length:___sub (other)
17✔
128
   self.length:___sub(other.length)
672✔
129
   self.stretch:___sub(other.stretch)
672✔
130
   self.shrink:___sub(other.shrink)
672✔
131
   return nil
672✔
132
end
133

134
function length:__mul (other)
17✔
135
   if type(self) == "number" then
8✔
136
      self, other = other, self
×
137
   end
138
   _error_if_not_number(other)
8✔
139
   local result = SILE.types.length(self)
8✔
140
   result.length = result.length * other
16✔
141
   result.stretch = result.stretch * other
16✔
142
   result.shrink = result.shrink * other
16✔
143
   return result
8✔
144
end
145

146
function length:__div (other)
17✔
147
   local result = SILE.types.length(self)
×
148
   _error_if_not_number(other)
×
149
   result.length = result.length / other
×
150
   result.stretch = result.stretch / other
×
151
   result.shrink = result.shrink / other
×
152
   return result
×
153
end
154

155
function length:__unm ()
17✔
156
   local result = SILE.types.length(self)
×
157
   result.length = result.length:__unm()
×
158
   return result
×
159
end
160

161
function length:__lt (other)
17✔
162
   local a = SU.cast("number", self)
6,953✔
163
   local b = SU.cast("number", other)
6,953✔
164
   return a - b < 0
6,953✔
165
end
166

167
function length:__le (other)
17✔
168
   local a = SU.cast("number", self)
3✔
169
   local b = SU.cast("number", other)
3✔
170
   return a - b <= 0
3✔
171
end
172

173
function length:__eq (other)
17✔
174
   local a = SU.cast("length", self)
×
175
   local b = SU.cast("length", other)
×
176
   return a.length == b.length and a.stretch == b.stretch and a.shrink == b.shrink
×
177
end
178

179
return length
17✔
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

© 2025 Coveralls, Inc