/`
48 |
49 |
--------------------------------------------------------------------------------
/docs/书写/markdown语法简介.md:
--------------------------------------------------------------------------------
1 | # MarkDown语法简明版
2 |
3 | ## 标题
4 | # Header 1
5 | ## Header 2
6 | ### Header 3
7 |
8 | ## 强调
9 |
10 | *文本* **文本**
11 | _文本_ __文本__
12 |
13 | ## 链接
14 |
15 | An [example](http://url.com/)
16 |
17 | ## 插入图片
18 |
19 | 
20 |
21 | 但在FarBox中,你只需要把图片拖入文本区域就可以了。
22 |
23 | ## 列表
24 |
25 | 有序列表, 无段落阻隔:
26 |
27 | 1. Foo
28 | 2. Bar
29 |
30 | 无序列表:
31 |
32 | * A list item.
33 | With multiple paragraphs.
34 | * Bar
35 |
36 | ## 嵌入代码
37 |
38 | 每行的缩进(相对于上一行)在4个空格或1个Tab时,
39 |
40 | 这是一行正常的文本.
41 |
42 | 这是一行已经预先格式了的
43 | 代码块.
44 |
45 | 或者你可以另起一行,以3个反引号为开始:
46 |
47 | \`\`\`python
48 | import this
49 | print 'something'
50 | \`\`\`
51 |
52 | ## 水平分割线
53 | 3个(或以上)连续的`-`:
54 |
55 | -----------
56 |
57 | ## 表格
58 | 一个表格看起来会如下所示:
59 |
60 | First Header | Second Header | Third Header
61 | ------------ | ------------- | ------------
62 | Content Cell | Content Cell | Content Cell
63 | Content Cell | Content Cell | Content Cell
64 |
65 | ## TOC
66 | `TOC`可以根据文章标题自动索引. 仅需将`[TOC]`放入单独的一行中.
67 |
68 | ## 更多
69 |
70 | 请参阅[《Markdown 语法说明 (简体中文版)》](http://wowubuntu.com/markdown/)
--------------------------------------------------------------------------------
/docs/FarBox Editor/about.md:
--------------------------------------------------------------------------------
1 | Date: 2013-03-14 12:43:50
2 | Title: 关于Editor
3 |
4 | ## 简介
5 |
6 | FarBox Editor是一款MarkDown的编辑器,同时也是集成了[FarBox](http://farbox.com)同步功能的客户端。
7 |
8 | Editor的风格同FarBox一致,追求极简。我们希望所有的使用者能回归到`写作`的本身。
9 |
10 | - - - - - -
11 |
12 | ## 初衷
13 |
14 | 我们仍然有很多不错的选择,比如:[Free][free]、[ByWord][bw]、[iA Writer][ia]、[Mou][mou]。因为一些细节上的问题,总是让我们觉得不满足。
15 |
16 | 我们希望Editor是几乎没有`保存`按钮的,不用去判断存储于何处;能对额外的文章属性(metadata) 有很好的支持;以及能够对(插入)图片有很好的支持。
17 |
18 | 不如从头写一个软件吧?我们这样想。`为自己而制`,一旦这样的欲望萌发了,其实,就无法停下来了。
19 |
20 | - - - - - -
21 |
22 | ## 特性
23 |
24 | 1. 双语版,简体中文+英文版
25 | - 双系统, Mac+Windows
26 | - FarBox.com同源的MarkDown解析,支持代码高亮
27 | - 支持图片直接拖入
28 | - 博客目录文件的直接管理,快捷的目录(分类)调整
29 | - 可自定制HTML模板文件以及CSS文件
30 | - 导出PDF
31 | - 绑定FarBox上的域名
32 | - 直接同步到FarBox
33 | - 非网盘用户,也可直接使用
34 |
35 | - - - - - -
36 |
37 | ## 下载地址
38 |
39 | [http://farbox.com/fb-download](http://farbox.com/fb-download)
40 |
41 |
42 | [free]: https://itunes.apple.com/cn/app/free/id486226904?mt=12
43 | [bw]: https://itunes.apple.com/cn/app/byword/id420212497?mt=12
44 | [ia]: https://itunes.apple.com/cn/app/ia-writer/id439623248?mt=12
45 | [mou]: http://mouapp.com
46 |
47 |
48 |
49 |
--------------------------------------------------------------------------------
/docs/书写/代码高亮.md:
--------------------------------------------------------------------------------
1 |
2 | # 代码高亮语法
3 |
4 | > **主要是进行程序语言的类型,这样语法高亮会为之优化视觉呈现。**
5 |
6 | > **声明语言的好处: 能知道这个语言的一些含义; 比如代码中注释的内容,会斜体处理,以及具体的关键字会加亮。**
7 |
8 | ## GitHub式的代码高亮
9 |
10 | \`\`\`python
11 | import this
12 | print 'something'
13 | \`\`\`
14 |
15 | 将被显示为,其中python为语言类型的申明:
16 |
17 | ```python
18 | import this
19 | print 'something'
20 | ```
21 |
22 | ----
23 |
24 |
25 | ## 缩进并使用冒号声明
26 |
27 | 如果首行使用3个或3个以上的冒号进行程序语言的声明,那么首行将不呈现,也可省略代码行数的标示。比如:
28 |
29 | :::python
30 | # 这里是代码 ...
31 |
32 | 结果将呈现为:
33 |
34 | :::python
35 | # 这里是代码…
36 |
37 | - - - -
38 |
39 | ## 缩进但不声明语言类型
40 |
41 | 会采用默认的``包裹源码。形如:
42 |
43 |
44 |
45 | 这里是代码…
46 |
47 |
48 |
49 | - - - -
50 |
51 | ## 申明解析器shebang
52 |
53 | ### #!有路径
54 |
55 | 如果首行定义了shebang,并且是有路径的,那么代码行数将会出现
56 |
57 | #!/usr/bin/python
58 | # 这里是代码….
59 |
60 | 结果将呈现为:
61 |
62 | #!/usr/bin/python
63 | # 这里是代码
64 | # 这里是代码….
65 |
66 |
67 | ### #!无路径
68 |
69 | 仍然会出现代码行数,但首行不呈现,比如
70 |
71 | #!python
72 | # 这里是代码….
73 |
74 | 将呈现为:
75 |
76 | #!python
77 | # 这里是代码
78 | # 这里是代码…
79 |
80 |
--------------------------------------------------------------------------------
/docs/书写/写作规则.md:
--------------------------------------------------------------------------------
1 | # 写作规则
2 |
3 | ## 基本规则
4 |
5 | - 文件名即文章的标题
6 | - 文件内容,即文章正文
7 |
8 | - - - - - - - - - - - -
9 |
10 | ## 进阶规则
11 |
12 | 在文章的第一行开始,可以进行标注(非必要,按需即可),格式如下
13 |
14 | Title: 这里写你的文章标题
15 | Date: 这里写文章的发表时间,默认为文本文件的最后修改时间
16 | Status: Draft (draft的文章不会被别人看到, 默认为public)
17 | Tags: Tag1 Tag2
18 | url: 文章被访问的地址
19 |
20 | 1. 如果没有标注Title,文件名即是文章的标题。比如"我的文章.txt" --> "我文章"
21 | 2. 如果没有标注url,比如"我的文章.txt"可以通过"/post/wo-de-wen-zhang"进行访问;如果有指定的url,则会替换“wo-de-wen-zhang”这个默认值
22 | 3. 文章的文件名,目前支持.txt .md .markdown .docx四种格式
23 | 4. 关于Tags的规则,如果当前行中,有英文字符`,`,则会以`,`为分隔符;反之则以空格为分隔符。
24 | 5. .docx 不支持文本格式与插图
25 |
26 | - - - - - - - - - - - -
27 |
28 | ## 补充说明
29 |
30 | 1. 为了让URL地址看起来更友好,我们把汉字转义成了拼音,但目前在处理多音字上并不是很理想。
31 | 2. 目前url的标注是支持"/"符的,但最终生成的url会有个前缀 '/post/'。
32 | 3. 你可能会好奇,FarBox文档上的一些文章,头部的目录索引是怎么出现,其实很简单,`[TOC]`这5个(全英文)字符写在文章的合适位置(通常是标题下方)就可以了。TOC,即Table of Contents。
33 |
34 |
35 | - - - - - - - - - - - -
36 |
37 |
38 | ## 推荐MarkDown写作的APP(程序)
39 |
40 | ** 我们推荐[《FarBox Editor》](/fb-download),这是我们为FarBox而开发的写作程序。**
41 |
42 | 如果你是Mac用户,我们也同样推荐这些APP:
43 | [Free](https://itunes.apple.com/cn/app/free/id486226904?mt=12)、
44 | [ByWord](https://itunes.apple.com/cn/app/byword/id420212497?mt=12)、
45 | [iA Writer](https://itunes.apple.com/cn/app/ia-writer/id439623248?mt=12)、
46 | [Mou](http://mouapp.com);如果你是Windows用户,试试[MarkdownPad](http://markdownpad.com/)。
47 |
48 | 使用优秀的APP,你可以在不同的平台上轻松写作,比如iPad、iPhone .etc。
49 |
50 |
--------------------------------------------------------------------------------
/docs/模板API文档/模板引擎基础.md:
--------------------------------------------------------------------------------
1 | # 模板引擎基础
2 |
3 | [TOC]
4 |
5 | ## Jinja2
6 |
7 | > 我们使用Jinja2(python的语法)的模板引擎,关于模板引擎的语法可参照 [其官网文档](http://jinja.pocoo.org/docs/)、 [《中文文档》](http://docs.torriacg.org/docs/jinja2/templates.html)
8 |
9 | ### Jinja2语法简单示例
10 |
11 |
21 |
22 |
23 | ### 简要说明
24 |
25 | 1. `{% %}`包裹着的一些代码块,通常是`{% for … %}{% endfor %}` `{% if %}{% elif %} {% else %} {% endif %}`
26 |
27 | * ` {{ var }} `这表示取变量
28 |
29 | * `{{ var|command }}`中,command是一个函数,效果相当于`command(var)`从而得到新的值
30 |
31 | * `{{ var|command(v1, v2) }}`,效果相当于`command(var, v1, v2)`
32 |
33 | *command这种类型的函数,在Jinja2中,称之为filters(滤镜)。*
34 |
35 | - - - - - - - - - - -
36 |
37 | ## FarBox模板
38 |
39 | ### 模板目录所在的位置
40 |
41 | **假设你现在的网站目录为`Dropbox/Apps/FarBox/MyBlog/`**
42 |
43 | 1. 模板页面则要放置于`Dropbox/Apps/FarBox/MyBlog/template/`的目录下
44 |
45 | 2. `/.template/` `/templates/` `/.templates/`也等同于`template`,取名可按照自己的喜好;特别是以`.`开头的文件夹,通常会被操作系统隐藏,有视觉洁癖的,推荐之。
46 |
47 | - - - -
48 |
49 | ### 静态资源的访问
50 |
51 | > 静态资源是指css、js、图片、字体等文件,并且大小不超过**500k**。
52 |
53 | 静态资源是通过`/template/`或`/t/`这个路径来实现访问的,并且,如果模板被别人使用时,静态资源也会同样生效。
54 |
55 | 以`/template/`目录举例说明:
56 |
57 | |-- template
58 | |-- index.html
59 | |-- css
60 | -- style.css --> 它可以通过/t/css/style.css访问
61 | |-- js
62 | -- behavior.js --> 它可以通过/t/js/behavior.js访问
63 |
64 |
65 | > 因为url以`/t/`为开头的,指向的是template,所以,你直接放在网站目录下的`/t/`文件夹是不会生效的;同理,`/post/` `/cateogry/` 等系统优先的url亦然。
66 |
67 |
--------------------------------------------------------------------------------
/docs/使用FarBox/网站目录结构.md:
--------------------------------------------------------------------------------
1 | # 网站目录结构
2 |
3 | **我们对文件的读取权限仅限于`/FarBox/`目录内,并且不会去删除你的文档。**
4 |
5 | 
6 |
7 | ## 在Dropbox里的目录
8 |
9 | |-- DropBox
10 | |-- Apps
11 | --| FarBox (这个是通过DropBox授权,我们对你Dropbox的文件操作,也仅限于此)
12 | --| site-folder-1 (这就是一个网站目录)
13 | --| site-folder-2 (这也是一个网站目录)
14 |
15 | - - - - - - - - -
16 |
17 | ## 网站目录基础结构
18 |
19 | |-- site-folder
20 | |-- domains.config (这个文件内填需要绑定的域名)
21 | |-- your-article.txt(.txt .md .markdown格式结尾的文件会被视为日志)
22 | |-- folder-1
23 | -- your-article-in-folder.txt
24 | |-- file.jpg (可以随便什么后缀,这表示非日志的文件)
25 | |-- another-folder
26 | -- file-in-folder.jpg
27 |
28 | - - - - - - - - -
29 |
30 | ## 网站目录拓展结构
31 |
32 | |-- site-folder
33 | |-- .template(这个是网站模板目录,如果无需自定制,这个目录不是必要的)
34 | -- index.html
35 | -- archive.html
36 | -- tags.html
37 | -- post.html
38 | -- pages.html
39 | -- file.html
40 | -- folder.html
41 | -- configs.html
42 | |-- index.html
43 | - 这个不是必须的
44 | - 如果你想把自己的blog弄成静态的HTML网站,如果这个页面存在,则会默认显示这个页面
45 |
46 |
47 | - - - - - - - - -
48 |
49 |
50 | ## 注意项
51 |
52 | - 如果试图做成静态网站的话,首页的文件名务必是`index.html`。
53 |
54 | - 如果在/.template/这个目录下定制了自己的模板,对应的某个模板文件不存在但又被用到,会从farbox服务器中继承默认的模板。
55 |
56 | - /.template/这个文件夹,在一般的操作系统中会被隐藏,这样的设定是希望真正写作的时候,不要有无谓的视觉干扰。
57 |
58 | - **/template/与 /templates/ 完全等价于 /.template/,所以你也可以选择这两个名称作为文件夹名称。**
59 |
60 | ## 不被处理的文件
61 |
62 | 所有在根目录下的,非文件夹性质的文件,都不会被解析。
63 |
64 | |-- DropBox
65 | |-- Apps
66 | --| FarBox
67 | --| site-folder-1 (这就是一个网站目录)
68 | --| site-folder-2 (这也是一个网站目录)
69 | --| file.md (非目录性质的,不处理)
70 | --| FileOutSite.txt (非FarBox内的文件,不处理)
71 |
72 | 如果你使用的是[FarBox Editor](/fb-download)进行编辑,那么,所有显示灰色调的文件,都是不被解析的。
73 |
74 |
--------------------------------------------------------------------------------
/docs/使用FarBox/常见问题.md:
--------------------------------------------------------------------------------
1 | Title: 常见问题
2 | Date: 2013-11-01
3 | [TOC]
4 |
5 | # 网站、域名
6 |
7 | ## 如何修改网站名字以及域名?
8 | > 直接修改文件夹名称,文件夹名称即网站名称。
9 |
10 | > 如果需要修改域名,则要进入网站目录内,修改(或新建)`domains.config`,把需要绑定的域名写进去即可。
11 |
12 | ## 如何使用FarBox的二级域名?
13 | > 同上,直接修改文件夹名就可以了;但请确保这个二级域名是别人没有用过的,并且不能小于3位。
14 |
15 | > 如何判断有没有人用过?访问下就知道了……
16 |
17 | ## 为什么我的网站无法访问,总是403错误?
18 | > 403错误是因为当前访问的域名在FarBox上没有记录;可能是还没有完成同步,所以还不可访问。
19 |
20 | > 其它原因,比如文件没有放在`站点目录`内;或者站点目录没有匹配域名(即没有domains.config文件)。
21 |
22 | > 如果都不是这些原因,请联系我们`hi@farbox.com`。
23 |
24 | ## 我想了解自己网站同步了几次,什么时候同步,怎么看?
25 | > 假设你的网站地址是`http://www.yourdomain.com`,那么在后面补一个`/status`,即`http://yourdomain.com/status`就可以看到相应的信息的了。
26 |
27 | - - - - - - - - - -
28 |
29 | # 网站内容:文章、图片
30 |
31 | ## 可以设置文章的发表日期、Tag么?
32 | > 可以的,在文章的**第一行**`date: 2012-12-12 12:12`这样的声明,就可以了。更多可查看[《写作规则》](/#写作规则)
33 |
34 | ## 文章、图片可以随便放任何的文件夹里么?
35 | > 当然可以。但前提是在某个网站目录内就可以了。
36 |
37 | ## 如何插入图片?
38 | > ``,这样的格式可以直接插入图片。其中`/your-folder/test.jpg`位于你当前网站目录下的文件。
39 |
40 | > 这是[MarkDown](/#MarkDown语法简明版)的语法,一般情况下,如果用这个语法写作,我们建议你使用`.md`作为文件的后缀名。
41 |
42 | ## 为什么MarkDown写的文章格式没有显示正常?
43 | > 如果使用默认模板,请确保自己的MarkDown文件格式是以`.md`或`.markdown`结尾的。
44 |
45 | > 或者直接修改模板源码,默认模板对正文显示,使用的`auto_content`函数,对`.txt`后缀的文件不做MarkDown的解析。
46 |
47 | ## 如何显示文章摘要?
48 | > 一种方式是自动摘要,使用`limit函数`来控制字数。
49 |
50 | > 另外一种是手工摘要,使用`post.opening`来输出第一个``标签之前的正文,并且保留原始HTML格式。
51 |
52 | > 什么是`post.opening`? 参见[《页面变量》](/#页面变量)
53 |
54 | **通常,想获得最符合自己需求的文章呈现效果,需要修改相应的模板代码。**
55 |
56 |
57 | ## 不想把所有的图片都显示在相册里,相册的目录能不能指定的?
58 | > 打开`/template/configs.html`(如果没有则新建),增加(或修改)`{% set file_path = '/' %}`。`file_path`的默认值为`/`,相当全站;你可以指定为自己需要的相册文件夹。
59 |
60 | ## 怎么才能让相册按照文件夹的形式分类,而不是全部输出?
61 |
62 | > 打开`/template/configs.html`(如果没有则新建),增加(或修改)`{% set file_index_level = 'child' %}` `{% set file_index_type = 'file' %}`。
63 |
64 | > 更具体的可以了解[《模板配置项》](/#模板配置项)
65 |
66 |
67 | - - - - - -
68 |
69 | # 网站同步
70 |
71 | ##Dropbox为什么没有马上同步?
72 | > 同步有个时间差,Dropbox的平均同步时间为`最快`5分钟同步一次。
73 |
74 | > 但这是一个平均值,如果网站很久没有同步过了,那么手工同步一次是非常快速的;反之,则会遵守这个时间差。
75 |
76 | ## 有没有什么办法,可以写完文章后马上同步?
77 |
78 | > 可以下载FarBox的写作客户端,[FarBox Editor](/fb-download)。它提供这样的支持。
79 |
80 |
81 |
82 |
83 |
84 |
--------------------------------------------------------------------------------
/docs/模板API文档/URL规则.md:
--------------------------------------------------------------------------------
1 |
2 | [TOC]
3 |
4 | # URL规则
5 | > FarBox引擎上的页面,首先会遵循系统默认的URL规则;其次会根据使用者的模板页面,自动创建出自定义的URL映射。
6 |
7 | ## 默认URL规则
8 |
9 | ### URL与模板文件
10 | *`模板文件`是指`/template/`目录下的文件*
11 |
12 | | 页面名 | url | 使用的模板| 补充说明 |
13 | | ----- | --- | --- |
14 | | 首页 | / | index.html |如果根目录放置index.html文件,则会显示index.html的内容|
15 | | 文章详细页|/post/`` | post.html |
16 | | 文章分类页 | /category/`` | category.html | path是对应的文件夹路径,显示该文件夹的所有文章 |
17 | | 标签匹配页 | /tags/`` | tags.html |单标签`/tags/tag1`; 多标签`/tags/tag1+tag2` |
18 | | 博客归档页 | /archive | archive.html|
19 | | 文件目录 |/folder/ & /folder/`` | folder.html| 现仅支持图片 |
20 | | 单文件详细 | /file/`` | file.html | 现仅支持图片 |
21 | | RSS订阅页 | /feed | feed.html | 默认全文输出,可自定义 |
22 | | MarkDown文档页 | /``| markdown.html| 对普通文章类文件(markdown为主)进行HTML渲染|
23 | | 静态文件 | /`` | 无 | 不要忘记有个`/`开头 |
24 | | 404页面 | 无 | errors/404.html | 当文章、文件找不到时候的页面 |
25 |
26 | - - - - - - - - - -
27 |
28 | ### 举例说明
29 |
30 | |-- site-folder@yourdomain.com --> http://yourdomain.com/会是首页
31 | |-- your-article.txt(.txt .md .markdown .docx格式结尾的文件会被视为日志)
32 | ---> http://yourdomain.com/post/your-article可以访问文章详细页面
33 | |-- folder-1
34 | -- your-article-in-folder.txt
35 | ---> http://yourdomain.com/post/your-article-in-folder 可访问
36 | |-- file.jpg (可以随便什么后缀,这表示非日志的文件)
37 | ---> http://yourdomain.com/file.jpg 可访问
38 | |-- another-folder
39 | -- file-in-folder.jpg
40 | ---> http://yourdomain.com/another-folder/file.jpg 可访问
41 | |-- this-is-md-file.md (MarkDown文档)
42 | ---> http://yourdomain.com/this-is-md-file.md
43 |
44 | - - - - - - - - - -
45 |
46 | ## 自定义URL规则
47 |
48 | ### 实现逻辑
49 |
50 | FarBox会根据你自己模板目录下的文件,自动对应自定义URL。
51 |
52 | 比如`/template/you.html`,这个模板文件如果存在,那么,访问`http://yoursite.domain.com/you`就会自动对应到这个模板。
53 |
54 | 如果所定义的模板,最终返回的是json或者xml,模板文件名需要加上`__json`/`__xml`。比如`/template/you__json.html`,最终页面`http://yoursite.domain.com/you__json`渲染后返回给浏览器的`content_type`才会是正确的`application/json`
55 |
56 | - - - - - - - -
57 |
58 | ### 注意事项
59 | - 自定义url不能以`/`结尾,这是JSON API显示目录用的,会无法匹配自定义URL。
60 | - 不要使用中文来命名模板文件,比如`/template/你好.html`是无效的。
61 | - 模板文件必须保证`.html`的后缀,`.htm`也是无效的。
62 | - 也不要跟系统默认的url产生冲突,否则会无效;自定义url优先级低于系统url。
63 |
--------------------------------------------------------------------------------
/template/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | {{site.title}}
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 | {% for folder in get_folders('/docs') %}
18 | - {{ folder.title }}
19 |
20 | {% set posts = get_posts(folder.path) %}
21 | {% if posts %}
22 |
23 | {% for post in posts %}
24 | -
25 | {{post.title}}
26 |
27 | {%endfor%}
28 |
29 | {% endif %}
30 | {% endfor %}
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
81 |
82 |
83 |
--------------------------------------------------------------------------------
/docs/FarBox Editor/常见问题.md:
--------------------------------------------------------------------------------
1 | Date: 2013-03-14 12:43:50
2 | Title: Editor常见问题
3 |
4 |
5 | [TOC]
6 |
7 | # 上手步骤
8 |
9 | ## 如何绑定域名?
10 |
11 | 如果不绑定域名,将会无法访问。
12 |
13 | 
14 | 
15 |
16 |
17 | ## 如何同步?
18 | 如果是你Dropbox用户,所有的数据都会自动同步。
19 |
20 | 另外,在Editor这个软件中,以下方式可以进行同步:
21 |
22 | 1, 保存文章的时候,Ctrl+S(Mac上是Command+S)可以实现保存并同步到FarBox上。
23 |
24 | 2, 手工进行同步。
25 |
26 | ## 修改文章标题?
27 | 在文章开始的第一行,`title: 你所需要的标题`就可以了。更多的写作规则,参见[《写作规则》](/#写作规则)。
28 |
29 | 
30 |
31 |
32 | - - - -
33 |
34 | # 进阶
35 |
36 | ## 登录FarBox
37 | FarBox除了完成你的博客外,还提供了数据统计等功能。一些操作需要你登录FarBox才能实现。
38 |
39 | 在菜单上`帮助 > 打开FarBox`即可自动登录FarBox。
40 | 
41 |
42 | 如果你是使用Dropbox,为了进一步保障数据安全,则不会自动登录,需要你在首页中使用Dropbox才能登录。
43 |
44 | ## 如何删除网站、清空账户?
45 |
46 | 登录FarBox之后, 你可以看到如下图的这些操作。
47 |
48 | 
49 |
50 | 之后则会获得一个拥有删除权限的链接到你的注册邮箱。
51 |
52 |
53 | ## 如何重新同步?
54 |
55 | 在你的站点目录下面,你可以找到一个`.farbox.log`的文件,删除它之后,再进行一次同步就可以了。
56 |
57 | 如果你的网站里仍然有其它数据,在重新同步之前,你需要删除对应的网站。
58 |
59 |
60 | - - - -
61 |
62 |
63 | # FarBox Editor的副作用
64 | > 如果你使用Dropbox,则以下的副作用不会存在
65 | > 如果你不是Dropbox的用户,那么,你会遇到以下这些副作用。我们不会再接入任何一家国内的云盘服务商。[Why?](#)
66 |
67 | ## 同步范围的局限
68 |
69 | Editor同步的范围:
70 |
71 | - .md .txt .markdown文件
72 | - _image目录下的图片(单图不超过1M)
73 | - template目录下的html、css、图片、js等必要文件。
74 |
75 | ## 删除的局限
76 |
77 | 一般情况下,文章删除后,重新同步,在FarBox上也会被删除。
78 |
79 | 但如果是通过`保存并同步文章`(即Ctrl+S), 然后未进行过手工方式的同步,则它被删除的时候,则不会被识别。
80 |
81 | 如果一定要删除一篇已经不存在于本地,而还在FarBox上的文章,那么你需要新建一篇同名文章,重新同步,再删除,再同步。
82 |
83 | ## 站点文件夹的局限
84 |
85 | 不要试图改变站点文件夹的名字,除非你知道这意味着什么。
86 |
87 | 因为这意味着原来的网站跟新的文件夹断开了关联,一切需要重新同步。
88 |
89 |
90 | ## 我们推荐Dropbox+FarBox的方式
91 |
92 | 如果你在使用其它的云盘,那么可以使用云盘的功能来做为自己的文章、图片做备份。
93 |
94 | 但我们推荐的方式是Dropbox+FarBox的方式,这需要你在farbox.com的网站上进行一次登录,这样你将会获得完整的FarBox的服务,比如跨平台进行写作、整个目录的同步范围,以及更多即将推出的功能。
95 |
96 | 如下图所示,如果你的电脑上有Dropbox,那么点击`使用Dropbox`即可。
97 |
98 | 
99 |
100 | > 使用Dropbox,并非单纯指把根目录设定在Dropbox下就可以了。而是特指根目录在`Dropbox/Apps/FarBox`下的。
101 |
102 |
103 | # 切换账户
104 |
105 | 如果你是Dropbox用户,那么,你实际上可以拥有两个账户。
106 |
107 | 一个是通过Dropbox关联到FarBox的,另一个是FarBox直接同步的。
108 |
109 | 如下图所示,两者对应的分别是两个账户。虽然很可能两个账户的邮箱是一致的。
110 |
111 | 
112 |
113 | 在不同账户下,通过`帮助 > 打开FarBox`对应的账户也是不同的。
114 |
115 |
116 |
117 |
118 |
119 |
120 |
121 |
122 |
--------------------------------------------------------------------------------
/docs/模板API文档/模板配置项.md:
--------------------------------------------------------------------------------
1 | # 模板配置项
2 |
3 | ## 命名规则
4 |
5 | **configs内的配置项来自于`/template/configs.html`**,形式如下:
6 |
7 | {% set files = True %}
8 | {% set posts = True %}
9 | {% set posts_per_page = 3 %}
10 | {% set files_per_page = 6 %}
11 | {% set index_allowed = False %}
12 | {% set file_path = '/' %}
13 | {% set file_level = 'child' %}
14 | {% set file_type = 'image' %}
15 | {% set file_index_level = 'all' %}
16 | {% set file_index_type = 'image' %}
17 |
18 | > 请确保`'image'`此类的内容中使用的是英文状态下的单引号、双引号;不然可能引发错误或者不被识别。
19 |
20 | > 除了上述基本设置外,也可以自行进行扩展,最终在其它模板源码中,可以直接请求`{{configs.your_config_name}}`来获得配置项目。
21 |
22 |
23 | - - - - - - - -
24 |
25 | ## 配置项说明
26 |
27 | | 变量名 | 默认值 | 描述 |
28 | | ----- | ----- | --- |
29 | | files | True | 网站是否启用文件(目前即相册)|
30 | | posts | True | 网站是否启用博客|
31 | | posts_per_page | 3 | 分页时,每页显示几篇日志 |
32 | | files_per_page | 6 | 分页时,每页显示几个文件(图片) |
33 | | index_allowed | False | 是否允许JSON格式输出站点内容结构 |
34 | | file_path | '/' | 如启用相册,总相册的路径 `不在这个路径范围内的不输出` |
35 | | file_level | 'child' | 显示文件夹内的所有文件还是仅子文件 'all'/'child'|
36 | | file_type | 'image' | 确定文件的类型,'file'/'folder'/'image' |
37 | | file_sort | 'desc' | 文件列表按日期的升降序,可选`desc`、`asc` |
38 | | file_index_level | 'all' | 同`file_level`, 仅在首页时生效 |
39 | | file_index_type | 'image' | 同`file_type`,仅在首页时生效 |
40 | | hidden_urls | [] | 禁止某些路径下的页面呈现 |
41 |
42 |
43 | ### file_path (文件根目录)
44 |
45 | 启用(文件)相册情况下,当用户访问`/folder/`这个url时,所显示的内容来自于哪个目录,称之为`根目录`。
46 |
47 | 默认是`/`,相当于当前站点目录下的所有图片都会被显示出来。
48 |
49 |
50 | ### file_level (目录内文件的层级)
51 |
52 | 有两个值可选,`child`和`all`。假设以下这个文件夹内(file_type为image的情况下)。
53 |
54 | |-- folder
55 | |-- 1.jpg
56 | |-- sub_folder
57 | -- 2.jpg
58 |
59 | 如果是`all`,则会显示`1.jpg` & `sub_folder/2.jpg`; 如果是child,则仅显示`1.jpg`。
60 |
61 | `all`表示目录内的所有,`child`则标示仅仅直属于当前文件夹的。
62 |
63 |
64 | ### file_type (目录内文件的类型)
65 |
66 | 有三个值可选,`file` `folder` `image`,表示要返回的文件类型,以下面目录为例(file_level为all的情况下)。
67 |
68 | |-- folder
69 | |-- 1.jpg
70 | |-- sub_folder
71 | -- 2.jpg
72 |
73 | `file`会返回如下值,相当于遍历当前目录的所有文件
74 |
75 | 1.jpg
76 | sub_folder
77 | sub_folder/2.jpg
78 |
79 | `folder`则仅返回目录类型的,如下
80 |
81 | sub_folder
82 |
83 | `image`则返回图片类型的,如下
84 |
85 | 1.jpg
86 | sub_folder/2.jpg
87 |
88 |
89 | **注意!!! 如果没有对自己的文件夹有很好的分类,慎用file_type=`file`这个设定值,因为它也会返回其它类型的文件,比如pdf、css、html等,通常情况下,这会让你的页面视觉变得很恐怖。**
90 |
91 |
92 |
93 | ### file_index_level (根目录显示的文件层级)
94 |
95 | 同file_level,但仅仅在访问到的目录刚好是`file_path`的时候生效,就是通常理解的相册首页。
96 |
97 |
98 | ### file_index_type (根目录显示的文件类型)
99 |
100 | 同file_type,但仅仅在访问到的目录刚好是`file_path`的时候生效,就是通常理解的相册首页。
101 |
102 |
103 | ### hidden_urls (禁止某些路径的访问)
104 |
105 | ```
106 | 如果,{% set hidden_urls = ['the_path', 'pages/*'] %}
107 | ```
108 | 那么访问以下路径,都会抛出404错误
109 |
110 | 1. http://yourdomain.com/the_path
111 | - http://yourdomain.com/pages/a
112 | - http://yourdomain.com/pages/b
113 |
114 |
115 | - - - - - - - -
116 |
117 |
118 | ## 其它注意事项
119 |
120 | 1, 访问`http://yourdomain.com/status`可以查看到当前网站的模板配置项
121 |
122 | 2, `configs.html`实际上不会作为模板被显示出来,虽然命名规则采用了模板的写法,但不要在该文件内写其它非配置性的语法;否则,可能会引发冲突。
123 |
124 |
--------------------------------------------------------------------------------
/fb.preview/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Frame
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 | - 书写
20 |
21 |
22 |
23 |
38 |
39 |
40 | - 域名相关
41 |
42 |
43 |
44 |
51 |
52 |
53 | - 进阶
54 |
55 |
56 |
57 |
58 | - 模板API文档
59 |
60 |
61 |
62 |
93 |
94 |
95 | - 使用FarBox
96 |
97 |
98 |
99 |
134 |
135 |
136 |
137 |
138 |
139 |
140 |
141 |
142 |
143 |
169 |
170 |
171 |
--------------------------------------------------------------------------------
/fb.preview/post.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
35 |
Jinja2
36 |
37 | 我们使用Jinja2(python的语法)的模板引擎,关于模板引擎的语法可参照 其官网文档、 《中文文档》
38 |
39 |
Jinja2语法简单示例
40 |
<ul>
41 | {% for user in users %}
42 | {% if user.age >10 %}
43 | <li>
44 | <a href="{{ user.url|command1}}">{{ user.username|command2(color=True) }}
45 | </a>
46 | </li>
47 | {% endif %}
48 | {% endfor %}
49 | </ul>
50 |
51 |
52 |
53 |
简要说明
54 |
55 | -
56 |
{% %}包裹着的一些代码块,通常是{% for … %}{% endfor %} {% if %}{% elif %} {% else %} {% endif %}
57 |
58 | -
59 |
{{ var }}这表示取变量
60 |
61 | -
62 |
{{ var|command }}中,command是一个函数,效果相当于command(var)从而得到新的值
63 |
64 | -
65 |
{{ var|command(v1, v2) }},效果相当于command(var, v1, v2)
66 |
67 |
68 |
command这种类型的函数,在Jinja2中,称之为filters(滤镜)。
69 |
70 |
FarBox模板
71 |
模板目录所在的位置
72 |
假设你现在的网站目录为Dropbox/Apps/FarBox/MyBlog/
73 |
74 | -
75 |
模板页面则要放置于Dropbox/Apps/FarBox/MyBlog/template/的目录下
76 |
77 | -
78 |
/.template/ /templates/ /.templates/也等同于template,取名可按照自己的喜好;特别是以.开头的文件夹,通常会被操作系统隐藏,有视觉洁癖的,推荐之。
79 |
80 |
81 |
82 |
静态资源的访问
83 |
84 | 静态资源是指css、js、图片、字体等文件,并且大小不超过500k。
85 |
86 |
静态资源是通过/template/<path>或/t/<path>这个路径来实现访问的,并且,如果模板被别人使用时,静态资源也会同样生效。
87 |
以/template/目录举例说明:
88 |
|-- template
89 | |-- index.html
90 | |-- css
91 | -- style.css --> 它可以通过/t/css/style.css访问
92 | |-- js
93 | -- behavior.js --> 它可以通过/t/js/behavior.js访问
94 |
95 |
96 |
97 |
98 | 因为url以/t/为开头的,指向的是template,所以,你直接放在网站目录下的/t/文件夹是不会生效的;同理,/post/ /cateogry/ 等系统优先的url亦然。
99 |
100 |
101 |
102 |
103 |
104 |
105 |
--------------------------------------------------------------------------------
/docs/模板API文档/页面函数.md:
--------------------------------------------------------------------------------
1 | # 页面函数
2 |
3 | [TOC]
4 |
5 | ## 页面函数类型
6 |
7 | ### Filter
8 |
9 | 类似滤镜的概念,处理传入的变量,重新处理后,再传出。
10 |
11 | 假设有个filter名字叫`test`,有个变量名为`content`内容为`it's me, 250!`; `test`实现的功能就是把`250`替换为`very 250`。
12 |
13 | 那么,如下:
14 |
15 | {{ content | test }}
16 |
17 | 最终显示在页面为 `it's me, very 250!`.
18 |
19 | 如果filter是可接受变量的,那么这样使用`{{ value | function(arg_needed) }}`即可。
20 |
21 | ### Function
22 |
23 | 比较纯粹的函数,通常会返回值。
24 |
25 | 在模板可以这样使用`{{ function() }}`,;
26 |
27 |
28 | 以般情况下比如获取的结果是列表形式的,我们推荐先设变量名,后续使用起来可读性会高一些。
29 |
30 | 比如`{% set folders = get_folders('/') %}`,然后再直接`folders`这个变量就可以了。
31 |
32 |
33 |
34 | ## Function函数
35 |
36 |
37 | ### 系统默认函数
38 |
39 | - cycler
40 | - dict
41 | - joiner
42 | - lipsum
43 | - range
44 |
45 | [《官方文档》](http://jinja.pocoo.org/docs/templates/#list-of-global-functions)、
46 | [《中文文档》](http://docs.torriacg.org/docs/jinja2/templates.html#builtin-globals)
47 |
48 |
49 | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
50 |
51 |
52 |
53 | ### get_folders
54 |
55 | 接收``作为参数,可以获得某个``下的文件夹,另外,也同时接收 `` ``这两个参数。
56 |
57 | 模板代码示例:
58 |
59 | {% for folder in get_folders('/') %}
60 | Folder Name: {% folder.title %}
61 | {% endfor %}
62 |
63 |
64 | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
65 |
66 |
67 | ### get_images
68 |
69 | 用于获得指定目录下的图片列表。接收参数`` `` ``。
70 |
71 | `limit` 为返回的记录条数,小于50的整数,默认为20;`sort`为按照日期的升降序,可选`desc`、`asc`,默认为`desc`。
72 |
73 | 代码示例:
74 |
75 | {% set images= get_images('/') %}
76 | {% for image in images%}
77 |
78 | {% endfor %}
79 |
80 | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
81 |
82 |
83 | ### get_one_image
84 |
85 | 用于获得指定目录下的一张图片。接收参数`` ``。
86 |
87 | `path`为所指定的目录,默认为`'/'`。
88 |
89 | `sort`为按照日期的升降序,可选`desc`、`asc`,默认为`desc`。
90 |
91 | 此方法会去遍历所指定目录下的所有图片,比如`/folder/sub/folder/1.jpg`若在指定获取`/`下的图片时,也是会被取得的。
92 |
93 | 如果没有图片,则返回None
94 |
95 |
96 | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
97 |
98 |
99 | ### get_file
100 |
101 | 接受参数``, 根据路径,获取文件(包括目录)。但此函数,无法获取文章类型的。
102 |
103 |
104 | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
105 |
106 |
107 | ### get_posts
108 |
109 | 用于获得指定目录下的文章列表。接收参数`` `` ``。参考`get_images`这个函数的用法。
110 |
111 | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
112 |
113 |
114 | ### get_posts_by_tags
115 |
116 | 用于获得指定目录下的文章列表。接收参数`` `` ``。参考`get_posts`这个函数的用法。
117 |
118 | 代码示例:
119 |
120 | {% set posts = get_posts_by_tags('tag1') %}
121 |
122 | {% set posts = get_posts_by_tags(['tag1', 'tag2']) %} --> 这表示同时具有两个tag,而不是`或`的关系。
123 |
124 | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
125 |
126 |
127 | ### get_post
128 |
129 | 接受参数``, 根据路径,获取文章。文章的`status`必须是`public`状态的,否则无结果返回
130 |
131 |
132 | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
133 |
134 | ### get_text_file
135 |
136 | 接受参数``,跟`get_post`一样,也是获取文章类文件的,它要求文章的`status`不是`secrect`或`private`就可以了。
137 |
138 | 另外,跟get_post不一样的是,它是前匹配的。
139 |
140 | 比如要匹配`文章/title.md`这个文件,以下两种方式都可以。
141 |
142 | {{ get_text_file('文章/title.md') }}
143 |
144 | {{ get_text_file('文章/title') }}
145 |
146 | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
147 |
148 | ### get_paginator
149 |
150 | 这可以获得分页信息。
151 |
152 | 使用`get_folders` `get_images` `get_posts` `get_posts_by_tags`这几个列表式函数的时候,都会自动产生一个全局的(分页)变量,通过get_paginator这个函数,可以获得该变量。
153 |
154 | 假设以下代码,一个页面多次使用列表式函数:
155 |
156 | {% set images = get_images('/') %}
157 | {% set posts = get_posts('/') %}
158 |
159 | 这个时候,`get_paginator`所对应的信息仅是针对`images`这个变量。
160 |
161 | > 注意:因涉及到自动分页,默认的limit都为20,limit最大不超过100。
162 |
163 |
164 | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
165 |
166 |
167 | ### get_connected_one
168 |
169 | 主要用于在`/file/`或`/post/`页面中,获取上一个、下一个的数据对象。
170 |
171 | 接收参数如 `get_connected_one(, )`, ``默认为`None`,表示所要查询的目录路径, `condition`默认为`>`,表示下一篇,`<`则表示上一篇.
172 |
173 |
174 | 模板代码示例:
175 |
176 | {% set next_one = get_connected_one('>') %}
177 | {% set pre_one = get_connected_one('<') %}
178 | {% if pre_one %}
179 |
180 | <{{ pre_one.title }}
181 |
182 | {% endif %}
183 | {% if next_one %}
184 |
185 | >{{ next_one.title }}
186 |
187 | {% endif %}
188 |
189 | 如果你的相册中没有目录、分类的概念,取上下个照片时,可以设定`='/'`; 如果`=None`(默认)的时候,表示它是自适应的,如果照片在某个目录下,则以这个目录为范围,去查找上下个对象。
190 |
191 | > 另外需要注意下,不要因为排序的变更(比如照片列表由升序变为降序)而更改`<``>`的方向;它们会自动匹配排序的。
192 |
193 |
194 | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
195 |
196 |
197 | ### bread_nav
198 |
199 | 可以将一个``的字符串,转为一个面包屑导航。接收参数如:`bread_nav(, )`
200 |
201 | 假设`` 为 `/folder 22/img_3851.jpg`, 那么 `{{ bread_nav(path,'/folder/') }}` 最终转化为一下HTML代码:
202 |
203 |
204 | -
205 | /
206 |
207 | -
208 | folder 22/
209 |
210 | - img_3851.jpg
211 |
212 |
213 |
214 | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
215 |
216 | ### has
217 |
218 | 判断是否存在某(个)类文件,返回`True`或`False`
219 |
220 |
221 | has('images') #当前网站是否存在图片
222 | has('posts') #当前网站是否存在公开的日志
223 | has('files') # 当前网站是否存在文件
224 | has('具体的路径') #这个文件是否存在
225 |
226 | 注意:所有路径是不分大小写的。
227 |
228 |
229 | ## Filter函数
230 |
231 |
232 | 系统默认Filter详细见[《Jinja2官方文档》](http://jinja.pocoo.org/docs/templates/#builtin-filters)
233 |
234 |
235 | 除了jinja2默认自带的外,我们还提供了以下几个filter
236 |
237 | | filter名 | 针对于 | 使用方法 | 描述 |
238 | | -- | -- | -- | -- |
239 | | date | 日期 | date(格式字符串) | 转化时间的显示格式,比如'%Y-%m-%d %H:%M' |
240 | | limit | 文本 | limit(整数) | 截取文本前多少字,并转化为HTML格式 |
241 | | linebreaks | 文本 | 无需参数 | 把平文本转化为HTML格式的 |
242 | | lazy_text | 文本 | 无需参数 | 去除所有的格式与HTML标签,但保留分行 |
243 | | auto_content | post |无需参数 | 这个是针对post变量的,会自动转义post.raw_content的内容,如果post原生文件是以.txt结尾的,则不进行markdown的渲染,只是普通的HTML转义 |
244 |
245 |
246 | ### limit
247 |
248 | 使用`limit`对数据进行操作最终获得是HTML格式的文本信息,但同时,它也有两个子属性`more` & `no_pic`
249 |
250 | {% set content = post.content|limit(200) %}
251 | {{ content }} ---> 截断前200字符长度的内容,如果有img节点,则会保留
252 | {{ content.no_pic }} --> 同上,但同时也会去除img节点
253 | {{ content.more }} --> 如果content的内容长度>200,则为True,反之为False
254 |
255 | - - - - - - - - -
256 |
257 | ### 注意事项
258 |
259 | - **涉及日期类型的变量,模板中应该是这种写法{{ post.date | date('%Y-%m-%d %H:%M') }},仅仅{{post.date}} 返回的是UTC标准时间,未校正为你账号对应的时区。中国的时区为UTC+8。**
260 |
261 | #### TimeFormat
262 |
263 | %a 本地的星期缩写
264 | %A 本地的星期全称
265 | %b 本地的月份缩写
266 | %B 本地的月份全称
267 | %c 本地的合适的日期和时间表示形式
268 | %d 月份中的第几天,类型为decimal number(10进制数字),范围[01,31]
269 | %f 微秒,类型为decimal number,范围[0,999999],Python 2.6新增
270 | %H 小时(24进制),类型为decimal number,范围[00,23]
271 | %I 小时(12进制),类型为decimal number,范围[01,12]
272 | %j 一年中的第几天,类型为decimal number,范围[001,366]
273 | %m 月份,类型为decimal number,范围[01,12]
274 | %M 分钟,类型为decimal number,范围[00,59]
275 | %p 本地的上午或下午的表示(AM或PM),只当设置为%I(12进制)时才有效
276 | %S 秒钟,类型为decimal number,范围[00,61](60和61是为了处理闰秒)
277 | %U 一年中的第几周(以星期日为一周的开始),类型为decimal number,范围[00,53]
278 | %w 星期,类型为decimal number,范围[0,6],0为星期日
279 | %W 一年中的第几周(以星期一为一周的开始),类型为decimal number,范围[00,53]
280 | %x 本地的合适的日期表示形式
281 | %X 本地的合适的时间表示形式
282 | %y 去掉世纪的年份数,类型为decimal number,范围[00,99]
283 | %Y 带有世纪的年份数,类型为decimal number
284 | %Z 时区名字(不存在时区时为空)
285 | %% 代表转义的"%"字符
286 |
287 |
288 |
289 |
--------------------------------------------------------------------------------
/docs/模板API文档/页面变量.md:
--------------------------------------------------------------------------------
1 | Title: 页面变量
2 |
3 | [TOC]
4 |
5 | # 模板页面与变量
6 |
7 | ## URL与模板
8 |
9 | *`使用的模板`是指`/template/`目录下的文件*
10 |
11 |
12 | | 页面名 | url | 使用的模板| 补充说明 |
13 | | ----- | --- | --- |
14 | | 首页 | / | index.html |如果根目录放置index.html文件,则会显示index.html的内容|
15 | | 文章详细页|/post/`` | post.html |
16 | | 文章分类页 | /category/`` | category.html | path是对应的文件夹路径,显示该文件夹的所有文章 |
17 | | 标签匹配页 | /tags/`` | tags.html |单标签`/tags/tag1`; 多标签`/tags/tag1+tag2` |
18 | | 博客归档页 | /archive | archive.html|
19 | | 文件目录 |/folder/ & /folder/`` | folder.html| 现仅支持图片|
20 | | 单文件详细 | /file/`` | file.html | 现仅支持图片 |
21 | | RSS订阅页 | /feed | feed.html | 默认全文输出,可自定义 |
22 | | 文本直显页 | /``| markdown.html| 对普通文章类文件(markdown为主)进行HTML渲染|
23 | | 静态文件 | /`` | 无 | 不要忘记有个`/`开头 |
24 | | 404页面 | 无 | errors/404.html | 当文章、文件找不到时候的页面 |
25 |
26 |
27 |
28 | - - - - - - - - - -
29 |
30 |
31 | ## 各页面的变量
32 |
33 | | 页面名 | 变量 |
34 | | ----- | --- |
35 | | **全局变量** | `site` `request` `session_account` |
36 | | 首页 index.html | `posts` `files` `paginator`|
37 | | 文章详细页 post.html | `post`|
38 | | 文章分类页 cateogry.html| `posts` `paginator` |
39 | | 博客归档页 archive.html | `posts` `paginator` `archive`|
40 | | 标签匹配页 tags.html | `tags` `posts` `paginator`|
41 | | 博客列表页 posts.html| `posts` `paginator` |
42 | | 文件目录 folder.html | `folder` `files` `paginator` |
43 | | 单文件详细 file.html | `file` |
44 | | RSS订阅页 feed.html | `posts`|
45 | | 文本直显页 markdown.html | `post`|
46 |
47 |
48 | ## 复数变量
49 |
50 | 比如`posts`相对于`post`,`files`相对于`file`,都是复数变量。
51 |
52 | 我们通常的做法是根据页面呈现的需要遍历它们,比如:
53 |
54 | ```
55 | {% for file in files %}
56 | {{ file.title }}
57 | {% endfor %}
58 | ```
59 |
60 |
61 | # 页面变量详细说明
62 |
63 | ## request
64 |
65 | ### request的字段
66 |
67 | | 变量名 | 类型 |描述 |
68 | | ----- | --- | --- |
69 | | request.form | 字典 | 通过POST\PUT方式的传值|
70 | | request.args | 字典 | 通过GET方式的传值 |
71 | | request.values | 字典 | 合并了form & args |
72 | | request.method | 字符串 | 如`GET` `POST` `PUT`等 |
73 | | request.json | 字典 | 客户端发送的mimetype是`application/json`,则此变量存在 |
74 | | request.is_login | 布尔值 | 当前用户是否已登录 |
75 | | request.path | 字符串| - |
76 | | request.url | 字符串 | - |
77 | | request.base_url | 字符串 | - |
78 | | request.url_root | 字符串 | - |
79 |
80 | ### request的路径字段说明
81 |
82 | 假设`http://www.example.com/page.html?x=y` 被访问,则request有以下几个变量。
83 |
84 | | 变量名 | 值 |
85 | | --- | --- |
86 | | path | /page.html |
87 | | base_url | http://www.example.com/page.html |
88 | | url | http://www.example.com/page.html?x=y |
89 | | url_root | http://www.example.com/ |
90 |
91 | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
92 |
93 |
94 | ## session_account
95 |
96 | 如果用户已经登录,则session_account形如`{"service": "dropbox", "uid": 1234546}`;如未登录,则为`None`。
97 |
98 | 其中,service这个字段,可能值为`dropbox`、`farbox`、`kuaipan`(已不做进一步支持,如果值为kuaipan的,请慎重)。
99 |
100 |
101 | ## site
102 |
103 | ### site的字段
104 | | 变量名 | 描述 |
105 | | ----- | --- |
106 | | site.title | 网站的标题 |
107 | | site.site_path | 将site.title全部小写化,以`/`起止,形如`/site_name/` |
108 | | site.domain | 网站的域名(单个) |
109 | | site.domains | 网站的域名(多个) |
110 | | site.path| 网站对应的文件夹 |
111 | | site.tags | 当前网站的tags,数据类型为数组,tag_name+tag_count |
112 | | site.avatar | 网站所有的头像地址 |
113 | | site.configs | 网站的自定义属性 |
114 | | site.description | 网站的描述 |
115 |
116 | - - - -
117 |
118 | ### site.tags
119 |
120 | 1,site.tags是按照标签对应的文章数,倒序输出,形如:
121 | ```
122 | [('tag 1',3), ('tag 2', 1)]
123 | ```
124 |
125 | 2,site.tags模板代码示例:
126 | ```
127 | {% for tag_name, tag_count in site.tags %}
128 | {{ tag_name }}, {{ tag_count }}
129 | {% endfor %}
130 | ```
131 |
132 | 3,site.tags的数据会被缓存1个小时,所以有一定概率跟刚修改的文章tag不一致。
133 |
134 |
135 | 4,如果希望site.tags是按照tag名进行排序的,可以尝试以下代码:
136 | ```
137 | {% set tags=dict(site.tags)|dictsort %}
138 | {% for tag, count in tags %} {{tag}} - {{count}} {% endfor %}
139 | ```
140 |
141 | ### site.configs & site.description
142 |
143 | **我们推介用这种方式来实现模板给使用者时的自定义。**
144 |
145 | 这里面的内容来自于`网站目录`下的`site.md`文件, 文本头部类似`key: value`会作为site.configs的变量,文本的其它部分则为site.description。
146 |
147 | 比如
148 | ```
149 | title: Hello
150 | sites_count: 12
151 | 这里是网站的描述
152 | ```
153 | 那么
154 | ```
155 | site.configs = {
156 | "title": “Hello”,
157 | "sites_count": 12
158 | }
159 | site.description = "这里是网站的描述"
160 | ```
161 | 如果要使用更复杂的的yaml格式(比如包含列表)来声明site.configs,那么请确保site.configs的内容的头尾是用`---`包裹的。
162 |
163 |
164 | - - - -
165 |
166 | ### 其它说明
167 |
168 | 1,site.avatar
169 | > site.avatar即Gravatar.com上的头像对应到你所用云盘服务的注册Email地址,返回结果类似`http://www.gravatar.com/avatar/205e460b479e2e5b48aec07710c08d50`, 如果需要自定义尺寸,请直接使用`{{ site.avatar }}?s=123`
170 |
171 | - - - - - - - - - - - - - - - - - - - - - - - - - - - -
172 |
173 | ## archive
174 |
175 | archive变量形如
176 |
177 | ```
178 | [
179 | (2013, [, , ]),
180 | (2012, [, ]),
181 | ]
182 | ```
183 |
184 | 按照年份倒序, 其中``等是指一个post变量,参照`post`的变量说明。
185 |
186 |
187 |
188 |
189 | - - - - - - - - - -
190 |
191 |
192 | ## post
193 |
194 | ### post的字段
195 |
196 | | 变量名 | 描述 |
197 | | ----- | --- |
198 | | post.content | HTML格式的正文 |
199 | | post.raw_content | 原始正文|
200 | | post.opening | 以<hr>为分隔符分割`content`,并取前半部分|
201 | | post.read_more |如果post.opening已是全文,则为False;反之为True|
202 | | post.title | 标题 |
203 | | post.url | 文章的url地址,总是`/post/`为开头 |
204 | | post.url_path | 文章的url地址,但已经去掉了`/post/` |
205 | | post.date | 文章的发表日期 |
206 | | post.tags | The list of tags to which this post belongs.|
207 | | post.status | 文章的状态,默认为`public`|
208 | | post.cover | 文章封面图片的url地址,取正文内的第一张插图,若无则为None |
209 | | post.visits | 文章的访问数 |
210 | | post.metadata | 文章的元数据,需作者自己设定([YAML](http://yaml.org/)格式); 字典类型|
211 |
212 |
213 | ### post.metadata
214 |
215 | 如果一篇文章的第一行开始使用以下规则,
216 |
217 | ---
218 | key: value
219 | title: Blogging in FarBox
220 | ---
221 |
222 | 则获得的`post.metadata`为
223 |
224 | {
225 | "key": "value",
226 | "title": "Blogging in FarBox"
227 | }
228 |
229 |
230 | 另外,post的title、 url、tags、status等需要声明的属性,也优先取metadata中对应的值。
231 |
232 | **注意1,其中自己命名的key,不能以数字为开头,且不能有运算符,比如`site-name`是不合法的,`site_name`则可。**
233 |
234 | **注意2,如果要获得完整的yaml支持,请确保meta声明是包裹在`---`中的,并且在首行!**
235 |
236 |
237 | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
238 |
239 | ### post.read_more 与 limit/more
240 |
241 | [页面函数](/#页面函数)中有个函数,名为`limit`,可以对文章进行文字的截断。
242 |
243 | ```
244 | {% set content = post.content|limit(200) %}
245 | {{ content }} ---> 截断前200字长的内容,如果有img节点,则会保留
246 | {{ content.no_pic }} --> 同上,但同时也会去除img节点
247 | {{ content.more }} --> 如果content的内容长度>200,则为True,反之为False
248 | ```
249 |
250 | 如代码琐事,`{{ content.more }}`和 {{post.read_more}} 是不一样的,前者是针对所截断字数而言的;后者是针对全文有无`
`这样的标签的而言的。
251 |
252 |
253 |
254 | ## file & folder
255 |
256 | > 如果变量是folder,那么它的属性和file是一致的。
257 |
258 | ### file的字段
259 |
260 | | 变量名 | 描述 |
261 | | ----- | --- |
262 | | file.title | 文件(图片)的标题 |
263 | | file.content_type | 文件的类型,如`image/jpeg` `folder` |
264 | | file.url | 文件(图片)的网址,如果是文件夹,则为封面|
265 | | file.path | 相对于站点目录的路径 |
266 | | file.images_count| 如果是文件夹,返回内有多少照片数 |
267 | | file.exif | 图片的exif信息 |
268 | | file.date | 文件(图片)的创建时间,优先取exif内的信息|
269 | | file.raw_date | 文件的最后修改时间|
270 | | file.content | 如果是css/js文件,则是其源码,反之为空|
271 | | file.is_image | 是否是图片,True/False |
272 | | file.image_width | 图片宽,仅为图片时有此项 |
273 | | file.image_height | 图片高,仅为图片时有此项 |
274 |
275 | **如果是目录类型的file, file.url file.image_count的数值会被缓存60分钟**
276 |
277 | ### file.exif
278 |
279 | **只有照片才有可能有file.exif信息**
280 |
281 | | 变量名 | 描述 |
282 | | ----- | --- |
283 | | file.exif.make | 设备生产商,如 Apple |
284 | | file.exif.model | 设备型号, 如 iPhone 4 |
285 | | file.exif.datetime | 照片拍摄时间, 如 2012:10:17 18:22:14 |
286 | | file.exif.fn | 光圈值 |
287 | | file.exif.flash | 曝光模式,整数 |
288 | | file.exif.focal_length | 焦距 |
289 | | file.exif.exposure | 曝光(快门)时间 |
290 | | file.exif.iso | ISO值 |
291 | | file.exif.program | 拍摄模式,0-8 |
292 | | file.exif.latitud | 纬度,北纬为正、南纬为负数|
293 | | file.exif.longitude | 经度,东经为正、西经为负数|
294 | | file.exif.altitude | 海拔高度 |
295 | | file.exif.height | 拍摄原图高度|
296 | | file.exif.width | 拍摄原图宽 |
297 |
298 |
299 | ### file.exif.program 拍摄模式
300 |
301 | | 拍摄模式数值 | 英文名称 | 中文名称 |
302 | | ----- | --- | --- |
303 | | 0 | Not defined | 未定义|
304 | | 1 | Manual | 手动模式 |
305 | | 2 | Normal program | 标准模式 |
306 | | 3 | Aperture priority | 光圈优先 |
307 | | 4 | Shutter priority | 快门优先 |
308 | | 5 | Creative program | 创作模式 |
309 | | 6 | Action program | 运动模式 |
310 | | 7 | Portrait mode | 人像模式 |
311 | | 8 | Landscape mode | 风景模式 |
312 |
313 |
314 |
315 | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
316 |
317 |
318 | ## paginator 分页
319 |
320 | *注意: 仅仅在首页、和tags搜索、目录等页面有效*
321 |
322 | ### paginator的字段
323 |
324 | | 变量名 | 描述 |
325 | | ----- | --- |
326 | | paginator.per_page | 每页数量 |
327 | | paginator.object_list | 当前页的对象列表,比如`posts` `files`,不常用 |
328 | | paginator.total_count | 查询对象的总数 |
329 | | paginator.total_pages | 总共多少页 |
330 | | paginator.page | 当前是第几页 |
331 | | paginator.previous_page | 上一页页码 |
332 | | paginator.previous_page_url | 上一页的url |
333 | | paginator.next_page | 下一页页码 |
334 | | paginator.next_page_url| 下一页的url |
335 | | paginator.has_next| 是否有下一页 True/False |
336 | | paginator.has_previous | 是否有上一页 True/False |
337 |
338 | ### 代码示例
339 |
340 | 一个比较常见的,对paginator处理的代码。
341 |
342 | ```
343 | {% if paginator.has_previous or paginator.has_next %}
344 |
352 | {% endif %}
353 | ```
354 |
355 |
356 | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
357 |
358 | ## configs
359 |
360 | 这是一个全局变量,但这同`site.configs`不一样。`site.configs`的属性来自于`site.md`;而`configs`的属性来自于`/template/configs.html`。
361 |
362 | 并且,前者可以使用ymal格式进行申明,而`/template/configs.html`必须使用模板的语法,不然会导致站点错误。`site.configs`是给网站的使用者设定的;`configs`是给模板的设计师设定的。
363 |
364 | 具体的属性说明,参见[《模板配置项》](#/模板配置项)
365 |
366 |
367 |
368 |
369 | ## 其它全局变量
370 |
371 | | 函数名 | 描述 |
372 | | ----- | --- |
373 | | resource_version | FarBox服务端静态资源时间戳`跟模板无关` |
374 |
375 |
376 |
377 | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
378 |
379 |
380 | ** lazy (懒人变量) **
381 |
382 | **正在逐步淘汰这个变量,请尽量不要使用**
383 |
384 | | 变量名 | 描述 |
385 | | ----- | --- |
386 | | lazy.has_public_posts | 当前网站是否发布过文章 |
387 | | lazy.has_images | 当前网站是否有图片 |
388 | | lazy.has_files | 当前网站是否有文件 |
389 | | lazy.`` | 返回对应的非私密的文档内容,HTML格式 |
390 | | lazy.raw_`` | 同上,非HTML格式 |
391 | | lazy.is_freshman | 当前登录用户是否是新人 |
392 | | lazy.users_all_sites | sites的列表,当前登录用户的网站列表 |
393 |
394 | 注1, `lazy.`,比如调用lazy.anything的时候,它会去读取/your-site-folder/anything.md(or .txt .markdown)的文件内容,并返回以HTML格式的文本。如果是lazy.anything__subthing, 它则会去寻找/your-site-folder/anything/subthing.md(or .txt .markdown)。
395 |
396 |
397 |
398 |
--------------------------------------------------------------------------------