summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--rst_context.lua5
-rw-r--r--rst_parser.lua39
2 files changed, 20 insertions, 24 deletions
diff --git a/rst_context.lua b/rst_context.lua
index 575d756..e89934d 100644
--- a/rst_context.lua
+++ b/rst_context.lua
@@ -182,7 +182,8 @@ function rst_context.target (tab)
end
function rst_context.escape (str)
- return str:gsub("\\(.)", "%1")
+ str = str:gsub("\\(.)", "%1")
+ return str
end
function rst_context.joinindented (tab)
@@ -464,7 +465,7 @@ local stripme = S"()."
local dontstrip = 1 - stripme
local itemstripper = stripme^0 * C(dontstrip^1) * stripme^0
local function parse_itemstring(str)
- local setup = [[\setupitemize[]]
+ local setup = [[\\setupitemize[]]
-- string.match is slightly faster than string.find
if str:match("^%(") then
setup = setup .. [[left=(,]]
diff --git a/rst_parser.lua b/rst_parser.lua
index 3d0bdd5..d8ddb32 100644
--- a/rst_parser.lua
+++ b/rst_parser.lua
@@ -200,13 +200,14 @@ end
local parser = P{
[1] = V"document",
- document = Cs(V"block"^1),
+ document = V"blank_line"^0 * Cs(V"block"^1),
--------------------------------------------------------------------------------
-- Blocks
--------------------------------------------------------------------------------
block = V"target_block"
+ + Cs(V"list") / rst.escape
+ V"comment"
+ V"line_block"
+ Cs(V"table_block") / rst.escape
@@ -215,7 +216,6 @@ local parser = P{
+ V"literal_block"
+ Cs(V"block_quote") / rst.escape
+ V"explicit_markup"
- + Cs(V"list") / rst.escape
+ Cs(V"paragraph") / rst.escape
,
@@ -231,7 +231,6 @@ local parser = P{
explicit_markup_start = V"double_dot" * V"whitespace",
explicit_markup = V"footnote_block"
- --+ V"citation" -- = \footcite
--+ V"hyperlink_target"
--+ V"directive"
--+ V"substitution_definition"
@@ -322,7 +321,6 @@ local parser = P{
simple_table = Ct(V"st_first_row"
* V"st_other_rows")
- --* V"blank_line"^1
* V"end_block"
/ function (tab)
return rst.simple_table(helpers.table.simple(tab))
@@ -521,7 +519,7 @@ local parser = P{
* (V"blank_line" * V"block_quote_other"^1)^0)
* (V"blank_line"
* Cs(V"block_quote_attri"))^-1)
- * V"blank_line"
+ * V"end_block"
/ rst.block_quote
,
@@ -549,7 +547,7 @@ local parser = P{
* V"block_quote_attri_other"^0,
block_quote_attri_first = Cmt(V"space"^1 * V"attrib_dash" * V"space", function (s, i, indent)
- local t = tracklists
+ local t = state
warn("bqa-i", utf.len(indent), #t.currentindent,
indent, t.currentindent, i)
local ret = indent:match(" *") == t.currentindent
@@ -699,8 +697,8 @@ local parser = P{
--------------------------------------------------------------------------------
list = V"option_list"
- + V"definition_list"
+ V"bullet_list"
+ + V"definition_list"
+ V"field_list"
,
@@ -846,24 +844,24 @@ local parser = P{
bullet_list = V"bullet_init"
--* (V"bullet_list"
--+ V"bullet_continue")^0
- * (V"bullet_continue"
- + V"bullet_list")^0
+ --* (V"bullet_continue" + V"bullet_list")^0
+ * (V"blank_line"^-1 * (V"bullet_list" + V"bullet_continue"))^0
* V"bullet_stop"
* Cmt(Cc(nil), function (s, i)
- local t = tracklists
+ local t = state
warn("close", t.depth)
t.bullets[t.depth] = nil -- “pop”
t.depth = t.depth - 1
return true
end),
- --bullet_stop =V"blank_line" * Cs(Cc("")) / rst.stopitemize,
- bullet_stop =V"end_block" * Cs(Cc("")) / rst.stopitemize,
+ --bullet_stop = V"blank_line" * Cs(Cc("")) / rst.stopitemize,
+ bullet_stop = V"end_block" * Cs(Cc("")) / rst.stopitemize,
- bullet_init = V"eol"^0 * V"bullet_first" * V"bullet_itemrest",
+ bullet_init = V"bullet_first" * V"bullet_itemrest",
bullet_first = #Cmt(V"bullet_indent", function (s, i, bullet)
- local t = tracklists
+ local t = state
local oldbullet = t.bullets[t.depth]
local n_spaces = match(P" "^0, bullet)
warn("first",
@@ -894,7 +892,7 @@ local parser = P{
bullet_indent = V"space"^0 * V"bullet_expr" * V"space"^1,
bullet_cont = Cmt(V"bullet_indent", function (s, i, bullet)
- local t = tracklists
+ local t = state
warn("conti",
t.depth,
bullet == t.bullets[t.depth],
@@ -911,14 +909,12 @@ local parser = P{
elseif t.conversion(t.lastbullet) == t.conversion(bullet) then -- same type
return t.conversion(bullet) == "auto" or t.successor(bullet, t.lastbullet)
end
- --return false
return t.bullets[t.depth] == bullet
end) / "",
-- ^^^^^
-- otherwise returns the value of V"bullet_indent", not sure why …
- bullet_continue = V"blank_line"
- * V"bullet_cont"
+ bullet_continue = V"bullet_cont"
* V"bullet_itemrest",
bullet_itemrest = Cs(V"bullet_rest" -- first line
@@ -933,8 +929,9 @@ local parser = P{
bullet_rest = Cs((1 - V"eol")^1 * V"eol"), -- rest of one line
bullet_next = V"space"^1,
+
bullet_match = #Cmt(V"bullet_next", function (s, i, this)
- local t = tracklists
+ local t = state
warn("match",
t.depth,
string.len(this) == utf.len(t.bullets[t.depth]),
@@ -975,8 +972,7 @@ local parser = P{
-- The whitespace handling after the overline is necessary because headings
-- without overline aren't allowed to be indented.
- section = V"blank_line"^0
- * (V"section_adorn" * V"whitespace"^0)^-1
+ section = (V"section_adorn" * V"whitespace"^0)^-1
* C((1 - V"whitespace") * (1 - V"eol")^1)
* V"eol"
* V"section_adorn"
@@ -1085,7 +1081,6 @@ local parser = P{
block_comment = V"eol"
* Cs(V"indented_lines")
* V"eol"^0
- --* V"blank_line"^0
/ rst.block_comment,
line_comment = Cs((1 - V"eol")^0 * V"eol")