First working version of Mermaid class diagram generator
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user