2009-02-11 8 views
1

J'ai un système qui filtre les fichiers modèles via erb. En utilisant la convention sur la configuration, les fichiers de sortie sont créés dans une hiérarchie de fichiers qui reflète les fichiers d'entrée. Beaucoup de fichiers ont les mêmes noms, et j'ai pu utiliser les répertoires pour les différencier.Comment inclure des métadonnées dans un fichier modèle?

Ce plan fonctionnait jusqu'à ce que je devais associer des informations supplémentaires à chaque fichier. J'ai donc créé un fichier YAML dans chaque répertoire avec les métadonnées. Maintenant, j'ai la convention et la configuration. Yuck.

Ensuite, j'ai appris Webby, et la façon dont il comprend une section de métadonnées YAML en haut de chaque fichier modèle. Ils ressemblent à ceci:

--- 
title: Baxter the Dog 
filter: textile 
--- 
All the best little blogs use Webby. 

Si je pouvais mettre en œuvre un en-tête comme ça, je pouvais fossé ma hiérarchie et les fichiers YAML séparés. L'implémentation Webby est très générique, implémentant une nouvelle classe MetaFile qui sépare l'en-tête du "vrai texte", mais cela semble plus compliqué que nécessaire.

Mettre les métadonnées dans un commentaire erb semble bon - il sera automatiquement ignoré par erb, mais je ne suis pas sûr comment accéder aux données de commentaire.

<%# 
title: Baxter the Dog 
%> 

Existe-t-il un moyen d'accéder aux commentaires erb? Ou peut-être une approche différente? Beaucoup de mes templates font un tas de trucs erb, mais je pourrais lancer erb dans une étape séparée si ça facilite le reste.

Répondre

2

Que diriez-vous si vous vider votre contenu en tant que YAML aussi. On peut supposer que les métadonnées sont simplement un Hash déversé sur YAML. Vous pouvez simplement ajouter le contenu sous forme de chaîne dans un second document YAML dans le même fichier: -

--- 
title: Baxter the Dog 
filter: textile 
--- | 
Content line 1 
Content line 2 
Content line 3 

Le dumping est aussi simple que: -

File.open('file.txt', 'w') do |output| 
    YAML.dump(metadata, output) 
    YAML.dump(content, output) 
end 

Chargement est aussi simple que: -

File.open('file.txt') do |input| 
    stream = YAML.load_stream(input) 
    metadata, content = stream.documents 
end 

Notez que le caractère de tuyau apparaît dans le YAML so that newlines in the content string are preserved.

+0

J'aime cette approche; plus agréable pour l'observation humaine que le commentaire erb. Certains de mes contenus pourraient déjà inclure yaml, mais je pense que je suis en sécurité si j'échappe à des séparateurs de documents? \ --- – slothbear