From eb85c598f8e64bb88f534f63b6d953de0c69911c Mon Sep 17 00:00:00 2001 From: Jonas Smedegaard Date: Thu, 15 May 2025 09:42:46 +0200 Subject: cover braced-only enclosure --- .../semantic-markdown/semantic-markdown.lua | 48 +++++++++++++++++++--- 1 file 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 -- cgit v1.2.3