diff --git a/lib/philomena/images/tag_differ.ex b/lib/philomena/images/tag_differ.ex index 849fbdca..17dd0ea0 100644 --- a/lib/philomena/images/tag_differ.ex +++ b/lib/philomena/images/tag_differ.ex @@ -9,7 +9,6 @@ defmodule Philomena.Images.TagDiffer do old_set = to_set(old_tags) new_set = to_set(new_tags) - image_id = changeset |> get_field(:id) tags = changeset |> get_field(:tags) added_tags = added_set(old_set, new_set) removed_tags = removed_set(old_set, new_set) diff --git a/lib/textile/lexer.ex b/lib/textile/lexer.ex index 170bd150..3364455f 100644 --- a/lib/textile/lexer.ex +++ b/lib/textile/lexer.ex @@ -122,6 +122,22 @@ defmodule Textile.Lexer do {link_markup_start, link_markup_element} = markup_ending_in(string("\"")) + link_stop = + choice([ + space(), + string("*"), + string("_"), + string("@"), + string("+"), + string("^"), + string("-"), + string("~"), + string("."), + string("?"), + string("!"), + string(",") + ]) + link_contents_start = choice([ image, @@ -157,7 +173,7 @@ defmodule Textile.Lexer do string("\":") |> unwrap_and_tag(:link_end) |> concat( - url_ending_in(space()) + url_ending_in(link_stop) |> unwrap_and_tag(:link_url) ) diff --git a/lib/textile/parser.ex b/lib/textile/parser.ex index baf4101b..6bcebb4a 100644 --- a/lib/textile/parser.ex +++ b/lib/textile/parser.ex @@ -35,7 +35,7 @@ defmodule Textile.Parser do # defp textile_top(_parser, []), do: {:ok, [], []} defp textile_top(parser, tokens) do - with {:ok, tree, r_tokens} <- well_formed_including_paragraphs(parser, tokens), + with {:ok, tree, r_tokens} <- well_formed_including_paragraphs(parser, nil, tokens), false <- tree == [], {:ok, next_tree, r2_tokens} <- textile_top(parser, r_tokens) do @@ -53,24 +53,36 @@ defmodule Textile.Parser do # # well_formed_including_paragraphs = (markup | double_newline)*; # - defp well_formed_including_paragraphs(_parser, []), do: {:ok, [], []} - defp well_formed_including_paragraphs(parser, [{:double_newline, _nl} | r_tokens]) do - {:ok, tree, r2_tokens} = well_formed_including_paragraphs(parser, r_tokens) + defp well_formed_including_paragraphs(_parser, _closing_token, []), do: {:ok, [], []} + defp well_formed_including_paragraphs(parser, closing_token, [{:double_newline, _nl} | r_tokens]) do + {:ok, tree, r2_tokens} = well_formed_including_paragraphs(parser, closing_token, r_tokens) {:ok, [{:markup, "

"}, tree], r2_tokens} end - defp well_formed_including_paragraphs(parser, tokens) do - with {:ok, tree, r_tokens} <- markup(parser, tokens), - {:ok, next_tree, r2_tokens} <- well_formed_including_paragraphs(parser, r_tokens) + defp well_formed_including_paragraphs(parser, closing_token, tokens) do + with {:markup, {:ok, tree, r_tokens}} <- {:markup, markup(parser, tokens)}, + {:ok, next_tree, r2_tokens} <- well_formed_including_paragraphs(parser, closing_token, r_tokens) do {:ok, [tree, next_tree], r2_tokens} else _ -> - {:ok, [], tokens} + consume_nonclosing(parser, closing_token, tokens) end end + defp consume_nonclosing(_parser, closing_token, [{closing_token, _string} | _r_tokens] = tokens) do + {:ok, [], tokens} + end + defp consume_nonclosing(parser, closing_token, [{_next_token, string} | r_tokens]) do + {:ok, next_tree, r2_tokens} = well_formed_including_paragraphs(parser, closing_token, r_tokens) + + {:ok, [{:text, escape_nl2br(string)}, next_tree], r2_tokens} + end + defp consume_nonclosing(_parser, _closing_token, []) do + {:ok, [], []} + end + # # well_formed = (markup)*; # @@ -121,7 +133,7 @@ defmodule Textile.Parser do # blockquote_open well_formed_including_paragraphs blockquote_close; # defp blockquote(parser, [{:blockquote_open_cite, author} | r_tokens]) do - case well_formed_including_paragraphs(parser, r_tokens) do + case well_formed_including_paragraphs(parser, :blockquote_close, r_tokens) do {:ok, tree, [{:blockquote_close, _close} | r2_tokens]} -> {:ok, [{:markup, ~s|
|}, tree, {:markup, ~s|
|}], r2_tokens} @@ -131,7 +143,7 @@ defmodule Textile.Parser do end defp blockquote(parser, [{:blockquote_open, open} | r_tokens]) do - case well_formed_including_paragraphs(parser, r_tokens) do + case well_formed_including_paragraphs(parser, :blockquote_close, r_tokens) do {:ok, tree, [{:blockquote_close, _close} | r2_tokens]} -> {:ok, [{:markup, ~s|
|}, tree, {:markup, ~s|
|}], r2_tokens} @@ -149,7 +161,7 @@ defmodule Textile.Parser do # spoiler_open well_formed_including_paragraphs spoiler_close; # defp spoiler(parser, [{:spoiler_open, open} | r_tokens]) do - case well_formed_including_paragraphs(parser, r_tokens) do + case well_formed_including_paragraphs(parser, :spoiler_close, r_tokens) do {:ok, tree, [{:spoiler_close, _close} | r2_tokens]} -> {:ok, [{:markup, ~s||}, tree, {:markup, ~s||}], r2_tokens} @@ -167,7 +179,7 @@ defmodule Textile.Parser do # link_start well_formed_including_paragraphs link_end link_url; # defp link(parser, [{:link_start, start} | r_tokens]) do - case well_formed_including_paragraphs(parser, r_tokens) do + case well_formed_including_paragraphs(parser, nil, r_tokens) do {:ok, tree, [{:link_end, _end}, {:link_url, url} | r2_tokens]} -> {:ok, [{:markup, ~s||}, tree, {:markup, ~s||}], r2_tokens} diff --git a/lib/textile/parser_helpers.ex b/lib/textile/parser_helpers.ex index 884e0b61..e49d11aa 100644 --- a/lib/textile/parser_helpers.ex +++ b/lib/textile/parser_helpers.ex @@ -35,7 +35,7 @@ defmodule Textile.ParserHelpers do def escape_nl2br(text) do text - |> String.split("\n", trim: true) + |> String.split("\n") |> Enum.map(&escape_html(&1)) |> Enum.join("
") end