1- let markedPromise = null ;
1+ import { ensureMarkedReady , parseMarkdown } from './markdown.js' ;
22
33function resolveMarkedInstance ( ) {
4- if ( markedPromise ) {
5- return markedPromise ;
6- }
7-
8- markedPromise = ( async ( ) => {
9- const existing = globalThis . marked ;
10- if ( existing && typeof existing . parse === 'function' ) {
11- return existing ;
12- }
13-
14- const module = await import ( 'marked' ) ;
15- const candidate = module . marked ?? module . default ?? module ;
16- if ( ! candidate || typeof candidate . parse !== 'function' ) {
17- throw new Error ( 'Unable to load marked parser' ) ;
18- }
19-
20- return candidate ;
21- } ) ( )
22- . then ( ( instance ) => {
23- if ( typeof instance . setOptions === 'function' ) {
24- instance . setOptions ( {
25- breaks : true ,
26- gfm : true ,
27- } ) ;
28- }
29- return instance ;
30- } )
31- . catch ( ( error ) => {
32- markedPromise = null ;
33- throw error ;
34- } ) ;
35-
36- return markedPromise ;
4+ return ensureMarkedReady ( ) ;
375}
386
397const FOCUSABLE_SELECTOR = [
@@ -71,6 +39,16 @@ function normalizeToText(value) {
7139 return '' ;
7240}
7341
42+ function decorateModalContent ( target ) {
43+ if ( ! target ) {
44+ return ;
45+ }
46+
47+ target . querySelectorAll ( 'ul' ) . forEach ( ( list ) => {
48+ list . classList . add ( 'modal__list' ) ;
49+ } ) ;
50+ }
51+
7452function renderMarkdown ( target , markdown ) {
7553 if ( ! target ) {
7654 return Promise . resolve ( false ) ;
@@ -82,17 +60,14 @@ function renderMarkdown(target, markdown) {
8260 }
8361
8462 return resolveMarkedInstance ( )
85- . then ( ( instance ) => {
86- const parser = typeof instance . parse === 'function' ? instance . parse . bind ( instance ) : null ;
87- const html = parser ? parser ( text ) : '' ;
63+ . then ( ( ) => {
64+ const html = parseMarkdown ( text ) ;
8865 if ( ! html ) {
8966 return false ;
9067 }
9168
9269 target . innerHTML = html ;
93- target . querySelectorAll ( 'ul' ) . forEach ( ( list ) => {
94- list . classList . add ( 'modal__list' ) ;
95- } ) ;
70+ decorateModalContent ( target ) ;
9671 return true ;
9772 } )
9873 . catch ( ( error ) => {
@@ -264,6 +239,8 @@ export function createModalController(root) {
264239 content . innerHTML = '' ;
265240 content . hidden = true ;
266241
242+ const resolvedDetailsHtml = typeof card . detailsHtml === 'string' ? card . detailsHtml . trim ( ) : '' ;
243+
267244 const listItems = Array . isArray ( card . details )
268245 ? card . details
269246 . map ( ( item ) => {
@@ -294,26 +271,35 @@ export function createModalController(root) {
294271 || '' ;
295272 }
296273
297- const fallbackText = markdownSource || detailsTextForFallback || summaryTextCandidate || '' ;
298-
299- renderMarkdown ( content , markdownSource )
300- . then ( ( rendered ) => {
301- if ( rendered ) {
302- content . hidden = false ;
303- return ;
304- }
305-
306- if ( fallbackText ) {
307- content . textContent = fallbackText ;
308- content . hidden = false ;
309- }
310- } )
311- . catch ( ( ) => {
312- if ( fallbackText ) {
313- content . textContent = fallbackText ;
314- content . hidden = false ;
315- }
316- } ) ;
274+ const fallbackText = markdownSource
275+ || detailsTextForFallback
276+ || summaryTextCandidate
277+ || '' ;
278+
279+ if ( resolvedDetailsHtml ) {
280+ content . innerHTML = resolvedDetailsHtml ;
281+ decorateModalContent ( content ) ;
282+ content . hidden = false ;
283+ } else {
284+ renderMarkdown ( content , markdownSource )
285+ . then ( ( rendered ) => {
286+ if ( rendered ) {
287+ content . hidden = false ;
288+ return ;
289+ }
290+
291+ if ( fallbackText ) {
292+ content . textContent = fallbackText ;
293+ content . hidden = false ;
294+ }
295+ } )
296+ . catch ( ( ) => {
297+ if ( fallbackText ) {
298+ content . textContent = fallbackText ;
299+ content . hidden = false ;
300+ }
301+ } ) ;
302+ }
317303
318304 if ( card . backgroundColor ) {
319305 dialog . style . background = card . backgroundColor ;
0 commit comments