all messages for Guix-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
* bug#70907: [PATCH] Render using Haunt; per dthompson's recommendation.
@ 2024-05-13  4:40 Felix Lechner via Bug-mumi via Bug reports for GNU Guix Mumi.
  2024-05-13 10:09 ` Arun Isaac
  0 siblings, 1 reply; 6+ messages in thread
From: Felix Lechner via Bug-mumi via Bug reports for GNU Guix Mumi. @ 2024-05-13  4:40 UTC (permalink / raw)
  To: 70907; +Cc: David Thompson, Felix Lechner

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

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





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

* bug#70907: [PATCH] Render using Haunt; per dthompson's recommendation.
  2024-05-13  4:40 bug#70907: [PATCH] Render using Haunt; per dthompson's recommendation Felix Lechner via Bug-mumi via Bug reports for GNU Guix Mumi.
@ 2024-05-13 10:09 ` Arun Isaac
  2024-05-13 10:46   ` Thompson, David
  2024-05-14 19:02   ` Felix Lechner via Bug-mumi via Bug reports for GNU Guix Mumi.
  0 siblings, 2 replies; 6+ messages in thread
From: Arun Isaac @ 2024-05-13 10:09 UTC (permalink / raw)
  To: 70907, Felix Lechner; +Cc: David Thompson


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?

Thanks,
Arun




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

* bug#70907: [PATCH] Render using Haunt; per dthompson's recommendation.
  2024-05-13 10:09 ` Arun Isaac
@ 2024-05-13 10:46   ` Thompson, David
  2024-05-14 13:29     ` Felix Lechner via Bug-mumi via Bug reports for GNU Guix Mumi.
  2024-05-14 19:02   ` Felix Lechner via Bug-mumi via Bug reports for GNU Guix Mumi.
  1 sibling, 1 reply; 6+ messages in thread
From: Thompson, David @ 2024-05-13 10:46 UTC (permalink / raw)
  To: Arun Isaac; +Cc: Felix Lechner, 70907

Hi,

On Mon, May 13, 2024 at 6:09 AM Arun Isaac <arunisaac@systemreboot.net> wrote:
>
>
> 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




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

* bug#70907: [PATCH] Render using Haunt; per dthompson's recommendation.
  2024-05-13 10:46   ` Thompson, David
@ 2024-05-14 13:29     ` Felix Lechner via Bug-mumi via Bug reports for GNU Guix Mumi.
  0 siblings, 0 replies; 6+ messages in thread
From: Felix Lechner via Bug-mumi via Bug reports for GNU Guix Mumi. @ 2024-05-14 13:29 UTC (permalink / raw)
  To: Thompson, David, Arun Isaac; +Cc: 70907

Hi Arun,

On Mon, May 13 2024, Arun Isaac wrote:

> 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?

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

> 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:

> 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




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

* bug#70907: [PATCH] Render using Haunt; per dthompson's recommendation.
  2024-05-13 10:09 ` Arun Isaac
  2024-05-13 10:46   ` Thompson, David
@ 2024-05-14 19:02   ` Felix Lechner via Bug-mumi via Bug reports for GNU Guix Mumi.
  2024-05-19  2:32     ` Arun Isaac
  1 sibling, 1 reply; 6+ messages in thread
From: Felix Lechner via Bug-mumi via Bug reports for GNU Guix Mumi. @ 2024-05-14 19:02 UTC (permalink / raw)
  To: Arun Isaac, 70907; +Cc: David Thompson

Hi Arun,

On Mon, May 13 2024, Arun Isaac wrote:

> 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




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

* bug#70907: [PATCH] Render using Haunt; per dthompson's recommendation.
  2024-05-14 19:02   ` Felix Lechner via Bug-mumi via Bug reports for GNU Guix Mumi.
@ 2024-05-19  2:32     ` Arun Isaac
  0 siblings, 0 replies; 6+ messages in thread
From: Arun Isaac @ 2024-05-19  2:32 UTC (permalink / raw)
  To: Felix Lechner, 70907; +Cc: David Thompson


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




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

end of thread, other threads:[~2024-05-19  2:33 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-05-13  4:40 bug#70907: [PATCH] Render using Haunt; per dthompson's recommendation Felix Lechner via Bug-mumi via Bug reports for GNU Guix Mumi.
2024-05-13 10:09 ` Arun Isaac
2024-05-13 10:46   ` Thompson, David
2024-05-14 13:29     ` Felix Lechner via Bug-mumi via Bug reports for GNU Guix Mumi.
2024-05-14 19:02   ` Felix Lechner via Bug-mumi via Bug reports for GNU Guix Mumi.
2024-05-19  2:32     ` Arun Isaac

Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/guix.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.