diff --git a/alib2cli/src/builtin/Dot.cpp b/alib2cli/src/builtin/Dot.cpp index e867028d59b38c0e9b974292eccf84f51ab053ef..6f78f73878a943f2f058723149e82d74c609e26a 100644 --- a/alib2cli/src/builtin/Dot.cpp +++ b/alib2cli/src/builtin/Dot.cpp @@ -8,16 +8,31 @@ #include "Dot.h" #include <registration/AlgoRegistration.hpp> #include <cstdlib> +#include <algorithm> +#include <cctype> namespace cli { namespace builtin { +std::vector < std::string> Dot::m_DotAllowedTypes { "dot", "xdot", "ps", "pdf", "svg", "svgz", "fig", "png", "gif", "jpg", "jpeg", "json", "imap", "cmapx" }; + void Dot::dot ( const std::string & data ) { - std::system ( ( "dot -Tx11 <<DOTDATA\n" + data + "\nDOTDATA" ).c_str ( ) ); + ( void ) std::system( ( "dot -Tx11 <<DOTDATA\n" + data + "\nDOTDATA" ).c_str ( ) ); +} + +void Dot::dot ( const std::string & data, const std::string & outputType, const std::string & outputFile ) { + std::string outputTypeLower; + std::transform ( outputType.begin( ), outputType.end(), std::back_inserter ( outputTypeLower ), ::tolower); + + if ( std::find ( m_DotAllowedTypes.begin( ), m_DotAllowedTypes.end ( ), outputType ) == m_DotAllowedTypes.end ( ) ) + throw exception::CommonException ( "Dot outputType is invalid." ); + + ( void ) std::system ( ( "dot -T" + outputTypeLower + " -o " + outputFile + "<<DOTDATA\n" + data + "\nDOTDATA" ).c_str ( ) ); } -auto DotString = registration::AbstractRegister < Dot, void, const std::string & > ( Dot::dot ); +auto DotTx11 = registration::AbstractRegister < Dot, void, const std::string & > ( Dot::dot ); +auto DotTpng = registration::AbstractRegister < Dot, void, const std::string &, const std::string &, const std::string & > ( Dot::dot ); } /* namespace builtin */ diff --git a/alib2cli/src/builtin/Dot.h b/alib2cli/src/builtin/Dot.h index c8c101acd8a3d2f706179649ae4e155ae6fa388c..788cdabe55c12896ccf91e1514f5aaf54263bcc2 100644 --- a/alib2cli/src/builtin/Dot.h +++ b/alib2cli/src/builtin/Dot.h @@ -9,6 +9,7 @@ #define _DOT_H_ #include <string> +#include <vector> namespace cli { @@ -17,9 +18,13 @@ namespace builtin { class Dot { public: /** - * Removes dead states from FSM. Melichar 2.29 + * Cli builtin for DOT format visualization */ static void dot( const std::string & dot ); + static void dot ( const std::string & data, const std::string & outputType, const std::string & outputFile ); + +private: + static std::vector < std::string > m_DotAllowedTypes; }; } /* namespace builtin */