Permalink
Browse files

1.0.1.0: PCRE.Text, strict PVP, Update Stackage vrns, add re-top

  * Text.RE.PCRE.Text[.Lazy] (fixes #58)
  * Update LSTHaskell versions (fixes #136)
  * Add re-top example (fixes #137)
  * Regex library to conform with strict PVP (fixes #138)
  • Loading branch information...
cdornan committed Jun 2, 2017
1 parent ebd2de5 commit e3a8e71d7a7434a3107ac72dd54461fc8e1c118a
Showing with 1,939 additions and 1,135 deletions.
  1. +1 −1 README.md
  2. +1 −1 Text/RE/PCRE/ByteString.hs
  3. +1 −1 Text/RE/PCRE/ByteString/Lazy.hs
  4. +1 −1 Text/RE/PCRE/Sequence.hs
  5. +1 −1 Text/RE/PCRE/String.hs
  6. +217 −0 Text/RE/PCRE/Text.hs
  7. +217 −0 Text/RE/PCRE/Text/Lazy.hs
  8. +1 −1 Text/RE/TDFA/ByteString.hs
  9. +1 −1 Text/RE/TDFA/ByteString/Lazy.hs
  10. +1 −1 Text/RE/TDFA/Sequence.hs
  11. +1 −1 Text/RE/TDFA/String.hs
  12. +1 −1 Text/RE/TDFA/Text.hs
  13. +1 −1 Text/RE/TDFA/Text/Lazy.hs
  14. +83 −0 Text/RE/ZeInternals/SearchReplace/PCRE/Text.hs
  15. +83 −0 Text/RE/ZeInternals/SearchReplace/PCRE/Text/Lazy.hs
  16. +6 −0 changelog
  17. +33 −0 examples/TestKit.lhs
  18. +29 −8 examples/re-gen-modules.lhs
  19. +6 −0 examples/re-tests.lhs
  20. +120 −41 examples/re-top.lhs
  21. +1 −1 lib/README-regex-examples.md
  22. +1 −1 lib/README-regex.md
  23. +17 −17 lib/cabal-masters/constraints-incl.cabal
  24. +4 −1 lib/cabal-masters/executables-incl.cabal
  25. +4 −0 lib/cabal-masters/library-incl.cabal
  26. +1 −1 lib/cabal-masters/mega-regex.cabal
  27. +7 −1 lib/cabal-masters/regex-with-pcre.cabal
  28. +2 −0 lib/cabal-masters/test-extra-source-files-incl.cabal
  29. +9 −8 lib/md/build-status.md
  30. +1 −1 lib/md/roadmap-incl.md
  31. +350 −337 lib/mega-regex.cabal
  32. +335 −327 lib/regex-examples.cabal
  33. +21 −13 lib/regex-with-pcre.cabal
  34. +17 −17 lib/regex.cabal
  35. +6 −5 lib/release-testing/stack.yaml
  36. +1 −1 lib/version.txt
  37. +350 −337 regex.cabal
  38. BIN releases/regex-1.0.1.0.tar.gz
  39. BIN releases/regex-examples-1.0.1.0.tar.gz
  40. BIN releases/regex-with-pcre-1.0.1.0.tar.gz
  41. +2 −2 stack-7.10.yaml
  42. +1 −1 stack-7.8.yaml
  43. +2 −2 stack-8.0.yaml
  44. +2 −2 stack-nightly.yaml
View
@@ -35,7 +35,7 @@ two packages:
## Road Map
- [X] 2017-04-10 v1.0.0.0 [First stable release](https://github.com/iconnect/regex/milestone/3)
- [ ] 2017-05-15 v1.1.0.0 [Update LTS versions and add r-top example](https://github.com/iconnect/regex/milestone/19)
- [X] 2017-06-03 v1.0.1.0 [PCRE.Text, strict PVP, Update Stackage vrns, add re-top](https://github.com/iconnect/regex/milestone/19)
- [ ] 2017-08-31 v2.0.0.0 [Fast text replacement with benchmarks](https://github.com/iconnect/regex/milestone/4)
@@ -96,7 +96,7 @@ import Text.RE.ZeInternals.PCRE
import Text.RE.ZeInternals.SearchReplace.PCRE.ByteString
import Text.Regex.Base
import qualified Text.Regex.PCRE as PCRE
-- NB regex-base instance imports maybe be needed for for some API modules
-- | find all the matches in the argument text; e.g., to count the number
-- of naturals in s:
@@ -96,7 +96,7 @@ import Text.RE.ZeInternals.PCRE
import Text.RE.ZeInternals.SearchReplace.PCRE.ByteString.Lazy
import Text.Regex.Base
import qualified Text.Regex.PCRE as PCRE
-- NB regex-base instance imports maybe be needed for for some API modules
-- | find all the matches in the argument text; e.g., to count the number
-- of naturals in s:
View
@@ -96,7 +96,7 @@ import Text.RE.ZeInternals.PCRE
import Text.RE.ZeInternals.SearchReplace.PCRE.Sequence
import Text.Regex.Base
import qualified Text.Regex.PCRE as PCRE
-- NB regex-base instance imports maybe be needed for for some API modules
-- | find all the matches in the argument text; e.g., to count the number
-- of naturals in s:
View
@@ -96,7 +96,7 @@ import Text.RE.ZeInternals.PCRE
import Text.RE.ZeInternals.SearchReplace.PCRE.String
import Text.Regex.Base
import qualified Text.Regex.PCRE as PCRE
-- NB regex-base instance imports maybe be needed for for some API modules
-- | find all the matches in the argument text; e.g., to count the number
-- of naturals in s:
View
@@ -0,0 +1,217 @@
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
{-# LANGUAGE CPP #-}
#if __GLASGOW_HASKELL__ >= 800
{-# OPTIONS_GHC -fno-warn-redundant-constraints #-}
#endif
module Text.RE.PCRE.Text
(
-- * Tutorial
-- $tutorial
-- * The 'Matches' and 'Match' Operators
(*=~)
, (?=~)
-- * The 'SearchReplace' Operators
, (*=~/)
, (?=~/)
-- * The 'Matches' Type
, Matches
, matchesSource
, allMatches
, anyMatches
, countMatches
, matches
-- * The 'Match' Type
, Match
, matchSource
, matched
, matchedText
-- * The Macros and Parsers
-- $macros
, module Text.RE.TestBench.Parsers
-- * The 'RE' Type
, RE
, reSource
-- * Options
-- $options
, SimpleREOptions(..)
-- * Compiling and Escaping REs
, SearchReplace(..)
, compileRegex
, compileRegexWith
, compileSearchReplace
, compileSearchReplaceWith
, escape
, escapeWith
, escapeREString
-- * The Classic regex-base Match Operators
, (=~)
, (=~~)
-- * The re Quasi Quoters
-- $re
, re
, reMultilineSensitive
, reMultilineInsensitive
, reBlockSensitive
, reBlockInsensitive
, reMS
, reMI
, reBS
, reBI
, re_
-- * The Ed Quasi Quoters
-- $ed
, edMultilineSensitive
, edMultilineInsensitive
, edBlockSensitive
, edBlockInsensitive
, ed
, edMS
, edMI
, edBS
, edBI
, ed_
-- * The cp Quasi Quoters
, cp
-- * IsRegex
-- $isregex
, module Text.RE.Tools.IsRegex
) where
import qualified Data.Text as T
import Data.Typeable
import Prelude.Compat
import Text.RE.REOptions
import Text.RE.Replace
import Text.RE.TestBench.Parsers
import Text.RE.Tools.IsRegex
import Text.RE.ZeInternals
import Text.RE.ZeInternals.PCRE
import Text.RE.ZeInternals.SearchReplace.PCRE.Text
import Text.Regex.Base
import qualified Text.Regex.PCRE as PCRE
import Text.Regex.PCRE.Text()
-- | find all the matches in the argument text; e.g., to count the number
-- of naturals in s:
--
-- @countMatches $ s *=~ [re|[0-9]+|]@
--
(*=~) :: T.Text
-> RE
-> Matches T.Text
(*=~) bs rex = addCaptureNamesToMatches (reCaptureNames rex) $ match (reRegex rex) bs
-- | find the first match in the argument text; e.g., to test if there
-- is a natural number in the input text:
--
-- @matched $ s ?=~ [re|[0-9]+|]@
--
(?=~) :: T.Text
-> RE
-> Match T.Text
(?=~) bs rex = addCaptureNamesToMatch (reCaptureNames rex) $ match (reRegex rex) bs
-- | search and replace all matches in the argument text; e.g., this section
-- will convert every YYYY-MM-DD format date in its argument text into a
-- DD\/MM\/YYYY date:
--
-- @(*=~\/ [ed|${y}([0-9]{4})-0*${m}([0-9]{2})-0*${d}([0-9]{2})\/\/\/${d}\/${m}\/${y}|])@
--
(*=~/) :: T.Text -> SearchReplace RE T.Text -> T.Text
(*=~/) = flip searchReplaceAll
-- | search and replace the first occurrence only (if any) in the input text
-- e.g., to prefix the first string of four hex digits in the input text,
-- if any, with @0x@:
--
-- @(?=~\/ [ed|[0-9A-Fa-f]{4}\/\/\/0x$0|])@
--
(?=~/) :: T.Text -> SearchReplace RE T.Text -> T.Text
(?=~/) = flip searchReplaceFirst
-- | the `regex-base` polymorphic match operator
(=~) :: ( Typeable a
, RegexContext PCRE.Regex T.Text a
)
=> T.Text
-> RE
-> a
(=~) bs rex = addCaptureNames (reCaptureNames rex) $ match (reRegex rex) bs
-- | the `regex-base` monadic, polymorphic match operator
(=~~) :: ( Monad m
, Functor m
, Typeable a
, RegexContext PCRE.Regex T.Text a
)
=> T.Text
-> RE
-> m a
(=~~) bs rex = addCaptureNames (reCaptureNames rex) <$> matchM (reRegex rex) bs
instance IsRegex RE T.Text where
matchOnce = flip (?=~)
matchMany = flip (*=~)
makeRegexWith = \o -> compileRegexWith o . unpackR
makeSearchReplaceWith = \o r t -> compileSearchReplaceWith o (unpackR r) (unpackR t)
regexSource = packR . reSource
-- $tutorial
-- We have a regex tutorial at <http://tutorial.regex.uk>.
-- $macros
-- There are a number of RE macros and corresponding Haskell parsers
-- for parsing the matched text into appropriate Haskell types. See
-- the [Macros Tables](http://regex.uk/macros) for details.
-- $options
-- You can specify different compilation options by appending a
-- to the name of an [re| ... |] or [ed| ... \/\/\/ ... |] quasi quoter
-- to select the corresponding compilation option. For example, the
-- section,
--
-- @(?=~/ [edBlockInsensitive|foo$\/\/\/bar|])@
--
-- will replace a @foo@ suffix of the argument text, of any
-- capitalisation, with a (lower case) @bar@. If you need to specify the
-- options dynamically, use the @[re_| ... |]@ and @[ed_| ... \/\/\/ ... |]@
-- quasi quoters, which generate functions that take an 'IsOption' option
-- (e.g., a 'SimpleReOptions' value) and yields a 'RE' or 'SearchReplace'
-- as apropriate. For example if you have a 'SimpleReOptions' value in
-- @sro@ then
--
-- @(?=~/ [ed_|foo$\/\/\/bar|] sro)@
--
-- will compile the @foo$@ RE according to the value of @sro@. For more
-- on specifying RE options see "Text.RE.REOptions".
-- $re
-- The @[re|.*|]@ quasi quoters, with variants for specifing different
-- options to the RE compiler (see "Text.RE.REOptions"), and the
-- specialised back-end types and functions.
-- $ed
-- The @[ed|.*\/\/\/foo|]@ quasi quoters, with variants for specifing different
-- options to the RE compiler (see "Text.RE.REOptions").
-- $ed
-- The -- | the @[ed| ... \/\/\/ ... |]@ quasi quoters; for example,
--
-- @[ed|${y}([0-9]{4})-0*${m}([0-9]{2})-0*${d}([0-9]{2})\/\/\/${d}\/${m}\/${y}|])@
--
-- represents a @SearchReplace@ that will convert a YYYY-MM-DD format date
-- into a DD\/MM\/YYYY format date.
--
-- The only difference betweem these quasi quoters is the RE options that are set,
-- using the same conventions as the @[re| ... |]@ quasi quoters.
-- $isregex
-- The 'IsRegex' class is used to abstact over the different regex back ends and
-- the text types they work with -- see "Text.RE.Tools.IsRegex" for details.
Oops, something went wrong.

0 comments on commit e3a8e71

Please sign in to comment.