aboutsummaryrefslogtreecommitdiffstats
path: root/project-config.el
blob: 5c082621a67fc4d7a1ae8a65aae60e52355d92f1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
(require 'ox-publish)
(require 'ox-rss)

(setq org-export-exclude-tags '("noexport" "draft"))

(setq org-publish-project-alist
      '(("ryuslash.org"
         :base-directory "."
         :publishing-directory "public_html"
         :exclude "\\`README.org\\'"
         :base-extension "org"
         :publishing-function org-html-publish-to-html
         :html-head "<link rel=\"stylesheet\" href=\"assets/css/main.css\" type=\"text/css\"/>"
         :html-link-home "https://ryuslash.gitlab.io/ryuslash.org/"
         :html-link-user-abs-url t)
        ("ryuslash.org Posts"
         :base-directory "posts"
         :publishing-directory "public_html/posts"
         :exclude "\\`README.org\\'"
         :base-extension "org"
         :publishing-function org-html-publish-to-html
         :html-head "<link rel=\"stylesheet\" href=\"../assets/css/main.css\" type=\"text/css\"/>"
         :html-link-home "https://ryuslash.gitlab.io/ryuslash.org/"
         :html-link-user-abs-url t)
        ("ryuslash-rss"
         :base-directory "."
         :publishing-directory "public_html"
         :exclude ".*"
         :include ("index.org")
         :base-extension "org"
         :publishing-function org-rss-publish-to-rss)))

(defun publish-ryuslash.org ()
  (with-current-buffer (find-file "index.org")
    (org-update-all-dblocks)
    (save-buffer))
  (org-publish-all))

(defun project-config-parse-element (org-element)
  (pcase org-element
    (`(keyword ,something) (cons (intern (plist-get something :key))
                                 (plist-get something :value)))
    (`(paragraph ,something) (cons
                              'BODY
                              (buffer-substring-no-properties
                               (plist-get something :contents-begin)
                               (plist-get something :contents-end))))))

(defun project-config-parse-document (document)
  (with-current-buffer (find-file document)
    (goto-char (point-min))
    (let (alist)
      (while (not (alist-get 'BODY alist nil nil #'equal))
        (setq alist (cons (project-config-parse-element (org-element-at-point))
                          alist))
        (org-forward-element))
      alist)))

(defun project-config-print-element (alist)
  (format "* %s\n  :PROPERTIES:\n  :ID: %s\n  :PUBDATE: %s\n  :END:\n\n  %s\n[[file:%s][Read more (%d minutes)]]\n"
          (alist-get 'TITLE alist)
          (alist-get 'ID alist)
          (alist-get 'PUBDATE alist)
          (alist-get 'BODY alist)
          (alist-get 'NAME alist)
          (alist-get 'LENGTH alist)))

(defun project-config-reading-time (file)
  (with-current-buffer (find-file file)
    (max 1 (/ (count-words (point-min) (point-max)) 225))))

(defun project-config-print-file (file)
  (project-config-print-element
   (append `((NAME . ,(concat "posts/" file))
             (LENGTH . ,(project-config-reading-time (concat "posts/" file))))
           (project-config-parse-document (concat "posts/" file)))))

(defun org-dblock-write:blog-posts (params)
  (let ((files (cl-remove-if (lambda (item) (string-prefix-p "." item)) (directory-files "posts"))))
    (insert  (format "%s" (apply #'concat (mapcar #'project-config-print-file files))))))