From fc945e9b5aecad407321b0de2d79cba07fd4aacc Mon Sep 17 00:00:00 2001 From: Wojtek Mach Date: Sun, 17 May 2020 06:29:34 +0200 Subject: [PATCH] Don't crash on markdown comments, closes #1169 --- lib/ex_doc/markdown/earmark.ex | 45 +++++++++++++++++++++++---- test/ex_doc/markdown/earmark_test.exs | 4 +++ 2 files changed, 43 insertions(+), 6 deletions(-) diff --git a/lib/ex_doc/markdown/earmark.ex b/lib/ex_doc/markdown/earmark.ex index 646a85a05..7dcd00951 100644 --- a/lib/ex_doc/markdown/earmark.ex +++ b/lib/ex_doc/markdown/earmark.ex @@ -55,12 +55,45 @@ defmodule ExDoc.Markdown.Earmark do end end - defp fixup(list) when is_list(list), do: Enum.map(list, &fixup/1) - defp fixup(binary) when is_binary(binary), do: binary - defp fixup({tag, attrs, ast}), do: {fixup_tag(tag), Enum.map(attrs, &fixup_attr/1), fixup(ast)} - defp fixup({tag, attrs, ast, _meta}), do: fixup({tag, attrs, ast}) + defp fixup(list) when is_list(list) do + fixup_list(list, []) + end + + defp fixup(binary) when is_binary(binary) do + binary + end + + defp fixup({tag, attrs, ast}) when is_binary(tag) do + {fixup_tag(tag), Enum.map(attrs, &fixup_attr/1), fixup(ast)} + end + + defp fixup({tag, attrs, ast, _meta}) when is_binary(tag) do + fixup({tag, attrs, ast}) + end + + defp fixup({:comment, _, _}) do + [] + end - defp fixup_tag(tag), do: String.to_atom(tag) + defp fixup_list([head | tail], acc) do + fixed = fixup(head) - defp fixup_attr({name, value}), do: {String.to_atom(name), value} + if fixed == [] do + fixup_list(tail, acc) + else + fixup_list(tail, [fixed | acc]) + end + end + + defp fixup_list([], acc) do + Enum.reverse(acc) + end + + defp fixup_tag(tag) do + String.to_atom(tag) + end + + defp fixup_attr({name, value}) do + {String.to_atom(name), value} + end end diff --git a/test/ex_doc/markdown/earmark_test.exs b/test/ex_doc/markdown/earmark_test.exs index e69995516..4442feeb8 100644 --- a/test/ex_doc/markdown/earmark_test.exs +++ b/test/ex_doc/markdown/earmark_test.exs @@ -15,5 +15,9 @@ defmodule ExDoc.Markdown.EarmarkTest do test "empty input" do assert Markdown.to_ast("", []) == [] end + + test "comments" do + assert Markdown.to_ast("", []) == [] + end end end