Generator

Um generator constrói rotas a partir de arquivos processados.

Resumo

hexo.extend.generator.register(name, function (locals) {
// ...
});

Um argumento locals será passado para dentro da função, contendo as variáveis do site. Você deve utilizar esse argumento para obter os dados do site, evitando assim, acessar a base de dados diretamente.

Atualizar Rotas

hexo.extend.generator.register("test", function (locals) {
// Object
return {
path: "foo",
data: "foo",
};

// Array
return [
{ path: "foo", data: "foo" },
{ path: "bar", data: "bar" },
];
});
Atributo Descrição
path Caminho, sem incluir o prefixo /.
data Dados
layout Layout. Especifica os layouts para renderização. O valor pode ser uma string ou um array. Se ignorado, a rota retornará data diretamente.

Quando os arquivos fonte são atualizados, o Hexo executará todos os geradores e recriará as rotas. Atenção: Retornar os dados em vez de acessar o roteador diretamente!

Exemplo

Páginas de Arquivo

Crie uma página de arquivo em archives/index.html. Iremos passar uma lista com todos as postagens como data para os templates. Assim, data é equivalente à variável page nos templates.

Após isso, defina o atributo layout para renderizar a página com os templates do tema. Nesse exemplo são definidos dois layouts: se o layout de archive não existir, o layout de index será utilizado em seu lugar.

hexo.extend.generator.register("archive", function (locals) {
return {
path: "archives/index.html",
data: locals,
layout: ["archive", "index"],
};
});

Páginas de Arquivo com Paginação

Você pode utilizar uma ótima ferramenta oficial chamada hexo-pagination para criar facilmente uma página de arquivos com paginação.

var pagination = require("hexo-pagination");

hexo.extend.generator.register("archive", function (locals) {
// hexo-pagination makes an index.html for the /archives route
return pagination("archives", locals.posts, {
perPage: 10,
layout: ["archive", "index"],
data: {},
});
});

Gerar Todas as Postagens

Percorra a lista de postagens em locals.posts e crie rotas para cada um.

hexo.extend.generator.register("post", function (locals) {
return locals.posts.map(function (post) {
return {
path: post.path,
data: post,
layout: "post",
};
});
});

Copiar Arquivos

Dessa vez não iremos retornar data explicitamente, mas atribuir uma função para que a rota construa fs. ReadStream apenas quando necessário.

var fs = require("hexo-fs");

hexo.extend.generator.register("asset", function (locals) {
return {
path: "file.txt",
data: function () {
return fs.createReadStream("path/to/file.txt");
},
};
});