Skip to content

Commit

Permalink
#3481, ctrlstartposchar had an affect of previous paragraph, experime…
Browse files Browse the repository at this point in the history
…ntal truecolor support in hlf
  • Loading branch information
alabuzhev committed Sep 11, 2017
1 parent 35d336d commit 3799cd7
Show file tree
Hide file tree
Showing 16 changed files with 359 additions and 294 deletions.
4 changes: 2 additions & 2 deletions far/FarEng.hlf.m4
Expand Up @@ -2804,13 +2804,13 @@ saved path.
#(:F)# \f7стандартный текст на белом фоне\-
#(B:C)# \cbярко-голубой текст на ярко-красном фоне\-
#()# \07стандартный текст на стандартном фоне\-
#(T00CCCC:TE34234)# яйца дрозда на киновари
#(T00CCCC:TE34234)# \(T00CCCC:TE34234)яйца дрозда на киновари\-

Указанный цвет окрашивает приглашение до конца либо до следующего вхождения цвета.

Пример использования:

#(a)%username%(f)@@(b)%computername%() $p$g# \0aadmin\0f@@\0bserver\07 C:\>\-
#(a)%username%(f)@@(b)%computername%() $p$g# \0aadmin\0f@@\0bserver\07 C:\\>\-

@Viewer
$ #Viewer: control keys#
Expand Down
4 changes: 2 additions & 2 deletions far/FarRus.hlf.m4
Expand Up @@ -2872,13 +2872,13 @@ $ #Формат командной строки#
#(:F)# \f7стандартный текст на белом фоне\-
#(B:C)# \cbярко-голубой текст на ярко-красном фоне\-
#()# \07стандартный текст на стандартном фоне\-
#(T00CCCC:TE34234)# яйца дрозда на киновари
#(T00CCCC:TE34234)# \(T00CCCC:TE34234)яйца дрозда на киновари\-

Указанный цвет окрашивает приглашение до конца либо до следующего вхождения цвета.

Пример использования:

#(a)%username%(f)@@(b)%computername%() $p$g# \0aadmin\0f@@\0bserver\07 C:\>\-
#(a)%username%(f)@@(b)%computername%() $p$g# \0aadmin\0f@@\0bserver\07 C:\\>\-

@Viewer
$ #Программа просмотра: клавиши управления#
Expand Down
8 changes: 8 additions & 0 deletions far/changelog
@@ -1,3 +1,11 @@
drkns 11.09.2017 20:45:30 +0100 - build 5027

1. 0003481: hlf: Текст может выравниваться не смотря на отсутствие <CtrlStartPosChar>

2. CtrlStartPosChar мог внезапно влиять на предыдущий абзац.

3. Экспериментально - поддержка TrueColor в hlf. Формат ([[T]FFFFFFFF][:[T]BBBBBBBB]) - тот же, что и в промпте.

drkns 09.09.2017 22:00:37 +0100 - build 5026

1. Записываем стек и для тех исключений, которые были пойманы и переброшены через exception_ptr.
Expand Down
94 changes: 19 additions & 75 deletions far/cmdline.cpp
Expand Up @@ -560,48 +560,6 @@ bool CommandLine::ProcessMouse(const MOUSE_EVENT_RECORD *MouseEvent)
return CmdStr.ProcessMouse(MouseEvent);
}

static COLORREF ARGB2ABGR(COLORREF Color)
{
return (Color & 0xFF000000) | ((Color & 0x00FF0000) >> 16) | (Color & 0x0000FF00) | ((Color & 0x000000FF) << 16);
}

