Fork Notesium source and restructure into Go package layout

Initial fork of github.com/alonswartz/notesium into librenotes:
- Source moved to internal/notesium/ (package notesium)
- Thin entry point at cmd/librenotes/main.go
- Module renamed to git.librete.ch/public/librenotes
- main() exposed as notesium.Run()
- LICENSE preserved (MIT), NOTICE added with attribution
- Web assets and completion.bash co-located with embedding code
  to satisfy go:embed path constraints

Closes #3, #34, #35.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-28 21:52:25 +02:00
co-authored by Claude Opus 4.7
parent aee9086633
commit 094250609c
63 changed files with 7391 additions and 0 deletions
@@ -0,0 +1,61 @@
var t = `
<div class="h-full w-full overflow-y-scroll pb-6">
<div class="relative flex-1 px-6 mt-2 space-y-6">
<div class="rounded-md border border-gray-200">
<dl class="flex flex-wrap">
<div class="flex-auto pl-6 py-2 bg-gray-100 border-b border-gray-200">
<dt class="text-xs font-semibold leading-6 text-gray-900">Counts</dt>
</div>
<div class="divide-y divide-gray-100 w-full">
<div v-for="stat in stats" :key="stat[0]" :title="stat[2]" @click="stat[3] ? $emit('finder-open', stat[3]) : undefined"
:class="{'hover:bg-gray-50 cursor-pointer': stat[3]}"
class="px-6 py-2 flex w-full flex-none items-center justify-center justify-between">
<dt :class="stat[3] ? 'text-gray-900' : 'text-gray-600'" class="text-xs font-medium leading-6 flex" v-text="stat[1]"></dt>
<dd :class="stat[3] ? 'text-gray-900' : 'text-gray-600'" class="text-xs font-mono leading-6" v-text="counts[stat[0]] || 'unknown'"></dd>
</div>
</div>
</dl>
</div>
</div>
</div>
`
export default {
emits: ['finder-open'],
data() {
return {
counts: {},
stats: [
['notes', 'Notes', 'All notes', '/api/raw/list?color=true&prefix=label&sort=alpha'],
['labels', 'Label notes', 'Notes with one-word titles', '/api/raw/list?color=true&labels=true&sort=alpha'],
['orphans', 'Orphan notes', 'Notes without incoming or outgoing links', '/api/raw/list?color=true&orphans=true&sort=alpha'],
['links', 'Links', 'Count of links', '/api/raw/links?color=true'],
['dangling', 'Dangling links', 'Count of broken links', '/api/raw/links?color=true&dangling=true'],
['lines', 'Lines', 'Count of lines spanning all notes', '/api/raw/lines?color=true&prefix=title'],
['words', 'Words', 'Count of words spanning all notes', null],
['chars', 'Characters', 'Count of characters spanning all notes', null],
],
}
},
methods: {
getCounts() {
fetch('/api/raw/stats')
.then(r => r.ok ? r.text() : r.text().then(e => Promise.reject(e)))
.then(text => {
this.counts = text.trim().split('\n').reduce((dict, line) => {
const [key, val] = line.split(' '); dict[key] = val;
return dict;
}, {});
})
.catch(e => {
console.error(e.Error);
});
},
},
created() {
this.getCounts();
},
template: t
}