34 lines
		
	
	
		
			660 B
		
	
	
	
		
			Haskell
		
	
	
	
	
	
			
		
		
	
	
			34 lines
		
	
	
		
			660 B
		
	
	
	
		
			Haskell
		
	
	
	
	
	
| module Toks where
 | |
| 
 | |
| import Data.Char
 | |
| import Data.Function
 | |
| import Data.List
 | |
| 
 | |
| escape '\\' = "\\\\"
 | |
| escape '\n' = "\\n"
 | |
| escape x = pure x
 | |
| 
 | |
| unescape [] = []
 | |
| unescape ('\\':'\\':xs) = '\\' : unescape xs
 | |
| unescape ('\\':'n':xs) = '\n' : unescape xs
 | |
| unescape ('\\':_) = error "bad escape?"
 | |
| unescape (x:xs) = x : unescape xs
 | |
| 
 | |
| markSpace [] = error "wat"
 | |
| markSpace s@(c:_)
 | |
|   | isSpace c = '.' : s
 | |
|   | otherwise = '|' : s
 | |
| 
 | |
| unmarkSpace ('.':s) = s
 | |
| unmarkSpace ('|':s) = s
 | |
| unmarkSpace _ = error "wat"
 | |
| 
 | |
| split =
 | |
|   unlines
 | |
|     . map (concatMap escape . markSpace)
 | |
|     . groupBy ((==) `on` generalCategory)
 | |
| 
 | |
| glueToks = concatMap (unmarkSpace . unescape)
 | |
| 
 | |
| glue = glueToks . lines
 |