|
1 | | -{-# LANGUAGE DeriveAnyClass, DeriveGeneric, KindSignatures #-} |
| 1 | +{-# LANGUAGE DeriveAnyClass, DeriveGeneric, KindSignatures, LambdaCase #-} |
2 | 2 | module Data.Language |
3 | 3 | ( Language (..) |
4 | 4 | , SLanguage (..) |
5 | 5 | , extensionsForLanguage |
6 | | - , parseLanguage |
7 | 6 | , knownLanguage |
8 | 7 | , languageForFilePath |
9 | 8 | , pathIsMinified |
10 | 9 | , supportedExts |
11 | 10 | , codeNavLanguages |
| 11 | + , textToLanguage |
| 12 | + , languageToText |
12 | 13 | ) where |
13 | 14 |
|
14 | 15 | import Data.Aeson |
@@ -78,67 +79,61 @@ instance SLanguage 'PHP where |
78 | 79 |
|
79 | 80 | instance FromJSON Language where |
80 | 81 | parseJSON = withText "Language" $ \l -> |
81 | | - pure $ fromMaybe Unknown (parseLanguage l) |
82 | | - |
83 | | -parseLanguage :: Text -> Maybe Language |
84 | | -parseLanguage l = case T.toLower l of |
85 | | - "go" -> Just Go |
86 | | - "haskell" -> Just Haskell |
87 | | - "java" -> Just Java |
88 | | - "javascript" -> Just JavaScript |
89 | | - "json" -> Just JSON |
90 | | - "jsx" -> Just JSX |
91 | | - "markdown" -> Just Markdown |
92 | | - "python" -> Just Python |
93 | | - "ruby" -> Just Ruby |
94 | | - "typescript" -> Just TypeScript |
95 | | - "php" -> Just PHP |
96 | | - _ -> Nothing |
| 82 | + pure $ textToLanguage l |
97 | 83 |
|
98 | 84 | -- | Predicate failing on 'Unknown' and passing in all other cases. |
99 | 85 | knownLanguage :: Language -> Bool |
100 | 86 | knownLanguage = (/= Unknown) |
101 | 87 |
|
102 | 88 | extensionsForLanguage :: Language -> [String] |
103 | | -extensionsForLanguage language = case language of |
104 | | - Go -> [".go"] |
105 | | - Haskell -> [".hs"] |
106 | | - JavaScript -> [".js", ".mjs"] |
107 | | - PHP -> [".php", ".phpt"] |
108 | | - Python -> [".py"] |
109 | | - Ruby -> [".rb"] |
110 | | - TypeScript -> [".ts"] |
111 | | - TSX -> [".tsx", ".d.tsx"] |
112 | | - JSX -> [".jsx"] |
113 | | - _ -> [] |
| 89 | +extensionsForLanguage language = T.unpack <$> maybe mempty Lingo.languageExtensions (Map.lookup (languageToText language) Lingo.languages) |
114 | 90 |
|
115 | 91 | -- | Return a language based on a FilePath's extension. |
116 | 92 | languageForFilePath :: FilePath -> Language |
117 | | -languageForFilePath path = case Lingo.languageName <$> Lingo.languageForPath path of |
118 | | - Just "Go" -> Go |
119 | | - Just "Haskell" -> Haskell |
120 | | - Just "Java" -> Java |
121 | | - Just "JavaScript" -> JavaScript |
122 | | - Just "JSON" -> JSON |
123 | | - Just "JSX" -> JSX |
124 | | - Just "Markdown" -> Markdown |
125 | | - Just "PHP" -> PHP |
126 | | - Just "Python" -> Python |
127 | | - Just "Ruby" -> Ruby |
128 | | - Just "TSX" -> TSX |
129 | | - Just "TypeScript" -> TypeScript |
130 | | - _ -> Unknown |
| 93 | +languageForFilePath path = maybe Unknown (textToLanguage . Lingo.languageName) (Lingo.languageForPath path) |
131 | 94 |
|
132 | 95 | supportedExts :: [String] |
133 | 96 | supportedExts = foldr append mempty supportedLanguages |
134 | 97 | where |
135 | 98 | append (Just l) b = fmap T.unpack (Lingo.languageExtensions l) <> b |
136 | 99 | append Nothing b = b |
137 | | - supportedLanguages = fmap lookup ["Go", "Ruby", "Python", "JavaScript", "TypeScript", "PHP"] |
| 100 | + supportedLanguages = fmap lookup (languageToText <$> codeNavLanguages) |
138 | 101 | lookup k = Map.lookup k Lingo.languages |
139 | 102 |
|
140 | 103 | codeNavLanguages :: [Language] |
141 | 104 | codeNavLanguages = [Go, Ruby, Python, JavaScript, TypeScript, PHP] |
142 | 105 |
|
143 | 106 | pathIsMinified :: FilePath -> Bool |
144 | 107 | pathIsMinified = isExtensionOf ".min.js" |
| 108 | + |
| 109 | +languageToText :: Language -> T.Text |
| 110 | +languageToText = \case |
| 111 | + Unknown -> "Unknown" |
| 112 | + Go -> "Go" |
| 113 | + Haskell -> "Haskell" |
| 114 | + Java -> "Java" |
| 115 | + JavaScript -> "JavaScript" |
| 116 | + JSON -> "JSON" |
| 117 | + JSX -> "JSX" |
| 118 | + Markdown -> "Markdown" |
| 119 | + Python -> "Python" |
| 120 | + Ruby -> "Ruby" |
| 121 | + TypeScript -> "TypeScript" |
| 122 | + TSX -> "TSX" |
| 123 | + PHP -> "PHP" |
| 124 | + |
| 125 | +textToLanguage :: T.Text -> Language |
| 126 | +textToLanguage = \case |
| 127 | + "Go" -> Go |
| 128 | + "Haskell" -> Haskell |
| 129 | + "Java" -> Java |
| 130 | + "JavaScript" -> JavaScript |
| 131 | + "JSON" -> JSON |
| 132 | + "JSX" -> JSX |
| 133 | + "Markdown" -> Markdown |
| 134 | + "Python" -> Python |
| 135 | + "Ruby" -> Ruby |
| 136 | + "TypeScript" -> TypeScript |
| 137 | + "TSX" -> TSX |
| 138 | + "PHP" -> PHP |
| 139 | + _ -> Unknown |
0 commit comments