| 1 | |
|---|
| 2 | (defun grovel-docstrings-as-tex (&optional (package (find-package :java))) |
|---|
| 3 | (let ((output-file (format nil "~A.tex" (string-downcase (package-name package))))) |
|---|
| 4 | (with-open-file (stream output-file :direction :output) |
|---|
| 5 | (format t "Writing output to ~A.~%" output-file) |
|---|
| 6 | (loop :for symbol :being :each :external-symbol :of package |
|---|
| 7 | :doing (format stream "~&~A~%~%" (symbol-as-tex symbol)))))) |
|---|
| 8 | |
|---|
| 9 | (require :asdf) |
|---|
| 10 | |
|---|
| 11 | (asdf:load-system 'swank) ;; XXX Does this load the SWANK-BACKEND package as well |
|---|
| 12 | |
|---|
| 13 | (defun texify-string (string &optional remove) |
|---|
| 14 | (with-output-to-string (s) |
|---|
| 15 | (loop for char across string |
|---|
| 16 | do (if (find char '(#\& #\% #\#)) |
|---|
| 17 | (unless remove |
|---|
| 18 | (write-char #\\ s) |
|---|
| 19 | (write-char char s)) |
|---|
| 20 | (write-char char s))))) |
|---|
| 21 | |
|---|
| 22 | (defun texify (thing) |
|---|
| 23 | "Return STRING with LaTeX-sensitive characters escaped. |
|---|
| 24 | Downcase symbol names but leave strings alone." |
|---|
| 25 | (cond ((listp thing) |
|---|
| 26 | (format nil "~A" (mapcar #'texify thing))) |
|---|
| 27 | ((stringp thing) (texify-string thing)) |
|---|
| 28 | ((symbolp thing) (texify-string (string-downcase (symbol-name thing)))))) |
|---|
| 29 | |
|---|
| 30 | (defun arglist-as-tex (symbol) |
|---|
| 31 | (handler-case |
|---|
| 32 | (loop :for arg :in (arglist symbol) |
|---|
| 33 | :collecting (texify arg)) |
|---|
| 34 | (t (e) |
|---|
| 35 | (progn (warn "Failed to form arglist for ~A: ~A" symbol e) |
|---|
| 36 | (list ""))))) |
|---|
| 37 | |
|---|
| 38 | |
|---|
| 39 | (defvar *type-alist* |
|---|
| 40 | '((:function |
|---|
| 41 | . "Function") |
|---|
| 42 | (:macro |
|---|
| 43 | . "Macro") |
|---|
| 44 | (:variable |
|---|
| 45 | . "Variable") |
|---|
| 46 | (:class |
|---|
| 47 | . "Class") |
|---|
| 48 | (:special-operator |
|---|
| 49 | . "Special Operator") |
|---|
| 50 | (:generic-function |
|---|
| 51 | . "Generic Function"))) |
|---|
| 52 | |
|---|
| 53 | (defun symbol-as-tex (symbol) |
|---|
| 54 | "Return the TeX representation of a SYMBOL as Tex." |
|---|
| 55 | (let (type documentation arglist doc symbol-name package-name) |
|---|
| 56 | (when (setf doc (swank-backend:describe-symbol-for-emacs symbol)) |
|---|
| 57 | (cond |
|---|
| 58 | ((find :function doc) |
|---|
| 59 | (setf type :function |
|---|
| 60 | documentation (second doc) |
|---|
| 61 | arglist (format nil "~{~A~^ ~}" (arglist-as-tex symbol)))) |
|---|
| 62 | ((find :variable doc) |
|---|
| 63 | (setf type :variable |
|---|
| 64 | documentation (second doc))) |
|---|
| 65 | ((find :macro doc) |
|---|
| 66 | (setf type :macro |
|---|
| 67 | documentation (second doc))) |
|---|
| 68 | ((find :generic-function doc) |
|---|
| 69 | (setf type :generic-function |
|---|
| 70 | documentation (second doc))) |
|---|
| 71 | ((find :class doc) |
|---|
| 72 | (setf type :class |
|---|
| 73 | documentation (second doc))) |
|---|
| 74 | ((find :special-operator doc) |
|---|
| 75 | (setf type :special-operator |
|---|
| 76 | documentation (second doc))) |
|---|
| 77 | (t |
|---|
| 78 | (warn "Unknown type of documentation for symbol ~A: ~A" |
|---|
| 79 | symbol doc))) |
|---|
| 80 | (setf symbol-name (string-downcase |
|---|
| 81 | symbol) |
|---|
| 82 | package-name (string-downcase |
|---|
| 83 | (package-name (find-package (symbol-package symbol))))) |
|---|
| 84 | (format nil "~&\\paragraph{} |
|---|
| 85 | \\label{~A:~A} |
|---|
| 86 | \\index{~A} |
|---|
| 87 | --- ~A: \\textbf{~A} [\\textbf{~A}] \\textit{~A} |
|---|
| 88 | |
|---|
| 89 | \\begin{adjustwidth}{5em}{5em} |
|---|
| 90 | ~A |
|---|
| 91 | \\end{adjustwidth}" |
|---|
| 92 | (texify-string (package-name (find-package (symbol-package symbol))) t) |
|---|
| 93 | (texify-string (symbol-name symbol) t) |
|---|
| 94 | (texify-string (symbol-name symbol) t) |
|---|
| 95 | (cdr (assoc type *type-alist*)) |
|---|
| 96 | (texify symbol-name) |
|---|
| 97 | (texify package-name) |
|---|
| 98 | (if arglist arglist "") |
|---|
| 99 | (if documentation (texify documentation) ""))))) |
|---|
| 100 | |
|---|
| 101 | |
|---|
| 102 | |
|---|
| 103 | |
|---|
| 104 | |
|---|
| 105 | |
|---|
| 106 | |
|---|
| 107 | |
|---|
| 108 | |
|---|