如何创建org-mode 博客
structure
├── makefile ├── org │ ├── blog │ │ └── org-mode-blog.org │ ├── css │ │ ├── modus-operandi.css │ │ ├── modus-vivendi.css │ │ └── style.css │ └── index.org └── publish.el
init.el
;; Snippets E.G. <E
;;a ‘#+BEGIN_EXPORT ascii’ … ‘#+END_EXPORT’
;;c ‘#+BEGIN_CENTER’ … ‘#+END_CENTER’
;;C ‘#+BEGIN_COMMENT’ … ‘#+END_COMMENT’
;;e ‘#+BEGIN_EXAMPLE’ … ‘#+END_EXAMPLE’
;;E ‘#+BEGIN_EXPORT’ … ‘#+END_EXPORT’
;;h ‘#+BEGIN_EXPORT html’ … ‘#+END_EXPORT’
;;l ‘#+BEGIN_EXPORT latex’ … ‘#+END_EXPORT’
;;q ‘#+BEGIN_QUOTE’ … ‘#+END_QUOTE’
;;s ‘#+BEGIN_SRC’ … ‘#+END_SRC’
;;v ‘#+BEGIN_VERSE’ … ‘#+END_VERSE’
(require 'org-tempo)
;; timestamp format
(setf org-html-metadata-timestamp-format "%Y %b %d")
(setf org-export-date-timestamp-format "%Y-%m-%d")
;; Truncate line e.g. M-x toggle-truncate-lines
(add-hook 'org-mode-hook (lambda () (setq truncate-lines nil)))
;; Enable HTML5
(setq org-html-html5-fancy t
org-html-doctype "html5")
;; Disable ox-html's default CSS and JavaScript
(setq org-html-head-include-default-style nil
org-html-head-include-scripts nil)
;; Don't show section numbers or table of contents by default
(setq org-export-with-section-numbers nil
org-export-with-toc nil)
;; TODO: tweak headline id format. I dislike the randomly generated ones.
;; Look into customizing: :html-format-headline-function and
;; org-html-format-headline-function
;; (setq org-html-self-link-headlines 'nil)
(require 'ox-html)
;; Render ~verbatim~ as kbd tag in HTML
(add-to-list 'org-html-text-markup-alist '(verbatim . "<kbd>%s</kbd>"))
;; Enable code syntax highlighting if available
(require 'package)
(add-to-list 'package-archives '("melpa" . "http://melpa.org/packages/"))
(setq package-load-list '((htmlize t)))
(package-initialize)
(unless (package-installed-p 'htmlize)
(package-refresh-contents)
(package-install 'htmlize))
(if (package-installed-p 'htmlize)
(setq org-html-htmlize-output-type 'css)
(setq org-html-htmlize-output-type 'nil))
publish.el
(load "~/.emacs.d/init.el")
(require 'ox-publish)
(setq org-export-global-macros
'(("timestamp" . "@@html:<span class=\"timestamp\">[$1]</span>@@")
("cc-by-nd" . "@@html:<div class=\"license-notice-container\">
<div class=\"license-notice\">
<div class\"notice\">
<span><b>Note:</b></span>
<span>
<a rel=\"license\" href=\"http://creativecommons.org/licenses/by-nd/4.0/\">
<img alt=\"Creative Commons License\"
src=\"https://i.creativecommons.org/l/by-nd/4.0/88x31.png\" />
</a>
</span>
</div>
This post is licensed under the
<a rel=\"license\" href=\"http://creativecommons.org/licenses/by-nd/4.0/\">
CC-BY-ND 4.0
</a>.
</div>
</div>@@")
("right-justify" . "@@html:<span class=\"right-justify\">$1</span>@@")))
(defun org-sitemap-custom-entry-format (entry style project)
"Sitemap PROJECT ENTRY STYLE format that includes date."
(let ((filename (org-publish-find-title entry project)))
(if (= (length filename) 0)
(format "*%s*" entry)
(format "{{{timestamp(%s)}}} [[file:%s][%s]]"
(format-time-string "%Y-%m-%d"
(org-publish-find-date entry project))
entry
filename))))
(defvar blog-css "<link rel=\"stylesheet\" href=\"/css/style.css\" type=\"text/css\"/>")
(defvar blog-css-extra "<link rel=\"stylesheet\" media=\"(prefers-color-scheme: light)\" href=\"/css/modus-operandi.css\" type=\"text/css\"/>
<link rel=\"stylesheet\" media=\"(prefers-color-scheme: dark)\" href=\"/css/modus-vivendi.css\" type=\"text/css\"/>")
(defvar blog-header "<div id=\"updated\">Updated: %C</div>
<div id=\"org-div-home-and-up\">
<a href=\"https://example.com/blog\">Blog</a>
<a href=\"https://example.com/\">Home</a>
</div>
")
(defvar blog-footer "<hr/>
<footer>
<div class=\"copyright-container\">
<div class=\"Copyright\">
Copyright © 2017-2022 example some rights reserved<br/>
Content is available under
<a rel=\"license\" href=\"http://creativecommons.org/licenses/by-sa/4.0/\">
CC-BY-SA 4.0</a> unless otherwise noted
</div>
<div class=\"cc-badge\">
<a rel=\"license\" href=\"http://creativecommons.org/licenses/by-sa/4.0/\">
<img alt=\"Creative Commons License\"
src=\"https://i.creativecommons.org/l/by-sa/4.0/88x31.png\" />
</a>
</div>
</div>
<div class=\"banner\">
</a>
</div>
<div class=\"generated\">
Created with %c on <a href=\"https://www.gnu.org\">GNU</a>/<a href=\"https://www.kernel.org/\">Linux</a>
</div>
</footer>")
(defun my/relative-path-expand (path)
"Expand relative PATH from current buffer or file to a full path."
(concat
(if load-file-name
(file-name-directory load-file-name)
default-directory)
path))
(defvar blog-base-directory
(my/relative-path-expand "org/")
"The `base-directory' for blog project.")
(defvar blog-publish-directory
(my/relative-path-expand "html/")
;; "/ssh:root@example.com:/var/www/html/"
"The `publishing-directory' for blog project.")
(setq org-publish-project-alist
`(
("index"
:base-directory ,blog-base-directory
:base-extension "org"
:exclude ".*"
:include ("index.org")
:publishing-directory ,blog-publish-directory
:publishing-function org-html-publish-to-html
:html-head ,blog-css
:html-preamble "<div id=\"updated\">Updated: %C</div>"
:html-postamble ,blog-footer)
("blog"
:base-directory ,(concat blog-base-directory "blog/")
:base-extension "org"
:publishing-directory ,(concat blog-publish-directory "blog/")
:publishing-function org-html-publish-to-html
:auto-sitemap t
:sitemap-title "Blog Posts"
:sitemap-filename "index.org"
:sitemap-sort-files anti-chronologically
:sitemap-format-entry org-sitemap-custom-entry-format
:html-head ,blog-css
:html-head-extra ,blog-css-extra
:html-preamble ,blog-header
:html-postamble ,blog-footer)
("static"
:base-directory ,blog-base-directory
:base-extension "css\\|js\\|png\\|jpg\\|gif\\|pdf\\|mp3\\|ogg\\|swf"
:recursive t
:publishing-directory ,blog-publish-directory
:publishing-function org-publish-attachment)
("org" :components ("blog" "static"))))
makefile
all: emacs -Q --batch -l publish.el -f org-publish-all publish: all rsync -e ssh -vr html/ root@example.com:/var/www/html/ clean: rm -r html/*
Comments:
Email questions, comments, and corrections to hi@smartisan.dev.
Submissions may appear publicly on this website, unless requested otherwise in your email.