diff --git a/html_template/pkg.go b/html_template/pkg.go
index a478789..4140f89 100644
--- a/html_template/pkg.go
+++ b/html_template/pkg.go
@@ -11,7 +11,6 @@ import (
"net/http"
"os"
"regexp"
- "sync"
)
type Engine struct {
@@ -23,10 +22,6 @@ type Engine struct {
DevMode bool
}
-var (
- templateLock sync.Mutex
-)
-
func NewEngine(viewFS, staticFS fs.FS, devmode bool) (e Engine, err error) { // {{{
e.parsedTemplates = make(map[string]*template.Template)
e.viewFS = viewFS
@@ -67,12 +62,12 @@ func (e *Engine) getComponentFilenames() (files []string, err error) { // {{{
} // }}}
func (e *Engine) ReloadTemplates() { // {{{
- templateLock.Lock()
e.parsedTemplates = make(map[string]*template.Template)
- templateLock.Unlock()
} // }}}
func (e *Engine) StaticResource(w http.ResponseWriter, r *http.Request) { // {{{
+ var err error
+
// URLs with pattern /(css|images)/v1.0.0/foobar are stripped of the version.
// To get rid of problems with cached content in browser on a new version release,
// while also not disabling cache altogether.
@@ -88,7 +83,11 @@ func (e *Engine) StaticResource(w http.ResponseWriter, r *http.Request) { // {{{
r.URL.Path = fmt.Sprintf("/%s/%s", comp[1], comp[2])
if e.DevMode {
- e.staticLocalFS.ServeHTTP(w, r)
+ p := fmt.Sprintf("static/%s/%s", comp[1], comp[2])
+ _, err = os.Stat(p)
+ if err == nil {
+ e.staticLocalFS.ServeHTTP(w, r)
+ }
return
}
}
@@ -126,9 +125,7 @@ func (e *Engine) getPage(layout, page string) (tmpl *template.Template, err erro
return
}
- templateLock.Lock()
e.parsedTemplates[page] = tmpl
- templateLock.Unlock()
return
} // }}}
func (e *Engine) Render(p Page, w http.ResponseWriter, r *http.Request) (err error) { // {{{
diff --git a/static/css/notes2.css b/static/css/notes2.css
index 31e1f1f..7c2320f 100644
--- a/static/css/notes2.css
+++ b/static/css/notes2.css
@@ -52,51 +52,51 @@ html {
#tree {
grid-area: tree;
display: grid;
- background-color: #ffffff;
+ background-color: #fafafa;
color: #444;
z-index: 100;
- border-right: 2px solid #ddd;
+ border-right: 1px solid #ddd;
+
+ n2-tree {
+ /*border: 2px solid #f8f8f8;*/
+ padding: 16px 48px 16px 24px;
+ }
+
+ &:focus-within {
+ n2-tree {
+ /*
+ border: 2px solid #fe5f55;
+ */
+ }
+
+ }
+
#logo {
display: grid;
- grid-template-columns: min-content 1fr min-content;
- align-items: center;
- justify-items: start;
+ position: relative;
+ justify-items: center;
+ margin-top: 8px;
+ margin-bottom: 8px;
+ margin-left: 24px;
+ margin-right: 24px;
cursor: pointer;
- padding: 16px;
- border-bottom: 1px solid #ccc;
- .el-search {
- justify-self: end;
- }
+ img {
+ width: 128px;
+ left: -20px;
- img:first-child {
- height: 24px;
- margin-right: 8px;
}
}
.icons {
display: flex;
justify-content: center;
- margin: 16px 0px 32px 0px;
+ margin-bottom: 32px;
gap: 8px;
}
- n2-tree {
- .el-treenodes {
- margin: 32px;
- }
- }
-
- &:focus-within {
- n2-tree {
- }
-
- }
-
-
.node {
display: grid;
grid-template-columns: 40px min-content;
@@ -145,27 +145,14 @@ html {
}
}
-[id^="page-"] {
- display: none;
-}
-
-#main-page {
- display: contents;
-
- &.node {
- #page-node {
- display: contents;
- }
- }
-
- &.storage {
- #page-storage {
- display: contents;
- n2-pagestorage {
- grid-area: content;
- }
- }
- }
+#tree-nodes {
+ padding: 16px 32px;
+ /*
+ border-radius: 8px;
+*/
+ /*
+ box-shadow: 5px 5px 10px -5px rgba(0, 0, 0, 0.75);
+ */
}
#crumbs {
diff --git a/static/favicon.ico b/static/favicon.ico
deleted file mode 100644
index 299310f..0000000
Binary files a/static/favicon.ico and /dev/null differ
diff --git a/static/images/collapsed.svg b/static/images/collapsed.svg
index db06415..d93f4ca 100644
--- a/static/images/collapsed.svg
+++ b/static/images/collapsed.svg
@@ -8,7 +8,7 @@
version="1.1"
id="svg1"
sodipodi:docname="collapsed.svg"
- inkscape:version="1.4.4 (dcaf3e7d9e, 2026-05-05)"
+ inkscape:version="1.4.2 (ebf0e94, 2025-05-08)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
@@ -23,13 +23,13 @@
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
- inkscape:zoom="19.349237"
- inkscape:cx="11.809251"
- inkscape:cy="6.3051583"
- inkscape:window-width="1093"
- inkscape:window-height="1401"
- inkscape:window-x="2560"
- inkscape:window-y="0"
+ inkscape:zoom="4.8373092"
+ inkscape:cx="6.201795"
+ inkscape:cy="-12.40359"
+ inkscape:window-width="1916"
+ inkscape:window-height="1161"
+ inkscape:window-x="0"
+ inkscape:window-y="18"
inkscape:window-maximized="1"
inkscape:current-layer="layer1"
showguides="false" />
@@ -42,13 +42,9 @@
transform="translate(-102.39375,-146.31458)">
folder-outline
-
+ style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:#71c837;fill-opacity:1;stroke-width:0.330728;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1" />
diff --git a/static/images/expanded.svg b/static/images/expanded.svg
index 9b420a8..017e8a4 100644
--- a/static/images/expanded.svg
+++ b/static/images/expanded.svg
@@ -8,7 +8,7 @@
version="1.1"
id="svg1"
sodipodi:docname="expanded.svg"
- inkscape:version="1.4.4 (dcaf3e7d9e, 2026-05-05)"
+ inkscape:version="1.4.2 (ebf0e94, 2025-05-08)"
xml:space="preserve"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
@@ -23,13 +23,13 @@
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
- inkscape:zoom="15.807429"
- inkscape:cx="10.533022"
- inkscape:cy="16.384701"
- inkscape:window-width="1093"
- inkscape:window-height="1401"
- inkscape:window-x="1463"
- inkscape:window-y="0"
+ inkscape:zoom="11.17754"
+ inkscape:cx="20.845374"
+ inkscape:cy="26.929003"
+ inkscape:window-width="1916"
+ inkscape:window-height="1161"
+ inkscape:window-x="0"
+ inkscape:window-y="18"
inkscape:window-maximized="1"
inkscape:current-layer="layer1" />folder-openfolder-open-outline
+ style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:#71c837;fill-opacity:1;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1" />
diff --git a/static/images/file_icons/application_pdf.svg b/static/images/file_icons/application_pdf.svg
deleted file mode 100644
index e503d4d..0000000
--- a/static/images/file_icons/application_pdf.svg
+++ /dev/null
@@ -1,107 +0,0 @@
-
-
-
-
diff --git a/static/images/file_icons/generic.svg b/static/images/file_icons/generic.svg
deleted file mode 100644
index 7ca6c2b..0000000
--- a/static/images/file_icons/generic.svg
+++ /dev/null
@@ -1,100 +0,0 @@
-
-
-
-
diff --git a/static/images/icon_settings.svg b/static/images/icon_settings.svg
deleted file mode 100644
index 1b692ad..0000000
--- a/static/images/icon_settings.svg
+++ /dev/null
@@ -1,49 +0,0 @@
-
-
-
-
diff --git a/static/images/icon_table.svg b/static/images/icon_table.svg
deleted file mode 100644
index 9379dfc..0000000
--- a/static/images/icon_table.svg
+++ /dev/null
@@ -1,49 +0,0 @@
-
-
-
-
diff --git a/static/images/logo.svg b/static/images/logo.svg
index f294234..3b5efa4 100644
--- a/static/images/logo.svg
+++ b/static/images/logo.svg
@@ -2,12 +2,12 @@
diff --git a/static/images/logo_small.svg b/static/images/logo_small.svg
deleted file mode 100644
index cb83d39..0000000
--- a/static/images/logo_small.svg
+++ /dev/null
@@ -1,63 +0,0 @@
-
-
-
-
diff --git a/static/js/app.mjs b/static/js/app.mjs
index feeec3a..dc60b59 100644
--- a/static/js/app.mjs
+++ b/static/js/app.mjs
@@ -29,14 +29,6 @@ export class App {
this.goToNode(node.nodeUUID, node.dontPush, node.dontExpand)
})
- _mbus.subscribe('SHOW_PAGE', ({ detail: { data: { page } } }) => {
- const classList = document.querySelector('#main-page').classList
- classList.forEach(e =>
- classList.remove(e)
- )
- classList.add(page)
- })
-
window.addEventListener('keydown', event => this.keyHandler(event))
window.addEventListener('popstate', event => this.popState(event))
document.getElementById('notes2').addEventListener('click', event => {
@@ -44,8 +36,6 @@ export class App {
document.getElementById('node-content')?.focus()
})
- _mbus.dispatch('SHOW_PAGE', { page: 'node' })
-
window._sync = new Sync()
// I think it is uncomfortable having the sync running as soon as the page load.
diff --git a/static/js/file.mjs b/static/js/file.mjs
deleted file mode 100644
index 2674737..0000000
--- a/static/js/file.mjs
+++ /dev/null
@@ -1,81 +0,0 @@
-import { CustomHTMLElement } from "./lib/custom_html_element.mjs";
-
-export class N2File extends CustomHTMLElement {
- static {
- this.tmpl = document.createElement('template')
- this.tmpl.innerHTML = `
-
-
-
- `
- }
- constructor() {
- super(true)
-
- this.addEventListener('click', event => {
- event.preventDefault()
- event.stopPropagation()
-
- window.open(
- URL.createObjectURL(this.file),
- (event.ctrlKey || event.shiftKey) ? '_blank' : '_self',
- )
- })
-
- this.render()
- }
-
- async render() {
- const src = this.getAttribute('src')
-
- // N2's db:// URLs are fetched from IndexedDB.
- if (src.toLowerCase().match('^db://[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$')) {
- // image population has to happen asynchronously,
- // while Marked lib has to be returned a string when exiting this function.
- // populateImg makes sure this returned img element exists and then populates it
- // with the image from IndexedDB.
- const file = await globalThis.nodeStore.files.get(src.slice(5))
- if (!file)
- return
- this.file = file.file
-
- if (file.file.type.startsWith('image/'))
- this.elImage.src = URL.createObjectURL(file.file)
- else {
- // Check for and use an existing MIME type icon.
- // Place them in static/images/file_icons/ and replace the slash with an underscore.
- const url = `/images/${_VERSION}/file_icons/${file.file.type.replaceAll('/', '_')}.svg`
- const res = await fetch(url)
- if (res.ok)
- this.elImage.src = url
-
- this.elFilename.innerText = file.file.name
- this.elFilename.style.display = 'block'
- }
- } else
- this.elImage.src = src
- }
-}
-customElements.define('n2-file', N2File)
diff --git a/static/js/lib/css_colorize.mjs b/static/js/lib/css_colorize.mjs
deleted file mode 100644
index f0fdb37..0000000
--- a/static/js/lib/css_colorize.mjs
+++ /dev/null
@@ -1,207 +0,0 @@
-export class Color {
- constructor(r, g, b) { this.set(r, g, b); }
- toString() { return `rgb(${Math.round(this.r)}, ${Math.round(this.g)}, ${Math.round(this.b)})`; }
-
- set(r, g, b) {
- this.r = this.clamp(r);
- this.g = this.clamp(g);
- this.b = this.clamp(b);
- }
-
- hueRotate(angle = 0) {
- angle = angle / 180 * Math.PI;
- let sin = Math.sin(angle);
- let cos = Math.cos(angle);
-
- this.multiply([
- 0.213 + cos * 0.787 - sin * 0.213, 0.715 - cos * 0.715 - sin * 0.715, 0.072 - cos * 0.072 + sin * 0.928,
- 0.213 - cos * 0.213 + sin * 0.143, 0.715 + cos * 0.285 + sin * 0.140, 0.072 - cos * 0.072 - sin * 0.283,
- 0.213 - cos * 0.213 - sin * 0.787, 0.715 - cos * 0.715 + sin * 0.715, 0.072 + cos * 0.928 + sin * 0.072
- ]);
- }
-
- grayscale(value = 1) {
- this.multiply([
- 0.2126 + 0.7874 * (1 - value), 0.7152 - 0.7152 * (1 - value), 0.0722 - 0.0722 * (1 - value),
- 0.2126 - 0.2126 * (1 - value), 0.7152 + 0.2848 * (1 - value), 0.0722 - 0.0722 * (1 - value),
- 0.2126 - 0.2126 * (1 - value), 0.7152 - 0.7152 * (1 - value), 0.0722 + 0.9278 * (1 - value)
- ]);
- }
-
- sepia(value = 1) {
- this.multiply([
- 0.393 + 0.607 * (1 - value), 0.769 - 0.769 * (1 - value), 0.189 - 0.189 * (1 - value),
- 0.349 - 0.349 * (1 - value), 0.686 + 0.314 * (1 - value), 0.168 - 0.168 * (1 - value),
- 0.272 - 0.272 * (1 - value), 0.534 - 0.534 * (1 - value), 0.131 + 0.869 * (1 - value)
- ]);
- }
-
- saturate(value = 1) {
- this.multiply([
- 0.213 + 0.787 * value, 0.715 - 0.715 * value, 0.072 - 0.072 * value,
- 0.213 - 0.213 * value, 0.715 + 0.285 * value, 0.072 - 0.072 * value,
- 0.213 - 0.213 * value, 0.715 - 0.715 * value, 0.072 + 0.928 * value
- ]);
- }
-
- multiply(matrix) {
- let newR = this.clamp(this.r * matrix[0] + this.g * matrix[1] + this.b * matrix[2]);
- let newG = this.clamp(this.r * matrix[3] + this.g * matrix[4] + this.b * matrix[5]);
- let newB = this.clamp(this.r * matrix[6] + this.g * matrix[7] + this.b * matrix[8]);
- this.r = newR; this.g = newG; this.b = newB;
- }
-
- brightness(value = 1) { this.linear(value); }
- contrast(value = 1) { this.linear(value, -(0.5 * value) + 0.5); }
-
- linear(slope = 1, intercept = 0) {
- this.r = this.clamp(this.r * slope + intercept * 255);
- this.g = this.clamp(this.g * slope + intercept * 255);
- this.b = this.clamp(this.b * slope + intercept * 255);
- }
-
- invert(value = 1) {
- this.r = this.clamp((value + (this.r / 255) * (1 - 2 * value)) * 255);
- this.g = this.clamp((value + (this.g / 255) * (1 - 2 * value)) * 255);
- this.b = this.clamp((value + (this.b / 255) * (1 - 2 * value)) * 255);
- }
-
- hsl() { // Code taken from https://stackoverflow.com/a/9493060/2688027, licensed under CC BY-SA.
- let r = this.r / 255;
- let g = this.g / 255;
- let b = this.b / 255;
- let max = Math.max(r, g, b);
- let min = Math.min(r, g, b);
- let h, s, l = (max + min) / 2;
-
- if (max === min) {
- h = s = 0;
- } else {
- let d = max - min;
- s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
- switch (max) {
- case r: h = (g - b) / d + (g < b ? 6 : 0); break;
- case g: h = (b - r) / d + 2; break;
- case b: h = (r - g) / d + 4; break;
- } h /= 6;
- }
-
- return {
- h: h * 100,
- s: s * 100,
- l: l * 100
- };
- }
-
- clamp(value) {
- if (value > 255) { value = 255; }
- else if (value < 0) { value = 0; }
- return value;
- }
-}
-
-export class Solver {
- constructor(target) {
- this.target = target;
- this.targetHSL = target.hsl();
- this.reusedColor = new Color(0, 0, 0); // Object pool
- }
-
- solve() {
- let result = this.solveNarrow(this.solveWide());
- return {
- values: result.values,
- loss: result.loss,
- filter: this.css(result.values)
- };
- }
-
- solveWide() {
- const A = 5;
- const c = 15;
- const a = [60, 180, 18000, 600, 1.2, 1.2];
-
- let best = { loss: Infinity };
- for (let i = 0; best.loss > 25 && i < 3; i++) {
- let initial = [50, 20, 3750, 50, 100, 100];
- let result = this.spsa(A, a, c, initial, 1000);
- if (result.loss < best.loss) { best = result; }
- } return best;
- }
-
- solveNarrow(wide) {
- const A = wide.loss;
- const c = 2;
- const A1 = A + 1;
- const a = [0.25 * A1, 0.25 * A1, A1, 0.25 * A1, 0.2 * A1, 0.2 * A1];
- return this.spsa(A, a, c, wide.values, 500);
- }
-
- spsa(A, a, c, values, iters) {
- const alpha = 1;
- const gamma = 0.16666666666666666;
-
- let best = null;
- let bestLoss = Infinity;
- let deltas = new Array(6);
- let highArgs = new Array(6);
- let lowArgs = new Array(6);
-
- for (let k = 0; k < iters; k++) {
- let ck = c / Math.pow(k + 1, gamma);
- for (let i = 0; i < 6; i++) {
- deltas[i] = Math.random() > 0.5 ? 1 : -1;
- highArgs[i] = values[i] + ck * deltas[i];
- lowArgs[i] = values[i] - ck * deltas[i];
- }
-
- let lossDiff = this.loss(highArgs) - this.loss(lowArgs);
- for (let i = 0; i < 6; i++) {
- let g = lossDiff / (2 * ck) * deltas[i];
- let ak = a[i] / Math.pow(A + k + 1, alpha);
- values[i] = fix(values[i] - ak * g, i);
- }
-
- let loss = this.loss(values);
- if (loss < bestLoss) { best = values.slice(0); bestLoss = loss; }
- } return { values: best, loss: bestLoss };
-
- function fix(value, idx) {
- let max = 100;
- if (idx === 2 /* saturate */) { max = 7500; }
- else if (idx === 4 /* brightness */ || idx === 5 /* contrast */) { max = 200; }
-
- if (idx === 3 /* hue-rotate */) {
- if (value > max) { value = value % max; }
- else if (value < 0) { value = max + value % max; }
- } else if (value < 0) { value = 0; }
- else if (value > max) { value = max; }
- return value;
- }
- }
-
- loss(filters) { // Argument is array of percentages.
- let color = this.reusedColor;
- color.set(0, 0, 0);
-
- color.invert(filters[0] / 100);
- color.sepia(filters[1] / 100);
- color.saturate(filters[2] / 100);
- color.hueRotate(filters[3] * 3.6);
- color.brightness(filters[4] / 100);
- color.contrast(filters[5] / 100);
-
- let colorHSL = color.hsl();
- return Math.abs(color.r - this.target.r)
- + Math.abs(color.g - this.target.g)
- + Math.abs(color.b - this.target.b)
- + Math.abs(colorHSL.h - this.targetHSL.h)
- + Math.abs(colorHSL.s - this.targetHSL.s)
- + Math.abs(colorHSL.l - this.targetHSL.l);
- }
-
- css(filters) {
- function fmt(idx, multiplier = 1) { return Math.round(filters[idx] * multiplier); }
- return `invert(${fmt(0)}%) sepia(${fmt(1)}%) saturate(${fmt(2)}%) hue-rotate(${fmt(3, 3.6)}deg) brightness(${fmt(4)}%) contrast(${fmt(5)}%)`;
- }
-}
diff --git a/static/js/lib/custom_html_element.mjs b/static/js/lib/custom_html_element.mjs
index 2cec808..dedb5d8 100644
--- a/static/js/lib/custom_html_element.mjs
+++ b/static/js/lib/custom_html_element.mjs
@@ -1,10 +1,10 @@
export class CustomHTMLElement extends HTMLElement {
- constructor(useShadow) {// {{{
+ constructor() {// {{{
super()
- const workOn = useShadow ? this.attachShadow({ mode: 'open' }) : this
- workOn.appendChild(this.constructor.tmpl.content.cloneNode(true))
- workOn.querySelectorAll('*').forEach(el => {
+ this.appendChild(this.constructor.tmpl.content.cloneNode(true))
+
+ this.querySelectorAll('*').forEach(el => {
const field = el.dataset.field
if (field !== undefined) {
const fieldName = this.toElementName('field', field)
diff --git a/static/js/marked_position.mjs b/static/js/marked_position.mjs
index 62a6996..ca85d3e 100644
--- a/static/js/marked_position.mjs
+++ b/static/js/marked_position.mjs
@@ -92,34 +92,30 @@ function escapeHtmlEntities(html, encode) {// {{{
export class MarkedPosition {
constructor() {// {{{
- window.setpos = (event) => this.setpos(event)
- this.render()
- }// }}}
- setpos(event) {// {{{
- event.stopPropagation()
- event.preventDefault()
+ window.setpos = (event) => {
+ event.stopPropagation()
+ event.preventDefault()
+
+ _mbus.dispatch('MARKDOWN_EDIT', {
+ position: {
+ start: event.target.dataset.offsetStart,
+ end: event.target.dataset.offsetEnd,
+ }
+ })
+ }
- _mbus.dispatch('MARKDOWN_EDIT', {
- position: {
- start: event.target.closest('[data-offset-start]').dataset.offsetStart,
- end: event.target.closest('[data-offset-start]').dataset.offsetEnd,
- }
- })
- }// }}}
- render() {// {{{
- const markedObject = this
this.marked = new Marked()
this.marked.use(markedTokenPosition())
this.marked.use({
renderer: {
heading(token) {
const content = this.parser.parseInline(token.tokens)
- return `${content}\n`
+ return `${content}\n`
},
paragraph(token) {
const content = this.parser.parseInline(token.tokens)
- return `${content}
\n`
+ return `${content}
\n`
},
list(token) {
@@ -138,7 +134,7 @@ export class MarkedPosition {
},
listitem(token) {
- return `${this.parser.parse(token.tokens)}\n`
+ return `${this.parser.parse(token.tokens)}\n`
},
code(token) {
@@ -147,12 +143,12 @@ export class MarkedPosition {
const code = token.text.replace(other.endingNewline, '') + '\n'
if (!langString) {
- return ``
+ return ``
+ (token.escaped ? code : escapeHtmlEntities(code, true))
+ '
\n'
}
- return `'
+ (token.escaped ? code : escapeHtmlEntities(code, true))
@@ -161,7 +157,7 @@ export class MarkedPosition {
blockquote(token) {
const body = this.parser.parse(token.tokens)
- return `\n${body}
\n`
+ return `\n${body}
\n`
},
html(token) {
@@ -173,11 +169,11 @@ export class MarkedPosition {
},
hr(token) {
- return `
\n`
+ return `
\n`
},
checkbox(token) {
- return ` '
},
@@ -222,7 +218,7 @@ export class MarkedPosition {
if (token.tokens.length > 0) {
const start = token.tokens[0].position.start.offset
const end = token.tokens[0].position.end.offset
- ofs = `ondblclick="setpos(event)" data-offset-start="${start}" data-offset-end="${end}"`
+ ofs = `onclick="setpos(event)" data-offset-start="${start}" data-offset-end="${end}"`
}
const content = this.parser.parseInline(token.tokens);
@@ -234,23 +230,23 @@ export class MarkedPosition {
},
strong(token) {
- return `${this.parser.parseInline(token.tokens)}`
+ return `${this.parser.parseInline(token.tokens)}`
},
em(token) {
- return `${this.parser.parseInline(token.tokens)}`
+ return `${this.parser.parseInline(token.tokens)}`
},
codespan(token) {
- return `${escapeHtmlEntities(token.text, true)}`
+ return `${escapeHtmlEntities(token.text, true)}`
},
br(token) {
- return `
`
+ return `
`
},
del(token) {
- return `${this.parser.parseInline(token.tokens)}`
+ return `${this.parser.parseInline(token.tokens)}`
},
link(token) {
@@ -260,7 +256,7 @@ export class MarkedPosition {
return text
}
token.href = cleanHref
- let out = ''
+ out += '>'
return out
},
@@ -293,34 +291,8 @@ export class MarkedPosition {
}
})
- }// }}}}}}
+ }// }}}
parse(text) {// {{{
return this.marked.parse(text)
}// }}}
- async whenElementExist(id) {// {{{
- // The element could have already been created.
- const element = document.getElementById(id)
- if (element) {
- return element
- }
-
- const observer = new MutationObserver((_mutations, observer) => {
- const target = document.getElementById(id)
- if (target) {
- observer.disconnect()
- return target
- }
- })
-
- observer.observe(document.documentElement, {
- childList: true,
- subtree: true
- })
- }// }}}
- async populateImg(fileID, elementID) {// {{{
- let img = await globalThis.nodeStore.files.get(fileID)
- const el = await this.whenElementExist(elementID)
-
- el.src = URL.createObjectURL(img.file)
- }// }}}
}
diff --git a/static/js/page_node.mjs b/static/js/node.mjs
similarity index 76%
rename from static/js/page_node.mjs
rename to static/js/node.mjs
index 753aa46..7959831 100644
--- a/static/js/page_node.mjs
+++ b/static/js/node.mjs
@@ -1,15 +1,15 @@
-import { ROOT_NODE, uuidv7 } from 'node_store'
+import { ROOT_NODE } from 'node_store'
import { CustomHTMLElement } from './lib/custom_html_element.mjs'
import { MarkedPosition } from './marked_position.mjs'
-export class N2PageNodeUI extends CustomHTMLElement {
+export class N2NodeUI extends CustomHTMLElement {
static {// {{{
this.tmpl = document.createElement('template')
this.tmpl.innerHTML = `