darkplaces-text-0.1: src/DarkPlaces/Text/Lexer.x
{
{-# OPTIONS_GHC -w #-}
module DarkPlaces.Text.Lexer (
DPTextToken(..),
DPText(..),
parseDPText,
isString,
isColor
) where
import qualified Data.ByteString.Lazy as BL
import qualified Data.ByteString.Lazy.Char8 as BLC
import qualified Data.Text as T
import qualified Data.Text.Lazy as TL
import Data.Text.Encoding
import qualified Data.Text.Lazy.Encoding as TLE
import Data.String
import Numeric
}
%wrapper "basic-bytestring"
$num = [0-9]
$hexnum = [$num A-Fa-f]
@simple_color = \^ $num
@hex_color = \^x $hexnum{3}
@other = [^\^]+ | [. $white]
words :-
@simple_color { simpleColor }
@hex_color { hexColor }
@other { DPString . decodeUtf8 . BL.toStrict }
{
data DPTextToken = SimpleColor Int
| HexColor Int
| DPString T.Text
deriving(Show, Eq)
newtype DPText = DPText [DPTextToken]
deriving(Show, Eq)
simpleColor :: BL.ByteString -> DPTextToken
simpleColor = SimpleColor . fst . head . readDec . BLC.unpack . BL.drop 1
hexColor :: BL.ByteString -> DPTextToken
hexColor = HexColor . fst . head . readHex . BLC.unpack . BL.drop 2
-- | convert lazy `BL.ByteString` to `DPText`
parseDPText :: BL.ByteString -> DPText
parseDPText = DPText . alexScanTokens
isString :: DPTextToken -> Bool
isString (DPString _) = True
isString _ = False
isColor :: DPTextToken -> Bool
isColor (SimpleColor _) = True
isColor (HexColor _) = True
isColor _ = False
instance IsString DPText where
fromString = parseDPText . TLE.encodeUtf8 . TL.pack
}