aboutsummaryrefslogblamecommitdiff
path: root/publish.el
blob: 8b7417815ea7d6da552be14916f481e62702c458 (plain) (tree)
1
2
3
                                      
 
                                                                                           














                                                                              

                    
                     
                  


                                    
                               

                                                  



                                                                        

                   




                                                                               
 





                                        






                                                                 


                                                                           
                      
                                                         


                                                                               
                                              

                                              


                                                                    







                                                                            
                                                                   
                                                                      


                
                                   
                                       









                                                                                                   
 





                                                                          

                                 

                               
                                

                                           
                       

                                                      






                                                                                             
                                                                                                








                                                                                                
                                     


                                                
                                                      
                        













                                                                                                
                                
                              
                                     

                                                      

                                                                                             


                                                                                                                               

















                                                                                                




                                                    

                   




                                                    








                                                                                             
;; Copyright (C) 2021-2022 Yuchen Pei.

;; This file is part of site generator for Yuchen's personal website (abbreviated to sg4y).

;; sg4y is free software: you can redistribute it and/or modify
;; it under the terms of the GNU Affero General Public License as published by
;; the Free Software Foundation, either version 3 of the License, or
;; (at your option) any later version.

;; sg4y is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;; GNU Affero General Public License for more details.

;; You should have received a copy of the GNU Affero General Public License
;; along with sg4y.  If not, see <https://www.gnu.org/licenses/>.


(package-initialize)

