packages feed

epub-tools 2.5 → 2.6

raw patch · 23 files changed

+269/−199 lines, 23 files

Files

LICENSE view
@@ -1,4 +1,4 @@-Copyright (c) 2008-2014 Dino Morelli+Copyright (c) 2008-2015 Dino Morelli All rights reserved.  Redistribution and use in source and binary forms, with or without
README.md view
@@ -16,52 +16,52 @@  Here's an example of epubmeta output: ->     $ epubmeta Kelly_Kessel_Lethem-NinetyPercentOfEverything.epub->->     package->        version: 2.0->        unique-identifier: calibre_id->     identifier->        id: calibre_id->        scheme: calibre->        text: b1026732-69a5-4a05-a8d9-a1701685f6fa->     identifier->        scheme: ISBN->        text: 1-590620-00-3->     title: Ninety Percent of Everything->     language: en-us->     contributor->        text: calibre (0.5.1) [http://calibre.kovidgoyal.net]->        file-as: calibre->        role: bkp->     creator->        text: James Patrick Kelly->        file-as: Kelly, James Patrick->        role: aut->     creator->        text: John Kessel->        role: aut->     creator->        text: Jonathan Lethem->        role: aut->     date: 2001-03-25T00:00:00->     publisher: www.Fictionwise.com->     subject: Science Fiction/Fantasy+      $ epubmeta Kelly_Kessel_Lethem-NinetyPercentOfEverything.epub +      package+         version: 2.0+         unique-identifier: calibre_id+      identifier+         id: calibre_id+         scheme: calibre+         text: b1026732-69a5-4a05-a8d9-a1701685f6fa+      identifier+         scheme: ISBN+         text: 1-590620-00-3+      title: Ninety Percent of Everything+      language: en-us+      contributor+         text: calibre (0.5.1) [http://calibre.kovidgoyal.net]+         file-as: calibre+         role: bkp+      creator+         text: James Patrick Kelly+         file-as: Kelly, James Patrick+         role: aut+      creator+         text: John Kessel+         role: aut+      creator+         text: Jonathan Lethem+         role: aut+      date: 2001-03-25T00:00:00+      publisher: www.Fictionwise.com+      subject: Science Fiction/Fantasy+ ### epubname  epubname is a command-line utility for renaming epub ebook files based on their OPF Package metadata. It tries to use author names and title info to construct a sensible name.  Using it looks like this: ->     $ epubname poorly-named-book.epub->->     poorly-named-book.epub -> WattsPeter-Blindsight_2006.epub->->     $ epubname another-poorly-named-book.epub->->     another-poorly-named-book.epub -> Kelly_Kessel_Lethem-NinetyPercentOfEverything.epub+      $ epubname poorly-named-book.epub +      poorly-named-book.epub -> WattsPeter-Blindsight_2006.epub++      $ epubname another-poorly-named-book.epub++      another-poorly-named-book.epub -> Kelly_Kessel_Lethem-NinetyPercentOfEverything.epub+ ### epubzip  epubzip is a handy utility for zipping up the files that comprise an epub into an .epub zip file. Using the same technology as epubname, it can try to make a meaningful filename for the book.@@ -73,15 +73,15 @@ - Download the cabalized source tarball [from here](http://ui3.info/d/proj/epub-tools/epub-tools-2.5.tar.gz) - epub-tools is available for Arch Linux [from the AUR](http://aur.archlinux.org/packages/epub-tools/) - Download [binaries for Windows](http://ui3.info/d/proj/epub-tools/epub-tools-2.5-win.zip)-- Get the source with darcs: `$ darcs get http://ui3.info/darcs/epub-tools`-- If you're just looking, [browse the source](http://ui3.info/darcs/epub-tools)+- Get the source with darcs: `$ darcs get http://hub.darcs.net/dino/epub-tools`+- If you're just looking, [browse the source](http://hub.darcs.net/dino/epub-tools)  And once you have it, building the usual way: ->     $ cabal configure --enable-tests->     $ cabal build->     $ cabal test->     $ cabal install+      $ cabal configure --enable-tests+      $ cabal build+      $ cabal test+      $ cabal install   ## Installing
− TODO
@@ -1,43 +0,0 @@-------general--- Some notes in README about installing epubcheck if possible--- Would like to way to be able to insert a publishing year tag into the OPF data like these:-   <dc:date opf:event="publication">2011</dc:date>-   <dc:date opf:event="original-publication">2011</dc:date>-   <dc:subject>anthology</dc:subject>--   Perhaps as part of epubmeta?--- Perform util/win-dist.sh behavior in post-build step of Setup.hs? I think it makes sense.--------epubmeta--- When a backup is made during -e[SUF], make a note of it on stdout--- Maybe more options for modifying metadata from the command-line--- Ability to dump the actual Haskell Metadata structure out. Could be used to make unit tests for epubname.--------epubname--- Add info in the usage about submitting metadata to me using epubmeta when there are problems.--- Rethink that Publisher business, maybe get rid of it.--- I'd like to see the author name formatting be more flexible so you can opt to not have it call scrubString as is mandatory now.--- Try to make tests of formatters into a conf file thing as well. This is kind of important. Not part of HUnit or QC-   module hierarchy:-      EpubName/-         Test/-            Compile-            Test--- Can possibly parallelize book renaming, each book is an atomic operation. Look into it.--------epubzip
+ TODO.md view
@@ -0,0 +1,47 @@+## general++- README.md changes:+   - installing epubcheck if possible+   - less-obscure example book naming sessions+   - demonstration of interactive mode+   - encourage users to contact the developer (see below in epubname as well)+- Windows binary docs:+   - make INSTALL more nicely worded+   - add information or maybe a batch file for assisting with globs and cmd+- Use Paths_epub_tools version instead of hard-coded version in the Opts modules. Test this on Windows.+- Would like to way to be able to insert a publishing year tag into the OPF data+   - like these:+      - `<dc:date opf:event="publication">2011</dc:date>`+      - `<dc:date opf:event="original-publication">2011</dc:date>`+      - `<dc:subject>anthology</dc:subject>`+   - Perhaps as part of epubmeta?+- Perform util/win-dist.sh behavior in post-build step of Setup.hs? I think it makes sense.+++## epubmeta++- When a backup is made during `-e[SUF]`, make a note of it on stdout+- Maybe more options for modifying metadata from the command-line+- Ability to dump the actual Haskell Metadata structure out. Could be used to make unit tests for epubname.+++## epubname++- in usage, encourage users to contact the developer+- Add info in the usage about submitting metadata to me using epubmeta when there are problems.+- Rethink that Publisher business, maybe get rid of it.+- I'd like to see the author name formatting be more flexible so you can opt to not have it call scrubString as is mandatory now.+- Can possibly parallelize book renaming, each book is an atomic operation. Look into it.+- Not testing improper name instruction function arguments (such as: an index that doesn't exist in a match with `idx`)+   - This is tricky as we're using the stock set of rules that are deployed for the real app for all testing. Need to redesign `testsuite/EpubTools/test-epubname.main` to be able to load a different set of rules.+- Why is the verbosity Opts value a Maybe Int? Couldn't it just have been an Int (0, 1 or 2) where 0 is the old Nothing? Or even better, explicit values like: `data Verbosity = Minimum | ShowFormatter | Maximum`  Think about it more++- Try to make tests of formatters into a conf file thing as well. This is kind of important. Not part of HUnit or QC. module hierarchy:++      EpubName/+         Test/+            Compile+            Test+++## epubzip
changelog.md view
@@ -1,14 +1,25 @@+2.6 (2015-05-25)++   * Fixed an error in bad DSL command index reporting+   * Replaced deprecated Control.Monad.Error with+     Control.Monad.Except+   * Replaced deprecated System.Cmd with System.Process+   * Removed useless import of Control.Applicative+   * Updated cabal homepage, tested-with and source-repository+   * Removed unused path to rules file in unit tests+   * Reformatted TODO and development notes into Markdown documents+   * Updated boringfile with cabal sandbox filespecs+   * Switched over to using Data.Version instead of hard-coded+     version string++ 2.5 (2014-04-04)     * Additions and modifications to the stock rules to both support      more books and also use more generic rules than before-    * Added code to set proper case for Roman numerals in titles-    * Added code to handle file-as names with parenthesized name info-    * Simplified and consolidated special-character filtering code-    * Added support for multiline fields in the Metadata  @@ -16,19 +27,14 @@     * Fixed problem in Windows cmd shell with missing UNIX HOME      env variable-    * Now gracefully handling last-name-first creators. For books      with no file-as and the Creator text arranged last-name-first      with a comma, do the right thing.-    * Added a new rule for generically-titled magazines with an issue-    * Incorporated project website info into README.md and      changelog.md files. This information is now in source control      where it belongs.-    * Added missing files to .cabal for sdist-    * Changed copyright date range to 2014  
− doc/dev/notes
@@ -1,13 +0,0 @@-------This project may benefit from the use of some other tools out here-such as epubcheck, zip and unzip--- Tools unzipping can try to fall back on unzip upon failure--- epubmeta needs write capability--- epub creation, think about this--- always release Windows binaries--- OSX too?
+ doc/dev/notes.md view
@@ -0,0 +1,25 @@+## general++This project may benefit from the use of some other tools out here+such as epubcheck, zip and unzip++- Tools unzipping can try to fall back on unzip upon failure+- epubmeta needs write capability+- epub creation, think about this+- always release Windows binaries+- OSX too?+++## Found some old notesbook notes about the DSL:++I think this was maybe about a less-flat more language-like DSL with recursive interpretation. But this is not how the software runs today. Maybe it should in the future?++    aut  (aut)+    idx  (idx 2)+    lit  some string+    mnum (mnum (idx 2))+    pad  (pad 2 (idx 1))+    publ (publ)+    scr  (scr (idx 3))+    wnum (wnum 3 (idx 4))+    year (year)
doc/hcar/epubtoolsCommandlineepubU-De.tex view
@@ -1,7 +1,7 @@ % epubtoolsCommandlineepubU-De.tex \begin{hcarentry}{epub-tools (Command-line epub Utilities)} \label{epubtools}-\report{Dino Morelli}%11/12+\report{Dino Morelli}%11/13 \status{stable, actively developed} \makeheader @@ -15,7 +15,7 @@  This project is built on the latest epub-metadata library and so supports epub3 for the first time. -See also epub-metadata.+See also epub-metadata \cref{epub-metadata}.  epub-tools is available from Hackage and the Darcs repository below. 
epub-tools.cabal view
@@ -1,34 +1,34 @@ name:                epub-tools cabal-version:       >= 1.8-version:             2.5+version:             2.6 build-type:          Simple license:             BSD3 license-file:        LICENSE-copyright:           2008-2014 Dino Morelli+copyright:           2008-2015 Dino Morelli author:              Dino Morelli  maintainer:          Dino Morelli <dino@ui3.info> stability:           stable-homepage:            http://ui3.info/d/proj/epub-tools.html+homepage:            http://hub.darcs.net/dino/epub-tools synopsis:            Command line utilities for working with epub files description:         A suite of command-line utilities for creating and manipulating epub book files. Included are: epubmeta, epubname, epubzip category:            Application, Console-tested-with:         GHC >= 7.6.2+tested-with:         GHC >= 7.10.1  extra-source-files:  changelog.md-                     doc/dev/notes+                     doc/dev/notes.md                      doc/hcar/epubtoolsCommandlineepubU-De.tex                      doc/INSTALL                      README.md                      testsuite/EpubTools/*.hs                      testsuite/EpubTools/Test/EpubName/*.hs-                     TODO+                     TODO.md                      util/all-books.hs                      util/prefs/boring                      util/win-dist.sh  source-repository    head    type:             darcs-   location:         http://ui3.info/darcs/epub-tools/+   location:         http://hub.darcs.net/dino/epub-tools  executable           epubmeta    main-is:          EpubTools/epubmeta.hs
src/EpubTools/EpubMeta/Edit.hs view
@@ -9,11 +9,11 @@  import Control.Exception import Control.Monad-import System.Cmd import System.Directory import System.FilePath import System.Environment import System.Exit+import System.Process ( system ) import Text.Printf  import EpubTools.EpubMeta.Export
src/EpubTools/EpubMeta/Opts.hs view
@@ -9,6 +9,8 @@    )    where +import Data.Version ( showVersion )+import Paths_epub_tools ( version ) import System.Console.GetOpt  import EpubTools.EpubMeta.Util@@ -105,5 +107,5 @@          , "   epub3: http://www.idpf.org/epub/30/spec/epub30-publications.html"          , ""          , ""-         , "Version 2.5  Dino Morelli <dino@ui3.info>"+         , "Version " ++ (showVersion version) ++ "  Dino Morelli <dino@ui3.info>"          ]
src/EpubTools/EpubMeta/Util.hs view
@@ -8,10 +8,10 @@    )    where -import Control.Monad.Error+import Control.Monad.Except  -type EM a = (ErrorT String IO) a+type EM a = (ExceptT String IO) a  runEM :: EM a -> IO (Either String a)-runEM = runErrorT+runEM = runExceptT
src/EpubTools/EpubName/Format/Author.hs view
@@ -105,8 +105,7 @@          matchRegex (mkRegex re) di     md <- asks gMetadata-   unless (any isJust $ map authorMatches' $ justAuthors md) $-      throwError "Specific author string not found"+   unless (any isJust $ map authorMatches' $ justAuthors md) $ throwError ""   {- Author names with a postfix like II, III, Jr. or Sr.
src/EpubTools/EpubName/Format/Format.hs view
@@ -15,9 +15,9 @@    where  import Codec.Epub.Data.Metadata-import Control.Monad.Error+import Control.Monad.Except import Data.List ( isPrefixOf )-import Data.Maybe ( isJust )+import Data.Maybe ( isJust, listToMaybe ) import Text.Printf import Text.Regex @@ -51,27 +51,27 @@ -}  -{- Wrapper functions to perform some basic operations in the Error+{- Wrapper functions to perform some basic operations in the Except    String monad -} --- general purpose read in the Error String monad+-- general purpose read in the Except String monad readE :: (MonadError String m, Read a) => String -> String -> m a readE msg s = case reads s of    [(x, "")] -> return x    _         -> throwError msg  --- read an Int in the Error String monad+-- read an Int in the Except String monad readIntE :: MonadError String m => String -> m Int readIntE = readE "Not a number"  --- get list element at a specific index in the Error String monad+-- get list element at a specific index in the Except String monad elemE :: MonadError String m => [a] -> Int -> m a elemE l i    | i < length l = return $ l !! i-   | otherwise    = throwError $ "Bad array index: " ++ show i+   | otherwise    = throwError $ "Bad array index: " ++ show (i + 1)   {- Instructions in the book naming DSL. These instructions are used from@@ -147,7 +147,7 @@ subjectMatches re = do    subjects <- asks $ metaSubjects . gMetadata    unless (any isJust $ map (matchRegex (mkRegex re)) subjects) $-      throwError "Subject string not found"+      throwError ""   {- This is used by the titlePat command to construct a title pattern@@ -157,13 +157,11 @@ extractTitle re = do    md <- asks gMetadata -   (Title _ _ _ oldTitle) <- case metaTitles md of-      [] -> throwError "format failed, no title present"-      ts -> return . head $ ts+   let titleMatch =+         (matchRegex $ mkRegexWithOpts re False True) =<<+         titleText `fmap` (listToMaybe $ metaTitles md) -   case matchRegex (mkRegexWithOpts re False True) oldTitle of-      Just matches -> return matches-      Nothing      -> throwError $ printf "extract title failed: %s" re+   maybe (throwError "") return titleMatch   {- This is used by the name command to execute a series of the DSL
src/EpubTools/EpubName/Format/Util.hs view
@@ -13,7 +13,7 @@  import Codec.Epub.Data.Metadata import Codec.Epub.Data.Package-import Control.Monad.Error+import Control.Monad.Except import Control.Monad.Identity import Control.Monad.Reader import Data.Char@@ -29,10 +29,10 @@    , gMetadata :: Metadata    } -type EN a = ReaderT Globals (ErrorT String Identity) a+type EN a = ReaderT Globals (ExceptT String Identity) a  runEN :: Globals -> EN a -> Either String a-runEN env ev = runIdentity (runErrorT (runReaderT ev env))+runEN env ev = runIdentity (runExceptT (runReaderT ev env))   {- Convenience function to make a regex replacer for a given pattern 
src/EpubTools/EpubName/Main.hs view
@@ -9,7 +9,7 @@    )    where -import Control.Monad.Error+import Control.Monad.Except import System.Directory ( doesFileExist ) import System.Exit import Text.Printf@@ -19,14 +19,6 @@ import EpubTools.EpubName.Format.Format import EpubTools.EpubName.Opts import EpubTools.EpubName.Util---instance Error ExitCode where-    -- noMsg  :: a-    noMsg  = strMsg ""--    -- strMsg :: String -> a-    strMsg = const exitInitFailure   initialize :: (MonadError ExitCode m, MonadIO m) =>
src/EpubTools/EpubName/Opts.hs view
@@ -10,8 +10,10 @@    )    where -import Control.Monad.Error+import Control.Monad.Except import Data.Maybe+import Data.Version ( showVersion )+import Paths_epub_tools ( version ) import System.Console.GetOpt import System.Environment import System.Exit@@ -219,5 +221,5 @@          , "   epub3: http://www.idpf.org/epub/30/spec/epub30-publications.html"          , ""          , ""-         , "Version 2.5  Dino Morelli <dino@ui3.info>"+         , "Version " ++ (showVersion version) ++ "  Dino Morelli <dino@ui3.info>"          ]
src/EpubTools/EpubZip/Opts.hs view
@@ -7,6 +7,8 @@    )    where +import Data.Version ( showVersion )+import Paths_epub_tools ( version ) import System.Console.GetOpt  @@ -70,5 +72,5 @@          , "   epub3: http://www.idpf.org/epub/30/spec/epub30-publications.html"          , ""          , ""-         , "Version 2.5  Dino Morelli <dino@ui3.info>"+         , "Version " ++ (showVersion version) ++ "  Dino Morelli <dino@ui3.info>"          ]
src/EpubTools/epubname.hs view
@@ -6,9 +6,8 @@ import Codec.Epub import Codec.Epub.Data.Metadata import Codec.Epub.Data.Package-import Control.Applicative import Control.Monad-import Control.Monad.Error+import Control.Monad.Except import System.Directory ( doesDirectoryExist, doesFileExist, renameFile ) import System.Environment ( getArgs ) import System.FilePath@@ -64,14 +63,14 @@    return priRes  processBook opts formatters (oldPath:paths) _     priRes = do-   result <- runErrorT $ do+   result <- runExceptT $ do       {- Parse the book's metadata          The reason for the nested runErrorT block is, if there is          failure during parsing, we need to mark the result up with the          file path. Failures here will otherwise get lost in the output          when multiple books are processed at once.       -}-      epm <- runErrorT $ do+      epm <- runExceptT $ do          xml <- getPkgXmlFromZip oldPath          (,) <$> getPackage xml <*> getMetadata xml       (pkg, md) <- either@@ -118,7 +117,7 @@    -- No buffering, it messes with the order of output    mapM_ (flip hSetBuffering NoBuffering) [ stdout, stderr, stdin ] -   either exitWith exitWith =<< (runErrorT $ do+   either exitWith exitWith =<< (runExceptT $ do       -- Parse command-line arguments       (opts, paths) <- (liftIO getArgs) >>= parseOpts 
src/EpubTools/epubzip.hs view
@@ -3,7 +3,7 @@  import Codec.Epub import Control.Monad-import Control.Monad.Error+import Control.Monad.Except import System.Directory import System.Environment import System.Exit@@ -25,7 +25,7 @@    -- No buffering, it messes with the order of output    mapM_ (flip hSetBuffering NoBuffering) [ stdout, stderr ] -   either exitWith exitWith =<< (runErrorT $ do+   either exitWith exitWith =<< (runExceptT $ do       -- Parse command-line arguments       (opts, paths) <- liftIO $ getArgs >>= parseOpts @@ -41,7 +41,7 @@             then do                dos <- liftIO EN.defaultOptions                fs <- initialize dos-               runErrorT $ do+               runExceptT $ do                   xml <- snd `fmap` getPkgPathXmlFromDir "."                   pkg <- getPackage xml                   metadata <- getMetadata xml
testsuite/EpubTools/Test/EpubName/Format.hs view
@@ -8,7 +8,7 @@  import Codec.Epub.Data.Metadata import Codec.Epub.Data.Package-import Control.Monad.Error+import Control.Monad.Except import Test.HUnit ( Test (..), assertEqual ) import Test.HUnit.Base ( Assertion ) @@ -110,7 +110,7 @@ assertNewName :: Globals -> [Formatter] -> String    -> (String, String) -> Assertion assertNewName globals fs desc expected = do-   result <- runErrorT $ tryFormatting globals fs ""+   result <- runExceptT $ tryFormatting globals fs ""    let actual = either (\em -> ("NO FORMATTER", em)) id result    assertEqual desc expected actual 
testsuite/EpubTools/test-epubname.hs view
@@ -4,7 +4,7 @@ module Main    where -import Control.Monad.Error+import Control.Monad.Except import System.Exit import Test.HUnit ( Counts (..), Test (..), runTestTT ) @@ -18,8 +18,8 @@ main :: IO () main = do    dos <- defaultOptions-   let testOpts = dos { optRulesPaths = ["resources/default.rules"] }-   ir <- runErrorT $ initialize testOpts+   let testOpts = dos  -- Can use this to adjust the options with dos { ... }+   ir <- runExceptT $ initialize testOpts    either (exitWith) (runTests testOpts) ir     
util/prefs/boring view
@@ -1,69 +1,123 @@-# Boring file regexps:+# This file contains a list of extended regular expressions, one per+# line. A file path matching any of these expressions will be filtered+# out during `darcs add', or when the `--look-for-adds' flag is passed+# to `darcs whatsnew' and `record'.  The entries in ~/.darcs/boring (if+# it exists) supplement those in this file.+# +# Blank lines, and lines beginning with an octothorpe (#) are ignored.+# See regex(7) for a description of extended regular expressions.++### compiler and interpreter intermediate files+# haskell (ghc) interfaces \.hi$ \.hi-boot$ \.o-boot$+# object files \.o$ \.o\.cmd$+# profiling haskell \.p_hi$ \.p_o$-\.installed-pkg-config-\.setup-config-\.setup-config^dist(/|$)-# *.ko files aren't boring by default because they might-# be Korean translations rather than kernel modules.-# \.ko$+# haskell program coverage resp. profiling info+\.tix$+\.prof$+# fortran module files+\.mod$+# linux kernel \.ko\.cmd$ \.mod\.c$ (^|/)\.tmp_versions($|/)+# *.ko files aren't boring by default because they might+# be Korean translations rather than kernel modules+# \.ko$+# python, emacs, java byte code+\.py[co]$+\.elc$+\.class$+# objects and libraries; lo and la are libtool things+\.(obj|a|exe|so|lo|la)$+# compiled zsh configuration files+\.zwc$+# Common LISP output files for CLISP and CMUCL+\.(fas|fasl|sparcf|x86f)$++### build and packaging systems+# cabal intermediates+\.installed-pkg-config+\.setup-config+# cabal sandbox+^\.cabal-sandbox(/|$)+cabal\.sandbox\.config+# standard cabal build dir, might not be boring for everybody+^dist(/|$)+# autotools+(^|/)autom4te\.cache($|/)+(^|/)config\.(log|status)$+# microsoft web expression, visual studio metadata directories+\_vti_cnf$+\_vti_pvt$+# gentoo tools+\.revdep-rebuild.*+# generated dependencies+^\.depend$++### version control systems+# cvs (^|/)CVS($|/) \.cvsignore$+# cvs, emacs locks ^\.#+# rcs (^|/)RCS($|/) ,v$+# subversion (^|/)\.svn($|/)+# mercurial (^|/)\.hg($|/)+# git (^|/)\.git($|/)+# bzr \.bzr$+# sccs (^|/)SCCS($|/)-~$+# darcs (^|/)_darcs($|/) (^|/)\.darcsrepo($|/)-\.bak$-\.BAK$-\.orig$-\.rej$+^\.darcs-temp-mail$+-darcs-backup[[:digit:]]+$+# gnu arch+(^|/)(\+|,) (^|/)vssver\.scc$ \.swp$ (^|/)MT($|/) (^|/)\{arch\}($|/) (^|/).arch-ids($|/)-(^|/),-\.prof$-(^|/)\.DS_Store$+# bitkeeper (^|/)BitKeeper($|/) (^|/)ChangeSet($|/)-\.py[co]$-\.elc$-\.class$-\.zwc$-\.revdep-rebuild.*++### miscellaneous+# backup files+~$+\.bak$+\.BAK$+# patch originals and rejects+\.orig$+\.rej$+# X server \..serverauth.*+# image spam \# (^|/)Thumbs\.db$-(^|/)autom4te\.cache($|/)-(^|/)config\.(log|status)$-^\.depend$+# vi, emacs tags (^|/)(tags|TAGS)$ #(^|/)\.[^/]+# core dumps (^|/|\.)core$-\.(obj|a|exe|so|lo|la)$-^\.darcs-temp-mail$--darcs-backup[[:digit:]]+$-\.(fas|fasl|sparcf|x86f)$+# partial broken files (KIO copy operations) \.part$+# waf files, see http://code.google.com/p/waf/ (^|/)\.waf-[[:digit:].]+-[[:digit:]]+($|/) (^|/)\.lock-wscript$-^\.darcs-temp-mail$-\_vti_cnf$-\_vti_pvt$-(^|/)dist($|/)+# mac os finder+(^|/)\.DS_Store$