emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

eval-to-texi


From: jemarch
Subject: eval-to-texi
Date: Fri, 30 Apr 2004 16:45:25 +0200


2004-04-30  Jose E. Marchesi  <address@hidden>

        * textmodes/texinfo.el (texinfo-eval-to-texi): New function.





*** texinfo.el.~1.102.~ Sat Feb 21 14:48:44 2004
--- texinfo.el  Fri Apr 30 16:42:38 2004
***************
*** 1050,1055 ****
--- 1050,1155 ----
    ;;               job-number"\n"))
    (tex-recenter-output-buffer nil))
  
+ 
+ (defun texinfo-eval-to-texi (form &optional tostring)
+   "Evaluates FORM, dumping a @lisp texinfo environment with the evaluation
+ description.
+ 
+ If TOSTRING is t, then the @lisp environment is returned into a string,
+ rather than being inserted into the current buffer."
+   
+   (interactive "sForm to evaluate: ")
+ 
+   (let (environment-text)
+ 
+     (setq environment-text 
+ 
+         (with-temp-buffer 
+ 
+           (condition-case error-description
+ 
+               (let (expression result output)
+ 
+                 ;; Begin of the sample
+                 (insert "@lisp\n")
+ 
+                 ;; Dump the form itself into the sample
+                 (let ((tform form))
+ 
+                    (setq tform (replace-regexp-in-string "@" "@@" tform))
+                    (setq tform (replace-regexp-in-string "{" "@{" tform))
+                    (setq tform (replace-regexp-in-string "}" "@}" tform))
+ 
+                    (insert tform "\n"))
+ 
+                 ;; Parse the form to a valid expression
+                 (setq expression (read form))
+ 
+ 
+ 
+                 ;; Get the result of the eval, and the output if there is one
+                 (setq output 
+                       (with-output-to-string
+                         (setq result (prin1-to-string (eval expression)))))
+ 
+                 ;; If there is any output, dump a @print{} entry into the 
sample
+                 (if (not (equal output ""))
+ 
+                     (progn
+                       ;; Escape texinfo special characters on the output
+                       (setq output (replace-regexp-in-string "@" "@@" output))
+                       (setq output (replace-regexp-in-string "{" "@{" output))
+                       (setq output (replace-regexp-in-string "}" "@}" output))
+ 
+                       ;; Indent multilines
+                       (setq output (replace-regexp-in-string "\n" "\n         
 " output))
+ 
+                       (insert "      @print{} " output "\n")))
+ 
+                 ;; If the expression is a macro, dump an @expansion{}
+                 (let ((macroexp (macroexpand expression)))
+                   (if (not (equal macroexp expression))  ; macro-p???
+ 
+                       (let ((met (prin1-to-string macroexp)))
+ 
+                         ;; Escape texinfo special characters on the macro 
expansion text
+                         (setq met (replace-regexp-in-string "@" "@@" met))
+                         (setq met (replace-regexp-in-string "{" "@{" met))
+                         (setq met (replace-regexp-in-string "}" "@}" met))
+ 
+                         ;; Indent multilines
+                         (setq met (replace-regexp-in-string "\n" "\n          
" met))
+ 
+                         (insert "      @expansion{} " met "\n"))))
+ 
+                 ;; Escape texinfo special characters on the result
+                 (setq result (replace-regexp-in-string "@" "@@" result))
+                 (setq result (replace-regexp-in-string "{" "@{" result))
+                 (setq result (replace-regexp-in-string "}" "@}" result))
+ 
+                 ;; Indent multilines
+                 (setq result (replace-regexp-in-string "\n" "\n          " 
result))
+ 
+                 ;; Dump the @result{} entry into the sample
+                 (insert "      @result{} " result "\n"))
+ 
+             ;; Was an error => Dump an @error{} entry into the sample with 
the error
+             ;; description from the interpreter
+             (error (insert "      @error{} " (error-message-string 
error-description) "\n")))
+ 
+           ;; End of the sample
+           (insert "@end lisp")
+ 
+           ;; Return buffer's contents
+           (buffer-substring (point-min) (point-max))))
+ 
+ 
+     (if (not tostring)
+       (insert environment-text)
+       environment-text)))    
+ 
+ 
+ 
  (provide 'texinfo)
  
  ;;; arch-tag: 005d7c38-43b9-4b7d-aa1d-aea69bae73e1





reply via email to

[Prev in Thread] Current Thread [Next in Thread]