kevsmith / herml Goto Github PK
View Code? Open in Web Editor NEWErlang port of Haml
Home Page: http://weblog.hypotheticalabs.com
Erlang port of Haml
Home Page: http://weblog.hypotheticalabs.com
The Leex is included in Erlang R13B01 does not work with outdir option.
To make Herml work for this Erlang version, Makefile should be changed to:
leex:file("src/herml_scan.xrl")
In README:
render(CompiledTemplate, Env)
In source code:
render(Template, Offset) ->
render(Template, [], Offset).
Although it spawns processes, I doubt that herml_manager may be a bottle neck.
I propose that a template be compiled to a module in-memory (the module name can be referred from the template path implicitly, or specified explicitly) with a function "render" so that it can render itself.
In other words, a template is converted into code instead of data. This way, the Erlang VM caches and manages the templates for us efficiently. When we want to render, just call it. When we want to update a template, just recompile it and the Erlang VM will automatically replace the old code with the new one for us.
For example, the library "erlang-gettext" can compile a plain text .po file to a module elegantly like this:
http://github.com/davide/erlang-gettext/blob/baee1560a705d1337fa05be822fde57abef1d312/src/gettext_generate.erl
For a feeling, ErlyDTL is working like this:
erlydtl:compile("/path/to/welcome.html", welcome_template),
welcome_template:render([
{name, "Johnny"},
{friends, [<<"Frankie Lee">>, <<"Judas Priest">>]},
{primes, [1, 2, "3", <<"5">>]}
]).
I'm new to AST. I found some instruction here:
http://www.evanmiller.org/write-a-template-compiler-for-erlang.html
Hi, nice stuff!
However I noticed that it fails to parse some common hamls:
%h1 Some title
or
%p
nice
%span Chicken Fried
I've found Herml (tested on 2942bd1) to hang in parser-generated code on the following template:
!!!
%html
%head
%meta[{charset,"utf-8"}]/
Generated parser continued to recursively call itself herml_scan:string/4
in an endless loop, quickly hogging all memory. Unfortunately, I'm too newbie to Erlang and leex, so I don't really understand why this happens. Anyway, the calls are occurring in this way:
...
string/4(",\"utf-8\"}]/", 1, ",\"utf-8\"}]/", [{chr,1,"charset"},{lcurly,1,[123]},{lbrace,1,[91]},{chr,1,[109,101,116,97]},{tag_start,1,[37]}])
string/4("\"utf-8\"}]/", 1, "\"utf-8\"}]/", [{comma,1,[44]},{chr,1,"charset"},{lcurly,1,[123]},{lbrace,1,[91]},{chr,1,[109,101,116,97]},{tag_start,1,[37]}])
string/4("\"utf-8\"}]/", 1, "\"utf-8\"}]/", [{pipe,1,[]},{comma,1,[44]},{chr,1,"charset"},{lcurly,1,[123]},{lbrace,1,[91]},{chr,1,[109,101,116,97]},{tag_start,1,[37]}])
string/4("\"utf-8\"}]/", 1, "\"utf-8\"}]/", [{pipe,1,[]},{pipe,1,[]},{comma,1,[44]},{chr,1,"charset"},{lcurly,1,[123]},{lbrace,1,[91]},{chr,1,[109,101,116,97]},{tag_start,1,[37]}])
string/4("\"utf-8\"}]/", 1, "\"utf-8\"}]/", [{pipe,1,[]},{pipe,1,[]},{pipe,1,[]},{comma,1,[44]},{chr,1,"charset"},{lcurly,1,[123]},{lbrace,1,[91]},{chr,1,[109,101,116,97]},{tag_start,1,[37]}])
string/4("\"utf-8\"}]/", 1, "\"utf-8\"}]/", [{pipe,1,[]},{pipe,1,[]},{pipe,1,[]},{pipe,1,[]},{comma,1,[44]},{chr,1,"charset"},{lcurly,1,[123]},{lbrace,1,[91]},{chr,1,[109,101,116,97]},{tag_start,1,[37]}])
...
There are certainly no "|" characters in template, and I really don't know why {pipe,1,[]}
is there.
After some mindless fiddling, I've found that similiar hangs happen on intentionally malformed %meta[{charset,"utf-8}]/
(missing second double quote) code, and when there are any "unknown" characters (for example, UTF-8 Cyrillic).
I've attempted to fix the issue with drdaeman/herml@58b4958, but due to a lack of expertise I don't know whenever this is the proper solution, or it just happen to work.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.