* Re: [PATCH 0/1] Add option to delay fontification of source blocks
@ 2021-04-25 3:48 93% ` Timothy
0 siblings, 0 replies; 74+ results
From: Timothy @ 2021-04-25 3:48 UTC (permalink / raw)
To: emacs-orgmode
Marking as closed on updates.orgmode.org via the X-Woof-Patch header.
Leo Okawa Ericson <leo@relevant-information.com> writes:
> I can't think of a reason either (now that I know that jit-lock exists)
> so I will retract my patch.
^ permalink raw reply [relevance 93%]
* Re: [PATCH 0/1] Add option to delay fontification of source blocks
@ 2021-04-25 3:48 93% ` Timothy
0 siblings, 0 replies; 74+ results
From: Timothy @ 2021-04-25 3:48 UTC (permalink / raw)
To: emacs-orgmode
Marking as closed on updates.orgmode.org via the X-Woof-Patch header.
Leo Okawa Ericson <leo@relevant-information.com> writes:
> I can't think of a reason either (now that I know that jit-lock exists)
> so I will retract my patch.
^ permalink raw reply [relevance 93%]
* Re: [PATCH] Startup option to separate macros arguments with an alternative string
@ 2021-04-25 3:46 93% ` Timothy
0 siblings, 0 replies; 74+ results
From: Timothy @ 2021-04-25 3:46 UTC (permalink / raw)
To: emacs-orgmode
As you have said you'll start a new thread for your revised proposal,
I'll mark this as closed on updates.orgmode.org via the X-Woof-Patch
header.
Juan Manuel Macías <maciaschain@posteo.net> writes:
> Ok, I agree. Next week I will start a new thread for submit this new
> proposal.
>
> Best regards,
>
> Juan Manuel
^ permalink raw reply [relevance 93%]
* Re: [PATCH] ob-java: Allow import to end with asterisk
@ 2021-04-25 3:43 93% ` Timothy
0 siblings, 0 replies; 74+ results
From: Timothy @ 2021-04-25 3:43 UTC (permalink / raw)
To: emacs-orgmode
This was not marked as applied on updates.orgmode.org.
Doing so with the X-Woof-Patch header.
ian martins <ianxm@jhu.edu> writes:
> Thanks. And thanks for taking the time to fix issues that you find. It
> continues to improve because of your contributions.
> The patch looks good. Applied.
^ permalink raw reply [relevance 93%]
* Re: [PATCH] ob-java, a proposal on import improvement
@ 2021-04-25 3:42 93% ` Timothy
0 siblings, 0 replies; 74+ results
From: Timothy @ 2021-04-25 3:42 UTC (permalink / raw)
To: emacs-orgmode
This was not marked as applied on updates.orgmode.org.
Doing so with the X-Woof-Patch header.
ian martins <ianxm@jhu.edu> writes:
> It's no problem. Didn't mean to rush you. Thanks again for the patch. Applied.
^ permalink raw reply [relevance 93%]
* Re: [PATCH] org-contacts.el: Use `bound-and-true-p' to check (unbound) var
@ 2021-04-25 3:41 93% ` Timothy
0 siblings, 0 replies; 74+ results
From: Timothy @ 2021-04-25 3:41 UTC (permalink / raw)
To: emacs-orgmode
This was not marked as applied on updates.orgmode.org.
Doing so with the X-Woof-Patch header.
miles christopher <numbchild@gmail.com> writes:
> Applied, I think this should be the final version.
^ permalink raw reply [relevance 93%]
* Re: [PATCH] ol: Avoid initial input when completing function for storing link
@ 2021-04-25 3:38 93% ` Timothy
0 siblings, 0 replies; 74+ results
From: Timothy @ 2021-04-25 3:38 UTC (permalink / raw)
To: emacs-orgmode
This was not marked as applied on updates.orgmode.org.
Doing so with the X-Woof-Patch header.
Kyle Meyer <kyle@kyleam.com> writes:
> Pushed (00b4de329).
^ permalink raw reply [relevance 93%]
* Re: [PATCH] Apply emacs manual css to org pages
@ 2021-04-25 3:36 93% ` Timothy
0 siblings, 0 replies; 74+ results
From: Timothy @ 2021-04-25 3:36 UTC (permalink / raw)
To: org-mode-email
For some reason updates.orgmode.org registered this as a new patch??
Marking as closed via X-Woof-Patch header.
Greg Minshall <minshall@umich.edu> writes:
> Timothy,
>
>> This is a quick patch to use the Emacs manual CSS with our generated Org
>> manual.
>
> that's certainly visually pleasing. nice!
>
> Greg
^ permalink raw reply [relevance 93%]
* Re: [PATCH] Apply emacs manual css to org pages
@ 2021-04-25 3:34 93% ` Timothy
0 siblings, 0 replies; 74+ results
From: Timothy @ 2021-04-25 3:34 UTC (permalink / raw)
To: org-mode-email
This was not marked as applied on updates.orgmode.org.
Doing so with the X-Woof-Patch header.
Bastien <bzg@gnu.org> writes:
> I made this change and tested it online, the HTML Org manual now looks
> like the Emacs manual: https://orgmode.org/manual/
>
> Thanks for the suggestion!
> In any cas, the Emacs manual css is better than my attempt and using
> it for Org makes sense IMO.
>
> Best,
^ permalink raw reply [relevance 93%]
* Re: [final patch] Re: add new link type "contact:" for org-contacts.el
@ 2021-04-25 3:31 93% ` Timothy
0 siblings, 0 replies; 74+ results
From: Timothy @ 2021-04-25 3:31 UTC (permalink / raw)
To: emacs-orgmode
This was not marked as applied on updates.orgmode.org.
Doing so with the X-Woof-Patch header.
Bastien <bzg@gnu.org> writes:
> Of course, done (c822c80ef).
>
> Sorry I forgot about this patch, and thanks for your reply.
^ permalink raw reply [relevance 93%]
* Re: [PATCH] New "project" option for org-link-file-path-type
@ 2021-04-25 3:29 93% ` Timothy
0 siblings, 0 replies; 74+ results
From: Timothy @ 2021-04-25 3:29 UTC (permalink / raw)
To: Jack Kamm; +Cc: Kyle Meyer, emacs-orgmode
This was not marked as applied on updates.orgmode.org.
Doing so with the X-Woof-Patch header.
Jack Kamm <jackkamm@gmail.com> writes:
> Thanks, I've fixed the remaining issues you pointed out and pushed this
> in 5371b30fe.
>
> Cheers,
> Jack
^ permalink raw reply [relevance 93%]
* Re: [PATCH] I updated patch by deleteing duplicate tags
@ 2021-04-25 3:25 99% ` Timothy
0 siblings, 0 replies; 74+ results
From: Timothy @ 2021-04-25 3:25 UTC (permalink / raw)
To: emacs-orgmode
This was not marked as applied. Doing so with the X-Woof-Patch header.
Kyle Meyer <kyle@kyleam.com> writes:
> Christopher Miles writes:
>
>> Subject: [PATCH] org.el: Complete tags from both global and buffer local
>
> Thanks. Applied (86ad8d279)...
^ permalink raw reply [relevance 99%]
* Re: [PATCH] org-capture.el: Add new capture template option :refile-to
@ 2021-04-25 3:16 93% ` Timothy
0 siblings, 0 replies; 74+ results
From: Timothy @ 2021-04-25 3:16 UTC (permalink / raw)
To: emacs-orgmode
Marking this patch as cancelled for updates.orgmode.org.
^ permalink raw reply [relevance 93%]
* [PATCH] Refresh inline plotted images
@ 2021-04-24 4:59 74% Timothy
0 siblings, 0 replies; 74+ results
From: Timothy @ 2021-04-24 4:59 UTC (permalink / raw)
To: org-mode-email
[-- Attachment #1: Type: text/plain, Size: 325 bytes --]
Hi All,
This patch improves the result of running org-plot in the following
situation
#+plot: ... file:"somefile.png"
[[file:somefile.png]]
Previously, when somefile.png is re-plotted the [[file:]] inline image
did not refresh. With this patch, after plotting, overlays of the
replotted image are refreshed.
--
Timothy
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-org-plot-Refresh-inline-images-after-plotting.patch --]
[-- Type: text/x-patch, Size: 1786 bytes --]
From 5c848c186f2dd4d77b0dcc1035b3c889a4b023a2 Mon Sep 17 00:00:00 2001
From: TEC <tec@tecosaur.com>
Date: Sat, 24 Apr 2021 12:49:26 +0800
Subject: [PATCH] org-plot: Refresh inline images after plotting
* lisp/org-plot.el (org-plot/redisplay-img-in-buffer): New function
which searches the current Org buffer for overlays of a certain image,
and refreshes those overlays.
(org-plot/gnuplot): Use `org-plot/redisplay-img-in-buffer' after
plotting to redisplay any associated inline images.
---
lisp/org-plot.el | 12 +++++++++++-
1 file changed, 11 insertions(+), 1 deletion(-)
diff --git a/lisp/org-plot.el b/lisp/org-plot.el
index 28cff94f2..65bc71074 100644
--- a/lisp/org-plot.el
+++ b/lisp/org-plot.el
@@ -610,6 +610,13 @@ (defun org-plot/gnuplot-script (table data-file num-cols params &optional prefac
",\\\n "))))
script)))
+(defun org-plot/redisplay-img-in-buffer (img-file)
+ "Find any overlays for IMG-FILE in the current Org buffer, and refresh them."
+ (dolist (img-overlay org-inline-image-overlays)
+ (when (string= img-file (plist-get (cdr (overlay-get img-overlay 'display)) :file))
+ (when (file-exists-p img-file)
+ (image-refresh (overlay-get img-overlay 'display))))))
+
;;-----------------------------------------------------------------------------
;; facade functions
;;;###autoload
@@ -697,7 +704,10 @@ (defun org-plot/gnuplot (&optional params)
(gnuplot-mode)
(gnuplot-send-buffer-to-gnuplot))
;; Cleanup.
- (bury-buffer (get-buffer "*gnuplot*")))))
+ (bury-buffer (get-buffer "*gnuplot*"))
+ ;; Refresh any displayed images
+ (when (plist-get params :file)
+ (org-plot/redisplay-img-in-buffer (expand-file-name (plist-get params :file)))))))
(provide 'org-plot)
--
2.31.1
^ permalink raw reply related [relevance 74%]
* Re: [PATCH] ob-tangle.el: Speed up tangling
@ 2021-04-21 8:02 93% ` Timothy
0 siblings, 0 replies; 74+ results
From: Timothy @ 2021-04-21 8:02 UTC (permalink / raw)
To: sebastien.miquel; +Cc: Tom Gillespie, emacs-orgmode
Sébastien Miquel <sebastien.miquel@posteo.eu> writes:
> On second thought, I'm uneasy about my approach. If tangling fails,
> the user might miss the error message since it is quickly replaced by
> the tangling info. Ideally we should backup all the tangled files and
> restore them all if a single one fails to ensure we're back to a
> consistent state.
>
> I'm unsure what would be best practices here. In case of a remote
> tangled files, I don't know if temporary files should be remote or
> not, and what guarantees do emacs primitives such as ~rename-file~
> offer.
Just 2c from me on how I'd like this to work as a user, when tangling
fails:
+ Every file that could be tangled is tangled, or there's a variable
which controls what to do on an error
+ Loud message at the end that lists all files which files failed to
tangle
--
Timothy
^ permalink raw reply [relevance 93%]
* Re: [PATCH] Use <img> tags for SVGs
2021-04-07 11:24 58% [PATCH] Use <img> tags for SVGs Timothy
@ 2021-04-07 11:29 93% ` Timothy
0 siblings, 0 replies; 74+ results
From: Timothy @ 2021-04-07 11:29 UTC (permalink / raw)
To: org-mode-email
Timothy <tecosaur@gmail.com> writes:
> It's worth nothing that the current approach isn't just "not great", but
> actually causes some issues.
Oh, and for reference the W3C violation this fixes is:
"Attribute alt not allowed on element object"
--
Timothy
^ permalink raw reply [relevance 93%]
* [PATCH] Use <img> tags for SVGs
@ 2021-04-07 11:24 58% Timothy
2021-04-07 11:29 93% ` Timothy
0 siblings, 1 reply; 74+ results
From: Timothy @ 2021-04-07 11:24 UTC (permalink / raw)
To: org-mode-email
[-- Attachment #1: Type: text/plain, Size: 455 bytes --]
Hey everyone,
This is the first patch addressing an item raised in
https://orgmode.org/list/87sga4914t.fsf@gmail.com/ [subject: W3C
violations in Org's HTML export].
For more information see the email mentioned above and/or the commit
message.
It's worth nothing that the current approach isn't just "not great", but
actually causes some issues. For instance, in the ox-html export of my
Emacs config, here's an SVG generated by Gnuplot with org-plot:
[-- Attachment #2: svg-object.png --]
[-- Type: image/png, Size: 45527 bytes --]
[-- Attachment #3: Type: text/plain, Size: 66 bytes --]
If I just change <object> to <img> this is much better behaved:
[-- Attachment #4: svg-img.png --]
[-- Type: image/png, Size: 47244 bytes --]
[-- Attachment #5: Type: text/plain, Size: 69 bytes --]
Anyway, that's enough preamble --- here's the patch :)
--
Timothy
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #6: 0001-ox-html-Use-img-tags-for-svgs-not-object.patch --]
[-- Type: text/x-patch, Size: 3210 bytes --]
From 9c041f16a947309d47c5a162146946268788d459 Mon Sep 17 00:00:00 2001
From: TEC <tec@tecosaur.com>
Date: Wed, 7 Apr 2021 19:07:53 +0800
Subject: [PATCH] ox-html: Use <img> tags for svgs, not <object>
* lisp/ox-html.el (org-html--format-image, org-html--svg-image): Remove
special treatment of SVGs with <object>, and just use <img>. This used
to be poorly supported, but since Firefox 4 / Chrome 28 / Safari 9 this
is no longer a concern (https://caniuse.com/svg-img) and the last
browser release that didn't support SVG images was in 2010 (SVG data
URIs took until 2015 to be fully supported, but this is a lesser
concern).
---
lisp/ox-html.el | 49 ++++++++++++-------------------------------------
1 file changed, 12 insertions(+), 37 deletions(-)
diff --git a/lisp/ox-html.el b/lisp/ox-html.el
index 89da823e8..adda7365e 100644
--- a/lisp/ox-html.el
+++ b/lisp/ox-html.el
@@ -1693,43 +1693,18 @@ (defun org-html--format-image (source attributes info)
ATTRIBUTES is a plist, as returned by
`org-export-read-attribute'. INFO is a plist used as
a communication channel."
- (if (string= "svg" (file-name-extension source))
- (org-html--svg-image source attributes info)
- (org-html-close-tag
- "img"
- (org-html--make-attribute-string
- (org-combine-plists
- (list :src source
- :alt (if (string-match-p
- (concat "^" org-preview-latex-image-directory) source)
- (org-html-encode-plain-text
- (org-find-text-property-in-string 'org-latex-src source))
- (file-name-nondirectory source)))
- attributes))
- info)))
-
-(defun org-html--svg-image (source attributes info)
- "Return \"object\" embedding svg file SOURCE with given ATTRIBUTES.
-INFO is a plist used as a communication channel.
-
-The special attribute \"fallback\" can be used to specify a
-fallback image file to use if the object embedding is not
-supported. CSS class \"org-svg\" is assigned as the class of the
-object unless a different class is specified with an attribute."
- (let ((fallback (plist-get attributes :fallback))
- (attrs (org-html--make-attribute-string
- (org-combine-plists
- ;; Remove fallback attribute, which is not meant to
- ;; appear directly in the attributes string, and
- ;; provide a default class if none is set.
- '(:class "org-svg") attributes '(:fallback nil)))))
- (format "<object type=\"image/svg+xml\" data=\"%s\" %s>\n%s</object>"
- source
- attrs
- (if fallback
- (org-html-close-tag
- "img" (format "src=\"%s\" %s" fallback attrs) info)
- "Sorry, your browser does not support SVG."))))
+ (org-html-close-tag
+ "img"
+ (org-html--make-attribute-string
+ (org-combine-plists
+ (list :src source
+ :alt (if (string-match-p
+ (concat "^" org-preview-latex-image-directory) source)
+ (org-html-encode-plain-text
+ (org-find-text-property-in-string 'org-latex-src source))
+ (file-name-nondirectory source)))
+ attributes))
+ info))
(defun org-html--textarea-block (element)
"Transcode ELEMENT into a textarea block.
--
2.30.1
^ permalink raw reply related [relevance 58%]
* [PATCH] Wrap LaTeX snippets in $$ with markdown export
@ 2021-03-31 16:41 59% Timothy
0 siblings, 0 replies; 74+ results
From: Timothy @ 2021-03-31 16:41 UTC (permalink / raw)
To: org-mode-email
[-- Attachment #1: Type: text/plain, Size: 936 bytes --]
Hi All,
I anticipate that this change may be somewhat contentions because ox-md
explicitly follows only the original Markdown spec from 2003, however
I've thought this over and come to the conclusion that this change is
still in keeping with that, and beneficial.
Currently ox-md simply inherits the output from ox-html's handling of
LaTeX snippets. Needless to say, the original Markdown specification
does not mention LaTeX snippets. As such, by subtly tweaking the output
(either adding $$ or substituting out LaTeX-style \(\) / \[\] for $ /
$$) we are not deviating from the original specification any more than we
already are.
While I don't see any issue with this, I do see some benefits. Namely
that, of the many Markdown variants that now exist, many support LaTeX
snippets, but exclusively in the TeX $$ form. Hence, by applying this
change the overall utility of ox-md is increased.
Let me know what you think,
Timothy
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-ox-md-Use-TeX-style-math-wrapping.patch --]
[-- Type: text/x-patch, Size: 2721 bytes --]
From b7f1b89a50752398672a642519534818d23c72a4 Mon Sep 17 00:00:00 2001
From: TEC <tec@tecosaur.com>
Date: Thu, 1 Apr 2021 00:25:41 +0800
Subject: [PATCH] ox-md: Use TeX-style $ math wrapping
* lisp/ox-md.el (org-md-latex-environment, org-md-latex-fragment):
These two new filters wrap LaTeX maths in $ / $$ TeX-style notation.
While ox-md endeavours to adhere to the original Markdown specification,
and not any particular variant, the original specification does not deal
with LaTeX fragments at all, and so this change does not reduce how
faithfully the original specification is followed.
There is a major upside to this though. Of the many Markdown variants
that have emerged, those that support LaTeX very often exclusively
support TeX style notation. This change thus improves the utility of
the Markdown export for many use cases, and deviates no more from the
original specification that the current method.
---
lisp/ox-md.el | 28 ++++++++++++++++++++++++++++
1 file changed, 28 insertions(+)
diff --git a/lisp/ox-md.el b/lisp/ox-md.el
index b6b2c1728..c5c0e05a5 100644
--- a/lisp/ox-md.el
+++ b/lisp/ox-md.el
@@ -100,6 +100,8 @@ (org-export-define-derived-backend 'md 'html
(italic . org-md-italic)
(item . org-md-item)
(keyword . org-md-keyword)
+ (latex-environment . org-md-latex-environment)
+ (latex-fragment . org-md-latex-fragment)
(line-break . org-md-line-break)
(link . org-md-link)
(node-property . org-md-node-property)
@@ -460,6 +462,32 @@ (defun org-md-keyword (keyword contents info)
(_ (org-export-with-backend 'html keyword contents info))))
+;;;; Latex Environment
+
+(defun org-md-latex-environment (latex-environment contents info)
+ "Transcode a LATEX-ENVIRONMENT object from Org to Markdown.
+CONTENTS is nil. INFO is a plist holding contextual information."
+ (when (plist-get info :with-latex)
+ (concat "$$\n"
+ (org-html-latex-environment latex-environment contents info)
+ "$$\n")))
+
+
+;;;; Latex Fragment
+
+(defun org-md-latex-fragment (latex-fragment contents info)
+ "Transcode a LATEX-FRAGMENT object from Org to Markdown.
+CONTENTS is nil. INFO is a plist holding contextual information."
+ (when (plist-get info :with-latex)
+ (let ((frag (org-html-latex-fragment contents info)))
+ (cond
+ ((string-match-p "^\\\\(" frag)
+ (concat "$" (substring frag 2 -2) "$"))
+ ((string-match-p "^\\\\\\[" frag)
+ (concat "$$" (substring frag 2 -2) "$$"))
+ (t (message "unrecognised fragment: %s" frag)
+ frag)))))
+
;;;; Line Break
(defun org-md-line-break (_line-break _contents _info)
--
2.30.1
^ permalink raw reply related [relevance 59%]
* [PATCH] Add font-lock rule for inline export snippets
@ 2021-03-31 15:57 80% Timothy
0 siblings, 0 replies; 74+ results
From: Timothy @ 2021-03-31 15:57 UTC (permalink / raw)
To: org-mode-email
[-- Attachment #1: Type: text/plain, Size: 528 bytes --]
Hello,
The latest in my visually-oriented (mostly) short patch series, adding
basic fontification to inline export snippets --- @@comment:these things@@.
I think fontification for stuff like this is nice because it visually
indicates to the user that they've written out an Org construct, and
haven't just mis-remembered / imagined some syntax.
In future this could be extended to use native fontification for
recognised export formats (like src blocks do), but I think this is a
nice improvement over nothing.
--
Timothy
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-org-Add-font-lock-rule-for-inline-export-snippets.patch --]
[-- Type: text/x-patch, Size: 942 bytes --]
From 3584602f88381ab9624c767a83c18cfd93ffeaf0 Mon Sep 17 00:00:00 2001
From: TEC <tec@tecosaur.com>
Date: Wed, 31 Mar 2021 23:47:58 +0800
Subject: [PATCH] org: Add font-lock rule for inline export snippets
* lisp/org.el (org-set-font-lock-defaults): Add font-lock rule for
inline export snippets.
---
lisp/org.el | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/lisp/org.el b/lisp/org.el
index f4d069504..240f745c7 100644
--- a/lisp/org.el
+++ b/lisp/org.el
@@ -5719,6 +5719,11 @@ (defun org-set-font-lock-defaults ()
;; Description list items
'("^[ \t]*[-+*][ \t]+\\(.*?[ \t]+::\\)\\([ \t]+\\|$\\)"
1 'org-list-dt prepend)
+ ;; Inline export snippets
+ '("\\(@@\\)\\([a-z-]+:\\).*?\\(@@\\)"
+ (1 'font-lock-comment-face t)
+ (2 'org-tag t)
+ (3 'font-lock-comment-face t))
;; ARCHIVEd headings
(list (concat
org-outline-regexp-bol
--
2.30.1
^ permalink raw reply related [relevance 80%]
* [PATCH] avoid loading major modes when exporting to file
@ 2021-03-31 15:25 76% Timothy
0 siblings, 0 replies; 74+ results
From: Timothy @ 2021-03-31 15:25 UTC (permalink / raw)
To: org-mode-email
[-- Attachment #1: Type: text/plain, Size: 201 bytes --]
Hello,
Another little patch, this time a one-liner.
I think the commit description is pretty thorough, so give that a look.
TLDR; it makes `org-export-to-file' behave a bit more nicely.
--
Timothy
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-ox-don-t-load-a-major-mode-when-exporting-to-file.patch --]
[-- Type: text/x-patch, Size: 1406 bytes --]
From eb9d7c038dbb9e7a4b89edf61db83a31dda27170 Mon Sep 17 00:00:00 2001
From: TEC <tec@tecosaur.com>
Date: Wed, 31 Mar 2021 23:16:58 +0800
Subject: [PATCH] ox: don't load a major-mode when exporting to file
* lisp/ox.el (org-export-to-file): Prior to this, when
`org-export-to-file' was called it activated the major mode for that
file type based on `auto-mode-alist'. This can be mildly annoying in
various ways as loading the major mode (1) makes the export take
longer, (2) can produce unwanted "noise" while initialising, namely
warnings and errors related to the mode itself, (3) can produce spurious
files like an .auctex-auto folder. By locally binding `auctex-auto' to
nil all of these undesirable behaviours can be avoided.
---
lisp/ox.el | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/lisp/ox.el b/lisp/ox.el
index f705bc83a..96d2866dd 100644
--- a/lisp/ox.el
+++ b/lisp/ox.el
@@ -6388,7 +6388,8 @@ (defun org-latex-export-to-latex
(declare (indent 2))
(if (not (file-writable-p file)) (error "Output file not writable")
(let ((ext-plist (org-combine-plists `(:output-file ,file) ext-plist))
- (encoding (or org-export-coding-system buffer-file-coding-system)))
+ (encoding (or org-export-coding-system buffer-file-coding-system))
+ (auto-mode-alist nil))
(if async
(org-export-async-start
`(lambda (file)
--
2.30.1
^ permalink raw reply related [relevance 76%]
* [PATCH] Fontification for inline src blocks
@ 2021-03-31 15:00 42% Timothy
0 siblings, 0 replies; 74+ results
From: Timothy @ 2021-03-31 15:00 UTC (permalink / raw)
To: org-mode-email
[-- Attachment #1: Type: text/plain, Size: 392 bytes --]
Hi All,
I've been using inline src blocks a fair bit more recently, and I've
thought it's a pity how bad they look as they are currently without
fontification. A little digging into Org internals and font-lock later
and we have this patch. I could speak about what's been done, but I
think a screenshot does a much better comparison.
For more details, see the attached patch.
--
Timothy
[-- Attachment #2: fontify-inline-src.png --]
[-- Type: image/png, Size: 132455 bytes --]
[-- Attachment #3: 0001-org-src-Implement-native-inline-src-fontification.patch --]
[-- Type: text/x-patch, Size: 7361 bytes --]
From 563281f8bed02e8ec12e48696ebdd98e61ccfbac Mon Sep 17 00:00:00 2001
From: TEC <tec@tecosaur.com>
Date: Wed, 31 Mar 2021 22:30:40 +0800
Subject: [PATCH] org-src: Implement native inline src fontification
* lisp/org-src.el (org-fontify-inline-src-blocks,
org-fontify-inline-src-blocks-1): Create a function to search the buffer
up to a limit for inline src blocks. Light fontification is applied to
matched inline src blocks. When `org-src-fontify-natively' is
set, `org-src-font-lock-fontify-block' to the content.
(org-fontify-inline-src-results): Search for {{{results(...)}}}
constructs. Then when `org-inline-src-prettify-results` is non-nil,
mimic prettify-symbols and use `compose-region' to substitute visually
simpler elements for the wrapping around the value.
* lisp/org.el (org-set-font-lock-defaults): Add
`org-fontify-inline-src-blocks' to `org-font-lock-extra-keywords', which
is locally bound inside `org-set-font-lock-defaults'.
(org-inline-src-fontify-max-length, org-inline-src-prettify-results):
Create variables for use in the new inline src/result fontification
methods in org-src.el.
---
lisp/org-src.el | 73 +++++++++++++++++++++++++++++++++++++++++++++++++
lisp/org.el | 21 +++++++++++++-
2 files changed, 93 insertions(+), 1 deletion(-)
diff --git a/lisp/org-src.el b/lisp/org-src.el
index 20acee4e6..9119372d7 100644
--- a/lisp/org-src.el
+++ b/lisp/org-src.el
@@ -624,6 +624,79 @@ (defun org-src-font-lock-fontify-block (lang start end)
'(font-lock-fontified t fontified t font-lock-multiline t))
(set-buffer-modified-p modified)))))
+(defun org-fontify-inline-src-blocks (limit)
+ "Try to apply `org-fontify-inline-src-blocks-1'."
+ (condition-case nil
+ (org-fontify-inline-src-blocks-1 limit)
+ (error (message "Org mode fontification error in %S at %d"
+ (current-buffer)
+ (line-number-at-pos)))))
+
+(defun org-fontify-inline-src-blocks-1 (limit)
+ "Fontify inline src_LANG blocks, from `point' up to LIMIT."
+ (let ((case-fold-search t)
+ (initial-point (point)))
+ (while (re-search-forward "\\_<src_\\([^ \t\n[{]+\\)[{[]?" limit t) ; copied from `org-element-inline-src-block-parser'
+ (let ((beg (match-beginning 0))
+ (lang-beg (match-beginning 1))
+ (lang-end (match-end 1))
+ pt)
+ (remove-text-properties beg lang-end '(face nil))
+ (font-lock-append-text-property lang-beg lang-end 'face 'org-meta-line)
+ (font-lock-append-text-property beg lang-beg 'face 'shadow)
+ (font-lock-append-text-property beg lang-end 'face 'org-block)
+ (setq pt (goto-char lang-end))
+ ;; `org-element--parse-paired-brackets' doesn't take a limit, so to
+ ;; prevent it searching the entire rest of the buffer we temporarily
+ ;; narrow the active region.
+ (save-restriction
+ (narrow-to-region beg (min (point-max)
+ limit
+ (+ lang-end org-inline-src-fontify-max-length)))
+ (when (ignore-errors (org-element--parse-paired-brackets ?\[))
+ (remove-text-properties pt (point) '(face nil))
+ (font-lock-append-text-property pt (point) 'face 'org-block)
+ (setq pt (point)))
+ (when (ignore-errors (org-element--parse-paired-brackets ?\{))
+ (remove-text-properties pt (point) '(face nil))
+ (font-lock-append-text-property pt (1+ pt) 'face '(org-block shadow))
+ (unless (= (1+ pt) (1- (point)))
+ (if org-src-fontify-natively
+ (org-src-font-lock-fontify-block
+ (buffer-substring-no-properties lang-beg lang-end)
+ (1+ pt) (1- (point)))
+ (font-lock-append-text-property (1+ pt) (1- (point)) 'face 'org-block)))
+ (font-lock-append-text-property (1- (point)) (point)'face '(org-block shadow))
+ (setq pt (point))))
+ (when (and org-inline-src-prettify-results
+ (re-search-forward "\\= {{{results(" limit t))
+ (font-lock-append-text-property pt (1+ pt) 'face 'org-block)
+ (goto-char pt))))
+ (when org-inline-src-prettify-results
+ (goto-char initial-point)
+ (org-fontify-inline-src-results limit))))
+
+(defun org-fontify-inline-src-results (limit)
+ "Apply prettify-symbols modifications to inline results blocks.
+Performed according to `org-inline-src-prettify-results'."
+ (while (re-search-forward "{{{results(\\(.+?\\))}}}" limit t)
+ (remove-list-of-text-properties (match-beginning 0) (point)
+ '(composition
+ prettify-symbols-start
+ prettify-symbols-end))
+ (font-lock-append-text-property (match-beginning 0) (match-end 0)
+ 'face 'org-block)
+ (let ((start (match-beginning 0)) (end (match-beginning 1)))
+ (with-silent-modifications
+ (compose-region start end (if (eq org-inline-src-prettify-results t)
+ "⟨" (car org-inline-src-prettify-results)))
+ (add-text-properties start end `(prettify-symbols-start ,start prettify-symbols-end ,end))))
+ (let ((start (match-end 1)) (end (point)))
+ (with-silent-modifications
+ (compose-region start end (if (eq org-inline-src-prettify-results t)
+ "⟩" (cdr org-inline-src-prettify-results)))
+ (add-text-properties start end `(prettify-symbols-start ,start prettify-symbols-end ,end))))))
+
\f
;;; Escape contents
diff --git a/lisp/org.el b/lisp/org.el
index 04da1afcd..f4d069504 100644
--- a/lisp/org.el
+++ b/lisp/org.el
@@ -5223,6 +5223,23 @@ (defcustom org-allow-promoting-top-level-subtree nil
:version "24.1"
:group 'org-appearance)
+(defcustom org-inline-src-fontify-max-length 200
+ "Maximum content length of an inline src block that will be fontified.
+This is only relevant when `org-src-fontify-natively' is t."
+ :type 'integer
+ :package-version '(Org . "9.5")
+ :group 'org-appearance
+ :group 'org-babel)
+
+(defcustom org-inline-src-prettify-results t
+ "Whether to use (ab)use prettify-symbols-mode on {{{results(...)}}}.
+Either t or a cons cell of strings which are used as substitutions
+for the start and end of inline results, respectively."
+ :type '(choice boolean (cons string string))
+ :package-version '(Org . "9.5")
+ :group 'org-appearance
+ :group 'org-babel)
+
(defun org-fontify-meta-lines-and-blocks (limit)
(condition-case nil
(org-fontify-meta-lines-and-blocks-1 limit)
@@ -5720,7 +5737,9 @@ (defun org-set-font-lock-defaults ()
org-comment-string)
'(9 'org-special-keyword t))
;; Blocks and meta lines
- '(org-fontify-meta-lines-and-blocks))))
+ '(org-fontify-meta-lines-and-blocks)
+ ;; Inline src blocks
+ '(org-fontify-inline-src-blocks))))
(setq org-font-lock-extra-keywords (delq nil org-font-lock-extra-keywords))
(run-hooks 'org-font-lock-set-keywords-hook)
;; Now set the full font-lock-keywords
--
2.30.1
^ permalink raw reply related [relevance 42%]
* [PATCH] Improve documentation of #+startup keyword
@ 2021-03-19 12:03 77% Timothy
0 siblings, 0 replies; 74+ results
From: Timothy @ 2021-03-19 12:03 UTC (permalink / raw)
To: org-mode-email
[-- Attachment #1: Type: text/plain, Size: 478 bytes --]
Hello all,
I was talking to someone who was finding the behaviour of `#+startup'
confusing, and they managed to work out a table summarising the
behaviour.
I think that this would be a good addition to the manual, and help
clarify the behaviour --- so I've prepared a little patch to the manual.
I notice that there are some `#+cindex' lines lying around but I'm not
quite sure what they do. Please let me know if I should add anything
like that etc.
All the best,
*Timothy*
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-doc-org-manual.org-clarify-startup-behaviour.patch --]
[-- Type: text/x-patch, Size: 1720 bytes --]
From 8ff32dfbf2e14419eb542d58ee39c1545f34354b Mon Sep 17 00:00:00 2001
From: TEC <tec@tecosaur.com>
Date: Fri, 19 Mar 2021 20:01:03 +0800
Subject: [PATCH] doc/org-manual.org: clarify #+startup behaviour
* doc/org-manual.org: clarify the behaviour that each #+startup option
implies.
---
doc/org-manual.org | 13 +++++++++++++
1 file changed, 13 insertions(+)
diff --git a/doc/org-manual.org b/doc/org-manual.org
index e8763ff17..a005cce52 100644
--- a/doc/org-manual.org
+++ b/doc/org-manual.org
@@ -598,6 +598,19 @@ *** Initial visibility
is requested by startup options and =VISIBILITY= properties in
individual entries.
+A summary of each keyword's behaviour may be seen in the table below.
+| #+startup: | org-startup-folded | VISIBILITY | shows headings | shows body |
+|---------------------+--------------------+------------+----------------+------------|
+| overview (or fold) | t | x | lvl1 | |
+| content | 'content | x | all | |
+| show2levels | 'show2levels | x | lvl1-2 | |
+| ... | 'showNlevels | x | lvl1-N | |
+| show5levels | 'show5levels | x | lvl1-5 | |
+| showall (or nofold) | nil | x | all | x |
+| showeverything | 'showeverything | | all | x |
+| <DEFAULT> | 'showeverything | | all | x |
+
+
*** Catching invisible edits
:PROPERTIES:
:DESCRIPTION: Preventing mistakes when editing invisible parts.
--
2.30.1
^ permalink raw reply related [relevance 77%]
* Re: [PATCH] Async session eval (2nd attempt)
@ 2021-03-01 6:22 92% ` Timothy
0 siblings, 0 replies; 74+ results
From: Timothy @ 2021-03-01 6:22 UTC (permalink / raw)
To: Jack Kamm; +Cc: emacs-orgmode
Jack Kamm <jackkamm@gmail.com> writes:
> I'm attaching an updated patch rebased on master.
Fantastic. Thanks for doing this.
> ob-python session blocks don't use "return", so this should just be:
Ah, oops 😛
> The non-session case is substantially different, and I think it would
> probably require a separate implementation.
I see, fair enough. I haven't looked at the internals myself.
> One possible approach would be to modify ob-eval.el, so that
> org-babel--shell-command-on-region uses make-process instead of
> process-file.
>
> I agree it would be nice to have, but it would take a bit of work to
> figure it all out, and there is already ob-async.el [1] that implements
> non-session async for all languages. (I wish it could be brought into
> org-mode, but it probably can't, because it depends on the external
> async.el.)
Interesting that you use a different async method.
>> p.s. After this is merged, it would be great to see support for other
>> languages grow :)
>
> I also have an async implementation for ob-R that's ready after this is
> merged :)
Brilliant! I can't wait.
I know Bastien has found himself unfortunately busy as of late (which I
think is why he's looking to have someone else take over as project
lead), but please don't be disheartened by the slow progress with
getting this merged! I can assure you that quite a few people are
watching this with keen interest :)
All the best,
Timothy.
^ permalink raw reply [relevance 92%]
* Re: [PATCH] tweaks to ox-html style
@ 2021-02-14 4:36 93% ` Timothy
0 siblings, 0 replies; 74+ results
From: Timothy @ 2021-02-14 4:36 UTC (permalink / raw)
To: Christian Moe; +Cc: Tim Cross, emacs-orgmode
Regarding any use case which would benefit from turning
org-html-style-default into a defcustom, IMO there are two:
+ When you don't want to have to add a #+HTML_HEAD to every file you
export
+ When you want to include a long inline style (my use case)
--
Timothy
^ permalink raw reply [relevance 93%]
* Re: [PATCH] tweaks to ox-html style
@ 2021-02-12 18:22 92% ` Timothy
0 siblings, 0 replies; 74+ results
From: Timothy @ 2021-02-12 18:22 UTC (permalink / raw)
To: Jens Lechtenboerger; +Cc: Kyle Meyer, org-mode-email
Jens Lechtenboerger <lechten@wi.uni-muenster.de> writes:
> On 2021-02-12, Jens Lechtenboerger wrote:
>
>> I do not know why the CDATA lines exist. I don’t see a reason to
>> keep them (patch 0001), but that might be a lack of understanding on
>> my part.
>
> OK, that is probably for XHTML, where < and & are only allowed
> inside CDATA sections.
>
> Timothy, did you try to validate XHTML output?
If you look at the commit message for 001, you can see the following:
> remove CDATA strings, as they are now
> considered obsolete --- see
> https://developer.mozilla.org/en-US/docs/Web/API/CDATASection#specifications
Does that page clear things up for you?
I did a bit more googling and found
https://dev.w3.org/html5/html-polyglot/html-polyglot.html#bib-HTML5
which mentions CDATA:
> The CDATA code is then seen as text by the HTML parser (and can thus
> interfere with the scripting or styling language!), while the XML
> parser sees the content as text without markup semantics.
In other words, CDATA allows you to keep XML comparability, but now
breaks strict HTML comparability. IMO the latter is much more important
for an org-html export.
--
Timothy
^ permalink raw reply [relevance 92%]
* Re: [PATCH] tweaks to ox-html style
@ 2021-02-12 18:16 88% ` Timothy
2 siblings, 0 replies; 74+ results
From: Timothy @ 2021-02-12 18:16 UTC (permalink / raw)
To: Jens Lechtenboerger; +Cc: Kyle Meyer, org-mode-email
Jens Lechtenboerger <lechten@wi.uni-muenster.de> writes:
> I do not know why the CDATA lines exist. I don’t see a reason to
> keep them (patch 0001), but that might be a lack of understanding on
> my part.
I'll cover this in my reply to your follow-up.
> Patch 0003 is about whitespace fixes.
>
> Patches 0002, 0004, 0005 change defconst styling. I don’t have a
> strong opinion here. However, if they are changed now, what about
> turning them into defcustoms? Then each of us would be entitled to
> their own opinion ;)
>
> The docstring for org-html-head-include-default-style says that
> org-html-style-default (a defconst proposed to be changed here)
> should not be changed. Why not?
The defconst is left a defsconst because I don't really know why it is
one, and when I don't know why something is the way it is, I try to leave
it alone. In my own config I actually overwrite it, but oh well.
I'm guessing this is just a case of "User beware, this contains
important stuff to have Org look reasonable. Don't remove that."
Perhaps this should be a defcustom? It would be good to hear from
someone else on this. If this ends up being a hold up though I'd rather
resolve this separately.
--
Timothy.
^ permalink raw reply [relevance 88%]
* Re: [PATCH] document org-html-meta-tags
@ 2021-02-09 19:51 93% ` Timothy
0 siblings, 0 replies; 74+ results
From: Timothy @ 2021-02-09 19:51 UTC (permalink / raw)
To: Kyle Meyer; +Cc: org-mode-email
Kyle Meyer <kyle@kyleam.com> writes:
> Thanks. Pushed (5b0eb9aad) with the tweaks mentioned below.
Great!
>> Oh, by the way --- [...]
>
> Sorry, I don't have the bandwidth at the moment for that discussion.
No problem, I mainly wanted to put the thought /somewhere/ --- which I
have now done :)
--
Timothy.
^ permalink raw reply [relevance 93%]
* [PATCH] document org-html-meta-tags
@ 2021-01-31 19:04 60% TEC
0 siblings, 1 reply; 74+ results
From: TEC @ 2021-01-31 19:04 UTC (permalink / raw)
To: org-mode-email, Kyle Meyer
[-- Attachment #1: Type: text/plain, Size: 88 bytes --]
Hi Kyle, All,
As requested, here's a small documentation entry for the new setting :)
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-manual-news-Document-org-html-meta-tags.patch --]
[-- Type: text/x-patch, Size: 1613 bytes --]
From 636330422eef59f448a60b933be9a55818888af9 Mon Sep 17 00:00:00 2001
From: TEC <tec@tecosaur.com>
Date: Mon, 1 Feb 2021 03:01:12 +0800
Subject: [PATCH] manual, news: Document org-html-meta-tags
* docs/org-manual.org, etc/ORG-NEWS: Document and announce the new
setting `org-html-meta-tags'.
---
doc/org-manual.org | 3 +++
etc/ORG-NEWS | 7 +++++++
2 files changed, 10 insertions(+)
diff --git a/doc/org-manual.org b/doc/org-manual.org
index 20a0d1d7a..a82b0f9a4 100644
--- a/doc/org-manual.org
+++ b/doc/org-manual.org
@@ -12624,6 +12624,9 @@ settings described in [[*Export Settings]].
multiple =DESCRIPTION= lines. The exporter takes care of wrapping
the lines properly.
+ The exporter includes a number of other meta tags, which can be customised
+ by modifying ~org-html-meta-tags~.
+
- =HTML_DOCTYPE= ::
#+cindex: @samp{HTML_DOCTYPE}, keyword
diff --git a/etc/ORG-NEWS b/etc/ORG-NEWS
index ba769224f..a2f1667b2 100644
--- a/etc/ORG-NEWS
+++ b/etc/ORG-NEWS
@@ -81,6 +81,13 @@ block. ~org-babel-latex-preamble~, ~org-babel-latex-begin-env~ and
the user to specify the preamble and code that preceedes and proceeds
the contents of the source block.
+*** New option ~org-html-meta-tags~ allows for HTML meta tags customisation
+
+New variable ~org-html-meta-tags~ makes it possible to customise the
+=<meta>= tags used in an HTML export. Accepts either a static list of
+values, or a function that generates such a list (see
+~org-html-meta-tags-default~ as an example of the latter).
+
** New features
*** =ob-python= improvements to =:return= header argument
--
2.30.0
[-- Attachment #3: Type: text/plain, Size: 1335 bytes --]
Oh, by the way --- regarding your commits on commit/code conventions.
With (what seem like to me) quite a few "best practices" to keep in
mind, has anyone created a patch lint tool to make sure they're being
adhered to? I imagine it wouldn't be hard to check for blank lines in
functions or commits without a sentence case commit message.
For someone who isn't aware of all the nits that may be picked :P this
would be rather useful, and far better than a list of guidelines (I'm
not actually any such list though).
Oh dear, I sense myself diverging but I'm now considering the
possibility of setting up CI for the org-mode repo to check for as many
such concerns as we can to try to make the code base more consistent
(from my experience, every time I'm told to check for a specific issue
in a patch I wrote, I find many other matches in the file).
Perhaps it could be possible to hook up the ML to a process that runs
the CI script on a copy of Org with the patch(es) applied and replies
with any errors that may come up?
I should really stop here, before I really get going and start
explaining why I think it could be good to migrate to Gitea and other
ideas :P
Feel free to disregard my ramble, I've just been accumulating thoughts
on the state of Org development, and a few are liable to spill out.
All the best,
Timothy
^ permalink raw reply related [relevance 60%]
* Re: [PATCH] Enhance org-html--build-meta-info
@ 2021-01-21 5:55 93% ` TEC
0 siblings, 0 replies; 74+ results
From: TEC @ 2021-01-21 5:55 UTC (permalink / raw)
To: Kyle Meyer; +Cc: org-mode-email
Kyle Meyer <kyle@kyleam.com> writes:
> I've applied this (a8df7670c) with two minor changes (shown in the diff
> at end): s/with with/with/ in a docstring and move an element to its own
> line to avoid the warning from lisp-mode's lisp--match-hidden-arg.
Thanks :)
> This thread has gone on long enough that I'll avoid requesting changes
> for convention/style nits, but some things to keep in mind for future
> patches:
I'll try to keep these in mind in future. Might there be a Worg page or
something listing all of these little things so I don't keep on being
told of them a few at a time as I violate them?
> Also, it'd be good for this to be accompanied by a NEWS entry. I'd
> appreciated if that were sent in a separate thread, though. For some
> reason I haven't debugged, my usual MUA can't load this thread.
Will do 👍.
--
Timothy
^ permalink raw reply [relevance 93%]
* Re: [PATCH] tweaks to ox-html style
2021-01-20 10:46 39% [PATCH] TEC
@ 2021-01-20 11:00 93% ` TEC
1 sibling, 0 replies; 74+ results
From: TEC @ 2021-01-20 11:00 UTC (permalink / raw)
To: org-mode-email
Gah! I left the subject as a placeholder [shame emoji].
Apologies for that.
Why do I always seem to notice these things as the Email is sending...
--
Timothy
TEC <tecosaur@gmail.com> writes:
> Hi All,
>
> This is just some tweaks to the styling in ox-html that I think may
> appeal (and prevent ridiculously long lines on non-small displays, which
> are an issue for legibility).
>
> I also took the opportunity to remove the (obsolete) CDATA strings and
> make the CSS more consistently formatted. If you don't want this to
> get its own commit, please just squash it.
>
> Style changes:
> - Restrict max content width, and centre
> - tweak styling of source code blocks
>
> I took some screenshots (1440p monitor, 120% zoom, Firefox).
> Current: https://0x0.st/-iW9.png
> This patch: https://0x0.st/-iWp.png
>
> All the best,
>
> Timothy.
^ permalink raw reply [relevance 93%]
* [PATCH]
@ 2021-01-20 10:46 39% TEC
2021-01-20 11:00 93% ` [PATCH] tweaks to ox-html style TEC
0 siblings, 2 replies; 74+ results
From: TEC @ 2021-01-20 10:46 UTC (permalink / raw)
To: org-mode-email
[-- Attachment #1: Type: text/plain, Size: 615 bytes --]
Hi All,
This is just some tweaks to the styling in ox-html that I think may
appeal (and prevent ridiculously long lines on non-small displays, which
are an issue for legibility).
I also took the opportunity to remove the (obsolete) CDATA strings and
make the CSS more consistently formatted. If you don't want this to
get its own commit, please just squash it.
Style changes:
- Restrict max content width, and centre
- tweak styling of source code blocks
I took some screenshots (1440p monitor, 120% zoom, Firefox).
Current: https://0x0.st/-iW9.png
This patch: https://0x0.st/-iWp.png
All the best,
Timothy.
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-ox-html.el-remove-CDATA-strings.patch --]
[-- Type: text/x-patch, Size: 2679 bytes --]
From 635bd77cd7a2dc55cc0705c5bbf2e11091bfbaf3 Mon Sep 17 00:00:00 2001
From: TEC <tec@tecosaur.com>
Date: Wed, 20 Jan 2021 16:37:29 +0800
Subject: [PATCH 1/5] ox-html.el: remove CDATA strings
* lisp/ox-html.el (org-html-scripts, org-html-style-default,
org-html-infojs-template): remove CDATA strings, as they are now
considered obsolete --- see
https://developer.mozilla.org/en-US/docs/Web/API/CDATASection#specifications
---
lisp/ox-html.el | 8 --------
1 file changed, 8 deletions(-)
diff --git a/lisp/ox-html.el b/lisp/ox-html.el
index 03145e35c..0cf3425df 100644
--- a/lisp/ox-html.el
+++ b/lisp/ox-html.el
@@ -234,7 +234,6 @@ property on the headline itself.")
(defconst org-html-scripts
"<script type=\"text/javascript\">
// @license magnet:?xt=urn:btih:e95b018ef3580986a04669f1b5879592219e2a7a&dn=public-domain.txt Public Domain
-<!--/*--><![CDATA[/*><!--*/
function CodeHighlightOn(elem, id)
{
var target = document.getElementById(id);
@@ -251,14 +250,12 @@ property on the headline itself.")
target.classList.remove(\"code-highlighted\");
}
}
- /*]]>*///-->
// @license-end
</script>"
"Basic JavaScript that is needed by HTML files produced by Org mode.")
(defconst org-html-style-default
"<style type=\"text/css\">
- <!--/*--><![CDATA[/*><!--*/
.title { text-align: center;
margin-bottom: .2em; }
.subtitle { text-align: center;
@@ -439,7 +436,6 @@ property on the headline itself.")
.org-info-js_search-highlight
{ background-color: #ffff00; color: #000000; font-weight: bold; }
.org-svg { width: 90%; }
- /*]]>*/-->
</style>"
"The default style specification for exported HTML files.
You can use `org-html-head' and `org-html-head-extra' to add to
@@ -515,10 +511,8 @@ means to use the maximum value consistent with other options."
<script type=\"text/javascript\">
// @license magnet:?xt=urn:btih:1f739d935676111cfff4b4693e3816e664797050&dn=gpl-3.0.txt GPL-v3-or-Later
-<!--/*--><![CDATA[/*><!--*/
%MANAGER_OPTIONS
org_html_manager.setup(); // activate after the parameters are set
-/*]]>*///-->
// @license-end
</script>"
"The template for the export style additions when org-info.js is used.
@@ -1448,13 +1442,11 @@ done, timestamp, timestamp-kwd, tag, target.
For example, a valid value would be:
<style type=\"text/css\">
- /*<![CDATA[*/
p { font-weight: normal; color: gray; }
h1 { color: black; }
.title { text-align: center; }
.todo, .timestamp-kwd { color: red; }
.done { color: green; }
- /*]]>*/
</style>
If you want to refer to an external style, use something like
--
2.29.2
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #3: 0002-ox-html.el-limit-maximum-content-width-and-center.patch --]
[-- Type: text/x-patch, Size: 895 bytes --]
From 5bef340093102936efe831f85fabdb589070ce43 Mon Sep 17 00:00:00 2001
From: TEC <tec@tecosaur.com>
Date: Wed, 20 Jan 2021 16:45:20 +0800
Subject: [PATCH 2/5] ox-html.el: limit maximum content width and center
* lisp/ox-html.el (org-html-style-default): To improve the appearance
and legibility on larger screens:
1. Limit the content width to the upper end of advised line width, ~140
characters.
2. Centre the content.
---
lisp/ox-html.el | 1 +
1 file changed, 1 insertion(+)
diff --git a/lisp/ox-html.el b/lisp/ox-html.el
index 0cf3425df..9bbfad678 100644
--- a/lisp/ox-html.el
+++ b/lisp/ox-html.el
@@ -256,6 +256,7 @@ property on the headline itself.")
(defconst org-html-style-default
"<style type=\"text/css\">
+ #content { max-width: 60em; margin: auto; }
.title { text-align: center;
margin-bottom: .2em; }
.subtitle { text-align: center;
--
2.29.2
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #4: 0003-ox-html.el-format-CSS-more-consistently.patch --]
[-- Type: text/x-patch, Size: 2278 bytes --]
From 2c0f648ae87e789f21c24b645b2049f05d084799 Mon Sep 17 00:00:00 2001
From: TEC <tec@tecosaur.com>
Date: Wed, 20 Jan 2021 17:58:38 +0800
Subject: [PATCH 3/5] ox-html.el: format CSS more consistently
* lisp/ox-html.el (org-html-style-default): Format CSS declarations more
consistently.
---
lisp/ox-html.el | 26 +++++++++-----------------
1 file changed, 9 insertions(+), 17 deletions(-)
diff --git a/lisp/ox-html.el b/lisp/ox-html.el
index 9bbfad678..14f023e87 100644
--- a/lisp/ox-html.el
+++ b/lisp/ox-html.el
@@ -257,8 +257,8 @@ property on the headline itself.")
(defconst org-html-style-default
"<style type=\"text/css\">
#content { max-width: 60em; margin: auto; }
- .title { text-align: center;
- margin-bottom: .2em; }
+ .title { text-align: center;
+ margin-bottom: .2em; }
.subtitle { text-align: center;
font-size: medium;
font-weight: bold;
@@ -282,13 +282,11 @@ property on the headline itself.")
padding: 8pt;
font-family: monospace;
overflow: auto;
- margin: 1.2em;
- }
+ margin: 1.2em; }
pre.src {
position: relative;
overflow: auto;
- padding-top: 1.2em;
- }
+ padding-top: 1.2em; }
pre.src:before {
display: none;
position: absolute;
@@ -296,8 +294,7 @@ property on the headline itself.")
top: -10px;
right: 10px;
padding: 3px;
- border: 1px solid black;
- }
+ border: 1px solid black; }
pre.src:hover:before { display: inline; margin-top: 14px;}
/* Languages per Org manual */
pre.src-asymptote:before { content: 'Asymptote'; }
@@ -410,22 +407,17 @@ property on the headline itself.")
.equation-container {
display: table;
text-align: center;
- width: 100%;
- }
- .equation {
- vertical-align: middle;
- }
+ width: 100%; }
+ .equation { vertical-align: middle; }
.equation-label {
display: table-cell;
text-align: right;
- vertical-align: middle;
- }
+ vertical-align: middle; }
.inlinetask {
padding: 10px;
border: 2px solid gray;
margin: 10px;
- background: #ffffcc;
- }
+ background: #ffffcc; }
#org-div-home-and-up
{ text-align: right; font-size: 70%; white-space: nowrap; }
textarea { overflow-x: auto; }
--
2.29.2
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #5: 0004-ox-html.el-tweak-styling-of-src-blocks.patch --]
[-- Type: text/x-patch, Size: 1617 bytes --]
From c341a278291be3c6a4fcca77fede476a04417a69 Mon Sep 17 00:00:00 2001
From: TEC <tec@tecosaur.com>
Date: Wed, 20 Jan 2021 18:17:06 +0800
Subject: [PATCH 4/5] ox-html.el: tweak styling of src blocks
* lisp/ox-html.el (org-html-style-default): Apply the following changes
to the styling of src blocks:
- Remove box shadow.
- Lighten border.
- Add very light grey background colour.
- Make lang label (visible on hover) less obtrusive by removing border.
---
lisp/ox-html.el | 16 ++++++++--------
1 file changed, 8 insertions(+), 8 deletions(-)
diff --git a/lisp/ox-html.el b/lisp/ox-html.el
index 14f023e87..e83648726 100644
--- a/lisp/ox-html.el
+++ b/lisp/ox-html.el
@@ -277,24 +277,24 @@ property on the headline itself.")
#postamble p, #preamble p { font-size: 90%; margin: .2em; }
p.verse { margin-left: 3%; }
pre {
- border: 1px solid #ccc;
- box-shadow: 3px 3px 3px #eee;
+ border: 1px solid #e6e6e6;
+ border-radius: 3px;
+ background-color: #f2f2f2;
padding: 8pt;
font-family: monospace;
overflow: auto;
margin: 1.2em; }
pre.src {
position: relative;
- overflow: auto;
- padding-top: 1.2em; }
+ overflow: auto; }
pre.src:before {
display: none;
position: absolute;
- background-color: white;
- top: -10px;
- right: 10px;
+ top: -8px;
+ right: 12px;
padding: 3px;
- border: 1px solid black; }
+ color: #555;
+ background-color: #f2f2f299; }
pre.src:hover:before { display: inline; margin-top: 14px;}
/* Languages per Org manual */
pre.src-asymptote:before { content: 'Asymptote'; }
--
2.29.2
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #6: 0005-ox-html.el-add-lang-label-to-authinfo-src-blocks.patch --]
[-- Type: text/x-patch, Size: 931 bytes --]
From b8eb175c709ad9cff259b4326d8c9a344a4381ba Mon Sep 17 00:00:00 2001
From: TEC <tec@tecosaur.com>
Date: Wed, 20 Jan 2021 18:22:58 +0800
Subject: [PATCH 5/5] ox-html.el: add lang label to authinfo src blocks
* lisp/ox-html.el (org-html-style-default): `authinfo-mode' is defined
in Emacs 27. As such, in the CSS add an "Authinfo" lang label to
authinfo src blocks.
---
lisp/ox-html.el | 1 +
1 file changed, 1 insertion(+)
diff --git a/lisp/ox-html.el b/lisp/ox-html.el
index e83648726..e5e82a5d8 100644
--- a/lisp/ox-html.el
+++ b/lisp/ox-html.el
@@ -299,6 +299,7 @@ property on the headline itself.")
/* Languages per Org manual */
pre.src-asymptote:before { content: 'Asymptote'; }
pre.src-awk:before { content: 'Awk'; }
+ pre.src-authinfo::before { content: 'Authinfo'; }
pre.src-C:before { content: 'C'; }
/* pre.src-C++ doesn't work in CSS */
pre.src-clojure:before { content: 'Clojure'; }
--
2.29.2
^ permalink raw reply related [relevance 39%]
* Ready to merge! Re: [PATCH] Enhance org-html--build-meta-info
@ 2021-01-14 16:02 93% ` TEC
0 siblings, 0 replies; 74+ results
From: TEC @ 2021-01-14 16:02 UTC (permalink / raw)
To: Jens Lechtenboerger; +Cc: Bastien, org-mode-email
This thread has dragged on ages, and if no-one else is following this
chain I wouldn't blame them in the slightest.
To help indicate that this is actually ready (at last) now, I'm just
going to add that info the the subject line in the hope it helps Bastien
or any others notice that this is actually good to go now :)
--
Timothy
Jens Lechtenboerger <lechten@wi.uni-muenster.de> writes:
> This looks fine to me. Many thanks!
>
> Best wishes
> Jens
^ permalink raw reply [relevance 93%]
* Re: [PATCH] Enhance org-html--build-meta-info
2021-01-10 20:36 93% ` TEC
@ 2021-01-14 10:36 34% ` TEC
0 siblings, 2 replies; 74+ results
From: TEC @ 2021-01-14 10:36 UTC (permalink / raw)
To: Jens Lechtenboerger; +Cc: Bastien, org-mode-email
[-- Attachment #1: Type: text/plain, Size: 311 bytes --]
TEC <tecosaur@gmail.com> writes:
>> Sorry, I still see the flycheck warning and "&amp;" for "&".
> Maybe I accidently sent you the old patches? I'll check tomorrow.
Hah, I check and guess what I see? The changes were unstaged 😂.
Sorry about that, here's an actual revision.
--
Timothy
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-lisp-ox-html.el-make-html-meta-tag-builder-nicer.patch --]
[-- Type: text/x-patch, Size: 6034 bytes --]
From 3ab8b4f108c8cfa4b0bf11842907c31846832f1a Mon Sep 17 00:00:00 2001
From: TEC <tec@tecosaur.com>
Date: Mon, 14 Dec 2020 17:41:33 +0800
Subject: [PATCH 1/2] lisp/ox-html.el: make html meta tag builder nicer
* lisp/ox-html.el (org-html--build-meta-info): Multi-line repeated
structure extracted to new function `org-html--build-meta-entry'.
The keyword value formatting is changed from `org-export-data' to
`org-html-encode-plain-text' to avoid potentially nesting HTML tags in
meta tags and the <title> element, which would violate W3C.
---
lisp/ox-html.el | 118 ++++++++++++++++++++++++------------------------
1 file changed, 60 insertions(+), 58 deletions(-)
diff --git a/lisp/ox-html.el b/lisp/ox-html.el
index 03145e35c..f18f8a2ef 100644
--- a/lisp/ox-html.el
+++ b/lisp/ox-html.el
@@ -1835,78 +1835,80 @@ INFO is a plist used as a communication channel."
\f
;;; Template
+(defun org-html--build-meta-entry
+ (label identity &optional content-format &rest content-formatters)
+ "Build a meta tag using the provided information.
+
+Construct <meta> tag of form <meta LABEL=\"IDENTITY\" />, or when CONTENT-FORMAT
+is present: <meta LABEL=\"IDENTITY\" content=\"{content}\" />
+
+Here {content} is determined by applying any CONTENT-FORMATTERS to the
+CONTENT-FORMAT and encoding the result as plain text."
+ (concat "<meta "
+ (format "%s=\"%s" label identity)
+ (when content-format
+ (concat "\" content=\""
+ (replace-regexp-in-string
+ "\"" """
+ (org-html-encode-plain-text
+ (if content-formatters
+ (apply #'format content-format content-formatters)
+ content-format)))))
+ "\" />\n"))
+
(defun org-html--build-meta-info (info)
"Return meta tags for exported document.
INFO is a plist used as a communication channel."
- (let* ((protect-string
- (lambda (str)
- (replace-regexp-in-string
- "\"" """ (org-html-encode-plain-text str))))
- (title (org-export-data (plist-get info :title) info))
- ;; Set title to an invisible character instead of leaving it
- ;; empty, which is invalid.
- (title (if (org-string-nw-p title) title "‎"))
- (author (and (plist-get info :with-author)
- (let ((auth (plist-get info :author)))
+ (let* ((title (org-html-plain-text
+ (org-element-interpret-data (plist-get info :title)) info))
+ ;; Set title to an invisible character instead of leaving it
+ ;; empty, which is invalid.
+ (title (if (org-string-nw-p title) title "‎"))
+ (author (and (plist-get info :with-author)
+ (let ((auth (plist-get info :author)))
;; Return raw Org syntax.
- (and auth (org-element-interpret-data auth)))))
- (description (plist-get info :description))
- (keywords (plist-get info :keywords))
- (charset (or (and org-html-coding-system
- (fboundp 'coding-system-get)
- (coding-system-get org-html-coding-system
- 'mime-charset))
- "iso-8859-1")))
+ (and auth (org-html-plain-text
+ (org-element-interpret-data auth) info)))))
+ (charset (or (and org-html-coding-system
+ (fboundp 'coding-system-get)
+ (symbol-name
+ (coding-system-get org-html-coding-system
+ 'mime-charset)))
+ "iso-8859-1")))
(concat
(when (plist-get info :time-stamp-file)
(format-time-string
(concat "<!-- "
(plist-get info :html-metadata-timestamp-format)
" -->\n")))
- (format
- (if (org-html-html5-p info)
- (org-html-close-tag "meta" "charset=\"%s\"" info)
- (org-html-close-tag
- "meta" "http-equiv=\"Content-Type\" content=\"text/html;charset=%s\""
- info))
- charset) "\n"
+
+ (if (org-html-html5-p info)
+ (org-html--build-meta-entry "charset" charset)
+ (org-html--build-meta-entry "http-equiv" "Content-Type"
+ (concat "text/html;charset=" charset)))
+
(let ((viewport-options
(cl-remove-if-not (lambda (cell) (org-string-nw-p (cadr cell)))
(plist-get info :html-viewport))))
- (and viewport-options
- (concat
- (org-html-close-tag
- "meta"
- (format "name=\"viewport\" content=\"%s\""
- (mapconcat
- (lambda (elm) (format "%s=%s" (car elm) (cadr elm)))
- viewport-options ", "))
- info)
- "\n")))
+ (if viewport-options
+ (org-html--build-meta-entry "name" "viewport"
+ (mapconcat
+ (lambda (elm)
+ (format "%s=%s" (car elm) (cadr elm)))
+ viewport-options ", "))))
+
(format "<title>%s</title>\n" title)
- (org-html-close-tag "meta" "name=\"generator\" content=\"Org mode\"" info)
- "\n"
- (and (org-string-nw-p author)
- (concat
- (org-html-close-tag "meta"
- (format "name=\"author\" content=\"%s\""
- (funcall protect-string author))
- info)
- "\n"))
- (and (org-string-nw-p description)
- (concat
- (org-html-close-tag "meta"
- (format "name=\"description\" content=\"%s\"\n"
- (funcall protect-string description))
- info)
- "\n"))
- (and (org-string-nw-p keywords)
- (concat
- (org-html-close-tag "meta"
- (format "name=\"keywords\" content=\"%s\""
- (funcall protect-string keywords))
- info)
- "\n")))))
+
+ (when (org-string-nw-p author)
+ (org-html--build-meta-entry "name" "author" author))
+
+ (when (org-string-nw-p (plist-get info :description))
+ (org-html--build-meta-entry "name" "description" (plist-get info :description)))
+
+ (when (org-string-nw-p (plist-get info :keywords))
+ (org-html--build-meta-entry "keywords" (plist-get info :keywords)))
+
+ (org-html--build-meta-entry "name" "generator" "Org Mode"))))
(defun org-html--build-head (info)
"Return information for the <head>..</head> of the HTML output.
--
2.29.2
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #3: 0002-lisp-ox-html.el-make-html-meta-tags-customizable.patch --]
[-- Type: text/x-patch, Size: 4357 bytes --]
From 6fa5075b04f6996571f8ac5fc19ef8780e9272da Mon Sep 17 00:00:00 2001
From: TEC <tec@tecosaur.com>
Date: Mon, 14 Dec 2020 17:50:15 +0800
Subject: [PATCH 2/2] lisp/ox-html.el: make html meta tags customizable
* lisp/ox-html.el (org-html-meta-tags): Introduce this as a new option
which can be modified to set the meta tags added in HTML exports.
(org-html--build-meta-info): Make use of `org-html-meta-tags' instead of
hardcoded meta tags. This is leveraging the earlier restructuring of
`org-html--build-meta-info' into a much DRYer form, such that this
modification has a negligible impact on complexity and readability.
---
lisp/ox-html.el | 59 ++++++++++++++++++++++++++++++++++++-------------
1 file changed, 44 insertions(+), 15 deletions(-)
diff --git a/lisp/ox-html.el b/lisp/ox-html.el
index f18f8a2ef..bd2ca1753 100644
--- a/lisp/ox-html.el
+++ b/lisp/ox-html.el
@@ -1425,6 +1425,23 @@ not be modified."
;;;; Template :: Styles
+(defcustom org-html-meta-tags #'org-html-meta-tags-default
+ "Form that is used to produce meta tags in the HTML head.
+
+Can be a list where each item is a list of arguments to be passed
+to `org-html--build-meta-entry'. Any nil items are ignored.
+
+Also accept a function which gives such a list when called with with
+a single argument (INFO, a communication plist)."
+ :group 'org-export-html
+ :package-version '(Org . "9.5")
+ :type '(choice
+ (repeat
+ (list (string :tag "Meta label")
+ (string :tag "label value")
+ (string :tag "Content value")))
+ function))
+
(defcustom org-html-head-include-default-style t
"Non-nil means include the default style in exported HTML files.
The actual style is defined in `org-html-style-default' and
@@ -1835,6 +1852,28 @@ INFO is a plist used as a communication channel."
\f
;;; Template
+(defun org-html-meta-tags-default (info)
+ "A default value for `org-html-meta-tags'.
+
+Generate a list items, each of which is a list of arguments that can
+be passed to `org-html--build-meta-entry', to generate meta tags to be
+included in the HTML head.
+
+Use document's plist INFO to derive relevant information for the tags."
+ (let ((author (and (plist-get info :with-author)
+ (let ((auth (plist-get info :author)))
+ ;; Return raw Org syntax.
+ (and auth (org-element-interpret-data auth))))))
+ (list
+ (when (org-string-nw-p author)
+ (list "name" "author" author))
+ (when (org-string-nw-p (plist-get info :description))
+ (list "name" "description"
+ (plist-get info :description)))
+ (when (org-string-nw-p (plist-get info :keywords))
+ (list "name" "keywords" (plist-get info :keywords)))
+ '("name" "generator" "Org Mode"))))
+
(defun org-html--build-meta-entry
(label identity &optional content-format &rest content-formatters)
"Build a meta tag using the provided information.
@@ -1864,11 +1903,6 @@ INFO is a plist used as a communication channel."
;; Set title to an invisible character instead of leaving it
;; empty, which is invalid.
(title (if (org-string-nw-p title) title "‎"))
- (author (and (plist-get info :with-author)
- (let ((auth (plist-get info :author)))
- ;; Return raw Org syntax.
- (and auth (org-html-plain-text
- (org-element-interpret-data auth) info)))))
(charset (or (and org-html-coding-system
(fboundp 'coding-system-get)
(symbol-name
@@ -1899,16 +1933,11 @@ INFO is a plist used as a communication channel."
(format "<title>%s</title>\n" title)
- (when (org-string-nw-p author)
- (org-html--build-meta-entry "name" "author" author))
-
- (when (org-string-nw-p (plist-get info :description))
- (org-html--build-meta-entry "name" "description" (plist-get info :description)))
-
- (when (org-string-nw-p (plist-get info :keywords))
- (org-html--build-meta-entry "keywords" (plist-get info :keywords)))
-
- (org-html--build-meta-entry "name" "generator" "Org Mode"))))
+ (mapconcat
+ (lambda (args) (apply #'org-html--build-meta-entry args))
+ (delq nil (if (functionp org-html-meta-tags)
+ (funcall org-html-meta-tags info)
+ org-html-meta-tags)) ""))))
(defun org-html--build-head (info)
"Return information for the <head>..</head> of the HTML output.
--
2.29.2
^ permalink raw reply related [relevance 34%]
* Re: [PATCH] Enhance org-html--build-meta-info
@ 2021-01-10 20:36 93% ` TEC
2021-01-14 10:36 34% ` TEC
0 siblings, 1 reply; 74+ results
From: TEC @ 2021-01-10 20:36 UTC (permalink / raw)
To: Jens Lechtenboerger; +Cc: Bastien, org-mode-email
Jens Lechtenboerger <lechten@wi.uni-muenster.de> writes:
> Sorry, I still see the flycheck warning and "&amp;" for "&".
Maybe I accidently sent you the old patches? I'll check tomorrow.
--
Timothy.
^ permalink raw reply [relevance 93%]
* Re: [PATCH] Enhance org-html--build-meta-info
@ 2021-01-10 15:52 34% ` TEC
0 siblings, 1 reply; 74+ results
From: TEC @ 2021-01-10 15:52 UTC (permalink / raw)
To: Jens Lechtenboerger; +Cc: Bastien, org-mode-email
[-- Attachment #1: Type: text/plain, Size: 557 bytes --]
Jens Lechtenboerger <lechten@wi.uni-muenster.de> writes:
> On line 1432 I get this suggestion from flycheck:
> There should be two spaces after a period (emacs-lisp-checkdoc)
>
> More importantly, I just realized that for author information,
> org-html-plain-text is applied twice, leading to "&amp;" when
> translating "&". (Once inside org-html-meta-tags-default, then in
> org-html--build-meta-entry.) This should not happen.
>
> Best wishes
> Jens
Fixed. [exhales]
Thanks for consistently getting back to me on this patch Jens :)
--
Timothy
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-lisp-ox-html.el-make-html-meta-tag-builder-nicer.patch --]
[-- Type: text/x-patch, Size: 6030 bytes --]
From 3ab8b4f108c8cfa4b0bf11842907c31846832f1a Mon Sep 17 00:00:00 2001
From: TEC <tec@tecosaur.com>
Date: Mon, 14 Dec 2020 17:41:33 +0800
Subject: [PATCH 1/2] lisp/ox-html.el: make html meta tag builder nicer
* lisp/ox-html.el (org-html--build-meta-info): Multi-line repeated
structure extracted to new function `org-html--build-meta-entry'.
The keyword value formatting is changed from `org-export-data' to
`org-html-encode-plain-text' to avoid potentially nesting HTML tags in
meta tags and the <title> element, which would violate W3C.
---
lisp/ox-html.el | 118 ++++++++++++++++++++++++------------------------
1 file changed, 60 insertions(+), 58 deletions(-)
diff --git a/lisp/ox-html.el b/lisp/ox-html.el
index 03145e3..f18f8a2 100644
--- a/lisp/ox-html.el
+++ b/lisp/ox-html.el
@@ -1835,78 +1835,80 @@ INFO is a plist used as a communication channel."
\f
;;; Template
+(defun org-html--build-meta-entry
+ (label identity &optional content-format &rest content-formatters)
+ "Build a meta tag using the provided information.
+
+Construct <meta> tag of form <meta LABEL=\"IDENTITY\" />, or when CONTENT-FORMAT
+is present: <meta LABEL=\"IDENTITY\" content=\"{content}\" />
+
+Here {content} is determined by applying any CONTENT-FORMATTERS to the
+CONTENT-FORMAT and encoding the result as plain text."
+ (concat "<meta "
+ (format "%s=\"%s" label identity)
+ (when content-format
+ (concat "\" content=\""
+ (replace-regexp-in-string
+ "\"" """
+ (org-html-encode-plain-text
+ (if content-formatters
+ (apply #'format content-format content-formatters)
+ content-format)))))
+ "\" />\n"))
+
(defun org-html--build-meta-info (info)
"Return meta tags for exported document.
INFO is a plist used as a communication channel."
- (let* ((protect-string
- (lambda (str)
- (replace-regexp-in-string
- "\"" """ (org-html-encode-plain-text str))))
- (title (org-export-data (plist-get info :title) info))
- ;; Set title to an invisible character instead of leaving it
- ;; empty, which is invalid.
- (title (if (org-string-nw-p title) title "‎"))
- (author (and (plist-get info :with-author)
- (let ((auth (plist-get info :author)))
+ (let* ((title (org-html-plain-text
+ (org-element-interpret-data (plist-get info :title)) info))
+ ;; Set title to an invisible character instead of leaving it
+ ;; empty, which is invalid.
+ (title (if (org-string-nw-p title) title "‎"))
+ (author (and (plist-get info :with-author)
+ (let ((auth (plist-get info :author)))
;; Return raw Org syntax.
- (and auth (org-element-interpret-data auth)))))
- (description (plist-get info :description))
- (keywords (plist-get info :keywords))
- (charset (or (and org-html-coding-system
- (fboundp 'coding-system-get)
- (coding-system-get org-html-coding-system
- 'mime-charset))
- "iso-8859-1")))
+ (and auth (org-html-plain-text
+ (org-element-interpret-data auth) info)))))
+ (charset (or (and org-html-coding-system
+ (fboundp 'coding-system-get)
+ (symbol-name
+ (coding-system-get org-html-coding-system
+ 'mime-charset)))
+ "iso-8859-1")))
(concat
(when (plist-get info :time-stamp-file)
(format-time-string
(concat "<!-- "
(plist-get info :html-metadata-timestamp-format)
" -->\n")))
- (format
- (if (org-html-html5-p info)
- (org-html-close-tag "meta" "charset=\"%s\"" info)
- (org-html-close-tag
- "meta" "http-equiv=\"Content-Type\" content=\"text/html;charset=%s\""
- info))
- charset) "\n"
+
+ (if (org-html-html5-p info)
+ (org-html--build-meta-entry "charset" charset)
+ (org-html--build-meta-entry "http-equiv" "Content-Type"
+ (concat "text/html;charset=" charset)))
+
(let ((viewport-options
(cl-remove-if-not (lambda (cell) (org-string-nw-p (cadr cell)))
(plist-get info :html-viewport))))
- (and viewport-options
- (concat
- (org-html-close-tag
- "meta"
- (format "name=\"viewport\" content=\"%s\""
- (mapconcat
- (lambda (elm) (format "%s=%s" (car elm) (cadr elm)))
- viewport-options ", "))
- info)
- "\n")))
+ (if viewport-options
+ (org-html--build-meta-entry "name" "viewport"
+ (mapconcat
+ (lambda (elm)
+ (format "%s=%s" (car elm) (cadr elm)))
+ viewport-options ", "))))
+
(format "<title>%s</title>\n" title)
- (org-html-close-tag "meta" "name=\"generator\" content=\"Org mode\"" info)
- "\n"
- (and (org-string-nw-p author)
- (concat
- (org-html-close-tag "meta"
- (format "name=\"author\" content=\"%s\""
- (funcall protect-string author))
- info)
- "\n"))
- (and (org-string-nw-p description)
- (concat
- (org-html-close-tag "meta"
- (format "name=\"description\" content=\"%s\"\n"
- (funcall protect-string description))
- info)
- "\n"))
- (and (org-string-nw-p keywords)
- (concat
- (org-html-close-tag "meta"
- (format "name=\"keywords\" content=\"%s\""
- (funcall protect-string keywords))
- info)
- "\n")))))
+
+ (when (org-string-nw-p author)
+ (org-html--build-meta-entry "name" "author" author))
+
+ (when (org-string-nw-p (plist-get info :description))
+ (org-html--build-meta-entry "name" "description" (plist-get info :description)))
+
+ (when (org-string-nw-p (plist-get info :keywords))
+ (org-html--build-meta-entry "keywords" (plist-get info :keywords)))
+
+ (org-html--build-meta-entry "name" "generator" "Org Mode"))))
(defun org-html--build-head (info)
"Return information for the <head>..</head> of the HTML output.
--
2.29.2
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #3: 0002-lisp-ox-html.el-make-html-meta-tags-customizable.patch --]
[-- Type: text/x-patch, Size: 4414 bytes --]
From f3cecaa0db74665a8fe971f3103b2d40874d97c7 Mon Sep 17 00:00:00 2001
From: TEC <tec@tecosaur.com>
Date: Mon, 14 Dec 2020 17:50:15 +0800
Subject: [PATCH 2/2] lisp/ox-html.el: make html meta tags customizable
* lisp/ox-html.el (org-html-meta-tags): Introduce this as a new option
which can be modified to set the meta tags added in HTML exports.
(org-html--build-meta-info): Make use of `org-html-meta-tags' instead of
hardcoded meta tags. This is leveraging the earlier restructuring of
`org-html--build-meta-info' into a much DRYer form, such that this
modification has a negligible impact on complexity and readability.
---
lisp/ox-html.el | 60 ++++++++++++++++++++++++++++++++++++-------------
1 file changed, 45 insertions(+), 15 deletions(-)
diff --git a/lisp/ox-html.el b/lisp/ox-html.el
index f18f8a2..ab03046 100644
--- a/lisp/ox-html.el
+++ b/lisp/ox-html.el
@@ -1425,6 +1425,23 @@ not be modified."
;;;; Template :: Styles
+(defcustom org-html-meta-tags #'org-html-meta-tags-default
+ "Form that is used to produce meta tags in the HTML head.
+
+Can be a list where each item is a list of arguments to be passed
+to `org-html--build-meta-entry'. Any nil items are ignored.
+
+Also accept a function which gives such a list when called with with
+a single argument (INFO, a communication plist)."
+ :group 'org-export-html
+ :package-version '(Org . "9.5")
+ :type '(choice
+ (repeat
+ (list (string :tag "Meta label")
+ (string :tag "label value")
+ (string :tag "Content value")))
+ function))
+
(defcustom org-html-head-include-default-style t
"Non-nil means include the default style in exported HTML files.
The actual style is defined in `org-html-style-default' and
@@ -1835,6 +1852,29 @@ INFO is a plist used as a communication channel."
\f
;;; Template
+(defun org-html-meta-tags-default (info)
+ "A default value for `org-html-meta-tags'.
+
+Generate a list items, each of which is a list of arguments that can
+be passed to `org-html--build-meta-entry', to generate meta tags to be
+included in the HTML head.
+
+Use document's plist INFO to derive relevant information for the tags."
+ (let ((author (and (plist-get info :with-author)
+ (let ((auth (plist-get info :author)))
+ ;; Return raw Org syntax.
+ (and auth (org-html-plain-text
+ (org-element-interpret-data auth) info))))))
+ (list
+ (when (org-string-nw-p author)
+ (list "name" "author" author))
+ (when (org-string-nw-p (plist-get info :description))
+ (list "name" "description"
+ (plist-get info :description)))
+ (when (org-string-nw-p (plist-get info :keywords))
+ (list "name" "keywords" (plist-get info :keywords)))
+ '("name" "generator" "Org Mode"))))
+
(defun org-html--build-meta-entry
(label identity &optional content-format &rest content-formatters)
"Build a meta tag using the provided information.
@@ -1864,11 +1904,6 @@ INFO is a plist used as a communication channel."
;; Set title to an invisible character instead of leaving it
;; empty, which is invalid.
(title (if (org-string-nw-p title) title "‎"))
- (author (and (plist-get info :with-author)
- (let ((auth (plist-get info :author)))
- ;; Return raw Org syntax.
- (and auth (org-html-plain-text
- (org-element-interpret-data auth) info)))))
(charset (or (and org-html-coding-system
(fboundp 'coding-system-get)
(symbol-name
@@ -1899,16 +1934,11 @@ INFO is a plist used as a communication channel."
(format "<title>%s</title>\n" title)
- (when (org-string-nw-p author)
- (org-html--build-meta-entry "name" "author" author))
-
- (when (org-string-nw-p (plist-get info :description))
- (org-html--build-meta-entry "name" "description" (plist-get info :description)))
-
- (when (org-string-nw-p (plist-get info :keywords))
- (org-html--build-meta-entry "keywords" (plist-get info :keywords)))
-
- (org-html--build-meta-entry "name" "generator" "Org Mode"))))
+ (mapconcat
+ (lambda (args) (apply #'org-html--build-meta-entry args))
+ (delq nil (if (functionp org-html-meta-tags)
+ (funcall org-html-meta-tags info)
+ org-html-meta-tags)) ""))))
(defun org-html--build-head (info)
"Return information for the <head>..</head> of the HTML output.
--
2.29.2
^ permalink raw reply related [relevance 34%]
* Re: [PATCH] Enhance org-html--build-meta-info
@ 2021-01-03 17:17 34% ` TEC
0 siblings, 1 reply; 74+ results
From: TEC @ 2021-01-03 17:17 UTC (permalink / raw)
To: Jens Lechtenboerger; +Cc: Bastien, org-mode-email
[-- Attachment #1: Type: text/plain, Size: 460 bytes --]
Jens Lechtenboerger <lechten@wi.uni-muenster.de> writes:
> org-html--build-meta-entry and org-html--build-meta-info include some long lines.
Hehe. We've had a lot of back-and-forth haven't we.
At least it feels like it's coming to a close now.
> For org-html-meta-tags-default, I suggest this as last line for the doc
> string (typos, active voice):
> Use document's plist INFO to derive relevant information for the tags.
Sounds good. Done.
--
Timothy
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-lisp-ox-html.el-make-html-meta-tag-builder-nicer.patch --]
[-- Type: text/x-patch, Size: 6030 bytes --]
From f3f7325ea77cc443387e69f65e899a9537606d80 Mon Sep 17 00:00:00 2001
From: TEC <tec@tecosaur.com>
Date: Mon, 14 Dec 2020 17:41:33 +0800
Subject: [PATCH 1/2] lisp/ox-html.el: make html meta tag builder nicer
* lisp/ox-html.el (org-html--build-meta-info): Multi-line repeated
structure extracted to new function `org-html--build-meta-entry'.
The keyword value formatting is changed from `org-export-data' to
`org-html-encode-plain-text' to avoid potentially nesting HTML tags in
meta tags and the <title> element, which would violate W3C.
---
lisp/ox-html.el | 118 ++++++++++++++++++++++++------------------------
1 file changed, 60 insertions(+), 58 deletions(-)
diff --git a/lisp/ox-html.el b/lisp/ox-html.el
index 03145e3..f18f8a2 100644
--- a/lisp/ox-html.el
+++ b/lisp/ox-html.el
@@ -1835,78 +1835,80 @@ INFO is a plist used as a communication channel."
\f
;;; Template
+(defun org-html--build-meta-entry
+ (label identity &optional content-format &rest content-formatters)
+ "Build a meta tag using the provided information.
+
+Construct <meta> tag of form <meta LABEL=\"IDENTITY\" />, or when CONTENT-FORMAT
+is present: <meta LABEL=\"IDENTITY\" content=\"{content}\" />
+
+Here {content} is determined by applying any CONTENT-FORMATTERS to the
+CONTENT-FORMAT and encoding the result as plain text."
+ (concat "<meta "
+ (format "%s=\"%s" label identity)
+ (when content-format
+ (concat "\" content=\""
+ (replace-regexp-in-string
+ "\"" """
+ (org-html-encode-plain-text
+ (if content-formatters
+ (apply #'format content-format content-formatters)
+ content-format)))))
+ "\" />\n"))
+
(defun org-html--build-meta-info (info)
"Return meta tags for exported document.
INFO is a plist used as a communication channel."
- (let* ((protect-string
- (lambda (str)
- (replace-regexp-in-string
- "\"" """ (org-html-encode-plain-text str))))
- (title (org-export-data (plist-get info :title) info))
- ;; Set title to an invisible character instead of leaving it
- ;; empty, which is invalid.
- (title (if (org-string-nw-p title) title "‎"))
- (author (and (plist-get info :with-author)
- (let ((auth (plist-get info :author)))
+ (let* ((title (org-html-plain-text
+ (org-element-interpret-data (plist-get info :title)) info))
+ ;; Set title to an invisible character instead of leaving it
+ ;; empty, which is invalid.
+ (title (if (org-string-nw-p title) title "‎"))
+ (author (and (plist-get info :with-author)
+ (let ((auth (plist-get info :author)))
;; Return raw Org syntax.
- (and auth (org-element-interpret-data auth)))))
- (description (plist-get info :description))
- (keywords (plist-get info :keywords))
- (charset (or (and org-html-coding-system
- (fboundp 'coding-system-get)
- (coding-system-get org-html-coding-system
- 'mime-charset))
- "iso-8859-1")))
+ (and auth (org-html-plain-text
+ (org-element-interpret-data auth) info)))))
+ (charset (or (and org-html-coding-system
+ (fboundp 'coding-system-get)
+ (symbol-name
+ (coding-system-get org-html-coding-system
+ 'mime-charset)))
+ "iso-8859-1")))
(concat
(when (plist-get info :time-stamp-file)
(format-time-string
(concat "<!-- "
(plist-get info :html-metadata-timestamp-format)
" -->\n")))
- (format
- (if (org-html-html5-p info)
- (org-html-close-tag "meta" "charset=\"%s\"" info)
- (org-html-close-tag
- "meta" "http-equiv=\"Content-Type\" content=\"text/html;charset=%s\""
- info))
- charset) "\n"
+
+ (if (org-html-html5-p info)
+ (org-html--build-meta-entry "charset" charset)
+ (org-html--build-meta-entry "http-equiv" "Content-Type"
+ (concat "text/html;charset=" charset)))
+
(let ((viewport-options
(cl-remove-if-not (lambda (cell) (org-string-nw-p (cadr cell)))
(plist-get info :html-viewport))))
- (and viewport-options
- (concat
- (org-html-close-tag
- "meta"
- (format "name=\"viewport\" content=\"%s\""
- (mapconcat
- (lambda (elm) (format "%s=%s" (car elm) (cadr elm)))
- viewport-options ", "))
- info)
- "\n")))
+ (if viewport-options
+ (org-html--build-meta-entry "name" "viewport"
+ (mapconcat
+ (lambda (elm)
+ (format "%s=%s" (car elm) (cadr elm)))
+ viewport-options ", "))))
+
(format "<title>%s</title>\n" title)
- (org-html-close-tag "meta" "name=\"generator\" content=\"Org mode\"" info)
- "\n"
- (and (org-string-nw-p author)
- (concat
- (org-html-close-tag "meta"
- (format "name=\"author\" content=\"%s\""
- (funcall protect-string author))
- info)
- "\n"))
- (and (org-string-nw-p description)
- (concat
- (org-html-close-tag "meta"
- (format "name=\"description\" content=\"%s\"\n"
- (funcall protect-string description))
- info)
- "\n"))
- (and (org-string-nw-p keywords)
- (concat
- (org-html-close-tag "meta"
- (format "name=\"keywords\" content=\"%s\""
- (funcall protect-string keywords))
- info)
- "\n")))))
+
+ (when (org-string-nw-p author)
+ (org-html--build-meta-entry "name" "author" author))
+
+ (when (org-string-nw-p (plist-get info :description))
+ (org-html--build-meta-entry "name" "description" (plist-get info :description)))
+
+ (when (org-string-nw-p (plist-get info :keywords))
+ (org-html--build-meta-entry "keywords" (plist-get info :keywords)))
+
+ (org-html--build-meta-entry "name" "generator" "Org Mode"))))
(defun org-html--build-head (info)
"Return information for the <head>..</head> of the HTML output.
--
2.29.2
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #3: 0002-lisp-ox-html.el-make-html-meta-tags-customizable.patch --]
[-- Type: text/x-patch, Size: 4414 bytes --]
From 7389693850ceb7a20eb38b563e6770ef68fd1196 Mon Sep 17 00:00:00 2001
From: TEC <tec@tecosaur.com>
Date: Mon, 14 Dec 2020 17:50:15 +0800
Subject: [PATCH 2/2] lisp/ox-html.el: make html meta tags customizable
* lisp/ox-html.el (org-html-meta-tags): Introduce this as a new option
which can be modified to set the meta tags added in HTML exports.
(org-html--build-meta-info): Make use of `org-html-meta-tags' instead of
hardcoded meta tags. This is leveraging the earlier restructuring of
`org-html--build-meta-info' into a much DRYer form, such that this
modification has a negligible impact on complexity and readability.
---
lisp/ox-html.el | 60 ++++++++++++++++++++++++++++++++++++-------------
1 file changed, 45 insertions(+), 15 deletions(-)
diff --git a/lisp/ox-html.el b/lisp/ox-html.el
index f18f8a2..ab03046 100644
--- a/lisp/ox-html.el
+++ b/lisp/ox-html.el
@@ -1425,6 +1425,23 @@ not be modified."
;;;; Template :: Styles
+(defcustom org-html-meta-tags #'org-html-meta-tags-default
+ "Form that is used to produce meta tags in the HTML head.
+
+Can be a list where each item is a list of arguments to be passed
+to `org-html--build-meta-entry'. Any nil items are ignored.
+
+Also accept a function which gives such a list when called with with
+a single argument (INFO, a communication plist)."
+ :group 'org-export-html
+ :package-version '(Org . "9.5")
+ :type '(choice
+ (repeat
+ (list (string :tag "Meta label")
+ (string :tag "label value")
+ (string :tag "Content value")))
+ function))
+
(defcustom org-html-head-include-default-style t
"Non-nil means include the default style in exported HTML files.
The actual style is defined in `org-html-style-default' and
@@ -1835,6 +1852,29 @@ INFO is a plist used as a communication channel."
\f
;;; Template
+(defun org-html-meta-tags-default (info)
+ "A default value for `org-html-meta-tags'.
+
+Generate a list items, each of which is a list of arguments that can
+be passed to `org-html--build-meta-entry', to generate meta tags to be
+included in the HTML head.
+
+Use document's plist INFO to derive relevant information for the tags."
+ (let ((author (and (plist-get info :with-author)
+ (let ((auth (plist-get info :author)))
+ ;; Return raw Org syntax.
+ (and auth (org-html-plain-text
+ (org-element-interpret-data auth) info))))))
+ (list
+ (when (org-string-nw-p author)
+ (list "name" "author" author))
+ (when (org-string-nw-p (plist-get info :description))
+ (list "name" "description"
+ (plist-get info :description)))
+ (when (org-string-nw-p (plist-get info :keywords))
+ (list "name" "keywords" (plist-get info :keywords)))
+ '("name" "generator" "Org Mode"))))
+
(defun org-html--build-meta-entry
(label identity &optional content-format &rest content-formatters)
"Build a meta tag using the provided information.
@@ -1864,11 +1904,6 @@ INFO is a plist used as a communication channel."
;; Set title to an invisible character instead of leaving it
;; empty, which is invalid.
(title (if (org-string-nw-p title) title "‎"))
- (author (and (plist-get info :with-author)
- (let ((auth (plist-get info :author)))
- ;; Return raw Org syntax.
- (and auth (org-html-plain-text
- (org-element-interpret-data auth) info)))))
(charset (or (and org-html-coding-system
(fboundp 'coding-system-get)
(symbol-name
@@ -1899,16 +1934,11 @@ INFO is a plist used as a communication channel."
(format "<title>%s</title>\n" title)
- (when (org-string-nw-p author)
- (org-html--build-meta-entry "name" "author" author))
-
- (when (org-string-nw-p (plist-get info :description))
- (org-html--build-meta-entry "name" "description" (plist-get info :description)))
-
- (when (org-string-nw-p (plist-get info :keywords))
- (org-html--build-meta-entry "keywords" (plist-get info :keywords)))
-
- (org-html--build-meta-entry "name" "generator" "Org Mode"))))
+ (mapconcat
+ (lambda (args) (apply #'org-html--build-meta-entry args))
+ (delq nil (if (functionp org-html-meta-tags)
+ (funcall org-html-meta-tags info)
+ org-html-meta-tags)) ""))))
(defun org-html--build-head (info)
"Return information for the <head>..</head> of the HTML output.
--
2.29.2
^ permalink raw reply related [relevance 34%]
* Re: [PATCH] Enhance org-html--build-meta-info
@ 2021-01-03 14:48 33% ` TEC
0 siblings, 1 reply; 74+ results
From: TEC @ 2021-01-03 14:48 UTC (permalink / raw)
To: Jens Lechtenboerger; +Cc: Bastien, org-mode-email
[-- Attachment #1: Type: text/plain, Size: 638 bytes --]
Jens Lechtenboerger <lechten@wi.uni-muenster.de> writes:
> The doc strings of org-html-meta-tags and org-html-meta-tags-default
> need to be updated, they still mention author and title.
Ah, yep. Fixed.
> Also, please try checkdoc ;)
Ahhh yes. Checkdoc, my old ~enemy~ /friend/.
I may have shied away from using this because of the litany of issues it
raises for the file. How I'd love to see a PR making the Org codebase
more consistently follow these guidelines. Then we could potentially do
something like integrate CI into the patch acception workflow.
Enough of that digression, as before: patches attached :)
--
Timothy.
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-lisp-ox-html.el-make-html-meta-tag-builder-nicer.patch --]
[-- Type: text/x-patch, Size: 5982 bytes --]
From de74dcbd51703439faafe96cbc1c60965f064eaa Mon Sep 17 00:00:00 2001
From: TEC <tec@tecosaur.com>
Date: Mon, 14 Dec 2020 17:41:33 +0800
Subject: [PATCH 1/2] lisp/ox-html.el: make html meta tag builder nicer
* lisp/ox-html.el (org-html--build-meta-info): Multi-line repeated
structure extracted to new function `org-html--build-meta-entry'.
The keyword value formatting is changed from `org-export-data' to
`org-html-encode-plain-text' to avoid potentially nesting HTML tags in
meta tags and the <title> element, which would violate W3C.
---
lisp/ox-html.el | 116 ++++++++++++++++++++++++------------------------
1 file changed, 58 insertions(+), 58 deletions(-)
diff --git a/lisp/ox-html.el b/lisp/ox-html.el
index 03145e3..4d277a2 100644
--- a/lisp/ox-html.el
+++ b/lisp/ox-html.el
@@ -1835,78 +1835,78 @@ INFO is a plist used as a communication channel."
\f
;;; Template
+(defun org-html--build-meta-entry (label identity &optional content-format &rest content-formatters)
+ "Build a meta tag using the provided information.
+
+Construct <meta> tag of form <meta LABEL=\"IDENTITY\" />, or when CONTENT-FORMAT is present:
+<meta LABEL=\"IDENTITY\" content=\"{content}\" />
+
+Here {content} is determined by applying any CONTENT-FORMATTERS to the CONTENT-FORMAT and encoding
+the result as plain text."
+ (concat "<meta "
+ (format "%s=\"%s" label identity)
+ (when content-format
+ (concat "\" content=\""
+ (replace-regexp-in-string
+ "\"" """
+ (org-html-encode-plain-text
+ (if content-formatters
+ (apply #'format content-format content-formatters)
+ content-format)))))
+ "\" />\n"))
+
(defun org-html--build-meta-info (info)
"Return meta tags for exported document.
INFO is a plist used as a communication channel."
- (let* ((protect-string
- (lambda (str)
- (replace-regexp-in-string
- "\"" """ (org-html-encode-plain-text str))))
- (title (org-export-data (plist-get info :title) info))
- ;; Set title to an invisible character instead of leaving it
- ;; empty, which is invalid.
- (title (if (org-string-nw-p title) title "‎"))
- (author (and (plist-get info :with-author)
- (let ((auth (plist-get info :author)))
+ (let* ((title (org-html-plain-text
+ (org-element-interpret-data (plist-get info :title)) info))
+ ;; Set title to an invisible character instead of leaving it
+ ;; empty, which is invalid.
+ (title (if (org-string-nw-p title) title "‎"))
+ (author (and (plist-get info :with-author)
+ (let ((auth (plist-get info :author)))
;; Return raw Org syntax.
- (and auth (org-element-interpret-data auth)))))
- (description (plist-get info :description))
- (keywords (plist-get info :keywords))
- (charset (or (and org-html-coding-system
- (fboundp 'coding-system-get)
- (coding-system-get org-html-coding-system
- 'mime-charset))
- "iso-8859-1")))
+ (and auth (org-html-plain-text
+ (org-element-interpret-data auth) info)))))
+ (charset (or (and org-html-coding-system
+ (fboundp 'coding-system-get)
+ (symbol-name
+ (coding-system-get org-html-coding-system
+ 'mime-charset)))
+ "iso-8859-1")))
(concat
(when (plist-get info :time-stamp-file)
(format-time-string
(concat "<!-- "
(plist-get info :html-metadata-timestamp-format)
" -->\n")))
- (format
- (if (org-html-html5-p info)
- (org-html-close-tag "meta" "charset=\"%s\"" info)
- (org-html-close-tag
- "meta" "http-equiv=\"Content-Type\" content=\"text/html;charset=%s\""
- info))
- charset) "\n"
+
+ (if (org-html-html5-p info)
+ (org-html--build-meta-entry "charset" charset)
+ (org-html--build-meta-entry "http-equiv" "Content-Type"
+ (concat "text/html;charset=" charset)))
+
(let ((viewport-options
(cl-remove-if-not (lambda (cell) (org-string-nw-p (cadr cell)))
(plist-get info :html-viewport))))
- (and viewport-options
- (concat
- (org-html-close-tag
- "meta"
- (format "name=\"viewport\" content=\"%s\""
- (mapconcat
- (lambda (elm) (format "%s=%s" (car elm) (cadr elm)))
- viewport-options ", "))
- info)
- "\n")))
+ (if viewport-options
+ (org-html--build-meta-entry "name" "viewport"
+ (mapconcat
+ (lambda (elm) (format "%s=%s" (car elm) (cadr elm)))
+ viewport-options ", "))))
+
(format "<title>%s</title>\n" title)
- (org-html-close-tag "meta" "name=\"generator\" content=\"Org mode\"" info)
- "\n"
- (and (org-string-nw-p author)
- (concat
- (org-html-close-tag "meta"
- (format "name=\"author\" content=\"%s\""
- (funcall protect-string author))
- info)
- "\n"))
- (and (org-string-nw-p description)
- (concat
- (org-html-close-tag "meta"
- (format "name=\"description\" content=\"%s\"\n"
- (funcall protect-string description))
- info)
- "\n"))
- (and (org-string-nw-p keywords)
- (concat
- (org-html-close-tag "meta"
- (format "name=\"keywords\" content=\"%s\""
- (funcall protect-string keywords))
- info)
- "\n")))))
+
+ (when (org-string-nw-p author)
+ (org-html--build-meta-entry "name" "author" author))
+
+ (when (org-string-nw-p (plist-get info :description))
+ (org-html--build-meta-entry "name" "description" (plist-get info :description)))
+
+ (when (org-string-nw-p (plist-get info :keywords))
+ (org-html--build-meta-entry "keywords" (plist-get info :keywords)))
+
+ (org-html--build-meta-entry "name" "generator" "Org Mode"))))
(defun org-html--build-head (info)
"Return information for the <head>..</head> of the HTML output.
--
2.29.2
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #3: 0002-lisp-ox-html.el-make-html-meta-tags-customizable.patch --]
[-- Type: text/x-patch, Size: 4420 bytes --]
From 50e8aacca5c92dcf8b2044cdaf70738e1ba757a5 Mon Sep 17 00:00:00 2001
From: TEC <tec@tecosaur.com>
Date: Mon, 14 Dec 2020 17:50:15 +0800
Subject: [PATCH 2/2] lisp/ox-html.el: make html meta tags customizable
* lisp/ox-html.el (org-html-meta-tags): Introduce this as a new option
which can be modified to set the meta tags added in HTML exports.
(org-html--build-meta-info): Make use of `org-html-meta-tags' instead of
hardcoded meta tags. This is leveraging the earlier restructuring of
`org-html--build-meta-info' into a much DRYer form, such that this
modification has a negligible impact on complexity and readability.
---
lisp/ox-html.el | 60 ++++++++++++++++++++++++++++++++++++-------------
1 file changed, 45 insertions(+), 15 deletions(-)
diff --git a/lisp/ox-html.el b/lisp/ox-html.el
index 4d277a2..483ef4f 100644
--- a/lisp/ox-html.el
+++ b/lisp/ox-html.el
@@ -1425,6 +1425,23 @@ not be modified."
;;;; Template :: Styles
+(defcustom org-html-meta-tags #'org-html-meta-tags-default
+ "Form that is used to produce meta tags in the HTML head.
+
+Can be a list where each item is a list of arguments to be passed
+to `org-html--build-meta-entry'. Any nil items are ignored.
+
+Also accept a function which gives such a list when called with with
+a single argument (INFO, a communication plist)."
+ :group 'org-export-html
+ :package-version '(Org . "9.5")
+ :type '(choice
+ (repeat
+ (list (string :tag "Meta label")
+ (string :tag "label value")
+ (string :tag "Content value")))
+ function))
+
(defcustom org-html-head-include-default-style t
"Non-nil means include the default style in exported HTML files.
The actual style is defined in `org-html-style-default' and
@@ -1835,6 +1852,29 @@ INFO is a plist used as a communication channel."
\f
;;; Template
+(defun org-html-meta-tags-default (info)
+ "A default value for `org-html-meta-tags'.
+
+Generate a list items, each of which is a list of arguments that can
+be passed to `org-html--build-meta-entry', to generate meta tags to be
+included in the HTML head.
+
+The documents's plist INFO is used to derive relevent information for the tags."
+ (let ((author (and (plist-get info :with-author)
+ (let ((auth (plist-get info :author)))
+ ;; Return raw Org syntax.
+ (and auth (org-html-plain-text
+ (org-element-interpret-data auth) info))))))
+ (list
+ (when (org-string-nw-p author)
+ (list "name" "author" author))
+ (when (org-string-nw-p (plist-get info :description))
+ (list "name" "description"
+ (plist-get info :description)))
+ (when (org-string-nw-p (plist-get info :keywords))
+ (list "name" "keywords" (plist-get info :keywords)))
+ '("name" "generator" "Org Mode"))))
+
(defun org-html--build-meta-entry (label identity &optional content-format &rest content-formatters)
"Build a meta tag using the provided information.
@@ -1863,11 +1903,6 @@ INFO is a plist used as a communication channel."
;; Set title to an invisible character instead of leaving it
;; empty, which is invalid.
(title (if (org-string-nw-p title) title "‎"))
- (author (and (plist-get info :with-author)
- (let ((auth (plist-get info :author)))
- ;; Return raw Org syntax.
- (and auth (org-html-plain-text
- (org-element-interpret-data auth) info)))))
(charset (or (and org-html-coding-system
(fboundp 'coding-system-get)
(symbol-name
@@ -1897,16 +1932,11 @@ INFO is a plist used as a communication channel."
(format "<title>%s</title>\n" title)
- (when (org-string-nw-p author)
- (org-html--build-meta-entry "name" "author" author))
-
- (when (org-string-nw-p (plist-get info :description))
- (org-html--build-meta-entry "name" "description" (plist-get info :description)))
-
- (when (org-string-nw-p (plist-get info :keywords))
- (org-html--build-meta-entry "keywords" (plist-get info :keywords)))
-
- (org-html--build-meta-entry "name" "generator" "Org Mode"))))
+ (mapconcat
+ (lambda (args) (apply #'org-html--build-meta-entry args))
+ (delq nil (if (functionp org-html-meta-tags)
+ (funcall org-html-meta-tags info)
+ org-html-meta-tags)) ""))))
(defun org-html--build-head (info)
"Return information for the <head>..</head> of the HTML output.
--
2.29.2
^ permalink raw reply related [relevance 33%]
* Re: [PATCH] A proposal to add LaTeX attributes to verse blocks
@ 2021-01-03 13:08 79% ` TEC
0 siblings, 0 replies; 74+ results
From: TEC @ 2021-01-03 13:08 UTC (permalink / raw)
To: Juan Manuel Macías; +Cc: orgmode
Juan Manuel Macías <maciaschain@posteo.net> writes:
> Thank you very much for your response and your comments.
Seriously, thanks for the patch. I think the ML is usually a bit more
responsive, but it seems to be a bit quiet at the moment.
> I agree to name "Insert, include, etc." the attribute to include
> arbitrary LaTeX code, better than "options".
Glad my feedback seems to have gone down well :). If the only likely use
of this is adjusting the font, perhaps for the sake of consistency we
can match the behaviour of tables, which take a :font LaTeX attribute?
> Of course, I can add the necessary documentation to the files you tell
> me. As I am new to submitting patches, I don't really know how to
> proceed: do I have to send you the new version of the patch, with the
> documentation? Should I send a new email with all of it to this list?
Thanks for asking. Sometimes it seems the maintainers take the trouble of
adding an ORG-NEWS entry or minor touching ups to the patch, but I think
it's nice to leave as little for them to do as possible :)
Announce changes in: etc/ORG-NEWS
Document new/different behaviour in: doc/org-manual.org
I think Markup for /Rich Contents > Paragraphs/ may be the right place
to add a description of this functionality --- verse blocks are
discussed around line 10750.
Regarding how patches on this ML work, this is what I've observed:
- Initial version of patch submitted, with justification/explanation
- Feedback may be given
- Revisions of the patch are attached in replies to feedback
- Process repeats until everyone's happy
- Patch is merged
i.e. it all tends to happen in the same thread.
Hope this helps,
Timothy.
^ permalink raw reply [relevance 79%]
* Re: [PATCH] A proposal to add LaTeX attributes to verse blocks
@ 2021-01-03 10:25 92% ` TEC
0 siblings, 1 reply; 74+ results
From: TEC @ 2021-01-03 10:25 UTC (permalink / raw)
To: Juan Manuel Macías; +Cc: emacs-orgmode
Hi Juan,
Thanks for your patch.
This looks like a fairly sensible addition. Two comments from me:
1. I'm not sure that "options" is a good name for arbitrary LaTeX which
is included inside the verse block. Perhaps something like "insert"
or "include", etc. may be a better fit.
2. It's considered generally nice to document features like this :) The
two documents which I'd think to note this in are ORG-NEWS and the
manual (docs/manual.org).
All the best,
Timothy.
Juan Manuel Macías <maciaschain@posteo.net> writes:
> (Sorry, due to a mistake, the text of my message did not appear in my previous email)
>
> Hi,
>
> I would like to propose this patch to add some LaTeX attributes to the verse block,
> especially to be able to apply certain features from the verse.sty package, which is an
> extension (widely used in Humanities) of the standard LaTeX 'verse' environment.
>
> These attributes would be:
>
> - `:lines' to add verse numbers, according to any numbering sequence
> - `:center' to apply the optical centering of the poem, which is a typographic convention
> whereby a poem or a group of verses is centered on the page, taking the width of the
> longest verse as a reference. In fact, optical centering is the correct arrangement of
> verses in a document.
> - `:versewidth' which expects a text string that is the longest verse of the poem,
> required when applying the `:center' attribute.
>
> As I said, these three attributes require the LateX package verse.sty. A fourth `:options'
> attribute would be used to add arbitrary code within the verse environment.
>
> Consider this complete example with Shakespeare's first sonnet:
>
> #+begin_src org
> ,#+ATTR_LaTeX: :center t :options \small :lines 5
> ,#+ATTR_LaTeX: :versewidth Feed’st thy light’st flame with self-substantial fuel,
> ,#+begin_verse
> From fairest creatures we desire increase,
> That thereby beauty’s rose might never die,
> But as the riper should by time decrease,
> His tender heir mught bear his memeory:
> But thou, contracted to thine own bright eyes,
> Feed’st thy light’st flame with self-substantial fuel,
> Making a famine where abundance lies,
> Thyself thy foe, to thy sweet self too cruel.
> Thou that art now the world’s fresh ornament
> And only herald to the gaudy spring,
> Within thine own bud buriest thy content
> And, tender churl, makest waste in niggarding.
> Pity the world, or else this glutton be,
> To eat the world’s due, by the grave and thee.
> ,#+end_verse
> #+end_src
>
> when exporting to LaTeX we get:
>
> #+begin_src latex
> \settowidth{\versewidth}{Feed’st thy light’st flame with self-substantial fuel,}
> \begin{verse}[\versewidth]
> \poemlines{5}
> \small
> From fairest creatures we desire increase,\\
> That thereby beauty’s rose might never die,\\
> But as the riper should by time decrease,\\
> His tender heir mught bear his memeory:\\
> But thou, contracted to thine own bright eyes,\\
> Feed’st thy light’st flame with self-substantial fuel,\\
> Making a famine where abundance lies,\\
> Thyself thy foe, to thy sweet self too cruel.\\
> Thou that art now the world’s fresh ornament\\
> And only herald to the gaudy spring,\\
> Within thine own bud buriest thy content\\
> And, tender churl, makest waste in niggarding.\\
> Pity the world, or else this glutton be,\\
> To eat the world’s due, by the grave and thee.\\
> \end{verse}
> #+end_src
>
> In an attached image I send a screenshot with the typographic result
>
> And finally, this is the patch I would propose
>
> #+begin_src diff
> diff --git a/lisp/ox-latex.el b/lisp/ox-latex.el
> index 2a14b25d5..bc6b64e78 100644
> --- a/lisp/ox-latex.el
> +++ b/lisp/ox-latex.el
> @@ -3506,6 +3506,16 @@ channel."
> "Transcode a VERSE-BLOCK element from Org to LaTeX.
> CONTENTS is verse block contents. INFO is a plist holding
> contextual information."
> +(let*
> + ((lin (org-export-read-attribute :attr_latex verse-block :lines))
> + (opt (org-export-read-attribute :attr_latex verse-block :options))
> + (cent (org-export-read-attribute :attr_latex verse-block :center))
> + (attr (concat
> + (if cent "[\\versewidth]" "")
> + (if lin (format "\n\\poemlines{%s}" lin) "")
> + (if opt (format "\n%s" opt) "")))
> + (versewidth (org-export-read-attribute :attr_latex verse-block :versewidth))
> + (vwidth-attr (if versewidth (format "\\settowidth{\\versewidth}{%s}\n" versewidth) "")))
> (concat
> (org-latex--wrap-label
> verse-block
> @@ -3513,7 +3523,9 @@ contextual information."
> ;; character and change each white space at beginning of a line
> ;; into a space of 1 em. Also change each blank line with
> ;; a vertical space of 1 em.
> - (format "\\begin{verse}\n%s\\end{verse}"
> + (format "%s\\begin{verse}%s\n%s\\end{verse}"
> + vwidth-attr
> + attr
> (replace-regexp-in-string
> "^[ \t]+" (lambda (m) (format "\\hspace*{%dem}" (length m)))
> (replace-regexp-in-string
> @@ -3524,7 +3536,7 @@ contextual information."
> info)
> ;; Insert footnote definitions, if any, after the environment, so
> ;; the special formatting above is not applied to them.
> - (org-latex--delayed-footnotes-definitions verse-block info)))
> + (org-latex--delayed-footnotes-definitions verse-block info))))
> #+end_src
>
> Regards,
>
> Juan Manuel
^ permalink raw reply [relevance 92%]
* Re: [patch] A proposal to add LaTeX attributes to verse blocks
@ 2021-01-03 10:22 93% ` TEC
0 siblings, 0 replies; 74+ results
From: TEC @ 2021-01-03 10:22 UTC (permalink / raw)
To: Juan Manuel Macías; +Cc: emacs-orgmode
Hi Juan,
Since you've resent this in a second email, let's discuss this patch
there.
As such, I'm marking this patch as closed.
--
Timothy.
^ permalink raw reply [relevance 93%]
* Re: [PATCH] ox-md.el/preserve radio target hyperlink
@ 2021-01-03 10:11 93% ` TEC
0 siblings, 0 replies; 74+ results
From: TEC @ 2021-01-03 10:11 UTC (permalink / raw)
To: nazar.stasiv@atk.sk; +Cc: emacs-orgmode
Hi turbo.
As this appears to be an exact duplicate of your other email, I'm going
to mark this as closed and hope that any/all conversation on your patch
happens there.
--
Timothy
^ permalink raw reply [relevance 93%]
* Re: [PATCH] ox-md.el/markdown-hyperlink
@ 2021-01-03 10:06 93% ` TEC
0 siblings, 0 replies; 74+ results
From: TEC @ 2021-01-03 10:06 UTC (permalink / raw)
To: turbo.cafe@clovermail.net; +Cc: emacs-orgmode
Thanks for the patch turbo.
I was able to test this with a simple Org file, and both observed the
issue with radio targets in generated markdown files, and observed the
patch fixing it, as intended.
--
Timothy
turbo.cafe@clovermail.net <turbo.cafe@clovermail.net> writes:
> exporting to markdown loses radio target hyperlinks.
^ permalink raw reply [relevance 93%]
* Re: [PATCH] Async session eval (2nd attempt)
@ 2021-01-03 8:51 70% ` TEC
0 siblings, 1 reply; 74+ results
From: TEC @ 2021-01-03 8:51 UTC (permalink / raw)
To: Jack Kamm; +Cc: emacs-orgmode
Hi Jack,
I love the look of this! Thanks for submitting a patch.
Sorry it's taken so long for someone to take a look at it, I think a lot
of the 'main' Org people have been pretty busy over the last few months.
I just tried to give this a shot.
First up, I had to remove the ORG-NEWS part of the patch to be able to
provide it. It would be nice if you could update the patch so this
applies cleanly.
#+begin_example
error: patch failed: etc/ORG-NEWS:88
error: etc/ORG-NEWS: patch does not apply
#+end_example
To test this, after applying your patch (with ORG-NEWS removed), I
started emacs -Q, loaded Org, and opened a new file.
I was initially unable to get this to seem to work, until I changed the
:results type to "output".
See a excerpt from my test file below:
----- excerpt start -----
#+begin_src python :async :session blah :results output
from time import sleep
a=2
sleep(2)
print("Hi")
#+end_src
#+RESULTS:
: Hi
#+begin_src python :async :session blah
return(a)
#+end_src
#+RESULTS:
: /tmp/babel-62cQRX/python-EfJ4o4
#+begin_src python :async :session blah :results output
print(a)
#+end_src
#+RESULTS:
: 2
----- excerpt end -----
I'm surprised this didn't work with the non-output block though.
Other than this, I'm rather happy to see that when I tried to execute
two long running blocks at once, the second one was not executed until
the first completed :)
Finally, I see that this requires :session to be set in order to work.
Might it be possible to have this work for non-session blocks too? It
seems odd that what I'd imagine is the harder case (session blocks) is
supported, but one-shot (non-session) blocks aren't.
Thanks again for your work, and I look forward to seeing what else you
have in the future!
--
Timothy
p.s. After this is merged, it would be great to see support for other
languages grow :)
Jack Kamm <jackkamm@gmail.com> writes:
> This patch adds asynchronous evaluation for session blocks in
> Python. It also adds functionality to implement async session eval for
> other languages using ob-comint.el.
>
> To test the attached patch, add ":async" to a Python session block
> with a long computation (or "time.sleep") in it. Upon evaluation, your
> Emacs won't freeze to wait for the result -- instead, a placeholder
> will be inserted, and replaced with the true result when it's ready.
>
> I'll note how this is different from some related projects. ob-async
> implements asynchronous evaluation for Babel, but it doesn't work with
> sessions. emacs-jupyter, ein, and ob-ipython all implement
> asynchronous session evaluation, but only for Jupyter kernels. Jupyter
> is great for some cases, but sometimes I prefer to use the built-in
> org-babel languages without jupyter.
>
> The new functionality is mainly implemented in
> `org-babel-comint-async-filter', which I've defined in ob-comint.el,
> and added as a hook to `comint-output-filter-functions'. Whenever new
> output is added to the comint buffer, the filter scans for an
> indicator token (this is inspired by
> `org-babel-comint-with-output'). Upon encountering the token, the
> filter uses a regular expression to extract a UUID or temp-file
> associated with the result, then searches for the appropriate location
> to add the result to.
>
> This is my 2nd attempt at this patch [0]. I have also ported it to an
> external package [1], but would like to have this functionality in Org
> proper, to permit better code reuse between async and sync
> implementations. The external package also includes an R
> implementation that I regularly use, as well as a Ruby implementation,
> but I've left these out to keep this initial patch smaller, and also I
> need to confirm copyright assignment on the Ruby implementation which
> was externally contributed.
>
> [0] https://orgmode.org/list/87muj04xim.fsf@jaheira.i-did-not-set--mail-host-address--so-tickle-me/
> [1] https://github.com/jackkamm/ob-session-async
^ permalink raw reply [relevance 70%]
* Re: [PATCH] Enhance org-html--build-meta-info
@ 2021-01-02 18:51 34% ` TEC
0 siblings, 1 reply; 74+ results
From: TEC @ 2021-01-02 18:51 UTC (permalink / raw)
To: Jens Lechtenboerger; +Cc: Bastien, org-mode-email
[-- Attachment #1: Type: text/plain, Size: 244 bytes --]
After considering the information passed to a meta info generation
function, I'm now in agreement with you that just passing `info' is the
most sensible way forward.
Attached is a (final?) set of patches, which is as described.
--
Timothy.
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-lisp-ox-html.el-make-html-meta-tag-builder-nicer.patch --]
[-- Type: text/x-patch, Size: 5930 bytes --]
From e8c9646ae6c5083417a927bd2b23bb0f837930d2 Mon Sep 17 00:00:00 2001
From: TEC <tec@tecosaur.com>
Date: Mon, 14 Dec 2020 17:41:33 +0800
Subject: [PATCH 1/2] lisp/ox-html.el: make html meta tag builder nicer
* lisp/ox-html.el (org-html--build-meta-info): Multi-line repeated
structure extracted to new function `org-html--build-meta-entry'.
The keyword value formatting is changed from `org-export-data' to
`org-html-encode-plain-text' to avoid potentially nesting HTML tags in
meta tags and the <title> element, which would violate W3C.
---
lisp/ox-html.el | 114 ++++++++++++++++++++++++------------------------
1 file changed, 56 insertions(+), 58 deletions(-)
diff --git a/lisp/ox-html.el b/lisp/ox-html.el
index 03145e3..f74c6a4 100644
--- a/lisp/ox-html.el
+++ b/lisp/ox-html.el
@@ -1835,78 +1835,76 @@ INFO is a plist used as a communication channel."
\f
;;; Template
+(defun org-html--build-meta-entry (label identity &optional content-format &rest content-formatters)
+ "Construct <meta> tag of form <meta LABEL=\"IDENTITY\" />, or when CONTENT-FORMAT is present:
+<meta LABEL=\"IDENTITY\" content=\"{content}\" />
+
+Here {content} is determined by applying any CONTENT-FORMATTERS to the CONTENT-FORMAT and encoding
+the result as plain text."
+ (concat "<meta "
+ (format "%s=\"%s" label identity)
+ (when content-format
+ (concat "\" content=\""
+ (replace-regexp-in-string
+ "\"" """
+ (org-html-encode-plain-text
+ (if content-formatters
+ (apply #'format content-format content-formatters)
+ content-format)))))
+ "\" />\n"))
+
(defun org-html--build-meta-info (info)
"Return meta tags for exported document.
INFO is a plist used as a communication channel."
- (let* ((protect-string
- (lambda (str)
- (replace-regexp-in-string
- "\"" """ (org-html-encode-plain-text str))))
- (title (org-export-data (plist-get info :title) info))
- ;; Set title to an invisible character instead of leaving it
- ;; empty, which is invalid.
- (title (if (org-string-nw-p title) title "‎"))
- (author (and (plist-get info :with-author)
- (let ((auth (plist-get info :author)))
+ (let* ((title (org-html-plain-text
+ (org-element-interpret-data (plist-get info :title)) info))
+ ;; Set title to an invisible character instead of leaving it
+ ;; empty, which is invalid.
+ (title (if (org-string-nw-p title) title "‎"))
+ (author (and (plist-get info :with-author)
+ (let ((auth (plist-get info :author)))
;; Return raw Org syntax.
- (and auth (org-element-interpret-data auth)))))
- (description (plist-get info :description))
- (keywords (plist-get info :keywords))
- (charset (or (and org-html-coding-system
- (fboundp 'coding-system-get)
- (coding-system-get org-html-coding-system
- 'mime-charset))
- "iso-8859-1")))
+ (and auth (org-html-plain-text
+ (org-element-interpret-data auth) info)))))
+ (charset (or (and org-html-coding-system
+ (fboundp 'coding-system-get)
+ (symbol-name
+ (coding-system-get org-html-coding-system
+ 'mime-charset)))
+ "iso-8859-1")))
(concat
(when (plist-get info :time-stamp-file)
(format-time-string
(concat "<!-- "
(plist-get info :html-metadata-timestamp-format)
" -->\n")))
- (format
- (if (org-html-html5-p info)
- (org-html-close-tag "meta" "charset=\"%s\"" info)
- (org-html-close-tag
- "meta" "http-equiv=\"Content-Type\" content=\"text/html;charset=%s\""
- info))
- charset) "\n"
+
+ (if (org-html-html5-p info)
+ (org-html--build-meta-entry "charset" charset)
+ (org-html--build-meta-entry "http-equiv" "Content-Type"
+ (concat "text/html;charset=" charset)))
+
(let ((viewport-options
(cl-remove-if-not (lambda (cell) (org-string-nw-p (cadr cell)))
(plist-get info :html-viewport))))
- (and viewport-options
- (concat
- (org-html-close-tag
- "meta"
- (format "name=\"viewport\" content=\"%s\""
- (mapconcat
- (lambda (elm) (format "%s=%s" (car elm) (cadr elm)))
- viewport-options ", "))
- info)
- "\n")))
+ (if viewport-options
+ (org-html--build-meta-entry "name" "viewport"
+ (mapconcat
+ (lambda (elm) (format "%s=%s" (car elm) (cadr elm)))
+ viewport-options ", "))))
+
(format "<title>%s</title>\n" title)
- (org-html-close-tag "meta" "name=\"generator\" content=\"Org mode\"" info)
- "\n"
- (and (org-string-nw-p author)
- (concat
- (org-html-close-tag "meta"
- (format "name=\"author\" content=\"%s\""
- (funcall protect-string author))
- info)
- "\n"))
- (and (org-string-nw-p description)
- (concat
- (org-html-close-tag "meta"
- (format "name=\"description\" content=\"%s\"\n"
- (funcall protect-string description))
- info)
- "\n"))
- (and (org-string-nw-p keywords)
- (concat
- (org-html-close-tag "meta"
- (format "name=\"keywords\" content=\"%s\""
- (funcall protect-string keywords))
- info)
- "\n")))))
+
+ (when (org-string-nw-p author)
+ (org-html--build-meta-entry "name" "author" author))
+
+ (when (org-string-nw-p (plist-get info :description))
+ (org-html--build-meta-entry "name" "description" (plist-get info :description)))
+
+ (when (org-string-nw-p (plist-get info :keywords))
+ (org-html--build-meta-entry "keywords" (plist-get info :keywords)))
+
+ (org-html--build-meta-entry "name" "generator" "Org Mode"))))
(defun org-html--build-head (info)
"Return information for the <head>..</head> of the HTML output.
--
2.29.2
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #3: 0002-lisp-ox-html.el-make-html-meta-tags-customizable.patch --]
[-- Type: text/x-patch, Size: 4444 bytes --]
From ddb0f73a9e60cdd9fd83a01e8bd0f72716f2bb06 Mon Sep 17 00:00:00 2001
From: TEC <tec@tecosaur.com>
Date: Mon, 14 Dec 2020 17:50:15 +0800
Subject: [PATCH 2/2] lisp/ox-html.el: make html meta tags customizable
* lisp/ox-html.el (org-html-meta-tags): Introduce this as a new option
which can be modified to set the meta tags added in HTML exports.
(org-html--build-meta-info): Make use of `org-html-meta-tags' instead of
hardcoded meta tags. This is leveraging the earlier restructuring of
`org-html--build-meta-info' into a much DRYer form, such that this
modification has a negligible impact on complexity and readability.
---
lisp/ox-html.el | 57 ++++++++++++++++++++++++++++++++++++-------------
1 file changed, 42 insertions(+), 15 deletions(-)
diff --git a/lisp/ox-html.el b/lisp/ox-html.el
index f74c6a4..9446f54 100644
--- a/lisp/ox-html.el
+++ b/lisp/ox-html.el
@@ -1425,6 +1425,22 @@ not be modified."
;;;; Template :: Styles
+(defcustom org-html-meta-tags #'org-html-meta-tags-default
+ "A list where each item is a list of arguments to be passed
+to `org-html--build-meta-entry'. Any nil items are ignored.
+
+Also accept a function which gives such a list when called with with
+signature (TITLE AUTHOR INFO) where TITLE and AUTHOR are strings,
+and INFO a communication plist."
+ :group 'org-export-html
+ :package-version '(Org . "9.5")
+ :type '(choice
+ (repeat
+ (list (string :tag "Meta label")
+ (string :tag "label value")
+ (string :tag "Content value")))
+ function))
+
(defcustom org-html-head-include-default-style t
"Non-nil means include the default style in exported HTML files.
The actual style is defined in `org-html-style-default' and
@@ -1835,6 +1851,27 @@ INFO is a plist used as a communication channel."
\f
;;; Template
+(defun org-html-meta-tags-default (info)
+ "Generate a list items, each of which is a list of arguments that can
+be passed to `org-html--build-meta-entry', to generate meta tags to be
+included in the HTML head.
+
+The documents's TITLE, AUTHOR, and communication plist INFO may be used."
+ (let ((author (and (plist-get info :with-author)
+ (let ((auth (plist-get info :author)))
+ ;; Return raw Org syntax.
+ (and auth (org-html-plain-text
+ (org-element-interpret-data auth) info))))))
+ (list
+ (when (org-string-nw-p author)
+ (list "name" "author" author))
+ (when (org-string-nw-p (plist-get info :description))
+ (list "name" "description"
+ (plist-get info :description)))
+ (when (org-string-nw-p (plist-get info :keywords))
+ (list "name" "keywords" (plist-get info :keywords)))
+ '("name" "generator" "Org Mode"))))
+
(defun org-html--build-meta-entry (label identity &optional content-format &rest content-formatters)
"Construct <meta> tag of form <meta LABEL=\"IDENTITY\" />, or when CONTENT-FORMAT is present:
<meta LABEL=\"IDENTITY\" content=\"{content}\" />
@@ -1861,11 +1898,6 @@ INFO is a plist used as a communication channel."
;; Set title to an invisible character instead of leaving it
;; empty, which is invalid.
(title (if (org-string-nw-p title) title "‎"))
- (author (and (plist-get info :with-author)
- (let ((auth (plist-get info :author)))
- ;; Return raw Org syntax.
- (and auth (org-html-plain-text
- (org-element-interpret-data auth) info)))))
(charset (or (and org-html-coding-system
(fboundp 'coding-system-get)
(symbol-name
@@ -1895,16 +1927,11 @@ INFO is a plist used as a communication channel."
(format "<title>%s</title>\n" title)
- (when (org-string-nw-p author)
- (org-html--build-meta-entry "name" "author" author))
-
- (when (org-string-nw-p (plist-get info :description))
- (org-html--build-meta-entry "name" "description" (plist-get info :description)))
-
- (when (org-string-nw-p (plist-get info :keywords))
- (org-html--build-meta-entry "keywords" (plist-get info :keywords)))
-
- (org-html--build-meta-entry "name" "generator" "Org Mode"))))
+ (mapconcat
+ (lambda (args) (apply #'org-html--build-meta-entry args))
+ (delq nil (if (functionp org-html-meta-tags)
+ (funcall org-html-meta-tags info)
+ org-html-meta-tags)) ""))))
(defun org-html--build-head (info)
"Return information for the <head>..</head> of the HTML output.
--
2.29.2
^ permalink raw reply related [relevance 34%]
* Re: [PATCH] Apply emacs manual css to org pages
@ 2020-12-28 4:04 93% ` TEC
0 siblings, 0 replies; 74+ results
From: TEC @ 2020-12-28 4:04 UTC (permalink / raw)
To: Samuel Wales; +Cc: org-mode-email
Hi Samuel,
We could add some of our own CSS, but that would have us deviate from
the Emacs manual. It's worth asking if we want to do that IMO.
--
Timothy
Samuel Wales <samologist@gmail.com> writes:
> i wonder if css makes it possible to have wider margins /except/ for
> tables and stuch. or perhaps that is consiedered bad style. but it
> would be accessible/functional. but i am just glad that it is only
> tables that need horizontal scrolling.
>
> On 12/27/20, Samuel Wales <samologist@gmail.com> wrote:
>> if i were to make any /tiny nit-level/ suggestions from my pov it
>> would be somewhat wider margins, not pure white but slightly [so still
>> /very/ high contrast] warmer for fg, and some less-blue for links [but
>> i realize blue is common].
>>
>> i would also do [ha ha, as if i knew what to do or even whether it is
>> possible] wrapping for left columns that go under text rather than
>> bullet for e.g this line: "• Extracting Agenda Information
>> Post-processing agenda information." set fonts large.
>>
>> these are without regard for emacs manual as i have not seen that
>> online recently. great job. thank you.
>>
>>
>> On 12/27/20, Samuel Wales <samologist@gmail.com> wrote:
>>> i like the black bg, the no issues with paragraph width.
>>>
>>>
>>> On 12/22/20, TEC <tecosaur@gmail.com> wrote:
>>>> Hi all,
>>>>
>>>> This is a quick patch to use the Emacs manual CSS with our generated Org
>>>> manual.
>>>>
>>>> You can see what the single-page version of this looks like here:
>>>> https://tecosaur.com/resources/org/doc/manual.html and the multi-page
>>>> here: https://tecosaur.com/resources/org/doc/manual/
>>>>
>>>> This should be an easy upgrade to our online documentation :)
>>>>
>>>> --
>>>> Timothy
>>>>
>>>>
>>>
>>>
>>> --
>>> The Kafka Pandemic
>>>
>>> Please learn what misopathy is.
>>> https://thekafkapandemic.blogspot.com/2013/10/why-some-diseases-are-wronged.html
>>>
>>
>>
>> --
>> The Kafka Pandemic
>>
>> Please learn what misopathy is.
>> https://thekafkapandemic.blogspot.com/2013/10/why-some-diseases-are-wronged.html
>>
^ permalink raw reply [relevance 93%]
* Re: [PATCH] org-plot abstractions and extension
@ 2020-12-23 18:19 43% ` TEC
0 siblings, 0 replies; 74+ results
From: TEC @ 2020-12-23 18:19 UTC (permalink / raw)
To: Kyle Meyer; +Cc: Bastien, org-mode-email
[-- Attachment #1: Type: text/plain, Size: 1988 bytes --]
Kyle Meyer <kyle@kyleam.com> writes:
> Regardless of what you tend to use, you used "case" here in 73c99bf42;
> the minimal fix is to add a cl- prefix, and any other switch with the
> justification that "case is obsolete" is likely to raise a reviewer's
> eyebrow.
This makes sense.
> cl-case isn't in cl-lib, and there is no need to load anything.
Huh, interesting.
> recent org-plot example from 8d5122fc5:
> [...]
> That could be rewritten as [...]
Would you like me to bundle that change in somewhere?
>>>> @@ -210,9 +210,9 @@ values, namely regarding the range."
>>>> "From a the values in a TABLE of data, attempt to guess an appropriate number of ticks."
>>>> (let* ((row-data
>>>> (mapcar (lambda (row) (org--plot/values-stats
>>>> - (mapcar #'string-to-number (cdr row))
>>>> - hard-min
>>>> - hard-max)) table))
>>>> + (mapcar #'string-to-number (cdr row))
>>>> + hard-min
>>>> + hard-max)) table))
>>>
>>> Please drop this unrelated space change.
>>
>> Erm, this isn't unrelated. As the function being called changed length,
>> the indentation of the arguments is thus also changed.
>
> This change is in org--plot/sensible-tick-num. I don't spot any
> non-whitespace changes there. Git appears to agree with me:
>
> $ git show | grep '@@ -210,9'
> @@ -210,9 +210,9 @@ (defun org--plot/sensible-tick-num (table &optional hard-min hard-max)
> $ git show -w | grep '@@ -210,9'
Ooops, I thought you were referring to one of the other regions (I saw
the "let" and "mapcar" and my brain pattern-matched the rest :P)
One question, I saw Bastien say that we didn't want whitespace-only
commits, so how should whitespace-fixups be done?
>> Subject: [PATCH] org-plot.el: fix compiler warnings
>>
>> * (org--plot/values-stats): Replace `log10' with `log'.
>
> Please add a file name ("lisp/org-plot.el") to the start of the
> changelog entry.
Ah, forgot I needed that. Sorted :)
(final?) patch revision attached.
--
Timothy
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-org-plot.el-fix-compiler-warnings.patch --]
[-- Type: text/x-patch, Size: 6785 bytes --]
From c4c7b835f27b65111859d030af58a8317a82b0a0 Mon Sep 17 00:00:00 2001
From: TEC <tec@tecosaur.com>
Date: Thu, 24 Dec 2020 02:26:17 +0800
Subject: [PATCH] org-plot.el: fix compiler warnings
* lisp/org-plot.el (org--plot/values-stats): Replace `log10' with
`log'.
(org--plot/nice-frequency-pick): Replace obsolete `case' with `pcase`.
(org--plot/radar): Replace `s-join' with `mapconcat', removing the
implicit dependency on s.el.
(org-plot/gnuplot-script): Remove unused let bindings.
(org-plot/gnuplot-script): Replace free variable reference with
expression only using given variables.
---
lisp/org-plot.el | 109 ++++++++++++++++++++++-------------------------
1 file changed, 52 insertions(+), 57 deletions(-)
diff --git a/lisp/org-plot.el b/lisp/org-plot.el
index 4aa8276..5c6c834 100644
--- a/lisp/org-plot.el
+++ b/lisp/org-plot.el
@@ -196,7 +196,7 @@ values, namely regarding the range."
(maximum (or hard-max (apply #'max nums)))
(range (- maximum minimum))
(rangeOrder (if (= range 0) 0
- (ceiling (- 1 (log10 range)))))
+ (ceiling (- 1 (log range 10)))))
(range-factor (expt 10 rangeOrder))
(nice-min (if (= range 0) (car nums)
(/ (float (floor (* minimum range-factor))) range-factor)))
@@ -229,34 +229,34 @@ values, namely regarding the range."
(defun org--plot/nice-frequency-pick (frequencies)
"From a list of frequences, try to sensibly pick a sample of the most frequent."
;; TODO this mosly works decently, but counld do with some tweaking to work more consistently.
- (case (length frequencies)
- (1 (list (car (nth 0 frequencies))))
- (2 (if (<= 3 (/ (cdr (nth 0 frequencies))
- (cdr (nth 1 frequencies))))
- (make-list 2
- (car (nth 0 frequencies)))
- (list (car (nth 0 frequencies))
- (car (nth 1 frequencies)))))
- (t
- (let* ((total-count (apply #'+ (mapcar #'cdr frequencies)))
- (n-freq (mapcar (lambda (freq) `(,(car freq) . ,(/ (float (cdr freq)) total-count))) frequencies))
- (f-pick (list (car (car n-freq))))
- (1-2-ratio (/ (cdr (nth 0 n-freq))
- (cdr (nth 1 n-freq))))
- (2-3-ratio (/ (cdr (nth 1 n-freq))
- (cdr (nth 2 n-freq))))
- (1-3-ratio (* 1-2-ratio 2-3-ratio))
- (1-val (car (nth 0 n-freq)))
- (2-val (car (nth 1 n-freq)))
- (3-val (car (nth 2 n-freq))))
- (when (> 1-2-ratio 4) (push 1-val f-pick))
- (when (and (< 1-2-ratio 2-val)
- (< (* (apply #'* f-pick) 2-val) 30))
- (push 2-val f-pick))
- (when (and (< 1-3-ratio 3-val)
- (< (* (apply #'* f-pick) 3-val) 30))
- (push 3-val f-pick))
- f-pick))))
+ (cl-case (length frequencies)
+ (1 (list (car (nth 0 frequencies))))
+ (2 (if (<= 3 (/ (cdr (nth 0 frequencies))
+ (cdr (nth 1 frequencies))))
+ (make-list 2
+ (car (nth 0 frequencies)))
+ (list (car (nth 0 frequencies))
+ (car (nth 1 frequencies)))))
+ (t
+ (let* ((total-count (apply #'+ (mapcar #'cdr frequencies)))
+ (n-freq (mapcar (lambda (freq) `(,(car freq) . ,(/ (float (cdr freq)) total-count))) frequencies))
+ (f-pick (list (car (car n-freq))))
+ (1-2-ratio (/ (cdr (nth 0 n-freq))
+ (cdr (nth 1 n-freq))))
+ (2-3-ratio (/ (cdr (nth 1 n-freq))
+ (cdr (nth 2 n-freq))))
+ (1-3-ratio (* 1-2-ratio 2-3-ratio))
+ (1-val (car (nth 0 n-freq)))
+ (2-val (car (nth 1 n-freq)))
+ (3-val (car (nth 2 n-freq))))
+ (when (> 1-2-ratio 4) (push 1-val f-pick))
+ (when (and (< 1-2-ratio 2-val)
+ (< (* (apply #'* f-pick) 2-val) 30))
+ (push 2-val f-pick))
+ (when (and (< 1-3-ratio 3-val)
+ (< (* (apply #'* f-pick) 3-val) 30))
+ (push 3-val f-pick))
+ f-pick))))
(defun org--plot/merge-alists (function default alist1 alist2 &rest alists)
"Using FUNCTION, combine the elements of all given ALISTS. When an element is
@@ -473,34 +473,34 @@ EOD
(defun org--plot/radar (table params)
(let* ((data
- (concat "\"" (s-join "\" \"" (plist-get params :labels)) "\""
+ (concat "\"" (mapconcat #'identity (plist-get params :labels) "\" \"") "\""
"\n"
- (s-join "\n"
- (mapcar (lambda (row)
- (format
- "\"%s\" %s"
- (car row)
- (s-join " " (cdr row))))
- (append table (list (car table)))))))
+ (mapconcat (lambda (row)
+ (format
+ "\"%s\" %s"
+ (car row)
+ (mapconcat #'identity (cdr row) " ")))
+ (append table (list (car table)))
+ "\n")))
(ticks (or (plist-get params :ticks)
(org--plot/sensible-tick-num table
(plist-get params :ymin)
(plist-get params :ymax))))
(settings
- (s-join "\n"
- (mapcar (lambda (row)
- (let ((data (org--plot/values-stats
- (mapcar #'string-to-number (cdr row)))))
- (format
- "\"%s\" %s %s %s"
- (car row)
- (or (plist-get params :ymin)
- (plist-get data :nice-min))
- (or (plist-get params :ymax)
- (plist-get data :nice-max))
- (if (eq ticks 0) 2 ticks)
- )))
- (append table (list (car table))))))
+ (mapconcat (lambda (row)
+ (let ((data (org--plot/values-stats
+ (mapcar #'string-to-number (cdr row)))))
+ (format
+ "\"%s\" %s %s %s"
+ (car row)
+ (or (plist-get params :ymin)
+ (plist-get data :nice-min))
+ (or (plist-get params :ymax)
+ (plist-get data :nice-max))
+ (if (eq ticks 0) 2 ticks)
+ )))
+ (append table (list (car table)))
+ "\n"))
(setup-file (make-temp-file "org-plot-setup")))
(let ((coding-system-for-write 'utf-8))
(write-region (format org--plot/radar-setup-template data settings) nil setup-file nil :silent))
@@ -533,15 +533,10 @@ manner suitable for prepending to a user-specified script."
(user-error "Org-plot type `%s' is undefined." type-name))
(let* ((sets (plist-get params :set))
(lines (plist-get params :line))
- (map (plist-get params :map))
(title (plist-get params :title))
(file (plist-get params :file))
- (ind (plist-get params :ind))
(time-ind (plist-get params :timeind))
(timefmt (plist-get params :timefmt))
- (text-ind (plist-get params :textind))
- (deps (if (plist-member params :deps) (plist-get params :deps)))
- (col-labels (plist-get params :labels))
(x-labels (plist-get params :xlabels))
(y-labels (plist-get params :ylabels))
(plot-str (or (plist-get type :plot-str)
@@ -650,7 +645,7 @@ line directly before or after the table."
org-plot/preset-plot-types)))
(unless type
- (user-error "Org-plot type `%s' is undefined." type-name))
+ (user-error "Org-plot type `%s' is undefined." (plist-get params :plot-type)))
(run-with-idle-timer 0.1 nil #'delete-file data-file)
(when (eq (cadr table) 'hline)
--
2.29.2
^ permalink raw reply related [relevance 43%]
* Re: [PATCH] org-plot abstractions and extension
@ 2020-12-23 8:38 41% ` TEC
0 siblings, 1 reply; 74+ results
From: TEC @ 2020-12-23 8:38 UTC (permalink / raw)
To: Kyle Meyer; +Cc: Bastien, org-mode-email
[-- Attachment #1: Type: text/plain, Size: 1242 bytes --]
Kyle Meyer <kyle@kyleam.com> writes:
> case is still available under the cl- prefix. If you wanted to use it
> in 73c99bf42 (org-plot.el: add utility functions for range,ticks), I
> don't see a reason not to use it now.
I tend to use pcase over cl-case (since it's completely built in, i.e.
no (require 'cl-lib) required). I'm not sure if there's any argument for
cl-case over pcase, let me know if so.
> s/refence/reference/
Done
>> @@ -210,9 +210,9 @@ values, namely regarding the range."
>> "From a the values in a TABLE of data, attempt to guess an appropriate number of ticks."
>> (let* ((row-data
>> (mapcar (lambda (row) (org--plot/values-stats
>> - (mapcar #'string-to-number (cdr row))
>> - hard-min
>> - hard-max)) table))
>> + (mapcar #'string-to-number (cdr row))
>> + hard-min
>> + hard-max)) table))
>
> Please drop this unrelated space change.
Erm, this isn't unrelated. As the function being called changed length,
the indentation of the arguments is thus also changed.
> The mapcar is unnecessary; you can reposition (lambda ...) as
> mapconcat's FUNCTION argument.
Thanks for spotting that. Resolved.
Updated patch attached. Let me know how it looks to you :)
--
Timothy
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-org-plot.el-fix-compiler-warnings.patch --]
[-- Type: text/x-patch, Size: 7285 bytes --]
From 22717d0750e2c001003b45f1d4834571f21287ef Mon Sep 17 00:00:00 2001
From: TEC <tec@tecosaur.com>
Date: Wed, 23 Dec 2020 14:13:24 +0800
Subject: [PATCH] org-plot.el: fix compiler warnings
* (org--plot/values-stats): Replace `log10' with `log'.
(org--plot/nice-frequency-pick): Replace obsolete `case' with `pcase`.
(org--plot/radar): Replace `s-join' with `mapconcat', removing the
implicit dependency on s.el.
(org-plot/gnuplot-script): Remove unused let bindings.
(org-plot/gnuplot-script): Replace free variable reference with expression
only using given variables.
---
lisp/org-plot.el | 115 +++++++++++++++++++++++------------------------
1 file changed, 55 insertions(+), 60 deletions(-)
diff --git a/lisp/org-plot.el b/lisp/org-plot.el
index 4aa8276..1c7ee43 100644
--- a/lisp/org-plot.el
+++ b/lisp/org-plot.el
@@ -196,7 +196,7 @@ values, namely regarding the range."
(maximum (or hard-max (apply #'max nums)))
(range (- maximum minimum))
(rangeOrder (if (= range 0) 0
- (ceiling (- 1 (log10 range)))))
+ (ceiling (- 1 (log range 10)))))
(range-factor (expt 10 rangeOrder))
(nice-min (if (= range 0) (car nums)
(/ (float (floor (* minimum range-factor))) range-factor)))
@@ -210,9 +210,9 @@ values, namely regarding the range."
"From a the values in a TABLE of data, attempt to guess an appropriate number of ticks."
(let* ((row-data
(mapcar (lambda (row) (org--plot/values-stats
- (mapcar #'string-to-number (cdr row))
- hard-min
- hard-max)) table))
+ (mapcar #'string-to-number (cdr row))
+ hard-min
+ hard-max)) table))
(row-normalised-ranges (mapcar (lambda (r-data)
(let ((val (round (*
(plist-get r-data :range-factor)
@@ -229,34 +229,34 @@ values, namely regarding the range."
(defun org--plot/nice-frequency-pick (frequencies)
"From a list of frequences, try to sensibly pick a sample of the most frequent."
;; TODO this mosly works decently, but counld do with some tweaking to work more consistently.
- (case (length frequencies)
- (1 (list (car (nth 0 frequencies))))
- (2 (if (<= 3 (/ (cdr (nth 0 frequencies))
- (cdr (nth 1 frequencies))))
- (make-list 2
- (car (nth 0 frequencies)))
- (list (car (nth 0 frequencies))
- (car (nth 1 frequencies)))))
- (t
- (let* ((total-count (apply #'+ (mapcar #'cdr frequencies)))
- (n-freq (mapcar (lambda (freq) `(,(car freq) . ,(/ (float (cdr freq)) total-count))) frequencies))
- (f-pick (list (car (car n-freq))))
- (1-2-ratio (/ (cdr (nth 0 n-freq))
- (cdr (nth 1 n-freq))))
- (2-3-ratio (/ (cdr (nth 1 n-freq))
- (cdr (nth 2 n-freq))))
- (1-3-ratio (* 1-2-ratio 2-3-ratio))
- (1-val (car (nth 0 n-freq)))
- (2-val (car (nth 1 n-freq)))
- (3-val (car (nth 2 n-freq))))
- (when (> 1-2-ratio 4) (push 1-val f-pick))
- (when (and (< 1-2-ratio 2-val)
- (< (* (apply #'* f-pick) 2-val) 30))
- (push 2-val f-pick))
- (when (and (< 1-3-ratio 3-val)
- (< (* (apply #'* f-pick) 3-val) 30))
- (push 3-val f-pick))
- f-pick))))
+ (pcase (length frequencies)
+ (1 (list (car (nth 0 frequencies))))
+ (2 (if (<= 3 (/ (cdr (nth 0 frequencies))
+ (cdr (nth 1 frequencies))))
+ (make-list 2
+ (car (nth 0 frequencies)))
+ (list (car (nth 0 frequencies))
+ (car (nth 1 frequencies)))))
+ (_
+ (let* ((total-count (apply #'+ (mapcar #'cdr frequencies)))
+ (n-freq (mapcar (lambda (freq) `(,(car freq) . ,(/ (float (cdr freq)) total-count))) frequencies))
+ (f-pick (list (car (car n-freq))))
+ (1-2-ratio (/ (cdr (nth 0 n-freq))
+ (cdr (nth 1 n-freq))))
+ (2-3-ratio (/ (cdr (nth 1 n-freq))
+ (cdr (nth 2 n-freq))))
+ (1-3-ratio (* 1-2-ratio 2-3-ratio))
+ (1-val (car (nth 0 n-freq)))
+ (2-val (car (nth 1 n-freq)))
+ (3-val (car (nth 2 n-freq))))
+ (when (> 1-2-ratio 4) (push 1-val f-pick))
+ (when (and (< 1-2-ratio 2-val)
+ (< (* (apply #'* f-pick) 2-val) 30))
+ (push 2-val f-pick))
+ (when (and (< 1-3-ratio 3-val)
+ (< (* (apply #'* f-pick) 3-val) 30))
+ (push 3-val f-pick))
+ f-pick))))
(defun org--plot/merge-alists (function default alist1 alist2 &rest alists)
"Using FUNCTION, combine the elements of all given ALISTS. When an element is
@@ -473,34 +473,34 @@ EOD
(defun org--plot/radar (table params)
(let* ((data
- (concat "\"" (s-join "\" \"" (plist-get params :labels)) "\""
+ (concat "\"" (mapconcat #'identity (plist-get params :labels) "\" \"") "\""
"\n"
- (s-join "\n"
- (mapcar (lambda (row)
- (format
- "\"%s\" %s"
- (car row)
- (s-join " " (cdr row))))
- (append table (list (car table)))))))
+ (mapconcat (lambda (row)
+ (format
+ "\"%s\" %s"
+ (car row)
+ (mapconcat #'identity (cdr row) " ")))
+ (append table (list (car table)))
+ "\n")))
(ticks (or (plist-get params :ticks)
(org--plot/sensible-tick-num table
(plist-get params :ymin)
(plist-get params :ymax))))
(settings
- (s-join "\n"
- (mapcar (lambda (row)
- (let ((data (org--plot/values-stats
- (mapcar #'string-to-number (cdr row)))))
- (format
- "\"%s\" %s %s %s"
- (car row)
- (or (plist-get params :ymin)
- (plist-get data :nice-min))
- (or (plist-get params :ymax)
- (plist-get data :nice-max))
- (if (eq ticks 0) 2 ticks)
- )))
- (append table (list (car table))))))
+ (mapconcat (lambda (row)
+ (let ((data (org--plot/values-stats
+ (mapcar #'string-to-number (cdr row)))))
+ (format
+ "\"%s\" %s %s %s"
+ (car row)
+ (or (plist-get params :ymin)
+ (plist-get data :nice-min))
+ (or (plist-get params :ymax)
+ (plist-get data :nice-max))
+ (if (eq ticks 0) 2 ticks)
+ )))
+ (append table (list (car table)))
+ "\n"))
(setup-file (make-temp-file "org-plot-setup")))
(let ((coding-system-for-write 'utf-8))
(write-region (format org--plot/radar-setup-template data settings) nil setup-file nil :silent))
@@ -533,15 +533,10 @@ manner suitable for prepending to a user-specified script."
(user-error "Org-plot type `%s' is undefined." type-name))
(let* ((sets (plist-get params :set))
(lines (plist-get params :line))
- (map (plist-get params :map))
(title (plist-get params :title))
(file (plist-get params :file))
- (ind (plist-get params :ind))
(time-ind (plist-get params :timeind))
(timefmt (plist-get params :timefmt))
- (text-ind (plist-get params :textind))
- (deps (if (plist-member params :deps) (plist-get params :deps)))
- (col-labels (plist-get params :labels))
(x-labels (plist-get params :xlabels))
(y-labels (plist-get params :ylabels))
(plot-str (or (plist-get type :plot-str)
@@ -650,7 +645,7 @@ line directly before or after the table."
org-plot/preset-plot-types)))
(unless type
- (user-error "Org-plot type `%s' is undefined." type-name))
+ (user-error "Org-plot type `%s' is undefined." (plist-get params :plot-type)))
(run-with-idle-timer 0.1 nil #'delete-file data-file)
(when (eq (cadr table) 'hline)
--
2.29.2
^ permalink raw reply related [relevance 41%]
* Re: [PATCH] org-plot abstractions and extension
2020-12-23 5:10 93% ` TEC
@ 2020-12-23 6:19 43% ` TEC
0 siblings, 1 reply; 74+ results
From: TEC @ 2020-12-23 6:19 UTC (permalink / raw)
To: Kyle Meyer; +Cc: Bastien, org-mode-email
[-- Attachment #1: Type: text/plain, Size: 284 bytes --]
TEC <tecosaur@gmail.com> writes:
> Kyle Meyer <kyle@kyleam.com> writes:
>
>> This series introduced some compiler warnings.
>>
>> Timothy, could you please submit a follow-up patch to address these?
>
> Absolutely. Thanks for raising this, I'll take a look shortly.
Here we go :)
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-org-plot.el-fix-compiler-warnings.patch --]
[-- Type: text/x-patch, Size: 7357 bytes --]
From 309907af5e76818753b85af84b3e304d8cb4568c Mon Sep 17 00:00:00 2001
From: TEC <tec@tecosaur.com>
Date: Wed, 23 Dec 2020 14:13:24 +0800
Subject: [PATCH] org-plot.el: fix compiler warnings
* (org--plot/values-stats): Replace `log10' with `log'.
(org--plot/nice-frequency-pick): Replace obsolete `case' with `pcase`.
(org--plot/radar): Replace `s-join' with `mapconcat', removing the
implicit dependency on s.el.
(org-plot/gnuplot-script): Remove unused let bindings.
(org-plot/gnuplot-script): Replace free variable refence with expression
only using given variables.
---
lisp/org-plot.el | 117 +++++++++++++++++++++++------------------------
1 file changed, 57 insertions(+), 60 deletions(-)
diff --git a/lisp/org-plot.el b/lisp/org-plot.el
index 4aa8276..80700e0 100644
--- a/lisp/org-plot.el
+++ b/lisp/org-plot.el
@@ -196,7 +196,7 @@ values, namely regarding the range."
(maximum (or hard-max (apply #'max nums)))
(range (- maximum minimum))
(rangeOrder (if (= range 0) 0
- (ceiling (- 1 (log10 range)))))
+ (ceiling (- 1 (log range 10)))))
(range-factor (expt 10 rangeOrder))
(nice-min (if (= range 0) (car nums)
(/ (float (floor (* minimum range-factor))) range-factor)))
@@ -210,9 +210,9 @@ values, namely regarding the range."
"From a the values in a TABLE of data, attempt to guess an appropriate number of ticks."
(let* ((row-data
(mapcar (lambda (row) (org--plot/values-stats
- (mapcar #'string-to-number (cdr row))
- hard-min
- hard-max)) table))
+ (mapcar #'string-to-number (cdr row))
+ hard-min
+ hard-max)) table))
(row-normalised-ranges (mapcar (lambda (r-data)
(let ((val (round (*
(plist-get r-data :range-factor)
@@ -229,34 +229,34 @@ values, namely regarding the range."
(defun org--plot/nice-frequency-pick (frequencies)
"From a list of frequences, try to sensibly pick a sample of the most frequent."
;; TODO this mosly works decently, but counld do with some tweaking to work more consistently.
- (case (length frequencies)
- (1 (list (car (nth 0 frequencies))))
- (2 (if (<= 3 (/ (cdr (nth 0 frequencies))
- (cdr (nth 1 frequencies))))
- (make-list 2
- (car (nth 0 frequencies)))
- (list (car (nth 0 frequencies))
- (car (nth 1 frequencies)))))
- (t
- (let* ((total-count (apply #'+ (mapcar #'cdr frequencies)))
- (n-freq (mapcar (lambda (freq) `(,(car freq) . ,(/ (float (cdr freq)) total-count))) frequencies))
- (f-pick (list (car (car n-freq))))
- (1-2-ratio (/ (cdr (nth 0 n-freq))
- (cdr (nth 1 n-freq))))
- (2-3-ratio (/ (cdr (nth 1 n-freq))
- (cdr (nth 2 n-freq))))
- (1-3-ratio (* 1-2-ratio 2-3-ratio))
- (1-val (car (nth 0 n-freq)))
- (2-val (car (nth 1 n-freq)))
- (3-val (car (nth 2 n-freq))))
- (when (> 1-2-ratio 4) (push 1-val f-pick))
- (when (and (< 1-2-ratio 2-val)
- (< (* (apply #'* f-pick) 2-val) 30))
- (push 2-val f-pick))
- (when (and (< 1-3-ratio 3-val)
- (< (* (apply #'* f-pick) 3-val) 30))
- (push 3-val f-pick))
- f-pick))))
+ (pcase (length frequencies)
+ (1 (list (car (nth 0 frequencies))))
+ (2 (if (<= 3 (/ (cdr (nth 0 frequencies))
+ (cdr (nth 1 frequencies))))
+ (make-list 2
+ (car (nth 0 frequencies)))
+ (list (car (nth 0 frequencies))
+ (car (nth 1 frequencies)))))
+ (_
+ (let* ((total-count (apply #'+ (mapcar #'cdr frequencies)))
+ (n-freq (mapcar (lambda (freq) `(,(car freq) . ,(/ (float (cdr freq)) total-count))) frequencies))
+ (f-pick (list (car (car n-freq))))
+ (1-2-ratio (/ (cdr (nth 0 n-freq))
+ (cdr (nth 1 n-freq))))
+ (2-3-ratio (/ (cdr (nth 1 n-freq))
+ (cdr (nth 2 n-freq))))
+ (1-3-ratio (* 1-2-ratio 2-3-ratio))
+ (1-val (car (nth 0 n-freq)))
+ (2-val (car (nth 1 n-freq)))
+ (3-val (car (nth 2 n-freq))))
+ (when (> 1-2-ratio 4) (push 1-val f-pick))
+ (when (and (< 1-2-ratio 2-val)
+ (< (* (apply #'* f-pick) 2-val) 30))
+ (push 2-val f-pick))
+ (when (and (< 1-3-ratio 3-val)
+ (< (* (apply #'* f-pick) 3-val) 30))
+ (push 3-val f-pick))
+ f-pick))))
(defun org--plot/merge-alists (function default alist1 alist2 &rest alists)
"Using FUNCTION, combine the elements of all given ALISTS. When an element is
@@ -473,34 +473,36 @@ EOD
(defun org--plot/radar (table params)
(let* ((data
- (concat "\"" (s-join "\" \"" (plist-get params :labels)) "\""
+ (concat "\"" (mapconcat #'identity (plist-get params :labels) "\" \"") "\""
"\n"
- (s-join "\n"
- (mapcar (lambda (row)
- (format
- "\"%s\" %s"
- (car row)
- (s-join " " (cdr row))))
- (append table (list (car table)))))))
+ (mapconcat #'identity
+ (mapcar (lambda (row)
+ (format
+ "\"%s\" %s"
+ (car row)
+ (mapconcat #'identity (cdr row) " ")))
+ (append table (list (car table))))
+ "\n")))
(ticks (or (plist-get params :ticks)
(org--plot/sensible-tick-num table
(plist-get params :ymin)
(plist-get params :ymax))))
(settings
- (s-join "\n"
- (mapcar (lambda (row)
- (let ((data (org--plot/values-stats
- (mapcar #'string-to-number (cdr row)))))
- (format
- "\"%s\" %s %s %s"
- (car row)
- (or (plist-get params :ymin)
- (plist-get data :nice-min))
- (or (plist-get params :ymax)
- (plist-get data :nice-max))
- (if (eq ticks 0) 2 ticks)
- )))
- (append table (list (car table))))))
+ (mapconcat #'identity
+ (mapcar (lambda (row)
+ (let ((data (org--plot/values-stats
+ (mapcar #'string-to-number (cdr row)))))
+ (format
+ "\"%s\" %s %s %s"
+ (car row)
+ (or (plist-get params :ymin)
+ (plist-get data :nice-min))
+ (or (plist-get params :ymax)
+ (plist-get data :nice-max))
+ (if (eq ticks 0) 2 ticks)
+ )))
+ (append table (list (car table))))
+ "\n"))
(setup-file (make-temp-file "org-plot-setup")))
(let ((coding-system-for-write 'utf-8))
(write-region (format org--plot/radar-setup-template data settings) nil setup-file nil :silent))
@@ -533,15 +535,10 @@ manner suitable for prepending to a user-specified script."
(user-error "Org-plot type `%s' is undefined." type-name))
(let* ((sets (plist-get params :set))
(lines (plist-get params :line))
- (map (plist-get params :map))
(title (plist-get params :title))
(file (plist-get params :file))
- (ind (plist-get params :ind))
(time-ind (plist-get params :timeind))
(timefmt (plist-get params :timefmt))
- (text-ind (plist-get params :textind))
- (deps (if (plist-member params :deps) (plist-get params :deps)))
- (col-labels (plist-get params :labels))
(x-labels (plist-get params :xlabels))
(y-labels (plist-get params :ylabels))
(plot-str (or (plist-get type :plot-str)
@@ -650,7 +647,7 @@ line directly before or after the table."
org-plot/preset-plot-types)))
(unless type
- (user-error "Org-plot type `%s' is undefined." type-name))
+ (user-error "Org-plot type `%s' is undefined." (plist-get params :plot-type)))
(run-with-idle-timer 0.1 nil #'delete-file data-file)
(when (eq (cadr table) 'hline)
--
2.29.2
^ permalink raw reply related [relevance 43%]
* Re: [PATCH] org-plot abstractions and extension
@ 2020-12-23 5:10 93% ` TEC
2020-12-23 6:19 43% ` TEC
0 siblings, 1 reply; 74+ results
From: TEC @ 2020-12-23 5:10 UTC (permalink / raw)
To: Kyle Meyer; +Cc: Bastien, org-mode-email
Kyle Meyer <kyle@kyleam.com> writes:
> This series introduced some compiler warnings.
>
> Timothy, could you please submit a follow-up patch to address these?
Absolutely. Thanks for raising this, I'll take a look shortly.
--
Timothy
^ permalink raw reply [relevance 93%]
* [PATCH] Apply emacs manual css to org pages
@ 2020-12-23 2:35 82% TEC
` (2 more replies)
0 siblings, 3 replies; 74+ results
From: TEC @ 2020-12-23 2:35 UTC (permalink / raw)
To: org-mode-email
[-- Attachment #1: Type: text/plain, Size: 356 bytes --]
Hi all,
This is a quick patch to use the Emacs manual CSS with our generated Org
manual.
You can see what the single-page version of this looks like here:
https://tecosaur.com/resources/org/doc/manual.html and the multi-page
here: https://tecosaur.com/resources/org/doc/manual/
This should be an easy upgrade to our online documentation :)
--
Timothy
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-mk-default.mk-use-same-html-doc-style-as-emacs.patch --]
[-- Type: text/x-patch, Size: 826 bytes --]
From fc57ea88432ea119d063906cc29cc51ee591031d Mon Sep 17 00:00:00 2001
From: TEC <tec@tecosaur.com>
Date: Wed, 23 Dec 2020 10:30:09 +0800
Subject: [PATCH] mk/default.mk: use same html doc style as emacs
* mk/default.mk: Add CSS stylesheet ref to HTML generated by TEXI2HTML,
specifically the stylesheet used with the online Emacs manual.
---
mk/default.mk | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/mk/default.mk b/mk/default.mk
index fbfdaf5..e92d58c 100644
--- a/mk/default.mk
+++ b/mk/default.mk
@@ -139,7 +139,7 @@ MKDIR = install -m 755 -d
MAKEINFO = makeinfo
# How to create the HTML file
-TEXI2HTML = makeinfo --html --number-sections
+TEXI2HTML = makeinfo --html --number-sections --css-ref "https://www.gnu.org/software/emacs/manual.css"
# How to find files
FIND = find
--
2.29.2
^ permalink raw reply related [relevance 82%]
* Re: [PATCH] Enhance org-html--build-meta-info
@ 2020-12-20 5:08 93% ` TEC
2020-12-20 5:08 93% ` TEC
1 sibling, 1 reply; 74+ results
From: TEC @ 2020-12-20 5:08 UTC (permalink / raw)
To: Jens Lechtenboerger; +Cc: Bastien, org-mode-email
Jens Lechtenboerger <lechten@wi.uni-muenster.de> writes:
>> For people who want to customise this to add metadata, the page title is
>> something they're probably interested in.
>
> What metadata would you derive from the title?
In my earlier example, I use the "og:title" property.
>> If so, I think it's work giving the title processed by
>> org-html--build-meta-info as it's not so simple as
>> (plist-get info :title).
>
> Extracting it from ~info~ might be more flexible as it would not be
> tied to the current implementation.
My thoughts are just that its seems like title/author may be handy, and
we've already worked those out, so why not just pass them along?
Could probably reduce to just info, not sure what's best though.
Other than this, is there anything else you think might be worth
considering before merging?
--
Timothy
^ permalink raw reply [relevance 93%]
* Re: [PATCH] Enhance org-html--build-meta-info
2020-12-20 5:08 93% ` TEC
@ 2020-12-20 5:08 93% ` TEC
1 sibling, 0 replies; 74+ results
From: TEC @ 2020-12-20 5:08 UTC (permalink / raw)
To: Jens Lechtenboerger; +Cc: Bastien, org-mode-email
Jens Lechtenboerger <lechten@wi.uni-muenster.de> writes:
>> For people who want to customise this to add metadata, the page title is
>> something they're probably interested in.
>
> What metadata would you derive from the title?
In my earlier example, I use the "og:title" property.
>> If so, I think it's work giving the title processed by
>> org-html--build-meta-info as it's not so simple as
>> (plist-get info :title).
>
> Extracting it from ~info~ might be more flexible as it would not be
> tied to the current implementation.
My thoughts are just that its seems like title/author may be handy, and
we've already worked those out, so why not just pass them along?
Could probably reduce to just info, not sure what's best though.
Other than this, is there anything else you think might be worth
considering before merging?
--
Timothy
^ permalink raw reply [relevance 93%]
* Re: [PATCH] Enhance org-html--build-meta-info
@ 2020-12-16 7:22 86% ` TEC
0 siblings, 1 reply; 74+ results
From: TEC @ 2020-12-16 7:22 UTC (permalink / raw)
To: Jens Lechtenboerger; +Cc: Bastien, org-mode-email
Jens Lechtenboerger <lechten@wi.uni-muenster.de> writes:
> I like this!
:)
>> Maybe it should be applied to the rest (in ~org-html--build-meta-info~)?
>> I'm not sure.
>
> I’m not sure either. Maybe people expect their typed characters,
> maybe not. This might call for a new variable.
I'm tempted to leave the current behaviour as-is, and then we can
introduce a new variable if we want later :)
> I like the new variant much better. However, I still do not
> understand why you pass the title into org-html-meta-tags-default
> just to ignore it. The title is already dealt with elsewhere, isn’t
> it?
For people who want to customise this to add metadata, the page title is
something they're probably interested in. If so, I think it's work
giving the title processed by org-html--build-meta-info as it's not so
simple as (plist-get info :title). Worst case, the argument just sits
there and is ignored :P
> Some comments raise complaints by checkdoc (lines too long, no
> sentence in fist line). (Actually, the file has more problems in
> that regard.)
Ooops, I thought I took care of that. Looks like I'll be taking another
look...
Would be nice my issues weren't one of dozens throughout the file, it
makes it a bit harder to notice errors coming from /my/ section.
> Many thanks for your continued work!
Thanks for your testing and feedback!
--
Timothy
^ permalink raw reply [relevance 86%]
* Re: [PATCH] Enhance org-html--build-meta-info
@ 2020-12-16 5:04 73% ` Timothy E Chapman
0 siblings, 0 replies; 74+ results
From: Timothy E Chapman @ 2020-12-16 5:04 UTC (permalink / raw)
To: Tom Gillespie; +Cc: Jens Lechtenboerger, Bastien, org-mode-email
Hi Tom,
> Why not just use #+html_head:
> possibly with a macro to fill in variable values? That is fully
> extensible and doesn't overload keywords. For title, date, author,
> etc. those can have clearly defined mappings to the html, but
> everything else seems to be handled more sanely with #+html_head:. Am
> I missing something?
I doubt the use case that prompted me to make this an option is the
only one that would benefit, but it should give you an example of the
potential utility of this.
There's some metadata I /always/ want added to my exported documents.
Some of it is static (e.g. ("name" "theme-color" "#77aa99")), but I
also have opengraph metadata which is based on the title/author/etc.
See https://tecosaur.github.io/emacs-config/config.html#extra-header-content,code--2
I can't imagine any non-irritating way to have this occur without
making use of this exposed functionality, and I doubt I'm the only one
who has something they'd like to do which makes use of this.
Thanks to the code cleanup / refactoring in the first commit, this
option is pretty trivial to expose, so I thought why not!
Does this help clarify the purpose to you?
Timothy.
p.s.I'd rather not have to copy-paste (evern by template expansion)
several lines like this into every file I export :cry:
#+HTML_HEAD: {{{meta_maybe_description}}}
#+MACRO: meta_maybe_description (eval (let ((description (delq nil
(org-element-map (org-element-parse-buffer) 'keyword (lambda (kw)
(when (string= "SUBTITLE" (org-element-property :key kw))
(org-element-property :value kw))))))) (if description (format "<meta
name=\"description\" content=\"%s\" />" (replace-regexp-in-string "\""
""" (org-html-encode-plain-text description)))) ""))
When I could just have this in my config:
(when (org-string-nw-p (plist-get info :description))
(list "name" "description"
(plist-get info :description))
Timothy E Chapman
tecosaur@gmail.com
tecosaur.com
On Wed, 16 Dec 2020 at 12:13, Tom Gillespie <tgbugs@gmail.com> wrote:
>
> A question from the slightly uninformed. Why not just use #+html_head:
> possibly with a macro to fill in variable values? That is fully
> extensible and doesn't overload keywords. For title, date, author,
> etc. those can have clearly defined mappings to the html, but
> everything else seems to be handled more sanely with #+html_head:. Am
> I missing something? Best,
> Tom
^ permalink raw reply [relevance 73%]
* Re: [PATCH] Enhance org-html--build-meta-info
@ 2020-12-15 11:39 34% ` TEC
0 siblings, 2 replies; 74+ results
From: TEC @ 2020-12-15 11:39 UTC (permalink / raw)
To: Jens Lechtenboerger; +Cc: Bastien, org-mode-email
[-- Attachment #1: Type: text/plain, Size: 1351 bytes --]
Thanks for testing Jens. I think I've managed to resolve the issues
you've raised.
Jens, Bastien, you can find the latest revision of the patches attached :)
Jens Lechtenboerger <lechten@wi.uni-muenster.de> writes:
> [title export being dodgy, how about treating like author?]
Yep, ~org-element-interpret-data~ is necessary. I found that wrapping it
in ~org-html-plain-text~ seems better again though, as it encodes
entities like "---" (org) to "—", and doesn't seem to introduce
any nested tags. I've also applied this to the author field as a result.
Maybe it should be applied to the rest (in ~org-html--build-meta-info~)?
I'm not sure.
> The keywords export as follows, where the name attribute is missing:
> <meta keywords="key, wörd, *bold*, sub_script" />
Fixed.
> The current lambda functions in org-html-meta-tags all accept three
> arguments, where the first one is ignored in all cases. The second
> one is used in exactly one case. Why not add four calls to
> org-html--build-meta-entry (for author, description, keywords,
> generator) in org-html--build-meta-info?
I had an idea on this, I think the new form is cleaner.
Either have a list where each item generates a meta entry, or a function
that generates such a list. No more mixing of the two.
How does this look?
Timothy.
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-lisp-ox-html.el-make-html-meta-tag-builder-nicer.patch --]
[-- Type: text/x-patch, Size: 5934 bytes --]
From 9848af808752bc03404befaab7ab5ebb902aa1d0 Mon Sep 17 00:00:00 2001
From: TEC <tec@tecosaur.com>
Date: Mon, 14 Dec 2020 17:41:33 +0800
Subject: [PATCH 1/2] lisp/ox-html.el: make html meta tag builder nicer
* lisp/ox-html.el (org-html--build-meta-info): Multi-line repeated
structure extracted to new function `org-html--build-meta-entry'.
The keyword value formatting is changed from `org-export-data' to
`org-html-encode-plain-text' to avoid potentially nesting HTML tags in
meta tags and the <title> element, which would violate W3C.
---
lisp/ox-html.el | 114 ++++++++++++++++++++++++------------------------
1 file changed, 56 insertions(+), 58 deletions(-)
diff --git a/lisp/ox-html.el b/lisp/ox-html.el
index d2f24f5c6..005703f60 100644
--- a/lisp/ox-html.el
+++ b/lisp/ox-html.el
@@ -1835,78 +1835,76 @@ INFO is a plist used as a communication channel."
\f
;;; Template
+(defun org-html--build-meta-entry (label identity &optional content-format &rest content-formatters)
+ "Construct <meta> tag of form <meta LABEL=\"IDENTITY\" />, or when CONTENT-FORMAT is present:
+<meta LABEL=\"IDENTITY\" content=\"{content}\" />
+
+Here {content} is determined by applying any CONTENT-FORMATTERS to the CONTENT-FORMAT and encoding
+the result as plain text."
+ (concat "<meta "
+ (format "%s=\"%s" label identity)
+ (when content-format
+ (concat "\" content=\""
+ (replace-regexp-in-string
+ "\"" """
+ (org-html-encode-plain-text
+ (if content-formatters
+ (apply #'format content-format content-formatters)
+ content-format)))))
+ "\" />\n"))
+
(defun org-html--build-meta-info (info)
"Return meta tags for exported document.
INFO is a plist used as a communication channel."
- (let* ((protect-string
- (lambda (str)
- (replace-regexp-in-string
- "\"" """ (org-html-encode-plain-text str))))
- (title (org-export-data (plist-get info :title) info))
- ;; Set title to an invisible character instead of leaving it
- ;; empty, which is invalid.
- (title (if (org-string-nw-p title) title "‎"))
- (author (and (plist-get info :with-author)
- (let ((auth (plist-get info :author)))
+ (let* ((title (org-html-plain-text
+ (org-element-interpret-data (plist-get info :title)) info))
+ ;; Set title to an invisible character instead of leaving it
+ ;; empty, which is invalid.
+ (title (if (org-string-nw-p title) title "‎"))
+ (author (and (plist-get info :with-author)
+ (let ((auth (plist-get info :author)))
;; Return raw Org syntax.
- (and auth (org-element-interpret-data auth)))))
- (description (plist-get info :description))
- (keywords (plist-get info :keywords))
- (charset (or (and org-html-coding-system
- (fboundp 'coding-system-get)
- (coding-system-get org-html-coding-system
- 'mime-charset))
- "iso-8859-1")))
+ (and auth (org-html-plain-text
+ (org-element-interpret-data auth) info)))))
+ (charset (or (and org-html-coding-system
+ (fboundp 'coding-system-get)
+ (symbol-name
+ (coding-system-get org-html-coding-system
+ 'mime-charset)))
+ "iso-8859-1")))
(concat
(when (plist-get info :time-stamp-file)
(format-time-string
(concat "<!-- "
(plist-get info :html-metadata-timestamp-format)
" -->\n")))
- (format
- (if (org-html-html5-p info)
- (org-html-close-tag "meta" "charset=\"%s\"" info)
- (org-html-close-tag
- "meta" "http-equiv=\"Content-Type\" content=\"text/html;charset=%s\""
- info))
- charset) "\n"
+
+ (if (org-html-html5-p info)
+ (org-html--build-meta-entry "charset" charset)
+ (org-html--build-meta-entry "http-equiv" "Content-Type"
+ (concat "text/html;charset=" charset)))
+
(let ((viewport-options
(cl-remove-if-not (lambda (cell) (org-string-nw-p (cadr cell)))
(plist-get info :html-viewport))))
- (and viewport-options
- (concat
- (org-html-close-tag
- "meta"
- (format "name=\"viewport\" content=\"%s\""
- (mapconcat
- (lambda (elm) (format "%s=%s" (car elm) (cadr elm)))
- viewport-options ", "))
- info)
- "\n")))
+ (if viewport-options
+ (org-html--build-meta-entry "name" "viewport"
+ (mapconcat
+ (lambda (elm) (format "%s=%s" (car elm) (cadr elm)))
+ viewport-options ", "))))
+
(format "<title>%s</title>\n" title)
- (org-html-close-tag "meta" "name=\"generator\" content=\"Org mode\"" info)
- "\n"
- (and (org-string-nw-p author)
- (concat
- (org-html-close-tag "meta"
- (format "name=\"author\" content=\"%s\""
- (funcall protect-string author))
- info)
- "\n"))
- (and (org-string-nw-p description)
- (concat
- (org-html-close-tag "meta"
- (format "name=\"description\" content=\"%s\"\n"
- (funcall protect-string description))
- info)
- "\n"))
- (and (org-string-nw-p keywords)
- (concat
- (org-html-close-tag "meta"
- (format "name=\"keywords\" content=\"%s\""
- (funcall protect-string keywords))
- info)
- "\n")))))
+
+ (when (org-string-nw-p author)
+ (org-html--build-meta-entry "name" "author" author))
+
+ (when (org-string-nw-p (plist-get info :description))
+ (org-html--build-meta-entry "name" "description" (plist-get info :description)))
+
+ (when (org-string-nw-p (plist-get info :keywords))
+ (org-html--build-meta-entry "keywords" (plist-get info :keywords)))
+
+ (org-html--build-meta-entry "name" "generator" "Org Mode"))))
(defun org-html--build-head (info)
"Return information for the <head>..</head> of the HTML output.
--
2.29.2
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #3: 0002-lisp-ox-html.el-make-html-meta-tags-customizable.patch --]
[-- Type: text/x-patch, Size: 3616 bytes --]
From 3fdc205a549fe315b3096afb72a87868ef9c57d5 Mon Sep 17 00:00:00 2001
From: TEC <tec@tecosaur.com>
Date: Mon, 14 Dec 2020 17:50:15 +0800
Subject: [PATCH 2/2] lisp/ox-html.el: make html meta tags customizable
* lisp/ox-html.el (org-html-meta-tags): Introduce this as a new option
which can be modified to set the meta tags added in HTML exports.
(org-html--build-meta-info): Make use of `org-html-meta-tags' instead of
hardcoded meta tags. This is leveraging the earlier restructuring of
`org-html--build-meta-info' into a much DRYer form, such that this
modification has a negligible impact on complexity and readability.
---
lisp/ox-html.el | 47 +++++++++++++++++++++++++++++++++++++----------
1 file changed, 37 insertions(+), 10 deletions(-)
diff --git a/lisp/ox-html.el b/lisp/ox-html.el
index 005703f60..6a74cdca8 100644
--- a/lisp/ox-html.el
+++ b/lisp/ox-html.el
@@ -1425,6 +1425,22 @@ not be modified."
;;;; Template :: Styles
+(defcustom org-html-meta-tags #'org-html-meta-tags-default
+ "A list where each item is a list of arguments to be passed
+to `org-html--build-meta-entry'. Any nil items are ignored.
+
+Also accept a function which gives such a list when called with with
+signature (TITLE AUTHOR INFO) where TITLE and AUTHOR are strings,
+and INFO a communication plist."
+ :group 'org-export-html
+ :package-version '(Org . "9.5")
+ :type '(choice
+ (repeat
+ (list (string :tag "Meta label")
+ (string :tag "label value")
+ (string :tag "Content value")))
+ function))
+
(defcustom org-html-head-include-default-style t
"Non-nil means include the default style in exported HTML files.
The actual style is defined in `org-html-style-default' and
@@ -1835,6 +1851,22 @@ INFO is a plist used as a communication channel."
\f
;;; Template
+(defun org-html-meta-tags-default (_title author info)
+ "Generate a list items, each of which is a list of arguments that can
+be passed to `org-html--build-meta-entry', to generate meta tags to be
+included in the HTML head.
+
+The documents's TITLE, AUTHOR, and communication plist INFO may be used."
+ (list
+ (when (org-string-nw-p author)
+ (list "name" "author" author))
+ (when (org-string-nw-p (plist-get info :description))
+ (list "name" "description"
+ (plist-get info :description)))
+ (when (org-string-nw-p (plist-get info :keywords))
+ (list "name" "keywords" (plist-get info :keywords)))
+ '("name" "generator" "Org Mode")))
+
(defun org-html--build-meta-entry (label identity &optional content-format &rest content-formatters)
"Construct <meta> tag of form <meta LABEL=\"IDENTITY\" />, or when CONTENT-FORMAT is present:
<meta LABEL=\"IDENTITY\" content=\"{content}\" />
@@ -1895,16 +1927,11 @@ INFO is a plist used as a communication channel."
(format "<title>%s</title>\n" title)
- (when (org-string-nw-p author)
- (org-html--build-meta-entry "name" "author" author))
-
- (when (org-string-nw-p (plist-get info :description))
- (org-html--build-meta-entry "name" "description" (plist-get info :description)))
-
- (when (org-string-nw-p (plist-get info :keywords))
- (org-html--build-meta-entry "keywords" (plist-get info :keywords)))
-
- (org-html--build-meta-entry "name" "generator" "Org Mode"))))
+ (mapconcat
+ (lambda (args) (apply #'org-html--build-meta-entry args))
+ (delq nil (if (functionp org-html-meta-tags)
+ (funcall org-html-meta-tags title author info)
+ org-html-meta-tags)) ""))))
(defun org-html--build-head (info)
"Return information for the <head>..</head> of the HTML output.
--
2.29.2
^ permalink raw reply related [relevance 34%]
* Re: [PATCH] Enhance org-html--build-meta-info
@ 2020-12-14 10:01 37% ` TEC
0 siblings, 0 replies; 74+ results
From: TEC @ 2020-12-14 10:01 UTC (permalink / raw)
To: Bastien; +Cc: Jens Lechtenboerger, org-mode-email
[-- Attachment #1: Type: text/plain, Size: 460 bytes --]
Bastien <bzg@gnu.org> writes:
> TEC <tecosaur@gmail.com> writes:
>
>> In case of confusion, this isn't replacing the #+title in the document,
>> just the <title>...</title> which is used as the tab content.
>
> Fine then.
😅 as it so happens I've revised my thoughts, and I'm just leaving it
blank as it currently is.
Anyway, here are the revised patches. Let me know if there's anything
else you'd like to see tweaked :)
--
Timothy
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-lisp-ox-html.el-make-html-meta-tag-builder-nicer.patch --]
[-- Type: text/x-patch, Size: 5882 bytes --]
From 92b2ab771a1f90f269f20727903c9f42596d32e6 Mon Sep 17 00:00:00 2001
From: TEC <tec@tecosaur.com>
Date: Mon, 14 Dec 2020 17:41:33 +0800
Subject: [PATCH 1/2] lisp/ox-html.el: make html meta tag builder nicer
* lisp/ox-html.el (org-html--build-meta-info): Multi-line repeated
structure extracted to new function `org-html--build-meta-entry'.
The keyword value formatting is changed from `org-export-data' to
`org-html-encode-plain-text' to avoid potentially nesting HTML tags in
meta tags and the <title> element, which would violate W3C.
---
lisp/ox-html.el | 112 +++++++++++++++++++++++-------------------------
1 file changed, 54 insertions(+), 58 deletions(-)
diff --git a/lisp/ox-html.el b/lisp/ox-html.el
index d2f24f5c6..e774b53ac 100644
--- a/lisp/ox-html.el
+++ b/lisp/ox-html.el
@@ -1835,78 +1835,74 @@ INFO is a plist used as a communication channel."
\f
;;; Template
+(defun org-html--build-meta-entry (label identity &optional content-format &rest content-formatters)
+ "Construct <meta> tag of form <meta LABEL=\"IDENTITY\" />, or when CONTENT-FORMAT is present:
+<meta LABEL=\"IDENTITY\" content=\"{content}\" />
+
+Here {content} is determined by applying any CONTENT-FORMATTERS to the CONTENT-FORMAT and encoding
+the result as plain text."
+ (concat "<meta "
+ (format "%s=\"%s" label identity)
+ (when content-format
+ (concat "\" content=\""
+ (replace-regexp-in-string
+ "\"" """
+ (org-html-encode-plain-text
+ (if content-formatters
+ (apply #'format content-format content-formatters)
+ content-format)))))
+ "\" />\n"))
+
(defun org-html--build-meta-info (info)
"Return meta tags for exported document.
INFO is a plist used as a communication channel."
- (let* ((protect-string
- (lambda (str)
- (replace-regexp-in-string
- "\"" """ (org-html-encode-plain-text str))))
- (title (org-export-data (plist-get info :title) info))
- ;; Set title to an invisible character instead of leaving it
- ;; empty, which is invalid.
- (title (if (org-string-nw-p title) title "‎"))
- (author (and (plist-get info :with-author)
- (let ((auth (plist-get info :author)))
+ (let* ((title (org-html-encode-plain-text (or (car (plist-get info :title)) "")))
+ ;; Set title to an invisible character instead of leaving it
+ ;; empty, which is invalid.
+ (title (if (org-string-nw-p title) title "‎"))
+ (author (and (plist-get info :with-author)
+ (let ((auth (plist-get info :author)))
;; Return raw Org syntax.
- (and auth (org-element-interpret-data auth)))))
- (description (plist-get info :description))
- (keywords (plist-get info :keywords))
- (charset (or (and org-html-coding-system
- (fboundp 'coding-system-get)
- (coding-system-get org-html-coding-system
- 'mime-charset))
- "iso-8859-1")))
+ (and auth (org-element-interpret-data auth)))))
+ (charset (or (and org-html-coding-system
+ (fboundp 'coding-system-get)
+ (symbol-name
+ (coding-system-get org-html-coding-system
+ 'mime-charset)))
+ "iso-8859-1")))
(concat
(when (plist-get info :time-stamp-file)
(format-time-string
(concat "<!-- "
(plist-get info :html-metadata-timestamp-format)
" -->\n")))
- (format
- (if (org-html-html5-p info)
- (org-html-close-tag "meta" "charset=\"%s\"" info)
- (org-html-close-tag
- "meta" "http-equiv=\"Content-Type\" content=\"text/html;charset=%s\""
- info))
- charset) "\n"
+
+ (if (org-html-html5-p info)
+ (org-html--build-meta-entry "charset" charset)
+ (org-html--build-meta-entry "http-equiv" "Content-Type"
+ (concat "text/html;charset=" charset)))
+
(let ((viewport-options
(cl-remove-if-not (lambda (cell) (org-string-nw-p (cadr cell)))
(plist-get info :html-viewport))))
- (and viewport-options
- (concat
- (org-html-close-tag
- "meta"
- (format "name=\"viewport\" content=\"%s\""
- (mapconcat
- (lambda (elm) (format "%s=%s" (car elm) (cadr elm)))
- viewport-options ", "))
- info)
- "\n")))
+ (if viewport-options
+ (org-html--build-meta-entry "name" "viewport"
+ (mapconcat
+ (lambda (elm) (format "%s=%s" (car elm) (cadr elm)))
+ viewport-options ", "))))
+
(format "<title>%s</title>\n" title)
- (org-html-close-tag "meta" "name=\"generator\" content=\"Org mode\"" info)
- "\n"
- (and (org-string-nw-p author)
- (concat
- (org-html-close-tag "meta"
- (format "name=\"author\" content=\"%s\""
- (funcall protect-string author))
- info)
- "\n"))
- (and (org-string-nw-p description)
- (concat
- (org-html-close-tag "meta"
- (format "name=\"description\" content=\"%s\"\n"
- (funcall protect-string description))
- info)
- "\n"))
- (and (org-string-nw-p keywords)
- (concat
- (org-html-close-tag "meta"
- (format "name=\"keywords\" content=\"%s\""
- (funcall protect-string keywords))
- info)
- "\n")))))
+
+ (when (org-string-nw-p author)
+ (org-html--build-meta-entry "name" "author" author))
+
+ (when (org-string-nw-p (plist-get info :description))
+ (org-html--build-meta-entry "name" "description" (plist-get info :description)))
+
+ (when (org-string-nw-p (plist-get info :keywords))
+ (org-html--build-meta-entry "keywords" (plist-get info :keywords)))
+
+ (org-html--build-meta-entry "name" "generator" "Org Mode"))))
(defun org-html--build-head (info)
"Return information for the <head>..</head> of the HTML output.
--
2.29.2
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #3: 0002-lisp-ox-html.el-make-html-meta-tags-customizable.patch --]
[-- Type: text/x-patch, Size: 3019 bytes --]
From a2fae2c3c7f38ee8d22a4fedbce25d046c8a818d Mon Sep 17 00:00:00 2001
From: TEC <tec@tecosaur.com>
Date: Mon, 14 Dec 2020 17:50:15 +0800
Subject: [PATCH 2/2] lisp/ox-html.el: make html meta tags customizable
* lisp/ox-html.el (org-html-meta-tags): Introduce this as a new option
which can be modified to set the meta tags added in HTML exports.
(org-html--build-meta-info): Make use of `org-html-meta-tags' instead of
hardcoded meta tags. This is leveraging the earlier restructuring of
`org-html--build-meta-info' into a much DRYer form, such that this
modification has a negligible impact on complexity and readability.
---
lisp/ox-html.el | 43 +++++++++++++++++++++++++++++++++----------
1 file changed, 33 insertions(+), 10 deletions(-)
diff --git a/lisp/ox-html.el b/lisp/ox-html.el
index e774b53ac..35e056557 100644
--- a/lisp/ox-html.el
+++ b/lisp/ox-html.el
@@ -1425,6 +1425,31 @@ not be modified."
;;;; Template :: Styles
+(defcustom org-html-meta-tags
+ '((lambda (_title author _info)
+ (when (org-string-nw-p author)
+ (list "name" "author" author)))
+ (lambda (_title _author info)
+ (when (org-string-nw-p (plist-get info :description))
+ (list "name" "description"
+ (plist-get info :description))))
+ (lambda (_title _author info)
+ (when (org-string-nw-p (plist-get info :keywords))
+ (list "keywords" (plist-get info :keywords))))
+ ("name" "generator" "Org Mode"))
+ "A list of arguments to be passed to `org-html--build-meta-entry'.
+Each argument can either be an list which is applied, or a function which
+generates such a list with signature (TITLE AUTHOR INFO) where TITLE and AUTHOR
+are strings, and INFO a communication plist."
+ :group 'org-export-html
+ :package-version '(Org . "9.5")
+ :type '(repeat
+ (choice
+ (list (string :tag "Meta label")
+ (string :tag "label value")
+ (string :tag "Content value"))
+ function)))
+
(defcustom org-html-head-include-default-style t
"Non-nil means include the default style in exported HTML files.
The actual style is defined in `org-html-style-default' and
@@ -1893,16 +1918,14 @@ INFO is a plist used as a communication channel."
(format "<title>%s</title>\n" title)
- (when (org-string-nw-p author)
- (org-html--build-meta-entry "name" "author" author))
-
- (when (org-string-nw-p (plist-get info :description))
- (org-html--build-meta-entry "name" "description" (plist-get info :description)))
-
- (when (org-string-nw-p (plist-get info :keywords))
- (org-html--build-meta-entry "keywords" (plist-get info :keywords)))
-
- (org-html--build-meta-entry "name" "generator" "Org Mode"))))
+ (apply #'concat
+ (mapcar
+ (lambda (form)
+ (when (functionp form)
+ (setq form (funcall form title author info)))
+ (when form
+ (apply #'org-html--build-meta-entry form)))
+ org-html-meta-tags)))))
(defun org-html--build-head (info)
"Return information for the <head>..</head> of the HTML output.
--
2.29.2
^ permalink raw reply related [relevance 37%]
* Re: [PATCH] Enhance org-html--build-meta-info
@ 2020-12-14 7:27 90% ` TEC
0 siblings, 1 reply; 74+ results
From: TEC @ 2020-12-14 7:27 UTC (permalink / raw)
To: Bastien; +Cc: Jens Lechtenboerger, org-mode-email
Bastien <bzg@gnu.org> writes:
> Can we approach this with two patches, one with the refactoring and
> one with the added functionality?
Sure :) I'll take care of this when I get home in a few hours.
> This sounds useful.
Glad to hear!
> I think "Org Export" as the default is counter-intuitive, let's stick
> to the empty string. (Also, this kind of "small" changes should be
> made with consideration of all exporters.)
In case of confusion, this isn't replacing the #+title in the document,
just the <title>...</title> which is used as the tab content.
I just find blank tabs to be quite unhelpful, particularly when nestled
among others.
I'm not really aware of anything analogous in other exporters. Maybe the
metadata in exported PDFs ... but that doesn't exactly show up in
browser tabs :P
> Nope, the first line of a docstring should be a sentence. You'll have
> to reformulate the beginning of the docstring...
I'll take care of this with the patch separation.
Thanks for the feedback!
Timothy.
^ permalink raw reply [relevance 90%]
* Re: [PATCH] Enhance org-html--build-meta-info
@ 2020-12-14 6:34 66% ` TEC
1 sibling, 1 reply; 74+ results
From: TEC @ 2020-12-14 6:34 UTC (permalink / raw)
To: Bastien; +Cc: Jens Lechtenboerger, org-mode-email
Bastien <bzg@gnu.org> writes:
> Let's wait for Jens feedback on this patch, since he took care of
> testing it so far.
Assuming Jens responds as he usually has (relatively promptly), this
sounds good to me :)
> In a nutshell, can you restate what problem is this patch fixing?
There are two things I intend to achieve with this patch:
1. DRY* out the existing code. The existing code is quite repetitive in
structure, and easily lends itself to being extracted to a function.
This is easier to read, and work with IMO.
2. Make use of the DRYer code in (1) to provide a make the meta building
function more versatile, and then add in the ability for user
customisation at low-cost (again, thanks to (1)).
*DRY is an acronym for "Don't Repeat Yourself", in case there's a french
equivalent you're more familiar with.
> Is a new option really necessary here?
Necessary? Not really, I mean the export /works/ without it. I'd argue
that it's desirable though, as it provides an easy way for a user (such
as myself) to add useful meta tags not included by default. For example
I currently make use of this to add information that parsed by a large
number of services/apps to create rich embeds for exported Org files I
link to (see
https://tecosaur.github.io/emacs-config/config.html#extra-header-content,code--2
).
Furthermore, I consider it to be very low cost, since it's basically
just taking advantage of the restructuring already performed for code
QOL reasons.
I expect most users not to have any reason to touch this, but for some
to find it handy.
> Are there backward compatibility considerations we should take care of?
None AFAIK. Barring this errors that Jens raised, and now have hopefully
been addressed, this should function /exactly/ as the current
implementation does, with a minor (beneficial) caveat, mentioned below.
Just with nicer-to-work-with code and a bit more versatility (IMO, of
course).
These are the two changes to be mentioned:
1. The (or {title} "Org Export") bit I added.
I believe the current behaviour when no #+title is given is to have a
blank one (""). I think "Org Export" is preferable, as it's more
informative than ... nothing.
2. Using org-html-encode-plain-text for formatting the content of the
meta tags. From Jens, I take it that the current org-export-data can
cause nested HTML tags, which are invalid in this context. Plain text
should be safer.
>> +(defun org-html--build-meta-entry (label identity &optional content-format &rest content-formatters)
>> + "Construct <meta> tag with LABEL=\"IDENTITY\" and content from CONTENT-FORMAT and CONTENT-FORMATTER."
>
> The first line of this defun is too long. You can try M-x checkdoc
> RET on your elisp files to catch those issues.
>
> Thanks,
I see, I'm guessing I'll just need to add a line break.
I hope that clarifies things!
Timothy
^ permalink raw reply [relevance 66%]
* Re: [PATCH] org-plot abstractions and extension
@ 2020-12-14 6:30 93% ` TEC
1 sibling, 0 replies; 74+ results
From: TEC @ 2020-12-14 6:30 UTC (permalink / raw)
To: Bastien; +Cc: org-mode-email
Bastien <bzg@gnu.org> writes:
> Applied, with minor modifications of the changelog entries:
>
> - You need to add an entry when creating a new custom variable.
>
> - I suggest saying "option" instead of "custom variable".
>
> - Sentences should be separated by two spaces and start with an
> uppercase letter.
>
> Also, the convention in Emacs is to avoid whitespaces-only commits,
> you need to fix whitespaces within other non-whitespaces changes in
> a commit.
Thanks for the feedback on the patches! I tried to get it right after my
previous (and first) attempt, but it looks like there are a few things I
still need to take note of. Big improvement though, nonetheless,
hopefully next time they'll be nothing to change :)
All the best,
Timothy
^ permalink raw reply [relevance 93%]
* Re: [PATCH] Enhance org-html--build-meta-info
@ 2020-12-13 16:12 46% ` TEC
0 siblings, 1 reply; 74+ results
From: TEC @ 2020-12-13 16:12 UTC (permalink / raw)
To: Jens Lechtenboerger; +Cc: org-mode-email
[-- Attachment #1: Type: text/plain, Size: 600 bytes --]
Jens Lechtenboerger <lechten@wi.uni-muenster.de> writes:
> Without the second argument I get an error “Wrong type argument:
> stringp,” when evaluating regular expressions against the cons cell
> that is returned as title.
>
> As I see now, author and title are cons cells, which is why
> org-element-interpret-data is necessary to produce strings with Org
> syntax.
>
> Also, after fixing the title, I get “wrong-type-argument sequencep
> utf-8” for “(concat "text/html;charset=" charset)”.
Thanks for testing this :) I haven't forgotten about this.
Next version!
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-lisp-ox-html.el-make-html-meta-func-nicer.patch --]
[-- Type: text/x-patch, Size: 6662 bytes --]
From 1289e381aff7562df96945aa58838ad966aa9211 Mon Sep 17 00:00:00 2001
From: TEC <tec@tecosaur.com>
Date: Thu, 17 Sep 2020 21:27:18 +0800
Subject: [PATCH] lisp/ox-html.el: make html meta func nicer
* lisp/ox-html.el (org-html--build-meta-info): Multi-line repeated
structure extracted to new function `org-html--build-meta-entry'.
The opportunity was taken to extract most metadata info to custom
variable `org-html-meta-tags', allowing for easy end-user modification.
---
lisp/ox-html.el | 131 +++++++++++++++++++++++++++---------------------
1 file changed, 73 insertions(+), 58 deletions(-)
diff --git a/lisp/ox-html.el b/lisp/ox-html.el
index d2f24f5c6..93014e9c7 100644
--- a/lisp/ox-html.el
+++ b/lisp/ox-html.el
@@ -1425,6 +1425,31 @@ not be modified."
;;;; Template :: Styles
+(defcustom org-html-meta-tags
+ '((lambda (_title author _info)
+ (when (org-string-nw-p author)
+ (list "name" "author" author)))
+ (lambda (_title _author info)
+ (when (org-string-nw-p (plist-get info :description))
+ (list "name" "description"
+ (plist-get info :description))))
+ (lambda (_title _author info)
+ (when (org-string-nw-p (plist-get info :keywords))
+ (list "keywords" (plist-get info :keywords))))
+ ("name" "generator" "Org Mode"))
+ "A list of arguments to be passed to `org-html--build-meta-entry'.
+Each argument can either be an list which is applied, or a function which
+generates such a list with signature (TITLE AUTHOR INFO) where TITLE and AUTHOR
+are strings, and INFO a communication plist."
+ :group 'org-export-html
+ :package-version '(Org . "9.5")
+ :type '(repeat
+ (choice
+ (list (string :tag "Meta label")
+ (string :tag "label value")
+ (string :tag "Content value"))
+ function)))
+
(defcustom org-html-head-include-default-style t
"Non-nil means include the default style in exported HTML files.
The actual style is defined in `org-html-style-default' and
@@ -1835,78 +1860,68 @@ INFO is a plist used as a communication channel."
\f
;;; Template
+(defun org-html--build-meta-entry (label identity &optional content-format &rest content-formatters)
+ "Construct <meta> tag with LABEL=\"IDENTITY\" and content from CONTENT-FORMAT and CONTENT-FORMATTER."
+ (concat "<meta "
+ (format "%s=\"%s" label identity)
+ (when content-format
+ (concat "\" content=\""
+ (replace-regexp-in-string
+ "\"" """
+ (org-html-encode-plain-text
+ (if content-formatters
+ (apply #'format content-format content-formatters)
+ content-format)))))
+ "\" />\n"))
+
(defun org-html--build-meta-info (info)
"Return meta tags for exported document.
INFO is a plist used as a communication channel."
- (let* ((protect-string
- (lambda (str)
- (replace-regexp-in-string
- "\"" """ (org-html-encode-plain-text str))))
- (title (org-export-data (plist-get info :title) info))
- ;; Set title to an invisible character instead of leaving it
- ;; empty, which is invalid.
- (title (if (org-string-nw-p title) title "‎"))
- (author (and (plist-get info :with-author)
- (let ((auth (plist-get info :author)))
+ (let* ((title (org-html-encode-plain-text (or (car (plist-get info :title)) "Org Export")))
+ ;; Set title to an invisible character instead of leaving it
+ ;; empty, which is invalid.
+ (title (if (org-string-nw-p title) title "‎"))
+ (author (and (plist-get info :with-author)
+ (let ((auth (plist-get info :author)))
;; Return raw Org syntax.
- (and auth (org-element-interpret-data auth)))))
- (description (plist-get info :description))
- (keywords (plist-get info :keywords))
- (charset (or (and org-html-coding-system
- (fboundp 'coding-system-get)
- (coding-system-get org-html-coding-system
- 'mime-charset))
- "iso-8859-1")))
+ (and auth (org-element-interpret-data auth)))))
+ (charset (or (and org-html-coding-system
+ (fboundp 'coding-system-get)
+ (symbol-name
+ (coding-system-get org-html-coding-system
+ 'mime-charset)))
+ "iso-8859-1")))
(concat
(when (plist-get info :time-stamp-file)
(format-time-string
(concat "<!-- "
(plist-get info :html-metadata-timestamp-format)
" -->\n")))
- (format
- (if (org-html-html5-p info)
- (org-html-close-tag "meta" "charset=\"%s\"" info)
- (org-html-close-tag
- "meta" "http-equiv=\"Content-Type\" content=\"text/html;charset=%s\""
- info))
- charset) "\n"
+
+ (if (org-html-html5-p info)
+ (org-html--build-meta-entry "charset" charset)
+ (org-html--build-meta-entry "http-equiv" "Content-Type"
+ (concat "text/html;charset=" charset)))
+
(let ((viewport-options
(cl-remove-if-not (lambda (cell) (org-string-nw-p (cadr cell)))
(plist-get info :html-viewport))))
- (and viewport-options
- (concat
- (org-html-close-tag
- "meta"
- (format "name=\"viewport\" content=\"%s\""
- (mapconcat
- (lambda (elm) (format "%s=%s" (car elm) (cadr elm)))
- viewport-options ", "))
- info)
- "\n")))
+ (if viewport-options
+ (org-html--build-meta-entry "name" "viewport"
+ (mapconcat
+ (lambda (elm) (format "%s=%s" (car elm) (cadr elm)))
+ viewport-options ", "))))
+
(format "<title>%s</title>\n" title)
- (org-html-close-tag "meta" "name=\"generator\" content=\"Org mode\"" info)
- "\n"
- (and (org-string-nw-p author)
- (concat
- (org-html-close-tag "meta"
- (format "name=\"author\" content=\"%s\""
- (funcall protect-string author))
- info)
- "\n"))
- (and (org-string-nw-p description)
- (concat
- (org-html-close-tag "meta"
- (format "name=\"description\" content=\"%s\"\n"
- (funcall protect-string description))
- info)
- "\n"))
- (and (org-string-nw-p keywords)
- (concat
- (org-html-close-tag "meta"
- (format "name=\"keywords\" content=\"%s\""
- (funcall protect-string keywords))
- info)
- "\n")))))
+
+ (apply #'concat
+ (mapcar
+ (lambda (form)
+ (when (functionp form)
+ (setq form (funcall form title author info)))
+ (when form
+ (apply #'org-html--build-meta-entry form)))
+ org-html-meta-tags)))))
(defun org-html--build-head (info)
"Return information for the <head>..</head> of the HTML output.
--
2.29.2
^ permalink raw reply related [relevance 46%]
* Re: [PATCH] org-plot abstractions and extension
2020-10-24 18:16 8% ` TEC
@ 2020-12-09 2:58 93% ` TEC
1 sibling, 0 replies; 74+ results
From: TEC @ 2020-12-09 2:58 UTC (permalink / raw)
To: Bastien; +Cc: org-mode-email
It's now been 1.5 months, so I'm going to bump this thread.
--
Timothy
TEC <tecosaur@gmail.com> writes:
> Bastien <bzg@gnu.org> writes:
>
>> I'm not an org-plot.el user so I cannot test, but by reading the
>> patches, they look okay.
>>
>> Let's go in "optimistic merging" mode and commit your patches?
>
> Sounds good then. I don't expect the changes to compromise any
> existing
> functionality.
>
>> Is https://orgmode.org/list/87lfhbhfhe.fsf@gmail.com/ the latest
>> version I should use?
>
> I've smoothed a rough edge or two, and added a documentation
> entry.
>
> I'll attach all the patches to this email, so there's no
> ambiguity.
> (crosses fingers for attachments working as expected)
^ permalink raw reply [relevance 93%]
* Re: [PATCH] doc/org-manual.org: Extend table formulas Lisp form documentation
@ 2020-11-18 19:42 71% ` TEC
0 siblings, 0 replies; 74+ results
From: TEC @ 2020-11-18 19:42 UTC (permalink / raw)
To: emacs-orgmode
I have 2c on the use of "interpolated".
1. I tend to think of "interpolated" in terms of it's mathematical
meaning
2. The other denotations relate to insertion and renewing, which
simply
doesn't fit.
I appreciate that other people may have used this too, but as I
see it
that just means that other people have engaged in strange word
choices.
Suggested alternatives: Substituted, transpiled, or translated.
Timothy.
-----
For context, here's the definition, etymology, and symonyms.
Definition
Intransitive Verb
1. To renew; to carry on with intermission. [Obs.]
2. To alter or corrupt by the insertion of new or foreign
matter; especially, to change, as a book or text, by the
insertion of matter that is new, or foreign to the purpose
of the author.
3. (Mathematics) To fill up intermediate terms of, as of a
series,
according to the law of the series; to introduce, as a
number or quantity, in a partial series, according to the
law of that part of the series.
Adjective
1. Inserted in, or added to, the original; introduced;
foisted in; changed by the insertion of new or spurious
matter.
2. (Math.)
(a) Provided with necessary interpolations; as, an
interpolated table.
(b) Introduced or determined by interpolation; as,
interpolated quantities or numbers.
Etymology
interpolate verb
1610s, "to alter or enlarge (a writing) by inserting new
material," from Latin
interpolatus, past participle of interpolare "alter, freshen up,
polish;" of
writing, "falsify," from inter "among, between" (see inter-) +
polare, which is
related to polire "to smoothe, polish," from PIE root *pel- ( 5)
"to thrust,
strike, drive," the connecting notion being "to full cloth"
[Watkins].
Sense evolved in Latin from "refurbish," to "alter appearance of,"
to "falsify
(especially by adding new material)." Middle English had
interpolen (early 15c.)
in a similar sense. Related: Interpolated; interpolating.
Synonyms
verb adjective
1. Insert (wrongfully), foist in.
2. (Math .) Introduce, intercalate (terms to complete a series).
Tim Cross <theophilusx@gmail.com> writes:
> Daniele Nicolodi <daniele@grinta.net> writes:
>
>> On 16/11/2020 11:25, Eric S Fraga wrote:
>>> Daniele,
>>>
>>> this looks good. One minor pedantic point: I think you mean
>>> "interpreted" when you say "interpolated" (several times in
>>> the
>>> text). Otherwise, this is a very useful addition to the
>>> manual.
>>
>> Thank you for reading and for the comment.
>>
>> "interpolated" looks strange to me in this context too, but it
>> is the
>> word that is currently used in the manual. I decided to stick
>> to this
>> term for consistency, however, I haven't check if it is used
>> with the
>> same meaning elsewhere.
>>
>> I don't think it is wrong to use "interpolated", but if you
>> thing it
>> should be changed I can change it and check the manual for
>> consistency.
>> However, I don't think "interpreted" is the right word either.
>> Probably
>> "replaced" or "substituted" are better choices in this context.
>>
>
> I agree. Interpolated is consistent with manuals for other
> programming
> languages which have similar functionality. However, org is also
> used by
> a more diverse community than typical programming languages, so
> perhaps
> 'replaced' or 'substituted' would be a better choice?
^ permalink raw reply [relevance 71%]
* Re: [PATCH] org-plot abstractions and extension
@ 2020-10-24 18:16 8% ` TEC
2020-12-09 2:58 93% ` TEC
0 siblings, 2 replies; 74+ results
From: TEC @ 2020-10-24 18:16 UTC (permalink / raw)
To: Bastien; +Cc: org-mode-email
[-- Attachment #1: Type: text/plain, Size: 581 bytes --]
Bastien <bzg@gnu.org> writes:
> I'm not an org-plot.el user so I cannot test, but by reading the
> patches, they look okay.
>
> Let's go in "optimistic merging" mode and commit your patches?
Sounds good then. I don't expect the changes to compromise any
existing
functionality.
> Is https://orgmode.org/list/87lfhbhfhe.fsf@gmail.com/ the latest
> version I should use?
I've smoothed a rough edge or two, and added a documentation
entry.
I'll attach all the patches to this email, so there's no
ambiguity.
(crosses fingers for attachments working as expected)
--
Timothy
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-org-plot.el-make-indentation-method-consistent.patch --]
[-- Type: text/x-patch, Size: 1467 bytes --]
From 3743e507775b446f5f8188958c20f65861fac3fb Mon Sep 17 00:00:00 2001
From: TEC <tec@tecosaur.com>
Date: Wed, 8 Jul 2020 18:34:46 +0800
Subject: [PATCH 01/15] org-plot.el: make indentation method consistent
* lisp/org-plot.el (org-plot/gnuplot): Make indentation consistent, by
replacing a few spaces with tabs.
Only 6 of 347 lines used spaces instead of tabs.
---
lisp/org-plot.el | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/lisp/org-plot.el b/lisp/org-plot.el
index 0ff96af67..c08bc144e 100644
--- a/lisp/org-plot.el
+++ b/lisp/org-plot.el
@@ -325,12 +325,12 @@ line directly before or after the table."
(with-temp-buffer
(if (plist-get params :script) ; user script
(progn (insert
- (org-plot/gnuplot-script data-file num-cols params t))
- (insert "\n")
- (insert-file-contents (plist-get params :script))
- (goto-char (point-min))
- (while (re-search-forward "\\$datafile" nil t)
- (replace-match data-file nil nil)))
+ (org-plot/gnuplot-script data-file num-cols params t))
+ (insert "\n")
+ (insert-file-contents (plist-get params :script))
+ (goto-char (point-min))
+ (while (re-search-forward "\\$datafile" nil t)
+ (replace-match data-file nil nil)))
(insert (org-plot/gnuplot-script data-file num-cols params)))
;; Graph table.
(gnuplot-mode)
--
2.28.0
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #3: 0002-org-plot.el-add-new-option-transpose.patch --]
[-- Type: text/x-patch, Size: 3084 bytes --]
From c62e817b04dfbe624ee8b2090ebcde257bbd3f23 Mon Sep 17 00:00:00 2001
From: TEC <tec@tecosaur.com>
Date: Wed, 8 Jul 2020 19:26:07 +0800
Subject: [PATCH 02/15] org-plot.el: add new option :transpose
* lisp/org-plot.el (org-plot/add-options-to-plist,
org-plot/add-options-to-plist): Add a new option :transpose, and a
shorter alias :trans. Transposition is performed if the argument is yes,
y, or t. This treats the table as a matrix and performs matrix
transposition on it. If an hline is present, it is assumed that it is a
marks a separation from a first header row. The first row is then
treated as the new header by inserting a hline in the transposed data.
This is quite useful for some plots, where across multiple categories,
there are a large number of data points. Without this, the data points
would be columns and the table can spread irritatingly wide.
---
lisp/org-plot.el | 44 +++++++++++++++++++++++++++++---------------
1 file changed, 29 insertions(+), 15 deletions(-)
diff --git a/lisp/org-plot.el b/lisp/org-plot.el
index c08bc144e..6ff633130 100644
--- a/lisp/org-plot.el
+++ b/lisp/org-plot.el
@@ -50,19 +50,21 @@
"Parse an OPTIONS line and set values in the property list P.
Returns the resulting property list."
(when options
- (let ((op '(("type" . :plot-type)
- ("script" . :script)
- ("line" . :line)
- ("set" . :set)
- ("title" . :title)
- ("ind" . :ind)
- ("deps" . :deps)
- ("with" . :with)
- ("file" . :file)
- ("labels" . :labels)
- ("map" . :map)
- ("timeind" . :timeind)
- ("timefmt" . :timefmt)))
+ (let ((op '(("type" . :plot-type)
+ ("script" . :script)
+ ("line" . :line)
+ ("set" . :set)
+ ("title" . :title)
+ ("ind" . :ind)
+ ("deps" . :deps)
+ ("with" . :with)
+ ("file" . :file)
+ ("labels" . :labels)
+ ("map" . :map)
+ ("timeind" . :timeind)
+ ("timefmt" . :timefmt)
+ ("trans" . :transpose)
+ ("transpose" . :transpose)))
(multiples '("set" "line"))
(regexp ":\\([\"][^\"]+?[\"]\\|[(][^)]+?[)]\\|[^ \t\n\r;,.]*\\)")
(start 0))
@@ -289,8 +291,20 @@ line directly before or after the table."
(setf params (plist-put params (car pair) (cdr pair)))))
;; collect table and table information
(let* ((data-file (make-temp-file "org-plot"))
- (table (org-table-collapse-header (org-table-to-lisp)))
- (num-cols (length (car table))))
+ (table (let ((tbl (org-table-to-lisp)))
+ (when (pcase (plist-get params :transpose)
+ ('y t)
+ ('yes t)
+ ('t t))
+ (if (memq 'hline tbl)
+ (setq tbl (apply #'cl-mapcar #'list tbl))
+ ;; When present, remove hlines as they can't (currentily) be easily transposed.
+ (setq tbl (apply #'cl-mapcar #'list
+ (remove 'hline tbl)))
+ (push 'hline (cdr tbl))))
+ tbl))
+ (num-cols (length (if (eq (nth 0 table) 'hline) (nth 1 table)
+ (nth 0 table)))))
(run-with-idle-timer 0.1 nil #'delete-file data-file)
(when (eq (cadr table) 'hline)
(setf params
--
2.28.0
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #4: 0003-org-plot.el-add-new-custom-gnuplot-preamble.patch --]
[-- Type: text/x-patch, Size: 2013 bytes --]
From fc7f4015c726e4a685002e8d69fad1eb1d605790 Mon Sep 17 00:00:00 2001
From: TEC <tec@tecosaur.com>
Date: Wed, 8 Jul 2020 22:26:21 +0800
Subject: [PATCH 03/15] org-plot.el: add new custom gnuplot preamble
* lisp/org-plot.el: Define new custom variable
`org-plot/gnuplot-script-preamble' which can be either a string or a
function. The value of this (when executed, in the case of the
function) is inserted near the top of the generated gnuplot script.
(org-plot/gnuplot-script): Use the new variable
`org-plot/gnuplot-script-preamble' in the manner described.
This allows for the user to set the font/colour-scheme, default
precision, and much more.
---
lisp/org-plot.el | 13 +++++++++++++
1 file changed, 13 insertions(+)
diff --git a/lisp/org-plot.el b/lisp/org-plot.el
index 6ff633130..f8db45273 100644
--- a/lisp/org-plot.el
+++ b/lisp/org-plot.el
@@ -181,6 +181,13 @@ and dependent variables."
(setf back-edge "") (setf front-edge ""))))
row-vals))
+(defcustom org-plot/gnuplot-script-preamble ""
+ "String or function which provides content to be inserted into the GNUPlot
+script before the plot command. Not that this is in addition to, not instead of
+other content generated in `org-plot/gnuplot-script'."
+ :group 'org-plot
+ :type '(choice string function))
+
(defun org-plot/gnuplot-script (data-file num-cols params &optional preface)
"Write a gnuplot script to DATA-FILE respecting the options set in PARAMS.
NUM-COLS controls the number of columns plotted in a 2-d plot.
@@ -213,6 +220,12 @@ manner suitable for prepending to a user-specified script."
(when file ; output file
(funcall ats (format "set term %s" (file-name-extension file)))
(funcall ats (format "set output '%s'" file)))
+
+ (funcall ats
+ (if (stringp org-plot/gnuplot-script-preamble)
+ org-plot/gnuplot-script-preamble
+ (org-plot/gnuplot-script-preamble)))
+
(pcase type ; type
(`2d ())
(`3d (when map (funcall ats "set map")))
--
2.28.0
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #5: 0004-org-plot.el-abstract-plot-types-into-custom-var.patch --]
[-- Type: text/x-patch, Size: 4470 bytes --]
From fc1ecf42cd8d0d27cda98ced2c2be365ad305df7 Mon Sep 17 00:00:00 2001
From: TEC <tec@tecosaur.com>
Date: Thu, 9 Jul 2020 04:27:18 +0800
Subject: [PATCH 04/15] org-plot.el: abstract plot types into custom var
* lisp/org-plot.el (org-plot/gnuplot-script): Abstract the generation of
gnuplot commands from the three hardcoded types: 2d, 3d, and grid.
A new custom variable `org-plot/preset-plot-types' is defined to declare
plot types and provide a lambda which is called with a fixed signature
to generate associated gnuplot code. The previously hardcoded types are
implemented as the default value.
By extracting these types to a custom variable, users are able to create
their own presets for frequently used setups. Note that while this moves
the most significant hardcoding of the 2d, 3d, and grid types in
`org-plot/gnuplot-script', there are still a few minor fragments that I
am not sure how to best address --- yet.
---
lisp/org-plot.el | 71 ++++++++++++++++++++++++++++++++----------------
1 file changed, 48 insertions(+), 23 deletions(-)
diff --git a/lisp/org-plot.el b/lisp/org-plot.el
index f8db45273..207f5d4af 100644
--- a/lisp/org-plot.el
+++ b/lisp/org-plot.el
@@ -188,6 +188,49 @@ other content generated in `org-plot/gnuplot-script'."
:group 'org-plot
:type '(choice string function))
+(defcustom org-plot/preset-plot-types
+ '((2d (lambda (data-file num-cols params plot-str)
+ (let* ((type (plist-get params :plot-type))
+ (with (if (eq type 'grid) 'pm3d (plist-get params :with)))
+ (ind (plist-get params :ind))
+ (deps (if (plist-member params :deps) (plist-get params :deps)))
+ (text-ind (plist-get params :textind))
+ (col-labels (plist-get params :labels))
+ res)
+ (dotimes (col num-cols res)
+ (unless (and (eq type '2d)
+ (or (and ind (equal (1+ col) ind))
+ (and deps (not (member (1+ col) deps)))))
+ (setf res
+ (cons
+ (format plot-str data-file
+ (or (and ind (> ind 0)
+ (not text-ind)
+ (format "%d:" ind)) "")
+ (1+ col)
+ (if text-ind (format ":xticlabel(%d)" ind) "")
+ with
+ (or (nth col col-labels)
+ (format "%d" (1+ col))))
+ res)))))))
+ (3d (lambda (data-file num-cols params plot-str)
+ (let* ((type (plist-get params :plot-type))
+ (with (if (eq type 'grid) 'pm3d (plist-get params :with))))
+ (list (format "'%s' matrix with %s title ''"
+ data-file with)))))
+ (grid (lambda (data-file num-cols params plot-str)
+ (let* ((type (plist-get params :plot-type))
+ (with (if (eq type 'grid) 'pm3d (plist-get params :with))))
+ (list (format "'%s' with %s title ''"
+ data-file with))))))
+ "List of plot presets with the type name as the car, and a function
+which yeilds plot-lines (a list of strings) as the cdr.
+The parameters of `org-plot/gnuplot-script' and PLOT-STR are passed to
+that function. i.e. it is called with the following arguments:
+ DATA-FILE NUM-COLS PARAMS PLOT-STR"
+ :group 'org-plot
+ :type '(alist :value-type (symbol group)))
+
(defun org-plot/gnuplot-script (data-file num-cols params &optional preface)
"Write a gnuplot script to DATA-FILE respecting the options set in PARAMS.
NUM-COLS controls the number of columns plotted in a 2-d plot.
@@ -254,29 +297,11 @@ manner suitable for prepending to a user-specified script."
(or timefmt ; timefmt passed to gnuplot
"%Y-%m-%d-%H:%M:%S") "\"")))
(unless preface
- (pcase type ; plot command
- (`2d (dotimes (col num-cols)
- (unless (and (eq type '2d)
- (or (and ind (equal (1+ col) ind))
- (and deps (not (member (1+ col) deps)))))
- (setf plot-lines
- (cons
- (format plot-str data-file
- (or (and ind (> ind 0)
- (not text-ind)
- (format "%d:" ind)) "")
- (1+ col)
- (if text-ind (format ":xticlabel(%d)" ind) "")
- with
- (or (nth col col-labels)
- (format "%d" (1+ col))))
- plot-lines)))))
- (`3d
- (setq plot-lines (list (format "'%s' matrix with %s title ''"
- data-file with))))
- (`grid
- (setq plot-lines (list (format "'%s' with %s title ''"
- data-file with)))))
+ (let ((type-func (cadr (assoc type org-plot/preset-plot-types))))
+ (when type-func
+ (setq plot-lines
+ (funcall type-func data-file num-cols params plot-str))))
+
(funcall ats
(concat plot-cmd " " (mapconcat #'identity
(reverse plot-lines)
--
2.28.0
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #6: 0005-org-plot.el-add-utility-functions-for-range-ticks.patch --]
[-- Type: text/x-patch, Size: 6285 bytes --]
From d99a61170bb0ff10b9fc7b99cdc957ec574c1e51 Mon Sep 17 00:00:00 2001
From: TEC <tec@tecosaur.com>
Date: Thu, 9 Jul 2020 04:47:40 +0800
Subject: [PATCH 05/15] org-plot.el: add utility functions for range,ticks
* lisp/org-plot.el (org-plot/add-options-to-plist): Add the options :ymin
:ymax :xmin :xmax, as well as :min and :max as aliases to the y{min,max}
options. The :ticks option is also added, for specifying how many ticks
should be used.
(org--plot/values-stats, org--plot/sensible-tick-num,
org--plot/nice-frequency-pick, org--plot/merge-alists,
org--plot/item-frequencies, org--plot/prime-factors): New utility
functions added to allow for somewhat sensible determination of a :ticks
value when none is provided. This turns out to be harder than expected,
and so a number of functions are used to attempt to do so. The essence
of the method used, is to round values and find their prime
decompositions. From this we try to select the most common components
to give a reasonable step size. We also add a 'ticks' parameter for
manually setting the number of ticks, and (y)min/max parameters
similarly.
---
lisp/org-plot.el | 100 +++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 100 insertions(+)
diff --git a/lisp/org-plot.el b/lisp/org-plot.el
index 207f5d4af..2a9c0f5bd 100644
--- a/lisp/org-plot.el
+++ b/lisp/org-plot.el
@@ -63,6 +63,11 @@ Returns the resulting property list."
("map" . :map)
("timeind" . :timeind)
("timefmt" . :timefmt)
+ ("min" . :ymin)
+ ("max" . :ymax)
+ ("ymin" . :ymin)
+ ("xmax" . :xmax)
+ ("ticks" . :ticks)
("trans" . :transpose)
("transpose" . :transpose)))
(multiples '("set" "line"))
@@ -181,6 +186,101 @@ and dependent variables."
(setf back-edge "") (setf front-edge ""))))
row-vals))
+(defun org--plot/values-stats (nums &optional hard-min hard-max)
+ "From a list of NUMS return a plist containing some rudamentry statistics on the
+values, namely regarding the range."
+ (let* ((minimum (or hard-min (apply #'min nums)))
+ (maximum (or hard-max (apply #'max nums)))
+ (range (- maximum minimum))
+ (rangeOrder (ceiling (- 1 (log10 range))))
+ (range-factor (expt 10 rangeOrder))
+ (nice-min (/ (float (floor (* minimum range-factor))) range-factor))
+ (nice-max (/ (float (ceiling (* maximum range-factor))) range-factor)))
+ `(:min ,minimum :max ,maximum :range ,range
+ :range-factor ,range-factor
+ :nice-min ,nice-min :nice-max ,nice-max :nice-range ,(- nice-max nice-min))))
+
+(defun org--plot/sensible-tick-num (table &optional hard-min hard-max)
+ "From a the values in a TABLE of data, attempt to guess an appropriate number of ticks."
+ (let* ((row-data
+ (mapcar (lambda (row) (org--plot/values-stats
+ (mapcar #'string-to-number (cdr row))
+ hard-min
+ hard-max)) table))
+ (row-normalised-ranges (mapcar (lambda (r-data)
+ (let ((val (round (*
+ (plist-get r-data :range-factor)
+ (plist-get r-data :nice-range)))))
+ (if (= (% val 10) 0) (/ val 10) val)))
+ row-data))
+ (range-prime-decomposition (mapcar #'org--plot/prime-factors row-normalised-ranges))
+ (weighted-factors (sort (apply #'org--plot/merge-alists #'+ 0
+ (mapcar (lambda (factors) (org--plot/item-frequencies factors t))
+ range-prime-decomposition))
+ (lambda (a b) (> (cdr a) (cdr b))))))
+ (apply #'* (org--plot/nice-frequency-pick weighted-factors))))
+
+(defun org--plot/nice-frequency-pick (frequencies)
+ "From a list of frequences, try to sensibly pick a sample of the most frequent."
+ ;; TODO this mosly works decently, but counld do with some tweaking to work more consistently.
+ (case (length frequencies)
+ (1 (list (car (nth 0 frequencies))))
+ (2 (if (<= 3 (/ (cdr (nth 0 frequencies))
+ (cdr (nth 1 frequencies))))
+ (make-list 2
+ (car (nth 0 frequencies)))
+ (list (car (nth 0 frequencies))
+ (car (nth 1 frequencies)))))
+ (t
+ (let* ((total-count (apply #'+ (mapcar #'cdr frequencies)))
+ (n-freq (mapcar (lambda (freq) `(,(car freq) . ,(/ (float (cdr freq)) total-count))) frequencies))
+ (f-pick (list (car (car n-freq))))
+ (1-2-ratio (/ (cdr (nth 0 n-freq))
+ (cdr (nth 1 n-freq))))
+ (2-3-ratio (/ (cdr (nth 1 n-freq))
+ (cdr (nth 2 n-freq))))
+ (1-3-ratio (* 1-2-ratio 2-3-ratio))
+ (1-val (car (nth 0 n-freq)))
+ (2-val (car (nth 1 n-freq)))
+ (3-val (car (nth 2 n-freq))))
+ (when (> 1-2-ratio 4) (push 1-val f-pick))
+ (when (and (< 1-2-ratio 2-val)
+ (< (* (apply #'* f-pick) 2-val) 30))
+ (push 2-val f-pick))
+ (when (and (< 1-3-ratio 3-val)
+ (< (* (apply #'* f-pick) 3-val) 30))
+ (push 3-val f-pick))
+ f-pick))))
+
+(defun org--plot/merge-alists (function default alist1 alist2 &rest alists)
+ "Using FUNCTION, combine the elements of all given ALISTS. When an element is
+only present in one alist, DEFAULT is used as the second argument for the FUNCTION."
+ (when (> (length alists) 0)
+ (setq alist2 (apply #'org--plot/merge-alists function default alist2 alists)))
+ (flet ((keys (alist) (mapcar #'car alist))
+ (lookup (key alist) (or (cdr (assoc key alist)) default)))
+ (loop with keys = (union (keys alist1) (keys alist2) :test 'equal)
+ for k in keys collect
+ (cons k (funcall function (lookup k alist1) (lookup k alist2))))))
+
+(defun org--plot/item-frequencies (values &optional normalise)
+ "Return an alist indicating the frequency of values in VALUES list."
+ (let ((normaliser (if normalise (float (length values)) 1)))
+ (cl-loop for (n . m) in (seq-group-by #'identity values)
+ collect (cons n (/ (length m) normaliser)))))
+
+(defun org--plot/prime-factors (value)
+ "Return the prime decomposition of VALUE, e.g. for 12, '(3 2 2)"
+ (let ((factors '(1)) (i 1))
+ (while (/= 1 value)
+ (setq i (1+ i))
+ (when (eq 0 (% value i))
+ (push i factors)
+ (setq value (/ value i))
+ (setq i (1- i))
+ ))
+ (subseq factors 0 -1)))
+
(defcustom org-plot/gnuplot-script-preamble ""
"String or function which provides content to be inserted into the GNUPlot
script before the plot command. Not that this is in addition to, not instead of
--
2.28.0
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #7: 0006-org-plot.el-add-custom-var-for-affecting-the-term.patch --]
[-- Type: text/x-patch, Size: 2034 bytes --]
From 26c09d431030bacfc5a4ce84103b2eca186b2229 Mon Sep 17 00:00:00 2001
From: TEC <tec@tecosaur.com>
Date: Thu, 9 Jul 2020 05:00:03 +0800
Subject: [PATCH 06/15] org-plot.el: add custom var for affecting the term
* lisp/org-plot.el (org-plot/gnuplot-script): Allow for customisation of
org-plot's term by adding a custom variable
`org-plot/gnuplot-term-extra' which allows the user to tweak the gnuplot
term settings. This allows for setting characteristics such as default
size, or background colour.
---
lisp/org-plot.el | 18 ++++++++++++++++--
1 file changed, 16 insertions(+), 2 deletions(-)
diff --git a/lisp/org-plot.el b/lisp/org-plot.el
index 2a9c0f5bd..ed4cea195 100644
--- a/lisp/org-plot.el
+++ b/lisp/org-plot.el
@@ -331,6 +331,13 @@ that function. i.e. it is called with the following arguments:
:group 'org-plot
:type '(alist :value-type (symbol group)))
+(defcustom org-plot/gnuplot-term-extra ""
+ "String or function which provides the extra term options.
+E.g. a value of \"size 1050,650\" would cause
+\"set term ... size 1050,650\" to be used."
+ :group 'org-plot
+ :type '(choice string function))
+
(defun org-plot/gnuplot-script (data-file num-cols params &optional preface)
"Write a gnuplot script to DATA-FILE respecting the options set in PARAMS.
NUM-COLS controls the number of columns plotted in a 2-d plot.
@@ -360,8 +367,15 @@ manner suitable for prepending to a user-specified script."
;; ats = add-to-script
(ats (lambda (line) (setf script (concat script "\n" line))))
plot-lines)
- (when file ; output file
- (funcall ats (format "set term %s" (file-name-extension file)))
+
+
+ ;; handle output file, background, and size
+ (funcall ats (format "set term %s %s"
+ (if file (file-name-extension file) "GNUTERM")
+ (if (stringp org-plot/gnuplot-term-extra)
+ org-plot/gnuplot-term-extra
+ (org-plot/gnuplot-term-extra))))
+ (when file ; output file
(funcall ats (format "set output '%s'" file)))
(funcall ats
--
2.28.0
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #8: 0007-org-plot.el-tweak-term-preamble-custom-vars.patch --]
[-- Type: text/x-patch, Size: 2287 bytes --]
From 5a1b9ff8f3ba5be565828137460023cd39194b6c Mon Sep 17 00:00:00 2001
From: TEC <tec@tecosaur.com>
Date: Thu, 9 Jul 2020 05:05:20 +0800
Subject: [PATCH 07/15] org-plot.el: tweak term, preamble custom vars
* lisp/org-plot.el (org-plot/gnuplot-script): Call the term and preamble
functions (mentioned below) with the plot type as the argument.
(org-plot/gnuplot-script-preamble, org-plot/gnuplot-term-extra): update
docstring.
---
lisp/org-plot.el | 10 ++++++----
1 file changed, 6 insertions(+), 4 deletions(-)
diff --git a/lisp/org-plot.el b/lisp/org-plot.el
index ed4cea195..52422ea2f 100644
--- a/lisp/org-plot.el
+++ b/lisp/org-plot.el
@@ -284,7 +284,8 @@ only present in one alist, DEFAULT is used as the second argument for the FUNCTI
(defcustom org-plot/gnuplot-script-preamble ""
"String or function which provides content to be inserted into the GNUPlot
script before the plot command. Not that this is in addition to, not instead of
-other content generated in `org-plot/gnuplot-script'."
+other content generated in `org-plot/gnuplot-script'.
+If a function, it is called with the plot type as the argument."
:group 'org-plot
:type '(choice string function))
@@ -334,7 +335,8 @@ that function. i.e. it is called with the following arguments:
(defcustom org-plot/gnuplot-term-extra ""
"String or function which provides the extra term options.
E.g. a value of \"size 1050,650\" would cause
-\"set term ... size 1050,650\" to be used."
+\"set term ... size 1050,650\" to be used.
+If a function, it is called with the plot type as the argument."
:group 'org-plot
:type '(choice string function))
@@ -374,14 +376,14 @@ manner suitable for prepending to a user-specified script."
(if file (file-name-extension file) "GNUTERM")
(if (stringp org-plot/gnuplot-term-extra)
org-plot/gnuplot-term-extra
- (org-plot/gnuplot-term-extra))))
+ (org-plot/gnuplot-term-extra type))))
(when file ; output file
(funcall ats (format "set output '%s'" file)))
(funcall ats
(if (stringp org-plot/gnuplot-script-preamble)
org-plot/gnuplot-script-preamble
- (org-plot/gnuplot-script-preamble)))
+ (org-plot/gnuplot-script-preamble type)))
(pcase type ; type
(`2d ())
--
2.28.0
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #9: 0008-org-plot.el-add-radar-plot-type.patch --]
[-- Type: text/x-patch, Size: 6388 bytes --]
From 3e9338962a4af033bd56e8ab7a1abe5e636d71c5 Mon Sep 17 00:00:00 2001
From: TEC <tec@tecosaur.com>
Date: Thu, 9 Jul 2020 05:21:44 +0800
Subject: [PATCH 08/15] org-plot.el: add radar plot type
* lisp/org-plot.el (org--plot/radar): Implement a new plot type "radar".
(org--plot/radar-template): A huge template sting for `org-plot/radar'.
(org--plot/radar-ticks, org--plot/radar-setup-template): Smaller
template strings for use in `org-plot/radar'.
(org-plot/preset-plot-types): Add the new "radar" type to the list of
default types.
The radar type has a long and complex implementation, but that's exactly
what makes it perfect for something like this. A complex plot can be
produced with a simple keyword in the #+PLOT options. There are still a
few kinks that would benefit from being ironed out, but the current
state is fully-functional.
---
lisp/org-plot.el | 138 ++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 137 insertions(+), 1 deletion(-)
diff --git a/lisp/org-plot.el b/lisp/org-plot.el
index 52422ea2f..fd92a12a1 100644
--- a/lisp/org-plot.el
+++ b/lisp/org-plot.el
@@ -323,7 +323,9 @@ If a function, it is called with the plot type as the argument."
(let* ((type (plist-get params :plot-type))
(with (if (eq type 'grid) 'pm3d (plist-get params :with))))
(list (format "'%s' with %s title ''"
- data-file with))))))
+ data-file with)))))
+ (radar (lambda (data-file num-cols params plot-str)
+ (list (org--plot/radar table params)))))
"List of plot presets with the type name as the car, and a function
which yeilds plot-lines (a list of strings) as the cdr.
The parameters of `org-plot/gnuplot-script' and PLOT-STR are passed to
@@ -332,6 +334,140 @@ that function. i.e. it is called with the following arguments:
:group 'org-plot
:type '(alist :value-type (symbol group)))
+(defvar org--plot/radar-template
+ "### spider plot/chart with gnuplot
+# also known as: radar chart, web chart, star chart, cobweb chart,
+# radar plot, web plot, star plot, cobweb plot, etc. ...
+set datafile separator ' '
+set size square
+unset tics
+set angles degree
+set key bmargin center horizontal
+unset border
+
+# Load data and settup
+load \"%s\"
+
+# General settings
+DataColCount = words($Data[1])-1
+AxesCount = |$Data|-HeaderLines
+AngleOffset = 90
+Max = 1
+d=0.1*Max
+Direction = -1 # counterclockwise=1, clockwise = -1
+
+# Tic settings
+TicCount = %s
+TicOffset = 0.1
+TicValue(axis,i) = real(i)*(word($Settings[axis],3)-word($Settings[axis],2)) \\
+ / word($Settings[axis],4)+word($Settings[axis],2)
+TicLabelPosX(axis,i) = PosX(axis,i/TicCount) + PosY(axis, TicOffset)
+TicLabelPosY(axis,i) = PosY(axis,i/TicCount) - PosX(axis, TicOffset)
+TicLen = 0.03
+TicdX(axis,i) = 0.5*TicLen*cos(alpha(axis)-90)
+TicdY(axis,i) = 0.5*TicLen*sin(alpha(axis)-90)
+
+# Label
+LabOffset = 0.10
+LabX(axis) = PosX(axis+1,Max+2*d) + PosY(axis, LabOffset)
+LabY(axis) = PosY($0+1,Max+2*d)
+
+# Functions
+alpha(axis) = (axis-1)*Direction*360.0/AxesCount+AngleOffset
+PosX(axis,R) = R*cos(alpha(axis))
+PosY(axis,R) = R*sin(alpha(axis))
+Scale(axis,value) = real(value-word($Settings[axis],2))/(word($Settings[axis],3)-word($Settings[axis],2))
+
+# Spider settings
+set style arrow 1 dt 1 lw 1.0 @fgal head filled size 0.06,25 # style for axes
+set style arrow 2 dt 2 lw 0.5 @fgal nohead # style for weblines
+set style arrow 3 dt 1 lw 1 @fgal nohead # style for axis tics
+set samples AxesCount
+set isosamples TicCount
+set urange[1:AxesCount]
+set vrange[1:TicCount]
+set style fill transparent solid 0.2
+
+set xrange[-Max-4*d:Max+4*d]
+set yrange[-Max-4*d:Max+4*d]
+plot \\
+ '+' u (0):(0):(PosX($0,Max+d)):(PosY($0,Max+d)) w vec as 1 not, \\
+ $Data u (LabX($0)): \\
+ (LabY($0)):1 every ::HeaderLines w labels center enhanced @fgt not, \\
+ for [i=1:DataColCount] $Data u (PosX($0+1,Scale($0+1,column(i+1)))): \\
+ (PosY($0+1,Scale($0+1,column(i+1)))) every ::HeaderLines w filledcurves lt i title word($Data[1],i+1), \\
+%s
+# '++' u (PosX($1,$2/TicCount)-TicdX($1,$2/TicCount)): \\
+# (PosY($1,$2/TicCount)-TicdY($1,$2/TicCount)): \\
+# (2*TicdX($1,$2/TicCount)):(2*TicdY($1,$2/TicCount)) \\
+# w vec as 3 not, \\
+### end of code
+")
+
+(defvar org--plot/radar-ticks
+ " '++' u (PosX($1,$2/TicCount)):(PosY($1,$2/TicCount)): \\
+ (PosX($1+1,$2/TicCount)-PosX($1,$2/TicCount)): \\
+ (PosY($1+1,$2/TicCount)-PosY($1,$2/TicCount)) w vec as 2 not, \\
+ '++' u (TicLabelPosX(%s,$2)):(TicLabelPosY(%s,$2)): \\
+ (sprintf('%%g',TicValue(%s,$2))) w labels font ',8' @fgat not")
+
+(defvar org--plot/radar-setup-template
+ "# Data
+$Data <<HEREHAVESOMEDATA
+%s
+HEREHAVESOMEDATA
+HeaderLines = 1
+
+# Settings for scale and offset adjustments
+# axis min max tics axisLabelXoff axisLabelYoff
+$Settings <<EOD
+%s
+EOD
+")
+
+(defun org--plot/radar (table params)
+ (let* ((data
+ (concat "\"" (s-join "\" \"" (plist-get params :labels)) "\""
+ "\n"
+ (s-join "\n"
+ (mapcar (lambda (row)
+ (format
+ "\"%s\" %s"
+ (car row)
+ (s-join " " (cdr row))))
+ table))))
+ (ticks (or (plist-get params :ticks)
+ (org--plot/sensible-tick-num table
+ (plist-get params :ymin)
+ (plist-get params :ymax))))
+ (settings
+ (s-join "\n"
+ (mapcar (lambda (row)
+ (let ((data (org--plot/values-stats
+ (mapcar #'string-to-number (cdr row)))))
+ (format
+ "\"%s\" %s %s %s"
+ (car row)
+ (or (plist-get params :ymin)
+ (plist-get data :nice-min))
+ (or (plist-get params :ymax)
+ (plist-get data :nice-max))
+ (if (eq ticks 0) 2 ticks)
+ )))
+ table)))
+ (setup-file (make-temp-file "org-plot-setup")))
+ (f-write-text (format org--plot/radar-setup-template data settings)
+ 'utf-8 setup-file)
+ (format org--plot/radar-template
+ setup-file
+ (if (eq ticks 0) 2 ticks)
+ (if (eq ticks 0) ""
+ (apply #'format org--plot/radar-ticks
+ (make-list 3 (if (and (plist-get params :ymin)
+ (plist-get params :ymax))
+ ;; FIXME multi-drawing of tick labels with "1"
+ "1" "$1")))))))
+
(defcustom org-plot/gnuplot-term-extra ""
"String or function which provides the extra term options.
E.g. a value of \"size 1050,650\" would cause
--
2.28.0
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #10: 0009-org-plot.el-fix-logic-error-in-transposition.patch --]
[-- Type: text/x-patch, Size: 1668 bytes --]
From 8b1ed7fb3cc418bb90fe48d3c4c8cb711decfded Mon Sep 17 00:00:00 2001
From: TEC <tec@tecosaur.com>
Date: Thu, 30 Jul 2020 18:25:19 +0800
Subject: [PATCH 09/15] org-plot.el: fix logic error in transposition
* lisp/org-plot.el (org-plot/gnuplot): If statement in transposition
treated condition as its negative, to fix this the condition was
inverted.
It was also noticed that the code could not operate as expected as the
user-supplied #+plot options were not fetched. Resolved by re-inserting
relevant code from an older version of org-plot.
---
lisp/org-plot.el | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/lisp/org-plot.el b/lisp/org-plot.el
index fd92a12a1..1b227d698 100644
--- a/lisp/org-plot.el
+++ b/lisp/org-plot.el
@@ -579,6 +579,10 @@ line directly before or after the table."
(dolist (pair org-plot/gnuplot-default-options)
(unless (plist-member params (car pair))
(setf params (plist-put params (car pair) (cdr pair)))))
+ ;; Collect options.
+ (save-excursion (while (and (equal 0 (forward-line -1))
+ (looking-at "[[:space:]]*#\\+"))
+ (setf params (org-plot/collect-options params))))
;; collect table and table information
(let* ((data-file (make-temp-file "org-plot"))
(table (let ((tbl (org-table-to-lisp)))
@@ -586,7 +590,7 @@ line directly before or after the table."
('y t)
('yes t)
('t t))
- (if (memq 'hline tbl)
+ (if (not (memq 'hline tbl))
(setq tbl (apply #'cl-mapcar #'list tbl))
;; When present, remove hlines as they can't (currentily) be easily transposed.
(setq tbl (apply #'cl-mapcar #'list
--
2.28.0
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #11: 0010-org-plot.el-complete-transition-to-softcoded-type.patch --]
[-- Type: text/x-patch, Size: 13498 bytes --]
From bcd45c562966a893449d2412b363f31368ee5983 Mon Sep 17 00:00:00 2001
From: TEC <tec@tecosaur.com>
Date: Thu, 30 Jul 2020 18:36:11 +0800
Subject: [PATCH 10/15] org-plot.el: complete transition to softcoded type
* lisp/org-plot.el (org-plot/preset-plot-types): Adapt structure to
cover all type-specific logic within org-plot.
(org-plot/gnuplot-script, org-plot/gnuplot): Replace type-specific logic
with references to properties of the type from
`org-plot/preset-plot-types'.
---
lisp/org-plot.el | 242 ++++++++++++++++++++++++++++-------------------
1 file changed, 143 insertions(+), 99 deletions(-)
diff --git a/lisp/org-plot.el b/lisp/org-plot.el
index 1b227d698..53186bb75 100644
--- a/lisp/org-plot.el
+++ b/lisp/org-plot.el
@@ -290,7 +290,10 @@ If a function, it is called with the plot type as the argument."
:type '(choice string function))
(defcustom org-plot/preset-plot-types
- '((2d (lambda (data-file num-cols params plot-str)
+ '((2d :plot-cmd "plot"
+ :check-ind-type t
+ :plot-func
+ (lambda (_table data-file num-cols params plot-str)
(let* ((type (plist-get params :plot-type))
(with (if (eq type 'grid) 'pm3d (plist-get params :with)))
(ind (plist-get params :ind))
@@ -314,23 +317,60 @@ If a function, it is called with the plot type as the argument."
(or (nth col col-labels)
(format "%d" (1+ col))))
res)))))))
- (3d (lambda (data-file num-cols params plot-str)
+ (3d :plot-cmd "splot"
+ :plot-pre (lambda (_table _data-file _num-cols params _plot-str)
+ (if (plist-get params :map) "set map"))
+ :plot-func
+ (lambda (_table data-file _num-cols params _plot-str)
(let* ((type (plist-get params :plot-type))
(with (if (eq type 'grid) 'pm3d (plist-get params :with))))
(list (format "'%s' matrix with %s title ''"
data-file with)))))
- (grid (lambda (data-file num-cols params plot-str)
+ (grid :plot-cmd "splot"
+ :plot-pre (lambda (_table _data-file _num-cols params _plot-str)
+ (if (plist-get params :map) "set pm3d map" "set map"))
+ :data-dump (lambda (table data-file params _num-cols)
+ (let ((y-labels (org-plot/gnuplot-to-grid-data
+ table data-file params)))
+ (when y-labels (plist-put params :ylabels y-labels))))
+ :plot-func
+ (lambda (table data-file _num-cols params _plot-str)
(let* ((type (plist-get params :plot-type))
(with (if (eq type 'grid) 'pm3d (plist-get params :with))))
- (list (format "'%s' with %s title ''"
- data-file with)))))
- (radar (lambda (data-file num-cols params plot-str)
+ (list (format "'%s' with %s title ''"
+ data-file with)))))
+ (radar :plot-func
+ (lambda (table _data-file _num-cols params plot-str)
(list (org--plot/radar table params)))))
- "List of plot presets with the type name as the car, and a function
-which yeilds plot-lines (a list of strings) as the cdr.
-The parameters of `org-plot/gnuplot-script' and PLOT-STR are passed to
-that function. i.e. it is called with the following arguments:
- DATA-FILE NUM-COLS PARAMS PLOT-STR"
+ "List of plists describing the avalible plot types.
+The car is the type name, and the property :plot-func must be set.
+The value of :plot-func is a lambda which yields plot-lines
+(a list of strings) as the cdr.
+
+All lambda functions have the parameters of `org-plot/gnuplot-script' and PLOT-STR passed to them.
+i.e. they are called with the following signature: (TABLE DATA-FILE NUM-COLS PARAMS PLOT-STR)
+
+Potentially useful parameters in PARAMS include:
+ :set :line :map :title :file :ind :timeind :timefmt :textind
+ :deps :labels :xlabels :ylabels :xmin :xmax :ymin :ymax :ticks
+
+In addition to :plot-func, the following optional properties may be set.
+
+- :plot-cmd - A gnuplot command appended to each plot-line.
+ Accepts string or nil. Default value: nil.
+
+- :check-ind-type - Whether the types of ind values should be checked.
+ Accepts boolean.
+
+- :plot-str - the formula string passed to :plot-func as PLOT-STR
+ Accepts string. Default value: \"'%s' using %s%d%s with %s title '%s'\"
+
+- :data-dump - Function to dump the table to a datafile for ease of use.
+ Accepts lambda function. Default lambda body: (org-plot/gnuplot-to-data table data-file params)
+
+- :plot-pre - Gnuplot code to be inserted early into the script, just after term and output have been set.
+ Accepts string, nil, or lambda function which returns string or nil. Defaults to nil.
+"
:group 'org-plot
:type '(alist :value-type (symbol group)))
@@ -476,89 +516,90 @@ If a function, it is called with the plot type as the argument."
:group 'org-plot
:type '(choice string function))
-(defun org-plot/gnuplot-script (data-file num-cols params &optional preface)
+(defun org-plot/gnuplot-script (table data-file num-cols params &optional preface)
"Write a gnuplot script to DATA-FILE respecting the options set in PARAMS.
NUM-COLS controls the number of columns plotted in a 2-d plot.
Optional argument PREFACE returns only option parameters in a
manner suitable for prepending to a user-specified script."
- (let* ((type (plist-get params :plot-type))
- (with (if (eq type 'grid) 'pm3d (plist-get params :with)))
- (sets (plist-get params :set))
- (lines (plist-get params :line))
- (map (plist-get params :map))
- (title (plist-get params :title))
- (file (plist-get params :file))
- (ind (plist-get params :ind))
- (time-ind (plist-get params :timeind))
- (timefmt (plist-get params :timefmt))
- (text-ind (plist-get params :textind))
- (deps (if (plist-member params :deps) (plist-get params :deps)))
- (col-labels (plist-get params :labels))
- (x-labels (plist-get params :xlabels))
- (y-labels (plist-get params :ylabels))
- (plot-str "'%s' using %s%d%s with %s title '%s'")
- (plot-cmd (pcase type
- (`2d "plot")
- (`3d "splot")
- (`grid "splot")))
- (script "reset")
- ;; ats = add-to-script
- (ats (lambda (line) (setf script (concat script "\n" line))))
- plot-lines)
-
-
- ;; handle output file, background, and size
- (funcall ats (format "set term %s %s"
- (if file (file-name-extension file) "GNUTERM")
- (if (stringp org-plot/gnuplot-term-extra)
- org-plot/gnuplot-term-extra
- (org-plot/gnuplot-term-extra type))))
- (when file ; output file
- (funcall ats (format "set output '%s'" file)))
-
- (funcall ats
- (if (stringp org-plot/gnuplot-script-preamble)
- org-plot/gnuplot-script-preamble
- (org-plot/gnuplot-script-preamble type)))
-
- (pcase type ; type
- (`2d ())
- (`3d (when map (funcall ats "set map")))
- (`grid (funcall ats (if map "set pm3d map" "set pm3d"))))
- (when title (funcall ats (format "set title '%s'" title))) ; title
- (mapc ats lines) ; line
- (dolist (el sets) (funcall ats (format "set %s" el))) ; set
- ;; Unless specified otherwise, values are TAB separated.
- (unless (string-match-p "^set datafile separator" script)
- (funcall ats "set datafile separator \"\\t\""))
- (when x-labels ; x labels (xtics)
- (funcall ats
- (format "set xtics (%s)"
- (mapconcat (lambda (pair)
- (format "\"%s\" %d" (cdr pair) (car pair)))
- x-labels ", "))))
- (when y-labels ; y labels (ytics)
- (funcall ats
- (format "set ytics (%s)"
- (mapconcat (lambda (pair)
- (format "\"%s\" %d" (cdr pair) (car pair)))
- y-labels ", "))))
- (when time-ind ; timestamp index
- (funcall ats "set xdata time")
- (funcall ats (concat "set timefmt \""
- (or timefmt ; timefmt passed to gnuplot
- "%Y-%m-%d-%H:%M:%S") "\"")))
- (unless preface
- (let ((type-func (cadr (assoc type org-plot/preset-plot-types))))
- (when type-func
- (setq plot-lines
- (funcall type-func data-file num-cols params plot-str))))
+ (let* ((type-name (plist-get params :plot-type))
+ (type (cdr (assoc type-name org-plot/preset-plot-types))))
+ (unless type
+ (user-error "Org-plot type `%s' is undefined." type-name))
+ (let* ((sets (plist-get params :set))
+ (lines (plist-get params :line))
+ (map (plist-get params :map))
+ (title (plist-get params :title))
+ (file (plist-get params :file))
+ (ind (plist-get params :ind))
+ (time-ind (plist-get params :timeind))
+ (timefmt (plist-get params :timefmt))
+ (text-ind (plist-get params :textind))
+ (deps (if (plist-member params :deps) (plist-get params :deps)))
+ (col-labels (plist-get params :labels))
+ (x-labels (plist-get params :xlabels))
+ (y-labels (plist-get params :ylabels))
+ (plot-str (or (plist-get type :plot-str)
+ "'%s' using %s%d%s with %s title '%s'"))
+ (plot-cmd (plist-get type :plot-cmd))
+ (plot-pre (plist-get type :plot-pre))
+ (script "reset")
+ ;; ats = add-to-script
+ (ats (lambda (line) (when line (setf script (concat script "\n" line)))))
+ plot-lines)
+
+
+ ;; handle output file, background, and size
+ (funcall ats (format "set term %s %s"
+ (if file (file-name-extension file) "GNUTERM")
+ (if (stringp org-plot/gnuplot-term-extra)
+ org-plot/gnuplot-term-extra
+ (funcall org-plot/gnuplot-term-extra type))))
+ (when file ; output file
+ (funcall ats (format "set output '%s'" file)))
+
+ (when plot-pre
+ (funcall ats (funcall plot-pre table data-file num-cols params plot-str)))
(funcall ats
- (concat plot-cmd " " (mapconcat #'identity
- (reverse plot-lines)
- ",\\\n "))))
- script))
+ (if (stringp org-plot/gnuplot-script-preamble)
+ org-plot/gnuplot-script-preamble
+ (funcall org-plot/gnuplot-script-preamble type)))
+
+ (when title (funcall ats (format "set title '%s'" title))) ; title
+ (mapc ats lines) ; line
+ (dolist (el sets) (funcall ats (format "set %s" el))) ; set
+ ;; Unless specified otherwise, values are TAB separated.
+ (unless (string-match-p "^set datafile separator" script)
+ (funcall ats "set datafile separator \"\\t\""))
+ (when x-labels ; x labels (xtics)
+ (funcall ats
+ (format "set xtics (%s)"
+ (mapconcat (lambda (pair)
+ (format "\"%s\" %d" (cdr pair) (car pair)))
+ x-labels ", "))))
+ (when y-labels ; y labels (ytics)
+ (funcall ats
+ (format "set ytics (%s)"
+ (mapconcat (lambda (pair)
+ (format "\"%s\" %d" (cdr pair) (car pair)))
+ y-labels ", "))))
+ (when time-ind ; timestamp index
+ (funcall ats "set xdata time")
+ (funcall ats (concat "set timefmt \""
+ (or timefmt ; timefmt passed to gnuplot
+ "%Y-%m-%d-%H:%M:%S") "\"")))
+ (unless preface
+ (let ((type-func (plist-get type :plot-func)))
+ (when type-func
+ (setq plot-lines
+ (funcall type-func table data-file num-cols params plot-str))))
+ (funcall ats
+ (concat plot-cmd
+ (when plot-cmd " ")
+ (mapconcat #'identity
+ (reverse plot-lines)
+ ",\\\n "))))
+ script)))
;;-----------------------------------------------------------------------------
;; facade functions
@@ -598,7 +639,13 @@ line directly before or after the table."
(push 'hline (cdr tbl))))
tbl))
(num-cols (length (if (eq (nth 0 table) 'hline) (nth 1 table)
- (nth 0 table)))))
+ (nth 0 table))))
+ (type (assoc (plist-get params :plot-type)
+ org-plot/preset-plot-types)))
+
+ (unless type
+ (user-error "Org-plot type `%s' is undefined." type-name))
+
(run-with-idle-timer 0.1 nil #'delete-file data-file)
(when (eq (cadr table) 'hline)
(setf params
@@ -608,15 +655,12 @@ line directly before or after the table."
(save-excursion (while (and (equal 0 (forward-line -1))
(looking-at "[[:space:]]*#\\+"))
(setf params (org-plot/collect-options params))))
- ;; Dump table to datafile (very different for grid).
- (pcase (plist-get params :plot-type)
- (`2d (org-plot/gnuplot-to-data table data-file params))
- (`3d (org-plot/gnuplot-to-data table data-file params))
- (`grid (let ((y-labels (org-plot/gnuplot-to-grid-data
- table data-file params)))
- (when y-labels (plist-put params :ylabels y-labels)))))
+ ;; Dump table to datafile
+ (if-let ((dump-func (plist-get type :data-dump)))
+ (funcall dump-func table data-file num-cols params)
+ (org-plot/gnuplot-to-data table data-file params))
;; Check type of ind column (timestamp? text?)
- (when (eq `2d (plist-get params :plot-type))
+ (when (plist-get params :check-ind-type)
(let* ((ind (1- (plist-get params :ind)))
(ind-column (mapcar (lambda (row) (nth ind row)) table)))
(cond ((< ind 0) nil) ; ind is implicit
@@ -633,13 +677,13 @@ line directly before or after the table."
(with-temp-buffer
(if (plist-get params :script) ; user script
(progn (insert
- (org-plot/gnuplot-script data-file num-cols params t))
+ (org-plot/gnuplot-script table data-file num-cols params t))
(insert "\n")
(insert-file-contents (plist-get params :script))
(goto-char (point-min))
(while (re-search-forward "\\$datafile" nil t)
(replace-match data-file nil nil)))
- (insert (org-plot/gnuplot-script data-file num-cols params)))
+ (insert (org-plot/gnuplot-script table data-file num-cols params)))
;; Graph table.
(gnuplot-mode)
(gnuplot-send-buffer-to-gnuplot))
--
2.28.0
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #12: 0011-org-plot.el-avoid-arithmetic-overflow-error.patch --]
[-- Type: text/x-patch, Size: 1584 bytes --]
From a299ec63c91260b68237da3a6c19e8ed8523fd6d Mon Sep 17 00:00:00 2001
From: TEC <tec@tecosaur.com>
Date: Sat, 5 Sep 2020 21:05:36 +0800
Subject: [PATCH 11/15] org-plot.el: avoid arithmetic overflow error
* lisp/org-plot.el (org--plot/values-stats): A set of numbers with the
same value (i.e. 0 range) should not produce an arithmetic overflow
error. This error was caused by taking the log of 0 (when the range is
0). This is mitigated by explicit checking against this case.
---
lisp/org-plot.el | 9 ++++++---
1 file changed, 6 insertions(+), 3 deletions(-)
diff --git a/lisp/org-plot.el b/lisp/org-plot.el
index 53186bb75..0a9694263 100644
--- a/lisp/org-plot.el
+++ b/lisp/org-plot.el
@@ -192,10 +192,13 @@ values, namely regarding the range."
(let* ((minimum (or hard-min (apply #'min nums)))
(maximum (or hard-max (apply #'max nums)))
(range (- maximum minimum))
- (rangeOrder (ceiling (- 1 (log10 range))))
+ (rangeOrder (if (= range 0) 0
+ (ceiling (- 1 (log10 range)))))
(range-factor (expt 10 rangeOrder))
- (nice-min (/ (float (floor (* minimum range-factor))) range-factor))
- (nice-max (/ (float (ceiling (* maximum range-factor))) range-factor)))
+ (nice-min (if (= range 0) (car nums)
+ (/ (float (floor (* minimum range-factor))) range-factor)))
+ (nice-max (if (= range 0) (car nums)
+ (/ (float (ceiling (* maximum range-factor))) range-factor))))
`(:min ,minimum :max ,maximum :range ,range
:range-factor ,range-factor
:nice-min ,nice-min :nice-max ,nice-max :nice-range ,(- nice-max nice-min))))
--
2.28.0
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #13: 0012-org-plot.el-add-missing-cl-prefixes.patch --]
[-- Type: text/x-patch, Size: 5319 bytes --]
From 2076b9ea3c7d5459b6b7eca1d1c876518b75cba0 Mon Sep 17 00:00:00 2001
From: TEC <tec@tecosaur.com>
Date: Sun, 25 Oct 2020 01:43:01 +0800
Subject: [PATCH 12/15] org-plot.el: add missing cl- prefixes
* lisp/org-plot.el ( org--plot/merge-alists, org--plot/item-frequencies,
org--plot/prime-factors): Add missing cl- prefic to cl-lib functions
called.
(org--plot/radar): refactor f function to remove dependency.
(org--plot/values-stats, org--plot/nice-frequency-pick): autoformatting.
---
lisp/org-plot.el | 72 ++++++++++++++++++++++++------------------------
1 file changed, 36 insertions(+), 36 deletions(-)
diff --git a/lisp/org-plot.el b/lisp/org-plot.el
index 0a9694263..449edff20 100644
--- a/lisp/org-plot.el
+++ b/lisp/org-plot.el
@@ -193,7 +193,7 @@ values, namely regarding the range."
(maximum (or hard-max (apply #'max nums)))
(range (- maximum minimum))
(rangeOrder (if (= range 0) 0
- (ceiling (- 1 (log10 range)))))
+ (ceiling (- 1 (log10 range)))))
(range-factor (expt 10 rangeOrder))
(nice-min (if (= range 0) (car nums)
(/ (float (floor (* minimum range-factor))) range-factor)))
@@ -227,44 +227,44 @@ values, namely regarding the range."
"From a list of frequences, try to sensibly pick a sample of the most frequent."
;; TODO this mosly works decently, but counld do with some tweaking to work more consistently.
(case (length frequencies)
- (1 (list (car (nth 0 frequencies))))
- (2 (if (<= 3 (/ (cdr (nth 0 frequencies))
- (cdr (nth 1 frequencies))))
- (make-list 2
- (car (nth 0 frequencies)))
- (list (car (nth 0 frequencies))
- (car (nth 1 frequencies)))))
- (t
- (let* ((total-count (apply #'+ (mapcar #'cdr frequencies)))
- (n-freq (mapcar (lambda (freq) `(,(car freq) . ,(/ (float (cdr freq)) total-count))) frequencies))
- (f-pick (list (car (car n-freq))))
- (1-2-ratio (/ (cdr (nth 0 n-freq))
- (cdr (nth 1 n-freq))))
- (2-3-ratio (/ (cdr (nth 1 n-freq))
- (cdr (nth 2 n-freq))))
- (1-3-ratio (* 1-2-ratio 2-3-ratio))
- (1-val (car (nth 0 n-freq)))
- (2-val (car (nth 1 n-freq)))
- (3-val (car (nth 2 n-freq))))
- (when (> 1-2-ratio 4) (push 1-val f-pick))
- (when (and (< 1-2-ratio 2-val)
- (< (* (apply #'* f-pick) 2-val) 30))
- (push 2-val f-pick))
- (when (and (< 1-3-ratio 3-val)
- (< (* (apply #'* f-pick) 3-val) 30))
- (push 3-val f-pick))
- f-pick))))
+ (1 (list (car (nth 0 frequencies))))
+ (2 (if (<= 3 (/ (cdr (nth 0 frequencies))
+ (cdr (nth 1 frequencies))))
+ (make-list 2
+ (car (nth 0 frequencies)))
+ (list (car (nth 0 frequencies))
+ (car (nth 1 frequencies)))))
+ (t
+ (let* ((total-count (apply #'+ (mapcar #'cdr frequencies)))
+ (n-freq (mapcar (lambda (freq) `(,(car freq) . ,(/ (float (cdr freq)) total-count))) frequencies))
+ (f-pick (list (car (car n-freq))))
+ (1-2-ratio (/ (cdr (nth 0 n-freq))
+ (cdr (nth 1 n-freq))))
+ (2-3-ratio (/ (cdr (nth 1 n-freq))
+ (cdr (nth 2 n-freq))))
+ (1-3-ratio (* 1-2-ratio 2-3-ratio))
+ (1-val (car (nth 0 n-freq)))
+ (2-val (car (nth 1 n-freq)))
+ (3-val (car (nth 2 n-freq))))
+ (when (> 1-2-ratio 4) (push 1-val f-pick))
+ (when (and (< 1-2-ratio 2-val)
+ (< (* (apply #'* f-pick) 2-val) 30))
+ (push 2-val f-pick))
+ (when (and (< 1-3-ratio 3-val)
+ (< (* (apply #'* f-pick) 3-val) 30))
+ (push 3-val f-pick))
+ f-pick))))
(defun org--plot/merge-alists (function default alist1 alist2 &rest alists)
"Using FUNCTION, combine the elements of all given ALISTS. When an element is
only present in one alist, DEFAULT is used as the second argument for the FUNCTION."
(when (> (length alists) 0)
(setq alist2 (apply #'org--plot/merge-alists function default alist2 alists)))
- (flet ((keys (alist) (mapcar #'car alist))
- (lookup (key alist) (or (cdr (assoc key alist)) default)))
- (loop with keys = (union (keys alist1) (keys alist2) :test 'equal)
- for k in keys collect
- (cons k (funcall function (lookup k alist1) (lookup k alist2))))))
+ (cl-flet ((keys (alist) (mapcar #'car alist))
+ (lookup (key alist) (or (cdr (assoc key alist)) default)))
+ (cl-loop with keys = (cl-union (keys alist1) (keys alist2) :test 'equal)
+ for k in keys collect
+ (cons k (funcall function (lookup k alist1) (lookup k alist2))))))
(defun org--plot/item-frequencies (values &optional normalise)
"Return an alist indicating the frequency of values in VALUES list."
@@ -282,7 +282,7 @@ only present in one alist, DEFAULT is used as the second argument for the FUNCTI
(setq value (/ value i))
(setq i (1- i))
))
- (subseq factors 0 -1)))
+ (cl-subseq factors 0 -1)))
(defcustom org-plot/gnuplot-script-preamble ""
"String or function which provides content to be inserted into the GNUPlot
@@ -499,8 +499,8 @@ EOD
)))
table)))
(setup-file (make-temp-file "org-plot-setup")))
- (f-write-text (format org--plot/radar-setup-template data settings)
- 'utf-8 setup-file)
+ (let ((coding-system-for-write 'utf-8))
+ (write-region (format org--plot/radar-setup-template data settings) nil setup-file nil :silent))
(format org--plot/radar-template
setup-file
(if (eq ticks 0) 2 ticks)
--
2.28.0
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #14: 0013-org-plot.el-radar-plot-join-last-points-to-first.patch --]
[-- Type: text/x-patch, Size: 1415 bytes --]
From 4ee4089848816fd0afedfe3f030912041bffece3 Mon Sep 17 00:00:00 2001
From: TEC <tec@tecosaur.com>
Date: Sun, 25 Oct 2020 01:47:57 +0800
Subject: [PATCH 13/15] org-plot.el: radar plot, join last points to first
* lisp/org-plot.el (org--plot/radar-template, org--plot/radar):
Duplicate first points at the end so that a line is drawn between them.
---
lisp/org-plot.el | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/lisp/org-plot.el b/lisp/org-plot.el
index 449edff20..da9f6ea74 100644
--- a/lisp/org-plot.el
+++ b/lisp/org-plot.el
@@ -393,7 +393,7 @@ load \"%s\"
# General settings
DataColCount = words($Data[1])-1
-AxesCount = |$Data|-HeaderLines
+AxesCount = |$Data|-HeaderLines-1
AngleOffset = 90
Max = 1
d=0.1*Max
@@ -478,7 +478,7 @@ EOD
"\"%s\" %s"
(car row)
(s-join " " (cdr row))))
- table))))
+ (append table (list (car table)))))))
(ticks (or (plist-get params :ticks)
(org--plot/sensible-tick-num table
(plist-get params :ymin)
@@ -497,7 +497,7 @@ EOD
(plist-get data :nice-max))
(if (eq ticks 0) 2 ticks)
)))
- table)))
+ (append table (list (car table))))))
(setup-file (make-temp-file "org-plot-setup")))
(let ((coding-system-for-write 'utf-8))
(write-region (format org--plot/radar-setup-template data settings) nil setup-file nil :silent))
--
2.28.0
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #15: 0014-org-plot.el-Make-min-max-keywords-consistent.patch --]
[-- Type: text/x-patch, Size: 897 bytes --]
From 66540fd5f4f2c7e11d70f572814daa90ec22f92b Mon Sep 17 00:00:00 2001
From: TEC <tec@tecosaur.com>
Date: Sun, 25 Oct 2020 02:10:53 +0800
Subject: [PATCH 14/15] org-plot.el: Make min/max keywords consistent
* lisp/org-plot.el: (org-plot/add-options-to-plist): Have both x/y
min/max, but have min/max aliased to the y-axis options.
---
lisp/org-plot.el | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/lisp/org-plot.el b/lisp/org-plot.el
index da9f6ea74..f6348907f 100644
--- a/lisp/org-plot.el
+++ b/lisp/org-plot.el
@@ -64,8 +64,10 @@ Returns the resulting property list."
("timeind" . :timeind)
("timefmt" . :timefmt)
("min" . :ymin)
- ("max" . :ymax)
("ymin" . :ymin)
+ ("max" . :ymax)
+ ("ymax" . :ymax)
+ ("xmin" . :xmin)
("xmax" . :xmax)
("ticks" . :ticks)
("trans" . :transpose)
--
2.28.0
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #16: 0015-org-manual.org-document-org-plot-changes.patch --]
[-- Type: text/x-patch, Size: 3730 bytes --]
From 373bf71d6b108a638c6ba2ec6937d055c1d0f7dd Mon Sep 17 00:00:00 2001
From: TEC <tec@tecosaur.com>
Date: Sun, 25 Oct 2020 02:14:37 +0800
Subject: [PATCH 15/15] org-manual.org: document org-plot changes
* doc/org-manual.org: Document changes to org-plot.el.
---
doc/org-manual.org | 39 ++++++++++++++++++++++++++++++++++++++-
1 file changed, 38 insertions(+), 1 deletion(-)
diff --git a/doc/org-manual.org b/doc/org-manual.org
index 066092238..7eff42aee 100644
--- a/doc/org-manual.org
+++ b/doc/org-manual.org
@@ -2809,6 +2809,19 @@ following table.
| Morelia | 257.56 | 17.67 |
#+end_example
+Org Plot supports a range of plot types, and provides the ability to add more.
+For example, a radar plot can be generated like so:
+#+begin_example
+,#+PLOT: title:"An evaluation of plaintext document formats" transpose:yes type:radar min:0 max:4
+| Format | Fine-grained-control | Initial Effort | Syntax simplicity | Editor Support | Integrations | Ease-of-referencing | Versatility |
+|-------------------+----------------------+----------------+-------------------+----------------+--------------+---------------------+-------------|
+| Word | 2 | 4 | 4 | 2 | 3 | 2 | 2 |
+| LaTeX | 4 | 1 | 1 | 3 | 2 | 4 | 3 |
+| Org Mode | 4 | 2 | 3.5 | 1 | 4 | 4 | 4 |
+| Markdown | 1 | 3 | 3 | 4 | 3 | 3 | 1 |
+| Markdown + Pandoc | 2.5 | 2.5 | 2.5 | 3 | 3 | 3 | 2 |
+#+end_example
+
Notice that Org Plot is smart enough to apply the table's headers as
labels. Further control over the labels, type, content, and
appearance of plots can be exercised through the =PLOT= keyword
@@ -2839,9 +2852,15 @@ For more information and examples see the [[https://orgmode.org/worg/org-tutoria
the third and fourth columns. Defaults to graphing all other
columns aside from the =ind= column.
+- transpose ::
+
+ When =y=, =yes=, or =t= attempt to transpose the table data before plotting. Also
+ recognises the shorthand option =trans=.
+
- =type= ::
- Specify whether the plot is =2d=, =3d=, or =grid=.
+ Specify the type of the plot, by default one of =2d=, =3d=, =radar=, or =grid=.
+ Available types can be customised with ~org-plot/preset-plot-types~.
- =with= ::
@@ -2868,6 +2887,24 @@ For more information and examples see the [[https://orgmode.org/worg/org-tutoria
When plotting =3d= or =grid= types, set this to =t= to graph a flat
mapping rather than a =3d= slope.
+- min ::
+
+ Provides a minimum axis value that may be used by a plot type. Implicitly
+ assumes the =y= axis is being referred to. Can explicitly provide a value for a
+ either the =x= or =y= axis with =xmin= and =ymin=.
+
+- max ::
+
+ Provides a maximum axis value that may be used by a plot type. Implicitly
+ assumes the =y= axis is being referred to. Can explicitly provide a value for a
+ either the =x= or =y= axis with =xmax= and =ymax=.
+
+- ticks ::
+
+ Provides a desired number of axis ticks to display, that may be used by a plot
+ type. If none is given a plot type that requires ticks will use
+ ~org--plot/sensible-tick-num~ to try to determine a good value.
+
- =timefmt= ::
Specify format of Org mode timestamps as they will be parsed by
--
2.28.0
^ permalink raw reply related [relevance 8%]
* Re: [PATCH] org-plot abstractions and extension
2020-09-25 17:51 93% ` TEC
@ 2020-10-17 2:12 93% ` TEC
0 siblings, 1 reply; 74+ results
From: TEC @ 2020-10-17 2:12 UTC (permalink / raw)
To: org-mode-email
Hello all,
I'm still hoping that someone might get back to me ... eventually,
so here's another bump.
Timothy.
TEC <tecosaur@gmail.com> writes:
> Hello everyone. Just in case this has slipped through the cracks
> /
> fallen under the radar --- here's a little bump.
>
> Timothy.
>
> TEC <tecosaur@gmail.com> writes:
>
>> Oooops, I've just noticed my patch attachment re-send was only
>> addressed
>> to Bastien (maybe this is why I haven't heard anything?).
>> This is what I get for mixing mail clients and not paying
>> attention
>> I guess 😅.
>>
>> If someone would be willing to have a look through my work, and
>> comment
>> - that would be fantastic.
>>
>> I'd love to get my code into shape to be merged :)
>>
>> All the best,
>>
>> Timothy.
^ permalink raw reply [relevance 93%]
* Re: PATCH: Display point of code block point when confirming evaluation
@ 2020-09-30 4:57 93% ` TEC
0 siblings, 0 replies; 74+ results
From: TEC @ 2020-09-30 4:57 UTC (permalink / raw)
To: Kyle Meyer; +Cc: Jarmo Hurri, emacs-orgmode
Kyle Meyer <kyle@kyleam.com> writes:
> That sounds reasonable to me, and the change looks fine to me.
> My only
> thought is that perhaps the line number would be friendlier to
> report,
> but I don't feel strongly about that.
+1 for line numbers
Assuming the current format is something like:
"Do you want to eval <lang> block at <pos> y/n:"
I'd be in favour of:
"Do you want to eval <lang> block at <pos> (line <line>) y/n:"
or similar.
All the best,
Timothy.
^ permalink raw reply [relevance 93%]
* Re: [PATCH] Enhance org-html--build-meta-info
@ 2020-09-27 18:35 93% ` TEC
0 siblings, 1 reply; 74+ results
From: TEC @ 2020-09-27 18:35 UTC (permalink / raw)
To: Jens Lechtenboerger; +Cc: org-mode-email
Jens Lechtenboerger <lechten@wi.uni-muenster.de> writes:
> On 2020-09-28, TEC wrote:
>
>> Jens Lechtenboerger <lechten@wi.uni-muenster.de> writes:
>>> Also, in org-html--build-meta-info you call
>>> org-html-encode-plain-text with two arguments, but it just
>>> accepts
>>> one.
>>
>> ? No I don't.
>
> Your patch contains this:
>
> + (let* ((title (org-html-encode-plain-text (plist-get info
> :title)
> info))
Ohhhh, that's the bit you were referring to. That's just copied
from the
current state (iirc). Anyway, I dropped the second argument.
Thanks,
Timothy.
^ permalink raw reply [relevance 93%]
* Re: [PATCH] Enhance org-html--build-meta-info
@ 2020-09-27 17:39 46% ` TEC
0 siblings, 1 reply; 74+ results
From: TEC @ 2020-09-27 17:39 UTC (permalink / raw)
To: Jens Lechtenboerger; +Cc: org-mode-email
Jens Lechtenboerger <lechten@wi.uni-muenster.de> writes:
>> Currently the only element handled differently to
>> `org-html-encode-plain-text' is "author". I don't know why so I
>> don't
>> want to touch it.
>
> I believe that was also the previous conclusion. However, as
> this
> is not documented, maybe now could be the chance to change this?
Hmm. Maybe, it sounds like some tests may be in order.
> I must I admit that I do not fully understand your approach.
>
> Why do you treat keywords and description differently (with
> description in org-html-meta-tags and keywords in
> org-html--build-meta-info)?
Ooops, that should have been in org-html-meta-tags as the rest
are.
[Fixed]
> Why do you pass _title into the lambda expressions in
> org-html-meta-tags when it is never used? Currently, the
> variable
> org-html-meta-tags does not seem user-friendly to me.
Title and author just seemed like the most likely useful
information for
customisation. It would be nice if it looked less boiler-plate-y,
but
I'm not sure what the best approach for that would be, and it's
already
miles better than the current.
If you have any ideas, please let me know.
> Also, in org-html--build-meta-info you call
> org-html-encode-plain-text with two arguments, but it just
> accepts
> one.
? No I don't.
> Best wishes
> Jens
Hope that clarifies things a bit,
Timothy.
------
Moved the keyword in with the rest.
From 889ae918aed267417825d565df9135221dae16b1 Mon Sep 17 00:00:00
2001
From: TEC <tec@tecosaur.com>
Subject: [PATCH] lisp/ox-html.el: make html meta func nicer
* lisp/ox-html.el (org-html--build-meta-info): Multi-line repeated
structure extracted to new function `org-html--build-meta-entry'.
The opportunity was taken to extract most metadata info to custom
variable `org-html-meta-tags', allowing for easy end-user
modification.
---
lisp/ox-html.el | 114
+++++++++++++++++++++++++++---------------------
1 file changed, 64 insertions(+), 50 deletions(-)
diff --git a/lisp/ox-html.el b/lisp/ox-html.el
index d2f24f5c6..46195b0e0 100644
--- a/lisp/ox-html.el
+++ b/lisp/ox-html.el
@@ -1425,6 +1425,31 @@ not be modified."
;;;; Template :: Styles
+(defcustom org-html-meta-tags
+ '((lambda (_title author _info)
+ (when (org-string-nw-p author)
+ (list "name" "author" author)))
+ (lambda (_title _author info)
+ (when (org-string-nw-p (plist-get info :description))
+ (list "name" "description"
+ (plist-get info :description))))
+ (lambda (_title _author info)
+ (when (org-string-nw-p (plist-get info :keywords))
+ (list "keywords" (plist-get info :keywords))))
+ ("name" "generator" "Org Mode"))
+ "A list of arguments to be passed to
`org-html--build-meta-entry'.
+Each argument can either be an list which is applied, or a
function which
+generates such a list with signature (TITLE AUTHOR INFO) where
TITLE and AUTHOR
+are strings, and INFO a communication plist."
+ :group 'org-export-html
+ :package-version '(Org . "9.5")
+ :type '(repeat
+ (choice
+ (list (string :tag "Meta label")
+ (string :tag "label value")
+ (string :tag "Content value"))
+ function)))
+
(defcustom org-html-head-include-default-style t
"Non-nil means include the default style in exported HTML
files.
The actual style is defined in `org-html-style-default' and
@@ -1835,23 +1860,31 @@ INFO is a plist used as a communication
channel."
\f
;;; Template
+(defun org-html--build-meta-entry (label identity &optional
content-format &rest content-formatters)
+ "Construct <meta> tag with LABEL=\"IDENTITY\" and content from
CONTENT-FORMAT and CONTENT-FORMATTER."
+ (concat "<meta "
+ (format "%s=\"%s" label identity)
+ (when content-format
+ (concat "\" content=\""
+ (replace-regexp-in-string
+ "\"" """
+ (org-html-encode-plain-text
+ (if content-formatters
+ (apply #'format content-format content-formatters)
+ content-format)))))
+ "\" />\n"))
+
(defun org-html--build-meta-info (info)
"Return meta tags for exported document.
INFO is a plist used as a communication channel."
- (let* ((protect-string
- (lambda (str)
- (replace-regexp-in-string
- "\"" """ (org-html-encode-plain-text str))))
- (title (org-export-data (plist-get info :title) info))
+ (let* ((title (org-html-encode-plain-text (plist-get info
:title) info))
;; Set title to an invisible character instead of
leaving it
;; empty, which is invalid.
(title (if (org-string-nw-p title) title "‎"))
(author (and (plist-get info :with-author)
(let ((auth (plist-get info :author)))
- ;; Return raw Org syntax.
+ ;; Return raw Org syntax.
(and auth (org-element-interpret-data
auth)))))
- (description (plist-get info :description))
- (keywords (plist-get info :keywords))
(charset (or (and org-html-coding-system
(fboundp 'coding-system-get)
(coding-system-get
org-html-coding-system
@@ -1863,50 +1896,31 @@ INFO is a plist used as a communication
channel."
(concat "<!-- "
(plist-get info :html-metadata-timestamp-format)
" -->\n")))
- (format
- (if (org-html-html5-p info)
- (org-html-close-tag "meta" "charset=\"%s\"" info)
- (org-html-close-tag
- "meta" "http-equiv=\"Content-Type\"
content=\"text/html;charset=%s\""
- info))
- charset) "\n"
+
+ (if (org-html-html5-p info)
+ (org-html--build-meta-entry "charset" charset)
+ (org-html--build-meta-entry "http-equiv" "Content-Type"
+ (concat "text/html;charset=" charset)))
+
(let ((viewport-options
- (cl-remove-if-not (lambda (cell) (org-string-nw-p (cadr
cell)))
- (plist-get info :html-viewport))))
- (and viewport-options
- (concat
- (org-html-close-tag
- "meta"
- (format "name=\"viewport\" content=\"%s\""
- (mapconcat
- (lambda (elm) (format "%s=%s" (car elm) (cadr
elm)))
- viewport-options ", "))
- info)
- "\n")))
+ (cl-remove-if-not (lambda (cell) (org-string-nw-p
(cadr cell)))
+ (plist-get info :html-viewport))))
+ (if viewport-options
+ (org-html--build-meta-entry "name" "viewport"
+ (mapconcat
+ (lambda (elm) (format
"%s=%s" (car elm) (cadr elm)))
+ viewport-options ", "))))
+
(format "<title>%s</title>\n" title)
- (org-html-close-tag "meta" "name=\"generator\" content=\"Org
mode\"" info)
- "\n"
- (and (org-string-nw-p author)
- (concat
- (org-html-close-tag "meta"
- (format "name=\"author\" content=\"%s\""
- (funcall protect-string author))
- info)
- "\n"))
- (and (org-string-nw-p description)
- (concat
- (org-html-close-tag "meta"
- (format "name=\"description\" content=\"%s\"\n"
- (funcall protect-string description))
- info)
- "\n"))
- (and (org-string-nw-p keywords)
- (concat
- (org-html-close-tag "meta"
- (format "name=\"keywords\" content=\"%s\""
- (funcall protect-string keywords))
- info)
- "\n")))))
+
+ (apply #'concat
+ (mapcar
+ (lambda (form)
+ (when (functionp form)
+ (setq form (funcall form title author info)))
+ (when form
+ (apply #'org-html--build-meta-entry form)))
+ org-html-meta-tags)))))
(defun org-html--build-head (info)
"Return information for the <head>..</head> of the HTML output.
--
2.28.0
^ permalink raw reply related [relevance 46%]
* Re: [PATCH] org-plot abstractions and extension
2020-09-15 3:43 10% ` TEC
@ 2020-09-25 17:51 93% ` TEC
2020-10-17 2:12 93% ` TEC
0 siblings, 1 reply; 74+ results
From: TEC @ 2020-09-25 17:51 UTC (permalink / raw)
To: org-mode-email
Hello everyone. Just in case this has slipped through the cracks /
fallen under the radar --- here's a little bump.
Timothy.
TEC <tecosaur@gmail.com> writes:
> Oooops, I've just noticed my patch attachment re-send was only addressed
> to Bastien (maybe this is why I haven't heard anything?).
> This is what I get for mixing mail clients and not paying attention
> I guess 😅.
>
> If someone would be willing to have a look through my work, and comment
> - that would be fantastic.
>
> I'd love to get my code into shape to be merged :)
>
> All the best,
>
> Timothy.
^ permalink raw reply [relevance 93%]
* Re: [PATCH] Enhance org-html--build-meta-info
@ 2020-09-25 17:48 47% ` TEC
0 siblings, 1 reply; 74+ results
From: TEC @ 2020-09-25 17:48 UTC (permalink / raw)
To: Jens Lechtenboerger; +Cc: org-mode-email
@Maintainers I think this is ready for a review.
Jens Lechtenboerger <lechten@wi.uni-muenster.de> writes:
> My suggestion would be to go with the handling of description in all
> cases, including the title.
Currently the only element handled differently to
`org-html-encode-plain-text' is "author". I don't know why so I don't
want to touch it.
> I added keywords to my OER presentations because some crawlers use
> them to extract topics for classification of documents. I’d like to
> keep that.
Re-added.
Let me know if there's anything else,
Timothy.
-----
Updated patch below:
From da3878493a8c7097bf44add925696ede86ede661 Mon Sep 17 00:00:00 2001
From: TEC <tec@tecosaur.com>
Subject: [PATCH] lisp/ox-html.el: make html meta func nicer
* lisp/ox-html.el (org-html--build-meta-info): Multi-line repeated
structure extracted to new function `org-html--build-meta-entry'.
The opportunity was taken to extract most metadata info to custom
variable `org-html-meta-tags', allowing for easy end-user modification.
---
lisp/ox-html.el | 115 +++++++++++++++++++++++++++---------------------
1 file changed, 65 insertions(+), 50 deletions(-)
diff --git a/lisp/ox-html.el b/lisp/ox-html.el
index d2f24f5c6..6efb76e12 100644
--- a/lisp/ox-html.el
+++ b/lisp/ox-html.el
@@ -1425,6 +1425,28 @@ not be modified."
;;;; Template :: Styles
+(defcustom org-html-meta-tags
+ '((lambda (_title author _info)
+ (when (org-string-nw-p author)
+ (list "name" "author" author)))
+ (lambda (_title _author info)
+ (when (org-string-nw-p (plist-get info :description))
+ (list "name" "description"
+ (plist-get info :description))))
+ ("name" "generator" "Org Mode"))
+ "A list of arguments to be passed to `org-html--build-meta-entry'.
+Each argument can either be an list which is applied, or a function which
+generates such a list with signature (TITLE AUTHOR INFO) where TITLE and AUTHOR
+are strings, and INFO a communication plist."
+ :group 'org-export-html
+ :package-version '(Org . "9.5")
+ :type '(repeat
+ (choice
+ (list (string :tag "Meta label")
+ (string :tag "label value")
+ (string :tag "Content value"))
+ function)))
+
(defcustom org-html-head-include-default-style t
"Non-nil means include the default style in exported HTML files.
The actual style is defined in `org-html-style-default' and
@@ -1835,23 +1857,32 @@ INFO is a plist used as a communication channel."
\f
;;; Template
+(defun org-html--build-meta-entry (label identity &optional content-format &rest content-formatters)
+ "Construct <meta> tag with LABEL=\"IDENTITY\" and content from CONTENT-FORMAT and CONTENT-FORMATTER."
+ (concat "<meta "
+ (format "%s=\"%s" label identity)
+ (when content-format
+ (concat "\" content=\""
+ (replace-regexp-in-string
+ "\"" """
+ (org-html-encode-plain-text
+ (if content-formatters
+ (apply #'format content-format content-formatters)
+ content-format)))))
+ "\" />\n"))
+
(defun org-html--build-meta-info (info)
"Return meta tags for exported document.
INFO is a plist used as a communication channel."
- (let* ((protect-string
- (lambda (str)
- (replace-regexp-in-string
- "\"" """ (org-html-encode-plain-text str))))
- (title (org-export-data (plist-get info :title) info))
+ (let* ((title (org-html-encode-plain-text (plist-get info :title) info))
;; Set title to an invisible character instead of leaving it
;; empty, which is invalid.
(title (if (org-string-nw-p title) title "‎"))
(author (and (plist-get info :with-author)
(let ((auth (plist-get info :author)))
- ;; Return raw Org syntax.
+ ;; Return raw Org syntax.
(and auth (org-element-interpret-data auth)))))
- (description (plist-get info :description))
- (keywords (plist-get info :keywords))
+ (keywords (plist-get info :keywords))
(charset (or (and org-html-coding-system
(fboundp 'coding-system-get)
(coding-system-get org-html-coding-system
@@ -1863,50 +1894,34 @@ INFO is a plist used as a communication channel."
(concat "<!-- "
(plist-get info :html-metadata-timestamp-format)
" -->\n")))
- (format
- (if (org-html-html5-p info)
- (org-html-close-tag "meta" "charset=\"%s\"" info)
- (org-html-close-tag
- "meta" "http-equiv=\"Content-Type\" content=\"text/html;charset=%s\""
- info))
- charset) "\n"
+
+ (if (org-html-html5-p info)
+ (org-html--build-meta-entry "charset" charset)
+ (org-html--build-meta-entry "http-equiv" "Content-Type"
+ (concat "text/html;charset=" charset)))
+
(let ((viewport-options
- (cl-remove-if-not (lambda (cell) (org-string-nw-p (cadr cell)))
- (plist-get info :html-viewport))))
- (and viewport-options
- (concat
- (org-html-close-tag
- "meta"
- (format "name=\"viewport\" content=\"%s\""
- (mapconcat
- (lambda (elm) (format "%s=%s" (car elm) (cadr elm)))
- viewport-options ", "))
- info)
- "\n")))
+ (cl-remove-if-not (lambda (cell) (org-string-nw-p (cadr cell)))
+ (plist-get info :html-viewport))))
+ (if viewport-options
+ (org-html--build-meta-entry "name" "viewport"
+ (mapconcat
+ (lambda (elm) (format "%s=%s" (car elm) (cadr elm)))
+ viewport-options ", "))))
+
(format "<title>%s</title>\n" title)
- (org-html-close-tag "meta" "name=\"generator\" content=\"Org mode\"" info)
- "\n"
- (and (org-string-nw-p author)
- (concat
- (org-html-close-tag "meta"
- (format "name=\"author\" content=\"%s\""
- (funcall protect-string author))
- info)
- "\n"))
- (and (org-string-nw-p description)
- (concat
- (org-html-close-tag "meta"
- (format "name=\"description\" content=\"%s\"\n"
- (funcall protect-string description))
- info)
- "\n"))
- (and (org-string-nw-p keywords)
- (concat
- (org-html-close-tag "meta"
- (format "name=\"keywords\" content=\"%s\""
- (funcall protect-string keywords))
- info)
- "\n")))))
+
+ (when keywords
+ (org-html--build-meta-entry "keywords" keywords))
+
+ (apply #'concat
+ (mapcar
+ (lambda (form)
+ (when (functionp form)
+ (setq form (funcall form title author info)))
+ (when form
+ (apply #'org-html--build-meta-entry form)))
+ org-html-meta-tags)))))
(defun org-html--build-head (info)
"Return information for the <head>..</head> of the HTML output.
--
2.28.0
^ permalink raw reply related [relevance 47%]
* Re: [PATCH] Enhance org-html--build-meta-info
@ 2020-09-17 16:14 45% ` TEC
0 siblings, 1 reply; 74+ results
From: TEC @ 2020-09-17 16:14 UTC (permalink / raw)
To: Jens Lechtenboerger; +Cc: org-mode-email
Jens Lechtenboerger <lechten@wi.uni-muenster.de> writes:
> Hi Timothy,
Hi Jens! Thanks for responding.
> yes, I agree that org-html--build-meta-info needs work, and the HTML
> backend would benefit from more documentation. Back then [1], I
> wondered which parts of meta data need to be treated how. That was
> continued in thread [2].
I haven't really considered changing the output of the function (other
than removing keywords).
Reading the email you've linked to, it looks like a change to
`org-html-encode-plain-text' would be a good idea though.
> As pointed out back then, using org-export-data on the title is
> wrong as it creates nested elements, leading to invalid HTML.
>
> Currently, org-element-interpret-data is applied for author
> information, while description and keywords are treated differently.
> Your patch goes for org-html-encode-plain-text in the new function
> org-html--build-meta-entry, which (if I’m not mistaken) produces
> author and description. Did you think about using
> org-element-interpret-data instead? What if that was used?
> I believe this to be an important question as it might affect
> backward compatibility and should be documented.
I was not aware of org-element-interpret-data, and I can't say I can
really tell what it does. If you'd care to elaborate that would be
helpful.
> Does this really work for you? For the author, first
> org-html--build-meta-entry gets called from the new defcustom. The
> result is assigned with setq to form, which then is non-nil so that
> org-html--build-meta-entry is applied again, leading to an error
> here.
Ooops, I forgot to remove org-html--build-meta-entry from the defcustom.
(I didn't notice because I overwrite it anyway in my personal config).
> Besides, did you forget keywords or remove them on purpose?
This is a deliberate omission. My impression is that the value of
keywords in HTML documents has evaporated over the past decade, see:
https://yoast.com/meta-keywords/
Let me know if you know otherwise.
> Best wishes
> Jens
Thanks for your feedback!
Timothy.
-----
Updated patch:
From 3a02e4d3bce5f7f0cbdb34c98f4267cea40eec3e Mon Sep 17 00:00:00 2001
From: TEC <tec@tecosaur.com>
Subject: [PATCH] lisp/ox-html.el: make html meta func nicer
* lisp/ox-html.el (org-html--build-meta-info): Multi-line repeated
structure extracted to new function `org-html--build-meta-entry'.
The opportunity was taken to extract most metadata info to custom
variable `org-html-meta-tags', allowing for easy end-user modification.
---
lisp/ox-html.el | 111 ++++++++++++++++++++++++++----------------------
1 file changed, 61 insertions(+), 50 deletions(-)
diff --git a/lisp/ox-html.el b/lisp/ox-html.el
index d2f24f5c6..df7da1a68 100644
--- a/lisp/ox-html.el
+++ b/lisp/ox-html.el
@@ -1425,6 +1425,28 @@ not be modified."
;;;; Template :: Styles
+(defcustom org-html-meta-tags
+ '((lambda (_title author _info)
+ (when (org-string-nw-p author)
+ (list "name" "author" author)))
+ (lambda (_title _author info)
+ (when (org-string-nw-p (plist-get info :description))
+ (list "name" "description"
+ (plist-get info :description))))
+ ("name" "generator" "Org Mode"))
+ "A list of arguments to be passed to `org-html--build-meta-entry'.
+Each argument can either be an list which is applied, or a function which
+generates such a list with signature (TITLE AUTHOR INFO) where TITLE and AUTHOR
+are strings, and INFO a communication plist."
+ :group 'org-export-html
+ :package-version '(Org . "9.5")
+ :type '(repeat
+ (choice
+ (list (string :tag "Meta label")
+ (string :tag "label value")
+ (string :tag "Content value"))
+ function)))
+
(defcustom org-html-head-include-default-style t
"Non-nil means include the default style in exported HTML files.
The actual style is defined in `org-html-style-default' and
@@ -1835,23 +1857,31 @@ INFO is a plist used as a communication channel."
\f
;;; Template
+(defun org-html--build-meta-entry (label identity &optional content-format &rest content-formatters)
+ "Construct <meta> tag with LABEL=\"IDENTITY\" and content from CONTENT-FORMAT and CONTENT-FORMATTER."
+ (concat "<meta "
+ (format "%s=\"%s" label identity)
+ (when content-format
+ (concat "\" content=\""
+ (replace-regexp-in-string
+ "\"" """
+ (org-html-encode-plain-text
+ (if content-formatters
+ (apply #'format content-format content-formatters)
+ content-format)))))
+ "\" />\n"))
+
(defun org-html--build-meta-info (info)
"Return meta tags for exported document.
INFO is a plist used as a communication channel."
- (let* ((protect-string
- (lambda (str)
- (replace-regexp-in-string
- "\"" """ (org-html-encode-plain-text str))))
- (title (org-export-data (plist-get info :title) info))
+ (let* ((title (org-html-encode-plain-text (plist-get info :title) info))
;; Set title to an invisible character instead of leaving it
;; empty, which is invalid.
(title (if (org-string-nw-p title) title "‎"))
(author (and (plist-get info :with-author)
(let ((auth (plist-get info :author)))
- ;; Return raw Org syntax.
+ ;; Return raw Org syntax.
(and auth (org-element-interpret-data auth)))))
- (description (plist-get info :description))
- (keywords (plist-get info :keywords))
(charset (or (and org-html-coding-system
(fboundp 'coding-system-get)
(coding-system-get org-html-coding-system
@@ -1863,50 +1893,31 @@ INFO is a plist used as a communication channel."
(concat "<!-- "
(plist-get info :html-metadata-timestamp-format)
" -->\n")))
- (format
- (if (org-html-html5-p info)
- (org-html-close-tag "meta" "charset=\"%s\"" info)
- (org-html-close-tag
- "meta" "http-equiv=\"Content-Type\" content=\"text/html;charset=%s\""
- info))
- charset) "\n"
+
+ (if (org-html-html5-p info)
+ (org-html--build-meta-entry "charset" charset)
+ (org-html--build-meta-entry "http-equiv" "Content-Type"
+ (concat "text/html;charset=" charset)))
+
(let ((viewport-options
- (cl-remove-if-not (lambda (cell) (org-string-nw-p (cadr cell)))
- (plist-get info :html-viewport))))
- (and viewport-options
- (concat
- (org-html-close-tag
- "meta"
- (format "name=\"viewport\" content=\"%s\""
- (mapconcat
- (lambda (elm) (format "%s=%s" (car elm) (cadr elm)))
- viewport-options ", "))
- info)
- "\n")))
+ (cl-remove-if-not (lambda (cell) (org-string-nw-p (cadr cell)))
+ (plist-get info :html-viewport))))
+ (if viewport-options
+ (org-html--build-meta-entry "name" "viewport"
+ (mapconcat
+ (lambda (elm) (format "%s=%s" (car elm) (cadr elm)))
+ viewport-options ", "))))
+
(format "<title>%s</title>\n" title)
- (org-html-close-tag "meta" "name=\"generator\" content=\"Org mode\"" info)
- "\n"
- (and (org-string-nw-p author)
- (concat
- (org-html-close-tag "meta"
- (format "name=\"author\" content=\"%s\""
- (funcall protect-string author))
- info)
- "\n"))
- (and (org-string-nw-p description)
- (concat
- (org-html-close-tag "meta"
- (format "name=\"description\" content=\"%s\"\n"
- (funcall protect-string description))
- info)
- "\n"))
- (and (org-string-nw-p keywords)
- (concat
- (org-html-close-tag "meta"
- (format "name=\"keywords\" content=\"%s\""
- (funcall protect-string keywords))
- info)
- "\n")))))
+
+ (apply #'concat
+ (mapcar
+ (lambda (form)
+ (when (functionp form)
+ (setq form (funcall form title author info)))
+ (when form
+ (apply #'org-html--build-meta-entry form)))
+ org-html-meta-tags)))))
(defun org-html--build-head (info)
"Return information for the <head>..</head> of the HTML output.
--
2.28.0
^ permalink raw reply related [relevance 45%]
* Re: [PATCH] Enhance org-html--build-meta-info
2020-09-17 13:50 93% [PATCH] Enhance org-html--build-meta-info TEC
@ 2020-09-17 14:21 48% ` TEC
1 sibling, 0 replies; 74+ results
From: TEC @ 2020-09-17 14:21 UTC (permalink / raw)
To: org-mode-email
TEC <tecosaur@gmail.com> writes:
> <#part type=“text/x-patch” filename=“home/tec.emacs.d/.local/straight/repos/org-mode/0001-lisp-ox-html.el-make-html-meta-func-nicer.patch”
> disposition=inline>
> <#/part>
I have no idea what I need to do to get Mu4e to attach files, but I'm
clearly not doing it right. Here's the patch inline:
From ae830f0be92c0b5ac3a9fb3d967a24d4292a1a4d Mon Sep 17 00:00:00 2001
From: TEC <tec@tecosaur.com>
Subject: [PATCH] lisp/ox-html.el: make html meta func nicer
* lisp/ox-html.el (org-html--build-meta-info): Multi-line repeated
structure extracted to new function `org-html--build-meta-entry'.
The opportunity was taken to extract most metadata info to custom
variable `org-html-meta-tags', allowing for easy end-user modification.
---
lisp/ox-html.el | 111 ++++++++++++++++++++++++++----------------------
1 file changed, 61 insertions(+), 50 deletions(-)
diff --git a/lisp/ox-html.el b/lisp/ox-html.el
index d2f24f5c6..901f1a379 100644
--- a/lisp/ox-html.el
+++ b/lisp/ox-html.el
@@ -1425,6 +1425,28 @@ not be modified."
;;;; Template :: Styles
+(defcustom org-html-meta-tags
+ '((lambda (_title author _info)
+ (when (org-string-nw-p author)
+ (org-html--build-meta-entry "name" "author" author)))
+ (lambda (_title _author info)
+ (when (org-string-nw-p (plist-get info :description))
+ (org-html--build-meta-entry "name" "description"
+ (plist-get info :description))))
+ ("name" "generator" "Org Mode"))
+ "A list of arguments to be passed to `org-html--build-meta-entry'.
+Each argument can either be an list which is applied, or a function which
+generates such a list with signature (TITLE AUTHOR INFO) where TITLE and AUTHOR
+are strings, and INFO a communication plist."
+ :group 'org-export-html
+ :package-version '(Org . "9.5")
+ :type '(repeat
+ (choice
+ (list (string :tag "Meta label")
+ (string :tag "label value")
+ (string :tag "Content value"))
+ function)))
+
(defcustom org-html-head-include-default-style t
"Non-nil means include the default style in exported HTML files.
The actual style is defined in `org-html-style-default' and
@@ -1835,23 +1857,31 @@ INFO is a plist used as a communication channel."
\f
;;; Template
+(defun org-html--build-meta-entry (label identity &optional content-format &rest content-formatters)
+ "Construct <meta> tag with LABEL=\"IDENTITY\" and content from CONTENT-FORMAT and CONTENT-FORMATTER."
+ (concat "<meta "
+ (format "%s=\"%s" label identity)
+ (when content-format
+ (concat "\" content=\""
+ (replace-regexp-in-string
+ "\"" """
+ (org-html-encode-plain-text
+ (if content-formatters
+ (apply #'format content-format content-formatters)
+ content-format)))))
+ "\" />\n"))
+
(defun org-html--build-meta-info (info)
"Return meta tags for exported document.
INFO is a plist used as a communication channel."
- (let* ((protect-string
- (lambda (str)
- (replace-regexp-in-string
- "\"" """ (org-html-encode-plain-text str))))
- (title (org-export-data (plist-get info :title) info))
+ (let* ((title (org-export-data (plist-get info :title) info))
;; Set title to an invisible character instead of leaving it
;; empty, which is invalid.
(title (if (org-string-nw-p title) title "‎"))
(author (and (plist-get info :with-author)
(let ((auth (plist-get info :author)))
- ;; Return raw Org syntax.
+ ;; Return raw Org syntax.
(and auth (org-element-interpret-data auth)))))
- (description (plist-get info :description))
- (keywords (plist-get info :keywords))
(charset (or (and org-html-coding-system
(fboundp 'coding-system-get)
(coding-system-get org-html-coding-system
@@ -1863,50 +1893,31 @@ INFO is a plist used as a communication channel."
(concat "<!-- "
(plist-get info :html-metadata-timestamp-format)
" -->\n")))
- (format
- (if (org-html-html5-p info)
- (org-html-close-tag "meta" "charset=\"%s\"" info)
- (org-html-close-tag
- "meta" "http-equiv=\"Content-Type\" content=\"text/html;charset=%s\""
- info))
- charset) "\n"
+
+ (if (org-html-html5-p info)
+ (org-html--build-meta-entry "charset" charset)
+ (org-html--build-meta-entry "http-equiv" "Content-Type"
+ (concat "text/html;charset=" charset)))
+
(let ((viewport-options
- (cl-remove-if-not (lambda (cell) (org-string-nw-p (cadr cell)))
- (plist-get info :html-viewport))))
- (and viewport-options
- (concat
- (org-html-close-tag
- "meta"
- (format "name=\"viewport\" content=\"%s\""
- (mapconcat
- (lambda (elm) (format "%s=%s" (car elm) (cadr elm)))
- viewport-options ", "))
- info)
- "\n")))
+ (cl-remove-if-not (lambda (cell) (org-string-nw-p (cadr cell)))
+ (plist-get info :html-viewport))))
+ (if viewport-options
+ (org-html--build-meta-entry "name" "viewport"
+ (mapconcat
+ (lambda (elm) (format "%s=%s" (car elm) (cadr elm)))
+ viewport-options ", "))))
+
(format "<title>%s</title>\n" title)
- (org-html-close-tag "meta" "name=\"generator\" content=\"Org mode\"" info)
- "\n"
- (and (org-string-nw-p author)
- (concat
- (org-html-close-tag "meta"
- (format "name=\"author\" content=\"%s\""
- (funcall protect-string author))
- info)
- "\n"))
- (and (org-string-nw-p description)
- (concat
- (org-html-close-tag "meta"
- (format "name=\"description\" content=\"%s\"\n"
- (funcall protect-string description))
- info)
- "\n"))
- (and (org-string-nw-p keywords)
- (concat
- (org-html-close-tag "meta"
- (format "name=\"keywords\" content=\"%s\""
- (funcall protect-string keywords))
- info)
- "\n")))))
+
+ (apply #'concat
+ (mapcar
+ (lambda (form)
+ (when (functionp form)
+ (setq form (funcall form title author info)))
+ (when form
+ (apply #'org-html--build-meta-entry form)))
+ org-html-meta-tags)))))
(defun org-html--build-head (info)
"Return information for the <head>..</head> of the HTML output.
--
2.28.0
^ permalink raw reply related [relevance 48%]
* [PATCH] Enhance org-html--build-meta-info
@ 2020-09-17 13:50 93% TEC
2020-09-17 14:21 48% ` TEC
0 siblings, 2 replies; 74+ results
From: TEC @ 2020-09-17 13:50 UTC (permalink / raw)
To: org-mode-email
[-- Attachment #1.1: Type: text/plain, Size: 374 bytes --]
Hi All,
This just replaces the current `org-html--build-meta-info' with a
cleaner, more
extensible (I also added a new variable) version. Please give it a look
and let
me know what you think!
Timothy.
<#part type="text/x-patch"
filename="/home/tec/.emacs.d/.local/straight/repos/org-mode/0001-lisp-ox-html.el-make-html-meta-func-nicer.patch"
disposition=inline>
<#/part>
[-- Attachment #1.2: Type: text/html, Size: 2250 bytes --]
^ permalink raw reply [relevance 93%]
* Re: [PATCH] org-plot abstractions and extension
[not found] ` <CAHNg_jM8sE4a6XvL5D8Gks4dQXfWhZvRBR33BDLkRgEgZ++ZGg@mail.gmail.com>
@ 2020-09-15 3:43 10% ` TEC
2020-09-25 17:51 93% ` TEC
0 siblings, 1 reply; 74+ results
From: TEC @ 2020-09-15 3:43 UTC (permalink / raw)
To: org-mode-email
[-- Attachment #1: Type: text/plain, Size: 850 bytes --]
Oooops, I've just noticed my patch attachment re-send was only addressed
to Bastien (maybe this is why I haven't heard anything?).
This is what I get for mixing mail clients and not paying attention
I guess 😅.
If someone would be willing to have a look through my work, and comment
- that would be fantastic.
I'd love to get my code into shape to be merged :)
All the best,
Timothy.
> Bastien <bzg@gnu.org> wrote:
>
>> Can you repost as plain text? The email is not very readable in HTML
>> and the patches are not readable at all.
>
> Ooops, that shouldn't have happened. Unfortunately, I have yet to find
> a good way of attaching files in mu4e.
> Those should have been converted into attachments in a plaintext
> email, but that didn't work.
>
> Let me know if this attempt works as intended,
>
> Timothy.
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0002-org-plot.el-add-new-option-transpose.patch --]
[-- Type: text/x-patch, Size: 3084 bytes --]
From c62e817b04dfbe624ee8b2090ebcde257bbd3f23 Mon Sep 17 00:00:00 2001
From: TEC <tec@tecosaur.com>
Date: Wed, 8 Jul 2020 19:26:07 +0800
Subject: [PATCH 02/11] org-plot.el: add new option :transpose
* lisp/org-plot.el (org-plot/add-options-to-plist,
org-plot/add-options-to-plist): Add a new option :transpose, and a
shorter alias :trans. Transposition is performed if the argument is yes,
y, or t. This treats the table as a matrix and performs matrix
transposition on it. If an hline is present, it is assumed that it is a
marks a separation from a first header row. The first row is then
treated as the new header by inserting a hline in the transposed data.
This is quite useful for some plots, where across multiple categories,
there are a large number of data points. Without this, the data points
would be columns and the table can spread irritatingly wide.
---
lisp/org-plot.el | 44 +++++++++++++++++++++++++++++---------------
1 file changed, 29 insertions(+), 15 deletions(-)
diff --git a/lisp/org-plot.el b/lisp/org-plot.el
index c08bc144e..6ff633130 100644
--- a/lisp/org-plot.el
+++ b/lisp/org-plot.el
@@ -50,19 +50,21 @@
"Parse an OPTIONS line and set values in the property list P.
Returns the resulting property list."
(when options
- (let ((op '(("type" . :plot-type)
- ("script" . :script)
- ("line" . :line)
- ("set" . :set)
- ("title" . :title)
- ("ind" . :ind)
- ("deps" . :deps)
- ("with" . :with)
- ("file" . :file)
- ("labels" . :labels)
- ("map" . :map)
- ("timeind" . :timeind)
- ("timefmt" . :timefmt)))
+ (let ((op '(("type" . :plot-type)
+ ("script" . :script)
+ ("line" . :line)
+ ("set" . :set)
+ ("title" . :title)
+ ("ind" . :ind)
+ ("deps" . :deps)
+ ("with" . :with)
+ ("file" . :file)
+ ("labels" . :labels)
+ ("map" . :map)
+ ("timeind" . :timeind)
+ ("timefmt" . :timefmt)
+ ("trans" . :transpose)
+ ("transpose" . :transpose)))
(multiples '("set" "line"))
(regexp ":\\([\"][^\"]+?[\"]\\|[(][^)]+?[)]\\|[^ \t\n\r;,.]*\\)")
(start 0))
@@ -289,8 +291,20 @@ line directly before or after the table."
(setf params (plist-put params (car pair) (cdr pair)))))
;; collect table and table information
(let* ((data-file (make-temp-file "org-plot"))
- (table (org-table-collapse-header (org-table-to-lisp)))
- (num-cols (length (car table))))
+ (table (let ((tbl (org-table-to-lisp)))
+ (when (pcase (plist-get params :transpose)
+ ('y t)
+ ('yes t)
+ ('t t))
+ (if (memq 'hline tbl)
+ (setq tbl (apply #'cl-mapcar #'list tbl))
+ ;; When present, remove hlines as they can't (currentily) be easily transposed.
+ (setq tbl (apply #'cl-mapcar #'list
+ (remove 'hline tbl)))
+ (push 'hline (cdr tbl))))
+ tbl))
+ (num-cols (length (if (eq (nth 0 table) 'hline) (nth 1 table)
+ (nth 0 table)))))
(run-with-idle-timer 0.1 nil #'delete-file data-file)
(when (eq (cadr table) 'hline)
(setf params
--
2.28.0
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #3: 0003-org-plot.el-add-new-custom-gnuplot-preamble.patch --]
[-- Type: text/x-patch, Size: 2013 bytes --]
From fc7f4015c726e4a685002e8d69fad1eb1d605790 Mon Sep 17 00:00:00 2001
From: TEC <tec@tecosaur.com>
Date: Wed, 8 Jul 2020 22:26:21 +0800
Subject: [PATCH 03/11] org-plot.el: add new custom gnuplot preamble
* lisp/org-plot.el: Define new custom variable
`org-plot/gnuplot-script-preamble' which can be either a string or a
function. The value of this (when executed, in the case of the
function) is inserted near the top of the generated gnuplot script.
(org-plot/gnuplot-script): Use the new variable
`org-plot/gnuplot-script-preamble' in the manner described.
This allows for the user to set the font/colour-scheme, default
precision, and much more.
---
lisp/org-plot.el | 13 +++++++++++++
1 file changed, 13 insertions(+)
diff --git a/lisp/org-plot.el b/lisp/org-plot.el
index 6ff633130..f8db45273 100644
--- a/lisp/org-plot.el
+++ b/lisp/org-plot.el
@@ -181,6 +181,13 @@ and dependent variables."
(setf back-edge "") (setf front-edge ""))))
row-vals))
+(defcustom org-plot/gnuplot-script-preamble ""
+ "String or function which provides content to be inserted into the GNUPlot
+script before the plot command. Not that this is in addition to, not instead of
+other content generated in `org-plot/gnuplot-script'."
+ :group 'org-plot
+ :type '(choice string function))
+
(defun org-plot/gnuplot-script (data-file num-cols params &optional preface)
"Write a gnuplot script to DATA-FILE respecting the options set in PARAMS.
NUM-COLS controls the number of columns plotted in a 2-d plot.
@@ -213,6 +220,12 @@ manner suitable for prepending to a user-specified script."
(when file ; output file
(funcall ats (format "set term %s" (file-name-extension file)))
(funcall ats (format "set output '%s'" file)))
+
+ (funcall ats
+ (if (stringp org-plot/gnuplot-script-preamble)
+ org-plot/gnuplot-script-preamble
+ (org-plot/gnuplot-script-preamble)))
+
(pcase type ; type
(`2d ())
(`3d (when map (funcall ats "set map")))
--
2.28.0
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #4: 0005-org-plot.el-add-utility-functions-for-range-ticks.patch --]
[-- Type: text/x-patch, Size: 6285 bytes --]
From d99a61170bb0ff10b9fc7b99cdc957ec574c1e51 Mon Sep 17 00:00:00 2001
From: TEC <tec@tecosaur.com>
Date: Thu, 9 Jul 2020 04:47:40 +0800
Subject: [PATCH 05/11] org-plot.el: add utility functions for range,ticks
* lisp/org-plot.el (org-plot/add-options-to-plist): Add the options :ymin
:ymax :xmin :xmax, as well as :min and :max as aliases to the y{min,max}
options. The :ticks option is also added, for specifying how many ticks
should be used.
(org--plot/values-stats, org--plot/sensible-tick-num,
org--plot/nice-frequency-pick, org--plot/merge-alists,
org--plot/item-frequencies, org--plot/prime-factors): New utility
functions added to allow for somewhat sensible determination of a :ticks
value when none is provided. This turns out to be harder than expected,
and so a number of functions are used to attempt to do so. The essence
of the method used, is to round values and find their prime
decompositions. From this we try to select the most common components
to give a reasonable step size. We also add a 'ticks' parameter for
manually setting the number of ticks, and (y)min/max parameters
similarly.
---
lisp/org-plot.el | 100 +++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 100 insertions(+)
diff --git a/lisp/org-plot.el b/lisp/org-plot.el
index 207f5d4af..2a9c0f5bd 100644
--- a/lisp/org-plot.el
+++ b/lisp/org-plot.el
@@ -63,6 +63,11 @@ Returns the resulting property list."
("map" . :map)
("timeind" . :timeind)
("timefmt" . :timefmt)
+ ("min" . :ymin)
+ ("max" . :ymax)
+ ("ymin" . :ymin)
+ ("xmax" . :xmax)
+ ("ticks" . :ticks)
("trans" . :transpose)
("transpose" . :transpose)))
(multiples '("set" "line"))
@@ -181,6 +186,101 @@ and dependent variables."
(setf back-edge "") (setf front-edge ""))))
row-vals))
+(defun org--plot/values-stats (nums &optional hard-min hard-max)
+ "From a list of NUMS return a plist containing some rudamentry statistics on the
+values, namely regarding the range."
+ (let* ((minimum (or hard-min (apply #'min nums)))
+ (maximum (or hard-max (apply #'max nums)))
+ (range (- maximum minimum))
+ (rangeOrder (ceiling (- 1 (log10 range))))
+ (range-factor (expt 10 rangeOrder))
+ (nice-min (/ (float (floor (* minimum range-factor))) range-factor))
+ (nice-max (/ (float (ceiling (* maximum range-factor))) range-factor)))
+ `(:min ,minimum :max ,maximum :range ,range
+ :range-factor ,range-factor
+ :nice-min ,nice-min :nice-max ,nice-max :nice-range ,(- nice-max nice-min))))
+
+(defun org--plot/sensible-tick-num (table &optional hard-min hard-max)
+ "From a the values in a TABLE of data, attempt to guess an appropriate number of ticks."
+ (let* ((row-data
+ (mapcar (lambda (row) (org--plot/values-stats
+ (mapcar #'string-to-number (cdr row))
+ hard-min
+ hard-max)) table))
+ (row-normalised-ranges (mapcar (lambda (r-data)
+ (let ((val (round (*
+ (plist-get r-data :range-factor)
+ (plist-get r-data :nice-range)))))
+ (if (= (% val 10) 0) (/ val 10) val)))
+ row-data))
+ (range-prime-decomposition (mapcar #'org--plot/prime-factors row-normalised-ranges))
+ (weighted-factors (sort (apply #'org--plot/merge-alists #'+ 0
+ (mapcar (lambda (factors) (org--plot/item-frequencies factors t))
+ range-prime-decomposition))
+ (lambda (a b) (> (cdr a) (cdr b))))))
+ (apply #'* (org--plot/nice-frequency-pick weighted-factors))))
+
+(defun org--plot/nice-frequency-pick (frequencies)
+ "From a list of frequences, try to sensibly pick a sample of the most frequent."
+ ;; TODO this mosly works decently, but counld do with some tweaking to work more consistently.
+ (case (length frequencies)
+ (1 (list (car (nth 0 frequencies))))
+ (2 (if (<= 3 (/ (cdr (nth 0 frequencies))
+ (cdr (nth 1 frequencies))))
+ (make-list 2
+ (car (nth 0 frequencies)))
+ (list (car (nth 0 frequencies))
+ (car (nth 1 frequencies)))))
+ (t
+ (let* ((total-count (apply #'+ (mapcar #'cdr frequencies)))
+ (n-freq (mapcar (lambda (freq) `(,(car freq) . ,(/ (float (cdr freq)) total-count))) frequencies))
+ (f-pick (list (car (car n-freq))))
+ (1-2-ratio (/ (cdr (nth 0 n-freq))
+ (cdr (nth 1 n-freq))))
+ (2-3-ratio (/ (cdr (nth 1 n-freq))
+ (cdr (nth 2 n-freq))))
+ (1-3-ratio (* 1-2-ratio 2-3-ratio))
+ (1-val (car (nth 0 n-freq)))
+ (2-val (car (nth 1 n-freq)))
+ (3-val (car (nth 2 n-freq))))
+ (when (> 1-2-ratio 4) (push 1-val f-pick))
+ (when (and (< 1-2-ratio 2-val)
+ (< (* (apply #'* f-pick) 2-val) 30))
+ (push 2-val f-pick))
+ (when (and (< 1-3-ratio 3-val)
+ (< (* (apply #'* f-pick) 3-val) 30))
+ (push 3-val f-pick))
+ f-pick))))
+
+(defun org--plot/merge-alists (function default alist1 alist2 &rest alists)
+ "Using FUNCTION, combine the elements of all given ALISTS. When an element is
+only present in one alist, DEFAULT is used as the second argument for the FUNCTION."
+ (when (> (length alists) 0)
+ (setq alist2 (apply #'org--plot/merge-alists function default alist2 alists)))
+ (flet ((keys (alist) (mapcar #'car alist))
+ (lookup (key alist) (or (cdr (assoc key alist)) default)))
+ (loop with keys = (union (keys alist1) (keys alist2) :test 'equal)
+ for k in keys collect
+ (cons k (funcall function (lookup k alist1) (lookup k alist2))))))
+
+(defun org--plot/item-frequencies (values &optional normalise)
+ "Return an alist indicating the frequency of values in VALUES list."
+ (let ((normaliser (if normalise (float (length values)) 1)))
+ (cl-loop for (n . m) in (seq-group-by #'identity values)
+ collect (cons n (/ (length m) normaliser)))))
+
+(defun org--plot/prime-factors (value)
+ "Return the prime decomposition of VALUE, e.g. for 12, '(3 2 2)"
+ (let ((factors '(1)) (i 1))
+ (while (/= 1 value)
+ (setq i (1+ i))
+ (when (eq 0 (% value i))
+ (push i factors)
+ (setq value (/ value i))
+ (setq i (1- i))
+ ))
+ (subseq factors 0 -1)))
+
(defcustom org-plot/gnuplot-script-preamble ""
"String or function which provides content to be inserted into the GNUPlot
script before the plot command. Not that this is in addition to, not instead of
--
2.28.0
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #5: 0004-org-plot.el-abstract-plot-types-into-custom-var.patch --]
[-- Type: text/x-patch, Size: 4470 bytes --]
From fc1ecf42cd8d0d27cda98ced2c2be365ad305df7 Mon Sep 17 00:00:00 2001
From: TEC <tec@tecosaur.com>
Date: Thu, 9 Jul 2020 04:27:18 +0800
Subject: [PATCH 04/11] org-plot.el: abstract plot types into custom var
* lisp/org-plot.el (org-plot/gnuplot-script): Abstract the generation of
gnuplot commands from the three hardcoded types: 2d, 3d, and grid.
A new custom variable `org-plot/preset-plot-types' is defined to declare
plot types and provide a lambda which is called with a fixed signature
to generate associated gnuplot code. The previously hardcoded types are
implemented as the default value.
By extracting these types to a custom variable, users are able to create
their own presets for frequently used setups. Note that while this moves
the most significant hardcoding of the 2d, 3d, and grid types in
`org-plot/gnuplot-script', there are still a few minor fragments that I
am not sure how to best address --- yet.
---
lisp/org-plot.el | 71 ++++++++++++++++++++++++++++++++----------------
1 file changed, 48 insertions(+), 23 deletions(-)
diff --git a/lisp/org-plot.el b/lisp/org-plot.el
index f8db45273..207f5d4af 100644
--- a/lisp/org-plot.el
+++ b/lisp/org-plot.el
@@ -188,6 +188,49 @@ other content generated in `org-plot/gnuplot-script'."
:group 'org-plot
:type '(choice string function))
+(defcustom org-plot/preset-plot-types
+ '((2d (lambda (data-file num-cols params plot-str)
+ (let* ((type (plist-get params :plot-type))
+ (with (if (eq type 'grid) 'pm3d (plist-get params :with)))
+ (ind (plist-get params :ind))
+ (deps (if (plist-member params :deps) (plist-get params :deps)))
+ (text-ind (plist-get params :textind))
+ (col-labels (plist-get params :labels))
+ res)
+ (dotimes (col num-cols res)
+ (unless (and (eq type '2d)
+ (or (and ind (equal (1+ col) ind))
+ (and deps (not (member (1+ col) deps)))))
+ (setf res
+ (cons
+ (format plot-str data-file
+ (or (and ind (> ind 0)
+ (not text-ind)
+ (format "%d:" ind)) "")
+ (1+ col)
+ (if text-ind (format ":xticlabel(%d)" ind) "")
+ with
+ (or (nth col col-labels)
+ (format "%d" (1+ col))))
+ res)))))))
+ (3d (lambda (data-file num-cols params plot-str)
+ (let* ((type (plist-get params :plot-type))
+ (with (if (eq type 'grid) 'pm3d (plist-get params :with))))
+ (list (format "'%s' matrix with %s title ''"
+ data-file with)))))
+ (grid (lambda (data-file num-cols params plot-str)
+ (let* ((type (plist-get params :plot-type))
+ (with (if (eq type 'grid) 'pm3d (plist-get params :with))))
+ (list (format "'%s' with %s title ''"
+ data-file with))))))
+ "List of plot presets with the type name as the car, and a function
+which yeilds plot-lines (a list of strings) as the cdr.
+The parameters of `org-plot/gnuplot-script' and PLOT-STR are passed to
+that function. i.e. it is called with the following arguments:
+ DATA-FILE NUM-COLS PARAMS PLOT-STR"
+ :group 'org-plot
+ :type '(alist :value-type (symbol group)))
+
(defun org-plot/gnuplot-script (data-file num-cols params &optional preface)
"Write a gnuplot script to DATA-FILE respecting the options set in PARAMS.
NUM-COLS controls the number of columns plotted in a 2-d plot.
@@ -254,29 +297,11 @@ manner suitable for prepending to a user-specified script."
(or timefmt ; timefmt passed to gnuplot
"%Y-%m-%d-%H:%M:%S") "\"")))
(unless preface
- (pcase type ; plot command
- (`2d (dotimes (col num-cols)
- (unless (and (eq type '2d)
- (or (and ind (equal (1+ col) ind))
- (and deps (not (member (1+ col) deps)))))
- (setf plot-lines
- (cons
- (format plot-str data-file
- (or (and ind (> ind 0)
- (not text-ind)
- (format "%d:" ind)) "")
- (1+ col)
- (if text-ind (format ":xticlabel(%d)" ind) "")
- with
- (or (nth col col-labels)
- (format "%d" (1+ col))))
- plot-lines)))))
- (`3d
- (setq plot-lines (list (format "'%s' matrix with %s title ''"
- data-file with))))
- (`grid
- (setq plot-lines (list (format "'%s' with %s title ''"
- data-file with)))))
+ (let ((type-func (cadr (assoc type org-plot/preset-plot-types))))
+ (when type-func
+ (setq plot-lines
+ (funcall type-func data-file num-cols params plot-str))))
+
(funcall ats
(concat plot-cmd " " (mapconcat #'identity
(reverse plot-lines)
--
2.28.0
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #6: 0006-org-plot.el-add-custom-var-for-affecting-the-term.patch --]
[-- Type: text/x-patch, Size: 2034 bytes --]
From 26c09d431030bacfc5a4ce84103b2eca186b2229 Mon Sep 17 00:00:00 2001
From: TEC <tec@tecosaur.com>
Date: Thu, 9 Jul 2020 05:00:03 +0800
Subject: [PATCH 06/11] org-plot.el: add custom var for affecting the term
* lisp/org-plot.el (org-plot/gnuplot-script): Allow for customisation of
org-plot's term by adding a custom variable
`org-plot/gnuplot-term-extra' which allows the user to tweak the gnuplot
term settings. This allows for setting characteristics such as default
size, or background colour.
---
lisp/org-plot.el | 18 ++++++++++++++++--
1 file changed, 16 insertions(+), 2 deletions(-)
diff --git a/lisp/org-plot.el b/lisp/org-plot.el
index 2a9c0f5bd..ed4cea195 100644
--- a/lisp/org-plot.el
+++ b/lisp/org-plot.el
@@ -331,6 +331,13 @@ that function. i.e. it is called with the following arguments:
:group 'org-plot
:type '(alist :value-type (symbol group)))
+(defcustom org-plot/gnuplot-term-extra ""
+ "String or function which provides the extra term options.
+E.g. a value of \"size 1050,650\" would cause
+\"set term ... size 1050,650\" to be used."
+ :group 'org-plot
+ :type '(choice string function))
+
(defun org-plot/gnuplot-script (data-file num-cols params &optional preface)
"Write a gnuplot script to DATA-FILE respecting the options set in PARAMS.
NUM-COLS controls the number of columns plotted in a 2-d plot.
@@ -360,8 +367,15 @@ manner suitable for prepending to a user-specified script."
;; ats = add-to-script
(ats (lambda (line) (setf script (concat script "\n" line))))
plot-lines)
- (when file ; output file
- (funcall ats (format "set term %s" (file-name-extension file)))
+
+
+ ;; handle output file, background, and size
+ (funcall ats (format "set term %s %s"
+ (if file (file-name-extension file) "GNUTERM")
+ (if (stringp org-plot/gnuplot-term-extra)
+ org-plot/gnuplot-term-extra
+ (org-plot/gnuplot-term-extra))))
+ (when file ; output file
(funcall ats (format "set output '%s'" file)))
(funcall ats
--
2.28.0
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #7: 0007-org-plot.el-tweak-term-preamble-custom-vars.patch --]
[-- Type: text/x-patch, Size: 2287 bytes --]
From 5a1b9ff8f3ba5be565828137460023cd39194b6c Mon Sep 17 00:00:00 2001
From: TEC <tec@tecosaur.com>
Date: Thu, 9 Jul 2020 05:05:20 +0800
Subject: [PATCH 07/11] org-plot.el: tweak term, preamble custom vars
* lisp/org-plot.el (org-plot/gnuplot-script): Call the term and preamble
functions (mentioned below) with the plot type as the argument.
(org-plot/gnuplot-script-preamble, org-plot/gnuplot-term-extra): update
docstring.
---
lisp/org-plot.el | 10 ++++++----
1 file changed, 6 insertions(+), 4 deletions(-)
diff --git a/lisp/org-plot.el b/lisp/org-plot.el
index ed4cea195..52422ea2f 100644
--- a/lisp/org-plot.el
+++ b/lisp/org-plot.el
@@ -284,7 +284,8 @@ only present in one alist, DEFAULT is used as the second argument for the FUNCTI
(defcustom org-plot/gnuplot-script-preamble ""
"String or function which provides content to be inserted into the GNUPlot
script before the plot command. Not that this is in addition to, not instead of
-other content generated in `org-plot/gnuplot-script'."
+other content generated in `org-plot/gnuplot-script'.
+If a function, it is called with the plot type as the argument."
:group 'org-plot
:type '(choice string function))
@@ -334,7 +335,8 @@ that function. i.e. it is called with the following arguments:
(defcustom org-plot/gnuplot-term-extra ""
"String or function which provides the extra term options.
E.g. a value of \"size 1050,650\" would cause
-\"set term ... size 1050,650\" to be used."
+\"set term ... size 1050,650\" to be used.
+If a function, it is called with the plot type as the argument."
:group 'org-plot
:type '(choice string function))
@@ -374,14 +376,14 @@ manner suitable for prepending to a user-specified script."
(if file (file-name-extension file) "GNUTERM")
(if (stringp org-plot/gnuplot-term-extra)
org-plot/gnuplot-term-extra
- (org-plot/gnuplot-term-extra))))
+ (org-plot/gnuplot-term-extra type))))
(when file ; output file
(funcall ats (format "set output '%s'" file)))
(funcall ats
(if (stringp org-plot/gnuplot-script-preamble)
org-plot/gnuplot-script-preamble
- (org-plot/gnuplot-script-preamble)))
+ (org-plot/gnuplot-script-preamble type)))
(pcase type ; type
(`2d ())
--
2.28.0
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #8: 0008-org-plot.el-add-radar-plot-type.patch --]
[-- Type: text/x-patch, Size: 6388 bytes --]
From 3e9338962a4af033bd56e8ab7a1abe5e636d71c5 Mon Sep 17 00:00:00 2001
From: TEC <tec@tecosaur.com>
Date: Thu, 9 Jul 2020 05:21:44 +0800
Subject: [PATCH 08/11] org-plot.el: add radar plot type
* lisp/org-plot.el (org--plot/radar): Implement a new plot type "radar".
(org--plot/radar-template): A huge template sting for `org-plot/radar'.
(org--plot/radar-ticks, org--plot/radar-setup-template): Smaller
template strings for use in `org-plot/radar'.
(org-plot/preset-plot-types): Add the new "radar" type to the list of
default types.
The radar type has a long and complex implementation, but that's exactly
what makes it perfect for something like this. A complex plot can be
produced with a simple keyword in the #+PLOT options. There are still a
few kinks that would benefit from being ironed out, but the current
state is fully-functional.
---
lisp/org-plot.el | 138 ++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 137 insertions(+), 1 deletion(-)
diff --git a/lisp/org-plot.el b/lisp/org-plot.el
index 52422ea2f..fd92a12a1 100644
--- a/lisp/org-plot.el
+++ b/lisp/org-plot.el
@@ -323,7 +323,9 @@ If a function, it is called with the plot type as the argument."
(let* ((type (plist-get params :plot-type))
(with (if (eq type 'grid) 'pm3d (plist-get params :with))))
(list (format "'%s' with %s title ''"
- data-file with))))))
+ data-file with)))))
+ (radar (lambda (data-file num-cols params plot-str)
+ (list (org--plot/radar table params)))))
"List of plot presets with the type name as the car, and a function
which yeilds plot-lines (a list of strings) as the cdr.
The parameters of `org-plot/gnuplot-script' and PLOT-STR are passed to
@@ -332,6 +334,140 @@ that function. i.e. it is called with the following arguments:
:group 'org-plot
:type '(alist :value-type (symbol group)))
+(defvar org--plot/radar-template
+ "### spider plot/chart with gnuplot
+# also known as: radar chart, web chart, star chart, cobweb chart,
+# radar plot, web plot, star plot, cobweb plot, etc. ...
+set datafile separator ' '
+set size square
+unset tics
+set angles degree
+set key bmargin center horizontal
+unset border
+
+# Load data and settup
+load \"%s\"
+
+# General settings
+DataColCount = words($Data[1])-1
+AxesCount = |$Data|-HeaderLines
+AngleOffset = 90
+Max = 1
+d=0.1*Max
+Direction = -1 # counterclockwise=1, clockwise = -1
+
+# Tic settings
+TicCount = %s
+TicOffset = 0.1
+TicValue(axis,i) = real(i)*(word($Settings[axis],3)-word($Settings[axis],2)) \\
+ / word($Settings[axis],4)+word($Settings[axis],2)
+TicLabelPosX(axis,i) = PosX(axis,i/TicCount) + PosY(axis, TicOffset)
+TicLabelPosY(axis,i) = PosY(axis,i/TicCount) - PosX(axis, TicOffset)
+TicLen = 0.03
+TicdX(axis,i) = 0.5*TicLen*cos(alpha(axis)-90)
+TicdY(axis,i) = 0.5*TicLen*sin(alpha(axis)-90)
+
+# Label
+LabOffset = 0.10
+LabX(axis) = PosX(axis+1,Max+2*d) + PosY(axis, LabOffset)
+LabY(axis) = PosY($0+1,Max+2*d)
+
+# Functions
+alpha(axis) = (axis-1)*Direction*360.0/AxesCount+AngleOffset
+PosX(axis,R) = R*cos(alpha(axis))
+PosY(axis,R) = R*sin(alpha(axis))
+Scale(axis,value) = real(value-word($Settings[axis],2))/(word($Settings[axis],3)-word($Settings[axis],2))
+
+# Spider settings
+set style arrow 1 dt 1 lw 1.0 @fgal head filled size 0.06,25 # style for axes
+set style arrow 2 dt 2 lw 0.5 @fgal nohead # style for weblines
+set style arrow 3 dt 1 lw 1 @fgal nohead # style for axis tics
+set samples AxesCount
+set isosamples TicCount
+set urange[1:AxesCount]
+set vrange[1:TicCount]
+set style fill transparent solid 0.2
+
+set xrange[-Max-4*d:Max+4*d]
+set yrange[-Max-4*d:Max+4*d]
+plot \\
+ '+' u (0):(0):(PosX($0,Max+d)):(PosY($0,Max+d)) w vec as 1 not, \\
+ $Data u (LabX($0)): \\
+ (LabY($0)):1 every ::HeaderLines w labels center enhanced @fgt not, \\
+ for [i=1:DataColCount] $Data u (PosX($0+1,Scale($0+1,column(i+1)))): \\
+ (PosY($0+1,Scale($0+1,column(i+1)))) every ::HeaderLines w filledcurves lt i title word($Data[1],i+1), \\
+%s
+# '++' u (PosX($1,$2/TicCount)-TicdX($1,$2/TicCount)): \\
+# (PosY($1,$2/TicCount)-TicdY($1,$2/TicCount)): \\
+# (2*TicdX($1,$2/TicCount)):(2*TicdY($1,$2/TicCount)) \\
+# w vec as 3 not, \\
+### end of code
+")
+
+(defvar org--plot/radar-ticks
+ " '++' u (PosX($1,$2/TicCount)):(PosY($1,$2/TicCount)): \\
+ (PosX($1+1,$2/TicCount)-PosX($1,$2/TicCount)): \\
+ (PosY($1+1,$2/TicCount)-PosY($1,$2/TicCount)) w vec as 2 not, \\
+ '++' u (TicLabelPosX(%s,$2)):(TicLabelPosY(%s,$2)): \\
+ (sprintf('%%g',TicValue(%s,$2))) w labels font ',8' @fgat not")
+
+(defvar org--plot/radar-setup-template
+ "# Data
+$Data <<HEREHAVESOMEDATA
+%s
+HEREHAVESOMEDATA
+HeaderLines = 1
+
+# Settings for scale and offset adjustments
+# axis min max tics axisLabelXoff axisLabelYoff
+$Settings <<EOD
+%s
+EOD
+")
+
+(defun org--plot/radar (table params)
+ (let* ((data
+ (concat "\"" (s-join "\" \"" (plist-get params :labels)) "\""
+ "\n"
+ (s-join "\n"
+ (mapcar (lambda (row)
+ (format
+ "\"%s\" %s"
+ (car row)
+ (s-join " " (cdr row))))
+ table))))
+ (ticks (or (plist-get params :ticks)
+ (org--plot/sensible-tick-num table
+ (plist-get params :ymin)
+ (plist-get params :ymax))))
+ (settings
+ (s-join "\n"
+ (mapcar (lambda (row)
+ (let ((data (org--plot/values-stats
+ (mapcar #'string-to-number (cdr row)))))
+ (format
+ "\"%s\" %s %s %s"
+ (car row)
+ (or (plist-get params :ymin)
+ (plist-get data :nice-min))
+ (or (plist-get params :ymax)
+ (plist-get data :nice-max))
+ (if (eq ticks 0) 2 ticks)
+ )))
+ table)))
+ (setup-file (make-temp-file "org-plot-setup")))
+ (f-write-text (format org--plot/radar-setup-template data settings)
+ 'utf-8 setup-file)
+ (format org--plot/radar-template
+ setup-file
+ (if (eq ticks 0) 2 ticks)
+ (if (eq ticks 0) ""
+ (apply #'format org--plot/radar-ticks
+ (make-list 3 (if (and (plist-get params :ymin)
+ (plist-get params :ymax))
+ ;; FIXME multi-drawing of tick labels with "1"
+ "1" "$1")))))))
+
(defcustom org-plot/gnuplot-term-extra ""
"String or function which provides the extra term options.
E.g. a value of \"size 1050,650\" would cause
--
2.28.0
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #9: 0001-org-plot.el-make-indentation-method-consistent.patch --]
[-- Type: text/x-patch, Size: 1467 bytes --]
From 3743e507775b446f5f8188958c20f65861fac3fb Mon Sep 17 00:00:00 2001
From: TEC <tec@tecosaur.com>
Date: Wed, 8 Jul 2020 18:34:46 +0800
Subject: [PATCH 01/11] org-plot.el: make indentation method consistent
* lisp/org-plot.el (org-plot/gnuplot): Make indentation consistent, by
replacing a few spaces with tabs.
Only 6 of 347 lines used spaces instead of tabs.
---
lisp/org-plot.el | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/lisp/org-plot.el b/lisp/org-plot.el
index 0ff96af67..c08bc144e 100644
--- a/lisp/org-plot.el
+++ b/lisp/org-plot.el
@@ -325,12 +325,12 @@ line directly before or after the table."
(with-temp-buffer
(if (plist-get params :script) ; user script
(progn (insert
- (org-plot/gnuplot-script data-file num-cols params t))
- (insert "\n")
- (insert-file-contents (plist-get params :script))
- (goto-char (point-min))
- (while (re-search-forward "\\$datafile" nil t)
- (replace-match data-file nil nil)))
+ (org-plot/gnuplot-script data-file num-cols params t))
+ (insert "\n")
+ (insert-file-contents (plist-get params :script))
+ (goto-char (point-min))
+ (while (re-search-forward "\\$datafile" nil t)
+ (replace-match data-file nil nil)))
(insert (org-plot/gnuplot-script data-file num-cols params)))
;; Graph table.
(gnuplot-mode)
--
2.28.0
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #10: 0009-org-plot.el-fix-logic-error-in-transposition.patch --]
[-- Type: text/x-patch, Size: 1668 bytes --]
From 8b1ed7fb3cc418bb90fe48d3c4c8cb711decfded Mon Sep 17 00:00:00 2001
From: TEC <tec@tecosaur.com>
Date: Thu, 30 Jul 2020 18:25:19 +0800
Subject: [PATCH 09/11] org-plot.el: fix logic error in transposition
* lisp/org-plot.el (org-plot/gnuplot): If statement in transposition
treated condition as its negative, to fix this the condition was
inverted.
It was also noticed that the code could not operate as expected as the
user-supplied #+plot options were not fetched. Resolved by re-inserting
relevant code from an older version of org-plot.
---
lisp/org-plot.el | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/lisp/org-plot.el b/lisp/org-plot.el
index fd92a12a1..1b227d698 100644
--- a/lisp/org-plot.el
+++ b/lisp/org-plot.el
@@ -579,6 +579,10 @@ line directly before or after the table."
(dolist (pair org-plot/gnuplot-default-options)
(unless (plist-member params (car pair))
(setf params (plist-put params (car pair) (cdr pair)))))
+ ;; Collect options.
+ (save-excursion (while (and (equal 0 (forward-line -1))
+ (looking-at "[[:space:]]*#\\+"))
+ (setf params (org-plot/collect-options params))))
;; collect table and table information
(let* ((data-file (make-temp-file "org-plot"))
(table (let ((tbl (org-table-to-lisp)))
@@ -586,7 +590,7 @@ line directly before or after the table."
('y t)
('yes t)
('t t))
- (if (memq 'hline tbl)
+ (if (not (memq 'hline tbl))
(setq tbl (apply #'cl-mapcar #'list tbl))
;; When present, remove hlines as they can't (currentily) be easily transposed.
(setq tbl (apply #'cl-mapcar #'list
--
2.28.0
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #11: 0010-org-plot.el-complete-transition-to-softcoded-type.patch --]
[-- Type: text/x-patch, Size: 13498 bytes --]
From bcd45c562966a893449d2412b363f31368ee5983 Mon Sep 17 00:00:00 2001
From: TEC <tec@tecosaur.com>
Date: Thu, 30 Jul 2020 18:36:11 +0800
Subject: [PATCH 10/11] org-plot.el: complete transition to softcoded type
* lisp/org-plot.el (org-plot/preset-plot-types): Adapt structure to
cover all type-specific logic within org-plot.
(org-plot/gnuplot-script, org-plot/gnuplot): Replace type-specific logic
with references to properties of the type from
`org-plot/preset-plot-types'.
---
lisp/org-plot.el | 242 ++++++++++++++++++++++++++++-------------------
1 file changed, 143 insertions(+), 99 deletions(-)
diff --git a/lisp/org-plot.el b/lisp/org-plot.el
index 1b227d698..53186bb75 100644
--- a/lisp/org-plot.el
+++ b/lisp/org-plot.el
@@ -290,7 +290,10 @@ If a function, it is called with the plot type as the argument."
:type '(choice string function))
(defcustom org-plot/preset-plot-types
- '((2d (lambda (data-file num-cols params plot-str)
+ '((2d :plot-cmd "plot"
+ :check-ind-type t
+ :plot-func
+ (lambda (_table data-file num-cols params plot-str)
(let* ((type (plist-get params :plot-type))
(with (if (eq type 'grid) 'pm3d (plist-get params :with)))
(ind (plist-get params :ind))
@@ -314,23 +317,60 @@ If a function, it is called with the plot type as the argument."
(or (nth col col-labels)
(format "%d" (1+ col))))
res)))))))
- (3d (lambda (data-file num-cols params plot-str)
+ (3d :plot-cmd "splot"
+ :plot-pre (lambda (_table _data-file _num-cols params _plot-str)
+ (if (plist-get params :map) "set map"))
+ :plot-func
+ (lambda (_table data-file _num-cols params _plot-str)
(let* ((type (plist-get params :plot-type))
(with (if (eq type 'grid) 'pm3d (plist-get params :with))))
(list (format "'%s' matrix with %s title ''"
data-file with)))))
- (grid (lambda (data-file num-cols params plot-str)
+ (grid :plot-cmd "splot"
+ :plot-pre (lambda (_table _data-file _num-cols params _plot-str)
+ (if (plist-get params :map) "set pm3d map" "set map"))
+ :data-dump (lambda (table data-file params _num-cols)
+ (let ((y-labels (org-plot/gnuplot-to-grid-data
+ table data-file params)))
+ (when y-labels (plist-put params :ylabels y-labels))))
+ :plot-func
+ (lambda (table data-file _num-cols params _plot-str)
(let* ((type (plist-get params :plot-type))
(with (if (eq type 'grid) 'pm3d (plist-get params :with))))
- (list (format "'%s' with %s title ''"
- data-file with)))))
- (radar (lambda (data-file num-cols params plot-str)
+ (list (format "'%s' with %s title ''"
+ data-file with)))))
+ (radar :plot-func
+ (lambda (table _data-file _num-cols params plot-str)
(list (org--plot/radar table params)))))
- "List of plot presets with the type name as the car, and a function
-which yeilds plot-lines (a list of strings) as the cdr.
-The parameters of `org-plot/gnuplot-script' and PLOT-STR are passed to
-that function. i.e. it is called with the following arguments:
- DATA-FILE NUM-COLS PARAMS PLOT-STR"
+ "List of plists describing the avalible plot types.
+The car is the type name, and the property :plot-func must be set.
+The value of :plot-func is a lambda which yields plot-lines
+(a list of strings) as the cdr.
+
+All lambda functions have the parameters of `org-plot/gnuplot-script' and PLOT-STR passed to them.
+i.e. they are called with the following signature: (TABLE DATA-FILE NUM-COLS PARAMS PLOT-STR)
+
+Potentially useful parameters in PARAMS include:
+ :set :line :map :title :file :ind :timeind :timefmt :textind
+ :deps :labels :xlabels :ylabels :xmin :xmax :ymin :ymax :ticks
+
+In addition to :plot-func, the following optional properties may be set.
+
+- :plot-cmd - A gnuplot command appended to each plot-line.
+ Accepts string or nil. Default value: nil.
+
+- :check-ind-type - Whether the types of ind values should be checked.
+ Accepts boolean.
+
+- :plot-str - the formula string passed to :plot-func as PLOT-STR
+ Accepts string. Default value: \"'%s' using %s%d%s with %s title '%s'\"
+
+- :data-dump - Function to dump the table to a datafile for ease of use.
+ Accepts lambda function. Default lambda body: (org-plot/gnuplot-to-data table data-file params)
+
+- :plot-pre - Gnuplot code to be inserted early into the script, just after term and output have been set.
+ Accepts string, nil, or lambda function which returns string or nil. Defaults to nil.
+"
:group 'org-plot
:type '(alist :value-type (symbol group)))
@@ -476,89 +516,90 @@ If a function, it is called with the plot type as the argument."
:group 'org-plot
:type '(choice string function))
-(defun org-plot/gnuplot-script (data-file num-cols params &optional preface)
+(defun org-plot/gnuplot-script (table data-file num-cols params &optional preface)
"Write a gnuplot script to DATA-FILE respecting the options set in PARAMS.
NUM-COLS controls the number of columns plotted in a 2-d plot.
Optional argument PREFACE returns only option parameters in a
manner suitable for prepending to a user-specified script."
- (let* ((type (plist-get params :plot-type))
- (with (if (eq type 'grid) 'pm3d (plist-get params :with)))
- (sets (plist-get params :set))
- (lines (plist-get params :line))
- (map (plist-get params :map))
- (title (plist-get params :title))
- (file (plist-get params :file))
- (ind (plist-get params :ind))
- (time-ind (plist-get params :timeind))
- (timefmt (plist-get params :timefmt))
- (text-ind (plist-get params :textind))
- (deps (if (plist-member params :deps) (plist-get params :deps)))
- (col-labels (plist-get params :labels))
- (x-labels (plist-get params :xlabels))
- (y-labels (plist-get params :ylabels))
- (plot-str "'%s' using %s%d%s with %s title '%s'")
- (plot-cmd (pcase type
- (`2d "plot")
- (`3d "splot")
- (`grid "splot")))
- (script "reset")
- ;; ats = add-to-script
- (ats (lambda (line) (setf script (concat script "\n" line))))
- plot-lines)
-
-
- ;; handle output file, background, and size
- (funcall ats (format "set term %s %s"
- (if file (file-name-extension file) "GNUTERM")
- (if (stringp org-plot/gnuplot-term-extra)
- org-plot/gnuplot-term-extra
- (org-plot/gnuplot-term-extra type))))
- (when file ; output file
- (funcall ats (format "set output '%s'" file)))
-
- (funcall ats
- (if (stringp org-plot/gnuplot-script-preamble)
- org-plot/gnuplot-script-preamble
- (org-plot/gnuplot-script-preamble type)))
-
- (pcase type ; type
- (`2d ())
- (`3d (when map (funcall ats "set map")))
- (`grid (funcall ats (if map "set pm3d map" "set pm3d"))))
- (when title (funcall ats (format "set title '%s'" title))) ; title
- (mapc ats lines) ; line
- (dolist (el sets) (funcall ats (format "set %s" el))) ; set
- ;; Unless specified otherwise, values are TAB separated.
- (unless (string-match-p "^set datafile separator" script)
- (funcall ats "set datafile separator \"\\t\""))
- (when x-labels ; x labels (xtics)
- (funcall ats
- (format "set xtics (%s)"
- (mapconcat (lambda (pair)
- (format "\"%s\" %d" (cdr pair) (car pair)))
- x-labels ", "))))
- (when y-labels ; y labels (ytics)
- (funcall ats
- (format "set ytics (%s)"
- (mapconcat (lambda (pair)
- (format "\"%s\" %d" (cdr pair) (car pair)))
- y-labels ", "))))
- (when time-ind ; timestamp index
- (funcall ats "set xdata time")
- (funcall ats (concat "set timefmt \""
- (or timefmt ; timefmt passed to gnuplot
- "%Y-%m-%d-%H:%M:%S") "\"")))
- (unless preface
- (let ((type-func (cadr (assoc type org-plot/preset-plot-types))))
- (when type-func
- (setq plot-lines
- (funcall type-func data-file num-cols params plot-str))))
+ (let* ((type-name (plist-get params :plot-type))
+ (type (cdr (assoc type-name org-plot/preset-plot-types))))
+ (unless type
+ (user-error "Org-plot type `%s' is undefined." type-name))
+ (let* ((sets (plist-get params :set))
+ (lines (plist-get params :line))
+ (map (plist-get params :map))
+ (title (plist-get params :title))
+ (file (plist-get params :file))
+ (ind (plist-get params :ind))
+ (time-ind (plist-get params :timeind))
+ (timefmt (plist-get params :timefmt))
+ (text-ind (plist-get params :textind))
+ (deps (if (plist-member params :deps) (plist-get params :deps)))
+ (col-labels (plist-get params :labels))
+ (x-labels (plist-get params :xlabels))
+ (y-labels (plist-get params :ylabels))
+ (plot-str (or (plist-get type :plot-str)
+ "'%s' using %s%d%s with %s title '%s'"))
+ (plot-cmd (plist-get type :plot-cmd))
+ (plot-pre (plist-get type :plot-pre))
+ (script "reset")
+ ;; ats = add-to-script
+ (ats (lambda (line) (when line (setf script (concat script "\n" line)))))
+ plot-lines)
+
+
+ ;; handle output file, background, and size
+ (funcall ats (format "set term %s %s"
+ (if file (file-name-extension file) "GNUTERM")
+ (if (stringp org-plot/gnuplot-term-extra)
+ org-plot/gnuplot-term-extra
+ (funcall org-plot/gnuplot-term-extra type))))
+ (when file ; output file
+ (funcall ats (format "set output '%s'" file)))
+
+ (when plot-pre
+ (funcall ats (funcall plot-pre table data-file num-cols params plot-str)))
(funcall ats
- (concat plot-cmd " " (mapconcat #'identity
- (reverse plot-lines)
- ",\\\n "))))
- script))
+ (if (stringp org-plot/gnuplot-script-preamble)
+ org-plot/gnuplot-script-preamble
+ (funcall org-plot/gnuplot-script-preamble type)))
+
+ (when title (funcall ats (format "set title '%s'" title))) ; title
+ (mapc ats lines) ; line
+ (dolist (el sets) (funcall ats (format "set %s" el))) ; set
+ ;; Unless specified otherwise, values are TAB separated.
+ (unless (string-match-p "^set datafile separator" script)
+ (funcall ats "set datafile separator \"\\t\""))
+ (when x-labels ; x labels (xtics)
+ (funcall ats
+ (format "set xtics (%s)"
+ (mapconcat (lambda (pair)
+ (format "\"%s\" %d" (cdr pair) (car pair)))
+ x-labels ", "))))
+ (when y-labels ; y labels (ytics)
+ (funcall ats
+ (format "set ytics (%s)"
+ (mapconcat (lambda (pair)
+ (format "\"%s\" %d" (cdr pair) (car pair)))
+ y-labels ", "))))
+ (when time-ind ; timestamp index
+ (funcall ats "set xdata time")
+ (funcall ats (concat "set timefmt \""
+ (or timefmt ; timefmt passed to gnuplot
+ "%Y-%m-%d-%H:%M:%S") "\"")))
+ (unless preface
+ (let ((type-func (plist-get type :plot-func)))
+ (when type-func
+ (setq plot-lines
+ (funcall type-func table data-file num-cols params plot-str))))
+ (funcall ats
+ (concat plot-cmd
+ (when plot-cmd " ")
+ (mapconcat #'identity
+ (reverse plot-lines)
+ ",\\\n "))))
+ script)))
;;-----------------------------------------------------------------------------
;; facade functions
@@ -598,7 +639,13 @@ line directly before or after the table."
(push 'hline (cdr tbl))))
tbl))
(num-cols (length (if (eq (nth 0 table) 'hline) (nth 1 table)
- (nth 0 table)))))
+ (nth 0 table))))
+ (type (assoc (plist-get params :plot-type)
+ org-plot/preset-plot-types)))
+
+ (unless type
+ (user-error "Org-plot type `%s' is undefined." type-name))
+
(run-with-idle-timer 0.1 nil #'delete-file data-file)
(when (eq (cadr table) 'hline)
(setf params
@@ -608,15 +655,12 @@ line directly before or after the table."
(save-excursion (while (and (equal 0 (forward-line -1))
(looking-at "[[:space:]]*#\\+"))
(setf params (org-plot/collect-options params))))
- ;; Dump table to datafile (very different for grid).
- (pcase (plist-get params :plot-type)
- (`2d (org-plot/gnuplot-to-data table data-file params))
- (`3d (org-plot/gnuplot-to-data table data-file params))
- (`grid (let ((y-labels (org-plot/gnuplot-to-grid-data
- table data-file params)))
- (when y-labels (plist-put params :ylabels y-labels)))))
+ ;; Dump table to datafile
+ (if-let ((dump-func (plist-get type :data-dump)))
+ (funcall dump-func table data-file num-cols params)
+ (org-plot/gnuplot-to-data table data-file params))
;; Check type of ind column (timestamp? text?)
- (when (eq `2d (plist-get params :plot-type))
+ (when (plist-get params :check-ind-type)
(let* ((ind (1- (plist-get params :ind)))
(ind-column (mapcar (lambda (row) (nth ind row)) table)))
(cond ((< ind 0) nil) ; ind is implicit
@@ -633,13 +677,13 @@ line directly before or after the table."
(with-temp-buffer
(if (plist-get params :script) ; user script
(progn (insert
- (org-plot/gnuplot-script data-file num-cols params t))
+ (org-plot/gnuplot-script table data-file num-cols params t))
(insert "\n")
(insert-file-contents (plist-get params :script))
(goto-char (point-min))
(while (re-search-forward "\\$datafile" nil t)
(replace-match data-file nil nil)))
- (insert (org-plot/gnuplot-script data-file num-cols params)))
+ (insert (org-plot/gnuplot-script table data-file num-cols params)))
;; Graph table.
(gnuplot-mode)
(gnuplot-send-buffer-to-gnuplot))
--
2.28.0
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #12: 0011-org-plot.el-avoid-arithmetic-overflow-error.patch --]
[-- Type: text/x-patch, Size: 1584 bytes --]
From a299ec63c91260b68237da3a6c19e8ed8523fd6d Mon Sep 17 00:00:00 2001
From: TEC <tec@tecosaur.com>
Date: Sat, 5 Sep 2020 21:05:36 +0800
Subject: [PATCH 11/11] org-plot.el: avoid arithmetic overflow error
* lisp/org-plot.el (org--plot/values-stats): A set of numbers with the
same value (i.e. 0 range) should not produce an arithmetic overflow
error. This error was caused by taking the log of 0 (when the range is
0). This is mitigated by explicit checking against this case.
---
lisp/org-plot.el | 9 ++++++---
1 file changed, 6 insertions(+), 3 deletions(-)
diff --git a/lisp/org-plot.el b/lisp/org-plot.el
index 53186bb75..0a9694263 100644
--- a/lisp/org-plot.el
+++ b/lisp/org-plot.el
@@ -192,10 +192,13 @@ values, namely regarding the range."
(let* ((minimum (or hard-min (apply #'min nums)))
(maximum (or hard-max (apply #'max nums)))
(range (- maximum minimum))
- (rangeOrder (ceiling (- 1 (log10 range))))
+ (rangeOrder (if (= range 0) 0
+ (ceiling (- 1 (log10 range)))))
(range-factor (expt 10 rangeOrder))
- (nice-min (/ (float (floor (* minimum range-factor))) range-factor))
- (nice-max (/ (float (ceiling (* maximum range-factor))) range-factor)))
+ (nice-min (if (= range 0) (car nums)
+ (/ (float (floor (* minimum range-factor))) range-factor)))
+ (nice-max (if (= range 0) (car nums)
+ (/ (float (ceiling (* maximum range-factor))) range-factor))))
`(:min ,minimum :max ,maximum :range ,range
:range-factor ,range-factor
:nice-min ,nice-min :nice-max ,nice-max :nice-range ,(- nice-max nice-min))))
--
2.28.0
^ permalink raw reply related [relevance 10%]
* [PATCH] org-plot abstractions and extension
@ 2020-09-06 5:50 65% TEC
[not found] ` <87blijmnv9.fsf@gnu.org>
0 siblings, 1 reply; 74+ results
From: TEC @ 2020-09-06 5:50 UTC (permalink / raw)
To: org-mode-email
[-- Attachment #1.1: Type: text/plain, Size: 2607 bytes --]
Hi All,
I think while my org-plot work isn't yet complete, it has reached a
review-able
state.
I see org-plot as a great tool for making it easy to produce
high-quality
graphics from tabular data in Org files. With this in mind, this set of
patches
aims to achieve to overarching goals:
1. improve the flexibility of org-plot by abstracting out some
hard-coded elements
2. introduce some (hopefully, generally useful) utility functions, and a
new
default plot type that makes use of them --- radar
If you are interested in org-plot, or have some time to spare and are
feeling
helpful, please give me your thoughts on the attached patches :)
Timothy.
<#part type="text/x-patch"
filename="/home/tec/.emacs.d/.local/straight/repos/org-mode/0001-org-plot.el-make-indentation-method-consistent.patch"
disposition=attachment>
<#/part>
<#part type="text/x-patch"
filename="/home/tec/.emacs.d/.local/straight/repos/org-mode/0002-org-plot.el-add-new-option-transpose.patch"
disposition=attachment>
<#/part>
<#part type="text/x-patch"
filename="/home/tec/.emacs.d/.local/straight/repos/org-mode/0003-org-plot.el-add-new-custom-gnuplot-preamble.patch"
disposition=attachment>
<#/part>
<#part type="text/x-patch"
filename="/home/tec/.emacs.d/.local/straight/repos/org-mode/0004-org-plot.el-abstract-plot-types-into-custom-var.patch"
disposition=attachment>
<#/part>
<#part type="text/x-patch"
filename="/home/tec/.emacs.d/.local/straight/repos/org-mode/0005-org-plot.el-add-utility-functions-for-range-ticks.patch"
disposition=attachment>
<#/part>
<#part type="text/x-patch"
filename="/home/tec/.emacs.d/.local/straight/repos/org-mode/0006-org-plot.el-add-custom-var-for-affecting-the-term.patch"
disposition=attachment>
<#/part>
<#part type="text/x-patch"
filename="/home/tec/.emacs.d/.local/straight/repos/org-mode/0007-org-plot.el-tweak-term-preamble-custom-vars.patch"
disposition=attachment>
<#/part>
<#part type="text/x-patch"
filename="/home/tec/.emacs.d/.local/straight/repos/org-mode/0008-org-plot.el-add-radar-plot-type.patch"
disposition=attachment>
<#/part>
<#part type="text/x-patch"
filename="/home/tec/.emacs.d/.local/straight/repos/org-mode/0009-org-plot.el-fix-logic-error-in-transposition.patch"
disposition=attachment>
<#/part>
<#part type="text/x-patch"
filename="/home/tec/.emacs.d/.local/straight/repos/org-mode/0010-org-plot.el-complete-transition-to-softcoded-type.patch"
disposition=attachment>
<#/part>
<#part type="text/x-patch"
filename="/home/tec/.emacs.d/.local/straight/repos/org-mode/0011-org-plot.el-avoid-arithmetic-overflow-error.patch"
disposition=attachment>
<#/part>
[-- Attachment #1.2: Type: text/html, Size: 5682 bytes --]
^ permalink raw reply [relevance 65%]
Results 201-274 of 274 prev (newer) | reverse | options above
-- pct% links below jump to the message on this page, permalinks otherwise --
2019-12-07 7:26 PATCH: Display point of code block point when confirming evaluation Jarmo Hurri
2020-09-30 4:04 ` Kyle Meyer
2020-09-30 4:57 93% ` TEC
2020-09-06 5:50 65% [PATCH] org-plot abstractions and extension TEC
[not found] ` <87blijmnv9.fsf@gnu.org>
[not found] ` <CAHNg_jM8sE4a6XvL5D8Gks4dQXfWhZvRBR33BDLkRgEgZ++ZGg@mail.gmail.com>
2020-09-15 3:43 10% ` TEC
2020-09-25 17:51 93% ` TEC
2020-10-17 2:12 93% ` TEC
2020-10-24 11:31 ` Bastien
2020-10-24 18:16 8% ` TEC
2020-12-09 2:58 93% ` TEC
2020-12-14 5:41 ` Bastien
2020-12-14 6:30 93% ` TEC
2020-12-23 5:09 ` Kyle Meyer
2020-12-23 5:10 93% ` TEC
2020-12-23 6:19 43% ` TEC
2020-12-23 7:14 ` Kyle Meyer
2020-12-23 8:38 41% ` TEC
2020-12-23 16:55 ` Kyle Meyer
2020-12-23 18:19 43% ` TEC
2020-09-17 13:50 93% [PATCH] Enhance org-html--build-meta-info TEC
2020-09-17 14:21 48% ` TEC
2020-09-17 15:53 ` Jens Lechtenboerger
2020-09-17 16:14 45% ` TEC
2020-09-18 8:11 ` Jens Lechtenboerger
2020-09-25 17:48 47% ` TEC
2020-09-27 15:17 ` Jens Lechtenboerger
2020-09-27 17:39 46% ` TEC
2020-09-27 18:00 ` Jens Lechtenboerger
2020-09-27 18:35 93% ` TEC
2020-09-28 8:17 ` Jens Lechtenboerger
2020-12-13 16:12 46% ` TEC
2020-12-14 6:04 ` Bastien
2020-12-14 6:34 66% ` TEC
2020-12-14 7:20 ` Bastien
2020-12-14 7:27 90% ` TEC
2020-12-14 8:11 ` Bastien
2020-12-14 10:01 37% ` TEC
2020-12-14 9:49 ` Jens Lechtenboerger
2020-12-15 11:39 34% ` TEC
2020-12-16 4:13 ` Tom Gillespie
2020-12-16 5:04 73% ` Timothy E Chapman
2020-12-16 6:55 ` Jens Lechtenboerger
2020-12-16 7:22 86% ` TEC
2020-12-16 8:37 ` Jens Lechtenboerger
2020-12-20 5:08 93% ` TEC
2020-12-20 17:59 ` Jens Lechtenboerger
2021-01-02 18:51 34% ` TEC
2021-01-03 13:26 ` Jens Lechtenboerger
2021-01-03 14:48 33% ` TEC
2021-01-03 15:41 ` Jens Lechtenboerger
2021-01-03 17:17 34% ` TEC
2021-01-04 7:11 ` Jens Lechtenboerger
2021-01-10 15:52 34% ` TEC
2021-01-10 17:02 ` Jens Lechtenboerger
2021-01-10 20:36 93% ` TEC
2021-01-14 10:36 34% ` TEC
2021-01-14 15:59 ` Jens Lechtenboerger
2021-01-14 16:02 93% ` Ready to merge! " TEC
2021-01-21 4:05 ` Kyle Meyer
2021-01-21 5:55 93% ` TEC
2020-12-20 5:08 93% ` TEC
2020-10-25 18:54 [PATCH] Async session eval (2nd attempt) Jack Kamm
2021-01-03 8:51 70% ` TEC
2021-02-28 22:23 ` Jack Kamm
2021-03-01 6:22 92% ` Timothy
2020-10-29 0:46 [PATCH] New "project" option for org-link-file-path-type Jack Kamm
2020-11-02 5:41 ` Kyle Meyer
2020-11-04 18:11 ` Jack Kamm
2020-11-06 3:33 ` Kyle Meyer
2020-11-12 1:05 ` Jack Kamm
2021-04-25 3:29 93% ` Timothy
2020-10-30 7:35 [PATCH] add new link type "contact:" for org-contacts.el stardiviner
2020-10-30 7:44 ` stardiviner
2020-11-09 0:24 ` stardiviner
2020-11-09 6:14 ` Jean Louis
2020-11-10 1:15 ` [UPDATED PATCH] " stardiviner
2020-11-11 8:37 ` Bastien
2020-11-11 12:04 ` stardiviner
2020-11-11 13:57 ` More on design of org-contacts.el - " Jean Louis
2020-11-16 9:26 ` stardiviner
2020-12-14 6:06 ` Bastien
2020-12-15 8:53 ` [final patch] " stardiviner
2020-12-15 9:56 ` Bastien
2020-12-15 14:13 ` stardiviner
2020-12-15 14:27 ` Bastien
2021-04-25 3:31 93% ` Timothy
2020-11-03 20:40 [PATCH] ox-md.el/preserve radio target hyperlink nazar.stasiv
2021-01-03 10:11 93% ` TEC
2020-11-04 6:40 [PATCH] ox-md.el/markdown-hyperlink turbo.cafe
2021-01-03 10:06 93% ` TEC
2020-11-14 18:06 [PATCH] doc/org-manual.org: Extend table formulas Lisp form documentation Daniele Nicolodi
2020-11-16 10:25 ` Eric S Fraga
2020-11-16 10:51 ` Daniele Nicolodi
2020-11-16 12:35 ` Tim Cross
2020-11-18 19:42 71% ` TEC
2020-12-02 9:30 [PATCH] [C-c C-q] completing tags from both buffer-local and global alist of tags stardiviner
2020-12-03 2:40 ` [PATCH] I updated patch by deleteing duplicate tags stardiviner
2021-01-10 22:10 ` Kyle Meyer
2021-01-11 2:24 ` Christopher Miles
2021-01-13 3:26 ` Kyle Meyer
2021-01-13 9:30 ` Christopher Miles
2021-01-14 5:24 ` Kyle Meyer
2021-04-25 3:25 99% ` Timothy
2020-12-17 17:11 [patch] A proposal to add LaTeX attributes to verse blocks Juan Manuel Macías
2021-01-03 10:22 93% ` TEC
2020-12-17 17:23 [PATCH] " Juan Manuel Macías
2021-01-03 10:25 92% ` TEC
2021-01-03 13:07 ` Juan Manuel Macías
2021-01-03 13:08 79% ` TEC
2020-12-23 2:35 82% [PATCH] Apply emacs manual css to org pages TEC
2020-12-23 3:42 ` Greg Minshall
2021-04-25 3:36 93% ` Timothy
2020-12-27 21:29 ` Samuel Wales
2020-12-27 21:39 ` Samuel Wales
2020-12-27 21:45 ` Samuel Wales
2020-12-28 4:04 93% ` TEC
2020-12-29 6:07 ` Kyle Meyer
2021-03-24 8:08 ` Bastien
2021-04-25 3:34 93% ` Timothy
2021-01-02 22:13 [PATCH] ol: Avoid initial input when completing function for storing link Kyle Meyer
2021-01-05 5:16 ` Kyle Meyer
2021-04-25 3:38 93% ` Timothy
2021-01-05 3:56 [PATCH v2] org-contacts.el: Only use org-id-store-link if org-id is loaded Kyle Meyer
2021-01-05 4:20 ` [PATCH] org-contacts.el: Use `bound-and-true-p' to check (unbound) var David Florness
2021-01-05 11:33 ` miles christopher
2021-04-25 3:41 93% ` Timothy
2021-01-08 16:28 [PATCH] ob-java, a proposal on import improvement John Herrlin
2021-01-09 15:51 ` ian martins
2021-01-10 20:55 ` John Herrlin
2021-01-12 12:00 ` ian martins
2021-01-16 12:56 ` ian martins
2021-01-16 15:32 ` John Herrlin
2021-01-16 20:49 ` ian martins
2021-04-25 3:42 93% ` Timothy
2021-01-20 10:46 39% [PATCH] TEC
2021-01-20 11:00 93% ` [PATCH] tweaks to ox-html style TEC
2021-02-12 6:16 ` Kyle Meyer
2021-02-12 16:57 ` Jens Lechtenboerger
2021-02-12 17:08 ` Jens Lechtenboerger
2021-02-12 18:22 92% ` Timothy
2021-02-12 18:16 88% ` Timothy
2021-02-12 21:46 ` Tim Cross
2021-02-13 13:32 ` Christian Moe
2021-02-14 4:36 93% ` Timothy
2021-01-26 7:53 [PATCH] ob-java: Allow import to end with asterisk John Herrlin
2021-01-27 3:21 ` ian martins
2021-01-28 20:03 ` John Herrlin
2021-01-30 10:50 ` ian martins
2021-04-25 3:43 93% ` Timothy
2021-01-31 19:04 60% [PATCH] document org-html-meta-tags TEC
2021-02-08 0:50 ` Kyle Meyer
2021-02-09 19:51 93% ` Timothy
2021-02-18 16:33 [PATCH] Startup option to separate macros arguments with an alternative string Juan Manuel Macías
2021-04-19 9:19 ` Nicolas Goaziou
2021-04-21 16:01 ` Juan Manuel Macías
2021-04-22 12:55 ` Nicolas Goaziou
2021-04-22 13:46 ` Juan Manuel Macías
2021-04-25 3:46 93% ` Timothy
2021-03-19 12:03 77% [PATCH] Improve documentation of #+startup keyword Timothy
2021-03-25 17:19 [PATCH 0/1] Add option to delay fontification of source blocks Leo Okawa Ericson
2021-03-29 5:03 ` Kyle Meyer
2021-04-02 12:44 ` Leo Okawa Ericson
2021-04-25 3:48 93% ` Timothy
2021-03-25 17:43 Leo Okawa Ericson
2021-04-25 3:48 93% ` Timothy
2021-03-31 15:00 42% [PATCH] Fontification for inline src blocks Timothy
2021-03-31 15:25 76% [PATCH] avoid loading major modes when exporting to file Timothy
2021-03-31 15:57 80% [PATCH] Add font-lock rule for inline export snippets Timothy
2021-03-31 16:41 59% [PATCH] Wrap LaTeX snippets in $$ with markdown export Timothy
2021-04-07 11:24 58% [PATCH] Use <img> tags for SVGs Timothy
2021-04-07 11:29 93% ` Timothy
2021-04-18 7:22 [PATCH] ob-tangle.el: Speed up tangling Sébastien Miquel
2021-04-18 18:47 ` Tom Gillespie
2021-04-19 8:05 ` Sébastien Miquel
2021-04-20 8:33 ` Tom Gillespie
2021-04-21 6:33 ` Sébastien Miquel
2021-04-21 8:02 93% ` Timothy
2021-04-24 4:59 74% [PATCH] Refresh inline plotted images Timothy
2021-04-24 22:02 [PATCH] org-capture.el: Add new capture template option :refile-to Richard Garner
2021-04-25 3:16 93% ` Timothy
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).