From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mp12.migadu.com ([2001:41d0:403:58f0::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by ms8.migadu.com with LMTPS id YHN6KhCkT2WmOAEAauVa8A:P1 (envelope-from ) for ; Sat, 11 Nov 2023 16:56:00 +0100 Received: from aspmx1.migadu.com ([2001:41d0:403:58f0::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by mp12.migadu.com with LMTPS id YHN6KhCkT2WmOAEAauVa8A (envelope-from ) for ; Sat, 11 Nov 2023 16:56:00 +0100 Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by aspmx1.migadu.com (Postfix) with ESMTPS id 725AD44C6A for ; Sat, 11 Nov 2023 16:56:00 +0100 (CET) Authentication-Results: aspmx1.migadu.com; dkim=none; dmarc=fail reason="SPF not aligned (relaxed), No valid DKIM" header.from=gmail.com (policy=none); spf=pass (aspmx1.migadu.com: domain of "emacs-orgmode-bounces+larch=yhetil.org@gnu.org" designates 209.51.188.17 as permitted sender) smtp.mailfrom="emacs-orgmode-bounces+larch=yhetil.org@gnu.org" ARC-Seal: i=1; s=key1; d=yhetil.org; t=1699718160; a=rsa-sha256; cv=none; b=a1qtmvCdtGLRGkMxd8z3+s4aYmh7O1skO53fj4Du0GB2Pj2eqWfjm8psh6sZITV9MktWph nl1icxYiUpw608k+Nw9Zi4N0oXztKr/EnH6yETqBVfIRLQx3NNDWyvQhyPcFBcweb57yYB w7X4DYgofZ1U1g2FeogfWiNq/QFMeY8rdoOaecvM9rf3YyKRPngFRiGlGWq4L7AxeIGTEu U8r1ckUtELcYo27DhYeh2nxw3wY+hA2JTOQOrFvmDC47mV4WzETpehILsJqpDv/9ZH8bme wDYFwn/UqAPLleTCfzugAw3vGfa8lYnWaaAJ2EwJ0rFjNjkQcoj4iH4C5tPx0g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=yhetil.org; s=key1; t=1699718160; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding:list-id:list-help: list-unsubscribe:list-subscribe:list-post; bh=5EgA9CKVGmNAaSxDISintWqCcTd0WaaHEJUFNmS6Z+E=; b=qqMmcYN9sUCzI8gXcPsjRXF/Lt1zT/Z+mvRUfgFYS9HnS1zBjg8CHZqTtwe0ikaLTT3os+ Nd7sN7OgVE49Y+IYmPM3L41LqsaE1Hd7IBakOJuZ9l8lRaC9eZLeNOcvbJHG+3of9iqyXJ YuaZDd4fjB9p0u8sAQpvDVj5NgOZjF8OUyLxOU9S3rQuYw94Pd8sJHNklAs7q54XwEWMSZ /D8YLTwac9UtZd9Tq0dC5GDeluQwFE3jDs8YnK0NgWbbNzBwJvgZPEvvDu1JYr9lTp6Gz5 TJwx1563FmAVxE/jiSIMdFGaTGYRNQpKFWjbDqLkHYuiQ6w+xtqaL2IzqHq9kg== ARC-Authentication-Results: i=1; aspmx1.migadu.com; dkim=none; dmarc=fail reason="SPF not aligned (relaxed), No valid DKIM" header.from=gmail.com (policy=none); spf=pass (aspmx1.migadu.com: domain of "emacs-orgmode-bounces+larch=yhetil.org@gnu.org" designates 209.51.188.17 as permitted sender) smtp.mailfrom="emacs-orgmode-bounces+larch=yhetil.org@gnu.org" Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1r1qJv-0007KP-KD; Sat, 11 Nov 2023 10:54:51 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1r1qJu-0007KH-JG for emacs-orgmode@gnu.org; Sat, 11 Nov 2023 10:54:50 -0500 Received: from ciao.gmane.io ([116.202.254.214]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1r1qJs-0003V4-Rz for emacs-orgmode@gnu.org; Sat, 11 Nov 2023 10:54:50 -0500 Received: from list by ciao.gmane.io with local (Exim 4.92) (envelope-from ) id 1r1qJq-0007Gr-Uq for emacs-orgmode@gnu.org; Sat, 11 Nov 2023 16:54:46 +0100 X-Injected-Via-Gmane: http://gmane.org/ To: emacs-orgmode@gnu.org From: Max Nikulin Subject: Links & images with different attributes in the same paragraph Date: Sat, 11 Nov 2023 22:54:37 +0700 Message-ID: Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit User-Agent: Mozilla Thunderbird Content-Language: en-US, ru-RU Received-SPF: pass client-ip=116.202.254.214; envelope-from=geo-emacs-orgmode@m.gmane-mx.org; helo=ciao.gmane.io X-Spam_score_int: 28 X-Spam_score: 2.8 X-Spam_bar: ++ X-Spam_report: (2.8 / 5.0 requ) BAYES_00=-1.9, DKIM_ADSP_CUSTOM_MED=0.001, FORGED_GMAIL_RCVD=1, FORGED_MUA_MOZILLA=2.309, FREEMAIL_FORGED_FROMDOMAIN=0.249, FREEMAIL_FROM=0.001, HEADER_FROM_DIFFERENT_DOMAINS=0.249, NML_ADSP_CUSTOM_MED=0.9, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: emacs-orgmode@gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-orgmode-bounces+larch=yhetil.org@gnu.org Sender: emacs-orgmode-bounces+larch=yhetil.org@gnu.org X-Migadu-Flow: FLOW_IN X-Migadu-Country: US X-Migadu-Scanner: mx11.migadu.com X-Spam-Score: 0.25 X-Migadu-Queue-Id: 725AD44C6A X-Migadu-Spam-Score: 0.25 X-TUID: YZ34xFHQ7ipd Hi, I raised this topic earlier. It seems, there is a rather generic workaround that may help. Sometimes it is necessary to assign specific export attributes to some links in a paragraph while others should get another set of them. Inline images should have different alt text. --- 8< --- Text with <> in a paragraph. Any link types are supported including [[wrap::href "anchor"][internal]] ones. Attributes may be added selectively: Images in the same paragraph may have different =alt= attribute: raster [[wrap::attr_html ":alt PNG Unicorn" :href "https://orgmode.org/worg/images/orgmode/org-mode-unicorn-original-logo.png"]] and vector [[wrap::attr_html ":alt SVG Unicorn" :href "https://orgmode.org/resources/img/org-mode-unicorn.svg"]] images. --- >8 --- is exported as --- 8< ---

Text with in a paragraph.

Any link types are supported including internal ones. Attributes may be added selectively: https://microsoft.com/

Images in the same paragraph may have different alt attribute: raster PNG Unicorn and vector SVG Unicorn images.

--- >8 --- and it requires not so much code: # #+header: :eval never-export #+begin_src elisp :exports results :results silent (defun nm/org-link-wrap-path-to-props (path) (read (concat "(" path ")"))) (defun nm/org-link-wrap-copy-props (props link) (while props (let ((name (pop props)) (value (pop props)) (case-fold-search t)) (org-element-put-property link name ;; `org-element--collect-affiliated-keywords' (if (string-match-p "\\`:attr_" (symbol-name name)) (append (org-element-property name link) (list value)) value))))) (defun nm/org-link-wrap-export (path description backend info) (let* ((props-all (nm/org-link-wrap-path-to-props path)) (href (plist-get props-all :href)) ;; `org-plist-delete' removes other duplicated keys as well. (props (map-delete props-all :href)) ;; Taken from `org-link-open-from-string'. (link (with-temp-buffer (let ((org-inhibit-startup nil)) (insert "[[" (org-link-escape href) "]]") (org-mode) (goto-char (point-min)) (org-element-link-parser))))) (nm/org-link-wrap-copy-props props link) (when description (org-element-set-contents link description)) (org-no-properties (org-export-data-with-backend link backend info)))) (defun nm/org-link-wrap-follow (path arg) (let* ((props (nm/org-link-wrap-path-to-props path)) (href (plist-get props :href))) (org-link-open-from-string (concat "[[" (org-link-escape href) "]]") arg))) (org-link-set-parameters "wrap" :follow #'nm/org-link-wrap-follow :export #'nm/org-link-wrap-export) #+end_src An example of earlier discussion: https://list.orgmode.org/t8q71r$mgv$1@ciao.gmane.io/ Max Nikulin. [BUG] manual: confusing example of adding attributes to a link (affiliated keywords). Mon, 20 Jun 2022 23:25:29 +0700