packages feed

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
}