Zotonic standard library - a library with hopefully useful functions
Extracted from Zotonic, the Erlang CMS http://zotonic.com/
Due to historical reasons the library is called z_stdlib.
It should be checked out as zotonic_stdlib:
git clone https://github.com/zotonic/z_stdlib.git zotonic_stdlib
The library is also on Hex https://hex.pm/packages/zotonic_stdlib
In your rebar.config file, use Hex (for rebar3):
{deps, [
zotonic_stdlib
]}.
Or, directly git (rebar2):
{deps, [
{zotonic_stdlib, ".*", {git, "https://github.com/zotonic/z_stdlib.git", "master"}}
]}.
The following modules are provided:
Conversion routines for:
- all common data types (binary, boolean, integer, etc.).
- dates: to_utc, to_local, iso8601 parsing
- json, convert to simple json constructs
- IP address conversions
Strict CSS parser and sanitizer.
CSS minifier
Routines for formatting dates. Example:
z_dateformat:format({{2008,12,10},{15,30,0}}, "Y-m-d H:i:s", [ {tz, "GMT"} ]).
Check IP addresses for their presence on DNS block- or allowlists.
Test if an email address is syntactically valid. Extract email address from a text.
Convenience function to make nested directories.
HTML routines like escape, unescape, sanitize, etc.
Match an IP address against lists, check if an IP address is a non routable LAN address.
JavaScript minimizer, removes spaces, comments and newlines.
String routines. To uppercase, lowercase, truncate, trim, utf8 checks, and more.
SVG sanitizer.
Temporary file routines. Make tempfiles, including watch dog process to clean up the file.
UBF-A encoding and decoding routines. Safe for atoms and maximum memory size.
Maps are encoded as a UBF-A list of {Key, Value} tuples followed by the type
tag `map`. For example, #{a => 1, b => 2} is encoded as
#{'b',2}&{'a',1}&`map`$. The pair order is canonicalized by Erlang term order
before encoding. Decoding accepts the pair list and converts it with
maps:from_list/1; duplicate keys follow the same last-value-wins semantics.
URL encode, decode and more.
Fetch the first N bytes of a URL. Protection against too large return body.
Redirects are followed by default. Use {autoredirect, false} to return the
redirect response without contacting its destination. Cross-origin redirects
(scheme, host or effective port changes) default to {authorization_redirect, none}:
caller credentials are removed and the callback receives {authorization, none}.
The callback can replace this default with destination-specific credentials.
Use {authorization_redirect, error} to reject cross-origin redirects carrying
explicit authorization with {error, authorization_redirect}. Same-origin
redirects with explicit authorization still require HTTPS. An explicit caller
option {authorization, none} remains anonymous throughout the request and is
never sent as an HTTP header.
For destination-specific credentials, supply {options_fun, Fun}. Before each
HTTP request, Fun(Method, Url, Options) receives the method, normalized binary
URL and the sanitized caller options without options_fun. Return the request options
for that destination; callback-generated credentials are not carried into the
next request. The caller's explicit {authorization, none} takes precedence over
callback results. Keep transfer settings (device and max_length) in the
original options. Relative redirects, redirect limits and streamed responses
are handled by the fetcher.
OptionsFun = fun(_Method, Url, Options) ->
case uri_string:parse(Url) of
#{scheme := <<"https">>, host := <<"api.example.com">>} ->
[{authorization, <<"Bearer ", Token/binary>>} | Options];
_ -> Options
end
end,
z_url_fetch:fetch(Url, [{options_fun, OptionsFun}]).Fetch URL, extract metadata like mime type, title, description, images etc.
The returned metadata can be queried with z_url_metadata:p/2, for example:
{ok, Metadata} = z_url_metadata:fetch(Url),
Title = z_url_metadata:p(title, Metadata),
Image = z_url_metadata:p(image, Metadata).
JSON-LD data is available through the json_ld property:
JsonLDs = z_url_metadata:p(json_ld, Metadata).
This list contains decoded JSON-LD maps from:
<script type="application/ld+json">blocks.- HTML microdata using
itemscope,itemtype,itemid, anditemprop.
Microdata is normalized to JSON-LD-style maps. Schema.org item types use
<<"https://schema.org">> as <<"@context">> and the local type name as
<<"@type">>. Scoped items with an itemid are added as separate maps in
the list; scoped items without an itemid are embedded as property values of
their parent item. Repeated properties are returned as lists.
To run the test set:
make test
All tests should pass.