emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
* Is there a better (built-in) way to insert an org link with title as description?
@ 2023-07-19 12:06 Arthur Miller
  2023-07-20 10:04 ` Ihor Radchenko
  2023-07-20 11:01 ` Max Nikulin
  0 siblings, 2 replies; 9+ messages in thread
From: Arthur Miller @ 2023-07-19 12:06 UTC (permalink / raw)
  To: emacs-orgmode


Hello Org experts,

I want to auto insert a title from an HTML page as description for an org link in
my notes. I stumbled upon some old message by Miro Bezjak on this list:

https://lists.gnu.org/archive/html/emacs-orgmode/2012-09/msg01435.html

I have seen the replies, but I am not sure how to use
org-make-link-description-function, so I coded my own version of Miros idea:

#+begin_src emacs-lisp
(defun org-link-from-clipboard ()
  "Insert an org link into current buffer from an URL in clipboard."
  (interactive)
  (let ((marker (point-marker))
        (url
         (if (string-match-p "^\\(http\\|https\\)://" (current-kill 0))
             (current-kill 0)
           (read-string "URL: ")))
        (title nil))
    (when url
      (url-retrieve url
       (lambda (buffer)
         (goto-char (point-min))
         (when (re-search-forward "<title>\\(.*\\)</title>" nil t)
           (setq title (string-trim (match-string-no-properties 1))))
         (with-current-buffer (marker-buffer marker)
           (save-excursion
             (goto-char (marker-position marker))
             (org-insert-link
              nil url (or title (read-string "Description: "))))))
       nil t t))))
#+end_src

While my function is not very big, I would still like to learn how to use the
suggested built-in stuff from that discussion. I also dislike the interactive
fallback in asynchronous callback if the title is not found, but I would also
dislike to have a bunch of "No description found" strings in my notes too, so I
am not sure which one is less evil there.

Thankful for any help and advice.


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: Is there a better (built-in) way to insert an org link with title as description?
  2023-07-19 12:06 Is there a better (built-in) way to insert an org link with title as description? Arthur Miller
@ 2023-07-20 10:04 ` Ihor Radchenko
  2023-07-21 14:18   ` Arthur Miller
  2023-07-20 11:01 ` Max Nikulin
  1 sibling, 1 reply; 9+ messages in thread
From: Ihor Radchenko @ 2023-07-20 10:04 UTC (permalink / raw)
  To: Arthur Miller; +Cc: emacs-orgmode

Arthur Miller <arthur.miller@live.com> writes:

> I want to auto insert a title from an HTML page as description for an org link in
> my notes. I stumbled upon some old message by Miro Bezjak on this list:
>
> https://lists.gnu.org/archive/html/emacs-orgmode/2012-09/msg01435.html
>
> I have seen the replies, but I am not sure how to use
> org-make-link-description-function

Since that time, Org got a capability to set description function
per link type. Just use

(org-link-set-parameters "http" :insert-description #'your-function)
(org-link-set-parameters "https" :insert-description #'your-function)

The calling convention is the same as
`org-link-make-description-function'.

-- 
Ihor Radchenko // yantar92,
Org mode contributor,
Learn more about Org mode at <https://orgmode.org/>.
Support Org development at <https://liberapay.com/org-mode>,
or support my work at <https://liberapay.com/yantar92>


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: Is there a better (built-in) way to insert an org link with title as description?
  2023-07-19 12:06 Is there a better (built-in) way to insert an org link with title as description? Arthur Miller
  2023-07-20 10:04 ` Ihor Radchenko
@ 2023-07-20 11:01 ` Max Nikulin
  2023-07-21 13:04   ` Arthur Miller
  1 sibling, 1 reply; 9+ messages in thread
From: Max Nikulin @ 2023-07-20 11:01 UTC (permalink / raw)
  To: Arthur Miller, emacs-orgmode

On 19/07/2023 19:06, Arthur Miller wrote:
> I want to auto insert a title from an HTML page as description for an org link in
> my notes.
> (defun org-link-from-clipboard ()
...
>        (url-retrieve url
>         (lambda (buffer)
>           (goto-char (point-min))
>           (when (re-search-forward "<title>\\(.*\\)</title>" nil t)

What are origins of your links?

If it is an URL opened in browser then `org-capture' or 
org-protocol:/store-link/ may be used. There are a number of browser 
extensions for that.

More metadata sometimes desired and just page title is not enough. For 
extracting it within Emacs see e.g. Ihor's
https://github.com/yantar92/org-capture-ref
Search for its discussions on this mailing lists.

