From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mp0.migadu.com ([2001:41d0:303:e224::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by ms1.migadu.com with LMTPS id kBWhGG6aQWaElgAAqHPOHw:P1 (envelope-from ) for ; Mon, 13 May 2024 06:43:26 +0200 Received: from aspmx1.migadu.com ([2001:41d0:303:e224::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by mp0.migadu.com with LMTPS id kBWhGG6aQWaElgAAqHPOHw (envelope-from ) for ; Mon, 13 May 2024 06:43:26 +0200 X-Envelope-To: larch@yhetil.org Authentication-Results: aspmx1.migadu.com; dkim=fail ("headers rsa verify failed") header.d=lease-up.com header.s=2017 header.b=TtpKnQLH; dmarc=pass (policy=none) header.from=gnu.org; spf=pass (aspmx1.migadu.com: domain of "bug-mumi-bounces+larch=yhetil.org@gnu.org" designates 209.51.188.17 as permitted sender) smtp.mailfrom="bug-mumi-bounces+larch=yhetil.org@gnu.org" ARC-Seal: i=1; s=key1; d=yhetil.org; t=1715575406; a=rsa-sha256; cv=none; b=RdVlhHnDex9TyI834oaZlMh8azYWoJRaxu2VDnxzrFMhSW8SCBEyGqg9I4Idl69eAdTDWu 6Bl2kyZ7QvKiUZZkNpmZUM25+r5wdgznJr/obOcvc+CRPOWO5kG9uzaJXh5eJx21cbOgMM Cir1p/jDjWei+qfDoR/Xs2oIhD3v1r9qksPF063iYa9cHudfx7qV8qMrndkOQoNzzSruRj rtsU9UMsVl76JPn3MDTWpmmzf5HINi5hVctMZKBRbEvvFyuJ/bSfi6K6k5bjVVLoYRo5tr 2SLMaiHRpKMwvchuUL/u8uzxy28ttU0QjNNUpgUiXH5aeTkPt6F2ndVTIkLUQQ== ARC-Authentication-Results: i=1; aspmx1.migadu.com; dkim=fail ("headers rsa verify failed") header.d=lease-up.com header.s=2017 header.b=TtpKnQLH; dmarc=pass (policy=none) header.from=gnu.org; spf=pass (aspmx1.migadu.com: domain of "bug-mumi-bounces+larch=yhetil.org@gnu.org" designates 209.51.188.17 as permitted sender) smtp.mailfrom="bug-mumi-bounces+larch=yhetil.org@gnu.org" ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=yhetil.org; s=key1; t=1715575406; h=from:from:sender:sender:reply-to:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding:resent-cc: resent-from:resent-sender:resent-message-id:list-id:list-help: list-unsubscribe:list-subscribe:list-post:dkim-signature; bh=DnpGv1y+Phc6uikOp50FHY1IiS6wgUpqIjVZuIEQwy0=; b=pOXx3FnSfSq5PgHlxV/ftdDe9wslBz3ILBI+lUJkWsq0Ifx+qDUAfvjw/FNp8nK/H0JPJK 7GVufRy1oiawxFpa3vb+pdxNA8XmCNTEUnqq6wN23h4Gqjimxx7wRWphAbXIlfGPho1ogc S1aNuWu9szkqdhGXTLJaVz3vIJiUdAyFlAdjdQqWckKAsNJpAw0qSwmUK5CYdI+k8uQNG3 +dSrEbjZRfYYVaZvsbBkm+NHmlNPscEPCUF8jNKxLaIcPk+ZJVqqVFoep2VtKx4d7a9WLl vOw9cP9Ho0E0bxPqYGhWdDu8iogVBFLAUlnoIg3/z/UVrkitmQdXBaxRTUk5LQ== Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by aspmx1.migadu.com (Postfix) with ESMTPS id 14E8C10F15 for ; Mon, 13 May 2024 06:43:26 +0200 (CEST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1s6NWz-00071i-Q9; Mon, 13 May 2024 00:43:23 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1s6NVh-0006sO-Vd for bug-mumi@gnu.org; Mon, 13 May 2024 00:42:03 -0400 Received: from debbugs.gnu.org ([2001:470:142:5::43]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1s6NVh-0008QE-NQ for bug-mumi@gnu.org; Mon, 13 May 2024 00:42:01 -0400 Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1s6NVh-00076p-Tx for bug-mumi@gnu.org; Mon, 13 May 2024 00:42:01 -0400 X-Loop: help-debbugs@gnu.org Subject: bug#70907: [PATCH] Render using Haunt; per dthompson's recommendation. Resent-From: Felix Lechner Original-Sender: "Debbugs-submit" Resent-CC: bug-mumi@gnu.org Resent-Date: Mon, 13 May 2024 04:42:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: report 70907 X-GNU-PR-Package: mumi X-GNU-PR-Keywords: patch To: 70907@debbugs.gnu.org Cc: David Thompson , Felix Lechner X-Debbugs-Original-To: bug-mumi@gnu.org Received: via spool by submit@debbugs.gnu.org id=B.171557527527284 (code B ref -1); Mon, 13 May 2024 04:42:01 +0000 Received: (at submit) by debbugs.gnu.org; 13 May 2024 04:41:15 +0000 Received: from localhost ([127.0.0.1]:58302 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1s6NUw-000760-Jf for submit@debbugs.gnu.org; Mon, 13 May 2024 00:41:15 -0400 Received: from lists.gnu.org ([209.51.188.17]:34090) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1s6NUt-00075u-7C for submit@debbugs.gnu.org; Mon, 13 May 2024 00:41:12 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1s6NUs-0006ja-Fw for bug-mumi@gnu.org; Mon, 13 May 2024 00:41:10 -0400 Received: from sail-ipv4.us-core.com ([208.82.101.137]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_CHACHA20_POLY1305:256) (Exim 4.90_1) (envelope-from ) id 1s6NUq-0008K3-43 for bug-mumi@gnu.org; Mon, 13 May 2024 00:41:10 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; s=2017; bh=V1AN9TJIzaWeb/k f2oynU16pGo5ekoiFYIfJLZxheCI=; h=date:subject:cc:to:from; d=lease-up.com; b=TtpKnQLHqKPQlS+4ZVZY1EuNr0EAsLdJNfL0htuTgjoaOce2pPQg PWa1NnYfQaFQVfql88wzWWxn0hlIcTvjZttPHXfdCzvys0uQW2eJEJ1PC9G1bhquqTi2ac E7/a8YqAaRF4zDkK54P2IZwHncwlloii4LZ7EC9PuZG1eWEOY= Received: by sail-ipv4.us-core.com (OpenSMTPD) with ESMTPSA id a452e583 (TLSv1.3:TLS_CHACHA20_POLY1305_SHA256:256:NO); Mon, 13 May 2024 04:41:06 +0000 (UTC) Received: from localhost (localhost [local]) by localhost (OpenSMTPD) with ESMTPA id 07791ad9; Mon, 13 May 2024 04:41:06 +0000 (UTC) Date: Sun, 12 May 2024 21:40:53 -0700 Message-ID: <20240513044056.7243-1-felix.lechner@lease-up.com> X-Mailer: git-send-email 2.41.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Received-SPF: pass client-ip=208.82.101.137; envelope-from=felix.lechner@us-core.com; helo=sail-ipv4.us-core.com X-Spam_score_int: -19 X-Spam_score: -2.0 X-Spam_bar: -- X-Spam_report: (-2.0 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, HEADER_FROM_DIFFERENT_DOMAINS=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, UNPARSEABLE_RELAY=0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-BeenThere: bug-mumi@gnu.org List-Id: "Bug reports for GNU Guix Mumi." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-to: Felix Lechner X-ACL-Warn: , Felix Lechner via Bug-mumi From: Felix Lechner via Bug-mumi via "Bug reports for GNU Guix Mumi." Errors-To: bug-mumi-bounces+larch=yhetil.org@gnu.org Sender: bug-mumi-bounces+larch=yhetil.org@gnu.org X-Migadu-Country: US X-Migadu-Flow: FLOW_IN X-Migadu-Queue-Id: 14E8C10F15 X-Migadu-Scanner: mx12.migadu.com X-Migadu-Spam-Score: -5.57 X-Spam-Score: -5.57 X-TUID: Yq5OgJCO3iA5 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 -;;; Copyright © 2015 David Thompson -;;; -;;; 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 -;;; . - -;;; 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 "" tag)))) - -(define (doctype->html doctype port) - (format port "" 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