blob: 514dd1428d98b05eb09af33a7b0f9fcb490e25fe (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
-- | Miscellaneous string manipulation functions.
--
module Hakyll.Core.Util.String
( trim
, replaceAll
, splitAll
) where
import Data.Char (isSpace)
import Data.Maybe (listToMaybe)
import Text.Regex.TDFA ((=~~))
-- | Trim a string (drop spaces, tabs and newlines at both sides).
--
trim :: String -> String
trim = reverse . trim' . reverse . trim'
where
trim' = dropWhile isSpace
-- | A simple (but inefficient) regex replace funcion
--
replaceAll :: String -- ^ Pattern
-> (String -> String) -- ^ Replacement (called on capture)
-> String -- ^ Source string
-> String -- ^ Result
replaceAll pattern f source = replaceAll' source
where
replaceAll' src = case listToMaybe (src =~~ pattern) of
Nothing -> src
Just (o, l) ->
let (before, tmp) = splitAt o src
(capture, after) = splitAt l tmp
in before ++ f capture ++ replaceAll' after
-- | A simple regex split function. The resulting list will contain no empty
-- strings.
--
splitAll :: String -- ^ Pattern
-> String -- ^ String to split
-> [String] -- ^ Result
splitAll pattern = filter (not . null) . splitAll'
where
splitAll' src = case listToMaybe (src =~~ pattern) of
Nothing -> [src]
Just (o, l) ->
let (before, tmp) = splitAt o src
in before : splitAll' (drop l tmp)
|