La première chose à définir sont les types de base
Le type est très simple. il comprend une chaîne de caractères et une liste d’entiers représentant les numéros de pages Une chaîne de caractères supplémentaire a pour rôle de donner à chaque entrée une équivalence de caractères pour le tri des noms dans l’index. Cette équivalence servira notamment a considérer les caractères accentués au même niveau que ceux qui ne le sont pas et à faire des conversion de certaines ligatures spécifiques à certaines langues (œ équivaudra aux caractères oe).
data IndexItem =
IndexItem { itemName :: String
, itemEqui :: (Section, String)
, itemPages :: [Int]
, itemContent :: [IndexSubItem]
}
Le type Section
permet de définir le type de section auquel appartient cette entrée:
Il est nécessaire de dériver type dans la classe Eq
afin de pouvoir utiliser les fonctions
==
et /=
dans certaines fonctions.
data Section = Letters
| Numbers
| Symbols
deriving (Eq)
Les entrées pourront également contenir des sous entrées qui elles même peuvent contenir des sous-sous-entrées. Ceci permet d’être compatible pleinement avec le paquet imakeidx qui autorise ces sous entrées.
data IndexItem =
IndexItem { itemName :: String
, itemEqui :: (Section, String)
, itemPages :: [Int]
, itemContent :: [IndexSubItem]
}
data IndexSubItem =
IndexSubItem { subItemName :: String
, subItemEqui :: (Section, String)
, subItemPages :: [Int]
, subItemContent :: [IndexSubSubItem]
}
Les sections contiennent les différents groupes d’entrées avec deux niveaux de groupements:
type Index = [IndexSection]
data IndexSection =
IndexSection { secTitle :: String
, secSubSections :: [IndexSubSection]
}
data IndexSubSection =
IndexSubSection { subSecTitle :: String
, subSecEntries :: [IndexItem]
}
Ce type comprend plusieurs champs contenant les différentes chaînes de caractères pour décrire le style de l’index. Parmi ces champs on aura:
data IndexStyle =
IndexStyle { idxPreamble :: String -- ^ The preamble
, idxPostamble :: String -- ^ 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 :: String -- ^ The prefix for the Layer 0 heading, in connection with 'IndexSection's
, idxHeadingSufL0 :: String -- ^ The suffix for the Layer 0 heading, in connection with 'IndexSection's
, idxHeadingPreL1 :: String -- ^ The prefix for the Layer 1 heading, in connection with 'IndexSubSection's
, idxHeadingSufL1 :: String -- ^ The suffix for the Layer 1 heading, in connection with 'IndexSubSection's
, idxSymhead :: String -- ^ The title for the "symbols" section
, idxNumhead :: String -- ^ The title for the "numbers" section
, idxGroupSkip0 :: String -- ^ The skip command after a layer 0 group ('IndexSection')
, idxGroupSkip1 :: String -- ^ The skip command after a layer 1 group ('IndexSubSection')
, idxItem0 :: String -- ^ The command to place before the index "items"
, idxItem1 :: String -- ^ The command to place before the index "subitems"
, idxItem2 :: String -- ^ The command to place before the index "subsubitems"
, idxItem01 :: String -- ^ The command to place between an index "items" and an index "subitems"
, idxItem12 :: String -- ^ The command to place between an index "subitems" and an index "subsubitems"
, idxDelim0 :: String -- ^ The delimiter between the name and the pages numbers for "items"
, idxDelim1 :: String -- ^ The delimiter between the name and the pages numbers for "subitems"
, idxDelim2 :: String -- ^ The delimiter between the name and the pages numbers for "subsubitems"
, idxDelimn :: String -- ^ The delimiter bewteen pages numbers.
}
Le type Heading
permet de définir le type d’en tête de la section
Il est nécessaire de dériver type dans la classe Eq
afin de pouvoir utiliser les fonctions
==
et /=
dans certaines fonctions.
data Heading = None -- ^ No heading
| UpperCase -- ^ Upper case heading
| LowerCase -- ^ Lower case heading
deriving (Eq)
Ce type permet de décrire une langue en donnant la liste les caractères considérés comme des lettres, comme des chiffres et comme des symboles.
La liste de symboles peut être définie ou non d’où l’utilisation du type Maybe
.
Dans le cas ou une liste de symboles est définie, les éléments de cette liste sont considérés comme symboles. Les caractères qui ne sont ni dans la liste de lettres, ni dans la liste de chiffres ni dans la liste des symboles ne sont pas listés dans l’index.
Dans le cas ou la liste des symboles n’est pas définie (Nothing
), tous les caractères qui ne sont ni des
lettres et ni des chiffres sont considérés comme des symboles et sont affichés.
data LangDef = LangDef { lstLetters :: String
, lstNumbers :: String
, lstSymbols :: Maybe String
, lstSubs :: [CharSubs]
, lstSecOrder :: [Section]
}
Ce type contient également l’ordre de sections à afficher.
Voila pour les types principaux qui seront utilisés dans le programme.