From e46d540c01a42c72adee7a2f6a7012b2f7cc8432 Mon Sep 17 00:00:00 2001 From: Simon Martens Date: Sun, 29 Dec 2024 20:26:36 +0100 Subject: [PATCH] exp akteure --- .air.toml | 5 +- functions/embedding.go | 30 ++++++++ templating/engine.go | 3 + views/assets/scripts.js | 61 +++++++-------- views/assets/style.css | 2 +- .../{citation.xsl => transform-citation.xsl} | 0 .../{citation.xsl => transform-citation.xsl} | 0 views/routes/akteure/body.gohtml | 75 ++----------------- views/routes/components/_agent.gohtml | 72 ++++++++++++++++++ views/routes/components/_xslt_citation.gohtml | 0 views/tailwind.config.js | 1 + views/transform/main.js | 23 ++---- 12 files changed, 151 insertions(+), 121 deletions(-) rename views/assets/xslt/{citation.xsl => transform-citation.xsl} (100%) rename views/public/xslt/{citation.xsl => transform-citation.xsl} (100%) create mode 100644 views/routes/components/_agent.gohtml delete mode 100644 views/routes/components/_xslt_citation.gohtml diff --git a/.air.toml b/.air.toml index 4f6a930..270f5af 100644 --- a/.air.toml +++ b/.air.toml @@ -8,9 +8,8 @@ full_bin = "export KGPZ_WATCH=false; ./tmp/main" cmd = "go build -tags=\"dev\" -o ./tmp/main ." delay = 400 exclude_dir = [ - "views/public", + "views/assets", "views/node_modules", - "views/transform", "tmp", "vendor", "testdata", @@ -23,7 +22,7 @@ exclude_regex = ["_test.go"] exclude_unchanged = false follow_symlink = false include_dir = [] -include_ext = ["go", "tpl", "tmpl", "html", "gohtml"] +include_ext = ["go", "tpl", "tmpl", "html", "gohtml", "js", "css", "xsl"] include_file = [] kill_delay = "0s" log = "build-errors.log" diff --git a/functions/embedding.go b/functions/embedding.go index 5964a26..b4ea2e9 100644 --- a/functions/embedding.go +++ b/functions/embedding.go @@ -4,6 +4,8 @@ import ( "html/template" "io" "io/fs" + "path/filepath" + "strings" "sync" ) @@ -14,6 +16,8 @@ var embed_cache sync.Map func EmbedSafe(fs fs.FS) func(string) template.HTML { embed_cache.Clear() return func(path string) template.HTML { + path = strings.TrimSpace(path) + path = filepath.Clean(path) val, err := getFileData(fs, path) if err != nil { return template.HTML("") @@ -26,6 +30,8 @@ func EmbedSafe(fs fs.FS) func(string) template.HTML { func Embed(fs fs.FS) func(string) string { embed_cache.Clear() return func(path string) string { + path = strings.TrimSpace(path) + path = filepath.Clean(path) val, err := getFileData(fs, path) if err != nil { return "" @@ -54,3 +60,27 @@ func getFileData(fs fs.FS, path string) ([]byte, error) { embed_cache.Store(path, data) return data, nil } + +func EmbedXSLT(fs fs.FS) func(string) template.HTML { + embed_cache.Clear() + return func(path string) template.HTML { + path = strings.TrimSpace(path) + path = filepath.Clean(path) + fn := filepath.Base(path) + ext := filepath.Ext(fn) + fn = fn[:len(fn)-len(ext)] + + if (ext != ".xsl" && ext != ".xslt") || ext == "" || fn == "" { + return template.HTML("[ERROR: " + "file is not an XSLT file" + "]") + } + + val, err := getFileData(fs, path) + if err != nil { + return template.HTML("[ERROR: " + err.Error() + "]") + } + + src := "" + + return template.HTML(src) + } +} diff --git a/templating/engine.go b/templating/engine.go index 3352854..aae11fb 100644 --- a/templating/engine.go +++ b/templating/engine.go @@ -55,6 +55,9 @@ func (e *Engine) Funcs(app *app.KGPZ) error { e.AddFunc("EmbedSafe", functions.EmbedSafe(views.StaticFS)) e.AddFunc("Embed", functions.Embed(views.StaticFS)) + // Embedding of XSLT files + e.AddFunc("EmbedXSLT", functions.EmbedXSLT(views.StaticFS)) + // App specific e.AddFunc("GetAgent", app.Library.Agents.Item) e.AddFunc("GetPlace", app.Library.Places.Item) diff --git a/views/assets/scripts.js b/views/assets/scripts.js index 83b6bf1..e256647 100644 --- a/views/assets/scripts.js +++ b/views/assets/scripts.js @@ -1,54 +1,51 @@ -const u = "[xslt-onload]", a = "xslt-template", c = "xslt-transformed", i = /* @__PURE__ */ new Map(); -function p() { - let t = htmx.findAll(u); +const p = "script[xslt-onload]", a = "xslt-template", u = "xslt-transformed", c = /* @__PURE__ */ new Map(); +function m() { + let t = htmx.findAll(p); for (let e of t) - f(e); + T(e); } -function f(t) { - if (t.getAttribute(c) === "true" || !t.hasAttribute(a)) +function T(t) { + if (t.getAttribute(u) === "true" || !t.hasAttribute(a)) return; - let e = "#" + t.getAttribute(a), r = i.get(e); - if (!r) { - let o = htmx.find(e); - if (o) { - let n = o.innerHTML ? new DOMParser().parseFromString(o.innerHTML, "application/xml") : o.contentDocument; - r = new XSLTProcessor(), r.importStylesheet(n), i.set(e, r); + let e = "#" + t.getAttribute(a), o = c.get(e); + if (!o) { + let n = htmx.find(e); + if (n) { + let l = n.innerHTML ? new DOMParser().parseFromString(n.innerHTML, "application/xml") : n.contentDocument; + o = new XSLTProcessor(), o.importStylesheet(l), c.set(e, o); } else throw new Error("Unknown XSLT template: " + e); } - if (r) { - let o = new DOMParser().parseFromString(t.innerHTML, "application/xml"), n = r.transformToFragment(o, document), s = new XMLSerializer().serializeToString(n); - t.innerHTML = s, t.setAttribute(c, !0), htmx.process(t); - } else - throw new Error("No Processor: " + e); + let i = new DOMParser().parseFromString(t.innerHTML, "application/xml"), s = o.transformToFragment(i, document), r = new XMLSerializer().serializeToString(s); + t.outerHTML = r; } -function T() { +function f() { document.querySelectorAll("template[simple]").forEach((e) => { - let r = e.getAttribute("id"), o = e.content; + let o = e.getAttribute("id"), i = e.content; customElements.define( - r, + o, class extends HTMLElement { constructor() { - super(), this.appendChild(o.cloneNode(!0)), this.slots = this.querySelectorAll("slot"); + super(), this.appendChild(i.cloneNode(!0)), this.slots = this.querySelectorAll("slot"); } connectedCallback() { - let n = []; - this.slots.forEach((s) => { - let m = s.getAttribute("name"), l = this.querySelector(`[slot="${m}"]`); - l && (s.replaceWith(l.cloneNode(!0)), n.push(l)); - }), n.forEach((s) => { - s.remove(); + let s = []; + this.slots.forEach((r) => { + let n = r.getAttribute("name"), l = this.querySelector(`[slot="${n}"]`); + l && (r.replaceWith(l.cloneNode(!0)), s.push(l)); + }), s.forEach((r) => { + r.remove(); }); } } ); }); } -function h() { - p(), htmx.on("htmx:afterSettle", function(t) { - i.clear(), p(); - }), T(); +function d() { + m(), htmx.on("htmx:load", function(t) { + m(); + }), f(); } export { - h as setup + d as setup }; diff --git a/views/assets/style.css b/views/assets/style.css index 8421cf7..64c659e 100644 --- a/views/assets/style.css +++ b/views/assets/style.css @@ -1 +1 @@ -*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:"Source Sans 3",Merriweather Sans,ui-sans-serif;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}html{font-size:15.5px}body{--tw-bg-opacity: 1;background-color:rgb(248 250 252 / var(--tw-bg-opacity, 1))}h1,h2,h3,h4{font-family:Merriweather,ui-serif}a{-webkit-hyphens:none;hyphens:none;--tw-text-opacity: 1;color:rgb(51 65 85 / var(--tw-text-opacity, 1));text-decoration-line:underline;text-decoration-style:dotted}a:hover{--tw-text-opacity: 1;color:rgb(15 23 42 / var(--tw-text-opacity, 1));text-decoration-style:solid}ul{margin-top:.5rem;margin-bottom:.5rem}li{margin-left:3.5rem;list-style-type:disc}a[aria-current=page]{--tw-text-opacity: 1 !important;color:rgb(239 68 68 / var(--tw-text-opacity, 1))!important}.relative{position:relative}.bottom-0\.5{bottom:.125rem}.block{display:block}.inline-block{display:inline-block}.flex{display:flex}.h-full{height:100%}.w-full{width:100%}.flex-row{flex-direction:row}.gap-x-2{-moz-column-gap:.5rem;column-gap:.5rem}.p-3{padding:.75rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.pb-4{padding-bottom:1rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.\!no-underline{text-decoration-line:none!important} +*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:"Source Sans 3",Merriweather Sans,ui-sans-serif;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.container{width:100%}@media (min-width: 640px){.container{max-width:640px}}@media (min-width: 768px){.container{max-width:768px}}@media (min-width: 1024px){.container{max-width:1024px}}@media (min-width: 1280px){.container{max-width:1280px}}@media (min-width: 1536px){.container{max-width:1536px}}html{font-size:15.5px}body{--tw-bg-opacity: 1;background-color:rgb(248 250 252 / var(--tw-bg-opacity, 1))}h1,h2,h3,h4{font-family:Merriweather,ui-serif}a{-webkit-hyphens:none;hyphens:none;--tw-text-opacity: 1;color:rgb(51 65 85 / var(--tw-text-opacity, 1));text-decoration-line:underline;text-decoration-style:dotted}a:hover{--tw-text-opacity: 1;color:rgb(15 23 42 / var(--tw-text-opacity, 1));text-decoration-style:solid}ul{margin-top:.5rem;margin-bottom:.5rem}li{margin-left:3.5rem;list-style-type:disc}a[aria-current=page]{--tw-text-opacity: 1 !important;color:rgb(239 68 68 / var(--tw-text-opacity, 1))!important}.visible{visibility:visible}.collapse{visibility:collapse}.relative{position:relative}.bottom-0\.5{bottom:.125rem}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.table{display:table}.hidden{display:none}.h-full{height:100%}.w-full{width:100%}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.flex-row{flex-direction:row}.gap-x-2{-moz-column-gap:.5rem;column-gap:.5rem}.p-3{padding:.75rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.pb-4{padding-bottom:1rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.\!no-underline{text-decoration-line:none!important}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.\[a-zA-Z\:\\-\\\.\]{a-z-a--z:\-\.} diff --git a/views/assets/xslt/citation.xsl b/views/assets/xslt/transform-citation.xsl similarity index 100% rename from views/assets/xslt/citation.xsl rename to views/assets/xslt/transform-citation.xsl diff --git a/views/public/xslt/citation.xsl b/views/public/xslt/transform-citation.xsl similarity index 100% rename from views/public/xslt/citation.xsl rename to views/public/xslt/transform-citation.xsl diff --git a/views/routes/akteure/body.gohtml b/views/routes/akteure/body.gohtml index 7dbe670..13d53a9 100644 --- a/views/routes/akteure/body.gohtml +++ b/views/routes/akteure/body.gohtml @@ -1,4 +1,5 @@ {{ if ne (len .model.Search) 1 }} + {{ $agent := index $.model.Agents .model.Search }} {{ if not $agent }}
Agent nicht gefunden: {{ .model.Search }}
@@ -10,8 +11,9 @@ {{ $letter }} -
{{ index $agent.Names 0 }}
+
{{ template "_agent" $agent }}
{{ end }} + {{ else }}
{{ range $_, $l := .model.AvailableLetters }} @@ -23,75 +25,8 @@ {{ range $_, $id := .model.Sorted }} {{ $a := index $.model.Agents $id }} - {{ if and $a (ne (len $a.Names) 0) }} -
- {{ index $a.Names 0 }} -
- {{ $gnd := GetGND $a.GND }} - {{ if (ne $gnd nil) }} - {{- if ne (len $gnd.DateOfBirth) 0 -}} -   - {{- HRDateShort (index $gnd.DateOfBirth 0) -}} - {{- end -}} - {{- if ne (len $gnd.DateOfDeath) 0 }} -   {{ HRDateShort (index $gnd.DateOfDeath 0) }} - {{ end }} - {{- if ne (len $gnd.ProfessionOrOccupation) 0 -}} -
- {{- (index $gnd.ProfessionOrOccupation 0).Label -}} - {{- if gt (len $gnd.ProfessionOrOccupation) 1 -}} - , - {{ (index $gnd.ProfessionOrOccupation 1).Label -}} - {{ end -}} - {{- if gt (len $gnd.ProfessionOrOccupation) 2 -}} - , - {{ (index $gnd.ProfessionOrOccupation 2).Label -}} - {{ end -}} -
- {{ end }} - {{ end }} -
- - {{- if ne $gnd nil -}} - GND → - {{- if ne (len $gnd.Wikipedia) 0 -}} - WIKI → - {{ end -}} - {{ end }} - -
-
- {{- if ne (len $a.Works) 0 -}} -
- {{ range $_, $w := $a.Works }} - {{- if ne (len $w.Citation.InnerXML ) 0 -}} -
- - {{- Safe $w.Citation.InnerXML -}} - -
- {{- end -}} - {{ end }} -
- {{ end }} - - {{- if ne (len $a.Pieces) 0 -}} -
- {{ range $_, $p := $a.Pieces }} - {{- range $_, $i := $p.IssueRefs -}} -
- {{ $i.Nr }}/{{ $i.When }} -
- {{- end -}} - {{ end }} -
- {{ end }} -
- {{ end }} + {{ template "_agent" $a }} {{ end }} {{ end }} - +{{ EmbedXSLT "xslt/transform-citation.xsl" }} diff --git a/views/routes/components/_agent.gohtml b/views/routes/components/_agent.gohtml new file mode 100644 index 0000000..c65d889 --- /dev/null +++ b/views/routes/components/_agent.gohtml @@ -0,0 +1,72 @@ +{{ $a := . }} +{{ if and $a (ne (len $a.Names) 0) }} +
+ {{ index $a.Names 0 }} +
+ {{ $gnd := GetGND $a.GND }} + {{ if (ne $gnd nil) }} + {{- if ne (len $gnd.DateOfBirth) 0 -}} +   + {{- HRDateShort (index $gnd.DateOfBirth 0) -}} + {{- end -}} + {{- if ne (len $gnd.DateOfDeath) 0 }} +   {{ HRDateShort (index $gnd.DateOfDeath 0) }} + {{ end }} + {{- if ne (len $gnd.ProfessionOrOccupation) 0 -}} +
+ {{- (index $gnd.ProfessionOrOccupation 0).Label -}} + {{- if gt (len $gnd.ProfessionOrOccupation) 1 -}} + , + {{ (index $gnd.ProfessionOrOccupation 1).Label -}} + {{ end -}} + {{- if gt (len $gnd.ProfessionOrOccupation) 2 -}} + , + {{ (index $gnd.ProfessionOrOccupation 2).Label -}} + {{ end -}} +
+ {{ end }} + {{ end }} + + +
+ + + {{- if ne $gnd nil -}} + GND → + {{- if ne (len $gnd.Wikipedia) 0 -}} + WIKI → + {{ end -}} + {{ end }} + +
+
+ + {{- if ne (len $a.Works) 0 -}} +
+ {{ range $_, $w := $a.Works }} + {{- if ne (len $w.Citation.InnerXML ) 0 -}} + + {{- end -}} + {{ end }} +
+ {{ end }} + + {{- if ne (len $a.Pieces) 0 -}} +
+ {{ range $_, $p := $a.Pieces }} + {{- range $_, $i := $p.IssueRefs -}} +
+ {{ $i.Nr }}/{{ $i.When }} +
+ {{- end -}} + {{ end }} +
+ {{ end }} + +
+{{ end }} diff --git a/views/routes/components/_xslt_citation.gohtml b/views/routes/components/_xslt_citation.gohtml deleted file mode 100644 index e69de29..0000000 diff --git a/views/tailwind.config.js b/views/tailwind.config.js index 363300a..4aa7cb3 100644 --- a/views/tailwind.config.js +++ b/views/tailwind.config.js @@ -4,6 +4,7 @@ export default { "./routes/**/*.{html,js,svelte,ts,tmpl,gotmpl,gohtml}", "./layouts/**/*.{html,js,svelte,ts,tmpl,gotmpl,gohtml}", "./transform/**/*.{html,js,svelte,ts,tmpl,gotmpl,gohtml}", + "./public/**/*.{html,js,svelte,ts,tmpl,gotmpl,gohtml,xsl}", ], theme: { extend: { diff --git a/views/transform/main.js b/views/transform/main.js index db12b59..608a548 100644 --- a/views/transform/main.js +++ b/views/transform/main.js @@ -1,6 +1,6 @@ import "./site.css"; -const ATTR_XSLT_ONLOAD = "[xslt-onload]"; +const ATTR_XSLT_ONLOAD = "script[xslt-onload]"; const ATTR_XSLT_TEMPLATE = "xslt-template"; const ATTR_XSLT_STATE = "xslt-transformed"; @@ -37,18 +37,10 @@ function transform_xslt(element) { } } - if (processor) { - let data = new DOMParser().parseFromString(element.innerHTML, "application/xml"); - let frag = processor.transformToFragment(data, document); - let s = new XMLSerializer().serializeToString(frag); - element.innerHTML = s; - element.setAttribute(ATTR_XSLT_STATE, true); - - // INFO: This allows to insert htmx elements in the transformed content - htmx.process(element); - } else { - throw new Error("No Processor: " + templateId); - } + let data = new DOMParser().parseFromString(element.innerHTML, "application/xml"); + let frag = processor.transformToFragment(data, document); + let s = new XMLSerializer().serializeToString(frag); + element.outerHTML = s; } function setup_templates() { @@ -89,8 +81,9 @@ function setup_templates() { function setup() { setup_xslt(); - htmx.on("htmx:afterSettle", function (_) { - xslt_processors.clear(); + htmx.on("htmx:load", function (_) { + // INFO: We can instead use afterSettle; and also clear the map with + // xslt_processors.clear(); setup_xslt(); });