Как я могу программно добавить скрипт или тег таблицы стилей на страницу, указанную во вступительной части страницы 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
Надеюсь, это имеет смысл
@getBlock
Docpad для добавления скриптов, он создает пользовательский объект @assets, заполняет его, а затем повторяет его в макете. Я ищу решение, в котором используется встроенный помощник Docpad@getBlock
. - person Sergey Lukin   schedule 12.07.2013