fuelen

fuelen

HTML2Text - extract readable plain text from HTML using Rust NIF

HTML2Text provides a simple and efficient way to extract readable plain text from HTML content. It leverages the power of Rust’s html2text crate to deliver fast HTML parsing and text extraction while maintaining the logical structure and readability of the content.

https://github.com/fuelen/html2text

Most Liked

fuelen

fuelen

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
fuelen

fuelen

html2text v0.2.0 released — breaking changes and a cleaner API!

This version introduces a new, more consistent API with proper error handling and an optional keyword list for configuration.


What changed

Before (v0.1.x):

HTML2Text.convert(html, width)
# => returns plain string
  • The second argument was required and only accepted a width (integer or :infinity)
  • Errors (like width too narrow) would raise directly

Now (v0.2.0):

HTML2Text.convert(html, opts)
# => {:ok, result} | {:error, reason}

HTML2Text.convert!(html, opts)
# => result (raises on error)
  • convert/2 now returns {:ok, text} or {:error, reason}
  • convert!/2 is a new function that raises on error (for convenience)
  • The second parameter is now an optional keyword list of options

Where Next?

Popular in Announcing Top

treble37
Just looking for a little feedback on a tiny helper library I built - Sometimes I find the need to convert maps with atom keys to maps w...
New
mbuhot
Leverage Open Api 3.0 (Swagger) to document, test, validate and explore your Plug and Phoenix APIs. Generate and serve a JSON Open API ...
New
kip
ex_cldr provides localisation and internationalisation support based upon the data from the Unicode CLDR project. Unicode released CLDR ...
407 13366 120
New
dominicletz
Hi, I thought I had posted my library before but seems I hadn’t. The project is still in early stages but it’s growing and so I think it...
New
mplatts
With HEEX released we decided to start a components library using Tailwind CSS - check it out here: Petal Components. We also have a boi...
New
wojtekmach
Hey everyone! Req is an HTTP client for Elixir that I’ve been working on for quite some time. There is already a lot of HTTP clients out...
New
markmark206
simple_feature_flags is a tiny package that lets you turn features on or off based on which environment (e.g. localhost, staging, product...
New

Other popular topics Top

rms.mrcs
Hi, I need to transform a list of numbers into a map where the keys are the indexes and the values are the original values of the list. ...
New
electic
Hi, I am new to Elixir. I am trying to use the DateTime component to insert a date into MySQL however the there seems to be no way to fo...
New
New
vonH
When I run the Plug and I recompile I wind up having to use Ctrl C to quit iex and start again. Witht the help of rlwrap I can use the cu...
New
JakeBecker
TL;DR: I’ve just released an implementation of Microsoft’s IDE-independent Language Server Protocol for Elixir. It adds language support ...
1144 55125 245
New
alice
Hey, Just curious what are the main benefits of Elixir compared to Clojure? When is Elixir more useful than Clojure and vice versa? Th...
New

We're in Beta

About us Mission Statement