2011-09-20 7 views
6

Tengo un complemento de bloque Jekyll (Líquido) y me gustaría detectar cuál es la página actual. Veo que se pasa un contexto al procesamiento y que puedo recuperar el objeto del sitio actual como context.registers [: site]. Sin embargo, los intentos de obtener la página actual como context.registers [: page] fallan.¿Cómo puedo detectar la página actual en un complemento de etiqueta Jekyll?

El problema que estoy tratando de resolver es crear un plugin de bloque simple para detectar si la página actual es la página mencionada en la etiqueta y resaltarla.

Cualquier consejo sería muy apreciado.

Gracias!

Respuesta

15

Resulta que también podemos hacer esto como:

def render(context) 
    page_url = context.environments.first["page"]["url"] 

Lo que no es obvio, pero no requiere un parche en el código.

+0

Eso es brillante. Y completamente no intuitivo. Gracias por resolver esto. – cboettig

+2

Pero, ¿y si necesitas agarrar el objeto 'context' en' initialize'? – jackyalcine

1

No creo que haya una buena forma de hacerlo con Jekyll como está. convertible.rb solo pasa el objeto site a Liquid, que no contiene ningún dato específico de la página.

Sugeriría simplemente editar convertible.rb para pasar los datos que necesita, enviar una solicitud de extracción al proyecto principal para incorporar sus cambios y usar su fork localmente para generar su sitio. ¡Hurra por el código abierto!

El siguiente parche trivial me funciona localmente contra Jekyll 0.11.0, haciendo un hash página disponible en forma líquida como context.registers[:page] (nota: se trata de un hash pre-convertida en este punto, por lo que es posible acceder a context.registers[:page]['url'], no context.registers[:page].url) :

diff --git a/lib/jekyll/convertible.rb b/lib/jekyll/convertible.rb 
index d33abc5..a674ef5 100644 
--- a/lib/jekyll/convertible.rb 
+++ b/lib/jekyll/convertible.rb 
@@ -69,7 +69,7 @@ module Jekyll 
    # 
    # Returns nothing. 
    def do_layout(payload, layouts) 
-  info = { :filters => [Jekyll::Filters], :registers => { :site => self.site } } 
+  info = { :filters => [Jekyll::Filters], :registers => { :site => self.site, :page => payload['page'] } } 

     # render and transform content (this becomes the final content of the object) 
     payload["pygments_prefix"] = converter.pygments_prefix 

Espero que ayude!

2

context['page'] parece devolver un hash con la mayor parte de las propiedades de la página actual, incluyendo url y path

por lo que el objeto real página puede ser recuperada con

context.registers[:site].pages.detect { |p| p.path==context['page']['path'] } 
Cuestiones relacionadas