/* Ċ Ġ* ĠCopyright Ġ 2 0 1 5 - 2 0 1 7 ĠPeng ĠW an Ġ< ph yl ame @ 1 6 3 . com > Ċ Ġ* Ċ Ġ* ĠThis Ġfile Ġis Ġpart Ġof ĠJ em . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġj em . format . pm ab Ċ Ċ import Ġj cl p .* Ċ import Ġj cl p . io . F lob Ċ import Ġj cl p . io . ext Name Ċ import Ġj cl p . setting . Settings Ċ import Ġj cl p . setting . getString Ċ import Ġj cl p . text . Converter Manager Ċ import Ġj cl p . text . TEXT _ PLAIN Ċ import Ġj cl p . text . Text Ċ import Ġj cl p . text . or Ċ import Ġj cl p . v dm .* Ċ import Ġj cl p . xml .* Ċ import Ġj em . Book Ċ import Ġj em . Chapter Ċ import Ġj em . ep m . EXT _ EP M _ METADATA Ċ import Ġj em . ep m . V dm Maker Ċ import Ġj em . format . util . fail Maker Ċ import Ġj em . format . util . xml Encoding Ċ import Ġj em . format . util . xml Indent Ċ import Ġj em . format . util . xml Separator Ċ import Ġorg . xml pull . v 1 . Xml Pull Parser Factory Ċ import Ġorg . xml pull . v 1 . Xml Serializer Ċ import Ġjava . io . ByteArray OutputStream Ċ import Ġjava . nio . charset . Charset Ċ import Ġjava . time . LocalDate Ċ import Ġjava . time . LocalDateTime Ċ import Ġjava . time . Local Time Ċ import Ġjava . time . format . DateTime Formatter Ċ Ċ internal Ġobject ĠP m ab Maker Ġ: ĠV dm Maker Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġvalidate ( book : ĠBook , Ġoutput : ĠString , Ġarguments : ĠSettings ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġversion Ġ= Ġarguments ?. getString (" ep ub . maker . version ") ĊĠĠĠĠĠĠĠ Ġif Ġ( version Ġ!= Ġnull Ġ&& Ġversion Ġ!= Ġ" 3 . 0 ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfail Maker (" pm ab . make . unsupported Version ", Ġversion ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġmake ( book : ĠBook , Ġoutput : ĠV dm Writer , Ġarguments : ĠSettings ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= ĠLocal ( book , Ġoutput , Ġarguments ) ĊĠĠĠĠĠĠĠ Ġval Ġversion Ġ= Ġdata . getConfig (" version ") ĊĠĠĠĠĠĠĠ Ġwhen Ġ( version ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull , Ġ" 3 . 0 " Ġ-> Ġwrite PM AB v 3 ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfail Maker (" pm ab . make . unsupported Version ", Ġversion ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġwrite PM AB v 3 ( data : ĠLocal ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdata . writer . write Bytes ( PM AB . MIME _ PATH , ĠPM AB . MIME _ PM AB . toByteArray ()) ĊĠĠĠĠĠĠĠ Ġwrite P BM v 3 ( data ) ĊĠĠĠĠĠĠĠ Ġwrite P BC v 3 ( data ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġwrite P BM v 3 ( data : ĠLocal ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdata . begin Xml (" pb m ", Ġ" 3 . 0 ", ĠPM AB . P BM _ XML NS ). let Ġ{ Ġout Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Metadata ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Value Map ( data . book . attributes , Ġ" attributes ", Ġ" m -", Ġdata ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Value Map ( data . book . extensions , Ġ" extensions ", Ġ" x -", Ġdata ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata . end Xml ( out , ĠPM AB . P BM _ PATH ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġwrite P BC v 3 ( data : ĠLocal ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdata . begin Xml (" p bc ", Ġ" 3 . 0 ", ĠPM AB . P BC _ XML NS ). let Ġ{ Ġout Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( data . render ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Tag (" nav ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata . book . forEach Indexed Ġ{ Ġi , Ġchapter Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Chapter ( chapter , Ġ( i Ġ+ Ġ 1 ). toString (), Ġdata ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Tag () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata . end Xml ( out , ĠPM AB . P BC _ PATH ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġwrite Chapter ( chapter : ĠChapter , Ġsuffix : ĠString , Ġdata : ĠLocal ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwith ( data . render ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Tag (" chapter ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprefix Ġ= Ġ" chapter -$ suffix " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Value Map ( chapter . attributes , Ġ" attributes ", Ġprefix Ġ+ Ġ"-", Ġdata ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchapter . text ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Tag (" content ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattribute (" type ", Ġtext Type ( it , Ġdata )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext ( write Text ( it , Ġprefix , Ġdata )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Tag () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchapter . forEach Indexed Ġ{ Ġi , Ġchapter Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Chapter ( chapter , Ġ"$ suffix -${ i Ġ+ Ġ 1 }", Ġdata ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġend Tag () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġwrite Metadata ( data : ĠLocal ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvalues Ġ= Ġ( data . arguments ?. get (" maker . pm ab . meta ") Ġ?: Ġdata . book . extensions [ EXT _ EP M _ METADATA ]) as ? ĠMap < *, Ġ*> Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġwith ( data . render ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Tag (" head ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ(( key , Ġvalue ) Ġin Ġvalues ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Tag (" meta ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattribute (" name ", Ġkey ?. toString () Ġ?: Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattribute (" value ", Ġvalue ?. toString () Ġ?: Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Tag () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġend Tag () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġwrite Value Map ( map : ĠValue Map , ĠtagName : ĠString , Ġprefix : ĠString , Ġdata : ĠLocal ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwith ( data . render ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Tag ( tagName ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ(( name , Ġvalue ) Ġin Ġmap ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! name . startsWith (" !-- ") Ġ&& Ġname Ġ!= ĠEXT _ EP M _ METADATA ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Item ( name , Ġvalue , Ġprefix , Ġdata ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġend Tag () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġwrite Item ( name : ĠString , Ġvalue : ĠAny , Ġprefix : ĠString , Ġdata : ĠLocal ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwith ( data . render ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Tag (" item ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġattribute (" name ", Ġname ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtype : ĠString Ġ= ĠType Manager . STRING ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtext Ġ= Ġwhen Ġ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠText Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġtext Type ( value , Ġdata ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Text ( value , Ġprefix Ġ+ Ġname , Ġdata ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠF lob Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġvalue . mime Type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite F lob ( value , Ġprefix Ġ+ Ġname , Ġdata ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCharSequence Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= ĠType Manager . STRING ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠLocalDate Ġ-> Ġ( data . getConfig (" date Format ") Ġ?: ĠLO OSE _ DATE _ FORMAT ). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġ"${ Type Manager . DATE }; format =$ it " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue . format ( DateTime Formatter . of Pattern ( it )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠLocal Time Ġ-> Ġ( data . getConfig (" time Format ") Ġ?: ĠLO OSE _ TIME _ FORMAT ). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġ"${ Type Manager . TIME }; format =$ it " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue . format ( DateTime Formatter . of Pattern ( it )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠLocalDateTime Ġ-> Ġ( data . getConfig (" datetime Format ") Ġ?: ĠLO OSE _ DATE _ TIME _ FORMAT ). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġ"${ Type Manager . DATETIME }; format =$ it " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue . format ( DateTime Formatter . of Pattern ( it )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= ĠType Manager . getType ( value ) Ġ?: ĠType Manager . STRING ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConverter Manager . render ( value ) Ġ?: Ġvalue . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġattribute (" type ", Ġtype ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext ( text Ġ?: Ġvalue . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġend Tag () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġwrite F lob ( f lob : ĠF lob , Ġname : ĠString , Ġdata : ĠLocal ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpath Ġ= Ġ" resources /$ name .${ ext Name ( f lob . name ) Ġor Ġ" dat "} " ĊĠĠĠĠĠĠĠ Ġdata . writer . write F lob ( path , Ġf lob ) ĊĠĠĠĠĠĠĠ Ġreturn Ġpath ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtext Type ( text : ĠText , Ġdata : ĠLocal ) Ġ= Ġ" text /${ text . type }; encoding =${ data . charset }" ĊĊĠĠĠ Ġprivate Ġfun Ġwrite Text ( text : ĠText , Ġname : ĠString , Ġdata : ĠLocal ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpath Ġ= Ġ" text /$ name .${ if Ġ( text . type Ġ== ĠTEXT _ PLAIN ) Ġ" txt " Ġelse Ġtext . type }" ĊĠĠĠĠĠĠĠ Ġdata . writer . write Text ( path , Ġtext , Ġdata . charset ) ĊĠĠĠĠĠĠĠ Ġreturn Ġpath ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġdata Ġclass ĠLocal ( val Ġbook : ĠBook , Ġval Ġwriter : ĠV dm Writer , Ġval Ġarguments : ĠSettings ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrender : ĠXml Serializer Ġ= ĠXml Pull Parser Factory . newInstance (). new Serializer () ĊĊĠĠĠĠĠĠĠ Ġval Ġcharset : ĠCharset Ġ= ĠgetConfig (" encoding ") ?. let Ġ{ ĠCharset . forName ( it ) Ġ} Ġ?: ĠChar sets . UTF _ 8 ĊĊĠĠĠĠĠĠĠ Ġfun ĠgetConfig ( key : ĠString ) Ġ= Ġarguments ?. getString (" maker . pm ab .$ key ") ĊĊĠĠĠĠĠĠĠ Ġfun Ġbegin Xml ( root : ĠString , Ġversion : ĠString , Ġxmlns : ĠString ) Ġ= ĠByteArrayOutputStream (). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( render ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinit ( it , Ġarguments . xml Encoding , Ġarguments . xml Indent , Ġarguments . xml Separator ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Document ( arguments . xml Encoding ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Tag ("", Ġxmlns , Ġroot ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattribute (" version ", Ġversion ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġend Xml ( buffer : ĠByteArrayOutputStream , Ġpath : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrender . end Document () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . use Stream ( path ) Ġ{ Ġbuffer . writeTo ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