Как включить метаданные в файл шаблона?

У меня есть система, которая фильтрует файлы шаблона через 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 ответ

Решение

Как насчет того, чтобы вы также сбросили свой контент как 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, поэтому новые строки в строке содержимого сохраняются.

Другие вопросы по тегам