summaryrefslogtreecommitdiff
path: root/src/Text/Pandoc/Shared.hs
diff options
context:
space:
mode:
authorfiddlosopher <fiddlosopher@788f1e2b-df1e-0410-8736-df70ead52e1b>2007-01-22 21:28:46 +0000
committerfiddlosopher <fiddlosopher@788f1e2b-df1e-0410-8736-df70ead52e1b>2007-01-22 21:28:46 +0000
commit8f0750574ac1702d27bf9a98ccce3962ad0b587c (patch)
tree0d0ae7cedbd53d157172177fd1233ef6a2457c4f /src/Text/Pandoc/Shared.hs
parenta7839a18a785e5fe407fdc8906af8d220469f7a4 (diff)
+ Added a 'substitute' function to Shared.hs. This is a generic
list function that can be used to substitute one substring for another in a string, like 'gsub' except without regular expressions. + Use 'substitute' instead of 'gsub' in the LaTeX writer. This avoids what appears to be a bug in Text.Regex, whereby "\\^" matches "\350". There seems to be a slight speed improvement as well. (Note: If this works, it would be good to replace other uses of gsub that don't employ regexs with 'substitute'.) git-svn-id: https://pandoc.googlecode.com/svn/trunk@500 788f1e2b-df1e-0410-8736-df70ead52e1b
Diffstat (limited to 'src/Text/Pandoc/Shared.hs')
-rw-r--r--src/Text/Pandoc/Shared.hs14
1 files changed, 12 insertions, 2 deletions
diff --git a/src/Text/Pandoc/Shared.hs b/src/Text/Pandoc/Shared.hs
index 8ee990827..adaffb9da 100644
--- a/src/Text/Pandoc/Shared.hs
+++ b/src/Text/Pandoc/Shared.hs
@@ -31,6 +31,7 @@ module Text.Pandoc.Shared (
-- * List processing
splitBy,
splitByIndices,
+ substitute,
-- * Text processing
gsub,
joinWithSep,
@@ -79,8 +80,8 @@ import Text.Pandoc.Entities ( decodeEntities, encodeEntities, characterEntity )
import Text.Regex ( matchRegexAll, mkRegex, subRegex, Regex )
import Text.PrettyPrint.HughesPJ as PP ( text, char, (<>), ($$), nest, Doc,
isEmpty )
-import Char ( toLower )
-import List ( find, groupBy )
+import Data.Char ( toLower )
+import Data.List ( find, groupBy, isPrefixOf )
-- | Parse a string with a given parser and state.
readWith :: GenParser Char ParserState a -- ^ parser
@@ -288,6 +289,15 @@ removeTrailingSpace = reverse . removeLeadingSpace . reverse
stripFirstAndLast str =
drop 1 $ take ((length str) - 1) str
+-- | Replace each occurrence of one sublist in a list with another.
+substitute :: (Eq a) => [a] -> [a] -> [a] -> [a]
+substitute _ _ [] = []
+substitute [] _ lst = lst
+substitute target replacement lst =
+ if isPrefixOf target lst
+ then replacement ++ (substitute target replacement $ drop (length target) lst)
+ else (head lst):(substitute target replacement $ tail lst)
+
-- | Split list into groups separated by sep.
splitBy :: (Eq a) => a -> [a] -> [[a]]
splitBy _ [] = []