Nico 主题

想要开发自己的主题?其实很简单。大多数时候,例子会更有帮助,所以去看 one 吧。

结构

一个主题包含三个部分:主题的信息,模板,静态文件。它的文件目录结构如下:

theme-name/
    theme.js             - 主题的信息,其实可以没有
    templates/           - 模板
        post.html
        page.html
        ...
    static/              - 静态文件
        app.css
        jquery.js
        ...

模板

Nico 使用 swig 做为模板引擎,所以你需要了解一下 swig 的语法。如果你有用过 Django 或者 Jinja,你已经大致了解语法了。更多内容请访问 swig

不同的 writer 需要不用的模板,比如 PostWriter 需要 post.html,ArchiveWriter 需要 archive.html。一个完备的主题应该包含:

post.html             - PostWriter
page.html             - PageWriter
archive.html          - ArchiveWriter, YearWriter, DirectoryWriter ...
feed.html             - FeedWriter

当然,如果你的主题只供自己使用,只需要提供自己所需的模板就可以了。

Jade

将模板引擎换为 Jade:

// nico.json
{
    "engine": "jade"
}

你需要额外安装 Jade,并保正 Jade 能被 require。

变量

  • 全局变量:在所有模板中都可以访问的变量,
  • 模板变量:只有在特定的模板中才有的变量,

system

全局变量,这个是系统变量:

{
    "name": "nico",
    "version": "0.1.0",
    "homepage": "http://lab.lepture.com/nico/"
}

事实上,这个变量包含了所有 nico/package.json 的信息。

theme

全局变量,由主题提供,也就是说是由 theme.js 暴露出来的变量。

config

全局变量,这个是用户的配置信息,所有的配置信息都可以通过 config 获取。

resource

全局变量,用户总共有哪些资源。

  • resource.posts: 所有的文章 (使用 read filter 来获取完整的文章)
  • resource.pages: 所有的页面

post

模板变量,有 PostWriter 与 PageWriter 渲染的模板有该变量。

  • post.title: 文章的标题
  • post.meta: 文章的所有元数据
  • post.pubdate: 文章的发布时间(only available in post.html)
  • post.tags: 文章的标签
  • post.html: 渲染好的 html
  • post.directory: 文章文件所在的目录
  • post.status: 文章的状态
  • post.toc: tabe of content of the post

You can get every raw data from post.meta that you defined.

pagination

模板变量,对文章有批量操作的 writer 会有该变量,比如 ArchiveWriter。

  • pagination.page: current page of the pagination
  • pagination.pages: total pages the pagination has
  • pagination.perpage: count of post that perpage has
  • pagination.total_items: all the items
  • pagination.total: total count of the pagination
  • pagination.items: items for current page
  • pagination.has_prev: has a previous page?
  • pagination.prev_num: previous page number
  • pagination.has_next: has a next page?
  • pagination.next_num: next page number
  • pagination.iter_pages: iter pages of the pagination

NOTICE

The item in pagination.items is not a full post, you should use read filter to get the rendered html.

方法

方法是一些函数,你可以通过配置来新增一些方法。

内置的方法有:

根据用户配置的 permalink style 来生成文章的链接。比如 {{permalink_url(post)}}

content_url

用来生成某地址的相对链接,比如当前所在页为 a/b.html,在该页面里的 {{content_url('index.html')}} 将生成 ../

static_url

同 content_url ,用来生成静态文件的链接。如当前页为 a/b.html,那么 {{static_url('css/a.css')}} 将生成 ../static/css/a.css

filter

你需要了解 filter 是什么,请先阅读 swig 的文档。代码上来讲,filter 也是一类方法。

你可以通过配置来新增一些 filter。

The built in filters of nico:

xmldatetime

Generate a ISOString of the Date.

markdown

Render the raw text to html with markdown.

highlight

Highlight a code block with specified language.

read

Read is designed for pagination.items, to fulfill the post.

sortby

Sort items by a key. For example:

{{ items|sortby('pubdate') }}

// reverse sort
{{ items|sortby('-pubdate') }}
Fork me on GitHub