如何使用docpad事件在每个页面上插入唯一元标记

时间:2013-11-10 23:20:04

标签: docpad

我正在尝试编写一个docpad插件,允许我插入每个页面唯一的元标记,例如og:title或og:description。我已经能够使用全局值的populateCollections事件全局完成此操作,但是每页都无法执行此操作。

我希望在不需要模板功能的情况下工作,以便根据文档的元数据自动插入元标记。一种方法可能是在writeBefore事件中获取contentRendered值并以这种方式进行字符串操作,但这看起来很糟糕。

有什么想法吗?

3 个答案:

答案 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