static bool AssignColor(const string& Color, COLORREF& Target, FARCOLORFLAGS& TargetFlags, FARCOLORFLAGS SetFlag)
{
if (!Color.empty())
{
const auto& Convert = [](const wchar_t* Ptr, COLORREF& Result)
{
wchar_t* EndPtr;
const auto Value = std::wcstoul(Ptr, &EndPtr, 16);
if (EndPtr == Ptr)
{
return false;
}
Result = Value;
return true;
};

if (upper(Color[0]) == L'T')
{
if (!Convert(Color.data() + 1, Target))
{
return false;
}
Target = ARGB2ABGR(Target);
TargetFlags &= ~SetFlag;
}
else
{
if (!Convert(Color.data(), Target))
{
return false;
}
TargetFlags |= SetFlag;
}
}
return true;
}

std::list<std::pair<string, FarColor>> CommandLine::GetPrompt()
{
FN_RETURN_TYPE(CommandLine::GetPrompt) Result;
Expand All @@ -612,44 +570,30 @@ std::list<std::pair<string, FarColor>> CommandLine::GetPrompt()
if (Global->Opt->CmdLine.UsePromptFormat)
{
const auto& Format = Global->Opt->CmdLine.strPromptFormat.Get();
auto F = PrefixColor;
auto Str = Format;
FOR_CONST_RANGE(Format, Ptr)
auto Tail = Format.cbegin();
auto Color = PrefixColor;
FOR_CONST_RANGE(Format, Iterator)
{
// color in ([[T]ffffffff][:[T]bbbbbbbb]) format
if (*Ptr == L'(')
bool Stop;
auto NewColor = PrefixColor;
const string_view CurrentView(&*Iterator, Format.cend() - Iterator);
const auto NextView = colors::ExtractColorInNewFormat(CurrentView, NewColor, Stop);
if (NextView.cbegin() == CurrentView.cbegin())
{
string Color = &*Ptr + 1;
auto Pos = Color.find(L')');
if(Pos != string::npos)
{
if (Ptr != Format.cbegin())
{
Str.resize(Str.find(L'('));
Result.emplace_back(Str, F);
}
Ptr += Pos+2;
Color.resize(Pos);
string BgColor;
Pos = Color.find(L':');
if (Pos != string::npos)
{
BgColor = Color.substr(Pos+1);
Color.resize(Pos);
}

F = PrefixColor;
if (Stop)
break;
continue;
}

if (AssignColor(Color, F.ForegroundColor, F.Flags, FCF_FG_4BIT) &&
AssignColor(BgColor, F.BackgroundColor, F.Flags, FCF_BG_4BIT))
{
Str = &*Ptr;
}
}
if (Iterator != Format.cbegin())
{
Result.emplace_back(string(Tail, Iterator), Color);
}
Iterator += NextView.cbegin() - CurrentView.cbegin();
Tail = Iterator;
Color = NewColor;
}

Result.emplace_back(Str, F);
Result.emplace_back(string(Tail, Format.cend()), Color);

std::for_each(RANGE(Result, i)
{
Expand Down
79 changes: 78 additions & 1 deletion far/colormix.cpp
Expand Up @@ -35,6 +35,7 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

#include "colormix.hpp"
#include "config.hpp"
#include "string_utils.hpp"

enum
{
Expand Down Expand Up @@ -175,4 +176,80 @@ const FarColor* StoreColor(const FarColor& Value)
static std::unordered_set<FarColor> ColorSet;
return &*ColorSet.emplace(Value).first;
}
}

static COLORREF ARGB2ABGR(COLORREF Color)
{
return (Color & 0xFF000000) | ((Color & 0x00FF0000) >> 16) | (Color & 0x0000FF00) | ((Color & 0x000000FF) << 16);
}

static const wchar_t* ExtractColor(const wchar_t* Color, COLORREF& Target, FARCOLORFLAGS& TargetFlags, FARCOLORFLAGS SetFlag)
{
// Empty string - default color
if (!*Color)
return Color;

const auto& Convert = [](const wchar_t*& Ptr, COLORREF& Result)
{
wchar_t* EndPtr;
const auto Value = std::wcstoul(Ptr, &EndPtr, 16);
if (EndPtr == Ptr)
{
return false;
}
Result = Value;
Ptr = EndPtr;
return true;
};

if (upper(Color[0]) == L'T')
{
auto NewPtr = Color + 1;
if (!Convert(NewPtr, Target))
{
return Color;
}
Color = NewPtr;
Target = ARGB2ABGR(Target);
TargetFlags &= ~SetFlag;
}
else
{
if (!Convert(Color, Target))
{
return Color;
}
TargetFlags |= SetFlag;
}
return Color;
}

string_view ExtractColorInNewFormat(string_view Str, FarColor& Color, bool& Stop)
{
Stop = false;
if (Str[0] != L'(')
return Str;

const auto FgColorBegin = Str.cbegin() + 1;
const auto ColorEnd = std::find(FgColorBegin, Str.cend(), L')');
if (ColorEnd == Str.cend())
{
Stop = true;
return Str;
}

const auto FgColorEnd = std::find(FgColorBegin, ColorEnd, L':');
const auto BgColorBegin = FgColorEnd == ColorEnd? ColorEnd : FgColorEnd + 1;
const auto BgColorEnd = ColorEnd;

auto NewColor = Color;
if ((FgColorBegin == FgColorEnd || ExtractColor(&*FgColorBegin, NewColor.ForegroundColor, NewColor.Flags, FCF_FG_4BIT)) &&
(BgColorBegin == BgColorEnd || ExtractColor(&*BgColorBegin, NewColor.BackgroundColor, NewColor.Flags, FCF_BG_4BIT)))
{
Color = NewColor;
return Str.substr(ColorEnd + 1 - Str.cbegin());
}

return Str;
}

}
4 changes: 3 additions & 1 deletion far/colormix.hpp
Expand Up @@ -42,7 +42,9 @@ namespace colors
FarColor ConsoleColorToFarColor(WORD Color);
const FarColor& PaletteColorToFarColor(PaletteColors ColorIndex);
const FarColor* StoreColor(const FarColor& Value);
};
// ([[T]FFFFFFFF][:[T]BBBBBBBB])
string_view ExtractColorInNewFormat(string_view Str, FarColor& Color, bool& Stop);
}

