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
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 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