Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 14 additions & 5 deletions src/markdownit/details.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ import type StateBlock from 'markdown-it/lib/rules_block/state_block.mjs'
import type Token from 'markdown-it/lib/token.mjs'

const DETAILS_START_REGEX = /^<details>\s*$/
const DETAILS_AND_SUMMARY_START_REGEX =
/(?<=^<details>\s*<summary>).*(?=<\/summary>\s*$)/
const DETAILS_END_REGEX = /^<\/details>\s*$/
const SUMMARY_REGEX = /(?<=^<summary>).*(?=<\/summary>\s*$)/

Expand All @@ -28,8 +30,17 @@ function parseDetails(
let start = state.bMarks[startLine] + state.tShift[startLine]
let max = state.eMarks[startLine]

// Details block start
if (!state.src.slice(start, max).match(DETAILS_START_REGEX)) {
let detailsFound = false
let detailsSummary = null
let startLineCount = 2

const m = state.src.slice(start, max).match(DETAILS_AND_SUMMARY_START_REGEX)
if (m) {
// Details block start and summary in same line
detailsSummary = m[0].trim()
startLineCount = 1
} else if (!state.src.slice(start, max).match(DETAILS_START_REGEX)) {
// Details block start in separate line
return false
}

Expand All @@ -38,8 +49,6 @@ function parseDetails(
return true
}

let detailsFound = false
let detailsSummary = null
let nestedCount = 0
let nextLine = startLine
for (;;) {
Expand Down Expand Up @@ -112,7 +121,7 @@ function parseDetails(

token = state.push('details_summary', 'summary', -1)

state.md.block.tokenize(state, startLine + 2, nextLine)
state.md.block.tokenize(state, startLine + startLineCount, nextLine)

token = state.push('details_close', 'details', -1)
token.block = true
Expand Down
6 changes: 3 additions & 3 deletions src/tests/markdownit/details.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ describe('Details extension', () => {
)
})
it('renders with spaces', () => {
const rendered = markdownit.render(' <details> \n <summary>summary </summary> \n content \n </details>')
const rendered = markdownit.render(' <details> \n <summary> summary </summary> \n content \n </details> ')
expect(stripIndent(rendered)).toBe(
'<details><summary>summary</summary><p>content</p></details>',
)
Expand Down Expand Up @@ -55,10 +55,10 @@ describe('Details extension', () => {
'<details><summary>summary</summary><details><summary>nested summary</summary><p>nested content</p></details><p>content</p></details>',
)
})
it('does not render with missing linebreak after details open', () => {
it('renders without linebreak after details open', () => {
const rendered = markdownit.render('<details><summary>summary</summary>\ncontent\n</details>')
expect(stripIndent(rendered)).toBe(
'<p>&lt;details&gt;&lt;summary&gt;summary&lt;/summary&gt;content&lt;/details&gt;</p>',
'<details><summary>summary</summary><p>content</p></details>',
)
})
it('does not render with missing linebreak after summary', () => {
Expand Down
Loading