mirror of
https://github.com/philomena-dev/philomena.git
synced 2024-11-24 04:27:59 +01:00
tweaks and images
This commit is contained in:
parent
32ac705eee
commit
fcb8919669
4 changed files with 91 additions and 10 deletions
|
@ -17,7 +17,7 @@ defmodule Textile.Helpers do
|
||||||
def special_characters do
|
def special_characters do
|
||||||
choice([
|
choice([
|
||||||
space(),
|
space(),
|
||||||
utf8_char('#$%&(),-./:;<=?[\\]^`|~\'')
|
utf8_char('#$%&(),./:;<=?\\`|\'')
|
||||||
])
|
])
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -2,6 +2,7 @@ defmodule Textile.Lexer do
|
||||||
import NimbleParsec
|
import NimbleParsec
|
||||||
import Textile.Helpers
|
import Textile.Helpers
|
||||||
import Textile.MarkupLexer
|
import Textile.MarkupLexer
|
||||||
|
import Textile.UrlLexer
|
||||||
|
|
||||||
|
|
||||||
# Structural tags
|
# Structural tags
|
||||||
|
@ -53,7 +54,67 @@ defmodule Textile.Lexer do
|
||||||
string("[/spoiler]")
|
string("[/spoiler]")
|
||||||
|> unwrap_and_tag(:spoiler_close)
|
|> unwrap_and_tag(:spoiler_close)
|
||||||
|
|
||||||
markup = markup_segment(eos())
|
|
||||||
|
|
||||||
defparsec :markup, markup
|
# Images
|
||||||
|
|
||||||
|
|
||||||
|
image_url_with_title =
|
||||||
|
url_ending_in(string("("))
|
||||||
|
|> unwrap_and_tag(:image_url)
|
||||||
|
|> concat(
|
||||||
|
ignore(string("("))
|
||||||
|
|> repeat(utf8_char(not: ?)))
|
||||||
|
|> ignore(string(")"))
|
||||||
|
|> lookahead(string("!"))
|
||||||
|
|> reduce({List, :to_string, []})
|
||||||
|
|> unwrap_and_tag(:image_title)
|
||||||
|
)
|
||||||
|
|
||||||
|
image_url_without_title =
|
||||||
|
url_ending_in(string("!"))
|
||||||
|
|> unwrap_and_tag(:image_url)
|
||||||
|
|
||||||
|
image_url =
|
||||||
|
choice([
|
||||||
|
image_url_with_title,
|
||||||
|
image_url_without_title
|
||||||
|
])
|
||||||
|
|
||||||
|
bracketed_image_with_link =
|
||||||
|
ignore(string("[!"))
|
||||||
|
|> concat(image_url)
|
||||||
|
|> ignore(string("!:"))
|
||||||
|
|> concat(
|
||||||
|
url_ending_in(string("]"))
|
||||||
|
|> unwrap_and_tag(:image_link_url)
|
||||||
|
)
|
||||||
|
|
||||||
|
bracketed_image_without_link =
|
||||||
|
ignore(string("[!"))
|
||||||
|
|> concat(image_url)
|
||||||
|
|> ignore(string("!]"))
|
||||||
|
|
||||||
|
image_with_link =
|
||||||
|
ignore(string("!"))
|
||||||
|
|> concat(image_url)
|
||||||
|
|> ignore(string("!:"))
|
||||||
|
|> concat(
|
||||||
|
url_ending_in(space())
|
||||||
|
|> unwrap_and_tag(:image_link_url)
|
||||||
|
)
|
||||||
|
|
||||||
|
image_without_link =
|
||||||
|
ignore(string("!"))
|
||||||
|
|> concat(image_url)
|
||||||
|
|> ignore(string("!"))
|
||||||
|
|
||||||
|
image =
|
||||||
|
choice([
|
||||||
|
bracketed_image_with_link,
|
||||||
|
bracketed_image_without_link,
|
||||||
|
image_with_link,
|
||||||
|
image_without_link
|
||||||
|
])
|
||||||
|
|
||||||
|
defparsec :image, image
|
||||||
end
|
end
|
|
@ -118,12 +118,12 @@ defmodule Textile.MarkupLexer do
|
||||||
b_sup_close,
|
b_sup_close,
|
||||||
b_del_close,
|
b_del_close,
|
||||||
b_sub_close,
|
b_sub_close,
|
||||||
b_close,
|
|
||||||
i_close,
|
|
||||||
])
|
])
|
||||||
|
|
||||||
markup_closing_tags =
|
markup_closing_tags =
|
||||||
choice([
|
choice([
|
||||||
|
b_close,
|
||||||
|
i_close,
|
||||||
strong_close,
|
strong_close,
|
||||||
em_close,
|
em_close,
|
||||||
code_close,
|
code_close,
|
||||||
|
@ -133,6 +133,14 @@ defmodule Textile.MarkupLexer do
|
||||||
sub_close
|
sub_close
|
||||||
])
|
])
|
||||||
|
|
||||||
|
markup_tags =
|
||||||
|
choice([
|
||||||
|
bracketed_markup_opening_tags,
|
||||||
|
bracketed_markup_closing_tags,
|
||||||
|
markup_opening_tags,
|
||||||
|
markup_closing_tags
|
||||||
|
])
|
||||||
|
|
||||||
markup_at_start =
|
markup_at_start =
|
||||||
choice([
|
choice([
|
||||||
markup_opening_tags,
|
markup_opening_tags,
|
||||||
|
@ -142,12 +150,10 @@ defmodule Textile.MarkupLexer do
|
||||||
markup_element =
|
markup_element =
|
||||||
lookahead_not(ending_sequence)
|
lookahead_not(ending_sequence)
|
||||||
|> choice([
|
|> choice([
|
||||||
|
bracketed_markup_closing_tags,
|
||||||
|
bracketed_markup_opening_tags |> lookahead_not(space()),
|
||||||
special_characters() |> concat(markup_opening_tags),
|
special_characters() |> concat(markup_opening_tags),
|
||||||
bracketed_markup_opening_tags,
|
markup_closing_tags |> choice([special_characters(), ending_sequence]),
|
||||||
# utf8 char which is not a space followed by a closing tag followed by a special or the end
|
|
||||||
utf8_char([]) |> lookahead_not(space()) |> concat(markup_closing_tags) |> lookahead(choice([special_characters(), ending_sequence])),
|
|
||||||
utf8_char([]) |> concat(bracketed_markup_closing_tags),
|
|
||||||
literal,
|
|
||||||
utf8_char([])
|
utf8_char([])
|
||||||
])
|
])
|
||||||
|
|
||||||
|
|
14
lib/textile/url_lexer.ex
Normal file
14
lib/textile/url_lexer.ex
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
defmodule Textile.UrlLexer do
|
||||||
|
import NimbleParsec
|
||||||
|
|
||||||
|
def url_ending_in(ending_sequence) do
|
||||||
|
protocol =
|
||||||
|
choice([
|
||||||
|
string("/"), string("https://"), string("http://"), string("data:image/")
|
||||||
|
])
|
||||||
|
|
||||||
|
protocol
|
||||||
|
|> repeat(lookahead_not(ending_sequence) |> utf8_char([]))
|
||||||
|
|> reduce({List, :to_string, []})
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in a new issue