Current section

Files

Jump to
html_to_markdown lib html_to_markdown.ex
Raw

lib/html_to_markdown.ex

# This file is auto-generated by alef — DO NOT EDIT.
# alef:hash:585c7ebe9e143ecddb26d8c355cfffd7a24a39547485dcb8ef6b8ba2316e8d41
# 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"
:preserve_html -> "PreserveHtml"
{:custom, value} -> to_string(value)
binary when is_binary(binary) -> binary
_ -> "Continue"
end
end
end