2019-11-03 21:32:55 +01:00
|
|
|
defmodule Textile.Helpers do
|
|
|
|
import NimbleParsec
|
|
|
|
|
|
|
|
# Helper to "undo" a tokenization and convert it back
|
|
|
|
# to a string
|
|
|
|
def unwrap([{_name, value}]), do: value
|
|
|
|
|
|
|
|
# Lots of extra unicode space characters
|
|
|
|
def space do
|
|
|
|
choice([
|
|
|
|
utf8_char('\n\r\f \t\u00a0\u1680\u180e\u202f\u205f\u3000'),
|
|
|
|
utf8_char([0x2000..0x200a])
|
|
|
|
])
|
|
|
|
end
|
|
|
|
|
|
|
|
# Characters which are valid before and after the main markup characters.
|
|
|
|
def special_characters do
|
|
|
|
choice([
|
|
|
|
space(),
|
2019-11-04 00:58:11 +01:00
|
|
|
utf8_char('#$%&(),./:;<=?\\`|\'')
|
2019-11-03 21:32:55 +01:00
|
|
|
])
|
|
|
|
end
|
|
|
|
|
|
|
|
# Simple tag for a markup element that must
|
|
|
|
# be succeeded immediately by a non-space character
|
|
|
|
def markup_open_tag(str, char \\ nil, tag_name) do
|
|
|
|
char = char || binary_head(str)
|
|
|
|
|
|
|
|
open_stops =
|
|
|
|
choice([
|
|
|
|
space(),
|
|
|
|
string(char)
|
|
|
|
])
|
|
|
|
|
|
|
|
string(str)
|
|
|
|
|> lookahead_not(open_stops)
|
|
|
|
|> unwrap_and_tag(:"#{tag_name}_open")
|
|
|
|
end
|
|
|
|
|
|
|
|
defp binary_head(<<c::utf8, _rest::binary>>), do: <<c::utf8>>
|
2019-12-16 06:59:25 +01:00
|
|
|
end
|