* Concatenating Org property values from parent subtrees
@ 2018-09-26 22:57 Kaushal Modi
2018-09-29 18:38 ` Michael Welle
0 siblings, 1 reply; 7+ messages in thread
From: Kaushal Modi @ 2018-09-26 22:57 UTC (permalink / raw)
To: emacs-org list
[-- Attachment #1: Type: text/plain, Size: 513 bytes --]
Hello,
Is there a way to achieve something like below? See the content in each
nested subtree in the example below.
#+title: Concatenating property values from parent subtrees
* Section
:PROPERTIES
:EXPORT_XYZ: a
:END:
At this point, the value of XYZ property should be "a".
** Sub-section
:PROPERTIES
:EXPORT_XYZ: b
:END:
At this point, the value of XYZ property should be "ab".
*** Sub-sub-section
:PROPERTIES
:EXPORT_XYZ: c
:END:
At this point, the value of XYZ property should be "abc".
--
Kaushal Modi
[-- Attachment #2: Type: text/html, Size: 1121 bytes --]
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: Concatenating Org property values from parent subtrees
2018-09-26 22:57 Concatenating Org property values from parent subtrees Kaushal Modi
@ 2018-09-29 18:38 ` Michael Welle
2018-09-29 19:01 ` Kaushal Modi
0 siblings, 1 reply; 7+ messages in thread
From: Michael Welle @ 2018-09-29 18:38 UTC (permalink / raw)
To: emacs-orgmode
Hello,
Kaushal Modi <kaushal.modi@gmail.com> writes:
> Hello,
>
> Is there a way to achieve something like below? See the content in each
> nested subtree in the example below.
I asked something similar earlier this year (concatenating compiler
flags given as header-args property, used for linking against different
libs in different sections of the Org file). I ended with a function
that grabs the current property value and returns the value concatenated
with new value. That function can be used as a 'property value'. That's
not a nice and bullet proof solution, but works good enough to me to
generate the solutions to the psets for the lecture.
Regards
hmw
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: Concatenating Org property values from parent subtrees
2018-09-29 18:38 ` Michael Welle
@ 2018-09-29 19:01 ` Kaushal Modi
2018-09-29 19:23 ` Michael Welle
0 siblings, 1 reply; 7+ messages in thread
From: Kaushal Modi @ 2018-09-29 19:01 UTC (permalink / raw)
To: mwe012008; +Cc: emacs-org list
[-- Attachment #1: Type: text/plain, Size: 784 bytes --]
On Sat, Sep 29, 2018 at 2:39 PM Michael Welle <mwe012008@gmx.net> wrote:
>
> I asked something similar earlier this year (concatenating compiler
> flags given as header-args property, used for linking against different
> libs in different sections of the Org file). I ended with a function
> that grabs the current property value and returns the value concatenated
> with new value. That function can be used as a 'property value'. That's
> not a nice and bullet proof solution, but works good enough to me to
> generate the solutions to the psets for the lecture.
>
Please share it if you don't mind. I plan to use it or its derivative in
ox-hugo. The property is planned to be a path property, and with nested
property values of "a","b" and "c", which I want to parse as "a/b/c".
[-- Attachment #2: Type: text/html, Size: 1127 bytes --]
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: Concatenating Org property values from parent subtrees
2018-09-29 19:01 ` Kaushal Modi
@ 2018-09-29 19:23 ` Michael Welle
2018-09-29 19:26 ` Michael Welle
0 siblings, 1 reply; 7+ messages in thread
From: Michael Welle @ 2018-09-29 19:23 UTC (permalink / raw)
To: emacs-orgmode
Hello,
Kaushal Modi <kaushal.modi@gmail.com> writes:
> On Sat, Sep 29, 2018 at 2:39 PM Michael Welle <mwe012008@gmx.net> wrote:
>
>>
>> I asked something similar earlier this year (concatenating compiler
>> flags given as header-args property, used for linking against different
>> libs in different sections of the Org file). I ended with a function
>> that grabs the current property value and returns the value concatenated
>> with new value. That function can be used as a 'property value'. That's
>> not a nice and bullet proof solution, but works good enough to me to
>> generate the solutions to the psets for the lecture.
>>
>
> Please share it if you don't mind. I plan to use it or its derivative in
> ox-hugo. The property is planned to be a path property, and with nested
> property values of "a","b" and "c", which I want to parse as "a/b/c".
(defun hmw/org-prop-append(prop value)
(save-excursion
(org-up-heading-safe)
(format "%s %s" value (cdr (assq prop
(car (org-babel-params-from-properties)))))))
(defalias 'A 'hmw/org-prop-append)
I use it like this:
* foo
:PROPERTIES:
:header-args: :flags -Wall
:END:
** bar
#+begin_src C :flags (A :flags "-lm")
#+end_src
** baz
:PROPERTIES:
:header-args: :flags (A :flags "-lcunit")
:END:
#+begin_src C
#+end_src
Regards
hmw
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: Concatenating Org property values from parent subtrees
2018-09-29 19:23 ` Michael Welle
@ 2018-09-29 19:26 ` Michael Welle
2018-10-01 15:47 ` Ihor Radchenko
0 siblings, 1 reply; 7+ messages in thread
From: Michael Welle @ 2018-09-29 19:26 UTC (permalink / raw)
To: emacs-orgmode
Hello,
Michael Welle <mwe012008@gmx.net> writes:
[...]
> (defun hmw/org-prop-append(prop value)
> (save-excursion
> (org-up-heading-safe)
> (format "%s %s" value (cdr (assq prop
> (car (org-babel-params-from-properties)))))))
>
> (defalias 'A 'hmw/org-prop-append)
and I just realise that it works with code blocks only. I guess the way
to get general property values has to be adapted.
Regards
hmw
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: Concatenating Org property values from parent subtrees
2018-09-29 19:26 ` Michael Welle
@ 2018-10-01 15:47 ` Ihor Radchenko
2018-10-01 21:00 ` Kaushal Modi
0 siblings, 1 reply; 7+ messages in thread
From: Ihor Radchenko @ 2018-10-01 15:47 UTC (permalink / raw)
To: Michael Welle, emacs-orgmode
[-- Attachment #1: Type: text/plain, Size: 1598 bytes --]
Hi,
Check out the following code:
````
(defvar org-concatenated-properties '("AA")
"A list of property names (strings), which should be computed via concatenation with the parent properties.")
(define-advice org-entry-get (:around (oldfun pom property &optional inherit literal-nil) concatenate-parents-maybe)
"Concatenate the PROPERTY value with its parent entries' values if the PROPERTY is in `org-concatenated-properties' list."
(if (not (member property org-concatenated-properties))
(apply oldfun pom property inherit literal-nil)
(let ((value-here (funcall oldfun pom property nil 't))
(value (funcall oldfun pom property inherit 't)))
(if value-here
(format "%s%s" (org-with-wide-buffer
(if (org-up-heading-safe)
(or (org-entry-get nil property inherit literal-nil) "")
""))
(funcall oldfun pom property inherit literal-nil))
(when value
(org-with-wide-buffer
(org-up-heading-safe)
(org-entry-get nil property inherit literal-nil)))))))
````
Best,
Ihor
Michael Welle <mwe012008@gmx.net> writes:
> Hello,
>
> Michael Welle <mwe012008@gmx.net> writes:
> [...]
>> (defun hmw/org-prop-append(prop value)
>> (save-excursion
>> (org-up-heading-safe)
>> (format "%s %s" value (cdr (assq prop
>> (car (org-babel-params-from-properties)))))))
>>
>> (defalias 'A 'hmw/org-prop-append)
>
> and I just realise that it works with code blocks only. I guess the way
> to get general property values has to be adapted.
>
> Regards
> hmw
>
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 487 bytes --]
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: Concatenating Org property values from parent subtrees
2018-10-01 15:47 ` Ihor Radchenko
@ 2018-10-01 21:00 ` Kaushal Modi
0 siblings, 0 replies; 7+ messages in thread
From: Kaushal Modi @ 2018-10-01 21:00 UTC (permalink / raw)
To: yantar92; +Cc: emacs-org list, mwe012008
[-- Attachment #1: Type: text/plain, Size: 2630 bytes --]
On Mon, Oct 1, 2018 at 11:50 AM Ihor Radchenko <yantar92@gmail.com> wrote:
> Hi,
>
> Check out the following code:
>
> ````
> (defvar org-concatenated-properties '("AA")
> "A list of property names (strings), which should be computed via
> concatenation with the parent properties.")
>
> (define-advice org-entry-get (:around (oldfun pom property &optional
> inherit literal-nil) concatenate-parents-maybe)
>
Hello Ihor,
That code is perfect!
I was able to get what I want with minor refactoring. Thanks!
Refactored code:
=====
(defvar org-concatenated-properties '("AA")
"List of property names whose values are allowed to be concatenated.
The list is of type '(PROP1 PROP2 ..) where each element is a string.")
(defvar org-property-concat-string "/"
"String use to concat the `org-concatenated-properties' properties.")
(defun org-get-parent-property (property inherit literal-nil)
"Get the value of PROPERTY from the parent relative to current point."
(org-with-wide-buffer
(if (org-up-heading-safe)
(or (org-entry-get nil property inherit literal-nil) "")
"")))
(defun org/advice-concatenate-properties-maybe (orig-fun &rest args)
"Concatenate an Org Property value with its inherited value.
The concatenation happens only if the Org Property is in
`org-concatenated-properties' list."
(let* ((value-orig (apply orig-fun args))
(property (nth 1 args))
(dont-concat (not (member property org-concatenated-properties))))
;; (message "dbg: args:%S value-orig:%S property:%S" args value-orig
property)
(if dont-concat
value-orig
(let* ((pom (nth 0 args))
(inherit (nth 2 args))
(literal-nil (nth 3 args))
(value-here-no-inherit (apply orig-fun `(,pom ,property nil
,literal-nil)))
(value-parent (apply #'org-get-parent-property `(,property
,inherit ,literal-nil))))
;; (message "dbg advice: value-here-no-inherit: %S"
value-here-no-inherit)
(if value-here-no-inherit
(format "%s%s%s"
value-parent
(if (org-string-nw-p value-parent)
org-property-concat-string
"")
value-orig)
value-parent)))))
(advice-add 'org-entry-get :around
#'org/advice-concatenate-properties-maybe)
;; (advice-remove 'org-entry-get #'org/advice-concatenate-properties-maybe)
=====
Example Org file:
=====
* heading 1
:PROPERTIES:
:FOO: abc
:END:
asdf
** heading 1
:PROPERTIES:
:FOO: def
:AA: pqr
:END:
*** heading 2
:PROPERTIES:
:FOO: 123
:AA: 456
:END:
**** heading 3
=====
[-- Attachment #2: Type: text/html, Size: 3761 bytes --]
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2018-10-01 21:01 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-09-26 22:57 Concatenating Org property values from parent subtrees Kaushal Modi
2018-09-29 18:38 ` Michael Welle
2018-09-29 19:01 ` Kaushal Modi
2018-09-29 19:23 ` Michael Welle
2018-09-29 19:26 ` Michael Welle
2018-10-01 15:47 ` Ihor Radchenko
2018-10-01 21:00 ` Kaushal Modi
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).