1- import { RenderOption } from './options' ;
1+ import Node from './nodes/node' ;
2+ import TextNode from './nodes/text' ;
3+ import Document from './nodes/document' ;
4+ import MarkType from './nodes/mark-type' ;
5+ import { nodeToMetadata } from './Models/metadata-model' ;
26import { EntryEmbedable } from './Models/embedded-object' ;
37import { findRenderContent } from './helper/find-render-content' ;
4- import Document from './nodes/document' ;
5- import { defaultOptions } from './options/default-options' ;
8+ import { defaultNodeOption } from './options/default-node-options' ;
9+ import { Next , RenderMark , RenderNode , RenderOption } from './options' ;
10+ import { findEmbeddedItems , findRenderString } from './helper/find-embeded-object' ;
611
7- export const defaultNodeOption : RenderOption = {
8-
9- }
12+ export type AnyNode = TextNode | Node ;
1013
1114export function jsonToHTML ( option : {
1215 entry : EntryEmbedable | EntryEmbedable [ ] ,
@@ -65,21 +68,69 @@ function enumerateContents(
6568 } )
6669 return result
6770 }
68- return parseJsonToHTML ( content )
71+ const commonRenderOption = {
72+ ...defaultNodeOption ,
73+ ...renderOption
74+ }
75+ return nodeChildrenToHTML ( content . children , commonRenderOption , entry )
6976}
7077
71- export function parseJsonToHTML (
72- content : Document ,
73- entry ?: EntryEmbedable ,
74- renderOption ?: RenderOption ,
78+ export function textNodeToHTML ( node : TextNode , renderOption : RenderOption ) : string {
79+ let text = node . text
80+ if ( node . superscript ) {
81+ text = ( renderOption [ MarkType . SUPERSCRIPT ] as RenderMark ) ( text )
82+ }
83+ if ( node . subscript ) {
84+ text = ( renderOption [ MarkType . SUBSCRIPT ] as RenderMark ) ( text )
85+ }
86+ if ( node . inlineCode ) {
87+ text = ( renderOption [ MarkType . INLINE_CODE ] as RenderMark ) ( text )
88+ }
89+ if ( node . strikethrough ) {
90+ text = ( renderOption [ MarkType . STRIKE_THROUGH ] as RenderMark ) ( text )
91+ }
92+ if ( node . underline ) {
93+ text = ( renderOption [ MarkType . UNDERLINE ] as RenderMark ) ( text )
94+ }
95+ if ( node . italic ) {
96+ text = ( renderOption [ MarkType . ITALIC ] as RenderMark ) ( text )
97+ }
98+ if ( node . bold ) {
99+ text = ( renderOption [ MarkType . BOLD ] as RenderMark ) ( text )
100+ }
101+ return text
102+ }
103+
104+ export function referenceToHTML ( node : Node ,
105+ renderOption : RenderOption ,
106+ entry ?: EntryEmbedable
75107) : string {
76- // TODO: functionality to be added
77- const renderNode = {
78- ...defaultNodeOption ,
79- ...defaultOptions ,
80- ...renderOption
108+ if ( ! entry ) {
109+ return ''
81110 }
111+ const metadata = nodeToMetadata ( node . attrs , node . children . length > 0 ? node . children [ 0 ] as unknown as TextNode : undefined )
112+ metadata . item = findEmbeddedItems ( metadata , entry ) [ 0 ]
113+ return findRenderString ( metadata , renderOption )
114+ }
115+
116+ function nodeChildrenToHTML ( nodes : AnyNode [ ] ,
117+ renderOption : RenderOption ,
118+ entry ?: EntryEmbedable ,
119+ ) : string {
120+ return nodes . map < string > ( ( node : AnyNode ) => nodeToHTML ( node , renderOption , entry ) ) . join ( '' )
121+ }
82122
83-
84- return ''
123+ function nodeToHTML (
124+ node : AnyNode ,
125+ renderOption : RenderOption ,
126+ entry ?: EntryEmbedable ,
127+ ) : string {
128+ if ( ! node . type ) {
129+ return textNodeToHTML ( node as TextNode , renderOption )
130+ } else if ( ( node . type as string ) === 'reference' ) {
131+ return referenceToHTML ( node , renderOption , entry )
132+ } else {
133+ const next : Next = nodes => nodeChildrenToHTML ( nodes , renderOption , entry )
134+ return ( renderOption [ node . type ] as RenderNode ) ( node , next )
135+ }
85136}
0 commit comments