knit-haskell 0.5.0.0 → 0.6.0.0
raw patch · 25 files changed
+4549/−297 lines, 25 filesdep +constraintsdep +polysemy-RandomFudep +polysemy-zoodep ~polysemy-pluginPVP ok
version bump matches the API change (PVP)
Dependencies added: constraints, polysemy-RandomFu, polysemy-zoo
Dependency ranges changed: polysemy-plugin
API changes (from Hackage documentation)
- Knit.Effect.PandocMonad: instance (Polysemy.Internal.Union.Member (Polysemy.Error.Error Text.Pandoc.Error.PandocError) r, Knit.Effect.PandocMonad.PandocEffects r) => Text.Pandoc.Class.PandocMonad (Knit.Effect.PandocMonad.PandocMonadSem r)
- Knit.Effect.PandocMonad: instance GHC.Base.Applicative (Knit.Effect.PandocMonad.PandocMonadSem r)
- Knit.Effect.PandocMonad: instance GHC.Base.Functor (Knit.Effect.PandocMonad.PandocMonadSem r)
- Knit.Effect.PandocMonad: instance GHC.Base.Monad (Knit.Effect.PandocMonad.PandocMonadSem r)
- Knit.Effect.PandocMonad: instance Polysemy.Internal.Union.Member (Polysemy.Error.Error Text.Pandoc.Error.PandocError) r => Control.Monad.Error.Class.MonadError Text.Pandoc.Error.PandocError (Knit.Effect.PandocMonad.PandocMonadSem r)
- Knit.Effect.RandomFu: absorbMonadRandom :: Member RandomFu r => (forall m. MonadRandom m => m a) -> Sem r a
- Knit.Effect.RandomFu: data RandomFu m r
- Knit.Effect.RandomFu: instance GHC.Base.Applicative (Knit.Effect.RandomFu.RandomFuSem r)
- Knit.Effect.RandomFu: instance GHC.Base.Functor (Knit.Effect.RandomFu.RandomFuSem r)
- Knit.Effect.RandomFu: instance GHC.Base.Monad (Knit.Effect.RandomFu.RandomFuSem r)
- Knit.Effect.RandomFu: instance Polysemy.Internal.Union.Member Knit.Effect.RandomFu.RandomFu r => Data.Random.Internal.Source.MonadRandom (Knit.Effect.RandomFu.RandomFuSem r)
- Knit.Effect.RandomFu: runRandomFuFromSource :: forall s effs a. RandomSource (Sem effs) s => s -> Sem (RandomFu : effs) a -> Sem effs a
- Knit.Effect.RandomFu: runRandomFuIOPureMT :: MonadIO (Sem effs) => PureMT -> Sem (RandomFu : effs) a -> Sem effs a
- Knit.Effect.RandomFu: runRandomFuIOSimple :: forall effs a. MonadIO (Sem effs) => Sem (RandomFu : effs) a -> Sem effs a
- Knit.Effect.RandomFu: sampleDist :: (Member RandomFu effs, Distribution d t) => d t -> Sem effs t
- Knit.Effect.RandomFu: sampleRVar :: Member RandomFu effs => RVar t -> Sem effs t
- Knit.Effect.RandomFu: type Random = RandomFu
- Knit.Report: PandocWriterConfig :: Maybe FilePath -> Map String String -> (WriterOptions -> WriterOptions) -> PandocWriterConfig
- Knit.Report: [optionsF] :: PandocWriterConfig -> WriterOptions -> WriterOptions
- Knit.Report: [templateFP] :: PandocWriterConfig -> Maybe FilePath
- Knit.Report: [templateVars] :: PandocWriterConfig -> Map String String
- Knit.Report: data PandocWriterConfig
+ Knit.Effect.PandocMonad: instance forall (m :: * -> *) k (s' :: k). GHC.Base.Applicative m => GHC.Base.Applicative (Knit.Effect.PandocMonad.Action m s')
+ Knit.Effect.PandocMonad: instance forall (m :: * -> *) k (s' :: k). GHC.Base.Functor m => GHC.Base.Functor (Knit.Effect.PandocMonad.Action m s')
+ Knit.Effect.PandocMonad: instance forall (m :: * -> *) k (s' :: k). GHC.Base.Monad m => GHC.Base.Monad (Knit.Effect.PandocMonad.Action m s')
+ Knit.Effect.PandocMonad: instance forall k (m :: * -> *) (s' :: k). (GHC.Base.Monad m, Control.Monad.Error.Class.MonadError Text.Pandoc.Error.PandocError (Knit.Effect.PandocMonad.Action m s'), Data.Reflection.Reifies s' (Knit.Effect.PandocMonad.PandocDict m)) => Text.Pandoc.Class.PandocMonad (Knit.Effect.PandocMonad.Action m s')
+ Knit.Effect.PandocMonad: instance forall k (m :: * -> *) (s' :: k). (GHC.Base.Monad m, Data.Reflection.Reifies s' (Knit.Effect.PandocMonad.PandocDict m)) => Control.Monad.Error.Class.MonadError Text.Pandoc.Error.PandocError (Knit.Effect.PandocMonad.Action m s')
+ Knit.Report: writeAllPandocResultsWithInfoAsHtml :: Text -> [DocWithInfo PandocInfo Text] -> IO ()
+ Knit.Report: writePandocResultWithInfoAsHtml :: Text -> DocWithInfo PandocInfo Text -> IO ()
+ Knit.Report.Output: DefaultTemplate :: TemplatePath
+ Knit.Report.Output: FromIncludedCssDir :: Text -> CssPath
+ Knit.Report.Output: FromIncludedTemplateDir :: Text -> TemplatePath
+ Knit.Report.Output: FullySpecifiedCssPath :: Text -> CssPath
+ Knit.Report.Output: FullySpecifiedTemplatePath :: Text -> TemplatePath
+ Knit.Report.Output: addCss :: CssPath -> TemplateVariables -> IO TemplateVariables
+ Knit.Report.Output: data CssPath
+ Knit.Report.Output: data TemplatePath
+ Knit.Report.Output: mkPandocWriterConfig :: TemplatePath -> TemplateVariables -> WriterOptionsF -> IO PandocWriterConfig
+ Knit.Report.Output: type TemplateVariables = Map String String
+ Knit.Report.Output: type WriterOptionsF = WriterOptions -> WriterOptions
+ Knit.Report.Output: writeAllPandocResultsWithInfo :: Text -> Text -> [DocWithInfo PandocInfo Text] -> IO ()
+ Knit.Report.Output: writeAndMakePath :: Text -> (a -> Text) -> a -> IO ()
+ Knit.Report.Output: writeAndMakePathLT :: Text -> Text -> IO ()
+ Knit.Report.Output: writePandocResultWithInfo :: Text -> Text -> DocWithInfo PandocInfo Text -> IO ()
+ Knit.Report.Output.Html: writeAllPandocResultsWithInfoAsHtml :: Text -> [DocWithInfo PandocInfo Text] -> IO ()
+ Knit.Report.Output.Html: writePandocResultWithInfoAsHtml :: Text -> DocWithInfo PandocInfo Text -> IO ()
- Knit.Effect.PandocMonad: absorbPandocMonad :: (Member (Error PandocError) r, PandocEffects r) => (forall m. PandocMonad m => m a) -> Sem r a
+ Knit.Effect.PandocMonad: absorbPandocMonad :: Members '[Error PandocError, Pandoc] r => (PandocMonad (Sem r) => Sem r a) -> Sem r a
- Knit.Effect.PandocMonad: fileExists :: forall r_aGeO. Member Pandoc r_aGeO => FilePath -> Sem r_aGeO Bool
+ Knit.Effect.PandocMonad: fileExists :: forall r_aOiF. Member Pandoc r_aOiF => FilePath -> Sem r_aOiF Bool
- Knit.Effect.PandocMonad: getCommonState :: forall r_aGeR. Member Pandoc r_aGeR => Sem r_aGeR CommonState
+ Knit.Effect.PandocMonad: getCommonState :: forall r_aOiI. Member Pandoc r_aOiI => Sem r_aOiI CommonState
- Knit.Effect.PandocMonad: getCurrentTime :: forall r_aGeG. Member Pandoc r_aGeG => Sem r_aGeG UTCTime
+ Knit.Effect.PandocMonad: getCurrentTime :: forall r_aOix. Member Pandoc r_aOix => Sem r_aOix UTCTime
- Knit.Effect.PandocMonad: getCurrentTimeZone :: forall r_aGeH. Member Pandoc r_aGeH => Sem r_aGeH TimeZone
+ Knit.Effect.PandocMonad: getCurrentTimeZone :: forall r_aOiy. Member Pandoc r_aOiy => Sem r_aOiy TimeZone
- Knit.Effect.PandocMonad: getDataFileName :: forall r_aGeP. Member Pandoc r_aGeP => FilePath -> Sem r_aGeP [Char]
+ Knit.Effect.PandocMonad: getDataFileName :: forall r_aOiG. Member Pandoc r_aOiG => FilePath -> Sem r_aOiG [Char]
- Knit.Effect.PandocMonad: getModificationTime :: forall r_aGeQ. Member Pandoc r_aGeQ => FilePath -> Sem r_aGeQ UTCTime
+ Knit.Effect.PandocMonad: getModificationTime :: forall r_aOiH. Member Pandoc r_aOiH => FilePath -> Sem r_aOiH UTCTime
- Knit.Effect.PandocMonad: getsCommonState :: forall r_aGeT r_aF1k. Member Pandoc r_aGeT => (CommonState -> r_aF1k) -> Sem r_aGeT r_aF1k
+ Knit.Effect.PandocMonad: getsCommonState :: forall r_aOiK r_aNux. Member Pandoc r_aOiK => (CommonState -> r_aNux) -> Sem r_aOiK r_aNux
- Knit.Effect.PandocMonad: glob :: forall r_aGeN. Member Pandoc r_aGeN => String -> Sem r_aGeN [[Char]]
+ Knit.Effect.PandocMonad: glob :: forall r_aOiE. Member Pandoc r_aOiE => String -> Sem r_aOiE [[Char]]
- Knit.Effect.PandocMonad: logOutput :: forall r_aGeV. Member Pandoc r_aGeV => LogMessage -> Sem r_aGeV ()
+ Knit.Effect.PandocMonad: logOutput :: forall r_aOiM. Member Pandoc r_aOiM => LogMessage -> Sem r_aOiM ()
- Knit.Effect.PandocMonad: lookupEnv :: forall r_aGeF. Member Pandoc r_aGeF => String -> Sem r_aGeF (Maybe [Char])
+ Knit.Effect.PandocMonad: lookupEnv :: forall r_aOiw. Member Pandoc r_aOiw => String -> Sem r_aOiw (Maybe [Char])
- Knit.Effect.PandocMonad: modifyCommonState :: forall r_aGeU. Member Pandoc r_aGeU => (CommonState -> CommonState) -> Sem r_aGeU ()
+ Knit.Effect.PandocMonad: modifyCommonState :: forall r_aOiL. Member Pandoc r_aOiL => (CommonState -> CommonState) -> Sem r_aOiL ()
- Knit.Effect.PandocMonad: newStdGen :: forall r_aGeI. Member Pandoc r_aGeI => Sem r_aGeI StdGen
+ Knit.Effect.PandocMonad: newStdGen :: forall r_aOiz. Member Pandoc r_aOiz => Sem r_aOiz StdGen
- Knit.Effect.PandocMonad: newUniqueHash :: forall r_aGeJ. Member Pandoc r_aGeJ => Sem r_aGeJ Int
+ Knit.Effect.PandocMonad: newUniqueHash :: forall r_aOiA. Member Pandoc r_aOiA => Sem r_aOiA Int
- Knit.Effect.PandocMonad: openURL :: forall r_aGeK. Member Pandoc r_aGeK => String -> Sem r_aGeK (ByteString, Maybe [Char])
+ Knit.Effect.PandocMonad: openURL :: forall r_aOiB. Member Pandoc r_aOiB => String -> Sem r_aOiB (ByteString, Maybe [Char])
- Knit.Effect.PandocMonad: putCommonState :: forall r_aGeS. Member Pandoc r_aGeS => CommonState -> Sem r_aGeS ()
+ Knit.Effect.PandocMonad: putCommonState :: forall r_aOiJ. Member Pandoc r_aOiJ => CommonState -> Sem r_aOiJ ()
- Knit.Effect.PandocMonad: readFileLazy :: forall r_aGeL. Member Pandoc r_aGeL => FilePath -> Sem r_aGeL ByteString
+ Knit.Effect.PandocMonad: readFileLazy :: forall r_aOiC. Member Pandoc r_aOiC => FilePath -> Sem r_aOiC ByteString
- Knit.Effect.PandocMonad: readFileStrict :: forall r_aGeM. Member Pandoc r_aGeM => FilePath -> Sem r_aGeM ByteString
+ Knit.Effect.PandocMonad: readFileStrict :: forall r_aOiD. Member Pandoc r_aOiD => FilePath -> Sem r_aOiD ByteString
- Knit.Effect.PandocMonad: trace :: forall r_aGeW. Member Pandoc r_aGeW => String -> Sem r_aGeW ()
+ Knit.Effect.PandocMonad: trace :: forall r_aOiN. Member Pandoc r_aOiN => String -> Sem r_aOiN ()
- Knit.Report.Output: PandocWriterConfig :: Maybe FilePath -> Map String String -> (WriterOptions -> WriterOptions) -> PandocWriterConfig
+ Knit.Report.Output: PandocWriterConfig :: Maybe FilePath -> TemplateVariables -> WriterOptionsF -> PandocWriterConfig
- Knit.Report.Output: [optionsF] :: PandocWriterConfig -> WriterOptions -> WriterOptions
+ Knit.Report.Output: [optionsF] :: PandocWriterConfig -> WriterOptionsF
- Knit.Report.Output: [templateVars] :: PandocWriterConfig -> Map String String
+ Knit.Report.Output: [templateVars] :: PandocWriterConfig -> TemplateVariables
Files
- ChangeLog.md +16/−1
- Readme.md +80/−0
- data/knit-haskell-css/pandoc-bootstrap.css +3051/−0
- data/knit-haskell-templates/mindoc-pandoc-KH.html +159/−0
- data/knit-haskell-templates/pandoc-adaptive-bootstrap-KH.html +116/−0
- data/knit-haskell-templates/pandoc-bootstrap-KH.html +81/−0
- data/pandoc-data/templates/default.commonmark +21/−0
- data/pandoc-data/templates/default.haddock +1/−0
- data/pandoc-data/templates/default.html4 +69/−0
- data/pandoc-data/templates/default.html5 +72/−0
- data/pandoc-data/templates/default.latex +488/−0
- data/pandoc-data/templates/default.markdown +21/−0
- examples/ErrorExample.hs +4/−8
- examples/MtlExample.hs +5/−7
- examples/MultiDocExample.hs +5/−6
- examples/RandomExample.hs +9/−13
- examples/SimpleExample.hs +3/−7
- knit-haskell.cabal +40/−19
- src/Knit/Effect/Docs.hs +17/−9
- src/Knit/Effect/PandocMonad.hs +121/−66
- src/Knit/Effect/RandomFu.hs +0/−139
- src/Knit/Report.hs +21/−15
- src/Knit/Report/Input/MarkDown/PandocMarkDown.hs +1/−0
- src/Knit/Report/Output.hs +117/−2
- src/Knit/Report/Output/Html.hs +31/−5
ChangeLog.md view
@@ -1,4 +1,19 @@-* v 0.5.0.0+v 0.6.0.0+* updated to use polysemy-zoo version of constraint absorbers in PandocMonad.+* Hackage download should now include templates and associated css+* Added mkPandocWriterConfig and addCss function in Knit.Report.Output to handle loading things in +the included directory, which may be installed in a platform independent way.+* Added two more html templates, pandoc-bootstrap-KH.html and pandoc-adaptive-bootstrap-KH.html+with pandoc-bootstrap.css and used them in some of the examples.+* Added the default html templates into the pandoc-templates directory where Pandoc will expect+them if the given template fails.+* Reorganized data directory with "pandoc-data" "knit-haskell-templates" and "knit-haskell-css"+* Added output helpers for Pandoc results which are lazy text (html). These create the+required parent directories if necessary. See examples for details.+* Removed ```Knit.Effect.RandomFu``` and modified the example which uses it to use the+"polysemy-RandomFu" package instead.++v 0.5.0.0 * Added plots example back since there is a version of plots on hackage with a relaxed upper bound on containers. * Changed the Doc effect so that instead of Text name, it carries a polymorphic info type.
+ Readme.md view
@@ -0,0 +1,80 @@+# knit-haskell v0.6.0.0++[![Build Status][travis-badge]][travis]+[![Hackage][hackage-badge]][hackage]+[![Hackage Dependencies][hackage-deps-badge]][hackage-deps]++## Introduction+knit-haskell is an attempt to emulate parts of the RMarkdown/knitR experience in haskell. +The idea is to be able to build HTML (or, perhaps, some other things [Pandoc](http://hackage.haskell.org/package/pandoc) can write) +inside a haskell executable. +This package has some wrapping around Pandoc and the [PandocMonad](http://hackage.haskell.org/package/pandoc-2.7.2/docs/Text-Pandoc-Class.html#t:PandocMonad) +as well as logging facilities +and some support for inserting [hvega](http://hackage.haskell.org/package/hvega) visualizations. +All of that is handled via writer-like effects, so additions to the documents can be interspersed with regular haskell code.++## Supported Inputs+* [markdown](https://pandoc.org/MANUAL.html#pandocs-markdown)+* HTML ([blaze](http://hackage.haskell.org/package/blaze-html), [lucid](http://hackage.haskell.org/package/lucid) or Text)+* [latex](https://en.wikipedia.org/wiki/LaTeX)+* [colonnade tables](https://hackage.haskell.org/package/colonnade)+* [hvega](http://hackage.haskell.org/package/hvega) visualizations (via [blaze](http://hackage.haskell.org/package/blaze-html) HTML) +* [Diagrams](https://archives.haskell.org/projects.haskell.org/diagrams/) (via Diagrams SVG backend, inserted as HTML) ++## Examples+There are a few examples in the "examples" directory. +* [SimpleExample](https://github.com/adamConnerSax/knit-haskell/blob/master/examples/SimpleExample.hs) +demonstrates the bare bones features of the library. Creating a document from a few fragments and then +"knitting" it into HTML text and writing that to a file. This includes hvega, diagrams and plots examples.+* [MultiDocExample](https://github.com/adamConnerSax/knit-haskell/blob/master/examples/MultiDocExample.hs) +demonstrates how to build multiple documents.+* [MtlExample](https://github.com/adamConnerSax/knit-haskell/blob/master/examples/MtlExample.hs) +demonstrates the same simple features as above, but runs them atop an example mtl stack, +allowing access to the mtl stack's functionality during document assembly.+* [RandomExample](https://github.com/adamConnerSax/knit-haskell/blob/master/examples/RandomExample.hs) +builds on the mtl example to show how you can also add an additional polysemy effect (in this case, +Polysemy.RandomFu from [polysemy-RandomFu](https://hackage.haskell.org/package/polysemy-RandomFu))+to your document-building. +This one also demonstrates a use of [colonnade](https://hackage.haskell.org/package/colonnade) +for adding a formatted table to the document.+* [ErrorExample](https://github.com/adamConnerSax/knit-haskell/blob/master/examples/ErrorExample.hs). +Similar to "SimpleExample" but throws a user error during document assembly.++## Notes+* You should be able to get everything you need by just importing the +[Knit.Report](https://github.com/adamConnerSax/knit-haskell/blob/master/src/Knit/Report.hs) +module. That has the main functions for "knitting" documents from fragments +and re-exports all the required functions to input the supported fragment types and create/write Html.+* This uses [polysemy](https://github.com/isovector/polysemy#readme) for its effect management rather than mtl. +Effects are provided for logging and generating [random-fu](http://hackage.haskell.org/package/random-fu) style random numbers. +Polysemy's inference and performance are improved greatly if you enable the [polysemy-plugin](https://hackage.haskell.org/package/polysemy-plugin),+which involves:+1. adding "polysemy-plugin" in build-depends and+2. Add "ghc-options: -fplugin=Polysemy.Plugin" to your package configuration.+Pandoc effects and writer effects for document building are also provided.+* Polysemy is capable of "absorbing" some mtl-style monad constraints. This is demonstrated in+the [Random](https://github.com/adamConnerSax/knit-haskell/blob/master/examples/RandomExample.hs#L96) and+composable absorbers for MonadReader, MonadWriter, MonadState and MonadError+can be found in the [polysemy-zoo](https://github.com/isovector/polysemy-zoo).+* Pandoc templates are included for HTML output. See the examples for how to access them+or specify others.+* Though you can theoretically output to any format Pandoc can +write--and it would be great to add some output formats!--some +features only work with some output formats. +My goal was the production of Html and that is the only output format that supports the hvega charting +since hvega itself is just a wrapper that builds javascript to render in a browser. +And so far that is the only supported output format.++* This is very much a WIP. So it's rough around the edges and in the middle. If you find it useful but have suggestions, please submit issues on github.+* I'm very interested in adding to the "zoo" of input fragments. Any PRs of that sort would be most welcome!+* I'm also interested in widening the possible output types--currently only HTML is supported--but +that is quite limited now by hvega which only works in html output. +But support could be added for other output types if hvega input is not required.+++[travis]: <https://travis-ci.org/adamConnerSax/knit-haskell>+[travis-badge]: <https://travis-ci.org/adamConnerSax/knit-haskell.svg?branch=master>+[hackage]: <https://hackage.haskell.org/package/knit-haskell>+[hackage-badge]: <https://img.shields.io/hackage/v/knit-haskell.svg>+[hackage-deps-badge]: <https://img.shields.io/hackage-deps/v/knit-haskell.svg>+[hackage-deps]: <http://packdeps.haskellers.com/feed?needle=knit-haskell>
+ data/knit-haskell-css/pandoc-bootstrap.css view
@@ -0,0 +1,3051 @@+/*!+ This is a modified version of Bootstrap.+ Bootstrap code comes first, customizations are at the end of the file.+*/++/*!+ * Bootstrap v2.3.2+ *+ * Copyright 2012 Twitter, Inc+ * Licensed under the Apache License v2.0+ * http://www.apache.org/licenses/LICENSE-2.0+ *+ * Designed and built with all the love in the world @twitter by @mdo and @fat.+ */+.clearfix {+ *zoom: 1;+}+.clearfix:before,+.clearfix:after {+ display: table;+ content: "";+ line-height: 0;+}+.clearfix:after {+ clear: both;+}+.hide-text {+ font: 0/0 a;+ color: transparent;+ text-shadow: none;+ background-color: transparent;+ border: 0;+}+.input-block-level {+ display: block;+ width: 100%;+ min-height: 30px;+ -webkit-box-sizing: border-box;+ -moz-box-sizing: border-box;+ box-sizing: border-box;+}+article,+aside,+details,+figcaption,+figure,+footer,+header,+hgroup,+nav,+section {+ display: block;+}+audio,+canvas,+video {+ display: inline-block;+ *display: inline;+ *zoom: 1;+}+audio:not([controls]) {+ display: none;+}+html {+ font-size: 100%;+ -webkit-text-size-adjust: 100%;+ -ms-text-size-adjust: 100%;+}+a:focus {+ outline: thin dotted #333;+ outline: 5px auto -webkit-focus-ring-color;+ outline-offset: -2px;+}+a:hover,+a:active {+ outline: 0;+}+sub,+sup {+ position: relative;+ font-size: 75%;+ line-height: 0;+ vertical-align: baseline;+}+sup {+ top: -0.5em;+}+sub {+ bottom: -0.25em;+}+img {+ /* Responsive images (ensure images don't scale beyond their parents) */++ max-width: 100%;+ /* Part 1: Set a maxium relative to the parent */++ width: auto\9;+ /* IE7-8 need help adjusting responsive images */++ height: auto;+ /* Part 2: Scale the height according to the width, otherwise you get stretching */++ vertical-align: middle;+ border: 0;+ -ms-interpolation-mode: bicubic;+}+#map_canvas img,+.google-maps img {+ max-width: none;+}+button,+input,+select,+textarea {+ margin: 0;+ font-size: 100%;+ vertical-align: middle;+}+button,+input {+ *overflow: visible;+ line-height: normal;+}+button::-moz-focus-inner,+input::-moz-focus-inner {+ padding: 0;+ border: 0;+}+button,+html input[type="button"],+input[type="reset"],+input[type="submit"] {+ -webkit-appearance: button;+ cursor: pointer;+}+label,+select,+button,+input[type="button"],+input[type="reset"],+input[type="submit"],+input[type="radio"],+input[type="checkbox"] {+ cursor: pointer;+}+input[type="search"] {+ -webkit-box-sizing: content-box;+ -moz-box-sizing: content-box;+ box-sizing: content-box;+ -webkit-appearance: textfield;+}+input[type="search"]::-webkit-search-decoration,+input[type="search"]::-webkit-search-cancel-button {+ -webkit-appearance: none;+}+textarea {+ overflow: auto;+ vertical-align: top;+}+@media print {+ * {+ text-shadow: none !important;+ color: #000 !important;+ background: transparent !important;+ box-shadow: none !important;+ }+ a,+ a:visited {+ text-decoration: underline;+ }+ a[href]:after {+ content: " (" attr(href) ")";+ }+ abbr[title]:after {+ content: " (" attr(title) ")";+ }+ .ir a:after,+ a[href^="javascript:"]:after,+ a[href^="#"]:after {+ content: "";+ }+ pre,+ blockquote {+ border: 1px solid #999;+ page-break-inside: avoid;+ }+ thead {+ display: table-header-group;+ }+ tr,+ img {+ page-break-inside: avoid;+ }+ img {+ max-width: 100% !important;+ }+ @page {+ margin: 0.5cm;+ }+ p,+ h2,+ h3 {+ orphans: 3;+ widows: 3;+ }+ h2,+ h3 {+ page-break-after: avoid;+ }+}+body {+ margin: 0;+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;+ font-size: 14px;+ line-height: 20px;+ color: #333333;+ background-color: #ffffff;+}+a {+ color: #0088cc;+ text-decoration: none;+}+a:hover,+a:focus {+ color: #005580;+ text-decoration: underline;+}+.img-rounded {+ -webkit-border-radius: 6px;+ -moz-border-radius: 6px;+ border-radius: 6px;+}+.img-polaroid {+ padding: 4px;+ background-color: #fff;+ border: 1px solid #ccc;+ border: 1px solid rgba(0, 0, 0, 0.2);+ -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);+ -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);+}+.img-circle {+ -webkit-border-radius: 500px;+ -moz-border-radius: 500px;+ border-radius: 500px;+}+.row {+ margin-left: -20px;+ *zoom: 1;+}+.row:before,+.row:after {+ display: table;+ content: "";+ line-height: 0;+}+.row:after {+ clear: both;+}+[class*="span"] {+ float: left;+ min-height: 1px;+ margin-left: 20px;+}+.container,+.navbar-static-top .container,+.navbar-fixed-top .container,+.navbar-fixed-bottom .container {+ width: 940px;+}+.span12 {+ width: 940px;+}+.span11 {+ width: 860px;+}+.span10 {+ width: 780px;+}+.span9 {+ width: 700px;+}+.span8 {+ width: 620px;+}+.span7 {+ width: 540px;+}+.span6 {+ width: 460px;+}+.span5 {+ width: 380px;+}+.span4 {+ width: 300px;+}+.span3 {+ width: 220px;+}+.span2 {+ width: 140px;+}+.span1 {+ width: 60px;+}+.offset12 {+ margin-left: 980px;+}+.offset11 {+ margin-left: 900px;+}+.offset10 {+ margin-left: 820px;+}+.offset9 {+ margin-left: 740px;+}+.offset8 {+ margin-left: 660px;+}+.offset7 {+ margin-left: 580px;+}+.offset6 {+ margin-left: 500px;+}+.offset5 {+ margin-left: 420px;+}+.offset4 {+ margin-left: 340px;+}+.offset3 {+ margin-left: 260px;+}+.offset2 {+ margin-left: 180px;+}+.offset1 {+ margin-left: 100px;+}+.row-fluid {+ width: 100%;+ *zoom: 1;+}+.row-fluid:before,+.row-fluid:after {+ display: table;+ content: "";+ line-height: 0;+}+.row-fluid:after {+ clear: both;+}+.row-fluid [class*="span"] {+ display: block;+ width: 100%;+ min-height: 30px;+ -webkit-box-sizing: border-box;+ -moz-box-sizing: border-box;+ box-sizing: border-box;+ float: left;+ margin-left: 2.127659574468085%;+ *margin-left: 2.074468085106383%;+}+.row-fluid [class*="span"]:first-child {+ margin-left: 0;+}+.row-fluid .controls-row [class*="span"] + [class*="span"] {+ margin-left: 2.127659574468085%;+}+.row-fluid .span12 {+ width: 100%;+ *width: 99.94680851063829%;+}+.row-fluid .span11 {+ width: 91.48936170212765%;+ *width: 91.43617021276594%;+}+.row-fluid .span10 {+ width: 82.97872340425532%;+ *width: 82.92553191489361%;+}+.row-fluid .span9 {+ width: 74.46808510638297%;+ *width: 74.41489361702126%;+}+.row-fluid .span8 {+ width: 65.95744680851064%;+ *width: 65.90425531914893%;+}+.row-fluid .span7 {+ width: 57.44680851063829%;+ *width: 57.39361702127659%;+}+.row-fluid .span6 {+ width: 48.93617021276595%;+ *width: 48.88297872340425%;+}+.row-fluid .span5 {+ width: 40.42553191489362%;+ *width: 40.37234042553192%;+}+.row-fluid .span4 {+ width: 31.914893617021278%;+ *width: 31.861702127659576%;+}+.row-fluid .span3 {+ width: 23.404255319148934%;+ *width: 23.351063829787233%;+}+.row-fluid .span2 {+ width: 14.893617021276595%;+ *width: 14.840425531914894%;+}+.row-fluid .span1 {+ width: 6.382978723404255%;+ *width: 6.329787234042553%;+}+.row-fluid .offset12 {+ margin-left: 104.25531914893617%;+ *margin-left: 104.14893617021275%;+}+.row-fluid .offset12:first-child {+ margin-left: 102.12765957446808%;+ *margin-left: 102.02127659574467%;+}+.row-fluid .offset11 {+ margin-left: 95.74468085106382%;+ *margin-left: 95.6382978723404%;+}+.row-fluid .offset11:first-child {+ margin-left: 93.61702127659574%;+ *margin-left: 93.51063829787232%;+}+.row-fluid .offset10 {+ margin-left: 87.23404255319149%;+ *margin-left: 87.12765957446807%;+}+.row-fluid .offset10:first-child {+ margin-left: 85.1063829787234%;+ *margin-left: 84.99999999999999%;+}+.row-fluid .offset9 {+ margin-left: 78.72340425531914%;+ *margin-left: 78.61702127659572%;+}+.row-fluid .offset9:first-child {+ margin-left: 76.59574468085106%;+ *margin-left: 76.48936170212764%;+}+.row-fluid .offset8 {+ margin-left: 70.2127659574468%;+ *margin-left: 70.10638297872339%;+}+.row-fluid .offset8:first-child {+ margin-left: 68.08510638297872%;+ *margin-left: 67.9787234042553%;+}+.row-fluid .offset7 {+ margin-left: 61.70212765957446%;+ *margin-left: 61.59574468085106%;+}+.row-fluid .offset7:first-child {+ margin-left: 59.574468085106375%;+ *margin-left: 59.46808510638297%;+}+.row-fluid .offset6 {+ margin-left: 53.191489361702125%;+ *margin-left: 53.085106382978715%;+}+.row-fluid .offset6:first-child {+ margin-left: 51.063829787234035%;+ *margin-left: 50.95744680851063%;+}+.row-fluid .offset5 {+ margin-left: 44.68085106382979%;+ *margin-left: 44.57446808510638%;+}+.row-fluid .offset5:first-child {+ margin-left: 42.5531914893617%;+ *margin-left: 42.4468085106383%;+}+.row-fluid .offset4 {+ margin-left: 36.170212765957444%;+ *margin-left: 36.06382978723405%;+}+.row-fluid .offset4:first-child {+ margin-left: 34.04255319148936%;+ *margin-left: 33.93617021276596%;+}+.row-fluid .offset3 {+ margin-left: 27.659574468085104%;+ *margin-left: 27.5531914893617%;+}+.row-fluid .offset3:first-child {+ margin-left: 25.53191489361702%;+ *margin-left: 25.425531914893618%;+}+.row-fluid .offset2 {+ margin-left: 19.148936170212764%;+ *margin-left: 19.04255319148936%;+}+.row-fluid .offset2:first-child {+ margin-left: 17.02127659574468%;+ *margin-left: 16.914893617021278%;+}+.row-fluid .offset1 {+ margin-left: 10.638297872340425%;+ *margin-left: 10.53191489361702%;+}+.row-fluid .offset1:first-child {+ margin-left: 8.51063829787234%;+ *margin-left: 8.404255319148938%;+}+[class*="span"].hide,+.row-fluid [class*="span"].hide {+ display: none;+}+[class*="span"].pull-right,+.row-fluid [class*="span"].pull-right {+ float: right;+}+.container {+ margin-right: auto;+ margin-left: auto;+ *zoom: 1;+}+.container:before,+.container:after {+ display: table;+ content: "";+ line-height: 0;+}+.container:after {+ clear: both;+}+.container-fluid {+ padding-right: 20px;+ padding-left: 20px;+ *zoom: 1;+}+.container-fluid:before,+.container-fluid:after {+ display: table;+ content: "";+ line-height: 0;+}+.container-fluid:after {+ clear: both;+}+p {+ margin: 0 0 10px;+}+.lead {+ margin-bottom: 20px;+ font-size: 21px;+ font-weight: 200;+ line-height: 30px;+}+small {+ font-size: 85%;+}+strong {+ font-weight: bold;+}+em {+ font-style: italic;+}+cite {+ font-style: normal;+}+.muted {+ color: #999999;+}+a.muted:hover,+a.muted:focus {+ color: #808080;+}+.text-warning {+ color: #c09853;+}+a.text-warning:hover,+a.text-warning:focus {+ color: #a47e3c;+}+.text-error {+ color: #b94a48;+}+a.text-error:hover,+a.text-error:focus {+ color: #953b39;+}+.text-info {+ color: #3a87ad;+}+a.text-info:hover,+a.text-info:focus {+ color: #2d6987;+}+.text-success {+ color: #468847;+}+a.text-success:hover,+a.text-success:focus {+ color: #356635;+}+.text-left {+ text-align: left;+}+.text-right {+ text-align: right;+}+.text-center {+ text-align: center;+}+h1,+h2,+h3,+h4,+h5,+h6 {+ margin: 10px 0;+ font-family: inherit;+ font-weight: bold;+ line-height: 20px;+ color: inherit;+ text-rendering: optimizelegibility;+}+h1 small,+h2 small,+h3 small,+h4 small,+h5 small,+h6 small {+ font-weight: normal;+ line-height: 1;+ color: #999999;+}+h1,+h2,+h3 {+ line-height: 40px;+}+h1 {+ font-size: 38.5px;+}+h2 {+ font-size: 31.5px;+}+h3 {+ font-size: 24.5px;+}+h4 {+ font-size: 17.5px;+}+h5 {+ font-size: 14px;+}+h6 {+ font-size: 11.9px;+}+h1 small {+ font-size: 24.5px;+}+h2 small {+ font-size: 17.5px;+}+h3 small {+ font-size: 14px;+}+h4 small {+ font-size: 14px;+}+.page-header {+ padding-bottom: 9px;+ margin: 20px 0 30px;+ border-bottom: 1px solid #eeeeee;+}+ul,+ol {+ padding: 0;+ margin: 0 0 10px 25px;+}+ul ul,+ul ol,+ol ol,+ol ul {+ margin-bottom: 0;+}+li {+ line-height: 20px;+}+ul.unstyled,+ol.unstyled {+ margin-left: 0;+ list-style: none;+}+ul.inline,+ol.inline {+ margin-left: 0;+ list-style: none;+}+ul.inline > li,+ol.inline > li {+ display: inline-block;+ *display: inline;+ /* IE7 inline-block hack */++ *zoom: 1;+ padding-left: 5px;+ padding-right: 5px;+}+dl {+ margin-bottom: 20px;+}+dt,+dd {+ line-height: 20px;+}+dt {+ font-weight: bold;+}+dd {+ margin-left: 10px;+}+.dl-horizontal {+ *zoom: 1;+}+.dl-horizontal:before,+.dl-horizontal:after {+ display: table;+ content: "";+ line-height: 0;+}+.dl-horizontal:after {+ clear: both;+}+.dl-horizontal dt {+ float: left;+ width: 160px;+ clear: left;+ text-align: right;+ overflow: hidden;+ text-overflow: ellipsis;+ white-space: nowrap;+}+.dl-horizontal dd {+ margin-left: 180px;+}+hr {+ margin: 20px 0;+ border: 0;+ border-top: 1px solid #eeeeee;+ border-bottom: 1px solid #ffffff;+}+abbr[title],+abbr[data-original-title] {+ cursor: help;+ border-bottom: 1px dotted #999999;+}+abbr.initialism {+ font-size: 90%;+ text-transform: uppercase;+}+blockquote {+ padding: 0 0 0 15px;+ margin: 0 0 20px;+ border-left: 5px solid #eeeeee;+}+blockquote p {+ margin-bottom: 0;+ font-size: 17.5px;+ font-weight: 300;+ line-height: 1.25;+}+blockquote small {+ display: block;+ line-height: 20px;+ color: #999999;+}+blockquote small:before {+ content: '\2014 \00A0';+}+blockquote.pull-right {+ float: right;+ padding-right: 15px;+ padding-left: 0;+ border-right: 5px solid #eeeeee;+ border-left: 0;+}+blockquote.pull-right p,+blockquote.pull-right small {+ text-align: right;+}+blockquote.pull-right small:before {+ content: '';+}+blockquote.pull-right small:after {+ content: '\00A0 \2014';+}+q:before,+q:after,+blockquote:before,+blockquote:after {+ content: "";+}+address {+ display: block;+ margin-bottom: 20px;+ font-style: normal;+ line-height: 20px;+}+code,+pre {+ padding: 0 3px 2px;+ font-family: Monaco, Menlo, Consolas, "Courier New", monospace;+ font-size: 12px;+ color: #333333;+ -webkit-border-radius: 3px;+ -moz-border-radius: 3px;+ border-radius: 3px;+}+code {+ padding: 2px 4px;+ color: #d14;+ background-color: #f7f7f9;+ border: 1px solid #e1e1e8;+ white-space: nowrap;+}+pre {+ display: block;+ padding: 9.5px;+ margin: 0 0 10px;+ font-size: 13px;+ line-height: 20px;+ word-break: break-all;+ word-wrap: break-word;+ white-space: pre;+ white-space: pre-wrap;+ background-color: #f5f5f5;+ border: 1px solid #ccc;+ border: 1px solid rgba(0, 0, 0, 0.15);+ -webkit-border-radius: 4px;+ -moz-border-radius: 4px;+ border-radius: 4px;+}+pre.prettyprint {+ margin-bottom: 20px;+}+pre code {+ padding: 0;+ color: inherit;+ white-space: pre;+ white-space: pre-wrap;+ background-color: transparent;+ border: 0;+}+.pre-scrollable {+ max-height: 340px;+ overflow-y: scroll;+}+table {+ max-width: 100%;+ background-color: transparent;+ border-collapse: collapse;+ border-spacing: 0;+}+.table {+ width: 100%;+ margin-bottom: 20px;+}+.table th,+.table td {+ padding: 8px;+ line-height: 20px;+ text-align: left;+ vertical-align: top;+ border-top: 1px solid #dddddd;+}+.table th {+ font-weight: bold;+}+.table thead th {+ vertical-align: bottom;+}+.table caption + thead tr:first-child th,+.table caption + thead tr:first-child td,+.table colgroup + thead tr:first-child th,+.table colgroup + thead tr:first-child td,+.table thead:first-child tr:first-child th,+.table thead:first-child tr:first-child td {+ border-top: 0;+}+.table tbody + tbody {+ border-top: 2px solid #dddddd;+}+.table .table {+ background-color: #ffffff;+}+.table-condensed th,+.table-condensed td {+ padding: 4px 5px;+}+.table-bordered {+ border: 1px solid #dddddd;+ border-collapse: separate;+ *border-collapse: collapse;+ border-left: 0;+ -webkit-border-radius: 4px;+ -moz-border-radius: 4px;+ border-radius: 4px;+}+.table-bordered th,+.table-bordered td {+ border-left: 1px solid #dddddd;+}+.table-bordered caption + thead tr:first-child th,+.table-bordered caption + tbody tr:first-child th,+.table-bordered caption + tbody tr:first-child td,+.table-bordered colgroup + thead tr:first-child th,+.table-bordered colgroup + tbody tr:first-child th,+.table-bordered colgroup + tbody tr:first-child td,+.table-bordered thead:first-child tr:first-child th,+.table-bordered tbody:first-child tr:first-child th,+.table-bordered tbody:first-child tr:first-child td {+ border-top: 0;+}+.table-bordered thead:first-child tr:first-child > th:first-child,+.table-bordered tbody:first-child tr:first-child > td:first-child,+.table-bordered tbody:first-child tr:first-child > th:first-child {+ -webkit-border-top-left-radius: 4px;+ -moz-border-radius-topleft: 4px;+ border-top-left-radius: 4px;+}+.table-bordered thead:first-child tr:first-child > th:last-child,+.table-bordered tbody:first-child tr:first-child > td:last-child,+.table-bordered tbody:first-child tr:first-child > th:last-child {+ -webkit-border-top-right-radius: 4px;+ -moz-border-radius-topright: 4px;+ border-top-right-radius: 4px;+}+.table-bordered thead:last-child tr:last-child > th:first-child,+.table-bordered tbody:last-child tr:last-child > td:first-child,+.table-bordered tbody:last-child tr:last-child > th:first-child,+.table-bordered tfoot:last-child tr:last-child > td:first-child,+.table-bordered tfoot:last-child tr:last-child > th:first-child {+ -webkit-border-bottom-left-radius: 4px;+ -moz-border-radius-bottomleft: 4px;+ border-bottom-left-radius: 4px;+}+.table-bordered thead:last-child tr:last-child > th:last-child,+.table-bordered tbody:last-child tr:last-child > td:last-child,+.table-bordered tbody:last-child tr:last-child > th:last-child,+.table-bordered tfoot:last-child tr:last-child > td:last-child,+.table-bordered tfoot:last-child tr:last-child > th:last-child {+ -webkit-border-bottom-right-radius: 4px;+ -moz-border-radius-bottomright: 4px;+ border-bottom-right-radius: 4px;+}+.table-bordered tfoot + tbody:last-child tr:last-child td:first-child {+ -webkit-border-bottom-left-radius: 0;+ -moz-border-radius-bottomleft: 0;+ border-bottom-left-radius: 0;+}+.table-bordered tfoot + tbody:last-child tr:last-child td:last-child {+ -webkit-border-bottom-right-radius: 0;+ -moz-border-radius-bottomright: 0;+ border-bottom-right-radius: 0;+}+.table-bordered caption + thead tr:first-child th:first-child,+.table-bordered caption + tbody tr:first-child td:first-child,+.table-bordered colgroup + thead tr:first-child th:first-child,+.table-bordered colgroup + tbody tr:first-child td:first-child {+ -webkit-border-top-left-radius: 4px;+ -moz-border-radius-topleft: 4px;+ border-top-left-radius: 4px;+}+.table-bordered caption + thead tr:first-child th:last-child,+.table-bordered caption + tbody tr:first-child td:last-child,+.table-bordered colgroup + thead tr:first-child th:last-child,+.table-bordered colgroup + tbody tr:first-child td:last-child {+ -webkit-border-top-right-radius: 4px;+ -moz-border-radius-topright: 4px;+ border-top-right-radius: 4px;+}+.table-striped tbody > tr:nth-child(odd) > td,+.table-striped tbody > tr:nth-child(odd) > th {+ background-color: #f9f9f9;+}+.table-hover tbody tr:hover > td,+.table-hover tbody tr:hover > th {+ background-color: #f5f5f5;+}+table td[class*="span"],+table th[class*="span"],+.row-fluid table td[class*="span"],+.row-fluid table th[class*="span"] {+ display: table-cell;+ float: none;+ margin-left: 0;+}+.table td.span1,+.table th.span1 {+ float: none;+ width: 44px;+ margin-left: 0;+}+.table td.span2,+.table th.span2 {+ float: none;+ width: 124px;+ margin-left: 0;+}+.table td.span3,+.table th.span3 {+ float: none;+ width: 204px;+ margin-left: 0;+}+.table td.span4,+.table th.span4 {+ float: none;+ width: 284px;+ margin-left: 0;+}+.table td.span5,+.table th.span5 {+ float: none;+ width: 364px;+ margin-left: 0;+}+.table td.span6,+.table th.span6 {+ float: none;+ width: 444px;+ margin-left: 0;+}+.table td.span7,+.table th.span7 {+ float: none;+ width: 524px;+ margin-left: 0;+}+.table td.span8,+.table th.span8 {+ float: none;+ width: 604px;+ margin-left: 0;+}+.table td.span9,+.table th.span9 {+ float: none;+ width: 684px;+ margin-left: 0;+}+.table td.span10,+.table th.span10 {+ float: none;+ width: 764px;+ margin-left: 0;+}+.table td.span11,+.table th.span11 {+ float: none;+ width: 844px;+ margin-left: 0;+}+.table td.span12,+.table th.span12 {+ float: none;+ width: 924px;+ margin-left: 0;+}+.table tbody tr.success > td {+ background-color: #dff0d8;+}+.table tbody tr.error > td {+ background-color: #f2dede;+}+.table tbody tr.warning > td {+ background-color: #fcf8e3;+}+.table tbody tr.info > td {+ background-color: #d9edf7;+}+.table-hover tbody tr.success:hover > td {+ background-color: #d0e9c6;+}+.table-hover tbody tr.error:hover > td {+ background-color: #ebcccc;+}+.table-hover tbody tr.warning:hover > td {+ background-color: #faf2cc;+}+.table-hover tbody tr.info:hover > td {+ background-color: #c4e3f3;+}+.nav {+ margin-left: 0;+ margin-bottom: 20px;+ list-style: none;+}+.nav > li > a {+ display: block;+}+.nav > li > a:hover,+.nav > li > a:focus {+ text-decoration: none;+ background-color: #eeeeee;+}+.nav > li > a > img {+ max-width: none;+}+.nav > .pull-right {+ float: right;+}+.nav-header {+ display: block;+ padding: 3px 15px;+ font-size: 11px;+ font-weight: bold;+ line-height: 20px;+ color: #999999;+ text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);+ text-transform: uppercase;+}+.nav li + .nav-header {+ margin-top: 9px;+}+.nav-list {+ padding-left: 15px;+ padding-right: 15px;+ margin-bottom: 0;+}+.nav-list > li > a,+.nav-list .nav-header {+ margin-left: -15px;+ margin-right: -15px;+ text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);+}+.nav-list > li > a {+ padding: 3px 15px;+}+.nav-list > .active > a,+.nav-list > .active > a:hover,+.nav-list > .active > a:focus {+ color: #ffffff;+ text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);+ background-color: #0088cc;+}+.nav-list [class^="icon-"],+.nav-list [class*=" icon-"] {+ margin-right: 2px;+}+.nav-list .divider {+ *width: 100%;+ height: 1px;+ margin: 9px 1px;+ *margin: -5px 0 5px;+ overflow: hidden;+ background-color: #e5e5e5;+ border-bottom: 1px solid #ffffff;+}+.nav-tabs,+.nav-pills {+ *zoom: 1;+}+.nav-tabs:before,+.nav-pills:before,+.nav-tabs:after,+.nav-pills:after {+ display: table;+ content: "";+ line-height: 0;+}+.nav-tabs:after,+.nav-pills:after {+ clear: both;+}+.nav-tabs > li,+.nav-pills > li {+ float: left;+}+.nav-tabs > li > a,+.nav-pills > li > a {+ padding-right: 12px;+ padding-left: 12px;+ margin-right: 2px;+ line-height: 14px;+}+.nav-tabs {+ border-bottom: 1px solid #ddd;+}+.nav-tabs > li {+ margin-bottom: -1px;+}+.nav-tabs > li > a {+ padding-top: 8px;+ padding-bottom: 8px;+ line-height: 20px;+ border: 1px solid transparent;+ -webkit-border-radius: 4px 4px 0 0;+ -moz-border-radius: 4px 4px 0 0;+ border-radius: 4px 4px 0 0;+}+.nav-tabs > li > a:hover,+.nav-tabs > li > a:focus {+ border-color: #eeeeee #eeeeee #dddddd;+}+.nav-tabs > .active > a,+.nav-tabs > .active > a:hover,+.nav-tabs > .active > a:focus {+ color: #555555;+ background-color: #ffffff;+ border: 1px solid #ddd;+ border-bottom-color: transparent;+ cursor: default;+}+.nav-pills > li > a {+ padding-top: 8px;+ padding-bottom: 8px;+ margin-top: 2px;+ margin-bottom: 2px;+ -webkit-border-radius: 5px;+ -moz-border-radius: 5px;+ border-radius: 5px;+}+.nav-pills > .active > a,+.nav-pills > .active > a:hover,+.nav-pills > .active > a:focus {+ color: #ffffff;+ background-color: #0088cc;+}+.nav-stacked > li {+ float: none;+}+.nav-stacked > li > a {+ margin-right: 0;+}+.nav-tabs.nav-stacked {+ border-bottom: 0;+}+.nav-tabs.nav-stacked > li > a {+ border: 1px solid #ddd;+ -webkit-border-radius: 0;+ -moz-border-radius: 0;+ border-radius: 0;+}+.nav-tabs.nav-stacked > li:first-child > a {+ -webkit-border-top-right-radius: 4px;+ -moz-border-radius-topright: 4px;+ border-top-right-radius: 4px;+ -webkit-border-top-left-radius: 4px;+ -moz-border-radius-topleft: 4px;+ border-top-left-radius: 4px;+}+.nav-tabs.nav-stacked > li:last-child > a {+ -webkit-border-bottom-right-radius: 4px;+ -moz-border-radius-bottomright: 4px;+ border-bottom-right-radius: 4px;+ -webkit-border-bottom-left-radius: 4px;+ -moz-border-radius-bottomleft: 4px;+ border-bottom-left-radius: 4px;+}+.nav-tabs.nav-stacked > li > a:hover,+.nav-tabs.nav-stacked > li > a:focus {+ border-color: #ddd;+ z-index: 2;+}+.nav-pills.nav-stacked > li > a {+ margin-bottom: 3px;+}+.nav-pills.nav-stacked > li:last-child > a {+ margin-bottom: 1px;+}+.nav-tabs .dropdown-menu {+ -webkit-border-radius: 0 0 6px 6px;+ -moz-border-radius: 0 0 6px 6px;+ border-radius: 0 0 6px 6px;+}+.nav-pills .dropdown-menu {+ -webkit-border-radius: 6px;+ -moz-border-radius: 6px;+ border-radius: 6px;+}+.nav .dropdown-toggle .caret {+ border-top-color: #0088cc;+ border-bottom-color: #0088cc;+ margin-top: 6px;+}+.nav .dropdown-toggle:hover .caret,+.nav .dropdown-toggle:focus .caret {+ border-top-color: #005580;+ border-bottom-color: #005580;+}+/* move down carets for tabs */+.nav-tabs .dropdown-toggle .caret {+ margin-top: 8px;+}+.nav .active .dropdown-toggle .caret {+ border-top-color: #fff;+ border-bottom-color: #fff;+}+.nav-tabs .active .dropdown-toggle .caret {+ border-top-color: #555555;+ border-bottom-color: #555555;+}+.nav > .dropdown.active > a:hover,+.nav > .dropdown.active > a:focus {+ cursor: pointer;+}+.nav-tabs .open .dropdown-toggle,+.nav-pills .open .dropdown-toggle,+.nav > li.dropdown.open.active > a:hover,+.nav > li.dropdown.open.active > a:focus {+ color: #ffffff;+ background-color: #999999;+ border-color: #999999;+}+.nav li.dropdown.open .caret,+.nav li.dropdown.open.active .caret,+.nav li.dropdown.open a:hover .caret,+.nav li.dropdown.open a:focus .caret {+ border-top-color: #ffffff;+ border-bottom-color: #ffffff;+ opacity: 1;+ filter: alpha(opacity=100);+}+.tabs-stacked .open > a:hover,+.tabs-stacked .open > a:focus {+ border-color: #999999;+}+.tabbable {+ *zoom: 1;+}+.tabbable:before,+.tabbable:after {+ display: table;+ content: "";+ line-height: 0;+}+.tabbable:after {+ clear: both;+}+.tab-content {+ overflow: auto;+}+.tabs-below > .nav-tabs,+.tabs-right > .nav-tabs,+.tabs-left > .nav-tabs {+ border-bottom: 0;+}+.tab-content > .tab-pane,+.pill-content > .pill-pane {+ display: none;+}+.tab-content > .active,+.pill-content > .active {+ display: block;+}+.tabs-below > .nav-tabs {+ border-top: 1px solid #ddd;+}+.tabs-below > .nav-tabs > li {+ margin-top: -1px;+ margin-bottom: 0;+}+.tabs-below > .nav-tabs > li > a {+ -webkit-border-radius: 0 0 4px 4px;+ -moz-border-radius: 0 0 4px 4px;+ border-radius: 0 0 4px 4px;+}+.tabs-below > .nav-tabs > li > a:hover,+.tabs-below > .nav-tabs > li > a:focus {+ border-bottom-color: transparent;+ border-top-color: #ddd;+}+.tabs-below > .nav-tabs > .active > a,+.tabs-below > .nav-tabs > .active > a:hover,+.tabs-below > .nav-tabs > .active > a:focus {+ border-color: transparent #ddd #ddd #ddd;+}+.tabs-left > .nav-tabs > li,+.tabs-right > .nav-tabs > li {+ float: none;+}+.tabs-left > .nav-tabs > li > a,+.tabs-right > .nav-tabs > li > a {+ min-width: 74px;+ margin-right: 0;+ margin-bottom: 3px;+}+.tabs-left > .nav-tabs {+ float: left;+ margin-right: 19px;+ border-right: 1px solid #ddd;+}+.tabs-left > .nav-tabs > li > a {+ margin-right: -1px;+ -webkit-border-radius: 4px 0 0 4px;+ -moz-border-radius: 4px 0 0 4px;+ border-radius: 4px 0 0 4px;+}+.tabs-left > .nav-tabs > li > a:hover,+.tabs-left > .nav-tabs > li > a:focus {+ border-color: #eeeeee #dddddd #eeeeee #eeeeee;+}+.tabs-left > .nav-tabs .active > a,+.tabs-left > .nav-tabs .active > a:hover,+.tabs-left > .nav-tabs .active > a:focus {+ border-color: #ddd transparent #ddd #ddd;+ *border-right-color: #ffffff;+}+.tabs-right > .nav-tabs {+ float: right;+ margin-left: 19px;+ border-left: 1px solid #ddd;+}+.tabs-right > .nav-tabs > li > a {+ margin-left: -1px;+ -webkit-border-radius: 0 4px 4px 0;+ -moz-border-radius: 0 4px 4px 0;+ border-radius: 0 4px 4px 0;+}+.tabs-right > .nav-tabs > li > a:hover,+.tabs-right > .nav-tabs > li > a:focus {+ border-color: #eeeeee #eeeeee #eeeeee #dddddd;+}+.tabs-right > .nav-tabs .active > a,+.tabs-right > .nav-tabs .active > a:hover,+.tabs-right > .nav-tabs .active > a:focus {+ border-color: #ddd #ddd #ddd transparent;+ *border-left-color: #ffffff;+}+.nav > .disabled > a {+ color: #999999;+}+.nav > .disabled > a:hover,+.nav > .disabled > a:focus {+ text-decoration: none;+ background-color: transparent;+ cursor: default;+}+.navbar {+ overflow: visible;+ margin-bottom: 20px;+ *position: relative;+ *z-index: 2;+}+.navbar-inner {+ min-height: 40px;+ padding-left: 20px;+ padding-right: 20px;+ background-color: #fafafa;+ background-image: -moz-linear-gradient(top, #ffffff, #f2f2f2);+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f2f2f2));+ background-image: -webkit-linear-gradient(top, #ffffff, #f2f2f2);+ background-image: -o-linear-gradient(top, #ffffff, #f2f2f2);+ background-image: linear-gradient(to bottom, #ffffff, #f2f2f2);+ background-repeat: repeat-x;+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0);+ border: 1px solid #d4d4d4;+ -webkit-border-radius: 4px;+ -moz-border-radius: 4px;+ border-radius: 4px;+ -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);+ -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);+ box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);+ *zoom: 1;+}+.navbar-inner:before,+.navbar-inner:after {+ display: table;+ content: "";+ line-height: 0;+}+.navbar-inner:after {+ clear: both;+}+.navbar .container {+ width: auto;+}+.nav-collapse.collapse {+ height: auto;+ overflow: visible;+}+.navbar .brand {+ float: left;+ display: block;+ padding: 10px 20px 10px;+ margin-left: -20px;+ font-size: 20px;+ font-weight: 200;+ color: #777777;+ text-shadow: 0 1px 0 #ffffff;+}+.navbar .brand:hover,+.navbar .brand:focus {+ text-decoration: none;+}+.navbar-text {+ margin-bottom: 0;+ line-height: 40px;+ color: #777777;+}+.navbar-link {+ color: #777777;+}+.navbar-link:hover,+.navbar-link:focus {+ color: #333333;+}+.navbar .divider-vertical {+ height: 40px;+ margin: 0 9px;+ border-left: 1px solid #f2f2f2;+ border-right: 1px solid #ffffff;+}+.navbar .btn,+.navbar .btn-group {+ margin-top: 5px;+}+.navbar .btn-group .btn,+.navbar .input-prepend .btn,+.navbar .input-append .btn,+.navbar .input-prepend .btn-group,+.navbar .input-append .btn-group {+ margin-top: 0;+}+.navbar-form {+ margin-bottom: 0;+ *zoom: 1;+}+.navbar-form:before,+.navbar-form:after {+ display: table;+ content: "";+ line-height: 0;+}+.navbar-form:after {+ clear: both;+}+.navbar-form input,+.navbar-form select,+.navbar-form .radio,+.navbar-form .checkbox {+ margin-top: 5px;+}+.navbar-form input,+.navbar-form select,+.navbar-form .btn {+ display: inline-block;+ margin-bottom: 0;+}+.navbar-form input[type="image"],+.navbar-form input[type="checkbox"],+.navbar-form input[type="radio"] {+ margin-top: 3px;+}+.navbar-form .input-append,+.navbar-form .input-prepend {+ margin-top: 5px;+ white-space: nowrap;+}+.navbar-form .input-append input,+.navbar-form .input-prepend input {+ margin-top: 0;+}+.navbar-search {+ position: relative;+ float: left;+ margin-top: 5px;+ margin-bottom: 0;+}+.navbar-search .search-query {+ margin-bottom: 0;+ padding: 4px 14px;+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;+ font-size: 13px;+ font-weight: normal;+ line-height: 1;+ -webkit-border-radius: 15px;+ -moz-border-radius: 15px;+ border-radius: 15px;+}+.navbar-static-top {+ position: static;+ margin-bottom: 0;+}+.navbar-static-top .navbar-inner {+ -webkit-border-radius: 0;+ -moz-border-radius: 0;+ border-radius: 0;+}+.navbar-fixed-top,+.navbar-fixed-bottom {+ position: fixed;+ right: 0;+ left: 0;+ z-index: 1030;+ margin-bottom: 0;+}+.navbar-fixed-top .navbar-inner,+.navbar-static-top .navbar-inner {+ border-width: 0 0 1px;+}+.navbar-fixed-bottom .navbar-inner {+ border-width: 1px 0 0;+}+.navbar-fixed-top .navbar-inner,+.navbar-fixed-bottom .navbar-inner {+ padding-left: 0;+ padding-right: 0;+ -webkit-border-radius: 0;+ -moz-border-radius: 0;+ border-radius: 0;+}+.navbar-static-top .container,+.navbar-fixed-top .container,+.navbar-fixed-bottom .container {+ width: 940px;+}+.navbar-fixed-top {+ top: 0;+}+.navbar-fixed-top .navbar-inner,+.navbar-static-top .navbar-inner {+ -webkit-box-shadow: 0 1px 10px rgba(0,0,0,.1);+ -moz-box-shadow: 0 1px 10px rgba(0,0,0,.1);+ box-shadow: 0 1px 10px rgba(0,0,0,.1);+}+.navbar-fixed-bottom {+ bottom: 0;+}+.navbar-fixed-bottom .navbar-inner {+ -webkit-box-shadow: 0 -1px 10px rgba(0,0,0,.1);+ -moz-box-shadow: 0 -1px 10px rgba(0,0,0,.1);+ box-shadow: 0 -1px 10px rgba(0,0,0,.1);+}+.navbar .nav {+ position: relative;+ left: 0;+ display: block;+ float: left;+ margin: 0 10px 0 0;+}+.navbar .nav.pull-right {+ float: right;+ margin-right: 0;+}+.navbar .nav > li {+ float: left;+}+.navbar .nav > li > a {+ float: none;+ padding: 10px 15px 10px;+ color: #777777;+ text-decoration: none;+ text-shadow: 0 1px 0 #ffffff;+}+.navbar .nav .dropdown-toggle .caret {+ margin-top: 8px;+}+.navbar .nav > li > a:focus,+.navbar .nav > li > a:hover {+ background-color: transparent;+ color: #333333;+ text-decoration: none;+}+.navbar .nav > .active > a,+.navbar .nav > .active > a:hover,+.navbar .nav > .active > a:focus {+ color: #555555;+ text-decoration: none;+ background-color: #e5e5e5;+ -webkit-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);+ -moz-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);+ box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);+}+.navbar .btn-navbar {+ display: none;+ float: right;+ padding: 7px 10px;+ margin-left: 5px;+ margin-right: 5px;+ color: #ffffff;+ text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);+ background-color: #ededed;+ background-image: -moz-linear-gradient(top, #f2f2f2, #e5e5e5);+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f2f2f2), to(#e5e5e5));+ background-image: -webkit-linear-gradient(top, #f2f2f2, #e5e5e5);+ background-image: -o-linear-gradient(top, #f2f2f2, #e5e5e5);+ background-image: linear-gradient(to bottom, #f2f2f2, #e5e5e5);+ background-repeat: repeat-x;+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2', endColorstr='#ffe5e5e5', GradientType=0);+ border-color: #e5e5e5 #e5e5e5 #bfbfbf;+ border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);+ *background-color: #e5e5e5;+ /* Darken IE7 buttons by default so they stand out more given they won't have borders */++ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);+ -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075);+ -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075);+ box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075);+}+.navbar .btn-navbar:hover,+.navbar .btn-navbar:focus,+.navbar .btn-navbar:active,+.navbar .btn-navbar.active,+.navbar .btn-navbar.disabled,+.navbar .btn-navbar[disabled] {+ color: #ffffff;+ background-color: #e5e5e5;+ *background-color: #d9d9d9;+}+.navbar .btn-navbar:active,+.navbar .btn-navbar.active {+ background-color: #cccccc \9;+}+.navbar .btn-navbar .icon-bar {+ display: block;+ width: 18px;+ height: 2px;+ background-color: #f5f5f5;+ -webkit-border-radius: 1px;+ -moz-border-radius: 1px;+ border-radius: 1px;+ -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);+ -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);+ box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);+}+.btn-navbar .icon-bar + .icon-bar {+ margin-top: 3px;+}+.navbar .nav > li > .dropdown-menu:before {+ content: '';+ display: inline-block;+ border-left: 7px solid transparent;+ border-right: 7px solid transparent;+ border-bottom: 7px solid #ccc;+ border-bottom-color: rgba(0, 0, 0, 0.2);+ position: absolute;+ top: -7px;+ left: 9px;+}+.navbar .nav > li > .dropdown-menu:after {+ content: '';+ display: inline-block;+ border-left: 6px solid transparent;+ border-right: 6px solid transparent;+ border-bottom: 6px solid #ffffff;+ position: absolute;+ top: -6px;+ left: 10px;+}+.navbar-fixed-bottom .nav > li > .dropdown-menu:before {+ border-top: 7px solid #ccc;+ border-top-color: rgba(0, 0, 0, 0.2);+ border-bottom: 0;+ bottom: -7px;+ top: auto;+}+.navbar-fixed-bottom .nav > li > .dropdown-menu:after {+ border-top: 6px solid #ffffff;+ border-bottom: 0;+ bottom: -6px;+ top: auto;+}+.navbar .nav li.dropdown > a:hover .caret,+.navbar .nav li.dropdown > a:focus .caret {+ border-top-color: #333333;+ border-bottom-color: #333333;+}+.navbar .nav li.dropdown.open > .dropdown-toggle,+.navbar .nav li.dropdown.active > .dropdown-toggle,+.navbar .nav li.dropdown.open.active > .dropdown-toggle {+ background-color: #e5e5e5;+ color: #555555;+}+.navbar .nav li.dropdown > .dropdown-toggle .caret {+ border-top-color: #777777;+ border-bottom-color: #777777;+}+.navbar .nav li.dropdown.open > .dropdown-toggle .caret,+.navbar .nav li.dropdown.active > .dropdown-toggle .caret,+.navbar .nav li.dropdown.open.active > .dropdown-toggle .caret {+ border-top-color: #555555;+ border-bottom-color: #555555;+}+.navbar .pull-right > li > .dropdown-menu,+.navbar .nav > li > .dropdown-menu.pull-right {+ left: auto;+ right: 0;+}+.navbar .pull-right > li > .dropdown-menu:before,+.navbar .nav > li > .dropdown-menu.pull-right:before {+ left: auto;+ right: 12px;+}+.navbar .pull-right > li > .dropdown-menu:after,+.navbar .nav > li > .dropdown-menu.pull-right:after {+ left: auto;+ right: 13px;+}+.navbar .pull-right > li > .dropdown-menu .dropdown-menu,+.navbar .nav > li > .dropdown-menu.pull-right .dropdown-menu {+ left: auto;+ right: 100%;+ margin-left: 0;+ margin-right: -1px;+ -webkit-border-radius: 6px 0 6px 6px;+ -moz-border-radius: 6px 0 6px 6px;+ border-radius: 6px 0 6px 6px;+}+.navbar-inverse .navbar-inner {+ background-color: #1b1b1b;+ background-image: -moz-linear-gradient(top, #222222, #111111);+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#222222), to(#111111));+ background-image: -webkit-linear-gradient(top, #222222, #111111);+ background-image: -o-linear-gradient(top, #222222, #111111);+ background-image: linear-gradient(to bottom, #222222, #111111);+ background-repeat: repeat-x;+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff111111', GradientType=0);+ border-color: #252525;+}+.navbar-inverse .brand,+.navbar-inverse .nav > li > a {+ color: #999999;+ text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);+}+.navbar-inverse .brand:hover,+.navbar-inverse .nav > li > a:hover,+.navbar-inverse .brand:focus,+.navbar-inverse .nav > li > a:focus {+ color: #ffffff;+}+.navbar-inverse .brand {+ color: #999999;+}+.navbar-inverse .navbar-text {+ color: #999999;+}+.navbar-inverse .nav > li > a:focus,+.navbar-inverse .nav > li > a:hover {+ background-color: transparent;+ color: #ffffff;+}+.navbar-inverse .nav .active > a,+.navbar-inverse .nav .active > a:hover,+.navbar-inverse .nav .active > a:focus {+ color: #ffffff;+ background-color: #111111;+}+.navbar-inverse .navbar-link {+ color: #999999;+}+.navbar-inverse .navbar-link:hover,+.navbar-inverse .navbar-link:focus {+ color: #ffffff;+}+.navbar-inverse .divider-vertical {+ border-left-color: #111111;+ border-right-color: #222222;+}+.navbar-inverse .nav li.dropdown.open > .dropdown-toggle,+.navbar-inverse .nav li.dropdown.active > .dropdown-toggle,+.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle {+ background-color: #111111;+ color: #ffffff;+}+.navbar-inverse .nav li.dropdown > a:hover .caret,+.navbar-inverse .nav li.dropdown > a:focus .caret {+ border-top-color: #ffffff;+ border-bottom-color: #ffffff;+}+.navbar-inverse .nav li.dropdown > .dropdown-toggle .caret {+ border-top-color: #999999;+ border-bottom-color: #999999;+}+.navbar-inverse .nav li.dropdown.open > .dropdown-toggle .caret,+.navbar-inverse .nav li.dropdown.active > .dropdown-toggle .caret,+.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle .caret {+ border-top-color: #ffffff;+ border-bottom-color: #ffffff;+}+.navbar-inverse .navbar-search .search-query {+ color: #ffffff;+ background-color: #515151;+ border-color: #111111;+ -webkit-box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);+ -moz-box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);+ box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);+ -webkit-transition: none;+ -moz-transition: none;+ -o-transition: none;+ transition: none;+}+.navbar-inverse .navbar-search .search-query:-moz-placeholder {+ color: #cccccc;+}+.navbar-inverse .navbar-search .search-query:-ms-input-placeholder {+ color: #cccccc;+}+.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder {+ color: #cccccc;+}+.navbar-inverse .navbar-search .search-query:focus,+.navbar-inverse .navbar-search .search-query.focused {+ padding: 5px 15px;+ color: #333333;+ text-shadow: 0 1px 0 #ffffff;+ background-color: #ffffff;+ border: 0;+ -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);+ -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);+ box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);+ outline: 0;+}+.navbar-inverse .btn-navbar {+ color: #ffffff;+ text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);+ background-color: #0e0e0e;+ background-image: -moz-linear-gradient(top, #151515, #040404);+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#151515), to(#040404));+ background-image: -webkit-linear-gradient(top, #151515, #040404);+ background-image: -o-linear-gradient(top, #151515, #040404);+ background-image: linear-gradient(to bottom, #151515, #040404);+ background-repeat: repeat-x;+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515', endColorstr='#ff040404', GradientType=0);+ border-color: #040404 #040404 #000000;+ border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);+ *background-color: #040404;+ /* Darken IE7 buttons by default so they stand out more given they won't have borders */++ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);+}+.navbar-inverse .btn-navbar:hover,+.navbar-inverse .btn-navbar:focus,+.navbar-inverse .btn-navbar:active,+.navbar-inverse .btn-navbar.active,+.navbar-inverse .btn-navbar.disabled,+.navbar-inverse .btn-navbar[disabled] {+ color: #ffffff;+ background-color: #040404;+ *background-color: #000000;+}+.navbar-inverse .btn-navbar:active,+.navbar-inverse .btn-navbar.active {+ background-color: #000000 \9;+}+.well {+ min-height: 20px;+ padding: 19px;+ margin-bottom: 20px;+ background-color: #f5f5f5;+ border: 1px solid #e3e3e3;+ -webkit-border-radius: 4px;+ -moz-border-radius: 4px;+ border-radius: 4px;+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);+ -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);+}+.well blockquote {+ border-color: #ddd;+ border-color: rgba(0, 0, 0, 0.15);+}+.well-large {+ padding: 24px;+ -webkit-border-radius: 6px;+ -moz-border-radius: 6px;+ border-radius: 6px;+}+.well-small {+ padding: 9px;+ -webkit-border-radius: 3px;+ -moz-border-radius: 3px;+ border-radius: 3px;+}+@-ms-viewport {+ width: device-width;+}+.hidden {+ display: none;+ visibility: hidden;+}+.visible-phone {+ display: none !important;+}+.visible-tablet {+ display: none !important;+}+.hidden-desktop {+ display: none !important;+}+.visible-desktop {+ display: inherit !important;+}+@media (min-width: 768px) and (max-width: 979px) {+ .hidden-desktop {+ display: inherit !important;+ }+ .visible-desktop {+ display: none !important ;+ }+ .visible-tablet {+ display: inherit !important;+ }+ .hidden-tablet {+ display: none !important;+ }+}+@media (max-width: 767px) {+ .hidden-desktop {+ display: inherit !important;+ }+ .visible-desktop {+ display: none !important;+ }+ .visible-phone {+ display: inherit !important;+ }+ .hidden-phone {+ display: none !important;+ }+}+.visible-print {+ display: none !important;+}+@media print {+ .visible-print {+ display: inherit !important;+ }+ .hidden-print {+ display: none !important;+ }+}+@media (max-width: 767px) {+ body {+ padding-left: 20px;+ padding-right: 20px;+ }+ .navbar-fixed-top,+ .navbar-fixed-bottom,+ .navbar-static-top {+ margin-left: -20px;+ margin-right: -20px;+ }+ .container-fluid {+ padding: 0;+ }+ .dl-horizontal dt {+ float: none;+ clear: none;+ width: auto;+ text-align: left;+ }+ .dl-horizontal dd {+ margin-left: 0;+ }+ .container {+ width: auto;+ }+ .row-fluid {+ width: 100%;+ }+ .row,+ .thumbnails {+ margin-left: 0;+ }+ .thumbnails > li {+ float: none;+ margin-left: 0;+ }+ [class*="span"],+ .uneditable-input[class*="span"],+ .row-fluid [class*="span"] {+ float: none;+ display: block;+ width: 100%;+ margin-left: 0;+ -webkit-box-sizing: border-box;+ -moz-box-sizing: border-box;+ box-sizing: border-box;+ }+ .span12,+ .row-fluid .span12 {+ width: 100%;+ -webkit-box-sizing: border-box;+ -moz-box-sizing: border-box;+ box-sizing: border-box;+ }+ .row-fluid [class*="offset"]:first-child {+ margin-left: 0;+ }+ .input-large,+ .input-xlarge,+ .input-xxlarge,+ input[class*="span"],+ select[class*="span"],+ textarea[class*="span"],+ .uneditable-input {+ display: block;+ width: 100%;+ min-height: 30px;+ -webkit-box-sizing: border-box;+ -moz-box-sizing: border-box;+ box-sizing: border-box;+ }+ .input-prepend input,+ .input-append input,+ .input-prepend input[class*="span"],+ .input-append input[class*="span"] {+ display: inline-block;+ width: auto;+ }+ .controls-row [class*="span"] + [class*="span"] {+ margin-left: 0;+ }+ .modal {+ position: fixed;+ top: 20px;+ left: 20px;+ right: 20px;+ width: auto;+ margin: 0;+ }+ .modal.fade {+ top: -100px;+ }+ .modal.fade.in {+ top: 20px;+ }+}+@media (max-width: 480px) {+ .nav-collapse {+ -webkit-transform: translate3d(0, 0, 0);+ }+ .page-header h1 small {+ display: block;+ line-height: 20px;+ }+ input[type="checkbox"],+ input[type="radio"] {+ border: 1px solid #ccc;+ }+ .form-horizontal .control-label {+ float: none;+ width: auto;+ padding-top: 0;+ text-align: left;+ }+ .form-horizontal .controls {+ margin-left: 0;+ }+ .form-horizontal .control-list {+ padding-top: 0;+ }+ .form-horizontal .form-actions {+ padding-left: 10px;+ padding-right: 10px;+ }+ .media .pull-left,+ .media .pull-right {+ float: none;+ display: block;+ margin-bottom: 10px;+ }+ .media-object {+ margin-right: 0;+ margin-left: 0;+ }+ .modal {+ top: 10px;+ left: 10px;+ right: 10px;+ }+ .modal-header .close {+ padding: 10px;+ margin: -10px;+ }+ .carousel-caption {+ position: static;+ }+}+@media (min-width: 768px) and (max-width: 979px) {+ .row {+ margin-left: -20px;+ *zoom: 1;+ }+ .row:before,+ .row:after {+ display: table;+ content: "";+ line-height: 0;+ }+ .row:after {+ clear: both;+ }+ [class*="span"] {+ float: left;+ min-height: 1px;+ margin-left: 20px;+ }+ .container,+ .navbar-static-top .container,+ .navbar-fixed-top .container,+ .navbar-fixed-bottom .container {+ width: 724px;+ }+ .span12 {+ width: 724px;+ }+ .span11 {+ width: 662px;+ }+ .span10 {+ width: 600px;+ }+ .span9 {+ width: 538px;+ }+ .span8 {+ width: 476px;+ }+ .span7 {+ width: 414px;+ }+ .span6 {+ width: 352px;+ }+ .span5 {+ width: 290px;+ }+ .span4 {+ width: 228px;+ }+ .span3 {+ width: 166px;+ }+ .span2 {+ width: 104px;+ }+ .span1 {+ width: 42px;+ }+ .offset12 {+ margin-left: 764px;+ }+ .offset11 {+ margin-left: 702px;+ }+ .offset10 {+ margin-left: 640px;+ }+ .offset9 {+ margin-left: 578px;+ }+ .offset8 {+ margin-left: 516px;+ }+ .offset7 {+ margin-left: 454px;+ }+ .offset6 {+ margin-left: 392px;+ }+ .offset5 {+ margin-left: 330px;+ }+ .offset4 {+ margin-left: 268px;+ }+ .offset3 {+ margin-left: 206px;+ }+ .offset2 {+ margin-left: 144px;+ }+ .offset1 {+ margin-left: 82px;+ }+ .row-fluid {+ width: 100%;+ *zoom: 1;+ }+ .row-fluid:before,+ .row-fluid:after {+ display: table;+ content: "";+ line-height: 0;+ }+ .row-fluid:after {+ clear: both;+ }+ .row-fluid [class*="span"] {+ display: block;+ width: 100%;+ min-height: 30px;+ -webkit-box-sizing: border-box;+ -moz-box-sizing: border-box;+ box-sizing: border-box;+ float: left;+ margin-left: 2.7624309392265194%;+ *margin-left: 2.709239449864817%;+ }+ .row-fluid [class*="span"]:first-child {+ margin-left: 0;+ }+ .row-fluid .controls-row [class*="span"] + [class*="span"] {+ margin-left: 2.7624309392265194%;+ }+ .row-fluid .span12 {+ width: 100%;+ *width: 99.94680851063829%;+ }+ .row-fluid .span11 {+ width: 91.43646408839778%;+ *width: 91.38327259903608%;+ }+ .row-fluid .span10 {+ width: 82.87292817679558%;+ *width: 82.81973668743387%;+ }+ .row-fluid .span9 {+ width: 74.30939226519337%;+ *width: 74.25620077583166%;+ }+ .row-fluid .span8 {+ width: 65.74585635359117%;+ *width: 65.69266486422946%;+ }+ .row-fluid .span7 {+ width: 57.18232044198895%;+ *width: 57.12912895262725%;+ }+ .row-fluid .span6 {+ width: 48.61878453038674%;+ *width: 48.56559304102504%;+ }+ .row-fluid .span5 {+ width: 40.05524861878453%;+ *width: 40.00205712942283%;+ }+ .row-fluid .span4 {+ width: 31.491712707182323%;+ *width: 31.43852121782062%;+ }+ .row-fluid .span3 {+ width: 22.92817679558011%;+ *width: 22.87498530621841%;+ }+ .row-fluid .span2 {+ width: 14.3646408839779%;+ *width: 14.311449394616199%;+ }+ .row-fluid .span1 {+ width: 5.801104972375691%;+ *width: 5.747913483013988%;+ }+ .row-fluid .offset12 {+ margin-left: 105.52486187845304%;+ *margin-left: 105.41847889972962%;+ }+ .row-fluid .offset12:first-child {+ margin-left: 102.76243093922652%;+ *margin-left: 102.6560479605031%;+ }+ .row-fluid .offset11 {+ margin-left: 96.96132596685082%;+ *margin-left: 96.8549429881274%;+ }+ .row-fluid .offset11:first-child {+ margin-left: 94.1988950276243%;+ *margin-left: 94.09251204890089%;+ }+ .row-fluid .offset10 {+ margin-left: 88.39779005524862%;+ *margin-left: 88.2914070765252%;+ }+ .row-fluid .offset10:first-child {+ margin-left: 85.6353591160221%;+ *margin-left: 85.52897613729868%;+ }+ .row-fluid .offset9 {+ margin-left: 79.8342541436464%;+ *margin-left: 79.72787116492299%;+ }+ .row-fluid .offset9:first-child {+ margin-left: 77.07182320441989%;+ *margin-left: 76.96544022569647%;+ }+ .row-fluid .offset8 {+ margin-left: 71.2707182320442%;+ *margin-left: 71.16433525332079%;+ }+ .row-fluid .offset8:first-child {+ margin-left: 68.50828729281768%;+ *margin-left: 68.40190431409427%;+ }+ .row-fluid .offset7 {+ margin-left: 62.70718232044199%;+ *margin-left: 62.600799341718584%;+ }+ .row-fluid .offset7:first-child {+ margin-left: 59.94475138121547%;+ *margin-left: 59.838368402492065%;+ }+ .row-fluid .offset6 {+ margin-left: 54.14364640883978%;+ *margin-left: 54.037263430116376%;+ }+ .row-fluid .offset6:first-child {+ margin-left: 51.38121546961326%;+ *margin-left: 51.27483249088986%;+ }+ .row-fluid .offset5 {+ margin-left: 45.58011049723757%;+ *margin-left: 45.47372751851417%;+ }+ .row-fluid .offset5:first-child {+ margin-left: 42.81767955801105%;+ *margin-left: 42.71129657928765%;+ }+ .row-fluid .offset4 {+ margin-left: 37.01657458563536%;+ *margin-left: 36.91019160691196%;+ }+ .row-fluid .offset4:first-child {+ margin-left: 34.25414364640884%;+ *margin-left: 34.14776066768544%;+ }+ .row-fluid .offset3 {+ margin-left: 28.45303867403315%;+ *margin-left: 28.346655695309746%;+ }+ .row-fluid .offset3:first-child {+ margin-left: 25.69060773480663%;+ *margin-left: 25.584224756083227%;+ }+ .row-fluid .offset2 {+ margin-left: 19.88950276243094%;+ *margin-left: 19.783119783707537%;+ }+ .row-fluid .offset2:first-child {+ margin-left: 17.12707182320442%;+ *margin-left: 17.02068884448102%;+ }+ .row-fluid .offset1 {+ margin-left: 11.32596685082873%;+ *margin-left: 11.219583872105325%;+ }+ .row-fluid .offset1:first-child {+ margin-left: 8.56353591160221%;+ *margin-left: 8.457152932878806%;+ }+ input,+ textarea,+ .uneditable-input {+ margin-left: 0;+ }+ .controls-row [class*="span"] + [class*="span"] {+ margin-left: 20px;+ }+ input.span12,+ textarea.span12,+ .uneditable-input.span12 {+ width: 710px;+ }+ input.span11,+ textarea.span11,+ .uneditable-input.span11 {+ width: 648px;+ }+ input.span10,+ textarea.span10,+ .uneditable-input.span10 {+ width: 586px;+ }+ input.span9,+ textarea.span9,+ .uneditable-input.span9 {+ width: 524px;+ }+ input.span8,+ textarea.span8,+ .uneditable-input.span8 {+ width: 462px;+ }+ input.span7,+ textarea.span7,+ .uneditable-input.span7 {+ width: 400px;+ }+ input.span6,+ textarea.span6,+ .uneditable-input.span6 {+ width: 338px;+ }+ input.span5,+ textarea.span5,+ .uneditable-input.span5 {+ width: 276px;+ }+ input.span4,+ textarea.span4,+ .uneditable-input.span4 {+ width: 214px;+ }+ input.span3,+ textarea.span3,+ .uneditable-input.span3 {+ width: 152px;+ }+ input.span2,+ textarea.span2,+ .uneditable-input.span2 {+ width: 90px;+ }+ input.span1,+ textarea.span1,+ .uneditable-input.span1 {+ width: 28px;+ }+}+@media (min-width: 1200px) {+ .row {+ margin-left: -30px;+ *zoom: 1;+ }+ .row:before,+ .row:after {+ display: table;+ content: "";+ line-height: 0;+ }+ .row:after {+ clear: both;+ }+ [class*="span"] {+ float: left;+ min-height: 1px;+ margin-left: 30px;+ }+ .container,+ .navbar-static-top .container,+ .navbar-fixed-top .container,+ .navbar-fixed-bottom .container {+ width: 1170px;+ }+ .span12 {+ width: 1170px;+ }+ .span11 {+ width: 1070px;+ }+ .span10 {+ width: 970px;+ }+ .span9 {+ width: 870px;+ }+ .span8 {+ width: 770px;+ }+ .span7 {+ width: 670px;+ }+ .span6 {+ width: 570px;+ }+ .span5 {+ width: 470px;+ }+ .span4 {+ width: 370px;+ }+ .span3 {+ width: 270px;+ }+ .span2 {+ width: 170px;+ }+ .span1 {+ width: 70px;+ }+ .offset12 {+ margin-left: 1230px;+ }+ .offset11 {+ margin-left: 1130px;+ }+ .offset10 {+ margin-left: 1030px;+ }+ .offset9 {+ margin-left: 930px;+ }+ .offset8 {+ margin-left: 830px;+ }+ .offset7 {+ margin-left: 730px;+ }+ .offset6 {+ margin-left: 630px;+ }+ .offset5 {+ margin-left: 530px;+ }+ .offset4 {+ margin-left: 430px;+ }+ .offset3 {+ margin-left: 330px;+ }+ .offset2 {+ margin-left: 230px;+ }+ .offset1 {+ margin-left: 130px;+ }+ .row-fluid {+ width: 100%;+ *zoom: 1;+ }+ .row-fluid:before,+ .row-fluid:after {+ display: table;+ content: "";+ line-height: 0;+ }+ .row-fluid:after {+ clear: both;+ }+ .row-fluid [class*="span"] {+ display: block;+ width: 100%;+ min-height: 30px;+ -webkit-box-sizing: border-box;+ -moz-box-sizing: border-box;+ box-sizing: border-box;+ float: left;+ margin-left: 2.564102564102564%;+ *margin-left: 2.5109110747408616%;+ }+ .row-fluid [class*="span"]:first-child {+ margin-left: 0;+ }+ .row-fluid .controls-row [class*="span"] + [class*="span"] {+ margin-left: 2.564102564102564%;+ }+ .row-fluid .span12 {+ width: 100%;+ *width: 99.94680851063829%;+ }+ .row-fluid .span11 {+ width: 91.45299145299145%;+ *width: 91.39979996362975%;+ }+ .row-fluid .span10 {+ width: 82.90598290598291%;+ *width: 82.8527914166212%;+ }+ .row-fluid .span9 {+ width: 74.35897435897436%;+ *width: 74.30578286961266%;+ }+ .row-fluid .span8 {+ width: 65.81196581196582%;+ *width: 65.75877432260411%;+ }+ .row-fluid .span7 {+ width: 57.26495726495726%;+ *width: 57.21176577559556%;+ }+ .row-fluid .span6 {+ width: 48.717948717948715%;+ *width: 48.664757228587014%;+ }+ .row-fluid .span5 {+ width: 40.17094017094017%;+ *width: 40.11774868157847%;+ }+ .row-fluid .span4 {+ width: 31.623931623931625%;+ *width: 31.570740134569924%;+ }+ .row-fluid .span3 {+ width: 23.076923076923077%;+ *width: 23.023731587561375%;+ }+ .row-fluid .span2 {+ width: 14.52991452991453%;+ *width: 14.476723040552828%;+ }+ .row-fluid .span1 {+ width: 5.982905982905983%;+ *width: 5.929714493544281%;+ }+ .row-fluid .offset12 {+ margin-left: 105.12820512820512%;+ *margin-left: 105.02182214948171%;+ }+ .row-fluid .offset12:first-child {+ margin-left: 102.56410256410257%;+ *margin-left: 102.45771958537915%;+ }+ .row-fluid .offset11 {+ margin-left: 96.58119658119658%;+ *margin-left: 96.47481360247316%;+ }+ .row-fluid .offset11:first-child {+ margin-left: 94.01709401709402%;+ *margin-left: 93.91071103837061%;+ }+ .row-fluid .offset10 {+ margin-left: 88.03418803418803%;+ *margin-left: 87.92780505546462%;+ }+ .row-fluid .offset10:first-child {+ margin-left: 85.47008547008548%;+ *margin-left: 85.36370249136206%;+ }+ .row-fluid .offset9 {+ margin-left: 79.48717948717949%;+ *margin-left: 79.38079650845607%;+ }+ .row-fluid .offset9:first-child {+ margin-left: 76.92307692307693%;+ *margin-left: 76.81669394435352%;+ }+ .row-fluid .offset8 {+ margin-left: 70.94017094017094%;+ *margin-left: 70.83378796144753%;+ }+ .row-fluid .offset8:first-child {+ margin-left: 68.37606837606839%;+ *margin-left: 68.26968539734497%;+ }+ .row-fluid .offset7 {+ margin-left: 62.393162393162385%;+ *margin-left: 62.28677941443899%;+ }+ .row-fluid .offset7:first-child {+ margin-left: 59.82905982905982%;+ *margin-left: 59.72267685033642%;+ }+ .row-fluid .offset6 {+ margin-left: 53.84615384615384%;+ *margin-left: 53.739770867430444%;+ }+ .row-fluid .offset6:first-child {+ margin-left: 51.28205128205128%;+ *margin-left: 51.175668303327875%;+ }+ .row-fluid .offset5 {+ margin-left: 45.299145299145295%;+ *margin-left: 45.1927623204219%;+ }+ .row-fluid .offset5:first-child {+ margin-left: 42.73504273504273%;+ *margin-left: 42.62865975631933%;+ }+ .row-fluid .offset4 {+ margin-left: 36.75213675213675%;+ *margin-left: 36.645753773413354%;+ }+ .row-fluid .offset4:first-child {+ margin-left: 34.18803418803419%;+ *margin-left: 34.081651209310785%;+ }+ .row-fluid .offset3 {+ margin-left: 28.205128205128204%;+ *margin-left: 28.0987452264048%;+ }+ .row-fluid .offset3:first-child {+ margin-left: 25.641025641025642%;+ *margin-left: 25.53464266230224%;+ }+ .row-fluid .offset2 {+ margin-left: 19.65811965811966%;+ *margin-left: 19.551736679396257%;+ }+ .row-fluid .offset2:first-child {+ margin-left: 17.094017094017094%;+ *margin-left: 16.98763411529369%;+ }+ .row-fluid .offset1 {+ margin-left: 11.11111111111111%;+ *margin-left: 11.004728132387708%;+ }+ .row-fluid .offset1:first-child {+ margin-left: 8.547008547008547%;+ *margin-left: 8.440625568285142%;+ }+ input,+ textarea,+ .uneditable-input {+ margin-left: 0;+ }+ .controls-row [class*="span"] + [class*="span"] {+ margin-left: 30px;+ }+ input.span12,+ textarea.span12,+ .uneditable-input.span12 {+ width: 1156px;+ }+ input.span11,+ textarea.span11,+ .uneditable-input.span11 {+ width: 1056px;+ }+ input.span10,+ textarea.span10,+ .uneditable-input.span10 {+ width: 956px;+ }+ input.span9,+ textarea.span9,+ .uneditable-input.span9 {+ width: 856px;+ }+ input.span8,+ textarea.span8,+ .uneditable-input.span8 {+ width: 756px;+ }+ input.span7,+ textarea.span7,+ .uneditable-input.span7 {+ width: 656px;+ }+ input.span6,+ textarea.span6,+ .uneditable-input.span6 {+ width: 556px;+ }+ input.span5,+ textarea.span5,+ .uneditable-input.span5 {+ width: 456px;+ }+ input.span4,+ textarea.span4,+ .uneditable-input.span4 {+ width: 356px;+ }+ input.span3,+ textarea.span3,+ .uneditable-input.span3 {+ width: 256px;+ }+ input.span2,+ textarea.span2,+ .uneditable-input.span2 {+ width: 156px;+ }+ input.span1,+ textarea.span1,+ .uneditable-input.span1 {+ width: 56px;+ }+ .thumbnails {+ margin-left: -30px;+ }+ .thumbnails > li {+ margin-left: 30px;+ }+ .row-fluid .thumbnails {+ margin-left: 0;+ }+}+@media (max-width: 979px) {+ body {+ padding-top: 0;+ }+ .navbar-fixed-top,+ .navbar-fixed-bottom {+ position: static;+ }+ .navbar-fixed-top {+ margin-bottom: 20px;+ }+ .navbar-fixed-bottom {+ margin-top: 20px;+ }+ .navbar-fixed-top .navbar-inner,+ .navbar-fixed-bottom .navbar-inner {+ padding: 5px;+ }+ .navbar .container {+ width: auto;+ padding: 0;+ }+ .navbar .brand {+ padding-left: 10px;+ padding-right: 10px;+ margin: 0 0 0 -5px;+ }+ .nav-collapse {+ clear: both;+ }+ .nav-collapse .nav {+ float: none;+ margin: 0 0 10px;+ }+ .nav-collapse .nav > li {+ float: none;+ }+ .nav-collapse .nav > li > a {+ margin-bottom: 2px;+ }+ .nav-collapse .nav > .divider-vertical {+ display: none;+ }+ .nav-collapse .nav .nav-header {+ color: #777777;+ text-shadow: none;+ }+ .nav-collapse .nav > li > a,+ .nav-collapse .dropdown-menu a {+ padding: 9px 15px;+ font-weight: bold;+ color: #777777;+ -webkit-border-radius: 3px;+ -moz-border-radius: 3px;+ border-radius: 3px;+ }+ .nav-collapse .btn {+ padding: 4px 10px 4px;+ font-weight: normal;+ -webkit-border-radius: 4px;+ -moz-border-radius: 4px;+ border-radius: 4px;+ }+ .nav-collapse .dropdown-menu li + li a {+ margin-bottom: 2px;+ }+ .nav-collapse .nav > li > a:hover,+ .nav-collapse .nav > li > a:focus,+ .nav-collapse .dropdown-menu a:hover,+ .nav-collapse .dropdown-menu a:focus {+ background-color: #f2f2f2;+ }+ .navbar-inverse .nav-collapse .nav > li > a,+ .navbar-inverse .nav-collapse .dropdown-menu a {+ color: #999999;+ }+ .navbar-inverse .nav-collapse .nav > li > a:hover,+ .navbar-inverse .nav-collapse .nav > li > a:focus,+ .navbar-inverse .nav-collapse .dropdown-menu a:hover,+ .navbar-inverse .nav-collapse .dropdown-menu a:focus {+ background-color: #111111;+ }+ .nav-collapse.in .btn-group {+ margin-top: 5px;+ padding: 0;+ }+ .nav-collapse .dropdown-menu {+ position: static;+ top: auto;+ left: auto;+ float: none;+ display: none;+ max-width: none;+ margin: 0 15px;+ padding: 0;+ background-color: transparent;+ border: none;+ -webkit-border-radius: 0;+ -moz-border-radius: 0;+ border-radius: 0;+ -webkit-box-shadow: none;+ -moz-box-shadow: none;+ box-shadow: none;+ }+ .nav-collapse .open > .dropdown-menu {+ display: block;+ }+ .nav-collapse .dropdown-menu:before,+ .nav-collapse .dropdown-menu:after {+ display: none;+ }+ .nav-collapse .dropdown-menu .divider {+ display: none;+ }+ .nav-collapse .nav > li > .dropdown-menu:before,+ .nav-collapse .nav > li > .dropdown-menu:after {+ display: none;+ }+ .nav-collapse .navbar-form,+ .nav-collapse .navbar-search {+ float: none;+ padding: 10px 15px;+ margin: 10px 0;+ border-top: 1px solid #f2f2f2;+ border-bottom: 1px solid #f2f2f2;+ -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);+ -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);+ box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);+ }+ .navbar-inverse .nav-collapse .navbar-form,+ .navbar-inverse .nav-collapse .navbar-search {+ border-top-color: #111111;+ border-bottom-color: #111111;+ }+ .navbar .nav-collapse .nav.pull-right {+ float: none;+ margin-left: 0;+ }+ .nav-collapse,+ .nav-collapse.collapse {+ overflow: hidden;+ height: 0;+ }+ .navbar .btn-navbar {+ display: block;+ }+ .navbar-static .navbar-inner {+ padding-left: 10px;+ padding-right: 10px;+ }+}+@media (min-width: 980px) {+ .nav-collapse.collapse {+ height: auto !important;+ overflow: visible !important;+ }+}+++/* CUSTOMIZATIONS */+.doc-title { float: left; display: block; padding: 10px 20px 10px; margin-left: -20px;+ font-size: 20px; font-weight: 200; color: #777777; text-shadow: 0 1px 0 #ffffff; }+.doc-info .navbar-text { padding: 0 15px; }+h1 a { color: #333; } h2 a { color: #333; } h3 a { color: #333; }+h4 a { color: #333; } h5 a { color: #333; } h6 a { color: #333; }+h1:hover a { color: #333; } h2:hover a { color: #333; } h3:hover a { color: #333; }+h4:hover a { color: #333; } h5:hover a { color: #333; } h6:hover a { color: #333; }+.toc { margin-top: 10px; }+.toc, .toc ul { padding: 0; }+.toc ul { margin-left: 0; margin-bottom: 20px; list-style: none; }+.toc ul > li > a { display: block; }+.toc ul > li > a:hover,+.toc ul > li > a:focus { text-decoration: none; background-color: #eeeeee; }+.toc ul { margin-bottom: 0; }+.toc ul > li > a, .toc ul > li > a { padding: 3px 15px; }
+ data/knit-haskell-templates/mindoc-pandoc-KH.html view
@@ -0,0 +1,159 @@+<!doctype html>+<html$if(lang)$ lang="$lang$"$endif$$if(dir)$ dir="$dir$"$endif$>+<head>+<meta charset="utf-8">+<meta name="generator" content="pandoc">+<meta name="viewport" content="width=device-width, initial-scale=1">+$if(description)$+<meta name="description" content="$description$">+$endif$+$for(author-meta)$+<meta name="author" content="$author-meta$">+$endfor$+$if(date-meta)$+<meta name="dcterms.date" content="$date-meta$">+$endif$+<title>$if(title-prefix)$$title-prefix$ - $endif$$pagetitle$</title>++<!-- Yahoo! CDN combo URL for selected Pure.css modules -->+<link rel="stylesheet" href="http://yui.yahooapis.com/combo?pure/0.6.0/base-min.css&pure/0.6.0/grids-responsive-min.css&pure/0.6.0/menus-min.css&pure/0.6.0/tables-min.css">+$if(tufte)$+<!-- Tufte -->+<link href="https://cdnjs.cloudflare.com/ajax/libs/tufte-css/1.4/tufte.min.css" rel="stylesheet"><meta content="width=device-width, initial-scale=1" name="viewport">+$endif$+<!-- Additional css -->+$for(css)$+ <link rel="stylesheet" href="$css$" $if(html5)$$else$type="text/css" $endif$/>+$endfor$+<!-- MathJax -->+<script async src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-MML-AM_CHTML"></script>+<!-- Vega and Vega Embed -->+<script src="https://cdn.jsdelivr.net/npm/vega@4.4.0"></script>+<script src="https://cdn.jsdelivr.net/npm/vega-lite@3.0.0-rc11"></script>+<script src="https://cdn.jsdelivr.net/npm/vega-embed@3.28.0"></script>++<!-- Extra styles -->+<style>+body{margin:10em 0 0}.pure-g{padding:0 1em}.pure-menu-link:focus{background-color:#d3d3d3}nav{margin:0 0 1em;padding:0 0 1em;border-bottom:1px solid #ccc}footer{margin:5em 0 1em}pre{white-space:pre-wrap;margin-left:3em}code{font-size:89%;color:#191919}.author{margin-bottom:0;padding-bottom:0}.headnote,.published,.license{font-size:89%;margin-bottom:.75em}@media screen and (max-width:35.5em){thead{display:none}tr,th,td{display:block}td{border-top:0}tr td:first-child{border-top:1px solid #ddd;font-weight:700}}+table {+ margin-left: auto;+ margin-right: auto;+ margin-bottom: 24px;+ border-spacing: 0;+ border-bottom: 2px solid black;+ border-top: 2px solid black;+}+table th {+ padding: 3px 10px;+ background-color: white;+ border-top: none;+ border-left: none;+ border-right: none;+ border-bottom: 1px solid black;+}+table td {+ padding: 3px 10px;+ border-top: none;+ border-left: none;+ border-bottom: none;+ border-right: none;+}+</style>++$if(quotes)$+<style>q {quotes: "“" "”" "‘" "’";}</style>+$endif$+$if(highlighting-css)$+<style>+$highlighting-css$+</style>+$endif$+$for(css)$+<link rel="stylesheet" href="$css$">+$endfor$+$if(math)$+$math$+$endif$+$for(header-includes)$+$header-includes$+$endfor$+</head>+<body>+<section id="page-content">+<div class="pure-g">+<div class="pure-u-1 pure-u-sm-1 pure-u-md-1 pure-u-lg-1 pure-u-xl-1">++<!-- page content begins here -->++$for(include-before)$+$include-before$+$endfor$+$if(headnote)$+<div class="headnote">$headnote$</div>+$endif$+$if(published)$+<div class="published">$published$</div>+$endif$+$if(license)$+<div class="license">$license$</div>$endif$+$if(title)$+<header>+<h1 class="title">$title$</h1>+$if(subtitle)$+<h1 class="subtitle">$subtitle$</h1>+$endif$+$if(author)$+$for(author)$+$if(author.name)$+<h2 class="author">$author.name$</h2>+$else$+<h2 class="author">$author$</h2>+$endif$+$if(author.affiliation)$+<div class="affiliation">$author.affiliation$</div>+$endif$+$if(author.email)$+<div class="email"><a href="mailto:$author.email$">$author.email$</a></div>+$endif$+$endfor$+$endif$+$if(version)$+<h3 class="version">Version $version$</h3>+$endif$+$if(date)$+<h3 class="date">$date$</h3>+$endif$+</header>+$endif$+$if(abstract)$+<div class="abstract">+<h3>Abstract</h3>+$abstract$+</div>+$endif$+$if(toc)$+<nav id="$idprefix$TOC">+$toc$+</nav>+$endif$+$body$+$for(include-after)$+$include-after$+$endfor$++<!-- page content ends here -->++</div> <!-- pure-u-1... -->+</div> <!-- pure-g -->+</section> <!-- page-content -->+<div class="pure-g">+<footer><a href="https://bitfragment.github.io/mindoc">mindoc</a> v1.1.0</footer>+</div>+<script>+var mindoc=function(){function e(e){return e=e.toLowerCase(),e.charAt(0).toUpperCase()+e.substr(1)}function n(e){var n=new RegExp(/^\b[a-z]\S+\b-\b\S+\b/);return n.test(e)&&(e=e.replace(/-+/g," ")),e}function t(t){return t=n(t),e(t)}function r(e,n){return!!e.className.match(new RegExp("(\\s|^)"+n+"(\\s|)"))}function a(e,n){r(e,n)||(e.className+=" "+n)}function o(e,n){if(r(e,n)){var t=new RegExp("(\\s|^)"+n+"(\\s|)");e.className=e.className.replace(t," ")}}function u(){var e,n,t={table:"pure-table pure-table-bordered"};Object.keys(t).forEach(function(r){if(e=document.getElementsByTagName(r),n=e.length,n>1)for(var o=0;n>o;o++)a(e[o],t[r])})}function c(e,n){for(var t=0,r=e.length;r>t;t++)for(var a=e[t].getElementsByTagName("a"),u=0,c=a.length;c>u;u++)a[u].addEventListener("click",function(){o(n,"hidden")})}function i(e,n){for(var t=0,r=e.length;r>t;t++)e[t].addEventListener("click",function(){o(n,"hidden")})}function d(){var e=document.createElement("li");return a(e,"pure-menu-item"),e}function l(e){var n=document.createElement("a");return n.id="menu-"+e,n.href="#",n.innerHTML=t(e),a(n,"pure-menu-link"),n}function m(e){var n=document.createDocumentFragment(),t=document.createElement("nav"),r=document.createElement("div"),o=document.createElement("ul");n.appendChild(t),t.appendChild(r),r.appendChild(o),a(r,"pure-menu"),a(o,"pure-menu-list");var u="All sections",c=d();a(c,"pure-menu-selected"),o.appendChild(c),c.appendChild(l(u));for(var i,m,s=0,f=e.length;f>s;s++)i=e[s].getAttribute("id"),m=d(),o.appendChild(m),m.appendChild(l(i));var p=document.getElementById("page-content");document.querySelector("body").insertBefore(n,p)}function s(e){var n;e.hasAttribute("pure-menu-selected")||(n=document.querySelector(".pure-menu-selected"),o(n,"pure-menu-selected"),a(e,"pure-menu-selected"))}function f(e,n){var t,u=n.getAttribute("id"),c=u.replace(/menu-/,""),i=document.getElementById(u).parentNode;s(i);for(var d in e)t=e[d],r(t,"hidden")||a(t,"hidden"),t.getAttribute("id")===c&&r(t,"hidden")&&o(t,"hidden")}function p(e){var n;for(var t in e)n=e[t],r(n,"hidden")&&o(n,"hidden")}function v(e){for(var n=document.querySelectorAll(".pure-menu-link"),t=0,r=n.length;r>t;t++)0===t?n[t].addEventListener("click",function(){p(e)}):n[t].addEventListener("click",function(){f(e,this)})}return{main:function(){if(u(),document.getElementsByClassName("level2").length>0){var e,n=[];["abstract","level2","footnotes"].forEach(function(t){e=document.getElementsByClassName(t);for(var r=0,a=e.length;a>r;r++)n.push(e[r])});var t;for(var o in n)t=n[o],r(t,"level2")||a(t,"level2"),r(t,"footnotes")&&t.setAttribute("id","footnotes");m(n),v(n);var d=document.getElementsByClassName("citation"),l=document.getElementById("references");c(d,l);var s=document.getElementsByClassName("footnoteRef"),f=document.getElementById("footnotes");i(s,f)}}}}();window.addEventListener("load",function(){mindoc.main()});+</script>++<!-- For debugging local scripts -->+<!-- <script src="../build/mindoc.js"></script> -->+</body>+</html>
+ data/knit-haskell-templates/pandoc-adaptive-bootstrap-KH.html view
@@ -0,0 +1,116 @@+<!doctype html>+<html $if(lang)$ lang="$lang$" $endif$>+<head>+ + <meta name="viewport" content="width=device-width, initial-scale=1.0" />+ <!--[if lt IE 9]>+ <script src="http://css3-mediaqueries-js.googlecode.com/svn/trunk/css3-mediaqueries.js"></script>+ <![endif]-->+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />+ <meta http-equiv="Content-Style-Type" content="text/css" />+ <link href="https://vjs.zencdn.net/5.4.4/video-js.css" rel="stylesheet" />++++<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>+<script type='text/javascript' src='menu/js/jquery.cookie.js'></script>+<script type='text/javascript' src='menu/js/jquery.hoverIntent.minified.js'></script>+<script type='text/javascript' src='menu/js/jquery.dcjqaccordion.2.7.min.js'></script>++<link href="menu/css/skins/blue.css" rel="stylesheet" type="text/css" />+<link href="menu/css/skins/graphite.css" rel="stylesheet" type="text/css" />+<link href="menu/css/skins/grey.css" rel="stylesheet" type="text/css" />++<!-- MathJax -->+<script async src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-MML-AM_CHTML"></script>+<!-- Vega and Vega Embed -->+<script src="https://cdn.jsdelivr.net/npm/vega@4.4.0"></script>+<script src="https://cdn.jsdelivr.net/npm/vega-lite@3.0.0-rc11"></script>+<script src="https://cdn.jsdelivr.net/npm/vega-embed@3.28.0"></script> + + <script src="script.js"></script>+ + <script src="jquery.sticky-kit.js "></script>+ <meta name="generator" content="pandoc" />+$for(author-meta)$+ <meta name="author" content="$author-meta$" />+$endfor$+$if(date-meta)$+ <meta name="date" content="$date-meta$" />+$endif$+ <title>$if(title-prefix)$$title-prefix$ - $endif$$pagetitle$</title>+ <style type="text/css">code{white-space: pre;}</style>+$if(quotes)$+ <style type="text/css">q { quotes: "“" "”" "‘" "’"; }</style>+$endif$+$if(highlighting-css)$+ <style type="text/css">+$highlighting-css$+ </style>+$endif$+$for(css)$+ <link rel="stylesheet" href="$css$" $if(html5)$$else$type="text/css" $endif$/>+$endfor$+$if(math)$+ $math$+$endif$+$for(header-includes)$+ $header-includes$+$endfor$+</head>+<body>++ + $if(title)$+ <div class="navbar navbar-static-top">+ <div class="navbar-inner">+ <div class="container">+ <span class="doc-title">$title$</span>+ <ul class="nav pull-right doc-info">+ $for(author)$+ <li><p class="navbar-text">$author$</p></li>+ $endfor$+ $if(date)$+ <li><p class="navbar-text">$date$</p></li>+ $endif$+ </ul>+ </div>+ </div>+ </div>+ $endif$+ <div class="container">+ <div class="row">+ $if(toc)$+ <div id="$idprefix$TOC" class="span3">+ <div class="well toc">++ $toc$++ </div>+ </div>+ $endif$+ <div class="span$if(toc)$9$else$12$endif$">+ $for(include-before)$+ $include-before$+ $endfor$+ $body$+ $for(include-after)$+ $include-after$+ $endfor$+ </div>+ </div>+ </div>+$if(analytics)$ + <script>+ (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){+ (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),+ m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)+ })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');++ ga('create', '$analytics$', 'auto');+ ga('send', 'pageview');+$endif$+ <script src="https://vjs.zencdn.net/5.4.4/video.js"></script>++</body>+</html>
+ data/knit-haskell-templates/pandoc-bootstrap-KH.html view
@@ -0,0 +1,81 @@+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">+<html xmlns="http://www.w3.org/1999/xhtml"$if(lang)$ lang="$lang$" xml:lang="$lang$"$endif$>+<head>+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />+ <meta http-equiv="Content-Style-Type" content="text/css" />+ <meta name="generator" content="pandoc" />+$for(author-meta)$+ <meta name="author" content="$author-meta$" />+$endfor$+$if(date-meta)$+ <meta name="date" content="$date-meta$" />+$endif$+ <title>$if(title-prefix)$$title-prefix$ - $endif$$pagetitle$</title>+ <style type="text/css">code{white-space: pre;}</style>+$if(quotes)$+ <style type="text/css">q { quotes: "“" "”" "‘" "’"; }</style>+$endif$+$if(highlighting-css)$+ <style type="text/css">+$highlighting-css$+ </style>+$endif$+$for(css)$+ <link rel="stylesheet" href="$css$" $if(html5)$$else$type="text/css" $endif$/>+$endfor$+$if(math)$+ $math$+$endif$+$for(header-includes)$+ $header-includes$+$endfor$+<!-- MathJax -->+<script async src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-MML-AM_CHTML"></script>+<!-- Vega and Vega Embed -->+<script src="https://cdn.jsdelivr.net/npm/vega@4.4.0"></script>+<script src="https://cdn.jsdelivr.net/npm/vega-lite@3.0.0-rc11"></script>+<script src="https://cdn.jsdelivr.net/npm/vega-embed@3.28.0"></script>+</head>+<body>+ $if(title)$+ <div class="navbar navbar-static-top">+ <div class="navbar-inner">+ <div class="container">+ <span class="doc-title">$title$</span>+ <ul class="nav pull-right doc-info">+ $for(author)$+ <li><p class="navbar-text">$author$</p></li>+ $endfor$+ $if(date)$+ <li><p class="navbar-text">$date$</p></li>+ $endif$+ </ul>+ </div>+ </div>+ </div>+ $endif$+ <div class="container">+ <div class="row">+ $if(toc)$+ <div id="$idprefix$TOC" class="span3">+ <div class="well toc">+ <ul>+ <li class="nav-header">Table of Contents</li>+ </ul>+ $toc$+ </div>+ </div>+ $endif$+ <div class="span$if(toc)$9$else$12$endif$">+ $for(include-before)$+ $include-before$+ $endfor$+ $body$+ $for(include-after)$+ $include-after$+ $endfor$+ </div>+ </div>+ </div>+</body>+</html>
+ data/pandoc-data/templates/default.commonmark view
@@ -0,0 +1,21 @@+$if(titleblock)$+$titleblock$++$endif$+$for(header-includes)$+$header-includes$++$endfor$+$for(include-before)$+$include-before$++$endfor$+$if(toc)$+$table-of-contents$++$endif$+$body$+$for(include-after)$++$include-after$+$endfor$
+ data/pandoc-data/templates/default.haddock view
@@ -0,0 +1,1 @@+$body$
+ data/pandoc-data/templates/default.html4 view
@@ -0,0 +1,69 @@+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">+<html xmlns="http://www.w3.org/1999/xhtml"$if(lang)$ lang="$lang$" xml:lang="$lang$"$endif$$if(dir)$ dir="$dir$"$endif$>+<head>+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />+ <meta http-equiv="Content-Style-Type" content="text/css" />+ <meta name="generator" content="pandoc" />+$for(author-meta)$+ <meta name="author" content="$author-meta$" />+$endfor$+$if(date-meta)$+ <meta name="date" content="$date-meta$" />+$endif$+$if(keywords)$+ <meta name="keywords" content="$for(keywords)$$keywords$$sep$, $endfor$" />+$endif$+ <title>$if(title-prefix)$$title-prefix$ – $endif$$pagetitle$</title>+ <style type="text/css">+ code{white-space: pre-wrap;}+ span.smallcaps{font-variant: small-caps;}+ span.underline{text-decoration: underline;}+ div.column{display: inline-block; vertical-align: top; width: 50%;}+$if(quotes)$+ q { quotes: "“" "”" "‘" "’"; }+$endif$+ </style>+$if(highlighting-css)$+ <style type="text/css">+$highlighting-css$+ </style>+$endif$+$for(css)$+ <link rel="stylesheet" href="$css$" type="text/css" />+$endfor$+$if(math)$+ $math$+$endif$+$for(header-includes)$+ $header-includes$+$endfor$+</head>+<body>+$for(include-before)$+$include-before$+$endfor$+$if(title)$+<div id="$idprefix$header">+<h1 class="title">$title$</h1>+$if(subtitle)$+<h1 class="subtitle">$subtitle$</h1>+$endif$+$for(author)$+<h2 class="author">$author$</h2>+$endfor$+$if(date)$+<h3 class="date">$date$</h3>+$endif$+</div>+$endif$+$if(toc)$+<div id="$idprefix$TOC">+$table-of-contents$+</div>+$endif$+$body$+$for(include-after)$+$include-after$+$endfor$+</body>+</html>
+ data/pandoc-data/templates/default.html5 view
@@ -0,0 +1,72 @@+<!DOCTYPE html>+<html xmlns="http://www.w3.org/1999/xhtml" lang="$lang$" xml:lang="$lang$"$if(dir)$ dir="$dir$"$endif$>+<head>+ <meta charset="utf-8" />+ <meta name="generator" content="pandoc" />+ <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />+$for(author-meta)$+ <meta name="author" content="$author-meta$" />+$endfor$+$if(date-meta)$+ <meta name="dcterms.date" content="$date-meta$" />+$endif$+$if(keywords)$+ <meta name="keywords" content="$for(keywords)$$keywords$$sep$, $endfor$" />+$endif$+ <title>$if(title-prefix)$$title-prefix$ – $endif$$pagetitle$</title>+ <style>+ code{white-space: pre-wrap;}+ span.smallcaps{font-variant: small-caps;}+ span.underline{text-decoration: underline;}+ div.column{display: inline-block; vertical-align: top; width: 50%;}+$if(quotes)$+ q { quotes: "“" "”" "‘" "’"; }+$endif$+ </style>+$if(highlighting-css)$+ <style>+$highlighting-css$+ </style>+$endif$+$for(css)$+ <link rel="stylesheet" href="$css$" />+$endfor$+$if(math)$+ $math$+$endif$+ <!--[if lt IE 9]>+ <script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv-printshiv.min.js"></script>+ <![endif]-->+$for(header-includes)$+ $header-includes$+$endfor$+</head>+<body>+$for(include-before)$+$include-before$+$endfor$+$if(title)$+<header id="title-block-header">+<h1 class="title">$title$</h1>+$if(subtitle)$+<p class="subtitle">$subtitle$</p>+$endif$+$for(author)$+<p class="author">$author$</p>+$endfor$+$if(date)$+<p class="date">$date$</p>+$endif$+</header>+$endif$+$if(toc)$+<nav id="$idprefix$TOC" role="doc-toc">+$table-of-contents$+</nav>+$endif$+$body$+$for(include-after)$+$include-after$+$endfor$+</body>+</html>
+ data/pandoc-data/templates/default.latex view
@@ -0,0 +1,488 @@+% Options for packages loaded elsewhere+\PassOptionsToPackage{unicode$for(hyperrefoptions)$,$hyperrefoptions$$endfor$}{hyperref}+\PassOptionsToPackage{hyphens}{url}+$if(colorlinks)$+\PassOptionsToPackage{dvipsnames,svgnames*,x11names*}{xcolor}+$endif$+$if(dir)$+$if(latex-dir-rtl)$+\PassOptionsToPackage{RTLdocument}{bidi}+$endif$+$endif$+%+\documentclass[+$if(fontsize)$+ $fontsize$,+$endif$+$if(lang)$+ $babel-lang$,+$endif$+$if(papersize)$+ $papersize$paper,+$endif$+$if(beamer)$+ ignorenonframetext,+$if(handout)$+ handout,+$endif$+$if(aspectratio)$+ aspectratio=$aspectratio$,+$endif$+$endif$+$for(classoption)$+ $classoption$$sep$,+$endfor$+]{$documentclass$}+$if(beamer)$+$if(background-image)$+\usebackgroundtemplate{%+ \includegraphics[width=\paperwidth]{$background-image$}%+}+$endif$+\usepackage{pgfpages}+\setbeamertemplate{caption}[numbered]+\setbeamertemplate{caption label separator}{: }+\setbeamercolor{caption name}{fg=normal text.fg}+\beamertemplatenavigationsymbols$if(navigation)$$navigation$$else$empty$endif$+$for(beameroption)$+\setbeameroption{$beameroption$}+$endfor$+% Prevent slide breaks in the middle of a paragraph+\widowpenalties 1 10000+\raggedbottom+$if(section-titles)$+\setbeamertemplate{part page}{+ \centering+ \begin{beamercolorbox}[sep=16pt,center]{part title}+ \usebeamerfont{part title}\insertpart\par+ \end{beamercolorbox}+}+\setbeamertemplate{section page}{+ \centering+ \begin{beamercolorbox}[sep=12pt,center]{part title}+ \usebeamerfont{section title}\insertsection\par+ \end{beamercolorbox}+}+\setbeamertemplate{subsection page}{+ \centering+ \begin{beamercolorbox}[sep=8pt,center]{part title}+ \usebeamerfont{subsection title}\insertsubsection\par+ \end{beamercolorbox}+}+\AtBeginPart{+ \frame{\partpage}+}+\AtBeginSection{+ \ifbibliography+ \else+ \frame{\sectionpage}+ \fi+}+\AtBeginSubsection{+ \frame{\subsectionpage}+}+$endif$+$endif$+$if(beamerarticle)$+\usepackage{beamerarticle} % needs to be loaded first+$endif$+$if(fontfamily)$+\usepackage[$for(fontfamilyoptions)$$fontfamilyoptions$$sep$,$endfor$]{$fontfamily$}+$else$+\usepackage{lmodern}+$endif$+$if(linestretch)$+\usepackage{setspace}+$endif$+\usepackage{amssymb,amsmath}+\usepackage{ifxetex,ifluatex}+\ifnum 0\ifxetex 1\fi\ifluatex 1\fi=0 % if pdftex+ \usepackage[$if(fontenc)$$fontenc$$else$T1$endif$]{fontenc}+ \usepackage[utf8]{inputenc}+ \usepackage{textcomp} % provide euro and other symbols+\else % if luatex or xetex+$if(mathspec)$+ \ifxetex+ \usepackage{mathspec}+ \else+ \usepackage{unicode-math}+ \fi+$else$+ \usepackage{unicode-math}+$endif$+ \defaultfontfeatures{Scale=MatchLowercase}+ \defaultfontfeatures[\rmfamily]{Ligatures=TeX,Scale=1}+$if(mainfont)$+ \setmainfont[$for(mainfontoptions)$$mainfontoptions$$sep$,$endfor$]{$mainfont$}+$endif$+$if(sansfont)$+ \setsansfont[$for(sansfontoptions)$$sansfontoptions$$sep$,$endfor$]{$sansfont$}+$endif$+$if(monofont)$+ \setmonofont[$for(monofontoptions)$$monofontoptions$$sep$,$endfor$]{$monofont$}+$endif$+$for(fontfamilies)$+ \newfontfamily{$fontfamilies.name$}[$for(fontfamilies.options)$$fontfamilies.options$$sep$,$endfor$]{$fontfamilies.font$}+$endfor$+$if(mathfont)$+$if(mathspec)$+ \ifxetex+ \setmathfont(Digits,Latin,Greek)[$for(mathfontoptions)$$mathfontoptions$$sep$,$endfor$]{$mathfont$}+ \else+ \setmathfont[$for(mathfontoptions)$$mathfontoptions$$sep$,$endfor$]{$mathfont$}+ \fi+$else$+ \setmathfont[$for(mathfontoptions)$$mathfontoptions$$sep$,$endfor$]{$mathfont$}+$endif$+$endif$+$if(CJKmainfont)$+ \ifxetex+ \usepackage{xeCJK}+ \setCJKmainfont[$for(CJKoptions)$$CJKoptions$$sep$,$endfor$]{$CJKmainfont$}+ \fi+$endif$+$if(luatexjapresetoptions)$+ \ifluatex+ \usepackage[$for(luatexjapresetoptions)$$luatexjapresetoptions$$sep$,$endfor$]{luatexja-preset}+ \fi+$endif$+$if(CJKmainfont)$+ \ifluatex+ \usepackage[$for(luatexjafontspecoptions)$$luatexjafontspecoptions$$sep$,$endfor$]{luatexja-fontspec}+ \setmainjfont[$for(CJKoptions)$$CJKoptions$$sep$,$endfor$]{$CJKmainfont$}+ \fi+$endif$+\fi+$if(beamer)$+$if(theme)$+\usetheme[$for(themeoptions)$$themeoptions$$sep$,$endfor$]{$theme$}+$endif$+$if(colortheme)$+\usecolortheme{$colortheme$}+$endif$+$if(fonttheme)$+\usefonttheme{$fonttheme$}+$endif$+$if(mainfont)$+\usefonttheme{serif} % use mainfont rather than sansfont for slide text+$endif$+$if(innertheme)$+\useinnertheme{$innertheme$}+$endif$+$if(outertheme)$+\useoutertheme{$outertheme$}+$endif$+$endif$+% Use upquote if available, for straight quotes in verbatim environments+\IfFileExists{upquote.sty}{\usepackage{upquote}}{}+\IfFileExists{microtype.sty}{% use microtype if available+ \usepackage[$for(microtypeoptions)$$microtypeoptions$$sep$,$endfor$]{microtype}+ \UseMicrotypeSet[protrusion]{basicmath} % disable protrusion for tt fonts+}{}+$if(indent)$+$else$+\makeatletter+\@ifundefined{KOMAClassName}{% if non-KOMA class+ \IfFileExists{parskip.sty}{%+ \usepackage{parskip}+ }{% else+ \setlength{\parindent}{0pt}+ \setlength{\parskip}{6pt plus 2pt minus 1pt}}+}{% if KOMA class+ \KOMAoptions{parskip=half}}+\makeatother+$endif$+$if(verbatim-in-note)$+\usepackage{fancyvrb}+$endif$+\usepackage{xcolor}+\IfFileExists{xurl.sty}{\usepackage{xurl}}{} % add URL line breaks if available+\IfFileExists{bookmark.sty}{\usepackage{bookmark}}{\usepackage{hyperref}}+\hypersetup{+$if(title-meta)$+ pdftitle={$title-meta$},+$endif$+$if(author-meta)$+ pdfauthor={$author-meta$},+$endif$+$if(lang)$+ pdflang={$lang$},+$endif$+$if(subject)$+ pdfsubject={$subject$},+$endif$+$if(keywords)$+ pdfkeywords={$for(keywords)$$keywords$$sep$, $endfor$},+$endif$+$if(colorlinks)$+ colorlinks=true,+ linkcolor=$if(linkcolor)$$linkcolor$$else$Maroon$endif$,+ filecolor=$if(filecolor)$$filecolor$$else$Maroon$endif$,+ citecolor=$if(citecolor)$$citecolor$$else$Blue$endif$,+ urlcolor=$if(urlcolor)$$urlcolor$$else$Blue$endif$,+$else$+ hidelinks,+$endif$+ pdfcreator={LaTeX via pandoc}}+\urlstyle{same} % disable monospaced font for URLs+$if(verbatim-in-note)$+\VerbatimFootnotes % allow verbatim text in footnotes+$endif$+$if(geometry)$+$if(beamer)$+\geometry{$for(geometry)$$geometry$$sep$,$endfor$}+$else$+\usepackage[$for(geometry)$$geometry$$sep$,$endfor$]{geometry}+$endif$+$endif$+$if(beamer)$+\newif\ifbibliography+$endif$+$if(listings)$+\usepackage{listings}+\newcommand{\passthrough}[1]{#1}+\lstset{defaultdialect=[5.3]Lua}+\lstset{defaultdialect=[x86masm]Assembler}+$endif$+$if(lhs)$+\lstnewenvironment{code}{\lstset{language=Haskell,basicstyle=\small\ttfamily}}{}+$endif$+$if(highlighting-macros)$+$highlighting-macros$+$endif$+$if(tables)$+\usepackage{longtable,booktabs}+$if(beamer)$+\usepackage{caption}+% Make caption package work with longtable+\makeatletter+\def\fnum@table{\tablename~\thetable}+\makeatother+$else$+% Correct order of tables after \paragraph or \subparagraph+\usepackage{etoolbox}+\makeatletter+\patchcmd\longtable{\par}{\if@noskipsec\mbox{}\fi\par}{}{}+\makeatother+% Allow footnotes in longtable head/foot+\IfFileExists{footnotehyper.sty}{\usepackage{footnotehyper}}{\usepackage{footnote}}+\makesavenoteenv{longtable}+$endif$+$endif$+$if(graphics)$+\usepackage{graphicx,grffile}+\makeatletter+\def\maxwidth{\ifdim\Gin@nat@width>\linewidth\linewidth\else\Gin@nat@width\fi}+\def\maxheight{\ifdim\Gin@nat@height>\textheight\textheight\else\Gin@nat@height\fi}+\makeatother+% Scale images if necessary, so that they will not overflow the page+% margins by default, and it is still possible to overwrite the defaults+% using explicit options in \includegraphics[width, height, ...]{}+\setkeys{Gin}{width=\maxwidth,height=\maxheight,keepaspectratio}+% Set default figure placement to htbp+\makeatletter+\def\fps@figure{htbp}+\makeatother+$endif$+$if(links-as-notes)$+% Make links footnotes instead of hotlinks:+\DeclareRobustCommand{\href}[2]{#2\footnote{\url{#1}}}+$endif$+$if(strikeout)$+\usepackage[normalem]{ulem}+% Avoid problems with \sout in headers with hyperref+\pdfstringdefDisableCommands{\renewcommand{\sout}{}}+$endif$+\setlength{\emergencystretch}{3em} % prevent overfull lines+\providecommand{\tightlist}{%+ \setlength{\itemsep}{0pt}\setlength{\parskip}{0pt}}+$if(numbersections)$+\setcounter{secnumdepth}{$if(secnumdepth)$$secnumdepth$$else$5$endif$}+$else$+\setcounter{secnumdepth}{-\maxdimen} % remove section numbering+$endif$+$if(beamer)$+$else$+$if(block-headings)$+% Make \paragraph and \subparagraph free-standing+\ifx\paragraph\undefined\else+ \let\oldparagraph\paragraph+ \renewcommand{\paragraph}[1]{\oldparagraph{#1}\mbox{}}+\fi+\ifx\subparagraph\undefined\else+ \let\oldsubparagraph\subparagraph+ \renewcommand{\subparagraph}[1]{\oldsubparagraph{#1}\mbox{}}+\fi+$endif$+$endif$+$if(pagestyle)$+\pagestyle{$pagestyle$}+$endif$+$for(header-includes)$+$header-includes$+$endfor$+$if(lang)$+\ifxetex+ % Load polyglossia as late as possible: uses bidi with RTL langages (e.g. Hebrew, Arabic)+ \usepackage{polyglossia}+ \setmainlanguage[$polyglossia-lang.options$]{$polyglossia-lang.name$}+$for(polyglossia-otherlangs)$+ \setotherlanguage[$polyglossia-otherlangs.options$]{$polyglossia-otherlangs.name$}+$endfor$+\else+ \usepackage[shorthands=off,$for(babel-otherlangs)$$babel-otherlangs$,$endfor$main=$babel-lang$]{babel}+$if(babel-newcommands)$+ $babel-newcommands$+$endif$+\fi+$endif$+$if(dir)$+\ifxetex+ % Load bidi as late as possible as it modifies e.g. graphicx+ \usepackage{bidi}+\fi+\ifnum 0\ifxetex 1\fi\ifluatex 1\fi=0 % if pdftex+ \TeXXeTstate=1+ \newcommand{\RL}[1]{\beginR #1\endR}+ \newcommand{\LR}[1]{\beginL #1\endL}+ \newenvironment{RTL}{\beginR}{\endR}+ \newenvironment{LTR}{\beginL}{\endL}+\fi+$endif$+$if(natbib)$+\usepackage[$natbiboptions$]{natbib}+\bibliographystyle{$if(biblio-style)$$biblio-style$$else$plainnat$endif$}+$endif$+$if(biblatex)$+\usepackage[$if(biblio-style)$style=$biblio-style$,$endif$$for(biblatexoptions)$$biblatexoptions$$sep$,$endfor$]{biblatex}+$for(bibliography)$+\addbibresource{$bibliography$}+$endfor$+$endif$++$if(title)$+\title{$title$$if(thanks)$\thanks{$thanks$}$endif$}+$endif$+$if(subtitle)$+$if(beamer)$+$else$+\usepackage{etoolbox}+\makeatletter+\providecommand{\subtitle}[1]{% add subtitle to \maketitle+ \apptocmd{\@title}{\par {\large #1 \par}}{}{}+}+\makeatother+$endif$+\subtitle{$subtitle$}+$endif$+$if(author)$+\author{$for(author)$$author$$sep$ \and $endfor$}+$endif$+\date{$date$}+$if(beamer)$+$if(institute)$+\institute{$for(institute)$$institute$$sep$ \and $endfor$}+$endif$+$if(titlegraphic)$+\titlegraphic{\includegraphics{$titlegraphic$}}+$endif$+$if(logo)$+\logo{\includegraphics{$logo$}}+$endif$+$endif$++\begin{document}+$if(has-frontmatter)$+\frontmatter+$endif$+$if(title)$+$if(beamer)$+\frame{\titlepage}+$else$+\maketitle+$endif$+$if(abstract)$+\begin{abstract}+$abstract$+\end{abstract}+$endif$+$endif$++$for(include-before)$+$include-before$++$endfor$+$if(toc)$+$if(toc-title)$+\renewcommand*\contentsname{$toc-title$}+$endif$+$if(beamer)$+\begin{frame}+$if(toc-title)$+ \frametitle{$toc-title$}+$endif$+ \tableofcontents[hideallsubsections]+\end{frame}+$else$+{+$if(colorlinks)$+\hypersetup{linkcolor=$if(toccolor)$$toccolor$$else$$endif$}+$endif$+\setcounter{tocdepth}{$toc-depth$}+\tableofcontents+}+$endif$+$endif$+$if(lot)$+\listoftables+$endif$+$if(lof)$+\listoffigures+$endif$+$if(linestretch)$+\setstretch{$linestretch$}+$endif$+$if(has-frontmatter)$+\mainmatter+$endif$+$body$++$if(has-frontmatter)$+\backmatter+$endif$+$if(natbib)$+$if(bibliography)$+$if(biblio-title)$+$if(has-chapters)$+\renewcommand\bibname{$biblio-title$}+$else$+\renewcommand\refname{$biblio-title$}+$endif$+$endif$+$if(beamer)$+\begin{frame}[allowframebreaks]{$biblio-title$}+ \bibliographytrue+$endif$+ \bibliography{$for(bibliography)$$bibliography$$sep$,$endfor$}+$if(beamer)$+\end{frame}+$endif$++$endif$+$endif$+$if(biblatex)$+$if(beamer)$+\begin{frame}[allowframebreaks]{$biblio-title$}+ \bibliographytrue+ \printbibliography[heading=none]+\end{frame}+$else$+\printbibliography$if(biblio-title)$[title=$biblio-title$]$endif$+$endif$++$endif$+$for(include-after)$+$include-after$++$endfor$+\end{document}
+ data/pandoc-data/templates/default.markdown view
@@ -0,0 +1,21 @@+$if(titleblock)$+$titleblock$++$endif$+$for(header-includes)$+$header-includes$++$endfor$+$for(include-before)$+$include-before$++$endfor$+$if(toc)$+$table-of-contents$++$endif$+$body$+$for(include-after)$++$include-after$+$endfor$
examples/ErrorExample.hs view
@@ -8,8 +8,6 @@ import qualified Knit.Report as K import qualified Data.Map as M-import qualified Data.Text.IO as T-import qualified Data.Text.Lazy as TL import qualified Data.Text as T import Data.String.Here (here) import qualified Graphics.Vega.VegaLite as V@@ -24,13 +22,11 @@ main :: IO () main = do- let pandocWriterConfig = K.PandocWriterConfig (Just "pandoc-templates/minWithVega-pandoc.html") templateVars K.mindocOptionsF- resSimpleE <- K.knitHtml (Just "SimpleExample.Main") K.logAll pandocWriterConfig makeDocWithKnitError+ let template = K.FromIncludedTemplateDir "pandoc-bootstrap-KH.html"+ pandocWriterConfig <- K.mkPandocWriterConfig template templateVars K.mindocOptionsF+ resSimpleE <- K.knitHtml (Just "ErrorExample.Main") K.logAll pandocWriterConfig makeDocWithKnitError case resSimpleE of- Right htmlAsText ->- T.writeFile "examples/html/example_simple.html"- $ TL.toStrict- $ htmlAsText+ Right htmlAsText -> K.writeAndMakePathLT "examples/html/error_example.html" htmlAsText Left err -> putStrLn $ "Pandoc Error: " ++ show err md1 :: T.Text
examples/MtlExample.hs view
@@ -27,7 +27,7 @@ ] -- A demo application stack -newtype MyApp env a = MyStack { unMyApp :: ReaderT env IO a } deriving (Functor, Applicative, Monad, MonadIO)+newtype MyApp env a = MyStack { unMyApp :: ReaderT env IO a } deriving (Functor, Applicative, Monad, MonadIO) type ExampleApp = MyApp T.Text @@ -39,15 +39,13 @@ main :: IO () main = do- let pandocWriterConfig =- K.PandocWriterConfig (Just "pandoc-templates/minWithVega-pandoc.html") templateVars K.mindocOptionsF+ let template = K.FromIncludedTemplateDir "pandoc-bootstrap-KH.html"+ templateVarsWithCss <- K.addCss (K.FromIncludedCssDir "pandoc-bootstrap.css") templateVars+ pandocWriterConfig <- K.mkPandocWriterConfig template templateVarsWithCss K.mindocOptionsF resE <- runExampleApp "This is from the MyApp environment." $ K.knitHtml (Just "MtlExample.Main") K.logAll pandocWriterConfig makeDoc case resE of- Right htmlAsText ->- T.writeFile "examples/html/mtl_example.html"- $ TL.toStrict- $ htmlAsText+ Right htmlAsText -> K.writeAndMakePathLT "examples/html/mtl_example.html" htmlAsText Left err -> putStrLn $ "Pandoc error: " ++ show err md1 :: T.Text
examples/MultiDocExample.hs view
@@ -24,15 +24,14 @@ main :: IO () main = do- let writeNamedHtml (K.DocWithInfo (K.PandocInfo n _) lt)- = T.writeFile (T.unpack $ "examples/html/" <> n <> ".html") $ TL.toStrict lt- writeAllHtml = fmap (const ()) . traverse writeNamedHtml- pandocWriterConfig = K.PandocWriterConfig (Just "pandoc-templates/minWithVega-pandoc.html") templateVars K.mindocOptionsF- resE <- K.knitHtmls (Just "SimpleExample.Main") K.logAll pandocWriterConfig $ do+ let template = K.FromIncludedTemplateDir "pandoc-adaptive-bootstrap-KH.html"+ tvWithCss <- K.addCss (K.FromIncludedCssDir "pandoc-bootstrap.css") templateVars+ pandocWriterConfig <- K.mkPandocWriterConfig template tvWithCss K.mindocOptionsF+ resE <- K.knitHtmls (Just "MTLExample.Main") K.logAll pandocWriterConfig $ do K.newPandoc (K.PandocInfo "multi_doc1" M.empty) makeDoc1 K.newPandoc (K.PandocInfo "multi_doc2" M.empty) makeDoc2 case resE of- Right namedDocs -> writeAllHtml namedDocs + Right namedDocs -> K.writeAllPandocResultsWithInfoAsHtml "examples/html" namedDocs Left err -> putStrLn $ "pandoc error: " ++ show err md1 :: T.Text
examples/RandomExample.hs view
@@ -7,14 +7,13 @@ module Main where import qualified Knit.Report as K-import qualified Knit.Effect.RandomFu as KR+import qualified Polysemy.RandomFu as PR+import qualified Polysemy.ConstraintAbsorber.MonadRandom as PR import qualified Colonnade as C import Control.Monad (replicateM) import Control.Monad.IO.Class (MonadIO) import qualified Data.Map as M-import qualified Data.Text.IO as T-import qualified Data.Text.Lazy as TL import qualified Data.Text as T import Data.String.Here (here) import qualified Graphics.Vega.VegaLite as V@@ -48,17 +47,14 @@ main :: IO () main = do- let pandocWriterConfig =- K.PandocWriterConfig (Just "pandoc-templates/minWithVega-pandoc.html") templateVars K.mindocOptionsF+ let template = K.FromIncludedTemplateDir "mindoc-pandoc-KH.html"+ pandocWriterConfig <- K.mkPandocWriterConfig template templateVars K.mindocOptionsF pureMTSource <- newPureMT resE <- runExampleApp "This is from the MyApp environment." $ K.knitHtml (Just "RandomExample.Main") K.logAll pandocWriterConfig- $ KR.runRandomFuIOPureMT pureMTSource $ makeDoc+ $ PR.runRandomIOPureMT pureMTSource $ makeDoc case resE of - Right htmlAsText ->- T.writeFile "examples/html/random_example.html"- $ TL.toStrict- $ htmlAsText+ Right htmlAsText -> K.writeAndMakePathLT "examples/html/random_example.html" htmlAsText Left err -> putStrLn $ "Pandoc error: " ++ show err md1 :: T.Text@@ -71,7 +67,7 @@ |] makeDoc :: ( K.KnitOne effs- , K.Member KR.RandomFu effs -- this one needs to be handled before knitting+ , K.Member PR.RandomFu effs -- this one needs to be handled before knitting , K.KnitBase ExampleApp effs) => K.Sem effs () makeDoc = K.wrapPrefix "makeDoc" $ do K.logLE K.Info "adding some markdown..."@@ -93,11 +89,11 @@ K.logLE K.Info "Using another polysemy effect, here RandomFu" let nDraws = 20- someNormalDoubles <- KR.sampleRVar $ replicateM nDraws (stdNormal @Double)+ someNormalDoubles <- PR.sampleRVar $ replicateM nDraws (stdNormal @Double) K.addMarkDown "## An example of using the RandomFu effect to get random numbers and using Colonnade to make tables." K.addMarkDown $ "some std normal draws: " K.addColonnadeTextTable (C.headed "#" (T.pack . show . fst) <> C.headed "Draw" (T.pack . show . snd)) $ zip [1..nDraws] someNormalDoubles- moreNormalDoubles <- KR.absorbMonadRandom (monadRandomFunction nDraws)+ moreNormalDoubles <- PR.absorbMonadRandom (monadRandomFunction nDraws) K.addMarkDown "## This time, using absorbMonadRandom to interoperate with a function using the MonadRandom constraint." K.addMarkDown $ "some std normal draws: " K.addColonnadeTextTable (C.headed "#" (T.pack . show . fst) <> C.headed "Draw" (T.pack . show . snd)) $ zip [1..nDraws] moreNormalDoubles
examples/SimpleExample.hs view
@@ -8,8 +8,6 @@ import qualified Knit.Report as K import qualified Data.Map as M-import qualified Data.Text.IO as T-import qualified Data.Text.Lazy as TL import qualified Data.Text as T import Data.String.Here (here) import qualified Graphics.Vega.VegaLite as V@@ -26,13 +24,11 @@ main :: IO () main = do- let pandocWriterConfig = K.PandocWriterConfig (Just "pandoc-templates/minWithVega-pandoc.html") templateVars K.mindocOptionsF+ let template = K.FromIncludedTemplateDir "mindoc-pandoc-KH.html"+ pandocWriterConfig <- K.mkPandocWriterConfig template templateVars K.mindocOptionsF resE <- K.knitHtml (Just "SimpleExample.Main") K.logAll pandocWriterConfig makeDoc case resE of- Right htmlAsText ->- T.writeFile "examples/html/example_simple.html"- $ TL.toStrict- $ htmlAsText+ Right htmlAsText -> K.writeAndMakePathLT "examples/html/simple_example.html" htmlAsText Left err -> putStrLn $ "Pandoc Error: " ++ show err md1 :: T.Text
knit-haskell.cabal view
@@ -1,14 +1,13 @@-cabal-version: 2.2+cabal-version: 2.4 name: knit-haskell-version: 0.5.0.0+version: 0.6.0.0 synopsis: a minimal Rmarkdown sort-of-thing for haskell, by way of Pandoc description: knit-haskell is a beginning attempt at bringing some of the benefits of Rmarkdown to Haskell. It includes an effects stack (using <https://github.com/isovector/polysemy#readme polysemy> rather than mtl)- which includes logging, randomness- (via <http://hackage.haskell.org/package/random-fu random-fu>),+ which includes logging, a simplified interface to Pandoc and various writer-like effects to intersperse document building with regular code. Various helper functions are provided to simplify common operations,@@ -28,25 +27,38 @@ maintainer: adam_conner_sax@yahoo.com copyright: 2019 Adam Conner-Sax category: Text-extra-source-files: ChangeLog.md-tested-with: GHC ==8.6.4 +extra-source-files: ChangeLog.md, Readme.md+data-dir: data+data-files:+ knit-haskell-templates/*.html+ knit-haskell-css/*.css+ pandoc-data/templates/*.html4+ pandoc-data/templates/*.html5+ pandoc-data/templates/default.latex+ pandoc-data/templates/default.markdown+ pandoc-data/templates/default.commonmark+ pandoc-data/templates/default.haddock++tested-with: GHC ==8.6.4 Build-type: Simple source-repository head Type: git Location: https://github.com/adamConnerSax/knit-haskell -- + library- ghc-options: -Wall -fplugin=Polysemy.Plugin -fno-warn-unused-top-binds -funbox-strict-fields+ ghc-options: -Wall -fno-warn-unused-top-binds -funbox-strict-fields+ ghc-options: -fplugin=Polysemy.Plugin+-- ghc-options: -fdefer-type-errors -fno-warn-deferred-type-errors+-- when generating haddocks, comment out the plugin and uncomment the one above exposed-modules: Knit.Effect.Logger , Knit.Effect.Docs , Knit.Effect.Html- , Knit.Effect.RandomFu , Knit.Effect.PandocMonad , Knit.Effect.Pandoc , Knit.Effect.UnusedId+ , Knit.Report , Knit.Report.Input.Table.Colonnade , Knit.Report.Input.Html , Knit.Report.Input.Html.Lucid@@ -57,9 +69,10 @@ , Knit.Report.Input.Visualization.Diagrams , Knit.Report.Output , Knit.Report.Output.Html- , Knit.Report , Knit.Report.Other.Lucid , Knit.Report.Other.Blaze+ other-modules: Paths_knit_haskell+ autogen-modules: Paths_knit_haskell build-depends: aeson-pretty >= 0.8.7 && < 0.9, base >= 4.12.0 && < 4.13,@@ -69,6 +82,7 @@ case-insensitive >= 1.2.0.11 && < 1.3.0.0, colonnade >= 1.1 && < 1.3, containers >= 0.5.0 && < 0.7,+ constraints >= 0.10 && < 0.12, directory >= 1.3.3.0 && < 1.4.0.0, diagrams-lib >= 1.4 && < 1.5.0.0, diagrams-svg >= 1.4.1 && < 1.5.0.0,@@ -87,6 +101,7 @@ mtl >= 2.2.2 && < 2.3, polysemy >= 0.3.0.0 && < 0.5.0.0, polysemy-plugin >= 0.2.0.0 && < 0.3.0.0,+ polysemy-zoo >= 0.3.0.0 && < 0.4.0, prettyprinter >= 1.2.1 && < 1.4, lucid >= 2.9.11 && < 2.10, pandoc >= 2.7.2 && < 2.8,@@ -102,7 +117,7 @@ type: exitcode-stdio-1.0 main-is: SimpleExample.hs hs-source-dirs: examples- ghc-options: -Wall+ ghc-options: -fplugin=Polysemy.Plugin build-depends: base, blaze-html, containers,@@ -110,7 +125,8 @@ hvega, knit-haskell -any, plots >= 0.1.1.0 && <= 0.2,- polysemy, + polysemy,+ polysemy-plugin, text default-language: Haskell2010 @@ -118,14 +134,15 @@ type: exitcode-stdio-1.0 main-is: ErrorExample.hs hs-source-dirs: examples- ghc-options: -Wall + ghc-options: -fplugin=Polysemy.Plugin build-depends: base, blaze-html, containers, here >= 1.2.10 && < 1.3.0, hvega, knit-haskell -any,- polysemy, + polysemy,+ polysemy-plugin, text default-language: Haskell2010 @@ -133,14 +150,15 @@ type: exitcode-stdio-1.0 main-is: MultiDocExample.hs hs-source-dirs: examples- ghc-options: -Wall + ghc-options: -fplugin=Polysemy.Plugin build-depends: base, blaze-html, containers, here >= 1.2.10 && < 1.3.0, hvega, knit-haskell -any,- polysemy, + polysemy,+ polysemy-plugin, text default-language: Haskell2010 @@ -148,7 +166,7 @@ type: exitcode-stdio-1.0 main-is: MtlExample.hs hs-source-dirs: examples- ghc-options: -Wall + ghc-options: -fplugin=Polysemy.Plugin build-depends: base, blaze-html, containers,@@ -157,6 +175,7 @@ knit-haskell -any, mtl, polysemy,+ polysemy-plugin, text default-language: Haskell2010 @@ -164,7 +183,7 @@ type: exitcode-stdio-1.0 main-is: RandomExample.hs hs-source-dirs: examples- ghc-options: -Wall + ghc-options: -fplugin=Polysemy.Plugin build-depends: base, blaze-html, colonnade,@@ -174,6 +193,8 @@ knit-haskell -any, mtl, polysemy,+ polysemy-plugin,+ polysemy-RandomFu >= 0.2.0.0, random-fu, random-source, text
src/Knit/Effect/Docs.hs view
@@ -8,7 +8,6 @@ {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE StandaloneDeriving #-} {-# LANGUAGE TypeOperators #-}- {-# OPTIONS_GHC -fwarn-incomplete-patterns #-} {-| Module : Knit.Effect.Docs@@ -49,17 +48,19 @@ import Polysemy.Internal ( send ) import qualified Polysemy.Writer as P -import Control.Monad (sequence, join)+import Control.Monad ( sequence+ , join+ ) -- | GADT to represent storing a document and some info for processing it. data Docs i a m r where- NewDoc :: i -> a -> Docs i a m ()+ NewDoc ::i -> a -> Docs i a m () -- | Action of the 'Docs' Effect. Store a document. newDoc :: P.Member (Docs i a) effs => i -> a -> P.Sem effs () newDoc info doc = send $ NewDoc info doc --- | Data type to hold one document with info of typ @i@ and doc of type @a@. +-- | Data type to hold one document with info of type @i@ and doc of type @a@. data DocWithInfo i a = DocWithInfo { dwiInfo :: i, dwiDoc :: a } deriving instance Functor (DocWithInfo i) deriving instance Foldable (DocWithInfo i)@@ -67,7 +68,8 @@ -- | Intepret 'Docs' in @Polysemy.Writer [DocWithInfo i a]' toWriter- :: P.Sem (Docs i a ': effs) () -> P.Sem (P.Writer [DocWithInfo i a] ': effs) ()+ :: P.Sem (Docs i a ': effs) ()+ -> P.Sem (P.Writer [DocWithInfo i a] ': effs) () toWriter = P.reinterpret f where f :: Docs i a m x -> P.Sem (P.Writer [DocWithInfo i a] ': effs) x@@ -78,22 +80,28 @@ toDocList = fmap fst . P.runWriter . toWriter -- | Map over the doc part of @Functor m => m [DocWithInfo i a]@ with an @a->b@ resulting in @m [DocWithInfo i b]@-mapDocs :: Monad m => (i -> a -> b) -> m [DocWithInfo i a] -> m [DocWithInfo i b]+mapDocs+ :: Monad m => (i -> a -> b) -> m [DocWithInfo i a] -> m [DocWithInfo i b] mapDocs f = fmap (fmap (\(DocWithInfo i a) -> DocWithInfo i (f i a))) -- | Map over the doc part of @Monad m => m [DocWithInfo i a]@ with @a -> m b@ resulting in @m [DocWithInfo i b]@-mapDocsM :: Monad m => (i -> a -> m b) -> m [DocWithInfo i a] -> m [DocWithInfo i b]+mapDocsM+ :: Monad m => (i -> a -> m b) -> m [DocWithInfo i a] -> m [DocWithInfo i b] mapDocsM f = join . fmap (sequence . fmap (traverse id)) . mapDocs f --(traverse (traverse f) =<<) -- | Combine the interpretation and mapping step. -- Commonly used to "run" the effect and map the results to your desired output format. toDocListWith- :: (i -> a -> b) -> P.Sem (Docs i a ': effs) () -> P.Sem effs [DocWithInfo i b]+ :: (i -> a -> b)+ -> P.Sem (Docs i a ': effs) ()+ -> P.Sem effs [DocWithInfo i b] toDocListWith f = mapDocs f . toDocList -- | Combine the interpretation and effectful mapping step. -- Commonly used to "run" the effect and map the results to your deisred output format. toDocListWithM- :: (i -> a -> P.Sem effs b) -> P.Sem (Docs i a ': effs) () -> P.Sem effs [DocWithInfo i b]+ :: (i -> a -> P.Sem effs b)+ -> P.Sem (Docs i a ': effs) ()+ -> P.Sem effs [DocWithInfo i b] toDocListWithM f = mapDocsM f . toDocList
src/Knit/Effect/PandocMonad.hs view
@@ -1,9 +1,7 @@ {-# LANGUAGE ConstraintKinds #-} {-# LANGUAGE DataKinds #-} {-# LANGUAGE PolyKinds #-}-{-# LANGUAGE DeriveFunctor #-} {-# LANGUAGE FlexibleContexts #-}-{-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE GADTs #-} {-# LANGUAGE LambdaCase #-} {-# LANGUAGE MultiParamTypeClasses #-}@@ -14,7 +12,6 @@ {-# LANGUAGE TypeApplications #-} {-# LANGUAGE TypeOperators #-} {-# LANGUAGE UndecidableInstances #-}-{-# LANGUAGE AllowAmbiguousTypes #-} {-# LANGUAGE TupleSections #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-} {-# OPTIONS_GHC -fwarn-incomplete-patterns #-}@@ -74,11 +71,14 @@ where import qualified Knit.Effect.Logger as Log+import qualified Paths_knit_haskell as Paths import qualified Polysemy as P import Polysemy.Internal ( send ) import Polysemy.Internal.Combinators ( stateful ) import qualified Polysemy.Error as P+import qualified Polysemy.ConstraintAbsorber as P+ import qualified Text.Pandoc as PA import qualified Text.Pandoc.MIME as PA import qualified Text.Pandoc.UTF8 as UTF8@@ -93,6 +93,9 @@ import Control.Monad.Except ( MonadError(..) , liftIO )++--import qualified Data.Constraint as C+ import qualified Network.URI as NU import Network.Socket ( withSocketsDo ) import qualified Network.HTTP.Client as NHC@@ -131,24 +134,24 @@ -- | Pandoc Effect data Pandoc m r where- LookupEnv :: String -> Pandoc m (Maybe String)- GetCurrentTime :: Pandoc m UTCTime- GetCurrentTimeZone :: Pandoc m TimeZone- NewStdGen :: Pandoc m StdGen- NewUniqueHash :: Pandoc m Int- OpenURL :: String -> Pandoc m (BS.ByteString, Maybe PA.MimeType)- ReadFileLazy :: FilePath -> Pandoc m LBS.ByteString- ReadFileStrict :: FilePath -> Pandoc m BS.ByteString- Glob :: String -> Pandoc m [FilePath]- FileExists :: FilePath -> Pandoc m Bool- GetDataFileName :: FilePath -> Pandoc m FilePath- GetModificationTime :: FilePath -> Pandoc m UTCTime- GetCommonState :: Pandoc m PA.CommonState- PutCommonState :: PA.CommonState -> Pandoc m ()- GetsCommonState :: (PA.CommonState -> a) -> Pandoc m a- ModifyCommonState :: (PA.CommonState -> PA.CommonState) -> Pandoc m ()- LogOutput :: PA.LogMessage -> Pandoc m ()- Trace :: String -> Pandoc m ()+ LookupEnv ::String -> Pandoc m (Maybe String)+ GetCurrentTime ::Pandoc m UTCTime+ GetCurrentTimeZone ::Pandoc m TimeZone+ NewStdGen ::Pandoc m StdGen+ NewUniqueHash ::Pandoc m Int+ OpenURL ::String -> Pandoc m (BS.ByteString, Maybe PA.MimeType)+ ReadFileLazy ::FilePath -> Pandoc m LBS.ByteString+ ReadFileStrict ::FilePath -> Pandoc m BS.ByteString+ Glob ::String -> Pandoc m [FilePath]+ FileExists ::FilePath -> Pandoc m Bool+ GetDataFileName ::FilePath -> Pandoc m FilePath+ GetModificationTime ::FilePath -> Pandoc m UTCTime+ GetCommonState ::Pandoc m PA.CommonState+ PutCommonState ::PA.CommonState -> Pandoc m ()+ GetsCommonState ::(PA.CommonState -> a) -> Pandoc m a+ ModifyCommonState ::(PA.CommonState -> PA.CommonState) -> Pandoc m ()+ LogOutput ::PA.LogMessage -> Pandoc m ()+ Trace ::String -> Pandoc m () P.makeSem ''Pandoc @@ -169,55 +172,108 @@ (T.pack . PA.showLogMessage $ lm) -- | Constraint helper for using this set of effects in IO.-type PandocEffects effs =- ( P.Member Pandoc effs+type PandocEffects effs+ = ( P.Member Pandoc effs , P.Member (P.Error PA.PandocError) effs , P.Member Log.PrefixLog effs- , P.Member (Log.Logger Log.LogEntry) effs)+ , P.Member (Log.Logger Log.LogEntry) effs+ ) --- | Unexported newtype for creating instances which we then discharge with absorbPandocMonad-newtype PandocMonadSem r a = PandocMonadSem { unPandocMonadSem :: P.Sem r a } deriving (Functor, Applicative, Monad)+-- absorption gear+-- | absorb a @PandocMonad@ constraint into+-- @Members [Pandoc, Error PandocError] r => Sem r@+absorbPandocMonad+ :: P.Members '[P.Error PA.PandocError, Pandoc] r+ => (PA.PandocMonad (P.Sem r) => P.Sem r a)+ -> P.Sem r a+absorbPandocMonad = P.absorbWithSem @PA.PandocMonad @Action+ (PandocDict lookupEnv+ getCurrentTime+ getCurrentTimeZone+ newStdGen+ newUniqueHash+ openURL+ readFileLazy+ readFileStrict+ glob+ fileExists+ getDataFileName+ getModificationTime+ getCommonState+ putCommonState+ getsCommonState+ modifyCommonState+ logOutput+ trace+ P.throw+ P.catch+ )+ (P.Sub P.Dict) -instance (P.Member (P.Error PA.PandocError) r) => MonadError PA.PandocError (PandocMonadSem r) where- throwError = PandocMonadSem . P.throw- catchError (PandocMonadSem sa) h = PandocMonadSem $ P.catch sa (unPandocMonadSem . h)+-- | wrapper for the PandocMonad constrained action +newtype Action m s' a = Action+ { action :: m a+ } deriving (Functor, Applicative, Monad) -instance (P.Member (P.Error PA.PandocError) r, PandocEffects r) => PA.PandocMonad (PandocMonadSem r) where- lookupEnv = PandocMonadSem . lookupEnv- getCurrentTime = PandocMonadSem $ getCurrentTime- getCurrentTimeZone = PandocMonadSem $ getCurrentTimeZone- newStdGen = PandocMonadSem $ newStdGen- newUniqueHash = PandocMonadSem $ newUniqueHash- openURL = PandocMonadSem . openURL- readFileLazy = PandocMonadSem . readFileLazy- readFileStrict = PandocMonadSem . readFileStrict- glob = PandocMonadSem . glob- fileExists = PandocMonadSem . fileExists- getDataFileName = PandocMonadSem . getDataFileName- getModificationTime = PandocMonadSem . getModificationTime- getCommonState = PandocMonadSem $ getCommonState- putCommonState = PandocMonadSem . putCommonState- getsCommonState = PandocMonadSem . getsCommonState- modifyCommonState = PandocMonadSem . modifyCommonState- logOutput = PandocMonadSem . logOutput- trace = PandocMonadSem . trace+-- | A dictionary of the functions we need to supply+-- to make an instance of PandocMonad+-- NB: the presence of @throwError@ and @catchError_@+-- which we need because of the MonadError superclass.+data PandocDict m = PandocDict+ {+ lookupEnv_ :: String -> m (Maybe String)+ , getCurrentTime_ :: m UTCTime+ , getCurrentTimeZone_ :: m TimeZone+ , newStdGen_ ::m StdGen+ , newUniqueHash_ :: m Int+ , openURL_ :: String -> m (BS.ByteString, Maybe PA.MimeType)+ , readFileLazy_ :: FilePath -> m LBS.ByteString+ , readFileStrict_ :: FilePath -> m BS.ByteString+ , glob_ :: String -> m [FilePath]+ , fileExists_ :: FilePath -> m Bool+ , getDataFileName_ :: FilePath -> m FilePath+ , getModificationTime_ :: FilePath -> m UTCTime+ , getCommonState_ :: m PA.CommonState+ , putCommonState_ :: PA.CommonState -> m ()+ , getsCommonState_ :: forall a. (PA.CommonState -> a) -> m a+ , modifyCommonState_ :: (PA.CommonState -> PA.CommonState) -> m ()+ , logOutput_ :: PA.LogMessage -> m ()+ , trace_ :: String -> m ()+ , throwError_ :: forall a. PA.PandocError -> m a+ , catchError_ :: forall a. m a -> (PA.PandocError -> m a) -> m a+ } -{- | Given an action constrained only by a PandocMonad constraint, -absorb it into a Polysemy monad whose-effect list contains the required effects.--}-absorbPandocMonad- :: (P.Member (P.Error PA.PandocError) r, PandocEffects r)- => (forall m . PA.PandocMonad m => m a)- -> P.Sem r a-absorbPandocMonad = unPandocMonadSem+instance (Monad m+ , P.Reifies s' (PandocDict m)) => MonadError PA.PandocError (Action m s') where+ throwError e = Action $ throwError_ (P.reflect $ P.Proxy @s') e+ catchError x f =+ Action $ catchError_ (P.reflect $ P.Proxy @s') (action x) (action . f) +instance (Monad m+ , MonadError PA.PandocError (Action m s')+ , P.Reifies s' (PandocDict m)) => PA.PandocMonad (Action m s') where+ lookupEnv = Action . lookupEnv_ (P.reflect $ P.Proxy @s')+ getCurrentTime = Action $ getCurrentTime_ (P.reflect $ P.Proxy @s')+ getCurrentTimeZone = Action $ getCurrentTimeZone_ (P.reflect $ P.Proxy @s')+ newStdGen = Action $ newStdGen_ (P.reflect $ P.Proxy @s')+ newUniqueHash = Action $ newUniqueHash_ (P.reflect $ P.Proxy @s')+ openURL = Action . openURL_ (P.reflect $ P.Proxy @s')+ readFileLazy = Action . readFileLazy_ (P.reflect $ P.Proxy @s')+ readFileStrict = Action . readFileStrict_ (P.reflect $ P.Proxy @s')+ glob = Action . glob_ (P.reflect $ P.Proxy @s')+ fileExists = Action . fileExists_ (P.reflect $ P.Proxy @s')+ getDataFileName = Action . getDataFileName_ (P.reflect $ P.Proxy @s')+ getModificationTime = Action . getModificationTime_ (P.reflect $ P.Proxy @s')+ getCommonState = Action $ getCommonState_ (P.reflect $ P.Proxy @s')+ putCommonState = Action . putCommonState_ (P.reflect $ P.Proxy @s')+ getsCommonState = Action . getsCommonState_ (P.reflect $ P.Proxy @s')+ modifyCommonState = Action . modifyCommonState_ (P.reflect $ P.Proxy @s')+ logOutput = Action . logOutput_ (P.reflect $ P.Proxy @s')+ trace = Action . trace_ (P.reflect $ P.Proxy @s') -- | Constraint helper for using this set of effects in IO.-type PandocEffectsIO effs =- ( PandocEffects effs- , P.Member (P.Lift IO) effs)+type PandocEffectsIO effs = (PandocEffects effs, P.Member (P.Lift IO) effs) -- | Interpret the Pandoc effect using @IO@, @Knit.Effect.Logger@ and @PolySemy.Error PandocError@ interpretInIO@@ -371,12 +427,11 @@ -- this default is built into Pandoc. I could probably do something more useful here but maybe something depends on it?? -- or maybe the actual version on each machine has a correct local version?? -- TODO: Fix/Understand this-datadir :: FilePath-datadir- = "/home/builder/hackage-server/build-cache/tmp-install/share/x86_64-linux-ghc-8.6.3/pandoc-2.7.2"+datadir :: IO FilePath+datadir = Paths.getDataDir+-- "/home/builder/hackage-server/build-cache/tmp-install/share/x86_64-linux-ghc-8.6.3/pandoc-2.7.2" getDataFileName' :: FilePath -> IO FilePath getDataFileName' fp = do- dir <- E.catch @E.IOException (IO.getEnv "pandoc_datadir")- (\_ -> return datadir)- return (dir ++ "/" ++ fp)+ dir <- E.catch @E.IOException (IO.getEnv "pandoc_datadir") (\_ -> datadir)+ return (dir ++ "/pandoc-data/" ++ fp)
− src/Knit/Effect/RandomFu.hs
@@ -1,139 +0,0 @@-{-# LANGUAGE FlexibleContexts #-}-{-# LANGUAGE OverloadedStrings #-}-{-# LANGUAGE RankNTypes #-}-{-# LANGUAGE GADTs #-}-{-# LANGUAGE LambdaCase #-}-{-# LANGUAGE DataKinds #-}-{-# LANGUAGE PolyKinds #-}-{-# LANGUAGE TypeOperators #-}-{-# LANGUAGE ScopedTypeVariables #-}-{-# LANGUAGE TypeApplications #-}-{-# LANGUAGE TemplateHaskell #-}-{-# LANGUAGE UndecidableInstances #-}-{-# LANGUAGE AllowAmbiguousTypes #-}-{-# LANGUAGE GeneralizedNewtypeDeriving #-}-{-# LANGUAGE InstanceSigs #-}-{-# LANGUAGE UndecidableInstances #-}-{-# OPTIONS_GHC -fwarn-incomplete-patterns #-}-{-|-Module : Knit.Effect.RandomFu-Description : Polysemy random-fu effect-Copyright : (c) Adam Conner-Sax 2019-License : BSD-3-Clause-Maintainer : adam_conner_sax@yahoo.com-Stability : experimental--Polysemy "random-fu" effect.-Allows a polysemy "stack" to satisfy a MonadRandom (from "random-fu") constraint.-This can be run in a few ways:--1. Directly in 'IO'-2. Using any 'Data.Random.RandomSource' from "random-fu"-3. In 'IO', using a given 'Data.Random.Source.PureMT' source. ('IO' is used to put the source in an 'IORef')--}-module Knit.Effect.RandomFu- (- -- * Effect- RandomFu-- -- * Actions- , sampleRVar- , sampleDist-- -- * Interpretations - , runRandomFuIOSimple- , runRandomFuIOPureMT- , runRandomFuFromSource-- -- * Interop - , absorbMonadRandom-- -- * Deprecated, will be removed in next release- , Random- )-where--import qualified Polysemy as P-import Polysemy.Internal ( send )--import Data.IORef ( newIORef )-import qualified Data.Random as R-import qualified Data.Random.Source as R-import qualified Data.Random.Internal.Source as R-import qualified Data.Random.Source.PureMT as R--import Control.Monad.IO.Class ( MonadIO(..) )----import Data.Kind ( Constraint )---- | Random Effect-data RandomFu m r where- SampleRVar :: R.RVar t -> RandomFu m t- GetRandomPrim :: R.Prim t -> RandomFu m t--type Random = RandomFu-{-# DEPRECATED Random "Use RandomFu instead" #-}---- | Convert a random-fu RVar to the Random Effect-sampleRVar :: (P.Member RandomFu effs) => R.RVar t -> P.Sem effs t-sampleRVar = send . SampleRVar---- | Convert a random-fu Distribution to the Random Effect-sampleDist- :: (P.Member RandomFu effs, R.Distribution d t) => d t -> P.Sem effs t-sampleDist = sampleRVar . R.rvar--getRandomPrim :: P.Member RandomFu effs => R.Prim t -> P.Sem effs t-getRandomPrim = send . GetRandomPrim---- | Run in IO using default random-fu IO source-runRandomFuIOSimple- :: forall effs a- . MonadIO (P.Sem effs)- => P.Sem (RandomFu ': effs) a- -> P.Sem effs a-runRandomFuIOSimple = P.interpret f- where- f :: forall m x . (RandomFu m x -> P.Sem effs x)- f r = case r of- SampleRVar rv -> liftIO $ R.sample rv- GetRandomPrim pt -> liftIO $ R.getRandomPrim pt---- | Run using the given source-runRandomFuFromSource- :: forall s effs a- . R.RandomSource (P.Sem effs) s- => s- -> P.Sem (RandomFu ': effs) a- -> P.Sem effs a-runRandomFuFromSource source = P.interpret f- where- f :: forall m x . (RandomFu m x -> P.Sem effs x)- f r = case r of- SampleRVar rv -> R.runRVar (R.sample rv) source- GetRandomPrim pt -> R.runRVar (R.getRandomPrim pt) source---- | Run in 'IO', using the given 'PureMT' source stored in an 'IORef'-runRandomFuIOPureMT- :: MonadIO (P.Sem effs)- => R.PureMT- -> P.Sem (RandomFu ': effs) a- -> P.Sem effs a-runRandomFuIOPureMT source re =- liftIO (newIORef source) >>= flip runRandomFuFromSource re--newtype RandomFuSem r a = RandomFuSem { unRandomFuSem :: P.Sem r a } deriving (Functor, Applicative, Monad)--$(R.monadRandom [d|- instance P.Member RandomFu r => R.MonadRandom (RandomFuSem r) where- getRandomPrim = RandomFuSem . getRandomPrim- |])--{- | Given a function that uses the random-fu package and produces a result thusly-constrained by 'MonadRandom', absorb it into a Polysemy monad whose-effect list contains the RandomFu effect.--}-absorbMonadRandom- :: P.Member RandomFu r => (forall m . R.MonadRandom m => m a) -> P.Sem r a-absorbMonadRandom = unRandomFuSem-
src/Knit/Report.hs view
@@ -56,7 +56,7 @@ , module Knit.Report.Input.Visualization.Hvega , module Knit.Report.Input.Visualization.Diagrams - -- * Output + -- * Output , module Knit.Report.Output , module Knit.Report.Output.Html @@ -79,7 +79,7 @@ , PandocReadFormat(..) , PandocWriteFormat(..) , Pandocs- , PandocInfo (..)+ , PandocInfo(..) , newPandoc ) import Knit.Effect.Docs ( DocWithInfo(..) )@@ -106,9 +106,11 @@ import Knit.Report.Input.Visualization.Diagrams -- hiding ( trace ) -- trace conflicts with Pandoc.trace -import Knit.Report.Output ( PandocWriterConfig(..) )+import Knit.Report.Output import Knit.Report.Output.Html ( pandocWriterToBlazeDocument , mindocOptionsF+ , writeAllPandocResultsWithInfoAsHtml+ , writePandocResultWithInfoAsHtml ) import Text.Pandoc ( PandocError )@@ -124,7 +126,6 @@ import qualified Text.Pandoc as PA import qualified Text.Blaze.Html.Renderer.Text as BH - import qualified Knit.Report.Output.Html as KO import qualified Knit.Effect.Docs as KD import qualified Knit.Effect.Pandoc as KP@@ -144,10 +145,18 @@ -> [KLog.LogSeverity] -- ^ what to output in log -> PandocWriterConfig -- ^ configuration for the Pandoc Html Writer -> P.Sem (KnitEffectDocsStack m) ()- -> m (Either PA.PandocError [KP.DocWithInfo KP.PandocInfo TL.Text])+ -> m+ ( Either+ PA.PandocError+ [KP.DocWithInfo KP.PandocInfo TL.Text]+ ) knitHtmls loggingPrefixM ls (PandocWriterConfig mFP tv oF) = consumeKnitEffectStack loggingPrefixM ls . KD.toDocListWithM- (\(KP.PandocInfo _ tv') a -> fmap BH.renderHtml . KO.toBlazeDocument (PandocWriterConfig mFP (tv' <> tv) oF) $ a)+ (\(KP.PandocInfo _ tv') a ->+ fmap BH.renderHtml+ . KO.toBlazeDocument (PandocWriterConfig mFP (tv' <> tv) oF)+ $ a+ ) -- | Create HTML Text from pandoc fragments -- In use, you may need a type-application to specify m.@@ -187,17 +196,14 @@ -- | Constraint alias for the effects we need to knit multiple documents. type KnitMany r = (KnitEffects r, P.Member KP.Pandocs r) +++ -- From here down is unexported. -- | The exact stack we are interpreting when we knit-type KnitEffectStack m =- '[ KUI.UnusedId- , KPM.Pandoc- , KLog.Logger KLog.LogEntry- , KLog.PrefixLog- , PE.Error PA.PandocError- , P.Lift IO- , P.Lift m- ]+type KnitEffectStack m+ = '[KUI.UnusedId, KPM.Pandoc, KLog.Logger KLog.LogEntry, KLog.PrefixLog, PE.Error+ PA.PandocError, P.Lift IO, P.Lift m] -- | Add a Multi-doc writer to the front of the effect list type KnitEffectDocsStack m = (KP.Pandocs ': KnitEffectStack m)
src/Knit/Report/Input/MarkDown/PandocMarkDown.hs view
@@ -46,6 +46,7 @@ , PA.Ext_tex_math_dollars , PA.Ext_header_attributes , PA.Ext_implicit_header_references+ , PA.Ext_implicit_figures ] }
src/Knit/Report/Output.hs view
@@ -1,20 +1,135 @@+{-# LANGUAGE OverloadedStrings #-} module Knit.Report.Output ( -- * Pandoc Writer Configuration PandocWriterConfig(..)+ , TemplateVariables+ , WriterOptionsF+ , mkPandocWriterConfig++ -- * Pandoc Template Types+ , TemplatePath(..)+ , CssPath(..)+ , addCss++ -- * file writing helpers+ , writeAllPandocResultsWithInfo+ , writePandocResultWithInfo+ , writeAndMakePathLT+ , writeAndMakePath ) where +import qualified Paths_knit_haskell as Paths import qualified Data.Map as M import qualified Text.Pandoc as PA+import qualified Data.Text as T+import qualified Data.Text.IO as T+import qualified Data.Text.Lazy as TL+import qualified System.Directory as SD +import qualified Knit.Effect.Docs as KD+import qualified Knit.Effect.Pandoc as KP++type TemplateVariables = M.Map String String+type WriterOptionsF = PA.WriterOptions -> PA.WriterOptions+ data PandocWriterConfig = PandocWriterConfig { templateFP :: Maybe FilePath -- ^ optional path to pandoc <https://pandoc.org/MANUAL.html#templates template>- , templateVars :: M.Map String String+ , templateVars :: TemplateVariables -- ^ variable substitutions for the <https://pandoc.org/MANUAL.html#templates template>- , optionsF :: (PA.WriterOptions -> PA.WriterOptions)+ , optionsF :: WriterOptionsF -- ^ change default <https://pandoc.org/MANUAL.html#general-writer-options options> }++-- | Make a 'PandocWriterConfig' from a PandocTemplate specification+mkPandocWriterConfig+ :: TemplatePath+ -> TemplateVariables+ -> WriterOptionsF+ -> IO PandocWriterConfig+mkPandocWriterConfig tp tv wf = do+ templateFPM <- pandocTemplatePath tp+ return $ PandocWriterConfig templateFPM tv wf++-- | Type to specify path to template,+-- which may be in a directory installed with knit-haskell.+data TemplatePath = DefaultTemplate+ | FromIncludedTemplateDir T.Text+ | FullySpecifiedTemplatePath T.Text++-- | get correct path to give Pandoc, depending on how things are installed+pandocTemplatePath :: TemplatePath -> IO (Maybe String)+pandocTemplatePath DefaultTemplate = return Nothing+pandocTemplatePath (FullySpecifiedTemplatePath x) = return $ Just (T.unpack x)+pandocTemplatePath (FromIncludedTemplateDir x) =+ fmap (Just . (++ "/knit-haskell-templates/" ++ (T.unpack x))) Paths.getDataDir++-- | Type to specify path to Css,+-- which may be in a directory installed with knit-haskell or not.+data CssPath = FromIncludedCssDir T.Text+ | FullySpecifiedCssPath T.Text++-- | Add a CssPath to an existing TemplateVariables+-- which may already have Css paths specified+addCss :: CssPath -> TemplateVariables -> IO TemplateVariables+addCss (FullySpecifiedCssPath x) pt = return $ appendCss x pt+addCss (FromIncludedCssDir x) pt = do+ dir <- Paths.getDataDir+ let fp = (T.pack dir) <> "/knit-haskell-css/" <> x+ return $ appendCss fp pt+++-- | Append a filepath (given as Text) to the existing Css paths in TemplateVariables+appendCss :: T.Text -> TemplateVariables -> TemplateVariables+appendCss x tv =+ let curValM = M.lookup "css" tv+ newVal = maybe (T.unpack x) (\y -> y ++ "," ++ T.unpack x) curValM+ in M.insert "css" newVal tv++-- utilities for file output++-- | Write each lazy text from a list of 'KD.DocWithInfo'+-- to disk. File names come from the 'KP.PandocInfo'+-- Directory and file extension are function arguments.+writeAllPandocResultsWithInfo+ :: T.Text -> T.Text -> [KP.DocWithInfo KP.PandocInfo TL.Text] -> IO ()+writeAllPandocResultsWithInfo dir extension =+ fmap (const ()) . traverse (writePandocResultWithInfo dir extension) -- fmap (const ()) :: IO [()] -> IO ()++-- | Write the Lazy Text in a 'KD.DocWithInfo' to disk+-- Name comes from the 'KP.PandocInfo'+-- Directory and file extection are arguments to the function+-- Create the parent directory or directories, if necessary.+writePandocResultWithInfo+ :: T.Text -- ^ directory+ -> T.Text -- ^ extension+ -> KD.DocWithInfo KP.PandocInfo TL.Text+ -> IO ()+writePandocResultWithInfo dir extension (KD.DocWithInfo (KP.PandocInfo n _) x)+ = do+ let fPath = dir <> "/" <> n <> "." <> extension+ writeAndMakePathLT fPath x++-- | Write Lazy Text (Pandoc's Html result) to disk.+-- Create the parent directory or directories, if necessary.+writeAndMakePathLT :: T.Text -> TL.Text -> IO ()+writeAndMakePathLT fPath = writeAndMakePath fPath TL.toStrict++-- | Write (to disk) something which can be converted to text.+-- Create the parent directory or directories, if necessary.+writeAndMakePath :: T.Text -> (a -> T.Text) -> a -> IO ()+writeAndMakePath fPath toStrictText x = do+ let (dirPath, fName) = T.breakOnEnd "/" fPath+ putStrLn+ $ T.unpack+ $ "If necessary, creating "+ <> dirPath+ <> " (and parents), and writing "+ <> fName+ SD.createDirectoryIfMissing True (T.unpack dirPath)+ T.writeFile (T.unpack fPath) $ toStrictText x+
src/Knit/Report/Output/Html.hs view
@@ -24,17 +24,22 @@ , toBlazeDocument , pandocWriterToBlazeDocument - -- * Options helper + -- * Options helper , mindocOptionsF - -- * Other helpers+ -- * Other helpers , markDownTextToBlazeFragment++ -- * File writing helpers+ , writeAllPandocResultsWithInfoAsHtml+ , writePandocResultWithInfoAsHtml ) where import qualified Data.ByteString.Char8 as BS import qualified Data.Text as T+import qualified Data.Text.Lazy as TL import qualified Data.Map as M import qualified Text.Blaze.Html as BH import qualified Text.Pandoc as PA@@ -45,7 +50,7 @@ import Knit.Report.Input.MarkDown.PandocMarkDown ( markDownReaderOptions )-import Knit.Report.Output ( PandocWriterConfig(..) )+import Knit.Report.Output as KO -- | Base Html writer options, with support for MathJax htmlWriterOptions :: PA.WriterOptions@@ -89,7 +94,7 @@ -- Incudes support for template and template variables and changes to the default writer options toBlazeDocument :: PM.PandocEffects effs- => PandocWriterConfig+ => KO.PandocWriterConfig -> PE.PandocWithRequirements -- ^ Document and union of input requirements -> P.Sem effs BH.Html toBlazeDocument writeConfig pdocWR = PM.absorbPandocMonad $ do@@ -101,7 +106,7 @@ -- Incudes support for template and template variables and changes to the default writer options. pandocWriterToBlazeDocument :: PM.PandocEffects effs- => PandocWriterConfig -- ^ Configuration info for the Pandoc writer + => KO.PandocWriterConfig -- ^ Configuration info for the Pandoc writer -> P.Sem (PE.ToPandoc ': effs) () -- ^ Effects stack to run to get Pandoc -> P.Sem effs BH.Html -- ^ Blaze Html (in remaining effects) pandocWriterToBlazeDocument writeConfig pw =@@ -110,3 +115,24 @@ -- | options for the mindoc template mindocOptionsF :: PA.WriterOptions -> PA.WriterOptions mindocOptionsF op = op { PA.writerSectionDivs = True }+++-- file output+-- | Write each lazy text from a list of 'KD.DocWithInfo'+-- to disk. File names come from the 'KP.PandocInfo'+-- Directory is a function arguments.+-- File extension is "html"+writeAllPandocResultsWithInfoAsHtml+ :: T.Text -> [PE.DocWithInfo PE.PandocInfo TL.Text] -> IO ()+writeAllPandocResultsWithInfoAsHtml dir =+ KO.writeAllPandocResultsWithInfo dir "html"++-- | Write the Lazy Text in a 'KD.DocWithInfo' to disk,+-- Name comes from the 'KP.PandocInfo'+-- Directory is an argument to the function+-- File extension is "html"+-- Create the parent directory or directories, if necessary.+writePandocResultWithInfoAsHtml+ :: T.Text -> PE.DocWithInfo PE.PandocInfo TL.Text -> IO ()+writePandocResultWithInfoAsHtml dir dwi =+ KO.writePandocResultWithInfo dir "html" dwi