Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Sign inDemoInstall
Socket

faml

Package Overview
Dependencies
Maintainers
1
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

faml

  • 0.8.1
  • Rubygems
  • Socket score

Version published
Maintainers
1
Created
Source

Faml

Gem Version Build Status Coverage Status Code Climate

Faster implementation of Haml template language.

Installation

Add this line to your application's Gemfile:

gem 'faml'

And then execute:

$ bundle

Or install it yourself as:

$ gem install faml

Usage

You can set several options via Faml::Engine.options .

# Render in XHTML format
Faml::Engine.options[:format] = :xhtml
# Disable autoclose
Faml::Engine.options[:autoclose] = []
# Disable auto preserve
Faml::Engine.options[:preserve] = []

Rails, sinatra

Just replace your gem 'haml' with gem 'faml' .

faml is only tested with Rails >= 4.0.

middleman

Since middleman has its own renderers, there's no easy way to use faml with middleman currently.

Others

faml provide a tilt interface. If your framework uses tilt, you can use faml by replacing gem 'haml' with gem 'faml' .

Incompatibilities

There are several incompatibilities.

See incompatibilities for details generated by spec files.

Hash attributes

Hash attributes are only supported to "data" attributes.

With original haml, %span{foo: {bar: 'baz'}} is rendered as <span foo-bar='baz'></span> . With faml, it's rendered as <span foo='{:bar=&gt;&quot;baz&quot;}'></span> .

Only "data" attributes are converted to hyphenated attributes.

HTML-escape by default

Even with non-Rails project, all string are HTML-escaped.

"ugly" mode only

Only "ugly" mode in original haml is supported.

%div
  %div hello

is always rendered as

<div>
<div>hello</div>
</div>

It's equivalent to haml's "ugly" mode.

No Haml::Helpers by default

I won't provide helper methods of Haml::Helpers. If you really need helper methods, please open an issue.

Only preserve helper method is supported by engine option. You have to set Faml::Engine.options[:extend_helpers] = true to use preserve .

Others

If you find other incompatibility, please report it to me :-p.

Why is faml faster?

Temple backend

I use temple to achieve faster template rendering. It's used by slim template language & engine which is known as fast.

  1. HamlParser::Parser converts source language (Haml template) to own AST (HamlParser::Ast) .
    • You can see the HamlParser::Ast by running haml_parser template.haml .
  2. Faml::Compiler compiles HamlParser::Ast into Temple AST.
    • You can see the Temple AST by running faml temple template.haml .
  3. Temple compiles its AST into Ruby code.
    • You can see the Ruby code by running faml compile template.haml .
    • During this process, several optimizations are performed such as Temple::Filters::MultiFlattener and Temple::Filters::StaticMerger.

Attribute optimization

Although Haml allows arbitrary Ruby hash in the attribute syntax, most attributes are written in hash literal form. All keys are string or symbol literals (i.e., not dynamic values) in typical case.

%div{class: some_helper_method(current_user)}
  %a{href: foo_path(@item)}= @item.name

There is an optimization chance if we could know the value is String. I introduced incompatibility to expand the chance: all attribute values are converted to String by #to_s except for id, class and data . This will enable us to avoid runtime expensive hash merging and rendering. The runtime hash merging is implemented by C extension in faml.

Internally, attributes are categolized into three types.

  1. Static attributes
    • Both the key and the value are static.
    • Compiled into string literals.
    • Fastest.
    • e.g. %input{checked: false}
  2. Dynamic attributes
    • The key is static but the value isn't.
    • The key is compiled into string literal. The value is interpolated at run-time.
    • Relatively fast.
    • e.g. %input{checked: helper_method(@record)}
  3. Runtime attributes
    • Both the key and the value are non-static expression.
    • The attributes are stringified at runtime.
    • Slow.
    • e.g. %input{helper_method(@record)}

Contributing

  1. Fork it ( https://github.com/eagletmt/faml/fork )
  2. Create your feature branch (git checkout -b my-new-feature)
  3. Commit your changes (git commit -am 'Add some feature')
  4. Push to the branch (git push origin my-new-feature)
  5. Create a new Pull Request

FAQs

Package last updated on 27 Feb 2016

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc