blog-site

https://lin.moe

git clone git://git.lin.moe/blog-site.git

  1#!/usr/bin/emacs --script
  2
  3(setq my-website-public-dir (expand-file-name "./public/")
  4      my-content-dir (expand-file-name "./content/")
  5      my-blog-dir (expand-file-name "./content/blog/")
  6      my-templates-dir (expand-file-name "./templates/")
  7      
  8      my-website-home "/")
  9
 10(setq package-user-dir (expand-file-name "./.packages"))
 11
 12(setq package-archives '(("melpa" . "https://melpa.org/packages/")
 13                         ("elpa" . "https://elpa.gnu.org/packages/")))
 14
 15(setq use-package-always-ensure t
 16      backup-directory-alist `(("." . ,(expand-file-name "./.saves/")))
 17      tramp-auto-save-directory ".saves")
 18
 19(package-initialize)
 20(unless package-archive-contents
 21  (package-refresh-contents))
 22(unless (package-installed-p 'use-package)
 23  (package-install 'use-package))
 24
 25(require 'use-package)
 26(require 'ox-publish)
 27
 28(use-package htmlize)
 29
 30;; for code highlight
 31(use-package go-mode)
 32(use-package nginx-mode)
 33(use-package cc-mode)
 34
 35(use-package org-publish-rss
 36  :vc (org-publish-rss
 37       :url "https://git.sr.ht/~taingram/org-publish-rss"
 38       :rev :newest))
 39
 40(setq org-ascii-text-width 100
 41      org-export-with-section-numbers nil
 42      org-export-with-creator nil
 43      org-export-with-email nil
 44      org-export-with-author nil
 45      org-export-with-date t
 46      org-html-validation-link nil
 47      org-html-html5-fancy t
 48      org-html-doctype "xhtml5"
 49      org-html-head-include-scripts nil
 50      org-html-htmlize-output-type 'css
 51      org-html-head-include-default-style nil
 52      org-html-head "<link rel=\"stylesheet\" type=\"text/css\" href=\"/css/orgmode.min.css\" />"
 53      org-html-viewport '((width "device-width")
 54			  (initial-scale "1")))
 55
 56(setq org-publish-timestamp-directory (concat default-directory ".org-timestamps/")
 57      org-export-time-stamp-file nil
 58      org-export-global-macros '(("timestamp" . "@@html:<span class=\"timestamp\">$1</span>@@")))
 59
 60(setq org-confirm-babel-evaluate nil)
 61(org-babel-do-load-languages
 62 'org-babel-load-languages
 63 '((shell . t)
 64   (python . t)
 65   (emacs-lisp . t)))
 66
 67
 68(defun website-header (info)
 69  (with-temp-buffer
 70    (insert-file-contents (concat my-templates-dir "header.html"))
 71    (buffer-string)))
 72
 73(defun website-footer (info)
 74  (with-temp-buffer
 75    (insert-file-contents (concat my-templates-dir "footer.html"))
 76    (buffer-string)))
 77
 78(defun my-blog-articles-preprocessor (project-plist)
 79  (message "In the articles preprocessor."))
 80
 81(defun my-blog-articles-postprocessor (project-plist)
 82  (org-publish-rss project-plist)
 83  (message "In the articles postprocessor."))
 84
 85;; ------ Sitemap ---------
 86(defun file-in-categories (filename categories)
 87  (with-temp-buffer
 88    (insert-file-contents filename)
 89    (delay-mode-hooks (org-mode))
 90    (member (downcase (org-get-category)) categories)))
 91
 92(defun file-is-blog-post (filename)
 93  (file-in-categories filename '("blog")))
 94
 95(defun my-sitemap-entry (entry style project)
 96  (message (plist-get (cdr project) :base-directory))
 97  (if (and (not (directory-name-p entry))
 98	   (file-is-blog-post (expand-file-name entry (plist-get (cdr project) :base-directory))))
 99      (let* ((date (org-publish-find-date entry project)))
100	(format "{{{timestamp(%s)}}}[[file:%s][%s]]"
101                (if date (format-time-string "[%Y-%m-%d] " date) "")
102		entry
103		(org-publish-find-title entry project)))
104    ""))
105
106(defun my-sitemap-function (title list)
107  (let ((fixedlist (seq-filter (lambda (i) ( if (listp i) (not (member "" i)) t)) list)))
108    (org-list-to-org fixedlist)))
109
110(defun my-blog-org-export-format-drawer (name content)
111  (concat "<div class=\"drawer " (downcase name) "\">\n"
112          ;; "<h6>" (capitalize name) "</h6>\n"
113          content
114          "\n</div>"))
115
116(defun org-html-publish-skipdraft (plist filename pub-dir)
117  (with-current-buffer (find-file-noselect filename)
118      (if (file-in-categories filename '("draft"))
119          (message "Skipping draft file: %s" filename)
120        (org-html-publish-to-html plist filename pub-dir))))
121
122(setq org-publish-project-alist
123      `(("org-site:main"
124         :recursive nil
125         :base-directory ,my-content-dir
126         :publishing-directory ,my-website-public-dir
127         :base-extension "org"
128
129         :with-drawers t
130         :html-format-drawer-function my-blog-org-export-format-drawer
131
132         :publishing-function org-html-publish-skipdraft)
133        
134        ("org-site:blog"
135              :recursive t
136
137              :base-directory ,my-blog-dir
138              :publishing-directory ,(expand-file-name "blog" my-website-public-dir)
139              :publishing-function org-html-publish-skipdraft
140	      :base-extension "org"
141              :html-link-home ,my-website-home
142              :html-link-up "/blog"
143
144              :htmlized-source t
145
146              :html-preamble website-header
147              :html-postamble website-footer
148
149              :completion-function my-blog-articles-postprocessor
150              :preparation-function my-blog-articles-preprocessor
151              
152              :auto-rss t
153
154              :auto-sitemap t
155              :sitemap-filename "sitemap.inc"
156              :sitemap-format-entry my-sitemap-entry
157	      :sitemap-function my-sitemap-function
158	      :sitemap-style list
159              :sitemap-sort-files anti-chronologically
160
161              :makeindex nil
162              
163              :with-drawers t
164              :html-format-drawer-function my-blog-org-export-format-drawer
165
166              :rss-title "Lindsay"
167              :rss-description ""
168              :rss-with-content all
169              :rss-file "rss.xml"
170              :rss-filter-function file-is-blog-post)
171
172	("org-site:static"
173	      :recursive t
174	      :base-directory ,my-content-dir
175	      :base-extension "txt\\|html\\|md\\|css\\|js\\|png\\|jpg\\|gif\\|pdf\\|mp3\\|ogg\\|swf\\|ico\\|xml"
176              
177	      :publishing-directory ,my-website-public-dir
178	      :publishing-function org-publish-attachment
179              :time-stamp-file nil)
180        ("org-site" :components ("org-site:blog" "org-site:main" "org-site:static"))))
181
182(org-publish-rss "org-site")
183(org-publish "org-site")