{-# LANGUAGE PostfixOperators #-}
-- | About Drasil
module Drasil.Website.About where

import Language.Drasil

-- * About Section

-- | Creates the about section.
aboutSec :: Reference -> Reference -> Reference -> Reference -> Reference -> Reference -> Reference -> Reference -> 
  Reference -> Reference -> Section
aboutSec :: Reference
-> Reference
-> Reference
-> Reference
-> Reference
-> Reference
-> Reference
-> Reference
-> Reference
-> Reference
-> Section
aboutSec Reference
csRef Reference
docRef Reference
analysisSecRef Reference
repoRef Reference
wikiRef Reference
infoEncodingWiki Reference
chunksWiki Reference
recipesWiki Reference
paperGOOL Reference
papersWiki = 
  Sentence -> [Contents] -> [Section] -> Reference -> Section
section (String -> Sentence
S String
"About") -- Title
  (forall a b. (a -> b) -> [a] -> [b]
map Sentence -> Contents
mkParagraph [Reference -> Reference -> Sentence
aboutParagraph1 Reference
repoRef Reference
wikiRef, Reference -> Reference -> Reference -> Sentence
aboutParagraph2 Reference
csRef Reference
docRef Reference
analysisSecRef, Sentence
aboutParagraph3] 
  forall a. [a] -> [a] -> [a]
++ [Contents
currentlyGeneratedArtifacts] forall a. [a] -> [a] -> [a]
++ [Sentence -> Contents
mkParagraph Sentence
aboutParagraph4] forall a. [a] -> [a] -> [a]
++ [Contents
futureGeneratedArtifacts] forall a. [a] -> [a] -> [a]
++ forall a b. (a -> b) -> [a] -> [b]
map Sentence -> Contents
mkParagraph 
  [Reference -> Sentence
aboutParagraph5 Reference
infoEncodingWiki, Reference -> Sentence
aboutParagraph6 Reference
chunksWiki, Reference -> Sentence
aboutParagraph7 Reference
recipesWiki, Reference -> Sentence
aboutParagraph8 Reference
paperGOOL, 
  Reference -> Sentence
aboutParagraph9 Reference
papersWiki]) -- Contents
  [] forall a b. (a -> b) -> a -> b
$ String -> Sentence -> Reference
makeSecRef String
"About" forall a b. (a -> b) -> a -> b
$ String -> Sentence
S String
"About" -- Section reference

-- | Paragraph to about Drasil and its goals.
aboutParagraph1 :: Reference -> Reference -> Sentence
aboutParagraph1 :: Reference -> Reference -> Sentence
aboutParagraph1 Reference
repoRef Reference
wikiRef = String -> Sentence
S String
"Drasil is a framework for generating all of the software artifacts \
  \from a stable knowledge base, focusing currently on scientific software. The main goals are to reduce knowledge \
  \duplication and improve traceability. The artifacts are generated from a common knowledge-base using recipes \
  \written in a Domain-Specific Language (DSL). These recipes allow us to specify which pieces of \
  \knowledge should be used in which artifacts, how to transform them, and more. For more information on the design, documentation, \
  \useage, and specifics of Drasil, please visit the" Sentence -> Sentence -> Sentence
+:+ forall r.
(HasUID r, HasRefAddress r, HasShortName r) =>
r -> Sentence -> Sentence
namedRef Reference
repoRef (String -> Sentence
S String
"GitHub repository") Sentence -> Sentence -> Sentence
+:+ String -> Sentence
S String
"or the" Sentence -> Sentence -> Sentence
+:+ 
  (forall r.
(HasUID r, HasRefAddress r, HasShortName r) =>
r -> Sentence -> Sentence
namedRef Reference
wikiRef (String -> Sentence
S String
"GitHub Wiki") !.)

-- | Paragraph to describe the layout of the rest of the Drasil website.
aboutParagraph2 :: Reference -> Reference -> Reference -> Sentence
aboutParagraph2 :: Reference -> Reference -> Reference -> Sentence
aboutParagraph2 Reference
caseStudySecRef Reference
docsRef Reference
analysisSecRef = String -> Sentence
S String
"This webpage is designed to contain the most up to date" Sentence -> Sentence -> Sentence
+:+
  SepType -> FoldType -> [Sentence] -> Sentence
foldlList SepType
Comma FoldType
List (forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith (\Reference
x String
y -> forall r.
(HasUID r, HasRefAddress r, HasShortName r) =>
r -> Sentence -> Sentence
namedRef Reference
x (String -> Sentence
S String
y)) [Reference
caseStudySecRef, Reference
docsRef, Reference
analysisSecRef] [String
"case study artifacts", 
  String
"Haddock documentation", String
"Drasil analysis"]) Sentence -> Sentence -> Sentence
+:+ String -> Sentence
S String
"from the Drasil repository. \
  \The case study artifacts include the Software Requirements Specification (SRS) for each case study, \
  \which specifies what the program sets out to achieve. \
  \The Haddock Documentation section contains the current documentation for the Drasil framework. \
  \The package dependency graphs shows the hierarchy of modules within each package."
  -- \The footer of this page contains the continuous integration build of the project, \
  -- \as well as the commit number that the build and artifacts are based off of.

-- | Lists artifacts that Drasil generates
aboutParagraph3 :: Sentence
aboutParagraph3 :: Sentence
aboutParagraph3 = String -> Sentence
S String
"The following is a list of artifacts that Drasil currently generates:" 

currentlyGeneratedArtifacts :: Contents
currentlyGeneratedArtifacts :: Contents
currentlyGeneratedArtifacts = [Sentence] -> Contents
enumBulletU forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map [Sentence] -> Sentence
foldlSent_
  [[String -> Sentence
S String
"SRS"],
  [String -> Sentence
S String
"code"],
  [String -> Sentence
S String
"README"],
  [String -> Sentence
S String
"Makefile"]]

-- | Lists artifacts that we hope to generate with Drasil
aboutParagraph4 :: Sentence
aboutParagraph4 :: Sentence
aboutParagraph4 = String -> Sentence
S String
"We hope to generate the following artifacts in the future:" 

futureGeneratedArtifacts :: Contents
futureGeneratedArtifacts :: Contents
futureGeneratedArtifacts = [Sentence] -> Contents
enumBulletU forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map [Sentence] -> Sentence
foldlSent_
  [[String -> Sentence
S String
"License"],
  [String -> Sentence
S String
"Installation Instructions"],
  [String -> Sentence
S String
"Dependency List"],
  [String -> Sentence
S String
"Authors"],
  [String -> Sentence
S String
"Getting Started / User Manual"],
  [String -> Sentence
S String
"Release Info"],
  [String -> Sentence
S String
"Design Documentation"],
  [String -> Sentence
S String
"Build Scripts"],
  [String -> Sentence
S String
"Test Cases"]]

-- | Paragraph describing information encoding
aboutParagraph5 :: Reference -> Sentence
aboutParagraph5 :: Reference -> Sentence
aboutParagraph5 Reference
infoEncodingWiki = String -> Sentence
S String
"As described in the" Sentence -> Sentence -> Sentence
+:+ forall r.
(HasUID r, HasRefAddress r, HasShortName r) =>
r -> Sentence -> Sentence
namedRef Reference
infoEncodingWiki (String -> Sentence
S String
"Information Encoding") Sentence -> Sentence -> Sentence
+:+ String -> Sentence
S String
" wiki page, \
  \Drasil uses specific terminology to address types of \
  \knowledge for the purpose of encoding information, since we know that we want to eventually generate words, sentences, paragraphs, \
  \whole documents with headings, references, formulas, tables, graphs, and code. This is done by trying to understand the basic 'units' \
  \of all artifacts, and methods for composing larger structures from these units. The removal of duplicate units is an important feature \
  \of this methodology. The basic building blocks of the methodology include different expressions for units with a specific meaning. \
  \These are built into ontologies of domains that address broader knowledge. Chunks form a fundamental part of such ontologies."

-- | Paragraph describing chunks
aboutParagraph6 :: Reference -> Sentence
aboutParagraph6 :: Reference -> Sentence
aboutParagraph6 Reference
chunksWiki = String -> Sentence
S String
"As described in the" Sentence -> Sentence -> Sentence
+:+ forall r.
(HasUID r, HasRefAddress r, HasShortName r) =>
r -> Sentence -> Sentence
namedRef Reference
chunksWiki (String -> Sentence
S String
"Chunks") Sentence -> Sentence -> Sentence
+:+ String -> Sentence
S String
"wiki page, a chunk is a data type specialized \
  \in holding a specific type of information for \
  \a specific purpose so that knowledge may be used in generated models, definitions, and theories. Chunks are usually made up of several \
  \lower-level types that hold lower-lever information; when contained together, these pieces of lower-level information hold a new specific \
  \purpose. The structure of a chunk can be thought of as a wrapper of information, and this is all implemented using Haskell's record-type \
  \syntax. Recipes transform the acquired knowledge into a usable format."

-- | Paragraph describing recipes
aboutParagraph7 :: Reference -> Sentence
aboutParagraph7 :: Reference -> Sentence
aboutParagraph7 Reference
recipesWiki= String -> Sentence
S String
"As described in the" Sentence -> Sentence -> Sentence
+:+ forall r.
(HasUID r, HasRefAddress r, HasShortName r) =>
r -> Sentence -> Sentence
namedRef Reference
recipesWiki (String -> Sentence
S String
"Recipes") Sentence -> Sentence -> Sentence
+:+ String -> Sentence
S String
"wiki page, recipes are instructions that \
  \unpackage necessary information from chunks and send \
  \that information to Drasil generators/printers to build complete artifacts. When an artifact needs to be changed, the recipe is modified to \
  \unpackage the additional necessary information from a chunk, or alternatively to omit unpackaging information that is no longer required."

-- | Paragraph describing GOOL
aboutParagraph8 :: Reference -> Sentence
aboutParagraph8 :: Reference -> Sentence
aboutParagraph8 Reference
paperGOOL = String -> Sentence
S String
"As described in the" Sentence -> Sentence -> Sentence
+:+ forall r.
(HasUID r, HasRefAddress r, HasShortName r) =>
r -> Sentence -> Sentence
namedRef Reference
paperGOOL (String -> Sentence
S String
"GOOL") Sentence -> Sentence -> Sentence
+:+ String -> Sentence
S String
"paper, this is a Generic Object-Oriented Language \
  \that provides intermediary assistance in code \
  \generation, allowing Drasil to more efficiently generate code in several languages, including Python, Java, C-Sharp, and C++."

-- | Paragraph providing a link to Drasil papers and documents
aboutParagraph9 :: Reference -> Sentence
aboutParagraph9 :: Reference -> Sentence
aboutParagraph9 Reference
papersWiki = String -> Sentence
S String
"A list of papers and documents written about Drasil can be found in the" Sentence -> Sentence -> Sentence
+:+ forall r.
(HasUID r, HasRefAddress r, HasShortName r) =>
r -> Sentence -> Sentence
namedRef Reference
papersWiki (String -> Sentence
S String
"Drasil Papers \
  \and Documents") Sentence -> Sentence -> Sentence
+:+ String -> Sentence
S String
"wiki page"