@@ -7,57 +7,60 @@ interface SerializeContext {
77 mode ?: 'ol' | 'ul'
88}
99
10+ // Build rules map only once for performance
11+ const rules : Record < string , ( node : VElement , handleChildren : ( ctx ?: Partial < SerializeContext > ) => string , ctx ?: SerializeContext ) => string > = {
12+ b : ( node , h ) => `**${ h ( ) } **` ,
13+ strong : ( node , h ) => `**${ h ( ) } **` ,
14+ i : ( node , h ) => `*${ h ( ) } *` ,
15+ em : ( node , h ) => `*${ h ( ) } *` ,
16+ u : ( node , h ) => `<u>${ h ( ) } </u>` ,
17+ mark : ( node , h ) => `==${ h ( ) } ==` ,
18+ tt : ( node , h ) => `==${ h ( ) } ==` ,
19+ code : ( node , h ) => `==${ h ( ) } ==` ,
20+ strike : ( node , h ) => `~~${ h ( ) } ~~` ,
21+ sub : ( node , h ) => `~${ h ( ) } ~` ,
22+ super : ( node , h ) => `^${ h ( ) } ^` ,
23+ sup : ( node , h ) => `^${ h ( ) } ^` ,
24+ li : ( node , h ) => `- ${ h ( ) } \n` ,
25+ br : ( node , h ) => `\n` ,
26+ ol : ( node , h , ctx ) => `\n\n${ h ( { level : ( ctx ?. level ?? 0 ) + 1 } ) } \n\n` ,
27+ ul : ( node , h , ctx ) => `\n\n${ h ( { level : ( ctx ?. level ?? 0 ) + 1 } ) } \n\n` ,
28+ blockquote : ( node , h ) => `\n\n> ${ h ( ) } \n\n` ,
29+ pre : ( node , h ) => `\n\n\`\`\`\n${ h ( ) } \n\`\`\`\n\n` ,
30+ p : ( node , h ) => `\n\n${ h ( ) } \n\n` ,
31+ div : ( node , h ) => `\n\n${ h ( ) } \n\n` ,
32+ h1 : ( node , h ) => `\n\n# ${ h ( ) } \n\n` ,
33+ h2 : ( node , h ) => `\n\n## ${ h ( ) } \n\n` ,
34+ h3 : ( node , h ) => `\n\n### ${ h ( ) } \n\n` ,
35+ h4 : ( node , h ) => `\n\n#### ${ h ( ) } \n\n` ,
36+ h5 : ( node , h ) => `\n\n##### ${ h ( ) } \n\n` ,
37+ h6 : ( node , h ) => `\n\n###### ${ h ( ) } \n\n` ,
38+ hr : ( ) => `\n\n---\n\n` ,
39+ a : ( node , h ) => `[${ h ( ) } ](${ node . getAttribute ( 'href' ) ?? '#' } )` ,
40+ img : node => ` ?? '' } )` ,
41+ del : ( node , h ) => `~~${ h ( ) } ~~` ,
42+ ins : ( node , h ) => `++${ h ( ) } ++` ,
43+ span : ( node , h ) => h ( ) ,
44+ table : ( node , h ) => `\n\n${ h ( ) } \n\n` ,
45+ tr : ( node , h ) => `|${ h ( ) } |\n` ,
46+ th : ( node , h ) => ` ${ h ( ) } |` ,
47+ td : ( node , h ) => ` ${ h ( ) } |` ,
48+ caption : ( node , h ) => `\n${ h ( ) } \n` ,
49+ }
50+
1051function serialize ( node : VNode | VElement , context : SerializeContext = {
1152 level : 0 ,
1253 count : 0 ,
1354} ) : string {
1455 if ( node . nodeType === VNode . DOCUMENT_FRAGMENT_NODE ) {
15- return node . children . map ( c => serialize ( c , { ...context } ) ) . join ( '' )
56+ return ( node . children || [ ] ) . map ( c => serialize ( c , { ...context } ) ) . join ( '' )
1657 }
17-
1858 else if ( isVElement ( node ) ) {
1959 const tag : string = node . tagName . toLowerCase ( )
20-
21- const handleChildren = ( ctx ?: Partial < SerializeContext > ) : string => node . children . map ( c => serialize ( c , { ...context , ...ctx } ) ) . join ( '' )
22-
23- const rules : Record < string , ( ) => string > = {
24- b : ( ) => `**${ handleChildren ( ) } **` ,
25- strong : ( ) => `**${ handleChildren ( ) } **` ,
26- i : ( ) => `*${ handleChildren ( ) } *` ,
27- em : ( ) => `*${ handleChildren ( ) } *` ,
28- u : ( ) => `<u>${ handleChildren ( ) } </u>` ,
29- mark : ( ) => `==${ handleChildren ( ) } ==` ,
30- tt : ( ) => `==${ handleChildren ( ) } ==` ,
31- code : ( ) => `==${ handleChildren ( ) } ==` ,
32- strike : ( ) => `~~${ handleChildren ( ) } ~~` ,
33- sub : ( ) => `~${ handleChildren ( ) } ~` ,
34- super : ( ) => `^${ handleChildren ( ) } ^` ,
35- sup : ( ) => `^${ handleChildren ( ) } ^` ,
36- li : ( ) => `- ${ handleChildren ( ) } \n` , // todo numbered
37- br : ( ) => `${ handleChildren ( ) } \n` ,
38- ol : ( ) => `\n\n${ handleChildren ( { level : context . level + 1 } ) } \n\n` , // todo indent
39- ul : ( ) => `\n\n${ handleChildren ( { level : context . level + 1 } ) } \n\n` , // todo indent
40- blockquote : ( ) => `\n\n> ${ handleChildren ( ) } \n\n` , // todo continue '>'
41- pre : ( ) => `\n\n\`\`\`\n${ handleChildren ( ) } \n\`\`\`\n\n` ,
42- p : ( ) => `\n\n${ handleChildren ( ) } \n\n` ,
43- div : ( ) => `\n\n${ handleChildren ( ) } \n\n` ,
44- h1 : ( ) => `\n\n# ${ handleChildren ( ) } \n\n` ,
45- h2 : ( ) => `\n\n## ${ handleChildren ( ) } \n\n` ,
46- h3 : ( ) => `\n\n### ${ handleChildren ( ) } \n\n` ,
47- h4 : ( ) => `\n\n#### ${ handleChildren ( ) } \n\n` ,
48- h5 : ( ) => `\n\n##### ${ handleChildren ( ) } \n\n` ,
49- h6 : ( ) => `\n\n###### ${ handleChildren ( ) } \n\n` ,
50- hr : ( ) => `\n\n---\n\n` ,
51- a : ( ) => `[${ handleChildren ( ) } ](${ node . getAttribute ( 'href' ) ?? '#' } )` ,
52- img : ( ) => ` ?? '' } )` ,
53-
54- // todo audio, video and other HTML stuff
55- }
56-
60+ const handleChildren = ( ctx ?: Partial < SerializeContext > ) : string => ( node . children || [ ] ) . map ( c => serialize ( c , { ...context , ...ctx } ) ) . join ( '' )
5761 const fn = rules [ tag ]
58-
5962 if ( fn )
60- return fn ( )
63+ return fn ( node as VElement , handleChildren , context )
6164 else
6265 return handleChildren ( )
6366 }
0 commit comments