#############################################################################
##
##  Magic.gd                                         AutoDoc package
##
##  Copyright 2013, Max Horn, JLU Giessen
##                  Sebastian Gutsche, University of Kaiserslautern
##
#############################################################################
#! @Description
#! This is the main function of the &AutoDoc; package. It can perform
#! any combination of the following three tasks:
#! 
#! - 
#!     It can (re)generate a scaffold for your package manual.
#!     That is, it can produce two XML files in &GAPDoc; format to be used as part
#!     of your manual: First, a file named doc/PACKAGENAME.xml
#!     (with your package's name substituted) which is used as
#!     main file for the package manual, i.e. this file sets the
#!     XML DOCTYPE and defines various XML entities, includes
#!     other XML files (both those generated by &AutoDoc; as well
#!     as additional files created by other means), tells &GAPDoc;
#!     to generate a table of content and an index, and more.
#!     Secondly, it creates a file doc/title.xml containing a title
#!     page for your documentation, with information about your package
#!     (name, description, version), its authors and more, based
#!     on the data in your PackageInfo.g.
#! #!
- 
#!     It can scan your package for &AutoDoc; based documentation (by using &AutoDoc;
#!     tags and the Autodoc command.
#!     This will
#!     produce further XML files to be used as part of the package manual.
#! #!
- 
#!     It can use &GAPDoc; to generate PDF, text and HTML (with
#!     MathJaX enabled) documentation from the &GAPDoc; XML files it
#!     generated as well as additional such files provided by you. For
#!     this, it invokes #! 
#! For more information and some examples, please refer to Chapter
#! The parameters have the following meanings:
#! 
#!
#! package_name
#! - 
#!     The name of the package whose documentation should be(re)generated.
#! #!
#!
#! option_record
#!
- 
#!     option_record can be a record with some additional options.
#!     The following are currently supported:
#!     
#!     dir
#!     - 
#!         This should be a string containing a (relative) path or a
#!         Directory() object specifying where the package documentation
#!         (i.e. the &GAPDoc; XML files) are stored.
#!         
 #!         Default value: "doc/".
#!
#!     scaffold
#!- 
#!         This controls whether and how to generate scaffold XML files
#!         for the main and title page of the package's documentation. 
#!         
#!         The value should be either true, false or a
#!         record. If it is a record or true (the latter is
#!         equivalent to specifying an empty record), then this feature is
#!         enabled. It is also enabled if opt.scaffold is missing but the
#!         package's info record in PackageInfo.g has an AutoDoc entry.
#!         In all other cases (in particular if opt.scaffold is
#!         false), scaffolding is disabled.
#!         
#!
#!         If opt.scaffold is a record, it may contain the following entries.
#!
#### TODO: mention merging with PackageInfo.AutoDoc!
#!         
#!
#!         includes
#!         - 
#!             A list of XML files to be included in the body of the main XML file.
#!             If you specify this list and also are using &AutoDoc; to document
#!             your operations with &AutoDoc; comments,
#!             you can add AutoDocMainFile.xml to this list
#!             to control at which point the documentation produced by &AutoDoc;
#!             is inserted. If you do not do this, it will be added after the last
#!             of your own XML files.
#!         #!
#!         appendix
#!
- 
#!             This entry is similar to opt.scaffold.includes but is used
#!             to specify files to include after the main body of the manual,
#!             i.e. typically appendices.
#!         #!
#!         bib
#!
- 
#!             The name of a bibliography file, in Bibtex or XML format.
#!             If this key is not set, but there is a file doc/PACKAGENAME.bib
#!             then it is assumed that you want to use this as your bibliography.
#!         #!
#### TODO: The 'entities' param is a bit strange. We should probably change it to be a bit more
#### general, as one might want to define other entities... For now, we do not document it
#### to leave us the choice of revising how it works.
####
####                 entities
####
- 
####                     A list of package names or other entities which are used to define corresponding XML entities.
####                     For example, if set to a list containing the string SomePackage ,
####                     then the following is added to the XML preamble:
####                     SomePackage'>]]>
####                     This allows you to write&SomePackage; in your documentation
####                     to reference that package. If another type of entity is desired, one can simply add,
####                     instead of a string, add a two entry list a to the list. It will be handled as
####                     a[ 2 ]'>]]>,
####                     so please be careful.
####
#!
#!         TitlePage
#!- 
#!             A record whose entries are used to embellish the generated titlepage
#!             for the package manual with extra information, such as a copyright
#!             statement or acknowledgments. To this end, the names of the record
#!             components are used as XML element names, and the values of the
#!             components are outputted as content of these XML elements. For
#!             example, you could pass the following record to set a custom
#!             acknowledgements text:
#!             
#!             For a list of valid entries in the titlepage, please refer to the
#!             &GAPDoc; manual, specifically section #!         document_class
#!- 
#!             Sets the document class of the resulting pdf. The value can either be a string
#!             which has to be the name of the new document class, a list containing this string, or
#!             a list of two strings. Then the first one has to be the document class name, the second one
#!             the option string ( contained in [ ] ) in LaTeX.
#!         #!         latex_header_file
#!
- 
#!             Replaces the standard header from &GAPDoc; completely with the header in this LaTeX file.
#!             Please be careful here, and look at GAPDoc's latexheader.tex file for an example.
#!         #!         gapdoc_latex_options
#!
- 
#!             Must be a record with entries which can be understood by SetGapDocLaTeXOptions. Each entry can be a string, which
#!             will be given to &GAPDoc; directly, or a list containing of two entries: The first one must be the string "file",
#!             the second one a filename. This file will be read and then its content is passed to &GAPDoc; as option with the name
#!             of the entry.
#!         #!
#!
 #!
#!
#!
#!     autodoc
#!- 
#!         This controls whether and how to generate addition XML documentation files
#!         by scanning for &AutoDoc; documentation comments.
#!         
#!         The value should be either true, false or a
#!         record. If it is a record or true (the latter is
#!         equivalent to specifying an empty record), then this feature is
#!         enabled. It is also enabled if opt.autodoc is missing but the
#!         package depends (directly) on the &AutoDoc; package.
#!         In all other cases (in particular if opt.autodoc is
#!         false), this feature is disabled.
#!         
#!
#!         If opt.autodoc is a record, it may contain the following entries.
#!
#!         
#!
#!         files
#!         - 
#!             A list of files (given by paths relative to the package directory)
#!             to be scanned for &AutoDoc; documentation comments.
#!             Usually it is more convenient to use autodoc.scan_dirs, see below.
#!         #!
#!         scan_dirs
#!
- 
#!             A list of subdirectories of the package directory (given as relative paths)
#!             which &AutoDoc; then scans for .gi, .gd and .g files; all of these files
#!             are then scanned for &AutoDoc; documentation comments.
#!             
 #!             Default value: [ "gap", "lib", "examples", "examples/doc" ].
#!
#!
#!         level
#!- 
#!             This defines the level of the created documentation. The default value is 0.
#!             When parts of the manual are declared with a higher value
#!             they will not be printed into the manual.
#!         #!
#### TODO: Document section_intros later on.
#### However, note that thanks to the new AutoDoc comment syntax, the only remaining
#### use for this seems to be the ability to specify the order of chapters and
#### sections.
####                 section_intros
####
- 
####                     TODO.
####                 #!
#!
 #!
#!
#!
#!     gapdoc
#!- 
#!         This controls whether and how to invoke &GAPDoc; to create HTML, PDF and text
#!         files from your various XML files.
#!         
#!         The value should be either true, false or a
#!         record. If it is a record or true (the latter is
#!         equivalent to specifying an empty record), then this feature is
#!         enabled. It is also enabled if opt.gapdoc is missing.
#!         In all other cases (in particular if opt.gapdoc is
#!         false), this feature is disabled.
#!         
#!
#!         If opt.gapdoc is a record, it may contain the following entries.
#!
#!         
#!
#!
#### Note: 'main' is strictly speaking also used for the scaffold.
#### However, if one uses the scaffolding mechanism, then it is not
#### really necessary to specify a custom name for the main XML file.
#### Thus, the purpose of this parameter is to cater for packages
#### that have existing documentation using a different XML name,
#### and which do not wish to use scaffolding.
####
#### This explain why we only allow specifying gapdoc.main.
#### The scaffolding code will still honor it, though, just in case.
#!         main
#!         - 
#!             The name of the main XML file of the package manual.
#!             This exists primarily to support packages with existing manual
#!             which use a filename here which differs from the default.
#!             In particular, specifying this is unnecessary when using scaffolding.
#!             
 #!             Default value: PACKAGENAME.xml.
#!
#!
#!         files
#!- 
#!             A list of files (given by paths relative to the package directory)
#!             to be scanned for &GAPDoc; documentation comments.
#!             Usually it is more convenient to use gapdoc.scan_dirs, see below.
#!         #!
#!         scan_dirs
#!
- 
#!             A list of subdirectories of the package directory (given as relative paths)
#!             which &AutoDoc; then scans for .gi, .gd and .g files; all of these files
#!             are then scanned for &GAPDoc; documentation comments.
#!             
 #!             Default value: [ "gap", "lib", "examples", "examples/doc" ].
#!
#!
#! #!
## This is the maketest part. Still under construction.
#!        maketest
#!- 
#!          The maketest item can be true or a record. When it is true,
#!          a simple maketest.g is created in the main package directory,
#!          which can be used to test the examples from the manual. As a record,
#!          the entry can have the following entries itself, to specify some options.
#!          
#!          filename
#!          - 
#!            Sets the name of the test file.
#!          #!          commands
#!
- 
#!            A list of strings, each one a command, which
#!            will be executed at the beginning of the test file.
#!          #!
 #!
#!
#! #!
#!
#!
#! @Returns nothing
#! @Arguments package_name[, option_record ]
#! @ChapterInfo AutoDoc, The AutoDoc() function
DeclareGlobalFunction( "AutoDoc" );