6
votes

Impossible d'obtenir les données de la page du plugin Jekyll

J'essaie d'écrire un plugin de balise personnalisé pour Jekyll qui produira une arborescence de navigation hiérarchique de toutes les pages (pas des messages) sur le site. Je veux fondamentalement un bouquet imbriqué

    S avec des liens (avec le titre de la page sous forme de texte de liaison) sur les pages avec la page actuelle notée par une certaine classe CSS.

    i 'm très inexpérimenté avec Ruby. Je suis un gars PHP.

    J'ai pensé que je voudrais commencer à itérer à toutes les pages et émis une liste unidimensionnelle juste pour m'assurer que je pouvais au moins le faire. Voici ce que j'ai jusqu'à présent: xxx

    et je l'insère dans mon modèle de liquide via {% nav_tree%} . .

    Le problème est que la variable page dans le code ci-dessus ne dispose pas de toutes les données que vous attendez. page.title est indéfini et page.URL est juste le nom de base avec une barre oblique devant celle-ci (par exemple, pour /a/b/c.html < / Code>, il suffit de me donner /c.html ).

    Qu'est-ce que je fais mal?

    Note latérale: J'ai déjà essayé de faire cela avec un marge pur liquide, et j'ai finalement abandonné. Je peux facilement itération via le site .pages juste bien avec du liquide, mais je ne pouvais pas comprendre un moyen de nier de manière appropriée les listes.


4 commentaires

J'ai créé Un problème sur GitHub pour voir si quelqu'un connaît la réponse.


Avez-vous déjà réussi à faire fonctionner la nidification? J'aimerais voir le code final si oui


@Brand Malheureusement, je n'ai jamais eu la fin de la finition.


J'ai réussi à pirater l'arbre de page hiérapie ensemble. Ce n'est pas jolie mais j'ai posté ici: gist.github.com/3536551 au cas où quelqu'un d'autre trébuche sur cette question


3 Réponses :


4
votes

Essayez:

module Jekyll

  # Add accessor for directory
  class Page
          attr_reader :dir
  end


  class NavTree < Liquid::Tag
    def initialize(tag_name, text, tokens)
      super
    end

    def render(context)
      site = context.registers[:site]
      output = '<ul>'
      site.pages.each do |page|
        output += '<li><a href="'+page.dir+page.url+'">'+(page.data['title'] || page.url) +'</a></li>'
      end
        output += '<ul>'

      output
    end
  end

end

Liquid::Template.register_tag('nav_tree', Jekyll::NavTree)


3 commentaires

Avec ce code, j'obtiens Erreur de liquide: impossible de convertir nil en chaîne .


Vous avez probablement eu une page sans titre, de sorte que Page.Data ['Titre'] est nulle. Remplacer w / e.g. (page.Data ['Titre'] || Page.URL).


Désolé pour la réponse tardive. Vous étiez correct. J'ai eu une page sans titre. Votre solution fonctionne.



4
votes

page.title code> n'est pas toujours défini (exemple: atom.xml code>). Vous devez vérifier s'il est défini. Ensuite, vous pouvez prendre page.name code> ou ne pas traiter l'entrée ...

def render(context)
  site = context.registers[:site]
  output = '<ul>'
  site.pages.each do |page|
    unless page.data['title'].nil?
      t = page.data['title']
    else
      t = page.name
    end
    output += "<li><a href="'+page.dir+page.url+'">'+t+'</a></li>"
  end
  output += '<ul>'
  output
end


1 commentaires

Raccourcir que, sauf si..end un peu à: t = page.Data ['titre'] || Page.Name



0
votes

Récemment, j'ai rencontré un problème similaire où l'erreur "Impossible de convertir Nill en String" ne fait que souffler ma tête. Mon fichier config.yml contient une ligne quelque chose comme ça " baseurl: / paradocs / jEkyll / out / " Maintenant, c'est pour mon local pour un serveur, je dois faire que beseurl vide et que l'erreur commence à apparaître Dans le temps de construction, je dois enfin faire " baseurl: / " .. et c'est mon travail.


0 commentaires