Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix separators in blocks #403

Merged
merged 13 commits into from
Feb 13, 2024
201 changes: 159 additions & 42 deletions markdown.dtx
Original file line number Diff line number Diff line change
Expand Up @@ -27571,7 +27571,19 @@ function M.reader.new(writer, options)
% \begin{macrocode}
parsers.minimally_indented_blankline = parsers.check_minimal_indent * (parsers.blankline / "")

parsers.minimally_indented_block = parsers.check_minimal_indent * V("BlockOrParagraph")
parsers.minimally_indented_block = parsers.check_minimal_indent * V("Block")

parsers.minimally_indented_block_or_paragraph = parsers.check_minimal_indent * V("BlockOrParagraph")

parsers.minimally_indented_paragraph = parsers.check_minimal_indent * V("Paragraph")

parsers.minimally_indented_plain = parsers.check_minimal_indent * V("Plain")

parsers.minimally_indented_par_or_plain = parsers.minimally_indented_paragraph
+ parsers.minimally_indented_plain

parsers.minimally_indented_par_or_plain_no_blank = parsers.minimally_indented_par_or_plain
- parsers.minimally_indented_blankline

parsers.minimally_indented_ref = parsers.check_minimal_indent * V("Reference")

Expand All @@ -27583,10 +27595,9 @@ function M.reader.new(writer, options)
+ parsers.minimally_indented_block
- parsers.minimally_indented_blankline

parsers.minimally_indented_separated_ref_or_block = parsers.minimally_indented_ref
+ parsers.check_minimal_indent / writer.interblocksep
* V("BlockOrParagraph")
- parsers.minimally_indented_blankline
parsers.minimally_indented_ref_or_block_or_par = parsers.minimally_indented_ref
+ parsers.minimally_indented_block_or_paragraph
- parsers.minimally_indented_blankline

% \end{macrocode}
% \begin{markdown}
Expand All @@ -27595,18 +27606,72 @@ function M.reader.new(writer, options)
%
% \end{markdown}
% \begin{macrocode}

parsers.separator_loop = function(separated_block, paragraph, block_separator, paragraph_separator)
return separated_block
+ block_separator
* paragraph
* separated_block
+ paragraph_separator
* paragraph
end

parsers.create_loop_body_pair = function(separated_block, paragraph, block_separator, paragraph_separator)
return {
block = parsers.separator_loop(separated_block, paragraph, block_separator, block_separator),
par = parsers.separator_loop(separated_block, paragraph, block_separator, paragraph_separator)
}
end

parsers.block_sep_group = function(blank)
return blank^0 * parsers.eof
+ ( blank^2 / writer.paragraphsep
+ blank^0 / writer.interblocksep
)
end

parsers.par_sep_group = function(blank)
return blank^0 * parsers.eof
+ blank^0 / writer.paragraphsep
end

parsers.sep_group_no_output = function(blank)
return blank^0 * parsers.eof
+ blank^0
end

parsers.content_blank = parsers.minimally_indented_blankline

parsers.ref_or_block_separated = parsers.sep_group_no_output(parsers.content_blank)
* ( parsers.minimally_indented_ref
- parsers.content_blank)
+ parsers.block_sep_group(parsers.content_blank)
* ( parsers.minimally_indented_block
- parsers.content_blank)

parsers.loop_body_pair =
parsers.create_loop_body_pair(parsers.ref_or_block_separated,
parsers.minimally_indented_par_or_plain_no_blank,
parsers.block_sep_group(parsers.content_blank),
parsers.par_sep_group(parsers.content_blank))

parsers.content_loop = ( V("Block")
* parsers.loop_body_pair.block^0
+ (V("Paragraph") + V("Plain"))
* parsers.ref_or_block_separated
* parsers.loop_body_pair.block^0
+ (V("Paragraph") + V("Plain"))
* parsers.loop_body_pair.par^0)
* parsers.content_blank^0

parsers.indented_content = function()
local blank = parsers.minimally_indented_blankline
return Ct( (V("Reference") + (parsers.blankline / ""))
* blank^0
* parsers.minimally_indented_ref_or_block
* ( blank
+ parsers.minimally_indented_separated_ref_or_block)^0
* parsers.content_blank^0
* parsers.check_minimal_indent
* parsers.content_loop
+ (V("Reference") + (parsers.blankline / ""))
* blank^0
+ V("BlockOrParagraph")
* ( blank
+ parsers.minimally_indented_separated_ref_or_block)^0)
* parsers.content_blank^0
+ parsers.content_loop)
end

parsers.add_indent = function(pattern, name, breakable)
Expand Down Expand Up @@ -28783,7 +28848,7 @@ end
parsers.Reference = parsers.define_reference_parser
/ self.register_link

parsers.Paragraph = parsers.freeze_trail * (parsers.check_trail / "")
parsers.Paragraph = parsers.freeze_trail
* (Ct((parsers.Inline)^1)
* (parsers.newline + parsers.eof)
* parsers.unfreeze_trail
Expand All @@ -28809,38 +28874,73 @@ end
parsers.tickbox = parsers.fail
end

parsers.list_item_tightness_condition = -#( parsers.conditionally_indented_blankline^0
* parsers.minimally_indented_ref_or_block)
parsers.list_blank = parsers.conditionally_indented_blankline

