From b4dd9b5c897e412e9258c9c7db0c15f57003c73d Mon Sep 17 00:00:00 2001 From: Nils Steinger Date: Mon, 22 Apr 2019 16:31:04 +0200 Subject: [PATCH 01/14] Increase character limit for filename suggestions (fixes #27) Paper names may be longer than the previous limit of 64 characters, so increased limit to longest possible filename on most modern filesystems. --- src/Lib.hs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Lib.hs b/src/Lib.hs index ed8830b..31d1c94 100644 --- a/src/Lib.hs +++ b/src/Lib.hs @@ -116,7 +116,7 @@ getTopLines file = do lengthCheck :: Text -> Bool -lengthCheck t = T.length t >= 3 && T.length t <= 64 +lengthCheck t = T.length t >= 3 && T.length t <= 251 -- maximum filename length on most Unix FSs (255) - extension (.pdf, 4) = 251 boolToMaybe :: (a -> Bool) -> a -> Maybe a From 5ccb1bec4ce1fe2d55cac9024dde3241fb6aaeca Mon Sep 17 00:00:00 2001 From: 2mol <1773075+2mol@users.noreply.github.com> Date: Tue, 23 Apr 2019 16:07:14 +0200 Subject: [PATCH 02/14] formatting --- src/Lib.hs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Lib.hs b/src/Lib.hs index 31d1c94..1c49ba7 100644 --- a/src/Lib.hs +++ b/src/Lib.hs @@ -116,7 +116,9 @@ getTopLines file = do lengthCheck :: Text -> Bool -lengthCheck t = T.length t >= 3 && T.length t <= 251 -- maximum filename length on most Unix FSs (255) - extension (.pdf, 4) = 251 +lengthCheck t = + -- maximum filename length on most Unix FSs (255) - extension (.pdf, 4) = 251 + T.length t >= 3 && T.length t <= 251 boolToMaybe :: (a -> Bool) -> a -> Maybe a From e18525bd93fc2ee5df6ba209bde2115d050b2abd Mon Sep 17 00:00:00 2001 From: Nils Steinger Date: Sat, 27 Apr 2019 15:24:22 +0200 Subject: [PATCH 03/14] Make word separator configurable (resolves #28) --- src/Config.hs | 10 ++++++++++ src/Lib.hs | 6 +++--- src/UI.hs | 2 +- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/Config.hs b/src/Config.hs index 931f53d..aabf0d8 100644 --- a/src/Config.hs +++ b/src/Config.hs @@ -8,6 +8,7 @@ module Config , libraryDir , importAction , ImportAction(..) + , wordSeparator , tryGetConfig , defaultConfig , createConfig @@ -18,6 +19,7 @@ import qualified Control.Exception as E import Data.Function ((&)) import Data.Ini.Config.Bidir (Ini, IniSpec, (.=)) import qualified Data.Ini.Config.Bidir as C +import Data.Text (Text) import qualified Data.Text.IO as TIO import Lens.Micro ((^.)) import Lens.Micro.TH (makeLenses) @@ -31,6 +33,7 @@ data Config = Config , _inboxDirs :: [Path Abs Dir] , _libraryDir :: Path Abs Dir , _importAction :: ImportAction + , _wordSeparator:: Text } @@ -42,6 +45,7 @@ data ConfigData = ConfigData { _inboxDirsD :: [FilePath] , _libraryDirD :: FilePath , _importMove :: Bool + , _wordSeparatorD :: Text } deriving Show @@ -55,6 +59,7 @@ defaultConfigData = { _inboxDirsD= ["Downloads"] , _libraryDirD = "papers" , _importMove = True + , _wordSeparatorD = "_" } @@ -93,12 +98,14 @@ readConfigData configData = do libDir <- Path.resolveDir home (configData ^. libraryDirD) let action = if configData ^. importMove then Move else Copy + let wordSep = configData ^. wordSeparatorD pure Config { _homeDir = home , _inboxDirs = inbDir , _libraryDir = libDir , _importAction = action + , _wordSeparator = wordSep } @@ -121,6 +128,9 @@ configSpec = , "If set to false it will leave the original file unchanged." ] + wordSeparatorD .= C.field "wordseparator" C.text + & C.comment ["The character (or characters) to insert between words."] + configIni :: Ini ConfigData configIni = C.ini defaultConfigData configSpec diff --git a/src/Lib.hs b/src/Lib.hs index ed8830b..c5e37e4 100644 --- a/src/Lib.hs +++ b/src/Lib.hs @@ -151,11 +151,11 @@ validChars x = -- shelving files into library folder -finalFileName :: Text -> Text -finalFileName text = +finalFileName :: Config -> Text -> Text +finalFileName conf text = text & T.unwords . T.words - & T.replace " " "_" + & T.replace " " (conf ^. Config.wordSeparator) fileFile :: Config -> Text -> Path Abs File -> IO () diff --git a/src/UI.hs b/src/UI.hs index 08ed6f2..580ea11 100644 --- a/src/UI.hs +++ b/src/UI.hs @@ -395,7 +395,7 @@ handleImportScreenEvent fi s ev = fi ^. nameEdit & E.getEditContents & T.unlines - & Lib.finalFileName + & Lib.finalFileName conf _ <- liftIO $ Lib.fileFile conf newFileName (fi ^. currentFile) From 405242c916fad3050b73ef19bcb2240ff04a2b1f Mon Sep 17 00:00:00 2001 From: Nils Steinger Date: Sat, 27 Apr 2019 16:00:42 +0200 Subject: [PATCH 04/14] Start external viewer non-blockingly This prevents paperboy's UI from becoming unresponsive while the external viewer is running. This also makes it possible to have multiple viewer instances running at the same time. --- src/Lib.hs | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/src/Lib.hs b/src/Lib.hs index ed8830b..e69fd1b 100644 --- a/src/Lib.hs +++ b/src/Lib.hs @@ -29,6 +29,7 @@ import qualified Path import qualified Path.IO as Path import qualified System.FilePath as F import qualified System.Process as P +import System.Directory (findExecutable) import qualified Text.PDF.Info as PDFI data FileInfo = FileInfo @@ -173,15 +174,20 @@ fileFile conf newFileName file = do openFile :: Path Abs File -> IO () openFile file = do - linuxOpen <- tryOpenWith file "xdg-open" - - if Either.isLeft linuxOpen + xdgOpenPresent <- findExecutable "xdg-open" + if Maybe.isJust xdgOpenPresent then do - _ <- tryOpenWith file "open" + tryOpenWith file "xdg-open" pure () - else pure () + else do + openPresent <- findExecutable "open" + if Maybe.isJust openPresent + then do + tryOpenWith file "open" + pure () + else pure () -tryOpenWith :: Path Abs File -> FilePath -> IO (Either SomeException String) +tryOpenWith :: Path Abs File -> FilePath -> IO (P.ProcessHandle) tryOpenWith file cmd = - E.try (P.readProcess cmd [Path.fromAbsFile file] "") + P.runCommand (cmd ++ " " ++ Path.fromAbsFile file) From f6710b41d0f7bb62fd0b94f682c551c9d9a3824a Mon Sep 17 00:00:00 2001 From: Nils Steinger Date: Sat, 27 Apr 2019 16:18:03 +0200 Subject: [PATCH 05/14] Blackhole any terminal output from external viewer --- src/Lib.hs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/Lib.hs b/src/Lib.hs index e69fd1b..7518bd6 100644 --- a/src/Lib.hs +++ b/src/Lib.hs @@ -29,6 +29,7 @@ import qualified Path import qualified Path.IO as Path import qualified System.FilePath as F import qualified System.Process as P +import qualified GHC.IO.Handle.Types as IOHT import System.Directory (findExecutable) import qualified Text.PDF.Info as PDFI @@ -188,6 +189,7 @@ openFile file = do else pure () -tryOpenWith :: Path Abs File -> FilePath -> IO (P.ProcessHandle) -tryOpenWith file cmd = - P.runCommand (cmd ++ " " ++ Path.fromAbsFile file) +tryOpenWith :: Path Abs File -> FilePath -> IO () +tryOpenWith file cmd = do + _ <- P.createProcess (P.proc cmd [Path.fromAbsFile file]){ P.std_out = P.NoStream, P.std_err = P.NoStream } + return () From efa34ed23a2acb70627ed28ad32292256798fa7f Mon Sep 17 00:00:00 2001 From: Nils Steinger Date: Sat, 27 Apr 2019 16:37:38 +0200 Subject: [PATCH 06/14] Specify possible viewers as array Easier extensibility than with specialised code for each one. --- src/Lib.hs | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/Lib.hs b/src/Lib.hs index 7518bd6..d152f11 100644 --- a/src/Lib.hs +++ b/src/Lib.hs @@ -175,18 +175,18 @@ fileFile conf newFileName file = do openFile :: Path Abs File -> IO () openFile file = do - xdgOpenPresent <- findExecutable "xdg-open" - if Maybe.isJust xdgOpenPresent - then do - tryOpenWith file "xdg-open" - pure () + tryViewers ["xdg-open", "open"] file + + +tryViewers :: [[Char]] -> Path Abs File -> IO () +tryViewers [] file = do return () +tryViewers (e:es) file = do + v <- findExecutable e + if Maybe.isNothing v + then tryViewers es file else do - openPresent <- findExecutable "open" - if Maybe.isJust openPresent - then do - tryOpenWith file "open" - pure () - else pure () + tryOpenWith file e + return () tryOpenWith :: Path Abs File -> FilePath -> IO () From 874468901b0b48fcccf63ce8714808053fc438e1 Mon Sep 17 00:00:00 2001 From: 2mol <2mol@users.noreply.github.com> Date: Mon, 17 Jun 2019 13:28:38 +0200 Subject: [PATCH 07/14] fix for change in infix precedence --- src/Lib.hs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Lib.hs b/src/Lib.hs index 1c49ba7..378dfc4 100644 --- a/src/Lib.hs +++ b/src/Lib.hs @@ -166,7 +166,7 @@ fileFile conf newFileName file = do newFile <- Path.parseRelFile (T.unpack newFileName <> Path.fileExtension file) let newFilePath = - conf ^. Config.libraryDir newFile + (conf ^. Config.libraryDir) newFile case conf ^. Config.importAction of Config.Copy -> Path.copyFile file newFilePath From d491d21431088c907ba5b93f3acb60144e189b41 Mon Sep 17 00:00:00 2001 From: 2mol <2mol@users.noreply.github.com> Date: Mon, 17 Jun 2019 13:28:54 +0200 Subject: [PATCH 08/14] version number bump --- pboy.cabal | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pboy.cabal b/pboy.cabal index 50878f5..92812dd 100644 --- a/pboy.cabal +++ b/pboy.cabal @@ -1,7 +1,7 @@ cabal-version: 2.4 name: pboy -version: 1.2 +version: 1.3 synopsis: a small .pdf management utility description: Please see the README on Github at homepage: https://github.com/2mol/pboy#readme From a2ccf1c8ec5e7d87256634e0b2b9b6eb1ad6a98d Mon Sep 17 00:00:00 2001 From: 2mol <2mol@users.noreply.github.com> Date: Mon, 17 Jun 2019 13:29:07 +0200 Subject: [PATCH 09/14] stack lts bump --- .gitignore | 2 +- nix/nixpkgs-src.json | 4 ++-- stack.yaml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index 16b728b..7af935e 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,4 @@ dist/ dist-newstyle/ result .stack-work/ - +stack.yaml.lock diff --git a/nix/nixpkgs-src.json b/nix/nixpkgs-src.json index d980d8e..c5b20bc 100644 --- a/nix/nixpkgs-src.json +++ b/nix/nixpkgs-src.json @@ -1,6 +1,6 @@ { "owner": "NixOS", "repo": "nixpkgs", - "rev": "4b5098e79aa29e73aa9059e530ceac65f3a49cb5", - "sha256": "1920vprnxridy0ql6fjsi4iqxj7q14lf9fqryjfakxa88i3bp370" + "rev": "069f2235af96aa5af939f1badfee90ca2a9f42ff", + "sha256": "1j20nilg72xfrf9pyzh9ncqx7gi4wdvw3ick1mjsgnb12wq654y7" } diff --git a/stack.yaml b/stack.yaml index bd41c99..0febad2 100644 --- a/stack.yaml +++ b/stack.yaml @@ -1,4 +1,4 @@ -resolver: lts-13.17 +resolver: lts-13.25 packages: - . From 1b49c1e4646c0a7252bdd4c7780801f86ff2f9e6 Mon Sep 17 00:00:00 2001 From: 2mol <2mol@users.noreply.github.com> Date: Fri, 25 Oct 2019 13:58:00 +0200 Subject: [PATCH 10/14] versions bump --- nix/nixpkgs-src.json | 4 ++-- stack.yaml | 8 ++------ 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/nix/nixpkgs-src.json b/nix/nixpkgs-src.json index c5b20bc..25aa70e 100644 --- a/nix/nixpkgs-src.json +++ b/nix/nixpkgs-src.json @@ -1,6 +1,6 @@ { "owner": "NixOS", "repo": "nixpkgs", - "rev": "069f2235af96aa5af939f1badfee90ca2a9f42ff", - "sha256": "1j20nilg72xfrf9pyzh9ncqx7gi4wdvw3ick1mjsgnb12wq654y7" + "rev": "e8a36cdf57193e56514aa6eeff936159372f0ace", + "sha256": "1jxdqphacpzkvwpkw67w1222jnmyplzall4n9sdwznyipxz6bqsv" } diff --git a/stack.yaml b/stack.yaml index 0febad2..fd0fce7 100644 --- a/stack.yaml +++ b/stack.yaml @@ -1,10 +1,6 @@ -resolver: lts-13.25 +resolver: lts-14.3 packages: - . extra-deps: -- brick-0.47@sha256:4936c50acfdf09620dad5217fb384fc0d59626f75abed8b48250b419ec2ab623 -- config-ini-0.2.4.0@sha256:38a6d484d471c6fac81445de2eac8c4e8c82760962fca5491ae1c3bfca9c4047 -- data-clist-0.1.2.2@sha256:4d70add0a200a178853cd37c6469101bac3c36aebb3aa9c503ff225211b1a8c9 -- text-zipper-0.10.1@sha256:8b73a97a3717a17df9b0a722b178950c476ff2268ca5c583e99d010c94af849e -- word-wrap-0.4.1@sha256:f72233b383ef569c557bfd9812cbb8e306c415ce509082c0bd15ee51c0239ccc \ No newline at end of file + From 410b7ca077ed43ae1f87bafa2954ad04aaa27fb1 Mon Sep 17 00:00:00 2001 From: 2mol <2mol@users.noreply.github.com> Date: Fri, 25 Oct 2019 15:16:10 +0200 Subject: [PATCH 11/14] wip changelog --- Changelog.txt | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Changelog.txt b/Changelog.txt index c66c3c7..d6f8cd2 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,5 +1,12 @@ Changelog +1.3, unreleased + - new config option: separator character. + - length limitation for filename lifted to maximum possible length. + - better help screen, UI hint how to open it with [h]. + - launch file viewer in background. + - fix to sort library files by date. + 1.2, 2019-04-21 - faster performance on large pdfs by only parsing the first couple of pages. - won't create the default directories until the first file is moved. From 28caa7392938f6822af0f2bf946c3fb3a2071c3f Mon Sep 17 00:00:00 2001 From: 2mol <2mol@users.noreply.github.com> Date: Fri, 25 Oct 2019 15:16:38 +0200 Subject: [PATCH 12/14] sort library, hack for allowing space as a sep --- src/Config.hs | 21 ++++++++++++++++----- src/UI.hs | 15 +++++++++------ 2 files changed, 25 insertions(+), 11 deletions(-) diff --git a/src/Config.hs b/src/Config.hs index aabf0d8..1bfe37d 100644 --- a/src/Config.hs +++ b/src/Config.hs @@ -21,7 +21,7 @@ import Data.Ini.Config.Bidir (Ini, IniSpec, (.=)) import qualified Data.Ini.Config.Bidir as C import Data.Text (Text) import qualified Data.Text.IO as TIO -import Lens.Micro ((^.)) +import Lens.Micro ((^.), (.~)) import Lens.Micro.TH (makeLenses) import Path (Abs, Dir, File, Path, Rel, ()) import qualified Path @@ -85,10 +85,18 @@ tryGetConfig configPath = do configIniResult = configTxtResult >>= (\t -> C.parseIni t configIni) - configResult = + configDataResult = C.getIniValue <$> configIniResult - sequence $ readConfigData <$> configResult + -- special case: allow " " in the .ini to be interpreted as + -- a single space. Ugly but neceessary. + inferSpace :: Config -> Config + inferSpace conf = + if conf ^. wordSeparator == "\" \"" + then conf & wordSeparator .~ " " + else conf + configResult <- sequence $ readConfigData <$> configDataResult + pure $ inferSpace <$> configResult readConfigData :: ConfigData -> IO Config @@ -120,7 +128,7 @@ configSpec = ] libraryDirD .= C.field "library" C.string - & C.comment ["The folder to copy/move renamed files to."] + & C.comment [ "The folder to copy/move renamed files to." ] importMove .= C.field "move" C.bool & C.comment @@ -129,7 +137,10 @@ configSpec = ] wordSeparatorD .= C.field "wordseparator" C.text - & C.comment ["The character (or characters) to insert between words."] + & C.comment + [ "The character to insert between words." + , "Write \" \" for space." + ] configIni :: Ini ConfigData diff --git a/src/UI.hs b/src/UI.hs index 580ea11..c720793 100644 --- a/src/UI.hs +++ b/src/UI.hs @@ -120,9 +120,10 @@ initState = do refreshFiles :: State -> IO State refreshFiles s = do - libraryFileInfos <- Lib.listFiles (s ^. config . Config.libraryDir) + libraryFileInfos_ <- Lib.listFiles (s ^. config . Config.libraryDir) inboxFileInfos_ <- mapM Lib.listFiles (s ^. config . Config.inboxDirs) let + libraryFileInfos = Lib.sortFileInfoByDate libraryFileInfos_ inboxFileInfos = Lib.sortFileInfoByDate $ join inboxFileInfos_ libraryList = L.list Library (Vec.fromList libraryFileInfos) 1 inboxList = L.list Inbox (Vec.fromList inboxFileInfos) 1 @@ -230,7 +231,7 @@ drawUI s = <> " " <> inboxLabel , fill ' ' - , str " -> " + , str " press h for help " , fill ' ' , str $ libraryLabel <> " [Library]" ] @@ -524,14 +525,16 @@ helpScreen cpath (Just d) = [ "Welcome to PAPERBOY!" , "====================" , " " - , "[Enter] or [Space]:" - , " - from inbox: start import/rename." - , " - from library: open pdf." - , " " , "[Tab] - switch between inbox and library." , " " + , "[Enter] or [Space]:" + , " - from inbox: start import/rename." + , " - from library: open pdf." + , "[r] - rename file" + , " " , "[Esc] or [q] - quit from main screen." , "[Ctrl-c] - quit from any screen." + , "[h] - this help screen." , " " , "Your config file is at" , Path.fromAbsFile cpath From 0450fdfd71a7747e9d56956311f7f3975c2960a1 Mon Sep 17 00:00:00 2001 From: 2mol <2mol@users.noreply.github.com> Date: Fri, 25 Oct 2019 20:13:34 +0200 Subject: [PATCH 13/14] lib cleanup, open files with 'o' --- Changelog.txt | 1 + src/Lib.hs | 31 +++++++++++++++---------------- src/UI.hs | 27 ++++++++++++++++++--------- 3 files changed, 34 insertions(+), 25 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index d6f8cd2..f06ee29 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -4,6 +4,7 @@ Changelog - new config option: separator character. - length limitation for filename lifted to maximum possible length. - better help screen, UI hint how to open it with [h]. + - more keyboard shortcuts! - launch file viewer in background. - fix to sort library files by date. diff --git a/src/Lib.hs b/src/Lib.hs index 6c4b2f4..1f2ab0c 100644 --- a/src/Lib.hs +++ b/src/Lib.hs @@ -29,8 +29,7 @@ import qualified Path import qualified Path.IO as Path import qualified System.FilePath as F import qualified System.Process as P -import qualified GHC.IO.Handle.Types as IOHT -import System.Directory (findExecutable) +import qualified System.Directory import qualified Text.PDF.Info as PDFI data FileInfo = FileInfo @@ -177,21 +176,21 @@ fileFile conf newFileName file = do openFile :: Path Abs File -> IO () openFile file = do - tryViewers ["xdg-open", "open"] file + tryOpenWithMany ["xdg-open", "open"] file -tryViewers :: [[Char]] -> Path Abs File -> IO () -tryViewers [] file = do return () -tryViewers (e:es) file = do - v <- findExecutable e - if Maybe.isNothing v - then tryViewers es file - else do - tryOpenWith file e - return () +tryOpenWithMany :: [String] -> Path Abs File -> IO () +tryOpenWithMany [] _ = pure () +tryOpenWithMany (e:es) file = do + exe <- System.Directory.findExecutable e + case exe of + Nothing -> tryOpenWithMany es file + Just _ -> tryOpenWith e file -tryOpenWith :: Path Abs File -> FilePath -> IO () -tryOpenWith file cmd = do - _ <- P.createProcess (P.proc cmd [Path.fromAbsFile file]){ P.std_out = P.NoStream, P.std_err = P.NoStream } - return () +tryOpenWith :: FilePath -> Path Abs File -> IO () +tryOpenWith exePath file = do + P.createProcess + ( P.proc exePath [Path.fromAbsFile file] ) + { P.std_out = P.NoStream, P.std_err = P.NoStream } + pure () diff --git a/src/UI.hs b/src/UI.hs index c720793..12339df 100644 --- a/src/UI.hs +++ b/src/UI.hs @@ -321,33 +321,38 @@ handleFirstStartEvent s e = Nothing -> continue s -handleLibraryEvent :: State -> V.Event -> EventM ResourceName (Next State) -handleLibraryEvent s e = +openAction :: State -> EventM n (Next State) +openAction s = let openFile fileName = do _ <- liftIO $ Lib.openFile fileName continue s + in + case L.listSelectedElement (s ^. library) of + Just (_, fileInfo) -> openFile (Lib._fileName fileInfo) + _ -> continue s - openAction = - case L.listSelectedElement (s ^. library) of - Just (_, fileInfo) -> openFile (Lib._fileName fileInfo) - _ -> continue s - renameAction = +handleLibraryEvent :: State -> V.Event -> EventM ResourceName (Next State) +handleLibraryEvent s e = + let renameAction = case L.listSelectedElement (s ^. library) of Just (_, fileInfo) -> beginFileImport s fileInfo _ -> continue s in case e of V.EvKey V.KEnter [] -> - openAction + openAction s V.EvKey (V.KChar ' ') [] -> - openAction + openAction s V.EvKey (V.KChar 'r') [] -> renameAction + V.EvKey (V.KChar 'o') [] -> + openAction s + _ -> do newLibrary <- L.handleListEvent e (s ^. library) continue (s & library .~ newLibrary) @@ -371,6 +376,9 @@ handleInboxEvent s e = V.EvKey (V.KChar 'r') [] -> importAction + V.EvKey (V.KChar 'o') [] -> + openAction s + _ -> do newInbox <- L.handleListEvent e (s ^. inbox) continue (s & inbox .~ newInbox) @@ -531,6 +539,7 @@ helpScreen cpath (Just d) = , " - from inbox: start import/rename." , " - from library: open pdf." , "[r] - rename file" + , "[o] - open file" , " " , "[Esc] or [q] - quit from main screen." , "[Ctrl-c] - quit from any screen." From e199dcc6300f9422e3583698dcda865e89d399f2 Mon Sep 17 00:00:00 2001 From: 2mol <2mol@users.noreply.github.com> Date: Fri, 25 Oct 2019 20:21:09 +0200 Subject: [PATCH 14/14] credit where credit's due --- Changelog.txt | 1 + README.md | 1 + 2 files changed, 2 insertions(+) diff --git a/Changelog.txt b/Changelog.txt index f06ee29..e9d2755 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -7,6 +7,7 @@ Changelog - more keyboard shortcuts! - launch file viewer in background. - fix to sort library files by date. + Huge thanks to Nils Steinger (https://github.com/n-st) for his contributions to this release. 1.2, 2019-04-21 - faster performance on large pdfs by only parsing the first couple of pages. diff --git a/README.md b/README.md index 290d6c1..6025249 100644 --- a/README.md +++ b/README.md @@ -86,5 +86,6 @@ You're very welcome to suggest new features or open issues. See the Roadmap http - [brick](https://github.com/jtdaugherty/brick) is a lovely way to a write a command-line UI. - [nmattia](https://github.com/nmattia) did the work to get Paperboy to build with [nix](https://github.com/NixOS/nix) and patiently explained some of the basics to me. - OsugiSakae and bri-an on reddit helped me with an annoying performance issue! +- [Nils Steinger](https://github.com/n-st) for feature contributions. The name 'Paperboy' is a reference to [this game](https://en.wikipedia.org/wiki/Paperboy_(video_game)), which I had for the NES and never quite mastered.