Zettelstore Contrib

Check-in [6caac07ba3]
Login

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Overview
Comment:Social: add page to show HTTP header
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA3-256: 6caac07ba326295b29622a2dbc0f5869db26872971bc17d866aa8b66ec08f69a
User & Date: stern 2024-03-27 16:52:00
Context
2024-03-27
17:22
Social: rename PAGE-ROOT to DATA-ROOT ... (check-in: 04f55cea87 user: stern tags: trunk)
16:52
Social: add page to show HTTP header ... (check-in: 6caac07ba3 user: stern tags: trunk)
15:26
Social: refactor handler registration ... (check-in: f2d098304c user: stern tags: trunk)
Changes
Hide Diffs Unified Diffs Ignore Whitespace Patch

Changes to social/social.go.

83
84
85
86
87
88
89

90
91
92
93
94
95
96
	webui, err := wui.NewWebUI(cfg.MakeLogger("WebUI"), cfg.TemplateRoot, cfg.Site)
	if err != nil {
		return err
	}

	userAgentsHandler := webui.MakeGetAllUAHandler(usecase.NewGetAllUserAgents(uaColl))
	var handlerMap = map[string]http.HandlerFunc{

		"html":        webui.MakeGetPageHandler(cfg.PageRoot),
		"test":        webui.MakeTestHandler(),
		"user-agents": userAgentsHandler,
	}

	h.HandleFunc("GET /", webui.MakeDocumentHandler(cfg.DocumentRoot))
	if site := cfg.Site; site != nil {







>







83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
	webui, err := wui.NewWebUI(cfg.MakeLogger("WebUI"), cfg.TemplateRoot, cfg.Site)
	if err != nil {
		return err
	}

	userAgentsHandler := webui.MakeGetAllUAHandler(usecase.NewGetAllUserAgents(uaColl))
	var handlerMap = map[string]http.HandlerFunc{
		"header":      webui.MakeHeaderHandler(),
		"html":        webui.MakeGetPageHandler(cfg.PageRoot),
		"test":        webui.MakeTestHandler(),
		"user-agents": userAgentsHandler,
	}

	h.HandleFunc("GET /", webui.MakeDocumentHandler(cfg.DocumentRoot))
	if site := cfg.Site; site != nil {

Changes to social/web/wui/bindings.go.

52
53
54
55
56
57
58

59
60
61
62
63
64
65
		&sxbuiltins.BeginS,    // begin
	}
	builtins = []*sxeval.Builtin{
		&sxbuiltins.Equal,                // =
		&sxbuiltins.NullP,                // null?
		&sxbuiltins.Car, &sxbuiltins.Cdr, // car, cdr
		&sxbuiltins.Caar, &sxbuiltins.Cadr, // caar, cadr

		&sxbuiltins.Cadar,         // cadar
		&sxbuiltins.LengthGreater, // length>
		&sxbuiltins.List,          // list
		&sxbuiltins.Map,           // map
		&sxbuiltins.BoundP,        // bound?
	}
)







>







52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
		&sxbuiltins.BeginS,    // begin
	}
	builtins = []*sxeval.Builtin{
		&sxbuiltins.Equal,                // =
		&sxbuiltins.NullP,                // null?
		&sxbuiltins.Car, &sxbuiltins.Cdr, // car, cdr
		&sxbuiltins.Caar, &sxbuiltins.Cadr, // caar, cadr
		&sxbuiltins.Cdar,          // cdar
		&sxbuiltins.Cadar,         // cadar
		&sxbuiltins.LengthGreater, // length>
		&sxbuiltins.List,          // list
		&sxbuiltins.Map,           // map
		&sxbuiltins.BoundP,        // bound?
	}
)
206
207
208
209
210
211
212



213
214
215
216
217
218
219
220
221
222
223
224
	lb.Add(makeSimpleLink(sx.String(st.Path(node)), sx.String(node.Title())))
	return lb.List()
}

var (
	symA     = sx.MakeSymbol("a")
	symClass = sx.MakeSymbol("class")



	symHref  = sx.MakeSymbol("href")
	symLI    = sx.MakeSymbol("li")
	symP     = sx.MakeSymbol("p")
	symUL    = sx.MakeSymbol("ul")
)

func makeSimpleLink(href, text sx.String) *sx.Pair {
	return sx.MakeList(
		symA,
		sx.MakeList(sxhtml.SymAttr, sx.Cons(symHref, href)),
		text)
}







>
>
>












207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
	lb.Add(makeSimpleLink(sx.String(st.Path(node)), sx.String(node.Title())))
	return lb.List()
}

var (
	symA     = sx.MakeSymbol("a")
	symClass = sx.MakeSymbol("class")
	symDD    = sx.MakeSymbol("dd")
	symDL    = sx.MakeSymbol("dl")
	symDT    = sx.MakeSymbol("dt")
	symHref  = sx.MakeSymbol("href")
	symLI    = sx.MakeSymbol("li")
	symP     = sx.MakeSymbol("p")
	symUL    = sx.MakeSymbol("ul")
)

