123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189moduleRenderAttrs=structmoduleC=Cmarkit_renderer.ContextopenCmarkitletadd_attrc(key,value)=matchvaluewith|Some{Cmarkit.Attributes.v=value;delimiter=Somed}->lets=Format.sprintf" %s=%c%s%c"keydvaluedinC.stringcs|Some{Cmarkit.Attributes.v=value;delimiter=None}->C.stringc(" "^key^"="^value)|None->C.stringc(" "^key)letadd_attrsc?(include_id=true)attrs=letkv_attrs=letkv_attrs=Cmarkit.Attributes.kv_attributesattrsinList.map(fun((k,_),v)->letv=matchvwithNone->None|Some(v,_)->Somevin(k,v))kv_attrsinletclass'=letclass'=Cmarkit.Attributes.class'attrsinletclass'=List.map(fun(c,_)->c)class'inmatchclass'with|[]->[]|_->letv=String.concat" "class'in[("class",Some{Cmarkit.Attributes.v;delimiter=Some'"'})]inletid=letid=Cmarkit.Attributes.idattrsinmatchidwith|Some(id,_)wheninclude_id->letattr={Cmarkit.Attributes.v=id;delimiter=Some'"'}in[("id",Someattr)]|_->[]inletattrs=id@class'@kv_attrsinList.iter(add_attrc)attrsletopen_block?(with_newline=true)ctagattrs=C.stringc"<";C.stringctag;add_attrscattrs;C.stringc">";ifwith_newlinethenC.stringc"\n"letclose_block?(with_newline=true)ctag=C.stringc"</";C.stringctag;C.stringc">";ifwith_newlinethenC.stringc"\n"letin_blockc?(with_newline=true)tagattrsf=open_block~with_newlinectagattrs;f();close_block~with_newlinectagletwith_attrs_spanc?(with_newline=true)attrsf=ifAttributes.is_emptyattrsthenf()elsein_blockc~with_newline"span"attrsfletblock_linesc=function(* newlines only between lines *)|[]->()|(l,_)::ls->letlinec(l,_)=C.bytec'\n';C.stringclinC.stringcl;List.iter(linec)lsendletto_string=function(* Standard Cmarkit nodes *)|Cmarkit.Block.Blank_line_->"Blank line"|Cmarkit.Block.Block_quote_->"Block_quote"|Cmarkit.Block.Blocks_->"Blocks"|Cmarkit.Block.Code_block_->"Code_block"|Cmarkit.Block.Heading_->"Heading"|Cmarkit.Block.Html_block_->"Html_block"|Cmarkit.Block.Link_reference_definition_->"Link_reference_definition"|Cmarkit.Block.List_->"List"|Cmarkit.Block.Paragraph_->"Paragraph"|Cmarkit.Block.Thematic_break_->"Thematic_break"(* Extension Cmarkit nodes *)|Cmarkit.Block.Ext_math_block_->"Ext_math_block"|Cmarkit.Block.Ext_table_->"Ext_table"|Cmarkit.Block.Ext_footnote_definition_->"Ext_footnote_definition"|Cmarkit.Block.Ext_standalone_attributes_->"Ext_standalone_attributes"|Cmarkit.Block.Ext_attribute_definition_->"Ext_attribute_definition"(* Slipshow nodes *)|Ast.Included_->"Included"|Ast.Div_->"Div"|Ast.Slide_->"Slide"|Ast.Slip_->"Slip"|Ast.SlipScript_->"SlipScript"|_->"other"letcustom_html_renderer=letopenCmarkit_rendererinletopenCmarkitinletopenCmarkit_htmlinletdefault=renderer~safe:false()inletcustom_html=letinlinec=function|Inline.Text((t,(attrs,_)),_)->(* Put text inside spans to be able to apply styles on them *)Context.stringc"<span";add_attrscattrs;Context.bytec'>';html_escaped_stringct;Context.stringc"</span>";true(* | Inline.Ext_attrs (attrs_span, _) -> Context.string c "yooooo"; let (attrs, _) = Inline.Attributes_span.attrs attrs_span and i = Inline.Attributes_span.content attrs_span in RenderAttrs.with_attrs_span c attrs (fun () -> Context.inline c i); *)(* true *)|_->false(* let the default HTML renderer handle that *)inletblockc=function|Ast.Included((b,(attrs,_)),_)|Ast.Div((b,(attrs,_)),_)->letshould_include_div=letattrs_is_not_empty=not@@Attributes.is_emptyattrsinletcontains_multiple_blocks=letis_multiplel=l|>List.filter_map(function|Block.Blank_line_->None|x->Somex)|>List.length|>(<=)2inmatchbwith|Block.Blocks(l,_)whenis_multiplel->true|_->falseinattrs_is_not_empty||contains_multiple_blocksinifshould_include_divthenRenderAttrs.in_blockc"div"attrs(fun()->Context.blockcb)elseContext.blockcb;true|Ast.Slide(({content;title},(attrs,_)),_)->let()=RenderAttrs.in_blockc"div"(Attributes.add_classattrs("slipshow-rescaler",Meta.none))@@fun()->RenderAttrs.in_blockc"div"(Attributes.make~class':[("slide",Meta.none)]())@@fun()->(matchtitlewith|None->()|Some(title,(title_attrs,_))->RenderAttrs.in_blockc"div"(Attributes.add_classtitle_attrs("slide-title",Meta.none))(fun()->Context.inlinectitle));RenderAttrs.in_blockc"div"(Attributes.make~class':[("slide-body",Meta.none)]())@@fun()->Context.blockccontentintrue|Ast.Slip((slip,(attrs,_)),_)->let()=RenderAttrs.in_blockc"div"(Attributes.add_classattrs("slipshow-rescaler",Meta.none))@@fun()->RenderAttrs.in_blockc"div"(Attributes.make~class':[("slip",Meta.none)]())@@fun()->RenderAttrs.in_blockc"div"(Attributes.make~class':[("slip-body",Meta.none)]())@@fun()->Context.blockcslipintrue|Ast.SlipScript((cb,(attrs,_)),_)->letattrs=Attributes.add("type",Meta.none)(Some({v="slip-script";delimiter=None},Meta.none))attrsinRenderAttrs.in_blockc"script"attrs(fun()->RenderAttrs.block_linesc(Block.Code_block.codecb));true|_->falseinmake~inline~block()incomposedefaultcustom_html