diff --git a/src/GF/Compile.hs b/src/GF/Compile.hs index 92a956d5f..5d5081541 100644 --- a/src/GF/Compile.hs +++ b/src/GF/Compile.hs @@ -208,7 +208,7 @@ compileSourceModule opts env@(k,gr,_) mo@(i,mi) = do generateModuleCode :: Options -> FilePath -> SourceModule -> IOE SourceModule generateModuleCode opts file minfo = do let minfo1 = subexpModule minfo - out = prGrammar (MGrammar [codeSourceModule encodeUTF8 minfo1]) + out = codeStringLiterals encodeUTF8 $ prGrammar (MGrammar [minfo1]) putPointE Normal opts (" wrote file" +++ file) $ ioeIO $ writeFile file $ out return minfo1 diff --git a/src/GF/Compile/Coding.hs b/src/GF/Compile/Coding.hs index a226265c5..704e95201 100644 --- a/src/GF/Compile/Coding.hs +++ b/src/GF/Compile/Coding.hs @@ -48,3 +48,13 @@ codeSourceModule co (id,moi) = case moi of PSeq p q -> PSeq (codp p) (codp q) PAlt p q -> PAlt (codp p) (codp q) _ -> p + +-- | Run an encoding function on all string literals within the given string. +codeStringLiterals :: (String -> String) -> String -> String +codeStringLiterals _ [] = [] +codeStringLiterals co ('"':cs) = '"' : inStringLiteral cs + where inStringLiteral [] = error "codeStringLiterals: unterminated string literal" + inStringLiteral ('"':ds) = '"' : codeStringLiterals co ds + inStringLiteral ('\\':d:ds) = '\\' : co [d] ++ inStringLiteral ds + inStringLiteral (d:ds) = co [d] ++ inStringLiteral ds +codeStringLiterals co (c:cs) = c : codeStringLiterals co cs diff --git a/src/GF/Infra/CompactPrint.hs b/src/GF/Infra/CompactPrint.hs index ca2452de6..486c9e183 100644 --- a/src/GF/Infra/CompactPrint.hs +++ b/src/GF/Infra/CompactPrint.hs @@ -5,8 +5,7 @@ compactPrint = compactPrintCustom keywordGF (const False) compactPrintGFCC = compactPrintCustom (const False) keywordGFCC --- FIXME: using words is not safe, since this is run on UTF-8 encoded data. -compactPrintCustom pre post = id -- dps . concat . map (spaceIf pre post) . words +compactPrintCustom pre post = dps . concat . map (spaceIf pre post) . words dps = dropWhile isSpace