Modelos semânticos com enlive e microdados

Existem muitas maneiras de lidar com modelos. Mas ainda é um grande problema tornar seus modelos fáceis de alterar. Você já fez alguns modelos para WordPress ou outro CMS? Como você se sentiu a respeito?

Imagine um mundo onde você possa usar apenas HTML puro. Sem diretivas especiais nem ajudantes mágicos. Apenas HTML:

<article itemscope itemtype="http://schema.org/BlogPosting">
<header>
<h1 itemprop="name"></h1>
<p class="info">
<time pubdate itemprop="datePublished" datetime=""></time> |
<strong itemprop="articleSection"></strong></p>
</header>
<div itemprop="articleBody"></div>
<footer itemprop="author" itemscope itemtype="http://schema.org/Person">
Author:
<strong itemprop="name"></strong> |
<a rel="bookmark" href="#" itemprop="url" title="Permalink">#</a>
</footer>
</article>

Este é um modelo HTML5 típico para uma postagem de blog. Ele usa novos recursos semânticos como seções article, headerou footer, elemento inline timecom pubdateatributo para indicar a data do artigo e publicar microdados atributos para post .

Agora podemos aproveitar a marcação semântica. Usaremos uma pequena biblioteca para ativar nosso modelo sem tocá-lo.

(use 'net.cgrand.enlive-html)

(defn itemprop [name] (attr= :itemprop name))


(deftemplate blogpost-template "weblog/blogpost.html" [article]

[:article :header (itemprop "name")] (content (get article :title))

[:article (itemprop "articleBody")] (html-content (get article :html))

[:article (itemprop "articleSection")] (content (get article :category))

[:article (itemprop "author") (itemprop "name")] (content (get article :author))

[:article (itemprop "url")] (set-attr :href (get article :url))

[:article (itemprop "datePublished")] (content (long-date article))

[:article (itemprop "datePublished")] (set-attr :datetime (utc-date article)))

Enlive usa CSS como seletores (escritos em sintaxe clojure) e funções de transformação para manipular a marcação do template. Agora o seu webmaster pode alterar os elementos visuais, ids e classes, pode adicionar divs e spans, mas nosso modelo ainda funcionará. Só porque o uso inteligente de microdados.