Skip to content

Commit e9faceb

Browse files
committed
feat: javascript helpers extension
fix #881
1 parent 88d6cd0 commit e9faceb

File tree

4 files changed

+170
-37
lines changed

4 files changed

+170
-37
lines changed

src/lib/Gen/hbs/Builder.cpp

Lines changed: 50 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,51 @@ templateDirs(Config const& config, std::string_view generator, std::string_view
5353
return dirs;
5454
}
5555

56+
} // (anon)
57+
58+
namespace paths {
59+
60+
std::string selectExistingTemplateDir(std::vector<std::string> const& candidates)
61+
{
62+
for (auto const& dir : candidates)
63+
{
64+
if (files::exists(dir))
65+
return dir;
66+
}
67+
return {};
68+
}
69+
70+
} // namespace paths
71+
72+
73+
static std::string pickTemplateDir(
74+
Config const& config,
75+
std::string_view generator,
76+
std::string_view subdir,
77+
std::string_view purpose)
78+
{
79+
auto dirs = templateDirs(config, generator, subdir);
80+
auto selected = paths::selectExistingTemplateDir(dirs);
81+
if (!selected.empty())
82+
return selected;
83+
84+
std::string searched;
85+
for (auto it = dirs.begin(); it != dirs.end(); ++it)
86+
{
87+
if (it != dirs.begin())
88+
searched.append(", ");
89+
searched.append(*it);
90+
}
91+
92+
formatError(
93+
"No {} templates found for generator '{}' (subdir '{}'); searched: {}",
94+
purpose,
95+
generator,
96+
subdir,
97+
searched.empty() ? std::string{"<none>"} : searched).Throw();
98+
return {};
99+
}
100+
56101
void
57102
loadPartials(
58103
Handlebars& hbs,
@@ -181,11 +226,6 @@ relativize_fn(dom::Value to0, dom::Value from0, dom::Value options)
181226
relativePath += hash;
182227
return relativePath;
183228
}
184-
185-
} // (anon)
186-
187-
188-
189229
Builder::
190230
Builder(
191231
HandlebarsCorpus const& corpus,
@@ -454,40 +494,35 @@ std::string
454494
Builder::
455495
layoutDir() const
456496
{
457-
auto dirs = templateDirs(domCorpus->config, domCorpus.fileExtension, "layouts");
458-
return dirs.empty() ? std::string{} : dirs.back();
497+
return pickTemplateDir(domCorpus->config, domCorpus.fileExtension, "layouts", "layout");
459498
}
460499

461500
std::string
462501
Builder::
463502
templatesDir() const
464503
{
465-
auto dirs = templateDirs(domCorpus->config, domCorpus.fileExtension, {});
466-
return dirs.empty() ? std::string{} : dirs.back();
504+
return pickTemplateDir(domCorpus->config, domCorpus.fileExtension, {}, "template");
467505
}
468506

469507
std::string
470508
Builder::
471509
templatesDir(std::string_view subdir) const
472510
{
473-
auto dirs = templateDirs(domCorpus->config, domCorpus.fileExtension, subdir);
474-
return dirs.empty() ? std::string{} : dirs.back();
511+
return pickTemplateDir(domCorpus->config, domCorpus.fileExtension, subdir, "template");
475512
}
476513

477514
std::string
478515
Builder::
479516
commonTemplatesDir() const
480517
{
481-
auto dirs = templateDirs(domCorpus->config, "common", {});
482-
return dirs.empty() ? std::string{} : dirs.back();
518+
return pickTemplateDir(domCorpus->config, "common", {}, "common template");
483519
}
484520

485521
std::string
486522
Builder::
487523
commonTemplatesDir(std::string_view const subdir) const
488524
{
489-
auto dirs = templateDirs(domCorpus->config, "common", subdir);
490-
return dirs.empty() ? std::string{} : dirs.back();
525+
return pickTemplateDir(domCorpus->config, "common", subdir, "common template");
491526
}
492527

493528

src/lib/Gen/hbs/Builder.hpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,16 @@
1919
#include <mrdocs/Support/Handlebars.hpp>
2020
#include <mrdocs/Support/JavaScript.hpp>
2121
#include <ostream>
22+
#include <vector>
2223

2324

2425
namespace mrdocs {
2526
namespace hbs {
2627

28+
namespace paths {
29+
std::string selectExistingTemplateDir(std::vector<std::string> const& candidates);
30+
}
31+
2732
/** Builds reference output as a string for any Info type
2833
2934
This contains all the state information

0 commit comments

Comments
 (0)