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('
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)