Joost Kremers <joostkrem...@fastmail.fm> writes: > I was wondering if there's a way to programmatically get the text of a > node in an Org buffer. Basically, I have a buffer that looks something > like this: > > #+BEGIN_SRC org > * Top header > ** Subheader > :PROPERTIES: > :Custom_ID: some_id > :END: > > Text starts here, possibly with additional subheaders > #+END_SRC > > What I would like to extract is the text below "Subheader", but > without the :PROPERTIES: block. > > I've looked at the org-element library, but I haven't been able to > figure out how to use it to extract just the plain text.
You probably are not aware of dev/org-element-api.org in Worg, yet. It is a very good introduction to and systematic overview of the element api. It is not mentioned at the top of org-element.el. > I use the :Custom_ID: property to find the relevant subheading and I > know I can use (org-back-to-heading) to get point to the Subheader > containing the relevant :PROPERTIES: block. Obviously, I could then > narrow the buffer to the subheader, use a text search to move point > past the line containing :END: and then extract the text from there > until (point-max). > > I'm just wondering if this may break in unexpected circumstances and > whether there's a better way. A robust way that I see is the following. The first two steps may be optional. Or they could be expanded slightly in order to even exclude possible subheadings from the work of org-element-parse-buffer in the last step. 1. Call org-element-at-point on the heading. The resulting element has :begin and :end properties. They contain the buffer positions of the beginning of the headline and the end of everything that belongs to the headline, including paragraphs and subheadings. 2. Call narrow-to-region on those positions. 3. Call org-element-parse-buffer. See dev/org-element-api.org for what that returns and why that works. Best wishes Sebastian