Как включить метаданные в файл шаблона? - PullRequest
1 голос
/ 11 февраля 2009

У меня есть система, которая фильтрует файлы шаблонов через erb. Используя соглашение по конфигурации, выходные файлы создаются в файловой иерархии, которая отражает входные файлы. Многие из файлов имеют одинаковые имена, и я смог использовать каталоги, чтобы различать их.

Этот план работал, пока мне не нужно было связать дополнительную информацию с каждым файлом. Поэтому я создал файл YAML в каждом каталоге с метаданными. Теперь у меня есть обе конфигурации и . Тьфу.

Затем я изучил Webby и то, как он включает раздел метаданных YAML в верхней части каждого файла шаблона. Они выглядят так:

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

Если бы я мог реализовать такой заголовок, я мог бы отказаться от своей иерархии и отдельных файлов YAML. Реализация Webby очень универсальна, она реализует новый класс MetaFile, который отделяет заголовок от «реального текста», но кажется более сложным, чем мне нужно.

Поместить метаданные в комментарий erb кажется хорошим - он будет автоматически проигнорирован erb, но я не уверен, как получить доступ к данным комментария.

<%#
title: Baxter the Dog
%>

Есть ли способ получить доступ к комментариям erb? Или, может быть, другой подход? Многие из моих шаблонов делают кучу вещей, связанных с erb, но я мог бы запустить erb на отдельном шаге, если это облегчит все остальное.

1 Ответ

2 голосов
/ 12 февраля 2009

Как насчет того, чтобы вы также дампировали свой контент как YAML. Предположительно, метаданные - это просто хэш, выгруженный в YAML. Вы можете просто добавить содержимое в виде строки во второй документ YAML в том же файле: -

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

Сброс так же прост: -

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

Загрузка так же проста, как: -

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

Обратите внимание, что символ канала появляется в YAML , поэтому новые строки в строке содержимого сохраняются .

...