Packages
html_to_markdown
2.24.3
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/preprocessing_options.ex
defmodule HtmlToMarkdown.PreprocessingOptions do
@moduledoc """
Configuration for HTML preprocessing before conversion.
"""
@type preset :: :minimal | :standard | :aggressive
@preset_strings %{
minimal: "minimal",
standard: "standard",
aggressive: "aggressive"
}
@preset_atoms Map.new(@preset_strings, fn {k, v} -> {v, k} end)
defstruct enabled: true,
preset: :standard,
remove_navigation: true,
remove_forms: true
@type t :: %__MODULE__{
enabled: boolean(),
preset: preset(),
remove_navigation: boolean(),
remove_forms: boolean()
}
@doc """
Build preprocessing options from a map/keyword list/struct.
"""
@spec new(t() | map() | keyword() | nil) :: t()
def new(nil), do: %__MODULE__{}
def new(%__MODULE__{} = opts), do: opts
def new(attrs) when is_list(attrs) or is_map(attrs) do
attrs = attrs |> Map.new() |> Enum.reduce(%{}, &normalize_entry/2)
struct(%__MODULE__{}, attrs)
end
defp normalize_entry({key, value}, acc) do
case normalize_key(key) do
nil ->
acc
normalized_key ->
Map.put(acc, normalized_key, normalize_value(normalized_key, value))
end
end
defp normalize_key(key) when is_atom(key) do
if key in [:enabled, :preset, :remove_navigation, :remove_forms], do: key, else: nil
end
defp normalize_key(key) when is_binary(key) do
key
|> String.trim()
|> String.replace("-", "_")
|> String.to_existing_atom()
rescue
_ -> nil
end
defp normalize_key(_), do: nil
defp normalize_value(:preset, value) when value in [:minimal, :standard, :aggressive], do: value
defp normalize_value(:preset, value) when is_binary(value) do
normalized =
value
|> String.trim()
|> String.downcase()
|> String.replace("-", "_")
Map.get(@preset_atoms, normalized, :invalid)
end
defp normalize_value(:preset, value), do: value
defp normalize_value(_, value) when is_boolean(value), do: value
defp normalize_value(_, value) when value in [0, 1], do: value == 1
defp normalize_value(_, _value), do: true
@doc false
@spec to_map(t()) :: map()
def to_map(%__MODULE__{} = opts) do
preset =
cond do
is_atom(opts.preset) ->
Map.get(@preset_strings, opts.preset, Atom.to_string(opts.preset))
is_binary(opts.preset) ->
opts.preset
true ->
to_string(opts.preset)
end
%{
"enabled" => opts.enabled,
"preset" => preset,
"remove_navigation" => opts.remove_navigation,
"remove_forms" => opts.remove_forms
}
end
end