module Registry.Utils where
import Registry.Grammar
import Registry.Types
import qualified Data.List as List
import Data.Char (toUpper)
toUpperS :: String -> String
toUpperS = map toUpper
onlyDate (Date d) = True
onlyDate _ = False
onlyRecord (Date d) = False
onlyRecord _ = True
onlyGF (GF r) = True
onlyGF _ = False
onlyLang (Lang r) = True
onlyLang _ = False
onlyExtlang (Extl r) = True
onlyExtlang _ = False
onlyScript (Scr r) = True
onlyScript _ = False
onlyRegion (Reg r) = True
onlyRegion _ = False
onlyVariant (Var r) = True
onlyVariant _ = False
onlyRedundant (Red r) = True
onlyRedundant _ = False
onlyExtension (Red r) = True
onlyExtension _ = False
languageFrom (Lang r) = r
languageFrom x = error "Not a language"
extlangFrom (Extl r) = r
extlangFrom x = error "Not an extlang (extended language)"
scriptFrom (Scr r) = r
scriptFrom _ = error "Not a script"
regionFrom (Reg r) = r
regionFrom _ = error "Not a region"
variantFrom (Var v) = v
variantFrom _ = error "Not a variant"
redundantFrom (Red r) = r
redundantFrom _ = error "Not a redundant"
gfFrom (GF r) = r
gfFrom _ = error "Not a grandfathered"
onlyThisType :: String -> Record -> Bool
onlyThisType "language" = onlyLang
onlyThisType "extlang" = onlyExtlang
onlyThisType "grandfathered" = onlyGF
onlyThisType "script" = onlyScript
onlyThisType "region" = onlyRegion
onlyThisType "variant" = onlyVariant
onlyThisType "redundant" = onlyRedundant
onlyThisType "extension" = onlyExtension
onlyThisType t = error ("Unknown type in the registry: " ++ t)
onlyThisValue :: String -> String -> Record -> Bool
-- Remember that language tags are case-insensitive
onlyThisValue "language" v = (\r -> toUpperS (lang'subtag r) == toUpperS (v)).languageFrom
onlyThisValue "extlang" v = (\r -> toUpperS (extlang'subtag r) == toUpperS (v)).extlangFrom
onlyThisValue "grandfathered" v = (\r -> toUpperS (gf'tag r) == toUpperS (v)).gfFrom
onlyThisValue "script" v = (\r -> toUpperS (script'subtag r) == toUpperS (v)).scriptFrom
onlyThisValue "region" v = (\r -> toUpperS (region'subtag r) == toUpperS (v)).regionFrom
onlyThisValue "variant" v = (\r -> toUpperS (variant'subtag r) == toUpperS (v)).variantFrom
onlyThisValue "redundant" v = (\r -> toUpperS (redundant'tag r) == toUpperS (v)).redundantFrom
-- TODO: extensions
onlyThisValue t _ = error ("Unknown type of this value in the registry: " ++ t)
toSubtag (Lang l) = (lang'subtag l)
toSubtag (Scr s) = (script'subtag s)
toSubtag (GF t) = (gf'tag t)
toSubtag (Reg r) = (region'subtag r)
toSubtag (Var v) = (variant'subtag v)
toSubtag (Red r) = (redundant'tag r)
maybeToString Nothing = ""
maybeToString (Just s) = s
dateToString d = d
descrToString a = concat (List.intersperse " / " a)
prefixesToString a = concat (List.intersperse " / " a)
toString (Lang l) = (lang'subtag l) ++ "\t" ++ dateToString (lang'added l) ++ "\t" ++
descrToString (lang'descr l) ++ "\t" ++
(maybeToString (lang'script l)) ++ "\t" ++
(maybeToString (lang'comment l)) ++ "\n"
toString (GF t) = (gf'tag t) ++ "\n"
toString (Scr s) = (script'subtag s) ++ "\t" ++ dateToString (script'added s) ++ "\t" ++
descrToString (script'descr s) ++ "\t" ++
(maybeToString (script'comment s)) ++ "\n"
toString (Reg r) = (region'subtag r) ++ "\t" ++ dateToString (region'added r) ++ "\t" ++
descrToString (region'descr r) ++ "\t" ++
(maybeToString (region'comment r)) ++ "\n"
toString (Var v) = (variant'subtag v) ++ "\t" ++ dateToString (variant'added v) ++ "\t" ++
descrToString (variant'descr v) ++ "\t" ++
prefixesToString (variant'prefix v) ++ "\t" ++
(maybeToString (variant'comment v)) ++ "\n"
toString (Red r) = (redundant'tag r) ++ "\t" ++ dateToString (redundant'added r) ++ "\t" ++
descrToString (redundant'descr r) ++ "\n"
-- TODO: escape non-XML chars
dateToXML d = "
" ++ s ++ "
"
onedescrToHTML s = s
descrToHTML a = concat (List.intersperse " / " (map onedescrToHTML a))
-- TODO: a prefix is not always a simple language, it can be composed of several subtags
oneprefixToHTML s = " Possible prefix: " ++ s ++ "
"
prefixesToHTML a = concat (map oneprefixToHTML a)
commentToHTML Nothing = ""
commentToHTML (Just s) = " Comment: " ++ s
deprecatedToHTML Nothing = ""
deprecatedToHTML (Just s) = " Deprecated: " ++ s
toHTML (Date d) = "Date: " ++ dateToHTML d ++ "
" toHTML (Lang l) = (html_head ((lang'descr l) !! 0)) ++ "Code " ++
(lang'subtag l) ++ "
. " ++
addedToHTML (lang'added l) ++ ". Description: " ++
descrToHTML (lang'descr l) ++ ". " ++
linkLanguage (lang'subtag l) ++
(sscriptToHTML (lang'script l)) ++
deprecatedToHTML (lang'deprecated l) ++
commentToHTML (lang'comment l) ++ "
Code " ++ (gf'tag t) ++ "
. " ++
addedToHTML (gf'added t) ++ ". " ++
descrToHTML (gf'descr t) ++ "
Code " ++
(script'subtag s) ++ "
. " ++
addedToHTML (script'added s) ++ ". Description: " ++
descrToHTML (script'descr s) ++
deprecatedToHTML (script'deprecated s) ++
commentToHTML (script'comment s) ++ "
Code " ++
(region'subtag r) ++ "
. " ++
addedToHTML (region'added r) ++
". Description: " ++
descrToHTML (region'descr r) ++
deprecatedToHTML (region'deprecated r) ++
commentToHTML (region'comment r) ++ "
Code " ++
(variant'subtag v) ++ "
. " ++
addedToHTML (variant'added v) ++ ". Description: " ++
descrToHTML (variant'descr v) ++ ". " ++
prefixesToHTML (variant'prefix v) ++
deprecatedToHTML (variant'deprecated v) ++
commentToHTML (variant'comment v) ++ "
Code " ++ (redundant'tag r) ++ "
. " ++
addedToHTML (redundant'added r) ++ ". " ++
descrToHTML (redundant'descr r) ++ "