f34nk
ModestEx - Pipeable transformations on html strings (with CSS selectors)
Hello!
I just published my first draft of ModestEx, a Elixir/Erlang binding to lexborisov’s Modest library.
Modest is a fast HTML renderer implemented as a pure C99 library with no outside dependencies.
ModestEx exposes features to do pipeable transformations on html strings with CSS selectors, e.g. find(), prepend(), append(), replace() etc.
iex> ModestEx.find("<p><a>Hello</a> World</p>", "p a")
{:ok, "<a>Hello</a>"}
iex> ModestEx.serialize("<div>Hello<span>World")
{:ok, "<html><head></head><body><div>Hello<span>World</span></div></body></html>"}
The binding is implemented as a C-Node following the excellent example in @Overbryd 's package nodex. If you want to learn how to set up bindings to C/C++, you should definitely check it out.
Before that I experimented with a lot of other Html parser libraries like gumbo-parser, gumbo-query and GQ. I even implemented a binding package called gumbo_query_ex.
However Modest is currently the most active and most promising.
This project is under development!
Stay tuned for more features like ModestEx.remove, ModestEx.prepend, ModestEx.append…
Tell me what you think ![]()
Best, F34nk
First Post!
Most Liked
f34nk
Release v1.0.0
This release is stable.
def deps do
[
{:modest_ex, "~> 1.0.0"}
]
end
Total 16 features implemented. See complete feature list.
Total 38 selector patterns implemented (including custom selector :contains(text)).
See complete list of supported CSS selectors.
The package includes all binding code under the folder target/modest_worker.
All Modest related features are implemented in a single C library called modest_html.
This way, all features are tested in a C environment using CMake/CTest with memory tracking enabled using a library called dmt.
Please feel invited to check it out ![]()
Best, F34nk
f34nk
Thanks guys!
I have a use case where a request reads html from a database and before rendering I need to do some changes on the html string. In my case the html is quite large and the changes are quite extensive.
The idea for ModestEx is to implement a set of features that just do transformations on a html string. Each transformation feature will be done in C.
Something like:
result ModestEx.find("<p><a>Hello</a> World</p>", "p a")
|> ModestEx.attribute("href", "https://elixir-lang.org")
will return:
{:ok, "<a href=\"https://elixir-lang.org\">Hello</a>"}
… ready to render in a template.
Or you could also serialize it:
ModestEx.serialize(result)
and return:
{:ok, "<html><head></head><body><a href=\"https://elixir-lang.org\">Hello</a></body></html>"}
Which is already a (more or less) valid page!
Of course, if you need further decoding htmlex, floki or Meeseeks are great!
I see ModestEx as a useful addition to the landscape of html tools in Elixir.
f34nk
Hey @mischov @OvermindDL1
I just published ModestEx v0.0.2-dev.
Thanks again for your input. It’s a lot clearer now what the main strength of the library actually is!
I added a new feature ModestEx.get_attribute and ModestEx.set_attribute.
And you can actually pipe them together.
iex> ModestEx.find("<p><a>Hello</a><a>World</a></p>", "p a") |>
...> ModestEx.set_attribute("href", ["https://elixir-lang.org", "https://google.de"])
["<html><head></head><body><a href=\"https://elixir-lang.org\">Hello</a></body></html>", "<html><head></head><body><a href=\"https://google.de\">World</a></body></html>"]
Last Post!
f34nk
Popular in Announcing
Other popular topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #websockets
- #supervisor
- #elixirconf-us
- #advent-of-code
- #distillery
- #processes
- #api
- #forms
- #metaprogramming
- #security
- #hex









