LibName.hs revision 01ddc4cad68fa84b4e9dd41089ad876329bae5b0
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
33f5512f0538c5ec4141205a8440ff6ba9e96139Christian Maeder ( LibName (LibName)
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
db6729e623b4053149084ccf4b35e5308ac7e359Christian Maeder , getLibId
db6729e623b4053149084ccf4b35e5308ac7e359Christian Maeder , locIRI
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
92dc581bf568c9e225aa9d0570ab0a4b6ebdab69Christian Maederimport Common.Utils
92dc581bf568c9e225aa9d0570ab0a4b6ebdab69Christian Maeder
8acac20a235839e60ea2d43709fce47de1c68bc1Christian Maederimport Data.Char
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 , libIdRange :: Range -- start of getLibId
db6729e623b4053149084ccf4b35e5308ac7e359Christian Maeder , locIRI :: Maybe IRI
db6729e623b4053149084ccf4b35e5308ac7e359Christian Maeder , libVersion :: Maybe VersionNumber }
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder
002961cfb5c53204887101239d2a47c83d596585Christian MaedeririLibName :: IRI -> LibName
002961cfb5c53204887101239d2a47c83d596585Christian MaedeririLibName i = LibName i nullRange Nothing Nothing
002961cfb5c53204887101239d2a47c83d596585Christian Maeder
e49fd57c63845c7806860a9736ad09f6d44dbaedChristian MaederemptyLibName :: String -> LibName
002961cfb5c53204887101239d2a47c83d596585Christian MaederemptyLibName s = iriLibName .
b7bba589fb78fe61379de93d531556c00da36cd9Christian Maeder fromMaybe (if null s then nullIRI else error $ "emptyLibName: " ++ s)
b7bba589fb78fe61379de93d531556c00da36cd9Christian Maeder $ parseIRIManchester s
002961cfb5c53204887101239d2a47c83d596585Christian Maeder
002961cfb5c53204887101239d2a47c83d596585Christian MaederfilePathToIri :: FilePath -> IRI
11c3a215d5cf043181e83929f1ce214df65cb587Christian MaederfilePathToIri fp = fromMaybe (error $ "filePathToIri: " ++ fp)
9005b07df2277a9fefca6868cd00c1c39533a9fbChristian Maeder . parseIRIReference $ escapeIRIString isUnescapedInIRI fp
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder
9f7cd2db42cbc88253af8034f8d1fb83e1ecd4cdChristian MaederfilePathToLibId :: FilePath -> IRI
01ddc4cad68fa84b4e9dd41089ad876329bae5b0Christian MaederfilePathToLibId = setAngles True . filePathToIri
9f7cd2db42cbc88253af8034f8d1fb83e1ecd4cdChristian Maeder
1596a4d2cc01bff500afdd3789a43ec93210e81fChristian MaedersetFilePath :: FilePath -> LibName -> LibName
1596a4d2cc01bff500afdd3789a43ec93210e81fChristian MaedersetFilePath fp ln =
002961cfb5c53204887101239d2a47c83d596585Christian Maeder ln { locIRI = Just $ filePathToIri fp }
429df04296fa571432f62cbfad6855e1420e0fd6Christian Maeder
11c3a215d5cf043181e83929f1ce214df65cb587Christian MaederlibToFileName :: LibName -> FilePath
01ddc4cad68fa84b4e9dd41089ad876329bae5b0Christian MaederlibToFileName = iriToStringUnsecure . setAngles False . getLibId
11c3a215d5cf043181e83929f1ce214df65cb587Christian Maeder
fbc1e851413f39999a00a0d3be0edf75bbf42007Ewaryst SchulzgetFilePath :: LibName -> FilePath
db6729e623b4053149084ccf4b35e5308ac7e359Christian MaedergetFilePath = maybe "" iriToStringUnsecure . locIRI
fbc1e851413f39999a00a0d3be0edf75bbf42007Ewaryst Schulz
b410420153cc9ac37fb4ebb86699cba7fa19bc35Christian Maederdata VersionNumber = VersionNumber [String] Range
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder -- pos: "version", start of first string
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder
e49fd57c63845c7806860a9736ad09f6d44dbaedChristian Maederinstance GetRange LibName where
db6729e623b4053149084ccf4b35e5308ac7e359Christian Maeder getRange = libIdRange
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
720eeee7c9d8442093c8d05bed743193eee906e0Christian Maederdata LinkPath a = LinkPath a [(LibName, Int)] deriving (Ord, Eq)
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