-- | Defines functions to extract citation references from Notebook documents.
module Drasil.ExtractLsnDesc (extractLsnPlanBib) where

import Control.Lens ((^.))
import qualified Data.Set as S

import Drasil.Database (UID)
import Language.Drasil
import Drasil.System (System, HasSystem (systemdb))

import Drasil.GetChunks (resolveBibliography)
import Drasil.DocumentLanguage.Notebook.Core
import Drasil.ExtractCommon (extractChRefs)
import Drasil.ExtractDocDesc (getSec)
import Language.Drasil.Development (lnames)

findAllInConsSecs :: [Contents] -> [Section] -> S.Set UID
findAllInConsSecs :: [Contents] -> [Section] -> Set UID
findAllInConsSecs [Contents]
cs [Section]
ss = [Set UID] -> Set UID
forall (f :: * -> *) a. (Foldable f, Ord a) => f (Set a) -> Set a
S.unions ([Set UID] -> Set UID) -> [Set UID] -> Set UID
forall a b. (a -> b) -> a -> b
$
  [Contents] -> Set UID
forall a. HasContents a => [a] -> Set UID
extractChRefs [Contents]
cs Set UID -> [Set UID] -> [Set UID]
forall a. a -> [a] -> [a]
: (Section -> [Set UID]) -> [Section] -> [Set UID]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap ((Sentence -> Set UID) -> [Sentence] -> [Set UID]
forall a b. (a -> b) -> [a] -> [b]
map Sentence -> Set UID
lnames ([Sentence] -> [Set UID])
-> (Section -> [Sentence]) -> Section -> [Set UID]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Section -> [Sentence]
getSec) [Section]
ss

-- | Extracts citation reference 'UID's from a lesson chapter.
lsnChapCites :: LsnChapter -> S.Set UID
lsnChapCites :: LsnChapter -> Set UID
lsnChapCites (Intro (IntrodProg [Contents]
cs)) = [Contents] -> Set UID
forall a. HasContents a => [a] -> Set UID
extractChRefs [Contents]
cs
lsnChapCites (LearnObj (LrnObjProg [Contents]
cs)) = [Contents] -> Set UID
forall a. HasContents a => [a] -> Set UID
extractChRefs [Contents]
cs
lsnChapCites (Review (ReviewProg [Contents]
cs [Section]
ss)) = [Contents] -> [Section] -> Set UID
findAllInConsSecs [Contents]
cs [Section]
ss
lsnChapCites (CaseProb (CaseProbProg [Contents]
cs [Section]
ss)) = [Contents] -> [Section] -> Set UID
findAllInConsSecs [Contents]
cs [Section]
ss
lsnChapCites (Example (ExampleProg [Contents]
cs)) = [Contents] -> Set UID
forall a. HasContents a => [a] -> Set UID
extractChRefs [Contents]
cs
lsnChapCites (Smmry (SmmryProg [Contents]
cs)) = [Contents] -> Set UID
forall a. HasContents a => [a] -> Set UID
extractChRefs [Contents]
cs
lsnChapCites LsnChapter
BibSec = Set UID
forall a. Monoid a => a
mempty
lsnChapCites (Apndx (ApndxProg [Contents]
cs)) = [Contents] -> Set UID
forall a. HasContents a => [a] -> Set UID
extractChRefs [Contents]
cs

-- | Extract bibliography entries for a notebook based on the lesson
-- description. Scans the notebook for citation references and looks them up in
-- the database.
extractLsnPlanBib :: System -> LsnDesc -> BibRef
extractLsnPlanBib :: System -> LsnDesc -> BibRef
extractLsnPlanBib System
si = ChunkDB -> Set UID -> BibRef
resolveBibliography (System
si System -> Getting ChunkDB System ChunkDB -> ChunkDB
forall s a. s -> Getting a s a -> a
^. Getting ChunkDB System ChunkDB
forall c. HasSystem c => Lens' c ChunkDB
Lens' System ChunkDB
systemdb) (Set UID -> BibRef) -> (LsnDesc -> Set UID) -> LsnDesc -> BibRef
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LsnDesc -> Set UID
extractAllRefs
  where
    extractAllRefs :: LsnDesc -> Set UID
extractAllRefs = [Set UID] -> Set UID
forall (f :: * -> *) a. (Foldable f, Ord a) => f (Set a) -> Set a
S.unions ([Set UID] -> Set UID)
-> (LsnDesc -> [Set UID]) -> LsnDesc -> Set UID
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (LsnChapter -> Set UID) -> LsnDesc -> [Set UID]
forall a b. (a -> b) -> [a] -> [b]
map LsnChapter -> Set UID
lsnChapCites