Práctica: HTML DSL

En esta práctica deberá escribir una clase que provea una funcionalidad parecida (por supuesto, no completa) a la de la librería markaby. La librería provee métodos html, body, h1, etc. que permiten la escritura de los correspondientes tags HTML:
 require 'markaby'

  mab = Markaby::Builder.new
  mab.html do
    head { title "Boats.com" }
    body do
      h1 "Boats.com has great deals"
      ul do
        li "$49 for a canoe"
        li "$39 for a raft"
        li "$29 for a huge boot that floats and can fit 5 people"
      end
    end
  end
  puts mab.to_s
Los métodos, como b reciben como primer argumento una cadena que es la que hay que rodear entre las marcas <b> y </b>. También pueden recibir opcionalmente un segundo argumento que sea un hash especificando los atributos asociados con el tag:
a "google", :href => "http://www.google.com", :name => "foo"
que debería dar lugar a un texto parecido a este:
<a href = "http://www.google.com", name = "foo">google</a>
Si en la llamada no se provee la cadena inicial, se deberá proveer un bloque. Dicho bloque construye la cadena que se interpolará entre las marcas. Así:
head { title "My wonderful home page" }

debería producir la cadena:

<head><title>My wonderful home page</title></head>
La ejecución de este código
~/chapter8ReflectionandMetaprogramming$ cat -n html.rb 
     1  class HTML
     2    attr_accessor :page
     3  
     4    def initialize........
     5      ....................
     6      ....................
     7    end
     8  
     9    def build_attr(attributes)
    10        ...........................................................
    11        ............................................................ 
    12    end
    13  
    14    def ..............(tag, *args)
    15      ...............................................
    16      ...............................................
    17      ...............................................
    18      ...............................................
    19      ...............................................
    20      ...............................................
    21      ...............................................
    22      ...............................................
    23      ...............................................
    24      ...............................................
    25      ...............................................
    26      ...............................................
    27    end
    28  
    29    def to_s
    30      ..............................................
    31    end
    32  end
    33  
    34  if __FILE__ == $0
    35    q= HTML.new {  
    36      html {
    37        head(:dir => "chazam", :lang => "spanish") { title "My wonderful home page" }
    38        body do
    39          h1 "Welcome to my home page!", :class => "chuchu", :lang => "spanish"
    40          b "My hobbies:"
    41          ul do
    42            li "Juggling"
    43            li "Knitting"
    44            li "Metaprogramming"
    45          end #ul
    46        end # body
    47      }
    48    }
    49    puts q
    50  end
debería producir una salida parecida a esta:
~/chapter8ReflectionandMetaprogramming$ ruby html.rb 
<html>
<head dir = "chazam" lang = "spanish">
<title>
My wonderful home page
</title>
</head>
<body>
<h1 class = "chuchu" lang = "spanish">
Welcome to my home page!
</h1> <b>
My hobbies:
</b> <ul>
<li>
Juggling
</li> <li>
Knitting
</li> <li>
Metaprogramming
</li>
</ul>
</body>
</html>

Repase las secciones 15.4.5 y 15.12.1.

Solución

Puede consultar una solución en https://github.com/crguezl/dsl-quiz-simple



Subsecciones
Casiano Rodriguez León 2015-01-07