• 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

82.65
/pagebuilders/base.lua
1
--- SILE pagebuilder class.
2
-- @interfaces pagebuilders
3

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

8
function pagebuilder:_init ()
10✔
9
   self.awful_bad = 1073741823
10✔
10
   self.inf_bad = 10000
10✔
11
   self.eject_penalty = -self.inf_bad
10✔
12
   self.deplorable = 100000
10✔
13
end
14

15
function pagebuilder.collateVboxes (_, vboxlist)
10✔
16
   local output = SILE.types.node.vbox()
2✔
17
   output:append(vboxlist)
2✔
18
   return output
2✔
19
end
20

21
-- Note: Almost 1/3 of the time in a typical SILE in taken iterating through
22
-- this function. As a result there are some micro-optimizations here that
23
-- make it a-typical of preferred coding styles. In particular note that
24
-- we absolutize heavily iterated lengths as early as possible and make
25
-- make direct calls to their integer amounts, assumed to be in points by
26
-- the point they are called **without actually checking**!
27
function pagebuilder:findBestBreak (options)
10✔
28
   local vboxlist = SU.required(options, "vboxlist", "in findBestBreak")
154✔
29
   local target = SU.required(options, "target", "in findBestBreak", "length")
154✔
30
   local restart = options.restart or false
154✔
31
   local force = options.force or false
154✔
32
   local i = 0
154✔
33
   local totalHeight = SILE.types.length()
154✔
34
   local bestBreak = nil
154✔
35
   local started = false
154✔
36
   if restart and restart.target == target then
154✔
37
      totalHeight = restart.totalHeight
×
38
      i = restart.i
×
39
      started = restart.started
×
40
   end
41
   local leastC = self.inf_bad
154✔
42
   SU.debug("pagebuilder", function ()
308✔
43
      return "Page builder for frame "
×
44
         .. SILE.typesetter.frame.id
×
45
         .. " called with "
×
46
         .. #vboxlist
×
47
         .. " nodes, "
×
48
         .. tostring(target)
×
49
   end)
50
   if SU.debugging("vboxes") then
308✔
51
      for j, box in ipairs(vboxlist) do
×
52
         SU.debug("vboxes", function ()
×
53
            return (j == i and " >" or "  ") .. j .. ": " .. box
×
54
         end)
55
      end
56
   end
57
   while not started and i < #vboxlist do
330✔
58
      i = i + 1
328✔
59
      if not vboxlist[i].is_vglue then
328✔
60
         started = true
152✔
61
         i = i - 1
152✔
62
         break
152✔
63
      end
64
   end
65
   local pi
66
   while i < #vboxlist do
1,060✔
67
      i = i + 1
945✔
68
      local vbox = vboxlist[i]
945✔
69
      SU.debug("pagebuilder", "Dealing with VBox", vbox)
945✔
70
      if vbox.is_vbox then
945✔
71
         totalHeight:___add(vbox.height)
401✔
72
         totalHeight:___add(vbox.depth)
802✔
73
      elseif vbox.is_vglue then
544✔
74
         totalHeight:___add(vbox.height)
908✔
75
      elseif vbox.is_insertion then
90✔
76
         -- TODO: refactor as hook and without side effects!
77
         target = SILE.insertions.processInsertion(vboxlist, i, totalHeight, target)
10✔
78
         vbox = vboxlist[i]
5✔
79
      end
80
      local left = target - totalHeight
945✔
81
      SU.debug("pagebuilder", "I have", left, "left")
945✔
82
      -- if left < -20 then SU.error("\nCatastrophic page breaking failure!"); end
83
      pi = 0
945✔
84
      if vbox.is_penalty then
945✔
85
         pi = vbox.penalty
86✔
86
      end
87
      if
88
         vbox.is_penalty and vbox.penalty < self.inf_bad
945✔
89
         or (vbox.is_vglue and i > 1 and not vboxlist[i - 1].discardable)
859✔
90
      then
91
         local badness
92
         SU.debug("pagebuilder", "totalHeight", totalHeight, "with target", target)
375✔
93
         if totalHeight.length.amount < target.length.amount then -- TeX #1039
375✔
94
            -- Account for infinite stretch?
95
            badness = SU.rateBadness(self.inf_bad, left.length.amount, totalHeight.stretch.amount)
718✔
96
         elseif left.length.amount < totalHeight.shrink.amount then
16✔
97
            badness = self.awful_bad
16✔
98
         else
99
            badness = SU.rateBadness(self.inf_bad, -left.length.amount, totalHeight.shrink.amount)
×
100
         end
101

102
         local c
103
         if badness < self.awful_bad then
375✔
104
            if pi <= self.eject_penalty then
359✔
105
               c = pi
23✔
106
            elseif badness < self.inf_bad then
336✔
107
               c = badness + pi -- plus insert
33✔
108
            else
109
               c = self.deplorable
303✔
110
            end
111
         else
112
            c = badness
16✔
113
         end
114
         if c < leastC then
375✔
115
            leastC = c
55✔
116
            bestBreak = i
55✔
117
         else
118
            restart = { totalHeight = totalHeight, i = i, started = started, target = target }
320✔
119
         end
120

121
         SU.debug("pagebuilder", "Badness:", c)
375✔
122
         if c == self.awful_bad or pi <= self.eject_penalty then
375✔
123
            SU.debug("pagebuilder", "outputting")
39✔
124
            local onepage = {}
39✔
125
            if not bestBreak then
39✔
126
               bestBreak = i
15✔
127
            end
128
            for j = 1, bestBreak do
337✔
129
               onepage[j] = table.remove(vboxlist, 1)
596✔
130
            end
131
            while #onepage > 1 and onepage[#onepage].discardable do
79✔
132
               onepage[#onepage] = nil
40✔
133
            end
134
            return onepage, pi
39✔
135
         end
136
      end
137
   end
138
   SU.debug("pagebuilder", "No page break here")
115✔
139
   if force and bestBreak then
115✔
140
      local onepage = {}
×
141
      for j = 1, bestBreak do
×
142
         onepage[j] = table.remove(vboxlist, 1)
×
143
      end
144
      return onepage, pi
×
145
   end
146
   return false, restart
115✔
147
end
148

149
return pagebuilder
10✔
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