2013-11-10 2 views
0

Я пытаюсь написать плагин docpad, который позволит мне вставлять метатеги, уникальные для каждой страницы, например og: title или og: description. Я смог выполнить это глобально с событием populateCollections для глобальных значений, но не смог сделать это на странице.Как вставить уникальные метатеги на страницу с помощью событий docpad

Я хотел бы, чтобы это работало без необходимости использования функции шаблона, чтобы метатег был вставлен автоматически на основе метафайла документа. Один из способов может заключаться в том, чтобы захватить значение contentRendered в событии writeBefore и сделать строковые манипуляции таким образом, но это кажется взломанным.

Любые идеи?

ответ

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

Отличный ответ Дэвид, оставив это, если кто-то столкнулся с той же проблемой, что и я.

Проверьте мета-тег нарушается, если это - не делают:

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