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("