packages feed

lentil-1.0.0.0: src/Lentil/Parse/Syntaxes.hs

-----------------------------------------------------------------------------
-- |
-- Module      :  Lentil.Parse.Syntaxes
-- Copyright   :  © 2015 Francesco Ariis, Tomislav
-- License     :  GPLv3 (see the LICENSE file)
--
-- Languages descriptors
-----------------------------------------------------------------------------


module Lentil.Parse.Syntaxes where

import Lentil.Parse.Source
import Lentil.Types

import Text.Parsec
import Control.Applicative hiding (many)
import Prelude

import qualified System.FilePath as SF
import qualified Data.Char as C

type MaybePar = Maybe (ParSource [CommentString])

-- as langParser, with alias added
langParserAlias :: [Alias] -> String -> MaybePar
langParserAlias as fp = maybe (langParser fp) langParser (lookup ext as)
    where ext = map C.toLower (SF.takeExtension fp)

extensionList :: [Alias] -> [String]
extensionList as = concatMap fst languages ++ map fst as

-- TODO: add langparsers che sia estensibile e leggibile
--       a compilazione [u:2] [feature:intermediate]

langParser :: String -> MaybePar
langParser fp = lookupExt languages ext
    where ext = map C.toLower (SF.takeExtension fp)

languages :: [([String], MaybePar)]
languages = [ ([".hs", ".lhs",
                ".hsc", ".chs" ],       Just haskell),
              ([".cabal"],              Just haskell), -- cabal
              ([".elm"],                Just haskell), -- Elm
              ([".c", ".h"],            Just c),
              ([".cpp", ".hpp"],        Just c), -- C++
              ([".java"],               Just c), -- Java
              ([".js"],                 Just javascript),
              ([".ts"],                 Just javascript), -- TypeScript
              ([".pas", ".pp", ".inc"], Just pascal),
              ([".py"],                 Just python),
              ([".coffee"],             Just python), -- CoffeeScript
              ([".rb"],                 Just ruby),
              ([".pl", ".pm", ".t"],    Just perl),
              ([".sh"],                 Just perl), -- shell
              ([".nix"],                Just nix),
              ([".xml", ".html"],       Just xml),
              ([".txt"],                Just text) ]

-- todo multiline signature? [lint]
haskell, c, javascript, pascal, python, ruby :: ParSource [CommentString]
perl, nix :: ParSource [CommentString]
text :: ParSource [CommentString]
xml :: ParSource [CommentString]
haskell    = source $ ParSyntax ["--"] [("{-", "-}")]
                                ClangLike ['"'] ['\'']
c          = source $ ParSyntax ["//"] [("/*", "*/")]
                                ClangLike ['"'] ['\'']
javascript = source $ ParSyntax ["//"] [("/*", "*/")]
                                ClangLike ['"', '\''] []
pascal     = source $ ParSyntax ["//"] [("{",  "}" ), ("(*", "*)")]
                                SQLLike ['\''] []
python     = source $ ParSyntax ["#"] [("\"\"\"", "\"\"\"")]
                                ClangLike ['"', '\''] []
ruby       = source $ ParSyntax ["#"] [("=begin", "=end")]
                                ClangLike ['"', '\''] []
perl       = source $ ParSyntax ["#"] []
                                ClangLike ['"', '\''] []
nix        = source $ ParSyntax ["#"] [("/*", "*/")]
                                ClangLike ['"'] ['\'']
xml        = source $ ParSyntax [] [("<!--", "-->")]
                                ClangLike ['"', '\''] []
text       = (:[]) . MultiLine 1 <$> many anyChar

-- ANCILLARIES --

lookupExt :: [([String], MaybePar)] -> String -> MaybePar
lookupExt []          _ = Nothing
lookupExt ((ss,p):ds) e | elem e ss = p
                        | otherwise = lookupExt ds e