diff --git a/packages/core/package.json b/packages/core/package.json index cb88797b..36a7361f 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -33,7 +33,6 @@ "micromark-util-types": "^1.0.2", "rehype-katex": "^6.0.3", "rehype-stringify": "^9.0.3", - "rehype-truncate": "^1.2.2", "remark": "^14.0.2", "remark-math": "^5.1.1", "remark-parse": "^10.0.1", @@ -53,4 +52,4 @@ "peggy": "^3.0.2", "ts-pegjs": "^4.1.0" } -} \ No newline at end of file +} diff --git a/packages/core/src/Bundle.ts b/packages/core/src/Bundle.ts index b2cf91c8..4ab5a92e 100644 --- a/packages/core/src/Bundle.ts +++ b/packages/core/src/Bundle.ts @@ -56,6 +56,7 @@ type FetchOpts = { branch: string host?: string etag?: string + fetch?: (input: RequestInfo, init?: RequestInit) => Promise } export function bundleUrl({ branch, host = defaultHost }: FetchOpts): string { @@ -69,7 +70,8 @@ export async function fetch( if (opts.etag) { headers.append('If-None-Match', opts.etag) } - const response = await window.fetch(bundleUrl(opts), { + const fetch = opts.fetch || window.fetch + const response = await fetch(bundleUrl(opts), { method: 'GET', headers, }) diff --git a/packages/core/src/Parser.ts b/packages/core/src/Parser.ts index 7f9e8c8f..ff4a6a69 100644 --- a/packages/core/src/Parser.ts +++ b/packages/core/src/Parser.ts @@ -4,12 +4,12 @@ import remarkParse from 'remark-parse' import remarkMath from 'remark-math' import remarkRehype from 'remark-rehype' import rehypeKatex from 'rehype-katex' -import rehypeTruncate from 'rehype-truncate' import rehypeStringify from 'rehype-stringify' import { Linkers } from './Parser/types.js' import { links } from './Parser/links.js' import { references } from './Parser/references.js' +import { truncate as truncator } from './Parser/truncate.js' import { unnest } from './Parser/unnest.js' export type Options = { @@ -56,7 +56,7 @@ export function parser({ // Convert math nodes to hast .use(rehypeKatex) // Optionally trim mdast to a minimal preview - .use(rehypeTruncate, { + .use(truncator, { maxChars: 100, disable: !truncate, ignoreTags: ['math', 'inline-math'], diff --git a/packages/core/src/Parser/truncate.ts b/packages/core/src/Parser/truncate.ts new file mode 100644 index 00000000..d3043c60 --- /dev/null +++ b/packages/core/src/Parser/truncate.ts @@ -0,0 +1,56 @@ +import { Root } from 'mdast' +import { Transformer } from 'unified' + +type Opts = { + disable?: boolean + ellipses?: string + maxChars?: number + ignoreTags?: string[] +} + +// Adapted from https://github.com/luk707/rehype-truncate +export function truncate({ + disable = false, + ellipses = '\u2026', + ignoreTags = [], + maxChars = 120, +}: Opts = {}): Transformer { + return truncator + + function truncator(tree: Root) { + if (!disable) { + truncateNode(tree) + } + } + + function truncateNode(node: any, tf = 0) { + let foundText = tf + + if (node.type === 'text') { + foundText += node.value.length + if (foundText >= maxChars) { + node.value = `${node.value.slice( + 0, + node.value.length - (foundText - maxChars), + )}${ellipses}` + return maxChars + } + } + + if (node.type === 'root' || node.type === 'element') { + if (node.type === 'element' && ignoreTags.includes(node.tagName)) { + return foundText + } + for (let i = 0; i < node.children.length; i++) { + if (foundText === maxChars) { + node.children.splice(i, 1) + i-- + continue + } + foundText = truncateNode(node.children[i], foundText) + } + } + + return foundText + } +} diff --git a/packages/core/vite.config.ts b/packages/core/vite.config.ts index 34c26d0d..ad782cef 100644 --- a/packages/core/vite.config.ts +++ b/packages/core/vite.config.ts @@ -11,6 +11,10 @@ export default defineConfig({ }, outDir: './dist', }, + // See https://stackoverflow.com/questions/75701724 + resolve: { + preserveSymlinks: true, + }, test: { coverage: { lines: 93.84, diff --git a/packages/viewer/.gitignore b/packages/viewer/.gitignore index ab8aca8b..b438f701 100644 --- a/packages/viewer/.gitignore +++ b/packages/viewer/.gitignore @@ -1,3 +1,4 @@ +/.svelte-kit /coverage/ /cypress/screenshots/ /cypress/videos/ diff --git a/packages/viewer/index.html b/packages/viewer/index.html deleted file mode 100644 index 0233f321..00000000 --- a/packages/viewer/index.html +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - π-Base - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/packages/viewer/package.json b/packages/viewer/package.json index 80207934..43aac6d0 100644 --- a/packages/viewer/package.json +++ b/packages/viewer/package.json @@ -27,12 +27,13 @@ "jquery": "1.9.1", "rehype-katex": "^6.0.3", "remark-rehype": "^10.1.0", - "svelte-routing": "1.6.0", "unified": "^10.1.2", "unist-util-is": "^5.2.1", "unist-util-visit": "^4.1.2" }, "devDependencies": { + "@sveltejs/adapter-cloudflare": "^2.3.2", + "@sveltejs/kit": "^1.22.6", "@sveltejs/vite-plugin-svelte": "^2.2.0", "@tsconfig/svelte": "^3.0.0", "@types/debug": "^4.1.7", @@ -46,4 +47,4 @@ "svelte-preprocess": "^5.0.3", "tslib": "^2.5.0" } -} \ No newline at end of file +} diff --git a/packages/viewer/src/app.html b/packages/viewer/src/app.html new file mode 100644 index 00000000..1d198b01 --- /dev/null +++ b/packages/viewer/src/app.html @@ -0,0 +1,32 @@ + + + + + + + π-Base + + + + + + + + + + + + + + + + + + %sveltekit.head% + + +
%sveltekit.body%
+ + diff --git a/packages/viewer/src/components/App.svelte b/packages/viewer/src/components/App.svelte deleted file mode 100644 index d9cc1252..00000000 --- a/packages/viewer/src/components/App.svelte +++ /dev/null @@ -1,43 +0,0 @@ - - - -