diff --git a/Makefile b/Makefile index 11420d6..1ac5a9e 100644 --- a/Makefile +++ b/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 diff --git a/build.el b/build.el index 2cef97e..f1623fd 100755 --- a/build.el +++ b/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 diff --git a/core/fg42/build/core.el b/core/fg42/build/core.el index 0aee9b1..a1e2e7b 100644 --- a/core/fg42/build/core.el +++ b/core/fg42/build/core.el @@ -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) diff --git a/core/fg42/build/docs.el b/core/fg42/build/docs.el index 9234cbd..9233c64 100644 --- a/core/fg42/build/docs.el +++ b/core/fg42/build/docs.el @@ -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 diff --git a/core/fg42/build/utils.el b/core/fg42/build/utils.el new file mode 100644 index 0000000..821ad22 --- /dev/null +++ b/core/fg42/build/utils.el @@ -0,0 +1,63 @@ +;;; Buid --- The builder for FG42 -*- lexical-binding: t; -*- +;; +;; Copyright (c) 2010-2021 Sameer Rahmani & Contributors +;; +;; Author: Sameer Rahmani +;; 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 . +;; +;;; 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 diff --git a/docs/site/templates/categories.org b/docs/site/templates/categories.org index 2b879e4..10a5fef 100644 --- a/docs/site/templates/categories.org +++ b/docs/site/templates/categories.org @@ -4,4 +4,4 @@ #+PAGE: true #+TITLE: Categories -<<>> +<<<:links>>> diff --git a/docs/site/templates/index.org b/docs/site/templates/index.org index 5b912d0..c10e5e7 100644 --- a/docs/site/templates/index.org +++ b/docs/site/templates/index.org @@ -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>>> #+INCLUDE: "../../../README.org::*License" diff --git a/docs/site/templates/tags.org b/docs/site/templates/tags.org index 1362940..ca28a44 100644 --- a/docs/site/templates/tags.org +++ b/docs/site/templates/tags.org @@ -5,4 +5,4 @@ #+TITLE: Tags -<<>> +<<<:links>>>