From 6000db343bb2c1b44bed9eb4b14a179f839f3aa7 Mon Sep 17 00:00:00 2001 From: Jaakko Keränen Date: Mon, 5 Apr 2021 12:19:55 +0300 Subject: Fixed color escapes in link visit date A color escape may be longer than two characters. `run_Font_()` was not parsing extended color escapes correctly. --- src/ui/color.c | 1 + src/ui/documentwidget.c | 16 +++++++--------- src/ui/text.c | 6 +++--- 3 files changed, 11 insertions(+), 12 deletions(-) (limited to 'src') diff --git a/src/ui/color.c b/src/ui/color.c index 79606cd0..d6d68816 100644 --- a/src/ui/color.c +++ b/src/ui/color.c @@ -462,6 +462,7 @@ const char *escape_Color(int color) { if (color >= 0 && color < (int) iElemCount(esc)) { return esc[color]; } + /* TODO: Conflict with format strings! "%" (37) may be used as the color value. */ /* Double-\r is used for range extension. */ if (color + asciiBase_ColorEscape > 127) { iAssert(color - asciiExtended_ColorEscape + asciiBase_ColorEscape <= 127); diff --git a/src/ui/documentwidget.c b/src/ui/documentwidget.c index 240b2d4a..ff89f5ec 100644 --- a/src/ui/documentwidget.c +++ b/src/ui/documentwidget.c @@ -3245,7 +3245,7 @@ static void drawRun_DrawContext_(void *context, const iGmRun *run) { showHost)) { format_String( &str, - " \u2014%s%s%s\r%c%s", + " \u2014%s%s%s%s%s", showHost ? " " : "", showHost ? (flags & mailto_GmLinkFlag ? cstr_String(url) @@ -3256,9 +3256,8 @@ static void drawRun_DrawContext_(void *context, const iGmRun *run) { : "", showHost && (showImage || showAudio) ? " \u2014" : "", showImage || showAudio - ? asciiBase_ColorEscape + fg - : (asciiBase_ColorEscape + - linkColor_GmDocument(doc, run->linkId, domain_GmLinkPart)), + ? escape_Color(fg) + : escape_Color(linkColor_GmDocument(doc, run->linkId, domain_GmLinkPart)), showImage || showAudio ? format_CStr(showImage ? " %s \U0001f5bb" : " %s \U0001f3b5", cstr_Lang(showImage ? "link.hint.image" : "link.hint.audio")) @@ -3267,11 +3266,10 @@ static void drawRun_DrawContext_(void *context, const iGmRun *run) { if (run->flags & endOfLine_GmRunFlag && flags & visited_GmLinkFlag) { iDate date; init_Date(&date, linkTime_GmDocument(doc, run->linkId)); - appendFormat_String(&str, - " \u2014 %s%s", - escape_Color(linkColor_GmDocument(doc, run->linkId, - visited_GmLinkPart)), - cstr_String(collect_String(format_Date(&date, "%b %d")))); + appendCStr_String(&str, " \u2014 "); + appendCStr_String( + &str, escape_Color(linkColor_GmDocument(doc, run->linkId, visited_GmLinkPart))); + append_String(&str, collect_String(format_Date(&date, "%b %d"))); } if (!isEmpty_String(&str)) { const iInt2 textSize = measure_Text(metaFont, cstr_String(&str)); diff --git a/src/ui/text.c b/src/ui/text.c index 83073d1f..68dce44d 100644 --- a/src/ui/text.c +++ b/src/ui/text.c @@ -995,11 +995,11 @@ static iRect run_Font_(iFont *d, const iRunArgs *args) { if (ch == '\r') { /* color change */ iChar esc = nextChar_(&chPos, args->text.end); int colorNum = args->color; - if (esc != 0x24) { /* ASCII Cancel */ + if (esc == '\r') { /* Extended range. */ + esc = nextChar_(&chPos, args->text.end) + asciiExtended_ColorEscape; colorNum = esc - asciiBase_ColorEscape; } - else if (esc == '\r') { /* Extended range. */ - esc = nextChar_(&chPos, args->text.end) + asciiExtended_ColorEscape; + else if (esc != 0x24) { /* ASCII Cancel */ colorNum = esc - asciiBase_ColorEscape; } if (mode & draw_RunMode && ~mode & permanentColorFlag_RunMode) { -- cgit v1.2.3