;;; 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 'seq) (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: (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) "Replace the given STR with its REPLACEMENT in current buffer." (with-current-buffer (current-buffer) (goto-char (point-min)) (while (search-forward str nil t) (replace-match replacement)))) (defun copy-template (src dest context) "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) (replace-in-buffer (format "<<<%s>>>" (car pair)) (cdr pair))))) (provide 'fg42/build/core) ;;; core.el ends here