2009-01-11 14:07:34 -05:00
|
|
|
|
;;; fuel-scaffold.el -- interaction with tools.scaffold
|
|
|
|
|
|
|
|
|
|
;; Copyright (C) 2009 Jose Antonio Ortega Ruiz
|
|
|
|
|
;; See http://factorcode.org/license.txt for BSD license.
|
|
|
|
|
|
|
|
|
|
;; Author: Jose Antonio Ortega Ruiz <jao@gnu.org>
|
|
|
|
|
;; Keywords: languages, fuel, factor
|
|
|
|
|
;; Start date: Sun Jan 11, 2009 18:40
|
|
|
|
|
|
|
|
|
|
;;; Comentary:
|
|
|
|
|
|
|
|
|
|
;; Utilities for creating new vocabulary files and other boilerplate.
|
|
|
|
|
;; Mainly, an interface to Factor's tools.scaffold.
|
|
|
|
|
|
|
|
|
|
;;; Code:
|
|
|
|
|
|
|
|
|
|
(require 'fuel-eval)
|
|
|
|
|
(require 'fuel-edit)
|
|
|
|
|
(require 'fuel-base)
|
2013-05-05 00:48:12 -04:00
|
|
|
|
(require 'factor-mode)
|
2009-01-11 14:07:34 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
;;; Customisation:
|
|
|
|
|
|
2013-05-05 00:48:12 -04:00
|
|
|
|
;;;###autoload
|
2009-01-11 14:07:34 -05:00
|
|
|
|
(defgroup fuel-scaffold nil
|
|
|
|
|
"Options for FUEL's scaffolding."
|
|
|
|
|
:group 'fuel)
|
|
|
|
|
|
|
|
|
|
;;; Auxiliary functions:
|
|
|
|
|
|
2013-05-05 00:48:12 -04:00
|
|
|
|
(defun fuel-mode--code-file (kind &optional file)
|
|
|
|
|
(let* ((file (or file (buffer-file-name)))
|
|
|
|
|
(bn (file-name-nondirectory file)))
|
|
|
|
|
(and (string-match (format "\\(.+\\)-%s\\.factor$" kind) bn)
|
|
|
|
|
(expand-file-name (concat (match-string 1 bn) ".factor")
|
|
|
|
|
(file-name-directory file)))))
|
|
|
|
|
|
|
|
|
|
(defun fuel-mode--in-docs (&optional file)
|
|
|
|
|
(fuel-mode--code-file "docs"))
|
|
|
|
|
|
|
|
|
|
(defun fuel-mode--in-tests (&optional file)
|
|
|
|
|
(fuel-mode--code-file "tests"))
|
|
|
|
|
|
2009-01-11 14:07:34 -05:00
|
|
|
|
(defun fuel-scaffold--vocab-roots ()
|
2018-02-07 12:38:28 -05:00
|
|
|
|
(let ((cmd '(:fuel* (vocab-roots get)
|
|
|
|
|
"fuel" ("namespaces" "vocabs.loader"))))
|
2017-06-25 23:39:26 -04:00
|
|
|
|
(nth 1 (fuel-eval--send/wait cmd))))
|
2009-01-11 14:07:34 -05:00
|
|
|
|
|
2009-06-01 21:21:35 -04:00
|
|
|
|
(defun fuel-scaffold--dev-name ()
|
2018-02-07 12:38:28 -05:00
|
|
|
|
(or (let ((cmd '(:fuel* (developer-name get)
|
2017-07-07 09:18:54 -04:00
|
|
|
|
"fuel"
|
|
|
|
|
("namespaces" "tools.scaffold"))))
|
2009-06-01 21:21:35 -04:00
|
|
|
|
(fuel-eval--retort-result (fuel-eval--send/wait cmd)))
|
2015-07-13 00:28:26 -04:00
|
|
|
|
user-full-name
|
2009-06-01 21:21:35 -04:00
|
|
|
|
"Your name"))
|
|
|
|
|
|
|
|
|
|
(defun fuel-scaffold--first-vocab ()
|
|
|
|
|
(goto-char (point-min))
|
2013-05-05 00:48:12 -04:00
|
|
|
|
(re-search-forward factor-current-vocab-regex nil t))
|
2009-06-01 21:21:35 -04:00
|
|
|
|
|
|
|
|
|
(defsubst fuel-scaffold--vocab (file)
|
2013-05-05 00:48:12 -04:00
|
|
|
|
(with-current-buffer (find-file-noselect file)
|
2009-06-01 21:21:35 -04:00
|
|
|
|
(fuel-scaffold--first-vocab)
|
2013-05-05 00:48:12 -04:00
|
|
|
|
(factor-current-vocab)))
|
2009-06-01 21:21:35 -04:00
|
|
|
|
|
|
|
|
|
(defconst fuel-scaffold--tests-header-format
|
|
|
|
|
"! Copyright (C) %s %s
|
|
|
|
|
! See http://factorcode.org/license.txt for BSD license.
|
|
|
|
|
USING: %s tools.test ;
|
|
|
|
|
IN: %s
|
|
|
|
|
")
|
|
|
|
|
|
2013-05-05 00:48:12 -04:00
|
|
|
|
(defvar fuel-scaffold-test-autoinsert-p nil)
|
|
|
|
|
(defvar fuel-scaffold-help-autoinsert-p nil)
|
|
|
|
|
(defvar fuel-scaffold-help-header-only-p nil)
|
|
|
|
|
|
2009-06-01 21:21:35 -04:00
|
|
|
|
(defsubst fuel-scaffold--check-auto (var)
|
|
|
|
|
(and var (or (eq var 'always) (y-or-n-p "Insert template? "))))
|
|
|
|
|
|
|
|
|
|
(defun fuel-scaffold--tests (parent)
|
|
|
|
|
(when (and parent (fuel-scaffold--check-auto fuel-scaffold-test-autoinsert-p))
|
|
|
|
|
(let ((year (format-time-string "%Y"))
|
|
|
|
|
(name (fuel-scaffold--dev-name))
|
|
|
|
|
(vocab (fuel-scaffold--vocab parent)))
|
|
|
|
|
(insert (format fuel-scaffold--tests-header-format
|
|
|
|
|
year name vocab vocab))
|
|
|
|
|
t)))
|
|
|
|
|
|
|
|
|
|
(defsubst fuel-scaffold--create-docs (vocab)
|
2015-07-13 00:28:26 -04:00
|
|
|
|
(let ((cmd `(:fuel* (,vocab ,(fuel-scaffold--dev-name) fuel-scaffold-help)
|
2009-06-01 21:21:35 -04:00
|
|
|
|
"fuel")))
|
|
|
|
|
(fuel-eval--send/wait cmd)))
|
|
|
|
|
|
2010-02-21 06:34:08 -05:00
|
|
|
|
(defsubst fuel-scaffold--create-tests (vocab)
|
2015-07-13 00:28:26 -04:00
|
|
|
|
(let ((cmd `(:fuel* (,vocab ,(fuel-scaffold--dev-name) fuel-scaffold-tests)
|
2010-02-21 06:34:08 -05:00
|
|
|
|
"fuel")))
|
|
|
|
|
(fuel-eval--send/wait cmd)))
|
|
|
|
|
|
|
|
|
|
(defsubst fuel-scaffold--create-authors (vocab)
|
2015-07-13 00:28:26 -04:00
|
|
|
|
(let ((cmd `(:fuel* (,vocab ,(fuel-scaffold--dev-name)
|
2013-05-05 00:48:12 -04:00
|
|
|
|
fuel-scaffold-authors) "fuel")))
|
2010-02-21 06:34:08 -05:00
|
|
|
|
(fuel-eval--send/wait cmd)))
|
|
|
|
|
|
|
|
|
|
(defsubst fuel-scaffold--create-tags (vocab tags)
|
|
|
|
|
(let ((cmd `(:fuel* (,vocab ,tags fuel-scaffold-tags) "fuel")))
|
|
|
|
|
(fuel-eval--send/wait cmd)))
|
|
|
|
|
|
|
|
|
|
(defsubst fuel-scaffold--create-summary (vocab summary)
|
|
|
|
|
(let ((cmd `(:fuel* (,vocab ,summary fuel-scaffold-summary) "fuel")))
|
|
|
|
|
(fuel-eval--send/wait cmd)))
|
|
|
|
|
|
2010-02-22 23:17:49 -05:00
|
|
|
|
(defsubst fuel-scaffold--create-platforms (vocab platforms)
|
|
|
|
|
(let ((cmd `(:fuel* (,vocab ,platforms fuel-scaffold-platforms) "fuel")))
|
|
|
|
|
(fuel-eval--send/wait cmd)))
|
|
|
|
|
|
2009-06-01 21:21:35 -04:00
|
|
|
|
(defun fuel-scaffold--help (parent)
|
|
|
|
|
(when (and parent (fuel-scaffold--check-auto fuel-scaffold-help-autoinsert-p))
|
|
|
|
|
(let* ((ret (fuel-scaffold--create-docs (fuel-scaffold--vocab parent)))
|
|
|
|
|
(file (fuel-eval--retort-result ret)))
|
|
|
|
|
(when file
|
|
|
|
|
(revert-buffer t t t)
|
|
|
|
|
(when (and fuel-scaffold-help-header-only-p
|
|
|
|
|
(fuel-scaffold--first-vocab))
|
|
|
|
|
(delete-region (1+ (point)) (point-max))
|
|
|
|
|
(save-buffer))
|
|
|
|
|
(message "Inserting template ... done."))
|
|
|
|
|
(goto-char (point-min)))))
|
|
|
|
|
|
|
|
|
|
(defun fuel-scaffold--maybe-insert ()
|
|
|
|
|
(ignore-errors
|
2013-05-05 00:48:12 -04:00
|
|
|
|
(or (fuel-scaffold--tests (fuel-mode--in-tests))
|
|
|
|
|
(fuel-scaffold--help (fuel-mode--in-docs)))))
|
2009-06-01 21:21:35 -04:00
|
|
|
|
|
2009-01-11 14:07:34 -05:00
|
|
|
|
|
|
|
|
|
;;; User interface:
|
|
|
|
|
|
2013-05-05 00:48:12 -04:00
|
|
|
|
;;;###autoload
|
2009-01-11 20:10:13 -05:00
|
|
|
|
(defun fuel-scaffold-vocab (&optional other-window name-hint root-hint)
|
2009-01-11 14:07:34 -05:00
|
|
|
|
"Creates a directory in the given root for a new vocabulary and
|
2010-02-21 06:34:08 -05:00
|
|
|
|
adds source and authors.txt files. Prompts the user for optional summary,
|
|
|
|
|
tags, help, and test file creation.
|
2009-01-11 14:07:34 -05:00
|
|
|
|
|
2018-02-07 13:41:48 -05:00
|
|
|
|
You can configure `user-full-name' for the name to be inserted in
|
|
|
|
|
the generated files."
|
2009-01-11 14:07:34 -05:00
|
|
|
|
(interactive)
|
2009-01-11 20:10:13 -05:00
|
|
|
|
(let* ((name (read-string "Vocab name: " name-hint))
|
2009-01-11 14:07:34 -05:00
|
|
|
|
(root (completing-read "Vocab root: "
|
|
|
|
|
(fuel-scaffold--vocab-roots)
|
2009-01-11 20:10:13 -05:00
|
|
|
|
nil t (or root-hint "resource:")))
|
2010-02-21 06:34:08 -05:00
|
|
|
|
(summary (read-string "Vocab summary (empty for none): "))
|
|
|
|
|
(tags (read-string "Vocab tags (empty for none): "))
|
2010-02-22 23:17:49 -05:00
|
|
|
|
(platforms (read-string "Vocab platforms (empty for all): "))
|
2010-02-21 06:34:08 -05:00
|
|
|
|
(help (y-or-n-p "Scaffold help? "))
|
|
|
|
|
(tests (y-or-n-p "Scaffold tests? "))
|
2018-02-07 14:29:05 -05:00
|
|
|
|
(cmd `(:fuel* (,root ,name ,(fuel-scaffold--dev-name)
|
|
|
|
|
fuel-scaffold-vocab) "fuel"))
|
2009-01-11 14:07:34 -05:00
|
|
|
|
(ret (fuel-eval--send/wait cmd))
|
|
|
|
|
(file (fuel-eval--retort-result ret)))
|
|
|
|
|
(unless file
|
|
|
|
|
(error "Error creating vocab (%s)" (car (fuel-eval--retort-error ret))))
|
2010-02-21 06:34:08 -05:00
|
|
|
|
(when (not (equal "" summary))
|
|
|
|
|
(fuel-scaffold--create-summary name summary))
|
|
|
|
|
(when (not (equal "" tags))
|
|
|
|
|
(fuel-scaffold--create-tags name tags))
|
2010-02-22 23:17:49 -05:00
|
|
|
|
(when (not (equal "" platforms))
|
|
|
|
|
(fuel-scaffold--create-platforms name platforms))
|
2010-02-21 06:34:08 -05:00
|
|
|
|
(when help
|
|
|
|
|
(fuel-scaffold--create-docs name))
|
|
|
|
|
(when tests
|
|
|
|
|
(fuel-scaffold--create-tests name))
|
2009-01-11 20:10:13 -05:00
|
|
|
|
(if other-window (find-file-other-window file) (find-file file))
|
|
|
|
|
(goto-char (point-max))
|
|
|
|
|
name))
|
2009-01-11 14:07:34 -05:00
|
|
|
|
|
2013-05-05 00:48:12 -04:00
|
|
|
|
;;;###autoload
|
2009-01-11 14:07:34 -05:00
|
|
|
|
(defun fuel-scaffold-help (&optional arg)
|
|
|
|
|
"Creates, if it does not already exist, a help file with
|
|
|
|
|
scaffolded help for each word in the current vocabulary.
|
|
|
|
|
|
2015-07-13 00:28:26 -04:00
|
|
|
|
With prefix argument, ask for the vocabulary name. You can
|
2018-02-07 13:41:48 -05:00
|
|
|
|
configure `user-full-name' for the name to be
|
2015-07-13 00:28:26 -04:00
|
|
|
|
inserted in the generated file."
|
2009-01-11 14:07:34 -05:00
|
|
|
|
(interactive "P")
|
2013-05-05 00:48:12 -04:00
|
|
|
|
(let* ((vocab (or (and (not arg) (factor-current-vocab))
|
2009-02-05 04:28:57 -05:00
|
|
|
|
(fuel-completion--read-vocab nil)))
|
2009-06-01 21:21:35 -04:00
|
|
|
|
(ret (fuel-scaffold--create-docs vocab))
|
2009-01-11 14:07:34 -05:00
|
|
|
|
(file (fuel-eval--retort-result ret)))
|
|
|
|
|
(unless file
|
2013-05-05 00:48:12 -04:00
|
|
|
|
(error "Error creating help file: %s"
|
|
|
|
|
(car (fuel-eval--retort-error ret))))
|
2009-01-11 14:07:34 -05:00
|
|
|
|
(find-file file)))
|
|
|
|
|
|
2013-05-05 00:48:12 -04:00
|
|
|
|
;;;###autoload
|
2010-02-21 06:34:08 -05:00
|
|
|
|
(defun fuel-scaffold-tests (&optional arg)
|
2013-05-05 00:48:12 -04:00
|
|
|
|
"Creates, if it does not already exist, a tests file for the current
|
|
|
|
|
vocabulary.
|
2010-02-21 06:34:08 -05:00
|
|
|
|
|
2015-07-13 00:28:26 -04:00
|
|
|
|
With prefix argument, ask for the vocabulary name. You can
|
2018-02-07 13:41:48 -05:00
|
|
|
|
configure `user-full-name' for the name to be inserted in the
|
|
|
|
|
generated file."
|
2010-02-21 06:34:08 -05:00
|
|
|
|
(interactive "P")
|
2013-05-05 00:48:12 -04:00
|
|
|
|
(let* ((vocab (or (and (not arg) (factor-current-vocab))
|
2010-02-21 06:34:08 -05:00
|
|
|
|
(fuel-completion--read-vocab nil)))
|
|
|
|
|
(ret (fuel-scaffold--create-tests vocab))
|
|
|
|
|
(file (fuel-eval--retort-result ret)))
|
|
|
|
|
(unless file
|
2013-05-05 00:48:12 -04:00
|
|
|
|
(error "Error creating tests file: %s"
|
|
|
|
|
(car (fuel-eval--retort-error ret))))
|
2010-02-21 06:34:08 -05:00
|
|
|
|
(find-file file)))
|
|
|
|
|
|
|
|
|
|
(defun fuel-scaffold-authors (&optional arg)
|
2013-05-05 00:48:12 -04:00
|
|
|
|
"Creates, if it does not already exist, an authors file for the current
|
|
|
|
|
vocabulary.
|
2010-02-21 06:34:08 -05:00
|
|
|
|
|
2015-07-13 00:28:26 -04:00
|
|
|
|
With prefix argument, ask for the vocabulary name. You can
|
2018-02-07 13:41:48 -05:00
|
|
|
|
configure `user-full-name' for the name to be
|
2015-07-13 00:28:26 -04:00
|
|
|
|
inserted in the generated file."
|
2010-02-21 06:34:08 -05:00
|
|
|
|
(interactive "P")
|
2013-05-05 00:48:12 -04:00
|
|
|
|
(let* ((vocab (or (and (not arg) (factor-current-vocab))
|
2010-02-21 06:34:08 -05:00
|
|
|
|
(fuel-completion--read-vocab nil)))
|
|
|
|
|
(ret (fuel-scaffold--create-authors vocab))
|
|
|
|
|
(file (fuel-eval--retort-result ret)))
|
|
|
|
|
(unless file
|
2013-05-05 00:48:12 -04:00
|
|
|
|
(error "Error creating authors file: %s"
|
|
|
|
|
(car (fuel-eval--retort-error ret))))
|
2010-02-21 06:34:08 -05:00
|
|
|
|
(find-file file)))
|
|
|
|
|
|
|
|
|
|
(defun fuel-scaffold-tags (&optional arg)
|
2013-05-05 00:48:12 -04:00
|
|
|
|
"Creates, if it does not already exist, a tags file for the current
|
|
|
|
|
vocabulary."
|
2010-02-21 06:34:08 -05:00
|
|
|
|
(interactive "P")
|
2013-05-05 00:48:12 -04:00
|
|
|
|
(let* ((vocab (or (and (not arg) (factor-current-vocab))
|
2010-02-21 06:34:08 -05:00
|
|
|
|
(fuel-completion--read-vocab nil)))
|
|
|
|
|
(tags (read-string "Tags: "))
|
|
|
|
|
(ret (fuel-scaffold--create-tags vocab tags))
|
|
|
|
|
(file (fuel-eval--retort-result ret)))
|
|
|
|
|
(unless file
|
2013-05-05 00:48:12 -04:00
|
|
|
|
(error "Error creating tags file: %s"
|
|
|
|
|
(car (fuel-eval--retort-error ret))))
|
2010-02-21 06:34:08 -05:00
|
|
|
|
(find-file file)))
|
|
|
|
|
|
|
|
|
|
(defun fuel-scaffold-summary (&optional arg)
|
2013-05-05 00:48:12 -04:00
|
|
|
|
"Creates, if it does not already exist, a summary file for the current
|
|
|
|
|
vocabulary."
|
2010-02-21 06:34:08 -05:00
|
|
|
|
(interactive "P")
|
2013-05-05 00:48:12 -04:00
|
|
|
|
(let* ((vocab (or (and (not arg ) (factor-current-vocab))
|
2010-02-21 06:34:08 -05:00
|
|
|
|
(fuel-completion--read-vocab nil)))
|
|
|
|
|
(summary (read-string "Summary: "))
|
|
|
|
|
(ret (fuel-scaffold--create-summary vocab summary))
|
|
|
|
|
(file (fuel-eval--retort-result ret)))
|
|
|
|
|
(unless file
|
2013-05-05 00:48:12 -04:00
|
|
|
|
(error "Error creating summary file: %s"
|
|
|
|
|
(car (fuel-eval--retort-error ret))))
|
2010-02-21 06:34:08 -05:00
|
|
|
|
(find-file file)))
|
|
|
|
|
|
2010-02-22 23:17:49 -05:00
|
|
|
|
(defun fuel-scaffold-platforms (&optional arg)
|
2013-05-05 00:48:12 -04:00
|
|
|
|
"Creates, if it does not already exist, a platforms file for the current
|
|
|
|
|
vocabulary."
|
2010-02-22 23:17:49 -05:00
|
|
|
|
(interactive "P")
|
2013-05-05 00:48:12 -04:00
|
|
|
|
(let* ((vocab (or (and (not arg ) (factor-current-vocab))
|
2010-02-22 23:17:49 -05:00
|
|
|
|
(fuel-completion--read-vocab nil)))
|
|
|
|
|
(platforms (read-string "Platforms: "))
|
|
|
|
|
(ret (fuel-scaffold--create-platforms vocab platforms))
|
|
|
|
|
(file (fuel-eval--retort-result ret)))
|
|
|
|
|
(unless file
|
2013-05-05 00:48:12 -04:00
|
|
|
|
(error "Error creating platforms file: %s"
|
|
|
|
|
(car (fuel-eval--retort-error ret))))
|
2010-02-22 23:17:49 -05:00
|
|
|
|
(find-file file)))
|
|
|
|
|
|
2009-01-11 14:07:34 -05:00
|
|
|
|
|
|
|
|
|
(provide 'fuel-scaffold)
|
2013-05-05 00:48:12 -04:00
|
|
|
|
|
2009-01-11 14:07:34 -05:00
|
|
|
|
;;; fuel-scaffold.el ends here
|