[clang-tools-extra] r367056 - [clang-doc] Add stylesheet to generated html docs
Diego Astiazaran via cfe-commits
cfe-commits at lists.llvm.org
Thu Jul 25 14:27:50 PDT 2019
Author: diegoastiazaran
Date: Thu Jul 25 14:27:50 2019
New Revision: 367056
URL: http://llvm.org/viewvc/llvm-project?rev=367056&view=rev
Log:
[clang-doc] Add stylesheet to generated html docs
A default css stylesheet is included for docs generated in html format.
Differential Revision: https://reviews.llvm.org/D64539
Added:
clang-tools-extra/trunk/clang-doc/stylesheets/
clang-tools-extra/trunk/clang-doc/stylesheets/clang-doc-default-stylesheet.css
Modified:
clang-tools-extra/trunk/clang-doc/Generators.h
clang-tools-extra/trunk/clang-doc/HTMLGenerator.cpp
clang-tools-extra/trunk/clang-doc/MDGenerator.cpp
clang-tools-extra/trunk/clang-doc/Representation.h
clang-tools-extra/trunk/clang-doc/Serialize.cpp
clang-tools-extra/trunk/clang-doc/YAMLGenerator.cpp
clang-tools-extra/trunk/clang-doc/tool/CMakeLists.txt
clang-tools-extra/trunk/clang-doc/tool/ClangDocMain.cpp
clang-tools-extra/trunk/unittests/clang-doc/HTMLGeneratorTest.cpp
Modified: clang-tools-extra/trunk/clang-doc/Generators.h
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-doc/Generators.h?rev=367056&r1=367055&r2=367056&view=diff
==============================================================================
--- clang-tools-extra/trunk/clang-doc/Generators.h (original)
+++ clang-tools-extra/trunk/clang-doc/Generators.h Thu Jul 25 14:27:50 2019
@@ -27,6 +27,7 @@ public:
// Write out the decl info in the specified format.
virtual llvm::Error generateDocForInfo(Info *I, llvm::raw_ostream &OS) = 0;
+ virtual bool createResources(ClangDocContext CDCtx) = 0;
};
typedef llvm::Registry<Generator> GeneratorRegistry;
Modified: clang-tools-extra/trunk/clang-doc/HTMLGenerator.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-doc/HTMLGenerator.cpp?rev=367056&r1=367055&r2=367056&view=diff
==============================================================================
--- clang-tools-extra/trunk/clang-doc/HTMLGenerator.cpp (original)
+++ clang-tools-extra/trunk/clang-doc/HTMLGenerator.cpp Thu Jul 25 14:27:50 2019
@@ -35,6 +35,7 @@ public:
TAG_UL,
TAG_LI,
TAG_A,
+ TAG_LINK,
};
HTMLTag() = default;
@@ -103,6 +104,7 @@ struct HTMLFile {
bool HTMLTag::IsSelfClosing() const {
switch (Value) {
case HTMLTag::TAG_META:
+ case HTMLTag::TAG_LINK:
return true;
case HTMLTag::TAG_TITLE:
case HTMLTag::TAG_DIV:
@@ -140,6 +142,8 @@ llvm::SmallString<16> HTMLTag::ToString(
return llvm::SmallString<16>("li");
case HTMLTag::TAG_A:
return llvm::SmallString<16>("a");
+ case HTMLTag::TAG_LINK:
+ return llvm::SmallString<16>("link");
}
llvm_unreachable("Unhandled HTMLTag::TagType");
}
@@ -526,6 +530,7 @@ public:
static const char *Format;
llvm::Error generateDocForInfo(Info *I, llvm::raw_ostream &OS) override;
+ bool createResources(ClangDocContext CDCtx) override;
};
const char *HTMLGenerator::Format = "html";
@@ -572,12 +577,40 @@ llvm::Error HTMLGenerator::generateDocFo
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));
F.Children.emplace_back(std::move(MainContentNode));
F.Render(OS);
return llvm::Error::success();
}
+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;
+ }
+ return true;
+}
+
static GeneratorRegistry::Add<HTMLGenerator> HTML(HTMLGenerator::Format,
"Generator for HTML output.");
Modified: clang-tools-extra/trunk/clang-doc/MDGenerator.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-doc/MDGenerator.cpp?rev=367056&r1=367055&r2=367056&view=diff
==============================================================================
--- clang-tools-extra/trunk/clang-doc/MDGenerator.cpp (original)
+++ clang-tools-extra/trunk/clang-doc/MDGenerator.cpp Thu Jul 25 14:27:50 2019
@@ -251,6 +251,7 @@ public:
static const char *Format;
llvm::Error generateDocForInfo(Info *I, llvm::raw_ostream &OS) override;
+ bool createResources(ClangDocContext CDCtx) override { return true; }
};
const char *MDGenerator::Format = "md";
Modified: clang-tools-extra/trunk/clang-doc/Representation.h
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-doc/Representation.h?rev=367056&r1=367055&r2=367056&view=diff
==============================================================================
--- clang-tools-extra/trunk/clang-doc/Representation.h (original)
+++ clang-tools-extra/trunk/clang-doc/Representation.h Thu Jul 25 14:27:50 2019
@@ -349,6 +349,8 @@ mergeInfos(std::vector<std::unique_ptr<I
struct ClangDocContext {
tooling::ExecutionContext *ECtx;
bool PublicOnly;
+ std::string OutDirectory;
+ std::string ClangDocPath;
};
} // namespace doc
Modified: clang-tools-extra/trunk/clang-doc/Serialize.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-doc/Serialize.cpp?rev=367056&r1=367055&r2=367056&view=diff
==============================================================================
--- clang-tools-extra/trunk/clang-doc/Serialize.cpp (original)
+++ clang-tools-extra/trunk/clang-doc/Serialize.cpp Thu Jul 25 14:27:50 2019
@@ -44,7 +44,6 @@ populateParentNamespaces(llvm::SmallVect
// }
llvm::SmallString<128>
getInfoRelativePath(const llvm::SmallVectorImpl<doc::Reference> &Namespaces) {
- std::error_code OK;
llvm::SmallString<128> Path;
for (auto R = Namespaces.rbegin(), E = Namespaces.rend(); R != E; ++R)
llvm::sys::path::append(Path, R->Name);
Modified: clang-tools-extra/trunk/clang-doc/YAMLGenerator.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-doc/YAMLGenerator.cpp?rev=367056&r1=367055&r2=367056&view=diff
==============================================================================
--- clang-tools-extra/trunk/clang-doc/YAMLGenerator.cpp (original)
+++ clang-tools-extra/trunk/clang-doc/YAMLGenerator.cpp Thu Jul 25 14:27:50 2019
@@ -244,6 +244,7 @@ public:
static const char *Format;
llvm::Error generateDocForInfo(Info *I, llvm::raw_ostream &OS) override;
+ bool createResources(ClangDocContext CDCtx) override { return true; }
};
const char *YAMLGenerator::Format = "yaml";
Added: clang-tools-extra/trunk/clang-doc/stylesheets/clang-doc-default-stylesheet.css
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-doc/stylesheets/clang-doc-default-stylesheet.css?rev=367056&view=auto
==============================================================================
--- clang-tools-extra/trunk/clang-doc/stylesheets/clang-doc-default-stylesheet.css (added)
+++ clang-tools-extra/trunk/clang-doc/stylesheets/clang-doc-default-stylesheet.css Thu Jul 25 14:27:50 2019
@@ -0,0 +1,205 @@
+body,div {
+ margin: 0;
+ padding: 0;
+}
+
+body[no-overflow] {
+ overflow: hidden;
+}
+
+li>p:first-child {
+ margin-top: 0;
+}
+
+li>p:last-child {
+ margin-bottom: 0;
+}
+
+html {
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+}
+
+*,*::before,*::after {
+ -webkit-box-sizing: inherit;
+ box-sizing: inherit;
+}
+
+body,html {
+ color: #202124;
+ font: 400 16px/24px Roboto,sans-serif;
+ -moz-osx-font-smoothing: grayscale;
+ -webkit-font-smoothing: antialiased;
+ height: 100%;
+ margin: 36px;
+ -webkit-text-size-adjust: 100%;
+ -moz-text-size-adjust: 100%;
+ -ms-text-size-adjust: 100%;
+ text-size-adjust: 100%;
+}
+
+body[devsite-framebox] {
+ overflow: hidden;
+ padding: 20px;
+}
+
+body[sitemask--active] {
+ overflow: hidden;
+}
+
+p {
+ margin: 16px 0;
+ padding: 0;
+}
+
+:link,:visited {
+ color: #039be5;
+ outline: 0;
+ text-decoration: none;
+}
+
+ul {
+ margin: 0;
+ padding-left: 40px;
+}
+
+ul {
+ list-style: disc outside;
+}
+
+li,li p {
+ margin: 12px 0;
+ padding: 0;
+}
+
+*[visually-hidden] {
+ opacity: 0 !important;
+ pointer-events: none !important;
+ visibility: hidden !important;
+}
+
+*[hidden] {
+ display: none !important;
+}
+
+[render-hidden] {
+ display: inline !important;
+ position: absolute !important;
+ visibility: hidden !important;
+}
+
+*[no-scroll] {
+ overflow: hidden;
+}
+
+ at supports (display: flex) {
+ body[ready] .devsite-wrapper {
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-orient: vertical;
+ -webkit-box-direction: normal;
+ -ms-flex-direction: column;
+ flex-direction: column;
+ }
+}
+
+ at media screen and (max-width: 840px) {
+ body[devsite-book-nav--open] {
+ overflow: hidden;
+ }
+}
+
+h1,h2,h3,h4,h5,h6 {
+ overflow: hidden;
+ padding: 0;
+ text-overflow: ellipsis;
+}
+
+h1 {
+ color: #80868b;
+ font: 300 34px/40px Roboto,sans-serif;
+ letter-spacing: -0.01em;
+ margin: 40px 0 20px;
+}
+
+[layout=docs] h2 {
+ border-bottom: 1px solid #e8eaed;
+ padding-bottom: 3px;
+}
+
+h2 {
+ font: 300 24px/32px Roboto,sans-serif;
+ letter-spacing: -0.01em;
+ margin: 40px 0 20px;
+}
+
+h3 {
+ font: 400 20px/32px Roboto,sans-serif;
+ margin: 32px 0 16px;
+}
+
+h4,h5,h6 {
+ margin: 32px 0 16px;
+}
+
+h4 {
+ font: 500 16px/24px Roboto,sans-serif;
+}
+
+h5 {
+ font: 700 14px/24px Roboto,sans-serif;
+}
+
+h6 {
+ font: 500 14px/24px Roboto,sans-serif;
+}
+
+h1+h1,h1+h2,h1+h3,h1+h4,h1+h5,h1+h6,h2+h1,h2+h2,h2+h3,h2+h4,h2+h5,h2+h6,h3+h1,h3+h2,h3+h3,h3+h4,h3+h5,h3+h6,h4+h1,h4+h2,h4+h3,h4+h4,h4+h5,h4+h6,h5+h1,h5+h2,h5+h3,h5+h4,h5+h5,h5+h6,h6+h1,h6+h2,h6+h3,h6+h4,h6+h5,h6+h6 {
+ margin-top: 0;
+}
+
+ at media screen and (max-width: 600px) {
+ h1 {
+ font: 300 24px/32px Roboto,sans-serif;
+ }
+}
+
+[scrollbars]::-webkit-scrollbar {
+ height: 8px;
+ width: 8px;
+}
+
+[scrollbars]::-webkit-scrollbar-thumb {
+ background: rgba(128,134,139,.26);
+ border-radius: 8px;
+}
+
+[no-horizontal-scrollbars]::-webkit-scrollbar {
+ height: 0;
+ width: 0;
+}
+
+[scrollbars]::-webkit-scrollbar-corner {
+ background: 0;
+}
+
+[background] h2 {
+ color: #fff;
+}
+
+ at media print {
+ body, html, :link, :visited, h1, h2, h3, h4, h5, h6 {
+ color: #000 !important;
+ padding-left: 0 !important;
+ padding-right: 0 !important;
+ }
+
+ :link, :visited {
+ text-decoration: underline;
+ }
+}
+
+ at page {
+ margin: .75in;
+}
Modified: clang-tools-extra/trunk/clang-doc/tool/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-doc/tool/CMakeLists.txt?rev=367056&r1=367055&r2=367056&view=diff
==============================================================================
--- clang-tools-extra/trunk/clang-doc/tool/CMakeLists.txt (original)
+++ clang-tools-extra/trunk/clang-doc/tool/CMakeLists.txt Thu Jul 25 14:27:50 2019
@@ -14,4 +14,7 @@ target_link_libraries(clang-doc
clangTooling
clangToolingCore
)
-
\ No newline at end of file
+
+install(FILES ../stylesheets/clang-doc-default-stylesheet.css
+ DESTINATION share/clang
+ COMPONENT clang-doc)
Modified: clang-tools-extra/trunk/clang-doc/tool/ClangDocMain.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-doc/tool/ClangDocMain.cpp?rev=367056&r1=367055&r2=367056&view=diff
==============================================================================
--- clang-tools-extra/trunk/clang-doc/tool/ClangDocMain.cpp (original)
+++ clang-tools-extra/trunk/clang-doc/tool/ClangDocMain.cpp Thu Jul 25 14:27:50 2019
@@ -91,6 +91,15 @@ std::string getFormatString() {
llvm_unreachable("Unknown OutputFormatTy");
}
+// This function isn't referenced outside its translation unit, but it
+// can't use the "static" keyword because its address is used for
+// GetMainExecutable (since some platforms don't support taking the
+// address of main, and some platforms can't implement GetMainExecutable
+// without being given the address of a function in the main executable).
+std::string GetExecutablePath(const char *Argv0, void *MainAddr) {
+ return llvm::sys::fs::getMainExecutable(Argv0, MainAddr);
+}
+
bool CreateDirectory(const Twine &DirName, bool ClearDirectory = false) {
std::error_code OK;
llvm::SmallString<128> DocsRootPath;
@@ -129,7 +138,6 @@ llvm::Expected<llvm::SmallString<128>> g
StringRef RelativePath,
StringRef Name,
StringRef Ext) {
- std::error_code OK;
llvm::SmallString<128> Path;
llvm::sys::path::native(Root, Path);
llvm::sys::path::append(Path, RelativePath);
@@ -195,8 +203,10 @@ int main(int argc, const char **argv) {
// 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};
+ PublicOnly, OutDirectory, ClangDocPath};
auto Err =
Exec->get()->execute(doc::newMapperActionFactory(CDCtx), ArgAdjuster);
if (Err) {
@@ -239,5 +249,8 @@ int main(int argc, const char **argv) {
llvm::errs() << toString(std::move(Err)) << "\n";
}
+ if (!G->get()->createResources(CDCtx))
+ return 1;
+
return 0;
}
Modified: clang-tools-extra/trunk/unittests/clang-doc/HTMLGeneratorTest.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/unittests/clang-doc/HTMLGeneratorTest.cpp?rev=367056&r1=367055&r2=367056&view=diff
==============================================================================
--- clang-tools-extra/trunk/unittests/clang-doc/HTMLGeneratorTest.cpp (original)
+++ clang-tools-extra/trunk/unittests/clang-doc/HTMLGeneratorTest.cpp Thu Jul 25 14:27:50 2019
@@ -43,6 +43,7 @@ TEST(HTMLGeneratorTest, emitNamespaceHTM
std::string Expected = R"raw(<!DOCTYPE html>
<meta charset="utf-8"/>
<title>namespace Namespace</title>
+<link rel="stylesheet" href="clang-doc-default-stylesheet.css"/>
<div>
<h1>namespace Namespace</h1>
<h2>Namespaces</h2>
@@ -103,6 +104,7 @@ TEST(HTMLGeneratorTest, emitRecordHTML)
std::string Expected = R"raw(<!DOCTYPE html>
<meta charset="utf-8"/>
<title>class r</title>
+<link rel="stylesheet" href="../../../clang-doc-default-stylesheet.css"/>
<div>
<h1>class r</h1>
<p>Defined at line 10 of test.cpp</p>
@@ -168,6 +170,7 @@ TEST(HTMLGeneratorTest, emitFunctionHTML
std::string Expected = R"raw(<!DOCTYPE html>
<meta charset="utf-8"/>
<title></title>
+<link rel="stylesheet" href="clang-doc-default-stylesheet.css"/>
<div>
<h3>f</h3>
<p>
@@ -205,6 +208,7 @@ TEST(HTMLGeneratorTest, emitEnumHTML) {
std::string Expected = R"raw(<!DOCTYPE html>
<meta charset="utf-8"/>
<title></title>
+<link rel="stylesheet" href="clang-doc-default-stylesheet.css"/>
<div>
<h3>enum class e</h3>
<ul>
@@ -272,6 +276,7 @@ TEST(HTMLGeneratorTest, emitCommentHTML)
std::string Expected = R"raw(<!DOCTYPE html>
<meta charset="utf-8"/>
<title></title>
+<link rel="stylesheet" href="clang-doc-default-stylesheet.css"/>
<div>
<h3>f</h3>
<p>void f(int I, int J)</p>
More information about the cfe-commits
mailing list