From d6583994b297a88d4cb82323caed325269bf0344 Mon Sep 17 00:00:00 2001 From: nobkd <44443899+nobkd@users.noreply.github.com> Date: Tue, 4 Feb 2025 18:15:22 +0100 Subject: [PATCH] fix: unnamed block tag now defaults to div, don't skip list issue test --- packages/nuemark/src/parse-blocks.js | 6 ++++-- packages/nuemark/src/render-tag.js | 14 ++++++-------- packages/nuemark/test/block.test.js | 2 +- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/packages/nuemark/src/parse-blocks.js b/packages/nuemark/src/parse-blocks.js index 9aa1ef33..5cdd5e34 100644 --- a/packages/nuemark/src/parse-blocks.js +++ b/packages/nuemark/src/parse-blocks.js @@ -114,7 +114,7 @@ export function parseBlocks(lines, capture) { // tag if (c == '[' && trimmed.endsWith(']') && !trimmed.includes('][')) { const tag = parseTag(line.slice(1, -1)) - block = { is_tag: true, ...tag, body: [] } + block = { is_tag: true, ...tag, name: tag.name || 'div', body: [] } return blocks.push(block) } @@ -182,7 +182,9 @@ function processNestedBlocks(block, capture) { const body = block.body.join('\n') try { - if (body && name && isYAML(body.trim())) { + // TODO: add additional check for native html tags + // maybe new syntax? e.g. `[yaml-tag]:\n\thi` (note colon) + if (body && isYAML(body.trim())) { let data = parseYAML(body) if (Array.isArray(data)) data = { items: data } Object.assign(block.data, data) diff --git a/packages/nuemark/src/render-tag.js b/packages/nuemark/src/render-tag.js index 0cf3e7ba..220467c8 100644 --- a/packages/nuemark/src/render-tag.js +++ b/packages/nuemark/src/render-tag.js @@ -39,12 +39,10 @@ const TAGS = { const html = !divs || !divs[1] ? render(blocks) : divs.map(blocks => elem('div', render(blocks))).join('\n') - Object.assign(attr, data) - - return elem(attr.popover ? 'dialog' : name || 'div', attr, html) + if (this.to_block) Object.assign(attr, data) + return elem(attr.popover ? 'dialog' : name, attr, html) }, - button(data) { const { href } = data const label = this.renderInline(data.label || data._) || this.innerHTML || '' @@ -65,7 +63,6 @@ const TAGS = { return html && elem('dl', this.attr, html.join('\n')) }, - image() { const { attr, data } = this const { caption, href, loading = 'lazy' } = data @@ -92,7 +89,7 @@ const TAGS = { const content = data._ delete data._ - Object.assign(attr, data) + if (this.to_inline) Object.assign(attr, data) return elem(name, attr, this.renderInline(content, opts)) }, @@ -131,7 +128,6 @@ const TAGS = { return elem('video', attr, this.innerHTML) }, - // shortcut '!': function() { const tag = getMimeType(this.data._).startsWith('video') ? TAGS.video : TAGS.image @@ -164,9 +160,11 @@ export function renderIcon(name, symbol, icon_dir) { export function renderTag(tag, opts = {}) { const tags = { ...TAGS, ...opts.tags } - const tag_fn = !tag.name || tag.to_block ? 'block' : tag.to_inline ? 'inline' : tag.name + const tag_fn = tag.to_block ? 'block' : tag.to_inline ? 'inline' : tag.name const fn = tags[tag_fn] + if (!(tag.is_block || tag.is_inline)) console.log('\n', tag) + if (!fn) { // native html tags if (HTML_TAGS.includes(tag.name)) { diff --git a/packages/nuemark/test/block.test.js b/packages/nuemark/test/block.test.js index 5f7b98b5..94c85700 100644 --- a/packages/nuemark/test/block.test.js +++ b/packages/nuemark/test/block.test.js @@ -56,7 +56,7 @@ test('block html tag without children with content', () => { expect(html).toBe('
content
\n

no content

') }) -test.skip('block html tag with starting ul', () => { +test('block html tag with starting ul', () => { const { blocks } = parseBlocks(['[div]', ' - hi', ' - hello']) expect(blocks.length).toBe(1) expect(blocks[0].blocks.length).toBe(1)