Setup the indexer functions for the 'docs' build command
This commit is contained in:
parent
51b5c42bd4
commit
eb621760df
4
Makefile
4
Makefile
|
@ -44,11 +44,11 @@ clean:
|
|||
|
||||
.PHONY: dev-docs
|
||||
dev-docs: clean
|
||||
./build.el docs
|
||||
./build.el docs :d
|
||||
|
||||
.PHONY: docs
|
||||
docs:
|
||||
FG42_PROD=true ./build.el docs
|
||||
./build.el docs
|
||||
|
||||
serve: build
|
||||
npx http-server ./build
|
||||
|
|
6
build.el
6
build.el
|
@ -84,9 +84,9 @@ PARAMS:
|
|||
(setq project-root (car command-line-args-left))
|
||||
|
||||
(let* ((fg42-home (car command-line-args-left))
|
||||
(build-dir (from-root "/build/"))
|
||||
(build-dir (from-root "/build"))
|
||||
(parsed-args (read-args (cdr command-line-args-left)))
|
||||
(eval-string (car parsed-args))
|
||||
(eval-string (plist-get (car parsed-args) :e))
|
||||
(command (caadr parsed-args))
|
||||
(args (cdadr parsed-args)))
|
||||
|
||||
|
@ -94,6 +94,8 @@ PARAMS:
|
|||
(when eval-string
|
||||
(eval (car (read-from-string eval-string))))
|
||||
|
||||
(setq debug-mode (plist-get (car parsed-args) :d))
|
||||
|
||||
(cond
|
||||
((string= command "docs")
|
||||
(do-command
|
||||
|
|
|
@ -32,19 +32,43 @@
|
|||
(defvar project-root nil
|
||||
"Root directory of the website source code.")
|
||||
|
||||
|
||||
(defvar debug-mode nil)
|
||||
|
||||
|
||||
(defun from-root (path)
|
||||
"Return the full path of the given PATH in the project root."
|
||||
(concat project-root path))
|
||||
|
||||
|
||||
(defun prod-p ()
|
||||
"Return non-nil if debug mode is turned off"
|
||||
(not debug-mode))
|
||||
|
||||
|
||||
(defun read-args (args)
|
||||
"Parse the give ARGS list and return a list in the following
|
||||
format:
|
||||
(EVAL_STRING (COMMAND ARGES))
|
||||
"
|
||||
;; TODO: Because of some issues in the past we lost the original
|
||||
;; function and now we need to parse the ARGS for :e and :d keys
|
||||
`(() ,args))
|
||||
(FLAGS (COMMAND ARGES))"
|
||||
(seq-reduce
|
||||
(lambda (acc arg)
|
||||
(let ((flags (car acc))
|
||||
(commands (cadr acc))
|
||||
(i (caddr acc))
|
||||
(skip (cadddr acc)))
|
||||
|
||||
(if skip
|
||||
(list flags commands (1+ i) ())
|
||||
(progn
|
||||
(cond
|
||||
((string= arg ":d") (plist-put flags :d t))
|
||||
((string= arg ":e") (progn
|
||||
(plist-put flags :e (nth (1+ i) args))
|
||||
(setq skip (1+ i))))
|
||||
(t (push arg commands)))
|
||||
(list flags commands (1+ i) skip)))))
|
||||
args
|
||||
'((:d () :e ()) () 0 ())))
|
||||
|
||||
|
||||
(defun replace-in-buffer (str replacement)
|
||||
|
@ -59,6 +83,7 @@ format:
|
|||
"Replace the placeholder in SRC with list of pairs given in CONTEXT
|
||||
and write it to DEST."
|
||||
(make-directory (file-name-directory dest) t)
|
||||
(message "Copy template: '%s' -> '%s'" src dest)
|
||||
(with-temp-file dest
|
||||
(insert-file-contents src)
|
||||
(dolist (pair context)
|
||||
|
|
|
@ -28,6 +28,8 @@
|
|||
|
||||
(require 'cubes/all)
|
||||
(require 'fg42/build/core)
|
||||
(require 'fg42/build/utils)
|
||||
|
||||
|
||||
(defconst cube-template (from-root "/docs/site/templates/cube.org"))
|
||||
(defconst cubes-index-template (from-root "/docs/site/templates/cubes.org"))
|
||||
|
@ -43,7 +45,6 @@
|
|||
(docs (plist-get props :docs))
|
||||
(cube-file (concat (expand-file-name (symbol-name cube) cubes-dir)
|
||||
".org")))
|
||||
(message "Processing the docs for '%s' cube" cube)
|
||||
(copy-template cube-template
|
||||
cube-file
|
||||
(list
|
||||
|
@ -61,6 +62,7 @@
|
|||
(fg42/build-docs-copy-base build-dir)
|
||||
|
||||
;; Build the org files for each cube
|
||||
(message "Processing the docs for all the cubes")
|
||||
(mapcar (lambda (cube)
|
||||
(fg42/build-docs-for-cube build-dir cube))
|
||||
fg42/available-cubes)
|
||||
|
@ -81,10 +83,40 @@
|
|||
|
||||
(defun all-org-files ()
|
||||
"Return a list of all the org files in the orgs directory."
|
||||
(mapcar #'identity
|
||||
(split-string
|
||||
(shell-command-to-string (format "find %s -iname \"*.org\"" org-directory))
|
||||
"\n" t)))
|
||||
|
||||
(split-string
|
||||
(shell-command-to-string (format "find %s -iname \"*.org\"" org-directory))
|
||||
"\n" t))
|
||||
|
||||
|
||||
(defun get-all-tags ()
|
||||
"Return a list of all the tags in the org files."
|
||||
(seq-reduce
|
||||
;; all-tags is in (tags . tags->files) form
|
||||
(lambda (all-tags file)
|
||||
(if (get-file-global-props file "PAGE")
|
||||
;; Ignore pages
|
||||
all-tags
|
||||
(with-temp-buffer
|
||||
(insert-file-contents file)
|
||||
(let ((tags (mapcar #'car (org-get-buffer-tags))))
|
||||
(seq-reduce
|
||||
(lambda (result tag)
|
||||
(let ((tag-list (car result))
|
||||
(tag->file (cdr result)))
|
||||
(cons
|
||||
;; Tag list
|
||||
(if (member tag tag-list) tag-list (sort (cons tag tag-list) 'string<))
|
||||
;; tag->file
|
||||
(cons (cons tag
|
||||
;; Current value of the the given tag (all the files
|
||||
;; that contain that tag)
|
||||
(append (list file) (cdr (assoc tag tag->file))))
|
||||
tag->file))))
|
||||
tags
|
||||
all-tags)))))
|
||||
(all-org-files)
|
||||
'()))
|
||||
|
||||
|
||||
(defun get-all-posts ()
|
||||
|
@ -188,7 +220,7 @@ Not pages."
|
|||
;; We will use the org-agenda to extract all the tags
|
||||
|
||||
;;; Set the dir containing org the org-files
|
||||
(setq org-directory (expand-file-name "/site/" build-dir))
|
||||
(setq org-directory (expand-file-name "site" build-dir))
|
||||
|
||||
;;; Discover all the org files
|
||||
(setq org-agenda-files (all-org-files))
|
||||
|
@ -204,17 +236,24 @@ Not pages."
|
|||
|
||||
|
||||
(let ((base-url (if (prod-p) "https://fg42.org" "http://localhost:3003")))
|
||||
(copy-template (from-root "/docs/sites/templates/index.org")
|
||||
(expand-file-name "/site/index.org" build-dir)
|
||||
(latest-org-list base-url))
|
||||
|
||||
(copy-template (from-root "/docs/sites/templates/categories.org")
|
||||
(expand-file-name "/site/categories/index.org" build-dir)
|
||||
(category-org-list))
|
||||
(copy-template (from-root "/docs/site/templates/index.org")
|
||||
(expand-file-name "site/index.org" build-dir)
|
||||
(list
|
||||
(cons :links
|
||||
(latest-org-list base-url))))
|
||||
|
||||
(copy-template (from-root "/docs/sites/templates/tags.org")
|
||||
(expand-file-name "/site/tags/index.org" build-dir)
|
||||
(tags-org-list))))
|
||||
(copy-template (from-root "/docs/site/templates/categories.org")
|
||||
(expand-file-name "site/categories/index.org" build-dir)
|
||||
(list
|
||||
(cons :links
|
||||
(category-org-list))))
|
||||
|
||||
(copy-template (from-root "/docs/site/templates/tags.org")
|
||||
(expand-file-name "site/tags/index.org" build-dir)
|
||||
(list
|
||||
(cons :links
|
||||
(tags-org-list))))))
|
||||
|
||||
(provide 'fg42/build/docs)
|
||||
;;; docs.el ends here
|
||||
|
|
|
@ -0,0 +1,63 @@
|
|||
;;; Buid --- The builder for FG42 -*- lexical-binding: t; -*-
|
||||
;;
|
||||
;; Copyright (c) 2010-2021 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 'org-element)
|
||||
|
||||
|
||||
(defmacro comment (&rest _)
|
||||
"Ignore the given BODY."
|
||||
nil)
|
||||
|
||||
|
||||
(defun ->epoch (date-str)
|
||||
"Convert the given DATE-STR to epoch seconds."
|
||||
;; Just because it's easier to deal with date in bash rather than elisp
|
||||
(string-to-number
|
||||
(shell-command-to-string (concat (format "date -d %s" date-str) " +%s"))))
|
||||
|
||||
|
||||
(defun get-buffer-global-props (prop)
|
||||
"Get a plists of global org properties PROP of current buffer."
|
||||
(car
|
||||
(org-element-map
|
||||
(org-element-parse-buffer)
|
||||
'keyword
|
||||
(lambda (el)
|
||||
(when (string-match prop (org-element-property :key el))
|
||||
(org-element-property :value el))))))
|
||||
|
||||
|
||||
(defun get-file-global-props (file prop)
|
||||
"Return the value of the given global PROP in the given org FILE."
|
||||
(with-temp-buffer
|
||||
(insert-file-contents file)
|
||||
(get-buffer-global-props prop)))
|
||||
|
||||
|
||||
(provide 'fg42/build/utils)
|
||||
;;; utils.el ends here
|
|
@ -4,4 +4,4 @@
|
|||
#+PAGE: true
|
||||
#+TITLE: Categories
|
||||
|
||||
<<<links>>>
|
||||
<<<:links>>>
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
|
||||
#+SETUPFILE: ../config.org
|
||||
#+OPTIONS: toc:nil
|
||||
#+EXPORT_FILE_NAME: index.html
|
||||
|
@ -9,6 +10,6 @@
|
|||
#+INCLUDE: "../../../README.org::*Future Gadgets 42" :only-contents t
|
||||
|
||||
* Recent updates:
|
||||
<<<links>>>
|
||||
<<<:links>>>
|
||||
|
||||
#+INCLUDE: "../../../README.org::*License"
|
||||
|
|
|
@ -5,4 +5,4 @@
|
|||
#+TITLE: Tags
|
||||
|
||||
|
||||
<<<links>>>
|
||||
<<<:links>>>
|
||||
|
|
Loading…
Reference in New Issue