parsers.ref_or_block_list_separated = parsers.sep_group_no_output(parsers.list_blank)
* parsers.minimally_indented_ref
+ parsers.block_sep_group(parsers.list_blank)
* parsers.minimally_indented_block

parsers.ref_or_block_non_separated = parsers.minimally_indented_ref
+ (parsers.succeed / writer.interblocksep)
* parsers.minimally_indented_block
- parsers.minimally_indented_blankline

parsers.tight_list_loop_body_pair =
parsers.create_loop_body_pair(parsers.ref_or_block_non_separated,
parsers.minimally_indented_par_or_plain_no_blank,
(parsers.succeed / writer.interblocksep),
(parsers.succeed / writer.paragraphsep))

parsers.loose_list_loop_body_pair =
parsers.create_loop_body_pair(parsers.ref_or_block_list_separated,
parsers.minimally_indented_par_or_plain,
parsers.block_sep_group(parsers.list_blank),
parsers.par_sep_group(parsers.list_blank))

parsers.tight_list_content_loop = V("Block")
* parsers.tight_list_loop_body_pair.block^0
+ (V("Paragraph") + V("Plain"))
* parsers.ref_or_block_non_separated
* parsers.tight_list_loop_body_pair.block^0
+ (V("Paragraph") + V("Plain"))
* parsers.tight_list_loop_body_pair.par^0

parsers.loose_list_content_loop = V("Block")
* parsers.loose_list_loop_body_pair.block^0
+ (V("Paragraph") + V("Plain"))
* parsers.ref_or_block_list_separated
* parsers.loose_list_loop_body_pair.block^0
+ (V("Paragraph") + V("Plain"))
* parsers.loose_list_loop_body_pair.par^0

parsers.list_item_tightness_condition = -#( parsers.list_blank^0
* parsers.minimally_indented_ref_or_block_or_par)
* remove_indent("li")
+ remove_indent("li")
* parsers.fail

parsers.indented_content_tight = Ct( (parsers.blankline / "")
* #parsers.conditionally_indented_blankline
* #parsers.list_blank
* remove_indent("li")
+ ( (V("Reference") + (parsers.blankline / ""))
* (parsers.minimally_indented_ref_or_block)
* (parsers.minimally_indented_separated_ref_or_block)^0
* parsers.check_minimal_indent
* parsers.tight_list_content_loop
+ (V("Reference") + (parsers.blankline / ""))
+ (parsers.tickbox^-1 / writer.escape)
* V("BlockOrParagraph")
* (parsers.minimally_indented_separated_ref_or_block)^0
* parsers.tight_list_content_loop
)
* parsers.list_item_tightness_condition
)

parsers.indented_content_loose = Ct( (parsers.blankline / "")
* #parsers.conditionally_indented_blankline
* #parsers.list_blank
+ ( (V("Reference") + (parsers.blankline / ""))
* (parsers.minimally_indented_ref_or_block)
* ( parsers.conditionally_indented_blankline^0
* parsers.minimally_indented_separated_ref_or_block^1)^0
* parsers.check_minimal_indent
* parsers.loose_list_content_loop
+ (V("Reference") + (parsers.blankline / ""))
+ (parsers.tickbox^-1 / writer.escape)
* V("BlockOrParagraph")
* ( parsers.conditionally_indented_blankline^0
* parsers.minimally_indented_separated_ref_or_block^1
)^0
* parsers.loose_list_content_loop
)
)

