diff options
| author | Jonas Smedegaard <dr@jones.dk> | 2025-06-20 12:58:44 +0200 |
|---|---|---|
| committer | Jonas Smedegaard <dr@jones.dk> | 2025-06-21 10:55:44 +0200 |
| commit | bd51df7df19986530f839caf57304a97d91743d4 (patch) | |
| tree | 8a9e5f2d20aadd913f35618fbd5c60eccdd007b8 | |
| parent | 2a8d1d8e8f6cc98458e93b260f5dd62e839e8775 (diff) | |
qualify braced-only end-of-block enclosure immediately
| -rw-r--r-- | sem-md/sem-md.lua | 77 |
1 files changed, 33 insertions, 44 deletions
diff --git a/sem-md/sem-md.lua b/sem-md/sem-md.lua index 09bb66d..8e58662 100644 --- a/sem-md/sem-md.lua +++ b/sem-md/sem-md.lua @@ -192,6 +192,16 @@ local function TableEmpty(list) end end +--- is_last_significant_element -- check if an inline concludes a block +--- +--- @param list Pandoc block list to inspect +--- @param listpos Element position in block list +--- @return result of inspection as boolean +local function is_last_significant_element(list, listpos) + return (listpos == #list + or (listpos == (#list - 1) and list[#list].t == "Space")) +end + --- Namespaces - process RDF namespace IRI declarations --- --- Takes as input a list of Para block elements. @@ -331,27 +341,14 @@ local function Statements (block) local chars_unenclosed = "" local chars_enclosed = "" - for _, el in ipairs(block.content) do + for i, el in ipairs(block.content) do local pos = 1 -- non-string element, highest state first to support fall-through if el.t ~= 'Str' then 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)) - end - chars_unenclosed = "" - chars_enclosed = "" - elems:extend(elems_unenclosed) - elems_unenclosed = pandoc.List() - elems_enclosed = pandoc.List() - -- drop space after completed enclosure - -- FIXME: only strip after *completed* enclosure if el.t ~= "Space" then encl = Enclosure.NONE end @@ -414,18 +411,6 @@ 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 @@ -527,6 +512,8 @@ local function Statements (block) -- qualify completed bracketed enclosure if not TableEmpty(elems_enclosed) then elems:extend(elems_enclosed) + encl = Enclosure.BRACED_DONE + block_has_diverged = true -- qualify braced-only enclosure at beginning of block elseif (TableEmpty(elems) @@ -534,25 +521,35 @@ local function Statements (block) and (chars_unenclosed:len() == 0 or chars_unenclosed == "{")) then elems:extend(elems_enclosed) + encl = Enclosure.BRACED_DONE + block_has_diverged = true - -- postpone braced-only enclosure maybe at end of block + -- qualify braced-only enclosure at end of block + elseif is_last_significant_element(block.content, i) + and str_remains:len() == 0 + then + elems:extend(elems_enclosed) + encl = Enclosure.BRACED_DONE + block_has_diverged = true + + -- disqualify stray braced-only enclosure else chars_unenclosed = chars_unenclosed .. str_inside elems_unenclosed:insert(pandoc.Str(chars_unenclosed)) - chars_unenclosed = str_remains - chars_enclosed = str_remains - encl = Enclosure.BRACED_DONE - - goto continue + elems:extend(elems_unenclosed) + encl = Enclosure.NONE end elems_enclosed = pandoc.List() elems_unenclosed = pandoc.List() - chars_enclosed = "" - chars_unenclosed = str_remains - encl = Enclosure.BRACED_DONE - block_has_diverged = true + -- TODO: parse str_remains for another enclosure + if str_remains:len() > 0 then + elems_unenclosed:insert(pandoc.Str(str_remains)) + encl = Enclosure.NONE + end + chars_unenclosed = "" + chars_enclosed = "" end end @@ -570,14 +567,6 @@ 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) - block_has_diverged = true - end - -- return altered stack if it contains complete enclosures if block_has_diverged then |