Some complications:
- titles may have &...; entities
- Not all pages have <title>, so heuristics have to be used.
- Some HTML files contains nothing besides JavaScript to load actual content
- Some URLs are from minifiers or obfuscated by Outlook "protection", 
trampolines to prevent leaking of data through the Referer header, etc. 
Likely redirection target should be saved, not original URL.
- Some sites like GitHub have API that allows to get metadata in JSON 
format. It is better than parsing HTML with regexp.

Anyway I suggest to split non-interactive part of the command to allow 
code reuse (for drag and drop, etc.).


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: Is there a better (built-in) way to insert an org link with title as description?
  2023-07-20 11:01 ` Max Nikulin
@ 2023-07-21 13:04   ` Arthur Miller
  2023-07-22  2:49     ` Max Nikulin
  0 siblings, 1 reply; 9+ messages in thread
From: Arthur Miller @ 2023-07-21 13:04 UTC (permalink / raw)
  To: emacs-orgmode

Max Nikulin <manikulin@gmail.com> writes:

Hi thank you for the thorough and well-informed answer.

> On 19/07/2023 19:06, Arthur Miller wrote:
>> I want to auto insert a title from an HTML page as description for an org link in
>> my notes.
>> (defun org-link-from-clipboard ()
> ...
>>        (url-retrieve url
>>         (lambda (buffer)
>>           (goto-char (point-min))
>>           (when (re-search-forward "<title>\\(.*\\)</title>" nil t)
>
> What are origins of your links?

> If it is an URL opened in browser then `org-capture' or
> org-protocol:/store-link/ may be used. There are a number of browser extensions
> for that.

I do use org-protocol, and I do have it in my FFX, so I am aware of it. But
sometimes I copy a link from a readme file or a piece of code or elsewhere and
wish to stash it away in a note but not necessary open in a browser. You know,
"todo" to come back later for it :).

> More metadata sometimes desired and just page title is not enough. For
> extracting it within Emacs see e.g. Ihor's
> https://github.com/yantar92/org-capture-ref
> Search for its discussions on this mailing lists.
>
> Some complications:
> - titles may have &...; entities
> - Not all pages have <title>, so heuristics have to be used.
Yepp, I am aware, the goal was not to be 100% fool proof. I had experienced
sometimes a couple of characters that Emacs can't dissambiguate, but it is not a
problem and yes, in case of no title it will prompt; the other strategy I used
was to return just url itself or "no description". Perhaps I should revert to
just the url.

> - Some HTML files contains nothing besides JavaScript to load actual content
> - Some URLs are from minifiers or obfuscated by Outlook "protection",
>   trampolines to prevent leaking of data through the Referer header, etc. Likely
>  redirection target should be saved, not original URL.
> - Some sites like GitHub have API that allows to get metadata in JSON format. It
>  is better than parsing HTML with regexp.

Yes, I am aware and completely agree with you!

Luckely I am getting quite old by now and don't visit too many sites or sites of
dubious JS character, so for my needs IDC :).

Miros idea served me well for several years now, I just improved it a bit the
other day to skip prmpting for the URL and used asynchornous download to skip
that slight second or two of delay in some links.

> Anyway I suggest to split non-interactive part of the command to allow code
> reuse (for drag and drop, etc.).

Tell me more here? Can I drag a link from one buffer into a note buffer, or how
can I use it?

