aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonas Smedegaard <dr@jones.dk>2025-06-22 10:24:42 +0200
committerJonas Smedegaard <dr@jones.dk>2025-06-22 12:05:04 +0200
commit55663bb20cdcc1fcd640f5cadf820a9b721e322b (patch)
treef9a1e13b95a3c98353401d723587c2c60ba45387
parent71042970c0cdb0cf2d247e209f26cdcc3c4b5bbe (diff)
move block mangling state inside iffy object
-rw-r--r--sem-md/sem-md.lua76
1 files changed, 43 insertions, 33 deletions
diff --git a/sem-md/sem-md.lua b/sem-md/sem-md.lua
index 03efb51..b214c43 100644
--- a/sem-md/sem-md.lua
+++ b/sem-md/sem-md.lua
@@ -211,6 +211,9 @@ end
local function newIffy()
local self = {
+ -- block has been mangled and should be returned at end of parsing
+ block_is_mangled = false,
+
-- stacks of qualified and pending unenclosed/enclosed elements
elems = pandoc.List(),
elems_unenclosed = pandoc.List(),
@@ -300,10 +303,29 @@ local function newIffy()
self.elems_enclosed = pandoc.List()
end
- local conclude_all_and_return = function()
+ local disqualify = function()
disclose()
+ end
+
+ local qualify_unenclosed = function()
+ disclose()
+ self.block_is_mangled = true
+ end
- return self.elems
+ local qualify_enclosed = function()
+ enclose()
+ self.block_is_mangled = true
+ end
+
+ local block_if_mangled = function(block)
+ if not self.block_is_mangled then
+ return nil
+ end
+
+ disclose()
+ block.content = self.elems
+
+ return block
end
return {
@@ -311,14 +333,15 @@ local function newIffy()
has_no_non_brace_content = has_no_non_brace_content,
elementize_chars_disclosed = elementize_chars_disclosed,
elementize_chars_enclosed = elementize_chars_enclosed,
- disclose = disclose,
- enclose = enclose,
append_chars_unenclosed = append_chars_unenclosed,
append_chars_any = append_chars_any,
append_elems_unenclosed = append_elems_unenclosed,
append_elems_enclosed = append_elems_enclosed,
append_elems_any = append_elems_any,
- conclude_all_and_return = conclude_all_and_return
+ disqualify = disqualify,
+ qualify_unenclosed = qualify_unenclosed,
+ qualify_enclosed = qualify_enclosed,
+ block_if_mangled = block_if_mangled
}
end
@@ -449,9 +472,6 @@ local function Statements (block)
-- TODO: support nested bracket enclosure
local encl = Enclosure.NONE
- -- amount of detected statements in this block
- local block_has_diverged = false
-
-- track potentially enclosed contents
local iffy = newIffy()
@@ -478,8 +498,8 @@ local function Statements (block)
if encl == Enclosure.BRACKETED_DONE then
- -- disqualify bracketing not directly followed by brace
- iffy.disclose()
+ -- bracketing not directly followed by brace
+ iffy.disqualify()
encl = Enclosure.NONE
-- fall through to parse element as unenclosed
@@ -499,8 +519,7 @@ local function Statements (block)
and el.target:find("^{.*}$")
then
iffy.append_elems_any(el.content)
- iffy.disclose()
- block_has_diverged = true
+ iffy.qualify_unenclosed()
else
iffy.append_elems_unenclosed(el)
@@ -532,10 +551,7 @@ local function Statements (block)
-- entering bracketed or braced enclosure
local t = str:sub(pos, pos)
if t == "[" or t == "{" then
-
- -- qualify unenclosed elements
- iffy.disclose()
-
+ iffy.disqualify()
pos = pos + 1
iffy.append_chars_unenclosed(t)
if t == "[" then
@@ -574,8 +590,8 @@ local function Statements (block)
-- leaving non-annotation enclosure
else
- -- disqualify bracketing not directly followed by brace
- iffy.disclose()
+ -- bracketing not directly followed by brace
+ iffy.disqualify()
encl = Enclosure.NONE
end
@@ -601,30 +617,27 @@ local function Statements (block)
pos = nextpos + 1
local str_remains = str:sub(pos)
- -- qualify completed bracketed enclosure
+ -- completed bracketed enclosure
if iffy.has_bracketed_content() then
- iffy.enclose()
+ iffy.qualify_enclosed()
encl = Enclosure.BRACED_DONE
- block_has_diverged = true
- -- qualify braced-only enclosure at beginning of block
+ -- braced-only enclosure at beginning of block
elseif iffy.has_no_non_brace_content() then
- iffy.enclose()
+ iffy.qualify_enclosed()
encl = Enclosure.BRACED_DONE
- block_has_diverged = true
- -- qualify braced-only enclosure at end of block
+ -- braced-only enclosure at end of block
elseif is_last_significant_element(block.content, i)
and str_remains:len() == 0
then
- iffy.enclose()
+ iffy.qualify_enclosed()
encl = Enclosure.BRACED_DONE
- block_has_diverged = true
- -- disqualify stray braced-only enclosure
+ -- stray braced-only enclosure
else
iffy.append_chars_unenclosed(str_inside)
- iffy.disclose()
+ iffy.disqualify()
encl = Enclosure.NONE
end
@@ -645,10 +658,7 @@ local function Statements (block)
end
-- return altered stack if it contains complete enclosures
- if block_has_diverged then
- block.content = iffy.conclude_all_and_return()
- return block
- end
+ return iffy.block_if_mangled(block)
end
-- First resolve namespace declarations, then statements.