add html parsing - for testing and dom manipulations

This commit is contained in:
Helmut Merz 2025-03-23 11:40:18 +01:00
parent 05cb9908dd
commit 104fceba8b
3 changed files with 37 additions and 2 deletions

View file

@ -6,7 +6,7 @@
:version "0.0.1" :version "0.0.1"
:homepage "https://www.cyberconcepts.org" :homepage "https://www.cyberconcepts.org"
:description "Web client and server functionality." :description "Web client and server functionality."
:depends-on (:cl-cookie :clack :dexador :flexi-streams :depends-on (:cl-cookie :cl-html-parse :clack :dexador :flexi-streams
:lack :lack-component :lack-app-file :quri :lack :lack-component :lack-app-file :quri
:scopes-core) :scopes-core)
:components ((:file "frontend/cs-hx" :depends-on ("web/dom" "web/response")) :components ((:file "frontend/cs-hx" :depends-on ("web/dom" "web/response"))

View file

@ -29,6 +29,7 @@
(core:setup-services) (core:setup-services)
(let ((server (core:find-service :server)) (let ((server (core:find-service :server))
(client (core:find-service :client))) (client (core:find-service :client)))
(test-dom-parse)
(test-dom) (test-dom)
(test-jwt) (test-jwt)
(test-server-config server) (test-server-config server)
@ -39,6 +40,18 @@
(core:shutdown) (core:shutdown)
(t:show-result)))) (t:show-result))))
;;;; the tests
(deftest test-dom-parse ()
(let (inp parsed rendered)
(setf inp "<a href=\"https://example.com\">Link</a>")
(setf parsed '(((:a :href "https://example.com") "Link")))
(== (dom:parse inp) parsed)
;(setf wanted (dom:a '(:href "https://example.com") "Link"))
(== (dom:render (dom:from-list parsed)) inp)
)
)
(deftest test-dom () (deftest test-dom ()
(== (dom:render (== (dom:render
(dom:a '(:href "https://example.com" (dom:a '(:href "https://example.com"

View file

@ -3,14 +3,17 @@
(defpackage :scopes/web/dom (defpackage :scopes/web/dom
(:use :common-lisp) (:use :common-lisp)
(:local-nicknames (:util :scopes/util) (:local-nicknames (:util :scopes/util)
(:hp :html-parse)
(:alx :alexandria)) (:alx :alexandria))
(:export #:xml-element (:export #:xml-element
#:elem #:element #:void-element #:render #:elem #:element #:void-element #:render
#:dlist #:dlist
#:a #:dd #:div #:dl #:dt #:label #:a #:dd #:div #:dl #:dt #:label
#:br #:input)) #:br #:input
#:parse #:from-list))
(in-package :scopes/web/dom) (in-package :scopes/web/dom)
(defvar *this* *package*)
;;;; basic definitions ;;;; basic definitions
@ -142,3 +145,22 @@
(defun newline () (defun newline ()
(put-char #\Newline)) (put-char #\Newline))
;;;; create elements from list of symbols
(defun from-list (lst)
(mapcar #'(lambda (part)
(etypecase part
(string part)
(symbol (funcall (find-symbol (string part) *this*)))
(list
(etypecase (car part)
(symbol (apply (find-symbol (string (car part)) *this*)
nil (from-list (cdr part))))
(list (apply (find-symbol (string (caar part)) *this*)
(cdar part) (from-list (cdr part))))
)))) lst))
;;;; parsing (for testing or manipulation of HTML using dom)
(defun parse (html)
(hp:parse-html html))