如何在Docpad中以每页为单位以编程方式添加脚本或样式表



如何以编程方式将脚本或样式表标记添加到页面的YAML front matter(meta)中指定的页面?

假设存在具有以下内容的src/documents/posts/a.html.eco

---
layout: default
scripts: ['a.js']
---
Blog post that requires a special javascript

布局CCD_ 2,内容如下:

...
@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

标记上面的注释只是为了表明在注入标记之前可能已经解决了一些处理问题。

我尝试了许多方法在docpad.coffee文件中使用不同的events(包括来自docpad-plugin-livereload插件的方法),但每次我都面临相同的问题——脚本标记应用于所有页面,而不是仅应用于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 [])

这是完全好的,它确实如预期的那样工作,但它似乎没有为我提供足够的自由,让我在将内容注入页面之前对其进行操作。。即使有可能,我也不喜欢在布局模板中有一些沉重的逻辑,我希望它在插件/docpad.coffee 中

希望这是有意义的

尝试templateData.getBlock('scripts').add而不是docpad.getBlock('scripts').add

最新更新