package Ġwatch . craft . dsl Ċ Ċ import Ġcom . fasterxml . jackson . databind . Deserialization Feature Ċ import Ġcom . fasterxml . jackson . module . kotlin . jackson ObjectMapper Ċ import Ġcom . fasterxml . jackson . module . kotlin . readValue Ċ import Ġwatch . craft . Malformed Input Exception Ċ import Ġwatch . craft . Skip Item Exception Ċ import Ġjava . net . URI Ċ import Ġjava . net . UR ISyntaxException Ċ Ċ fun ĠString . skip If On Black list ( var arg Ġblacklist : ĠString ) Ġ{ ĊĠ Ġif Ġ( contains Word (* blacklist )) Ġ{ ĊĠĠĠ Ġthrow ĠSkip Item Exception (" Contains Ġblack listed Ġterm Ġ${ blacklist . toList () }") ĊĠ Ġ} Ċ } Ċ Ċ inline Ġfun Ġ< re ified ĠT Ġ: ĠAny > ĠString . json From () Ġ= Ġtry Ġ{ ĊĠ Ġj ack son ObjectMapper () ĊĠĠĠ Ġ. disable ( Deserialization Feature . FAIL _ ON _ UNKNOWN _ PROPERTIES ) ĊĠĠĠ Ġ. readValue < T >( this ) Ċ } Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠ Ġthrow ĠMal formed Input Exception (" Couldn 't Ġread ĠJSON Ġdata ", Ġe ) Ċ } Ċ Ċ fun ĠString . to Uri () Ġ= Ġtry Ġ{ ĊĠ ĠURI ( this ) Ċ } Ġcatch Ġ( e : ĠUR ISyntaxException ) Ġ{ ĊĠ Ġthrow ĠMal formed Input Exception (" URL Ġsyntax Ġerror : Ġ${ this }", Ġe ) Ċ } Ċ Ċ fun ĠString . clean se ( var arg Ġregex es ToRemove : ĠString ) Ġ= Ġregex es ToRemove . fold ( this ) Ġ{ Ġstr , Ġregex Ġ-> ĊĠ Ġstr . replace ( regex . to Regex ( regex Options ( true )), Ġ"") Ċ }. replace ("\\ s +". to Regex (), Ġ" Ġ"). trim () Ċ Ċ fun ĠString . contains Word ( var arg Ġwords : ĠString ) Ġ= Ġtokenize () ĊĠ Ġ. filter Ġ{ Ġit . word y Ġ} ĊĠ Ġ. map Ġ{ Ġit . text . toLowerCase () Ġ} ĊĠ Ġ. toSet () ĊĠ Ġ. any Ġ{ Ġit Ġin Ġwords Ġ} Ċ Ċ fun ĠString . contains Match ( regex : ĠString , Ġignore Case : ĠBoolean Ġ= Ġtrue ) Ġ= Ġregex . to Regex ( regex Options ( ignore Case )) ĊĠ Ġ. contains Match In ( this ) Ċ Ċ fun ĠString . extract ( regex : ĠString , Ġignore Case : ĠBoolean Ġ= Ġtrue ) Ġ= Ġregex . to Regex ( regex Options ( ignore Case )) ĊĠ Ġ. find ( this )?. group Values ĊĠ Ġ?: Ġthrow ĠMal formed Input Exception (" Can 't Ġextract Ġregex : Ġ${ regex }") Ċ Ċ fun ĠList < String >. int From ( idx : ĠInt ) Ġ= Ġget ( idx ). toInt () Ċ fun ĠList < String >. double From ( idx : ĠInt ) Ġ= Ġget ( idx ). toDouble () Ċ fun ĠList < String >. string From ( idx : ĠInt ) Ġ= Ġget ( idx ). trim () Ċ Ċ fun ĠString . to Title Case () Ġ= Ġtokenize () ĊĠ Ġ. join ToString ("") Ġ{ Ġtoken Ġ-> ĊĠĠĠ Ġif Ġ( token . word y Ġ&& Ġtoken . text Ġ! in ĠBE ER _ AC R ONY MS ) Ġ{ ĊĠĠĠĠĠ Ġtoken . text . toLowerCase (). capitalize () ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġtoken . text ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ Ċ private Ġfun ĠString . tokenize (): ĠList < Token > Ġ{ ĊĠ Ġif Ġ( length Ġ== Ġ 0 ) Ġ{ ĊĠĠĠ Ġreturn Ġempty List () ĊĠ Ġ} ĊĊĠ Ġfun Ġword y ( c : ĠChar ) Ġ= ĠCharacter . is Alphabet ic ( c . toInt ()) Ġ|| Ġ( c Ġ== Ġ'\' ') ĊĊĠ Ġval Ġchars Ġ= Ġto CharArray () ĊĠ Ġval Ġtokens Ġ= Ġmutable ListOf < Token >() ĊĠ Ġvar Ġi Start Ġ= Ġ 0 ĊĠ Ġvar Ġword y Ġ= Ġword y ( chars [ 0 ]) ĊĠ Ġfor Ġ( i Ġin Ġ 1 Ġuntil Ġlength ) Ġ{ ĊĠĠĠ Ġval Ġnext Word y Ġ= Ġword y ( chars [ i ]) ĊĠĠĠ Ġif Ġ( next Word y Ġ!= Ġword y ) Ġ{ ĊĠĠĠĠĠ Ġtokens . add ( Token ( substring ( i Start , Ġi ), Ġword y )) ĊĠĠĠĠĠ Ġi Start Ġ= Ġi ĊĠĠĠ Ġ} ĊĠĠĠ Ġword y Ġ= Ġnext Word y ĊĠ Ġ} ĊĠ Ġtokens . add ( Token ( substring ( i Start , Ġlength ), Ġword y )) ĊĠ Ġreturn Ġtokens Ċ } Ċ Ċ private Ġdata Ġclass ĠToken ( ĊĠ Ġval Ġtext : ĠString , ĊĠ Ġval Ġword y : ĠBoolean Ċ ) Ċ Ċ fun Ġ< R Ġ: ĠAny > ĠString . collect From Lines ( extract : ĠString . () Ġ-> ĠR ) Ġ= Ġsplit ("\ n "). map NotNull Ġ{ Ġit . maybe ( extract ) Ġ} Ċ Ċ private Ġfun Ġregex Options ( ignore Case : ĠBoolean ) Ġ= Ġif Ġ( ignore Case ) Ġ{ ĊĠ Ġset Of ( Regex Option . DOT _ MATCH ES _ ALL , ĠRegex Option . IGNORE _ CASE ) Ċ } Ġelse Ġ{ ĊĠ Ġset Of ( Regex Option . DOT _ MATCH ES _ ALL ) Ċ } Ċ Ċ private Ġval ĠBE ER _ AC R ONY MS Ġ= ĠlistOf ( ĊĠ Ġ" IP L ", ĊĠ Ġ" IP A ", ĊĠ Ġ" DD H ", ĊĠ Ġ" NE IP A ", ĊĠ Ġ" DI PA ", ĊĠ Ġ" N ED IP A ", ĊĠ Ġ" X PA " Ċ ) ĊĊ