我正在尝试编写一个docpad插件,允许我插入每个页面唯一的元标记,例如og:title或og:description。我已经能够使用全局值的populateCollections事件全局完成此操作,但是每页都无法执行此操作。
我希望在不需要模板功能的情况下工作,以便根据文档的元数据自动插入元标记。一种方法可能是在writeBefore事件中获取contentRendered值并以这种方式进行字符串操作,但这看起来很糟糕。
有什么想法吗?
答案 0 :(得分:1)
这适用于我需要的东西。基本上,我在使用writeBefore
事件编写文件之前获取渲染内容,并执行一个非常简单的字符串替换,它添加了元标记及其唯一值,这些值是从模型中提取的集合。
writeBefore: (opts) ->
docPad = @docPad
templateData = docpad.getTemplateData()
siteUrl = templateData.site.url
for model in opts.collection.models
if model.get('outExtension') == 'html'
url = @getTag('og:url', siteUrl+model.get('url'))
title = @getTag('og:title', model.get('title'))
content = model.get('contentRendered')
if content
content = content.replace(/<\/title>/, '</title>'+url+title+description)
model.set('contentRendered', content)
# Helper
getTag: (ogName, data) ->
return "\n <meta property=\"#{ogName}\" content=\"#{data}\" />"
答案 1 :(得分:1)
伟大的回答大卫,如果有人遇到我所做的相同问题,请留下这个。
检查元标记是否已损坏,如果是 - 不要渲染:
renderBefore: (opts) ->
for model in opts.collection.models
if model.get('date').toLocaleDateString()=='Invalid Date'
model.set('write', false)
docpad.log model.get('title')+' has broken date format!\n\n\n\n\n'
false
答案 2 :(得分:0)
我正在使用部分收藏品。在文档中添加所需内容,如下所示:
```
title: Meetings and Events
layout: page
description: "This is my custom description."
tags: ['resources']
pageOrder: 3
pageclass: rc-events
```
我需要按页面自定义CSS类。然后你可以在你的默认模板中调用它。
<div id="main" class="container <%= @document.pageclass %>">
对于meta
应该是相同的<meta name="description" content="<%= @document.description) %>" />
或检查您的docpad.coffee
文件,并根据默认网站值和@document
值将准备好的内容放在一起。然后你可以调用类似默认的东西:
<meta name="description" content="<%= @getPreparedDescription() %>" />
这是由这个辅助函数构建的:
# Get the prepared site/document description
getPreparedDescription: ->
# if we have a document description, then we should use that, otherwise use the site's description
@document.description or @site.description