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

sile-typesetter / sile / 6934957716

20 Nov 2023 07:35PM UTC coverage: 57.468% (-3.2%) from 60.703%
6934957716

push

github

web-flow
Merge c91d9a7d4 into 34e2e5335

60 of 79 new or added lines in 1 file covered. (75.95%)

717 existing lines in 27 files now uncovered.

8957 of 15586 relevant lines covered (57.47%)

5715.38 hits per line

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

0.0
/packages/pdfstructure/init.lua
UNCOV
1
local base = require("packages.base")
×
2

UNCOV
3
local package = pl.class(base)
×
UNCOV
4
package._name = "pdfstructure"
×
5

6
local pdf
7
local stPointer
UNCOV
8
local mcid = 0
×
UNCOV
9
local actualtext = {}
×
10
local structureNumberTree
UNCOV
11
local numberTreeIndex = 0
×
12

13
local function stNode (notetype)
UNCOV
14
  return {
×
15
    notetype = notetype,
16
    lang = SILE.settings:get("document.language"),
17
    kids = {},
UNCOV
18
    parent = stPointer
×
19
  }
20
end
21

22
local function addChild (node)
UNCOV
23
  stPointer.kids[#(stPointer.kids)+1] = node
×
UNCOV
24
  node.parent = stPointer
×
25
end
26

27
local function ensureStructureNumber (node, pdfnode)
UNCOV
28
  local p = node.page
×
UNCOV
29
  if not pdf.lookup_dictionary(p, "StructParents") then
×
UNCOV
30
    pdf.add_dict(p, pdf.parse("/StructParents"), pdf.parse(numberTreeIndex))
×
UNCOV
31
    local nums = pdf.lookup_dictionary(structureNumberTree, "Nums")
×
UNCOV
32
    pdf.push_array(nums, pdf.parse(numberTreeIndex))
×
UNCOV
33
    pdf.push_array(nums, pdf.parse("[]"))
×
UNCOV
34
    numberTreeIndex = numberTreeIndex + 1
×
35
  end
UNCOV
36
  local nums = pdf.lookup_dictionary(structureNumberTree, "Nums")
×
37
  -- This is an array and its last element is an array
UNCOV
38
  local r = pdf.get_array(nums, pdf.array_length(nums)-1)
×
UNCOV
39
  pdf.push_array(r, pdf.reference(pdfnode))
×
40
end
41

42
local function dumpTree (node)
UNCOV
43
  local k = {}
×
UNCOV
44
  local pdfNode = pdf.parse("<< /Type /StructElem /S /"..(node.notetype)..">>")
×
UNCOV
45
  if #(node.kids) > 0 then
×
UNCOV
46
    for i = 1, #(node.kids) do
×
UNCOV
47
      k[#k+1] = dumpTree(node.kids[i])
×
48
    end
UNCOV
49
    local kArray = pdf.parse("[]")
×
UNCOV
50
    for i = 1, #k do pdf.push_array(kArray, k[i]) end
×
UNCOV
51
    pdf.add_dict(pdfNode, pdf.parse("/K"), kArray)
×
52
  else
UNCOV
53
    pdf.add_dict(pdfNode, pdf.parse("/K"), pdf.parse(node.mcid))
×
54
  end
UNCOV
55
  if node.page then
×
UNCOV
56
    pdf.add_dict(pdfNode, pdf.parse("/Pg"), pdf.reference(node.page))
×
UNCOV
57
    ensureStructureNumber(node, pdfNode)
×
58
  end
UNCOV
59
  if node.lang then
×
UNCOV
60
    pdf.add_dict(pdfNode, pdf.parse("/Lang"), pdf.parse("("..node.lang:upper()..")"))
×
61
  end
62

UNCOV
63
  if node.actualtext then
×
UNCOV
64
    pdf.add_dict(pdfNode, pdf.parse("/ActualText"), pdf.string(node.actualtext))
×
65
  end
UNCOV
66
  local ref = pdf.reference(pdfNode)
×
UNCOV
67
  pdf.release(pdfNode)
×
UNCOV
68
  return ref
×
69
end
70

UNCOV
71
function package:_init ()
×
UNCOV
72
  base._init(self)
×
UNCOV
73
  pdf = require("justenoughlibtexpdf")
×
UNCOV
74
  local _typeset = SILE.typesetter.typeset
×
UNCOV
75
  SILE.typesetter.typeset = function (node, text)
×
UNCOV
76
    actualtext[#actualtext] = tostring(actualtext[#actualtext]) .. text
×
UNCOV
77
    _typeset(node, text)
×
78
  end
UNCOV
79
  local stRoot = stNode("Document")
×
UNCOV
80
  stPointer = stRoot
×
UNCOV
81
  self:loadPackage("pdf")
×
UNCOV
82
  function SILE.outputters.libtexpdf._endHook (_)
×
UNCOV
83
    local catalog = pdf.get_dictionary("Catalog")
×
UNCOV
84
    local structureTree = pdf.parse("<< /Type /StructTreeRoot >>")
×
UNCOV
85
    pdf.add_dict(catalog, pdf.parse("/StructTreeRoot"), pdf.reference(structureTree))
×
UNCOV
86
    structureNumberTree = pdf.parse("<< /Nums [] >>")
×
UNCOV
87
    pdf.add_dict(structureTree, pdf.parse("/ParentTree"), pdf.reference(structureNumberTree))
×
UNCOV
88
    pdf.add_dict(structureTree, pdf.parse("/K"), dumpTree(stRoot))
×
UNCOV
89
    if structureNumberTree then pdf.release(structureNumberTree) end
×
UNCOV
90
    if structureTree then pdf.release(structureTree) end
×
91
  end
92
end
93

UNCOV
94
function package:registerCommands ()
×
95

UNCOV
96
  self:registerCommand("pdf:structure", function (options, content)
×
UNCOV
97
    local notetype = SU.required(options, "type", "pdf structure")
×
UNCOV
98
    local node = stNode(notetype)
×
UNCOV
99
    addChild(node)
×
UNCOV
100
    node.lang = SILE.settings:get("document.language")
×
UNCOV
101
    if type(SILE.outputter._ensureInit) == "function" then
×
UNCOV
102
      SILE.outputter:_ensureInit()
×
103
    end
UNCOV
104
    node.page = pdf.get_dictionary("@THISPAGE")
×
UNCOV
105
    node.mcid = mcid
×
UNCOV
106
    local oldstPointer = stPointer
×
UNCOV
107
    stPointer = node
×
UNCOV
108
    actualtext[#actualtext+1] = ""
×
UNCOV
109
    if not options.block then
×
UNCOV
110
      SILE.call("pdf:literal", {}, {"/"..notetype.." <</MCID "..mcid.." >>BDC"})
×
UNCOV
111
      mcid = mcid + 1
×
UNCOV
112
      SILE.process(content)
×
UNCOV
113
      SILE.call("pdf:literal", {}, {"EMC"})
×
114
    else
UNCOV
115
      SILE.process(content)
×
116
    end
UNCOV
117
    stPointer.actualtext = actualtext[#actualtext]
×
UNCOV
118
    actualtext[#actualtext] = nil
×
UNCOV
119
    stPointer = oldstPointer
×
120
  end)
121

122
end
123

124
package.documentation = [[
125
\begin{document}
126
\use[module=packages.pdfstructure]
127
\pdf:structure[type=P]{%
128
For PDF documents to be considered accessible, they must contain a description of the PDF’s document structure.
129
This package allows structure trees to be created and saved to the PDF file.
130
Currently this provides a low-level interface to creating nodes in the tree; classes which require PDF accessibility should use the \autodoc:command{\pdf:structure} command in their sectioning implementation to declare the document structure.
131
}
132

133
\pdf:structure[type=P]{%
134
See \code{tests/pdf.sil} for an example of using the \autodoc:package{pdfstructure} package to create a PDF/UA compatible document.
135
}
136
\end{document}
UNCOV
137
]]
×
138

UNCOV
139
return package
×
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