diff --git a/README.md b/README.md index 55031611..901341ba 100644 --- a/README.md +++ b/README.md @@ -319,24 +319,24 @@ each diagram using simple YAML configuration: ```yaml include: - # Include elements from 2 namespaces + # Include only elements from these namespaces namespaces: - clanguml::common - clanguml::config # Include all subclasses of ClassA (including ClassA) subclasses: - clanguml::common::ClassA + # and classes in direct relation to ClassB (including ClassB) + context: + - clanguml::common::ClassB # Include only inheritance relationships relationships: - inheritance - # Include only classes in direct relation to ClassB (including ClassB) - context: - - clanguml::common::ClassB exclude: # Exclude all elements from detail namespace namespaces: - clanguml::common::detail - # Exclude ClassF + # and also exclude ClassF exclude: - clanguml::common::ClassF ``` diff --git a/src/class_diagram/model/diagram.cc b/src/class_diagram/model/diagram.cc index 26ba79e8..1f56f3a9 100644 --- a/src/class_diagram/model/diagram.cc +++ b/src/class_diagram/model/diagram.cc @@ -41,6 +41,21 @@ common::model::diagram_t diagram::type() const return common::model::diagram_t::kClass; } +type_safe::optional_ref diagram::get( + const std::string &full_name) const +{ + type_safe::optional_ref res; + + res = get_class(full_name); + + if (res.has_value()) + return res; + + res = get_enum(full_name); + + return res; +} + bool diagram::has_class(const class_ &c) const { return std::any_of(classes_.cbegin(), classes_.cend(), @@ -65,6 +80,18 @@ type_safe::optional_ref diagram::get_class( return type_safe::nullopt; } +type_safe::optional_ref diagram::get_enum( + const std::string &name) const +{ + for (const auto &e : enums_) { + if (e.get().full_name(false) == name) { + return {e}; + } + } + + return type_safe::nullopt; +} + void diagram::add_type_alias(std::unique_ptr &&ta) { LOG_DBG( diff --git a/src/class_diagram/model/diagram.h b/src/class_diagram/model/diagram.h index cf372240..85fbe2b6 100644 --- a/src/class_diagram/model/diagram.h +++ b/src/class_diagram/model/diagram.h @@ -43,6 +43,9 @@ public: common::model::diagram_t type() const override; + type_safe::optional_ref get( + const std::string &full_name) const override; + const std::vector> classes() const; const std::vector> enums() const; @@ -54,6 +57,9 @@ public: type_safe::optional_ref get_class( const std::string &name) const; + type_safe::optional_ref get_enum( + const std::string &name) const; + void add_type_alias(std::unique_ptr &&ta); void add_class(std::unique_ptr &&c); diff --git a/src/common/generators/plantuml/generator.h b/src/common/generators/plantuml/generator.h index 4d40604f..c8556aa1 100644 --- a/src/common/generators/plantuml/generator.h +++ b/src/common/generators/plantuml/generator.h @@ -325,6 +325,27 @@ template void generator::init_env() return m_model.to_alias( m_config.using_namespace().relative(alias_match)); }); + + m_env.add_callback("comment", 1, [this](inja::Arguments &args) { + std::string res{}; + auto full_name = args[0]->get(); + auto element = m_model.get(full_name); + + if (!element.has_value()) { + // Try with current using namespace prepended + element = m_model.get(fmt::format( + "{}::{}", m_config.using_namespace().to_string(), full_name)); + } + + if (element.has_value()) { + auto comment = element.value().comment(); + + if (comment.has_value()) + res = comment.value(); + } + + return res; + }); } } diff --git a/src/common/model/diagram.h b/src/common/model/diagram.h index 71483f4d..3d71e2fd 100644 --- a/src/common/model/diagram.h +++ b/src/common/model/diagram.h @@ -19,6 +19,8 @@ #include "enums.h" +#include + #include #include @@ -36,6 +38,9 @@ public: virtual diagram_t type() const = 0; + virtual type_safe::optional_ref get( + const std::string &full_name) const = 0; + diagram(const diagram &) = delete; diagram(diagram &&); diagram &operator=(const diagram &) = delete; diff --git a/src/common/model/element.cc b/src/common/model/element.cc index b048bfca..164d9292 100644 --- a/src/common/model/element.cc +++ b/src/common/model/element.cc @@ -80,6 +80,9 @@ inja::json element::context() const ctx["alias"] = alias(); ctx["full_name"] = full_name(false); ctx["namespace"] = get_namespace().to_string(); + if (comment().has_value()) + ctx["comment"] = comment().value(); + return ctx; } diff --git a/src/package_diagram/model/diagram.cc b/src/package_diagram/model/diagram.cc index f8835711..b0eb4030 100644 --- a/src/package_diagram/model/diagram.cc +++ b/src/package_diagram/model/diagram.cc @@ -28,6 +28,12 @@ common::model::diagram_t diagram::type() const return common::model::diagram_t::kPackage; } +type_safe::optional_ref diagram::get( + const std::string &full_name) const +{ + return {}; +} + std::string diagram::to_alias(const std::string &full_name) const { LOG_DBG("Looking for alias for {}", full_name); diff --git a/src/package_diagram/model/diagram.h b/src/package_diagram/model/diagram.h index f84fd1ad..81236add 100644 --- a/src/package_diagram/model/diagram.h +++ b/src/package_diagram/model/diagram.h @@ -40,6 +40,9 @@ public: common::model::diagram_t type() const override; + type_safe::optional_ref get( + const std::string &full_name) const; + std::string to_alias(const std::string &full_name) const; }; } diff --git a/src/sequence_diagram/model/diagram.cc b/src/sequence_diagram/model/diagram.cc index 779322ae..27695aa8 100644 --- a/src/sequence_diagram/model/diagram.cc +++ b/src/sequence_diagram/model/diagram.cc @@ -28,6 +28,12 @@ common::model::diagram_t diagram::type() const return common::model::diagram_t::kSequence; } +type_safe::optional_ref diagram::get( + const std::string &full_name) const +{ + return {}; +} + std::string diagram::to_alias(const std::string &full_name) const { return full_name; diff --git a/src/sequence_diagram/model/diagram.h b/src/sequence_diagram/model/diagram.h index c846fdd2..0c917960 100644 --- a/src/sequence_diagram/model/diagram.h +++ b/src/sequence_diagram/model/diagram.h @@ -36,6 +36,9 @@ public: common::model::diagram_t type() const override; + type_safe::optional_ref get( + const std::string &full_name) const; + std::string to_alias(const std::string &full_name) const; bool started{false}; diff --git a/tests/t00002/.clang-uml b/tests/t00002/.clang-uml index 7e8d802a..2304d547 100644 --- a/tests/t00002/.clang-uml +++ b/tests/t00002/.clang-uml @@ -12,4 +12,9 @@ diagrams: - clanguml::t00002 plantuml: after: - - 'note left of @A(A) : Base abstract interface.' + - 'note left of @A(A) : {{ comment("A") }}' + - 'note top of @A(B) : {{ comment("clanguml::t00002::B") }}' + - | + note right of {{ alias("D") }} + {{ comment("D") }} + end note \ No newline at end of file diff --git a/tests/t00002/test_case.h b/tests/t00002/test_case.h index fd3995bb..c145e9ec 100644 --- a/tests/t00002/test_case.h +++ b/tests/t00002/test_case.h @@ -56,6 +56,9 @@ TEST_CASE("t00002", "[test-case][class]") REQUIRE_THAT(puml, IsAssociation(_A("D"), _A("A"), "-as")); + REQUIRE_THAT(puml, HasNote(_A("A"), "left", "This is class A")); + REQUIRE_THAT(puml, HasNote(_A("B"), "top", "This is class B")); + save_puml( "./" + config.output_directory() + "/" + diagram->name + ".puml", puml); }