diff options
Diffstat (limited to 'src/FSD/Control.hs')
-rw-r--r-- | src/FSD/Control.hs | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/src/FSD/Control.hs b/src/FSD/Control.hs new file mode 100644 index 0000000..2395f85 --- /dev/null +++ b/src/FSD/Control.hs @@ -0,0 +1,84 @@ +{- +Copyright (C) 2022 Yuchen Pei. + +This file is part of fsd. + +fsd is free software: you can redistribute it and/or modify it under +the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +fsd is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General +Public License for more details. + +You should have received a copy of the GNU Affero General Public +License along with fsd. If not, see <https://www.gnu.org/licenses/>. + +-} + +{-# LANGUAGE ImportQualifiedPost #-} +{-# LANGUAGE OverloadedStrings #-} + +module FSD.Control where + +import Data.Either +import Data.List.Extra +import Data.Text (Text) +import Data.Text qualified as T +import Debian.Control +import Debug.Trace + +-- import Text.Regex.TDFA + +-- parse sources, packages, translations and copyright +-- https://manpages.debian.org/bullseye/dpkg-dev/deb822.5.en.html +-- https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ + +readControl :: String -> Control +readControl = + fromRight (Control []) . parseControl "" + +-- stripControl . fromRight (Control []) . parseControl "" + +simpleFV :: String -> Text +simpleFV = T.pack + +-- multiple lines with nonsignficant whitespaces +foldedFV :: String -> Text +foldedFV = undefined + +-- multilines +-- may erroneously remove first char of first line (we'll see) +multilineFV :: String -> Text +multilineFV raw = + let (first, rest) = fSynFV raw + in T.strip $ T.concat [first, "\n", rest] + +-- whitespace separated list +wsListFV :: String -> [Text] +wsListFV = T.splitOn " " . foldedFV + +-- line-based lists +lbListFV :: String -> [Text] +lbListFV = fmap T.strip . T.splitOn "\n" . T.pack + +-- formatted text with synopsis +fSynFV :: String -> (Text, Text) +fSynFV raw = + let (synopsis, longRaw) = breakOn "\n" $ raw + paras = + if null longRaw + then [] + else T.splitOn "\n .\n" $ T.pack $ tail longRaw + full = + T.intercalate "\n\n" $ + (T.intercalate "\n" . fmap T.tail . T.lines) <$> paras + in (T.pack synopsis, full) + +firstFieldName :: Paragraph -> Maybe String +firstFieldName (Paragraph []) = Nothing +firstFieldName (Paragraph (Comment _ : xs)) = + firstFieldName (Paragraph xs) +firstFieldName (Paragraph (Field (name, _) : _)) = Just name |