From: Thorsten Jolitz <tjolitz@gmail.com>
To: emacs-orgmode@gnu.org
Subject: Re: Programmatically handling org files
Date: Mon, 12 Sep 2016 20:21:41 +0200 [thread overview]
Message-ID: <87fup5f07e.fsf@gmail.com> (raw)
In-Reply-To: 87twdlcpg8.fsf@fastmail.fm
Joost Kremers <joostkremers@fastmail.fm> writes:
Hi,
> I was wondering if there is some sort of (semi)official API for handling
> org files programmatically. That's to say, is there a documented way for
> non-org Emacs packages to manipulate (the contents of) org files?
>
> Specifically, I'm wondering about creating and deleting entries (by
> entries I mean headers with their contents), changing TODO state, moving
> entries, that sort of thing.
by "non-org Emacs packages" you mean Emacs packages written in Elisp,
but not part of Org-mode?
The org-mode parser converts an Org document into a nested list and
provides many convenience functions to work on this parse tree. So
org-element.el (and maybe ox.el too) is the core library for converting
an Org text document into an Elisp data structure and working with that,
have a look at these two functions:
,----
| 3965:(defun org-element-parse-buffer (&optional granularity visible-only)
| 4043:(defun org-element-map
`----
If you feel you don't need the whole parse tree, but rather want to act
locally on the Org element at point, you might want to look at
org-dp.el with just two core functions (create and rewire an Org
element) and a mapping functions (plus quite a few utilities in
org-dp.el and org-dp-lib.el):
,----
| 523:(cl-defun org-dp-create
| (elem-type &optional contents insert-p affiliated &rest args)
| 642:(cl-defun org-dp-rewire
| (elem-type &optional contents replace affiliated element &rest args)
| 766:(defun org-dp-map
| (fun-with-args rgxp &optional match-pos backward-search-p beg end
| silent-p)
`----
Note that I recently added 4 "Tempo" Templates (a bit like Yasnippets)
to org-dp that make it easy to insert a 'create' or 'rewire' call with
just those parameters the interpreter uses for the element to be created
or rewired:
,----
| M-x tempo-template-org-dp-create
| M-x tempo-template-org-dp-create-with-comments
| M-x tempo-template-org-dp-rewire
| M-x tempo-template-org-dp-rewire-lambda
`----
e.g. calling the third one with elem type "headline" enters this template
#+BEGIN_SRC emacs-lisp
(org-dp-rewire 'headline
"\n" ;cont
t ;ins
nil ;aff
nil ;elem
:level 1 ;1..8
:priority nil ;65|66|67
:todo-keyword TODO
:title ""
:tags '( )
:commentedp nil
:pre-blank 0
:footnote-section-p nil
)
#+END_SRC
while for elem type "example block" its only:
#+BEGIN_SRC emacs-lisp
(org-dp-rewire 'example-block nil t ;cont ins
nil ;aff
nil ;elem
:switches ""
:preserve-indent ""
:value ""
)
#+END_SRC
since example-blocks have no content (:value is their content) and only
3 parameters that are actually interpreted.
Using this system, creating or rewiring an Org Element from Elisp
requires only to define the values of the interpreted parameters, all
the low level stuff (actually creating and inserting the new/modified
element in text form) is left to the interpreters (from org-element.el).
You just declare what you want and don't worry anymore how it is done
(=> dp stands for declarative programming, in this context at least ;-)
--
cheers,
Thorsten
next prev parent reply other threads:[~2016-09-12 18:22 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-09-12 11:44 Programmatically handling org files Joost Kremers
2016-09-12 13:47 ` John Kitchin
2016-09-12 21:59 ` Joost Kremers
2016-09-12 18:21 ` Thorsten Jolitz [this message]
2016-09-12 18:30 ` John Kitchin
2016-09-12 21:37 ` Joost Kremers
2016-09-12 21:22 ` Joost Kremers
2016-09-12 22:10 ` Nick Dokos
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.orgmode.org/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87fup5f07e.fsf@gmail.com \
--to=tjolitz@gmail.com \
--cc=emacs-orgmode@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).