[PATCH] Render using Haunt; per dthompson's recommendation.

  • Open
  • quality assurance status badge
Details
3 participants
  • Arun Isaac
  • Thompson, David
  • Felix Lechner
Owner
unassigned
Submitted by
Felix Lechner
Severity
normal
F
F
Felix Lechner wrote on 13 May 06:40 +0200
(address . bug-mumi@gnu.org)
20240513044056.7243-1-felix.lechner@lease-up.com
Per a conversation with David on IRC, it's better to serve UTF-8
directly instead of transcoding to HTML entities. The new code in
Haunt, which David authored and from where the previous code came,
does just that.

Please add 'haunt' as an "input" to the Mumi package definition in
Guix after accepting this commit.

A preview of this code is live at patchwise.org.
---
Makefile.am | 1 -
mumi/web/render.scm | 2 +-
mumi/web/sxml.scm | 370 --------------------------------------------
3 files changed, 1 insertion(+), 372 deletions(-)
delete mode 100644 mumi/web/sxml.scm

Toggle diff (407 lines)
diff --git a/Makefile.am b/Makefile.am
index 3e57e63..ae279df 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -40,7 +40,6 @@ SOURCES = \
mumi/web/server.scm \
mumi/web/render.scm \
mumi/web/controller.scm \
- mumi/web/sxml.scm \
mumi/web/util.scm \
mumi/web/graphql.scm \
mumi/web/view/html.scm \
diff --git a/mumi/web/render.scm b/mumi/web/render.scm
index ad3ae0e..231e892 100644
--- a/mumi/web/render.scm
+++ b/mumi/web/render.scm
@@ -33,9 +33,9 @@
#:use-module (web response)
#:use-module (web uri)
#:use-module (webutils multipart)
+ #:use-module (haunt html)
#:use-module (json)
#:use-module (mumi config)
- #:use-module (mumi web sxml)
#:use-module (mumi web util)
#:export (render-static-asset
render-html
diff --git a/mumi/web/sxml.scm b/mumi/web/sxml.scm
deleted file mode 100644
index a3d1056..0000000
--- a/mumi/web/sxml.scm
+++ /dev/null
@@ -1,370 +0,0 @@
-;;; mumi -- Mediocre, uh, mail interface
-;;; Copyright © 2016, 2017 Ricardo Wurmus <rekado@elephly.net>
-;;; Copyright © 2015 David Thompson <davet@gnu.org>
-;;;
-;;; This program is free software: you can redistribute it and/or
-;;; modify it under the terms of the GNU Affero General Public License
-;;; as published by the Free Software Foundation, either version 3 of
-;;; the License, or (at your option) any later version.
-;;;
-;;; This program is distributed in the hope that it will be useful,
-;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-;;; Affero General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU Affero General Public
-;;; License along with this program. If not, see
-;;; <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-;;
-;; SXML to HTML conversion.
-;;
-;;; Code:
-
-(define-module (mumi web sxml)
- #:use-module (sxml simple)
- #:use-module (srfi srfi-26)
- #:use-module (ice-9 match)
- #:use-module (ice-9 format)
- #:use-module (ice-9 hash-table)
- #:export (sxml->html))
-
-(define %self-closing-tags
- '(area
- base
- br
- col
- command
- embed
- hr
- img
- input
- keygen
- link
- meta
- param
- source
- track
- wbr))
-
-(define (self-closing-tag? tag)
- "Return #t if TAG is self-closing."
- (pair? (memq tag %self-closing-tags)))
-
-(define %escape-chars
- (alist->hash-table
- '((#\" . "quot")
- (#\& . "amp")
- (#\' . "apos")
- (#\< . "lt")
- (#\> . "gt")
- (#\¡ . "iexcl")
- (#\¢ . "cent")
- (#\£ . "pound")
- (#\¤ . "curren")
- (#\¥ . "yen")
- (#\¦ . "brvbar")
- (#\§ . "sect")
- (#\¨ . "uml")
- (#\© . "copy")
- (#\ª . "ordf")
- (#\« . "laquo")
- (#\¬ . "not")
- (#\® . "reg")
- (#\¯ . "macr")
- (#\° . "deg")
- (#\± . "plusmn")
- (#\² . "sup2")
- (#\³ . "sup3")
- (#\´ . "acute")
- (#\µ . "micro")
- (#\¶ . "para")
- (#\· . "middot")
- (#\¸ . "cedil")
- (#\¹ . "sup1")
- (#\º . "ordm")
- (#\» . "raquo")
- (#\¼ . "frac14")
- (#\½ . "frac12")
- (#\¾ . "frac34")
- (#\¿ . "iquest")
- (#\À . "Agrave")
- (#\Á . "Aacute")
- (#\Â . "Acirc")
- (#\Ã . "Atilde")
- (#\Ä . "Auml")
- (#\Å . "Aring")
- (#\Æ . "AElig")
- (#\Ç . "Ccedil")
- (#\È . "Egrave")
- (#\É . "Eacute")
- (#\Ê . "Ecirc")
- (#\Ë . "Euml")
- (#\Ì . "Igrave")
- (#\Í . "Iacute")
- (#\Î . "Icirc")
- (#\Ï . "Iuml")
- (#\Ð . "ETH")
- (#\Ñ . "Ntilde")
- (#\Ò . "Ograve")
- (#\Ó . "Oacute")
- (#\Ô . "Ocirc")
- (#\Õ . "Otilde")
- (#\Ö . "Ouml")
- (#\× . "times")
- (#\Ø . "Oslash")
- (#\Ù . "Ugrave")
- (#\Ú . "Uacute")
- (#\Û . "Ucirc")
- (#\Ü . "Uuml")
- (#\Ý . "Yacute")
- (#\Þ . "THORN")
- (#\ß . "szlig")
- (#\à . "agrave")
- (#\á . "aacute")
- (#\â . "acirc")
- (#\ã . "atilde")
- (#\ä . "auml")
- (#\å . "aring")
- (#\æ . "aelig")
- (#\ç . "ccedil")
- (#\è . "egrave")
- (#\é . "eacute")
- (#\ê . "ecirc")
- (#\ë . "euml")
- (#\ì . "igrave")
- (#\í . "iacute")
- (#\î . "icirc")
- (#\ï . "iuml")
- (#\ð . "eth")
- (#\ñ . "ntilde")
- (#\ò . "ograve")
- (#\ó . "oacute")
- (#\ô . "ocirc")
- (#\õ . "otilde")
- (#\ö . "ouml")
- (#\÷ . "divide")
- (#\ø . "oslash")
- (#\ù . "ugrave")
- (#\ú . "uacute")
- (#\û . "ucirc")
- (#\ü . "uuml")
- (#\ý . "yacute")
- (#\þ . "thorn")
- (#\ÿ . "yuml")
- (#\Œ . "OElig")
- (#\œ . "oelig")
- (#\Š . "Scaron")
- (#\š . "scaron")
- (#\Ÿ . "Yuml")
- (#\ƒ . "fnof")
- (#\ˆ . "circ")
- (#\˜ . "tilde")
- (#\Α . "Alpha")
- (#\Β . "Beta")
- (#\Γ . "Gamma")
- (#\Δ . "Delta")
- (#\Ε . "Epsilon")
- (#\Ζ . "Zeta")
- (#\Η . "Eta")
- (#\Θ . "Theta")
- (#\Ι . "Iota")
- (#\Κ . "Kappa")
- (#\Λ . "Lambda")
- (#\Μ . "Mu")
- (#\Ν . "Nu")
- (#\Ξ . "Xi")
- (#\Ο . "Omicron")
- (#\Π . "Pi")
- (#\Ρ . "Rho")
- (#\Σ . "Sigma")
- (#\Τ . "Tau")
- (#\Υ . "Upsilon")
- (#\Φ . "Phi")
- (#\Χ . "Chi")
- (#\Ψ . "Psi")
- (#\Ω . "Omega")
- (#\α . "alpha")
- (#\β . "beta")
- (#\γ . "gamma")
- (#\δ . "delta")
- (#\ε . "epsilon")
- (#\ζ . "zeta")
- (#\η . "eta")
- (#\θ . "theta")
- (#\ι . "iota")
- (#\κ . "kappa")
- (#\λ . "lambda")
- (#\μ . "mu")
- (#\ν . "nu")
- (#\ξ . "xi")
- (#\ο . "omicron")
- (#\π . "pi")
- (#\ρ . "rho")
- (#\ς . "sigmaf")
- (#\σ . "sigma")
- (#\τ . "tau")
- (#\υ . "upsilon")
- (#\φ . "phi")
- (#\χ . "chi")
- (#\ψ . "psi")
- (#\ω . "omega")
- (#\ϑ . "thetasym")
- (#\ϒ . "upsih")
- (#\ϖ . "piv")
- (#\  . "ensp")
- (#\  . "emsp")
- (#\  . "thinsp")
- (#\– . "ndash")
- (#\— . "mdash")
- (#\‘ . "lsquo")
- (#\’ . "rsquo")
- (#\‚ . "sbquo")
- (#\“ . "ldquo")
- (#\” . "rdquo")
- (#\„ . "bdquo")
- (#\† . "dagger")
- (#\‡ . "Dagger")
- (#\• . "bull")
- (#\… . "hellip")
- (#\‰ . "permil")
- (#\′ . "prime")
- (#\″ . "Prime")
- (#\‹ . "lsaquo")
- (#\› . "rsaquo")
- (#\‾ . "oline")
- (#\⁄ . "frasl")
- (#\€ . "euro")
- (#\ℑ . "image")
- (#\℘ . "weierp")
- (#\ℜ . "real")
- (#\™ . "trade")
- (#\ℵ . "alefsym")
- (#\← . "larr")
- (#\↑ . "uarr")
- (#\→ . "rarr")
- (#\↓ . "darr")
- (#\↔ . "harr")
- (#\↵ . "crarr")
- (#\⇐ . "lArr")
- (#\⇑ . "uArr")
- (#\⇒ . "rArr")
- (#\⇓ . "dArr")
- (#\⇔ . "hArr")
- (#\∀ . "forall")
- (#\∂ . "part")
- (#\∃ . "exist")
- (#\∅ . "empty")
- (#\∇ . "nabla")
- (#\∈ . "isin")
- (#\∉ . "notin")
- (#\∋ . "ni")
- (#\∏ . "prod")
- (#\∑ . "sum")
- (#\− . "minus")
- (#\∗ . "lowast")
- (#\√ . "radic")
- (#\∝ . "prop")
- (#\∞ . "infin")
- (#\∠ . "ang")
- (#\∧ . "and")
- (#\∨ . "or")
- (#\∩ . "cap")
- (#\∪ . "cup")
- (#\∫ . "int")
- (#\∴ . "there4")
- (#\∼ . "sim")
- (#\≅ . "cong")
- (#\≈ . "asymp")
- (#\≠ . "ne")
- (#\≡ . "equiv")
- (#\≤ . "le")
- (#\≥ . "ge")
- (#\⊂ . "sub")
- (#\⊃ . "sup")
- (#\⊄ . "nsub")
- (#\⊆ . "sube")
- (#\⊇ . "supe")
- (#\⊕ . "oplus")
- (#\⊗ . "otimes")
- (#\⊥ . "perp")
- (#\⋅ . "sdot")
- (#\⋮ . "vellip")
- (#\⌈ . "lceil")
- (#\⌉ . "rceil")
- (#\⌊ . "lfloor")
- (#\⌋ . "rfloor")
- (#\⟨ . "lang")
- (#\⟩ . "rang")
- (#\◊ . "loz")
- (#\♠ . "spades")
- (#\♣ . "clubs")
- (#\♥ . "hearts")
- (#\♦ . "diams"))))
-
-(define (string->escaped-html s port)
- "Write the HTML escaped form of S to PORT."
- (define (escape c)
- (let ((escaped (hash-ref %escape-chars c)))
- (if escaped
- (format port "&~a;" escaped)
- (display c port))))
- (string-for-each escape s))
-
-(define (object->escaped-html obj port)
- "Write the HTML escaped form of OBJ to PORT."
- (string->escaped-html
- (call-with-output-string (cut display obj <>))
- port))
-
-(define (attribute-value->html value port)
- "Write the HTML escaped form of VALUE to PORT."
- (if (string? value)
- (string->escaped-html value port)
- (object->escaped-html value port)))
-
-(define (attribute->html attr value port)
- "Write ATTR and VALUE to PORT."
- (format port "~a=\"" attr)
- (attribute-value->html value port)
- (display #\" port))
-
-(define (element->html tag attrs body port)
- "Write the HTML TAG to PORT, where TAG has the attributes in the
-list ATTRS and the child nodes in BODY."
- (format port "<~a" tag)
- (for-each (match-lambda
- ((attr value)
- (display #\space port)
- (attribute->html attr value port)))
- attrs)
- (if (and (null? body) (self-closing-tag? tag))
- (display " />" port)
- (begin
- (display #\> port)
- (for-each (cut sxml->html <> port) body)
- (format port "</~a>" tag))))
-
-(define (doctype->html doctype port)
- (format port "<!DOCTYPE ~a>" doctype))
-
-(define* (sxml->html tree #:optional (port (current-output-port)))
- "Write the serialized HTML form of TREE to PORT."
- (match tree
- (() *unspecified*)
- (('doctype type)
- (doctype->html type port))
- ;; Unescaped, raw HTML output
- (('raw html)
- (display html port))
- (((? symbol? tag) ('@ attrs ...) body ...)
- (element->html tag attrs body port))
- (((? symbol? tag) body ...)
- (element->html tag '() body port))
- ((nodes ...)
- (for-each (cut sxml->html <> port) nodes))
- ((? string? text)
- (string->escaped-html text port))
- ;; Render arbitrary Scheme objects, too.
- (obj (object->escaped-html obj port))))

base-commit: 99416ed5c7d950eaf54d52023a2efd975bccac92
--
2.41.0
A
A
Arun Isaac wrote on 13 May 12:09 +0200
(name . David Thompson)(address . dthompson2@worcester.edu)
871q663twe.fsf@systemreboot.net
Hi Felix,

Toggle quote (3 lines)
> Per a conversation with David on IRC, it's better to serve UTF-8
> directly instead of transcoding to HTML entities.

I agree. But I don't want mumi to depend on haunt, a static site
generator. It feels like too large of a dependency. Could we achieve the
same effect using sxml->html from guile-lib? If not, could we patch
guile-lib to that effect?

Thanks,
Arun
T
T
Thompson, David wrote on 13 May 12:46 +0200
(name . Arun Isaac)(address . arunisaac@systemreboot.net)
CAJ=RwfZyAcSO+68AQ+PMgdsc9LjeKU3kHSObyOaNSmTWTYkNmw@mail.gmail.com
Hi,

On Mon, May 13, 2024 at 6:09?AM Arun Isaac <arunisaac@systemreboot.net> wrote:
Toggle quote (12 lines)
>
>
> Hi Felix,
>
> > Per a conversation with David on IRC, it's better to serve UTF-8
> > directly instead of transcoding to HTML entities.
>
> I agree. But I don't want mumi to depend on haunt, a static site
> generator. It feels like too large of a dependency. Could we achieve the
> same effect using sxml->html from guile-lib? If not, could we patch
> guile-lib to that effect?

Feel free to just snarf the relevant code from haunt if it's useful to
you. No need to add a hard dependency.

- Dave
F
F
Felix Lechner wrote on 14 May 15:29 +0200
(address . 70907@debbugs.gnu.org)
87frukwmhn.fsf@lease-up.com
Hi Arun,

On Mon, May 13 2024, Arun Isaac wrote:

Toggle quote (2 lines)
> I don't want mumi to depend on haunt, a static site generator.

Well, Mumi does, and has. Pulling the code from Haunt is the honest and
right thing to do. What does 'want' have to do with it?

Toggle quote (2 lines)
> It feels like too large of a dependency.

I don't think it has much bearing. Which other packages consume Mumi?
The effect in the dependency graphs is almost zero.

Toggle quote (3 lines)
> Could we achieve the same effect using sxml->html from guile-lib? If
> not, could we patch guile-lib to that effect?

That's an appealing idea---and maybe David could shed some light on the
need to reimplement sxml->html---but it should not stand in the way of
fixing things.

It could be something to consider for the future. If David were to
contribute the routine to guile-lib, it would disappear from Haunt.
That would cause us to inquire where it went and then switch to
guile-lib as a prerequisite instead.

On Mon, May 13 2024, David Thompson wrote:

Toggle quote (2 lines)
> Feel free to just snarf the relevant code from haunt

While your offer is generous, it would be an error. Let's learn from
the past: That decision was made at an earlier point in time. By
failing to keep up, it caused the need for this patch.

Kind regards
Felix
F
F
Felix Lechner wrote on 14 May 21:02 +0200
(name . David Thompson)(address . dthompson2@worcester.edu)
87cypow72o.fsf@lease-up.com
Hi Arun,

On Mon, May 13 2024, Arun Isaac wrote:

Toggle quote (2 lines)
> I don't want mumi to depend on haunt

On that note, does the recent addition of 'mumi www' in commit a98099be,
which now requires xdg-utils, pull in several X11 client libraries like
libx11, libxau and libxcb; as well as python (via libxslt), ncurses (via
gettext-minimal), and xz?

Is that more substantial than depending on haunt (and texinfo)?

Kind regards
Felix
F
F
Felix Lechner wrote on 15 May 01:15 +0200
(no subject)
(address . control@patchwise.org)
87a5ksvvcc.fsf@lease-up.com
block 69381 by 70906 70907
tags 69381 + patch
thanks
A
A
Arun Isaac wrote on 19 May 04:32 +0200
Re: bug#70907: [PATCH] Render using Haunt; per dthompson's recommendation.
(name . David Thompson)(address . dthompson2@worcester.edu)
87y186ilai.fsf@systemreboot.net
Hi Felix,

Haunt is an end-user application, not a library. It is not a good idea
to depend on end-user applications as though they were libraries. It is
not so much a question of how big those end-user applications are,
though sometimes that may be a consideration. Imagine getting mumi to
depend on inkscape or something! Depending on end-user applications is
the last resort when all other options have been exhausted.

To describe just one problem: end-user applications such as Haunt may
bring in other guile packages that we don't need. Since guile packages
need all of these to be propagated inputs, this can cause trouble with
package collisions in profiles, or maybe even circular
dependencies. Now, Haunt doesn't pull in that many dependencies, and
it's probably fine for now. But, depending on end-user applications is
simply not good practice.

Ultimately, mumi has no real need to depend on Haunt. It is so much
easier to simply copy the relevant html.scm file from Haunt into mumi
like David suggested. Or, better still, get it into the sxml->html of
guile-lib.

About xdg-utils: I see your point about xdg-utils being a large
dependency. I completely agree. However, xdg-open is well established as
the standard way to open the user's preferred web browser and email
client. I am not fond of it, but it is what it is. If there is a way to
do this without xdg-utils, I am all ears and happy to switch.

Regards,
Arun
?
Your comment

Commenting via the web interface is currently disabled.

To comment on this conversation send an email to 70907@debbugs.gnu.org

To respond to this issue using the mumi CLI, first switch to it
mumi current 70907
Then, you may apply the latest patchset in this issue (with sign off)
mumi am -- -s
Or, compose a reply to this issue
mumi compose
Or, send patches to this issue
mumi send-email *.patch