namespace std
{
Expand Down
25 changes: 25 additions & 0 deletions far/common/string_view.hpp
Expand Up @@ -58,9 +58,34 @@ class basic_string_view: public range<const T*>

constexpr basic_string_view substr(size_t Pos = 0, size_t Count = std::basic_string<T>::npos) const
{
assert(Pos <= this->size());
return { this->raw_data() + Pos, std::min(Count, this->size() - Pos) };
}

constexpr const auto& front() const
{
assert(!this->empty());
return *this->cbegin();
}

constexpr const auto& back() const
{
assert(!this->empty());
return *std::prev(this->cend());
}

/*constexpr*/ void remove_prefix(size_t Size)
{
assert(Size <= this->size());
*this = substr(Size);
}

/*constexpr*/ void remove_suffix(size_t Size)
{
assert(Size <= this->size());
*this = substr(0, this->size() - Size);
}

/*
ISO/IEC N4659 24.4.2.4 771
"Note: Unlike basic_string::data() and string literals, data() may return a pointer to a buffer that
Expand Down
2 changes: 1 addition & 1 deletion far/filelist.cpp
Expand Up @@ -8230,7 +8230,7 @@ void FileList::HighlightBorder(int Level, int ListPos) const
{
FarColor Color = colors::PaletteColorToFarColor(COL_PANELBOX);
Color.BackgroundColor = FileColor.BackgroundColor;
FileColor.Flags&FCF_BG_4BIT? Color.Flags|=FCF_BG_4BIT : Color.Flags&=~FCF_BG_4BIT;
Color.SetBg4Bit(FileColor.IsBg4Bit());
SetColor(Color);
}
}
Expand Down

0 comments on commit 3799cd7

Please sign in to comment.