Skip to content

Commit 3de404e

Browse files
authored
Add dotAll regexp flag (#133)
1 parent 7a94736 commit 3de404e

File tree

4 files changed

+26
-1
lines changed

4 files changed

+26
-1
lines changed

src/Data/String/Regex.js

+1
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ exports.flagsImpl = function (r) {
2727
multiline: r.multiline,
2828
ignoreCase: r.ignoreCase,
2929
global: r.global,
30+
dotAll: r.dotAll,
3031
sticky: !!r.sticky,
3132
unicode: !!r.unicode
3233
};

src/Data/String/Regex.purs

+2
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ renderFlags (RegexFlags f) =
6161
(if f.global then "g" else "") <>
6262
(if f.ignoreCase then "i" else "") <>
6363
(if f.multiline then "m" else "") <>
64+
(if f.dotAll then "s" else "") <>
6465
(if f.sticky then "y" else "") <>
6566
(if f.unicode then "u" else "")
6667

@@ -70,6 +71,7 @@ parseFlags s = RegexFlags
7071
{ global: contains (Pattern "g") s
7172
, ignoreCase: contains (Pattern "i") s
7273
, multiline: contains (Pattern "m") s
74+
, dotAll: contains (Pattern "s") s
7375
, sticky: contains (Pattern "y") s
7476
, unicode: contains (Pattern "u") s
7577
}

src/Data/String/Regex/Flags.purs

+21
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ type RegexFlagsRec =
99
{ global :: Boolean
1010
, ignoreCase :: Boolean
1111
, multiline :: Boolean
12+
, dotAll :: Boolean
1213
, sticky :: Boolean
1314
, unicode :: Boolean
1415
}
@@ -22,6 +23,7 @@ noFlags = RegexFlags
2223
{ global: false
2324
, ignoreCase: false
2425
, multiline: false
26+
, dotAll : false
2527
, sticky: false
2628
, unicode: false
2729
}
@@ -32,6 +34,7 @@ global = RegexFlags
3234
{ global: true
3335
, ignoreCase: false
3436
, multiline: false
37+
, dotAll : false
3538
, sticky: false
3639
, unicode: false
3740
}
@@ -42,6 +45,7 @@ ignoreCase = RegexFlags
4245
{ global: false
4346
, ignoreCase: true
4447
, multiline: false
48+
, dotAll : false
4549
, sticky: false
4650
, unicode: false
4751
}
@@ -52,6 +56,7 @@ multiline = RegexFlags
5256
{ global: false
5357
, ignoreCase: false
5458
, multiline: true
59+
, dotAll : false
5560
, sticky: false
5661
, unicode: false
5762
}
@@ -62,6 +67,7 @@ sticky = RegexFlags
6267
{ global: false
6368
, ignoreCase: false
6469
, multiline: false
70+
, dotAll : false
6571
, sticky: true
6672
, unicode: false
6773
}
@@ -72,15 +78,28 @@ unicode = RegexFlags
7278
{ global: false
7379
, ignoreCase: false
7480
, multiline: false
81+
, dotAll : false
7582
, sticky: false
7683
, unicode: true
7784
}
7885

86+
-- | Only dotAll flag set to true
87+
dotAll :: RegexFlags
88+
dotAll = RegexFlags
89+
{ global: false
90+
, ignoreCase: false
91+
, multiline: false
92+
, dotAll : true
93+
, sticky: false
94+
, unicode: false
95+
}
96+
7997
instance semigroupRegexFlags :: Semigroup RegexFlags where
8098
append (RegexFlags x) (RegexFlags y) = RegexFlags
8199
{ global: x.global || y.global
82100
, ignoreCase: x.ignoreCase || y.ignoreCase
83101
, multiline: x.multiline || y.multiline
102+
, dotAll: x.dotAll || y.dotAll
84103
, sticky: x.sticky || y.sticky
85104
, unicode: x.unicode || y.unicode
86105
}
@@ -93,6 +112,7 @@ instance eqRegexFlags :: Eq RegexFlags where
93112
= x.global == y.global
94113
&& x.ignoreCase == y.ignoreCase
95114
&& x.multiline == y.multiline
115+
&& x.dotAll == y.dotAll
96116
&& x.sticky == y.sticky
97117
&& x.unicode == y.unicode
98118

@@ -104,6 +124,7 @@ instance showRegexFlags :: Show RegexFlags where
104124
<> (guard flags.global $> "global")
105125
<> (guard flags.ignoreCase $> "ignoreCase")
106126
<> (guard flags.multiline $> "multiline")
127+
<> (guard flags.dotAll $> "dotAll")
107128
<> (guard flags.sticky $> "sticky")
108129
<> (guard flags.unicode $> "unicode")
109130
in

test/Test/Data/String/Regex.purs

+2-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import Data.String.Regex
55
import Data.Array.NonEmpty (NonEmptyArray, fromArray)
66
import Data.Either (isLeft)
77
import Data.Maybe (Maybe(..), fromJust)
8-
import Data.String.Regex.Flags (global, ignoreCase, noFlags)
8+
import Data.String.Regex.Flags (dotAll, global, ignoreCase, noFlags)
99
import Data.String.Regex.Unsafe (unsafeRegex)
1010
import Effect (Effect)
1111
import Effect.Console (log)
@@ -24,6 +24,7 @@ testStringRegex = do
2424
assert $ "quxbarfoobaz" == replace (unsafeRegex "foo" noFlags) "qux" "foobarfoobaz"
2525
assert $ "quxbarquxbaz" == replace (unsafeRegex "foo" global) "qux" "foobarfoobaz"
2626
assert $ "quxbarquxbaz" == replace (unsafeRegex "foo" (global <> ignoreCase)) "qux" "foobarFOObaz"
27+
assert $ "quxbarfoobaz" == replace (unsafeRegex ".foo" dotAll) "qux" "\nfoobarfoobaz"
2728

2829
log "match"
2930
assert $ match (unsafeRegex "^abc$" noFlags) "abc" == Just (nea [Just "abc"])

0 commit comments

Comments
 (0)