aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonas Smedegaard <dr@jones.dk>2025-06-20 12:58:44 +0200
committerJonas Smedegaard <dr@jones.dk>2025-06-21 10:55:44 +0200
commitbd51df7df19986530f839caf57304a97d91743d4 (patch)
tree8a9e5f2d20aadd913f35618fbd5c60eccdd007b8
parent2a8d1d8e8f6cc98458e93b260f5dd62e839e8775 (diff)
qualify braced-only end-of-block enclosure immediately
-rw-r--r--sem-md/sem-md.lua77
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