2010-08-13, 15:30
Just in case you ever need one:
xmlCharDeref :: String -> String
xmlCharDeref [] = []
xmlCharDeref ('&':'#':'x':r) = let
(digits, remainder) = span (/= ';') r
c = chr (read ("0x" ++ digits))
in
c : xmlCharDeref (tail remainder)
xmlCharDeref ('&':'#':r) = let
(digits, remainder) = span (/= ';') r
c = chr (read digits)
in
c : xmlCharDeref (tail remainder)
xmlCharDeref (c:r) = c : xmlCharDeref r |
In ghci:
*Foo> xmlCharDeref "hello there"
"hello there"
*Foo> xmlCharDeref "hello there"
"hello there"
*Foo> xmlCharDeref "hello2there"
"hello2there" |
2009-07-14, 14:44
I don’t know how many times I’ve gone looking for one of these but my search-fu is weak and I always give up, instead resorting to manual editing in Vim (no I hardly ever need the entire file to be pretty, only one or two tags that I’m interested in). Anyway, here’s a quick hack in Haskell, relying on xml for the heavy lifting:
#! /usr/bin/env runhaskell
module Main where
import Control.Monad
import System.Environment
import Text.XML.Light.Input
import Text.XML.Light.Output
main = do
fn <- liftM (!! 0) $ getArgs
xml_contents <- readFile fn
let (Just doc) = parseXMLDoc xml_contents
writeFile ("pretty-" ++ fn) (ppTopElement doc) |