Filtro con @pages en Nanoc 2.1

4 views
Skip to first unread message

Arnau Siches

unread,
Sep 13, 2008, 6:25:52 AM9/13/08
to nano...@googlegroups.com
Hola,

Con nanoc 2.0.4 hice un filtro (filter_post) para reemplazar todos los
nombres de mis páginas sujetas a una categoría por un enlace.

Al pasar a nanoc 2.1 dejó de funcionar.

El filtro:

class linkFilter < Nanoc::Filter
identifiers :lF
def run(content)
collection = @pages.select{ |p| p.category == 'unaCategoria' }
collection.each do |e|
re = /\b(#{e.name})\b/
content.gsub( re, %[<a href="#{e.path}">\\1</a>] ) if (
re.match(content) && @page != e )
end
end
end

El filtro con colorines: http://pastie.org/271745


El error:

Message:
Error: private method `select' called for nil:NilClass

Compilation stack:
- [page] /attributes/about/ (rep default)

Backtrace:
- (eval):125:in `run'
-
/Library/Ruby/Gems/1.8/gems/nanoc-2.1.2/bin/../lib/nanoc/base/page_rep.rb:272:in
`do_filter'
-
/Library/Ruby/Gems/1.8/gems/nanoc-2.1.2/bin/../lib/nanoc/base/page_rep.rb:264:in
`each'
-
/Library/Ruby/Gems/1.8/gems/nanoc-2.1.2/bin/../lib/nanoc/base/page_rep.rb:264:in
`do_filter'
-
/Library/Ruby/Gems/1.8/gems/nanoc-2.1.2/bin/../lib/nanoc/base/page_rep.rb:234:in
`compile'
-
/Library/Ruby/Gems/1.8/gems/nanoc-2.1.2/bin/../lib/nanoc/base/compiler.rb:59:in
`run'
-
/Library/Ruby/Gems/1.8/gems/nanoc-2.1.2/bin/../lib/nanoc/base/compiler.rb:57:in
`each'
-
/Library/Ruby/Gems/1.8/gems/nanoc-2.1.2/bin/../lib/nanoc/base/compiler.rb:57:in
`run'
-
/Library/Ruby/Gems/1.8/gems/nanoc-2.1.2/bin/../lib/nanoc/cli/commands/compile.rb:74:in
`run'
-
/Library/Ruby/Gems/1.8/gems/nanoc-2.1.2/bin/../lib/nanoc/cli/base.rb:84:in
`run'
- /Library/Ruby/Gems/1.8/gems/nanoc-2.1.2/bin/nanoc:12
- /usr/bin/nanoc:19:in `load'
- /usr/bin/nanoc:19

Lo más grave es que no sé interpretar el error. Mirando el manual de
nanoc y el rdoc tampoco he sabido ver el que.

El ejemplo he intentado dejarlo simple (espero no haberme cargado demasiado)

Cualquier idea se agradece, estoy totalmente ofuscado :(

--
arnau siches
blog.esbudellat.net

Ale Muñoz

unread,
Sep 13, 2008, 9:31:58 AM9/13/08
to nano...@googlegroups.com
Jai,

parte del problema es que la API de nanoc antes de la 2.1 era un poco
rocambolesca. A partir de la 2.1 la API ya es pública, pero ha sufrido
muchos cambios. Supuestamente no debería volver a romperse nada en el
futuro, pero nunca se sabe : )

Dicho esto, aquí van unos comentarios:

* no entiendo el objetivo del filtro, así que pido perdón por
anticipado si lo que digo no tiene sentido : )

* no sé si esto era así antes (no he programado filtros antes de la
2.1) pero ahora un filtro es un objeto pseudo independiente. Quicir,
la variables @pages (que sí existe en los plugins) no está definida en
un filtro. La idea es que un filtro sólo debería modificar el
contenido de una página, por tanto no tiene sentido que la variable
@pages esté definida.

* en cualquier caso, y visto que no me entero de lo que quieres hacer,
el array que contiene todas las páginas del site siempre está
disponible en @site.pages.

* como un filtro (en teoría) no entiende el concepto de página de la
misma manera que un plugin, los atributos de página no son accesibles
de la forma "tradicional" de @page.nombre_de_atributo. Tendrás que
usar @page.attributes[:nombre_de_atributo]

Finalmente, y volviendo a insistir en que no me he enterado de nada,
aquí va un ejemplo que hace lo que creo que intentas hacer:

class LinkFilter < Nanoc::Filter

identifiers :linkFilter

def run(content)
collection = @site.pages.select{ |p| p.attributes[:category] == 'foo' }
collection.each do |e|
content.gsub!( /\b(#{e.attributes[:name]})\b/ , %[<a
href="#{e.path}">\\1</a>] ) unless e == @page
end
return content
end
end

--
Ale Muñoz
http://sofanaranja.com
http://bomberstudios.com

Ale Muñoz

unread,
Sep 13, 2008, 9:32:43 AM9/13/08
to nano...@googlegroups.com
Casi mejor en formato Pastie: http://pastie.org/271792

Arnau Siches

unread,
Sep 13, 2008, 10:31:22 AM9/13/08
to nano...@googlegroups.com
Hola, ante todo gracias. Funciona usando @site.pages y
@page.attributes[:foo]


Ale Muñoz wrote:
>
> * no entiendo el objetivo del filtro, así que pido perdón por
> anticipado si lo que digo no tiene sentido : )

Lo intento explicar mejor :)

Tengo un conjunto de páginas que quiero que estén enlazadas siempre que
se mencione su nombre en cualquier parte del texto.
Este conjunto lo defino añadiendo un atributo “category: foo”

Por ejemplo, una página de nombre “bar”:

name: bar
category: foo

siempre que en un texto (sin importar de donde proviene) aparezca
/\bbar\b/ quiero que se convierta en un enlace a esa página.

Espero haberme explicado algo mejor.
Quizá plantearlo como un filtro no es lo mejor pero no veo otra forma de
revisar todo el contenido del site.

>
> * no sé si esto era así antes (no he programado filtros antes de la
> 2.1) pero ahora un filtro es un objeto pseudo independiente. Quicir,
> la variables @pages (que sí existe en los plugins) no está definida en
> un filtro. La idea es que un filtro sólo debería modificar el
> contenido de una página, por tanto no tiene sentido que la variable
> @pages esté definida.

Bueno, que un filtro no tenga que modificar el contenido de una página
me parece razonable pero lo que no veo tan normal es no poder acceder a
la información de dichas páginas para condicionar mi filtro. Que es en
definitiva lo que necesitaba :)

> * en cualquier caso, y visto que no me entero de lo que quieres hacer,
> el array que contiene todas las páginas del site siempre está
> disponible en @site.pages.

Por curiosidad, si @site.pages está disponible porque no @pages? que los
diferencia en realidad?


--
arnau siches
blog.esbudellat.net

Reply all
Reply to author
Forward
0 new messages