func makeSimpleLink(href, text sx.String) *sx.Pair {
	return sx.MakeList(
		symA,
		sx.MakeList(sxhtml.SymAttr, sx.Cons(symHref, href)),
		text)
}

Added social/web/wui/header.go.





























































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
//-----------------------------------------------------------------------------
// Copyright (c) 2024-present Detlef Stern
//
// This file is part of Zettel Social
//
// Zettel Social is licensed under the latest version of the EUPL (European
// Union Public License). Please see file LICENSE.txt for your rights and
// obligations under this license.
//
// SPDX-License-Identifier: EUPL-1.2
// SPDX-FileCopyrightText: 2024-present Detlef Stern
//-----------------------------------------------------------------------------

package wui

import (
	"net/http"
	"slices"

	"zettelstore.de/sx.fossil"
)

// MakeHeaderHandler returns a HTTP handler that shows all HTTP header.
func (wui *WebUI) MakeHeaderHandler() http.HandlerFunc {
	symHTTPHeader := sx.MakeSymbol("http-header")
	return func(w http.ResponseWriter, r *http.Request) {
		keys := make([]string, 0, len(r.Header))
		for key := range r.Header {
			keys = append(keys, key)
		}
		slices.Sort(keys)

		var headerList sx.ListBuilder
		headerList.Add(symDL)
		for _, key := range keys {
			headerList.Add(sx.MakeList(symDT, sx.String(key)))
			for _, val := range r.Header[key] {
				headerList.Add(sx.MakeList(symDD, sx.String(val)))
			}
		}

		rb := wui.makeRenderBinding("user-agent", r)
		rb.bindObject("HEADER-DL", headerList.List())
		wui.renderTemplate(w, symHTTPHeader, rb)
	}
}

Name change from social/web/wui/useragent.sxc to social/web/wui/social.sxc.

1
2
3
4
5
6
7
8
9
10
11
12
13


14
15
16
17
18
19
20
21
22
23
24
25
26
27






;;;----------------------------------------------------------------------------
;;; Copyright (c) 2024-present Detlef Stern
;;;
;;; This file is part of Zettel Social.
;;;
;;; Zettel Social is licensed under the latest version of the EUPL (European
;;; Union Public License). Please see file LICENSE.txt for your rights and
;;; obligations under this license.
;;;
;;; SPDX-License-Identifier: EUPL-1.2
;;; SPDX-FileCopyrightText: 2024-present Detlef Stern
;;;----------------------------------------------------------------------------



;;; Node "User Agents"

(defun string-item (s) `(li ,s))

(define-template user-agents
`(
  (h1 "User Agents")
  (ul ,@(map string-item ALLOWED-AGENTS))
  ,@(if (length> BLOCKED-AGENTS 0)
        `((h2 "Blockiert")
          (ul ,@(map string-item BLOCKED-AGENTS))))
  (a (@ (href "?plain")) "plain")
 )
)



















>
>


|



|
|


|



>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
;;;----------------------------------------------------------------------------
;;; Copyright (c) 2024-present Detlef Stern
;;;
;;; This file is part of Zettel Social.
;;;
;;; Zettel Social is licensed under the latest version of the EUPL (European
;;; Union Public License). Please see file LICENSE.txt for your rights and
;;; obligations under this license.
;;;
;;; SPDX-License-Identifier: EUPL-1.2
;;; SPDX-FileCopyrightText: 2024-present Detlef Stern
;;;----------------------------------------------------------------------------

;;; SXC code for social nodes.

;;; Node "User Agents"

(defun string->item (s) `(li ,s))

(define-template user-agents
`(
  (h1 ,TITLE)
  (ul ,@(map string->item ALLOWED-AGENTS))
  ,@(if (length> BLOCKED-AGENTS 0)
        `((h2 "Blockiert")
          (ul ,@(map string->item BLOCKED-AGENTS))))
  (a (@ (href "?plain")) "plain")
 )
)

;;; Node "HTTP Header"

(define-template http-header
    `((h1 ,TITLE) ,HEADER-DL)
)

Changes to social/web/wui/wui.go.

126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148

//go:embed layout.sxc
var contentLayoutSxc []byte

//go:embed page.sxc
var contentPageSec []byte

//go:embed useragent.sxc
var contentUseragentSxc []byte

var staticSxc = [][]byte{
	contentPreludeSxc,
	contentTemplateSxc,
	contentLayoutSxc,
	contentPageSec,
	contentUseragentSxc,
}

func (wui *WebUI) evalReader(env *sxeval.Environment, rdr *sxreader.Reader) error {
	for {
		obj, err := rdr.Read()
		if err != nil {
			if err == io.EOF {







|
|






|







126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148

//go:embed layout.sxc
var contentLayoutSxc []byte

//go:embed page.sxc
var contentPageSec []byte

//go:embed social.sxc
var contentSocialSxc []byte

var staticSxc = [][]byte{
	contentPreludeSxc,
	contentTemplateSxc,
	contentLayoutSxc,
	contentPageSec,
	contentSocialSxc,
}

func (wui *WebUI) evalReader(env *sxeval.Environment, rdr *sxreader.Reader) error {
	for {
		obj, err := rdr.Read()
		if err != nil {
			if err == io.EOF {