Skip to content

Commit b4a4ba5

Browse files
committed
refactor: simplify to_markdown function by removing post-processing argument and updating related calls
1 parent 1e5c09f commit b4a4ba5

File tree

2 files changed

+33
-82
lines changed

2 files changed

+33
-82
lines changed

lib/ex_doc/doc_ast.ex

Lines changed: 24 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -67,81 +67,66 @@ defmodule ExDoc.DocAST do
6767

6868
@doc """
6969
Transform AST into markdown string.
70-
71-
The optional `fun` argument allows post-processing each AST node
72-
after it's been converted to markdown.
7370
"""
74-
def to_markdown(ast, fun \\ fn _ast, string -> string end)
71+
def to_markdown(ast)
7572

76-
def to_markdown(binary, _fun) when is_binary(binary) do
73+
def to_markdown(binary) when is_binary(binary) do
7774
ExDoc.Utils.h(binary)
7875
end
7976

80-
def to_markdown(list, fun) when is_list(list) do
81-
result = Enum.map_join(list, "", &to_markdown(&1, fun))
82-
fun.(list, result)
77+
def to_markdown(list) when is_list(list) do
78+
Enum.map_join(list, "", &to_markdown/1)
8379
end
8480

85-
def to_markdown({:comment, _attrs, inner, _meta} = ast, fun) do
86-
fun.(ast, "<!--#{inner}-->")
81+
def to_markdown({:comment, _attrs, inner, _meta}) do
82+
"<!--#{inner}-->"
8783
end
8884

89-
def to_markdown({:code, attrs, inner, _meta} = ast, fun) do
85+
def to_markdown({:code, attrs, inner, _meta}) do
9086
lang = attrs[:class] || ""
9187

