Packages
earmark
0.1.14
1.5.0-pre1
retired
1.5.0-pre
retired
1.4.49
retired
1.4.48
retired
1.4.47
retired
1.4.46
retired
1.4.45
retired
1.4.44
retired
1.4.43
retired
1.4.42
retired
1.4.41
retired
1.4.40
retired
1.4.39
retired
1.4.38
retired
1.4.37
retired
1.4.36
retired
1.4.35
retired
1.4.34
retired
1.4.33
retired
1.4.32
retired
1.4.31
retired
1.4.30
retired
1.4.29
retired
1.4.28
retired
1.4.27
retired
1.4.26
retired
1.4.25
retired
1.4.24
retired
1.4.23
retired
1.4.22
retired
1.4.21
retired
1.4.20
retired
1.4.19
retired
1.4.18
retired
1.4.17
retired
1.4.16
retired
1.4.16-pre2
retired
1.4.16-pre1
retired
1.4.16-pre
retired
1.4.15
retired
1.4.14
retired
1.4.13
retired
1.4.12
retired
1.4.10
retired
1.4.9
retired
1.4.8
retired
1.4.7
retired
1.4.6
retired
1.4.5
retired
1.4.4
retired
1.4.3
retired
1.4.2
retired
1.4.1
retired
1.4.0
retired
1.3.6
retired
1.3.5
retired
1.3.4
retired
1.3.3
retired
1.3.2
retired
1.3.1
retired
1.3.0
retired
1.2.6
retired
1.2.5
retired
1.2.4
retired
1.2.3
retired
1.2.2
retired
1.2.1
retired
1.2.0
retired
1.1.1
retired
1.1.0
retired
1.0.3
retired
1.0.2
retired
1.0.1
retired
1.0.0
retired
0.2.1
retired
0.2.0
retired
0.1.19
retired
0.1.18
retired
0.1.17
retired
0.1.16
retired
0.1.15
retired
0.1.14
retired
0.1.13
retired
0.1.12
retired
0.1.10
retired
0.1.9
retired
0.1.8
retired
0.1.7
retired
0.1.6
retired
0.1.5
retired
0.1.4
retired
0.1.3
retired
0.1.2
retired
0.1.1
retired
0.1.0
retired
Earmark is a pure-Elixir Markdown converter. It is intended to be used as a library (just call Earmark.as_html), but can also be used as a command-line tool (run mix escript.build first). Output generation is pluggable.
Retired package: Deprecated - Earmark is no longer maintained. Migrate to a replacement, for example MDEx (https://hex.pm/packages/mdex).
Current section
Files
Jump to
Current section
Files
lib/earmark/helpers.ex
defmodule Earmark.Helpers do
@doc """
Expand tabs to multiples of 4 columns
"""
def expand_tabs(line) do
if String.contains?(line, "\t") do
line = Regex.replace(~r{(.*?)\t}, line, &expander/2)
end
line
end
defp expander(_, leader) do
extra = 4 - rem(String.length(leader), 4)
leader <> pad(extra)
end
@doc """
Remove newlines at end of line
"""
def remove_line_ending(line) do
line |> String.rstrip(?\n) |> String.rstrip(?\r)
end
defp pad(1), do: " "
defp pad(2), do: " "
defp pad(3), do: " "
defp pad(4), do: " "
@doc """
Remove the leading part of a string
"""
def behead(str, ignore) when is_integer(ignore) do
String.slice(str, ignore..-1)
end
def behead(str, leading_string) do
behead(str, String.length(leading_string))
end
@doc """
`Regex.replace` with the arguments in the correct order
"""
def replace(text, regex, replacement, options \\ []) do
Regex.replace(regex, text, replacement, options)
end
@doc """
Replace <, >, and quotes with the corresponding entities. If
`encode` is true, convert ampersands, too, otherwise only
convert non-entity ampersands.
"""
def escape(html, encode \\ false)
def escape(html, false), do: _escape(Regex.replace(~r{&(?!#?\w+;)}, html, "&"))
def escape(html, _), do: _escape(String.replace(html, "&", "&"))
defp _escape(html) do
html
|> String.replace("<", "<")
|> String.replace(">", ">")
|> String.replace("\"", """)
|> String.replace("'", "'")
end
@doc """
Convert numeric entity references to character strings
"""
def unescape(html), do: unescape(html, [])
defp unescape("", result) do
result |> Enum.reverse |> List.to_string
end
defp unescape(":" <> rest, result) do
unescape(rest, [ ":" | result ])
end
defp unescape("&#x" <> rest, result) do
{new_rest, char} = parse_hex_entity(rest, [])
unescape(new_rest, [ char | result ])
end
defp unescape("&#" <> rest, result) do
{new_rest, char} = parse_decimal_entity(rest, [])
unescape(new_rest, [ char | result ])
end
defp unescape(<< ch :: utf8, rest :: binary>>, result) do
unescape(rest, [ ch | result ])
end
defp parse_hex_entity(";" <> rest, entity) do
{ rest, entity |> Enum.reverse |> List.to_integer(16) }
end
defp parse_hex_entity(<< ch :: utf8, rest :: binary>>, entity) do
parse_hex_entity(rest, [ ch | entity ])
end
defp parse_decimal_entity(";" <> rest, entity) do
{ rest, entity |> Enum.reverse |> List.to_integer(10) }
end
defp parse_decimal_entity(<< ch :: utf8, rest :: binary>>, entity) do
parse_decimal_entity(rest, [ ch | entity ])
end
end