Restore syntax custom style support.

This commit is contained in:
Martín Lucas Golini
2023-10-07 13:43:25 -03:00
parent 1bae4a4a9a
commit 176688030d
5 changed files with 138 additions and 31 deletions
+55 -1
View File
@@ -4,7 +4,6 @@
#include <eepp/system/color.hpp>
#include <eepp/system/iostream.hpp>
#include <eepp/system/pack.hpp>
#include <unordered_map>
#include <vector>
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 <typename Type> static bool needsToBeCached( const Type& style ) {
if constexpr ( std::is_same_v<Type, std::string> ) {
return false;
} else if constexpr ( std::is_same_v<Type, String::HashType> ) {
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 <typename Type> static std::string toString( const Type& style ) {
if constexpr ( std::is_same_v<Type, std::string> ) {
return style;
@@ -257,6 +308,9 @@ class EE_API SyntaxColorScheme {
UnorderedMap<SyntaxStyleType, Style> mSyntaxColors;
UnorderedMap<SyntaxStyleType, Style> mEditorColors;
mutable UnorderedMap<SyntaxStyleType, Style> mStyleCache;
template <typename SyntaxStyleType>
const SyntaxColorScheme::Style& getSyntaxStyleFromCache( const SyntaxStyleType& type ) const;
};
}}} // namespace EE::UI::Doc
+6 -20
View File
@@ -26,6 +26,8 @@ template <typename T> static auto toSyntaxStyleTypeV( const std::vector<T>& s )
}
struct EE_API SyntaxPattern {
static UnorderedMap<SyntaxStyleType, std::string> SyntaxStyleTypeCache;
using DynamicSyntax =
std::function<std::string( const SyntaxPattern&, const std::string_view& )>;
@@ -36,32 +38,16 @@ struct EE_API SyntaxPattern {
DynamicSyntax dynSyntax;
SyntaxPattern( std::vector<std::string>&& _patterns, const std::string& _type,
const std::string& _syntax = "" ) :
patterns( std::move( _patterns ) ),
types( toSyntaxStyleTypeV( std::vector<std::string>{ _type } ) ),
typesNames( { _type } ),
syntax( _syntax ) {}
const std::string& _syntax = "" );
SyntaxPattern( std::vector<std::string>&& _patterns, std::vector<std::string>&& _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<std::string>&& _patterns, const std::string& _type,
DynamicSyntax&& _syntax ) :
patterns( std::move( _patterns ) ),
types( toSyntaxStyleTypeV( std::vector<std::string>{ _type } ) ),
typesNames( { _type } ),
dynSyntax( std::move( _syntax ) ) {}
DynamicSyntax&& _syntax );
SyntaxPattern( std::vector<std::string>&& _patterns, std::vector<std::string>&& _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; }
};
+24 -9
View File
@@ -9,6 +9,7 @@
#include <eepp/system/log.hpp>
#include <eepp/system/packmanager.hpp>
#include <eepp/ui/doc/syntaxcolorscheme.hpp>
#include <eepp/ui/doc/syntaxdefinition.hpp>
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<SyntaxStyleType>( type );
}
return StyleEmpty;
}
@@ -314,4 +307,26 @@ void SyntaxColorScheme::setName( const std::string& name ) {
mName = name;
}
template <typename SyntaxStyleType>
const SyntaxColorScheme::Style&
SyntaxColorScheme::getSyntaxStyleFromCache( const SyntaxStyleType& type ) const {
bool colorWasSet = false;
if constexpr ( std::is_same_v<SyntaxStyleType, std::string> )
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
+52
View File
@@ -4,6 +4,22 @@
namespace EE { namespace UI { namespace Doc {
UnorderedMap<SyntaxStyleType, std::string> SyntaxPattern::SyntaxStyleTypeCache = {};
template <typename SyntaxStyleType> void updateCache( const SyntaxPattern& ptrn ) {
if constexpr ( std::is_same_v<SyntaxStyleType, std::string> ) {
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<std::string>&& _patterns, const std::string& _type,
const std::string& _syntax ) :
patterns( std::move( _patterns ) ),
types( toSyntaxStyleTypeV( std::vector<std::string>{ _type } ) ),
typesNames( { _type } ),
syntax( _syntax ) {
updateCache<SyntaxStyleType>( *this );
}
SyntaxPattern::SyntaxPattern( std::vector<std::string>&& _patterns,
std::vector<std::string>&& _types, const std::string& _syntax ) :
patterns( std::move( _patterns ) ),
types( toSyntaxStyleTypeV( _types ) ),
typesNames( std::move( _types ) ),
syntax( _syntax ) {
updateCache<SyntaxStyleType>( *this );
}
SyntaxPattern::SyntaxPattern( std::vector<std::string>&& _patterns, const std::string& _type,
DynamicSyntax&& _syntax ) :
patterns( std::move( _patterns ) ),
types( toSyntaxStyleTypeV( std::vector<std::string>{ _type } ) ),
typesNames( { _type } ),
dynSyntax( std::move( _syntax ) ) {
updateCache<SyntaxStyleType>( *this );
}
SyntaxPattern::SyntaxPattern( std::vector<std::string>&& _patterns,
std::vector<std::string>&& _types, DynamicSyntax&& _syntax ) :
patterns( std::move( _patterns ) ),
types( toSyntaxStyleTypeV( _types ) ),
typesNames( std::move( _types ) ),
dynSyntax( std::move( _syntax ) ) {
updateCache<SyntaxStyleType>( *this );
}
}}} // namespace EE::UI::Doc
+1 -1
View File
@@ -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_.~!*:@&+$/"