emacs-orgmode
[Top][All Lists]
Advanced

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

[O] [babel][PATCHES] exporting inline source code


From: Nicolas Berthier
Subject: [O] [babel][PATCHES] exporting inline source code
Date: Fri, 13 Jun 2014 19:37:20 +0200
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/24.2 (gnu/linux)

Hi,

Please find attached two patches for review, related to the handling
of inline source code.

The first one enables babel to export pieces of inline source code as
inline instead of as standard code blocks as it currently does.  This
is done by adding a new template
(`org-babel-exp-inline-code-template', very similar to
`org-babel-exp-code-template' for standard code blocks), and modifying
`org-babel-exp-code' to either generate a code block or an inline one.

Also, as the generated code may not define any switches nor flags, we
might end up with org elements such as "src_emacs-lisp[]{(message
"foo!")}" during the babel pass.  I think the small modification I
made to `org-babel-inline-src-block-regexp' to allow such constructs
is much simpler than handling this particular case in
`org-babel-exp-code'.

>From d6b99e92546a752419ff8b8bf919c7001e8e1ec2 Mon Sep 17 00:00:00 2001
From: Nicolas Berthier <address@hidden>
Date: Fri, 13 Jun 2014 15:32:54 +0200
Subject: [PATCH 1/2] ob: Support for exporting inline source code

* lisp/ob-exp.el (org-babel-exp-inline-code-template): New
customizable variable to export inline source code (similar to
`org-babel-exp-code-template').
(org-babel-exp-code): New `type' argument to differentiate between
inline and standard code blocks.

* lisp/ob-core.el (org-babel-inline-src-block-regexp): Allow empty set
of switches and header arguments as in "src_sh[]{echo foo;}".

Until now pieces of inline source code were handled as standard code
blocks during export.  These changes enable them to be exported.
---
 lisp/ob-core.el |  2 +-
 lisp/ob-exp.el  | 30 ++++++++++++++++++++++++++----
 2 files changed, 27 insertions(+), 5 deletions(-)

diff --git a/lisp/ob-core.el b/lisp/ob-core.el
index e1d4f39..062d4e1 100644
--- a/lisp/ob-core.el
+++ b/lisp/ob-core.el
@@ -203,7 +203,7 @@ This string must include a \"%s\" which will be replaced by 
the results."
 (defvar org-babel-inline-src-block-regexp
   (concat
    ;; (1) replacement target (2) lang
-   "\\(?:^\\|[^-[:alnum:]]\\)\\(src_\\([^ \f\t\n\r\v]+\\)"
+   "\\(?:^\\|[^-[:alnum:]]\\)\\(src_\\([^ \f\t\n\r\v\\[]+\\)"
    ;; (3,4) (unused, headers)
    "\\(\\|\\[\\(.*?\\)\\]\\)"
    ;; (5) body
diff --git a/lisp/ob-exp.el b/lisp/ob-exp.el
index 3a47661..37625ab 100644
--- a/lisp/ob-exp.el
+++ b/lisp/ob-exp.el
@@ -318,10 +318,10 @@ The function respects the value of the :exports header 
argument."
        (clean (lambda () (unless (eq type 'inline) (org-babel-remove-result 
info)))))
     (case (intern (or (cdr (assoc :exports (nth 2 info))) "code"))
       ('none (funcall silently) (funcall clean) "")
-      ('code (funcall silently) (funcall clean) (org-babel-exp-code info))
+      ('code (funcall silently) (funcall clean) (org-babel-exp-code info type))
       ('results (org-babel-exp-results info type nil hash) "")
       ('both (org-babel-exp-results info type nil hash)
-            (org-babel-exp-code info)))))
+            (org-babel-exp-code info type)))))
 
 (defcustom org-babel-exp-code-template
   "#+BEGIN_SRC %lang%switches%flags\n%body\n#+END_SRC"
@@ -343,7 +343,27 @@ replaced with its value."
   :group 'org-babel
   :type 'string)
 
-(defun org-babel-exp-code (info)
+(defcustom org-babel-exp-inline-code-template
+  "src_%lang[%switches%flags]{%body}"
+  "Template used to export the body of inline code blocks.
+This template may be customized to include additional information
+such as the code block name, or the values of particular header
+arguments.  The template is filled out using `org-fill-template',
+and the following %keys may be used.
+
+ lang ------ the language of the code block
+ name ------ the name of the code block
+ body ------ the body of the code block
+ switches -- the switches associated to the code block
+ flags ----- the flags passed to the code block
+
+In addition to the keys mentioned above, every header argument
+defined for the code block may be used as a key and will be
+replaced with its value."
+  :group 'org-babel
+  :type 'string)
+
+(defun org-babel-exp-code (info type)
   "Return the original code block formatted for export."
   (setf (nth 1 info)
        (if (string= "strip-export" (cdr (assoc :noweb (nth 2 info))))
@@ -354,7 +374,9 @@ replaced with its value."
               info org-babel-exp-reference-buffer)
            (nth 1 info))))
   (org-fill-template
-   org-babel-exp-code-template
+   (if (eq type 'inline)
+       org-babel-exp-inline-code-template 
+       org-babel-exp-code-template)
    `(("lang"  . ,(nth 0 info))
      ("body"  . ,(org-escape-code-in-string (nth 1 info)))
      ("switches" . ,(let ((f (nth 3 info)))
-- 
2.0.0.rc4

The second patch implements the transcoding of inline source blocks
into HTML.

>From 2ce230d0dda6869b4d91a4a27d40d62fdb0593d2 Mon Sep 17 00:00:00 2001
From: Nicolas Berthier <address@hidden>
Date: Fri, 13 Jun 2014 16:39:18 +0200
Subject: [PATCH 2/2] ox-html.el: Support for exporting inline source code to
 HTML

* lisp/ox-html.el (org-html-inline-src-block): support for exporting
inline source code to HTML.
---
 lisp/ox-html.el | 12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)

diff --git a/lisp/ox-html.el b/lisp/ox-html.el
index 762e1dc..7ece2a9 100644
--- a/lisp/ox-html.el
+++ b/lisp/ox-html.el
@@ -2482,7 +2482,17 @@ CONTENTS holds the contents of the item.  INFO is a 
plist holding
 contextual information."
   (let* ((org-lang (org-element-property :language inline-src-block))
         (code (org-element-property :value inline-src-block)))
-    (error "Cannot export inline src block")))
+    (let ((lang (org-element-property :language inline-src-block))
+         (code (org-html-format-code inline-src-block info))
+         (label (let ((lbl (org-element-property :name inline-src-block)))
+                  (if (not lbl) ""
+                    (format " id=\"%s\""
+                            (org-export-solidify-link-text lbl))))))
+      (if lang
+         (format "<code style=\"display: inline\" class=\"src 
src-%s\"%s>%s</code>" 
+                 lang label code)
+         (format "<code style=\"display: inline\" 
class=\"example\"%s>\n%s</code>"
+                 label code)))))
 
 ;;;; Inlinetask
 
-- 
2.0.0.rc4

These patches allow to handle the following piece of Org code, and
then to export it in both LaTeX (both with and without evaluating the
`setup' code block) and HTML.

#+BEGIN_SRC org
  ,#+TITLE: Testing inline code blocks

  The following code and its result
  src_emacs-lisp[:exports both]{(message "foo!")}
  should be inline.

  The following src_sh[:exports code]{eval `cat ~/.emacs`;} should also
  be inline.

  Ibid for src_emacs-lisp[:exports code]{(let ((x 10)) (< (* x 3) 2))}
  and src_emacs-lisp[:exports both]{(message "foo!\nbar!")} (as
  expected?).

  ,* COMMENT setup
  ,#+NAME: setup
  ,#+BEGIN_SRC emacs-lisp :exports code :results silent
    (eval-after-load "ox-latex"
      '(progn
        (set (make-local-variable 'org-latex-listings) t)
        (add-to-list (make-local-variable 'org-latex-packages-alist)
         '("" "listings"))))
  ,#+END_SRC

#+END_SRC

I have started the FSF copyright assignment process, in case these
patches are accepted.

Nicolas

-- 
Nicolas Berthier                                        FSF Member #7975

reply via email to

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