- 软件需求目录
- 使用工具
- 命令
- 静态目录
- 写博文
- 发布博客
- 博客功能拓展
- 尾声
软件需求目录
- pelican
- python-markdown
*
使用工具
- python(我用的是2.7的最新版,会把下面的工具都带上)
- easy_install
- pip
命令
- 安装必要程序
pip install pelican markdown
NOTE
注意,有时候,还会使用工具 virtualenv
。
具体用途,请自行查阅相关资料,不过基本不用python进行大型开发也就基本用不上这个。
- 创建目录
在你要放置博客基本框架的位置,建立一个文件夹。
直接手工建立就好。
- 快速开始
在文件夹中,可以使用命令
pelican-quickstart
进行快速设置建立一些基本的文件。
会问一系列问题,比如博客网址啊,作者名字啊之类的,根据真实情况填写即可,这些问题只是用来生成配置文件的,后面可以通过修改配置文件来手动修改这些设置。
结果会生成一个目录,大体如下:
. ├── content # 这个就是放博客内容目录,这个目录及子目录下的所有md和rst文件将会被转成html文件 ├── output # 这个是从content目录生成的html目标文件的存放目录 ├── develop_server.sh #这个是用来在本地运行一个服务器来实时查看生成的html文档的脚本 ├── fabfile.py # 这个是使用Python的fabric来实现文件上传的工具,即Deploy工具 ├── Makefile # 这个是使用是用来生成网站内容并上传的工具。 ├── pelicanconf.py # 这个是本地开发时的配置文件 └── publishconf.py # 这个是发布时的配置文件
其中,由于我们是使用git来进行内容更新,所以基本使用的就是下面这些文件及文件夹
├── content # 这个就是放博客内容目录,这个目录及子目录下的所有md和rst文件将会被转成html文件 ├── output # 这个是从content目录生成的html目标文件的存放目录 ├── develop_server.sh #这个是用来在本地运行一个服务器来实时查看生成的html文档的脚本 ├── pelicanconf.py # 这个是本地开发时的配置文件
- 个性化配置
经过之前的设置,出来的pelicanconf.py文件内容已经有了雏形,但是对于进一步的个性化,是远远不够的,还需要我们继续添加修改内容。
至于能添加哪些内容,移步 文档
关于日后自行添加个性选项要注意
原本的内容都是这样:
AUTHOR = u'果子'
要注意,等号左边为全部大写的字母
如果感兴趣可以看我的使用nest主题的 pelicanconf.py1
关于publishconf.py 与 Makefile
我没有使用过,具体请自己查阅文档。
我的使用,就没用到。
- 配置主题,插件
当前查看效果的方式
可以使用本地预览。
即:先在 根目录
pelican content cd output python -m pelican.server
然后打开 http://localhost:8000 查看效果
Pelican支持大量的开源主题,GitHub上的 pelican-themes 项目有几十套主题,大部分都带了效果预览图。可以从里面挑一个你喜欢的主题样式来使用。还有一个更方便的挑选主题的方式,直接打开www.pelicanthemes.com 挑选吧。一个网页里就列出了几乎所有的主题。我的博客是使用 nest 主题,并在这套主题的基础上进行了一些定制。选定好喜欢的主题后,从GitHub上下载下来所有的主题:
git clone https://github.com/getpelican/pelican-themes.git
我直接将其解压成了 根目录
然后在 pelicanconf.py 配置文件里添加或修改 THEME项为 nest
THEME = "nest"
(我使用了几个主题,觉得还是nest的汉化还是很方便的,作者很贴心的将参数剥离出来)
Pelican 一开始是将插件内置的, 但是新版本 Pelican将插件隔离了出来, 所以要到github上 克隆一份新的插件,执行
git clone git://github.com/getpelican/pelican-plugins.git
内容放在 根目录
现在博客目录就新添了一个 pelican-plugins 目录,以配置sitemap插件为例, sitemap插件可以生成 sitemap.xml 供搜索引擎使用。
在pelicanconf.py中修改添加:
# 插件,render_math 提供数学公式的显示
# Plugin PLUGIN_PATHS = ['pelican-plugins'] PLUGINS = [ 'sitemap', 'render_math'] # Sitemap SITEMAP = { "format": "xml", "priorities": { "articles": 0.7, "indexes": 0.5, "pages": 0.3, }, "changefreqs": { "articles": "monthly", "indexes": "daily", "pages": "monthly", } }
最后执行
pelican content
就会在output中生成相关的html文件
静态目录
PATH = 'content'
PAGE_PATHS = ['pages']
ARTICLE_PATHS = ['articles']
STATIC_PATHS = ['images', 'extra/robots.txt', 'extra/favicon.ico', 'extra/logo.svg', 'charity']
EXTRA_PATH_METADATA = {
'extra/robots.txt': {'path': 'robots.txt'},
'extra/favicon.ico': {'path': 'favicon.ico'},
'extra/logo.svg': {'path': 'logo.svg'},
'charity/404.html': {'path': '404.html'}
}
注意这部分设置,在content下放置着写博客要用到的一些内容,因为毕竟是 content -> output 内容的转换。所以尤其要注意这里的设置。这里有博文,图片,一些有些主题会用到的文档,图标,头像甚至是404页面都有放置在对应的文件目录下。这些目录是可以自己设置的,但是尽量是归好类。
关于静态目录:
A list of directories (relative to PATH
) in which to look for static files
. Such files will be copied to the output directory without modification. Articles, pages, and other content source files will normally be skipped, so it is safe for a directory to appear both here and in PAGE_PATHS
or ARTICLE_PATHS
. Pelican`s default settings include the “images” directory here.
写博文
pelican写博文,需要在md文档最前面加上元数据,下面是个例子,具体用哪些数据,还得看主题的代码上怎么设定,在主题的readme.md文件中若有增加,一般有提示,一般的如下例:
Title: winsows效率之bat文件1
Date: 2017-02-18 17:07:19
Category: 效率
Tags: bat
Slug: bat1
Author: lart
Status: draft
Status: draft
会让文章不显示,默认为草稿。撰写完文章,需要发布时,需要把这行元数据去掉。否则文章不会出现在博客主页。只会在drafts下看得到:
你的网址/drafts
“你的网址”指提交的网站,或者本地预览时的 http://localhost:8000/
使用上面的网址就可以看到。
元数据后要与文本内容空一行以表示元数据的结束。
发布博客
要发布在网上,一般的会使用代码托管网站的page服务。我所知道的有三个站点提供:
码云 Coding GitHub
相比之下,感觉码云稍快一些,但是Coding有提供https协议。而github不多说。大家自己选择。我用的是码云。
申请账号,创建项目,使用pages,码云文档做的不错,直接 过去看 就好。
这里甚至提到了如何使用404页面。实际上就是放置到output目录下。
一切准备就绪后,可以在使用过命令 pelican content
后, 进入output,使用git。
git init git add . git commit -m "pelican static blog test" git remote add origin https://git.net/p_lart/p_lart.git
# 我的仓库地址就是:[email protected]:p_lart/p_lart.git git push -u origin master
要是运行这个后出现:
To ...(地址) ! [rejected] master -> master (non-fast-forward) error: failed to push some refs to 'https://github.com/LarT2P/pelican-nest-blog.git' hint: Updates were rejected because the tip of your current branch is behind hint: its remote counterpart. Integrate the remote changes (e.g. hint: 'git pull ...') before pushing again. hint: See the 'Note about fast-forwards' in 'git push --help' for details.
可以尝试使用命令:
git push -u origin master -f
由于我是用的是windows,现在的博文推送方式有点麻烦,可以写bat文件简化流程。
由于安装git后,实际上是可以在cmd中使用的。于是有:
文件之本地预览:
@eche off
@title 本地预览pelican博客
echo 进入文件夹
rem 这是我的content所在目录
cd /d D:\git clone\BLOG\lart\lart
echo 执行pelican content
pelican content
echo 进入output
cd /d output
echo 启动本地服务器
python -m pelican.server
echo 结束...
echo 请前往 http://localhost:8000/ 查看
pause
文件之推送博文:
@echo off
@title bat交互执行git命令
echo 进入文件夹
cd /d D:\git clone\BLOG\lart\lart
echo 执行pelican content
pelican content
echo 执行git
cd /d output
git add .
git commit -m "update"
git push origin master
echo done...
pause
直接使用这两个批处理就可以完成相应的任务。
之后查看即可。
博客功能拓展
评论功能。
pelican支持
DISQUS_SITENAME = "" GOOGLE_ANALYTICS = ""
disqus 谷歌分析
国内可以换成(我所用的)友言或者多说,以及百度统计。
具体如何置换,直接在文件夹中搜索 上面的两个字符串
(我用的是sublime,文件夹中搜索,从搜索结果,进入对应文件中,修改你所用的主题的相应的代码块。这里只需要将对应标签下的内容进行置换就好)
至于用来置换的内容,见下:
以友言(这里有分享按钮以及评论系统还有推荐系统的代码都可以尝试)为例:
获取代码 ->
选择平台:通用代码 ->
那个代码复制好,粘贴到对应的 DISQUS_SITENAME
所在的主题里的模板文件中,nest主题是有个单独的文件,直接修改其中内容,if
语句中的内容不要改,相当于就是用原本的DISQUS的文件调用关系,使用我们的新内容。 ->
置换完成后,在pelicanconf文件中 DISQUS_SITENAME = ""
的 “” 里写点字符串,不要为空,这样就可以运行代码了。我是把该改的都改了,所以我的配置文件中有点不同。
同样的。百度统计 也是一样的。
注册时,必要的信息是要准确的。
进入 ->
管理 ->
代码获取 ->
按说明内容进行安装。
至于代码放置的方式,类似上面的,就不多说。这个相当于就是提供一个访问统计的一个后台,在博客网站页面上也看不出变化,但是在百度统计的我们的管理系统中,我们可以看到很多有用的数据。
尾声
至此,我的这几天的工作已经结束,虽然似乎没有太多的难度,但是对于我这样一个新手而言,却处处遇到困难。
这些内容也只是用到了pelican文档中不多的页面,所以可见,它的可塑空间还很大,大家可以积极改动尝试。
提示
pelican 使用markdown写博客,python-markdown的语法支持比常规的要丰富一点,所以可以看一下我的另一篇博文,那博文要是用在一般的markdown网站上,有些格式就显示不正常。
python-markdown
#!/usr/bin/env python
# -*- coding: utf-8 -*- #
from __future__ import unicode_literals
# Site settings
AUTHOR = u'果子'
AUTHOR_EMAIL = u'@qq.com'
SITENAME = u'果园'
SITEURL = 'http://p_lart.io'
DEFAULT_DATE_FORMAT = ('%Y-%m-%d')
TIMEZONE = 'Asia/Shanghai'
DEFAULT_LANG = u'zh'
DEFAULT_METADATA = (
)
DELETE_OUTPUT_DIRECTORY = False
# Blogroll
LINKS = (
('果园', 'http://lart.coding.me'),
)
#######可以改动社交链接
# Social widget
SOCIAL = (
('码云(p_lart)', 'https://gi.net/p_lart'),
('Coding(lart)', 'https://coding.net/u/lart'),
)
# 几乎所有的博客主题都有一个地方展示你的社交账号,这些账号就写在这里,上面是我的
# A list of tuples (Title, URL) for additional menu items to appear at the beginning of the main menu.
MENUITEMS = (
)
# Content path
PATH = 'content'
PAGE_PATHS = ['pages']
ARTICLE_PATHS = ['articles']
STATIC_PATHS = ['images', 'extra/robots.txt', 'extra/favicon.ico', 'extra/logo.svg', 'charity']
EXTRA_PATH_METADATA = {
'extra/robots.txt': {'path': 'robots.txt'},
'extra/favicon.ico': {'path': 'favicon.ico'},
'extra/logo.svg': {'path': 'logo.svg'},
'charity/404.html': {'path': '404.html'}
}
ARTICLE_URL = ('articles/{slug}.html')
ARTICLE_SAVE_AS = ('articles/{slug}.html')
PAGE_LANG_SAVE_AS = False
# Feed
FEED_DOMAIN = SITEURL
FEED_ALL_ATOM = 'feeds/all.atom.xml'
CATEGORY_FEED_ATOM = 'feeds/%s.atom.xml'
TRANSLATION_FEED_ATOM = None
# 每页博文数目
DEFAULT_PAGINATION = 5
# markdown设置
MARKDOWN = {
'extension_configs': {
'markdown.extensions.extra': {},
'markdown.extensions.admonition': {},
'markdown.extensions.codehilite': {'css_class': 'highlight'},
'markdown.extensions.meta': {},
'markdown.extensions.nl2br': {},
'markdown.extensions.sane_lists': {},
'markdown.extensions.smarty':{},
'markdown.extensions.toc': {},
'markdown.extensions.wikilinks': {},
},
'output_format': 'html5',
}
# 评论系统,我是用的是友言
# Comments
UY = "Comments"
# 我用的是百度统计
# Analytics
BAIDU = "Baidu"
# 插件,render_math 提供数学公式的显示
# Plugin
PLUGIN_PATHS = ['pelican-plugins']
PLUGINS = [ 'sitemap', 'render_math']
# Sitemap
SITEMAP = {
"format": "xml",
"priorities": {
"articles": 0.7,
"indexes": 0.5,
"pages": 0.3,
},
"changefreqs": {
"articles": "monthly",
"indexes": "daily",
"pages": "monthly",
}
}
# Can be useful in development, but set to False when you're ready to publish
RELATIVE_URLS = False
# 下面的就是nest主题的配置了,我把一些页面上的英文都简单汉化了。有的主题没有提供类似这样的参数,想改的去主题文件夹中更改。
# NEST Template
THEME = 'pelican-themes/nest'
SITESUBTITLE = u'我的 果子'
# Minified CSS
NEST_CSS_MINIFY = True
# Add items to top menu before pages
MENUITEMS = [('果园', '/'),('类别','/categories.html')]
# Add header background image from content/images : 'background.jpg'
NEST_HEADER_IMAGES = 'background.jpg'
NEST_HEADER_LOGO = '/images/logo.png'
# Footer
NEST_SITEMAP_COLUMN_TITLE = u'目录'
NEST_SITEMAP_MENU = [('归档', '/archives.html'),('标签','/tags.html'), ('作者','/authors.html')]
NEST_SITEMAP_ATOM_LINK = u'Atom Feed'
NEST_SITEMAP_RSS_LINK = u'RSS Feed'
NEST_SOCIAL_COLUMN_TITLE = u'社交'
NEST_LINKS_COLUMN_TITLE = u'链接'
NEST_COPYRIGHT = u'© 果园 2017'
# Footer optional
NEST_FOOTER_HTML = ''
# index.html
NEST_INDEX_HEAD_TITLE = u'果园'
NEST_INDEX_HEADER_TITLE = u'林间果几颗'
NEST_INDEX_HEADER_SUBTITLE = u'一篇篇博客,就像一粒粒果子,从思想最深处,逐渐结出'
NEST_INDEX_CONTENT_TITLE = u'旧果'
# archives.html
NEST_ARCHIVES_HEAD_TITLE = u'归档'
NEST_ARCHIVES_HEAD_DESCRIPTION = u'上传归档'
NEST_ARCHIVES_HEADER_TITLE = u'归档'
NEST_ARCHIVES_HEADER_SUBTITLE = u'收集起来的一篇篇博客,一粒粒果子,都是时间的见证'
NEST_ARCHIVES_CONTENT_TITLE = u'归档'
# article.html
NEST_ARTICLE_HEADER_BY = u'作者 '
NEST_ARTICLE_HEADER_MODIFIED = u'修改于 '
NEST_ARTICLE_HEADER_IN = u'归类于 '
# author.html
NEST_AUTHOR_HEAD_TITLE = u'上传自 '
NEST_AUTHOR_HEAD_DESCRIPTION = u'上传自 '
NEST_AUTHOR_HEADER_SUBTITLE = u'上传归档'
NEST_AUTHOR_CONTENT_TITLE = u'上传'
# authors.html
NEST_AUTHORS_HEAD_TITLE = u'作者'
NEST_AUTHORS_HEAD_DESCRIPTION = u'作者'
NEST_AUTHORS_HEADER_TITLE = u'作者'
NEST_AUTHORS_HEADER_SUBTITLE = u'根据作者归档'
# categories.html
NEST_CATEGORIES_HEAD_TITLE = u'类别'
NEST_CATEGORIES_HEAD_DESCRIPTION = u'根据类别归档'
NEST_CATEGORIES_HEADER_TITLE = u'类别'
NEST_CATEGORIES_HEADER_SUBTITLE = u'根据类别归档'
# category.html
NEST_CATEGORY_HEAD_TITLE = u'类别归档'
NEST_CATEGORY_HEAD_DESCRIPTION = u'类别归档'
NEST_CATEGORY_HEADER_TITLE = u'类别'
NEST_CATEGORY_HEADER_SUBTITLE = u'类别归档'
# pagination.html
NEST_PAGINATION_PREVIOUS = u'上一页'
NEST_PAGINATION_NEXT = u'下一页'
# period_archives.html
NEST_PERIOD_ARCHIVES_HEAD_TITLE = u'归档于'
NEST_PERIOD_ARCHIVES_HEAD_DESCRIPTION = u'归档于'
NEST_PERIOD_ARCHIVES_HEADER_TITLE = u'归档'
NEST_PERIOD_ARCHIVES_HEADER_SUBTITLE = u'归档于'
NEST_PERIOD_ARCHIVES_CONTENT_TITLE = u'归档于'
# tag.html
NEST_TAG_HEAD_TITLE = u'标签归档'
NEST_TAG_HEAD_DESCRIPTION = u'标签归档'
NEST_TAG_HEADER_TITLE = u'标签'
NEST_TAG_HEADER_SUBTITLE = u'标签归档'
# tags.html
NEST_TAGS_HEAD_TITLE = u'标签'
NEST_TAGS_HEAD_DESCRIPTION = u'标签'
NEST_TAGS_HEADER_TITLE = u'标签'
NEST_TAGS_HEADER_SUBTITLE = u'根据标签归档'
NEST_TAGS_CONTENT_TITLE = u'标签'
NEST_TAGS_CONTENT_LIST = u' 被标注'
- 见上: ↩