├── docs ├── 域名相关 │ ├── 域名注册与管理.md │ └── 绑定域名.md ├── 使用FarBox │ ├── FarBox账号体系.md │ ├── 上手指南.md │ ├── FarBox简介.md │ ├── 添加评论.md │ ├── 同步机制.md │ ├── 模板克隆.md │ ├── 网站目录结构.md │ └── 常见问题.md ├── 模板API文档 │ ├── 图片处理机制.md │ ├── JSON API.md │ ├── 模板引擎基础.md │ ├── URL规则.md │ ├── 模板配置项.md │ ├── 页面函数.md │ └── 页面变量.md ├── 书写 │ ├── markdown语法简介.md │ ├── 代码高亮.md │ └── 写作规则.md └── FarBox Editor │ ├── about.md │ └── 常见问题.md ├── domains.config ├── .gitignore ├── _image ├── 2013-03-15 │ ├── meta.png │ ├── sync.png │ ├── bind1.png │ ├── bind2.png │ ├── clear.png │ ├── dropbox.png │ ├── login.png │ └── accounts.png └── basic-folder-to-site.png ├── README.md ├── template ├── css │ ├── post.css │ ├── landing.css │ └── style.css ├── post.html ├── js_part.html ├── landing.html └── index.html └── fb.preview ├── landing.html ├── index.html └── post.html /docs/域名相关/域名注册与管理.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /domains.config: -------------------------------------------------------------------------------- 1 | doc.farbox.com -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.log 2 | fb.preview/ 3 | *.DS_Store 4 | .idea/ 5 | -------------------------------------------------------------------------------- /_image/2013-03-15/meta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hepochen/FarBox-Doc/HEAD/_image/2013-03-15/meta.png -------------------------------------------------------------------------------- /_image/2013-03-15/sync.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hepochen/FarBox-Doc/HEAD/_image/2013-03-15/sync.png -------------------------------------------------------------------------------- /_image/2013-03-15/bind1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hepochen/FarBox-Doc/HEAD/_image/2013-03-15/bind1.png -------------------------------------------------------------------------------- /_image/2013-03-15/bind2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hepochen/FarBox-Doc/HEAD/_image/2013-03-15/bind2.png -------------------------------------------------------------------------------- /_image/2013-03-15/clear.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hepochen/FarBox-Doc/HEAD/_image/2013-03-15/clear.png -------------------------------------------------------------------------------- /_image/2013-03-15/dropbox.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hepochen/FarBox-Doc/HEAD/_image/2013-03-15/dropbox.png -------------------------------------------------------------------------------- /_image/2013-03-15/login.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hepochen/FarBox-Doc/HEAD/_image/2013-03-15/login.png -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 这是[FarBox](http://farbox.com)的帮助以及开发所需的文档。 2 | 3 | template目录下,为doc.farbox.com的模板文件。 4 | 5 | docs目录下为文档正文。 -------------------------------------------------------------------------------- /_image/2013-03-15/accounts.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hepochen/FarBox-Doc/HEAD/_image/2013-03-15/accounts.png -------------------------------------------------------------------------------- /_image/basic-folder-to-site.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hepochen/FarBox-Doc/HEAD/_image/basic-folder-to-site.png -------------------------------------------------------------------------------- /docs/使用FarBox/FarBox账号体系.md: -------------------------------------------------------------------------------- 1 | Date: 2013-03-05 15:41:37 2 | 3 | # FarBox账号体系 4 | 5 | ## 使用Dropbox 6 | 这是我们推荐的方式,登录的时候可以直接使用你的Dropbox账号;数据同步也是FarBox与Dropbox之间的通信。 7 | 8 | ## 使用FarBox 9 | 如果你不是Dropbox用户,那么在下载了我们的客户端[《FarBox Editor》](/fb-download/)后,可以通过自己的邮箱获得一个授权码。 10 | 11 | 但在网站(farbox.com)上无法直接登录,需要从客户端的菜单栏中`帮助--> 打开FarBox网站`完成登录。 -------------------------------------------------------------------------------- /docs/使用FarBox/上手指南.md: -------------------------------------------------------------------------------- 1 | Date: 2013-1-1 2 | 3 | # 来自FarBox用户的上手指南 4 | 5 | [《farbox.com 上手指南》](http://geektu.com/post/2013-01-09-farbox-shang-shou-zhi-nan),来自[@兔纸爱圈圈](http://weibo.com/tuziaiquanquan) 6 | 7 | [《用FarBox建个人网站》](http://www.nerdyang.com/post/yongfarbox-jian-ge-ren-wang-zhan) 来自[@杨经纬nerdyang](http://weibo.com/yanng) 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /template/css/post.css: -------------------------------------------------------------------------------- 1 | body { 2 | overflow-x: hidden; 3 | padding: 0 20px; 4 | font-size: 14px; 5 | margin-bottom: 50px; 6 | line-height: 2.1; 7 | } 8 | 9 | 10 | 11 | .toc{ 12 | background: #fafafa; 13 | border-radius: 5px; 14 | border: 1px solid #f0f0eb; 15 | margin: 27px 0 47px 0; 16 | padding: 0; 17 | } 18 | 19 | .toc ul{ 20 | padding: 5px 25px; 21 | } 22 | 23 | .toc ul li{ 24 | padding: 0; 25 | margin: 0; 26 | line-height: 1.8em; 27 | } 28 | -------------------------------------------------------------------------------- /template/post.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | {{post.title}} 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 |

{{ post.title }}

14 | 15 | {{ post.content }} 16 | 17 | {% include 'js_part.html' %} 18 | 19 | 20 | -------------------------------------------------------------------------------- /docs/使用FarBox/FarBox简介.md: -------------------------------------------------------------------------------- 1 | Date: 2013-12-12 2 | 3 | # FarBox简介 4 | 5 | ## FarBox能做什么? 6 | 7 | - 博客 8 | - 相册 9 | - 静态网站,*比较适用于程序员* 10 | - 以及一些你想不到的作品…… 11 | 12 | - - - - - - 13 | 14 | ## FarBox的工作原理 15 | 16 | 1. 你的文件自动同步到Dropbox等云端后,FarBox会去获取它们;然后文章、图片、HTML页各自归档。**比如`.txt` `.md` `.markdown` `.docx`四种后缀的文档,我们会当做博客的日志来归档。** 17 | - 这些归档后的内容,将呈现为你自己的网站。 18 | - 你可以为自己的网站,定制模板,即内容表现的样式、色彩。 19 | 20 | - - - - - - - 21 | 22 | ## 数据存储于何处? 23 | 24 | - FarBox并不负责你数据的存储,所有的数据最终都存放于你的Dropbox等服务商。 25 | - **我们不会对你的数据,有任何的删除操作。** 26 | - 并且,我们读取文档的权限,也仅限于`FarBox`这个目录。 27 | 28 | -------------------------------------------------------------------------------- /template/js_part.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /docs/使用FarBox/添加评论.md: -------------------------------------------------------------------------------- 1 | Date: 2013-03-05 16:55:59 2 | 3 | # 添加评论系统 4 | 5 | **我们推荐使用第三方的社交评论系统** 6 | 7 | ## 第三方评论系统 8 | 9 | - [DISQUS](http://disqus.com) <-- 推荐 10 | 11 | - [多说](http://duoshuo.com) 12 | 13 | - [微博评论箱](http://open.weibo.com/widget/comments.php) 14 | 15 | - [友言](http://www.uyan.cc/) 16 | 17 | 18 | - - - - 19 | 20 | 21 | ## 如何使用? 22 | 23 | - 如果你使用的是默认模板? 24 | 25 | > 你只需要在网站目录下有个comment_js.md的文本文件,里面贴对应的评论代码就可以了。 26 | 27 | > **注意:务必在comment_js.md的首行声明`status:part`,不然同时也会被当做文章看待的。** 28 | 29 | - - - - - - 30 | 31 | - 如果你使用的是别人的模板? 32 | 33 | > 这个模板从哪里来的,可以去上面找找模板设计师(作者)的说明。 34 | 35 | - - - - - - 36 | 37 | - 如果是自己设计的模板? 38 | 39 | > 这个你自己肯定知道怎么弄了…… 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /fb.preview/landing.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | FarBox Editor 5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 |
14 | Simple is Everything. 15 |
16 | version: 0.1.1.2 17 |
18 | 19 |
20 | for Windows 21 | for Mac 22 |
23 | 24 |
25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /template/css/landing.css: -------------------------------------------------------------------------------- 1 | 2 | body { 3 | width: 780px; 4 | margin: 0 auto; 5 | -webkit-text-size-adjust:none; 6 | overflow-x: hidden; 7 | } 8 | 9 | 10 | a{ 11 | color: #333; 12 | text-decoration: none; 13 | } 14 | 15 | a:hover{ 16 | color: #E60900; 17 | } 18 | 19 | 20 | #slogan { 21 | margin-top: 150px; 22 | letter-spacing: 5px; 23 | font-size: 40px; 24 | font-weight: bold; 25 | text-align: center; 26 | } 27 | 28 | #slogan small{ 29 | font-size: 10px; 30 | } 31 | 32 | #content { 33 | font-family: 'Lato', serif; 34 | } 35 | 36 | 37 | .buttons { 38 | text-align: center; 39 | margin-top: 70px; 40 | } 41 | 42 | 43 | .buttons a{ 44 | margin: 0 25px; 45 | } 46 | 47 | 48 | .buttons a:hover{ 49 | color: red; 50 | } -------------------------------------------------------------------------------- /template/landing.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | FarBox Editor 6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 |
15 | Simple is Everything. 16 |
17 | last updated: 2013-3-6 18 |
19 | 20 | 21 |
22 | Goto FarBox 23 | Clone Template 24 |
25 | 26 |
27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /template/css/style.css: -------------------------------------------------------------------------------- 1 | body{ 2 | height: 100%; 3 | font-size: 13px; 4 | overflow: hidden; 5 | font-family: "Hiragino Sans GB", "Microsoft YaHei", sans-serif; 6 | margin: 0; 7 | } 8 | 9 | 10 | #nav { 11 | float: left; 12 | width: 260px; 13 | line-height: 1.6em; 14 | overflow: auto; 15 | letter-spacing: 1px; 16 | background: #fafafa; 17 | border-radius: 5px; 18 | border: 1px solid #f0f0eb; 19 | position: fixed; 20 | left: 15px; 21 | top: 10px; 22 | } 23 | 24 | #nav a{ 25 | color: #555; 26 | text-decoration: none; 27 | } 28 | 29 | #nav a:hover{ 30 | color: #E60900; 31 | } 32 | 33 | #nav ul{ 34 | padding: 0 20px 10px 20px; 35 | } 36 | 37 | #nav ul li{ 38 | padding: 0; 39 | margin: 0; 40 | } 41 | 42 | 43 | #content { 44 | width: 760px; 45 | float: right; 46 | height: 100%; 47 | border: none; 48 | } -------------------------------------------------------------------------------- /docs/域名相关/绑定域名.md: -------------------------------------------------------------------------------- 1 | # FarBox域名绑定 2 | 3 | ## 绑定域名 4 | 5 | **1, 首先,把你需要被访问的域名,通过CNAME的方式,指向park.farbox.com** 6 | 7 | *另外,farbox.com的3位以上二级域名,随便用,只要别人没有用过的* 8 | 9 | **2, 在你的站点目录下面,修改(或者新增)`domains.config`,里面填上自己需要绑定的域名即可,每行一个;每个目录最多不超过10个记录。** 10 | 11 | - - - - - - - 12 | 13 | 注意: 14 | 15 | 1. 如果以`#`开头,则表示当前行不生效。 16 | 2. 如果有文件目录视觉洁癖,`.domains.config` `.domain.config`也是等效的;但不要同时存在。 17 | 3. 如果删除`domains.config`, 或者没有这个文件,则当前网站将不可访问。 18 | 19 | - - - - - - - - - - - - 20 | 21 | ## 域名冲突 22 | 23 | ### 根域名冲突 24 | 25 | 假设你把a.domain.com绑定在自己的A账户上,那么别人都无法在使用根域名为domain.com的域名了。同理,如果你还有第二个账户,系统不会认为有任何关联,就是两个独立的账户。 26 | 27 | 另外,subdomain.farbox.com的根域名即`subdomain.farbox.com`。 28 | 29 | - - - - - - - - - - - - 30 | 31 | ## 补充说明 32 | 33 | 如果不使用CNAME的方式指向域名,也可以直接使用A记录的方式,我们目前的主站IP是`54.248.227.146`。 34 | 35 | 这样做的好处是多少能提升DNS解析速度;坏处则是,当FarBox提供绑定的IP地址发生变化后,需要重新修改自己的A记录。 36 | 37 | 另外,需要注意的是,比如做了泛解析`*.yourdomain.com` 或者 `www.yourdomain.com`, 最好不要忽略`@yourdomain.com`的根域名解析,以避免无效访问的产生。 38 | 39 | 40 | -------------------------------------------------------------------------------- /docs/使用FarBox/同步机制.md: -------------------------------------------------------------------------------- 1 | # 同步机制 2 | 3 | ## 通过Dropbox自动同步 4 | 5 | ### 自动同步何时被触发? 6 | 7 | 1. 你在farbox.com登录了(这是指你跳转到Dropbox登录后重新跳转回来的授权完成); 8 | - 你的网站被访问了,比如访问(实际在使用)的www.yourdomain.com,则会激活同步; 9 | - 你已park到FarBox,但未启用的域名被访问了,比如访问无内容的does-not-exist.yourdomain.com,也会激活同步; 10 | - 如果一天之内都没有同步过,则会强制激活同步; 11 | - 对于新注册的用户,在1天之内,每10分钟会激活同步; 12 | - 我们还提供一种形如`http://farbox.com/service/sync/dropbox/1234567`这个手工请求的地址。 13 | 14 | ---- 15 | 16 | ### 注意事项 17 | 18 | 1. “同步”通常会消耗一些时间,几秒或者几分钟,取决于你更新的内容多寡。 19 | - 如果新建网站目录之前,你的Dropbox账户下没有任何一个farbox的网站,那么只有两种办法去激活同步:在farbox.com登录一下;或者等上24小时…… 20 | - 因对方API所限,不管何种同步方式,Dropbox最多每5分钟同步一次;因此,同步有可能不是即时的。 21 | 22 | 23 | - - - - - - - - - - - - - - - - - 24 | 25 | ## 通过FarBox Editor进行同步 26 | 27 | > [《FarBox Editor》](/fb-download)是一款MarkDown的编辑器,同时也是FarBox的客户端。 28 | 29 | 如果你同时还是Dropbox的用户,那么使用FarBox Editor可以对`模板文件夹内的源码`以及`当前编辑文档`进行同步;它会暂时绕过Dropbox,直接保存数据到FarBox。但最终的内容,以Dropbox上获得的文件为准。 30 | 31 | 如果你不是Dropbox的用户,也可以直接使用FarBox Editor将网站同步至FarBox上。但这个时候,仅会同步一些必要的文件,包括文章、_image目录下的图片、模板源码。 32 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /docs/模板API文档/图片处理机制.md: -------------------------------------------------------------------------------- 1 | # 图片处理机制 2 | 3 | ## 图片处理中的参数 4 | 5 | FarBox可以直接对图片的尺寸进行处理,比如你的网站目录下面有张图片,目录为`/images/she.jpg`,假设你网站的域名为`yourdomain.com`;那么访问`http://yourdomain.com/images/she.jpg`即会出现这张图片。 6 | 7 | 而访问`http://yourdomain.com/images/she.jpg?width=640&height=320&fixed=true`,则会得到处理过的固定宽高的图片。 8 | 9 | | 参数 | 说明 | 最终转化的可能值 | 10 | | --- |--- | -- | 11 | | width | 图片的宽 | [40, 80, 160, 214, 320, 428, 640, 960, 1560] | 12 | | height| 图片的高 | [40, 80, 160, 214, 320, 428, 640, 960, 1560] | 13 | | fixed | 定宽或者定高 | true/false | 14 | 15 | 16 | FarBox会自动处理图片的边界,所以你可以输入对应的参数,比如width=550,我们最终会转化为临近的640. 17 | 18 | 19 | - - - - - - - - - - 20 | 21 | 22 | ### 举例说明 23 | 24 | - `she.jpg?width=640` 图片的宽不能超过640px 25 | - `she.jpg?height=320` 图片的高不能超过320px 26 | - `she.jpg?width=640&height=320` 图片的高不能超过320px 并且 图片的宽不能超过640px 27 | - `she.jpg?width=640&height=320&fixed=true` 640*320的固定尺寸 28 | - `she.jpg?height=320&fixed=true` 320px的定高尺寸 29 | - `she.jpg?width=640&fixed=true` 640px的定宽尺寸 30 | 31 | 32 | - - - - - - - - - - 33 | 34 | 35 | ## 图片模糊 36 | 37 | 可以直接在图片的url后面跟上`?blur=true`即可。 38 | 39 | -------------------------------------------------------------------------------- /docs/使用FarBox/模板克隆.md: -------------------------------------------------------------------------------- 1 | # 模板克隆 2 | 3 | ## 基本说明 4 | 5 | 1. 每个FarBox托管的网站,其所使用的模板都可以被克隆,**但仅限于使用,源码不可修改**,当然,模板作者也可以放出源码提供下载。 6 | 7 | * 假设我现在克隆了A网站,A网站的模板后来又发生了变更,这并不会影响到我已克隆的模板。 8 | 9 | * 假设想克隆`http://www.domain.com`, 那么只要到`http://www.domain.com/template`这个地址(**末尾不带`/`**),就可以完成克隆。但我们建议看你所访问的网站底部有没有提示可clone的信息,否则兼容性会有一定问题。 10 | 11 | > 注意: 12 | > Clone Template并不会在你的文件夹内创建任何源码! 13 | 14 | 15 | - - - - 16 | 17 | 18 | ## Clone Template FAQ 19 | 20 | 1. **为什么我自己设计的模板要免费给别人使用?** 21 | 22 | > 我们犹豫了很久,最后还是决定采用这个设计结构。它很酷,纯分布式的。更主要的一点,如果只是简单的模板,即使不给别人使用,copy起来也是手工活而已,或许就没有设防的必要了。 23 | 24 | > anyway,如果一个模板很酷或者很优雅,即使别人clone过去,没有源码的情况下,也未必会用好;所有的权利仍保留在设计者手中。 25 | 26 | - **我Clone过来的模板,源模板修改了,怎么我的没有变动?** 27 | 28 | > 不会自动更新,在Clone的同时,相当于新建了一个版本,这个版本是独立的,不因源头的变动而变动;也不因源头的删除而删除。 29 | 30 | - **如果我自己有`template`目录,并且有源码,然后又克隆了别人的模板,会冲突么?** 31 | 32 | > 不会,这种情况下,会以克隆的模板优先呈现。 33 | 34 | - **如何清除克隆的模板?** 35 | 36 | > 假设进入`http://www.domain.com/template`后,在`模板站域名`这个选项清空,然后再克隆一次即可。 37 | 38 | 39 | - **如何看我自己网站的模板情况?** 40 | 41 | > 假设`http://www.domain.com`是你的网站, 访问`http://www.domain.com/status`即可看到。 -------------------------------------------------------------------------------- /docs/模板API文档/JSON API.md: -------------------------------------------------------------------------------- 1 | # 文件与图片查找&API 2 | 3 | **本文档是针对`/folder/`这个url以及`API`的,并且是通过GET的方式。** 4 | 5 | ## 使用说明 6 | 7 | 查询都是通过url进行的,第一步是指定``; 我们还是看具体示例吧。 8 | 9 | ### 页面 10 | 11 | - `http://image.farbox.com/?type=folder` 12 | 13 | - `http://image.farbox.com/?type=image` 14 | 15 | - `http://image.farbox.com/folder/folder11/` --> `folder11`实际上是一个文件夹 16 | 17 | 18 | ### API 19 | 20 | - `http://image.farbox.com/index` 21 | 22 | - `http://image.farbox.com/index?type=image` 23 | 24 | - `http://image.farbox.com/folder11/` 25 | 26 | - - - - - - - - - - 27 | 28 | ## 参数说明 29 | 30 | | 参数 | 可能值 | 默认值 | 说明 | 31 | | --- | ----- | ----- | 32 | | level | `child` `all` | - | `child`仅返回直属的子文档;而`all` 包含子文档的子文档的递归 | 33 | | type | `image` `folder` `file` `post` | - | `file`是指不分类型,`post`类型仅针对API有效 | 34 | | sort | `desc` `asc` | `desc` | 按文件日期排序,desc为最近日期排最先,asc为最近日期排最后| 35 | | page | 整数值 | 1 | 页码,在`/folder/`中无效,仅在API中有效| 36 | 37 | **注:默认值为`-`的表明是从模板设置中获取的,具体见[《模板配置项》](/#模板配置项)** 38 | 39 | - - - - - - - - - - 40 | 41 | ## 全站API (JSON) 42 | 43 | **要使用全站API,要确保`configs.index_allowed`是开启的!** 44 | 45 | - 查看根目录 `/index` 46 | 47 | - 非根目录 `//` 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 | ![alt text](/path/img.jpg) 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 | ![Basic Folder to Site](/_image/basic-folder-to-site.png) 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)`,这样的格式可以直接插入图片。其中`/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 | 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 | ![Image Title](/_image/2013-03-15/bind1.png) 14 | ![Image Title](/_image/2013-03-15/bind2.png) 15 | 16 | 17 | ## 如何同步? 18 | 如果是你Dropbox用户,所有的数据都会自动同步。 19 | 20 | 另外,在Editor这个软件中,以下方式可以进行同步: 21 | 22 | 1, 保存文章的时候,Ctrl+S(Mac上是Command+S)可以实现保存并同步到FarBox上。 23 | 24 | 2, 手工进行同步。![SYNC](/_image/2013-03-15/sync.png) 25 | 26 | ## 修改文章标题? 27 | 在文章开始的第一行,`title: 你所需要的标题`就可以了。更多的写作规则,参见[《写作规则》](/#写作规则)。 28 | 29 | ![Image Title](/_image/2013-03-15/meta.png) 30 | 31 | 32 | - - - - 33 | 34 | # 进阶 35 | 36 | ## 登录FarBox 37 | FarBox除了完成你的博客外,还提供了数据统计等功能。一些操作需要你登录FarBox才能实现。 38 | 39 | 在菜单上`帮助 > 打开FarBox`即可自动登录FarBox。 40 | ![登录FarBox](/_image/2013-03-15/login.png) 41 | 42 | 如果你是使用Dropbox,为了进一步保障数据安全,则不会自动登录,需要你在首页中使用Dropbox才能登录。 43 | 44 | ## 如何删除网站、清空账户? 45 | 46 | 登录FarBox之后, 你可以看到如下图的这些操作。 47 | 48 | ![Image Title](/_image/2013-03-15/clear.png) 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 | ![Use Dropbox](/_image/2013-03-15/dropbox.png) 99 | 100 | > 使用Dropbox,并非单纯指把根目录设定在Dropbox下就可以了。而是特指根目录在`Dropbox/Apps/FarBox`下的。 101 | 102 | 103 | # 切换账户 104 | 105 | 如果你是Dropbox用户,那么,你实际上可以拥有两个账户。 106 | 107 | 一个是通过Dropbox关联到FarBox的,另一个是FarBox直接同步的。 108 | 109 | 如下图所示,两者对应的分别是两个账户。虽然很可能两个账户的邮箱是一致的。 110 | 111 | ![Two Accounts](/_image/2013-03-15/accounts.png) 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 | 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 |

FarBox的模板引擎

16 | 17 |
18 |
19 | 34 |
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 |
  1. 56 |

    {% %}包裹着的一些代码块,通常是{% for … %}{% endfor %} {% if %}{% elif %} {% else %} {% endif %}

    57 |
  2. 58 |
  3. 59 |

    {{ var }}这表示取变量

    60 |
  4. 61 |
  5. 62 |

    {{ var|command }}中,command是一个函数,效果相当于command(var)从而得到新的值

    63 |
  6. 64 |
  7. 65 |

    {{ var|command(v1, v2) }},效果相当于command(var, v1, v2)

    66 |
  8. 67 |
68 |

command这种类型的函数,在Jinja2中,称之为filters(滤镜)。

69 |
70 |

FarBox模板

71 |

模板目录所在的位置

72 |

假设你现在的网站目录为Dropbox/Apps/FarBox/MyBlog/

73 |
    74 |
  1. 75 |

    模板页面则要放置于Dropbox/Apps/FarBox/MyBlog/template/的目录下

    76 |
  2. 77 |
  3. 78 |

    /.template/ /templates/ /.templates/也等同于template,取名可按照自己的喜好;特别是以.开头的文件夹,通常会被操作系统隐藏,有视觉洁癖的,推荐之。

    79 |
  4. 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 | 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 | 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 |
345 | {% if paginator.has_previous %} 346 | 上一页 347 | {% endif %} 348 | {% if paginator.has_next %} 349 | 350 | {% endif %} 351 |
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 | --------------------------------------------------------------------------------