IMPORTANT NOTICE: Devheroes public code hosting will shut down at 1st of March 2023. Due to some difficulties, we have to shut down the instance. Since codeberg.org is pretty mature and welcoming, We highly recommend you to move your code there. Please be advised that on 1st of March, your data will be removed. Thanks for your time with us, and may the source be with you.

Browse Source

Setup the indexer functions for the 'docs' build command

ep8
Sameer Rahmani 7 months ago
parent
commit
eb621760df
  1. 4
      Makefile
  2. 6
      build.el
  3. 35
      core/fg42/build/core.el
  4. 69
      core/fg42/build/docs.el
  5. 63
      core/fg42/build/utils.el
  6. 2
      docs/site/templates/categories.org
  7. 3
      docs/site/templates/index.org
  8. 2
      docs/site/templates/tags.org

4
Makefile

@ -44,11 +44,11 @@ clean: @@ -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

@ -84,9 +84,9 @@ PARAMS: @@ -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: @@ -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

35
core/fg42/build/core.el

@ -32,19 +32,43 @@ @@ -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: @@ -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)

69
core/fg42/build/docs.el

@ -28,6 +28,8 @@ @@ -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 @@ @@ -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 @@ @@ -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 @@ @@ -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." @@ -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." @@ -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

63
core/fg42/build/utils.el

@ -0,0 +1,63 @@ @@ -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

2
docs/site/templates/categories.org

@ -4,4 +4,4 @@ @@ -4,4 +4,4 @@
#+PAGE: true
#+TITLE: Categories
<<<links>>>
<<<:links>>>

3
docs/site/templates/index.org

@ -1,3 +1,4 @@ @@ -1,3 +1,4 @@
#+SETUPFILE: ../config.org
#+OPTIONS: toc:nil
#+EXPORT_FILE_NAME: index.html
@ -9,6 +10,6 @@ @@ -9,6 +10,6 @@
#+INCLUDE: "../../../README.org::*Future Gadgets 42" :only-contents t
* Recent updates:
<<<links>>>
<<<:links>>>
#+INCLUDE: "../../../README.org::*License"

2
docs/site/templates/tags.org

@ -5,4 +5,4 @@ @@ -5,4 +5,4 @@
#+TITLE: Tags
<<<links>>>
<<<:links>>>

Loading…
Cancel
Save