Thank you for the answer.


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: Is there a better (built-in) way to insert an org link with title as description?
  2023-07-20 10:04 ` Ihor Radchenko
@ 2023-07-21 14:18   ` Arthur Miller
  2023-07-22  8:26     ` Ihor Radchenko
  0 siblings, 1 reply; 9+ messages in thread
From: Arthur Miller @ 2023-07-21 14:18 UTC (permalink / raw)
  To: Ihor Radchenko; +Cc: emacs-orgmode

Ihor Radchenko <yantar92@posteo.net> writes:

> Arthur Miller <arthur.miller@live.com> writes:
>
>> I want to auto insert a title from an HTML page as description for an org link in
>> my notes. I stumbled upon some old message by Miro Bezjak on this list:
>>
>> https://lists.gnu.org/archive/html/emacs-orgmode/2012-09/msg01435.html
>>
>> I have seen the replies, but I am not sure how to use
>> org-make-link-description-function
>
> Since that time, Org got a capability to set description function
> per link type. Just use
>
> (org-link-set-parameters "http" :insert-description #'your-function)
> (org-link-set-parameters "https" :insert-description #'your-function)

Thanks, after some thinkering I got it:

#+begin_src emacs-lisp
(defun my-org-insert-link ()
  "Insert org link where default description is set to html title."
  (interactive)
  (let* ((url (or (current-kill 0) (read-string "URL: "))))
    (org-insert-link nil url)))

(defun org-desc-from-clipboard (url _desc)
  "Insert an org link into current buffer from an URL in clipboard."
  (with-current-buffer (url-retrieve-synchronously url t)
    (goto-char (point-min))
    (let ((title "<title>\\(.*\\)\\(/>\\|</title>\\)"))
      (if (re-search-forward title nil t)
          (string-trim (match-string-no-properties 1))
        url))))

(org-link-set-parameters "http" :insert-description #'org-desc-from-clipboard)
(org-link-set-parameters "https" :insert-description #'org-desc-from-clipboard)
#+end_src

And I can do it async too, *but*; this will affect all insertions of links,
right?

I am not sure if it is safe/possible always to access the internet or do
it asynchronously, so I'll abandon the ship and revert to home-cooked one just
for the precautios measures:

#+begin_src emacs-lisp
(defun org-link-from-clipboard ()
  "Insert an org link into current buffer from an URL in clipboard."
  (interactive)
  (let ((marker (point-marker))
        (url (or (current-kill 0) (read-string "URL: "))))
    (url-retrieve
     url
     (lambda (_status title)
       (goto-char (point-min))
       (when (re-search-forward title nil t)
         (setq title (string-trim (match-string-no-properties 1))))
       (with-current-buffer (marker-buffer marker)
         (save-excursion
           (goto-char (marker-position marker))
           (org-insert-link
            nil url (or title url)))))
     '("<title>\\(.*\\)\\(/>\\|</title>\\)") t t)))
#end_src

But it was a bit of learning, thanks for pointing me in the right direction.


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: Is there a better (built-in) way to insert an org link with title as description?
  2023-07-21 13:04   ` Arthur Miller
@ 2023-07-22  2:49     ` Max Nikulin
  2023-07-22 10:55       ` Ihor Radchenko
  0 siblings, 1 reply; 9+ messages in thread
From: Max Nikulin @ 2023-07-22  2:49 UTC (permalink / raw)
  To: emacs-orgmode

On 21/07/2023 20:04, Arthur Miller wrote:
> I copy a link from a readme file or a piece of code or elsewhere and
> wish to stash it away in a note but not necessary open in a browser. You know,
> "todo" to come back later for it :).

If a file is opened in Emacs then it sounds like a case for 
`org-capture' or `org-store-link'. Perhaps storing link is better 
compatible with `url-retrive' callback and it makes delay for 
`org-insert-link' due to network roundtrip less probable.

When I add a link to my notes, often I mention where I noticed it.

>> Anyway I suggest to split non-interactive part of the command to allow code
>> reuse (for drag and drop, etc.).
> 
> Tell me more here? Can I drag a link from one buffer into a note buffer, or how
> can I use it?

My idea is to handle dropping of text into Org buffers. Currently it 
causes opening links in eww. I think, there are better options: convert 
from html to Org using pandoc and insert text, `org-capture', 
`org-store-link'. I have not tried to implement it. Currently I have 
just a couple of hints in my notes: `dnd-protocol-alist' and 
https://github.com/abo-abo/org-download/blob/master/org-download.el as 
an example of code.




^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: Is there a better (built-in) way to insert an org link with title as description?
  2023-07-21 14:18   ` Arthur Miller
@ 2023-07-22  8:26     ` Ihor Radchenko
  2023-07-27  6:26       ` Arthur Miller
  0 siblings, 1 reply; 9+ messages in thread
From: Ihor Radchenko @ 2023-07-22  8:26 UTC (permalink / raw)
  To: Arthur Miller; +Cc: emacs-orgmode

Arthur Miller <arthur.miller@live.com> writes:

