Как программно добавить сценарий или таблицу стилей для каждой страницы в Docpad

Как я могу программно добавить скрипт или тег таблицы стилей на страницу, указанную во вступительной части страницы YAML (мета)?

Предполагая, что есть src/documents/posts/a.html.eco со следующим содержимым:

---
layout: default
scripts: ['a.js']
---

Blog post that requires a special javascript

и макет src/layouts/default.html.eco со следующим содержанием:

...
@getBlock('scripts').toHTML()
</body>
...

Окончательный результат для posts/a.html должен быть:

...
<!-- some extra stuff that was added when processing script tag -->
<script scr="/scripts/a.js"></script>
</body>
...

..а на других страницах не должно быть ссылок на /scripts/a.js

Комментарий над тегом просто показывает, что перед внедрением тега может потребоваться некоторая обработка.

Я пробовал много подходов, используя разные events в файле docpad.coffee (включая подход, взятый из плагина docpad-plugin-livereload), но каждый раз сталкивался с одной и той же проблемой - тег script применялся ко всем страницам, а не только к a.html. Вот одна из моих попыток:

renderDocument: (opts) ->
  {extension,templateData,file,content} = opts
  if extension == 'html' and scripts = file.get('scripts')
    if typeof scripts != 'undefined'
      scripts.forEach (scriptName) ->
        @docpad.getBlock('scripts').add('<!-- custom script tag here -->')

Я также пробовал render событие, populateCollections (которое не задокументировано, однако я нашел его в плагине docpad-plugin-livereload) и даже extendTemplateData события, и пока безуспешно.

Я знаю, что есть способ сделать это прямо внутри макета:

@getBlock('scripts').add(@document.scripts or [])

... что совершенно нормально, и это действительно работает так, как ожидалось, однако, похоже, это не дает мне достаточно свободы для манипулирования контентом до того, как он будет введен на страницу.. И даже если это возможно, мне не понравится идея иметь некоторая тяжелая логика внутри шаблона макета, я хочу, чтобы она была в plugin/docpad.coffee

Надеюсь, это имеет смысл


person Sergey Lukin    schedule 11.07.2013    source источник
comment
Вы пробовали плагин FrontEnd? github.com/sergeche/docpad-plugin-frontend Если это работает для вас, так и скажите , поэтому я могу поместить это в ответ. :)   -  person greduan    schedule 12.07.2013
comment
Спасибо за комментарий. Да, я проверил этот плагин. Однако он не использует @getBlock Docpad для добавления скриптов, он создает пользовательский объект @assets, заполняет его, а затем повторяет его в макете. Я ищу решение, в котором используется встроенный помощник Docpad @getBlock.   -  person Sergey Lukin    schedule 12.07.2013


Ответы (1)


Попробуйте templateData.getBlock('scripts').add вместо docpad.getBlock('scripts').add

person balupton    schedule 15.07.2013
comment
,,присвоение любого свойства templateData и печать его на странице работает - person Sergey Lukin; 17.07.2013