emacs-orgmode
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [O] How to change a link?


From: Thorsten Jolitz
Subject: Re: [O] How to change a link?
Date: Sat, 18 Oct 2014 15:48:21 +0200
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/24.3 (gnu/linux)

Marcin Borkowski <address@hidden> writes:

> On 2014-10-17, at 00:19, Thorsten Jolitz wrote:
>
>> However, here is a org-dp solution, use 't' instead of 'prepend to
>> replace the links, and whatever you want instead of "file+emacs" as
>> replacement. Of course one could easily re-search and replace "[[file:"
>> in this simple case, but this uses the parser and allows doing more
>> complex stuff in a clean way too:
>>
>> ,----
>> | #+BEGIN_SRC emacs-lisp :results none
>> |   (require 'org-dp)
>> |   (org-dp-map
>> |    '(org-dp-rewire
>> |      'paragraph 
>> |      (lambda (cont elem)
>> |        (let* ((link (car cont))
>> |               (raw-val (org-element-property :raw-link link))
>> |               (new-val (mapconcat 'identity
>> |                                   (cons "file+emacs"
>> |                                         (cdr
>> |                                          (split-string
>> |                                           raw-val ":" t)))
>> |                                   ":")))
>> |          (org-element-put-property link :raw-link new-val)))
>> |      'prepend)
>> |    org-link-re-with-space t)
>> | #+END_SRC
>> `----
>
Hi Marcin,

> one thing I don't quite understand yet: why is the first argument to
> org-dp-rewire `'paragraph'?  My intuition says it should rather be
> 'link, though this doesn't seem to work.  How come that you say
> 'paragraph, but the lambda in the second parameter gets the link data in
> `cont'?  (This might be a stupid question, but I really want to grok
> this.)

I was surprised too! But links are objects, and with point at a link
org-element-at-point return a paragraph with the link as content. So
to get the contents of a link, you take the contents of the contents
of a paragraph, but that a special case, because mostly you will work
directly with elements.

The 'paragraph' is the target element type. In this case I could have
written 
 
,----
| '(org-dp-rewire nil ...)
`----

instead, since then parsed and rewired element types are the same. See
examples below of how to convert a link into a src-block or a keyword
(e.g.).

For more in depth info, have a look at:

,----[ C-h f org-dp-rewire RET ]
| org-dp-rewire is a Lisp function in `org-dp.el'.
| 
| (org-dp-rewire ELEM-TYPE &optional CONTENTS REPLACE AFFILIATED ELEMENT
| &rest ARGS)
| 
| Rewire element-at-point or ELEMENT (if given). [...]
`----

Example:

When you start with the file link below and eval the
following src-blocks in order, you get:

#+BEGIN_SRC picolisp
  (println "Link label: min.org")
  (println "Link type: file")
#+END_SRC

#+LABEL: min.org

[[file:junk/org/minimal.org][min.org]]

#+BEGIN_SRC emacs-lisp :results none
  (require 'org-dp)
  (org-dp-map
   '(org-dp-rewire 'src-block  nil 'prepend nil nil
                   :language "picolisp"
                   :value (lambda (_old_ elem)
                            (format
                             (concat
                              "(println \"Link label: %s\")\n"
                              "(println \"Link type: %s\")")
                             (org-dp-contents
                              (car (org-dp-contents elem nil t))
                              t t)
                             (org-element-property
                              :type (car
                                     (org-dp-contents elem nil t))))))
   org-link-re-with-space t)
#+END_SRC

#+BEGIN_SRC emacs-lisp :results none
  (require 'org-dp)
  (org-dp-map
   '(org-dp-rewire 'keyword nil 'prepend nil nil
                   :key "LABEL"
                   :value (lambda (_old_ elem)
                            (org-dp-contents
                             (car (org-dp-contents elem nil t))
                             t t)))
   org-link-re-with-space t)
#+END_SRC

This should give you a better idea of what the org-dp-rewire function
arguments stand for. In generel, org-dp functions have extensive
docstrings, so C-h f 'org-dp-xyz' is you friend.

For org-dp, the (few) properties that are interpreted are most
relevant, not so much the (many) properties that are parsed. See
variable `org-dp-elem-props' for an overview. In general, when
programming with org-dp, I often look into org-element.el, especially
at the interpreters. 

> Second question: do I get it correctly that `org-element-put-property'
> returns the "new" version of the element (link, in this case), with
> everything as it was but the :raw-link property changed?

,----[ C-h f org-element-put-property RET ]
| org-element-put-property is a compiled Lisp function in
| `org-element.el'. [...]
| Return modified element.
`----

Yes!

-- 
cheers,
Thorsten




reply via email to

[Prev in Thread] Current Thread [Next in Thread]