{- 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 . -} {-# 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