ModestEx
A library to do pipeable transformations on html strings with CSS selectors, e.g. find(), prepend(), append(), replace() etc.
Elixir/Erlang bindings for lexborisov's Modest
Modest is a fast HTML renderer implemented as a pure C99 library with no outside dependencies.
-
Modest
- HTML5 parsing library in pure C99
- fully conformant with the HTML5 spec
- modest_html (Wrapper library)
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.
-
nodex
- distributed Elixir
- save binding with C-Nodes
C-Nodes are external os-processes that communicate with the Erlang VM through erlang messaging. That way you can implement native code and call into it from Elixir in a safe predictable way. The Erlang VM stays unaffected by crashes of the external process.
Example
Total 16 features implemented. See complete feature list.
Build transformation pipelines...
test "build up a complete DOM" do
result = ""
|> ModestEx.serialize()
|> ModestEx.append("body", "<div>")
|> ModestEx.set_attribute("div", "class", "col-md-12")
|> ModestEx.append("div", "<div>")
|> ModestEx.set_attribute("div.col-md-12 div", "class", "col-md-6")
|> ModestEx.append("div.col-md-12 div", "<a></a>")
|> ModestEx.set_text("a", "Hello")
copy = ModestEx.find(result, "div.col-md-12 div")
|> ModestEx.set_text("a", "World")
result = ModestEx.insert_after(result, "div.col-md-12 div", copy)
|> ModestEx.set_attribute("div.col-md-6:first-of-type a", "href", "https://elixir-lang.org")
|> ModestEx.set_attribute("div.col-md-6:last-of-type a", "href", "https://google.de")
assert result == "<div class=\"col-md-12\"><div class=\"col-md-6\"><a href=\"https://elixir-lang.org\">Hello</a></div><div class=\"col-md-6\"><a href=\"https://google.de\">World</a></div></div>"
end
Supported CSS Selectors
All common CSS Selectors are supported. Total 38 selector patterns implemented. See complete list of supported CSS selectors.
Installation
Available on hex.
def deps do
[
{:modest_ex, "~> 1.0.1"}
]
end
Target dependencies
cmake 3.x
erlang-dev
erlang-xmerl
erlang-parsetools
Compile and test
mix deps.get
mix compile
mix test
Cloning
git clone git@github.com:f34nk/modest_ex.git
cd modest_ex
All binding targets are added as submodules in the target/
folder.
git submodule update --init --recursive --remote
mix deps.get
mix compile
mix test
mix test.target
Cleanup
mix clean
Roadmap
See CHANGELOG.
-
Bindings
- Call as C-Node
- Call as dirty-nif
-
Tests
- Call as C-Node
- Call as dirty-nif
- Target tests
- Feature tests
- Package test
-
Features
- Find nodes using a CSS selector
- Serialize any string with valid or broken html
- Get attribute with optional CSS selector
- Set attribute with optional CSS selector
- Get text with optional CSS selector
- Set text with optional CSS selector
- Remove a node from html
- Append node to another node
- Prepend node to another node
- Insert node before another node
- Insert node after another node
- Replace node with another node
- Slice html to a subset of nodes
- Get position of node in relation to its parent
- Wrap node with another node
- Pretty print html
- Compare two html strings (see here)
- Transform html string by list of actions
- Custom CSS selector for pseudo class ":contains(text)" implemented in Modest
- Scope flag to control serialization
- List of supported CSS Selectors
- Documentation
- Publish as hex package
License
ModestEx is under LGPL license. Check the LICENSE file for more details.
Icon Credit
humble by Eliricon from the Noun Project