/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 8 ĠReg ents Ġof Ġthe ĠUniversity Ġof ĠMin nes ota . Ċ Ġ* Ċ Ġ* Ġ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 Ġedu . umn . bio med ic us . framework Ċ Ċ import Ġedu . umn . nlp engine . Document Ċ import Ġedu . umn . nlp engine . Label Ċ import Ġedu . umn . nlp engine . Span Ċ import Ġedu . umn . nlp engine . Text Range Ċ import Ġjava . util .* Ċ import Ġjavax . inject . Inject Ċ import Ġjavax . inject . Singleton Ċ Ċ /** Ċ Ġ* ĠFactory Ġfor Ġparsing ĠTag Ex Ġexpressions Ġinto Ġ[ Tag Ex ] Ġobjects . Ċ Ġ*/ Ċ @ Singleton Ċ class ĠTag Ex Factory Ġ@ Inject Ġconstructor ( private Ġval Ġsearch Expr Factory : ĠSearch Expr Factory ) Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠParses Ġthe Ġexpression Ġinto Ġa Ġ[ Tag Ex ] Ġobject . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġparse ( expr : ĠString ): ĠTag Ex Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠTag Ex ( search Expr Factory . parse ( expr )) ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠThe Ġa Ġ[ Tag Ex ] Ġsearch Ġmatch . Ċ Ġ*/ Ċ interface ĠTag Ex Match Ġ: ĠText Range Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġnamed Ġlabels Ġfound Ġduring Ġthe Ġmatch ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġnamed Labels : ĠNamed Labels ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġnamed Ġspans Ġfound Ġduring Ġthe Ġmatch ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġnamed Spans : ĠNamed Spans Ċ } Ċ Ċ /** Ċ Ġ* ĠNamed Ġlabels Ġof Ġa ĠTag Ex Ġsearch Ġexpression Ġfound Ġduring Ġsearch . Ċ Ġ*/ Ċ interface ĠNamed Labels Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġvalue Ġof Ġthe Ġlabel Ġwith Ġthe Ġspecified Ġ[ name ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Label ( name : ĠString ): ĠLabel ? ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġwhether Ġthe Ġlabel Ġwith Ġthe Ġspecified Ġ[ name ] Ġwas Ġfound ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġcontains Label ( name : ĠString ): ĠBoolean Ċ } Ċ Ċ /** Ċ Ġ* ĠGet Ġoperator Ġfunction Ġwhich Ġuses Ġthe Ġreturn Ġtype Ġ[ T ] Ġand Ġ[ name ] Ġto Ġretrieve Ġa Ġlabel Ġvalue . Ċ Ġ*/ Ċ inline Ġoperator Ġfun Ġ< re ified ĠT > ĠNamed Labels . get ( name : ĠString ): ĠT ? Ġ{ ĊĠĠĠ Ġval Ġlabel Ġ= Ġget Label ( name ) ĊĠĠĠ Ġreturn Ġlabel Ġas ? ĠT Ċ } Ċ Ċ /** Ċ Ġ* ĠNamed Ġspans Ġof Ġa ĠTag Ex Ġsearch Ġexpression Ġfound Ġduring Ġsearch . Ċ Ġ*/ Ċ interface ĠNamed Spans Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġnamed Ġspan Ġwith Ġthe Ġgiven Ġname . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoperator Ġfun Ġget ( name : ĠString ): ĠSpan ? Ċ } Ċ Ċ /** Ċ Ġ* ĠA Ġcompiled Ġsearch Ġexpression . Ċ Ġ*/ Ċ class ĠTag Ex ( private Ġval Ġexpr : ĠSearch Expr ) Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFinds Ġthe Ġfirst Ġmatch Ġof Ġthe Ġexpression Ġin Ġthe Ġ[ document ] Ġor Ġnull Ġif Ġthere Ġis Ġno Ġmatch . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġfind ( document : ĠDocument ): ĠTag Ex Match ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfind ( document , Ġdocument ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFinds Ġthe Ġfirst Ġmatch Ġof Ġthe Ġexpression Ġin Ġthe Ġ[ text Range ] Ġin Ġthe Ġ[ document ] Ġor Ġnull Ġif Ġthere ĊĠĠĠĠ Ġ* Ġis Ġno Ġmatch . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġfind ( document : ĠDocument , Ġtext Range : ĠText Range ): ĠTag Ex Match ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsearch er Ġ= Ġexpr . create Searcher ( document ) ĊĠĠĠĠĠĠĠ Ġsearch er . search ( text Range ) ĊĠĠĠĠĠĠĠ Ġreturn Ġsearch er . to SearchResult ()?. let Ġ{ ĠSearch er Tag Ex Match ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFinds Ġall Ġthe Ġmatches Ġof Ġthe Ġexpression Ġin Ġthe Ġ[ document ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠfindAll ( document : ĠDocument ): ĠSequence < Tag Ex Match > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠfindAll ( document , Ġdocument ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFinds Ġall Ġthe Ġmatches Ġof Ġthe Ġexpression Ġin Ġthe Ġ[ text Range ] Ġin Ġthe Ġ[ document ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠfindAll ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdocument : ĠDocument , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Range : ĠText Range ĊĠĠĠ Ġ): ĠSequence < Tag Ex Match > Ġ= Ġobject Ġ: ĠSequence < Tag Ex Match > Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġiterator (): ĠIterator < Tag Ex Match > Ġ= Ġobject Ġ: ĠIterator < Tag Ex Match > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsearch er Ġ= Ġexpr . create Searcher ( document ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġhas Next Ġ= Ġsearch er . search ( text Range ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġhas Next (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġhas Next ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġnext (): ĠTag Ex Match Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! hasNext ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠNoSuch ElementException (" No Ġnext ĠTag Ex Ġresult .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġsearch er . to SearchResult () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠAssertionError ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" hasNext Ġshould Ġbe Ġonly Ġbe Ġtrue Ġif Ġthis Ġis Ġnon - null " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas Next Ġ= Ġsearch er . search ( text Range ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠSearch er Tag Ex Match ( result ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFinds Ġwhether Ġthe Ġentire Ġ[ document ] Ġmatches Ġthis Ġexpression . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġmatch ( document : ĠDocument ): ĠTag Ex Match ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmatch ( document , Ġdocument ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFinds Ġwhether Ġa Ġ[ text Range ] Ġinside Ġa Ġ[ document ] Ġmatches Ġthis Ġexpression . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġmatch ( document : ĠDocument , Ġtext Range : ĠText Range ): ĠTag Ex Match ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsearch er Ġ= Ġexpr . create Searcher ( document ) ĊĠĠĠĠĠĠĠ Ġsearch er . match ( text Range ) ĊĠĠĠĠĠĠĠ Ġreturn Ġsearch er . to SearchResult ()?. let Ġ{ ĠSearch er Tag Ex Match ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġtrue Ġif Ġthe Ġentire Ġ[ document ] Ġmatches Ġthis Ġexpression , Ġfalse Ġotherwise . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġmatches ( document : ĠDocument ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmatches ( document , Ġdocument ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġtrue Ġif Ġthe Ġ[ text Range ] Ġinside Ġa Ġ[ document ] Ġmatches Ġthis Ġexpression , Ġfalse Ġotherwise . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġmatches ( document : ĠDocument , Ġtext Range : ĠText Range ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġexpr . create Searcher ( document ). match ( text Range ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġclass ĠSearch er Tag Ex Match ( private Ġval Ġsearch Result : ĠSearch Result ) Ġ: ĠTag Ex Match Ġ{ ĊĠĠĠ Ġoverride Ġval Ġnamed Labels : ĠNamed Labels Ġ= Ġobject Ġ: ĠNamed Labels Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Label ( name : ĠString ): ĠLabel ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsearch Result . getLabel ( name ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcontains Label ( name : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsearch Result . getLabel ( name ) Ġ!= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġnamed Spans : ĠNamed Spans Ġ= Ġobject Ġ: ĠNamed Spans Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget ( name : ĠString ): ĠSpan ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsearch Result . get Span ( name ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval ĠstartIndex : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġsearch Result . begin ĊĊĠĠĠ Ġoverride Ġval Ġend Index : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġsearch Result . end Ċ }