aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonas Smedegaard <dr@jones.dk>2025-05-15 09:42:46 +0200
committerJonas Smedegaard <dr@jones.dk>2025-05-15 13:09:16 +0200
commiteb85c598f8e64bb88f534f63b6d953de0c69911c (patch)
tree0177117eabf6c4ad4ba94f9056873b7c3c88e3cb
parent6b190baf6ba20b545e0311282f34c81887526ddd (diff)
cover braced-only enclosure
-rw-r--r--_extensions/ruc-play/semantic-markdown/semantic-markdown.lua48
1 files changed, 43 insertions, 5 deletions
diff --git a/_extensions/ruc-play/semantic-markdown/semantic-markdown.lua b/_extensions/ruc-play/semantic-markdown/semantic-markdown.lua
index 505b296..bcd8f13 100644
--- a/_extensions/ruc-play/semantic-markdown/semantic-markdown.lua
+++ b/_extensions/ruc-play/semantic-markdown/semantic-markdown.lua
@@ -332,6 +332,7 @@ local function Statements (block)
if encl == Enclosure.BRACED_DONE then
-- push post-brace string to stack
+ -- and disqualify brace-only end-of-block enclosure
-- TODO: parse chars_unenclosed as Str instead
if chars_unenclosed:len() > 0 then
elems_unenclosed:insert(pandoc.Str(chars_unenclosed))
@@ -383,21 +384,30 @@ local function Statements (block)
-- unenclosed immediately after enclosure
if encl == Enclosure.BRACED_DONE then
+ -- push post-brace string to stack
+ -- and disqualify brace-only end-of-block enclosure
-- TODO: parse chars_unenclosed as Str
-
+ if chars_unenclosed:len() > 0 then
+ elems_unenclosed:insert(pandoc.Str(chars_unenclosed))
+ end
+ chars_unenclosed = ""
+ chars_enclosed = ""
+ elems:extend(elems_unenclosed)
+ elems_unenclosed = pandoc.List()
+ elems_enclosed = pandoc.List()
encl = Enclosure.NONE
end
-- unenclosed
-- TODO: accept backslash except immediately before bracket
if encl == Enclosure.NONE then
- local _, nextpos, s = el.text:find("^([^%[\\]*)")
+ local _, nextpos, s = el.text:find("^([^%[{\\]*)")
pos = nextpos and nextpos + 1 or pos + 1
chars_unenclosed = chars_unenclosed..s
- -- entering bracketed enclosure
+ -- entering bracketed or braced enclosure
local t = el.text:sub(pos, pos)
- if t == "[" then
+ if t == "[" or t == "{" then
-- qualify unenclosed elements
elems:extend(elems_unenclosed)
@@ -410,7 +420,11 @@ local function Statements (block)
pos = pos + 1
chars_unenclosed = chars_unenclosed..t
chars_enclosed = ""
- encl = Enclosure.BRACKETED
+ if t == "[" then
+ encl = Enclosure.BRACKETED
+ elseif t == "{" then
+ encl = Enclosure.BRACED
+ end
end
end
@@ -477,6 +491,22 @@ local function Statements (block)
-- qualify completed bracketed enclosure
if not TableEmpty(elems_enclosed) then
elems:extend(elems_enclosed)
+
+ -- qualify braced-only enclosure at beginning of block
+ elseif (TableEmpty(elems_unenclosed)
+ and (chars_unenclosed:len() == 0 or chars_unenclosed == "{"))
+ then
+ elems:extend(elems_enclosed)
+
+ -- postpone braced-only enclosure maybe at end of block
+ else
+ chars_unenclosed = chars_unenclosed..el.text:sub(pos, nextpos)
+ elems_unenclosed:insert(pandoc.Str(chars_unenclosed))
+ chars_unenclosed = el.text:sub(nextpos + 1)
+ chars_enclosed = el.text:sub(nextpos + 1)
+ encl = Enclosure.BRACED_DONE
+
+ goto continue
end
elems_enclosed = pandoc.List()
@@ -503,6 +533,14 @@ local function Statements (block)
::continue::
end
+ -- qualify brace-only enclosure at end of block
+ if encl == Enclosure.BRACED_DONE
+ and not TableEmpty(elems_enclosed)
+ then
+ elems:extend(elems_enclosed)
+ statement_count = statement_count + 1
+ end
+
-- return altered stack if it contains complete enclosures
if statement_count > 0 then