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

sile-typesetter / sile / 11162506581

03 Oct 2024 01:02PM UTC coverage: 66.881% (-2.2%) from 69.13%
11162506581

push

github

web-flow
Merge pull request #2124 from alerque/integrate-i18n

Consolodate locale related resources in language scope

1 of 1 new or added line in 1 file covered. (100.0%)

400 existing lines in 26 files now uncovered.

11973 of 17902 relevant lines covered (66.88%)

4807.68 hits per line

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

84.69
/inputters/sil.lua
1
local base = require("inputters.base")
73✔
2

3
local _variant = "epnf"
73✔
4
local parser
5
local function load_parser ()
6
   parser = require("inputters.sil-" .. _variant)
66✔
7
end
8

9
local inputter = pl.class(base)
73✔
10
inputter._name = "sil"
73✔
11

12
inputter.order = 50
73✔
13

14
inputter.appropriate = function (round, filename, doc)
15
   if not parser then
66✔
16
      load_parser()
66✔
17
   end
18
   if round == 1 then
66✔
19
      return filename:match(".sil$")
66✔
UNCOV
20
   elseif round == 2 then
×
UNCOV
21
      local sniff = doc:sub(1, 100)
×
UNCOV
22
      local promising = sniff:match("\\begin") or sniff:match("\\document") or sniff:match("\\sile")
×
UNCOV
23
      return promising and inputter.appropriate(3, filename, doc) or false
×
UNCOV
24
   elseif round == 3 then
×
UNCOV
25
      local status, _ = pcall(parser, doc)
×
UNCOV
26
      return status
×
27
   end
28
end
29

30
function inputter:_init (options)
73✔
31
   options = options or {}
66✔
32
   if options.variant then
66✔
33
      _variant = options.variant
×
34
      load_parser()
×
35
   else
36
      if not parser then
66✔
37
         load_parser()
×
38
      end
39
   end
40
   -- Save time when parsing strings by only setting up the grammar once per
41
   -- instantiation then re-using it on every use.
42
   self._parser = parser
66✔
43
   base._init(self)
66✔
44
end
45

46
local linecache = {}
73✔
47
local lno, col, lastpos
48
local function resetCache ()
49
   lno = 1
66✔
50
   col = 1
66✔
51
   lastpos = 0
66✔
52
   linecache = { { lno = 1, pos = 1 } }
66✔
53
end
54

55
local function getline (str, pos)
56
   local start = 1
2,583✔
57
   lno = 1
2,583✔
58
   if pos > lastpos then
2,583✔
59
      lno = linecache[#linecache].lno
2,427✔
60
      start = linecache[#linecache].pos + 1
2,427✔
61
      col = 1
2,427✔
62
   else
63
      for j = 1, #linecache - 1 do
2,013✔
64
         if linecache[j + 1].pos >= pos then
2,013✔
65
            lno = linecache[j].lno
156✔
66
            col = pos - linecache[j].pos
156✔
67
            return lno, col
156✔
68
         end
69
      end
70
   end
71
   for i = start, pos do
69,458✔
72
      if string.sub(str, i, i) == "\n" then
134,062✔
73
         lno = lno + 1
1,516✔
74
         col = 1
1,516✔
75
         linecache[#linecache + 1] = { pos = i, lno = lno }
1,516✔
76
         lastpos = i
1,516✔
77
      end
78
      col = col + 1
67,031✔
79
   end
80
   return lno, col
2,427✔
81
end
82

83
local function massage_ast (tree, doc)
84
   if type(tree) == "string" then
3,686✔
85
      return tree
35✔
86
   end
87
   if tree.pos then
3,651✔
88
      tree.lno, tree.col = getline(doc, tree.pos)
5,166✔
89
      tree.pos = nil
2,583✔
90
   end
91
   SU.debug("inputter", "Processing ID:", tree.id)
3,651✔
92
   if false or tree.id == "comment" then
3,651✔
93
      SU.debug("inputter", "Discarding comment:", pl.stringx.strip(tree[1]))
200✔
94
      return {}
100✔
95
   elseif
×
96
      false
97
      or tree.id == "document"
3,551✔
98
      or tree.id == "braced_content"
3,551✔
99
      or tree.id == "passthrough_content"
3,365✔
100
      or tree.id == "braced_passthrough_content"
3,330✔
101
      or tree.id == "env_passthrough_content"
3,330✔
102
   then
103
      SU.debug("inputter", "Re-massage subtree", tree.id)
246✔
104
      return massage_ast(tree[1], doc)
246✔
105
   elseif
×
106
      false
107
      or tree.id == "text"
3,305✔
108
      or tree.id == "passthrough_text"
2,285✔
109
      or tree.id == "braced_passthrough_text"
2,285✔
110
      or tree.id == "env_passthrough_text"
2,250✔
111
   then
112
      SU.debug("inputter", "  - Collapse subtree")
1,080✔
113
      return tree[1]
1,080✔
114
   elseif false or tree.id == "content" or tree.id == "environment" or tree.id == "command" then
2,225✔
115
      SU.debug("inputter", "  - Massage in place", tree.id)
2,225✔
116
      for key, val in ipairs(tree) do
6,936✔
117
         SU.debug("inputter", "    -", val.id)
4,711✔
118
         if val.id == "content" then
4,711✔
119
            SU.splice(tree, key, key, massage_ast(val, doc))
840✔
120
         elseif val.id then -- requiring an id discards nodes with no content such as comments
4,431✔
121
            tree[key] = massage_ast(val, doc)
6,188✔
122
         end
123
      end
124
      return tree
2,225✔
125
   end
126
end
127

128
function inputter:parse (doc)
73✔
129
   local status, result = pcall(self._parser, doc)
66✔
130
   if not status then
66✔
131
      return SU.error(([[
×
132
         Unable to parse input document to an AST tree
133

134
         Parser error:
135

136
           %s
137

138
         thrown from document beginning.]]):format(pl.stringx.indent(result, 6)))
×
139
   end
140
   resetCache()
66✔
141
   local top = massage_ast(result[1], doc)
66✔
142
   local tree
143
   -- Content not part of a tagged command could either be part of a document
144
   -- fragment or junk (e.g. comments, whitespace) outside of a document tag. We
145
   -- need to either capture the document tag only or decide this is a fragment
146
   -- and wrap it in a document tag.
147
   for _, leaf in ipairs(top) do
66✔
148
      if leaf.command and (leaf.command == "document" or leaf.command == "sile") then
66✔
149
         tree = leaf
66✔
150
         break
66✔
151
      end
152
   end
153
   -- In the event we didn't isolate a top level document tag above, assume this
154
   -- is a fragment and wrap it in one.
155
   if not tree then
66✔
156
      tree = { top, command = "document" }
×
157
   end
158
   -- SU.dump(tree)
159
   return { tree }
66✔
160
end
161

162
return inputter
73✔
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