LibName.hs revision dc62afbf79603699b39b2387f48298634f642e67
1a38107941725211e7c3f051f7a8f5e12199f03acmaeder{-# LANGUAGE DeriveDataTypeable #-}
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder{- |
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian MaederModule : $Header$
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian MaederDescription : library names for HetCASL and development graphs
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian MaederCopyright : (c) Christian Maeder, DFKI GmbH 2008
98890889ffb2e8f6f722b00e265a211f13b5a861Corneliu-Claudiu ProdescuLicense : GPLv2 or higher, see LICENSE.txt
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian MaederMaintainer : Christian.Maeder@dfki.de
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian MaederStability : provisional
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian MaederPortability : portable
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian MaederAbstract syntax of HetCASL specification libraries
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder Follows Sect. II:2.2.5 of the CASL Reference Manual.
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder-}
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder
33f5512f0538c5ec4141205a8440ff6ba9e96139Christian Maedermodule Common.LibName
ab53b2d1773ac020b0df4cc9edeb0debe12e7a09cmaeder ( LibName (LibName, getLibId, locIRI, mimeType)
33f5512f0538c5ec4141205a8440ff6ba9e96139Christian Maeder , VersionNumber (VersionNumber)
33f5512f0538c5ec4141205a8440ff6ba9e96139Christian Maeder , LinkPath (LinkPath)
33f5512f0538c5ec4141205a8440ff6ba9e96139Christian Maeder , SLinkPath
33f5512f0538c5ec4141205a8440ff6ba9e96139Christian Maeder , isQualNameFrom
33f5512f0538c5ec4141205a8440ff6ba9e96139Christian Maeder , isQualName
33f5512f0538c5ec4141205a8440ff6ba9e96139Christian Maeder , mkQualName
33f5512f0538c5ec4141205a8440ff6ba9e96139Christian Maeder , unQualName
33f5512f0538c5ec4141205a8440ff6ba9e96139Christian Maeder , setFilePath
11c3a215d5cf043181e83929f1ce214df65cb587Christian Maeder , libToFileName
33f5512f0538c5ec4141205a8440ff6ba9e96139Christian Maeder , getFilePath
002961cfb5c53204887101239d2a47c83d596585Christian Maeder , iriLibName
9f7cd2db42cbc88253af8034f8d1fb83e1ecd4cdChristian Maeder , filePathToLibId
33f5512f0538c5ec4141205a8440ff6ba9e96139Christian Maeder , emptyLibName
33f5512f0538c5ec4141205a8440ff6ba9e96139Christian Maeder , convertFileToLibStr
33f5512f0538c5ec4141205a8440ff6ba9e96139Christian Maeder , mkLibStr
ab53b2d1773ac020b0df4cc9edeb0debe12e7a09cmaeder , setMimeType
ab53b2d1773ac020b0df4cc9edeb0debe12e7a09cmaeder , mkLibName
33f5512f0538c5ec4141205a8440ff6ba9e96139Christian Maeder ) where
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maederimport Common.Doc
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maederimport Common.DocUtils
92dc581bf568c9e225aa9d0570ab0a4b6ebdab69Christian Maederimport Common.Id
db6729e623b4053149084ccf4b35e5308ac7e359Christian Maederimport Common.IRI
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maederimport Common.Keywords
b1f2971b105e6da3f4722315e0a0e2abef96e66fcmaederimport Common.Percent
92dc581bf568c9e225aa9d0570ab0a4b6ebdab69Christian Maederimport Common.Utils
92dc581bf568c9e225aa9d0570ab0a4b6ebdab69Christian Maeder
8acac20a235839e60ea2d43709fce47de1c68bc1Christian Maederimport Data.Char
1a38107941725211e7c3f051f7a8f5e12199f03acmaederimport Data.Data
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maederimport Data.List
db6729e623b4053149084ccf4b35e5308ac7e359Christian Maederimport Data.Maybe
a43c1a7fa08c12524415386aa13a566cc9e53a4fChristian Maederimport Data.Ord
8acac20a235839e60ea2d43709fce47de1c68bc1Christian Maeder
8acac20a235839e60ea2d43709fce47de1c68bc1Christian Maederimport System.FilePath
92dc581bf568c9e225aa9d0570ab0a4b6ebdab69Christian Maeder
0789323dfca89bae8f710da5bba20220b9af2feaChristian MaederomTs :: [Token]
0789323dfca89bae8f710da5bba20220b9af2feaChristian MaederomTs = [genToken "OM"]
0789323dfca89bae8f710da5bba20220b9af2feaChristian Maeder
720eeee7c9d8442093c8d05bed743193eee906e0Christian MaedermkQualName :: SIMPLE_ID -> LibName -> Id -> Id
720eeee7c9d8442093c8d05bed743193eee906e0Christian MaedermkQualName nodeId ln i =
720eeee7c9d8442093c8d05bed743193eee906e0Christian Maeder Id omTs [i, simpleIdToId nodeId, libNameToId ln] $ posOfId i
0789323dfca89bae8f710da5bba20220b9af2feaChristian Maeder
720eeee7c9d8442093c8d05bed743193eee906e0Christian MaederisQualNameFrom :: SIMPLE_ID -> LibName -> Id -> Bool
720eeee7c9d8442093c8d05bed743193eee906e0Christian MaederisQualNameFrom nodeId ln i@(Id _ cs _) = case cs of
5dc46f6d0fdd8747d730f9e79a93978145ed43bbChristian Maeder _ : n : l : _ | isQualName i ->
720eeee7c9d8442093c8d05bed743193eee906e0Christian Maeder n == simpleIdToId nodeId && libNameToId ln == l
5dc46f6d0fdd8747d730f9e79a93978145ed43bbChristian Maeder _ -> True
248ab4f138caa9a594cd3fe0815e7fd4150701efChristian Maeder
0789323dfca89bae8f710da5bba20220b9af2feaChristian MaederisQualName :: Id -> Bool
0789323dfca89bae8f710da5bba20220b9af2feaChristian MaederisQualName (Id ts cs _) = case cs of
0789323dfca89bae8f710da5bba20220b9af2feaChristian Maeder _ : _ : _ -> ts == omTs
0789323dfca89bae8f710da5bba20220b9af2feaChristian Maeder _ -> False
92dc581bf568c9e225aa9d0570ab0a4b6ebdab69Christian Maeder
5dc46f6d0fdd8747d730f9e79a93978145ed43bbChristian MaederunQualName :: Id -> Id
5dc46f6d0fdd8747d730f9e79a93978145ed43bbChristian MaederunQualName j@(Id _ cs _) = case cs of
5dc46f6d0fdd8747d730f9e79a93978145ed43bbChristian Maeder i : _ | isQualName j -> i
5dc46f6d0fdd8747d730f9e79a93978145ed43bbChristian Maeder _ -> j
5dc46f6d0fdd8747d730f9e79a93978145ed43bbChristian Maeder
720eeee7c9d8442093c8d05bed743193eee906e0Christian MaederlibNameToId :: LibName -> Id
720eeee7c9d8442093c8d05bed743193eee906e0Christian MaederlibNameToId ln = let
11c3a215d5cf043181e83929f1ce214df65cb587Christian Maeder path = splitOn '/' $ libToFileName ln
720eeee7c9d8442093c8d05bed743193eee906e0Christian Maeder toTok s = Token s $ getRange ln
92dc581bf568c9e225aa9d0570ab0a4b6ebdab69Christian Maeder in mkId $ map toTok $ intersperse "/" path
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder
e49fd57c63845c7806860a9736ad09f6d44dbaedChristian Maederdata LibName = LibName
db6729e623b4053149084ccf4b35e5308ac7e359Christian Maeder { getLibId :: IRI
db6729e623b4053149084ccf4b35e5308ac7e359Christian Maeder , locIRI :: Maybe IRI
ab53b2d1773ac020b0df4cc9edeb0debe12e7a09cmaeder , mimeType :: Maybe String
db6729e623b4053149084ccf4b35e5308ac7e359Christian Maeder , libVersion :: Maybe VersionNumber }
1a38107941725211e7c3f051f7a8f5e12199f03acmaeder deriving (Typeable, Data)
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder
002961cfb5c53204887101239d2a47c83d596585Christian MaedeririLibName :: IRI -> LibName
ab53b2d1773ac020b0df4cc9edeb0debe12e7a09cmaedeririLibName i = LibName i Nothing Nothing Nothing
ab53b2d1773ac020b0df4cc9edeb0debe12e7a09cmaeder
ab53b2d1773ac020b0df4cc9edeb0debe12e7a09cmaedermkLibName :: IRI -> Maybe VersionNumber -> LibName
ab53b2d1773ac020b0df4cc9edeb0debe12e7a09cmaedermkLibName i v = (iriLibName i) { libVersion = v }
002961cfb5c53204887101239d2a47c83d596585Christian Maeder
e49fd57c63845c7806860a9736ad09f6d44dbaedChristian MaederemptyLibName :: String -> LibName
002961cfb5c53204887101239d2a47c83d596585Christian MaederemptyLibName s = iriLibName .
b7bba589fb78fe61379de93d531556c00da36cd9Christian Maeder fromMaybe (if null s then nullIRI else error $ "emptyLibName: " ++ s)
dc62afbf79603699b39b2387f48298634f642e67cmaeder $ parseIRICurie s
002961cfb5c53204887101239d2a47c83d596585Christian Maeder
ab53b2d1773ac020b0df4cc9edeb0debe12e7a09cmaeder-- | convert file name to IRI reference
002961cfb5c53204887101239d2a47c83d596585Christian MaederfilePathToIri :: FilePath -> IRI
11c3a215d5cf043181e83929f1ce214df65cb587Christian MaederfilePathToIri fp = fromMaybe (error $ "filePathToIri: " ++ fp)
dc62afbf79603699b39b2387f48298634f642e67cmaeder . parseIRIReference $ encodeBut (\ c -> isUnreserved c || elem c reserved) fp
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder
ab53b2d1773ac020b0df4cc9edeb0debe12e7a09cmaeder-- | use file name as library IRI
9f7cd2db42cbc88253af8034f8d1fb83e1ecd4cdChristian MaederfilePathToLibId :: FilePath -> IRI
01ddc4cad68fa84b4e9dd41089ad876329bae5b0Christian MaederfilePathToLibId = setAngles True . filePathToIri
9f7cd2db42cbc88253af8034f8d1fb83e1ecd4cdChristian Maeder
ab53b2d1773ac020b0df4cc9edeb0debe12e7a09cmaeder-- | insert file name as location IRI
1596a4d2cc01bff500afdd3789a43ec93210e81fChristian MaedersetFilePath :: FilePath -> LibName -> LibName
ab53b2d1773ac020b0df4cc9edeb0debe12e7a09cmaedersetFilePath fp ln = ln { locIRI = Just $ filePathToIri fp }
ab53b2d1773ac020b0df4cc9edeb0debe12e7a09cmaeder
ab53b2d1773ac020b0df4cc9edeb0debe12e7a09cmaeder-- | insert optional mime type
ab53b2d1773ac020b0df4cc9edeb0debe12e7a09cmaedersetMimeType :: Maybe String -> LibName -> LibName
ab53b2d1773ac020b0df4cc9edeb0debe12e7a09cmaedersetMimeType m ln = ln { mimeType = m }
429df04296fa571432f62cbfad6855e1420e0fd6Christian Maeder
ab53b2d1773ac020b0df4cc9edeb0debe12e7a09cmaeder-- | interpret library IRI as file path
11c3a215d5cf043181e83929f1ce214df65cb587Christian MaederlibToFileName :: LibName -> FilePath
01ddc4cad68fa84b4e9dd41089ad876329bae5b0Christian MaederlibToFileName = iriToStringUnsecure . setAngles False . getLibId
11c3a215d5cf043181e83929f1ce214df65cb587Christian Maeder
ab53b2d1773ac020b0df4cc9edeb0debe12e7a09cmaeder-- | extract location IRI as file name
fbc1e851413f39999a00a0d3be0edf75bbf42007Ewaryst SchulzgetFilePath :: LibName -> FilePath
db6729e623b4053149084ccf4b35e5308ac7e359Christian MaedergetFilePath = maybe "" iriToStringUnsecure . locIRI
fbc1e851413f39999a00a0d3be0edf75bbf42007Ewaryst Schulz
b410420153cc9ac37fb4ebb86699cba7fa19bc35Christian Maederdata VersionNumber = VersionNumber [String] Range
1a38107941725211e7c3f051f7a8f5e12199f03acmaeder deriving (Typeable, Data)
1a38107941725211e7c3f051f7a8f5e12199f03acmaeder -- pos: "version", start of first string
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder
e49fd57c63845c7806860a9736ad09f6d44dbaedChristian Maederinstance GetRange LibName where
ab53b2d1773ac020b0df4cc9edeb0debe12e7a09cmaeder getRange = getRange . getLibId
14d7908303969441ba30c2748de45f20345c6b31Christian Maeder
e49fd57c63845c7806860a9736ad09f6d44dbaedChristian Maederinstance Show LibName where
54a535fb81b928ac8f99a11bdcfa8998533204a5Christian Maeder show = show . hsep . prettyLibName
b410420153cc9ac37fb4ebb86699cba7fa19bc35Christian Maeder
b410420153cc9ac37fb4ebb86699cba7fa19bc35Christian MaederprettyVersionNumber :: VersionNumber -> [Doc]
b410420153cc9ac37fb4ebb86699cba7fa19bc35Christian MaederprettyVersionNumber (VersionNumber v _) =
b410420153cc9ac37fb4ebb86699cba7fa19bc35Christian Maeder [keyword versionS, hcat $ punctuate dot $ map codeToken v]
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder
54a535fb81b928ac8f99a11bdcfa8998533204a5Christian MaederprettyLibName :: LibName -> [Doc]
db6729e623b4053149084ccf4b35e5308ac7e359Christian MaederprettyLibName ln =
db6729e623b4053149084ccf4b35e5308ac7e359Christian Maeder pretty (getLibId ln) : maybe [] prettyVersionNumber (libVersion ln)
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder
e49fd57c63845c7806860a9736ad09f6d44dbaedChristian Maederinstance Eq LibName where
248ab4f138caa9a594cd3fe0815e7fd4150701efChristian Maeder ln1 == ln2 = compare ln1 ln2 == EQ
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder
e49fd57c63845c7806860a9736ad09f6d44dbaedChristian Maederinstance Ord LibName where
a43c1a7fa08c12524415386aa13a566cc9e53a4fChristian Maeder compare = comparing getLibId
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder
e49fd57c63845c7806860a9736ad09f6d44dbaedChristian Maederinstance Pretty LibName where
54a535fb81b928ac8f99a11bdcfa8998533204a5Christian Maeder pretty = fsep . prettyLibName
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder
1a38107941725211e7c3f051f7a8f5e12199f03acmaederdata LinkPath a = LinkPath a [(LibName, Int)] deriving (Eq, Ord, Typeable, Data)
e2e5830e2562de2f9a7daa31704fca25285180f0Ewaryst Schulz
831b0d8f47480be51d14f2cf122913507859f9c3Ewaryst Schulztype SLinkPath = LinkPath String
831b0d8f47480be51d14f2cf122913507859f9c3Ewaryst Schulz
8acac20a235839e60ea2d43709fce47de1c68bc1Christian MaederconvertFileToLibStr :: FilePath -> String
8acac20a235839e60ea2d43709fce47de1c68bc1Christian MaederconvertFileToLibStr = mkLibStr . takeBaseName
8acac20a235839e60ea2d43709fce47de1c68bc1Christian Maeder
8acac20a235839e60ea2d43709fce47de1c68bc1Christian MaederstripLibChars :: String -> String
8acac20a235839e60ea2d43709fce47de1c68bc1Christian MaederstripLibChars = filter (\ c -> isAlphaNum c || elem c "'_/")
8acac20a235839e60ea2d43709fce47de1c68bc1Christian Maeder
8acac20a235839e60ea2d43709fce47de1c68bc1Christian MaedermkLibStr :: String -> String
8acac20a235839e60ea2d43709fce47de1c68bc1Christian MaedermkLibStr = dropWhile (== '/') . stripLibChars