diff --git a/lib/fast_textile/parser.ex b/lib/fast_textile/parser.ex index 48004822..1c2b28e9 100644 --- a/lib/fast_textile/parser.ex +++ b/lib/fast_textile/parser.ex @@ -34,12 +34,12 @@ defmodule FastTextile.Parser do tree |> List.flatten() |> Enum.chunk_by(fn {k, _v} -> k end) - |> Enum.flat_map(fn list -> + |> Enum.map(fn list -> [{type, _v} | _rest] = list value = Enum.map_join(list, "", fn {_k, v} -> v end) - [{type, value}] + {type, value} end) end @@ -165,7 +165,7 @@ defmodule FastTextile.Parser do {:ok, [{:markup, ""}, tree, {:markup, ""}], r2_tokens} {:ok, tree, r2_tokens} -> - {:ok, [{:markup, escape(open)}, tree], r2_tokens} + {:ok, [{:text, escape(open)}, tree], r2_tokens} end end defp inner_inline_textile_element(parser, [{:bracketed_link_open, open} | r_tokens]) do @@ -176,7 +176,7 @@ defmodule FastTextile.Parser do {:ok, [{:markup, ""}, tree, {:markup, ""}], r2_tokens} {:ok, tree, r2_tokens} -> - {:ok, [{:markup, escape(open)}, tree], r2_tokens} + {:ok, [{:text, escape(open)}, tree], r2_tokens} end end defp inner_inline_textile_element(parser, [{token, img}, {:unbracketed_image_url, <<":", url::binary>>} | r_tokens]) when token in [:unbracketed_image, :bracketed_image] do @@ -189,9 +189,6 @@ defmodule FastTextile.Parser do {:ok, [{:markup, ""}], r_tokens} end - defp inner_inline_textile_element(_parser, [{:unbracketed_image_url, img} | r_tokens]) do - {:ok, [{:text, escape(img)}], r_tokens} - end defp inner_inline_textile_element(parser, [{:code_delim, open} | r_tokens]) do case parser.state do %{code: _} -> @@ -203,7 +200,7 @@ defmodule FastTextile.Parser do {:ok, [{:markup, ""}, tree, {:markup, ""}], r2_tokens} {:ok, tree, r2_tokens} -> - {:ok, [{:markup, escape(open)}, tree], r2_tokens} + {:ok, [{:text, escape(open)}, tree], r2_tokens} end end end @@ -218,11 +215,12 @@ defmodule FastTextile.Parser do # space inline_textile_element | # char inline_textile_element | # quicktxt inline_textile_element_not_opening_markup | + # opening_markup inline_textile_element_not_opening_markup | # block_textile_element; # defp inline_textile_element_not_opening_markup(_parser, [{:literal, lit} | r_tokens]) do - {:ok, [{:markup, escape(lit)}], r_tokens} + {:ok, [{:markup, ""}, {:markup, escape(lit)}, {:markup, ""}], r_tokens} end defp inline_textile_element_not_opening_markup(_parser, [{:newline, _} | r_tokens]) do {:ok, [{:markup, "
"}], r_tokens} @@ -238,7 +236,7 @@ defmodule FastTextile.Parser do defp inline_textile_element_not_opening_markup(parser, [{:quicktxt, lit} | r_tokens]) do {binary, r2_tokens} = assemble_binary(:quicktxt, <>, r_tokens) - case inline_textile_element_not_opening_markup(parser, r2_tokens) do + case repeat(&inline_textile_element_not_opening_markup/2, parser, r2_tokens) do {:ok, tree, r3_tokens} -> {:ok, [{:text, escape(binary)}, tree], r3_tokens} @@ -246,6 +244,17 @@ defmodule FastTextile.Parser do {:ok, [{:text, escape(binary)}], r2_tokens} end end + defp inline_textile_element_not_opening_markup(parser, [{token, t} | r_tokens]) + when token in [:b_delim, :i_delim, :strong_delim, :em_delim, :ins_delim, :sup_delim, :del_delim, :sub_delim] + do + case repeat(&inline_textile_element_not_opening_markup/2, parser, r_tokens) do + {:ok, tree, r2_tokens} -> + {:ok, [{:text, escape(t)}, tree], r2_tokens} + + _ -> + {:ok, [{:text, escape(t)}], r_tokens} + end + end defp inline_textile_element_not_opening_markup(parser, tokens) do block_textile_element(parser, tokens) end