diff --git a/include/eepp/ui/doc/syntaxcolorscheme.hpp b/include/eepp/ui/doc/syntaxcolorscheme.hpp index 634f4d9bc..e2bb7b3d7 100644 --- a/include/eepp/ui/doc/syntaxcolorscheme.hpp +++ b/include/eepp/ui/doc/syntaxcolorscheme.hpp @@ -4,7 +4,6 @@ #include #include #include -#include #include using namespace EE::System; @@ -64,6 +63,58 @@ class SyntaxStyleTypes { static constexpr auto MinimapHighlight = "minimap_highlight"_sst; static constexpr auto MinimapVisibleArea = "minimap_visible_area"_sst; + template static bool needsToBeCached( const Type& style ) { + if constexpr ( std::is_same_v ) { + return false; + } else if constexpr ( std::is_same_v ) { + switch ( style ) { + case SyntaxStyleTypes::Normal: + case SyntaxStyleTypes::Symbol: + case SyntaxStyleTypes::Comment: + case SyntaxStyleTypes::Keyword: + case SyntaxStyleTypes::Keyword2: + case SyntaxStyleTypes::Keyword3: + case SyntaxStyleTypes::Number: + case SyntaxStyleTypes::Literal: + case SyntaxStyleTypes::String: + case SyntaxStyleTypes::Operator: + case SyntaxStyleTypes::Function: + case SyntaxStyleTypes::Link: + case SyntaxStyleTypes::LinkHover: + case SyntaxStyleTypes::Background: + case SyntaxStyleTypes::Text: + case SyntaxStyleTypes::Caret: + case SyntaxStyleTypes::Selection: + case SyntaxStyleTypes::LineHighlight: + case SyntaxStyleTypes::LineNumber: + case SyntaxStyleTypes::LineNumber2: + case SyntaxStyleTypes::GutterBackground: + case SyntaxStyleTypes::Whitespace: + case SyntaxStyleTypes::LineBreakColumn: + case SyntaxStyleTypes::MatchingBracket: + case SyntaxStyleTypes::MatchingSelection: + case SyntaxStyleTypes::MatchingSearch: + case SyntaxStyleTypes::Suggestion: + case SyntaxStyleTypes::SuggestionScrollbar: + case SyntaxStyleTypes::SuggestionSelected: + case SyntaxStyleTypes::Error: + case SyntaxStyleTypes::Warning: + case SyntaxStyleTypes::Notice: + case SyntaxStyleTypes::SelectionRegion: + case SyntaxStyleTypes::MinimapBackground: + case SyntaxStyleTypes::MinimapCurrentLine: + case SyntaxStyleTypes::MinimapHover: + case SyntaxStyleTypes::MinimapSelection: + case SyntaxStyleTypes::MinimapHighlight: + case SyntaxStyleTypes::MinimapVisibleArea: + return false; + default: + break; + } + } + return true; + } + template static std::string toString( const Type& style ) { if constexpr ( std::is_same_v ) { return style; @@ -257,6 +308,9 @@ class EE_API SyntaxColorScheme { UnorderedMap mSyntaxColors; UnorderedMap mEditorColors; mutable UnorderedMap mStyleCache; + + template + const SyntaxColorScheme::Style& getSyntaxStyleFromCache( const SyntaxStyleType& type ) const; }; }}} // namespace EE::UI::Doc diff --git a/include/eepp/ui/doc/syntaxdefinition.hpp b/include/eepp/ui/doc/syntaxdefinition.hpp index cdcaa6442..3919c7772 100644 --- a/include/eepp/ui/doc/syntaxdefinition.hpp +++ b/include/eepp/ui/doc/syntaxdefinition.hpp @@ -26,6 +26,8 @@ template static auto toSyntaxStyleTypeV( const std::vector& s ) } struct EE_API SyntaxPattern { + static UnorderedMap SyntaxStyleTypeCache; + using DynamicSyntax = std::function; @@ -36,32 +38,16 @@ struct EE_API SyntaxPattern { DynamicSyntax dynSyntax; SyntaxPattern( std::vector&& _patterns, const std::string& _type, - const std::string& _syntax = "" ) : - patterns( std::move( _patterns ) ), - types( toSyntaxStyleTypeV( std::vector{ _type } ) ), - typesNames( { _type } ), - syntax( _syntax ) {} + const std::string& _syntax = "" ); SyntaxPattern( std::vector&& _patterns, std::vector&& _types, - const std::string& _syntax = "" ) : - patterns( std::move( _patterns ) ), - types( toSyntaxStyleTypeV( _types ) ), - typesNames( std::move( _types ) ), - syntax( _syntax ) {} + const std::string& _syntax = "" ); SyntaxPattern( std::vector&& _patterns, const std::string& _type, - DynamicSyntax&& _syntax ) : - patterns( std::move( _patterns ) ), - types( toSyntaxStyleTypeV( std::vector{ _type } ) ), - typesNames( { _type } ), - dynSyntax( std::move( _syntax ) ) {} + DynamicSyntax&& _syntax ); SyntaxPattern( std::vector&& _patterns, std::vector&& _types, - DynamicSyntax&& _syntax ) : - patterns( std::move( _patterns ) ), - types( toSyntaxStyleTypeV( _types ) ), - typesNames( std::move( _types ) ), - dynSyntax( std::move( _syntax ) ) {} + DynamicSyntax&& _syntax ); bool hasSyntax() const { return !syntax.empty() || dynSyntax; } }; diff --git a/src/eepp/ui/doc/syntaxcolorscheme.cpp b/src/eepp/ui/doc/syntaxcolorscheme.cpp index db712bbd1..228ca8702 100644 --- a/src/eepp/ui/doc/syntaxcolorscheme.cpp +++ b/src/eepp/ui/doc/syntaxcolorscheme.cpp @@ -9,6 +9,7 @@ #include #include #include +#include using namespace EE::Graphics; @@ -230,15 +231,7 @@ SyntaxColorScheme::getSyntaxStyle( const SyntaxStyleType& type ) const { auto foundIt = mStyleCache.find( type ); if ( foundIt != mStyleCache.end() ) return foundIt->second; - /*bool colorWasSet; - mStyleCache[type] = parseStyle( type, &colorWasSet, &mSyntaxColors ); - if ( !colorWasSet ) { - auto normalStyle = mSyntaxColors.find( "normal"_sst ); - if ( normalStyle != mSyntaxColors.end() ) { - mStyleCache[type].color = normalStyle->second.color; - } - } - return mStyleCache[type];*/ + return getSyntaxStyleFromCache( type ); } return StyleEmpty; } @@ -314,4 +307,26 @@ void SyntaxColorScheme::setName( const std::string& name ) { mName = name; } +template +const SyntaxColorScheme::Style& +SyntaxColorScheme::getSyntaxStyleFromCache( const SyntaxStyleType& type ) const { + bool colorWasSet = false; + if constexpr ( std::is_same_v ) + mStyleCache[type] = parseStyle( type, &colorWasSet, &mSyntaxColors ); + else { + auto cache = SyntaxPattern::SyntaxStyleTypeCache.find( type ); + if ( cache != SyntaxPattern::SyntaxStyleTypeCache.end() ) { + mStyleCache[type] = parseStyle( cache->second, &colorWasSet ); + } else { + return StyleEmpty; + } + } + if ( !colorWasSet ) { + auto normalStyle = mSyntaxColors.find( "normal"_sst ); + if ( normalStyle != mSyntaxColors.end() ) + mStyleCache[type].color = normalStyle->second.color; + } + return mStyleCache[type]; +} + }}} // namespace EE::UI::Doc diff --git a/src/eepp/ui/doc/syntaxdefinition.cpp b/src/eepp/ui/doc/syntaxdefinition.cpp index 8f2868eed..c7406c25e 100644 --- a/src/eepp/ui/doc/syntaxdefinition.cpp +++ b/src/eepp/ui/doc/syntaxdefinition.cpp @@ -4,6 +4,22 @@ namespace EE { namespace UI { namespace Doc { +UnorderedMap SyntaxPattern::SyntaxStyleTypeCache = {}; + +template void updateCache( const SyntaxPattern& ptrn ) { + if constexpr ( std::is_same_v ) { + return; + } else { + for ( size_t i = 0; i < ptrn.typesNames.size(); i++ ) { + if ( SyntaxStyleTypes::needsToBeCached( ptrn.types[i] ) ) { + auto it = SyntaxPattern::SyntaxStyleTypeCache.find( ptrn.types[i] ); + if ( it == SyntaxPattern::SyntaxStyleTypeCache.end() ) + SyntaxPattern::SyntaxStyleTypeCache[ptrn.types[i]] = ptrn.typesNames[i]; + } + } + } +} + SyntaxDefinition::SyntaxDefinition() {} SyntaxDefinition::SyntaxDefinition( const std::string& languageName, @@ -208,4 +224,40 @@ const String::HashType& SyntaxDefinition::getLanguageId() const { return mLanguageId; } +SyntaxPattern::SyntaxPattern( std::vector&& _patterns, const std::string& _type, + const std::string& _syntax ) : + patterns( std::move( _patterns ) ), + types( toSyntaxStyleTypeV( std::vector{ _type } ) ), + typesNames( { _type } ), + syntax( _syntax ) { + updateCache( *this ); +} + +SyntaxPattern::SyntaxPattern( std::vector&& _patterns, + std::vector&& _types, const std::string& _syntax ) : + patterns( std::move( _patterns ) ), + types( toSyntaxStyleTypeV( _types ) ), + typesNames( std::move( _types ) ), + syntax( _syntax ) { + updateCache( *this ); +} + +SyntaxPattern::SyntaxPattern( std::vector&& _patterns, const std::string& _type, + DynamicSyntax&& _syntax ) : + patterns( std::move( _patterns ) ), + types( toSyntaxStyleTypeV( std::vector{ _type } ) ), + typesNames( { _type } ), + dynSyntax( std::move( _syntax ) ) { + updateCache( *this ); +} + +SyntaxPattern::SyntaxPattern( std::vector&& _patterns, + std::vector&& _types, DynamicSyntax&& _syntax ) : + patterns( std::move( _patterns ) ), + types( toSyntaxStyleTypeV( _types ) ), + typesNames( std::move( _types ) ), + dynSyntax( std::move( _syntax ) ) { + updateCache( *this ); +} + }}} // namespace EE::UI::Doc diff --git a/src/eepp/ui/doc/syntaxdefinitionmanager.cpp b/src/eepp/ui/doc/syntaxdefinitionmanager.cpp index d8bc61aa7..6621eb36b 100644 --- a/src/eepp/ui/doc/syntaxdefinitionmanager.cpp +++ b/src/eepp/ui/doc/syntaxdefinitionmanager.cpp @@ -915,7 +915,7 @@ static void addYAML() { { { "'", "'", "\\" }, "string" }, { { "%-?%.inf" }, "number" }, { { "%.NaN" }, "number" }, - { { "(%&)(%g+)" }, { "keyword", "literal", "" } }, + { { "(%&)(%g+)" }, { "normal", "keyword", "literal" } }, { { "!%g+" }, "keyword" }, { { "<<" }, "literal" }, { { "https?://[%w_.~!*:@&+$/?%%#-]-%w[-.%w]*%.%w%w%w?%w?:?%d*/?[%w_.~!*:@&+$/"