Deklarativna

A declarative HTML embedded DSL

Purpose

The purpose of Deklarativna is to make HTML template creation an integrated part of frontend development, allowing the programmer to write human readable code with not much effort.

Conception

This work has been started as a tool for teaching declarative programming and DSL creation to universitary students. This is a work in progress and I hope someday will have integration with the most popular web frameworks

Current Status

All HTML common tags are implemented. Full support for XML tags with xml_single_tag and xml_double_tag is added.

Updates

Sinatra integration is demonstrated on the examples
HTML/XML Fully supported
rubygem released

Next Steps:

Rails plugin
CSS 2, 3 wrapper??
jQuery helpers ??

Installation

You can download this gem from RubyGems.org by running

$ gem install deklarativna

Usage

Function Based Approach

require 'deklarativna'
require 'deklarativna_utils'

include Deklarativna
include DeklarativnaUtils

renderable = html {[
              head {
                  css {
                      ".hello { float: right; color: #456546 }"
                  }
              },
              body {
                  p("class"=>"hello") {
                      "Hello World!"
                  }
              }
            ]}

HTMLExporter.new.launch_rendered_html_on_browser renderable

Class Based Approach

require 'deklarativna'
require 'deklarativna_utils'

class ChildTemplate < BaseTemplate
  def _head
    css { "h1 { color: red; }" }
  end

  def _body
    [
      h1 { "Deklarativna" },
      p { "how cool is this??" },
      p { "really cool" }
    ]
  end
end

include DeklarativnaUtils

HTMLExporter.new.launch_rendered_html_on_browser ChildTemplate.new.render

Sinatra Integration

require 'rubygems'
require 'sinatra/base'
require 'deklarativna'

class IndexTemplate < BaseTemplate
  def _body
    [
      p { "Testing Dinamic File Generation using sinatra" },
      table("border"=>"1") {[
        tr {[
          td { "row 1, value 1" },
          td { "row 1, value 2" }
        ]},
        tr {[
          td("colspan"=>"2") { "Only value in this row" }
        ]}
      ]}
    ]
  end
end

class DeklarativnaSinatra < Sinatra::Base
  get '/' do
    IndexTemplate.new.render
  end
end

DeklarativnaSinatra.run!

Test this by running

$ ruby dinamic_sinatra_example.rb

And open your browser on localhost:4567

Now you can surf the examples on the examples directory! There are some pretty cool examples, and I will be publishing more complex examples over time.

I'm coding a blog using Deklarativna, Check it out! https://github.com/dlitvakb/Blogging-Deklarativna