Packages
html_to_markdown
3.6.14
3.9.0
3.8.3
3.8.2
3.8.1
3.8.0
3.8.0-rc.2
3.8.0-rc.1
3.7.2
3.7.1
3.7.0
3.6.21
3.6.20
3.6.19
3.6.18
3.6.17
3.6.16
3.6.15
3.6.14
3.6.13
3.6.11
3.6.10
3.6.9
3.6.8
3.6.3
3.6.1
3.6.0
3.6.0-rc.25
3.6.0-rc.23
3.6.0-rc.22
3.6.0-rc.21
3.6.0-rc.20
3.6.0-rc.17
3.6.0-rc.16
3.6.0-rc.14
3.6.0-rc.13
3.6.0-rc.12
3.6.0-rc.11
3.6.0-rc.10
3.6.0-rc.9
3.6.0-rc.7
3.6.0-rc.3
3.6.0-rc.2
3.6.0-rc.1
3.5.7
3.5.5
3.5.3
3.5.2
3.5.1
3.5.0
3.5.0-rc.1
3.4.0
3.4.0-rc.45
3.4.0-rc.44
3.4.0-rc.42
3.4.0-rc.41
3.4.0-rc.40
3.4.0-rc.25
3.4.0-rc.24
3.4.0-rc.23
3.4.0-rc.21
3.4.0-rc.20
3.4.0-rc.18
3.4.0-rc.16
3.4.0-rc.15
3.4.0-rc.14
3.4.0-rc.13
3.4.0-rc.12
3.4.0-rc.11
3.4.0-rc.9
3.4.0-rc.8
3.4.0-rc.2
3.4.0-rc.1
3.3.2
3.2.4
3.2.2
3.2.1
3.2.0
3.1.0
3.0.2
3.0.1
3.0.0
2.30.0
2.29.0
2.28.6
2.28.5
2.28.4
2.28.3
2.28.2
2.28.1
2.28.0
2.27.3
2.27.2
2.27.1
2.27.0
2.26.3
2.26.2
2.26.1
2.25.1
2.25.0
2.24.6
2.24.5
2.24.4
2.24.3
2.24.1
2.23.4
2.23.3
2.23.2
2.23.1
2.23.0
2.22.5
2.22.2
2.22.1
2.22.0
2.21.1
2.20.0
2.19.8
2.19.7
2.19.6
2.19.5
2.19.4
2.19.3
2.19.2
2.19.1
2.19.0
2.18.0
2.16.1
2.16.0
2.15.0
2.14.11
2.14.10
2.14.9
2.14.8
2.14.7
2.14.6
2.14.3
2.14.2
2.14.1
2.14.0
2.13.0
2.12.1
2.12.0
2.11.4
2.11.3
2.11.1
2.10.1
2.9.2
2.9.1
2.9.0
2.8.3
High-performance HTML to Markdown converter
Current section
Files
Jump to
Current section
Files
lib/html_to_markdown.ex
# This file is auto-generated by alef — DO NOT EDIT.
# alef:hash:062af823ed98b7935d68fff25ccea119ed4a579bc0e6041cc4ba5bac31f7be1b
# To regenerate: alef generate
# To verify freshness: alef verify --exit-code
defmodule HtmlToMarkdown do
@moduledoc "High-level API for html_to_markdown"
@doc "Convert HTML to Markdown, Djot, or plain text."
@spec convert(String.t()) :: {:ok, map()} | {:error, atom, String.t()}
def convert(html) do
HtmlToMarkdown.Native.convert(html, nil)
end
@doc "Convert HTML to Markdown, Djot, or plain text."
@spec convert(String.t(), String.t() | nil) :: {:ok, map()} | {:error, atom, String.t()}
def convert(html, options) when is_map(options) do
{visitor, clean_opts} = Map.pop(options, :visitor)
if is_map(visitor) do
{:ok, _} =
HtmlToMarkdown.Native.convert_with_visitor(
html,
if(map_size(clean_opts) == 0, do: nil, else: Jason.encode!(clean_opts)),
visitor
)
do_visitor_receive_loop(visitor)
else
HtmlToMarkdown.Native.convert(html, if(map_size(clean_opts) == 0, do: nil, else: Jason.encode!(clean_opts)))
end
end
def convert(html, nil) do
HtmlToMarkdown.Native.convert(html, nil)
end
@doc false
defp do_visitor_receive_loop(visitor) do
receive do
{:visitor_callback, ref_id, callback_name, args_json} ->
result =
case Map.get(visitor, callback_name) do
nil -> "Continue"
fun -> apply_visitor_callback(fun, args_json)
end
HtmlToMarkdown.Native.visitor_reply(ref_id, result)
do_visitor_receive_loop(visitor)
{:ok, result} ->
{:ok, result}
{:error, reason} ->
{:error, reason}
after
30_000 ->
{:error, "visitor callback timeout after 30s"}
end
end
@doc false
defp apply_visitor_callback(fun, args_json) do
args = Jason.decode!(args_json)
result = fun.(args)
case result do
"Continue" -> "Continue"
:Continue -> "Continue"
"Skip" -> "Skip"
:Skip -> "Skip"
"PreserveHtml" -> "PreserveHtml"
:PreserveHtml -> "PreserveHtml"
{:custom, value} -> to_string(value)
binary when is_binary(binary) -> binary
_ -> "Continue"
end
end
end