mirror of
https://github.com/philomena-dev/philomena.git
synced 2025-03-05 18:41:27 +01:00
textile fixes
This commit is contained in:
parent
31d05e312c
commit
5b77e2a060
4 changed files with 42 additions and 15 deletions
|
@ -9,7 +9,6 @@ defmodule Philomena.Images.TagDiffer do
|
||||||
old_set = to_set(old_tags)
|
old_set = to_set(old_tags)
|
||||||
new_set = to_set(new_tags)
|
new_set = to_set(new_tags)
|
||||||
|
|
||||||
image_id = changeset |> get_field(:id)
|
|
||||||
tags = changeset |> get_field(:tags)
|
tags = changeset |> get_field(:tags)
|
||||||
added_tags = added_set(old_set, new_set)
|
added_tags = added_set(old_set, new_set)
|
||||||
removed_tags = removed_set(old_set, new_set)
|
removed_tags = removed_set(old_set, new_set)
|
||||||
|
|
|
@ -122,6 +122,22 @@ defmodule Textile.Lexer do
|
||||||
|
|
||||||
{link_markup_start, link_markup_element} = markup_ending_in(string("\""))
|
{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 =
|
link_contents_start =
|
||||||
choice([
|
choice([
|
||||||
image,
|
image,
|
||||||
|
@ -157,7 +173,7 @@ defmodule Textile.Lexer do
|
||||||
string("\":")
|
string("\":")
|
||||||
|> unwrap_and_tag(:link_end)
|
|> unwrap_and_tag(:link_end)
|
||||||
|> concat(
|
|> concat(
|
||||||
url_ending_in(space())
|
url_ending_in(link_stop)
|
||||||
|> unwrap_and_tag(:link_url)
|
|> unwrap_and_tag(:link_url)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -35,7 +35,7 @@ defmodule Textile.Parser do
|
||||||
#
|
#
|
||||||
defp textile_top(_parser, []), do: {:ok, [], []}
|
defp textile_top(_parser, []), do: {:ok, [], []}
|
||||||
defp textile_top(parser, tokens) do
|
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 == [],
|
false <- tree == [],
|
||||||
{:ok, next_tree, r2_tokens} <- textile_top(parser, r_tokens)
|
{:ok, next_tree, r2_tokens} <- textile_top(parser, r_tokens)
|
||||||
do
|
do
|
||||||
|
@ -53,24 +53,36 @@ defmodule Textile.Parser do
|
||||||
#
|
#
|
||||||
# well_formed_including_paragraphs = (markup | double_newline)*;
|
# well_formed_including_paragraphs = (markup | double_newline)*;
|
||||||
#
|
#
|
||||||
defp well_formed_including_paragraphs(_parser, []), do: {:ok, [], []}
|
defp well_formed_including_paragraphs(_parser, _closing_token, []), do: {:ok, [], []}
|
||||||
defp well_formed_including_paragraphs(parser, [{:double_newline, _nl} | r_tokens]) do
|
defp well_formed_including_paragraphs(parser, closing_token, [{:double_newline, _nl} | r_tokens]) do
|
||||||
{:ok, tree, r2_tokens} = well_formed_including_paragraphs(parser, r_tokens)
|
{:ok, tree, r2_tokens} = well_formed_including_paragraphs(parser, closing_token, r_tokens)
|
||||||
|
|
||||||
{:ok, [{:markup, "<br/><br/>"}, tree], r2_tokens}
|
{:ok, [{:markup, "<br/><br/>"}, tree], r2_tokens}
|
||||||
end
|
end
|
||||||
|
|
||||||
defp well_formed_including_paragraphs(parser, tokens) do
|
defp well_formed_including_paragraphs(parser, closing_token, tokens) do
|
||||||
with {:ok, tree, r_tokens} <- markup(parser, tokens),
|
with {:markup, {:ok, tree, r_tokens}} <- {:markup, markup(parser, tokens)},
|
||||||
{:ok, next_tree, r2_tokens} <- well_formed_including_paragraphs(parser, r_tokens)
|
{:ok, next_tree, r2_tokens} <- well_formed_including_paragraphs(parser, closing_token, r_tokens)
|
||||||
do
|
do
|
||||||
{:ok, [tree, next_tree], r2_tokens}
|
{:ok, [tree, next_tree], r2_tokens}
|
||||||
else
|
else
|
||||||
_ ->
|
_ ->
|
||||||
{:ok, [], tokens}
|
consume_nonclosing(parser, closing_token, tokens)
|
||||||
end
|
end
|
||||||
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)*;
|
# well_formed = (markup)*;
|
||||||
#
|
#
|
||||||
|
@ -121,7 +133,7 @@ defmodule Textile.Parser do
|
||||||
# blockquote_open well_formed_including_paragraphs blockquote_close;
|
# blockquote_open well_formed_including_paragraphs blockquote_close;
|
||||||
#
|
#
|
||||||
defp blockquote(parser, [{:blockquote_open_cite, author} | r_tokens]) do
|
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, tree, [{:blockquote_close, _close} | r2_tokens]} ->
|
||||||
{:ok, [{:markup, ~s|<blockquote author="#{escape_html(author)}">|}, tree, {:markup, ~s|</blockquote>|}], r2_tokens}
|
{:ok, [{:markup, ~s|<blockquote author="#{escape_html(author)}">|}, tree, {:markup, ~s|</blockquote>|}], r2_tokens}
|
||||||
|
|
||||||
|
@ -131,7 +143,7 @@ defmodule Textile.Parser do
|
||||||
end
|
end
|
||||||
|
|
||||||
defp blockquote(parser, [{:blockquote_open, open} | r_tokens]) do
|
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, tree, [{:blockquote_close, _close} | r2_tokens]} ->
|
||||||
{:ok, [{:markup, ~s|<blockquote>|}, tree, {:markup, ~s|</blockquote>|}], r2_tokens}
|
{:ok, [{:markup, ~s|<blockquote>|}, tree, {:markup, ~s|</blockquote>|}], r2_tokens}
|
||||||
|
|
||||||
|
@ -149,7 +161,7 @@ defmodule Textile.Parser do
|
||||||
# spoiler_open well_formed_including_paragraphs spoiler_close;
|
# spoiler_open well_formed_including_paragraphs spoiler_close;
|
||||||
#
|
#
|
||||||
defp spoiler(parser, [{:spoiler_open, open} | r_tokens]) do
|
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, tree, [{:spoiler_close, _close} | r2_tokens]} ->
|
||||||
{:ok, [{:markup, ~s|<span class="spoiler">|}, tree, {:markup, ~s|</span>|}], r2_tokens}
|
{:ok, [{:markup, ~s|<span class="spoiler">|}, tree, {:markup, ~s|</span>|}], r2_tokens}
|
||||||
|
|
||||||
|
@ -167,7 +179,7 @@ defmodule Textile.Parser do
|
||||||
# link_start well_formed_including_paragraphs link_end link_url;
|
# link_start well_formed_including_paragraphs link_end link_url;
|
||||||
#
|
#
|
||||||
defp link(parser, [{:link_start, start} | r_tokens]) do
|
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, tree, [{:link_end, _end}, {:link_url, url} | r2_tokens]} ->
|
||||||
{:ok, [{:markup, ~s|<a href="#{escape_html(url)}">|}, tree, {:markup, ~s|</a>|}], r2_tokens}
|
{:ok, [{:markup, ~s|<a href="#{escape_html(url)}">|}, tree, {:markup, ~s|</a>|}], r2_tokens}
|
||||||
|
|
||||||
|
|
|
@ -35,7 +35,7 @@ defmodule Textile.ParserHelpers do
|
||||||
|
|
||||||
def escape_nl2br(text) do
|
def escape_nl2br(text) do
|
||||||
text
|
text
|
||||||
|> String.split("\n", trim: true)
|
|> String.split("\n")
|
||||||
|> Enum.map(&escape_html(&1))
|
|> Enum.map(&escape_html(&1))
|
||||||
|> Enum.join("<br/>")
|
|> Enum.join("<br/>")
|
||||||
end
|
end
|
||||||
|
|
Loading…
Add table
Reference in a new issue