rapier-html 1.2.33 → 1.2.42
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/BUILD.json +21 -21
- package/README.md +22 -13
- package/dist/ledger/data.mjs +57 -4
- package/dist/ledger/document-settings.mjs +1 -0
- package/dist/ledger/format.mjs +114 -47
- package/dist/ledger/hash.mjs +43 -2
- package/dist/ledger/history.mjs +6 -0
- package/dist/ledger/inverse-source.mjs +15 -2
- package/dist/ledger/journal-records.mjs +32 -9
- package/dist/ledger/md-assets.mjs +709 -0
- package/dist/ledger/will.mjs +239 -0
- package/dist/ledger/word-sidecar.mjs +5 -0
- package/dist/page.d.mts +2 -0
- package/dist/rapier.html +85 -84
- package/dist/wrap.mjs +11 -4
- package/package.json +1 -1
package/dist/wrap.mjs
CHANGED
|
@@ -15,7 +15,7 @@ const OFFLINE_POLICY = "default-src 'none'; script-src 'unsafe-inline' 'wasm-uns
|
|
|
15
15
|
|
|
16
16
|
export {encodeCarried, decodeCarried};
|
|
17
17
|
|
|
18
|
-
const PREVIEW = /<meta (?:name="(?:description|generator)"|property="og:(?:title|description)") content="[^"]*" data-rapier-preview
|
|
18
|
+
const PREVIEW = /<meta (?:name="(?:description|generator)"|property="og:(?:title|description)") content="[^"]*" data-rapier-preview(?:="")?>\n?/g;
|
|
19
19
|
const APPEARANCE = /<meta name="rapier-appearance" content="(light|dark)">\n?/g;
|
|
20
20
|
const plainWords = text => text.replace(/!\[[^\]]*\]\[[^\]]*\]|!\[[^\]]*\]\([^)]*\)/g, '').replace(/\[([^\]]*)\](?:\([^)]*\)|\[[^\]]*\])/g, '$1')
|
|
21
21
|
.replace(/<[^>]*>/g, '').replace(/[*_`~=]+|\[\^[^\]]*\]/g, '').replace(/\s+/g, ' ').trim();
|
|
@@ -45,6 +45,12 @@ function previewHead(markdown, fallbackTitle) {
|
|
|
45
45
|
(description ? meta('property', 'og:description', description) : '') + meta('name', 'generator', 'Rapier (https://rapier.website)');
|
|
46
46
|
}
|
|
47
47
|
|
|
48
|
+
function readableText(text) {
|
|
49
|
+
const words = text.replace(/^(\[[^\]\n]+\]:\s*)data:\S+/gm, '$1(embedded picture)').replace(/\((data:[^)\s]+)\)/g, '(embedded picture)')
|
|
50
|
+
.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');
|
|
51
|
+
return '<pre style="white-space:pre-wrap;font:inherit;margin:0">' + words + '</pre>';
|
|
52
|
+
}
|
|
53
|
+
|
|
48
54
|
function readableBlock(html) {
|
|
49
55
|
if (typeof html !== 'string' || !html.trim() || /<\/noscript|<!--/i.test(html)) return '';
|
|
50
56
|
return '\n<noscript id="rapier-readable"><style>html,body{background:#fff;color:#000}a{color:#0000ee}</style><main style="max-width:44rem;margin:0 auto;padding:1rem">' + html + '</main></noscript>';
|
|
@@ -61,8 +67,8 @@ export function offlineTemplate(pageHtml, address = null) {
|
|
|
61
67
|
const match = new RegExp('\\b' + name + '\\s*=\\s*(?:"([^"]*)"|\'([^\']*)\'|([^\\s>]+))', 'i').exec(tag);
|
|
62
68
|
return match ? match[1] ?? match[2] ?? match[3] : '';
|
|
63
69
|
};
|
|
64
|
-
const head = pageHtml.slice(0, end).replace(/<meta\b[^>]
|
|
65
|
-
attribute(tag, 'http-equiv').toLowerCase() === 'content-security-policy' ? '' : tag).replace(/<link\b[^>]
|
|
70
|
+
const head = pageHtml.slice(0, end).replace(/<meta\b[^>]*>\n?/gi, tag =>
|
|
71
|
+
attribute(tag, 'http-equiv').toLowerCase() === 'content-security-policy' ? '' : tag).replace(/<link\b[^>]*>\n?/gi, tag =>
|
|
66
72
|
attribute(tag, 'rel').toLowerCase().split(/\s+/).some(rel => ['icon', 'apple-touch-icon', 'manifest', 'preconnect', 'dns-prefetch'].includes(rel)) ? '' : tag);
|
|
67
73
|
const anchor = /<meta charset[^>]*>\n?/i.exec(head) || /<head[^>]*>\n?/.exec(head);
|
|
68
74
|
if (!anchor) throw new Error('not a Rapier page: no <head>');
|
|
@@ -85,6 +91,7 @@ export function carry(pageHtml, include = []) {
|
|
|
85
91
|
const kept = new Set(include);
|
|
86
92
|
for (const id of kept) if (!CHOICES.includes(id)) throw new Error('a carried page includes ' + CHOICES.join(', ') + '; not ' + id);
|
|
87
93
|
if (kept.has('drawing')) kept.add('letters');
|
|
94
|
+
if (kept.has('mermaid')) kept.add('mermaid-zenuml');
|
|
88
95
|
let html = pageHtml;
|
|
89
96
|
const cut = id => { const at = element(html, id); if (at) html = html.slice(0, at.start) + html.slice(at.end); };
|
|
90
97
|
const parts = new Set([...(kept.has('drawing') ? ['rapier-part-drawing'] : []), ...(kept.has('layout') ? ['rapier-part-document'] : [])]);
|
|
@@ -169,7 +176,7 @@ export function wrap(pageHtml, text, name, options) {
|
|
|
169
176
|
const titled = stripped.replace(/<title>[^<]*<\/title>\n?/, all => '<title>' + docName.replace(/&/g, '&').replace(/</g, '<') + ' — Rapier</title>' +
|
|
170
177
|
(all.endsWith('\n') ? '\n' : '') + previewHead(text, docName.replace(/\.[^.]*$/, '')));
|
|
171
178
|
const shift = titled.length - stripped.length;
|
|
172
|
-
return titled.slice(0, at + shift) + '\n' + block + carriedBlocks + readableBlock(opts.readable) + titled.slice(at + shift);
|
|
179
|
+
return titled.slice(0, at + shift) + '\n' + block + carriedBlocks + readableBlock(opts.readable === undefined ? readableText(text) : opts.readable) + titled.slice(at + shift);
|
|
173
180
|
}
|
|
174
181
|
export function unwrap(pageHtml) {
|
|
175
182
|
const theme = Array.from(pageHtml.matchAll(APPEARANCE), match => match[1])[0] || null;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "rapier-html",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.42",
|
|
4
4
|
"description": "One command turns a Markdown file into one offline HTML file: the whole Rapier editor with the document inside. Opens in any browser, phone or desktop, with no install or account. Write, draw and paint watercolor, then Send back the edits to your AI agent.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"markdown",
|