everything: save state bc need to start again

This commit is contained in:
Hans Fast 2026-03-09 09:10:37 +01:00
commit a93570d6b7
30 changed files with 1586 additions and 0 deletions

1
_index.md Normal file
View File

@ -0,0 +1 @@
This content will go on the homepage.

View File

@ -0,0 +1,44 @@
---
title: foobar
---
(see test.ori. This is confusing!)
So I was wondering the following, but I believe by default the path `..` returns a shallow tree by default, so the question is moot. That is: I was stuck on how to apply a regex to a nested tree of file paths, but I was erroneously assuming the tree was deep, but it's not.
My original solution therefore works because the input is already just the top-level flat directory contents:
```
{
all: ..
filtered: Tree.filter(raw, (val, key) => key.endsWith('.md')) //yes, should really use globKeys for this, but actually I'm doing a more complex comparison with AND here
}
```
Nevertheless, I can't figure out if its possible to achieve the goal stated in the subject.
`globKeys` supports a limited set of glob patterns. I guess `mask` with `regExpKeys` is probably the closest, but it's not going to work across deep paths?
given this directory structure:
```
/src
readme.md
installation.md
node_modules/
package/
readme.md
```
I only want `src/readme.md` and `src/installation.md`.
I came up with this, except is it going to be a deep operation?
```
{
all: ..
selected: Tree.map(all, Tree.regExpKeys({"^[^\/]+?\/.*\.md$": false}))
}
```
the regex returns false if the string ends with `.md` but also has a folder name with slash at the beginning. So these are excluded from the result.
huh: would you have to do some rewriting of keys to a flat map with concatenated paths?

9
_testfile.ori.md Normal file
View File

@ -0,0 +1,9 @@
---
title: ok
id: testit
date: today
---
# My file
${<_index.md>}

14
a_pubfile.md Normal file
View File

@ -0,0 +1,14 @@
---
title: My Public File
cuid: 26e4-a1
---
This is a public file with some nice text.
It's easy to write in this file.
<!--summary-above-->
I can write more things after the comment if I want.
<!--private-below-->
Whatever!

3
ada_public-site.ori Normal file
View File

@ -0,0 +1,3 @@
{
files: site.ori('')/filenames
}

3
adb_private-site.ori Normal file
View File

@ -0,0 +1,3 @@
{
files: site.ori("all")/filenames
}

2
allfiles.sh Normal file
View File

@ -0,0 +1,2 @@
fd -e md --color=never
#fd -e txt

9
another_pubfile.md Normal file
View File

@ -0,0 +1,9 @@
---
title: Another Public File
cuid: 26ef-a0
---
This file is also public. But not all of it.
<!--private-below-->
This part will not be shown.
Everything following here will be hidden from private view!

9
anotherfile.md Normal file
View File

@ -0,0 +1,9 @@
---
title: Another File
cuid: 26e4-a2
---
Just some text, in this file.
<!--summary-above-->
This file should only be shown if site was built with `site.ori("all")`,
because it does not have `_pub` in its filename.

14
base_html.ori Normal file
View File

@ -0,0 +1,14 @@
//base page template
(page) => Tree.indent`
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>${page.title}</title>
<link href="/css/style.css" rel="stylesheet">
</head>
<body>
${page.indexPage ? '' : '<a href="/">↖index</a>'}
${page._body}
</html>
`

3
css/style.css Normal file
View File

@ -0,0 +1,3 @@
body {
font-family: "Jost*";
}

3
echo.sh Normal file
View File

@ -0,0 +1,3 @@
while read line
do echo "$line"
done

8
extractSummary.js Normal file
View File

@ -0,0 +1,8 @@
const reg = /^(?<summary>.+)?<!--summary-above-->/s
export default (doc) => {
const result = reg.exec(doc._body);
if (result) {
doc.summary = result.groups.summary;
}
return doc;
}

10
indexPage.ori Normal file
View File

@ -0,0 +1,10 @@
(pages) => base_html.ori({
indexPage: true
title: 'Hans Fast'
_body: Tree.indent`
<h1>Hans Fast</h1>
${Origami.mdHtml(_index.md)}
${Tree.map(pages, (value, key) => pageSummaries.ori.html(value, key))}
</body>
`
})

1306
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

6
package.json Normal file
View File

@ -0,0 +1,6 @@
{
"dependencies": {
"@weborigami/origami": "^0.6.12"
},
"type": "module"
}

9
page.ori Normal file
View File

@ -0,0 +1,9 @@
(page) => base_html.ori({
indexPage: false
title: page.title
_body: Tree.indent`
<h1>${page.title}</h1>
${page._body}
<a href="/">↖index</a>
`
})

1
page.ori.html Normal file
View File

@ -0,0 +1 @@
//a templ

6
pageSummaries.js Normal file
View File

@ -0,0 +1,6 @@
//return title and html ...
export default (doc) => {
}

