LibName.hs revision 1a38107941725211e7c3f051f7a8f5e12199f03a
43b4c41fbb07705c9df321221ab9cb9832460407Christian Maeder{-# LANGUAGE DeriveDataTypeable #-}
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian MaederModule : $Header$
25cc5fbba63f84b47e389af749f55abbbde71c8cChristian MaederDescription : library names for HetCASL and development graphs
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian MaederCopyright : (c) Christian Maeder, DFKI GmbH 2008
43b4c41fbb07705c9df321221ab9cb9832460407Christian MaederLicense : GPLv2 or higher, see LICENSE.txt
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian MaederMaintainer : Christian.Maeder@dfki.de
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian MaederStability : provisional
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian MaederPortability : portable
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian MaederAbstract syntax of HetCASL specification libraries
d8c71aacc9f1c8cd40a8ad8dcdad9be8854b849fChristian Maeder Follows Sect. II:2.2.5 of the CASL Reference Manual.
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder ( LibName (LibName, getLibId, locIRI, mimeType)
36f63902db2b3463faa9f59912ad106e2d5aaa24Klaus Luettich , VersionNumber (VersionNumber)
a737caf82de97c1907027c03e4b4509eb492b4b8Christian Maeder , LinkPath (LinkPath)
a737caf82de97c1907027c03e4b4509eb492b4b8Christian Maeder , isQualNameFrom
a737caf82de97c1907027c03e4b4509eb492b4b8Christian Maeder , setFilePath
3e61f574717499939bd8e0ff538ea9e7b72d4e2dKlaus Luettich , libToFileName
96646aed2ae087b942ae23f15bbe729a8f7c43d3Christian Maeder , getFilePath
3b06e23643a9f65390cb8c1caabe83fa7e87a708Till Mossakowski , filePathToLibId
df29370ae8d8b41587957f6bcdcb43a3f1927e47Christian Maeder , emptyLibName
bd54a9917cd87169b8e40bcc5616c537fed85815Christian Maeder , convertFileToLibStr
ce8b15da31cd181b7e90593cbbca98f47eda29d6Till Mossakowski , setMimeType
4d56f2fa72e4aec20eb827c11ed49c8cbb7014bdChristian MaederomTs :: [Token]
8ef75f1cc0437656bf622cec5ac9e8ea221da8f2Christian MaederomTs = [genToken "OM"]
404166b9366552e9ec5abb87a37c76ec8a815fb7Klaus LuettichmkQualName :: SIMPLE_ID -> LibName -> Id -> Id
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian MaedermkQualName nodeId ln i =
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder Id omTs [i, simpleIdToId nodeId, libNameToId ln] $ posOfId i
d23b0cc79c0d204e6ec758dff8d0ba71c9f693f7Christian MaederisQualNameFrom :: SIMPLE_ID -> LibName -> Id -> Bool
8d97ef4f234681b11bb5924bd4d03adef858d2d2Christian MaederisQualNameFrom nodeId ln i@(Id _ cs _) = case cs of
8d97ef4f234681b11bb5924bd4d03adef858d2d2Christian Maeder _ : n : l : _ | isQualName i ->
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder n == simpleIdToId nodeId && libNameToId ln == l
e7757995211bd395dc79d26fe017d99375f7d2a6Christian MaederisQualName :: Id -> Bool
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian MaederisQualName (Id ts cs _) = case cs of
0206ab93ef846e4e0885996d052b9b73b9dc66b0Christian Maeder _ : _ : _ -> ts == omTs
96646aed2ae087b942ae23f15bbe729a8f7c43d3Christian MaederunQualName :: Id -> Id
e7757995211bd395dc79d26fe017d99375f7d2a6Christian MaederunQualName j@(Id _ cs _) = case cs of
e7757995211bd395dc79d26fe017d99375f7d2a6Christian Maeder i : _ | isQualName j -> i
c55a0f77be7e88d3620b419ec8961f4379a586e3Klaus LuettichlibNameToId :: LibName -> Id
36f63902db2b3463faa9f59912ad106e2d5aaa24Klaus LuettichlibNameToId ln = let
36f63902db2b3463faa9f59912ad106e2d5aaa24Klaus Luettich path = splitOn '/' $ libToFileName ln
3b06e23643a9f65390cb8c1caabe83fa7e87a708Till Mossakowski toTok s = Token s $ getRange ln
8cacad2a09782249243b80985f28e9387019fe40Christian Maeder in mkId $ map toTok $ intersperse "/" path
0206ab93ef846e4e0885996d052b9b73b9dc66b0Christian Maederdata LibName = LibName
431d34c7007a787331c4e5ec997badb0f8190fc7Christian Maeder { getLibId :: IRI
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder , locIRI :: Maybe IRI
d3ae0072823e2ef0d41d4431fcc768e66489c20eChristian Maeder , mimeType :: Maybe String
9e748851c150e1022fb952bab3315e869aaf0214Christian Maeder , libVersion :: Maybe VersionNumber }
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder deriving (Typeable, Data)
9e748851c150e1022fb952bab3315e869aaf0214Christian MaedeririLibName :: IRI -> LibName
9e748851c150e1022fb952bab3315e869aaf0214Christian MaedeririLibName i = LibName i Nothing Nothing Nothing
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian MaedermkLibName :: IRI -> Maybe VersionNumber -> LibName
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian MaedermkLibName i v = (iriLibName i) { libVersion = v }
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian MaederemptyLibName :: String -> LibName
0206ab93ef846e4e0885996d052b9b73b9dc66b0Christian MaederemptyLibName s = iriLibName .
9e748851c150e1022fb952bab3315e869aaf0214Christian Maeder fromMaybe (if null s then nullIRI else error $ "emptyLibName: " ++ s)
9e748851c150e1022fb952bab3315e869aaf0214Christian Maeder $ parseIRIManchester s
776a1a086df734581431e6edb4343ed4c8d34d55Christian Maeder-- | convert file name to IRI reference
f1541d4a151dbd08002dbd14e7eb1d5dde253689Christian MaederfilePathToIri :: FilePath -> IRI
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian MaederfilePathToIri fp = fromMaybe (error $ "filePathToIri: " ++ fp)
61fa0ac06ede811c7aad54ec4c4202346727368eChristian Maeder . parseIRIReference $ encodeBut (\ c -> isUnreserved c || isReserved c) fp
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder-- | use file name as library IRI
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian MaederfilePathToLibId :: FilePath -> IRI
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian MaederfilePathToLibId = setAngles True . filePathToIri
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder-- | insert file name as location IRI
9e748851c150e1022fb952bab3315e869aaf0214Christian MaedersetFilePath :: FilePath -> LibName -> LibName
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian MaedersetFilePath fp ln = ln { locIRI = Just $ filePathToIri fp }
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder-- | insert optional mime type
c0c2380bced8159ff0297ece14eba948bd236471Christian MaedersetMimeType :: Maybe String -> LibName -> LibName
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian MaedersetMimeType m ln = ln { mimeType = m }
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder-- | interpret library IRI as file path
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian MaederlibToFileName :: LibName -> FilePath
4017ebc0f692820736d796af3110c3b3018c108aChristian MaederlibToFileName = iriToStringUnsecure . setAngles False . getLibId
62ea3d19927e5ce1318d62931a8427d8930f1576Christian Maeder-- | extract location IRI as file name
4017ebc0f692820736d796af3110c3b3018c108aChristian MaedergetFilePath :: LibName -> FilePath
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian MaedergetFilePath = maybe "" iriToStringUnsecure . locIRI
6ff7a91875597d6e4dfaa68c79187d01473e8341Christian Maederdata VersionNumber = VersionNumber [String] Range
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder deriving (Typeable, Data)
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder -- pos: "version", start of first string
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maederinstance GetRange LibName where
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder getRange = getRange . getLibId
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maederinstance Show LibName where
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder show = show . hsep . prettyLibName
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian MaederprettyVersionNumber :: VersionNumber -> [Doc]
a3c6d8e0670bf2aa71bc8e2a3b1f45d56dd65e4cChristian MaederprettyVersionNumber (VersionNumber v _) =
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder [keyword versionS, hcat $ punctuate dot $ map codeToken v]
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian MaederprettyLibName :: LibName -> [Doc]
ca074a78b8dcccbb8c419586787882f98d0c6163Christian MaederprettyLibName ln =
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder pretty (getLibId ln) : maybe [] prettyVersionNumber (libVersion ln)
ca074a78b8dcccbb8c419586787882f98d0c6163Christian Maederinstance Eq LibName where
ca074a78b8dcccbb8c419586787882f98d0c6163Christian Maeder ln1 == ln2 = compare ln1 ln2 == EQ
ca074a78b8dcccbb8c419586787882f98d0c6163Christian Maederinstance Ord LibName where
0be0db405c49906bd7057255069bf6df53395ac9Klaus Luettich compare = comparing getLibId
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maederinstance Pretty LibName where
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder pretty = fsep . prettyLibName
f2f9df2e17e70674f0bf426ed1763c973ee4cde0Christian Maederdata LinkPath a = LinkPath a [(LibName, Int)] deriving (Eq, Ord, Typeable, Data)
d946c1bfdd7d58aa7c023efe864d5999eb44a61bChristian Maedertype SLinkPath = LinkPath String
d946c1bfdd7d58aa7c023efe864d5999eb44a61bChristian MaederconvertFileToLibStr :: FilePath -> String
d946c1bfdd7d58aa7c023efe864d5999eb44a61bChristian MaederconvertFileToLibStr = mkLibStr . takeBaseName
d23b0cc79c0d204e6ec758dff8d0ba71c9f693f7Christian MaederstripLibChars :: String -> String
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian MaederstripLibChars = filter (\ c -> isAlphaNum c || elem c "'_/")
ca074a78b8dcccbb8c419586787882f98d0c6163Christian MaedermkLibStr :: String -> String
ca074a78b8dcccbb8c419586787882f98d0c6163Christian MaedermkLibStr = dropWhile (== '/') . stripLibChars