(require 'ox-publish)
(require 'htmlize)

(defvar this-date-format "%Y-%m-%d")

(defun me/html-preamble (plist)
  "PLIST: An entry."
  (if (org-export-get-date plist this-date-format)
      (plist-put plist
                 :subtitle
                 (format "Published on %s"
                         (org-export-get-date plist this-date-format))))
  ;; Preamble
  (with-temp-buffer
    (insert-file-contents "../html-templates/preamble.html") (buffer-string)))

(defun me/html-postamble (plist)
  (with-temp-buffer
    (insert-file-contents "../html-templates/postamble.html") (buffer-string)))

(defun me/html-postamble-post (plist)
  (concat "<div id=\"comments\">
  <section id=\"isso-thread\"></section>
</div>"
          (me/html-postamble plist)))

(defun me/org-posts-sitemap-format-entry (entry style project)
  "Format posts with author and published data in the index page.

ENTRY: file-name
STYLE:
PROJECT: `posts in this case."
  (cond ((not (directory-name-p entry))
         (format "%s - *[[file:posts/%s][%s]]*"
                 (format-time-string this-date-format
                                     (org-publish-find-date entry project))
                 entry
                 (org-publish-find-title entry project)))
        ((eq style 'tree) (file-name-nondirectory (directory-file-name entry)))
        (t entry)))

(defun org-publish-find-content (file project)
  "Finds the content of an org file.
The content starts with the first empty line."
  (let ((file (org-publish--expand-file-name file project)))
    (when (and (file-readable-p file) (not (directory-name-p file)))
      (with-temp-buffer
	      (insert-file-contents file)
	      ;; important, otherwise org may truncate the sitemap, probably
	      ;; due to some problem in converting all things to a list
	      (delete-trailing-whitespace) 
	      (goto-char (point-min))
	      (let ((beg (+ 1 (re-search-forward "^$"))))
	        (buffer-substring beg (point-max)))))))

(defun me/org-microposts-sitemap-format-entry (entry style project)
  "Format microposts with author and published data in the index page.

ENTRY: file-name
STYLE:
PROJECT: `microposts in this case."
  (cond ((not (directory-name-p entry))
	       (format "*[[%s][%s]]* - %s\n<<%s>>\n\n%s"
		             (file-name-sans-extension entry)
		             (format-time-string this-date-format
				                             (org-publish-find-date entry project))
		             (org-publish-find-title entry project)
		             (file-name-sans-extension entry)
		             (org-publish-find-content entry project)
		             ))
	      ((eq style 'tree) (file-name-nondirectory (directory-file-name entry)))
	      (t entry)))

(defun me/org-publish-microblog (plist filename pub-dir)
  "Publish RSS with PLIST, only when FILENAME is '../pages/microblog.org'.
PUB-DIR is when the output will be placed."
  (if (equal "../pages/microblog.org" (file-name-nondirectory filename))
      (org-html-publish-to-html plist filename pub-dir)))

(setq org-src-fontify-natively t)

(setq org-publish-project-alist
      '(("posts"
         :base-directory "posts"
         :base-extension "org"
         :publishing-directory "site/posts"
         :recursive nil
         :publishing-function org-html-publish-to-html
         :auto-sitemap t
	       :section-numbers nil
	       :sitemap-format-entry me/org-posts-sitemap-format-entry
	       :sitemap-title "Yuchen's Blog"
	       :sitemap-sort-files anti-chronologically
	       :sitemap-filename "../pages/blog.org"
	       :html-doctype "html5"
	       :html-head "<link rel='stylesheet' href='../css/default.css' type='text/css'/>
<link rel='alternate' title=\"Yuchen's blog\" href='/blog-feed.xml' type='application/rss+xml'>"
	       :html-preamble me/html-preamble
	       :html-self-link-headlines t
	       :author ("Yuchen Pei")
	       :html-postamble me/html-postamble-post
	       :html-mathjax-options ((path "/js/mathjax/MathJax.js?config=TeX-AMS_CHTML"))
	       :html-mathjax-template "<script type=\"text/javascript\" src=\"%PATH\"></script>"
	       :htmlized-source t
	       )
	      ("microposts"
         :base-directory "microposts"
         :base-extension "org"
         :publishing-directory "site/microposts"
         :recursive t
         :publishing-function me/org-publish-microblog
         :auto-sitemap t
	       :sitemap-format-entry me/org-microposts-sitemap-format-entry
	       :sitemap-title "Yuchen's Microblog"
	       :sitemap-sort-files anti-chronologically
	       :sitemap-filename "../pages/microblog.org"
	       :html-doctype "html5"
	       :html-head "<link rel='stylesheet' href='../css/default.css' type='text/css'/>"
	       :html-preamble me/html-preamble
	       :author ("Yuchen Pei")
	       :html-postamble me/html-postamble
	       :html-mathjax-options ((path "/js/mathjax/MathJax.js?config=TeX-AMS_CHTML"))
	       :html-mathjax-template "<script type=\"text/javascript\" src=\"%PATH\"></script>"
	       :htmlized-source t
	       )
	      ("pages"
         :base-directory "pages"
         :base-extension "org"
         :publishing-directory "site"
         :recursive t
         :publishing-function org-html-publish-to-html
	       :html-doctype "html5"
	       :html-head "<link rel='stylesheet' href='../css/default.css' type='text/css'/>
                     <link rel='stylesheet' href='../css/page.css' type='text/css'/>
                     <link rel='alternate' title=\"Yuchen's blog\" href='/blog-feed.xml' type='application/rss+xml'>
                     <link rel='alternate' title=\"Yuchen's microblog\" href='/microblog-feed.xml' type='application/rss+xml'>"
	       :html-preamble me/html-preamble
	       :author ("Yuchen Pei")
	       :section-numbers nil
	       :with-toc nil
	       :html-postamble me/html-postamble
	       :html-prefer-user-labels t
	       :html-mathjax-options ((path "/js/mathjax/MathJax.js?config=TeX-AMS_CHTML"))
	       :html-mathjax-template "<script type=\"text/javascript\" src=\"%PATH\"></script>"
	       :htmlized-source t
	       )	 
        ("html-pages"
         :base-directory "pages"
         :base-extension "html"
         :publishing-directory "site"
         :recursive t
         :publishing-function org-publish-attachment
         )
	      ("css"
         :base-directory "css"
         :base-extension "css"
         :publishing-directory "site/css"
         :publishing-function org-publish-attachment
         :recursive t
	       )
	      ("js"
         :base-directory "js"
         :base-extension "js"
         :publishing-directory "site/js"
         :publishing-function org-publish-attachment
         :recursive t
	       )
	      ("assets"
	       :base-directory "assets"
	       :base-extension any
	       :publishing-directory "site/assets"
	       :publishing-function org-publish-attachment
	       :recursive t
	       )
        ("all" :components ("posts" "microposts" "pages" "html-pages" "css" "js" "assets"))))