7
pageSummaries.ori.html Normal file
View File

@ -0,0 +1,7 @@
---
(value, key) => _template()
---
<article>
<a href=${key}><h1>${value.title}</h1></a>
${value.summary || ""}
</article>

1
pubfiles.sh Normal file
View File

@ -0,0 +1 @@
rg '_pub' || true

11
readFiles.js Normal file
View File

@ -0,0 +1,11 @@
import {promises} from 'fs';
const {readFile} = promises;
export default async function readFiles(filelist) {
const filenames = filelist.split('\n').filter(name => name !== '')
const files = {};
for (const file of filenames) {
const contents = await readFile(file, 'utf-8');
files[file] = contents;
}
return files;
}

9
removePrivate.js Normal file
View File

@ -0,0 +1,9 @@
const reg = /^(?<public>.+)<!--private-below-->.+$/s
export default (doc) => {
const result = reg.exec(doc._body);
if (result) {
doc._body = result.groups.public;
}
return doc;
}

49
site.ori Normal file
View File

@ -0,0 +1,49 @@
(all) => {
//put the file selection part in a closure, so that the list of all files is kept private.
pages: {
/*
list is all the files in current directory.
allfiles is all source files: ending with `.md` and not starting with `_`.
pubfiles is the subset containing the string `_pub`.
files selects either of these depending on the argument passed to this file.
*/
// allfiles: allfiles.sh() //reads MD files.
// pubfiles: pubfiles.sh(allfiles)
(list): ..
allfiles: Tree.filter(list, (val, key) => key.endsWith('.md') && !key.startsWith('_'))
pubfiles: Tree.filter(allfiles, (val, key) => key.includes('_pub'))
files: Tree.map( all ? allfiles : pubfiles, {value: (val) => Origami.document(val)})
asHtml: Tree.map(files, (value) => Origami.mdHtml(value))
→ (values) => Tree.mapExtension(values, '.md→.html')
/*
after converting to html, we can extract a 'summary' from the file.
With markdown, the title is taken from the YAML frontmatter,
and ends up in a separate field of the document.
So we dont have to worry about the title being part of the summary.
*/
withSummary: Tree.map(asHtml, extractSummary.js)
/*
Removing private content coming below the html comment `<!--private-below-->`
Only remove this if in public mode. So if this file is called as `site.ori("all")`,
then final output is `withSummary`, otherwise it's `privateRemoved`.
*/
privateRemoved: Tree.map(withSummary, removePrivate.js)
final: (all ? withSummary : privateRemoved)
}.final
renderedPages: Tree.map(pages, page.ori)
/*
assets are relative to the pubfiles directory
*/
css
/*
Now, I think I have enough to build both the individual pages and the index page!
*/
index.html: indexPage.ori(pages)
...renderedPages/
}

1
test-arg.sh Normal file
View File

@ -0,0 +1 @@
echo "$1"

3
test-stdin.sh Normal file
View File

@ -0,0 +1,3 @@
while read line
do echo "$line"
done

30
test.ori Normal file
View File

@ -0,0 +1,30 @@
{
test: {
"readme.md": "hello world"
"index.js" : "import nest from './a/nested.js'"
a: {
"nested.md": "myfile"
"nested.js": "export default nest = ''"
b: {
"deeper.md" : "deep inside"
}
}
}
raw: ..
files: Tree.filter(raw, (val, key) => key.endsWith('.md') && /^[a-p]+_/.test(key))
regexpd: Tree.mask(test, Tree.regExpKeys({"^[^\/]+?\/.*\.md$": false}))
//regexpdtop: Tree.mask(test, Tree.globKeys({"**": {"*.md": true}}))
regexpdtest: Tree.mask(test, {
...Tree.constant(true)
...Tree.regExpKeys({
"^[^\/]+?\/.*\.md$": false
})})
regexpdfiles: Tree.mask(files, {
...Tree.constant(true)
...Tree.regExpKeys({
"^[^\/]+?\/.*\.md$": false
})})
paths: Tree.paths(test)
regexpaths: Tree.map(Tree.filter(paths, (value) => /^[^\/]+?\/.*\.md$/.test(value)), {key: (value, key) => value, value: (value) => true})
excluded: Tree.mask(paths, regexpaths)
}

1
test.sh Normal file
View File

@ -0,0 +1 @@
echo "foobar"

8
testUnpackFiles.js Normal file
View File

@ -0,0 +1,8 @@
export default async (value) => {
if (value.unpack) {
const unpacked = await value.unpack();
console.log(unpacked);
}
return value;
}

6
testinclude.ori Normal file
View File

@ -0,0 +1,6 @@
{
test: testfile.ori.md/
all: .
allmd: Tree.filter(all, (val, key) => key.endsWith('.md') && !key.startsWith('_'))
docs: Tree.map(allmd, {value: (val) => Origami.unpack(val)})
}