tldr-0.2.3/app/0000755000000000000000000000000013207051421011422 5ustar0000000000000000tldr-0.2.3/src/0000755000000000000000000000000013207053070011433 5ustar0000000000000000tldr-0.2.3/test/0000755000000000000000000000000013207051421011621 5ustar0000000000000000tldr-0.2.3/src/Tldr.hs0000644000000000000000000000455713207053070012707 0ustar0000000000000000{-# 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 , consoleIntensity :: ConsoleIntensity } defConsoleSetting :: ConsoleSetting defConsoleSetting = ConsoleSetting { italic = False , underline = NoUnderline , blink = NoBlink , fgIntensity = Dull , fgColor = White , bgIntensity = Dull , 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) ] 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 setSGR [Reset] 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 tldr-0.2.3/app/Main.hs0000644000000000000000000000605613207051421012651 0ustar0000000000000000{-#LANGUAGE CPP#-} module Main where import Tldr import Options.Applicative hiding ((<>)) import Data.Semigroup ((<>)) import Control.Monad import System.Directory import System.FilePath import Data.Conduit.Shell hiding (info) import System.Environment (getArgs, withArgs) import Paths_tldr (version) import Data.Version (showVersion) data TldrOpts = TldrOpts { pageName :: String } 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"] updateOption :: Parser (a -> a) updateOption = infoOption "update" (long "update" <> help "Update tldr pages") tldrParserInfo :: ParserInfo TldrOpts tldrParserInfo = info (helper <*> versionOption <*> updateOption <*> programOptions) (fullDesc <> progDesc "tldr Client program" <> header "tldr - Simplified and community-driven man pages") where versionOption :: Parser (a -> a) versionOption = infoOption (showVersion version) (long "version" <> short 'v' <> help "Show version") programOptions :: Parser TldrOpts programOptions = (TldrOpts <$> strArgument (metavar "COMMAND" <> help "name of the command")) 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 #if MIN_VERSION_base(4,7,0) f1' <- pageExists f1 f2' <- pageExists f2 f3' <- pageExists f3 return $ f1' <|> f2' <|> f3' #else pageExists f1 <|> pageExists f2 <|> pageExists f3 #endif main :: IO () main = do initializeTldrPages args <- getArgs case execParserPure (prefs noBacktrack) tldrParserInfo args of Failure _ | null args -> withArgs ["--help"] (execParser tldrParserInfo) >> return () | args == ["--update"] -> updateTldrPages parseResult -> do opts <- handleParseResult parseResult let page = pageName opts fname <- getPagePath page maybe (putStrLn ("No tldr entry for " <> page)) renderPage fname tldr-0.2.3/test/Spec.hs0000644000000000000000000000007713207051421013053 0ustar0000000000000000main :: IO () main = putStrLn "Test suite not yet implemented" tldr-0.2.3/LICENSE0000644000000000000000000000277013063331063011660 0ustar0000000000000000Copyright 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. tldr-0.2.3/Setup.hs0000644000000000000000000000005613063271030012277 0ustar0000000000000000import Distribution.Simple main = defaultMain tldr-0.2.3/tldr.cabal0000644000000000000000000000303413207053211012572 0ustar0000000000000000name: tldr version: 0.2.3 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, CHANGELOG.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 >= 4.6.0 , semigroups 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 tldr-0.2.3/README.md0000644000000000000000000000136413136400147012131 0ustar0000000000000000# tldr [![Build Status](https://travis-ci.org/psibi/tldr-hs.svg?branch=master)](https://travis-ci.org/psibi/tldr-hs) Haskell client for tldr ## Installation 1. [Install stack](https://docs.haskellstack.org/en/stable/README/#how-to-install) 2. `stack install tldr` ## Usage ``` shellsession $ tldr --help tldr - Simplified and community-driven man pages Usage: tldr [-v|--version] [--update] COMMAND tldr Client program Available options: -h,--help Show this help text -v,--version Show version --update Update tldr pages COMMAND name of the command ``` ## Snapshot ![tldr](https://cloud.githubusercontent.com/assets/737477/24076451/2a5a604c-0c57-11e7-9bf7-13d76e8e7f12.png) tldr-0.2.3/CHANGELOG.md0000644000000000000000000000052513207053156012464 0ustar0000000000000000# 0.2.3 * Fix coloring bug under bash during some circumstances [#6](https://github.com/psibi/tldr-hs/pull/6/files) # 0.2.2 * Fix `--version` option # 0.2.1 * Fix background color [bug](https://github.com/psibi/tldr-hs/pull/3) # 0.2.0 * Compliance with the tldr spec * Fix `--update` flag bug * Backported till GHC 7.8.3 and lts-2.22