From 285507e5fddf3b0c752bb2b5bf81e8bf7f19144a Mon Sep 17 00:00:00 2001 From: Omikhleia Date: Wed, 13 Dec 2023 19:10:22 +0100 Subject: [PATCH] feat(typesetters): Support U+00AD soft hyphen as discretionary break --- typesetters/base.lua | 37 ++++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/typesetters/base.lua b/typesetters/base.lua index 7b44b96cf..6ab5293e7 100644 --- a/typesetters/base.lua +++ b/typesetters/base.lua @@ -132,6 +132,19 @@ function typesetter.declareSettings(_) help = "Width to break lines at" }) + SILE.settings:declare({ + parameter = "typesetter.softHyphen", + type = "boolean", + default = true, + help = "When true, soft hyphens are rendered as discretionary breaks, otherwise they are ignored" + }) + + SILE.settings:declare({ + parameter = "typesetter.softHyphenWarning", + type = "boolean", + default = false, + help = "When true, a warning is issued when a soft hyphen is encountered" + }) end function typesetter:initState () @@ -276,7 +289,29 @@ function typesetter:typeset (text) if token.separator then self:endline() else - self:setpar(token.string) + if SILE.settings:get("typesetter.softHyphen") then + local warnedshy = false + for token2 in SU.gtoke(token.string, luautf8.char(0x00AD)) do + if token2.separator then -- soft hyphen support + local discretionary = SILE.nodefactory.discretionary({}) + local hbox = SILE.typesetter:makeHbox({ SILE.settings:get("font.hyphenchar") }) + discretionary.prebreak = { hbox } + table.insert(SILE.typesetter.state.nodes, discretionary) + if not warnedshy and SILE.settings:get("typesetter.softHyphenWarning") then + SU.warn("Soft hyphen encountered and replaced with discretionary") + end + warnedshy = true + else + self:setpar(token2.string) + end + end + else + if SILE.settings:get("typesetter.softHyphenWarning") and luautf8.match(token.string, luautf8.char(0x00AD)) then + SU.warn("Soft hyphen encountered and ignored") + end + text = luautf8.gsub(token.string, luautf8.char(0x00AD), "") + self:setpar(text) + end end end SILE.traceStack:pop(pId)