[Chart] Deploying with font SVGs
Tim Docker
tim at dockerz.net
Mon Feb 10 13:39:19 GMT 2014
That makes sense.
Thanks for offering to package up something like you localFonts
function. However, it seems a bit redundant with the already present in
code in the library (see defaultFonts in
Graphics.Rendering.Chart.Backend.Diagrams). I think I'd prefer a
solution that let the user control override where the standard fonts are
stored, rather than assuming the use of the cabal generated getDataFileName.
Tim
On 11/02/14 00:15, Bjorn Buckwalter wrote:
> In my case the diagram font files were all I was concerned with. But
> in the more general case what you suggest should work, assuming that
> the absolute installation path in production is known and can be
> reproduced in development. I was also told about --datadir for cabal
> install allowing to specify where the data files go. E.g.
>
> cabal install --datadir=c:\MyApp Chart-diagrams
>
> I haven't tested it, but it should be cleaner than putting the entire
> sanbox there. It has the same short-coming w r t known paths though.
>
> Thanks,
> Bjorn
>
>
>
> On Mon, Feb 10, 2014 at 12:16 PM, Tim Docker <tim at dockerz.net
> <mailto:tim at dockerz.net>> wrote:
>
> This looks like a good workaround - however it only solve the
> problem for the Chart diagram font files - if any other libraries
> (or your app) has them, then you will have the same problem...
>
> A quick search, left me surprised that cabal doesn't seem to
> support building packages with easily controlled locations for
> decleared external files.
>
> But one idea... Could you not just build the whole system with a
> sandbox that is your preferred final location?
>
> Something like:
>
> cd c:\source\MyApp
> cabal sandbox --sandbox=c:\MyApp init
> cabal sandbox install
>
> Then, for deployment, just zip up the necessary parts of c:\MyApp,
> probably just the exe and data files.
>
> Would that work?
>
> Tim
>
>
> On 08/02/14 07:32, Bjorn Buckwalter wrote:
>> Hi Jan (et al),
>>
>> With your pointers I worked it out. Here is what I ended up with:
>>
>> ~~~~~~~~~~~~~~~~8<~~~~~~~~~~~~~~~~~~~~~~
>> {-# LANGUAGE FlexibleContexts #-}
>> {-# LANGUAGE GADTs #-}
>>
>> -- | The backend to render charts with the diagrams library.
>> module LocalFonts (localFonts) where
>>
>> import qualified Data.Map as M
>> import Graphics.Rendering.Chart.Backend.Types
>> import System.FilePath (replaceFileName)
>>
>>
>> localFonts :: FilePath -> M.Map (String, FontSlant, FontWeight)
>> FilePath
>> localFonts exec = let
>> serifR = replaceFileName exec "fonts/LinLibertine_R.svg"
>> serifRB = replaceFileName exec "fonts/LinLibertine_RB.svg"
>> serifRBI = replaceFileName exec "fonts/LinLibertine_RBI.svg"
>> serifRI = replaceFileName exec "fonts/LinLibertine_RI.svg"
>> sansR = replaceFileName exec "fonts/SourceSansPro_R.svg"
>> sansRB = replaceFileName exec "fonts/SourceSansPro_RB.svg"
>> sansRBI = replaceFileName exec "fonts/SourceSansPro_RBI.svg"
>> sansRI = replaceFileName exec "fonts/SourceSansPro_RI.svg"
>> monoR = replaceFileName exec "fonts/SourceCodePro_R.svg"
>> monoRB = replaceFileName exec "fonts/SourceCodePro_RB.svg"
>> in M.fromList
>> [ ( ("serif" , FontSlantNormal , FontWeightNormal) ,
>> serifR )
>> , ( ("serif" , FontSlantNormal , FontWeightBold ) ,
>> serifRB )
>> , ( ("serif" , FontSlantItalic , FontWeightNormal) ,
>> serifRI )
>> , ( ("serif" , FontSlantOblique, FontWeightNormal) ,
>> serifRI )
>> , ( ("serif" , FontSlantItalic , FontWeightBold ) ,
>> serifRBI )
>> , ( ("serif" , FontSlantOblique, FontWeightBold ) ,
>> serifRBI )
>>
>> , ( ("sans-serif", FontSlantNormal , FontWeightNormal) ,
>> sansR )
>> , ( ("sans-serif", FontSlantNormal , FontWeightBold ) ,
>> sansRB )
>> , ( ("sans-serif", FontSlantItalic , FontWeightNormal) ,
>> sansRI )
>> , ( ("sans-serif", FontSlantOblique, FontWeightNormal) ,
>> sansRI )
>> , ( ("sans-serif", FontSlantItalic , FontWeightBold ) ,
>> sansRBI )
>> , ( ("sans-serif", FontSlantOblique, FontWeightBold ) ,
>> sansRBI )
>>
>> , ( ("monospace" , FontSlantNormal , FontWeightNormal) ,
>> monoR )
>> , ( ("monospace" , FontSlantNormal , FontWeightBold ) ,
>> monoRB )
>> , ( ("monospace" , FontSlantItalic , FontWeightNormal) ,
>> monoR )
>> , ( ("monospace" , FontSlantOblique, FontWeightNormal) ,
>> monoR )
>> , ( ("monospace" , FontSlantItalic , FontWeightBold ) ,
>> monoRB )
>> , ( ("monospace" , FontSlantOblique, FontWeightBold ) ,
>> monoRB )
>> ]
>>
>> ~~~~~~~~~~~~~~~~8<~~~~~~~~~~~~~~~~~~~~~~
>>
>> In my application code I use localFonts with something like
>>
>> exec <- getExecutablePath -- from System.Environment
>> renderableToFile (localFO exec) ...
>> where
>> localFO = FileOptions (width opts, height opts) SVG_EMBEDDED
>> . localFonts
>>
>> Then, when installing in production I copy the fonts directory
>> from charts-diagrams into the same directory as the executable.
>> Works well enough for me. :)
>>
>> Would localFonts be useful for a general audience with my
>> problem? If anyone thinks so I could submit a pull request (feel
>> free to suggest a better name and location if not in
>> Graphics.Rendering.Chart.Backend.Diagrams).
>>
>> Thanks,
>> Bjorn
>>
>>
>>
>> On Tue, Feb 4, 2014 at 11:07 AM, Jan Bracker
>> <jan.bracker at googlemail.com <mailto:jan.bracker at googlemail.com>>
>> wrote:
>>
>> Hi Bjorn,
>>
>> die Diagrams backend offers the possibility to supply custom
>> fonts [1]. If you copy the fonts delivered with cabal to a
>> custom (relative) location you can reconfigure all standard
>> fonts through this mechanism. To see how the standard fonts
>> are wired look here [2].
>>
>> I hope this helps.
>>
>> Jan
>>
>> [1]:
>> http://hackage.haskell.org/package/Chart-diagrams-1.2/docs/Graphics-Rendering-Chart-Backend-Diagrams.html#v:customFontEnv
>> [2]:
>> http://hackage.haskell.org/package/Chart-diagrams-1.2/docs/src/Graphics-Rendering-Chart-Backend-Diagrams.html#defaultFonts
>>
>>
>> 2014-02-04 Bjorn Buckwalter <bjorn at buckwalter.se
>> <mailto:bjorn at buckwalter.se>>:
>>
>> Hi,
>>
>> I need to deploy applications in a Windows environment
>> (Window XP to be specific) where my deployment options
>> are pretty much limited to copying a .exe or possibly a
>> folder structure. This seemed very hairy/impossible with
>> the old Cairo backend, but the new(ish) Diagrams backend
>> seemed perfect for this scenario.
>>
>> However, I soon found out that an application built with
>> the Diagrams backend references data files (the font
>> SVGs) with absolute paths, which in this case are buried
>> deep in a .cabal-sandbox directory on my development
>> computer. Needless to say this doesn't work too well when
>> the executable is copied to the production workstation.
>>
>> Is there a pretty and non-fragile solution to this
>> problem? (I think I could hack it by move the repo to,
>> e.g., C:\myrepo\ on my dev comp, build it there, and then
>> make sure to copy the relevent files into
>> C:\myrepo\.cabal-sandbox on the production workstation,
>> but is that ever ugly and fragile!)
>>
>> Perhaps this is cabal question rather than a Chart
>> question; I might try posting in a cabal forum too.
>>
>> Thanks,
>> Bjorn
>>
>>
>> _______________________________________________
>> Chart mailing list
>> Chart at projects.haskell.org
>> <mailto:Chart at projects.haskell.org>
>> http://projects.haskell.org/cgi-bin/mailman/listinfo/chart
>>
>>
>>
>>
>>
>> _______________________________________________
>> Chart mailing list
>> Chart at projects.haskell.org <mailto:Chart at projects.haskell.org>
>> http://projects.haskell.org/cgi-bin/mailman/listinfo/chart
>
>
> _______________________________________________
> Chart mailing list
> Chart at projects.haskell.org <mailto:Chart at projects.haskell.org>
> http://projects.haskell.org/cgi-bin/mailman/listinfo/chart
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://projects.haskell.org/pipermail/chart/attachments/20140211/402c7f01/attachment-0001.htm>
More information about the Chart
mailing list