From: "Christopher M. Miles" <numbchild@gmail.com>
To: Ihor Radchenko <yantar92@gmail.com>
Cc: "Christopher M. Miles" <numbchild@gmail.com>, emacs-orgmode@gnu.org
Subject: [PATCH 4] New: auto display inline images under subtree when `org-cycle'.
Date: Thu, 15 Sep 2022 12:53:06 +0800 [thread overview]
Message-ID: <m2leqlteul.fsf@numbchild@gmail.com> (raw)
In-Reply-To: <87bkrhwc42.fsf@localhost>
[-- Attachment #1.1: Type: text/plain, Size: 2681 bytes --]
Ihor Radchenko <yantar92@gmail.com> writes:
> "Christopher M. Miles" <numbchild@gmail.com> writes:
>
>> Ihor, My new patch still have some issue in the 'fold state which I
>> added "FIXME" marker. Hope can get some solution from you.
>
> I will comment only on the first patch for now.
>
>> "EXPORT_OPTIONS" "EXPORT_TEXT" "EXPORT_FILE_NAME"
>> "EXPORT_TITLE" "EXPORT_AUTHOR" "EXPORT_DATE" "UNNUMBERED"
>> "ORDERED" "NOBLOCKING" "COOKIE_DATA" "LOG_INTO_DRAWER" "REPEAT_TO_STATE"
>> - "CLOCK_MODELINE_TOTAL" "STYLE" "HTML_CONTAINER_CLASS")
>> + "CLOCK_MODELINE_TOTAL" "STYLE" "HTML_CONTAINER_CLASS"
>> + "ORG-IMAGE-ACTUAL-WIDTH")
>
> This change should also be mentioned in the commit message.
Done
>
>> @@ -16164,14 +16165,19 @@ buffer boundaries with possible narrowing."
>> (org-element-property :begin par)
>> (re-search-forward attr-re par-end t)))
>> (match-string 1)))
>> + ;; support subtree-level property "ORG-IMAGE-ACTUAL-WIDTH" specified width.
>> + (subtree-property-width
>> + (ignore-errors (org-property-or-variable-value 'ORG-IMAGE-ACTUAL-WIDTH)))
>
> You are checking the property too late. I suggest to let-bind
> org-image-actual-width around the whole `cond' instead.
>
> That way, subtree-local value of ORG-IMAGE-ACTUAL-WIDTH will have an
> effect of setting `org-image-actual-width' value.
Done
>
> Also, is there any particular reason why you wrap
> `org-property-or-variable-value' into `ignore-errors'?
Remove, I originally use another property keyword instead of
ORG-IMAGE-ACTUAL-WIDTH, so ~org-property-or-variable-value~ will raise
error if property does not exist. SO I added ~ignore-errors~. Now removed.
>
> Finally, you can simply do
>
> (org-property-or-variable-value 'org-image-actual-width)
>
> It will return the property value _or_ org-image-actual-width value.
>
Done
>> - (car org-image-actual-width))
>> + ;; Try to use subtree-level width before fallback.
>> + (or subtree-property-width
>> + ;; Fallback to `org-image-actual-width' if no interprable width is given.
>> + (car org-image-actual-width)))
>
> With my last suggestion, this code will not be needed.
Done
>
> Also, this change should be documented in etc/NEWS and also in
> "12.7 Images" section of the manual.
Done. (the manual, you mean org-manual.org right? I found too many
documents under doc/ folder, confused for a while....)
P.S: I merged two commits into one for clear.
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1.2: 0001-org.el-Add-hook-function-to-auto-display-inline-imag.patch --]
[-- Type: text/x-patch, Size: 10536 bytes --]
From 4ba9bb3063bde50511457b1d30f1299a85e3ffaf Mon Sep 17 00:00:00 2001
From: stardiviner <numbchild@gmail.com>
Date: Mon, 12 Sep 2022 09:45:09 +0800
Subject: [PATCH] org.el: Add hook function to auto display inline images of
subtree
* lisp/org.el (org-display-subtree-with-inline-images): Add an option
and hook function to auto display of inline images under current
expanded visible subtree.
* lisp/org.el (org-display-inline-image--width): support subtree-level
property "ORG-IMAGE-ACTUAL-WIDTH" specified width.
* lisp/org.el (org-default-properties): Add a new property in to
override global org-image-actual-width subtree level.
---
doc/org-manual.org | 5 ++
etc/ORG-NEWS | 5 ++
lisp/org.el | 133 ++++++++++++++++++++++++++++++---------------
3 files changed, 100 insertions(+), 43 deletions(-)
diff --git a/doc/org-manual.org b/doc/org-manual.org
index a37b8390c..77274e250 100644
--- a/doc/org-manual.org
+++ b/doc/org-manual.org
@@ -11314,6 +11314,11 @@ command:
startup by configuring the variable
~org-startup-with-inline-images~[fn:119].
+If you want to override global variable ~org-image-actual-width~ of
+inline image display width, you can specify property
+"=ORG-IMAGE-ACTUAL-WIDTH=" in subtree level. It will only affect
+inline images under the specified subtree.
+
** Captions
:PROPERTIES:
:DESCRIPTION: Describe tables, images...
diff --git a/etc/ORG-NEWS b/etc/ORG-NEWS
index a7f32671e..42e7e4292 100644
--- a/etc/ORG-NEWS
+++ b/etc/ORG-NEWS
@@ -296,6 +296,11 @@ headings in HTML export.
Use the header argument =:var x=code-block[]= or
: #+CALL: fn(x=code-block[])
to pass the contents of a named code block as a string argument.
+*** New default property =ORG-IMAGE-ACTUAL-WIDTH= for overriding global ~org-image-actual-width~
+
+The subtree-level property "ORG-IMAGE-ACTUAL-WIDTH" can override the
+global variable ~org-image-actual-width~ settings for inline images
+width under current property specified subtree.
** New options
*** New custom settings =org-icalendar-scheduled-summary-prefix= and =org-icalendar-deadline-summary-prefix=
diff --git a/lisp/org.el b/lisp/org.el
index 6e6c437d5..98cac1c1c 100644
--- a/lisp/org.el
+++ b/lisp/org.el
@@ -1108,6 +1108,13 @@ the following lines anywhere in the buffer:
:version "24.1"
:type 'boolean)
+(defcustom org-cycle-display-inline-images nil
+ "Non-nil means auto display inline images under subtree when `org-cycle'
+by the function `org-display-subtree-with-inline-images' on hook `org-cycle-hook'."
+ :group 'org-startup
+ :version "24.1"
+ :type 'boolean)
+
(defcustom org-startup-with-latex-preview nil
"Non-nil means preview LaTeX fragments when loading a new Org file.
@@ -12199,7 +12206,8 @@ but in some other way.")
"EXPORT_OPTIONS" "EXPORT_TEXT" "EXPORT_FILE_NAME"
"EXPORT_TITLE" "EXPORT_AUTHOR" "EXPORT_DATE" "UNNUMBERED"
"ORDERED" "NOBLOCKING" "COOKIE_DATA" "LOG_INTO_DRAWER" "REPEAT_TO_STATE"
- "CLOCK_MODELINE_TOTAL" "STYLE" "HTML_CONTAINER_CLASS")
+ "CLOCK_MODELINE_TOTAL" "STYLE" "HTML_CONTAINER_CLASS"
+ "ORG-IMAGE-ACTUAL-WIDTH")
"Some properties that are used by Org mode for various purposes.
Being in this list makes sure that they are offered for completion.")
@@ -16215,6 +16223,42 @@ buffer boundaries with possible narrowing."
(overlay-put ov 'keymap image-map))
(push ov org-inline-image-overlays))))))))))))))))
+(defun org-display-subtree-inline-images (&optional state)
+ "Toggle the display of inline images under current expanded visible subtree.
+This hook function will auto display or hide inline images after `org-cycle'.
+It is used to hook on `org-cycle-hook'.
+The function behavior is controlled by `org-cycle-display-inline-images'."
+ (interactive)
+ (when (and org-cycle-display-inline-images
+ ;; not global state change from `org-cycle-global'.
+ (not (memq state '(overview contents all))))
+ (pcase state
+ ('children
+ (save-excursion
+ (save-restriction
+ (org-narrow-to-subtree)
+ ;; If has nested headlines, beg,end only from parent headling
+ ;; to first child headline which reference to upper let-binding
+ ;; `org-next-visible-heading'.
+ (org-display-inline-images t t (point-min) (progn (org-next-visible-heading 1) (point))))))
+ ('subtree
+ (save-excursion
+ (save-restriction
+ (org-narrow-to-subtree)
+ ;; If has nested headlines, also display inline images under all subtrees.
+ (org-display-inline-images t t (point-min) (point-max)))))
+ ('folded
+ ;; (save-excursion
+ ;; (save-restriction
+ ;; (org-narrow-to-subtree)
+ ;; ;; FIXME: this will auto expand heading caused `org-cycle' folded failed.
+ ;; (mapc #'delete-overlay (overlays-in (point-min) (point-max)))))
+ )
+ ('nil (funcall 'org-toggle-inline-images))
+ (_ nil))))
+
+(add-hook 'org-cycle-hook #'org-display-subtree-inline-images)
+
(defvar visual-fill-column-width) ; Silence compiler warning
(defun org-display-inline-image--width (link)
"Determine the display width of the image LINK, in pixels.
@@ -16228,48 +16272,51 @@ buffer boundaries with possible narrowing."
If the value is a float between 0 and 2, it interpreted as that proportion
of the text width in the buffer."
;; Apply `org-image-actual-width' specifications.
- (cond
- ((eq org-image-actual-width t) nil)
- ((listp org-image-actual-width)
- (let* ((case-fold-search t)
- (par (org-element-lineage link '(paragraph)))
- (attr-re "^[ \t]*#\\+attr_.*?: +.*?:width +\\(\\S-+\\)")
- (par-end (org-element-property :post-affiliated par))
- ;; Try to find an attribute providing a :width.
- (attr-width
- (when (and par (org-with-point-at
- (org-element-property :begin par)
- (re-search-forward attr-re par-end t)))
- (match-string 1)))
- (width
- (cond
- ;; Treat :width t as if `org-image-actual-width' were t.
- ((string= attr-width "t") nil)
- ;; Fallback to `org-image-actual-width' if no interprable width is given.
- ((or (null attr-width)
- (string-match-p "\\`[^0-9]" attr-width))
- (car org-image-actual-width))
- ;; Convert numeric widths to numbers, converting percentages.
- ((string-match-p "\\`[0-9.]+%" attr-width)
- (/ (string-to-number attr-width) 100.0))
- (t (string-to-number attr-width)))))
- (if (and (floatp width) (<= 0.0 width 2.0))
- ;; A float in [0,2] should be interpereted as this portion of
- ;; the text width in the window. This works well with cases like
- ;; #+attr_latex: :width 0.X\{line,page,column,etc.}width,
- ;; as the "0.X" is pulled out as a float. We use 2 as the upper
- ;; bound as cases such as 1.2\linewidth are feasible.
- (round (* width
- (window-pixel-width)
- (/ (or (and (bound-and-true-p visual-fill-column-mode)
- (or visual-fill-column-width auto-fill-function))
- (when auto-fill-function fill-column)
- (- (window-text-width) (line-number-display-width)))
- (float (window-total-width)))))
- width)))
- ((numberp org-image-actual-width)
- org-image-actual-width)
- (t nil)))
+ ;; support subtree-level property "ORG-IMAGE-ACTUAL-WIDTH" specified width.
+ (let ((org-image-actual-width (org-property-or-variable-value 'org-image-actual-width)))
+ (cond
+ ((eq org-image-actual-width t) nil)
+ ((listp org-image-actual-width)
+ (let* ((case-fold-search t)
+ (par (org-element-lineage link '(paragraph)))
+ (attr-re "^[ \t]*#\\+attr_.*?: +.*?:width +\\(\\S-+\\)")
+ (par-end (org-element-property :post-affiliated par))
+ ;; Try to find an attribute providing a :width.
+ (attr-width
+ (when (and par (org-with-point-at
+ (org-element-property :begin par)
+ (re-search-forward attr-re par-end t)))
+ (match-string 1)))
+ (width
+ (cond
+ ;; Treat :width t as if `org-image-actual-width' were t.
+ ((string= attr-width "t") nil)
+ ((or (null attr-width)
+ (string-match-p "\\`[^0-9]" attr-width))
+ ;; Try to use subtree-level width before fallback.
+ ;; Fallback to `org-image-actual-width' if no interprable width is given.
+ (car org-image-actual-width))
+ ;; Convert numeric widths to numbers, converting percentages.
+ ((string-match-p "\\`[0-9.]+%" attr-width)
+ (/ (string-to-number attr-width) 100.0))
+ (t (string-to-number attr-width)))))
+ (if (and (floatp width) (<= 0.0 width 2.0))
+ ;; A float in [0,2] should be interpereted as this portion of
+ ;; the text width in the window. This works well with cases like
+ ;; #+attr_latex: :width 0.X\{line,page,column,etc.}width,
+ ;; as the "0.X" is pulled out as a float. We use 2 as the upper
+ ;; bound as cases such as 1.2\linewidth are feasible.
+ (round (* width
+ (window-pixel-width)
+ (/ (or (and (bound-and-true-p visual-fill-column-mode)
+ (or visual-fill-column-width auto-fill-function))
+ (when auto-fill-function fill-column)
+ (- (window-text-width) (line-number-display-width)))
+ (float (window-total-width)))))
+ width)))
+ ((numberp org-image-actual-width)
+ org-image-actual-width)
+ (t nil))))
(defun org-display-inline-remove-overlay (ov after _beg _end &optional _len)
"Remove inline-display overlay if a corresponding region is modified."
--
2.37.2
[-- Attachment #1.3: Type: text/plain, Size: 267 bytes --]
--
[ stardiviner ]
I try to make every word tell the meaning that I want to express without misunderstanding.
Blog: https://stardiviner.github.io/
IRC(libera.chat, freenode): stardiviner, Matrix: stardiviner
GPG: F09F650D7D674819892591401B5DF1C95AE89AC3
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 487 bytes --]
next prev parent reply other threads:[~2022-09-15 4:58 UTC|newest]
Thread overview: 43+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-11-22 6:34 [QUESTION] How to specific image size attributes under headline scope? Christopher M. Miles
2021-11-22 18:31 ` Timothy
2022-08-18 12:44 ` Christopher M. Miles
[not found] ` <m2o7whra7j.fsf@numbchild>
2022-08-22 17:10 ` Timothy
2022-08-23 0:24 ` Christopher M. Miles
2022-09-11 2:20 ` [SOLVED] " Christopher M. Miles
2022-09-11 2:25 ` Christopher M. Miles
[not found] ` <631d472b.c80a0220.2b4b2.bf86SMTPIN_ADDED_BROKEN@mx.google.com>
2022-09-11 12:34 ` Ihor Radchenko
2022-09-12 1:54 ` [PATCH] " Christopher M. Miles
2022-09-12 1:59 ` [PATCH] New: auto display inline images under subtree when `org-cycle' Christopher M. Miles
[not found] ` <m2wna9bbc2.fsf@numbchild>
2022-09-12 6:03 ` [ISSUE] " Christopher M. Miles
[not found] ` <631e92ee.050a0220.f9c18.92f5SMTPIN_ADDED_BROKEN@mx.google.com>
2022-09-12 10:51 ` Ihor Radchenko
2022-09-13 1:09 ` [PATCH 2] " Christopher M. Miles
[not found] ` <m2leqogiz8.fsf@numbchild>
2022-09-13 1:48 ` [PATCH 3] " Christopher M. Miles
[not found] ` <631fe1c9.050a0220.3ab2b.3f52SMTPIN_ADDED_BROKEN@mx.google.com>
2022-09-15 3:27 ` Ihor Radchenko
2022-09-15 4:53 ` Christopher M. Miles [this message]
[not found] ` <6322b0a8.050a0220.59bb8.6923SMTPIN_ADDED_BROKEN@mx.google.com>
2022-09-15 8:47 ` [PATCH 4] " Ihor Radchenko
2022-09-15 9:43 ` [PATCH 5] " Christopher M. Miles
[not found] ` <6322f5ad.c80a0220.5e936.823eSMTPIN_ADDED_BROKEN@mx.google.com>
2022-09-20 7:01 ` [PATCH v6] " Ihor Radchenko
2022-09-20 11:32 ` [PATCH v6] " Christopher M. Miles
[not found] ` <6329c8b0.050a0220.412d.0a6cSMTPIN_ADDED_BROKEN@mx.google.com>
2022-09-21 7:54 ` Ihor Radchenko
2022-09-28 12:55 ` [PATCH 2-v1] " Christopher M. Miles
[not found] ` <633454e3.050a0220.7278b.1fa5SMTPIN_ADDED_BROKEN@mx.google.com>
2022-09-29 3:05 ` Ihor Radchenko
2022-09-29 6:06 ` Christopher M. Miles
2022-09-29 6:57 ` [PATCH 2-v1 (test v1)] " Christopher M. Miles
[not found] ` <63353c69.370a0220.67788.e8a1SMTPIN_ADDED_BROKEN@mx.google.com>
2022-09-30 3:19 ` [PATCH 2-v1] " Ihor Radchenko
2022-09-30 8:27 ` [PATCH 2-v2] " Christopher M. Miles
[not found] ` <6336a955.050a0220.4e72e.2b23SMTPIN_ADDED_BROKEN@mx.google.com>
2022-10-01 3:16 ` Ihor Radchenko
2022-10-01 9:51 ` [PATCH 2-v3] " Christopher M. Miles
[not found] ` <63380f57.370a0220.a9d9a.dee8SMTPIN_ADDED_BROKEN@mx.google.com>
2022-10-03 3:21 ` Ihor Radchenko
2022-10-03 4:37 ` [PATCH 2-v4] " Christopher M. Miles
[not found] ` <633a67d8.050a0220.733e8.e57dSMTPIN_ADDED_BROKEN@mx.google.com>
2022-10-04 4:36 ` Ihor Radchenko
2022-10-04 7:27 ` Christopher M. Miles
[not found] ` <633be6d3.370a0220.4060.bacdSMTPIN_ADDED_BROKEN@mx.google.com>
2022-10-08 7:53 ` Ihor Radchenko
2022-10-08 9:50 ` Christopher M. Miles
[not found] ` <634149f4.c80a0220.1376.e564SMTPIN_ADDED_BROKEN@mx.google.com>
2022-10-09 7:21 ` Ihor Radchenko
2022-10-10 8:40 ` Christopher M. Miles
[not found] ` <m2v8os5aqy.fsf@numbchild>
2022-10-22 1:29 ` Christopher M. Miles
2022-10-23 4:33 ` Ihor Radchenko
2022-10-23 7:14 ` Christopher M. Miles
2022-10-25 7:23 ` Ihor Radchenko
2022-10-25 14:22 ` [PATCH v3] " Christopher M. Miles
2022-10-26 4:50 ` Ihor Radchenko
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.orgmode.org/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=m2leqlteul.fsf@numbchild@gmail.com \
--to=numbchild@gmail.com \
--cc=emacs-orgmode@gnu.org \
--cc=yantar92@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).