Index: README.md ================================================================== --- README.md +++ README.md @@ -11,12 +11,12 @@ To get an initial impression, take a look at the [manual](https://zettelstore.de/manual/). It is a live example of the zettelstore software, running in read-only mode. -[Zettelstore Client](https://zettelstore.de/client) provides client -software to access Zettelstore via its API more easily, [Zettelstore +[Zettelstore Client](https://t73f.de/r/zsc) provides client software to access +Zettelstore via its API more easily, [Zettelstore Contrib](https://zettelstore.de/contrib) contains contributed software, which often connects to Zettelstore via its API. Some of the software packages may be experimental. The software, including the manual, is licensed Index: VERSION ================================================================== --- VERSION +++ VERSION @@ -1,1 +1,1 @@ -0.17.0 +0.18.0-dev Index: ast/block.go ================================================================== --- ast/block.go +++ ast/block.go @@ -11,11 +11,11 @@ // SPDX-FileCopyrightText: 2020-present Detlef Stern //----------------------------------------------------------------------------- package ast -import "zettelstore.de/client.fossil/attrs" +import "t73f.de/r/zsc/attrs" // Definition of Block nodes. // BlockSlice is a slice of BlockNodes. type BlockSlice []BlockNode Index: ast/inline.go ================================================================== --- ast/inline.go +++ ast/inline.go @@ -14,11 +14,11 @@ package ast import ( "unicode/utf8" - "zettelstore.de/client.fossil/attrs" + "t73f.de/r/zsc/attrs" ) // Definitions of inline nodes. // InlineSlice is a list of BlockNodes. Index: ast/ref.go ================================================================== --- ast/ref.go +++ ast/ref.go @@ -15,11 +15,11 @@ import ( "net/url" "strings" - "zettelstore.de/client.fossil/api" + "t73f.de/r/zsc/api" "zettelstore.de/z/zettel/id" ) // QueryPrefix is the prefix that denotes a query expression. const QueryPrefix = api.QueryPrefix Index: ast/walk_test.go ================================================================== --- ast/walk_test.go +++ ast/walk_test.go @@ -14,11 +14,11 @@ package ast_test import ( "testing" - "zettelstore.de/client.fossil/attrs" + "t73f.de/r/zsc/attrs" "zettelstore.de/z/ast" ) func BenchmarkWalk(b *testing.B) { root := ast.BlockSlice{ Index: auth/impl/digest.go ================================================================== --- auth/impl/digest.go +++ auth/impl/digest.go @@ -17,12 +17,12 @@ "bytes" "crypto" "crypto/hmac" "encoding/base64" - "zettelstore.de/sx.fossil" - "zettelstore.de/sx.fossil/sxreader" + "t73f.de/r/sx" + "t73f.de/r/sx/sxreader" ) var encoding = base64.RawURLEncoding const digestAlg = crypto.SHA384 Index: auth/impl/impl.go ================================================================== --- auth/impl/impl.go +++ auth/impl/impl.go @@ -18,13 +18,13 @@ "errors" "hash/fnv" "io" "time" - "zettelstore.de/client.fossil/api" - "zettelstore.de/client.fossil/sexp" - "zettelstore.de/sx.fossil" + "t73f.de/r/sx" + "t73f.de/r/zsc/api" + "t73f.de/r/zsc/sexp" "zettelstore.de/z/auth" "zettelstore.de/z/auth/policy" "zettelstore.de/z/box" "zettelstore.de/z/config" "zettelstore.de/z/kernel" @@ -90,11 +90,11 @@ } now := time.Now().Round(time.Second) sClaim := sx.MakeList( sx.Int64(kind), - sx.String(subject), + sx.MakeString(subject), sx.Int64(now.Unix()), sx.Int64(now.Add(d).Unix()), sx.Int64(ident.Zid), ) return sign(sClaim, a.secret) @@ -123,11 +123,11 @@ return ErrMalformedToken } if auth.TokenKind(vals[0].(sx.Int64)) != k { return ErrOtherKind } - ident := vals[1].(sx.String) + ident := vals[1].(sx.String).GetValue() if ident == "" { return ErrNoIdent } issued := time.Unix(int64(vals[2].(sx.Int64)), 0) expires := time.Unix(int64(vals[3].(sx.Int64)), 0) Index: auth/policy/default.go ================================================================== --- auth/policy/default.go +++ auth/policy/default.go @@ -12,11 +12,11 @@ //----------------------------------------------------------------------------- package policy import ( - "zettelstore.de/client.fossil/api" + "t73f.de/r/zsc/api" "zettelstore.de/z/auth" "zettelstore.de/z/zettel/meta" ) type defaultPolicy struct { Index: auth/policy/owner.go ================================================================== --- auth/policy/owner.go +++ auth/policy/owner.go @@ -12,11 +12,11 @@ //----------------------------------------------------------------------------- package policy import ( - "zettelstore.de/client.fossil/api" + "t73f.de/r/zsc/api" "zettelstore.de/z/auth" "zettelstore.de/z/config" "zettelstore.de/z/zettel/meta" ) Index: auth/policy/policy_test.go ================================================================== --- auth/policy/policy_test.go +++ auth/policy/policy_test.go @@ -15,11 +15,11 @@ import ( "fmt" "testing" - "zettelstore.de/client.fossil/api" + "t73f.de/r/zsc/api" "zettelstore.de/z/auth" "zettelstore.de/z/zettel/id" "zettelstore.de/z/zettel/meta" ) Index: box/box.go ================================================================== --- box/box.go +++ box/box.go @@ -19,11 +19,11 @@ "errors" "fmt" "io" "time" - "zettelstore.de/client.fossil/api" + "t73f.de/r/zsc/api" "zettelstore.de/z/query" "zettelstore.de/z/zettel" "zettelstore.de/z/zettel/id" "zettelstore.de/z/zettel/meta" ) Index: box/compbox/compbox.go ================================================================== --- box/compbox/compbox.go +++ box/compbox/compbox.go @@ -16,11 +16,11 @@ import ( "context" "net/url" - "zettelstore.de/client.fossil/api" + "t73f.de/r/zsc/api" "zettelstore.de/z/box" "zettelstore.de/z/box/manager" "zettelstore.de/z/kernel" "zettelstore.de/z/logger" "zettelstore.de/z/query" @@ -50,10 +50,11 @@ }{ id.MustParse(api.ZidVersion): {genVersionBuildM, genVersionBuildC}, id.MustParse(api.ZidHost): {genVersionHostM, genVersionHostC}, id.MustParse(api.ZidOperatingSystem): {genVersionOSM, genVersionOSC}, id.MustParse(api.ZidLog): {genLogM, genLogC}, + id.MustParse(api.ZidMemory): {genMemoryM, genMemoryC}, id.MustParse(api.ZidBoxManager): {genManagerM, genManagerC}, id.MustParse(api.ZidMetadataKey): {genKeysM, genKeysC}, id.MustParse(api.ZidParser): {genParserM, genParserC}, id.MustParse(api.ZidStartupConfiguration): {genConfigZettelM, genConfigZettelC}, } Index: box/compbox/config.go ================================================================== --- box/compbox/config.go +++ box/compbox/config.go @@ -14,11 +14,11 @@ package compbox import ( "bytes" - "zettelstore.de/client.fossil/api" + "t73f.de/r/zsc/api" "zettelstore.de/z/kernel" "zettelstore.de/z/zettel/id" "zettelstore.de/z/zettel/meta" ) Index: box/compbox/keys.go ================================================================== --- box/compbox/keys.go +++ box/compbox/keys.go @@ -15,11 +15,11 @@ import ( "bytes" "fmt" - "zettelstore.de/client.fossil/api" + "t73f.de/r/zsc/api" "zettelstore.de/z/kernel" "zettelstore.de/z/zettel/id" "zettelstore.de/z/zettel/meta" ) Index: box/compbox/log.go ================================================================== --- box/compbox/log.go +++ box/compbox/log.go @@ -14,11 +14,11 @@ package compbox import ( "bytes" - "zettelstore.de/client.fossil/api" + "t73f.de/r/zsc/api" "zettelstore.de/z/kernel" "zettelstore.de/z/zettel/id" "zettelstore.de/z/zettel/meta" ) Index: box/compbox/manager.go ================================================================== --- box/compbox/manager.go +++ box/compbox/manager.go @@ -15,11 +15,11 @@ import ( "bytes" "fmt" - "zettelstore.de/client.fossil/api" + "t73f.de/r/zsc/api" "zettelstore.de/z/kernel" "zettelstore.de/z/zettel/id" "zettelstore.de/z/zettel/meta" ) ADDED box/compbox/memory.go Index: box/compbox/memory.go ================================================================== --- /dev/null +++ box/compbox/memory.go @@ -0,0 +1,60 @@ +//----------------------------------------------------------------------------- +// Copyright (c) 2024-present Detlef Stern +// +// This file is part of Zettelstore. +// +// Zettelstore 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 compbox + +import ( + "bytes" + "fmt" + "os" + "runtime" + + "t73f.de/r/zsc/api" + "zettelstore.de/z/kernel" + "zettelstore.de/z/zettel/id" + "zettelstore.de/z/zettel/meta" +) + +func genMemoryM(zid id.Zid) *meta.Meta { + if myConfig == nil { + return nil + } + m := meta.New(zid) + m.Set(api.KeyTitle, "Zettelstore Memory") + m.Set(api.KeyCreated, kernel.Main.GetConfig(kernel.CoreService, kernel.CoreStarted).(string)) + m.Set(api.KeyVisibility, api.ValueVisibilityExpert) + return m +} + +func genMemoryC(*meta.Meta) []byte { + pageSize := os.Getpagesize() + var m runtime.MemStats + runtime.GC() + runtime.ReadMemStats(&m) + + var buf bytes.Buffer + buf.WriteString("|=Name|=Value>\n") + fmt.Fprintf(&buf, "|Page Size|%d\n", pageSize) + fmt.Fprintf(&buf, "|Pages|%d\n", m.HeapSys/uint64(pageSize)) + fmt.Fprintf(&buf, "|Heap Objects|%d\n", m.HeapObjects) + fmt.Fprintf(&buf, "|Heap Sys (KiB)|%d\n", m.HeapSys/1024) + fmt.Fprintf(&buf, "|Heap Inuse (KiB)|%d\n", m.HeapInuse/1024) + debug := kernel.Main.GetConfig(kernel.CoreService, kernel.CoreDebug).(bool) + if debug { + for i, bysize := range m.BySize { + fmt.Fprintf(&buf, "|Size %2d: %d|%d - %d → %d\n", + i, bysize.Size, bysize.Mallocs, bysize.Frees, bysize.Mallocs-bysize.Frees) + } + } + return buf.Bytes() +} Index: box/compbox/parser.go ================================================================== --- box/compbox/parser.go +++ box/compbox/parser.go @@ -17,11 +17,11 @@ "bytes" "fmt" "sort" "strings" - "zettelstore.de/client.fossil/api" + "t73f.de/r/zsc/api" "zettelstore.de/z/kernel" "zettelstore.de/z/parser" "zettelstore.de/z/zettel/id" "zettelstore.de/z/zettel/meta" ) Index: box/compbox/version.go ================================================================== --- box/compbox/version.go +++ box/compbox/version.go @@ -12,11 +12,11 @@ //----------------------------------------------------------------------------- package compbox import ( - "zettelstore.de/client.fossil/api" + "t73f.de/r/zsc/api" "zettelstore.de/z/kernel" "zettelstore.de/z/zettel/id" "zettelstore.de/z/zettel/meta" ) Index: box/constbox/constbox.go ================================================================== --- box/constbox/constbox.go +++ box/constbox/constbox.go @@ -17,11 +17,11 @@ import ( "context" _ "embed" // Allow to embed file content "net/url" - "zettelstore.de/client.fossil/api" + "t73f.de/r/zsc/api" "zettelstore.de/z/box" "zettelstore.de/z/box/manager" "zettelstore.de/z/kernel" "zettelstore.de/z/logger" "zettelstore.de/z/query" @@ -170,11 +170,11 @@ api.KeySyntax: meta.SyntaxZmk, api.KeyLang: api.ValueLangEN, api.KeyReadOnly: api.ValueTrue, api.KeyVisibility: api.ValueVisibilityPublic, api.KeyCreated: "20210504135842", - api.KeyModified: "20230601163100", + api.KeyModified: "20240418095500", }, zettel.NewContent(contentDependencies)}, id.BaseTemplateZid: { constHeader{ api.KeyTitle: "Zettelstore Base HTML Template", Index: box/constbox/dependencies.zettel ================================================================== --- box/constbox/dependencies.zettel +++ box/constbox/dependencies.zettel @@ -128,15 +128,19 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` -=== sx, zettelstore-client -These are companion projects, written by the current main developer of Zettelstore. +=== Sx, SxWebs, Webs, Zettelstore-Client +These are companion projects, written by the main developer of Zettelstore. They are published under the same license, [[EUPL v1.2, or later|00000000000004]]. -; URL & Source sx -: [[https://zettelstore.de/sx]] -; URL & Source zettelstore-client -: [[https://zettelstore.de/client/]] +; URL & Source Sx +: [[https://t73f.de/r/sx]] +; URL & Source SxWebs +: [[https://t73f.de/r/sxwebs]] +; URL & Source Webs +: [[https://t73f.de/r/webs]] +; URL & Source Zettelstore-Client +: [[https://t73f.de/r/zsc]] ; License: : European Union Public License, version 1.2 (EUPL v1.2), or later. Index: box/constbox/prelude.sxn ================================================================== --- box/constbox/prelude.sxn +++ box/constbox/prelude.sxn @@ -11,44 +11,26 @@ ;;; SPDX-FileCopyrightText: 2023-present Detlef Stern ;;;---------------------------------------------------------------------------- ;;; This zettel contains sxn definitions that are independent of specific ;;; subsystems, such as WebUI, API, or other. It just contains generic code to -;;; be used in all places. - -;; Constants NIL and T -(defconst NIL ()) -(defconst T 'T) - -;; defunconst macro to define functions that are bound as a constant. -;; -;; (defunconst NAME ARGS EXPR ...) -(defmacro defunconst (name args . body) - `(begin (defun ,name ,args ,@body) (defconst ,name ,name))) +;;; be used in all places. It asumes that the symbols NIL and T are defined. ;; not macro (defmacro not (x) `(if ,x NIL T)) ;; not= macro, to negate an equivalence (defmacro not= args `(not (= ,@args))) -;; let macro -;; -;; (let (BINDING ...) EXPR ...), where BINDING is a list of two elements -;; (SYMBOL EXPR) -(defmacro let (bindings . body) - `((lambda ,(map car bindings) ,@body) ,@(map cadr bindings))) - ;; let* macro ;; ;; (let* (BINDING ...) EXPR ...), where SYMBOL may occur in later bindings. (defmacro let* (bindings . body) (if (null? bindings) - `((lambda () ,@body)) - `((lambda (,(caar bindings)) - (let* ,(cdr bindings) ,@body)) - ,(cadar bindings)))) + `(begin ,@body) + `(let ((,(caar bindings) ,(cadar bindings))) + (let* ,(cdr bindings) ,@body)))) ;; cond macro ;; ;; (cond ((COND EXPR) ...)) (defmacro cond clauses @@ -55,13 +37,13 @@ (if (null? clauses) () (let* ((clause (car clauses)) (the-cond (car clause))) (if (= the-cond T) - (cadr clause) + `(begin ,@(cdr clause)) `(if ,the-cond - ,(cadr clause) + (begin ,@(cdr clause)) (cond ,@(cdr clauses))))))) ;; and macro ;; ;; (and EXPR ...) Index: box/constbox/wuicode.sxn ================================================================== --- box/constbox/wuicode.sxn +++ box/constbox/wuicode.sxn @@ -12,61 +12,61 @@ ;;;---------------------------------------------------------------------------- ;; Contains WebUI specific code, but not related to a specific template. ;; wui-list-item returns the argument as a HTML list item. -(defunconst wui-item (s) `(li ,s)) +(defun wui-item (s) `(li ,s)) ;; wui-info-meta-table-row takes a pair and translates it into a HTML table row ;; with two columns. -(defunconst wui-info-meta-table-row (p) +(defun wui-info-meta-table-row (p) `(tr (td (@ (class zs-info-meta-key)) ,(car p)) (td (@ (class zs-info-meta-value)) ,(cdr p)))) ;; wui-valid-link translates a local link into a HTML link. A link is a pair ;; (valid . url). If valid is not truish, only the invalid url is returned. -(defunconst wui-valid-link (l) +(defun wui-valid-link (l) (if (car l) `(li (a (@ (href ,(cdr l))) ,(cdr l))) `(li ,(cdr l)))) ;; wui-link takes a link (title . url) and returns a HTML reference. -(defunconst wui-link (q) +(defun wui-link (q) `(a (@ (href ,(cdr q))) ,(car q))) ;; wui-item-link taks a pair (text . url) and returns a HTML link inside ;; a list item. -(defunconst wui-item-link (q) `(li ,(wui-link q))) +(defun wui-item-link (q) `(li ,(wui-link q))) ;; wui-tdata-link taks a pair (text . url) and returns a HTML link inside ;; a table data item. -(defunconst wui-tdata-link (q) `(td ,(wui-link q))) +(defun wui-tdata-link (q) `(td ,(wui-link q))) ;; wui-item-popup-link is like 'wui-item-link, but the HTML link will open ;; a new tab / window. -(defunconst wui-item-popup-link (e) +(defun wui-item-popup-link (e) `(li (a (@ (href ,e) (target "_blank") (rel "noopener noreferrer")) ,e))) ;; wui-option-value returns a value for an HTML option element. -(defunconst wui-option-value (v) `(option (@ (value ,v)))) +(defun wui-option-value (v) `(option (@ (value ,v)))) ;; wui-datalist returns a HTML datalist with the given HTML identifier and a ;; list of values. -(defunconst wui-datalist (id lst) +(defun wui-datalist (id lst) (if lst `((datalist (@ (id ,id)) ,@(map wui-option-value lst))))) ;; wui-pair-desc-item takes a pair '(term . text) and returns a list with ;; a HTML description term and a HTML description data. -(defunconst wui-pair-desc-item (p) `((dt ,(car p)) (dd ,(cdr p)))) +(defun wui-pair-desc-item (p) `((dt ,(car p)) (dd ,(cdr p)))) ;; wui-meta-desc returns a HTML description list made from the list of pairs ;; given. -(defunconst wui-meta-desc (l) +(defun wui-meta-desc (l) `(dl ,@(apply append (map wui-pair-desc-item l)))) ;; wui-enc-matrix returns the HTML table of all encodings and parts. -(defunconst wui-enc-matrix (matrix) +(defun wui-enc-matrix (matrix) `(table ,@(map (lambda (row) `(tr (th ,(car row)) ,@(map wui-tdata-link (cdr row)))) matrix))) Index: box/dirbox/service.go ================================================================== --- box/dirbox/service.go +++ box/dirbox/service.go @@ -19,11 +19,11 @@ "io" "os" "path/filepath" "time" - "zettelstore.de/client.fossil/input" + "t73f.de/r/zsc/input" "zettelstore.de/z/box/filebox" "zettelstore.de/z/box/notify" "zettelstore.de/z/kernel" "zettelstore.de/z/logger" "zettelstore.de/z/zettel" @@ -360,13 +360,19 @@ entry.ContentExt, entry.MetaName != "", entry.UselessFiles, ) } + +// fileMode to create a new file: user, group, and all are allowed to read and write. +// +// If you want to forbid others or the group to read or to write, you must set +// umask(1) accordingly. +const fileMode os.FileMode = 0666 // func openFileWrite(path string) (*os.File, error) { - return os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0600) + return os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, fileMode) } func writeFileZid(w io.Writer, zid id.Zid) error { _, err := io.WriteString(w, "id: ") if err == nil { Index: box/filebox/filebox.go ================================================================== --- box/filebox/filebox.go +++ box/filebox/filebox.go @@ -18,11 +18,11 @@ "errors" "net/url" "path/filepath" "strings" - "zettelstore.de/client.fossil/api" + "t73f.de/r/zsc/api" "zettelstore.de/z/box" "zettelstore.de/z/box/manager" "zettelstore.de/z/kernel" "zettelstore.de/z/zettel/id" "zettelstore.de/z/zettel/meta" Index: box/filebox/zipbox.go ================================================================== --- box/filebox/zipbox.go +++ box/filebox/zipbox.go @@ -18,11 +18,11 @@ "context" "fmt" "io" "strings" - "zettelstore.de/client.fossil/input" + "t73f.de/r/zsc/input" "zettelstore.de/z/box" "zettelstore.de/z/box/notify" "zettelstore.de/z/logger" "zettelstore.de/z/query" "zettelstore.de/z/zettel" Index: box/manager/enrich.go ================================================================== --- box/manager/enrich.go +++ box/manager/enrich.go @@ -15,11 +15,11 @@ import ( "context" "strconv" - "zettelstore.de/client.fossil/api" + "t73f.de/r/zsc/api" "zettelstore.de/z/box" "zettelstore.de/z/zettel/id" "zettelstore.de/z/zettel/meta" ) Index: box/manager/mapstore/mapstore.go ================================================================== --- box/manager/mapstore/mapstore.go +++ box/manager/mapstore/mapstore.go @@ -20,12 +20,12 @@ "io" "sort" "strings" "sync" - "zettelstore.de/client.fossil/api" - "zettelstore.de/client.fossil/maps" + "t73f.de/r/zsc/api" + "t73f.de/r/zsc/maps" "zettelstore.de/z/box" "zettelstore.de/z/box/manager/store" "zettelstore.de/z/zettel/id" "zettelstore.de/z/zettel/meta" ) Index: box/notify/entry.go ================================================================== --- box/notify/entry.go +++ box/notify/entry.go @@ -14,11 +14,11 @@ package notify import ( "path/filepath" - "zettelstore.de/client.fossil/api" + "t73f.de/r/zsc/api" "zettelstore.de/z/parser" "zettelstore.de/z/zettel" "zettelstore.de/z/zettel/id" "zettelstore.de/z/zettel/meta" ) Index: cmd/cmd_file.go ================================================================== --- cmd/cmd_file.go +++ cmd/cmd_file.go @@ -18,12 +18,12 @@ "flag" "fmt" "io" "os" - "zettelstore.de/client.fossil/api" - "zettelstore.de/client.fossil/input" + "t73f.de/r/zsc/api" + "t73f.de/r/zsc/input" "zettelstore.de/z/encoder" "zettelstore.de/z/parser" "zettelstore.de/z/zettel" "zettelstore.de/z/zettel/id" "zettelstore.de/z/zettel/meta" Index: cmd/cmd_password.go ================================================================== --- cmd/cmd_password.go +++ cmd/cmd_password.go @@ -18,11 +18,11 @@ "fmt" "os" "golang.org/x/term" - "zettelstore.de/client.fossil/api" + "t73f.de/r/zsc/api" "zettelstore.de/z/auth/cred" "zettelstore.de/z/zettel/id" ) // ---------- Subcommand: password ------------------------------------------- Index: cmd/command.go ================================================================== --- cmd/command.go +++ cmd/command.go @@ -14,11 +14,11 @@ package cmd import ( "flag" - "zettelstore.de/client.fossil/maps" + "t73f.de/r/zsc/maps" "zettelstore.de/z/logger" ) // Command stores information about commands / sub-commands. type Command struct { Index: cmd/main.go ================================================================== --- cmd/main.go +++ cmd/main.go @@ -23,12 +23,12 @@ "runtime/debug" "strconv" "strings" "time" - "zettelstore.de/client.fossil/api" - "zettelstore.de/client.fossil/input" + "t73f.de/r/zsc/api" + "t73f.de/r/zsc/input" "zettelstore.de/z/auth" "zettelstore.de/z/auth/impl" "zettelstore.de/z/box" "zettelstore.de/z/box/compbox" "zettelstore.de/z/box/manager" Index: docs/manual/00001005090000.zettel ================================================================== --- docs/manual/00001005090000.zettel +++ docs/manual/00001005090000.zettel @@ -2,11 +2,11 @@ title: List of predefined zettel role: manual tags: #manual #reference #zettelstore syntax: zmk created: 20210126175322 -modified: 20231129173425 +modified: 20240318115839 The following table lists all predefined zettel with their purpose. |= Identifier :|= Title | Purpose | [[00000000000001]] | Zettelstore Version | Contains the version string of the running Zettelstore @@ -14,10 +14,11 @@ | [[00000000000003]] | Zettelstore Operating System | Contains the operating system and CPU architecture of the computer running the Zettelstore | [[00000000000004]] | Zettelstore License | Lists the license of Zettelstore | [[00000000000005]] | Zettelstore Contributors | Lists all contributors of Zettelstore | [[00000000000006]] | Zettelstore Dependencies | Lists all licensed content | [[00000000000007]] | Zettelstore Log | Lists the last 8192 log messages +| [[00000000000008]] | Zettelstore Memory | Some statistics about main memory usage | [[00000000000020]] | Zettelstore Box Manager | Contains some statistics about zettel boxes and the the index process | [[00000000000090]] | Zettelstore Supported Metadata Keys | Contains all supported metadata keys, their [[types|00001006030000]], and more | [[00000000000092]] | Zettelstore Supported Parser | Lists all supported values for metadata [[syntax|00001006020000#syntax]] that are recognized by Zettelstore | [[00000000000096]] | Zettelstore Startup Configuration | Contains the effective values of the [[startup configuration|00001004010000]] | [[00000000000100]] | Zettelstore Runtime Configuration | Allows to [[configure Zettelstore at runtime|00001004020000]] @@ -45,7 +46,8 @@ | [[00000000090003]] | New Tag | Template for a new [[tag zettel|00001006020100#tag]] | [[00000000090004]] | New Role | Template for a new [[role zettel|00001006020100#role]] | [[00010000000000]] | Home | Default home zettel, contains some welcome information If a zettel is not linked, it is not accessible for the current user. +In most cases, you must at least enable [[''expert-mode''|00001004020000#expert-mode]]. **Important:** All identifier may change until a stable version of the software is released. Index: docs/manual/00001008000000.zettel ================================================================== --- docs/manual/00001008000000.zettel +++ docs/manual/00001008000000.zettel @@ -2,11 +2,11 @@ title: Other Markup Languages role: manual tags: #manual #zettelstore syntax: zmk created: 20210126175300 -modified: 20230529223634 +modified: 20240413160242 [[Zettelmarkup|00001007000000]] is not the only markup language you can use to define your content. Zettelstore is quite agnostic with respect to markup languages. Of course, Zettelmarkup plays an important role. However, with the exception of zettel titles, you can use any (markup) language that is supported: @@ -47,15 +47,15 @@ The [[runtime configuration zettel|00000000000100]] uses this syntax. The zettel content is ignored. ; [!svg|''svg''] : [[Scalable Vector Graphics|https://www.w3.org/TR/SVG2/]]. ; [!sxn|''sxn''] -: S-Expressions, as implemented by [[sx|https://zettelstore.de/sx]]. +: S-Expressions, as implemented by [[Sx|https://t73f.de/r/sx]]. Often used to specify templates when rendering a zettel as HTML for the [[web user interface|00001014000000]] (with the help of sxhtml]). ; [!text|''text''], [!plain|''plain''], [!txt|''txt''] : Plain text that must not be interpreted further. ; [!zmk|''zmk''] : [[Zettelmarkup|00001007000000]]. The actual values are also listed in a zettel named [[Zettelstore Supported Parser|00000000000092]]. If you specify something else, your content will be interpreted as plain text. Index: docs/manual/00001012930500.zettel ================================================================== --- docs/manual/00001012930500.zettel +++ docs/manual/00001012930500.zettel @@ -2,11 +2,11 @@ title: Syntax of Symbolic Expressions role: manual tags: #manual #reference #zettelstore syntax: zmk created: 20230403151127 -modified: 20230703174218 +modified: 20240413160345 === Syntax of lists A list always starts with the left parenthesis (""''(''"", U+0028) and ends with a right parenthesis (""'')''"", U+0029). A list may contain a possibly empty sequence of elements, i.e. lists and / or atoms. @@ -69,9 +69,9 @@ Unicode characters with a code less than U+FFFF are encoded by by the sequence ""''\\uNMOP''"", where ''NMOP'' is the hex encoding of the character. Unicode characters with a code less than U+FFFFFF are encoded by by the sequence ""''\\UNMOPQR''"", where ''NMOPQR'' is the hex encoding of the character. In addition, the sequence ""''\\t''"" encodes a horizontal tab (U+0009), the sequence ""''\\n''"" encodes a line feed (U+000A). === See also -* Currently, Zettelstore uses [[sx|https://zettelstore.de/sx]] (""Symbolic eXPression Framework"") to implement symbolic expression. +* Currently, Zettelstore uses [[Sx|https://t73f.de/r/sx]] (""Symbolic eXpression framework"") to implement symbolic expressions. The project page might contain additional information about the full syntax. Zettelstore only uses lists, numbers, string, and symbols to represent zettel. Index: encoder/encoder.go ================================================================== --- encoder/encoder.go +++ encoder/encoder.go @@ -18,11 +18,11 @@ import ( "errors" "fmt" "io" - "zettelstore.de/client.fossil/api" + "t73f.de/r/zsc/api" "zettelstore.de/z/ast" "zettelstore.de/z/zettel/meta" ) // Encoder is an interface that allows to encode different parts of a zettel. Index: encoder/encoder_blob_test.go ================================================================== --- encoder/encoder_blob_test.go +++ encoder/encoder_blob_test.go @@ -14,12 +14,12 @@ package encoder_test import ( "testing" - "zettelstore.de/client.fossil/api" - "zettelstore.de/client.fossil/input" + "t73f.de/r/zsc/api" + "t73f.de/r/zsc/input" "zettelstore.de/z/config" "zettelstore.de/z/parser" "zettelstore.de/z/zettel/id" "zettelstore.de/z/zettel/meta" Index: encoder/encoder_test.go ================================================================== --- encoder/encoder_test.go +++ encoder/encoder_test.go @@ -16,13 +16,13 @@ import ( "fmt" "strings" "testing" - "zettelstore.de/client.fossil/api" - "zettelstore.de/client.fossil/input" - "zettelstore.de/sx.fossil/sxreader" + "t73f.de/r/sx/sxreader" + "t73f.de/r/zsc/api" + "t73f.de/r/zsc/input" "zettelstore.de/z/ast" "zettelstore.de/z/config" "zettelstore.de/z/encoder" "zettelstore.de/z/parser" "zettelstore.de/z/zettel/meta" Index: encoder/htmlenc/htmlenc.go ================================================================== --- encoder/htmlenc/htmlenc.go +++ encoder/htmlenc/htmlenc.go @@ -16,14 +16,14 @@ import ( "io" "strings" - "zettelstore.de/client.fossil/api" - "zettelstore.de/client.fossil/shtml" - "zettelstore.de/sx.fossil" - "zettelstore.de/sx.fossil/sxhtml" + "t73f.de/r/sx" + "t73f.de/r/sxwebs/sxhtml" + "t73f.de/r/zsc/api" + "t73f.de/r/zsc/shtml" "zettelstore.de/z/ast" "zettelstore.de/z/encoder" "zettelstore.de/z/encoder/szenc" "zettelstore.de/z/encoder/textenc" "zettelstore.de/z/parser" @@ -80,19 +80,19 @@ } hen := he.th.Endnotes(&env) var head sx.ListBuilder head.Add(shtml.SymHead) - head.Add(sx.Nil().Cons(sx.Nil().Cons(sx.Cons(sx.MakeSymbol("charset"), sx.String("utf-8"))).Cons(sxhtml.SymAttr)).Cons(shtml.SymMeta)) + head.Add(sx.Nil().Cons(sx.Nil().Cons(sx.Cons(sx.MakeSymbol("charset"), sx.MakeString("utf-8"))).Cons(sxhtml.SymAttr)).Cons(shtml.SymMeta)) head.ExtendBang(hm) var sb strings.Builder if hasTitle { he.textEnc.WriteInlines(&sb, &isTitle) } else { sb.Write(zn.Meta.Zid.Bytes()) } - head.Add(sx.MakeList(shtml.SymAttrTitle, sx.String(sb.String()))) + head.Add(sx.MakeList(shtml.SymAttrTitle, sx.MakeString(sb.String()))) var body sx.ListBuilder body.Add(shtml.SymBody) if hasTitle { body.Add(htitle.Cons(shtml.SymH1)) @@ -106,11 +106,11 @@ doc := sx.MakeList( sxhtml.SymDoctype, sx.MakeList(shtml.SymHtml, head.List(), body.List()), ) - gen := sxhtml.NewGenerator(sxhtml.WithNewline) + gen := sxhtml.NewGenerator().SetNewline() return gen.WriteHTML(w, doc) } // WriteMeta encodes meta data as HTML5. func (he *Encoder) WriteMeta(w io.Writer, m *meta.Meta, evalMeta encoder.EvalMetaFunc) (int, error) { @@ -117,11 +117,11 @@ env := shtml.MakeEnvironment(he.lang) hm, err := he.th.Evaluate(he.tx.GetMeta(m, evalMeta), &env) if err != nil { return 0, err } - gen := sxhtml.NewGenerator(sxhtml.WithNewline) + gen := sxhtml.NewGenerator().SetNewline() return gen.WriteListHTML(w, hm) } func (he *Encoder) WriteContent(w io.Writer, zn *ast.ZettelNode) (int, error) { return he.WriteBlocks(w, &zn.Ast) Index: encoder/mdenc/mdenc.go ================================================================== --- encoder/mdenc/mdenc.go +++ encoder/mdenc/mdenc.go @@ -15,11 +15,11 @@ package mdenc import ( "io" - "zettelstore.de/client.fossil/api" + "t73f.de/r/zsc/api" "zettelstore.de/z/ast" "zettelstore.de/z/encoder" "zettelstore.de/z/zettel/meta" ) Index: encoder/shtmlenc/shtmlenc.go ================================================================== --- encoder/shtmlenc/shtmlenc.go +++ encoder/shtmlenc/shtmlenc.go @@ -15,13 +15,13 @@ package shtmlenc import ( "io" - "zettelstore.de/client.fossil/api" - "zettelstore.de/client.fossil/shtml" - "zettelstore.de/sx.fossil" + "t73f.de/r/sx" + "t73f.de/r/zsc/api" + "t73f.de/r/zsc/shtml" "zettelstore.de/z/ast" "zettelstore.de/z/encoder" "zettelstore.de/z/encoder/szenc" "zettelstore.de/z/zettel/meta" ) Index: encoder/szenc/szenc.go ================================================================== --- encoder/szenc/szenc.go +++ encoder/szenc/szenc.go @@ -15,12 +15,12 @@ package szenc import ( "io" - "zettelstore.de/client.fossil/api" - "zettelstore.de/sx.fossil" + "t73f.de/r/sx" + "t73f.de/r/zsc/api" "zettelstore.de/z/ast" "zettelstore.de/z/encoder" "zettelstore.de/z/zettel/meta" ) Index: encoder/szenc/transform.go ================================================================== --- encoder/szenc/transform.go +++ encoder/szenc/transform.go @@ -16,13 +16,13 @@ import ( "encoding/base64" "fmt" "strings" - "zettelstore.de/client.fossil/attrs" - "zettelstore.de/client.fossil/sz" - "zettelstore.de/sx.fossil" + "t73f.de/r/sx" + "t73f.de/r/zsc/attrs" + "t73f.de/r/zsc/sz" "zettelstore.de/z/ast" "zettelstore.de/z/encoder" "zettelstore.de/z/zettel/meta" ) @@ -46,18 +46,18 @@ return t.getInlineList(n.Inlines).Cons(sz.SymPara) case *ast.VerbatimNode: return sx.MakeList( mapGetS(mapVerbatimKindS, n.Kind), getAttributes(n.Attrs), - sx.String(string(n.Content)), + sx.MakeString(string(n.Content)), ) case *ast.RegionNode: return t.getRegion(n) case *ast.HeadingNode: return t.getInlineList(n.Inlines). - Cons(sx.String(n.Fragment)). - Cons(sx.String(n.Slug)). + Cons(sx.MakeString(n.Fragment)). + Cons(sx.MakeString(n.Slug)). Cons(getAttributes(n.Attrs)). Cons(sx.Int64(int64(n.Level))). Cons(sz.SymHeading) case *ast.HRuleNode: return sx.MakeList(sz.SymThematic, getAttributes(n.Attrs)) @@ -70,14 +70,14 @@ case *ast.TranscludeNode: return sx.MakeList(sz.SymTransclude, getAttributes(n.Attrs), getReference(n.Ref)) case *ast.BLOBNode: return t.getBLOB(n) case *ast.TextNode: - return sx.MakeList(sz.SymText, sx.String(n.Text)) + return sx.MakeList(sz.SymText, sx.MakeString(n.Text)) case *ast.SpaceNode: if t.inVerse { - return sx.MakeList(sz.SymSpace, sx.String(n.Lexeme)) + return sx.MakeList(sz.SymSpace, sx.MakeString(n.Lexeme)) } return sx.MakeList(sz.SymSpace) case *ast.BreakNode: if n.Hard { return sx.MakeList(sz.SymHard) @@ -85,42 +85,42 @@ return sx.MakeList(sz.SymSoft) case *ast.LinkNode: return t.getLink(n) case *ast.EmbedRefNode: return t.getInlineList(n.Inlines). - Cons(sx.String(n.Syntax)). + Cons(sx.MakeString(n.Syntax)). Cons(getReference(n.Ref)). Cons(getAttributes(n.Attrs)). Cons(sz.SymEmbed) case *ast.EmbedBLOBNode: return t.getEmbedBLOB(n) case *ast.CiteNode: return t.getInlineList(n.Inlines). - Cons(sx.String(n.Key)). + Cons(sx.MakeString(n.Key)). Cons(getAttributes(n.Attrs)). Cons(sz.SymCite) case *ast.FootnoteNode: // (ENDNODE attrs InlineElement ...) return t.getInlineList(n.Inlines).Cons(getAttributes(n.Attrs)).Cons(sz.SymEndnote) case *ast.MarkNode: return t.getInlineList(n.Inlines). - Cons(sx.String(n.Fragment)). - Cons(sx.String(n.Slug)). - Cons(sx.String(n.Mark)). + Cons(sx.MakeString(n.Fragment)). + Cons(sx.MakeString(n.Slug)). + Cons(sx.MakeString(n.Mark)). Cons(sz.SymMark) case *ast.FormatNode: return t.getInlineList(n.Inlines). Cons(getAttributes(n.Attrs)). Cons(mapGetS(mapFormatKindS, n.Kind)) case *ast.LiteralNode: return sx.MakeList( mapGetS(mapLiteralKindS, n.Kind), getAttributes(n.Attrs), - sx.String(string(n.Content)), + sx.MakeString(string(n.Content)), ) } - return sx.MakeList(sz.SymUnknown, sx.String(fmt.Sprintf("%T %v", node, node))) + return sx.MakeList(sz.SymUnknown, sx.MakeString(fmt.Sprintf("%T %v", node, node))) } var mapVerbatimKindS = map[ast.VerbatimKind]*sx.Symbol{ ast.VerbatimZettel: sz.SymVerbatimZettel, ast.VerbatimProg: sz.SymVerbatimProg, @@ -266,18 +266,18 @@ } func (t *Transformer) getBLOB(bn *ast.BLOBNode) *sx.Pair { var lastObj sx.Object if bn.Syntax == meta.SyntaxSVG { - lastObj = sx.String(string(bn.Blob)) + lastObj = sx.MakeString(string(bn.Blob)) } else { lastObj = getBase64String(bn.Blob) } return sx.MakeList( sz.SymBLOB, t.getInlineList(bn.Description), - sx.String(bn.Syntax), + sx.MakeString(bn.Syntax), lastObj, ) } var mapRefStateLink = map[ast.RefState]*sx.Symbol{ @@ -292,23 +292,23 @@ ast.RefStateExternal: sz.SymLinkExternal, } func (t *Transformer) getLink(ln *ast.LinkNode) *sx.Pair { return t.getInlineList(ln.Inlines). - Cons(sx.String(ln.Ref.Value)). + Cons(sx.MakeString(ln.Ref.Value)). Cons(getAttributes(ln.Attrs)). Cons(mapGetS(mapRefStateLink, ln.Ref.State)) } func (t *Transformer) getEmbedBLOB(en *ast.EmbedBLOBNode) *sx.Pair { tail := t.getInlineList(en.Inlines) if en.Syntax == meta.SyntaxSVG { - tail = tail.Cons(sx.String(string(en.Blob))) + tail = tail.Cons(sx.MakeString(string(en.Blob))) } else { tail = tail.Cons(getBase64String(en.Blob)) } - return tail.Cons(sx.String(en.Syntax)).Cons(getAttributes(en.Attrs)).Cons(sz.SymEmbedBLOB) + return tail.Cons(sx.MakeString(en.Syntax)).Cons(getAttributes(en.Attrs)).Cons(sz.SymEmbedBLOB) } func (t *Transformer) getBlockList(bs *ast.BlockSlice) *sx.Pair { objs := make(sx.Vector, len(*bs)) for i, n := range *bs { @@ -329,11 +329,11 @@ return sx.Nil() } keys := a.Keys() objs := make(sx.Vector, 0, len(keys)) for _, k := range keys { - objs = append(objs, sx.Cons(sx.String(k), sx.String(a[k]))) + objs = append(objs, sx.Cons(sx.MakeString(k), sx.MakeString(a[k]))) } return sx.MakeList(objs...) } var mapRefStateS = map[ast.RefState]*sx.Symbol{ @@ -347,11 +347,11 @@ ast.RefStateQuery: sz.SymRefStateQuery, ast.RefStateExternal: sz.SymRefStateExternal, } func getReference(ref *ast.Reference) *sx.Pair { - return sx.MakeList(mapGetS(mapRefStateS, ref.State), sx.String(ref.Value)) + return sx.MakeList(mapGetS(mapRefStateS, ref.State), sx.MakeString(ref.Value)) } var mapMetaTypeS = map[*meta.DescriptionType]*sx.Symbol{ meta.TypeCredential: sz.SymTypeCredential, meta.TypeEmpty: sz.SymTypeEmpty, @@ -376,18 +376,18 @@ var obj sx.Object if ty.IsSet { setList := meta.ListFromValue(p.Value) setObjs := make(sx.Vector, len(setList)) for i, val := range setList { - setObjs[i] = sx.String(val) + setObjs[i] = sx.MakeString(val) } obj = sx.MakeList(setObjs...) } else if ty == meta.TypeZettelmarkup { is := evalMeta(p.Value) obj = t.getInlineList(is) } else { - obj = sx.String(p.Value) + obj = sx.MakeString(p.Value) } objs = append(objs, sx.Nil().Cons(obj).Cons(sx.MakeSymbol(key)).Cons(symType)) } return sx.MakeList(objs...).Cons(sz.SymMeta) } @@ -405,9 +405,9 @@ _, err := encoder.Write(data) if err == nil { err = encoder.Close() } if err == nil { - return sx.String(sb.String()) + return sx.MakeString(sb.String()) } - return sx.String("") + return sx.MakeString("") } Index: encoder/textenc/textenc.go ================================================================== --- encoder/textenc/textenc.go +++ encoder/textenc/textenc.go @@ -15,11 +15,11 @@ package textenc import ( "io" - "zettelstore.de/client.fossil/api" + "t73f.de/r/zsc/api" "zettelstore.de/z/ast" "zettelstore.de/z/encoder" "zettelstore.de/z/zettel/meta" ) Index: encoder/zmkenc/zmkenc.go ================================================================== --- encoder/zmkenc/zmkenc.go +++ encoder/zmkenc/zmkenc.go @@ -17,12 +17,12 @@ import ( "fmt" "io" "strings" - "zettelstore.de/client.fossil/api" - "zettelstore.de/client.fossil/attrs" + "t73f.de/r/zsc/api" + "t73f.de/r/zsc/attrs" "zettelstore.de/z/ast" "zettelstore.de/z/encoder" "zettelstore.de/z/encoder/textenc" "zettelstore.de/z/strfun" "zettelstore.de/z/zettel/meta" Index: encoding/atom/atom.go ================================================================== --- encoding/atom/atom.go +++ encoding/atom/atom.go @@ -16,11 +16,11 @@ import ( "bytes" "time" - "zettelstore.de/client.fossil/api" + "t73f.de/r/zsc/api" "zettelstore.de/z/config" "zettelstore.de/z/encoding" "zettelstore.de/z/encoding/xml" "zettelstore.de/z/kernel" "zettelstore.de/z/query" Index: encoding/encoding.go ================================================================== --- encoding/encoding.go +++ encoding/encoding.go @@ -15,11 +15,11 @@ package encoding import ( "time" - "zettelstore.de/client.fossil/api" + "t73f.de/r/zsc/api" "zettelstore.de/z/parser" "zettelstore.de/z/zettel/id" "zettelstore.de/z/zettel/meta" ) Index: encoding/rss/rss.go ================================================================== --- encoding/rss/rss.go +++ encoding/rss/rss.go @@ -17,11 +17,11 @@ import ( "bytes" "context" "time" - "zettelstore.de/client.fossil/api" + "t73f.de/r/zsc/api" "zettelstore.de/z/config" "zettelstore.de/z/encoding" "zettelstore.de/z/encoding/xml" "zettelstore.de/z/kernel" "zettelstore.de/z/query" Index: evaluator/evaluator.go ================================================================== --- evaluator/evaluator.go +++ evaluator/evaluator.go @@ -21,15 +21,15 @@ "fmt" "path" "strconv" "strings" - "zettelstore.de/client.fossil/api" - "zettelstore.de/client.fossil/attrs" - "zettelstore.de/client.fossil/input" - "zettelstore.de/sx.fossil/sxbuiltins" - "zettelstore.de/sx.fossil/sxreader" + "t73f.de/r/sx/sxbuiltins" + "t73f.de/r/sx/sxreader" + "t73f.de/r/zsc/api" + "t73f.de/r/zsc/attrs" + "t73f.de/r/zsc/input" "zettelstore.de/z/ast" "zettelstore.de/z/box" "zettelstore.de/z/config" "zettelstore.de/z/parser" "zettelstore.de/z/parser/cleaner" Index: evaluator/list.go ================================================================== --- evaluator/list.go +++ evaluator/list.go @@ -19,12 +19,12 @@ "math" "sort" "strconv" "strings" - "zettelstore.de/client.fossil/api" - "zettelstore.de/client.fossil/attrs" + "t73f.de/r/zsc/api" + "t73f.de/r/zsc/attrs" "zettelstore.de/z/ast" "zettelstore.de/z/config" "zettelstore.de/z/encoding/atom" "zettelstore.de/z/encoding/rss" "zettelstore.de/z/parser" Index: go.mod ================================================================== --- go.mod +++ go.mod @@ -2,14 +2,18 @@ go 1.22 require ( github.com/fsnotify/fsnotify v1.7.0 - github.com/yuin/goldmark v1.7.0 - golang.org/x/crypto v0.20.0 - golang.org/x/term v0.17.0 - golang.org/x/text v0.14.0 - zettelstore.de/client.fossil v0.0.0-20240304164340-1f9d9b832cdd - zettelstore.de/sx.fossil v0.0.0-20240304124557-67e0a1799d1d + github.com/yuin/goldmark v1.7.1 + golang.org/x/crypto v0.23.0 + golang.org/x/term v0.20.0 + golang.org/x/text v0.15.0 + t73f.de/r/sx v0.0.0-20240418072254-b6eff7d787f9 + t73f.de/r/sxwebs v0.0.0-20240506145202-e8d9730ec7be + t73f.de/r/zsc v0.0.0-20240422145115-3bbfcfd9394c ) -require golang.org/x/sys v0.17.0 // indirect +require ( + golang.org/x/sys v0.20.0 // indirect + t73f.de/r/webs v0.0.0-20240506131458-2ca382cb6824 // indirect +) Index: go.sum ================================================================== --- go.sum +++ go.sum @@ -1,16 +1,20 @@ github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= -github.com/yuin/goldmark v1.7.0 h1:EfOIvIMZIzHdB/R/zVrikYLPPwJlfMcNczJFMs1m6sA= -github.com/yuin/goldmark v1.7.0/go.mod h1:uzxRWxtg69N339t3louHJ7+O03ezfj6PlliRlaOzY1E= -golang.org/x/crypto v0.20.0 h1:jmAMJJZXr5KiCw05dfYK9QnqaqKLYXijU23lsEdcQqg= -golang.org/x/crypto v0.20.0/go.mod h1:Xwo95rrVNIoSMx9wa1JroENMToLWn3RNVrTBpLHgZPQ= -golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y= -golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/term v0.17.0 h1:mkTF7LCd6WGJNL3K1Ad7kwxNfYAW6a8a8QqtMblp/4U= -golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -zettelstore.de/client.fossil v0.0.0-20240304164340-1f9d9b832cdd h1:+LUJqi1mvXo/zM9Ii64hcGd1LD3oC8kh5yrmw2fFoco= -zettelstore.de/client.fossil v0.0.0-20240304164340-1f9d9b832cdd/go.mod h1:y5zhvVuDHJKFcySEe70537w+5RL50jpeZjqyQuBjfa0= -zettelstore.de/sx.fossil v0.0.0-20240304124557-67e0a1799d1d h1:Gl5ZmdNV5wJsNMIQYjAd/sWLq2ng4NP+eglWU7lQP+I= -zettelstore.de/sx.fossil v0.0.0-20240304124557-67e0a1799d1d/go.mod h1:/iGHxFXoo6GSV04PUkwaLuFrrCa5LMorxD73iLMAruI= +github.com/yuin/goldmark v1.7.1 h1:3bajkSilaCbjdKVsKdZjZCLBNPL9pYzrCakKaf4U49U= +github.com/yuin/goldmark v1.7.1/go.mod h1:uzxRWxtg69N339t3louHJ7+O03ezfj6PlliRlaOzY1E= +golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= +golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= +golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.20.0 h1:VnkxpohqXaOBYJtBmEppKUG6mXpi+4O6purfc2+sMhw= +golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= +golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= +golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +t73f.de/r/sx v0.0.0-20240418072254-b6eff7d787f9 h1:lVPkYN8+J9f6JA9SmoF6icvpLxz4u3h1MCTuDYJYwdU= +t73f.de/r/sx v0.0.0-20240418072254-b6eff7d787f9/go.mod h1:G9pD1j2R6y9ZkPBb81mSnmwaAvTOg7r6jKp/OF7WeFA= +t73f.de/r/sxwebs v0.0.0-20240506145202-e8d9730ec7be h1:DlX70vUz/hCMQxr1xVU339h2eUIEqdG2duS0QBqkXFw= +t73f.de/r/sxwebs v0.0.0-20240506145202-e8d9730ec7be/go.mod h1:PtIkpRfTTiQITciKaWcTiAwy9FJ63WSQKciTp/dJbOA= +t73f.de/r/webs v0.0.0-20240506131458-2ca382cb6824 h1:G/5vTUMZp/z6Gm88SUSIthXUIQi90oqI9ZlOBC4W074= +t73f.de/r/webs v0.0.0-20240506131458-2ca382cb6824/go.mod h1:UGAAtul0TK5ACeZ6zTS3SX6GqwMFXxlUpHiV8oqNq5w= +t73f.de/r/zsc v0.0.0-20240422145115-3bbfcfd9394c h1:TOvMeqVXG5s1Rj2a2q3r1+K8LlS9fHruMon0n7Aw5qM= +t73f.de/r/zsc v0.0.0-20240422145115-3bbfcfd9394c/go.mod h1:YdsjqbI1th0bJoMclgbNycJUVr8ovAV02ZgA91uOhkU= Index: kernel/impl/cfg.go ================================================================== --- kernel/impl/cfg.go +++ kernel/impl/cfg.go @@ -19,11 +19,11 @@ "fmt" "strconv" "strings" "sync" - "zettelstore.de/client.fossil/api" + "t73f.de/r/zsc/api" "zettelstore.de/z/box" "zettelstore.de/z/config" "zettelstore.de/z/kernel" "zettelstore.de/z/logger" "zettelstore.de/z/web/server" Index: kernel/impl/cmd.go ================================================================== --- kernel/impl/cmd.go +++ kernel/impl/cmd.go @@ -20,11 +20,11 @@ "runtime/metrics" "sort" "strconv" "strings" - "zettelstore.de/client.fossil/maps" + "t73f.de/r/zsc/maps" "zettelstore.de/z/kernel" "zettelstore.de/z/logger" "zettelstore.de/z/strfun" ) Index: kernel/impl/config.go ================================================================== --- kernel/impl/config.go +++ kernel/impl/config.go @@ -19,11 +19,11 @@ "sort" "strconv" "strings" "sync" - "zettelstore.de/client.fossil/maps" + "t73f.de/r/zsc/maps" "zettelstore.de/z/kernel" "zettelstore.de/z/logger" "zettelstore.de/z/zettel/id" ) Index: kernel/impl/core.go ================================================================== --- kernel/impl/core.go +++ kernel/impl/core.go @@ -19,11 +19,11 @@ "os" "runtime" "sync" "time" - "zettelstore.de/client.fossil/maps" + "t73f.de/r/zsc/maps" "zettelstore.de/z/kernel" "zettelstore.de/z/logger" "zettelstore.de/z/strfun" "zettelstore.de/z/zettel/id" ) Index: logger/message.go ================================================================== --- logger/message.go +++ logger/message.go @@ -17,11 +17,11 @@ "context" "net/http" "strconv" "sync" - "zettelstore.de/client.fossil/api" + "t73f.de/r/zsc/api" "zettelstore.de/z/zettel/id" ) // Message presents a message to log. type Message struct { Index: parser/blob/blob.go ================================================================== --- parser/blob/blob.go +++ parser/blob/blob.go @@ -13,11 +13,11 @@ // Package blob provides a parser of binary data. package blob import ( - "zettelstore.de/client.fossil/input" + "t73f.de/r/zsc/input" "zettelstore.de/z/ast" "zettelstore.de/z/parser" "zettelstore.de/z/zettel/meta" ) Index: parser/draw/draw.go ================================================================== --- parser/draw/draw.go +++ parser/draw/draw.go @@ -18,12 +18,12 @@ package draw import ( "strconv" - "zettelstore.de/client.fossil/attrs" - "zettelstore.de/client.fossil/input" + "t73f.de/r/zsc/attrs" + "t73f.de/r/zsc/input" "zettelstore.de/z/ast" "zettelstore.de/z/parser" "zettelstore.de/z/zettel/meta" ) Index: parser/draw/draw_test.go ================================================================== --- parser/draw/draw_test.go +++ parser/draw/draw_test.go @@ -14,11 +14,11 @@ package draw_test import ( "testing" - "zettelstore.de/client.fossil/input" + "t73f.de/r/zsc/input" "zettelstore.de/z/config" "zettelstore.de/z/parser" "zettelstore.de/z/zettel/meta" ) Index: parser/markdown/markdown.go ================================================================== --- parser/markdown/markdown.go +++ parser/markdown/markdown.go @@ -22,12 +22,12 @@ gm "github.com/yuin/goldmark" gmAst "github.com/yuin/goldmark/ast" gmText "github.com/yuin/goldmark/text" - "zettelstore.de/client.fossil/attrs" - "zettelstore.de/client.fossil/input" + "t73f.de/r/zsc/attrs" + "t73f.de/r/zsc/input" "zettelstore.de/z/ast" "zettelstore.de/z/encoder/textenc" "zettelstore.de/z/parser" "zettelstore.de/z/zettel/meta" ) Index: parser/none/none.go ================================================================== --- parser/none/none.go +++ parser/none/none.go @@ -13,11 +13,11 @@ // Package none provides a none-parser, e.g. for zettel with just metadata. package none import ( - "zettelstore.de/client.fossil/input" + "t73f.de/r/zsc/input" "zettelstore.de/z/ast" "zettelstore.de/z/parser" "zettelstore.de/z/zettel/meta" ) Index: parser/parser.go ================================================================== --- parser/parser.go +++ parser/parser.go @@ -17,12 +17,12 @@ import ( "context" "fmt" "strings" - "zettelstore.de/client.fossil/api" - "zettelstore.de/client.fossil/input" + "t73f.de/r/zsc/api" + "t73f.de/r/zsc/input" "zettelstore.de/z/ast" "zettelstore.de/z/config" "zettelstore.de/z/parser/cleaner" "zettelstore.de/z/zettel" "zettelstore.de/z/zettel/meta" Index: parser/plain/plain.go ================================================================== --- parser/plain/plain.go +++ parser/plain/plain.go @@ -16,13 +16,13 @@ import ( "bytes" "strings" - "zettelstore.de/client.fossil/attrs" - "zettelstore.de/client.fossil/input" - "zettelstore.de/sx.fossil/sxreader" + "t73f.de/r/sx/sxreader" + "t73f.de/r/zsc/attrs" + "t73f.de/r/zsc/input" "zettelstore.de/z/ast" "zettelstore.de/z/parser" "zettelstore.de/z/zettel/meta" ) Index: parser/zettelmark/block.go ================================================================== --- parser/zettelmark/block.go +++ parser/zettelmark/block.go @@ -14,11 +14,11 @@ package zettelmark import ( "fmt" - "zettelstore.de/client.fossil/input" + "t73f.de/r/zsc/input" "zettelstore.de/z/ast" ) // parseBlockSlice parses a sequence of blocks. func (cp *zmkP) parseBlockSlice() ast.BlockSlice { Index: parser/zettelmark/inline.go ================================================================== --- parser/zettelmark/inline.go +++ parser/zettelmark/inline.go @@ -16,12 +16,12 @@ import ( "bytes" "fmt" "strings" - "zettelstore.de/client.fossil/attrs" - "zettelstore.de/client.fossil/input" + "t73f.de/r/zsc/attrs" + "t73f.de/r/zsc/input" "zettelstore.de/z/ast" "zettelstore.de/z/zettel/meta" ) // parseInlineSlice parses a sequence of Inlines until EOS. Index: parser/zettelmark/zettelmark.go ================================================================== --- parser/zettelmark/zettelmark.go +++ parser/zettelmark/zettelmark.go @@ -16,12 +16,12 @@ import ( "strings" "unicode" - "zettelstore.de/client.fossil/attrs" - "zettelstore.de/client.fossil/input" + "t73f.de/r/zsc/attrs" + "t73f.de/r/zsc/input" "zettelstore.de/z/ast" "zettelstore.de/z/parser" "zettelstore.de/z/zettel/meta" ) Index: parser/zettelmark/zettelmark_fuzz_test.go ================================================================== --- parser/zettelmark/zettelmark_fuzz_test.go +++ parser/zettelmark/zettelmark_fuzz_test.go @@ -14,11 +14,11 @@ package zettelmark_test import ( "testing" - "zettelstore.de/client.fossil/input" + "t73f.de/r/zsc/input" "zettelstore.de/z/config" "zettelstore.de/z/parser" "zettelstore.de/z/zettel/meta" ) Index: parser/zettelmark/zettelmark_test.go ================================================================== --- parser/zettelmark/zettelmark_test.go +++ parser/zettelmark/zettelmark_test.go @@ -17,12 +17,12 @@ import ( "fmt" "strings" "testing" - "zettelstore.de/client.fossil/attrs" - "zettelstore.de/client.fossil/input" + "t73f.de/r/zsc/attrs" + "t73f.de/r/zsc/input" "zettelstore.de/z/ast" "zettelstore.de/z/config" "zettelstore.de/z/parser" "zettelstore.de/z/zettel/meta" ) Index: query/context.go ================================================================== --- query/context.go +++ query/context.go @@ -16,11 +16,11 @@ import ( "container/heap" "context" "math" - "zettelstore.de/client.fossil/api" + "t73f.de/r/zsc/api" "zettelstore.de/z/zettel/id" "zettelstore.de/z/zettel/meta" ) // ContextSpec contains all specification values for calculating a context. Index: query/parser.go ================================================================== --- query/parser.go +++ query/parser.go @@ -14,12 +14,12 @@ package query import ( "strconv" - "zettelstore.de/client.fossil/api" - "zettelstore.de/client.fossil/input" + "t73f.de/r/zsc/api" + "t73f.de/r/zsc/input" "zettelstore.de/z/zettel/id" "zettelstore.de/z/zettel/meta" ) // Parse the query specification and return a Query object. Index: query/print.go ================================================================== --- query/print.go +++ query/print.go @@ -16,12 +16,12 @@ import ( "io" "strconv" "strings" - "zettelstore.de/client.fossil/api" - "zettelstore.de/client.fossil/maps" + "t73f.de/r/zsc/api" + "t73f.de/r/zsc/maps" "zettelstore.de/z/zettel/id" ) var op2string = map[compareOp]string{ cmpExist: api.ExistOperator, Index: query/select_test.go ================================================================== --- query/select_test.go +++ query/select_test.go @@ -15,11 +15,11 @@ import ( "context" "testing" - "zettelstore.de/client.fossil/api" + "t73f.de/r/zsc/api" "zettelstore.de/z/query" "zettelstore.de/z/zettel/id" "zettelstore.de/z/zettel/meta" ) Index: query/sorter.go ================================================================== --- query/sorter.go +++ query/sorter.go @@ -14,11 +14,11 @@ package query import ( "strconv" - "zettelstore.de/client.fossil/api" + "t73f.de/r/zsc/api" "zettelstore.de/z/zettel/meta" ) type sortFunc func(i, j int) bool Index: query/specs.go ================================================================== --- query/specs.go +++ query/specs.go @@ -11,11 +11,11 @@ // SPDX-FileCopyrightText: 2023-present Detlef Stern //----------------------------------------------------------------------------- package query -import "zettelstore.de/client.fossil/api" +import "t73f.de/r/zsc/api" // IdentSpec contains all specification values to calculate the ident directive. type IdentSpec struct{} func (spec *IdentSpec) Print(pe *PrintEnv) { Index: query/unlinked.go ================================================================== --- query/unlinked.go +++ query/unlinked.go @@ -12,11 +12,11 @@ //----------------------------------------------------------------------------- package query import ( - "zettelstore.de/client.fossil/api" + "t73f.de/r/zsc/api" "zettelstore.de/z/strfun" "zettelstore.de/z/zettel/meta" ) // UnlinkedSpec contains all specification values to calculate unlinked references. Index: tests/client/client_test.go ================================================================== --- tests/client/client_test.go +++ tests/client/client_test.go @@ -23,12 +23,12 @@ "net/url" "slices" "strconv" "testing" - "zettelstore.de/client.fossil/api" - "zettelstore.de/client.fossil/client" + "t73f.de/r/zsc/api" + "t73f.de/r/zsc/client" "zettelstore.de/z/kernel" ) func nextZid(zid api.ZettelID) api.ZettelID { numVal, err := strconv.ParseUint(string(zid), 10, 64) @@ -52,14 +52,14 @@ } } func TestListZettel(t *testing.T) { const ( - ownerZettel = 55 - configRoleZettel = 33 - writerZettel = ownerZettel - 24 - readerZettel = ownerZettel - 24 + ownerZettel = 56 + configRoleZettel = 34 + writerZettel = ownerZettel - 25 + readerZettel = ownerZettel - 25 creatorZettel = 10 publicZettel = 5 ) testdata := []struct { Index: tests/client/crud_test.go ================================================================== --- tests/client/crud_test.go +++ tests/client/crud_test.go @@ -16,12 +16,12 @@ import ( "context" "strings" "testing" - "zettelstore.de/client.fossil/api" - "zettelstore.de/client.fossil/client" + "t73f.de/r/zsc/api" + "t73f.de/r/zsc/client" ) // --------------------------------------------------------------------------- // Tests that change the Zettelstore must nor run parallel to other tests. Index: tests/client/embed_test.go ================================================================== --- tests/client/embed_test.go +++ tests/client/embed_test.go @@ -16,11 +16,11 @@ import ( "context" "strings" "testing" - "zettelstore.de/client.fossil/api" + "t73f.de/r/zsc/api" ) const ( abcZid = api.ZettelID("20211020121000") abc10Zid = api.ZettelID("20211020121100") Index: tests/markdown_test.go ================================================================== --- tests/markdown_test.go +++ tests/markdown_test.go @@ -19,12 +19,12 @@ "fmt" "os" "strings" "testing" - "zettelstore.de/client.fossil/api" - "zettelstore.de/client.fossil/input" + "t73f.de/r/zsc/api" + "t73f.de/r/zsc/input" "zettelstore.de/z/ast" "zettelstore.de/z/config" "zettelstore.de/z/encoder" _ "zettelstore.de/z/encoder/htmlenc" _ "zettelstore.de/z/encoder/mdenc" Index: tests/naughtystrings_test.go ================================================================== --- tests/naughtystrings_test.go +++ tests/naughtystrings_test.go @@ -18,12 +18,12 @@ "io" "os" "path/filepath" "testing" - "zettelstore.de/client.fossil/api" - "zettelstore.de/client.fossil/input" + "t73f.de/r/zsc/api" + "t73f.de/r/zsc/input" _ "zettelstore.de/z/cmd" "zettelstore.de/z/encoder" "zettelstore.de/z/parser" "zettelstore.de/z/zettel/meta" ) Index: tests/regression_test.go ================================================================== --- tests/regression_test.go +++ tests/regression_test.go @@ -22,11 +22,11 @@ "os" "path/filepath" "strings" "testing" - "zettelstore.de/client.fossil/api" + "t73f.de/r/zsc/api" "zettelstore.de/z/ast" "zettelstore.de/z/box" "zettelstore.de/z/box/manager" "zettelstore.de/z/config" "zettelstore.de/z/encoder" Index: tools/build/build.go ================================================================== --- tools/build/build.go +++ tools/build/build.go @@ -24,12 +24,12 @@ "os" "path/filepath" "strings" "time" - "zettelstore.de/client.fossil/api" - "zettelstore.de/client.fossil/input" + "t73f.de/r/zsc/api" + "t73f.de/r/zsc/input" "zettelstore.de/z/strfun" "zettelstore.de/z/tools" "zettelstore.de/z/zettel/id" "zettelstore.de/z/zettel/meta" ) Index: tools/htmllint/htmllint.go ================================================================== --- tools/htmllint/htmllint.go +++ tools/htmllint/htmllint.go @@ -23,12 +23,12 @@ "os" "regexp" "sort" "strings" - "zettelstore.de/client.fossil/api" - "zettelstore.de/client.fossil/client" + "t73f.de/r/zsc/api" + "t73f.de/r/zsc/client" "zettelstore.de/z/tools" ) func main() { flag.BoolVar(&tools.Verbose, "v", false, "Verbose output") Index: tools/tools.go ================================================================== --- tools/tools.go +++ tools/tools.go @@ -25,11 +25,11 @@ "zettelstore.de/z/strfun" ) var EnvDirectProxy = []string{"GOPROXY=direct"} -var EnvGoVCS = []string{"GOVCS=zettelstore.de:fossil"} +var EnvGoVCS = []string{"GOVCS=zettelstore.de:fossil,t73f.de:fossil"} var Verbose bool func ExecuteCommand(env []string, name string, arg ...string) (string, error) { LogCommand("EXEC", env, name, arg) var out strings.Builder Index: usecase/authenticate.go ================================================================== --- usecase/authenticate.go +++ usecase/authenticate.go @@ -17,11 +17,11 @@ "context" "math/rand/v2" "net/http" "time" - "zettelstore.de/client.fossil/api" + "t73f.de/r/zsc/api" "zettelstore.de/z/auth" "zettelstore.de/z/auth/cred" "zettelstore.de/z/logger" "zettelstore.de/z/zettel/id" "zettelstore.de/z/zettel/meta" Index: usecase/create_zettel.go ================================================================== --- usecase/create_zettel.go +++ usecase/create_zettel.go @@ -15,11 +15,11 @@ import ( "context" "time" - "zettelstore.de/client.fossil/api" + "t73f.de/r/zsc/api" "zettelstore.de/z/config" "zettelstore.de/z/logger" "zettelstore.de/z/zettel" "zettelstore.de/z/zettel/id" "zettelstore.de/z/zettel/meta" Index: usecase/get_special_zettel.go ================================================================== --- usecase/get_special_zettel.go +++ usecase/get_special_zettel.go @@ -14,11 +14,11 @@ package usecase import ( "context" - "zettelstore.de/client.fossil/api" + "t73f.de/r/zsc/api" "zettelstore.de/z/query" "zettelstore.de/z/zettel" "zettelstore.de/z/zettel/id" "zettelstore.de/z/zettel/meta" ) Index: usecase/get_user.go ================================================================== --- usecase/get_user.go +++ usecase/get_user.go @@ -14,11 +14,11 @@ package usecase import ( "context" - "zettelstore.de/client.fossil/api" + "t73f.de/r/zsc/api" "zettelstore.de/z/auth" "zettelstore.de/z/box" "zettelstore.de/z/query" "zettelstore.de/z/zettel" "zettelstore.de/z/zettel/id" Index: usecase/lists.go ================================================================== --- usecase/lists.go +++ usecase/lists.go @@ -14,11 +14,11 @@ package usecase import ( "context" - "zettelstore.de/client.fossil/api" + "t73f.de/r/zsc/api" "zettelstore.de/z/box" "zettelstore.de/z/parser" "zettelstore.de/z/query" "zettelstore.de/z/zettel/meta" ) Index: usecase/query.go ================================================================== --- usecase/query.go +++ usecase/query.go @@ -17,11 +17,11 @@ "context" "errors" "fmt" "strings" - "zettelstore.de/client.fossil/api" + "t73f.de/r/zsc/api" "zettelstore.de/z/ast" "zettelstore.de/z/box" "zettelstore.de/z/collect" "zettelstore.de/z/parser" "zettelstore.de/z/query" Index: usecase/update_zettel.go ================================================================== --- usecase/update_zettel.go +++ usecase/update_zettel.go @@ -14,11 +14,11 @@ package usecase import ( "context" - "zettelstore.de/client.fossil/api" + "t73f.de/r/zsc/api" "zettelstore.de/z/box" "zettelstore.de/z/logger" "zettelstore.de/z/zettel" "zettelstore.de/z/zettel/id" "zettelstore.de/z/zettel/meta" Index: web/adapter/adapter.go ================================================================== --- web/adapter/adapter.go +++ web/adapter/adapter.go @@ -15,11 +15,11 @@ package adapter import ( "context" - "zettelstore.de/client.fossil/api" + "t73f.de/r/zsc/api" "zettelstore.de/z/usecase" "zettelstore.de/z/zettel/meta" ) // TryReIndex executes a re-index if the appropriate query action is given. Index: web/adapter/api/api.go ================================================================== --- web/adapter/api/api.go +++ web/adapter/api/api.go @@ -18,11 +18,11 @@ "bytes" "context" "net/http" "time" - "zettelstore.de/client.fossil/api" + "t73f.de/r/zsc/api" "zettelstore.de/z/auth" "zettelstore.de/z/config" "zettelstore.de/z/kernel" "zettelstore.de/z/logger" "zettelstore.de/z/web/adapter" Index: web/adapter/api/command.go ================================================================== --- web/adapter/api/command.go +++ web/adapter/api/command.go @@ -15,11 +15,11 @@ import ( "context" "net/http" - "zettelstore.de/client.fossil/api" + "t73f.de/r/zsc/api" "zettelstore.de/z/usecase" ) // MakePostCommandHandler creates a new HTTP handler to execute certain commands. func (a *API) MakePostCommandHandler( Index: web/adapter/api/create_zettel.go ================================================================== --- web/adapter/api/create_zettel.go +++ web/adapter/api/create_zettel.go @@ -14,12 +14,12 @@ package api import ( "net/http" - "zettelstore.de/client.fossil/api" - "zettelstore.de/sx.fossil" + "t73f.de/r/sx" + "t73f.de/r/zsc/api" "zettelstore.de/z/usecase" "zettelstore.de/z/web/adapter" "zettelstore.de/z/web/content" "zettelstore.de/z/zettel" "zettelstore.de/z/zettel/id" Index: web/adapter/api/get_data.go ================================================================== --- web/adapter/api/get_data.go +++ web/adapter/api/get_data.go @@ -14,11 +14,11 @@ package api import ( "net/http" - "zettelstore.de/sx.fossil" + "t73f.de/r/sx" "zettelstore.de/z/usecase" "zettelstore.de/z/zettel/id" ) // MakeGetDataHandler creates a new HTTP handler to return zettelstore data. @@ -27,13 +27,13 @@ version := ucVersion.Run() err := a.writeObject(w, id.Invalid, sx.MakeList( sx.Int64(version.Major), sx.Int64(version.Minor), sx.Int64(version.Patch), - sx.String(version.Info), - sx.String(version.Hash), + sx.MakeString(version.Info), + sx.MakeString(version.Hash), )) if err != nil { a.log.Error().Err(err).Msg("Write Version Info") } } } Index: web/adapter/api/get_zettel.go ================================================================== --- web/adapter/api/get_zettel.go +++ web/adapter/api/get_zettel.go @@ -17,13 +17,13 @@ "bytes" "context" "fmt" "net/http" - "zettelstore.de/client.fossil/api" - "zettelstore.de/client.fossil/sexp" - "zettelstore.de/sx.fossil" + "t73f.de/r/sx" + "t73f.de/r/zsc/api" + "t73f.de/r/zsc/sexp" "zettelstore.de/z/ast" "zettelstore.de/z/box" "zettelstore.de/z/encoder" "zettelstore.de/z/parser" "zettelstore.de/z/usecase" Index: web/adapter/api/login.go ================================================================== --- web/adapter/api/login.go +++ web/adapter/api/login.go @@ -15,11 +15,11 @@ import ( "net/http" "time" - "zettelstore.de/sx.fossil" + "t73f.de/r/sx" "zettelstore.de/z/auth" "zettelstore.de/z/usecase" "zettelstore.de/z/web/adapter" "zettelstore.de/z/zettel/id" ) @@ -101,10 +101,10 @@ } } func (a *API) writeToken(w http.ResponseWriter, token string, lifetime time.Duration) error { return a.writeObject(w, id.Invalid, sx.MakeList( - sx.String("Bearer"), - sx.String(token), + sx.MakeString("Bearer"), + sx.MakeString(token), sx.Int64(int64(lifetime/time.Second)), )) } Index: web/adapter/api/query.go ================================================================== --- web/adapter/api/query.go +++ web/adapter/api/query.go @@ -20,13 +20,13 @@ "net/http" "net/url" "strconv" "strings" - "zettelstore.de/client.fossil/api" - "zettelstore.de/client.fossil/sexp" - "zettelstore.de/sx.fossil" + "t73f.de/r/sx" + "t73f.de/r/zsc/api" + "t73f.de/r/zsc/sexp" "zettelstore.de/z/query" "zettelstore.de/z/usecase" "zettelstore.de/z/web/adapter" "zettelstore.de/z/web/content" "zettelstore.de/z/zettel/id" @@ -214,12 +214,12 @@ result[i+1] = msz } _, err := sx.Print(w, sx.MakeList( sx.MakeSymbol("meta-list"), - sx.MakeList(sx.MakeSymbol("query"), sx.String(dze.sq.String())), - sx.MakeList(sx.MakeSymbol("human"), sx.String(dze.sq.Human())), + sx.MakeList(sx.MakeSymbol("query"), sx.MakeString(dze.sq.String())), + sx.MakeList(sx.MakeSymbol("human"), sx.MakeString(dze.sq.Human())), sx.MakeList(result...), )) return err } func (dze *dataZettelEncoder) writeArrangement(w io.Writer, act string, arr meta.Arrangement) error { @@ -227,18 +227,18 @@ for aggKey, metaList := range arr { sxMeta := sx.Nil() for i := len(metaList) - 1; i >= 0; i-- { sxMeta = sxMeta.Cons(sx.Int64(metaList[i].Zid)) } - sxMeta = sxMeta.Cons(sx.String(aggKey)) + sxMeta = sxMeta.Cons(sx.MakeString(aggKey)) result = result.Cons(sxMeta) } _, err := sx.Print(w, sx.MakeList( sx.MakeSymbol("aggregate"), - sx.String(act), - sx.MakeList(sx.MakeSymbol("query"), sx.String(dze.sq.String())), - sx.MakeList(sx.MakeSymbol("human"), sx.String(dze.sq.Human())), + sx.MakeString(act), + sx.MakeList(sx.MakeSymbol("query"), sx.MakeString(dze.sq.String())), + sx.MakeList(sx.MakeSymbol("human"), sx.MakeString(dze.sq.Human())), result.Cons(sx.SymbolList), )) return err } Index: web/adapter/api/rename_zettel.go ================================================================== --- web/adapter/api/rename_zettel.go +++ web/adapter/api/rename_zettel.go @@ -15,11 +15,11 @@ import ( "net/http" "net/url" - "zettelstore.de/client.fossil/api" + "t73f.de/r/zsc/api" "zettelstore.de/z/usecase" "zettelstore.de/z/zettel/id" ) // MakeRenameZettelHandler creates a new HTTP handler to update a zettel. Index: web/adapter/api/request.go ================================================================== --- web/adapter/api/request.go +++ web/adapter/api/request.go @@ -16,14 +16,14 @@ import ( "io" "net/http" "net/url" - "zettelstore.de/client.fossil/api" - "zettelstore.de/client.fossil/input" - "zettelstore.de/client.fossil/sexp" - "zettelstore.de/sx.fossil/sxreader" + "t73f.de/r/sx/sxreader" + "t73f.de/r/zsc/api" + "t73f.de/r/zsc/input" + "t73f.de/r/zsc/sexp" "zettelstore.de/z/zettel" "zettelstore.de/z/zettel/id" "zettelstore.de/z/zettel/meta" ) Index: web/adapter/api/response.go ================================================================== --- web/adapter/api/response.go +++ web/adapter/api/response.go @@ -15,11 +15,11 @@ import ( "bytes" "net/http" - "zettelstore.de/sx.fossil" + "t73f.de/r/sx" "zettelstore.de/z/web/content" "zettelstore.de/z/zettel/id" ) func (a *API) writeObject(w http.ResponseWriter, zid id.Zid, obj sx.Object) error { Index: web/adapter/api/update_zettel.go ================================================================== --- web/adapter/api/update_zettel.go +++ web/adapter/api/update_zettel.go @@ -14,11 +14,11 @@ package api import ( "net/http" - "zettelstore.de/client.fossil/api" + "t73f.de/r/zsc/api" "zettelstore.de/z/usecase" "zettelstore.de/z/web/adapter" "zettelstore.de/z/zettel" "zettelstore.de/z/zettel/id" ) Index: web/adapter/request.go ================================================================== --- web/adapter/request.go +++ web/adapter/request.go @@ -17,11 +17,11 @@ "net/http" "net/url" "strconv" "strings" - "zettelstore.de/client.fossil/api" + "t73f.de/r/zsc/api" "zettelstore.de/z/kernel" "zettelstore.de/z/query" ) // GetCredentialsViaForm retrieves the authentication credentions from a form. Index: web/adapter/response.go ================================================================== --- web/adapter/response.go +++ web/adapter/response.go @@ -17,11 +17,11 @@ "errors" "fmt" "net/http" "strings" - "zettelstore.de/client.fossil/api" + "t73f.de/r/zsc/api" "zettelstore.de/z/box" "zettelstore.de/z/usecase" ) // WriteData emits the given data to the response writer. Index: web/adapter/webui/create_zettel.go ================================================================== --- web/adapter/webui/create_zettel.go +++ web/adapter/webui/create_zettel.go @@ -17,12 +17,12 @@ "bytes" "context" "net/http" "strings" - "zettelstore.de/client.fossil/api" - "zettelstore.de/sx.fossil" + "t73f.de/r/sx" + "t73f.de/r/zsc/api" "zettelstore.de/z/box" "zettelstore.de/z/encoder/zmkenc" "zettelstore.de/z/evaluator" "zettelstore.de/z/parser" "zettelstore.de/z/usecase" @@ -105,17 +105,17 @@ sb.WriteString(": ") sb.WriteString(p.Value) sb.WriteByte('\n') } env, rb := wui.createRenderEnv(ctx, "form", wui.rtConfig.Get(ctx, nil, api.KeyLang), title, user) - rb.bindString("heading", sx.String(title)) - rb.bindString("form-action-url", sx.String(formActionURL)) + rb.bindString("heading", sx.MakeString(title)) + rb.bindString("form-action-url", sx.MakeString(formActionURL)) rb.bindString("role-data", makeStringList(roleData)) rb.bindString("syntax-data", makeStringList(syntaxData)) - rb.bindString("meta", sx.String(sb.String())) + rb.bindString("meta", sx.MakeString(sb.String())) if !ztl.Content.IsBinary() { - rb.bindString("content", sx.String(ztl.Content.AsString())) + rb.bindString("content", sx.MakeString(ztl.Content.AsString())) } wui.bindCommonZettelData(ctx, &rb, user, m, &ztl.Content) if rb.err == nil { rb.err = wui.renderSxnTemplate(ctx, w, id.FormTemplateZid, env) } Index: web/adapter/webui/delete_zettel.go ================================================================== --- web/adapter/webui/delete_zettel.go +++ web/adapter/webui/delete_zettel.go @@ -14,13 +14,13 @@ package webui import ( "net/http" - "zettelstore.de/client.fossil/api" - "zettelstore.de/client.fossil/maps" - "zettelstore.de/sx.fossil" + "t73f.de/r/sx" + "t73f.de/r/zsc/api" + "t73f.de/r/zsc/maps" "zettelstore.de/z/box" "zettelstore.de/z/strfun" "zettelstore.de/z/usecase" "zettelstore.de/z/web/server" "zettelstore.de/z/zettel/id" @@ -49,11 +49,11 @@ user := server.GetUser(ctx) env, rb := wui.createRenderEnv( ctx, "delete", wui.rtConfig.Get(ctx, nil, api.KeyLang), "Delete Zettel "+m.Zid.String(), user) if len(zs) > 1 { - rb.bindString("shadowed-box", sx.String(zs[1].Meta.GetDefault(api.KeyBoxNumber, "???"))) + rb.bindString("shadowed-box", sx.MakeString(zs[1].Meta.GetDefault(api.KeyBoxNumber, "???"))) rb.bindString("incoming", nil) } else { rb.bindString("shadowed-box", nil) rb.bindString("incoming", wui.encodeIncoming(m, wui.makeGetTextTitle(ctx, getZettel))) } Index: web/adapter/webui/forms.go ================================================================== --- web/adapter/webui/forms.go +++ web/adapter/webui/forms.go @@ -20,12 +20,12 @@ "net/http" "regexp" "strings" "unicode" - "zettelstore.de/client.fossil/api" - "zettelstore.de/client.fossil/input" + "t73f.de/r/zsc/api" + "t73f.de/r/zsc/input" "zettelstore.de/z/kernel" "zettelstore.de/z/parser" "zettelstore.de/z/web/content" "zettelstore.de/z/zettel" "zettelstore.de/z/zettel/id" Index: web/adapter/webui/get_info.go ================================================================== --- web/adapter/webui/get_info.go +++ web/adapter/webui/get_info.go @@ -17,12 +17,12 @@ "context" "net/http" "sort" "strings" - "zettelstore.de/client.fossil/api" - "zettelstore.de/sx.fossil" + "t73f.de/r/sx" + "t73f.de/r/zsc/api" "zettelstore.de/z/ast" "zettelstore.de/z/box" "zettelstore.de/z/collect" "zettelstore.de/z/encoder" "zettelstore.de/z/evaluator" @@ -67,11 +67,11 @@ pairs := zn.Meta.ComputedPairs() metadata := sx.Nil() for i := len(pairs) - 1; i >= 0; i-- { key := pairs[i].Key sxval := wui.writeHTMLMetaValue(key, pairs[i].Value, getTextTitle, evalMeta, enc) - metadata = metadata.Cons(sx.Cons(sx.String(key), sxval)) + metadata = metadata.Cons(sx.Cons(sx.MakeString(key), sxval)) } summary := collect.References(zn) locLinks, queryLinks, extLinks := wui.splitLocSeaExtLinks(append(summary.Links, summary.Embeds...)) @@ -101,12 +101,12 @@ rb.bindString("metadata", metadata) rb.bindString("local-links", locLinks) rb.bindString("query-links", queryLinks) rb.bindString("ext-links", extLinks) rb.bindString("unlinked-content", unlinkedContent) - rb.bindString("phrase", sx.String(phrase)) - rb.bindString("query-key-phrase", sx.String(api.QueryKeyPhrase)) + rb.bindString("phrase", sx.MakeString(phrase)) + rb.bindString("query-key-phrase", sx.MakeString(api.QueryKeyPhrase)) rb.bindString("enc-eval", wui.infoAPIMatrix(zid, false, encTexts)) rb.bindString("enc-parsed", wui.infoAPIMatrixParsed(zid, encTexts)) rb.bindString("shadow-links", shadowLinks) wui.bindCommonZettelData(ctx, &rb, user, zn.InhMeta, &zn.Content) if rb.err == nil { @@ -127,19 +127,19 @@ continue } if ref.State == ast.RefStateQuery { queries = queries.Cons( sx.Cons( - sx.String(ref.Value), - sx.String(wui.NewURLBuilder('h').AppendQuery(ref.Value).String()))) + sx.MakeString(ref.Value), + sx.MakeString(wui.NewURLBuilder('h').AppendQuery(ref.Value).String()))) continue } if ref.IsExternal() { - extLinks = extLinks.Cons(sx.String(ref.String())) + extLinks = extLinks.Cons(sx.MakeString(ref.String())) continue } - locLinks = locLinks.Cons(sx.Cons(sx.MakeBoolean(ref.IsValid()), sx.String(ref.String()))) + locLinks = locLinks.Cons(sx.Cons(sx.MakeBoolean(ref.IsValid()), sx.MakeString(ref.String()))) } return locLinks, queries, extLinks } func createUnlinkedQuery(zid id.Zid, phrase string) *query.Query { @@ -183,14 +183,14 @@ if parseOnly { u.AppendKVQuery(api.QueryKeyParseOnly, "") } u.AppendKVQuery(api.QueryKeyPart, part) u.AppendKVQuery(api.QueryKeyEncoding, enc) - row = row.Cons(sx.Cons(sx.String(enc), sx.String(u.String()))) + row = row.Cons(sx.Cons(sx.MakeString(enc), sx.MakeString(u.String()))) u.ClearQuery() } - matrix = matrix.Cons(sx.Cons(sx.String(part), row)) + matrix = matrix.Cons(sx.Cons(sx.MakeString(part), row)) } return matrix } func (wui *WebUI) infoAPIMatrixParsed(zid id.Zid, encTexts []string) *sx.Pair { @@ -203,16 +203,16 @@ continue } last := line.LastPair() part := apiParts[i] u.AppendKVQuery(api.QueryKeyPart, part) - last = last.AppendBang(sx.Cons(sx.String("plain"), sx.String(u.String()))) + last = last.AppendBang(sx.Cons(sx.MakeString("plain"), sx.MakeString(u.String()))) u.ClearQuery() if i < 2 { u.AppendKVQuery(api.QueryKeyEncoding, api.EncodingData) u.AppendKVQuery(api.QueryKeyPart, part) - last.AppendBang(sx.Cons(sx.String("data"), sx.String(u.String()))) + last.AppendBang(sx.Cons(sx.MakeString("data"), sx.MakeString(u.String()))) u.ClearQuery() } i++ } return matrix @@ -221,11 +221,11 @@ func getShadowLinks(ctx context.Context, zid id.Zid, getAllZettel usecase.GetAllZettel) *sx.Pair { result := sx.Nil() if zl, err := getAllZettel.Run(ctx, zid); err == nil { for i := len(zl) - 1; i >= 1; i-- { if boxNo, ok := zl[i].Meta.Get(api.KeyBoxNumber); ok { - result = result.Cons(sx.String(boxNo)) + result = result.Cons(sx.MakeString(boxNo)) } } } return result } Index: web/adapter/webui/get_zettel.go ================================================================== --- web/adapter/webui/get_zettel.go +++ web/adapter/webui/get_zettel.go @@ -16,13 +16,13 @@ import ( "context" "net/http" "strings" - "zettelstore.de/client.fossil/api" - "zettelstore.de/client.fossil/shtml" - "zettelstore.de/sx.fossil" + "t73f.de/r/sx" + "t73f.de/r/zsc/api" + "t73f.de/r/zsc/shtml" "zettelstore.de/z/box" "zettelstore.de/z/config" "zettelstore.de/z/parser" "zettelstore.de/z/usecase" "zettelstore.de/z/web/server" @@ -60,16 +60,16 @@ getTextTitle := wui.makeGetTextTitle(ctx, getZettel) title := parser.NormalizedSpacedText(zn.InhMeta.GetTitle()) env, rb := wui.createRenderEnv(ctx, "zettel", wui.rtConfig.Get(ctx, zn.InhMeta, api.KeyLang), title, user) rb.bindSymbol(symMetaHeader, metaObj) - rb.bindString("heading", sx.String(title)) + rb.bindString("heading", sx.MakeString(title)) if role, found := zn.InhMeta.Get(api.KeyRole); found && role != "" { - rb.bindString("role-url", sx.String(wui.NewURLBuilder('h').AppendQuery(api.KeyRole+api.SearchOperatorHas+role).String())) + rb.bindString("role-url", sx.MakeString(wui.NewURLBuilder('h').AppendQuery(api.KeyRole+api.SearchOperatorHas+role).String())) } if folgeRole, found := zn.InhMeta.Get(api.KeyFolgeRole); found && folgeRole != "" { - rb.bindString("folge-role-url", sx.String(wui.NewURLBuilder('h').AppendQuery(api.KeyRole+api.SearchOperatorHas+folgeRole).String())) + rb.bindString("folge-role-url", sx.MakeString(wui.NewURLBuilder('h').AppendQuery(api.KeyRole+api.SearchOperatorHas+folgeRole).String())) } rb.bindString("tag-refs", wui.transformTagSet(api.KeyTags, meta.ListFromValue(zn.InhMeta.GetDefault(api.KeyTags, "")))) rb.bindString("predecessor-refs", wui.identifierSetAsLinks(zn.InhMeta, api.KeyPredecessor, getTextTitle)) rb.bindString("precursor-refs", wui.identifierSetAsLinks(zn.InhMeta, api.KeyPrecursor, getTextTitle)) rb.bindString("superior-refs", wui.identifierSetAsLinks(zn.InhMeta, api.KeySuperior, getTextTitle)) @@ -107,11 +107,11 @@ func metaURLAssoc(m *meta.Meta) *sx.Pair { var result sx.ListBuilder for _, p := range m.PairsRest() { if key := p.Key; strings.HasSuffix(key, meta.SuffixKeyURL) { if val := p.Value; val != "" { - result.Add(sx.Cons(sx.String(capitalizeMetaKey(key)), sx.String(val))) + result.Add(sx.Cons(sx.MakeString(capitalizeMetaKey(key)), sx.MakeString(val))) } } } return result.List() } @@ -149,15 +149,15 @@ zid, err := id.Parse(val) if err != nil { continue } if title, found := getTextTitle(zid); found > 0 { - url := sx.String(wui.NewURLBuilder('h').SetZid(zid.ZettelID()).String()) + url := sx.MakeString(wui.NewURLBuilder('h').SetZid(zid.ZettelID()).String()) if title == "" { - lst = lst.Cons(sx.Cons(sx.String(val), url)) + lst = lst.Cons(sx.Cons(sx.MakeString(val), url)) } else { - lst = lst.Cons(sx.Cons(sx.String(title), url)) + lst = lst.Cons(sx.Cons(sx.MakeString(title), url)) } } } return lst } Index: web/adapter/webui/htmlgen.go ================================================================== --- web/adapter/webui/htmlgen.go +++ web/adapter/webui/htmlgen.go @@ -15,17 +15,17 @@ import ( "net/url" "strings" - "zettelstore.de/client.fossil/api" - "zettelstore.de/client.fossil/attrs" - "zettelstore.de/client.fossil/maps" - "zettelstore.de/client.fossil/shtml" - "zettelstore.de/client.fossil/sz" - "zettelstore.de/sx.fossil" - "zettelstore.de/sx.fossil/sxhtml" + "t73f.de/r/sx" + "t73f.de/r/sxwebs/sxhtml" + "t73f.de/r/zsc/api" + "t73f.de/r/zsc/attrs" + "t73f.de/r/zsc/maps" + "t73f.de/r/zsc/shtml" + "t73f.de/r/zsc/sz" "zettelstore.de/z/ast" "zettelstore.de/z/encoder" "zettelstore.de/z/encoder/szenc" "zettelstore.de/z/strfun" "zettelstore.de/z/zettel/meta" @@ -75,16 +75,16 @@ } href, ok := sx.GetString(hrefP.Cdr()) if !ok { return obj } - zid, fragment, hasFragment := strings.Cut(string(href), "#") + zid, fragment, hasFragment := strings.Cut(href.GetValue(), "#") u := builder.NewURLBuilder('h').SetZid(api.ZettelID(zid)) if hasFragment { u = u.SetFragment(fragment) } - assoc = assoc.Cons(sx.Cons(shtml.SymAttrHref, sx.String(u.String()))) + assoc = assoc.Cons(sx.Cons(shtml.SymAttrHref, sx.MakeString(u.String()))) return rest.Cons(assoc.Cons(sxhtml.SymAttr)).Cons(shtml.SymA) } rebind(th, sz.SymLinkZettel, linkZettel) rebind(th, sz.SymLinkFound, linkZettel) @@ -99,12 +99,12 @@ } href, ok := sx.GetString(hrefP.Cdr()) if !ok { return obj } - u := builder.NewURLBuilder('/').SetRawLocal(string(href)) - assoc = assoc.Cons(sx.Cons(shtml.SymAttrHref, sx.String(u.String()))) + u := builder.NewURLBuilder('/') + assoc = assoc.Cons(sx.Cons(shtml.SymAttrHref, sx.MakeString(u.String()+href.GetValue()[1:]))) return rest.Cons(assoc.Cons(sxhtml.SymAttr)).Cons(shtml.SymA) }) rebind(th, sz.SymLinkQuery, func(obj sx.Object) sx.Object { attr, assoc, rest := findA(obj) if attr == nil { @@ -116,30 +116,30 @@ } href, ok := sx.GetString(hrefP.Cdr()) if !ok { return obj } - ur, err := url.Parse(string(href)) + ur, err := url.Parse(href.GetValue()) if err != nil { return obj } q := ur.Query().Get(api.QueryKeyQuery) if q == "" { return obj } u := builder.NewURLBuilder('h').AppendQuery(q) - assoc = assoc.Cons(sx.Cons(shtml.SymAttrHref, sx.String(u.String()))) + assoc = assoc.Cons(sx.Cons(shtml.SymAttrHref, sx.MakeString(u.String()))) return rest.Cons(assoc.Cons(sxhtml.SymAttr)).Cons(shtml.SymA) }) rebind(th, sz.SymLinkExternal, func(obj sx.Object) sx.Object { attr, assoc, rest := findA(obj) if attr == nil { return obj } - assoc = assoc.Cons(sx.Cons(shtml.SymAttrClass, sx.String("external"))). - Cons(sx.Cons(shtml.SymAttrTarget, sx.String("_blank"))). - Cons(sx.Cons(shtml.SymAttrRel, sx.String("noopener noreferrer"))) + assoc = assoc.Cons(sx.Cons(shtml.SymAttrClass, sx.MakeString("external"))). + Cons(sx.Cons(shtml.SymAttrTarget, sx.MakeString("_blank"))). + Cons(sx.Cons(shtml.SymAttrRel, sx.MakeString("noopener noreferrer"))) return rest.Cons(assoc.Cons(sxhtml.SymAttr)).Cons(shtml.SymA) }) rebind(th, sz.SymEmbed, func(obj sx.Object) sx.Object { pair, isPair := sx.GetPair(obj) if !isPair || !shtml.SymIMG.IsEqual(pair.Car()) { @@ -155,16 +155,16 @@ } src, isString := sx.GetString(srcP.Cdr()) if !isString { return obj } - zid := api.ZettelID(src) + zid := api.ZettelID(src.GetValue()) if !zid.IsValid() { return obj } u := builder.NewURLBuilder('z').SetZid(zid) - imgAttr := attr.Tail().Cons(sx.Cons(shtml.SymAttrSrc, sx.String(u.String()))).Cons(sxhtml.SymAttr) + imgAttr := attr.Tail().Cons(sx.Cons(shtml.SymAttrSrc, sx.MakeString(u.String()))).Cons(sxhtml.SymAttr) return pair.Tail().Tail().Cons(imgAttr).Cons(shtml.SymIMG) }) return &htmlGenerator{ tx: szenc.NewTransformer(), Index: web/adapter/webui/htmlmeta.go ================================================================== --- web/adapter/webui/htmlmeta.go +++ web/adapter/webui/htmlmeta.go @@ -15,14 +15,14 @@ import ( "context" "errors" - "zettelstore.de/client.fossil/api" - "zettelstore.de/client.fossil/shtml" - "zettelstore.de/sx.fossil" - "zettelstore.de/sx.fossil/sxhtml" + "t73f.de/r/sx" + "t73f.de/r/sxwebs/sxhtml" + "t73f.de/r/zsc/api" + "t73f.de/r/zsc/shtml" "zettelstore.de/z/ast" "zettelstore.de/z/box" "zettelstore.de/z/parser" "zettelstore.de/z/usecase" "zettelstore.de/z/zettel/id" @@ -35,48 +35,48 @@ evalMetadata evalMetadataFunc, gen *htmlGenerator, ) sx.Object { switch kt := meta.Type(key); kt { case meta.TypeCredential: - return sx.String(value) + return sx.MakeString(value) case meta.TypeEmpty: - return sx.String(value) + return sx.MakeString(value) case meta.TypeID: return wui.transformIdentifier(value, getTextTitle) case meta.TypeIDSet: return wui.transformIdentifierSet(meta.ListFromValue(value), getTextTitle) case meta.TypeNumber: return wui.transformKeyValueText(key, value, value) case meta.TypeString: - return sx.String(value) + return sx.MakeString(value) case meta.TypeTagSet: return wui.transformTagSet(key, meta.ListFromValue(value)) case meta.TypeTimestamp: if ts, ok := meta.TimeValue(value); ok { return sx.MakeList( sx.MakeSymbol("time"), sx.MakeList( sxhtml.SymAttr, - sx.Cons(sx.MakeSymbol("datetime"), sx.String(ts.Format("2006-01-02T15:04:05"))), + sx.Cons(sx.MakeSymbol("datetime"), sx.MakeString(ts.Format("2006-01-02T15:04:05"))), ), - sx.MakeList(sxhtml.SymNoEscape, sx.String(ts.Format("2006-01-02 15:04:05"))), + sx.MakeList(sxhtml.SymNoEscape, sx.MakeString(ts.Format("2006-01-02 15:04:05"))), ) } return sx.Nil() case meta.TypeURL: - return wui.url2html(sx.String(value)) + return wui.url2html(sx.MakeString(value)) case meta.TypeWord: return wui.transformKeyValueText(key, value, value) case meta.TypeZettelmarkup: return wui.transformZmkMetadata(value, evalMetadata, gen) default: - return sx.MakeList(shtml.SymSTRONG, sx.String("Unhandled type: "), sx.String(kt.Name)) + return sx.MakeList(shtml.SymSTRONG, sx.MakeString("Unhandled type: "), sx.MakeString(kt.Name)) } } func (wui *WebUI) transformIdentifier(val string, getTextTitle getTextTitleFunc) sx.Object { - text := sx.String(val) + text := sx.MakeString(val) zid, err := id.Parse(val) if err != nil { return text } title, found := getTextTitle(zid) @@ -83,14 +83,14 @@ switch { case found > 0: ub := wui.NewURLBuilder('h').SetZid(zid.ZettelID()) attrs := sx.Nil() if title != "" { - attrs = attrs.Cons(sx.Cons(shtml.SymAttrTitle, sx.String(title))) + attrs = attrs.Cons(sx.Cons(shtml.SymAttrTitle, sx.MakeString(title))) } - attrs = attrs.Cons(sx.Cons(shtml.SymAttrHref, sx.String(ub.String()))).Cons(sxhtml.SymAttr) - return sx.Nil().Cons(sx.String(zid.String())).Cons(attrs).Cons(shtml.SymA) + attrs = attrs.Cons(sx.Cons(shtml.SymAttrHref, sx.MakeString(ub.String()))).Cons(sxhtml.SymAttr) + return sx.Nil().Cons(sx.MakeString(zid.String())).Cons(attrs).Cons(shtml.SymA) case found == 0: return sx.MakeList(sx.MakeSymbol("s"), text) default: // case found < 0: return text } @@ -98,11 +98,11 @@ func (wui *WebUI) transformIdentifierSet(vals []string, getTextTitle getTextTitleFunc) *sx.Pair { if len(vals) == 0 { return nil } - const space = sx.String(" ") + var space = sx.MakeString(" ") text := make(sx.Vector, 0, 2*len(vals)) for _, val := range vals { text = append(text, space, wui.transformIdentifier(val, getTextTitle)) } return sx.MakeList(text[1:]...).Cons(shtml.SymSPAN) @@ -110,11 +110,11 @@ func (wui *WebUI) transformTagSet(key string, tags []string) *sx.Pair { if len(tags) == 0 { return nil } - const space = sx.String(" ") + var space = sx.MakeString(" ") text := make(sx.Vector, 0, 2*len(tags)+2) for _, tag := range tags { text = append(text, space, wui.transformKeyValueText(key, tag, tag)) } if len(tags) > 1 { @@ -139,13 +139,13 @@ func buildHref(ub *api.URLBuilder, text string) *sx.Pair { return sx.MakeList( shtml.SymA, sx.MakeList( sxhtml.SymAttr, - sx.Cons(shtml.SymAttrHref, sx.String(ub.String())), + sx.Cons(shtml.SymAttrHref, sx.MakeString(ub.String())), ), - sx.String(text), + sx.MakeString(text), ) } type evalMetadataFunc = func(string) ast.InlineSlice Index: web/adapter/webui/lists.go ================================================================== --- web/adapter/webui/lists.go +++ web/adapter/webui/lists.go @@ -20,14 +20,14 @@ "net/url" "slices" "strconv" "strings" - "zettelstore.de/client.fossil/api" - "zettelstore.de/client.fossil/shtml" - "zettelstore.de/sx.fossil" - "zettelstore.de/sx.fossil/sxhtml" + "t73f.de/r/sx" + "t73f.de/r/sxwebs/sxhtml" + "t73f.de/r/zsc/api" + "t73f.de/r/zsc/shtml" "zettelstore.de/z/ast" "zettelstore.de/z/encoding/atom" "zettelstore.de/z/encoding/rss" "zettelstore.de/z/encoding/xml" "zettelstore.de/z/evaluator" @@ -96,17 +96,17 @@ env, rb := wui.createRenderEnv( ctx, "list", wui.rtConfig.Get(ctx, nil, api.KeyLang), wui.rtConfig.GetSiteName(), user) if q == nil { - rb.bindString("heading", sx.String(wui.rtConfig.GetSiteName())) + rb.bindString("heading", sx.MakeString(wui.rtConfig.GetSiteName())) } else { var sb strings.Builder q.PrintHuman(&sb) - rb.bindString("heading", sx.String(sb.String())) + rb.bindString("heading", sx.MakeString(sb.String())) } - rb.bindString("query-value", sx.String(q.String())) + rb.bindString("query-value", sx.MakeString(q.String())) if tzl := q.GetMetaValues(api.KeyTags, false); len(tzl) > 0 { sxTzl, sxNoTzl := wui.transformTagZettelList(ctx, tagZettel, tzl) if !sx.IsNil(sxTzl) { rb.bindString("tag-zettel", sxTzl) } @@ -133,14 +133,14 @@ apiURL = apiURL.AppendKVQuery(api.QueryKeySeed, strconv.Itoa(seed)) } else { seed = 0 } if len(metaSeq) > 0 { - rb.bindString("plain-url", sx.String(apiURL.String())) - rb.bindString("data-url", sx.String(apiURL.AppendKVQuery(api.QueryKeyEncoding, api.EncodingData).String())) + rb.bindString("plain-url", sx.MakeString(apiURL.String())) + rb.bindString("data-url", sx.MakeString(apiURL.AppendKVQuery(api.QueryKeyEncoding, api.EncodingData).String())) if wui.canCreate(ctx, user) { - rb.bindString("create-url", sx.String(wui.createNewURL)) + rb.bindString("create-url", sx.MakeString(wui.createNewURL)) rb.bindString("seed", sx.Int64(seed)) } } if rb.err == nil { err = wui.renderSxnTemplate(ctx, w, id.ListTemplateZid, env) @@ -185,16 +185,16 @@ func (wui *WebUI) prependZettelLink(sxZtl *sx.Pair, name string, u *api.URLBuilder) *sx.Pair { link := sx.MakeList( shtml.SymA, sx.MakeList( sxhtml.SymAttr, - sx.Cons(shtml.SymAttrHref, sx.String(u.String())), + sx.Cons(shtml.SymAttrHref, sx.MakeString(u.String())), ), - sx.String(name), + sx.MakeString(name), ) if sxZtl != nil { - sxZtl = sxZtl.Cons(sx.String(", ")) + sxZtl = sxZtl.Cons(sx.MakeString(", ")) } return sxZtl.Cons(link) } func (wui *WebUI) renderRSS(ctx context.Context, w http.ResponseWriter, q *query.Query, ml []*meta.Meta) { Index: web/adapter/webui/login.go ================================================================== --- web/adapter/webui/login.go +++ web/adapter/webui/login.go @@ -15,12 +15,12 @@ import ( "context" "net/http" - "zettelstore.de/client.fossil/api" - "zettelstore.de/sx.fossil" + "t73f.de/r/sx" + "t73f.de/r/zsc/api" "zettelstore.de/z/auth" "zettelstore.de/z/usecase" "zettelstore.de/z/web/adapter" "zettelstore.de/z/zettel/id" ) Index: web/adapter/webui/rename_zettel.go ================================================================== --- web/adapter/webui/rename_zettel.go +++ web/adapter/webui/rename_zettel.go @@ -16,11 +16,11 @@ import ( "fmt" "net/http" "strings" - "zettelstore.de/client.fossil/api" + "t73f.de/r/zsc/api" "zettelstore.de/z/box" "zettelstore.de/z/usecase" "zettelstore.de/z/web/adapter" "zettelstore.de/z/web/server" "zettelstore.de/z/zettel/id" Index: web/adapter/webui/response.go ================================================================== --- web/adapter/webui/response.go +++ web/adapter/webui/response.go @@ -14,11 +14,11 @@ package webui import ( "net/http" - "zettelstore.de/client.fossil/api" + "t73f.de/r/zsc/api" ) func (wui *WebUI) redirectFound(w http.ResponseWriter, r *http.Request, ub *api.URLBuilder) { us := ub.String() wui.log.Debug().Str("uri", us).Msg("redirect") Index: web/adapter/webui/sxn_code.go ================================================================== --- web/adapter/webui/sxn_code.go +++ web/adapter/webui/sxn_code.go @@ -16,12 +16,12 @@ import ( "context" "fmt" "io" - "zettelstore.de/client.fossil/api" - "zettelstore.de/sx.fossil/sxeval" + "t73f.de/r/sx/sxeval" + "t73f.de/r/zsc/api" "zettelstore.de/z/zettel/id" "zettelstore.de/z/zettel/meta" ) func (wui *WebUI) loadAllSxnCodeZettel(ctx context.Context) (id.Digraph, *sxeval.Binding, error) { Index: web/adapter/webui/template.go ================================================================== --- web/adapter/webui/template.go +++ web/adapter/webui/template.go @@ -18,17 +18,17 @@ "context" "fmt" "net/http" "net/url" - "zettelstore.de/client.fossil/api" - "zettelstore.de/client.fossil/shtml" - "zettelstore.de/sx.fossil" - "zettelstore.de/sx.fossil/sxbuiltins" - "zettelstore.de/sx.fossil/sxeval" - "zettelstore.de/sx.fossil/sxhtml" - "zettelstore.de/sx.fossil/sxreader" + "t73f.de/r/sx" + "t73f.de/r/sx/sxbuiltins" + "t73f.de/r/sx/sxeval" + "t73f.de/r/sx/sxreader" + "t73f.de/r/sxwebs/sxhtml" + "t73f.de/r/zsc/api" + "t73f.de/r/zsc/shtml" "zettelstore.de/z/box" "zettelstore.de/z/collect" "zettelstore.de/z/config" "zettelstore.de/z/parser" "zettelstore.de/z/web/adapter" @@ -44,17 +44,19 @@ root.BindSpecial(syntax) } for _, b := range builtins { root.BindBuiltin(b) } + _ = root.Bind(sx.MakeSymbol("NIL"), sx.Nil()) + _ = root.Bind(sx.MakeSymbol("T"), sx.MakeSymbol("T")) root.BindBuiltin(&sxeval.Builtin{ Name: "url-to-html", MinArity: 1, MaxArity: 1, TestPure: sxeval.AssertPure, - Fn: func(_ *sxeval.Environment, args sx.Vector) (sx.Object, error) { - text, err := sxbuiltins.GetString(args, 0) + Fn1: func(_ *sxeval.Environment, arg sx.Object) (sx.Object, error) { + text, err := sxbuiltins.GetString(arg, 0) if err != nil { return nil, err } return wui.url2html(text), nil }, @@ -62,35 +64,35 @@ root.BindBuiltin(&sxeval.Builtin{ Name: "zid-content-path", MinArity: 1, MaxArity: 1, TestPure: sxeval.AssertPure, - Fn: func(_ *sxeval.Environment, args sx.Vector) (sx.Object, error) { - s, err := sxbuiltins.GetString(args, 0) + Fn1: func(_ *sxeval.Environment, arg sx.Object) (sx.Object, error) { + s, err := sxbuiltins.GetString(arg, 0) if err != nil { return nil, err } - zid, err := id.Parse(string(s)) + zid, err := id.Parse(s.GetValue()) if err != nil { - return nil, fmt.Errorf("parsing zettel identifier %q: %w", s, err) + return nil, fmt.Errorf("parsing zettel identifier %q: %w", s.GetValue(), err) } ub := wui.NewURLBuilder('z').SetZid(zid.ZettelID()) - return sx.String(ub.String()), nil + return sx.MakeString(ub.String()), nil }, }) root.BindBuiltin(&sxeval.Builtin{ Name: "query->url", MinArity: 1, MaxArity: 1, TestPure: sxeval.AssertPure, - Fn: func(_ *sxeval.Environment, args sx.Vector) (sx.Object, error) { - qs, err := sxbuiltins.GetString(args, 0) + Fn1: func(_ *sxeval.Environment, arg sx.Object) (sx.Object, error) { + qs, err := sxbuiltins.GetString(arg, 0) if err != nil { return nil, err } - u := wui.NewURLBuilder('h').AppendQuery(string(qs)) - return sx.String(u.String()), nil + u := wui.NewURLBuilder('h').AppendQuery(qs.GetValue()) + return sx.MakeString(u.String()), nil }, }) root.Freeze() return root } @@ -97,16 +99,17 @@ var ( specials = []*sxeval.Special{ &sxbuiltins.QuoteS, &sxbuiltins.QuasiquoteS, // quote, quasiquote &sxbuiltins.UnquoteS, &sxbuiltins.UnquoteSplicingS, // unquote, unquote-splicing - &sxbuiltins.DefVarS, &sxbuiltins.DefConstS, // defvar, defconst + &sxbuiltins.DefVarS, // defvar &sxbuiltins.DefunS, &sxbuiltins.LambdaS, // defun, lambda &sxbuiltins.SetXS, // set! &sxbuiltins.IfS, // if &sxbuiltins.BeginS, // begin &sxbuiltins.DefMacroS, // defmacro + &sxbuiltins.LetS, // let } builtins = []*sxeval.Builtin{ &sxbuiltins.Equal, // = &sxbuiltins.NumGreater, // > &sxbuiltins.NullP, // null? @@ -127,19 +130,19 @@ &sxbuiltins.BindingLookup, // binding-lookup } ) func (wui *WebUI) url2html(text sx.String) sx.Object { - if u, errURL := url.Parse(string(text)); errURL == nil { + if u, errURL := url.Parse(text.GetValue()); errURL == nil { if us := u.String(); us != "" { return sx.MakeList( shtml.SymA, sx.MakeList( sxhtml.SymAttr, - sx.Cons(shtml.SymAttrHref, sx.String(us)), - sx.Cons(shtml.SymAttrTarget, sx.String("_blank")), - sx.Cons(shtml.SymAttrRel, sx.String("noopener noreferrer")), + sx.Cons(shtml.SymAttrHref, sx.MakeString(us)), + sx.Cons(shtml.SymAttrTarget, sx.MakeString("_blank")), + sx.Cons(shtml.SymAttrRel, sx.MakeString("noopener noreferrer")), ), text) } } return text @@ -165,31 +168,31 @@ func (wui *WebUI) createRenderEnv(ctx context.Context, name, lang, title string, user *meta.Meta) (*sxeval.Binding, renderBinder) { userIsValid, userZettelURL, userIdent := wui.getUserRenderData(user) parentEnv, err := wui.getParentEnv(ctx) bind := parentEnv.MakeChildBinding(name, 128) rb := makeRenderBinder(bind, err) - rb.bindString("lang", sx.String(lang)) - rb.bindString("css-base-url", sx.String(wui.cssBaseURL)) - rb.bindString("css-user-url", sx.String(wui.cssUserURL)) - rb.bindString("title", sx.String(title)) - rb.bindString("home-url", sx.String(wui.homeURL)) + rb.bindString("lang", sx.MakeString(lang)) + rb.bindString("css-base-url", sx.MakeString(wui.cssBaseURL)) + rb.bindString("css-user-url", sx.MakeString(wui.cssUserURL)) + rb.bindString("title", sx.MakeString(title)) + rb.bindString("home-url", sx.MakeString(wui.homeURL)) rb.bindString("with-auth", sx.MakeBoolean(wui.withAuth)) rb.bindString("user-is-valid", sx.MakeBoolean(userIsValid)) - rb.bindString("user-zettel-url", sx.String(userZettelURL)) - rb.bindString("user-ident", sx.String(userIdent)) - rb.bindString("login-url", sx.String(wui.loginURL)) - rb.bindString("logout-url", sx.String(wui.logoutURL)) - rb.bindString("list-zettel-url", sx.String(wui.listZettelURL)) - rb.bindString("list-roles-url", sx.String(wui.listRolesURL)) - rb.bindString("list-tags-url", sx.String(wui.listTagsURL)) + rb.bindString("user-zettel-url", sx.MakeString(userZettelURL)) + rb.bindString("user-ident", sx.MakeString(userIdent)) + rb.bindString("login-url", sx.MakeString(wui.loginURL)) + rb.bindString("logout-url", sx.MakeString(wui.logoutURL)) + rb.bindString("list-zettel-url", sx.MakeString(wui.listZettelURL)) + rb.bindString("list-roles-url", sx.MakeString(wui.listRolesURL)) + rb.bindString("list-tags-url", sx.MakeString(wui.listTagsURL)) if wui.canRefresh(user) { - rb.bindString("refresh-url", sx.String(wui.refreshURL)) + rb.bindString("refresh-url", sx.MakeString(wui.refreshURL)) } rb.bindString("new-zettel-links", wui.fetchNewTemplatesSxn(ctx, user)) - rb.bindString("search-url", sx.String(wui.searchURL)) - rb.bindString("query-key-query", sx.String(api.QueryKeyQuery)) - rb.bindString("query-key-seed", sx.String(api.QueryKeySeed)) + rb.bindString("search-url", sx.MakeString(wui.searchURL)) + rb.bindString("query-key-query", sx.MakeString(api.QueryKeyQuery)) + rb.bindString("query-key-seed", sx.MakeString(api.QueryKeySeed)) rb.bindString("FOOTER", wui.calculateFooterSxn(ctx)) // TODO: use real footer rb.bindString("debug-mode", sx.MakeBoolean(wui.debug)) rb.bindSymbol(symMetaHeader, sx.Nil()) rb.bindSymbol(symDetail, sx.Nil()) return bind, rb @@ -219,11 +222,11 @@ if rb.err == nil { rb.err = rb.binding.Bind(sym, obj) } } func (rb *renderBinder) bindKeyValue(key string, value string) { - rb.bindString("meta-"+key, sx.String(value)) + rb.bindString("meta-"+key, sx.MakeString(value)) if kt := meta.Type(key); kt.IsSet { rb.bindString("set-meta-"+key, makeStringList(meta.ListFromValue(value))) } } func (rb *renderBinder) rebindResolved(key, defKey string) { @@ -237,39 +240,39 @@ func (wui *WebUI) bindCommonZettelData(ctx context.Context, rb *renderBinder, user, m *meta.Meta, content *zettel.Content) { strZid := m.Zid.String() apiZid := api.ZettelID(strZid) newURLBuilder := wui.NewURLBuilder - rb.bindString("zid", sx.String(strZid)) - rb.bindString("web-url", sx.String(newURLBuilder('h').SetZid(apiZid).String())) + rb.bindString("zid", sx.MakeString(strZid)) + rb.bindString("web-url", sx.MakeString(newURLBuilder('h').SetZid(apiZid).String())) if content != nil && wui.canWrite(ctx, user, m, *content) { - rb.bindString("edit-url", sx.String(newURLBuilder('e').SetZid(apiZid).String())) + rb.bindString("edit-url", sx.MakeString(newURLBuilder('e').SetZid(apiZid).String())) } - rb.bindString("info-url", sx.String(newURLBuilder('i').SetZid(apiZid).String())) + rb.bindString("info-url", sx.MakeString(newURLBuilder('i').SetZid(apiZid).String())) if wui.canCreate(ctx, user) { if content != nil && !content.IsBinary() { - rb.bindString("copy-url", sx.String(newURLBuilder('c').SetZid(apiZid).AppendKVQuery(queryKeyAction, valueActionCopy).String())) + rb.bindString("copy-url", sx.MakeString(newURLBuilder('c').SetZid(apiZid).AppendKVQuery(queryKeyAction, valueActionCopy).String())) } - rb.bindString("version-url", sx.String(newURLBuilder('c').SetZid(apiZid).AppendKVQuery(queryKeyAction, valueActionVersion).String())) - rb.bindString("child-url", sx.String(newURLBuilder('c').SetZid(apiZid).AppendKVQuery(queryKeyAction, valueActionChild).String())) - rb.bindString("folge-url", sx.String(newURLBuilder('c').SetZid(apiZid).AppendKVQuery(queryKeyAction, valueActionFolge).String())) + rb.bindString("version-url", sx.MakeString(newURLBuilder('c').SetZid(apiZid).AppendKVQuery(queryKeyAction, valueActionVersion).String())) + rb.bindString("child-url", sx.MakeString(newURLBuilder('c').SetZid(apiZid).AppendKVQuery(queryKeyAction, valueActionChild).String())) + rb.bindString("folge-url", sx.MakeString(newURLBuilder('c').SetZid(apiZid).AppendKVQuery(queryKeyAction, valueActionFolge).String())) } if wui.canRename(ctx, user, m) { - rb.bindString("rename-url", sx.String(newURLBuilder('b').SetZid(apiZid).String())) + rb.bindString("rename-url", sx.MakeString(newURLBuilder('b').SetZid(apiZid).String())) } if wui.canDelete(ctx, user, m) { - rb.bindString("delete-url", sx.String(newURLBuilder('d').SetZid(apiZid).String())) + rb.bindString("delete-url", sx.MakeString(newURLBuilder('d').SetZid(apiZid).String())) } if val, found := m.Get(api.KeyUselessFiles); found { - rb.bindString("useless", sx.Cons(sx.String(val), nil)) + rb.bindString("useless", sx.Cons(sx.MakeString(val), nil)) } queryContext := strZid + " " + api.ContextDirective - rb.bindString("context-url", sx.String(newURLBuilder('h').AppendQuery(queryContext).String())) + rb.bindString("context-url", sx.MakeString(newURLBuilder('h').AppendQuery(queryContext).String())) queryContext += " " + api.FullDirective - rb.bindString("context-full-url", sx.String(newURLBuilder('h').AppendQuery(queryContext).String())) + rb.bindString("context-full-url", sx.MakeString(newURLBuilder('h').AppendQuery(queryContext).String())) if wui.canRefresh(user) { - rb.bindString("reindex-url", sx.String(newURLBuilder('h').AppendQuery( + rb.bindString("reindex-url", sx.MakeString(newURLBuilder('h').AppendQuery( strZid+" "+api.IdentDirective+api.ActionSeparator+api.ReIndexAction).String())) } // Ensure to have title, role, tags, and syntax included as "meta-*" rb.bindKeyValue(api.KeyTitle, m.GetDefault(api.KeyTitle, "")) @@ -277,11 +280,11 @@ rb.bindKeyValue(api.KeyTags, m.GetDefault(api.KeyTags, "")) rb.bindKeyValue(api.KeySyntax, m.GetDefault(api.KeySyntax, meta.DefaultSyntax)) var metaPairs sx.ListBuilder for _, p := range m.ComputedPairs() { key, value := p.Key, p.Value - metaPairs.Add(sx.Cons(sx.String(key), sx.String(value))) + metaPairs.Add(sx.Cons(sx.MakeString(key), sx.MakeString(value))) rb.bindKeyValue(key, value) } rb.bindString("metapairs", metaPairs.List()) } @@ -305,12 +308,12 @@ continue } if !wui.policy.CanRead(user, z.Meta) { continue } - text := sx.String(parser.NormalizedSpacedText(z.Meta.GetTitle())) - link := sx.String(wui.NewURLBuilder('c').SetZid(zid.ZettelID()). + text := sx.MakeString(parser.NormalizedSpacedText(z.Meta.GetTitle())) + link := sx.MakeString(wui.NewURLBuilder('c').SetZid(zid.ZettelID()). AppendKVQuery(queryKeyAction, valueActionNew).String()) lst = lst.Cons(sx.Cons(text, link)) } return lst @@ -393,11 +396,11 @@ if msg := wui.log.Debug(); msg != nil { // pageObj.String() can be expensive to calculate. msg.Str("page", pageObj.String()).Msg("render") } - gen := sxhtml.NewGenerator(sxhtml.WithNewline) + gen := sxhtml.NewGenerator().SetNewline() var sb bytes.Buffer _, err = gen.WriteHTML(&sb, pageObj) if err != nil { return err } @@ -415,12 +418,12 @@ } else { wui.log.Debug().Err(err).Msg("reportError") } user := server.GetUser(ctx) env, rb := wui.createRenderEnv(ctx, "error", api.ValueLangEN, "Error", user) - rb.bindString("heading", sx.String(http.StatusText(code))) - rb.bindString("message", sx.String(text)) + rb.bindString("heading", sx.MakeString(http.StatusText(code))) + rb.bindString("message", sx.MakeString(text)) if rb.err == nil { rb.err = wui.renderSxnTemplateStatus(ctx, w, code, id.ErrorTemplateZid, env) } errSx := rb.err if errSx == nil { @@ -446,9 +449,9 @@ if len(sl) == 0 { return nil } result := sx.Nil() for i := len(sl) - 1; i >= 0; i-- { - result = result.Cons(sx.String(sl[i])) + result = result.Cons(sx.MakeString(sl[i])) } return result } Index: web/adapter/webui/webui.go ================================================================== --- web/adapter/webui/webui.go +++ web/adapter/webui/webui.go @@ -18,14 +18,14 @@ "context" "net/http" "sync" "time" - "zettelstore.de/client.fossil/api" - "zettelstore.de/sx.fossil" - "zettelstore.de/sx.fossil/sxeval" - "zettelstore.de/sx.fossil/sxhtml" + "t73f.de/r/sx" + "t73f.de/r/sx/sxeval" + "t73f.de/r/sxwebs/sxhtml" + "t73f.de/r/zsc/api" "zettelstore.de/z/auth" "zettelstore.de/z/box" "zettelstore.de/z/config" "zettelstore.de/z/kernel" "zettelstore.de/z/logger" @@ -118,11 +118,11 @@ logoutURL: loginoutBase.AppendKVQuery("logout", "").String(), searchURL: ab.NewURLBuilder('h').String(), createNewURL: ab.NewURLBuilder('c').String(), zettelBinding: nil, - genHTML: sxhtml.NewGenerator(sxhtml.WithNewline), + genHTML: sxhtml.NewGenerator().SetNewline(), } wui.rootBinding = wui.createRenderBinding() wui.observe(box.UpdateInfo{Box: mgr, Reason: box.OnReload, Zid: id.Invalid}) mgr.RegisterObserver(wui.observe) return wui Index: web/content/content.go ================================================================== --- web/content/content.go +++ web/content/content.go @@ -17,11 +17,11 @@ import ( "mime" "net/http" - "zettelstore.de/client.fossil/api" + "t73f.de/r/zsc/api" "zettelstore.de/z/zettel" "zettelstore.de/z/zettel/meta" ) const ( Index: web/server/impl/impl.go ================================================================== --- web/server/impl/impl.go +++ web/server/impl/impl.go @@ -17,11 +17,11 @@ import ( "context" "net/http" "time" - "zettelstore.de/client.fossil/api" + "t73f.de/r/zsc/api" "zettelstore.de/z/auth" "zettelstore.de/z/logger" "zettelstore.de/z/web/server" "zettelstore.de/z/zettel/meta" ) Index: web/server/impl/router.go ================================================================== --- web/server/impl/router.go +++ web/server/impl/router.go @@ -17,11 +17,11 @@ "io" "net/http" "regexp" "strings" - "zettelstore.de/client.fossil/api" + "t73f.de/r/zsc/api" "zettelstore.de/z/auth" "zettelstore.de/z/kernel" "zettelstore.de/z/logger" "zettelstore.de/z/web/server" ) Index: web/server/server.go ================================================================== --- web/server/server.go +++ web/server/server.go @@ -17,11 +17,11 @@ import ( "context" "net/http" "time" - "zettelstore.de/client.fossil/api" + "t73f.de/r/zsc/api" "zettelstore.de/z/zettel/id" "zettelstore.de/z/zettel/meta" ) // UserRetriever allows to retrieve user data based on a given zettel identifier. Index: www/build.md ================================================================== --- www/build.md +++ www/build.md @@ -69,28 +69,26 @@ Zettelstore accessible at the given URL (default: http://localhost:23123). * `go run tools/testapi/testapi.go` tests the API against a running Zettelstore, which is started automatically. ## A note on the use of Fossil -Zettelstore is managed by the Fossil version control system. -Fossil is an alternative to the ubiquitous Git version control system. -However, Go seems to prefer Git and popular platforms that just support Git. +Zettelstore is managed by the Fossil version control system. Fossil is an +alternative to the ubiquitous Git version control system. However, Go seems to +prefer Git and popular platforms that just support Git. Some dependencies of Zettelstore, namely [Zettelstore -client](https://zettelstore.de/client) and [sx](https://zettelstore.de/sx), are -also managed by Fossil. -Depending on your development setup, some error messages might occur. +client](https://t73f.de/r/zsc) and [Sx](https://t73f.de/r/sx), are also +managed by Fossil. Depending on your development setup, some error messages +might occur. If the error message mentions an environment variable called `GOVCS` you should set it to the value `GOVCS=zettelstore.de:fossil` (alternatively more generous -to `GOVCS=*:all`). -Since the Go build system is coupled with Git and some special platforms, you -allow ot to download a Fossil repository from the host `zettelstore.de`. -The build tool set `GOVCS` to the right value, but you may use other `go` -commands that try to download a Fossil repository. +to `GOVCS=*:all`). Since the Go build system is coupled with Git and some +special platforms, you allow ot to download a Fossil repository from the host +`zettelstore.de`. The build tool set `GOVCS` to the right value, but you may +use other `go` commands that try to download a Fossil repository. On some operating systems, namely Termux on Android, an error message might -state that an user cannot be determined (`cannot determine user`). -In this case, Fossil is allowed to download the repository, but cannot -associate it with an user name. -Set the environment variable `USER` to any user name, like: +state that an user cannot be determined (`cannot determine user`). In this +case, Fossil is allowed to download the repository, but cannot associate it +with an user name. Set the environment variable `USER` to any user name, like: `USER=nobody go run tools/build.go build`. Index: www/changes.wiki ================================================================== --- www/changes.wiki +++ www/changes.wiki @@ -1,9 +1,25 @@ Change Log

Changes for Version 0.18.0 (pending)

+ * Remove Sx macro defunconst. Use defun instead. + (breaking: webui) + * New zettel are now created with the permission for others to read/write + them. This is important especially for Unix-like systems. If you want the + previous behaviour, set umask accordingly, for example + umask 066. + (major: dirbox) + * Update Sx prelude: make macros more robust / more general. This might + break your code in the future. + (minor: webui) + * Add computed zettel “Zettelstore Memory” with zettel + identifier 00000000000008. It shows some statistics about + memory usage. + (minor: webui) + * Zettelstore client is now Go package t73f.de/r/zsc. + (minor)

Changes for Version 0.17.0 (2024-03-04)

* Context search operates only on explicit references. Add the directive FULL to follow zettel tags additionally. @@ -66,11 +82,11 @@ (major: api, webui) * Present user the option to create a (missing) role zettel (in list view). Results in a new predefined zettel with identifier 00000000090004, which is a template for new role zettel. (minor: webui) - * Timestamp values can be abbrevated by omitting most of its components. + * Timestamp values can be abbreviated by omitting most of its components. Previously, such values that are not in the format YYYYMMDDhhmmss were ignored. Now the following formats are also allowed: YYYY, YYYYMM, YYYYMMDD, YYYYMMDDhh, YYYYMMDDhhmm. Querying and sorting work accordingly. Previously, only a sequences of zeroes were appended, resulting in illegal timestamps, e.g. for YYYY or YYYYMM. @@ -114,11 +130,11 @@ its build date (metadata key created) and version (in the zettel content) (minor) * If an error page cannot be created due to template errors (or similar), a plain text error page is delivered instead. It shows the original error - and the error that occured durng rendering the original error page. + and the error that occurred during rendering the original error page. (minor: webui) * Some smaller bug fixes and improvements, to the software and to the documentation. @@ -274,11 +290,11 @@ (breaking) * Title of a zettel is no longer interpreted as Zettelmarkup text. Now it is just a plain string, possibly empty. Therefore, no inline formatting (like bold text), no links, no footnotes, no citations (the latter made rendering the title often questionable, in some contexts). If you used - special entities, please use the unicode characters directly. However, as + special entities, please use the Unicode characters directly. However, as a good practice, it is often the best to printable ASCII characters. (breaking) * Remove runtime configuration marker-external. It was added in version [#0_0_6|0.0.6] and updated in [#0_0_10|0.0.10]. If you want to change the marker for an external URL, you could modify zettel @@ -352,15 +368,15 @@ similar). (minor: api, webui) * Interpret zettel files with extension .webp as an binary image file format. (minor) - * Allow to specify service specific log level via statup configuration and + * Allow to specify service specific log level via startup configuration and via command line. (minor) * Allow to specify a zettel to serve footer content via runtime - comfiguration footer-zettel. Can be overwritten by user + configuration footer-zettel. Can be overwritten by user zettel. (minor: webui) * Footer data is automatically separated by a thematic break / horizontal rule. If you do not like it, you have to update the base template. (minor: webui) @@ -377,11 +393,11 @@ * In the next version 0.10.0, the API endpoints for a zettel (/j, /p, /v) will be merged with endpoint /z. Basically, the previous endpoint will be refactored as query parameter of endpoint /z. To reduce errors, there will be no version, where the previous endpoint are still - available and the new funnctionality is still there. This is a warning to + available and the new functionality is still there. This is a warning to prepare for some breaking changes in v0.10.0. This also affects the API client implementation. (warning: api) * Some smaller bug fixes and improvements, to the software and to the documentation. @@ -483,11 +499,11 @@ results. (minor: api, webui) * Add support for an asset directory, accessible via URL prefix /assests/. (minor: server) - * Add support for metadata key created, a timestamp when the + * Add support for metadata key created, a time stamp when the zettel was created. Since key published is now either created or modified, it will now always contains a valid time stamp. (minor) * Add support for metadata key author. It will be displayed on @@ -500,11 +516,11 @@ query actions. (minor: webui) * Tags within zettel content are deprecated in version 0.8. This affects the computed metadata keys content-tags and all-tags. They will be removed. The number sign of a content - tag introduces unintended tags, esp. in the english language; content tags + tag introduces unintended tags, esp. in the English language; content tags may occur within links → links within links, when rendered as HTML; content tags may occur in the title of a zettel; naming of content tags, zettel tags, and their union is confusing for many. Migration: use zettel tags or replace content tag with a search. (deprecated: zettelmarkup) @@ -527,11 +543,11 @@

Changes for Version 0.6.0 (2022-08-11)

* Translating of "..." into horizontal ellipsis is no longer supported. Use &hellip; instead. (breaking: zettelmarkup) * Allow to specify search expressions, which allow to specify search - criterias by using a simple syntax. Can be specified in WebUI's search box + criteria by using a simple syntax. Can be specified in WebUI's search box and via the API by using query parameter "_s". (major: api, webui) * A link reference is allowed to be a search expression. The WebUI will render this as a link to a list of zettel that satisfy the search expression. @@ -545,11 +561,11 @@ * When evaluating a zettel, ignore transclusions if current user is not allowed to read transcluded zettel. (minor) * Added a small tutorial for Zettelmarkup. (minor: manual) - * Using URL query parameter to search for metdata values, specify an + * Using URL query parameter to search for metadata values, specify an ordering, an offset, and a limit for the resulting list, will be removed in version 0.7. Replace these with the more useable search expressions. Please be aware that the = search operator is also deprecated. It was only introduced to help the migration. (deprecated: api, webui) @@ -607,11 +623,11 @@ * A zettel can be saved while creating / editing it. There is no need to manually re-edit it by using the 'e' endpoint. (minor: webui) * Zettel role and zettel syntax are backed by a HTML5 data list element which lists supported and used values to help to enter a valid value. - (mirnor: webui) + (minor: webui) * Allow to use startup configuration, even if started in simple mode. (minor) * Log authentication issues in level "sense"; add caller IP address to some web server log messages. (minor: web server) @@ -628,12 +644,12 @@ (breaking: api; minor: webui) * Remove inline quotation syntax <<...<<. Now, ""..."" generates the equivalent code. Typographical quotes are generated by the browser, not by Zettelstore. (breaking: Zettelmarkup) - * Remove inline formatting for monospace. Its syntax is now used by the - similar syntax element of literal computer input. Monospace was just + * Remove inline formatting for mono space. Its syntax is now used by the + similar syntax element of literal computer input. Mono space was just a visual element with no semantic association. Now, the syntax ++...++ is obsolete. (breaking: Zettelmarkup). * Remove API call to parse Zettelmarkup texts and encode it as text and HTML. Was call “POST /v”. It was needed to separately encode @@ -662,11 +678,11 @@ selected zettel. It was introduced in v0.0.11, but disallows some future optimizations for searching zettel. (minor: api, webui) * Make some metadata-based searches a little bit faster by executing a (in-memory-based) full-text search first. Now only those zettel are - loaded from file that contain the metdata value. + loaded from file that contain the metadata value. (minor: api, webui) * Add an API call to retrieve the version of the Zettelstore. (minor: api) * Limit the amount of zettel and bytes to be stored in a memory box. Allows to use it with public access. @@ -678,11 +694,11 @@ documentation.

Changes for Version 0.3 (2022-02-09)

* Zettel files with extension .meta are now treated as content - files. Previoulsy, they were interpreted as metadata files. The + files. Previously, they were interpreted as metadata files. The interpretation as metadata files was deprecated in version 0.2. (breaking: directory and file/zip box) * Add syntax “draw” to produce some graphical representations. (major) * Add Zettelmarkup syntax to specify full transclusion of other zettel. @@ -751,19 +767,19 @@ syntaxes. (minor) * Add API call to check for enabled authentication. (minor: api) * Renewing an API access token works even if authentication is not enabled. - This corresponds to the behaviour of optaining an access token. + This corresponds to the behaviour of obtaining an access token. (minor: api) * If there is nothing to return, use HTTP status code 204, instead of 200 + Content-Length: 0. (minor: api) * Metadata key duplicates stores the duplicate file names, instead of just a boolean value that there were duplicate file names. (minor) - * Document autostarting Zettelstore on Windows, macOS, and Linux. + * Document auto starting Zettelstore on Windows, macOS, and Linux. (minor) * Many smaller bug fixes and improvements, to the software and to the documentation. @@ -786,18 +802,17 @@ may help with the transition (/v/{ZettelID}?_part=zettel&_enc=zmk, on the Info page of each zettel in the WebUI). Additionally, all deprecated uses of // will be rendered with a dashed box within the WebUI. (breaking: Zettelmarkup). - * API client software is now a [https://zettelstore.de/client/|separate] - project. + * API client software is now a separate project. (breaking) * Initial support for HTTP security headers (Content-Security-Policy, Permissions-Policy, Referrer-Policy, X-Content-Type-Options, X-Frame-Options). Header values are currently some constant values. (possibly breaking: api, webui) - * Remove visual Zettelmarkup (bold, striketrough). Semantic Zettelmarkup + * Remove visual Zettelmarkup (bold, strike through). Semantic Zettelmarkup (strong, delete) is still allowed and replaces the visual elements syntactically. The visual appearance should not change (depends on your changes / additions to CSS zettel). (possibly breaking: Zettelmarkup). * Add API endpoint POST /v to retrieve HTMl and text encoded @@ -860,11 +875,11 @@ files, your tag values remain unchanged. (major; breaking) * Endpoint /z/{ID} allows the same methods as endpoint /j/{ID}: GET retrieves zettel (see above), PUT updates a zettel, DELETE deletes a zettel, - MOVE renames a zettel. In addtion, POST /z will + MOVE renames a zettel. In addition, POST /z will create a new zettel. When zettel data must be given, the format is plain text, with metadata separated from content by an empty line. See documentation for more details. (major: api (plus WebUI for some details)) * Allows to transclude / expand the content of another zettel into a target @@ -917,13 +932,13 @@ create new zettel (except user zettel). This role may only read and update public zettel or its own user zettel. Added to support future client software (e.g. on a mobile device) that automatically creates new zettel but, in case of a password loss, should not allow to read existing zettel. (minor, possibly breaking, because new zettel template zettel must always - prepend the string new- before metdata keys that should be + prepend the string new- before metadata keys that should be transferred to the new zettel) - * New suported metadata key box-number, which gives an + * New supported metadata key box-number, which gives an indication from which box the zettel was loaded. (minor) * New supported syntax html. (minor) * New predefined zettel “User CSS” that can be used to redefine @@ -1039,11 +1054,11 @@ A note for users of macOS: in the current release and with macOS's default values, a zettel directory must not contain more than approx. 250 files. There are three options to mitigate this limitation temporarily: # You update the per-process limit of open files on macOS. - # You setup a virtualization environment to run Zettelstore on Linux or + # You setup a virtualisation environment to run Zettelstore on Linux or Windows. # You wait for version 0.0.12 which addresses this issue.

Changes for Version 0.0.10 (2021-02-26)

@@ -1223,13 +1238,14 @@ * (major) Predefined templates for new zettel got an explicit value for visibility: “login”. Please update these zettel if you modified them. * (major) Rename key readonly of Zettelstore Startup Configuration to read-only-mode. This was done to - avoid some confusion with the the zettel metadata key - read-only. Please adapt your startup configuration. - Otherwise your Zettelstore will be accidentally writable. + avoid some confusion with the zettel metadata key + read-only. Please adapt your startup + configuration. Otherwise your Zettelstore will be accidentally + writable. * (minor) References starting with “./” and “../” are treated as a local reference. Previously, only the prefix “/” was treated as a local reference. * (major) Metadata key modified will be set automatically to the current local time if a zettel is updated through Zettelstore. Index: www/index.wiki ================================================================== --- www/index.wiki +++ www/index.wiki @@ -14,17 +14,17 @@ zettelstore software, running in read-only mode. The software, including the manual, is licensed under the [/file?name=LICENSE.txt&ci=trunk|European Union Public License 1.2 (or later)]. - * [https://zettelstore.de/client|Zettelstore Client] provides client - software to access Zettelstore via its API more easily. + * [https://t73f.de/r/zsc|Zettelstore Client] provides client software to + access Zettelstore via its API more easily. * [https://zettelstore.de/contrib|Zettelstore Contrib] contains contributed software, which often connects to Zettelstore via its API. Some of the software packages may be experimental. - * [https://zettelstore.de/sx|Sx] provides an evaluator for symbolic - expressions, which is unsed for HTML templates and more. + * [https://t73f.de/r/sx|Sx] provides an evaluator for symbolic + expressions, which is used for HTML templates and more. [https://mastodon.social/tags/Zettelstore|Stay tuned] …

Latest Release: 0.17.0 (2024-03-04)

* [./download.wiki|Download] Index: zettel/content.go ================================================================== --- zettel/content.go +++ zettel/content.go @@ -19,11 +19,11 @@ "errors" "io" "unicode" "unicode/utf8" - "zettelstore.de/client.fossil/input" + "t73f.de/r/zsc/input" ) // Content is just the content of a zettel. type Content struct { data []byte Index: zettel/id/id.go ================================================================== --- zettel/id/id.go +++ zettel/id/id.go @@ -17,11 +17,11 @@ import ( "strconv" "time" - "zettelstore.de/client.fossil/api" + "t73f.de/r/zsc/api" ) // Zid is the internal identifier of a zettel. Typically, it is a // time stamp of the form "YYYYMMDDHHmmSS" converted to an unsigned integer. // A zettelstore implementation should try to set the last two digits to zero, Index: zettel/meta/meta.go ================================================================== --- zettel/meta/meta.go +++ zettel/meta/meta.go @@ -19,13 +19,13 @@ "sort" "strings" "unicode" "unicode/utf8" - "zettelstore.de/client.fossil/api" - "zettelstore.de/client.fossil/input" - "zettelstore.de/client.fossil/maps" + "t73f.de/r/zsc/api" + "t73f.de/r/zsc/input" + "t73f.de/r/zsc/maps" "zettelstore.de/z/strfun" "zettelstore.de/z/zettel/id" ) type keyUsage int Index: zettel/meta/meta_test.go ================================================================== --- zettel/meta/meta_test.go +++ zettel/meta/meta_test.go @@ -15,11 +15,11 @@ import ( "strings" "testing" - "zettelstore.de/client.fossil/api" + "t73f.de/r/zsc/api" "zettelstore.de/z/zettel/id" ) const testID = id.Zid(98765432101234) Index: zettel/meta/parse.go ================================================================== --- zettel/meta/parse.go +++ zettel/meta/parse.go @@ -14,13 +14,13 @@ package meta import ( "strings" - "zettelstore.de/client.fossil/api" - "zettelstore.de/client.fossil/input" - "zettelstore.de/client.fossil/maps" + "t73f.de/r/zsc/api" + "t73f.de/r/zsc/input" + "t73f.de/r/zsc/maps" "zettelstore.de/z/strfun" "zettelstore.de/z/zettel/id" ) // NewFromInput parses the meta data of a zettel. Index: zettel/meta/parse_test.go ================================================================== --- zettel/meta/parse_test.go +++ zettel/meta/parse_test.go @@ -15,12 +15,12 @@ import ( "strings" "testing" - "zettelstore.de/client.fossil/api" - "zettelstore.de/client.fossil/input" + "t73f.de/r/zsc/api" + "t73f.de/r/zsc/input" "zettelstore.de/z/zettel/meta" ) func parseMetaStr(src string) *meta.Meta { return meta.NewFromInput(testID, input.NewInput([]byte(src))) Index: zettel/meta/type.go ================================================================== --- zettel/meta/type.go +++ zettel/meta/type.go @@ -17,11 +17,11 @@ "strconv" "strings" "sync" "time" - "zettelstore.de/client.fossil/api" + "t73f.de/r/zsc/api" "zettelstore.de/z/zettel/id" ) // DescriptionType is a description of a specific key type. type DescriptionType struct { Index: zettel/meta/values.go ================================================================== --- zettel/meta/values.go +++ zettel/meta/values.go @@ -14,11 +14,11 @@ package meta import ( "fmt" - "zettelstore.de/client.fossil/api" + "t73f.de/r/zsc/api" ) // Supported syntax values. const ( SyntaxCSS = api.ValueSyntaxCSS Index: zettel/meta/write_test.go ================================================================== --- zettel/meta/write_test.go +++ zettel/meta/write_test.go @@ -15,11 +15,11 @@ import ( "strings" "testing" - "zettelstore.de/client.fossil/api" + "t73f.de/r/zsc/api" "zettelstore.de/z/zettel/id" "zettelstore.de/z/zettel/meta" ) const testID = id.Zid(98765432101234)