From 4d4f86415354b55ec032b39506bdd2949d0a92f4 Mon Sep 17 00:00:00 2001 From: Michael Ficarra Date: Sat, 5 Jul 2014 09:49:24 -0700 Subject: [PATCH] fixes #5: implement RegexFlags with parsing, rendering, and retrieval --- README.md | 12 ++++++++- src/Data/String/Regex.purs | 55 ++++++++++++++++++++++++++++++++++++-- 2 files changed, 64 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index cfdc7a9..3d1454f 100644 --- a/README.md +++ b/README.md @@ -45,6 +45,8 @@ data Regex :: * + type RegexFlags = { unicode :: Boolean, sticky :: Boolean, multiline :: Boolean, ignoreCase :: Boolean, global :: Boolean } + ### Type Class Instances @@ -53,9 +55,15 @@ ### Values + flags :: Regex -> RegexFlags + match :: Regex -> String -> [String] - regex :: String -> String -> Regex + parseFlags :: String -> RegexFlags + + regex :: String -> RegexFlags -> Regex + + renderFlags :: RegexFlags -> String replace :: Regex -> String -> String -> String @@ -63,4 +71,6 @@ search :: Regex -> String -> Number + source :: Regex -> String + test :: Regex -> String -> Boolean \ No newline at end of file diff --git a/src/Data/String/Regex.purs b/src/Data/String/Regex.purs index 79629dd..40aa347 100644 --- a/src/Data/String/Regex.purs +++ b/src/Data/String/Regex.purs @@ -1,6 +1,11 @@ module Data.String.Regex ( Regex(..), + RegexFlags(..), regex, + source, + flags, + renderFlags, + parseFlags, test, match, replace, @@ -8,6 +13,8 @@ module Data.String.Regex ( search ) where +import Data.String (indexOf) + foreign import data Regex :: * foreign import showRegex' @@ -18,13 +25,57 @@ foreign import showRegex' instance showRegex :: Show Regex where show = showRegex' -foreign import regex - "function regex(s1) {\ +type RegexFlags = + { global :: Boolean + , ignoreCase :: Boolean + , multiline :: Boolean + , sticky :: Boolean + , unicode :: Boolean + } + +foreign import regex' + "function regex$prime(s1) {\ \ return function(s2) {\ \ return new RegExp(s1, s2);\ \ };\ \}" :: String -> String -> Regex +regex :: String -> RegexFlags -> Regex +regex source flags = regex' source $ renderFlags flags + +foreign import source + "function source(r) {\ + \ return r.source;\ + \}" :: Regex -> String + +foreign import flags + "function source(r) {\ + \ return {\ + \ multiline: r.multiline,\ + \ ignoreCase: r.ignoreCase,\ + \ global: r.global,\ + \ sticky: !!r.sticky,\ + \ unicode: !!r.unicode\ + \ };\ + \}" :: Regex -> RegexFlags + +renderFlags :: RegexFlags -> String +renderFlags flags = + (if flags.global then "g" else "") ++ + (if flags.ignoreCase then "i" else "") ++ + (if flags.multiline then "m" else "") ++ + (if flags.sticky then "y" else "") ++ + (if flags.unicode then "u" else "") + +parseFlags :: String -> RegexFlags +parseFlags s = + { global: indexOf "g" s >= 0 + , ignoreCase: indexOf "i" s >= 0 + , multiline: indexOf "m" s >= 0 + , sticky: indexOf "y" s >= 0 + , unicode: indexOf "u" s >= 0 + } + foreign import test "function test(r) {\ \ return function (s) {\