diff options
Diffstat (limited to 'indexing/hsindex/src/HsIndex/Types.hs')
-rw-r--r-- | indexing/hsindex/src/HsIndex/Types.hs | 205 |
1 files changed, 205 insertions, 0 deletions
diff --git a/indexing/hsindex/src/HsIndex/Types.hs b/indexing/hsindex/src/HsIndex/Types.hs new file mode 100644 index 0000000000..cc7340d7d2 --- /dev/null +++ b/indexing/hsindex/src/HsIndex/Types.hs @@ -0,0 +1,205 @@ +-- | +-- Module : HsIndex.Types +-- Copyright : Jean-Luc JOULIN 2018-2020 +-- License : General Public Licence (GPLv3) +-- Maintainer : Jean-Luc JOULIN <jean-luc-joulin@orange.fr> +-- Stability : alpha +-- Portability : portable +-- The definition of main types for HsIndex. + + + + +module HsIndex.Types where + + +import Text.Parsec +import Text.Parsec.String + +import Data.Char +import qualified Data.Text as T + +-- +-- The main data structure of an index is made like this +-- +-- * Section "" +-- +-- * Subsection "" +-- +-- * Entry "" [4] +-- +-- * Entry "" [17,12] +-- +-- * SubEntry "" [21] +-- +-- * SubSubEntry "" [22] +-- +-- * SubEntry "" [29] +-- +-- * Subsection "" +-- +-- +-- * Section B" +-- +-- * .... +-- +-- * .... +-- +-- +-- Sections are made to store SubSections starting with the same first letter. +-- +-- SubSections are made to store Entries starting with the same two letters. +-- +-- Entry is made to store a word, it's pages numbers and a list of SubEntries. It's equivalent to "imakeidx" items. +-- +-- SubEntry is made to store a word, it's pages numbers and a list of SubSubEntries. It's equivalent to "imakeidx" subitems. +-- +-- SubSubEntry is made to store a word and it's pages numbers. It's equivalent to "imakeidx" subsubitems. +-- +-- +-- This data structure is deep enough to comply with "imakeidx" LaTeX package. +-- + + + + + + + + + + + +-- | The type to describe the style of the Index +-- +-- preamble +-- +-- prefix heading layer1 suffix +-- +-- name1 delimiters 1, 3, 4 +-- +-- name2 delimiters 4, 9 +-- +-- name3 delimiters 9, 12 +-- +-- postamble +-- +data IndexStyle = + IndexStyle { idxPreamble :: T.Text -- ^ The preamble + , idxPostamble :: T.Text -- ^ The postamble + , idxHeadingFlag0 :: Heading -- ^ The flag for the layer 0 heading, in connection with 'IndexSection's + , idxHeadingFlag1 :: Heading -- ^ The flag for the layer 1 heading, in connection with 'IndexSubSection's + , idxHeadingPreL0 :: T.Text -- ^ The prefix for the Layer 0 heading, in connection with 'IndexSection's + , idxHeadingSufL0 :: T.Text -- ^ The suffix for the Layer 0 heading, in connection with 'IndexSection's + , idxHeadingPreL1 :: T.Text -- ^ The prefix for the Layer 1 heading, in connection with 'IndexSubSection's + , idxHeadingSufL1 :: T.Text -- ^ The suffix for the Layer 1 heading, in connection with 'IndexSubSection's + , idxSymhead :: T.Text -- ^ The title for the "symbols" section + , idxNumhead :: T.Text -- ^ The title for the "numbers" section + , idxGroupSkip0 :: T.Text -- ^ The skip command after a layer 0 group ('IndexSection') + , idxGroupSkip1 :: T.Text -- ^ The skip command after a layer 1 group ('IndexSubSection') + , idxItem0 :: T.Text -- ^ The command to place before the index "items" + , idxItem1 :: T.Text -- ^ The command to place before the index "subitems" + , idxItem2 :: T.Text -- ^ The command to place before the index "subsubitems" + , idxItem01 :: T.Text -- ^ The command to place between an index "items" and an index "subitems" + , idxItem12 :: T.Text -- ^ The command to place between an index "subitems" and an index "subsubitems" + , idxDelim0 :: T.Text -- ^ The delimiter between the name and the pages numbers for "items" + , idxDelim1 :: T.Text -- ^ The delimiter between the name and the pages numbers for "subitems" + , idxDelim2 :: T.Text -- ^ The delimiter between the name and the pages numbers for "subsubitems" + , idxDelimn :: T.Text -- ^ The delimiter between pages numbers. + , idxDelimr :: T.Text -- ^ The delimiter between pages range. + , idxEncapPre :: T.Text + , idxEncapSuf :: T.Text + } + + +-- | The list of chars to define a language. +data LangDef = LangDef { lstLetters :: [Char] -- ^ Chars considered as letters. + , lstNumbers :: [Char] -- ^ Chars considered as numbers. + , lstSymbols :: Maybe [Char] -- ^ Chars considered as symbols. + , lstSubs :: [(Char,String)] -- ^ List of substitutions to perform. + , lstSecOrder :: [Section] + } + + +-- | The style of a heading. +data Heading = None -- ^ No heading + | UpperCase -- ^ Upper case heading + | LowerCase -- ^ Lower case heading + deriving (Eq) + + +-- | The category of a section. +-- +-- A section can be one of these three categories : +-- +-- * Letters +-- +-- * Numbers +-- +-- * Symbols +-- +data Section = Letters + | Numbers + | Symbols + deriving (Eq, Show) + +-- | An alias for a list of 'IndexSection's +type Index = [IndexSection] + + +-- | The type for a section. +data IndexSection = + IndexSection { secTitle :: T.Text -- ^ The section title. + , secSubSections :: [IndexSubSection] -- ^ The subsections. + } + deriving (Show) + +-- | The type for a subsection. +data IndexSubSection = + IndexSubSection { subSecTitle :: T.Text -- ^ The subsection title. + , subSecEntries :: [IndexItem] -- ^ The entries. + } + deriving (Show) + +-- | The type for an item. +data IndexItem = + IndexItem { itemName :: T.Text -- ^ The name of the index item. + , itemEqui :: (Section, T.Text) -- ^ The equivalent name and the section of the item. + , itemPageCommand :: T.Text -- ^ The command to insert before page number + , itemPages :: [Int] -- ^ The pages numbers it refers to. + , itemContent :: [IndexSubItem] -- ^ The subitems. + } + deriving (Show) + +-- | The type for a subitem. +data IndexSubItem = + IndexSubItem { subItemName :: T.Text -- ^ The name of the index subitem. + , subItemEqui :: (Section, T.Text) -- ^ The equivalent name and the section of the subitem. + , subItemPageCommand :: T.Text -- ^ The command to insert before page number + , subItemPages :: [Int] -- ^ The pages numbers it refers to. + , subItemContent :: [IndexSubSubItem] -- ^ The subsubitems. + } + deriving (Show) + +-- | The type for a subsubitem. +data IndexSubSubItem = + IndexSubSubItem { subSubItemName :: T.Text -- ^ The name of the index subsubitem. + , subSubItemEqui :: (Section, T.Text) -- ^ The equivalent name and the section of the subsubitem. + , subSubItemPageCommand :: T.Text -- ^ The command to insert before page number + , subSubItemPages :: [Int] -- ^ The pages numbers it refers to. + } + deriving (Show) + + +-- | The type of index to use +data IndexType = StyleBasic -- ^ The default basic style + | StyleDouble -- ^ The default double header style + | Stylecustom FilePath -- ^ A custom style (path to the style file). + + +-- | A state to accumulate the 'Section' order. +data PermState = PermState{ order::[Section]} + +-- | The empty state +emptyPermState = PermState [] + |