Skip to content

Commit 6f9a69e

Browse files
ilovepiPeterChou1
andcommitted
[clang-doc] Implement setupTemplateValue for HTMLMustacheGenerator
This patch implements the business logic for setupTemplateValue, which was split from #133161. The implementation configures the relative path relationships between the various HTML components, and prepares them prior to their use in the generator. Co-authored-by: Peter Chou <[email protected]>
1 parent 888f545 commit 6f9a69e

File tree

2 files changed

+73
-4
lines changed

2 files changed

+73
-4
lines changed

clang-tools-extra/clang-doc/HTMLMustacheGenerator.cpp

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -406,7 +406,26 @@ static json::Value extractValue(const RecordInfo &I,
406406

407407
static Error setupTemplateValue(const ClangDocContext &CDCtx, json::Value &V,
408408
Info *I) {
409-
return createStringError(inconvertibleErrorCode(), "setupTemplateValue is unimplemented");
409+
V.getAsObject()->insert({"ProjectName", CDCtx.ProjectName});
410+
json::Value StylesheetArr = Array();
411+
auto InfoPath = I->getRelativeFilePath("");
412+
SmallString<128> RelativePath = computeRelativePath("", InfoPath);
413+
for (const auto &FilePath : CDCtx.UserStylesheets) {
414+
SmallString<128> StylesheetPath = RelativePath;
415+
sys::path::append(StylesheetPath, sys::path::filename(FilePath));
416+
sys::path::native(StylesheetPath, sys::path::Style::posix);
417+
StylesheetArr.getAsArray()->emplace_back(StylesheetPath);
418+
}
419+
V.getAsObject()->insert({"Stylesheets", StylesheetArr});
420+
421+
json::Value ScriptArr = Array();
422+
for (auto Script : CDCtx.JsScripts) {
423+
SmallString<128> JsPath = RelativePath;
424+
sys::path::append(JsPath, sys::path::filename(Script));
425+
ScriptArr.getAsArray()->emplace_back(JsPath);
426+
}
427+
V.getAsObject()->insert({"Scripts", ScriptArr});
428+
return Error::success();
410429
}
411430

412431
Error MustacheHTMLGenerator::generateDocForInfo(Info *I, raw_ostream &OS,
@@ -417,6 +436,7 @@ Error MustacheHTMLGenerator::generateDocForInfo(Info *I, raw_ostream &OS,
417436
extractValue(*static_cast<clang::doc::NamespaceInfo *>(I), CDCtx);
418437
if (auto Err = setupTemplateValue(CDCtx, V, I))
419438
return Err;
439+
assert(NamespaceTemplate && "NamespaceTemplate is nullptr.");
420440
NamespaceTemplate->render(V, OS);
421441
break;
422442
}

clang-tools-extra/unittests/clang-doc/HTMLMustacheGeneratorTest.cpp

Lines changed: 52 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -159,8 +159,57 @@ TEST(HTMLMustacheGeneratorTest, generateDocsForInfo) {
159159
I.Children.Functions.back().Name = "OneFunction";
160160
I.Children.Enums.emplace_back();
161161

162-
EXPECT_THAT_ERROR(G->generateDocForInfo(&I, Actual, CDCtx), Failed());
162+
unittest::TempDir RootTestDirectory("generateDocForInfoTest",
163+
/*Unique=*/true);
164+
CDCtx.OutDirectory = RootTestDirectory.path();
165+
166+
getMustacheHtmlFiles("../../../../../share/clang-doc", CDCtx);
167+
168+
// FIXME: This is a terrible hack, since we can't initialize the templates
169+
// directly. We'll need to update the interfaces so that we can call
170+
// SetupTemplateFiles() from outsize of HTMLMustacheGenerator.cpp
171+
EXPECT_THAT_ERROR(G->generateDocs(RootTestDirectory.path(), {}, CDCtx),
172+
Succeeded())
173+
<< "Failed to generate docs.";
163174

164-
std::string Expected = R"raw()raw";
165-
EXPECT_THAT(Actual.str(), Eq(Expected));
175+
EXPECT_THAT_ERROR(G->generateDocForInfo(&I, Actual, CDCtx), Succeeded());
176+
177+
std::string Expected = R"raw(<!DOCTYPE html>
178+
<html lang="en-US">
179+
<head>
180+
<meta charset="utf-8"/>
181+
<title>namespace Namespace</title>
182+
<link rel="stylesheet" type="text/css" href="../clang-doc-mustache.css"/>
183+
<link rel="stylesheet" type="text/css" href="../"/>
184+
<script src="../mustache-index.js"></script>
185+
<script src="../"></script>
186+
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/default.min.css">
187+
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/highlight.min.js"></script>
188+
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/cpp.min.js"></script>
189+
</head>
190+
<body>
191+
<nav class="navbar">
192+
Navbar
193+
</nav>
194+
<main>
195+
<div class="container">
196+
<div class="sidebar">
197+
Lorem ipsum dolor sit amet, consectetur adipiscing elit,
198+
sed do eiusmod tempor incididunt ut labore et dolore magna
199+
aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco
200+
laboris nisi ut aliquip ex ea commodo consequat.
201+
Duis aute irure dolor in reprehenderit in voluptate velit esse
202+
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat
203+
cupidatat non proident, sunt in culpa qui officia deserunt mollit
204+
anim id est laborum
205+
</div>
206+
<div class="resizer" id="resizer"></div>
207+
<div class="content">
208+
Content
209+
</div>
210+
</div>
211+
</main>
212+
</body>
213+
</html>)raw";
214+
EXPECT_EQ(Actual.str(), Expected);
166215
}

0 commit comments

Comments
 (0)