diff options
| author | Jonas Smedegaard <dr@jones.dk> | 2025-06-22 10:24:42 +0200 |
|---|---|---|
| committer | Jonas Smedegaard <dr@jones.dk> | 2025-06-22 12:05:04 +0200 |
| commit | 55663bb20cdcc1fcd640f5cadf820a9b721e322b (patch) | |
| tree | f9a1e13b95a3c98353401d723587c2c60ba45387 | |
| parent | 71042970c0cdb0cf2d247e209f26cdcc3c4b5bbe (diff) | |
move block mangling state inside iffy object
| -rw-r--r-- | sem-md/sem-md.lua | 76 |
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. |
