Page Menu
Home
Phorge
Search
Configure Global Search
Log In
Files
F85651256
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Award Token
Flag For Later
Size
4 KB
Referenced Files
None
Subscribers
None
View Options
diff --git a/lib/fast_html.ex b/lib/fast_html.ex
index 58ec125..387278c 100644
--- a/lib/fast_html.ex
+++ b/lib/fast_html.ex
@@ -1,102 +1,77 @@
defmodule :fast_html do
@moduledoc """
A module to decode html into a tree structure.
Based on [Alexander Borisov's myhtml](https://github.com/lexborisov/myhtml),
this binding gains the properties of being html-spec compliant and very fast.
-
- ## Example
-
- iex> :fast_html.decode("<h1>Hello world</h1>")
- {:ok, {"html", [], [{"head", [], []}, {"body", [], [{"h1", [], ["Hello world"]}]}]}}
-
- Benchmark results (removed Nif calling mode) on various file sizes on a 2,5Ghz Core i7:
-
- Settings:
- duration: 1.0 s
-
- ## FileSizesBench
- [15:28:42] 1/3: github_trending_js.html 341k
- [15:28:46] 2/3: w3c_html5.html 131k
- [15:28:48] 3/3: wikipedia_hyperlink.html 97k
-
- Finished in 7.52 seconds
-
- ## FileSizesBench
- benchmark name iterations average time
- wikipedia_hyperlink.html 97k 1000 1385.86 µs/op
- w3c_html5.html 131k 1000 2179.30 µs/op
- github_trending_js.html 341k 500 5686.21 µs/op
"""
@type tag() :: String.t() | atom()
@type attr() :: {String.t(), String.t()}
@type attr_list() :: [] | [attr()]
@type comment_node() :: {:comment, String.t()}
@type comment_node3() :: {:comment, [], String.t()}
@type tree() ::
{tag(), attr_list(), tree()}
| {tag(), attr_list(), nil}
| comment_node()
| comment_node3()
@type format_flag() :: :html_atoms | :nil_self_closing | :comment_tuple3
@doc """
Returns a tree representation from the given html string.
- ## Examples
+ `opts` is a keyword list of options, the options available:
+ * `timeout` - Call timeout
+ * `format` - Format flags for the tree
+
+ The following format flags are available:
+
+ * `:html_atoms` uses atoms for known html tags (faster), binaries for everything else.
+ * `:nil_self_closing` uses `nil` to designate self-closing tags and void elements.
+ For example `<br>` is then being represented like `{"br", [], nil}`.
+ See http://w3c.github.io/html-reference/syntax.html#void-elements for a full list of void elements.
+ * `:comment_tuple3` uses 3-tuple elements for comments, instead of the default 2-tuple element.
+ ## Examples
iex> :fast_html.decode("<h1>Hello world</h1>")
{:ok, {"html", [], [{"head", [], []}, {"body", [], [{"h1", [], ["Hello world"]}]}]}}
+ iex> :fast_html.decode("Hello world", timeout: 0)
+ {:error, :timeout}
+
iex> :fast_html.decode("<span class='hello'>Hi there</span>")
{:ok, {"html", [],
[{"head", [], []},
{"body", [], [{"span", [{"class", "hello"}], ["Hi there"]}]}]}}
iex> :fast_html.decode("<body><!-- a comment --!></body>")
{:ok, {"html", [], [{"head", [], []}, {"body", [], [comment: " a comment "]}]}}
iex> :fast_html.decode("<br>")
{:ok, {"html", [], [{"head", [], []}, {"body", [], [{"br", [], []}]}]}}
- """
- @spec decode(String.t()) :: {:ok, tree()} | {:error, String.t() | atom()}
- def decode(bin) do
- decode(bin, format: [])
- end
-
- @doc """
- Returns a tree representation from the given html string.
-
- This variant allows you to pass in one or more of the following format flags:
-
- * `:html_atoms` uses atoms for known html tags (faster), binaries for everything else.
- * `:nil_self_closing` uses `nil` to designate self-closing tags and void elements.
- For example `<br>` is then being represented like `{"br", [], nil}`.
- See http://w3c.github.io/html-reference/syntax.html#void-elements for a full list of void elements.
- * `:comment_tuple3` uses 3-tuple elements for comments, instead of the default 2-tuple element.
-
- ## Examples
iex> :fast_html.decode("<h1>Hello world</h1>", format: [:html_atoms])
{:ok, {:html, [], [{:head, [], []}, {:body, [], [{:h1, [], ["Hello world"]}]}]}}
iex> :fast_html.decode("<br>", format: [:nil_self_closing])
{:ok, {"html", [], [{"head", [], []}, {"body", [], [{"br", [], nil}]}]}}
iex> :fast_html.decode("<body><!-- a comment --!></body>", format: [:comment_tuple3])
{:ok, {"html", [], [{"head", [], []}, {"body", [], [{:comment, [], " a comment "}]}]}}
iex> html = "<body><!-- a comment --!><unknown /></body>"
iex> :fast_html.decode(html, format: [:html_atoms, :nil_self_closing, :comment_tuple3])
{:ok, {:html, [],
[{:head, [], []},
{:body, [], [{:comment, [], " a comment "}, {"unknown", [], nil}]}]}}
"""
@spec decode(String.t(), format: [format_flag()]) ::
{:ok, tree()} | {:error, String.t() | atom()}
- def decode(bin, format: flags) do
- FastHtml.Cnode.call({:decode, bin, flags})
+ def decode(bin, opts \\ []) do
+ flags = Keyword.get(opts, :format, [])
+ timeout = Keyword.get(opts, :timeout, 10000)
+ FastHtml.Cnode.call({:decode, bin, flags}, timeout)
end
end
File Metadata
Details
Attached
Mime Type
text/x-diff
Expires
Sun, Aug 30, 3:32 PM (1 d, 17 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
1738050
Default Alt Text
(4 KB)
Attached To
Mode
R16 fast_html
Attached
Detach File
Event Timeline
Log In to Comment