diff options
Diffstat (limited to 'clang-tools-extra/clang-doc')
| -rw-r--r-- | clang-tools-extra/clang-doc/Generators.h | 3 | ||||
| -rw-r--r-- | clang-tools-extra/clang-doc/HTMLGenerator.cpp | 62 | ||||
| -rw-r--r-- | clang-tools-extra/clang-doc/MDGenerator.cpp | 6 | ||||
| -rw-r--r-- | clang-tools-extra/clang-doc/Representation.h | 2 | ||||
| -rw-r--r-- | clang-tools-extra/clang-doc/YAMLGenerator.cpp | 6 | ||||
| -rw-r--r-- | clang-tools-extra/clang-doc/tool/ClangDocMain.cpp | 29 |
6 files changed, 73 insertions, 35 deletions
diff --git a/clang-tools-extra/clang-doc/Generators.h b/clang-tools-extra/clang-doc/Generators.h index 5e6d02901a3..978cabad3a3 100644 --- a/clang-tools-extra/clang-doc/Generators.h +++ b/clang-tools-extra/clang-doc/Generators.h @@ -26,7 +26,8 @@ public: virtual ~Generator() = default; // Write out the decl info in the specified format. - virtual llvm::Error generateDocForInfo(Info *I, llvm::raw_ostream &OS) = 0; + virtual llvm::Error generateDocForInfo(Info *I, llvm::raw_ostream &OS, + const ClangDocContext &CDCtx) = 0; virtual bool createResources(ClangDocContext CDCtx) = 0; }; diff --git a/clang-tools-extra/clang-doc/HTMLGenerator.cpp b/clang-tools-extra/clang-doc/HTMLGenerator.cpp index 819fce2abc6..56ed9769a18 100644 --- a/clang-tools-extra/clang-doc/HTMLGenerator.cpp +++ b/clang-tools-extra/clang-doc/HTMLGenerator.cpp @@ -222,6 +222,21 @@ static SmallString<128> computeRelativePath(StringRef FilePath, // HTML generation +std::vector<std::unique_ptr<TagNode>> +genStylesheetsHTML(StringRef InfoPath, const ClangDocContext &CDCtx) { + std::vector<std::unique_ptr<TagNode>> Out; + for (const auto &FilePath : CDCtx.UserStylesheets) { + auto LinkNode = llvm::make_unique<TagNode>(HTMLTag::TAG_LINK); + LinkNode->Attributes.try_emplace("rel", "stylesheet"); + SmallString<128> StylesheetPath = computeRelativePath("", InfoPath); + llvm::sys::path::append(StylesheetPath, + llvm::sys::path::filename(FilePath)); + LinkNode->Attributes.try_emplace("href", StylesheetPath); + Out.emplace_back(std::move(LinkNode)); + } + return Out; +} + static std::unique_ptr<TagNode> genLink(const Twine &Text, const Twine &Link) { auto LinkNode = llvm::make_unique<TagNode>(HTMLTag::TAG_A, Text); LinkNode->Attributes.try_emplace("href", Link.str()); @@ -529,13 +544,15 @@ class HTMLGenerator : public Generator { public: static const char *Format; - llvm::Error generateDocForInfo(Info *I, llvm::raw_ostream &OS) override; + llvm::Error generateDocForInfo(Info *I, llvm::raw_ostream &OS, + const ClangDocContext &CDCtx) override; bool createResources(ClangDocContext CDCtx) override; }; const char *HTMLGenerator::Format = "html"; -llvm::Error HTMLGenerator::generateDocForInfo(Info *I, llvm::raw_ostream &OS) { +llvm::Error HTMLGenerator::generateDocForInfo(Info *I, llvm::raw_ostream &OS, + const ClangDocContext &CDCtx) { HTMLFile F; auto MetaNode = llvm::make_unique<TagNode>(HTMLTag::TAG_META); @@ -577,12 +594,9 @@ llvm::Error HTMLGenerator::generateDocForInfo(Info *I, llvm::raw_ostream &OS) { F.Children.emplace_back( llvm::make_unique<TagNode>(HTMLTag::TAG_TITLE, InfoTitle)); - auto LinkNode = llvm::make_unique<TagNode>(HTMLTag::TAG_LINK); - LinkNode->Attributes.try_emplace("rel", "stylesheet"); - SmallString<128> StylesheetPath = computeRelativePath("", I->Path); - llvm::sys::path::append(StylesheetPath, "clang-doc-default-stylesheet.css"); - LinkNode->Attributes.try_emplace("href", StylesheetPath); - F.Children.emplace_back(std::move(LinkNode)); + std::vector<std::unique_ptr<TagNode>> StylesheetsNodes = + genStylesheetsHTML(I->Path, CDCtx); + AppendVector(std::move(StylesheetsNodes), F.Children); F.Children.emplace_back(std::move(MainContentNode)); F.Render(OS); @@ -591,22 +605,22 @@ llvm::Error HTMLGenerator::generateDocForInfo(Info *I, llvm::raw_ostream &OS) { bool HTMLGenerator::createResources(ClangDocContext CDCtx) { llvm::outs() << "Generating stylesheet for docs...\n"; - llvm::SmallString<128> StylesheetPathWrite; - llvm::sys::path::native(CDCtx.OutDirectory, StylesheetPathWrite); - llvm::sys::path::append(StylesheetPathWrite, - "clang-doc-default-stylesheet.css"); - llvm::SmallString<128> StylesheetPathRead; - llvm::sys::path::native(CDCtx.ClangDocPath, StylesheetPathRead); - StylesheetPathRead = llvm::sys::path::parent_path(StylesheetPathRead); - llvm::sys::path::append(StylesheetPathRead, "..", "share", "clang", - "clang-doc-default-stylesheet.css"); - std::error_code OK; - std::error_code FileErr = - llvm::sys::fs::copy_file(StylesheetPathRead, StylesheetPathWrite); - if (FileErr != OK) { - llvm::errs() << "Error creating stylesheet file: " << FileErr.message() - << "\n"; - return false; + for (const auto &FilePath : CDCtx.UserStylesheets) { + llvm::SmallString<128> StylesheetPathWrite; + llvm::sys::path::native(CDCtx.OutDirectory, StylesheetPathWrite); + llvm::sys::path::append(StylesheetPathWrite, + llvm::sys::path::filename(FilePath)); + llvm::SmallString<128> StylesheetPathRead; + llvm::sys::path::native(FilePath, StylesheetPathRead); + std::error_code OK; + std::error_code FileErr = + llvm::sys::fs::copy_file(StylesheetPathRead, StylesheetPathWrite); + if (FileErr != OK) { + llvm::errs() << "Error creating stylesheet file " + << llvm::sys::path::filename(FilePath) << ": " + << FileErr.message() << "\n"; + return false; + } } return true; } diff --git a/clang-tools-extra/clang-doc/MDGenerator.cpp b/clang-tools-extra/clang-doc/MDGenerator.cpp index c1f89ff3b11..5334dfb0a1a 100644 --- a/clang-tools-extra/clang-doc/MDGenerator.cpp +++ b/clang-tools-extra/clang-doc/MDGenerator.cpp @@ -250,13 +250,15 @@ class MDGenerator : public Generator { public: static const char *Format; - llvm::Error generateDocForInfo(Info *I, llvm::raw_ostream &OS) override; + llvm::Error generateDocForInfo(Info *I, llvm::raw_ostream &OS, + const ClangDocContext &CDCtx) override; bool createResources(ClangDocContext CDCtx) override { return true; } }; const char *MDGenerator::Format = "md"; -llvm::Error MDGenerator::generateDocForInfo(Info *I, llvm::raw_ostream &OS) { +llvm::Error MDGenerator::generateDocForInfo(Info *I, llvm::raw_ostream &OS, + const ClangDocContext &CDCtx) { switch (I->IT) { case InfoType::IT_namespace: genMarkdown(*static_cast<clang::doc::NamespaceInfo *>(I), OS); diff --git a/clang-tools-extra/clang-doc/Representation.h b/clang-tools-extra/clang-doc/Representation.h index 0dc694f7cd9..6abccf8e56b 100644 --- a/clang-tools-extra/clang-doc/Representation.h +++ b/clang-tools-extra/clang-doc/Representation.h @@ -350,7 +350,7 @@ struct ClangDocContext { tooling::ExecutionContext *ECtx; bool PublicOnly; std::string OutDirectory; - std::string ClangDocPath; + std::vector<std::string> UserStylesheets; }; } // namespace doc diff --git a/clang-tools-extra/clang-doc/YAMLGenerator.cpp b/clang-tools-extra/clang-doc/YAMLGenerator.cpp index 4da649345cf..9a388b99ba1 100644 --- a/clang-tools-extra/clang-doc/YAMLGenerator.cpp +++ b/clang-tools-extra/clang-doc/YAMLGenerator.cpp @@ -243,13 +243,15 @@ class YAMLGenerator : public Generator { public: static const char *Format; - llvm::Error generateDocForInfo(Info *I, llvm::raw_ostream &OS) override; + llvm::Error generateDocForInfo(Info *I, llvm::raw_ostream &OS, + const ClangDocContext &CDCtx) override; bool createResources(ClangDocContext CDCtx) override { return true; } }; const char *YAMLGenerator::Format = "yaml"; -llvm::Error YAMLGenerator::generateDocForInfo(Info *I, llvm::raw_ostream &OS) { +llvm::Error YAMLGenerator::generateDocForInfo(Info *I, llvm::raw_ostream &OS, + const ClangDocContext &CDCtx) { llvm::yaml::Output InfoYAML(OS); switch (I->IT) { case InfoType::IT_namespace: diff --git a/clang-tools-extra/clang-doc/tool/ClangDocMain.cpp b/clang-tools-extra/clang-doc/tool/ClangDocMain.cpp index 89918701dc5..0e910f3506c 100644 --- a/clang-tools-extra/clang-doc/tool/ClangDocMain.cpp +++ b/clang-tools-extra/clang-doc/tool/ClangDocMain.cpp @@ -62,6 +62,11 @@ static llvm::cl::opt<bool> DoxygenOnly( llvm::cl::desc("Use only doxygen-style comments to generate docs."), llvm::cl::init(false), llvm::cl::cat(ClangDocCategory)); +static llvm::cl::list<std::string> UserStylesheets( + "stylesheets", llvm::cl::CommaSeparated, + llvm::cl::desc("CSS stylesheets to extend the default styles."), + llvm::cl::cat(ClangDocCategory)); + enum OutputFormatTy { md, yaml, @@ -201,12 +206,26 @@ int main(int argc, const char **argv) { tooling::ArgumentInsertPosition::END), ArgAdjuster); + clang::doc::ClangDocContext CDCtx = { + Exec->get()->getExecutionContext(), + PublicOnly, + OutDirectory, + {UserStylesheets.begin(), UserStylesheets.end()}}; + + if (Format == "html") { + void *MainAddr = (void *)(intptr_t)GetExecutablePath; + std::string ClangDocPath = GetExecutablePath(argv[0], MainAddr); + llvm::SmallString<128> DefaultStylesheet; + llvm::sys::path::native(ClangDocPath, DefaultStylesheet); + DefaultStylesheet = llvm::sys::path::parent_path(DefaultStylesheet); + llvm::sys::path::append(DefaultStylesheet, + "../share/clang/clang-doc-default-stylesheet.css"); + CDCtx.UserStylesheets.insert(CDCtx.UserStylesheets.begin(), + DefaultStylesheet.str()); + } + // Mapping phase llvm::outs() << "Mapping decls...\n"; - void *MainAddr = (void *)(intptr_t)GetExecutablePath; - std::string ClangDocPath = GetExecutablePath(argv[0], MainAddr); - clang::doc::ClangDocContext CDCtx = {Exec->get()->getExecutionContext(), - PublicOnly, OutDirectory, ClangDocPath}; auto Err = Exec->get()->execute(doc::newMapperActionFactory(CDCtx), ArgAdjuster); if (Err) { @@ -245,7 +264,7 @@ int main(int argc, const char **argv) { continue; } - if (auto Err = G->get()->generateDocForInfo(I, InfoOS)) + if (auto Err = G->get()->generateDocForInfo(I, InfoOS, CDCtx)) llvm::errs() << toString(std::move(Err)) << "\n"; } |

