/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 0 . ĠJetBrains Ġs . r . o . Ċ Ġ* ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠMIT Ġlicense Ġthat Ġcan Ġbe Ġfound Ġin Ġthe ĠLICENSE Ġfile . Ċ Ġ*/ Ċ Ċ package Ġjet brains . datal ore . plot Ċ Ċ import Ġjet brains . datal ore . base . geometry . Double Rectangle Ċ import Ġjet brains . datal ore . base . geometry . Double Vector Ċ import Ġjet brains . datal ore . base . logging . Portable Logging Ċ import Ġjet brains . datal ore . plot . Plot Size Helper . fetch Plot Size From Svg Ċ import Ġjet brains . datal ore . plot . config . B unch Config Ċ import Ġjet brains . datal ore . plot . config . Plot Config Ċ import Ġjet brains . datal ore . vis . svg ToString . Svg ToString Ċ Ċ object ĠPlot Svg Export Portable Ġ{ ĊĠĠĠ Ġprivate Ġval ĠLOG Ġ= ĠPort able Logging . logger ( Plot Svg Export Portable :: class ) ĊĠĠĠ Ġprivate Ġval ĠPORT ABLE _ SVG _ STR _ MAP PER Ġ= ĊĠĠĠĠĠĠĠ ĠSvg ToString ( rgb Encoder Ġ= Ġnull ) ĠĠ Ġ// Ġdata - frame Ġ--> Ġrgb Ġimage Ġis Ġnot Ġsupported Ġ( geom _ raster ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ param Ġplot Spec ĠRaw Ġspecification Ġof Ġa Ġplot Ġor ĠG GB unch . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Suppress (" Member Visibility Can Be Private ") ĊĠĠĠ Ġfun Ġbuild Svg Image From Raw Specs ( ĊĠĠĠĠĠĠĠ Ġplot Spec : ĠMutable Map < String , ĠAny >, ĊĠĠĠĠĠĠĠ Ġsvg ToString : ĠSvg ToString Ġ= ĠPORT ABLE _ SVG _ STR _ MAP PER ĊĠĠĠ Ġ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġbuild Svg Image From Raw Specs ( plot Spec , Ġnull , Ġsvg ToString ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ param Ġplot Spec ĠRaw Ġspecification Ġof Ġa Ġplot Ġor ĠG GB unch . ĊĠĠĠĠ Ġ* Ġ@ param Ġplot Size ĠDes ired Ġplot Ġsize . ĠHas Ġno Ġeffect Ġon ĠG GB unch . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Suppress (" Member Visibility Can Be Private ") ĊĠĠĠ Ġfun Ġbuild Svg Image From Raw Specs ( ĊĠĠĠĠĠĠĠ Ġplot Spec : ĠMutable Map < String , ĠAny >, ĊĠĠĠĠĠĠĠ Ġplot Size : ĠDouble Vector ?, ĊĠĠĠĠĠĠĠ Ġsvg ToString : ĠSvg ToString Ġ= ĠPORT ABLE _ SVG _ STR _ MAP PER ĊĠĠĠ Ġ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlist Ġ= ĠMon ol ith ic Common . build Svg Images From Raw Specs ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplot Spec , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplot Size , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsvg ToString ĊĠĠĠĠĠĠĠ Ġ) Ġ{ Ġmessages Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessages . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . info Ġ{ Ġ"[ when ĠSVG Ġgenerating ] Ġ$ it " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( list . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Nothing Ġto Ġsave : Ġthe Ġplot Ġis Ġempty .") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( list . size Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġlist [ 0 ] ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠMust Ġbe ĠG GB unch ĊĠĠĠĠĠĠĠ Ġif Ġ(! Plot Config . is G GB unch Spec ( plot Spec )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Can 't Ġsave Ġmultiple ĠSVG Ġimages Ġin Ġone Ġfile .") Ġ// ĠShould Ġnever Ġhappen ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġbunch Item Svg List Ġ= ĠArrayList < String >() ĊĠĠĠĠĠĠĠ Ġvar Ġbunch Bounds Ġ= ĠDouble Rectangle ( Double Vector . ZERO , ĠDouble Vector . ZERO ) ĊĠĠĠĠĠĠĠ Ġval Ġbunch Items Ġ= ĠB unch Config ( plot Spec ). b unch Items ĊĠĠĠĠĠĠĠ Ġfor Ġ(( plot Svg , Ġbunch Item ) Ġin Ġlist . zip ( b unch Items )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( item Svg , Ġsize ) Ġ= Ġtransform B unch Item Svg ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplot Svg , Ġbunch Item . x , Ġbunch Item . y ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbunch Item Svg List . add ( item Svg ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbunch Bounds Ġ= Ġbunch Bounds . union ( Double Rectangle ( b unch Item . x , Ġbunch Item . y , Ġsize . x , Ġsize . y )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġsvg Style Ġ= Ġget B unch Item Svg Style ( list [ 0 ]) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġ""" < svg Ġxmlns =" http :// www . w 3 . org / 2 0 0 0 / svg " Ġclass =" plt - container " Ġwidth ="${ b unch Bounds . width }" Ġheight ="${ b unch Bounds . height }"> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| $ svg Style ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| ${ b unch Item Svg List . join ToString ( separator Ġ= Ġ"\ n ")} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| </ svg > ĊĠĠĠĠĠĠĠ Ġ""" . trim Margin () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget B unch Item Svg Style ( svg : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsplit Ġ= Ġsvg . split ("< style Ġtype =\" text / css \"> ") ĊĠĠĠĠĠĠĠ Ġval Ġstyle At The Top Ġ= Ġsplit [ 1 ] ĊĠĠĠĠĠĠĠ Ġval Ġstyle Ġ= Ġstyle At The Top . split ("</ style > ")[ 0 ] ĊĠĠĠĠĠĠĠ Ġreturn Ġ""" ĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġ|< style Ġtype =" text / css "> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| ${ style } ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| </ style > """. trim Margin () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" Member Visibility Can Be Private ") ĊĠĠĠ Ġprivate Ġfun Ġtransform B unch Item Svg ( ĊĠĠĠĠĠĠĠ Ġsvg : ĠString , ĊĠĠĠĠĠĠĠ Ġx : ĠDouble , ĊĠĠĠĠĠĠĠ Ġy : ĠDouble ĊĠĠĠ Ġ): ĠPair < String , ĠDouble Vector > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsplit Ġ= Ġsvg . split ("</ style >") ĊĠĠĠĠĠĠĠ Ġval Ġroot Group Ġ= Ġsplit [ 1 ]. split ("</ svg > ")[ 0 ] ĊĊĠĠĠĠĠĠĠ Ġval Ġroot Group Translated Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" < g Ġtransform =" translate ($ x Ġ$ y )" Ġ${ root Group . substring ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroot Group . indexOf ("< g Ġ") Ġ+ Ġ 3 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ)} """ ĊĊĠĠĠĠĠĠĠ Ġval Ġsvg Size Ġ= Ġfetch Plot Size From Svg ( svg ) ĊĠĠĠĠĠĠĠ Ġreturn ĠPair ( root Group Translated , Ġsvg Size ) ĊĠĠĠ Ġ} Ċ Ċ // ĠĠĠ Ġprivate Ġfun Ġextract Double ( regex : ĠRegex , Ġtext : ĠString ): ĠDouble Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġval Ġmatch Result Ġ= Ġregex . find ( text ) !! Ċ // ĠĠĠĠĠĠĠ Ġval Ġvalues Ġ= Ġmatch Result . group Values Ċ // ĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( values . size Ġ< Ġ 3 ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ values [ 1 ]} ". toDouble () Ċ // ĠĠĠĠĠĠĠ Ġelse Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ values [ 1 ] }.${ values [ 2 ]} ". toDouble () Ċ // ĠĠĠ Ġ} Ċ }