HTML2Text - extract readable plain text from HTML using Rust NIF

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_mode option: :ignore (default), {:replace, text}, or :filename
  • Updated html2text Rust crate from 0.15.1 to 0.16.7 (rowspan support, bug fixes)
  • HTML2Text.Error custom exception for bang functions
2 Likes