Expand All @@ -28865,12 +28965,12 @@ end
)^0
)
* Cc(true)
* -#( (parsers.conditionally_indented_blankline^0 / "")
* -#( (parsers.list_blank^0 / "")
* parsers.check_minimal_indent
* (bullet - parsers.ThematicBreak)
)
+ Ct( parsers.LooseListItem(bullet)
* ( (parsers.conditionally_indented_blankline^0 / "")
* ( (parsers.list_blank^0 / "")
* (parsers.check_minimal_indent / "")
* parsers.LooseListItem(bullet)
)^0
Expand Down Expand Up @@ -28902,10 +29002,10 @@ end
* (Ct( parsers.TightListItem(Cb("listtype"))
* ((parsers.check_minimal_indent / "") * parsers.TightListItem(enumerator))^0)
* Cc(true)
* -#((parsers.conditionally_indented_blankline^0 / "")
* -#((parsers.list_blank^0 / "")
* parsers.check_minimal_indent * enumerator)
+ Ct( parsers.LooseListItem(Cb("listtype"))
* ((parsers.conditionally_indented_blankline^0 / "")
* ((parsers.list_blank^0 / "")
* (parsers.check_minimal_indent / "") * parsers.LooseListItem(enumerator))^0)
* Cc(false)
) * Ct(Cb("listtype")) / ordered_list
Expand Down Expand Up @@ -30680,10 +30780,32 @@ M.extensions.fenced_divs = function(blank_before_div_fence)
return Cg( Cmt(Cb("div_level"), update_div_level)
, "div_level")
end

local non_fenced_div_block = parsers.check_minimal_indent * V("BlockOrParagraph")
local non_fenced_div_block = parsers.check_minimal_indent * V("Block")
- parsers.check_minimal_indent_and_trail * fenced_div_end

local non_fenced_div_paragraph = parsers.check_minimal_indent * V("Paragraph")
- parsers.check_minimal_indent_and_trail * fenced_div_end

local blank = parsers.minimally_indented_blank

local block_separated = parsers.block_sep_group(blank)
* non_fenced_div_block

local loop_body_pair = parsers.create_loop_body_pair(block_separated,
non_fenced_div_paragraph,
parsers.block_sep_group(blank),
parsers.par_sep_group(blank))

local content_loop = ( non_fenced_div_block
* loop_body_pair.block^0
+ non_fenced_div_paragraph
* block_separated
* loop_body_pair.block^0
+ non_fenced_div_paragraph
* loop_body_pair.par^0)
* blank^0

local FencedDiv = fenced_div_begin
/ function (infostring)
local attr = lpeg.match(Ct(parsers.attributes), infostring)
Expand All @@ -30695,12 +30817,7 @@ M.extensions.fenced_divs = function(blank_before_div_fence)
/ writer.div_begin
* increment_div_level(1)
* parsers.skipblanklines
* Ct( non_fenced_div_block^-1
* ( parsers.minimally_indented_blank^0
/ function()
return writer.interblocksep
end
* non_fenced_div_block)^0)
* Ct(content_loop)
* parsers.minimally_indented_blank^0
* parsers.check_minimal_indent_and_trail * fenced_div_end * increment_div_level(-1)
* (Cc("") / writer.div_end)
Expand Down
2 changes: 1 addition & 1 deletion tests/testfiles/CommonMark_0.30/block_quotes/017.test
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
BEGIN document
blockQuoteBegin
emphasis: foo
interblockSeparator
paragraphSeparator
emphasis: bar
blockQuoteEnd
END document
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
BEGIN document
ulBegin
ulItem
interblockSeparator
paragraphSeparator
ulItemEnd
ulEnd
END document
2 changes: 1 addition & 1 deletion tests/testfiles/CommonMark_0.30/list_items/004.test
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ BEGIN document
ulBegin
ulItem
emphasis: one
interblockSeparator
paragraphSeparator
emphasis: two
ulItemEnd
ulEnd
Expand Down
2 changes: 1 addition & 1 deletion tests/testfiles/CommonMark_0.30/list_items/006.test
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ BEGIN document
ulBegin
ulItem
emphasis: one
interblockSeparator
paragraphSeparator
emphasis: two
ulItemEnd
ulEnd
Expand Down
2 changes: 1 addition & 1 deletion tests/testfiles/CommonMark_0.30/list_items/007.test
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ blockQuoteBegin
olBegin
olItemWithNumber: 1
emphasis: one
interblockSeparator
paragraphSeparator
emphasis: two
olItemEnd
olEnd
Expand Down
2 changes: 1 addition & 1 deletion tests/testfiles/CommonMark_0.30/list_items/010.test
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ BEGIN document
ulBegin
ulItem
emphasis: foo
interblockSeparator
paragraphSeparator
emphasis: bar
ulItemEnd
ulEnd
Expand Down
2 changes: 1 addition & 1 deletion tests/testfiles/CommonMark_0.30/list_items/025.test
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ BEGIN document
ulBegin
ulItem
emphasis: foo
interblockSeparator
paragraphSeparator
emphasis: bar
ulItemEnd
ulEnd
Expand Down
2 changes: 1 addition & 1 deletion tests/testfiles/CommonMark_0.30/lists/007.test
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ interblockSeparator
ulBegin
ulItem
emphasis: baz
interblockSeparator
paragraphSeparator
emphasis: bim
ulItemEnd
ulEnd
Expand Down
2 changes: 1 addition & 1 deletion tests/testfiles/CommonMark_0.30/lists/009.test
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ BEGIN document
ulBegin
ulItem
emphasis: foo
interblockSeparator
paragraphSeparator
emphasis: notcode
ulItemEnd
ulItem
Expand Down
2 changes: 1 addition & 1 deletion tests/testfiles/CommonMark_0.30/lists/016.test
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ emphasis: a
ulItemEnd
ulItem
emphasis: b
interblockSeparator
paragraphSeparator
emphasis: c
ulItemEnd
ulItem
Expand Down
2 changes: 1 addition & 1 deletion tests/testfiles/CommonMark_0.30/lists/019.test
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ interblockSeparator
ulBegin
ulItem
emphasis: b
interblockSeparator
paragraphSeparator
emphasis: c
ulItemEnd
ulEnd
Expand Down
2 changes: 1 addition & 1 deletion tests/testfiles/CommonMark_0.30/tabs/004.test
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
BEGIN document
ulBegin
ulItem
interblockSeparator
paragraphSeparator
ulItemEnd
ulEnd
END document
Loading
Loading