packages feed

ihaskell-rlangqq (empty) → 0.2.0.0

raw patch · 4 files changed

+168/−0 lines, 4 filesdep +Rlang-QQdep +basedep +base64-bytestringsetup-changed

Dependencies added: Rlang-QQ, base, base64-bytestring, blaze-html, bytestring, directory, filepath, ihaskell, ihaskell-blaze, split, stm, template-haskell, xformat

Files

+ IHaskell/Display/Rlangqq.hs view
@@ -0,0 +1,108 @@+{-# OPTIONS_GHC -fno-warn-missing-fields #-}+{-# LANGUAGE TupleSections, TemplateHaskell #-}+module IHaskell.Display.Rlangqq+  ( module RlangQQ,+    rDisp,+    rDisplayAll,+    rOutputParsed,+    rOutput,+    getPlotNames,+    getCaptions,+  ) where++import RlangQQ+import RlangQQ.ParseKnitted++import System.Directory+import System.FilePath+import Data.Maybe+import Data.List+import Text.Read+import qualified Data.ByteString as B+import qualified Data.ByteString.Char8 as Char+import qualified Data.ByteString.Base64 as Base64+import IHaskell.Display+import IHaskell.Display.Blaze () -- to confirm it's installed+import qualified Text.Blaze.Html5 as H+import qualified Text.Blaze.Html5.Attributes as H+import Data.Monoid+import Data.Char+import Control.Monad+import Data.Ord+import Data.List.Split+import Text.XFormat.Show hiding ((<>))+import Control.Applicative+import Control.Concurrent+import Data.Monoid+import Data.Typeable++import Control.Concurrent.STM+import Language.Haskell.TH.Quote++-- | same as 'RlangQQ.r', but displays plots at the end too+rDisp = QuasiQuoter { quoteExp = \s -> [| do+  result <- $(quoteExp r s)+  p <- rDisplayAll+  printDisplay p+  return result+  |] }++rOutput :: IO [Int]+rOutput = do+  fs <- mapMaybe (readMaybe <=< stripPrefix "raw" <=< stripSuffix ".md")+    <$> getDirectoryContents "Rtmp"+  fs' <- forM fs $ \f -> (,f) <$> getModificationTime (showf ("Rtmp/raw"%Int%".md") f)+  return $ map snd $ sortBy (flip (comparing fst)) fs'++-- | like 'stripPrefix' except on the end+stripSuffix :: String -> String -> Maybe String+stripSuffix s x = fmap reverse $ stripPrefix (reverse s) $ reverse x++rOutputParsed :: IO [KnitInteraction]+rOutputParsed = do+  ns <- rOutput+  case ns of+    [] -> return []+    n : _ -> parseKnitted <$> readFile (showf ("Rtmp/raw"%Int%".md") n)+++getPlotNames :: IO [String]+getPlotNames = do+  interactions <- rOutputParsed+  return [ p |  KnitInteraction _ is <- interactions, KnitImage _ p <- is ]+            +getCaptions :: IO [String]+getCaptions = do+  interactions <- rOutputParsed+  return [ c |  KnitInteraction _ is <- interactions,+                KnitImage c _ <- is,+                not (isBoringCaption c) ]++-- | true when the caption name looks like one knitr will automatically+-- generate+isBoringCaption :: String -> Bool+isBoringCaption s = maybe False+                      (all isDigit)+                      (stripPrefix "plot of chunk unnamed-chunk-" s)++rDisplayAll :: IO Display+rDisplayAll = do+ ns <- rOutputParsed+ imgs <- sequence [ displayInteraction o | KnitInteraction _ os <- ns, o <- os]+ display (mconcat imgs)+++displayInteraction :: KnitOutput -> IO Display+displayInteraction (KnitPrint c) = display (plain c)+displayInteraction (KnitWarning c) = display (plain c)+displayInteraction (KnitError c) = display (plain c)+displayInteraction (KnitAsIs c) = display (plain c)+displayInteraction (KnitImage cap img) = do+  let caption+          | isBoringCaption cap = mempty+          | otherwise = H.p (H.toMarkup cap)+  encoded <- Base64.encode <$> B.readFile img+  display $ H.img H.! H.src (H.unsafeByteStringValue+                         -- assumes you use the default device which is png+                        (Char.pack "data:image/png;base64," <> encoded))+              <> caption
+ LICENSE view
@@ -0,0 +1,30 @@+Copyright (c) 2013, Adam Vogt <vogt.adam@gmail.com>++All rights reserved.++Redistribution and use in source and binary forms, with or without+modification, are permitted provided that the following conditions are met:++    * Redistributions of source code must retain the above copyright+      notice, this list of conditions and the following disclaimer.++    * Redistributions in binary form must reproduce the above+      copyright notice, this list of conditions and the following+      disclaimer in the documentation and/or other materials provided+      with the distribution.++    * Neither the name of Adam Vogt <vogt.adam@gmail.com> nor the names of other+      contributors may be used to endorse or promote products derived+      from this software without specific prior written permission.++THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ Setup.hs view
@@ -0,0 +1,2 @@+import Distribution.Simple+main = defaultMain
+ ihaskell-rlangqq.cabal view
@@ -0,0 +1,28 @@+name:                ihaskell-rlangqq+version:             0.2.0.0+synopsis:            a rDisp quasiquote to show plots from Rlang-QQ in IHaskell +license:             BSD3+license-file:        LICENSE+author:              Adam Vogt <vogt.adam@gmail.com>+maintainer:          Adam Vogt <vogt.adam@gmail.com>+category:            Development+build-type:          Simple+cabal-version:       >=1.10++library+  exposed-modules:     IHaskell.Display.Rlangqq+  other-extensions:    TupleSections, TemplateHaskell+  build-depends:       base <5,+                       Rlang-QQ >=0.2 && <0.3,+                       directory >=1.2 && <1.3,+                       filepath >=1.3 && <1.4,+                       bytestring >=0.10 && <0.11,+                       base64-bytestring >=1.0 && <1.1,+                       ihaskell >=0.5 && <0.6,+                       ihaskell-blaze >=0.2 && <0.3,+                       blaze-html >=0.6 && <0.8,+                       split >=0.2 && <0.3,+                       stm   -any,+                       xformat >=0.1 && <0.2,+                       template-haskell >= 2.8+  default-language:    Haskell2010