// Round trips for the visual editor's Markdown (node --test test/).
import { test } from 'node:test'
import assert from 'node:assert/strict'
import { readFileSync } from 'node:fs'
import { load, save, schema } from '../src/markdown.ts'
const body = (f: string) => readFileSync(new URL(f, import.meta.url), 'utf8').replace(/^---\n[\s\S]*?\n---\n\n?/, '')
test('untouched pages come back exactly as written', () => {
for (const f of ['../../starter/site/content/about.md', '../../starter/site/content/articles/hello-world.md', '../../starter/site/content/contact.md']) {
const src = body(f)
const { doc, origins } = load(src)
assert.equal(save(doc, origins), src.replace(/\n*$/, '\n'), f)
}
})
test('what the editor cannot represent is kept, read-only', () => {
const src = [
'Intro with *em*, **strong**, `code` and a [link][ref].',
'| a | b |\n|---|---|\n| 1 | 2 |',
'This is ~~gone~~.',
'
raw
',
'- [ ] todo\n- [x] done',
'## Heading {#custom}',
'Claim.[^1]',
'[^1]: Source.',
'[ref]: /about/',
].join('\n\n') + '\n'
const { doc, origins, raw } = load(src)
// The footnote's definition reads as a link definition, so it's kept with
// [ref]: in one block of lines no other block covers.
assert.deepEqual(raw, ['a table', 'strikethrough', 'raw HTML', 'a task list', 'attributes ({#id})', 'a footnote', 'link definitions or other Markdown kept as it is'])
assert.equal(doc.child(0).type.name, 'paragraph')
assert.equal(save(doc, origins), src)
})
test('an edited block is written afresh, the rest untouched', () => {
const src = 'First paragraph,\nwrapped by hand.\n\n* a star list\n* kept as it is\n\nLast one,\nalso wrapped.\n'
const { doc, origins } = load(src)
// Replace the last paragraph and add a new list.
const p = schema.nodes.paragraph.create(null, schema.text('Rewritten.'))
const list = schema.nodes.bullet_list.create(null, [
schema.nodes.list_item.create(null, schema.nodes.paragraph.create(null, schema.text('new'))),
])
const edited = doc.copy(doc.content.replaceChild(2, p).addToEnd(list))
assert.equal(save(edited, origins), 'First paragraph,\nwrapped by hand.\n\n* a star list\n* kept as it is\n\nRewritten.\n\n- new\n')
})
test('escaping is not a reason to lock a paragraph', () => {
const { raw } = load('Use site_name and 2*3 in text.\n')
assert.deepEqual(raw, [])
})