hbro-0.7.0.0: Hbro/Extra/Bookmarks.hs
module Hbro.Extra.Bookmarks (
select,
selectTag,
deleteWithTag,
add,
) where
-- {{{ Imports
--import Hbro.Core
--import Hbro.Gui
--import Hbro.Types
import Hbro.Util
--import qualified Data.ByteString.Char8 as B
import Data.List
import qualified Data.Text as T
import qualified Data.Text.IO as T
-- }}}
-- | The elementary bookmark action
add :: FilePath -> String -> [String] -> IO ()
add bookmarksFile uri tags = appendFile bookmarksFile $ uri ++ " " ++ (unwords tags) ++ "\n"
-- |
select :: FilePath -> [String] -> IO (Maybe String)
select bookmarksFile dmenuOptions = do
-- Load bookmarks file
file <- T.readFile bookmarksFile
let file' = T.unlines . sort . nub $ map reformat (T.lines file)
-- Let user select a URI
selection <- dmenu dmenuOptions file'
case reverse . words $ selection of
[] -> return Nothing
uri:_ -> return $ Just uri
reformat :: T.Text -> T.Text
reformat line = T.unwords $ tags' ++ [uri]
where
uri:tags = T.words line
tags' = sort $ map (\tag -> T.snoc (T.cons '[' tag) ']') tags
-- |
selectTag :: FilePath -> [String] -> IO (Maybe [String])
selectTag bookmarksFile dmenuOptions = do
-- Read bookmarks file
file <- T.readFile bookmarksFile
-- Filter tags list
let list = T.unlines . sort . nub . T.words . T.unwords $ map getTags (T.lines file)
-- Let user select a tag
selection <- dmenu dmenuOptions list
case selection of
"" -> return Nothing
tag -> return $ Just uris
--mapM (\uri -> spawn "hbro" ["-u", (T.unpack uri)]) uris >> return ()
where
file' = filter (tagFilter $ T.pack tag) (T.lines file)
uris = map (T.unpack . getUri) file'
--
tagFilter :: T.Text -> T.Text -> Bool
tagFilter tag line = let _uri:tags = T.words line in case (intersect [tag] tags) of
[_tag] -> True
_ -> False
-- |
deleteWithTag :: FilePath -> [String] -> IO ()
deleteWithTag bookmarksFile dmenuOptions = do
file <- T.readFile bookmarksFile
let tagsList = T.unlines . sort . nub . T.words . T.unwords $ map getTags (T.lines file)
selection <- dmenu dmenuOptions tagsList
case selection of
"" -> return ()
_ -> do
T.writeFile (bookmarksFile ++ ".old") file
T.writeFile bookmarksFile file'
return ()
where
file' = T.unlines $ filter (not . (tagFilter $ T.pack selection)) (T.lines file)
-- |
getTags :: T.Text -> T.Text
getTags line = let _:tags = T.words line in T.unwords tags
-- |
getUri :: T.Text -> T.Text
getUri line = let uri:_ = T.words line in uri