From a631190876969525ae1698890e185d172a9a2516 Mon Sep 17 00:00:00 2001 From: Yoshiharu Fujisawa Date: Wed, 18 Nov 2020 07:02:11 +0900 Subject: [PATCH] add dotAll regexp flag --- src/Data/String/Regex.js | 1 + src/Data/String/Regex.purs | 2 ++ src/Data/String/Regex/Flags.purs | 21 +++++++++++++++++++++ test/Test/Data/String/Regex.purs | 3 ++- 4 files changed, 26 insertions(+), 1 deletion(-) diff --git a/src/Data/String/Regex.js b/src/Data/String/Regex.js index ae40c11..8a3a473 100644 --- a/src/Data/String/Regex.js +++ b/src/Data/String/Regex.js @@ -27,6 +27,7 @@ exports.flagsImpl = function (r) { multiline: r.multiline, ignoreCase: r.ignoreCase, global: r.global, + dotAll: r.dotAll, sticky: !!r.sticky, unicode: !!r.unicode }; diff --git a/src/Data/String/Regex.purs b/src/Data/String/Regex.purs index 4f2e74f..43ebf21 100644 --- a/src/Data/String/Regex.purs +++ b/src/Data/String/Regex.purs @@ -61,6 +61,7 @@ renderFlags (RegexFlags f) = (if f.global then "g" else "") <> (if f.ignoreCase then "i" else "") <> (if f.multiline then "m" else "") <> + (if f.dotAll then "s" else "") <> (if f.sticky then "y" else "") <> (if f.unicode then "u" else "") @@ -70,6 +71,7 @@ parseFlags s = RegexFlags { global: contains (Pattern "g") s , ignoreCase: contains (Pattern "i") s , multiline: contains (Pattern "m") s + , dotAll: contains (Pattern "s") s , sticky: contains (Pattern "y") s , unicode: contains (Pattern "u") s } diff --git a/src/Data/String/Regex/Flags.purs b/src/Data/String/Regex/Flags.purs index bd14d8c..dc7a0c7 100644 --- a/src/Data/String/Regex/Flags.purs +++ b/src/Data/String/Regex/Flags.purs @@ -9,6 +9,7 @@ type RegexFlagsRec = { global :: Boolean , ignoreCase :: Boolean , multiline :: Boolean + , dotAll :: Boolean , sticky :: Boolean , unicode :: Boolean } @@ -22,6 +23,7 @@ noFlags = RegexFlags { global: false , ignoreCase: false , multiline: false + , dotAll : false , sticky: false , unicode: false } @@ -32,6 +34,7 @@ global = RegexFlags { global: true , ignoreCase: false , multiline: false + , dotAll : false , sticky: false , unicode: false } @@ -42,6 +45,7 @@ ignoreCase = RegexFlags { global: false , ignoreCase: true , multiline: false + , dotAll : false , sticky: false , unicode: false } @@ -52,6 +56,7 @@ multiline = RegexFlags { global: false , ignoreCase: false , multiline: true + , dotAll : false , sticky: false , unicode: false } @@ -62,6 +67,7 @@ sticky = RegexFlags { global: false , ignoreCase: false , multiline: false + , dotAll : false , sticky: true , unicode: false } @@ -72,15 +78,28 @@ unicode = RegexFlags { global: false , ignoreCase: false , multiline: false + , dotAll : false , sticky: false , unicode: true } +-- | Only dotAll flag set to true +dotAll :: RegexFlags +dotAll = RegexFlags + { global: false + , ignoreCase: false + , multiline: false + , dotAll : true + , sticky: false + , unicode: false + } + instance semigroupRegexFlags :: Semigroup RegexFlags where append (RegexFlags x) (RegexFlags y) = RegexFlags { global: x.global || y.global , ignoreCase: x.ignoreCase || y.ignoreCase , multiline: x.multiline || y.multiline + , dotAll: x.dotAll || y.dotAll , sticky: x.sticky || y.sticky , unicode: x.unicode || y.unicode } @@ -93,6 +112,7 @@ instance eqRegexFlags :: Eq RegexFlags where = x.global == y.global && x.ignoreCase == y.ignoreCase && x.multiline == y.multiline + && x.dotAll == y.dotAll && x.sticky == y.sticky && x.unicode == y.unicode @@ -104,6 +124,7 @@ instance showRegexFlags :: Show RegexFlags where <> (guard flags.global $> "global") <> (guard flags.ignoreCase $> "ignoreCase") <> (guard flags.multiline $> "multiline") + <> (guard flags.dotAll $> "dotAll") <> (guard flags.sticky $> "sticky") <> (guard flags.unicode $> "unicode") in diff --git a/test/Test/Data/String/Regex.purs b/test/Test/Data/String/Regex.purs index 326b35e..a458759 100644 --- a/test/Test/Data/String/Regex.purs +++ b/test/Test/Data/String/Regex.purs @@ -5,7 +5,7 @@ import Data.String.Regex import Data.Array.NonEmpty (NonEmptyArray, fromArray) import Data.Either (isLeft) import Data.Maybe (Maybe(..), fromJust) -import Data.String.Regex.Flags (global, ignoreCase, noFlags) +import Data.String.Regex.Flags (dotAll, global, ignoreCase, noFlags) import Data.String.Regex.Unsafe (unsafeRegex) import Effect (Effect) import Effect.Console (log) @@ -24,6 +24,7 @@ testStringRegex = do assert $ "quxbarfoobaz" == replace (unsafeRegex "foo" noFlags) "qux" "foobarfoobaz" assert $ "quxbarquxbaz" == replace (unsafeRegex "foo" global) "qux" "foobarfoobaz" assert $ "quxbarquxbaz" == replace (unsafeRegex "foo" (global <> ignoreCase)) "qux" "foobarFOObaz" + assert $ "quxbarfoobaz" == replace (unsafeRegex ".foo" dotAll) "qux" "\nfoobarfoobaz" log "match" assert $ match (unsafeRegex "^abc$" noFlags) "abc" == Just (nea [Just "abc"])