First working version of Mermaid class diagram generator
This commit is contained in:
@@ -24,9 +24,11 @@
|
||||
|
||||
namespace clanguml::class_diagram::generators::mermaid {
|
||||
|
||||
using clanguml::common::generators::mermaid::indent;
|
||||
|
||||
generator::generator(diagram_config &config, diagram_model &model)
|
||||
: common_generator<diagram_config, diagram_model>{config, model}
|
||||
, together_group_stack_{!config.generate_packages()}
|
||||
, together_group_stack_{true}
|
||||
{
|
||||
}
|
||||
|
||||
@@ -37,6 +39,8 @@ std::string generator::render_name(std::string name) const
|
||||
util::replace_all(name, "(", "(");
|
||||
util::replace_all(name, ")", ")");
|
||||
util::replace_all(name, "##", "::");
|
||||
util::replace_all(name, "{", "{");
|
||||
util::replace_all(name, "}", "}");
|
||||
|
||||
return name;
|
||||
}
|
||||
@@ -44,11 +48,7 @@ std::string generator::render_name(std::string name) const
|
||||
void generator::generate_alias(
|
||||
const common::model::element &c, std::ostream &ostr) const
|
||||
{
|
||||
std::string full_name;
|
||||
if (config().generate_packages())
|
||||
full_name = c.full_name_no_ns();
|
||||
else
|
||||
full_name = c.full_name(true);
|
||||
const auto full_name = c.full_name(true);
|
||||
|
||||
assert(!full_name.empty());
|
||||
|
||||
@@ -56,7 +56,8 @@ void generator::generate_alias(
|
||||
|
||||
auto class_label = config().simplify_template_type(render_name(full_name));
|
||||
|
||||
ostr << " class " << c.alias() << "[\"" << class_label << "\"]\n";
|
||||
ostr << indent(1) << "class " << c.alias() << "[\"" << class_label
|
||||
<< "\"]\n";
|
||||
|
||||
// Register the added alias
|
||||
m_generated_aliases.emplace(c.alias());
|
||||
@@ -68,14 +69,14 @@ void generator::generate(const class_ &c, std::ostream &ostr) const
|
||||
|
||||
std::string class_type{"class"};
|
||||
|
||||
ostr << " class " << c.alias();
|
||||
ostr << indent(1) << "class " << c.alias();
|
||||
|
||||
ostr << " {" << '\n';
|
||||
|
||||
if (c.is_union())
|
||||
ostr << " <<union>>\n";
|
||||
ostr << indent(2) << "<<union>>\n";
|
||||
else if (c.is_abstract())
|
||||
ostr << " <<abstract>>\n";
|
||||
ostr << indent(2) << "<<abstract>>\n";
|
||||
|
||||
//
|
||||
// Process methods
|
||||
@@ -130,7 +131,7 @@ void generator::generate(const class_ &c, std::ostream &ostr) const
|
||||
ostr << '\n';
|
||||
}
|
||||
|
||||
ostr << " }" << '\n';
|
||||
ostr << indent(1) << "}" << '\n';
|
||||
|
||||
generate_notes(ostr, c);
|
||||
|
||||
@@ -211,11 +212,9 @@ void generator::generate_method(
|
||||
|
||||
print_debug(m, ostr);
|
||||
|
||||
std::string intend = " ";
|
||||
|
||||
std::string type{uns.relative(config().simplify_template_type(m.type()))};
|
||||
|
||||
ostr << intend << mermaid_common::to_mermaid(m.access()) << m.name();
|
||||
ostr << indent(2) << mermaid_common::to_mermaid(m.access()) << m.name();
|
||||
|
||||
if (!m.template_params().empty()) {
|
||||
m.render_template_params(ostr, config().using_namespace(), false);
|
||||
@@ -257,7 +256,7 @@ void generator::generate_member(
|
||||
|
||||
print_debug(m, ostr);
|
||||
|
||||
ostr << " " << mermaid_common::to_mermaid(m.access()) << m.name()
|
||||
ostr << indent(2) << mermaid_common::to_mermaid(m.access()) << m.name()
|
||||
<< " : "
|
||||
<< render_name(
|
||||
uns.relative(config().simplify_template_type(m.type())));
|
||||
@@ -265,31 +264,33 @@ void generator::generate_member(
|
||||
|
||||
void generator::generate(const concept_ &c, std::ostream &ostr) const
|
||||
{
|
||||
std::string class_type{"class"};
|
||||
|
||||
ostr << class_type << " " << c.alias() << " <<concept>>";
|
||||
ostr << indent(1) << "class"
|
||||
<< " " << c.alias();
|
||||
|
||||
if (!c.style().empty())
|
||||
ostr << " " << c.style();
|
||||
|
||||
ostr << " {" << '\n';
|
||||
ostr << indent(2) << "<<concept>>\n";
|
||||
|
||||
// TODO: add option to enable/disable this
|
||||
if (c.requires_parameters().size() + c.requires_statements().size() > 0) {
|
||||
std::vector<std::string> parameters;
|
||||
parameters.reserve(c.requires_parameters().size());
|
||||
for (const auto &p : c.requires_parameters()) {
|
||||
parameters.emplace_back(p.to_string(config().using_namespace()));
|
||||
parameters.emplace_back(
|
||||
render_name(p.to_string(config().using_namespace())));
|
||||
}
|
||||
|
||||
ostr << fmt::format("({})\n", fmt::join(parameters, ","));
|
||||
ostr << indent(2)
|
||||
<< fmt::format("\"({})\"\n", fmt::join(parameters, ","));
|
||||
|
||||
ostr << "..\n";
|
||||
|
||||
ostr << fmt::format("{}\n", fmt::join(c.requires_statements(), "\n"));
|
||||
for (const auto &req : c.requires_statements()) {
|
||||
ostr << indent(2) << fmt::format("\"{}\"\n", render_name(req));
|
||||
}
|
||||
}
|
||||
|
||||
ostr << " }" << '\n';
|
||||
ostr << indent(1) << "}" << '\n';
|
||||
}
|
||||
|
||||
void generator::generate_member_notes(std::ostream &ostr,
|
||||
@@ -298,10 +299,8 @@ void generator::generate_member_notes(std::ostream &ostr,
|
||||
for (const auto &decorator : member.decorators()) {
|
||||
auto note = std::dynamic_pointer_cast<decorators::note>(decorator);
|
||||
if (note && note->applies_to_diagram(config().name)) {
|
||||
ostr << "note " << note->position << " of " << alias
|
||||
<< "::" << member.name() << '\n'
|
||||
<< note->text << '\n'
|
||||
<< "end note\n";
|
||||
ostr << indent(1) << "note for " << alias << " \"" << note->text
|
||||
<< "\"" << '\n';
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -411,7 +410,8 @@ void generator::generate_relationships(
|
||||
m_generated_aliases.end())
|
||||
continue;
|
||||
|
||||
relstr << c.alias() << " " << puml_relation << " " << target_alias;
|
||||
relstr << indent(1) << c.alias() << " " << puml_relation << " "
|
||||
<< target_alias;
|
||||
|
||||
if (!r.label().empty()) {
|
||||
relstr << " : " << mermaid_common::to_mermaid(r.access())
|
||||
@@ -419,7 +419,7 @@ void generator::generate_relationships(
|
||||
rendered_relations.emplace(r.label());
|
||||
}
|
||||
|
||||
if(r.type() == relationship_t::kContainment) {
|
||||
if (r.type() == relationship_t::kContainment) {
|
||||
relstr << " : [nested]\n";
|
||||
}
|
||||
|
||||
@@ -430,7 +430,7 @@ void generator::generate_relationships(
|
||||
|
||||
LOG_DBG("=== Adding relation {}", relstr.str());
|
||||
|
||||
all_relations_str << " " << relstr.str();
|
||||
all_relations_str << relstr.str();
|
||||
}
|
||||
}
|
||||
catch (error::uml_alias_missing &e) {
|
||||
@@ -451,8 +451,9 @@ void generator::generate_relationships(
|
||||
m_generated_aliases.end())
|
||||
continue;
|
||||
|
||||
relstr << target_alias << " <|-- " << c.alias() << '\n';
|
||||
all_relations_str << " " << relstr.str();
|
||||
relstr << indent(1) << target_alias << " <|-- " << c.alias()
|
||||
<< '\n';
|
||||
all_relations_str << relstr.str();
|
||||
}
|
||||
catch (error::uml_alias_missing &e) {
|
||||
LOG_DBG("=== Skipping inheritance relation from {} to {} due "
|
||||
@@ -512,7 +513,8 @@ void generator::generate_relationships(
|
||||
m_generated_aliases.end())
|
||||
continue;
|
||||
|
||||
relstr << c.alias() << " " << puml_relation << " " << target_alias;
|
||||
relstr << indent(1) << c.alias() << " " << puml_relation << " "
|
||||
<< target_alias;
|
||||
|
||||
if (!r.label().empty()) {
|
||||
relstr << " : " << mermaid_common::to_mermaid(r.access())
|
||||
@@ -558,7 +560,7 @@ void generator::generate_relationships(const enum_ &e, std::ostream &ostr) const
|
||||
m_generated_aliases.end())
|
||||
continue;
|
||||
|
||||
relstr << e.alias() << " "
|
||||
relstr << indent(1) << e.alias() << " "
|
||||
<< clanguml::common::generators::mermaid::to_mermaid(
|
||||
r.type(), r.style())
|
||||
<< " " << target_alias;
|
||||
@@ -568,7 +570,7 @@ void generator::generate_relationships(const enum_ &e, std::ostream &ostr) const
|
||||
|
||||
relstr << '\n';
|
||||
|
||||
ostr << " " << relstr.str();
|
||||
ostr << relstr.str();
|
||||
}
|
||||
catch (error::uml_alias_missing &ex) {
|
||||
LOG_DBG("Skipping {} relation from {} to {} due "
|
||||
@@ -582,45 +584,23 @@ void generator::generate_relationships(const enum_ &e, std::ostream &ostr) const
|
||||
|
||||
void generator::generate(const enum_ &e, std::ostream &ostr) const
|
||||
{
|
||||
ostr << " class " << e.alias();
|
||||
ostr << indent(1) << "class " << e.alias();
|
||||
|
||||
ostr << " {" << '\n';
|
||||
|
||||
ostr << " <<Enumeration>>\n";
|
||||
ostr << indent(2) << "<<Enumeration>>\n";
|
||||
|
||||
for (const auto &enum_constant : e.constants()) {
|
||||
ostr << " " << enum_constant << '\n';
|
||||
ostr << indent(2) << enum_constant << '\n';
|
||||
}
|
||||
|
||||
ostr << " }" << '\n';
|
||||
ostr << indent(1) << "}" << '\n';
|
||||
|
||||
generate_notes(ostr, e);
|
||||
}
|
||||
|
||||
void generator::generate(const package &p, std::ostream &ostr) const
|
||||
{
|
||||
const auto &uns = config().using_namespace();
|
||||
|
||||
if (config().generate_packages()) {
|
||||
LOG_DBG("Generating package {}", p.name());
|
||||
|
||||
// Don't generate packages from namespaces filtered out by
|
||||
// using_namespace
|
||||
if (!uns.starts_with({p.full_name(false)})) {
|
||||
print_debug(p, ostr);
|
||||
ostr << "package [" << p.name() << "] ";
|
||||
ostr << "as " << p.alias();
|
||||
|
||||
if (p.is_deprecated())
|
||||
ostr << " <<deprecated>>";
|
||||
|
||||
if (!p.style().empty())
|
||||
ostr << " " << p.style();
|
||||
|
||||
ostr << " {" << '\n';
|
||||
}
|
||||
}
|
||||
|
||||
for (const auto &subpackage : p) {
|
||||
if (dynamic_cast<package *>(subpackage.get()) != nullptr) {
|
||||
// TODO: add option - generate_empty_packages
|
||||
@@ -676,39 +656,6 @@ void generator::generate(const package &p, std::ostream &ostr) const
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (config().generate_packages()) {
|
||||
// Now generate any diagram elements which are in together
|
||||
// groups
|
||||
for (const auto &[group_name, group_elements] :
|
||||
together_group_stack_.get_current_groups()) {
|
||||
ostr << "together {\n";
|
||||
|
||||
for (auto *e : group_elements) {
|
||||
if (auto *cls = dynamic_cast<class_ *>(e); cls) {
|
||||
generate_alias(*cls, ostr);
|
||||
generate(*cls, ostr);
|
||||
}
|
||||
if (auto *enm = dynamic_cast<enum_ *>(e); enm) {
|
||||
generate_alias(*enm, ostr);
|
||||
generate(*enm, ostr);
|
||||
}
|
||||
if (auto *cpt = dynamic_cast<concept_ *>(e); cpt) {
|
||||
generate_alias(*cpt, ostr);
|
||||
generate(*cpt, ostr);
|
||||
}
|
||||
}
|
||||
|
||||
ostr << "}\n";
|
||||
}
|
||||
|
||||
// Don't generate packages from namespaces filtered out by
|
||||
// using_namespace
|
||||
if (!uns.starts_with({p.full_name(false)})) {
|
||||
ostr << "}" << '\n';
|
||||
generate_notes(ostr, p);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void generator::generate_relationships(
|
||||
@@ -817,7 +764,6 @@ void generator::generate_groups(std::ostream &ostr) const
|
||||
{
|
||||
for (const auto &[group_name, group_elements] :
|
||||
together_group_stack_.get_current_groups()) {
|
||||
ostr << "together {\n";
|
||||
|
||||
for (auto *e : group_elements) {
|
||||
if (auto *cls = dynamic_cast<class_ *>(e); cls) {
|
||||
@@ -833,9 +779,7 @@ void generator::generate_groups(std::ostream &ostr) const
|
||||
generate(*cpt, ostr);
|
||||
}
|
||||
}
|
||||
|
||||
ostr << "}\n";
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace clanguml::class_diagram::generators::plantuml
|
||||
} // namespace clanguml::class_diagram::generators::mermaid
|
||||
|
||||
@@ -91,7 +91,7 @@ public:
|
||||
void generate_top_level_elements(std::ostream &ostr) const;
|
||||
|
||||
/**
|
||||
* @brief Generate PlantUML alias for a class element.
|
||||
* @brief Generate MermaidJS alias for a class element.
|
||||
*
|
||||
* @param c Class element
|
||||
* @param ostr Output stream
|
||||
@@ -100,7 +100,7 @@ public:
|
||||
const common::model::element &e, std::ostream &ostr) const;
|
||||
|
||||
/**
|
||||
* @brief Render class element to PlantUML
|
||||
* @brief Render class element to MermaidJS
|
||||
*
|
||||
* @param c Class element
|
||||
* @param ostr Output stream
|
||||
@@ -108,7 +108,7 @@ public:
|
||||
void generate(const class_ &c, std::ostream &ostr) const;
|
||||
|
||||
/**
|
||||
* @brief Render class methods to PlantUML
|
||||
* @brief Render class methods to MermaidJS
|
||||
*
|
||||
* @param methods List of class methods
|
||||
* @param ostr Output stream
|
||||
@@ -117,7 +117,7 @@ public:
|
||||
const std::vector<class_method> &methods, std::ostream &ostr) const;
|
||||
|
||||
/**
|
||||
* @brief Render class methods to PlantUML in groups
|
||||
* @brief Render class methods to MermaidJS in groups
|
||||
*
|
||||
* @param methods Methods grouped by method type
|
||||
* @param ostr Output stream
|
||||
@@ -126,7 +126,7 @@ public:
|
||||
const method_groups_t &methods, std::ostream &ostr) const;
|
||||
|
||||
/**
|
||||
* @brief Render class method to PlantUML
|
||||
* @brief Render class method to MermaidJS
|
||||
*
|
||||
* @param m Class method
|
||||
* @param ostr Output stream
|
||||
@@ -134,7 +134,7 @@ public:
|
||||
void generate_method(const class_method &m, std::ostream &ostr) const;
|
||||
|
||||
/**
|
||||
* @brief Render class member to PlantUML
|
||||
* @brief Render class member to MermaidJS
|
||||
*
|
||||
* @param m Class member
|
||||
* @param ostr Output stream
|
||||
@@ -142,7 +142,7 @@ public:
|
||||
void generate_member(const class_member &m, std::ostream &ostr) const;
|
||||
|
||||
/**
|
||||
* @brief Render all relationships in the diagram to PlantUML
|
||||
* @brief Render all relationships in the diagram to MermaidJS
|
||||
*
|
||||
* @param ostr Output stream
|
||||
*/
|
||||
@@ -157,7 +157,7 @@ public:
|
||||
void generate_relationships(const class_ &c, std::ostream &ostr) const;
|
||||
|
||||
/**
|
||||
* @brief Render a specific relationship to PlantUML.
|
||||
* @brief Render a specific relationship to MermaidJS.
|
||||
*
|
||||
* @param r Relationship model
|
||||
* @param rendered_relations Set of already rendered relationships, to
|
||||
@@ -168,7 +168,7 @@ public:
|
||||
const relationship &r, std::set<std::string> &rendered_relations) const;
|
||||
|
||||
/**
|
||||
* @brief Render enum element to PlantUML
|
||||
* @brief Render enum element to MermaidJS
|
||||
*
|
||||
* @param e Enum element
|
||||
* @param ostr Output stream
|
||||
@@ -184,7 +184,7 @@ public:
|
||||
void generate_relationships(const enum_ &c, std::ostream &ostr) const;
|
||||
|
||||
/**
|
||||
* @brief Render concept element to PlantUML
|
||||
* @brief Render concept element to MermaidJS
|
||||
*
|
||||
* @param c Concept element
|
||||
* @param ostr Output stream
|
||||
@@ -200,7 +200,7 @@ public:
|
||||
void generate_relationships(const concept_ &c, std::ostream &ostr) const;
|
||||
|
||||
/**
|
||||
* @brief Render package element to PlantUML
|
||||
* @brief Render package element to MermaidJS
|
||||
*
|
||||
* @param p Package element
|
||||
* @param ostr Output stream
|
||||
@@ -220,7 +220,7 @@ public:
|
||||
*
|
||||
* @param ostream Output stream
|
||||
* @param member Class element (member or method)
|
||||
* @param alias PlantUML class alias
|
||||
* @param alias MermaidJS class alias
|
||||
*/
|
||||
void generate_member_notes(std::ostream &ostream,
|
||||
const class_element &member, const std::string &alias) const;
|
||||
|
||||
@@ -18,8 +18,8 @@
|
||||
#pragma once
|
||||
|
||||
#include "class_diagram/generators/json/class_diagram_generator.h"
|
||||
#include "class_diagram/generators/plantuml/class_diagram_generator.h"
|
||||
#include "class_diagram/generators/mermaid/class_diagram_generator.h"
|
||||
#include "class_diagram/generators/plantuml/class_diagram_generator.h"
|
||||
#include "cli/cli_handler.h"
|
||||
#include "common/compilation_database.h"
|
||||
#include "common/generators/generators.h"
|
||||
@@ -168,21 +168,21 @@ struct diagram_generator_t<clanguml::config::class_diagram,
|
||||
mermaid_generator_tag> {
|
||||
using type = clanguml::class_diagram::generators::mermaid::generator;
|
||||
};
|
||||
//template <>
|
||||
//struct diagram_generator_t<clanguml::config::sequence_diagram,
|
||||
// mermaid_generator_tag> {
|
||||
// using type = clanguml::sequence_diagram::generators::mermaid::generator;
|
||||
//};
|
||||
//template <>
|
||||
//struct diagram_generator_t<clanguml::config::package_diagram,
|
||||
// mermaid_generator_tag> {
|
||||
// using type = clanguml::package_diagram::generators::mermaid::generator;
|
||||
//};
|
||||
//template <>
|
||||
//struct diagram_generator_t<clanguml::config::include_diagram,
|
||||
// mermaid_generator_tag> {
|
||||
// using type = clanguml::include_diagram::generators::mermaid::generator;
|
||||
//};
|
||||
// template <>
|
||||
// struct diagram_generator_t<clanguml::config::sequence_diagram,
|
||||
// mermaid_generator_tag> {
|
||||
// using type = clanguml::sequence_diagram::generators::mermaid::generator;
|
||||
// };
|
||||
// template <>
|
||||
// struct diagram_generator_t<clanguml::config::package_diagram,
|
||||
// mermaid_generator_tag> {
|
||||
// using type = clanguml::package_diagram::generators::mermaid::generator;
|
||||
// };
|
||||
// template <>
|
||||
// struct diagram_generator_t<clanguml::config::include_diagram,
|
||||
// mermaid_generator_tag> {
|
||||
// using type = clanguml::include_diagram::generators::mermaid::generator;
|
||||
// };
|
||||
/** @} */
|
||||
|
||||
/**
|
||||
|
||||
@@ -24,23 +24,23 @@ std::string to_mermaid(relationship_t r, const std::string &style)
|
||||
switch (r) {
|
||||
case relationship_t::kOwnership:
|
||||
case relationship_t::kComposition:
|
||||
return style.empty() ? "*--" : fmt::format("*-[{}]-", style);
|
||||
return "*--";
|
||||
case relationship_t::kAggregation:
|
||||
return style.empty() ? "o--" : fmt::format("o-[{}]-", style);
|
||||
return "o--";
|
||||
case relationship_t::kContainment:
|
||||
return style.empty() ? "--" : fmt::format("-[{}]-", style);
|
||||
return "--";
|
||||
case relationship_t::kAssociation:
|
||||
return style.empty() ? "-->" : fmt::format("-[{}]->", style);
|
||||
return "-->";
|
||||
case relationship_t::kInstantiation:
|
||||
return style.empty() ? "..|>" : fmt::format(".[{}].|>", style);
|
||||
return "..|>";
|
||||
case relationship_t::kFriendship:
|
||||
return style.empty() ? "<.." : fmt::format("<.[{}].", style);
|
||||
return "<..";
|
||||
case relationship_t::kDependency:
|
||||
return style.empty() ? "..>" : fmt::format(".[{}].>", style);
|
||||
return "..>";
|
||||
case relationship_t::kConstraint:
|
||||
return style.empty() ? "..>" : fmt::format(".[{}].>", style);
|
||||
return "..>";
|
||||
case relationship_t::kAlias:
|
||||
return style.empty() ? ".." : fmt::format(".[{}].", style);
|
||||
return "..";
|
||||
default:
|
||||
return "";
|
||||
}
|
||||
@@ -72,4 +72,10 @@ std::string to_mermaid(message_t r)
|
||||
}
|
||||
}
|
||||
|
||||
std::string indent(const unsigned level)
|
||||
{
|
||||
const auto kIndentWidth = 4U;
|
||||
return std::string(level * kIndentWidth, ' ');
|
||||
}
|
||||
|
||||
} // namespace clanguml::common::generators::mermaid
|
||||
|
||||
@@ -42,6 +42,8 @@ std::string to_mermaid(relationship_t r, const std::string &style);
|
||||
std::string to_mermaid(access_t scope);
|
||||
std::string to_mermaid(message_t r);
|
||||
|
||||
std::string indent(const unsigned level);
|
||||
|
||||
/**
|
||||
* @brief Base class for diagram generators
|
||||
*
|
||||
@@ -103,8 +105,9 @@ public:
|
||||
/**
|
||||
* @brief Generate MermaidJS directives from config file.
|
||||
*
|
||||
* This method renders the MermaidJS directives provided in the configuration
|
||||
* file, including resolving any element aliases and Jinja templates.
|
||||
* This method renders the MermaidJS directives provided in the
|
||||
* configuration file, including resolving any element aliases and Jinja
|
||||
* templates.
|
||||
*
|
||||
* @param ostr Output stream
|
||||
* @param directives List of directives from the configuration file
|
||||
@@ -279,23 +282,21 @@ template <typename C, typename D>
|
||||
void generator<C, D>::generate_mermaid_directives(
|
||||
std::ostream &ostr, const std::vector<std::string> &directives) const
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
template <typename C, typename D>
|
||||
void generator<C, D>::generate_notes(
|
||||
std::ostream &ostr, const model::element &e) const
|
||||
{
|
||||
// const auto &config = generators::generator<C, D>::config();
|
||||
//
|
||||
// for (const auto &decorator : e.decorators()) {
|
||||
// auto note = std::dynamic_pointer_cast<decorators::note>(decorator);
|
||||
// if (note && note->applies_to_diagram(config.name)) {
|
||||
// ostr << "note " << note->position << " of " << e.alias() << '\n'
|
||||
// << note->text << '\n'
|
||||
// << "end note\n";
|
||||
// }
|
||||
// }
|
||||
const auto &config = generators::generator<C, D>::config();
|
||||
|
||||
for (const auto &decorator : e.decorators()) {
|
||||
auto note = std::dynamic_pointer_cast<decorators::note>(decorator);
|
||||
if (note && note->applies_to_diagram(config.name)) {
|
||||
ostr << indent(1) << "note for " << e.alias() << " \"" << note->text
|
||||
<< "\"" << '\n';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
template <typename C, typename D>
|
||||
@@ -305,9 +306,9 @@ void generator<C, D>::generate_metadata(std::ostream &ostr) const
|
||||
|
||||
if (config.generate_metadata()) {
|
||||
ostr << '\n'
|
||||
<< " %% Generated with clang-uml, version "
|
||||
<< "%% Generated with clang-uml, version "
|
||||
<< clanguml::version::CLANG_UML_VERSION << '\n'
|
||||
<< " %% LLVM version " << clang::getClangFullVersion() << '\n';
|
||||
<< "%% LLVM version " << clang::getClangFullVersion() << '\n';
|
||||
}
|
||||
}
|
||||
|
||||
@@ -318,7 +319,7 @@ void generator<C, D>::print_debug(
|
||||
const auto &config = generators::generator<C, D>::config();
|
||||
|
||||
if (config.debug_mode())
|
||||
ostr << " %% " << e.file() << ":" << e.line() << '\n';
|
||||
ostr << "%% " << e.file() << ":" << e.line() << '\n';
|
||||
}
|
||||
|
||||
template <typename DiagramModel, typename DiagramConfig>
|
||||
@@ -393,7 +394,7 @@ template <typename C, typename D> void generator<C, D>::init_env()
|
||||
});
|
||||
|
||||
//
|
||||
// Add PlantUML specific functions
|
||||
// Add MermaidJS specific functions
|
||||
//
|
||||
|
||||
// Return the entire element JSON context based on element name
|
||||
@@ -411,7 +412,7 @@ template <typename C, typename D> void generator<C, D>::init_env()
|
||||
return res;
|
||||
});
|
||||
|
||||
// Convert C++ entity to PlantUML alias, e.g.
|
||||
// Convert C++ entity to MermaidJS alias, e.g.
|
||||
// "note left of {{ alias("A") }}: This is a note"
|
||||
// Shortcut to:
|
||||
// {{ element("A").alias }}
|
||||
|
||||
@@ -37,7 +37,7 @@ using id_t = int64_t;
|
||||
enum class generator_type_t {
|
||||
plantuml, /*!< Diagrams will be gnerated in PlantUML format */
|
||||
json, /*!< Diagrams will be generated in JSON format */
|
||||
mermaid /*!< Diagrams will be generated in MermaidJS format */
|
||||
mermaid /*!< Diagrams will be generated in MermaidJS format */
|
||||
};
|
||||
|
||||
std::string to_string(const std::string &s);
|
||||
|
||||
@@ -150,6 +150,9 @@ types:
|
||||
plantuml: !optional
|
||||
before: !optional [string]
|
||||
after: !optional [string]
|
||||
mermaid: !optional
|
||||
before: !optional [string]
|
||||
after: !optional [string]
|
||||
relative_to: !optional string
|
||||
using_namespace: !optional [string, [string]]
|
||||
generate_metadata: !optional bool
|
||||
@@ -183,6 +186,9 @@ types:
|
||||
plantuml: !optional
|
||||
before: !optional [string]
|
||||
after: !optional [string]
|
||||
mermaid: !optional
|
||||
before: !optional [string]
|
||||
after: !optional [string]
|
||||
relative_to: !optional string
|
||||
using_namespace: !optional [string, [string]]
|
||||
generate_metadata: !optional bool
|
||||
@@ -214,6 +220,9 @@ types:
|
||||
plantuml: !optional
|
||||
before: !optional [string]
|
||||
after: !optional [string]
|
||||
mermaid: !optional
|
||||
before: !optional [string]
|
||||
after: !optional [string]
|
||||
relative_to: !optional string
|
||||
using_namespace: !optional [string, [string]]
|
||||
generate_metadata: !optional bool
|
||||
@@ -239,6 +248,9 @@ types:
|
||||
plantuml: !optional
|
||||
before: !optional [string]
|
||||
after: !optional [string]
|
||||
mermaid: !optional
|
||||
before: !optional [string]
|
||||
after: !optional [string]
|
||||
relative_to: !optional string
|
||||
using_namespace: !optional [string, [string]]
|
||||
generate_metadata: !optional bool
|
||||
@@ -281,6 +293,9 @@ root:
|
||||
plantuml: !optional
|
||||
before: !optional [string]
|
||||
after: !optional [string]
|
||||
mermaid: !optional
|
||||
before: !optional [string]
|
||||
after: !optional [string]
|
||||
relative_to: !optional string
|
||||
using_namespace: !optional [string, [string]]
|
||||
generate_metadata: !optional bool
|
||||
|
||||
Reference in New Issue
Block a user