92-
result = """
88+
"""
9389
```#{lang}
9490
#{inner}
9591
```
9692
"""
97-
98-
fun.(ast, result)
9993
end
10094

101-
def to_markdown({:a, attrs, inner, _meta} = ast, fun) do
102-
result = "[#{to_markdown(inner, fun)}](#{attrs[:href]})"
103-
fun.(ast, result)
95+
def to_markdown({:a, attrs, inner, _meta}) do
96+
"[#{to_markdown(inner)}](#{attrs[:href]})"
10497
end
10598

106-
def to_markdown({:hr, _attrs, _inner, _meta} = ast, fun) do
107-
result = "\n\n---\n\n"
108-
fun.(ast, result)
99+
def to_markdown({:hr, _attrs, _inner, _meta}) do
100+
"\n\n---\n\n"
109101
end
110102

111-
def to_markdown({:p, _attrs, inner, _meta} = ast, fun) do
112-
result = to_markdown(inner, fun) <> "\n\n"
113-
fun.(ast, result)
103+
def to_markdown({:p, _attrs, inner, _meta}) do
104+
to_markdown(inner) <> "\n\n"
114105
end
115106

116-
def to_markdown({:br, _attrs, _inner, _meta} = ast, fun) do
117-
result = "\n\n"
118-
fun.(ast, result)
107+
def to_markdown({:br, _attrs, _inner, _meta}) do
108+
"\n\n"
119109
end
120110

121-
def to_markdown({:img, attrs, _inner, _meta} = ast, fun) do
111+
def to_markdown({:img, attrs, _inner, _meta}) do
122112
alt = attrs[:alt] || ""
123113
title = attrs[:title] || ""
124-
result = "![#{alt}](#{attrs[:src]} \"#{title}\")"
125-
fun.(ast, result)
114+
"![#{alt}](#{attrs[:src]} \"#{title}\")"
126115
end
127116

128117
# ignoring these: area base col command embed input keygen link meta param source track wbr
129-
def to_markdown({tag, _attrs, _inner, _meta} = ast, fun) when tag in @void_elements do
130-
result = ""
131-
fun.(ast, result)
118+
def to_markdown({tag, _attrs, _inner, _meta}) when tag in @void_elements do
119+
""
132120
end
133121

134-
def to_markdown({_tag, _attrs, inner, %{verbatim: true}} = ast, fun) do
135-
result = Enum.join(inner, "")
136-
fun.(ast, result)
122+
def to_markdown({_tag, _attrs, inner, %{verbatim: true}}) do
123+
Enum.join(inner, "")
137124
end
138125

139-
def to_markdown({_tag, _attrs, inner, _meta} = ast, fun) do
140-
result = to_markdown(inner, fun)
141-
fun.(ast, result)
126+
def to_markdown({_tag, _attrs, inner, _meta}) do
127+
to_markdown(inner)
142128
end
143129

144-
145130
## parse markdown
146131

147132
defp parse_markdown(markdown, opts) do

lib/ex_doc/formatter/markdown.ex

Lines changed: 9 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ defmodule ExDoc.Formatter.MARKDOWN do
114114
modules_info =
115115
nodes_map.modules
116116
|> Enum.map(fn module_node ->
117-
"- **#{module_node.title}** (#{module_node.id}.md): #{module_node.doc |> extract_summary()}"
117+
"- **#{module_node.title}** (#{module_node.id}.md): #{module_node.doc |> ExDoc.DocAST.synopsis() |> extract_plain_text()}"
118118
end)
119119
|> Enum.join("\n")
120120

@@ -123,7 +123,7 @@ defmodule ExDoc.Formatter.MARKDOWN do
123123
tasks_list =
124124
nodes_map.tasks
125125
|> Enum.map(fn task_node ->
126-
"- **#{task_node.title}** (#{task_node.id}.md): #{task_node.doc |> extract_summary()}"
126+
"- **#{task_node.title}** (#{task_node.id}.md): #{task_node.doc |> ExDoc.DocAST.synopsis() |> extract_plain_text()}"
127127
end)
128128
|> Enum.join("\n")
129129

@@ -157,55 +157,21 @@ defmodule ExDoc.Formatter.MARKDOWN do
157157
project_info <> modules_info <> tasks_info <> extras_info
158158
end
159159

160-
defp extract_summary(nil), do: "No documentation available"
161-
defp extract_summary(""), do: "No documentation available"
162-
163-
defp extract_summary(doc) when is_binary(doc) do
164-
doc
165-
|> String.split("\n")
166-
|> Enum.find("", fn line -> String.trim(line) != "" end)
160+
defp extract_plain_text(html) when is_binary(html) do
161+
html
162+
|> String.replace(~r/<[^>]*>/, "")
163+
|> String.replace(~r/\s+/, " ")
167164
|> String.trim()
168165
|> case do
169166
"" ->
170167
"No documentation available"
171168

172-
summary ->
173-
summary
169+
text ->
170+
text
174171
|> String.slice(0, 150)
175172
|> then(fn s -> if String.length(s) == 150, do: s <> "...", else: s end)
176173
end
177174
end
178175

179-
defp extract_summary(doc_ast) when is_list(doc_ast) do
180-
# For DocAST (which is a list), extract the first text node
181-
extract_first_text_from_ast(doc_ast)
182-
end
183-
184-
defp extract_summary(_), do: "No documentation available"
185-
186-
defp extract_first_text_from_ast([]), do: "No documentation available"
187-
188-
defp extract_first_text_from_ast([{:p, _, content} | _rest]) do
189-
extract_text_from_content(content)
190-
|> String.slice(0, 150)
191-
|> then(fn s -> if String.length(s) == 150, do: s <> "...", else: s end)
192-
end
193-
194-
defp extract_first_text_from_ast([_node | rest]) do
195-
extract_first_text_from_ast(rest)
196-
end
197-
198-
defp extract_text_from_content([]), do: ""
199-
defp extract_text_from_content([text | _rest]) when is_binary(text), do: text
200-
201-
defp extract_text_from_content([{_tag, _attrs, content} | rest]) do
202-
case extract_text_from_content(content) do
203-
"" -> extract_text_from_content(rest)
204-
text -> text
205-
end
206-
end
207-
208-
defp extract_text_from_content([_node | rest]) do
209-
extract_text_from_content(rest)
210-
end
176+
defp extract_plain_text(_), do: "No documentation available"
211177
end

0 commit comments

Comments
 (0)