From 4baf364380ea12b2c8549db9ef53f7ed762cc3c2 Mon Sep 17 00:00:00 2001 From: Omikhleia Date: Mon, 21 Aug 2023 23:19:49 +0200 Subject: [PATCH 1/8] feat: New approach to full bleed printing, cropmarks, background etc. Decorelate frame cursor position from actual outputter cursor. Add base class options (bleed, sheetsize) Move most of the direct low-level libtexpdf call to the outputter. --- classes/base.lua | 40 ++++ outputters/base.lua | 59 ++++++ outputters/libtexpdf.lua | 345 +++++++++++++++++++++++++++++++++++ packages/background/init.lua | 83 +++++++++ packages/cropmarks/init.lua | 95 ++++++++++ packages/pdf/init.lua | 172 +++++++++++++++++ packages/rotate/init.lua | 136 ++++++++++++++ packages/scalebox/init.lua | 73 ++++++++ tests/gutenberg.png | Bin 0 -> 39334 bytes tests/oldmanandbooks.svg | 46 +++++ tests/stained-paper.jpg | Bin 0 -> 132386 bytes tests/test1.sil | 52 ++++++ 12 files changed, 1101 insertions(+) create mode 100644 outputters/base.lua create mode 100644 outputters/libtexpdf.lua create mode 100644 packages/background/init.lua create mode 100644 packages/cropmarks/init.lua create mode 100644 packages/pdf/init.lua create mode 100644 packages/rotate/init.lua create mode 100644 packages/scalebox/init.lua create mode 100644 tests/gutenberg.png create mode 100644 tests/oldmanandbooks.svg create mode 100644 tests/stained-paper.jpg create mode 100644 tests/test1.sil diff --git a/classes/base.lua b/classes/base.lua index 0c35d26..c65e57f 100644 --- a/classes/base.lua +++ b/classes/base.lua @@ -84,9 +84,33 @@ end function class:setOptions (options) options = options or {} options.papersize = options.papersize or "a4" + -- BEGIN SILEX FULL BLEED AND PAGE SIZE + options.bleed = options.bleed or "0" + -- END SILEX FULL BLEED AND PAGE SIZE for option, value in pairs(options) do self.options[option] = value end + + -- BEGIN SILEX FULL BLEED AND PAGE SIZE + if not SILE.documentState.sheetSize then + SILE.documentState.sheetSize = { + SILE.documentState.paperSize[1], + SILE.documentState.paperSize[2] + } + end + if SILE.documentState.sheetSize[1] < SILE.documentState.paperSize[1] + or SILE.documentState.sheetSize[2] < SILE.documentState.paperSize[2] then + SU.error("Sheet size shall not be smaller than the paper size") + end + if SILE.documentState.sheetSize[1] < SILE.documentState.paperSize[1] + SILE.documentState.bleed then + SU.debug("frames", "Sheet size width augmented to take page bleed into account") + SILE.documentState.sheetSize[1] = SILE.documentState.paperSize[1] + SILE.documentState.bleed + end + if SILE.documentState.sheetSize[2] < SILE.documentState.paperSize[2] + SILE.documentState.bleed then + SU.debug("frames", "Sheet size height augmented to take page bleed into account") + SILE.documentState.sheetSize[2] = SILE.documentState.paperSize[2] + SILE.documentState.bleed + end + -- END SILEX FULL BLEED AND PAGE SIZE end function class:declareOption (option, setter) @@ -120,6 +144,22 @@ function class:declareOptions () end return self.papersize end) + -- BEGIN SILEX FULL BLEED AND PAGE SIZE + self:declareOption("sheetsize", function (_, size) + if size then + self.sheetsize = size + SILE.documentState.sheetSize = SILE.papersize(size) + end + return self.sheetsize + end) + self:declareOption("bleed", function (_, dimen) + if dimen then + self.bleed = dimen + SILE.documentState.bleed = SU.cast("measurement", dimen):tonumber() + end + return self.bleed + end) + -- END SILEX FULL BLEED AND PAGE SIZE end function class.declareSettings (_) diff --git a/outputters/base.lua b/outputters/base.lua new file mode 100644 index 0000000..88e3d22 --- /dev/null +++ b/outputters/base.lua @@ -0,0 +1,59 @@ +local outputter = pl.class() +outputter.type = "outputter" +outputter._name = "base" + +function outputter._init () end + +function outputter.newPage () end + +function outputter.finish () end + +function outputter.getCursor () end + +function outputter.setCursor (_, _, _, _) end + +function outputter.setColor () end + +function outputter.pushColor () end + +function outputter.popColor () end + +function outputter.drawHbox (_, _, _) end + +function outputter.setFont (_, _) end + +function outputter.drawImage (_, _, _, _, _, _) end + +function outputter.getImageSize (_, _) end + +function outputter.drawSVG () end + +function outputter.drawRule (_, _, _, _, _) end + +function outputter.debugFrame (_, _, _) end + +function outputter.debugHbox (_, _, _) end + +function outputter.linkAnchor (_, _, _) end + +function outputter.enterLinkTarget (_, _, _) end + +function outputter.leaveLinkTarget (_, _, _, _, _, _, _) end + +function outputter:getOutputFilename () + local fname + if SILE.outputFilename then + fname = SILE.outputFilename + elseif SILE.masterFilename then + fname = SILE.masterFilename + if self.extension then + fname = fname .. "." .. self.extension + end + end + if not fname then + SU.error("Cannot guess output filename without an input name") + end + return fname +end + +return outputter diff --git a/outputters/libtexpdf.lua b/outputters/libtexpdf.lua new file mode 100644 index 0000000..35a29de --- /dev/null +++ b/outputters/libtexpdf.lua @@ -0,0 +1,345 @@ +local base = require("outputters.base") +local pdf = require("justenoughlibtexpdf") + +local cursorX = 0 +local cursorY = 0 + +local started = false +local lastkey = false + +local debugfont = SILE.font.loadDefaults({ family = "Gentium Plus", language = "en", size = 10 }) + +local glyph2string = function (glyph) + return string.char(math.floor(glyph % 2^32 / 2^8)) .. string.char(glyph % 0x100) +end + +local _dl = 0.5 + +local _debugfont +local _font + +local outputter = pl.class(base) +outputter._name = "libtexpdf" +outputter.extension = "pdf" + +-- Sometimes setCoord is called before the outputter has ensure initialization! +local deltaX +local deltaY +local function trueXCoord (x) + if not deltaX then + deltaX = SILE.documentState.sheetSize[1] - SILE.documentState.paperSize[1] + end + return x + deltaX / 2 +end +local function trueYCoord (y) + if not deltaY then + deltaY = SILE.documentState.sheetSize[2] - SILE.documentState.paperSize[2] + end + return y + deltaY / 2 +end + +-- The outputter init can't actually initialize output (as logical as it might +-- have seemed) because that requires a page size which we don't know yet. +-- function outputter:_init () end + +function outputter:_ensureInit () + if not started then + local w, h = SILE.documentState.sheetSize[1], SILE.documentState.sheetSize[2] + local fname = self:getOutputFilename() + pdf.init(fname == "-" and "/dev/stdout" or fname, w, h, SILE.full_version) + pdf.beginpage() + started = true + end +end + +function outputter:newPage () + self:_ensureInit() + pdf.endpage() + pdf.beginpage() +end + +-- pdf stucture package needs a tie in here +function outputter._endHook (_) +end + +function outputter:finish () + self:_ensureInit() + pdf.endpage() + self:_endHook() + pdf.finish() + started = false + lastkey = nil +end + +function outputter.getCursor (_) + return cursorX, cursorY +end + +function outputter.setCursor (_, x, y, relative) + x = SU.cast("number", x) + y = SU.cast("number", y) + local offset = relative and { x = cursorX, y = cursorY } or { x = 0, y = 0 } + cursorX = offset.x + x + cursorY = offset.y + (relative and 0 or SILE.documentState.paperSize[2]) - y +end + +function outputter:setColor (color) + self:_ensureInit() + if color.r then pdf.setcolor_rgb(color.r, color.g, color.b) end + if color.c then pdf.setcolor_cmyk(color.c, color.m, color.y, color.k) end + if color.l then pdf.setcolor_gray(color.l) end +end + +function outputter:pushColor (color) + self:_ensureInit() + if color.r then pdf.colorpush_rgb(color.r, color.g, color.b) end + if color.c then pdf.colorpush_cmyk(color.c, color.m, color.y, color.k) end + if color.l then pdf.colorpush_gray(color.l) end +end + +function outputter:popColor () + self:_ensureInit() + pdf.colorpop() +end + +function outputter:_drawString (str, width, x_offset, y_offset) + local x, y = self:getCursor() + pdf.colorpush_rgb(0,0,0) + pdf.colorpop() + pdf.setstring(trueXCoord(x+x_offset), trueYCoord(y+y_offset), str, string.len(str), _font, width) +end + +function outputter:drawHbox (value, width) + width = SU.cast("number", width) + self:_ensureInit() + if not value.glyphString then return end + -- Nodes which require kerning or have offsets to the glyph + -- position should be output a glyph at a time. We pass the + -- glyph advance from the htmx table, so that libtexpdf knows + -- how wide each glyph is. It uses this to then compute the + -- relative position between the pen after the glyph has been + -- painted (cursorX + glyphAdvance) and the next painting + -- position (cursorX + width - remember that the box's "width" + -- is actually the shaped x_advance). + if value.complex then + for i = 1, #value.items do + local item = value.items[i] + local buf = glyph2string(item.gid) + self:_drawString(buf, item.glyphAdvance, item.x_offset or 0, item.y_offset or 0) + self:setCursor(item.width, 0, true) + end + else + local buf = {} + for i = 1, #value.glyphString do + buf[i] = glyph2string(value.glyphString[i]) + end + buf = table.concat(buf, "") + self:_drawString(buf, width, 0, 0) + end +end + +function outputter:_withDebugFont (callback) + if not _debugfont then + _debugfont = self:setFont(debugfont) + end + local oldfont = _font + _font = _debugfont + callback() + _font = oldfont +end + +function outputter:setFont (options) + self:_ensureInit() + local key = SILE.font._key(options) + if lastkey and key == lastkey then return _font end + local font = SILE.font.cache(options, SILE.shaper.getFace) + if options.direction == "TTB" then + font.layout_dir = 1 + end + if SILE.typesetter.frame and SILE.typesetter.frame:writingDirection() == "TTB" then + pdf.setdirmode(1) + else + pdf.setdirmode(0) + end + _font = pdf.loadfont(font) + if _font < 0 then SU.error("Font loading error for " .. pl.pretty.write(options, "")) end + lastkey = key + return _font +end + +function outputter:drawImage (src, x, y, width, height, pageno) + x = SU.cast("number", x) + y = SU.cast("number", y) + width = SU.cast("number", width) + height = SU.cast("number", height) + self:_ensureInit() + pdf.drawimage(src, trueXCoord(x), trueYCoord(y), width, height, pageno or 1) +end + +function outputter:getImageSize (src, pageno) + self:_ensureInit() -- in case it's a PDF file + local llx, lly, urx, ury, xresol, yresol = pdf.imagebbox(src, pageno or 1) + return (urx-llx), (ury-lly), xresol, yresol +end + +function outputter:drawSVG (figure, x, y, _, height, scalefactor) + self:_ensureInit() + x = SU.cast("number", x) + y = SU.cast("number", y) + height = SU.cast("number", height) + pdf.add_content("q") + self:setCursor(x, y) + x, y = self:getCursor() + local newy = y - SILE.documentState.paperSize[2] / 2 + height - SILE.documentState.sheetSize[2] / 2 + pdf.add_content(table.concat({ scalefactor, 0, 0, -scalefactor, trueXCoord(x), newy, "cm" }, " ")) + pdf.add_content(figure) + pdf.add_content("Q") +end + +function outputter:drawRule (x, y, width, height) + x = SU.cast("number", x) + y = SU.cast("number", y) + width = SU.cast("number", width) + height = SU.cast("number", height) + self:_ensureInit() + local paperY = SILE.documentState.paperSize[2] + pdf.setrule(trueXCoord(x), trueYCoord(paperY - y - height), width, height) +end + +function outputter:debugFrame (frame) + self:_ensureInit() + self:pushColor({ r = 0.8, g = 0, b = 0 }) + self:drawRule(frame:left()-_dl/2, frame:top()-_dl/2, frame:width()+_dl, _dl) + self:drawRule(frame:left()-_dl/2, frame:top()-_dl/2, _dl, frame:height()+_dl) + self:drawRule(frame:right()-_dl/2, frame:top()-_dl/2, _dl, frame:height()+_dl) + self:drawRule(frame:left()-_dl/2, frame:bottom()-_dl/2, frame:width()+_dl, _dl) + -- self:drawRule(frame:left() + frame:width()/2 - 5, (frame:top() + frame:bottom())/2+5, 10, 10) + local stuff = SILE.shaper:createNnodes(frame.id, debugfont) + stuff = stuff[1].nodes[1].value.glyphString -- Horrible hack + local buf = {} + for i = 1, #stuff do + buf[i] = glyph2string(stuff[i]) + end + buf = table.concat(buf, "") + self:_withDebugFont(function () + self:setCursor(frame:left():tonumber() - _dl/2, frame:top():tonumber() + _dl/2) + self:_drawString(buf, 0, 0, 0) + end) + self:popColor() +end + +function outputter:debugHbox (hbox, scaledWidth) + self:_ensureInit() + self:pushColor({ r = 0.8, g = 0.3, b = 0.3 }) + local paperY = SILE.documentState.paperSize[2] + local x, y = self:getCursor() + y = paperY - y + self:drawRule(x-_dl/2, y-_dl/2-hbox.height, scaledWidth+_dl, _dl) + self:drawRule(x-_dl/2, y-hbox.height-_dl/2, _dl, hbox.height+hbox.depth+_dl) + self:drawRule(x-_dl/2, y-_dl/2, scaledWidth+_dl, _dl) + self:drawRule(x+scaledWidth-_dl/2, y-hbox.height-_dl/2, _dl, hbox.height+hbox.depth+_dl) + if hbox.depth > SILE.length(0) then + self:drawRule(x-_dl/2, y+hbox.depth-_dl/2, scaledWidth+_dl, _dl) + end + self:popColor() +end + +-- The methods below are only implemented on outputters supporting these features. +-- In PDF, it relies on transformation matrices, but other backends may call +-- for a different strategy. +-- ! The API is unstable and subject to change. ! + +function outputter:scaleFn (xorigin, yorigin, xratio, yratio, callback) + xorigin = SU.cast("number", xorigin) + yorigin = SU.cast("number", yorigin) + local x0 = trueXCoord(xorigin) + local y0 = -trueYCoord(yorigin) + self:_ensureInit() + pdf:gsave() + pdf.setmatrix(1, 0, 0, 1, x0, y0) + pdf.setmatrix(xratio, 0, 0, yratio, 0, 0) + pdf.setmatrix(1, 0, 0, 1, -x0, -y0) + callback() + pdf:grestore() +end + +function outputter:rotateFn (xorigin, yorigin, theta, callback) + xorigin = SU.cast("number", xorigin) + yorigin = SU.cast("number", yorigin) + local x0 = trueXCoord(xorigin) + local y0 = -trueYCoord(yorigin) + self:_ensureInit() + pdf:gsave() + pdf.setmatrix(1, 0, 0, 1, x0, y0) + pdf.setmatrix(math.cos(theta), math.sin(theta), -math.sin(theta), math.cos(theta), 0, 0) + pdf.setmatrix(1, 0, 0, 1, -x0, -y0) + callback() + pdf:grestore() +end + +-- Other rotation unstable APIs + +function outputter:enterFrameRotate (xa, xb, y, theta) -- Unstable API see rotate package + xa = SU.cast("number", xa) + xb = SU.cast("number", xb) + y = SU.cast("number", y) + -- Keep center point the same? + local cx0 = trueXCoord(xa) + local cx1 = trueXCoord(xb) + local cy = -trueYCoord(y) + self:_ensureInit() + pdf:gsave() + pdf.setmatrix(1, 0, 0, 1, cx1, cy) + pdf.setmatrix(math.cos(theta), math.sin(theta), -math.sin(theta), math.cos(theta), 0, 0) + pdf.setmatrix(1, 0, 0, 1, -cx0, -cy) +end + +function outputter.leaveFrameRotate (_) + pdf:grestore() +end + +-- Unstable link APIs + +function outputter:linkAnchor (x, y, name) + x = SU.cast("number", x) + y = SU.cast("number", y) + self:_ensureInit() + pdf.destination(name, trueXCoord(x), trueYCoord(y)) +end + +local function borderColor (color) + if color then + if color.r then return "/C [" .. color.r .. " " .. color.g .. " " .. color.b .. "]" end + if color.c then return "/C [" .. color.c .. " " .. color.m .. " " .. color.y .. " " .. color.k .. "]" end + if color.l then return "/C [" .. color.l .. "]" end + end + return "" +end +local function borderStyle (style, width) + if style == "underline" then return "/BS<>" end + if style == "dashed" then return "/BS<>" end + return "/Border[0 0 " .. width .. "]" +end + +function outputter:enterLinkTarget (_, _) -- destination, options as argument + -- HACK: + -- Looking at the code, pdf.begin_annotation does nothing, and Simon wrote a comment + -- about tracking boxes. Unsure what he implied with this obscure statement. + -- Sure thing is that some backends may need the destination here, e.g. an HTML backend + -- would generate a , as well as the options possibly for styling + -- on the link opening? + self:_ensureInit() + pdf.begin_annotation() +end +function outputter.leaveLinkTarget (_, x0, y0, x1, y1, dest, opts) + local bordercolor = borderColor(opts.bordercolor) + local borderwidth = SU.cast("integer", opts.borderwidth) + local borderstyle = borderStyle(opts.borderstyle, borderwidth) + local target = opts.external and "/Type/Action/S/URI/URI" or "/S/GoTo/D" + local d = "<>>>" + pdf.end_annotation(d, + trueXCoord(x0) , trueYCoord(y0 - opts.borderoffset), + trueXCoord(x1), trueYCoord(y1 + opts.borderoffset)) +end + +return outputter diff --git a/packages/background/init.lua b/packages/background/init.lua new file mode 100644 index 0000000..00740ba --- /dev/null +++ b/packages/background/init.lua @@ -0,0 +1,83 @@ +local base = require("packages.base") + +local package = pl.class(base) +package._name = "background" + +local outputBackground = function (background) + local pagea = SILE.getFrame("page") + local offset = SILE.documentState.bleed / 2 + if type(background.bg) == "string" then + -- FIXME + SILE.outputter:drawImage(background.bg, + pagea:left() - offset, pagea:top() - offset, + pagea:width() + 2 * offset, pagea:height() + 2 * offset) + elseif background.bg then + SILE.outputter:pushColor(background.bg) + SILE.outputter:drawRule( + pagea:left() - offset, pagea:top() - offset, + pagea:width() + 2 * offset, pagea:height() + 2 * offset) + SILE.outputter:popColor() + end + if not background.allpages then + background.bg = nil + end +end + +SILE.scratch.background = SILE.scratch.background or {} + +function package:_init () + base._init(self) + self.class:registerHook("newpage", function (_) + outputBackground(SILE.scratch.background) + end ) +end + +function package:registerCommands () + + self:registerCommand("background", function (options, _) + if SU.boolean(options.disable, false) then + -- This option is certainly better than enforcing a white color. + SILE.scratch.background.bg = nil + return + end + + local allpages = SU.boolean(options.allpages, true) + SILE.scratch.background.allpages = allpages + local color = options.color and SILE.color(options.color) + local src = options.src + if src then + SILE.scratch.background.bg = src and SILE.resolveFile(src) or SU.error("Couldn't find file "..src) + elseif color then + SILE.scratch.background.bg = color + else + SU.error("background requires a color or an image src parameter") + end + outputBackground(SILE.scratch.background) + end, "Output a solid background color or an image on pages after initialization.") + +end + +package.documentation = [[ +\begin{document} +\use[module=packages.background] +As its name implies, the \autodoc:package{background} package allows you to set the color of the page canvas background or to use a background image extending to the full page width and height. + +The package provides a \autodoc:command{\background} command which requires one of the following parameters: +\begin{itemize} +\item{\autodoc:parameter{color=} sets the background of the current and all following pages to that color. The color specification has the same syntax as specified in the \autodoc:package{color} package.} +\item{\autodoc:parameter{src=} sets the backgound of the current and all following pages to the specified image. The latter will be scaled to the target dimension.} +\end{itemize} + +The background extends to the page trim area (“page bleed”) if the latter is defined. +This is to ensure that it indeed “bleeds” off the sides of the page, so as to avoid thin white lignes on an otherwise full color page when the paper sheet is cut to dimension but some pages are trimmed slightly more than others. +If setting only the current page background different from the default is desired, an extra parameter \autodoc:parameter{allpages=false} can be passed. + +\background[color=#e9d8ba,allpages=false] + +So, for example, \autodoc:command{\background[color=#e9d8ba,allpages=false]} will set a sepia tone background on the current page. +The \autodoc:parameter{disable=true} parameter allows disabling the background on the following pages. +It may be useful when \autodoc:parameter{allpages} is active from a previous invocation. +\end{document} +]] + +return package diff --git a/packages/cropmarks/init.lua b/packages/cropmarks/init.lua new file mode 100644 index 0000000..8c7c65c --- /dev/null +++ b/packages/cropmarks/init.lua @@ -0,0 +1,95 @@ +local base = require("packages.base") + +local package = pl.class(base) +package._name = "cropmarks" + +local outcounter = 1 + +local function outputMarks () + local page = SILE.getFrame("page") + -- Length of cromark bars + local cropsz = 20 + -- Ensure the crop marks stay outside the bleed area + local offset = math.max(10, SILE.documentState.bleed / 2) + + SILE.outputter:drawRule(page:left() - offset, page:top(), -cropsz, 0.5) + SILE.outputter:drawRule(page:left(), page:top() - offset, 0.5, -cropsz) + SILE.outputter:drawRule(page:right() + offset, page:top(), cropsz, 0.5) + SILE.outputter:drawRule(page:right(), page:top() - offset, 0.5, -cropsz) + SILE.outputter:drawRule(page:left() - offset, page:bottom(), -cropsz, 0.5) + SILE.outputter:drawRule(page:left() , page:bottom() + offset, 0.5, cropsz) + SILE.outputter:drawRule(page:right() + offset, page:bottom(), cropsz, 0.5) + SILE.outputter:drawRule(page:right(), page:bottom() + offset, 0.5, cropsz) + + local hbox, hlist = SILE.typesetter:makeHbox(function () + SILE.settings:temporarily(function () + SILE.call("noindent") + SILE.call("font", { size="6pt" }) + if SILE.Commands["crop:header"] then + -- Deprecation shim: + -- If user redefined this command, still use it with a warning... + SU.deprecated("crop:header", "cropmarks:header", "0.14.0", "0.16.0") + SILE.call("crop:header") + else + SILE.call("cropmarks:header") + end + end) + end) + if #hlist > 0 then + SU.error("Migrating content is forbidden in crop header") + end + + SILE.typesetter.frame.state.cursorX = page:left() + offset + SILE.typesetter.frame.state.cursorY = page:top() - offset - 4 + outcounter = outcounter + 1 + + if hbox then + for i = 1, #(hbox.value) do + hbox.value[i]:outputYourself(SILE.typesetter, { ratio = 1 }) + end + end +end + +function package:_init () + base._init(self) + self:loadPackage("date") +end + +function package:registerCommands () + + self:registerCommand("cropmarks:header", function (_, _) + local info = SILE.masterFilename + .. " - " + .. self.class.packages.date:date({ format = "%x %X" }) + .. " - " .. outcounter + SILE.typesetter:typeset(info) + end) + + self:registerCommand("cropmarks:setup", function (_, _) + self.class:registerHook("endpage", function (_) + outputMarks() + end ) + end) + + self:registerCommand("crop:setup", function (_, _) + SU.deprecated("crop:setup", "cropmarks:setup", "0.14.10", "0.17.0") + SILE.call("cropmarks:setup") + end) +end + +package.documentation = [[ +\begin{document} +When preparing a document for printing, you may be asked by the printer add crop marks. +This means that you need to output the document on a slightly larger page size than your target paper and add crop marks to show where the paper sheet should be trimmed down to the correct size. + +Actual paper size, true page content area and bleed/trim area can all be set via class options. + +This package provides the \autodoc:command{\cropmarks:setup} command which should be run early in your document file. +It places crop marks around the true page content. +The crop marks are guaranteed to stay outside the bleed/trim area, when defined. +It also adds a header at the top of the page with the filename, date and output sheet number. +You can customize this header by redefining \autodoc:command{\cropmarks:header}. +\end{document} +]] + +return package diff --git a/packages/pdf/init.lua b/packages/pdf/init.lua new file mode 100644 index 0000000..c31d4e6 --- /dev/null +++ b/packages/pdf/init.lua @@ -0,0 +1,172 @@ +local base = require("packages.base") + +local package = pl.class(base) +package._name = "pdf" + +local pdf + +local function validate_date (date) + return string.match(date, [[^D:%d+%s*-%s*%d%d%s*'%s*%d%d%s*'?$]]) ~= nil +end + +function package:_init () + base._init(self) + pdf = require("justenoughlibtexpdf") + if SILE.outputter._name ~= "libtexpdf" then + SU.error("pdf package requires libtexpdf backend") + end +end + +function package:registerCommands () + + self:registerCommand("pdf:destination", function (options, _) + local name = SU.required(options, "name", "pdf:destination") + SILE.typesetter:pushHbox({ + outputYourself = function (_, typesetter, line) + local state = typesetter.frame.state + typesetter.frame:advancePageDirection(-line.height) + local x, y = state.cursorX, state.cursorY + typesetter.frame:advancePageDirection(line.height) + local _y = SILE.documentState.paperSize[2] - y + SILE.outputter:linkAnchor(x, _y, name) + end + }) + end) + + self:registerCommand("pdf:bookmark", function (options, _) + local dest = SU.required(options, "dest", "pdf:bookmark") + local title = SU.required(options, "title", "pdf:bookmark") + local level = options.level or 1 + -- Added UTF8 to UTF16-BE conversion + -- For annotations and bookmarks, text strings must be encoded using + -- either PDFDocEncoding or UTF16-BE with a leading byte-order marker. + -- As PDFDocEncoding supports only limited character repertoire for + -- European languages, we use UTF-16BE for internationalization. + local ustr = SU.utf8_to_utf16be_hexencoded(title) + if type(SILE.outputter._ensureInit) == "function" then + SILE.outputter:_ensureInit() + end + SILE.typesetter:pushHbox({ + value = nil, + height = SILE.measurement(0), + width = SILE.measurement(0), + depth = SILE.measurement(0), + outputYourself = function () + local d = "</A<>>>" + pdf.bookmark(d, level) + end + }) + end) + + self:registerCommand("pdf:literal", function (_, content) + if type(SILE.outputter._ensureInit) == "function" then + SILE.outputter:_ensureInit() + end + SILE.typesetter:pushHbox({ + value = nil, + height = SILE.measurement(0), + width = SILE.measurement(0), + depth = SILE.measurement(0), + outputYourself = function (_, _, _) + pdf.add_content(content[1]) + end + }) + end) + + self:registerCommand("pdf:link", function (options, content) + local dest = SU.required(options, "dest", "pdf:link") + local external = SU.boolean(options.external, false) + local borderwidth = options.borderwidth and SU.cast("measurement", options.borderwidth):tonumber() or 0 + local bordercolor = SILE.color(options.bordercolor or "blue") + local borderoffset = SU.cast("measurement", options.borderoffset or "1pt"):tonumber() + local opts = { + external = external, + borderstyle = options.borderstyle, + bordercolor = bordercolor, + borderwidth = borderwidth, + borderoffset = borderoffset + } + + local x0, y0 + SILE.typesetter:pushHbox({ + value = nil, + height = 0, + width = 0, + depth = 0, + outputYourself = function (_, typesetter, _) + x0 = typesetter.frame.state.cursorX:tonumber() + y0 = (SILE.documentState.paperSize[2] - typesetter.frame.state.cursorY):tonumber() + SILE.outputter:enterLinkTarget(dest, opts) + end + }) + local hbox, hlist = SILE.typesetter:makeHbox(content) -- hack + SILE.typesetter:pushHbox(hbox) + SILE.typesetter:pushHbox({ + value = nil, + height = 0, + width = 0, + depth = 0, + outputYourself = function (_, typesetter, _) + local x1 = typesetter.frame.state.cursorX:tonumber() + local y1 = (SILE.documentState.paperSize[2] - typesetter.frame.state.cursorY + hbox.height):tonumber() + SILE.outputter:leaveLinkTarget(x0, y0, x1, y1, dest, opts) -- Unstable API + end + }) + SILE.typesetter:pushHlist(hlist) + end) + + self:registerCommand("pdf:metadata", function (options, _) + local key = SU.required(options, "key", "pdf:metadata") + if options.val ~= nil then + SU.deprecated("\\pdf:metadata[…, val=…]", "\\pdf:metadata[…, value=…]", "0.12.0", "0.13.0") + end + local value = SU.required(options, "value", "pdf:metadata") + + if key == "Trapped" then + SU.warn("Skipping special metadata key \\Trapped") + return + end + + if key == "ModDate" or key == "CreationDate" then + if not validate_date(value) then + SU.warn("Invalid date: " .. value) + return + end + else + -- see comment in pdf:bookmark + value = SU.utf8_to_utf16be(value) + end + if type(SILE.outputter._ensureInit) == "function" then + SILE.outputter:_ensureInit() + end + SILE.typesetter:pushHbox({ + value = nil, + height = SILE.measurement(0), + width = SILE.measurement(0), + depth = SILE.measurement(0), + outputYourself = function (_, _, _) + pdf.metadata(key, value) + end + }) + end) + +end + +package.documentation = [[ +\begin{document} +The \autodoc:package{pdf} package enables basic support for PDF links and table-of-contents entries. +It provides the four commands \autodoc:command{\pdf:destination}, \autodoc:command{\pdf:link}, \autodoc:command{\pdf:bookmark}, and \autodoc:command{\pdf:metadata}. + +The \autodoc:command{\pdf:destination} parameter creates a link target; it expects a parameter called \autodoc:parameter{name} to uniquely identify the target. +To create a link to that location in the document, use \autodoc:command{\pdf:link[dest=]{}}. + +The \autodoc:command{\pdf:link} command accepts several options defining its border style: a \autodoc:parameter{borderwidth} length setting the border width (defaults to \code{0}, meaning no border), a \autodoc:parameter{borderstyle} string (can be set to \code{underline} or \code{dashed}, otherwise a solid box), a \autodoc:parameter{bordercolor} color specification for this border (defaults to \code{blue}), and finally a \autodoc:parameter{borderoffset} length for adjusting the border with some vertical space above the content and below the baseline (defaults to \code{1pt}). +Note that PDF renderers may vary on how they honor these border styling features on link annotations. + +It also has an \autodoc:parameter{external} option for URL links, which is not intended to be used directly—refer to the \autodoc:package{url} package for more flexibility typesetting external links. + +To set arbitrary key-value metadata, use something like \autodoc:command{\pdf:metadata[key=Author, value=J. Smith]}. The PDF metadata field names are case-sensitive. Common keys include \code{Title}, \code{Author}, \code{Subject}, \code{Keywords}, \code{CreationDate}, and \code{ModDate}. +\end{document} +]] + +return package diff --git a/packages/rotate/init.lua b/packages/rotate/init.lua new file mode 100644 index 0000000..6aad18c --- /dev/null +++ b/packages/rotate/init.lua @@ -0,0 +1,136 @@ +local base = require("packages.base") + +local package = pl.class(base) +package._name = "rotate" + +local enter = function (self, _) + -- Probably broken, see: + -- https://github.com/sile-typesetter/sile/issues/427 + if not self.rotate then return end + if not SILE.outputter.enterFrameRotate then + return SU.warn("Frame '".. self.id "' will not be rotated: backend '" .. SILE.outputter._name .. "' does not support rotation") + end + local theta = -math.rad(self.rotate) + -- Keep center point the same + local x0 = self:left():tonumber() + local x1 = x0 + math.sin(theta) * self:height():tonumber() + local y0 = self:bottom():tonumber() + SILE.outputter:enterFrameRotate(x0, x1, y0, theta) -- Unstable API +end + +local leave = function(self, _) + if not self.rotate then return end + if not SILE.outputter.enterFrameRotate then return end -- no enter no leave. + SILE.outputter:leaveFrameRotate() +end + +-- What is the width, depth and height of a rectangle width w and height h rotated by angle theta? +-- rect1 = Rectangle[{0, 0}, {w, h}] +-- {{xmin, xmax}, {ymin, ymax}} = Refine[RegionBounds[TransformedRegion[rect1, +-- RotationTransform[theta, {w/2,h/2}]]], +-- w > 0 && h > 0 && theta > 0 && theta < 2 Pi ] +-- PiecewiseExpand[xmax - xmin] + -- \[Piecewise] -w Cos[theta]-h Sin[theta] Sin[theta]<=0&&Cos[theta]<=0 + -- w Cos[theta]-h Sin[theta] Sin[theta]<=0&&Cos[theta]>0 + -- -w Cos[theta]+h Sin[theta] Sin[theta]>0&&Cos[theta]<=0 + -- w Cos[theta]+h Sin[theta] True + +local outputRotatedHbox = function (self, typesetter, line) + local origbox = self.value.orig + local theta = self.value.theta + + -- Find origin of untransformed hbox + local X = typesetter.frame.state.cursorX + local Y = typesetter.frame.state.cursorY + typesetter.frame.state.cursorX = X - (origbox.width.length-self.width)/2 + local horigin = X + origbox.width.length / 2 + local vorigin = Y - (origbox.height - origbox.depth) / 2 + + SILE.outputter:rotateFn(horigin, vorigin, theta, function () + origbox:outputYourself(typesetter, line) + end) + typesetter.frame.state.cursorX = X + typesetter.frame.state.cursorY = Y + typesetter.frame:advanceWritingDirection(self.width) +end + +function package:_init () + base._init(self) + if SILE.typesetter and SILE.typesetter.frame then + enter(SILE.typesetter.frame, SILE.typesetter) + table.insert(SILE.typesetter.frame.leaveHooks, leave) + end + table.insert(SILE.framePrototype.enterHooks, enter) + table.insert(SILE.framePrototype.leaveHooks, leave) +end + +function package:registerCommands () + + self:registerCommand("rotate", function(options, content) + if not SILE.outputter.rotateFn then + SU.warn("Output will not be rotated: backend '" .. SILE.outputter._name .. "' does not support rotation") + return SILE.process(content) + end + local angle = SU.required(options, "angle", "rotate command") + local theta = -math.rad(angle) + local origbox, hlist = SILE.typesetter:makeHbox(content) + local h = origbox.height + origbox.depth + local w = origbox.width.length + local st = math.sin(theta) + local ct = math.cos(theta) + local height, width, depth + if st <= 0 and ct <= 0 then + width = -w * ct - h * st + height = 0.5*(h-h*ct-w*st) + depth = 0.5*(h+h*ct+w*st) + elseif st <=0 and ct > 0 then + width = w * ct - h * st + height = 0.5*(h+h*ct-w*st) + depth = 0.5*(h-h*ct+w*st) + elseif st > 0 and ct <= 0 then + width = -w * ct + h * st + height = 0.5*(h-h*ct+w*st) + depth = 0.5*(h+h*ct-w*st) + else + width = w * ct + h * st + height = 0.5*(h+h*ct+w*st) + depth = 0.5*(h-h*ct-w*st) + end + depth = -depth + if depth < SILE.length(0) then depth = SILE.length(0) end + SILE.typesetter:pushHbox({ + value = { orig = origbox, theta = theta}, + height = height, + width = width, + depth = depth, + outputYourself = outputRotatedHbox + }) + SILE.typesetter:pushHlist(hlist) + end) + +end + +package.documentation = [[ +\begin{document} +\use[module=packages.rotate] +The \autodoc:package{rotate} package allows you to rotate things. You can rotate entire +frames, by adding the \autodoc:parameter{rotate=} declaration to your frame declaration, +and you can rotate any content by issuing the command \autodoc:command{\rotate[angle=]{}}, +where the angle is measured in degrees. + +Content which is rotated is placed in a box and rotated. The height and width of +the rotated box is measured, and then put into the normal horizontal list for +typesetting. The effect is that space is reserved around the rotated content. +The best way to understand this is by example: here is some text rotated by +\rotate[angle=10]{ten}, \rotate[angle=20]{twenty}, and \rotate[angle=40]{forty} degrees. + +The previous line was produced by the following code: + +\begin[type=autodoc:codeblock]{raw} +here is some text rotated by +\rotate[angle=10]{ten}, \rotate[angle=20]{twenty}, and \rotate[angle=40]{forty} degrees. +\end{raw} +\end{document} +]] + +return package diff --git a/packages/scalebox/init.lua b/packages/scalebox/init.lua new file mode 100644 index 0000000..8ab331f --- /dev/null +++ b/packages/scalebox/init.lua @@ -0,0 +1,73 @@ +local base = require("packages.base") + +local package = pl.class(base) +package._name = "scalebox" + +function package:registerCommands () + + self:registerCommand("scalebox", function(options, content) + if not SILE.outputter.scaleFn then + SU.warn("Output will not be scaled: backend '" .. SILE.outputter._name .. "' does not support scaling") + return SILE.process(content) + end + + local hbox, hlist = SILE.typesetter:makeHbox(content) + local xratio, yratio = SU.cast("number", options.xratio or 1), SU.cast("number", options.yratio or 1) + if xratio == 0 or yratio == 0 then + SU.error("Scaling ratio cannot be null") + end + + local W = hbox.width * math.abs(xratio) + local H, D + if yratio > 0 then + H = hbox.height * yratio + D = hbox.depth * yratio + else + H = hbox.depth * -yratio + D = hbox.height * -yratio + end + + SILE.typesetter:pushHbox({ + width = W, + height = H, + depth = D, + outputYourself = function(node, typesetter, line) + local outputWidth = SU.rationWidth(node.width, node.width, line.ratio) + local X = typesetter.frame.state.cursorX + local Y = typesetter.frame.state.cursorY + + if xratio < 0 then + typesetter.frame:advanceWritingDirection(-outputWidth) + end + SILE.outputter:scaleFn(X, Y, xratio, yratio, function () + hbox:outputYourself(typesetter, line) + end) + typesetter.frame.state.cursorX = X + typesetter.frame.state.cursorY = Y + typesetter.frame:advanceWritingDirection(outputWidth) + end + }) + SILE.typesetter:pushHlist(hlist) + end, "Scale content by some horizontal and vertical ratios") + +end + +package.documentation = [[ +\begin{document} +The \autodoc:package{scalebox} package allows to scale any content by some horizontal +and vertical ratios, by issuing the command +\autodoc:command{\scalebox[xratio=, yratio=]{}}, +where the ratios are optional non-null numbers (defaulting to 1). +The content is placed in a box and scaled. + +Here is an \scalebox[xratio=0.75, yratio=1.25]{example}. + +The previous line was produced by the following code: + +\begin[type=autodoc:codeblock]{raw} +Here is an \scalebox[xratio=0.75, yratio=1.25]{example}. +\end{raw} +\end{document} +]] + +return package diff --git a/tests/gutenberg.png b/tests/gutenberg.png new file mode 100644 index 0000000000000000000000000000000000000000..ecce70a69da3e642a2cb3e31e009533c538f5d67 GIT binary patch literal 39334 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%0A~oS6E^+4&SaDt17?%Xw0U>VYxf6 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 literal 0 HcmV?d00001 diff --git a/tests/oldmanandbooks.svg b/tests/oldmanandbooks.svg new file mode 100644 index 0000000..e5b82be --- /dev/null +++ b/tests/oldmanandbooks.svg @@ -0,0 +1,46 @@ + + + + + + + + + image/svg+xml + + + + + Openclipart + + + Old Man and Books + 2013-09-27T06:46:27 + Originally there was some newspaper title obscuring this old man, so I put the effort into 'restoring' him before synthesizing this image. I think it worked, and now he can be old forever... ready for whatever wonderful clipart use you have for him! + https://openclipart.org/detail/183916/old-man-and-books-by-j4p4n-183916 + + + j4p4n + + + + + books + bookshelf + cobwebs + librarian + library + man + old + reading + + + + + + + + + + + \ No newline at end of file diff --git a/tests/stained-paper.jpg b/tests/stained-paper.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3be10a4602aa2c936c7eb2f863df01e4b2cf0749 GIT binary patch literal 132386 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 Date: Tue, 22 Aug 2023 02:43:08 +0200 Subject: [PATCH 2/8] fix: Debug hbox could show incorrectly offset boxes --- typesetters/base.lua | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/typesetters/base.lua b/typesetters/base.lua index 0b09a59..34da19b 100644 --- a/typesetters/base.lua +++ b/typesetters/base.lua @@ -1126,16 +1126,20 @@ function typesetter:makeHbox (content) local ox = atypesetter.frame.state.cursorX local oy = atypesetter.frame.state.cursorY SILE.outputter:setCursor(atypesetter.frame.state.cursorX, atypesetter.frame.state.cursorY) + -- BEGIN SILEX FIX DEBUG + SU.debug("hboxes", function () + -- setCursor also invoked by the internal hboxes etc. + -- so we must show our debug box before outputting its content. + SILE.outputter:debugHbox(box, box:scaledWidth(line)) + return "Drew debug outline around hbox" + end) + -- END SILEX FIX DEBUG for _, node in ipairs(box.value) do node:outputYourself(atypesetter, line) end atypesetter.frame.state.cursorX = ox atypesetter.frame.state.cursorY = oy _post() - SU.debug("hboxes", function () - SILE.outputter:debugHbox(box, box:scaledWidth(line)) - return "Drew debug outline around hbox" - end) end }) return hbox, migratingNodes From 3e616c03b5c8d2250ffd1f05c55562763aa7ffaa Mon Sep 17 00:00:00 2001 From: Omikhleia Date: Wed, 23 Aug 2023 01:31:12 +0200 Subject: [PATCH 3/8] fix: Commands pdf:metadata and pdf:bookmark do not need an hbox They act on dictionaries and are unrelated to the position of anythink on a page, so they don't need to be wrapped in an hbox and wait for its output. Removing the useless hbox avoids side-effects on frame content, paragraph indent, etc. --- packages/pdf/init.lua | 24 ++++-------------------- 1 file changed, 4 insertions(+), 20 deletions(-) diff --git a/packages/pdf/init.lua b/packages/pdf/init.lua index c31d4e6..5629745 100644 --- a/packages/pdf/init.lua +++ b/packages/pdf/init.lua @@ -36,7 +36,7 @@ function package:registerCommands () self:registerCommand("pdf:bookmark", function (options, _) local dest = SU.required(options, "dest", "pdf:bookmark") local title = SU.required(options, "title", "pdf:bookmark") - local level = options.level or 1 + local level = SU.cast("integer", options.level or 1) -- Added UTF8 to UTF16-BE conversion -- For annotations and bookmarks, text strings must be encoded using -- either PDFDocEncoding or UTF16-BE with a leading byte-order marker. @@ -46,16 +46,8 @@ function package:registerCommands () if type(SILE.outputter._ensureInit) == "function" then SILE.outputter:_ensureInit() end - SILE.typesetter:pushHbox({ - value = nil, - height = SILE.measurement(0), - width = SILE.measurement(0), - depth = SILE.measurement(0), - outputYourself = function () - local d = "</A<>>>" - pdf.bookmark(d, level) - end - }) + local d = "</A<>>>" + pdf.bookmark(d, level) end) self:registerCommand("pdf:literal", function (_, content) @@ -139,15 +131,7 @@ function package:registerCommands () if type(SILE.outputter._ensureInit) == "function" then SILE.outputter:_ensureInit() end - SILE.typesetter:pushHbox({ - value = nil, - height = SILE.measurement(0), - width = SILE.measurement(0), - depth = SILE.measurement(0), - outputYourself = function (_, _, _) - pdf.metadata(key, value) - end - }) + pdf.metadata(key, value) end) end From 642eb273b143cde4829f0ea5bdd48527e06ac6d3 Mon Sep 17 00:00:00 2001 From: Omikhleia Date: Wed, 23 Aug 2023 02:34:35 +0200 Subject: [PATCH 4/8] refactor: Move pdf:bookmark and pdf:metadata logic to the outputter --- outputters/base.lua | 4 +++ outputters/libtexpdf.lua | 37 +++++++++++++++++++++++++ packages/pdf/init.lua | 58 +++++++++++----------------------------- 3 files changed, 56 insertions(+), 43 deletions(-) diff --git a/outputters/base.lua b/outputters/base.lua index 88e3d22..13739f0 100644 --- a/outputters/base.lua +++ b/outputters/base.lua @@ -40,6 +40,10 @@ function outputter.enterLinkTarget (_, _, _) end function outputter.leaveLinkTarget (_, _, _, _, _, _, _) end +function outputter.setMetadata (_, _, _) end + +function outputter.setBookmark (_, _, _) end + function outputter:getOutputFilename () local fname if SILE.outputFilename then diff --git a/outputters/libtexpdf.lua b/outputters/libtexpdf.lua index 35a29de..0c0c811 100644 --- a/outputters/libtexpdf.lua +++ b/outputters/libtexpdf.lua @@ -342,4 +342,41 @@ function outputter.leaveLinkTarget (_, x0, y0, x1, y1, dest, opts) trueXCoord(x1), trueYCoord(y1 + opts.borderoffset)) end +-- Bookmarks and metadata + +local function validate_date (date) + return string.match(date, [[^D:%d+%s*-%s*%d%d%s*'%s*%d%d%s*'?$]]) ~= nil +end + +function outputter:setMetadata (key, value) + if key == "Trapped" then + SU.warn("Skipping special metadata key \\Trapped") + return + end + + if key == "ModDate" or key == "CreationDate" then + if not validate_date(value) then + SU.warn("Invalid date: " .. value) + return + end + else + -- see comment in on bookmark + value = SU.utf8_to_utf16be(value) + end + self:_ensureInit() + pdf.metadata(key, value) +end + +function outputter:setBookmark (dest, title, level) + -- Added UTF8 to UTF16-BE conversion + -- For annotations and bookmarks, text strings must be encoded using + -- either PDFDocEncoding or UTF16-BE with a leading byte-order marker. + -- As PDFDocEncoding supports only limited character repertoire for + -- European languages, we use UTF-16BE for internationalization. + local ustr = SU.utf8_to_utf16be_hexencoded(title) + local d = "</A<>>>" + self:_ensureInit() + pdf.bookmark(d, level) +end + return outputter diff --git a/packages/pdf/init.lua b/packages/pdf/init.lua index 5629745..7a5b018 100644 --- a/packages/pdf/init.lua +++ b/packages/pdf/init.lua @@ -1,22 +1,13 @@ +-- +-- This package and its commands are perhaps ill-named: +-- Exception made of the pdf:literal command below, the concepts of links +-- (anchor, target), bookmarks, and metadata are not specific to PDF. +-- local base = require("packages.base") local package = pl.class(base) package._name = "pdf" -local pdf - -local function validate_date (date) - return string.match(date, [[^D:%d+%s*-%s*%d%d%s*'%s*%d%d%s*'?$]]) ~= nil -end - -function package:_init () - base._init(self) - pdf = require("justenoughlibtexpdf") - if SILE.outputter._name ~= "libtexpdf" then - SU.error("pdf package requires libtexpdf backend") - end -end - function package:registerCommands () self:registerCommand("pdf:destination", function (options, _) @@ -37,20 +28,18 @@ function package:registerCommands () local dest = SU.required(options, "dest", "pdf:bookmark") local title = SU.required(options, "title", "pdf:bookmark") local level = SU.cast("integer", options.level or 1) - -- Added UTF8 to UTF16-BE conversion - -- For annotations and bookmarks, text strings must be encoded using - -- either PDFDocEncoding or UTF16-BE with a leading byte-order marker. - -- As PDFDocEncoding supports only limited character repertoire for - -- European languages, we use UTF-16BE for internationalization. - local ustr = SU.utf8_to_utf16be_hexencoded(title) - if type(SILE.outputter._ensureInit) == "function" then - SILE.outputter:_ensureInit() - end - local d = "</A<>>>" - pdf.bookmark(d, level) + + SILE.outputter:setBookmark(dest, title, level) end) self:registerCommand("pdf:literal", function (_, content) + -- NOTE: This method is used by the pdfstructure package and should + -- probably be moved elsewhere, so there's no attempt here to delegate + -- the low-level libtexpdf call to te outputter. + if SILE.outputter._name ~= "libtexpdf" then + SU.error("pdf package requires libtexpdf backend") + end + local pdf = require("justenoughlibtexpdf") if type(SILE.outputter._ensureInit) == "function" then SILE.outputter:_ensureInit() end @@ -114,24 +103,7 @@ function package:registerCommands () end local value = SU.required(options, "value", "pdf:metadata") - if key == "Trapped" then - SU.warn("Skipping special metadata key \\Trapped") - return - end - - if key == "ModDate" or key == "CreationDate" then - if not validate_date(value) then - SU.warn("Invalid date: " .. value) - return - end - else - -- see comment in pdf:bookmark - value = SU.utf8_to_utf16be(value) - end - if type(SILE.outputter._ensureInit) == "function" then - SILE.outputter:_ensureInit() - end - pdf.metadata(key, value) + SILE.outputter:setMetadata(key, value) end) end From f67879036e253569317114583e7dcfaa4d16bf8d Mon Sep 17 00:00:00 2001 From: Omikhleia Date: Wed, 23 Aug 2023 13:16:34 +0200 Subject: [PATCH 5/8] refactor: Code-cleanup in cropmarks, background and outputters --- outputters/base.lua | 4 ++-- outputters/libtexpdf.lua | 29 +++++++++++++++-------------- packages/background/init.lua | 19 ++++++++----------- packages/cropmarks/init.lua | 6 ++---- 4 files changed, 27 insertions(+), 31 deletions(-) diff --git a/outputters/base.lua b/outputters/base.lua index 13739f0..2dfe4ae 100644 --- a/outputters/base.lua +++ b/outputters/base.lua @@ -48,8 +48,8 @@ function outputter:getOutputFilename () local fname if SILE.outputFilename then fname = SILE.outputFilename - elseif SILE.masterFilename then - fname = SILE.masterFilename + elseif SILE.input.filenames[1] then + fname = pl.path.splitext(SILE.input.filenames[1]) if self.extension then fname = fname .. "." .. self.extension end diff --git a/outputters/libtexpdf.lua b/outputters/libtexpdf.lua index 0c0c811..e49b773 100644 --- a/outputters/libtexpdf.lua +++ b/outputters/libtexpdf.lua @@ -22,20 +22,21 @@ local outputter = pl.class(base) outputter._name = "libtexpdf" outputter.extension = "pdf" --- Sometimes setCoord is called before the outputter has ensure initialization! +-- N.B. Sometimes setCoord is called before the outputter has ensured initialization. +-- This ok for coordinates manipulation, at these points we know the page size. local deltaX local deltaY local function trueXCoord (x) if not deltaX then - deltaX = SILE.documentState.sheetSize[1] - SILE.documentState.paperSize[1] + deltaX = (SILE.documentState.sheetSize[1] - SILE.documentState.paperSize[1]) / 2 end - return x + deltaX / 2 + return x + deltaX end local function trueYCoord (y) if not deltaY then - deltaY = SILE.documentState.sheetSize[2] - SILE.documentState.paperSize[2] + deltaY = (SILE.documentState.sheetSize[2] - SILE.documentState.paperSize[2]) / 2 end - return y + deltaY / 2 + return y + deltaY end -- The outputter init can't actually initialize output (as logical as it might @@ -368,15 +369,15 @@ function outputter:setMetadata (key, value) end function outputter:setBookmark (dest, title, level) - -- Added UTF8 to UTF16-BE conversion - -- For annotations and bookmarks, text strings must be encoded using - -- either PDFDocEncoding or UTF16-BE with a leading byte-order marker. - -- As PDFDocEncoding supports only limited character repertoire for - -- European languages, we use UTF-16BE for internationalization. - local ustr = SU.utf8_to_utf16be_hexencoded(title) - local d = "</A<>>>" - self:_ensureInit() - pdf.bookmark(d, level) + -- Added UTF8 to UTF16-BE conversion + -- For annotations and bookmarks, text strings must be encoded using + -- either PDFDocEncoding or UTF16-BE with a leading byte-order marker. + -- As PDFDocEncoding supports only limited character repertoire for + -- European languages, we use UTF-16BE for internationalization. + local ustr = SU.utf8_to_utf16be_hexencoded(title) + local d = "</A<>>>" + self:_ensureInit() + pdf.bookmark(d, level) end return outputter diff --git a/packages/background/init.lua b/packages/background/init.lua index 00740ba..10e7a71 100644 --- a/packages/background/init.lua +++ b/packages/background/init.lua @@ -3,11 +3,12 @@ local base = require("packages.base") local package = pl.class(base) package._name = "background" -local outputBackground = function (background) +local background = {} + +local outputBackground = function () local pagea = SILE.getFrame("page") local offset = SILE.documentState.bleed / 2 if type(background.bg) == "string" then - -- FIXME SILE.outputter:drawImage(background.bg, pagea:left() - offset, pagea:top() - offset, pagea:width() + 2 * offset, pagea:height() + 2 * offset) @@ -23,13 +24,9 @@ local outputBackground = function (background) end end -SILE.scratch.background = SILE.scratch.background or {} - function package:_init () base._init(self) - self.class:registerHook("newpage", function (_) - outputBackground(SILE.scratch.background) - end ) + self.class:registerHook("newpage", outputBackground) end function package:registerCommands () @@ -37,18 +34,18 @@ function package:registerCommands () self:registerCommand("background", function (options, _) if SU.boolean(options.disable, false) then -- This option is certainly better than enforcing a white color. - SILE.scratch.background.bg = nil + background.bg = nil return end local allpages = SU.boolean(options.allpages, true) - SILE.scratch.background.allpages = allpages + background.allpages = allpages local color = options.color and SILE.color(options.color) local src = options.src if src then - SILE.scratch.background.bg = src and SILE.resolveFile(src) or SU.error("Couldn't find file "..src) + background.bg = src and SILE.resolveFile(src) or SU.error("Couldn't find file "..src) elseif color then - SILE.scratch.background.bg = color + background.bg = color else SU.error("background requires a color or an image src parameter") end diff --git a/packages/cropmarks/init.lua b/packages/cropmarks/init.lua index 8c7c65c..87148ee 100644 --- a/packages/cropmarks/init.lua +++ b/packages/cropmarks/init.lua @@ -28,7 +28,7 @@ local function outputMarks () if SILE.Commands["crop:header"] then -- Deprecation shim: -- If user redefined this command, still use it with a warning... - SU.deprecated("crop:header", "cropmarks:header", "0.14.0", "0.16.0") + SU.deprecated("crop:header", "cropmarks:header", "0.15.0", "0.16.0") SILE.call("crop:header") else SILE.call("cropmarks:header") @@ -66,9 +66,7 @@ function package:registerCommands () end) self:registerCommand("cropmarks:setup", function (_, _) - self.class:registerHook("endpage", function (_) - outputMarks() - end ) + self.class:registerHook("endpage", outputMarks) end) self:registerCommand("crop:setup", function (_, _) From 98f2e18c9dd647f94f746be965dd1e39d2abe470 Mon Sep 17 00:00:00 2001 From: Omikhleia Date: Wed, 23 Aug 2023 02:37:10 +0200 Subject: [PATCH 6/8] refactor: Let url package always load the pdf package --- packages/url/init.lua | 175 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 175 insertions(+) create mode 100644 packages/url/init.lua diff --git a/packages/url/init.lua b/packages/url/init.lua new file mode 100644 index 0000000..b754595 --- /dev/null +++ b/packages/url/init.lua @@ -0,0 +1,175 @@ +local base = require("packages.base") + +local package = pl.class(base) +package._name = "url" + +-- URL escape sequence, URL fragment: +local preferBreakBefore = "%#" +-- URL path elements, URL query arguments, acceptable extras: +local preferBreakAfter = ":/.;?&=!_-" +-- URL scheme: +local alwaysBreakAfter = ":" -- Must have only one character here! + +local escapeRegExpMinimal = function (str) + -- Minimalist = just what's needed for the above strings + return string.gsub(str, '([%.%?%-%%])', '%%%1') +end + +local breakPattern = "["..escapeRegExpMinimal(preferBreakBefore..preferBreakAfter..alwaysBreakAfter).."]" + +function package:_init () + base._init(self) + self:loadPackage("verbatim") + self:loadPackage("inputfilter") + self:loadPackage("pdf") +end + +function package.declareSettings (_) + + SILE.settings:declare({ + parameter = "url.linebreak.primaryPenalty", + type = "integer", + default = 100, + help = "Penalty for breaking lines in URLs at preferred breakpoints" + }) + + SILE.settings:declare({ + parameter = "url.linebreak.secondaryPenalty", + type = "integer", + default = 200, + help = "Penalty for breaking lines in URLs at tolerable breakpoints (should be higher than url.linebreak.primaryPenalty)" + }) + +end + +function package:registerCommands () + + self:registerCommand("href", function (options, content) + if options.src then + SILE.call("pdf:link", { dest = options.src, external = true, + borderwidth = options.borderwidth, + borderstyle = options.borderstyle, + bordercolor = options.bordercolor, + borderoffset = options.borderoffset }, + content) + else + options.src = content[1] + SILE.call("pdf:link", { dest = options.src, external = true, + borderwidth = options.borderwidth, + borderstyle = options.borderstyle, + bordercolor = options.bordercolor, + borderoffset = options.borderoffset }, + function (_, _) + SILE.call("url", { language = options.language }, content) + end) + end + end, "Inserts a PDF hyperlink.") + + local urlFilter = function (node, content, options) + if type(node) == "table" then return node end + local result = {} + for token in SU.gtoke(node, breakPattern) do + if token.string then + result[#result+1] = token.string + else + if string.find(preferBreakBefore, escapeRegExpMinimal(token.separator)) then + -- Accepts breaking before, and at the extreme worst after. + result[#result+1] = self.class.packages.inputfilter:createCommand( + content.pos, content.col, content.lno, + "penalty", { penalty = options.primaryPenalty } + ) + result[#result+1] = token.separator + result[#result+1] = self.class.packages.inputfilter:createCommand( + content.pos, content.col, content.lno, + "penalty", { penalty = options.worsePenalty } + ) + elseif token.separator == alwaysBreakAfter then + -- Accept breaking after (only). + result[#result+1] = token.separator + result[#result+1] = self.class.packages.inputfilter:createCommand( + content.pos, content.col, content.lno, + "penalty", { penalty = options.primaryPenalty } + ) + else + -- Accept breaking after, but tolerate breaking before. + result[#result+1] = self.class.packages.inputfilter:createCommand( + content.pos, content.col, content.lno, + "penalty", { penalty = options.secondaryPenalty } + ) + result[#result+1] = token.separator + result[#result+1] = self.class.packages.inputfilter:createCommand( + content.pos, content.col, content.lno, + "penalty", { penalty = options.primaryPenalty } + ) + end + end + end + return result + end + + self:registerCommand("url", function (options, content) + SILE.settings:temporarily(function () + local primaryPenalty = SILE.settings:get("url.linebreak.primaryPenalty") + local secondaryPenalty = SILE.settings:get("url.linebreak.secondaryPenalty") + local worsePenalty = primaryPenalty + secondaryPenalty + + if options.language then + SILE.languageSupport.loadLanguage(options.language) + if options.language == "fr" then + -- Trick the engine by declaring a "fake"" language that doesn't apply + -- the typographic rules for punctuations + SILE.hyphenator.languages["_fr_noSpacingRules"] = SILE.hyphenator.languages.fr + -- Not needed (the engine already defaults to SILE.nodeMakers.unicode if + -- the language is not found): + -- SILE.nodeMakers._fr_noSpacingRules = SILE.nodeMakers.unicode + SILE.settings:set("document.language", "_fr_noSpacingRules") + else + SILE.settings:set("document.language", options.language) + end + else + SILE.settings:set("document.language", 'und') + end + + local result = self.class.packages.inputfilter:transformContent(content, urlFilter, { + primaryPenalty = primaryPenalty, + secondaryPenalty = secondaryPenalty, + worsePenalty = worsePenalty + }) + SILE.call("urlstyle", {}, result) + end) + end, "Inserts penalties in an URL so it can be broken over multiple lines at appropriate places.") + + self:registerCommand("urlstyle", function (options, content) + SILE.call("code", options, content) + end, "Hook that may be redefined to change the styling of URLs") + +end + +package.documentation = [[ +\begin{document} +\use[module=packages.url] +This package enhances the typesetting of URLs in two ways. +First, it provides the \autodoc:command{\href[src=]{}} command which inserts PDF hyperlinks, \href[src=http://www.sile-typesetter.org/]{like this}. + +The \autodoc:command{\href} command accepts the same \autodoc:parameter{borderwidth}, \autodoc:parameter{bordercolor}, \autodoc:parameter{borderstyle}, and \autodoc:parameter{borderoffset} styling options as the \autodoc:command[check=false]{\pdf:link} command from the \autodoc:package{pdf} package, for instance \href[src=http://www.sile-typesetter.org/, borderwidth=0.4pt, bordercolor=blue, borderstyle=underline]{like this}. + +Nowadays, it is a common practice to have URLs in print articles (whether it is a good practice or not is yet \em{another} topic). +Therefore, the package also provides the \autodoc:command{\url} command, which will automatically insert breakpoints into unwieldy URLs like \url{https://github.com/sile-typesetter/sile-typesetter.github.io/tree/master/examples} so that they can be broken up over multiple lines. + +It allows line breaks after the colon, and before or after appropriate segments of an URL (path elements, query parts, fragments, etc.). +By default, the \autodoc:command{\url} command ignores the current language, as one would not want hyphenation to occur in URL segments. +If you have no other choice, however, you can pass it a \autodoc:parameter{language} option to enforce a language to be applied. +Note that if French (\code{fr}) is selected, the special typographic rules applying to punctuations in this language are disabled. + +To typeset a URL and also make it an active hyperlink, use the \autodoc:command{\href} command without the \autodoc:parameter{src} option, +but with the URL passed as argument. + +The breaks are controlled by two penalty settings: \autodoc:setting{url.linebreak.primaryPenalty} for preferred breakpoints and, for less acceptable but still tolerable breakpoints, \autodoc:setting{url.linebreak.secondaryPenalty}—its value should logically be higher than the previous one. + +The \autodoc:command{\urlstyle} command hook may be overridden to change the style of URLs. +By default, they are typeset as “code”. + +\end{document} +]] + +return package From 54f3b13b6adc2440d3a8cf2b5e7c96f54278339c Mon Sep 17 00:00:00 2001 From: Omikhleia Date: Thu, 24 Aug 2023 01:00:50 +0200 Subject: [PATCH 7/8] chore(typesetters,outputters,packages): Clean in-code comments No code change --- outputters/base.lua | 6 +++--- outputters/libtexpdf.lua | 2 ++ packages/cropmarks/init.lua | 2 +- typesetters/base.lua | 4 +--- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/outputters/base.lua b/outputters/base.lua index 2dfe4ae..4888a06 100644 --- a/outputters/base.lua +++ b/outputters/base.lua @@ -34,11 +34,11 @@ function outputter.debugFrame (_, _, _) end function outputter.debugHbox (_, _, _) end -function outputter.linkAnchor (_, _, _) end +function outputter.linkAnchor (_, _, _) end -- Unstable API -function outputter.enterLinkTarget (_, _, _) end +function outputter.enterLinkTarget (_, _, _) end -- Unstable API -function outputter.leaveLinkTarget (_, _, _, _, _, _, _) end +function outputter.leaveLinkTarget (_, _, _, _, _, _, _) end -- Unstable API function outputter.setMetadata (_, _, _) end diff --git a/outputters/libtexpdf.lua b/outputters/libtexpdf.lua index e49b773..2c63877 100644 --- a/outputters/libtexpdf.lua +++ b/outputters/libtexpdf.lua @@ -47,6 +47,8 @@ function outputter:_ensureInit () if not started then local w, h = SILE.documentState.sheetSize[1], SILE.documentState.sheetSize[2] local fname = self:getOutputFilename() + -- Ideally we could want to set the PDF CropBox, BleedBox, TrimBox... + -- Our wrapper only manages the MediaBox at this point. pdf.init(fname == "-" and "/dev/stdout" or fname, w, h, SILE.full_version) pdf.beginpage() started = true diff --git a/packages/cropmarks/init.lua b/packages/cropmarks/init.lua index 87148ee..5135fae 100644 --- a/packages/cropmarks/init.lua +++ b/packages/cropmarks/init.lua @@ -7,7 +7,7 @@ local outcounter = 1 local function outputMarks () local page = SILE.getFrame("page") - -- Length of cromark bars + -- Length of crop mark bars local cropsz = 20 -- Ensure the crop marks stay outside the bleed area local offset = math.max(10, SILE.documentState.bleed / 2) diff --git a/typesetters/base.lua b/typesetters/base.lua index 34da19b..05e313e 100644 --- a/typesetters/base.lua +++ b/typesetters/base.lua @@ -1126,14 +1126,12 @@ function typesetter:makeHbox (content) local ox = atypesetter.frame.state.cursorX local oy = atypesetter.frame.state.cursorY SILE.outputter:setCursor(atypesetter.frame.state.cursorX, atypesetter.frame.state.cursorY) - -- BEGIN SILEX FIX DEBUG SU.debug("hboxes", function () - -- setCursor also invoked by the internal hboxes etc. + -- setCursor is also invoked by the internal (wrapped) hboxes etc. -- so we must show our debug box before outputting its content. SILE.outputter:debugHbox(box, box:scaledWidth(line)) return "Drew debug outline around hbox" end) - -- END SILEX FIX DEBUG for _, node in ipairs(box.value) do node:outputYourself(atypesetter, line) end From 1a85a3d35113e58a18f8d99f23b7d4bf8c4fa45f Mon Sep 17 00:00:00 2001 From: Omikhleia Date: Sun, 27 Aug 2023 18:42:02 +0200 Subject: [PATCH 8/8] feat: Add html outputter --- outputters/base.lua | 2 +- outputters/html.lua | 582 +++++++++++++++++++++++++++++++++++++++ outputters/libtexpdf.lua | 2 +- packages/pdf/init.lua | 2 +- 4 files changed, 585 insertions(+), 3 deletions(-) create mode 100644 outputters/html.lua diff --git a/outputters/base.lua b/outputters/base.lua index 4888a06..570ae8b 100644 --- a/outputters/base.lua +++ b/outputters/base.lua @@ -36,7 +36,7 @@ function outputter.debugHbox (_, _, _) end function outputter.linkAnchor (_, _, _) end -- Unstable API -function outputter.enterLinkTarget (_, _, _) end -- Unstable API +function outputter.enterLinkTarget (_, _, _, _, _) end -- Unstable API function outputter.leaveLinkTarget (_, _, _, _, _, _, _) end -- Unstable API diff --git a/outputters/html.lua b/outputters/html.lua new file mode 100644 index 0000000..e743d2b --- /dev/null +++ b/outputters/html.lua @@ -0,0 +1,582 @@ +local base = require("outputters.base") +SILE.shaper = SILE.shapers.harfbuzz() + +local cursorX = 0 +local cursorY = 0 + +local started = false +local lastkey = false + +local debugfont = SILE.font.loadDefaults({ family = "Gentium Plus", language = "en", size = 10 }) + +local _dl = 0.5 + +local _debugfont +local _font + +-- local function _round (input) +-- -- LuaJIT 2.1 betas (and inheritors such as OpenResty and Moonjit) are biased +-- -- towards rounding 0.5 up to 1, all other Lua interpreters are biased +-- -- towards rounding such floating point numbers down. This hack shaves off +-- -- just enough to fix the bias so our test suite works across interpreters. +-- -- Note that even a true rounding function here will fail because the bias is +-- -- inherent to the floating point type. Also note we are erroring in favor of +-- -- the *less* common option beacuse the LuaJIT VMS are hopelessly broken +-- -- whereas normal LUA VMs can be cooerced. +-- if input > 0 then input = input + .00000000000001 end +-- if input < 0 then input = input - .00000000000001 end +-- return string.format("%.4f", input) +-- end + +local outputter = pl.class(base) +outputter._name = "html" +outputter.extension = "html" + +-- N.B. Sometimes setCoord is called before the outputter has ensured initialization. +-- This ok for coordinates manipulation, at these points we know the page size. +local deltaX +local deltaY +local function trueXCoord (x) + if not deltaX then + deltaX = (SILE.documentState.sheetSize[1] - SILE.documentState.paperSize[1]) / 2 + end + return x + deltaX +end +local function trueYCoord (y) + if not deltaY then + deltaY = (SILE.documentState.sheetSize[2] - SILE.documentState.paperSize[2]) / 2 + end + return y + deltaY +end + +-- The outputter init can't actually initialize output (as logical as it might +-- have seemed) because that requires a page size which we don't know yet. +-- function outputter:_init () end + +local _div = {} +local _fname +function outputter:_ensureInit () + if not started then + local w, h = SILE.documentState.sheetSize[1], SILE.documentState.sheetSize[2] + local fname = self:getOutputFilename() + _fname = fname + -- Ideally we could want to set the PDF CropBox, BleedBox, TrimBox... + -- Our wrapper only manages the MediaBox at this point. + --pdf.init(fname == "-" and "/dev/stdout" or fname, w, h, SILE.full_version) + print("Writing HTML to " .. fname) + local fd, err = io.open(fname == "-" and "/dev/stdout" or fname, "w") + if not fd then return SU.error(err) end + self.fd = fd + self.fd:write(table.concat({ + "", + "", + "", + "", + "" .. "XXXX" .. "", + "", + "", + "", + "
", + + }, "\n")) + _div[#_div+1] = { x = 0, y = 0, w = w, h = h } + started = true + end +end + +function outputter:newPage () + self:_ensureInit() + self.fd:write('
\n') + self.fd:write("
") +end + +-- pdf stucture package needs a tie in here +function outputter._endHook (_) + -- FIXME: NOT IMPLEMENTED +end + +function outputter:finish () + self:_ensureInit() + self.fd:write("
\n") + self:_endHook() + self.fd:write("\n") + self.fd:close() + started = false + lastkey = nil +end + +function outputter.getCursor (_) + return cursorX, cursorY +end + +function outputter.setCursor (_, x, y, relative) + x = SU.cast("number", x) + y = SU.cast("number", y) + local offset = relative and { x = cursorX, y = cursorY } or { x = 0, y = 0 } + cursorX = offset.x + x + cursorY = offset.y + (relative and 0 or SILE.documentState.paperSize[2]) - y +end + +-- FIXME not called from the 0.14 code base!!! +function outputter:setColor (_) + self:_ensureInit() + SU.error("setColor not implemented") +end + +local cssColorStack = { "rgb(0,0,0)" } +local function cmykToRgb(c, m, y, k) + local r = 255 * (1 - c) * (1 - k) + local g = 255 * (1 - m) * (1 - k) + local b = 255 * (1 - y) * (1 - k) + return r, g, b +end + +function outputter:pushColor (color) + self:_ensureInit() + if color.r then + cssColorStack[#cssColorStack+1] = "rgb(" .. color.r * 255 .. ", " .. color.g * 255 .. ", " .. color.b * 255 .. ")" + elseif color.c then + local r, g, b = cmykToRgb(color.c, color.m, color.y, color.k) + cssColorStack[#cssColorStack+1] = "rgb(" .. r .. ", " .. g .. ", " .. b .. ")" + elseif color.l then + cssColorStack[#cssColorStack+1] = "rgb(" .. color.l * 255 .. ", " .. color.l * 255 .. ", " .. color.l * 255 .. ")" + end +end + +function outputter:popColor () + self:_ensureInit() + cssColorStack[#cssColorStack] = nil +end + +function outputter:_drawString (str, width, x_offset, y_offset) + local x, y = self:getCursor() + + x = x - _div[#_div].x + y = y - _div[#_div].y + local xt = trueXCoord(x+x_offset) + local yt = trueYCoord(y+y_offset) + self.fd:write('
' + .. str + ..'
') +end + +function outputter:drawHbox (value, width) + width = SU.cast("number", width) + self:_ensureInit() + if not value.glyphString then return end + -- Nodes which require kerning or have offsets to the glyph + -- position should be output a glyph at a time. We pass the + -- glyph advance from the htmx table, so that libtexpdf knows + -- how wide each glyph is. It uses this to then compute the + -- relative position between the pen after the glyph has been + -- painted (cursorX + glyphAdvance) and the next painting + -- position (cursorX + width - remember that the box's "width" + -- is actually the shaped x_advance). + if value.complex then + for i = 1, #value.items do + local item = value.items[i] + self:_drawString(item.text, item.glyphAdvance, item.x_offset or 0, item.y_offset or 0) + self:setCursor(item.width, 0, true) + end + else + self:_drawString(value.text, width, 0, 0) + self:setCursor(width, 0, true) + end +end + +function outputter:_withDebugFont (callback) + if not _debugfont then + _debugfont = self:setFont(debugfont) + end + local oldfont = _font + _font = _debugfont + callback() + _font = oldfont +end + +local function featuresToCss(features) + local css = "" + for feature in features:gmatch("([%+%-%w]+)") do + local state = "on" + local featureName = feature + if feature:sub(1, 1) == "+" then + featureName = feature:sub(2) + elseif feature:sub(1, 1) == "-" then + featureName = feature:sub(2) + state = "off" + end + css = css .. string.format("font-feature-settings: '%s' %s;", featureName, state) + end + return css +end + +local function fontToCss(font) + local props = { + "font-family: " .. font.family, + "font-size: " .. font.size .. "pt", + "font-weight: " .. font.weight, + } + if font.style and font.style:lower() == "italic" then + props[#props + 1] = "font-style: italic" + else + props[#props + 1] = "font-style: normal" + end + local css = table.concat(props, ";") + if font.features then + css = css .. ";" .. featuresToCss(font.features) + end + return css +end + +function outputter:setFont (options) + self:_ensureInit() + local key = SILE.font._key(options) + if lastkey and key == lastkey then return _font end + -- FIXME handle direction? + -- local font = SILE.font.cache(options, SILE.shaper.getFace) + -- if options.direction == "TTB" then + -- ??? + -- end + -- if SILE.typesetter.frame and SILE.typesetter.frame:writingDirection() == "TTB" then + -- ??? + -- else + -- ??? + -- end + local metrics = require("fontmetrics") + local face = SILE.font.cache(options, SILE.shaper.getFace) + local m = metrics.get_typographic_extents(face) + m.ascender = m.ascender * options.size + m.descender = m.descender * options.size + _font = { + css = fontToCss(options), + spec = options, + metrics = m + } + lastkey = key + return _font +end + +function outputter:drawImage (src, x, y, width, height, _) + x = SU.cast("number", x) + y = SU.cast("number", y) + width = SU.cast("number", width) + height = SU.cast("number", height) + x = trueXCoord(x) + y = trueYCoord(y) + + -- FIXME use bottom instead of top? + x = x - _div[#_div].x + y = y - _div[#_div].y + -- FIXME RELATIVE PATH HACK + -- FIXME escapes needed in the regex! + local dir = pl.path.dirname(_fname) + src = src:gsub("^"..dir.."/", ""):gsub("^/"..dir.."/", "") + self:_ensureInit() + self.fd:write('
') + self.fd:write("") + self.fd:write("
") +end + +function outputter.getImageSize (_, src, pageno) + local pdf = require("justenoughlibtexpdf") + local llx, lly, urx, ury, xresol, yresol = pdf.imagebbox(src, pageno or 1) + return (urx-llx), (ury-lly), xresol, yresol +end + +local function pathToSVG(path) -- FIXME broken, needs to be rewritten + local svgPath = "" + local i = 1 + local _, ep, operands + while i < #path do + _, ep, operands = path:find("(%g+%s+%g+)%s+m%s+", i) + if operands then + svgPath = svgPath .. "M" .. operands .. " " + i = ep + 1 + else + _, ep, operands = path:find("(%g+%s+%g+%s+%g+%s+%g+%s+%g+%s+%g+)%s+c%s+", i) + if operands then + svgPath = svgPath .. "C" .. operands .. " " + i = ep + 1 + else + break + end + end + end + if svgPath == "" then + SU.warn("Invalid path: " .. path) + end + return svgPath .. "Z" +end + + +function outputter:drawSVG (figure, x, y, width, height, scalefactor) + self:_ensureInit() + + local d = pathToSVG(figure) + + x = SU.cast("number", x) + y = SU.cast("number", y) + height = SU.cast("number", height) + width = SU.cast("number", width) + + self:setCursor(x, y) + x, y = self:getCursor() + + x = x - _div[#_div].x + y = y - _div[#_div].y + + x = trueXCoord(x) + y = trueYCoord(y) + + self.fd:write('
') + self.fd:write('') + self.fd:write('') + self.fd:write('') + self.fd:write("
") +end + +function outputter:drawRule (x, y, width, height) + x = SU.cast("number", x) + y = SU.cast("number", y) + width = SU.cast("number", width) + height = SU.cast("number", height) + self:_ensureInit() + x = trueXCoord(x) + y = trueYCoord(y) + + -- FIXME: Logic is wrong here + local paperY = SILE.documentState.sheetSize[2] + if not _div[#_div].rel then + y = paperY - y - height + else + y = paperY - y - height + x = x - _div[#_div].x + y = y - _div[#_div].y + end + if width < 0 then + x = x + width + width = -width + end + if height < 0 then + y = y + height + height = -height + end + self.fd:write("
") + self.fd:write('
') +end + +function outputter:debugFrame (frame) + self:_ensureInit() + self:pushColor({ r = 0.8, g = 0, b = 0 }) + self:drawRule(frame:left()-_dl/2, frame:top()-_dl/2, frame:width()+_dl, _dl) + self:drawRule(frame:left()-_dl/2, frame:top()-_dl/2, _dl, frame:height()+_dl) + self:drawRule(frame:right()-_dl/2, frame:top()-_dl/2, _dl, frame:height()+_dl) + self:drawRule(frame:left()-_dl/2, frame:bottom()-_dl/2, frame:width()+_dl, _dl) + -- FIXME NOT IMPLEMENTED + -- local stuff = SILE.shaper:createNnodes(frame.id, debugfont) + -- stuff = stuff[1].nodes[1].value.glyphString -- Horrible hack + -- local buf = {} + -- for i = 1, #stuff do + -- buf[i] = glyph2string(stuff[i]) + -- end + -- buf = table.concat(buf, "") + -- self:_withDebugFont(function () + -- self:setCursor(frame:left():tonumber() - _dl/2, frame:top():tonumber() + _dl/2) + -- self:_drawString(buf, 0, 0, 0) + -- end) + self:popColor() +end + +function outputter:debugHbox (hbox, scaledWidth) + self:_ensureInit() + self:pushColor({ r = 0.8, g = 0.3, b = 0.3 }) + local paperY = SILE.documentState.paperSize[2] + local x, y = self:getCursor() + y = paperY - y + self:drawRule(x-_dl/2, y-_dl/2-hbox.height, scaledWidth+_dl, _dl) + self:drawRule(x-_dl/2, y-hbox.height-_dl/2, _dl, hbox.height+hbox.depth+_dl) + self:drawRule(x-_dl/2, y-_dl/2, scaledWidth+_dl, _dl) + self:drawRule(x+scaledWidth-_dl/2, y-hbox.height-_dl/2, _dl, hbox.height+hbox.depth+_dl) + if hbox.depth > SILE.length(0) then + self:drawRule(x-_dl/2, y+hbox.depth-_dl/2, scaledWidth+_dl, _dl) + end + self:popColor() +end + +-- The methods below are only implemented on outputters supporting these features. +-- In PDF, it relies on transformation matrices, but other backends may call +-- for a different strategy. +-- ! The API is unstable and subject to change. ! + +function outputter:scaleFn (xorigin, yorigin, xratio, yratio, callback) + xorigin = SU.cast("number", xorigin) + yorigin = SU.cast("number", yorigin) + local paperY = SILE.documentState.sheetSize[2] + local x0 = trueXCoord(xorigin) + local y0 = paperY - trueYCoord(yorigin) + self:_ensureInit() + + local xt = x0 - _div[#_div].x + local yt = y0 - _div[#_div].y + + _div[#_div+1] = { x = x0, y = y0, rel = true } + + local style = { + position = "absolute", + left = xt .. "pt", + bottom = yt .. "pt", + transform = "scale(" .. xratio .. ", " .. yratio .. ")" + } + local s = "" + for k, v in pairs(style) do + s = s .. k .. ":" .. v .. ";" + end + + self.fd:write('
') + callback() + self.fd:write("
") + + _div[#_div] = nil +end + +function outputter:rotateFn (xorigin, yorigin, theta, callback) + xorigin = SU.cast("number", xorigin) + yorigin = SU.cast("number", yorigin) + local paperY = SILE.documentState.sheetSize[2] + local x0 = trueXCoord(xorigin) + local y0 = paperY - trueYCoord(yorigin) + self:_ensureInit() + + local xt = x0 - _div[#_div].x + local yt = y0 - _div[#_div].y + + _div[#_div+1] = { x = x0, y = y0, rel = true } + + local style = { + position = "absolute", + left = xt .. "pt", + bottom = yt .. "pt", -- + transform = "rotate(" .. -theta .. "rad)" + } + local s = "" + for k, v in pairs(style) do + s = s .. k .. ":" .. v .. ";" + end + + self.fd:write('
') + callback() + self.fd:write("
") + + _div[#_div] = nil +end + +-- Unstable link APIs + +function outputter:linkAnchor (x, y, name) + x = SU.cast("number", x) + y = SU.cast("number", y) + self:_ensureInit() + local x0 = trueXCoord(x) + local y0 = trueYCoord(y) + self:_ensureInit() + + local xt = x0 - _div[#_div].x + local yt = y0 - _div[#_div].y + + local style = { + position = "absolute", + left = xt .. "pt", + bottom = yt .. "pt", + } + local s = "" + for k, v in pairs(style) do + s = s .. k .. ":" .. v .. ";" + end + + self.fd:write('
') +end + +function outputter:enterLinkTarget (x0, y0, dest, options) + local target = options.external and dest or ("#" .. dest) + + x0 = trueXCoord(x0) + y0 = trueYCoord(y0) + self:_ensureInit() + + local xt = x0 - _div[#_div].x + local yt = y0 - _div[#_div].y + + _div[#_div+1] = { x = x0, y = y0, rel = true } + + local style = { + position = "absolute", + left = xt .. "pt", + bottom = yt .. "pt", + } + local s = "" + for k, v in pairs(style) do + s = s .. k .. ":" .. v .. ";" + end + + self.fd:write('
") + _div[#_div] = nil +end + +-- Bookmarks and metadata + +local function validate_date (date) + return string.match(date, [[^D:%d+%s*-%s*%d%d%s*'%s*%d%d%s*'?$]]) ~= nil +end + +function outputter:setMetadata (key, value) + if key == "Trapped" then + SU.warn("Skipping special metadata key \\Trapped") + return + end + + if key == "ModDate" or key == "CreationDate" then + if not validate_date(value) then + SU.warn("Invalid date: " .. value) + return + end + end + self:_ensureInit() + -- FIXME: NOT IMPLEMENTED +end + +function outputter:setBookmark (_, _, _) -- dest, title, level + self:_ensureInit() + -- FIXME: NOT IMPLEMENTED +end + +return outputter diff --git a/outputters/libtexpdf.lua b/outputters/libtexpdf.lua index 2c63877..e04f329 100644 --- a/outputters/libtexpdf.lua +++ b/outputters/libtexpdf.lua @@ -324,7 +324,7 @@ local function borderStyle (style, width) return "/Border[0 0 " .. width .. "]" end -function outputter:enterLinkTarget (_, _) -- destination, options as argument +function outputter:enterLinkTarget (_, _, _, _) -- coords, destination, options as argument -- HACK: -- Looking at the code, pdf.begin_annotation does nothing, and Simon wrote a comment -- about tracking boxes. Unsure what he implied with this obscure statement. diff --git a/packages/pdf/init.lua b/packages/pdf/init.lua index 7a5b018..2c41e08 100644 --- a/packages/pdf/init.lua +++ b/packages/pdf/init.lua @@ -77,7 +77,7 @@ function package:registerCommands () outputYourself = function (_, typesetter, _) x0 = typesetter.frame.state.cursorX:tonumber() y0 = (SILE.documentState.paperSize[2] - typesetter.frame.state.cursorY):tonumber() - SILE.outputter:enterLinkTarget(dest, opts) + SILE.outputter:enterLinkTarget(x0, y0, dest, opts) end }) local hbox, hlist = SILE.typesetter:makeHbox(content) -- hack
' + .. '') +end +function outputter:leaveLinkTarget (_, _, _, _, _, _) + self.fd:write("