Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .github/workflows/elixir.yml
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,10 @@ jobs:
otp: 27
os: ubuntu-latest
warnings_as_errors: true
- elixir: 1.18.x
otp: 27
os: ubuntu-latest
warnings_as_errors: true
env:
MIX_ENV: test
steps:
Expand Down
52 changes: 35 additions & 17 deletions lib/earmark_parser/helpers/html_parser.ex
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
defmodule Earmark.Parser.Helpers.HtmlParser do

@moduledoc false

import Earmark.Parser.Helpers.StringHelpers, only: [behead: 2]
import Earmark.Parser.LineScanner, only: [void_tag?: 1]

def parse_html(lines)
def parse_html([tag_line|rest]) do

def parse_html([tag_line | rest]) do
case _parse_tag(tag_line) do
{ :ok, tag, "" } -> [_parse_rest(rest, tag, [])]
{ :ok, tag, suffix } -> [_parse_rest(rest, tag, [suffix])]
{ :ext, tag, "" } -> [_parse_rest(rest, tag, [])]
{ :ext, tag, suffix } -> [_parse_rest(rest, tag, []), [suffix]]
{:ok, tag, ""} -> [_parse_rest(rest, tag, [])]
{:ok, tag, suffix} -> [_parse_rest(rest, tag, [suffix])]
{:ext, tag, ""} -> [_parse_rest(rest, tag, [])]
{:ext, tag, suffix} -> [_parse_rest(rest, tag, []), [suffix]]
end
end

Expand Down Expand Up @@ -53,9 +53,9 @@ defmodule Earmark.Parser.Helpers.HtmlParser do

defp _close_tag_tail(tag, atts, closing?, suffix) do
if closing? || void_tag?(tag) do
{:ext, {tag, Enum.reverse(atts)}, suffix }
{:ext, {tag, Enum.reverse(atts)}, suffix}
else
{:ok, {tag, Enum.reverse(atts)}, suffix }
{:ok, {tag, Enum.reverse(atts)}, suffix}
end
end

Expand All @@ -64,18 +64,36 @@ defmodule Earmark.Parser.Helpers.HtmlParser do

@verbatim %{verbatim: true}
defp _parse_rest(rest, tag_tpl, lines)

defp _parse_rest([], tag_tpl, lines) do
tag_tpl |> Tuple.append(Enum.reverse(lines)) |> Tuple.append(@verbatim)
tag_tpl
|> Tuple.insert_at(tuple_size(tag_tpl), Enum.reverse(lines))
|> Tuple.insert_at(tuple_size(tag_tpl) + 1, @verbatim)
end
defp _parse_rest([last_line], {tag, _}=tag_tpl, lines) do

defp _parse_rest([last_line], {tag, _} = tag_tpl, lines) do
case Regex.run(~r{\A\s*</#{tag}>\s*(.*)}, last_line) do
nil -> tag_tpl |> Tuple.append(Enum.reverse([last_line|lines])) |> Tuple.append(@verbatim)
[_, ""] -> tag_tpl |> Tuple.append(Enum.reverse(lines)) |> Tuple.append(@verbatim)
[_, suffix] -> [tag_tpl |> Tuple.append(Enum.reverse(lines)) |> Tuple.append(@verbatim), suffix]
nil ->
tag_tpl
|> Tuple.insert_at(tuple_size(tag_tpl), Enum.reverse([last_line | lines]))
|> Tuple.insert_at(tuple_size(tag_tpl) + 1, @verbatim)

[_, ""] ->
tag_tpl
|> Tuple.insert_at(tuple_size(tag_tpl), Enum.reverse(lines))
|> Tuple.insert_at(tuple_size(tag_tpl) + 1, @verbatim)

[_, suffix] ->
[
tag_tpl
|> Tuple.insert_at(tuple_size(tag_tpl), Enum.reverse(lines))
|> Tuple.insert_at(tuple_size(tag_tpl) + 1, @verbatim),
suffix
]
end
end
defp _parse_rest([inner_line|rest], tag_tpl, lines) do
_parse_rest(rest, tag_tpl, [inner_line|lines])
end

end
defp _parse_rest([inner_line | rest], tag_tpl, lines) do
_parse_rest(rest, tag_tpl, [inner_line | lines])
end
end
Loading