Skip to content

Commit

Permalink
Added doc for oneline tags
Browse files Browse the repository at this point in the history
  • Loading branch information
RobertDober committed Jun 26, 2020
1 parent 8b5b1d7 commit 179487d
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 25 deletions.
44 changes: 30 additions & 14 deletions lib/earmark.ex
Original file line number Diff line number Diff line change
Expand Up @@ -167,14 +167,30 @@ defmodule Earmark do
iex(4)> Earmark.as_ast(["<span class=\\"superspan\\">spaniel</span>"])
{:ok, [{"span"}, [{"class", "superspan"}], ["spaniel"], %{verbatim: true}], []}
What is HTML?
We differ from strict GFM by allowing **all** tags not only HTML5 tagsn this holds for oneliners....
iex(5)> {:ok, ast, []} = Earmark.as_ast(["<stupid />", "<not>better</not>"])
...(5)> ast
[
{"stupid", [], [], %{meta: %{verbatim: true}}},
{"not", [], ["better"], %{meta: %{verbatim: true}}}]
and for multiline blocks
iex(6)> {:ok, ast, []} = Earmark.as_ast([ "<hello>", "world", "</hello>"])
...(6)> ast
[{"hello", [], ["world"], %{verbatim: true}}]
#### HTML Comments
Are recoginized if they start a line (after ws and are parsed until the next `-->` is found
all text after the next '-->' is ignored
E.g.
iex(5)> Earmark.as_ast(" <!-- Comment\\ncomment line\\ncomment --> text -->\\nafter")
iex(7)> Earmark.as_ast(" <!-- Comment\\ncomment line\\ncomment --> text -->\\nafter")
{:ok, [{:comment, [" Comment", "comment line", "comment "], %{comment: true}}, {"p", [], ["after"]}], []}
Expand Down Expand Up @@ -206,26 +222,26 @@ defmodule Earmark do
It is possible to add IAL attributes to generated links or images in the following
format.
iex(6)> markdown = "[link](url) {: .classy}"
...(6)> Earmark.as_html(markdown)
iex(8)> markdown = "[link](url) {: .classy}"
...(8)> Earmark.as_html(markdown)
{ :ok, "<p>\\n <a class=\\"classy\\" href=\\"url\\">\\n link\\n </a>\\n</p>\\n", []}
For both cases, malformed attributes are ignored and warnings are issued.
iex(7)> [ "Some text", "{:hello}" ] |> Enum.join("\\n") |> Earmark.as_html()
iex(9)> [ "Some text", "{:hello}" ] |> Enum.join("\\n") |> Earmark.as_html()
{:error, "<p>\\n Some text\\n</p>\\n", [{:warning, 2,"Illegal attributes [\\"hello\\"] ignored in IAL"}]}
It is possible to escape the IAL in both forms if necessary
iex(8)> markdown = "[link](url)\\\\{: .classy}"
...(8)> Earmark.as_html(markdown)
iex(10)> markdown = "[link](url)\\\\{: .classy}"
...(10)> Earmark.as_html(markdown)
{:ok, "<p>\\n <a href=\\"url\\">\\n link\\n </a>\\n {: .classy}\\n</p>\\n", []}
This of course is not necessary in code blocks or text lines
containing an IAL-like string, as in the following example
iex(9)> markdown = "hello {:world}"
...(9)> Earmark.as_html!(markdown)
iex(11)> markdown = "hello {:world}"
...(11)> Earmark.as_html!(markdown)
"<p>\\n hello {:world}\\n</p>\\n"
## Limitations
Expand Down Expand Up @@ -389,17 +405,17 @@ defmodule Earmark do
end

@doc """
iex(10)> markdown = "My `code` is **best**"
...(10)> {:ok, ast, []} = Earmark.as_ast(markdown)
...(10)> ast
iex(12)> markdown = "My `code` is **best**"
...(12)> {:ok, ast, []} = Earmark.as_ast(markdown)
...(12)> ast
[{"p", [], ["My ", {"code", [{"class", "inline"}], ["code"]}, " is ", {"strong", [], ["best"]}]}]
Options are passes like to `as_html`, some do not have an effect though (e.g. `smartypants`) as formatting and escaping is not done
for the AST.
iex(11)> markdown = "```elixir\\nIO.puts 42\\n```"
...(11)> {:ok, ast, []} = Earmark.as_ast(markdown, code_class_prefix: "lang-")
...(11)> ast
iex(13)> markdown = "```elixir\\nIO.puts 42\\n```"
...(13)> {:ok, ast, []} = Earmark.as_ast(markdown, code_class_prefix: "lang-")
...(13)> ast
[{"pre", [], [{"code", [{"class", "elixir lang-elixir"}], ["IO.puts 42"]}]}]
**Rationale**:
Expand Down
17 changes: 6 additions & 11 deletions lib/earmark/line_scanner.ex
Original file line number Diff line number Diff line change
Expand Up @@ -139,17 +139,11 @@ defmodule Earmark.LineScanner do

match = !recursive && Regex.run(~r{\A<([-\w]+?)(?:\s.*)?>.*</\1>}, line) ->
[_, tag] = match

if block_tag?(tag),
do: %Line.HtmlOneLine{tag: tag, content: line, indent: 0},
else: %Line.Text{content: line, indent: 0}
%Line.HtmlOneLine{tag: tag, content: line, indent: 0}

match = !recursive && Regex.run(~r{\A<([-\w]+?)(?:\s.*)?/>.*}, line) ->
[_, tag] = match

if block_tag?(tag),
do: %Line.HtmlOneLine{tag: tag, content: line, indent: 0},
else: %Line.Text{content: line, indent: 0}
%Line.HtmlOneLine{tag: tag, content: line, indent: 0}

match = !recursive && Regex.run(~r/^<([-\w]+?)(?:\s.*)?>/, line) ->
[_, tag] = match
Expand Down Expand Up @@ -251,9 +245,10 @@ defmodule Earmark.LineScanner do
|> String.replace("<", "&lt;")


@block_tags ~w< address article aside blockquote canvas dd div dl fieldset figcaption h1 h2 h3 h4 h5 h6 header hgroup li main nav noscript ol output p pre section table tfoot ul video>
|> Enum.into(MapSet.new())
defp block_tag?(tag), do: MapSet.member?(@block_tags, tag)
# Not sure yet if we shall enforce all tags, in that case we shall enlargen @block_tags to @html_tags
# @block_tags ~w< address article aside blockquote canvas dd div dl fieldset figcaption h1 h2 h3 h4 h5 h6 header hgroup li main nav noscript ol output p pre section table tfoot ul video>
# |> Enum.into(MapSet.new())
# defp block_tag?(tag), do: MapSet.member?(@block_tags, tag)

@column_rgx ~r{\A[\s|:-]+\z}
defp _determine_if_header(columns) do
Expand Down

0 comments on commit 179487d

Please sign in to comment.