Hi Ondřej, Ondřej Grover <ondrej.gro...@gmail.com> writes:
> I've revised my patch to accommodate your suggestions and attached the new > version. Now it excludes noexport tagged headlines from removal and > promotes child headlines. Thanks. Your snippet doesn't work on these two examples. Can't promote from level 1: * h1 :noexport: no export * h2 :ignore_heading: export "export" becomes part of the noexport heading. * h0 ** h1 :noexport: no export ** h2 :ignore_heading: export > I'm trying to point out that something like this is often needed and a > definitive solution should be listed somewhere, preferably in the manual. > Otherwise someone looking for a solution to this common problem will end up > finding only half-baked, possibly broken examples. If this is often needed feature, ox.el and potentially backends should be patched to support it. I think it would be great if ox did support it. Of course, Nicolas would have the final say in such a matter. But I'm not sure so difficult hacks should be promoted in the manual. Improving the example is fine, though. > From 9c75f9796a0fe4d270b72b503b318ddb6e4e3954 Mon Sep 17 00:00:00 2001 > From: Ondrej Grover <ondrej.gro...@gmail.com> > Date: Sun, 12 Apr 2015 13:43:31 +0200 > Subject: [PATCH] org.texi: Extend export hook example with ignore_heading tag > support > * doc/org.texi (Advanced configuration): Extend the pre-processing > export hook example to support similar (but simpler and more general) > functionality like that provided by the ignoreheading tag in the > Beamer export backend. This is a commonly requested snippet and the > Internet is full of much worse and broken solutions, so the manual > should show the recommended solution. > TINYCHANGE > --- > doc/org.texi | 37 ++++++++++++++++++++++++------------- > 1 file changed, 24 insertions(+), 13 deletions(-) > > diff --git a/doc/org.texi b/doc/org.texi > index c400f77..cc75a79 100644 > --- a/doc/org.texi > +++ b/doc/org.texi > @@ -13806,29 +13806,40 @@ with @code{M-x org-html-convert-region-to-html RET}. > > @vindex org-export-before-processing-hook > @vindex org-export-before-parsing-hook Why do you delete these indexes? > -Two hooks are run during the first steps of the export process. The first > -one, @code{org-export-before-processing-hook} is called before expanding > -macros, Babel code and include keywords in the buffer. The second one, > -@code{org-export-before-parsing-hook}, as its name suggests, happens just > -before parsing the buffer. Their main use is for heavy duties, that is > -duties involving structural modifications of the document. For example, one > -may want to remove every headline in the buffer during export. The following > +Two hooks are run during the first steps of the export process. The > +first one, @code{org-export-before-processing-hook} is called before , (I think) > +expanding macros, Babel code and include keywords in the buffer. The > +second one, @code{org-export-before-parsing-hook}, as its name suggests, ^^^^^^^^^^^^^^^^^^^^^^^ I'd just kill that one. > +happens just before parsing the buffer. Their main use is for heavy > +duties, that is duties involving structural modifications of the > +document. For example, one may want to remove every headline with the > +@samp{ignore_heading} tag (excluding those with the @samp{noexport} tag) > +in the buffer and promote their children during export. The following > code can achieve this: > > @lisp > @group > -(defun my-headline-removal (backend) > - "Remove all headlines in the current buffer. > +(defun ignored-headlines-removal (backend) > + "Remove all headlines with the ignore_headline tag in the current buffer > +and promote all child headlines underneath them. > BACKEND is the export back-end being used, as a symbol." > (org-map-entries > - (lambda () (delete-region (point) (progn (forward-line) (point)))))) > + (lambda () (progn (org-map-tree 'org-promote) > + (delete-region (point) (point-at-eol)))) > + "+ignore_heading-noexport")) > > -(add-hook 'org-export-before-parsing-hook 'my-headline-removal) > +(add-hook 'org-export-before-parsing-hook 'ignored-headlines-removal) > @end group > @end lisp > -Note that functions used in these hooks require a mandatory argument, > -a symbol representing the back-end used. > +The second argument to the @code{org-map-entries} function is an Maybe: The second argument to @code{org-map-entries} is an > +agenda-style match query string (@pxref{Matching tags and properties}). > +Note the underscore in the tag, it is not recommended to use the > +@samp{ignoreheading} tag because the Beamer export backend treates it in > +a similar, yet more complicated way. It may also be useful to exclude > +the @samp{ignore_heading} tag from inheritance (@pxref{Tag > +inheritance}). Also note that functions used in these hooks require a > +mandatory argument, a symbol representing the back-end used. ^^^^^^^^^ This function is fine as well: (λ (&optional ignored) (· ⋯)). It's great with better documentation for how to use org-map-entries! But the example is not very robust. I think another, less complicated example would be better. Also, perhaps it would make sense to also show how to use org-element-map to solve the same problem. Of course that's a separate patch. Thanks, Rasmus -- I hear there's rumors on the, uh, Internets. . .