Как предоставить ссылку на "следующий пост"

В блог-проекте, с которым я играю, у меня есть "посты". Вот блок сборки из моего Gruntfile:

assemble: {
  options: {
    layout: ['src/layouts/default.hbs'],
    data: ['src/data/*.{json,yml}']
  },
  pages: {
    src: ['src/posts/**/*.md'],
    dest: 'tmp/posts/'
  }
}    

Каждый пост представлен в уценке, с чертой YFM, например:

---
date: '20131129'
latitude: 7.113309999999999
longitude: -73.120468
city: Bucaramanga
country: Colombia


---

# A familiar face...

And then more blog content here...

Теперь по моему default.hbsУ меня есть стандартные вещи. Я быстро сделал {{осмотр страницы}}, чтобы посмотреть, какие переменные мне пригодятся. Я вижу там, у меня есть несколько частей информации, которые могут быть полезны в этом вопросе:

 "index": 46,
 "next": 47,
 "prev":45

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

Огромное спасибо!

2 ответа

Решение

Я хочу добавить это как "AN" ответ, но, надеюсь, не "THE" ответ. Вот помощник Хандебарса, которого я бросил вместе, чтобы выложить следующий путь. Это полный файл с комментариями, которые, вероятно, делают его более пугающим, чем он есть.

var _ = require('underscore');

var postPath = function(post){
  //pass a post object in, get back its path for linking
  var out = post['dest'].replace(/^tmp/, '');
  return out;
};

module.exports.register = function (Handlebars, options)  {
  Handlebars.registerHelper('nextPost', function (obj)  {
    var thisPage = obj['page']; // Created a local var for easier reading

    // The "this" object gets passed in as "obj" and contains an array of
    // pages. The trick is, this list isn't necessarily in order, even though
    // the folders are all named by date. Here I sort them. This seems rather
    // heavy handed, as the tax to process these increases exponentially with the
    // number of blog posts.
    // Also, I'm using underscore here to make the code much simpler.
    var sortedPages = _.sortBy(obj['pages'], function(page){ return page['data']['date']; });

    // Go through all of the sorted pages to find the matching data and get the index of where that is,
    // this way we can add one, to find the next element in the sorted array.
    var currentIndex = sortedPages.map(function(page) {return page['data']; }).indexOf(thisPage['data']);
    var nextIndex = currentIndex + 1;
    var out = '';

    // Don't wig out if it's the last one, just return a blank string instead.
    if (nextIndex > (sortedPages.length - 1)){
      out = '';
    }else{
      // Make a pretty path for use in our view
      out = postPath(sortedPages[nextIndex]);
    }
    return  out;
  });

};

Некоторые из этих строк могут быть извлечены и помещены в свои собственные методы для повторного использования для вспомогательного метода "previousPost". Но что-то воняет по этому поводу, и мне бы понравилось, если бы кто-то мог помочь мне освежить это или указать мне в другом направлении.

Недавно мы добавили объект пагинации в контекст, но он сортирует только по имени исходного файла прямо сейчас.

@jonschlinkert также создал помощника, который может быть полезен для вас... https://github.com/helpers/handlebars-helper-paginate

Мы сейчас занимаемся рефакторингом сборки, и одну вещь, которую мы хотим сделать, - это упростить работу таких типов, не создавая пользовательских помощников, подобных этой. Мне нравится ваш код, потому что он показывает, как использовать подчеркивание /lodash для сортировки страниц по другим свойствам.

Другие вопросы по тегам