LibName.hs revision 1a38107941725211e7c3f051f7a8f5e12199f03a
43b4c41fbb07705c9df321221ab9cb9832460407Christian Maeder{-# LANGUAGE DeriveDataTypeable #-}
25cc5fbba63f84b47e389af749f55abbbde71c8cChristian Maeder{- |
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
43b4c41fbb07705c9df321221ab9cb9832460407Christian Maeder
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian MaederAbstract syntax of HetCASL specification libraries
d8c71aacc9f1c8cd40a8ad8dcdad9be8854b849fChristian Maeder Follows Sect. II:2.2.5 of the CASL Reference Manual.
f2f9df2e17e70674f0bf426ed1763c973ee4cde0Christian Maeder-}
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maedermodule Common.LibName
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder ( LibName (LibName, getLibId, locIRI, mimeType)
36f63902db2b3463faa9f59912ad106e2d5aaa24Klaus Luettich , VersionNumber (VersionNumber)
a737caf82de97c1907027c03e4b4509eb492b4b8Christian Maeder , LinkPath (LinkPath)
a737caf82de97c1907027c03e4b4509eb492b4b8Christian Maeder , SLinkPath
a737caf82de97c1907027c03e4b4509eb492b4b8Christian Maeder , isQualNameFrom
a737caf82de97c1907027c03e4b4509eb492b4b8Christian Maeder , isQualName
a737caf82de97c1907027c03e4b4509eb492b4b8Christian Maeder , mkQualName
a737caf82de97c1907027c03e4b4509eb492b4b8Christian Maeder , unQualName
a737caf82de97c1907027c03e4b4509eb492b4b8Christian Maeder , setFilePath
3e61f574717499939bd8e0ff538ea9e7b72d4e2dKlaus Luettich , libToFileName
96646aed2ae087b942ae23f15bbe729a8f7c43d3Christian Maeder , getFilePath
01e383014b555bbcf639c0ca60c5810b3eff83c0Christian Maeder , iriLibName
3b06e23643a9f65390cb8c1caabe83fa7e87a708Till Mossakowski , filePathToLibId
df29370ae8d8b41587957f6bcdcb43a3f1927e47Christian Maeder , emptyLibName
bd54a9917cd87169b8e40bcc5616c537fed85815Christian Maeder , convertFileToLibStr
bd54a9917cd87169b8e40bcc5616c537fed85815Christian Maeder , mkLibStr
ce8b15da31cd181b7e90593cbbca98f47eda29d6Till Mossakowski , setMimeType
e7757995211bd395dc79d26fe017d99375f7d2a6Christian Maeder , mkLibName
e7757995211bd395dc79d26fe017d99375f7d2a6Christian Maeder ) where
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maederimport Common.Doc
ac0bbbcb2774629bb87986e69cf53d3402c5f575Christian Maederimport Common.DocUtils
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maederimport Common.Id
2e2094a642e3775b0d76b890556407941d3a53b6Christian Maederimport Common.IRI
2e2094a642e3775b0d76b890556407941d3a53b6Christian Maederimport Common.Keywords
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maederimport Common.Percent
e8db9a65830cf71504e33c6f441a67b4d184a3caChristian Maederimport Common.Utils
c0c2380bced8159ff0297ece14eba948bd236471Christian Maeder
8410667510a76409aca9bb24ff0eda0420088274Christian Maederimport Data.Char
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maederimport Data.Data
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maederimport Data.List
8410667510a76409aca9bb24ff0eda0420088274Christian Maederimport Data.Maybe
404166b9366552e9ec5abb87a37c76ec8a815fb7Klaus Luettichimport Data.Ord
eee4b2ee739f163e09d6af6e45c025681e6c01a0Christian Maeder
3e61f574717499939bd8e0ff538ea9e7b72d4e2dKlaus Luettichimport System.FilePath
3e61f574717499939bd8e0ff538ea9e7b72d4e2dKlaus Luettich
4d56f2fa72e4aec20eb827c11ed49c8cbb7014bdChristian MaederomTs :: [Token]
8ef75f1cc0437656bf622cec5ac9e8ea221da8f2Christian MaederomTs = [genToken "OM"]
8ef75f1cc0437656bf622cec5ac9e8ea221da8f2Christian Maeder
404166b9366552e9ec5abb87a37c76ec8a815fb7Klaus LuettichmkQualName :: SIMPLE_ID -> LibName -> Id -> Id
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian MaedermkQualName nodeId ln i =
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder Id omTs [i, simpleIdToId nodeId, libNameToId ln] $ posOfId i
55adfe57a4de1f36adc3e3bfc16f342e44a7d444Christian Maeder
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
e593b89bfd4952698dc37feced21cefe869d87a2Christian Maeder _ -> True
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder
e7757995211bd395dc79d26fe017d99375f7d2a6Christian MaederisQualName :: Id -> Bool
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian MaederisQualName (Id ts cs _) = case cs of
0206ab93ef846e4e0885996d052b9b73b9dc66b0Christian Maeder _ : _ : _ -> ts == omTs
f13d1e86e58da53680e78043e8df182eed867efbChristian Maeder _ -> False
0206ab93ef846e4e0885996d052b9b73b9dc66b0Christian Maeder
96646aed2ae087b942ae23f15bbe729a8f7c43d3Christian MaederunQualName :: Id -> Id
e7757995211bd395dc79d26fe017d99375f7d2a6Christian MaederunQualName j@(Id _ cs _) = case cs of
e7757995211bd395dc79d26fe017d99375f7d2a6Christian Maeder i : _ | isQualName j -> i
c6fcd42c6d6d9dae8c7835c24fcb7ce8531a9050Christian Maeder _ -> j
31c49f2fa23d4ac089f35145d80a224deb6ea7e4Till Mossakowski
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
50515239e7e190f4a34ca581dd685d002148fbddChristian Maeder
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)
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder
9e748851c150e1022fb952bab3315e869aaf0214Christian MaedeririLibName :: IRI -> LibName
9e748851c150e1022fb952bab3315e869aaf0214Christian MaedeririLibName i = LibName i Nothing Nothing Nothing
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian MaedermkLibName :: IRI -> Maybe VersionNumber -> LibName
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian MaedermkLibName i v = (iriLibName i) { libVersion = v }
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian MaederemptyLibName :: String -> LibName
0206ab93ef846e4e0885996d052b9b73b9dc66b0Christian MaederemptyLibName s = iriLibName .
9e748851c150e1022fb952bab3315e869aaf0214Christian Maeder fromMaybe (if null s then nullIRI else error $ "emptyLibName: " ++ s)
9e748851c150e1022fb952bab3315e869aaf0214Christian Maeder $ parseIRIManchester s
f1541d4a151dbd08002dbd14e7eb1d5dde253689Christian Maeder
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
c0c2380bced8159ff0297ece14eba948bd236471Christian Maeder
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder-- | use file name as library IRI
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian MaederfilePathToLibId :: FilePath -> IRI
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian MaederfilePathToLibId = setAngles True . filePathToIri
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder-- | insert file name as location IRI
9e748851c150e1022fb952bab3315e869aaf0214Christian MaedersetFilePath :: FilePath -> LibName -> LibName
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian MaedersetFilePath fp ln = ln { locIRI = Just $ filePathToIri fp }
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder-- | insert optional mime type
c0c2380bced8159ff0297ece14eba948bd236471Christian MaedersetMimeType :: Maybe String -> LibName -> LibName
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian MaedersetMimeType m ln = ln { mimeType = m }
ca074a78b8dcccbb8c419586787882f98d0c6163Christian Maeder
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder-- | interpret library IRI as file path
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian MaederlibToFileName :: LibName -> FilePath
4017ebc0f692820736d796af3110c3b3018c108aChristian MaederlibToFileName = iriToStringUnsecure . setAngles False . getLibId
62ea3d19927e5ce1318d62931a8427d8930f1576Christian Maeder
62ea3d19927e5ce1318d62931a8427d8930f1576Christian Maeder-- | extract location IRI as file name
4017ebc0f692820736d796af3110c3b3018c108aChristian MaedergetFilePath :: LibName -> FilePath
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian MaedergetFilePath = maybe "" iriToStringUnsecure . locIRI
6ff7a91875597d6e4dfaa68c79187d01473e8341Christian Maeder
6ff7a91875597d6e4dfaa68c79187d01473e8341Christian Maederdata VersionNumber = VersionNumber [String] Range
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder deriving (Typeable, Data)
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder -- pos: "version", start of first string
4017ebc0f692820736d796af3110c3b3018c108aChristian Maeder
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maederinstance GetRange LibName where
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder getRange = getRange . getLibId
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maederinstance Show LibName where
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder show = show . hsep . prettyLibName
88318aafc287e92931dceffbb943d58a9310001dChristian Maeder
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian MaederprettyVersionNumber :: VersionNumber -> [Doc]
a3c6d8e0670bf2aa71bc8e2a3b1f45d56dd65e4cChristian MaederprettyVersionNumber (VersionNumber v _) =
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder [keyword versionS, hcat $ punctuate dot $ map codeToken v]
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian MaederprettyLibName :: LibName -> [Doc]
ca074a78b8dcccbb8c419586787882f98d0c6163Christian MaederprettyLibName ln =
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder pretty (getLibId ln) : maybe [] prettyVersionNumber (libVersion ln)
ca074a78b8dcccbb8c419586787882f98d0c6163Christian Maeder
ca074a78b8dcccbb8c419586787882f98d0c6163Christian Maederinstance Eq LibName where
ca074a78b8dcccbb8c419586787882f98d0c6163Christian Maeder ln1 == ln2 = compare ln1 ln2 == EQ
4017ebc0f692820736d796af3110c3b3018c108aChristian Maeder
ca074a78b8dcccbb8c419586787882f98d0c6163Christian Maederinstance Ord LibName where
0be0db405c49906bd7057255069bf6df53395ac9Klaus Luettich compare = comparing getLibId
ca074a78b8dcccbb8c419586787882f98d0c6163Christian Maeder
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maederinstance Pretty LibName where
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder pretty = fsep . prettyLibName
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder
f2f9df2e17e70674f0bf426ed1763c973ee4cde0Christian Maederdata LinkPath a = LinkPath a [(LibName, Int)] deriving (Eq, Ord, Typeable, Data)
d946c1bfdd7d58aa7c023efe864d5999eb44a61bChristian Maeder
d946c1bfdd7d58aa7c023efe864d5999eb44a61bChristian Maedertype SLinkPath = LinkPath String
d946c1bfdd7d58aa7c023efe864d5999eb44a61bChristian Maeder
d946c1bfdd7d58aa7c023efe864d5999eb44a61bChristian MaederconvertFileToLibStr :: FilePath -> String
d946c1bfdd7d58aa7c023efe864d5999eb44a61bChristian MaederconvertFileToLibStr = mkLibStr . takeBaseName
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder
d23b0cc79c0d204e6ec758dff8d0ba71c9f693f7Christian MaederstripLibChars :: String -> String
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian MaederstripLibChars = filter (\ c -> isAlphaNum c || elem c "'_/")
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder
ca074a78b8dcccbb8c419586787882f98d0c6163Christian MaedermkLibStr :: String -> String
ca074a78b8dcccbb8c419586787882f98d0c6163Christian MaedermkLibStr = dropWhile (== '/') . stripLibChars
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder