mirror of
https://git.savannah.gnu.org/git/emacs/org-mode.git
synced 2024-12-28 10:56:57 +00:00
broke tangled source block collection out into it's own function
This commit is contained in:
parent
a7c0852264
commit
978104f1ae
@ -44,37 +44,8 @@ file into their own source-specific files."
|
||||
(interactive)
|
||||
(save-excursion
|
||||
(let ((base-name (file-name-sans-extension (buffer-file-name)))
|
||||
(block-counter 0)
|
||||
blocks)
|
||||
;; blocks will be two nested association lists, first grouped by
|
||||
;; language, then by session, the contents of the second a-list
|
||||
;; will be source-code blocks
|
||||
(org-babel-map-source-blocks (buffer-file-name)
|
||||
(setq block-counter (+ 1 block-counter))
|
||||
(let* ((link (progn (call-interactively 'org-store-link)
|
||||
(org-babel-clean-text-properties (car (pop org-stored-links)))))
|
||||
|
||||
(source-name (intern (or (org-babel-get-src-block-name)
|
||||
(format "block-%d" block-counter))))
|
||||
(info (org-babel-get-src-block-info))
|
||||
(lang (first info))
|
||||
(body (second info))
|
||||
(params (third info))
|
||||
(spec (list link source-name params body))
|
||||
(session (cdr (assoc :session params)))
|
||||
by-lang by-session)
|
||||
;; add the spec for this block to blocks under it's lang and session
|
||||
(setq by-lang (cdr (assoc lang blocks)))
|
||||
(setq blocks (delq (assoc lang blocks) blocks))
|
||||
(setq by-session (cdr (assoc session by-lang)))
|
||||
(setq by-lang (delq (assoc session by-lang) by-lang))
|
||||
(setq blocks (cons ;; by-language
|
||||
(cons lang (cons ;; by-session
|
||||
(cons session (cons spec by-session)) by-lang))
|
||||
blocks))))
|
||||
;; blocks should contain all source-blocks organized by language
|
||||
;; and session
|
||||
;; (message "blocks=%S" blocks) ;; debugging
|
||||
(blocks (org-babel-collect-blocks))
|
||||
(block-counter 0))
|
||||
(mapc ;; for every language create a file
|
||||
(lambda (by-lang)
|
||||
(let* ((lang (car by-lang))
|
||||
@ -92,12 +63,46 @@ file into their own source-specific files."
|
||||
;; if there are multiple sessions then break out by session
|
||||
(if (> (length by-session) 1)
|
||||
(mapc (lambda (session-pair)
|
||||
(setq block-counter (+ block-counter (length (cdr session-pair))))
|
||||
(to-file (format "%s-%s.%s" base-name (car session-pair) ext) (cdr session-pair)))
|
||||
by-session)
|
||||
(setq block-counter (+ block-counter (length (cdr (car by-session)))))
|
||||
(to-file (format "%s.%s" base-name ext) (cdr (car by-session)))))))
|
||||
blocks)
|
||||
(message "tangled %d source-code blocks" block-counter))))
|
||||
|
||||
(defun org-babel-collect-blocks ()
|
||||
"Collect all source blocks in the current org-mode file.
|
||||
Return two nested association lists, first grouped by language,
|
||||
then by session, the contents will be source-code block
|
||||
specifications of the form used by `org-babel-spec-to-string'."
|
||||
(let ((block-counter 0) blocks)
|
||||
(org-babel-map-source-blocks (buffer-file-name)
|
||||
(setq block-counter (+ 1 block-counter))
|
||||
(let* ((link (progn (call-interactively 'org-store-link)
|
||||
(org-babel-clean-text-properties (car (pop org-stored-links)))))
|
||||
(source-name (intern (or (org-babel-get-src-block-name)
|
||||
(format "block-%d" block-counter))))
|
||||
(info (org-babel-get-src-block-info))
|
||||
(lang (first info))
|
||||
(body (second info))
|
||||
(params (third info))
|
||||
(spec (list link source-name params body))
|
||||
(session (cdr (assoc :session params)))
|
||||
by-lang by-session)
|
||||
;; add the spec for this block to blocks under it's lang and session
|
||||
(setq by-lang (cdr (assoc lang blocks)))
|
||||
(setq blocks (delq (assoc lang blocks) blocks))
|
||||
(setq by-session (cdr (assoc session by-lang)))
|
||||
(setq by-lang (delq (assoc session by-lang) by-lang))
|
||||
(setq blocks (cons ;; by-language
|
||||
(cons lang (cons ;; by-session
|
||||
(cons session (cons spec by-session)) by-lang))
|
||||
blocks))))
|
||||
;; blocks should contain all source-blocks organized by language and session
|
||||
;; (message "blocks=%S" blocks) ;; debugging
|
||||
blocks))
|
||||
|
||||
(defun org-babel-spec-to-string (spec)
|
||||
"Insert the source-code specified by SPEC into the current
|
||||
source code file. This function uses `comment-region' which
|
||||
|
Loading…
Reference in New Issue
Block a user