Add RSS support to the build doc
This commit is contained in:
parent
8415ab2e9b
commit
cb32a5873e
|
@ -62,6 +62,17 @@ main docs.")
|
||||||
(defvar fg42/build-output-dir "/build"
|
(defvar fg42/build-output-dir "/build"
|
||||||
"The path to the build directory.")
|
"The path to the build directory.")
|
||||||
|
|
||||||
|
(defvar fg42/build-docs-title "FG42"
|
||||||
|
"Title of the generated docs. Like the website title")
|
||||||
|
|
||||||
|
|
||||||
|
(defvar fg42/build-docs-desc "The ultimate editor for true believers"
|
||||||
|
"Description of the generated docs. Like the website description")
|
||||||
|
|
||||||
|
(defvar fg42/build-usage "./builder.el SUBCOMMAND"
|
||||||
|
"Title of the generated docs. Like the website title")
|
||||||
|
|
||||||
|
|
||||||
(defmacro defproject (prject-name &rest details)
|
(defmacro defproject (prject-name &rest details)
|
||||||
"Create a project with the given DETAILS.
|
"Create a project with the given DETAILS.
|
||||||
|
|
||||||
|
@ -111,6 +122,10 @@ The build system will consum these details for various purposes."
|
||||||
(t (print-help ,command-var))))))
|
(t (print-help ,command-var))))))
|
||||||
|
|
||||||
|
|
||||||
|
(defun print-help (_)
|
||||||
|
"Print out the usage for the build script"
|
||||||
|
(message fg42/build-usage))
|
||||||
|
|
||||||
(defun from-root (path)
|
(defun from-root (path)
|
||||||
"Return the full path of the given PATH in the project root."
|
"Return the full path of the given PATH in the project root."
|
||||||
(concat fg42/build-project-root path))
|
(concat fg42/build-project-root path))
|
||||||
|
|
|
@ -30,15 +30,14 @@
|
||||||
(fpkg/use mustache)
|
(fpkg/use mustache)
|
||||||
(fpkg/use ht)
|
(fpkg/use ht)
|
||||||
(fpkg/use htmlize)
|
(fpkg/use htmlize)
|
||||||
(fpkg/use ox-rss)
|
|
||||||
|
|
||||||
(require 'ox-html)
|
(require 'ox-html)
|
||||||
(require 'ox-rss)
|
|
||||||
|
|
||||||
(require 'cubes/all)
|
(require 'cubes/all)
|
||||||
(require 'fg42/build/core)
|
(require 'fg42/build/core)
|
||||||
(require 'fg42/build/utils)
|
(require 'fg42/build/utils)
|
||||||
(require 'fg42/build/ox-template)
|
(require 'fg42/build/ox-template)
|
||||||
|
(require 'fg42/build/rss)
|
||||||
|
|
||||||
(defvar cube-template (from-root "/docs/site/templates/cube.org"))
|
(defvar cube-template (from-root "/docs/site/templates/cube.org"))
|
||||||
(defvar cubes-index-template (from-root "/docs/site/templates/cubes.org"))
|
(defvar cubes-index-template (from-root "/docs/site/templates/cubes.org"))
|
||||||
|
@ -142,7 +141,24 @@ Not pages."
|
||||||
(->epoch (get-file-global-props file "DATE"))
|
(->epoch (get-file-global-props file "DATE"))
|
||||||
(get-file-global-props file "TITLE")
|
(get-file-global-props file "TITLE")
|
||||||
(replace-regexp-in-string "\\.org" ".html"
|
(replace-regexp-in-string "\\.org" ".html"
|
||||||
(file-name-nondirectory file)))
|
(file-name-nondirectory file))
|
||||||
|
(list file (fg42/exctract-keywords file '("TITLE" "DATE" "DESC" "AUTHOR" "CATEGORY"))))
|
||||||
|
result)
|
||||||
|
result)))
|
||||||
|
files
|
||||||
|
'())))
|
||||||
|
|
||||||
|
(defun get-all-posts-files ()
|
||||||
|
"Return all the post org files.
|
||||||
|
Not pages."
|
||||||
|
(let ((files (all-org-files)))
|
||||||
|
(seq-reduce
|
||||||
|
(lambda (result file)
|
||||||
|
(let ((is-page? (string= (get-file-global-props file "PAGE") "true")))
|
||||||
|
(if (not is-page?)
|
||||||
|
;; It's a post
|
||||||
|
(cons
|
||||||
|
file
|
||||||
result)
|
result)
|
||||||
result)))
|
result)))
|
||||||
files
|
files
|
||||||
|
@ -174,26 +190,6 @@ Not pages."
|
||||||
"\n")))
|
"\n")))
|
||||||
|
|
||||||
|
|
||||||
(defun latest-org-list-rss (base-url)
|
|
||||||
"Return a list of headlines (using BASE-URL) for the RSS."
|
|
||||||
(let ((posts (get-all-sorted-posts)))
|
|
||||||
(mapconcat
|
|
||||||
(lambda (post)
|
|
||||||
(format "* %s\n:PROPERTIES:\n:RSS_PERMALINK:%s%s/%s?%s\n:END:"
|
|
||||||
;; Title
|
|
||||||
(nth 1 post)
|
|
||||||
base-url
|
|
||||||
fg42/build-docs-pages-dir
|
|
||||||
;; Path
|
|
||||||
(nth 2 post)
|
|
||||||
;; Hash
|
|
||||||
(car post)
|
|
||||||
;; Title
|
|
||||||
(nth 1 post)))
|
|
||||||
posts
|
|
||||||
"\n")))
|
|
||||||
|
|
||||||
|
|
||||||
(defun get-all-categories ()
|
(defun get-all-categories ()
|
||||||
"Return all the categories of the org files."
|
"Return all the categories of the org files."
|
||||||
(seq-reduce
|
(seq-reduce
|
||||||
|
@ -201,22 +197,22 @@ Not pages."
|
||||||
(lambda (all-cats file)
|
(lambda (all-cats file)
|
||||||
(if (not (member (file-relative-name file org-directory)
|
(if (not (member (file-relative-name file org-directory)
|
||||||
fg42/build-docs-ignore-category-check))
|
fg42/build-docs-ignore-category-check))
|
||||||
(let ((is-page? (string= (get-file-global-props file "PAGE") "true"))
|
(let ((is-page? (string= (get-file-global-props file "PAGE") "true"))
|
||||||
(cat (get-file-global-props file "CATEGORY"))
|
(cat (get-file-global-props file "CATEGORY"))
|
||||||
(cat-list (car all-cats))
|
(cat-list (car all-cats))
|
||||||
(cat->file (cdr all-cats)))
|
(cat->file (cdr all-cats)))
|
||||||
|
|
||||||
(if (not is-page?)
|
(if (not is-page?)
|
||||||
(cons
|
(cons
|
||||||
;; Category list
|
;; Category list
|
||||||
(if (member cat cat-list) cat-list (sort (cons cat cat-list) 'string<))
|
(if (member cat cat-list) cat-list (sort (cons cat cat-list) 'string<))
|
||||||
;; cat->file
|
;; cat->file
|
||||||
(cons (cons cat
|
(cons (cons cat
|
||||||
;; Current value of the the given cat (all the files
|
;; Current value of the the given cat (all the files
|
||||||
;; under that category)
|
;; under that category)
|
||||||
(append (list file) (cdr (assoc cat cat->file))))
|
(append (list file) (cdr (assoc cat cat->file))))
|
||||||
cat->file))
|
cat->file))
|
||||||
all-cats))
|
all-cats))
|
||||||
all-cats))
|
all-cats))
|
||||||
(all-org-files)
|
(all-org-files)
|
||||||
'()))
|
'()))
|
||||||
|
@ -366,12 +362,6 @@ Not pages."
|
||||||
(expand-file-name "site/tags/index.org" build-dir)
|
(expand-file-name "site/tags/index.org" build-dir)
|
||||||
`((:links . ,(tags-org-list))))
|
`((:links . ,(tags-org-list))))
|
||||||
|
|
||||||
(message "Creating the rss feed")
|
|
||||||
(copy-template (from-docs "/templates/rss.org")
|
|
||||||
(expand-file-name "site/rss.org" build-dir)
|
|
||||||
`((:base-url . ,base-url)
|
|
||||||
(:posts . ,(latest-org-list-rss base-url))))
|
|
||||||
|
|
||||||
(create-tag-pages build-dir)
|
(create-tag-pages build-dir)
|
||||||
|
|
||||||
(setq org-html-preamble #'preamble-fn)
|
(setq org-html-preamble #'preamble-fn)
|
||||||
|
@ -407,7 +397,7 @@ Not pages."
|
||||||
:htmlized-source nil
|
:htmlized-source nil
|
||||||
:sitemap-folders ignore
|
:sitemap-folders ignore
|
||||||
:sitemap-style list
|
:sitemap-style list
|
||||||
:sitemap-title "FG42, The ultimate editor for true believers"
|
:sitemap-title ,fg42/build-docs-title
|
||||||
:sitemap-filename "sitemap.inc"
|
:sitemap-filename "sitemap.inc"
|
||||||
:sitemap-sort-files anti-chronologically
|
:sitemap-sort-files anti-chronologically
|
||||||
:html-format-headline-function headline-format
|
:html-format-headline-function headline-format
|
||||||
|
@ -422,6 +412,7 @@ Not pages."
|
||||||
:rss-extension "xml"
|
:rss-extension "xml"
|
||||||
:publishing-directory ,final-dir
|
:publishing-directory ,final-dir
|
||||||
:publishing-function (org-rss-publish-to-rss)
|
:publishing-function (org-rss-publish-to-rss)
|
||||||
|
:org-rss-use-entry-url-as-guid t
|
||||||
:section-numbers nil
|
:section-numbers nil
|
||||||
:exclude ".*" ;; To exclude all files...
|
:exclude ".*" ;; To exclude all files...
|
||||||
:include ("rss.org") ;; ... except index.org.
|
:include ("rss.org") ;; ... except index.org.
|
||||||
|
@ -433,9 +424,10 @@ Not pages."
|
||||||
:publishing-directory ,final-dir
|
:publishing-directory ,final-dir
|
||||||
:recursive t
|
:recursive t
|
||||||
:publishing-function org-publish-attachment)
|
:publishing-function org-publish-attachment)
|
||||||
("build" :components ("website" "statics" "rss"))))
|
("build" :components ("website" "statics"))))
|
||||||
|
|
||||||
(org-publish-project "build" t nil)
|
(org-publish-project "build" t nil)
|
||||||
|
(fg42/rss-create (get-all-sorted-posts) base-url (expand-file-name "rss.xml" final-dir))
|
||||||
(message "Build complete.")))
|
(message "Build complete.")))
|
||||||
|
|
||||||
(provide 'fg42/build/docs)
|
(provide 'fg42/build/docs)
|
||||||
|
|
|
@ -0,0 +1,93 @@
|
||||||
|
;;; Buid --- The builder for FG42 -*- lexical-binding: t; -*-
|
||||||
|
;;
|
||||||
|
;; Copyright (c) 2010-2022 Sameer Rahmani & Contributors
|
||||||
|
;;
|
||||||
|
;; Author: Sameer Rahmani <lxsameer@gnu.org>
|
||||||
|
;; URL: https://gitlab.com/FG42/FG42
|
||||||
|
;; Version: 3.0.0
|
||||||
|
;;
|
||||||
|
;; This program is free software; you can redistribute it and/or modify
|
||||||
|
;; it under the terms of the GNU General Public License as published by
|
||||||
|
;; the Free Software Foundation, either version 3 of the License, or
|
||||||
|
;; (at your option) any later version.
|
||||||
|
;;
|
||||||
|
;; This program 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 General Public License for more details.
|
||||||
|
;;
|
||||||
|
;; You should have received a copy of the GNU General Public License
|
||||||
|
;; along with thnis program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
;;
|
||||||
|
;;; Commentary:
|
||||||
|
;; Cubes are the building blocks of any `FG42' editor. Each `cube' is a
|
||||||
|
;; unit which defines different abilities in a deterministic and idempotent
|
||||||
|
;; way. Cubes are composable and a composition of cubes creates an editor.
|
||||||
|
;;
|
||||||
|
;;; Code:
|
||||||
|
(require 'seq)
|
||||||
|
(require 'fg42/build/core)
|
||||||
|
|
||||||
|
(defun fg42/rss-map-items (file-and-props link)
|
||||||
|
"Create a RSS item from the given org FILE with the give http LINK"
|
||||||
|
(let* ((file (car file-and-props))
|
||||||
|
(values (cadr file-and-props)))
|
||||||
|
(format
|
||||||
|
(concat
|
||||||
|
" <item>\n"
|
||||||
|
" <title>%s</title>\n"
|
||||||
|
" <link>%s</link>\n"
|
||||||
|
" <author>%s</author>\n"
|
||||||
|
" <guid isPermaLink=\"false\">%s</guid>\n"
|
||||||
|
" <pubDate>%s</pubDate>\n"
|
||||||
|
" <description><![CDATA[%s]]></description>\n"
|
||||||
|
" </item>\n")
|
||||||
|
(cadr (assoc "TITLE" values))
|
||||||
|
link
|
||||||
|
(or
|
||||||
|
(cadr (assoc "AUTHOR" values))
|
||||||
|
fg42/build-author-name)
|
||||||
|
link
|
||||||
|
(or
|
||||||
|
(cadr (assoc "DATE" values))
|
||||||
|
(error "'DATE' is missing from '%s'" file))
|
||||||
|
(or
|
||||||
|
(cadr (assoc "DESC" values))
|
||||||
|
(error "'DESC' is missing from '%s'" file)))))
|
||||||
|
|
||||||
|
|
||||||
|
(defun fg42/rss-create-item (post base-url)
|
||||||
|
(fg42/rss-map-items
|
||||||
|
(car (last post))
|
||||||
|
(format "%s%s/%s"
|
||||||
|
base-url
|
||||||
|
fg42/build-docs-pages-dir
|
||||||
|
;; Path
|
||||||
|
(nth 2 post))))
|
||||||
|
|
||||||
|
(defun fg42/rss-create (posts base-url dest)
|
||||||
|
"Create a RSS xml file via POSTS for the give BASE-URL and save to DEST"
|
||||||
|
(with-temp-file dest
|
||||||
|
(insert
|
||||||
|
(format
|
||||||
|
(concat
|
||||||
|
"<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n"
|
||||||
|
"<rss version=\"2.0\">\n"
|
||||||
|
"<channel>\n"
|
||||||
|
" <title>%s</title>\n"
|
||||||
|
" <link>%s</link>\n"
|
||||||
|
" <description>%s</description>\n"
|
||||||
|
"%s\n"
|
||||||
|
"</channel>\n"
|
||||||
|
"</rss>\n")
|
||||||
|
fg42/build-docs-title
|
||||||
|
base-url
|
||||||
|
fg42/build-docs-desc
|
||||||
|
(mapconcat
|
||||||
|
(lambda (post)
|
||||||
|
(fg42/rss-create-item post base-url))
|
||||||
|
posts)))))
|
||||||
|
|
||||||
|
|
||||||
|
(provide 'fg42/build/rss)
|
||||||
|
;;; docs.el ends here
|
|
@ -60,6 +60,18 @@
|
||||||
(get-buffer-global-props prop)))
|
(get-buffer-global-props prop)))
|
||||||
|
|
||||||
|
|
||||||
|
(defun fg42/exctract-keywords (file keys)
|
||||||
|
"Create a RSS item from the given org FILE"
|
||||||
|
(let ((cwd (getenv "PWD"))
|
||||||
|
(old-org-directory org-directory))
|
||||||
|
(cd fg42/build-project-root)
|
||||||
|
(prog1
|
||||||
|
(with-temp-buffer
|
||||||
|
(insert-file-contents file)
|
||||||
|
(org-collect-keywords keys))
|
||||||
|
(cd cwd))))
|
||||||
|
|
||||||
|
|
||||||
(defun pair-file-with-date (file)
|
(defun pair-file-with-date (file)
|
||||||
"Return a pair for the given FILE with date as car and file as cdr."
|
"Return a pair for the given FILE with date as car and file as cdr."
|
||||||
(cons
|
(cons
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
|
|
||||||
<header>
|
<header>
|
||||||
<nav style="text-align: center;">
|
<nav style="text-align: center;">
|
||||||
<a href="/">HOME</a> | <a href="/cubes/">Cubes</a> | <a href="https://devheroes.codes/FG42/FG42">Source</a> | <a href="/categories/">Categories</a> | <a href="/tags/">Tags</a>
|
<a href="/">HOME</a> | <a href="/cubes/">Cubes</a> | <a href="https://devheroes.codes/FG42/FG42">Source</a> | <a href="/categories/">Categories</a> | <a href="/tags/">Tags</a> | <a href="/index.xml">RSS</a>
|
||||||
</nav>
|
</nav>
|
||||||
<hr/>
|
<hr/>
|
||||||
</header>
|
</header>
|
||||||
|
|
Loading…
Reference in New Issue