package Ġcom . se ans oper . z eb ec . blog Ċ Ċ import Ġcom . ct c . w st x . api . W st x Output Properties Ċ import Ġcom . fasterxml . jackson . core . Json Generator Ċ import Ġcom . fasterxml . jackson . core . Json Processing Exception Ċ import Ġcom . fasterxml . jackson . databind . Json Serializer Ċ import Ġcom . fasterxml . jackson . databind . Serialization Feature Ċ import Ġcom . fasterxml . jackson . databind . Serializer Provider Ċ import Ġcom . fasterxml . jackson . databind . module . Simple Module Ċ import Ġcom . fasterxml . jackson . data format . xml . Jack son Xml Module Ċ import Ġcom . fasterxml . jackson . data format . xml . Xml Mapper Ċ import Ġcom . fasterxml . jackson . data format . xml . ser . To Xml Generator Ċ import Ġcom . fasterxml . jackson . module . kotlin . Kotlin Module Ċ import Ġcom . se ans oper . z eb ec . blog . rss . Channel Ċ import Ġcom . se ans oper . z eb ec . blog . rss . Entry Ċ import Ġcom . se ans oper . z eb ec . blog . rss . Feed Ċ import Ġcom . se ans oper . z eb ec . configuration . Settings Ċ import Ġjava . io . IOException Ċ import Ġjava . net . URL Ċ import Ġjava . nio . file . Files Ċ import Ġjava . nio . file . Path Ċ import Ġjava . nio . file . Paths Ċ import Ġjava . time . Zone Id Ċ import Ġjava . time . format . DateTime Formatter . RFC _ 1 1 2 3 _ DATE _ TIME Ċ import Ġjava . util .* Ċ Ċ class ĠDate Encoder : ĠJsonSerializer < G regorian Calendar >() Ġ{ ĊĠĠĠ Ġ@ Throws ( IOException :: class , ĠJson Processing Exception :: class ) ĊĠĠĠ Ġoverride Ġfun Ġserialize ( value : ĠG regorian Calendar ?, Ġgen : ĠJson Generator ?, Ġserializers : ĠSerializer Provider ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġvalue ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgen ?. writeString ( this . to Z onedDateTime (). format ( RFC _ 1 1 2 3 _ DATE _ TIME )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠSerializer ( private Ġval Ġsettings : ĠSettings ) Ġ{ ĊĊĠĠĠ Ġfun Ġgenerate Feed ( basePath : ĠString Ġ= Ġsettings . basePath ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġblog Ġ= Ġsettings . blog Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġhost Ġ= Ġsettings . host Ġ?: Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġreturn Ġwrite Feed ( basePath , Ġhost , Ġblog ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠTODO : ĠSplit Ġinto Ġgenerate Ġvs . Ġwrite Ġfor Ġtest ability ĊĠĠĠ Ġfun Ġwrite Feed ( basePath : ĠString , Ġhost : ĠString , Ġblog : ĠBlog ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġentries Ġ= Ġget Entries ( blog ) Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġrel Path Ġ= Ġ"/ blog " ĊĠĠĠĠĠĠĠ Ġval Ġwrite Path Ġ= Ġ"$ basePath /$ rel Path / rss . xml " ĊĊĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠAdd Ġtitle Ġand Ġdescription Ġto Ġblog Ġconfiguration Ġand Ġuse Ġhere ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠURL Ġpath Ġshould Ġcome Ġfrom Ġconfig , Ġdifference Ġbetween Ġsrc Ġand Ġblog . directory . ĠOr Ġchange Ġconfig Ġso Ġthat Ġblog Ġsource Ġis Ġconfigure . src Ġ+ Ġblog . directory ĊĠĠĠĠĠĠĠ Ġval Ġchannel Ġ= ĠChannel (" eat . Ġcode . Ġstock s .", ĠURL (" https :// $ host $ rel Path "), Ġ" Writing Ġcode Ġfor Ġits Ġown Ġsake ", Ġitems Ġ= Ġentries ) ĊĊĠĠĠĠĠĠĠ Ġval Ġfeed Ġ= ĠFeed ( channel ) ĊĠĠĠĠĠĠĠ Ġval Ġmapper Ġ= ĠXml Mapper ( Jack son Xml Module (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠsetDefault Use Wrapper ( false ) ĊĠĠĠĠĠĠĠ Ġ}). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenable ( Serialization Feature . IND ENT _ OUTPUT ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġmapper . configure ( To Xml Generator . Feature . WRITE _ XML _ DECL AR ATION , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġmapper . factory . xml Output Factory . setProperty ( W st x Output Properties . P _ USE _ DOUBLE _ QUOT ES _ IN _ XML _ DECL , Ġtrue ) ĊĊĠĠĠĠĠĠĠ Ġval Ġmodule Ġ= ĠSimple Module () ĊĠĠĠĠĠĠĠ Ġmodule . add Serializer ( G regorian Calendar :: class . java , ĠDate Encoder ()) ĊĠĠĠĠĠĠĠ Ġmapper . register Module ( module ) ĊĠĠĠĠĠĠĠ Ġmapper . register Module ( Kotlin Module ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġserialized Ġ= Ġmapper . writeValue AsString ( feed ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFiles . write ( Paths . get ( write Path ), Ġserialized . toByteArray ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exception : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Entries ( blog : ĠBlog ): ĠList < Entry >? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġentries Ġ= Ġblog . get Entries () Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġshouldn âĢĻ t Ġhave Ġto Ġdo Ġthis Ġtwice , Ġmaybe Ġmake Ġit Ġnon - nullable ĊĠĠĠĠĠĠĠ Ġval Ġhost Ġ= Ġsettings . host Ġ?: Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġreturn Ġentries . sorted By Ġ{ Ġit . created Date Ġ}. reversed (). map NotNull Ġ{ Ġmetadata Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblog . getEntry Path ( metadata , Ġsettings )?. let Ġ{ Ġrelative Path ( settings . source , Ġit ) Ġ} ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġurl Ġ= ĠURL (" https :// $ host $ it ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdescription Ġ= Ġmetadata . subtitle Ġ?: Ġmetadata . first Paragraph Ġ?: Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġz oned Ġ= Ġmetadata . created Date . at Zone ( Zone Id . system Default ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpublished Date Ġ= ĠG regorian Calendar . from ( zon ed ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEntry ( metadata . title , Ġurl , Ġdescription , Ġpublished Date ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠTODO : ĠCon solid ate Ġwith ĠBlog . relative Path , ĠEventHandler . process File Ġand ĠEventHandler . destination ĊĠĠĠ Ġprivate Ġfun Ġrelative Path ( source : ĠPath , Ġcompiled Blog Path : ĠPath ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġprefix Ġ= Ġsource . toString (). common Prefix With ( compiled Blog Path . toString ()) ĊĠĠĠĠĠĠĠ Ġval Ġpath Ġ= Ġcompiled Blog Path . toString (). remove Prefix ( prefix ). replace ("/ ./ ", Ġ"/") ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( path . startsWith ("/ ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpath ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"/ $ path " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }