1 // =================================
  2 // Copyright (c) 2020 Seppo Laakko
  3 // Distributed under the MIT license
  4 // =================================
  5 
  6 #ifndef GENDOC_GENDOC_PROJECT_INCLUDED
  7 #define GENDOC_GENDOC_PROJECT_INCLUDED
  8 #include <gendoc/gendoc/File.hpp>
  9 #include <gendoc/gendoc/Filter.hpp>
 10 #include <gendoc/html/Grammar.hpp>
 11 #include <gendoc/html/HtmlContentFilePathResolver.hpp>
 12 #include <sngcpp/pp/File.hpp>
 13 #include <sngcpp/ast/SourceFile.hpp>
 14 #include <sngcpp/binder/TypeBinder.hpp>
 15 #include <sngcpp/symbols/SymbolTable.hpp>
 16 #include <sngxml/dom/Document.hpp>
 17 #include <soulng/lexer/Lexer.hpp>
 18 #include <soulng/rex/Context.hpp>
 19 
 20 namespace gendoc {
 21 
 22 class Import 
 23 {
 24 public:
 25     Import(const std::u32string& name_const std::string& relativePath_);
 26     const std::u32string& Name() const { return name; }
 27     const std::string& RelativePath() const { return relativePath; }
 28 private:
 29     std::u32string name;
 30     std::string relativePath;
 31 };
 32 
 33 class Project public gendoc::html::HtmlContentFilePathResolverpublic sngcpp::binder::SourceFileResolver
 34 {
 35 public:
 36     Project(const std::string& docFilePath_);
 37     void Process(bool verbosebool rebuildbool single);
 38     void Clean(bool verbosebool single);
 39     void ReadChildren();
 40     void RunChildren(bool verbosebool rebuildbool cleanbool single);
 41     void RunChildrenWithFlags(bool verbosebool rebuildconst std::string& flags);
 42     void RunChildrenSingle(bool verbosebool rebuildbool cleanbool astbool content);
 43     void GenerateAst(bool verbosebool rebuildbool readAst);
 44     void GenerateContent(bool verbosebool rebuildbool endMessagebool single);
 45     void ReadName();
 46     void ReadTop();
 47     void ReadParentNameAndSiblings();
 48     void ReadFilter();
 49     void ReadIncludePath();
 50     void ReadFilePaths(bool verbose);
 51     void ReadImports();
 52     void SetAstFilePath();
 53     void SetContentXmlFilePath();
 54     void SetHtmlFilePath();
 55     bool BuildAst(bool verbosebool rebuild);
 56     void WriteAst(bool verbose);
 57     void ReadAst(bool verbose);
 58     void ImportAsts(bool verbose);
 59     void BuildSymbolTable();
 60     void GenerateContentXml(bool verbosebool rebuild);
 61     void WriteContentXml(bool verbose);
 62     void ReadContentXml(bool verbose);
 63     void MakeDirectories();
 64     void GenerateStyleSheet();
 65     void GenerateHtmlCodeFiles(bool verbosebool rebuild);
 66     void ReadGrammarXmlFiles(bool verbose);
 67     void GenerateHtmlContent(bool verbosebool rebuild);
 68     void ReadDocumentationXml(bool verbosebool& rebuild);
 69     std::string ResolveContentFilePath(const std::u32string& currentProjectNameconst std::u32string& projectNameconst std::string& relativeContentDirPath
 70         const std::u32string& symbolId) override;
 71     sngcpp::ast::SourceFileNode* GetSourceFile(const std::string& sourceFilePath) const override;
 72 private:
 73     bool childrenRead;
 74     std::vector<std::string> children;
 75     std::vector<std::u32string> childProjects;
 76     std::vector<std::u32string> childNames;
 77     std::vector<std::u32string> siblingProjects;
 78     int thisProjectIndex;
 79     std::u32string name;
 80     std::u32string parentName;
 81     std::u32string topLink;
 82     soulng::rex::Context context;
 83     std::string docFilePath;
 84     std::string rootDir;
 85     std::unique_ptr<sngxml::dom::Document> doc;
 86     FilterList filters;
 87     std::string projectRoot;
 88     std::vector<File> filePaths;
 89     std::string includePath;
 90     std::string astFilePath;
 91     std::unique_ptr<sngcpp::ast::Node> ast;
 92     std::vector<std::std::unique_ptr<Import>>imports;
 93     std::vector<std::string> importAstFilePaths;
 94     std::vector<std::std::unique_ptr<sngcpp::ast::Node>>importAsts;
 95     std::vector<std::std::unique_ptr<soulng::lexer::Lexer>>lexers;
 96     sngcpp::symbols::SymbolTable symbolTable;
 97     std::unique_ptr<sngxml::dom::Document> contentXml;
 98     sngcpp::pp::ProjectHeaderFileSet headerFiles;
 99     std::string htmlFilePath;
100     std::string htmlDir;
101     std::string contentDir;
102     std::string fileDir;
103     std::string styleDir;
104     std::string styleDirName;
105     std::string styleFileName;
106     std::vector<sngcpp::ast::SourceFileNode*> sourceFiles;
107     std::vector<std::std::vector<sngcpp::ast::SourceFileNode*>>importSourceFiles;
108     std::map<std::stringsngcpp::ast::SourceFileNode*> sourceFileMap;
109     std::unordered_map<std::u32stringstd::std::unique_ptr<sngxml::dom::Element>>inlineCodeMap;
110     std::string contentXmlFilePath;
111     bool contentXmlUpToDate;
112     bool astGenerated;
113     bool upToDate;
114     std::map<std::u32stringImport*> importMap;
115     std::string documentationXmlFileName;
116     std::unique_ptr<sngxml::dom::Document> documentationXml;
117     std::string grammarsXmlFilePath;
118     std::unique_ptr<sngxml::dom::Document> grammarsXmlDoc;
119     std::vector<gendoc::html::Grammar> grammars;
120 };
121 
122 } // namespace gendoc
123 
124 #endif // GENDOC_GENDOC_PROJECT_INCLUDED