v0.3.0 is out with two major additions: annotated rich text output and an inspectable HTML container.
Rich text (convert_rich/2)
Returns structured {text, [annotation]} tuples instead of formatted strings, so you can build your own renderer (Slack, Discord, email, etc.):
HTML2Text.convert_rich("<p>Hello <strong>world</strong></p>")
#=> {:ok, [[{"Hello ", []}, {"world", [:strong]}]]}
HTML2Text.convert_rich(~s(<a href="https://example.com"><em>click</em></a>))
#=> {:ok, [[{"click", [{:link, "https://example.com"}, :emphasis]}]]}
Annotations: :strong, :emphasis, :strikeout, :code, {:link, url}, {:image, src}, {:preformat, bool}, {:colour, {r, g, b}}, {:bg_colour, {r, g, b}}.
CSS colour extraction is supported via use_doc_css: true (parses <style> tags and inline styles).
HTML container (HTML2Text.HTML)
A struct that renders HTML as formatted text when inspected in IEx — bold, italic, clickable links (OSC 8), CSS true color, and more:
%{subject: "Alert", body: HTML2Text.HTML.new(email_html)}
# In IEx you see formatted text instead of raw tags:
# %{subject: "Alert", body: #HTML2Text.HTML<
# Dear customer,
# Your order has been shipped.
# >}
Short content stays inline: #HTML2Text.HTML<bold>. to_string/1 returns the original HTML.
Other changes
empty_img_modeoption::ignore(default),{:replace, text}, or:filename- Updated
html2textRust crate from 0.15.1 to 0.16.7 (rowspan support, bug fixes) HTML2Text.Errorcustom exception for bang functions






