>> (org-link-set-parameters "http" :insert-description #'your-function)
>> (org-link-set-parameters "https" :insert-description #'your-function)
>
> Thanks, after some thinkering I got it:
>
> ...
> (org-link-set-parameters "http" :insert-description #'org-desc-from-clipboard)
> (org-link-set-parameters "https" :insert-description #'org-desc-from-clipboard)
> #+end_src
>
> And I can do it async too, *but*; this will affect all insertions of links,
> right?

Indeed. By design, `org-insert-link' is synchronous - it expects the
link and description to be available upon request.

> I am not sure if it is safe/possible always to access the internet or do
> it asynchronously, so I'll abandon the ship and revert to home-cooked one just
> for the precautios measures:

What you can do is (1) make url descriptions be something like <title to
be retrieved>; (2) add an :after advice for `org-insert-link' that will
queue asynchronous url fetching; (3) replace <title to be retrieved>
with the fetched title upon finishing the request. If the request fails,
the description will remain <title to be retrieved>.

Or you can run description retrieval independently, as a minor mode
that will search for <title to be retrieved> marks and try to fetch
them.

-- 
Ihor Radchenko // yantar92,
Org mode contributor,
Learn more about Org mode at <https://orgmode.org/>.
Support Org development at <https://liberapay.com/org-mode>,
or support my work at <https://liberapay.com/yantar92>


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: Is there a better (built-in) way to insert an org link with title as description?
  2023-07-22  2:49     ` Max Nikulin
@ 2023-07-22 10:55       ` Ihor Radchenko
  0 siblings, 0 replies; 9+ messages in thread
From: Ihor Radchenko @ 2023-07-22 10:55 UTC (permalink / raw)
  To: Max Nikulin; +Cc: emacs-orgmode

Max Nikulin <manikulin@gmail.com> writes:

> My idea is to handle dropping of text into Org buffers. Currently it 
> causes opening links in eww. I think, there are better options: convert 
> from html to Org using pandoc and insert text, `org-capture', 
> `org-store-link'. I have not tried to implement it. Currently I have 
> just a couple of hints in my notes: `dnd-protocol-alist' and 
> https://github.com/abo-abo/org-download/blob/master/org-download.el as 
> an example of code.

Supporting dnd will certainly be welcome.

-- 
Ihor Radchenko // yantar92,
Org mode contributor,
Learn more about Org mode at <https://orgmode.org/>.
Support Org development at <https://liberapay.com/org-mode>,
or support my work at <https://liberapay.com/yantar92>


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: Is there a better (built-in) way to insert an org link with title as description?
  2023-07-22  8:26     ` Ihor Radchenko
@ 2023-07-27  6:26       ` Arthur Miller
  0 siblings, 0 replies; 9+ messages in thread
From: Arthur Miller @ 2023-07-27  6:26 UTC (permalink / raw)
  To: Ihor Radchenko; +Cc: emacs-orgmode

Ihor Radchenko <yantar92@posteo.net> writes:

> Arthur Miller <arthur.miller@live.com> writes:
>
>>> (org-link-set-parameters "http" :insert-description #'your-function)
>>> (org-link-set-parameters "https" :insert-description #'your-function)
>>
>> Thanks, after some thinkering I got it:
>>
>> ...
>> (org-link-set-parameters "http" :insert-description #'org-desc-from-clipboard)
>> (org-link-set-parameters "https" :insert-description #'org-desc-from-clipboard)
>> #+end_src
>>
>> And I can do it async too, *but*; this will affect all insertions of links,
>> right?
>
> Indeed. By design, `org-insert-link' is synchronous - it expects the
> link and description to be available upon request.
>
>> I am not sure if it is safe/possible always to access the internet or do
>> it asynchronously, so I'll abandon the ship and revert to home-cooked one just
>> for the precautios measures:
>
> What you can do is (1) make url descriptions be something like <title to
> be retrieved>; (2) add an :after advice for `org-insert-link' that will
> queue asynchronous url fetching; (3) replace <title to be retrieved>
> with the fetched title upon finishing the request. If the request fails,
> the description will remain <title to be retrieved>.

Yes of course, placeholders could work. Another option is to use url as
a placeholder, so if the retrieval failed the url would still be visible
which is a bit more informative than some generic placholder.

> Or you can run description retrieval independently, as a minor mode
> that will search for <title to be retrieved> marks and try to fetch
> them.

True. I could also run an idle timer on my notes file and try to patch
all urls without descriptions. Would need to put something as a marker
into a desription for dead links, or just remove them, so they are not
fetched over and over again.

However, I am ok with doing it on the request only, when I actually
create a note :).

But if someone adds something similar to org, I'll gladly use it :).

Thanks and sorry the  late response. My memory is like a gold fish,
sometimes when GNUS remove a mail from my view I totally forget about
it.

/a


^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2023-07-27  6:50 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-07-19 12:06 Is there a better (built-in) way to insert an org link with title as description? Arthur Miller
2023-07-20 10:04 ` Ihor Radchenko
2023-07-21 14:18   ` Arthur Miller
2023-07-22  8:26     ` Ihor Radchenko
2023-07-27  6:26       ` Arthur Miller
2023-07-20 11:01 ` Max Nikulin
2023-07-21 13:04   ` Arthur Miller
2023-07-22  2:49     ` Max Nikulin
2023-07-22 10:55       ` Ihor Radchenko

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).