tldr (empty) → 0.1.0.0
raw patch · 7 files changed
+286/−0 lines, 7 filesdep +ansi-terminaldep +basedep +bytestringsetup-changed
Dependencies added: ansi-terminal, base, bytestring, cmark, directory, filepath, optparse-applicative, shell-conduit, text, tldr
Files
- LICENSE +30/−0
- README.md +11/−0
- Setup.hs +2/−0
- app/Main.hs +90/−0
- src/Tldr.hs +102/−0
- test/Spec.hs +2/−0
- tldr.cabal +49/−0
+ LICENSE view
@@ -0,0 +1,30 @@+Copyright Sibi Prabakaran (c) 2017++All rights reserved.++Redistribution and use in source and binary forms, with or without+modification, are permitted provided that the following conditions are met:++ * Redistributions of source code must retain the above copyright+ notice, this list of conditions and the following disclaimer.++ * Redistributions in binary form must reproduce the above+ copyright notice, this list of conditions and the following+ disclaimer in the documentation and/or other materials provided+ with the distribution.++ * Neither the name of Author name here nor the names of other+ contributors may be used to endorse or promote products derived+ from this software without specific prior written permission.++THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ README.md view
@@ -0,0 +1,11 @@+# tldr++Haskell client for tldr++++## Installation++1. [Install stack](https://docs.haskellstack.org/en/stable/README/#how-to-install)+2. Clone this repo (TODO: Publish this to Stackage)+3. `stack install`
+ Setup.hs view
@@ -0,0 +1,2 @@+import Distribution.Simple+main = defaultMain
+ app/Main.hs view
@@ -0,0 +1,90 @@+module Main where++import Tldr+import Options.Applicative+import Data.Semigroup ((<>))+import Control.Monad+import System.Directory+import System.FilePath+import Data.Conduit.Shell hiding (info)++data TldrOpts = TldrOpts+ { pageName :: String+ , updateFlag :: Bool+ } deriving (Show)++tldrDirName :: String+tldrDirName = ".tldr"++repoHttpsUrl :: String+repoHttpsUrl = "https://github.com/tldr-pages/tldr.git"++checkDirs :: [String]+checkDirs = ["common", "linux", "osx"]++tldrInitialized :: IO Bool+tldrInitialized = do+ homeDir <- getHomeDirectory+ let dir1 = homeDir </> tldrDirName+ dir2 = homeDir </> tldrDirName </> "tldr"+ pages = homeDir </> tldrDirName </> "tldr" </> "pages"+ exists <- mapM doesDirectoryExist [dir1, dir2, pages]+ return $ all (== True) exists++initializeTldrPages :: IO ()+initializeTldrPages = do+ initialized <- tldrInitialized+ if initialized+ then return ()+ else do+ homeDir <- getHomeDirectory+ run $+ do mkdir (homeDir </> tldrDirName)+ cd (homeDir </> tldrDirName)+ git "clone" repoHttpsUrl++updateTldrPages :: IO ()+updateTldrPages = do+ homeDir <- getHomeDirectory+ let repoDir = homeDir </> tldrDirName <> "tldr"+ run $+ do cd repoDir+ git "pull" ["origin", "master"]++tldrParserInfo :: ParserInfo TldrOpts+tldrParserInfo =+ info+ (helper <*> versionOption <*> programOptions)+ (fullDesc <> progDesc "tldr Client program" <>+ header "tldr - Simplified and community-driven man pages")+ where+ versionOption = infoOption "0.1" (long "version" <> help "Show version")+ programOptions :: Parser TldrOpts+ programOptions =+ TldrOpts <$>+ (strArgument (metavar "COMMAND" <> help "name of the command")) <*>+ (switch (long "update" <> help "Update tldr pages"))++pageExists :: FilePath -> IO (Maybe FilePath)+pageExists fname = do+ exists <- doesFileExist fname+ if exists+ then return $ Just fname+ else return Nothing++getPagePath :: String -> IO (Maybe FilePath)+getPagePath page = do+ homeDir <- getHomeDirectory+ let pageDir = homeDir </> tldrDirName </> "tldr" </> "pages"+ x@(f1:f2:f3:[]) = map (\x -> pageDir </> x </> page <.> "md") checkDirs+ pageExists f1 <|> pageExists f2 <|> pageExists f3++main :: IO ()+main = do+ initializeTldrPages+ opts <- execParser tldrParserInfo+ when (updateFlag opts) updateTldrPages+ fname <- getPagePath (pageName opts)+ case fname of+ Nothing -> putStrLn ("No tldr entry for " <> (pageName opts))+ Just fpath -> renderPage fpath
+ src/Tldr.hs view
@@ -0,0 +1,102 @@+{-# LANGUAGE OverloadedStrings #-}++module Tldr+ ( parsePage+ , renderPage+ , ConsoleSetting(..)+ , defConsoleSetting+ , headingSetting+ , toSGR+ , renderNode+ , changeConsoleSetting+ ) where++import Data.Text+import qualified Data.Text.IO as TIO+import CMark+import System.Console.ANSI+import Data.Monoid ((<>))++data ConsoleSetting = ConsoleSetting+ { italic :: Bool+ , underline :: Underlining+ , blink :: BlinkSpeed+ , fgIntensity :: ColorIntensity+ , fgColor :: Color+ , bgIntensity :: ColorIntensity+ , bgColor :: Color+ , consoleIntensity :: ConsoleIntensity+ }++defConsoleSetting :: ConsoleSetting+defConsoleSetting =+ ConsoleSetting+ { italic = False+ , underline = NoUnderline+ , blink = NoBlink+ , fgIntensity = Dull+ , fgColor = White+ , bgIntensity = Dull+ , bgColor = Black+ , consoleIntensity = NormalIntensity+ }++headingSetting :: ConsoleSetting+headingSetting =+ defConsoleSetting+ { consoleIntensity = BoldIntensity+ }++toSGR :: ConsoleSetting -> [SGR]+toSGR cons =+ [ SetItalicized (italic cons)+ , SetConsoleIntensity (consoleIntensity cons)+ , SetUnderlining (underline cons)+ , SetBlinkSpeed (blink cons)+ , SetColor Foreground (fgIntensity cons) (fgColor cons)+ , SetColor Background (bgIntensity cons) (bgColor cons)+ ]++renderNode :: NodeType -> IO ()+renderNode (TEXT txt) = TIO.putStrLn txt+renderNode (HTML_BLOCK txt) = TIO.putStrLn txt+renderNode (CODE_BLOCK _ txt) = TIO.putStrLn txt+renderNode (HTML_INLINE txt) = TIO.putStrLn txt+renderNode (CODE txt) = TIO.putStrLn (" " <> txt)+renderNode LINEBREAK = TIO.putStrLn ""+renderNode (LIST _) = TIO.putStrLn "" >> TIO.putStr " - "+renderNode _ = return ()++changeConsoleSetting :: NodeType -> IO ()+changeConsoleSetting (HEADING _) = setSGR $ toSGR headingSetting+changeConsoleSetting BLOCK_QUOTE = setSGR $ toSGR headingSetting+changeConsoleSetting ITEM =+ setSGR $+ toSGR $+ defConsoleSetting+ { fgColor = Green+ }+changeConsoleSetting (CODE _) =+ setSGR $+ toSGR $+ defConsoleSetting+ { fgColor = Yellow+ }+changeConsoleSetting _ = return ()++handleNode :: Node -> IO ()+handleNode (Node _ ntype xs) = do+ changeConsoleSetting ntype+ renderNode ntype+ mapM_ (\(Node _ ntype' ns) -> renderNode ntype' >> mapM_ handleNode ns) xs++parsePage :: FilePath -> IO Node+parsePage fname = do+ page <- TIO.readFile fname+ let node = commonmarkToNode [] page+ return node++renderPage :: FilePath -> IO ()+renderPage fname = do+ node <- parsePage fname+ handleNode node
+ test/Spec.hs view
@@ -0,0 +1,2 @@+main :: IO ()+main = putStrLn "Test suite not yet implemented"
+ tldr.cabal view
@@ -0,0 +1,49 @@+name: tldr+version: 0.1.0.0+synopsis: Haskell tldr client+description: Haskell tldr client with support for updating and viewing tldr pages.+homepage: https://github.com/psibi/tldr-hs#readme+license: BSD3+license-file: LICENSE+author: Sibi+maintainer: sibi@psibi.in+copyright: 2017 Sibi+category: Web+build-type: Simple+extra-source-files: README.md+cabal-version: >=1.10++library+ hs-source-dirs: src+ exposed-modules: Tldr+ build-depends: base >= 4.7 && < 5,+ cmark,+ text,+ bytestring,+ ansi-terminal+ default-language: Haskell2010++executable tldr+ hs-source-dirs: app+ main-is: Main.hs+ ghc-options: -threaded -rtsopts -with-rtsopts=-N+ build-depends: base+ , tldr+ , optparse-applicative+ , directory+ , filepath+ , shell-conduit+ default-language: Haskell2010++test-suite tldr-test+ type: exitcode-stdio-1.0+ hs-source-dirs: test+ main-is: Spec.hs+ build-depends: base+ , tldr+ ghc-options: -threaded -rtsopts -with-rtsopts=-N+ default-language: Haskell2010++source-repository head+ type: git+ location: https://github.com/psibi/tldr-hs