关于博客的说明
Welcome to include-yy’s blog source.
本博客使用了 emacs 的 org-mode 的导出功能,将 org 文件导出为 html 文件。虽然 github 支持 org 文件渲染,不过前往网页浏览的体验应该会更好。
博客目录如下:
/img
,/css
,/js
一些全局资源/posts/*
发布的文章/republish/*
一些转载的文章/projecteuler
一些简单 projecteuler 题解
Problems 1 to 100 provide a wealth of helpful introductory teaching material and if you are able to respect our requirements, then we give permission for those problems and their solutions to be discussed elsewhere.
/drafts/*
草稿,只有配置文件/index.org
博客主页 org 源文件/404.org
404 页面源文件/rss.xml
最新的 RSS 文件/robots.txt
Robots 文件/cfg.org
全局配置文件/post-tags.el
用于 posts 的包含所有 tag 的文件/yynt2.el
,/ox-yyhtml.el
,/htmlize.el
构建工具代码
博客的 posts 和 projecteuler 部分使用 CC-BY-SA 4.0,不遵守我也懒得管,feel free to do what you want(笑)。如果您有任何问题,欢迎通过 issue 与我交流。
Wishlist:
- [ ] 添加生成 sitemap 的功能
- [ ] 优化一些算法,比如 tag 的归类
- [ ] 更加函数式
Related Projects
- org-html-themes 一些用于 org 的 CSS
- org2blog Blog from Org mode to WordPress
- org-static-blog A static site generator using org-mode
致谢
感谢 gongzhitaao 的 orgcss(展示页:https://gongzhitaao.org/orgcss/) ,这是我最初使用过的 CSS,现在也是在此基础上做了一些简化。
感谢 org-static-blog,我从中学到了获取 FILETAGS
的方法。
感谢 Sacha chua 的 Using Javascript to add a “Copy code” link to source code blocks in my blog posts 和 Adding a custom header argument to Org Mode source blocks and using that argument during export ,这让 org 的 src 变得更加易用。
生成工具手册
在 yynt2.el 之前,本博客的生成工具是 yynt.el ,它通过 :override
advice 修改了 ox-html 后端的一些默认行为,比如修改 <meta>
标签,让 org 不生成随机 id,不生成默认的 CSS,使用更加 HTML5 的标签,等等。虽然勉强够用,但是缺少一些博客常见的功能,比如 TAG 页面,归档页面,RSS。
现在的生成后端直接来自 ox-html,但是在源代码的基础上做了一些改变,变成了现在的 ox-yyhtml.el。我将它的按键注册为 ‘y’,这样可以在 C-c C-e
后通过 y y
更新当前 org 的 HTML 生成,这样就不再影响 ox-html 的默认行为。在导出后端之外我还在 yynt2.el 中添加了常见的博客功能,即 tag 和 RSS 生成,这样就不用手动更新 rss 了。
请通过在 yynt2.el
中运行 M-x eval-buffer
来加载构建工具。
博客头的格式
一篇博客应该包含以下头信息:
#+SETUPFILE: ../setup.org
引入配置文件(可以没有)#+FILETAGS: tags
文章的 tag,只允许一个#+TITLE: name
文章的标题#+DATE: [YYYY-MM-DD XXX HH:MM]
文章的创建时间#+DESCRIPTION: ...
对文章内容的介绍,这部分用于生成 RSS 的<description>
对于 republish 和 projecteuler 也是类似的头结构,不过一般我们不用手写,直接使用 yynt-temp-post
, yynt-temp-repost
和 yynt-temp-euler
生成即可。
比较麻烦的是这些函数需要通过 M-:
来调用,所以我提供了更方便的函数:
yynt-create-draft
,在draft
目录生成草稿,包含必要的头信息yynt-move-draft
,将完成的草稿移动到posts
目录yynt-create-repost
,在republish
目录创建新文章,生成头信息yynt-create-euler
,在projecteuler
目录创建新文章,生成头信息
在博客中插入封面和尾图
可以使用 yynt-headimg
插入适用于头图的代码,使用 yynt-tailimg
插入适用于尾图的代码,它们的效果如下:
(yynt-headimg)
#+BEGIN_noscript
#+NAME: headimg
#+ATTR_HTML: :class top-down-img
#+END_noscript
(yynt-tailimg)
#+BEGIN_noscript
#+NAME: tailimg
#+ATTR_HTML: :class top-down-img
#+END_noscript
我们只需要在 #+ATTR_HTML
下面插入图片链接即可。如果您有多张图片需要插入,可以使用如下格式:
#+BEGIN_noscript
#+NAME: headimg
#+BEGIN_div
#+ATTR_HTML: :class top-down-img
img1 link here
#+ATTR_HTML: :class top-down-img
img2 link here
...
#+END_div
#+END_noscript
or
#+BEGIN_noscript
#+NAME: headimg
| img1 | img2 | img3 |
| ... | ... | ... |
#+END_noscript
我修改了 ox-yyhtml 中的 t-html5-elements
,添加了 noscript
和 div
,这样我们可以使用 BEGIN_div
和 BEGIN_noscript
块,它们用于图片的隐藏功能目的。
如果你不想让图片被隐藏,可以使用 yynt-imgattr
生成简单的 org 指令:
(yynt-imgattr)
#+ATTR_HTML: :class top-down-img
tag 管理
所以 posts 文章的 tag 都存储在 /post-tags.el
中,格式大致如下:
("math" "c" "win32" "lisp" "gossip" "git" "emacs" "elisp" "blog" "rescript" "tr" "orgmode")
通过 yynt--post-read-tags
和 yynt--post-write-tags
我们可以对这个文件中的 tag 进行读写,不过一般不需要使用这样低层的函数,而是以下这些,它们会提供用于选择 tag 的 minibuffer:
yynt-post-add-tags
向 tag 文件中添加新的 tagyynt-post-delete-tags
从 tag 文件中删除某 tagyynt-post-insert-tag
在当前位置插入某个 tag
RSS 生成
调用 yynt-rss-update
可以根据 posts 中的文件更新 rss.xml 文件。
构建功能
yynt-show-log
显示生成中的 log 输出 bufferyynt-build-proj
弹出项目列表,并构建选中的项目
对于一些带有依赖关系的构建,比如更新 posts 中的 org 需要更新主页,rss 等文件,我提供了如下函数:
yynt-build-file
构建当前 org 文件,并构建依赖它内容的文件
发布功能
相比于 org-publish 的生成到目标文件,我采取的方式是先原地生成再复制到目标目录。
yynt-publish-proj
,对选中的项目进行构建并发布
我提供了带有依赖关系的发布函数: yynt-publish-file
,它会发布所有依赖当前文件的文件。
实现注解
ox-yyhtml.el
- 添加了全新的
HTML_HEAD_FUNC
选项,可以接受一个函数名。函数接受info
参数,应该返回插入到<head>
中的内容,若指定了该选项,则HTML_HEAD
和HTML_HEAD_EXTRA
会变得无效 - 为
preamble
和postamble
添加了额外的选项:HTML_PREFUNC
,HTML_PRE
,HTML_SUFFUNC
,HTML_SUF
。可以在文件中编写 postamble 和 preamble 了,或是通过调用指定的函数得到 postamble 和 preamble,参加各 setup.org 文件了解其用法 - home/up 可以使用更多的名字,而不是只有
UP
和HOME
,现在可以用HTML_LINK_LEFT
和HTML_LINK_RIGHT
指定链接,使用HTML_LINK_LNAME
和HTML_LINK_RNAME
指定各自链接的名字,或是直接使用HTML_LINK_FUNC
指定返回字符串的函数 - 为
org-yyhtml-html5-elemets
添加了 “div” 和 “noscript”,现在可以在 org 文件中使用BEGIN_div
和BEGIN_noscript
了
其他改动可以在 ox-yyhtml.el
中使用 occur <yynt>
来观察
htmlize.el
直接来自 https://github.com/hniksic/emacs-htmlize ,无修改。
yynt2.el
- 如果要添加新的子目录,可以参考 posts 和 repost 的实现
- 从 f.el 抄了一些小函数,可以考虑将 f.el 作为项目的依赖项