From e1d758ddf72d7d8cd29bb0170abcf1397bd67f71 Mon Sep 17 00:00:00 2001 From: Nathan Lasseter Date: Wed, 21 Jan 2015 18:57:31 +0000 Subject: Added support for scoped tags --- .gitignore | 1 + example.html.rb | 27 +++++--- lib/tag.rb | 197 +++++++++++++++++++++++++++++++++++++++++++++++++++----- 3 files changed, 198 insertions(+), 27 deletions(-) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1377554 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*.swp diff --git a/example.html.rb b/example.html.rb index ec1cd29..553ef0e 100644 --- a/example.html.rb +++ b/example.html.rb @@ -1,26 +1,33 @@ require './lib/virgil' -include Virgil +include Virgil::Tags -puts Tag.doctype { +puts doctype { "html" } -puts Tag.html { - Tag.head { - Tag.title { +puts comment { + "this is neat" +} + +puts html { + head { + title { "My Virgil site" } } + - Tag.body { - Tag.h1 { + body { + h1 { "My Virgil site" } + - Tag.p({:class => "italic"}) { + p({:class => "italic"}) { "some content" } + - Tag.img({:src => "img.jpg"}) + - Tag.a({"href" => "/"}) { + img({:src => "img.jpg"}) + + a({"href" => "/"}) { "A link home" + } + + map { + area {} } } } diff --git a/lib/tag.rb b/lib/tag.rb index bad0d01..b401acb 100644 --- a/lib/tag.rb +++ b/lib/tag.rb @@ -1,27 +1,190 @@ module Virgil - class Tag - class << self - def doctype - "" + module Tag + class Doctype + def initialize + @tag = "" end - def common(attrs = {}) - "<#{__callee__}" + Utils.unfold(attrs) + ">" + + def to_s + @tag + end + end + class Comment + def initialize + @tag = "" + end + def to_s + @tag + end + end + class Common + def initialize(tag, attrs) + @tag = "<#{tag}" + Utils.unfold(attrs) + ">" + yield + - "" + "" end - def common_single(attrs = {}) - "<#{__callee__}" + Utils.unfold(attrs) + " />" + def to_s + @tag end + end + class Common_Single + def initialize(tag, attrs) + @tag = "<#{tag}" + Utils.unfold(attrs) + "/>" + end + def to_s + @tag + end + end - alias :html :common - alias :head :common - alias :title :common - alias :body :common - alias :h1 :common - alias :p :common - alias :img :common_single - alias :a :common + class Map < Common + def initialize(attrs, &block) + @tag = "" + + self.instance_eval(&block) + + "" + end + def area + "" + + "" + end + end + end + module Tags + def doctype + Tag::Doctype.new(&Proc.new).to_s + end + def comment + Tag::Comment.new(&Proc.new).to_s + end + def common(attrs = {}) + Tag::Common.new(__callee__, attrs, &Proc.new).to_s end + def common_single(attrs = {}) + Tag::Common_Single.new(__callee__, attrs).to_s + end + + def map(attrs = {}) + Tag::Map.new(attrs, &Proc.new).to_s + end + + alias :a :common + alias :abbr :common + alias :acronym :common + alias :address :common + alias :applet :common + alias :article :common + alias :aside :common + alias :audio :common + alias :b :common + alias :base :common + alias :basefont :common + alias :bdi :common + alias :bdo :common + alias :big :common + alias :blockquote :common + alias :body :common + alias :br :common + alias :button :common + alias :canvas :common + alias :caption :common + alias :center :common + alias :cite :common + alias :code :common + alias :col :common + alias :colgroup :common + alias :datalist :common + alias :dd :common + alias :del :common + alias :details :common + alias :dfn :common + alias :dialog :common + alias :dir :common + alias :div :common + alias :dl :common + alias :dt :common + alias :em :common + alias :embed :common + alias :fieldset :common + alias :figcaption :common + alias :figure :common + alias :font :common + alias :footer :common + alias :form :common + alias :frame :common + alias :frameset :common + alias :h1 :common + alias :h2 :common + alias :h3 :common + alias :h4 :common + alias :h5 :common + alias :h6 :common + alias :head :common + alias :header :common + alias :hgroup :common + alias :hr :common + alias :html :common + alias :i :common + alias :iframe :common + alias :img :common_single + alias :input :common + alias :ins :common + alias :kbd :common + alias :keygen :common + alias :label :common + alias :legend :common + alias :li :common + alias :link :common + alias :main :common + alias :mark :common + alias :menu :common + alias :menuitem :common + alias :meta :common + alias :meter :common + alias :nav :common + alias :noframes :common + alias :noscript :common + alias :object :common + alias :ol :common + alias :optgroup :common + alias :option :common + alias :output :common + alias :p :common + alias :param :common + alias :pre :common + alias :progress :common + alias :q :common + alias :rp :common + alias :rt :common + alias :ruby :common + alias :s :common + alias :samp :common + alias :script :common + alias :section :common + alias :select :common + alias :small :common + alias :source :common + alias :span :common + alias :strike :common + alias :strong :common + alias :style :common + alias :sub :common + alias :summary :common + alias :sup :common + alias :table :common + alias :tbody :common + alias :td :common + alias :textarea :common + alias :tfoot :common + alias :th :common + alias :thead :common + alias :time :common + alias :title :common + alias :tr :common + alias :track :common + alias :tt :common + alias :u :common + alias :ul :common + alias :var :common + alias :video :common + alias :wbr :common end end -- cgit v1.2.1