Skip to content
Snippets Groups Projects
Commit 455cbea2 authored by Rob Swindell's avatar Rob Swindell :speech_balloon:
Browse files

Merge branch 'dd_msg_reader_read_theme_colors_fix' into 'master'

DDMsgReader: Fix for reading colors from the theme file. Also, removed debug function from dd_lightbar_menu.js

See merge request !251
parents 25f025f9 6ccddf93
No related branches found
No related tags found
2 merge requests!463MRC mods by Codefenix (2024-10-20),!251DDMsgReader: Fix for reading colors from the theme file. Also, removed debug function from dd_lightbar_menu.js
......@@ -3084,55 +3084,3 @@ function getKeyWithESCChars(pGetKeyMode, pInputTimeoutMS)
return userInput;
}
function logStackTrace(levels) {
var callstack = [];
var isCallstackPopulated = false;
try {
i.dont.exist += 0; //doesn't exist- that's the point
} catch (e) {
if (e.stack) { //Firefox / chrome
var lines = e.stack.split('\n');
for (var i = 0, len = lines.length; i < len; i++) {
callstack.push(lines[i]);
}
//Remove call to logStackTrace()
callstack.shift();
isCallstackPopulated = true;
}
else if (window.opera && e.message) { //Opera
var lines = e.message.split('\n');
for (var i = 0, len = lines.length; i < len; i++) {
if (lines[i].match(/^\s*[A-Za-z0-9\-_\$]+\(/)) {
var entry = lines[i];
//Append next line also since it has the file info
if (lines[i + 1]) {
entry += " at " + lines[i + 1];
i++;
}
callstack.push(entry);
}
}
//Remove call to logStackTrace()
callstack.shift();
isCallstackPopulated = true;
}
}
if (!isCallstackPopulated) { //IE and Safari
var currentFunction = arguments.callee.caller;
while (currentFunction) {
var fn = currentFunction.toString();
var fname = fn.substring(fn.indexOf("function") + 8, fn.indexOf("(")) || "anonymous";
callstack.push(fname);
currentFunction = currentFunction.caller;
}
}
if (levels) {
console.print(callstack.slice(0, levels).join("\r\n"));
}
else {
console.print(callstack.join("\r\n"));
}
}
......@@ -88,6 +88,9 @@
* 2023-01-30 Eric Oulashin Version 1.62
* (Hopefully) Improved display of ANSI messages which would previously look
* bad with empty lines evrey other line
* 2023-02-01 Eric Oulashin Version 1.63
* Fix for reading colors from the theme file. Also, the theme file now
* no longer needs the control character for color codes.
*/
 
"use strict";
......@@ -192,8 +195,8 @@ var ansiterm = require("ansiterm_lib.js", 'expand_ctrl_a');
 
 
// Reader version information
var READER_VERSION = "1.62";
var READER_DATE = "2023-01-30";
var READER_VERSION = "1.63";
var READER_DATE = "2023-02-01";
 
// Keyboard key codes for displaying on the screen
var UP_ARROW = ascii(24);
......@@ -8272,7 +8275,8 @@ function DigDistMsgReader_ReadConfigFile()
var commentPos = 0; // Position of the start of a comment
var setting = null; // A setting name (string)
var value = null; // To store a value for a setting (string)
var onlySyncAttrsRegexWholeWord = new RegExp("^(\x01[krgybmcw01234567hinpq,;\.dtl<>\[\]asz])+$", 'i');
// A regex for attribute settings - Note that this doesn't contain some of the control codes
var onlySyncAttrsRegexWholeWord = new RegExp("^[\x01krgybmcw01234567hinq,;\.dtlasz]+$", 'i');;
while (!themeFile.eof)
{
// Read the next line from the config file.
......@@ -8348,11 +8352,15 @@ function DigDistMsgReader_ReadConfigFile()
(setting == "msgHdrToUserColor") || (setting == "msgHdrSubjColor") ||
(setting == "msgHdrDateColor"))
{
// Trim leading & trailing spaces from the value when
// setting a color. Also, replace any instances of "\x01"
// with the Synchronet attribute control character.
// Trim spaces from the color value
value = trimSpaces(value, true, true, true);
value = value.replace(/\\x01/g, "\x01"); // Replace "\x01" with control character
// If the value doesn't have any control characters, then add the control character
// before attribute characters
if (!/\x01/.test(value))
value = attrCodeStr(value);
if (onlySyncAttrsRegexWholeWord.test(value))
this.colors[setting] = trimSpaces(value, true, false, true).replace(/\\x01/g, "\x01");
this.colors[setting] = value;
}
// Text values
else if ((setting == "scrollbarBGChar") ||
......@@ -18699,7 +18707,8 @@ function removeInitialColorFromMsgBody(pMsgBody)
var msgBodyLines = pMsgBody.split("\r\n", 3);
if (msgBodyLines.length == 3)
{
var onlySyncAttrsRegexWholeWord = new RegExp("^(\x01[krgybmcw01234567hinpq,;\.dtl<>\[\]asz])+$", 'i');
// A regex for attribute settings - Note that this doesn't contain some of the control codes
var onlySyncAttrsRegexWholeWord = new RegExp("^[\x01krgybmcw01234567hinq,;\.dtlasz]+$", 'i');;
var line1Match = /^ Re: .*/.test(strip_ctrl(msgBodyLines[0]));
var line2Match = /^ By: .* on .*/.test(strip_ctrl(msgBodyLines[1]));
var line3OnlySyncAttrs = onlySyncAttrsRegexWholeWord.test(msgBodyLines[2]);
......@@ -20415,6 +20424,30 @@ function chgCharInStr(pStr, pCharIndex, pNewText)
return (pStr.substr(0, pCharIndex) + pNewText + pStr.substr(pCharIndex+1));
}
 
// Given a string of attribute characters, this function inserts the control code
// in front of each attribute character and returns the new string.
//
// Parameters:
// pAttrCodeCharStr: A string of attribute characters (i.e., "YH" for yellow high)
//
// Return value: A string with the control character inserted in front of the attribute characters
function attrCodeStr(pAttrCodeCharStr)
{
if (typeof(pAttrCodeCharStr) !== "string")
return "";
var str = "";
// See this page for Synchronet color attribute codes:
// http://wiki.synchro.net/custom:ctrl-a_codes
for (var i = 0; i < pAttrCodeCharStr.length; ++i)
{
var currentChar = pAttrCodeCharStr.charAt(i);
if (/[krgybmcwKRGYBMCWHhIiEeFfNn01234567]/.test(currentChar))
str += "\x01" + currentChar;
}
return str;
}
///////////////////////////////////////////////////////////////////////////////////
 
// For debugging: Writes some text on the screen at a given location with a given pause.
......
; -------- Misc./General colors --------
; Message body color
msgBodyColor=nw
msgBodyColor=nw
; Read message confirmation colors
readMsgConfirmColor=nc
readMsgConfirmNumberColor=hc
readMsgConfirmColor=nc
readMsgConfirmNumberColor=hc
; Prompt for continuing to list messages after reading a message
afterReadMsg_ListMorePromptColor=nc
afterReadMsg_ListMorePromptColor=nc
; Continue prompt colors for the traditional interface
tradInterfaceContPromptMainColor=ng ; Main text color
tradInterfaceContPromptHotkeyColor=hc ; Hotkey color
tradInterfaceContPromptUserInputColor=hg ; User input color
tradInterfaceContPromptMainColor=ng ; Main text color
tradInterfaceContPromptHotkeyColor=hc ; Hotkey color
tradInterfaceContPromptUserInputColor=hg ; User input color
; Text for "Loading personal mail..." %s will be replaced with "personal mail".
loadingPersonalMailText=ncLoading %s...
loadingPersonalMailText=\x01n\x01cLoading %s...
; Prompt text to confirm message deletion (without the ? at the end). %d will
; be replaced with the message number.
msgDelConfirmText=nhyDeletenc message #h%dnc: Are you sure
msgDelConfirmText=\x01n\x01h\x01yDelete\x01n\x01c message #\x01h%d\x01n\x01c: Are you sure
; Prompt text to confirm deletion of selected messages
delSelectedMsgsConfirmText=nhyDelete selected messages: Are you sure
delSelectedMsgsConfirmText=\x01n\x01h\x01yDelete selected messages: Are you sure
; Text for when a message has been marked for deletion. %d will be replaced
; with the message number.
msgDeletedText=ncMessage #h%dnc has been marked for deletion.
msgDeletedText=\x01n\x01cMessage #\x01h%d\x01n\x01c has been marked for deletion.
; Text for when selected (multiple) messages have been deleted
selectedMsgsDeletedText=ncSelected messages have been marked for deletion.
selectedMsgsDeletedText=\x01n\x01cSelected messages have been marked for deletion.
; Error text for cannot delete a message because the message is not the user's
; message or the user is not a sysop. %d will be replaced with the message
; number.
cannotDeleteMsgText_notYoursNotASysop=nhwCannot delete message #y%d wbecause it's not yours or you're not a sysop.
cannotDeleteMsgText_notYoursNotASysop=\x01n\x01h\x01wCannot delete message #\x01y%d \x01wbecause it's not yours or you're not a sysop.
; Error text for cannot delete a message because it's not the user's last
; posted message in a sub-board. %d will be replaced with the message number.
cannotDeleteMsgText_notLastPostedMsg=nhg* yCannot delete message #%d. You can only delete your last message in this area.
cannotDeleteMsgText_notLastPostedMsg=\x01n\x01h\x01g* \x01yCannot delete message #%d. You can only delete your last message in this area.
; Error text for cannot delete all selected messages
cannotDeleteAllSelectedMsgsText=nyh* Cannot delete all selected messages
cannotDeleteAllSelectedMsgsText=\x01n\x01y\x01h* Cannot delete all selected messages
; Prompt text to confirm message edit (without the ? at the end). %d will be
; replaced with the message number.
msgEditConfirmText=ncEdit message #h%dnc: Are you sure
msgEditConfirmText=\x01n\x01cEdit message #\x01h%d\x01n\x01c: Are you sure
; -------- Internal header lines displayed above a message --------
msgHdrMsgNumColor=nbh
msgHdrFromColor=nbh
msgHdrToColor=nbh
msgHdrToUserColor=ngh
msgHdrSubjColor=nbh
msgHdrDateColor=nbh
msgHdrMsgNumColor=nbh
msgHdrFromColor=nbh
msgHdrToColor=nbh
msgHdrToUserColor=ngh
msgHdrSubjColor=nbh
msgHdrDateColor=nbh
; -------- Message list colors & text --------
; Header line: "Current msg group:" - Normal cyan on blue background
msgListHeaderMsgGroupTextColor=n7r ; Red on white background
msgListHeaderMsgGroupTextColor=n7r ; Red on white background
; Header line: Message group name - High cyan
msgListHeaderMsgGroupNameColor=b ; Blue (will use the background specified in the last color)
msgListHeaderMsgGroupNameColor=b ; Blue (will use the background specified in the last color)
; Header line: "Current sub-board:" - Normal cyan on blue background
msgListHeaderSubBoardTextColor=n7r ; Red on white background
msgListHeaderSubBoardTextColor=n7r ; Red on white background
; Header line: Message sub-board name - High cyan
msgListHeaderMsgSubBoardName=b ; Blue (will use the background specified in the last color)
msgListHeaderMsgSubBoardName=b ; Blue (will use the background specified in the last color)
; Line with column headers - High white on black background
msgListColHeader=nhw
msgListColHeader=nhw
; Message information displayed in the message list
msgListMsgNumColor=nhy
msgListFromColor=nc
msgListToColor=nc
msgListSubjectColor=nc
msgListScoreColor=nc
msgListDateColor=hb
msgListTimeColor=hb
msgListMsgNumColor=nhy
msgListFromColor=nc
msgListToColor=nc
msgListSubjectColor=nc
msgListScoreColor=nc
msgListDateColor=hb
msgListTimeColor=hb
; Message information for messages written to the user
msgListToUserMsgNumColor=nhy
msgListToUserFromColor=hg
msgListToUserToColor=hg
msgListToUserSubjectColor=hg
msgListToUserScoreColor=hg
msgListToUserDateColor=hb
msgListToUserTimeColor=hb
msgListToUserMsgNumColor=nhy
msgListToUserFromColor=hg
msgListToUserToColor=hg
msgListToUserSubjectColor=hg
msgListToUserScoreColor=hg
msgListToUserDateColor=hb
msgListToUserTimeColor=hb
; Message information for messages from the user
msgListFromUserMsgNumColor=nhy
msgListFromUserFromColor=nc
msgListFromUserToColor=nc
msgListFromUserSubjectColor=nc
msgListFromUserScoreColor=nc
msgListFromUserDateColor=hb
msgListFromUserTimeColor=hb
msgListFromUserMsgNumColor=nhy
msgListFromUserFromColor=nc
msgListFromUserToColor=nc
msgListFromUserSubjectColor=nc
msgListFromUserScoreColor=nc
msgListFromUserDateColor=hb
msgListFromUserTimeColor=hb
; Message list highlight background color
msgListHighlightBkgColor=4
msgListHighlightBkgColor=4
; Message list highlighted message number
msgListMsgNumHighlightColor=hy
msgListMsgNumHighlightColor=hy
; Message list highlighted 'from' name
msgListFromHighlightColor=hc
msgListFromHighlightColor=hc
; Message list highlighted 'to' name
msgListToHighlightColor=hc
msgListToHighlightColor=hc
; Message list highlighted subject
msgListSubjHighlightColor=hc
msgListSubjHighlightColor=hc
; Message list highlighted score
msgListScoreHighlightColor=hc
msgListScoreHighlightColor=hc
; Message list highlighted date
msgListDateHighlightColor=hw
msgListDateHighlightColor=hw
; Message list highlighted time
msgListTimeHighlightColor=hw
msgListTimeHighlightColor=hw
; Colors for the lightbar message list help line text:
; Background
lightbarMsgListHelpLineBkgColor=7
lightbarMsgListHelpLineBkgColor=7
; The color for general text in the help line in the lightbar message list
lightbarMsgListHelpLineGeneralColor=b
lightbarMsgListHelpLineGeneralColor=b
; The color for the hotkeys in the help line in the lightbar message list
lightbarMsgListHelpLineHotkeyColor=r
lightbarMsgListHelpLineHotkeyColor=r
; The color for the ) separating the hotkeys from the general text in the
; help line in the lightbar message list
lightbarMsgListHelpLineParenColor=m
lightbarMsgListHelpLineParenColor=m
; Go to message number prompt text - Used for the G key in the message list to
; "go to" (move the screen/lightbar selection to) a specified message number
goToMsgNumPromptText=ncGo to message # (or hENTERnc to cancel)gh: c
goToMsgNumPromptText=\x01n\x01cGo to message # (or \x01hENTER\x01n\x01c to cancel)\x01g\x01h: \x01c
; -------- Colors for choosing a sub-board --------
areaChooserMsgAreaNumColor=nwh
areaChooserMsgAreaDescColor=nc
areaChooserMsgAreaNumItemsColor=bh
areaChooserMsgAreaHeaderColor=nyh
areaChooserSubBoardHeaderColor=ng
areaChooserMsgAreaMarkColor=gh
areaChooserMsgAreaLatestDateColor=ng
areaChooserMsgAreaLatestTimeColor=nm
areaChooserMsgAreaNumColor=nwh
areaChooserMsgAreaDescColor=nc
areaChooserMsgAreaNumItemsColor=bh
areaChooserMsgAreaHeaderColor=nyh
areaChooserSubBoardHeaderColor=ng
areaChooserMsgAreaMarkColor=gh
areaChooserMsgAreaLatestDateColor=ng
areaChooserMsgAreaLatestTimeColor=nm
; Highlighted colors for choosing a sub-board (for lightbar mode)
areaChooserMsgAreaBkgHighlightColor=4
areaChooserMsgAreaNumHighlightColor=wh
areaChooserMsgAreaDescHighlightColor=c
areaChooserMsgAreaDateHighlightColor=wh
areaChooserMsgAreaTimeHighlightColor=wh
areaChooserMsgAreaNumItemsHighlightColor=wh
areaChooserMsgAreaBkgHighlightColor=4
areaChooserMsgAreaNumHighlightColor=wh
areaChooserMsgAreaDescHighlightColor=c
areaChooserMsgAreaDateHighlightColor=wh
areaChooserMsgAreaTimeHighlightColor=wh
areaChooserMsgAreaNumItemsHighlightColor=wh
; Colors for the lightbar area chooser help line text:
; Background
lightbarAreaChooserHelpLineBkgColor=7
lightbarAreaChooserHelpLineBkgColor=7
; The color for general text in the help line in the lightbar message list
lightbarAreaChooserHelpLineGeneralColor=b
lightbarAreaChooserHelpLineGeneralColor=b
; The color for the hotkeys in the help line in the lightbar message list
lightbarAreaChooserHelpLineHotkeyColor=r
lightbarAreaChooserHelpLineHotkeyColor=r
; The color for the ) separating the hotkeys from the general text in the
; help line in the lightbar message list
lightbarAreaChooserHelpLineParenColor=m
lightbarAreaChooserHelpLineParenColor=m
; -------- Scrollable reader interface colors & text --------
; Scrollbar background color & character
scrollbarBGColor=nhk
scrollbarBGColor=nhk
scrollbarBGChar=
; Scrollbar scroll block color & character
scrollbarScrollBlockColor=nhw
scrollbarScrollBlockColor=nhw
scrollbarScrollBlockChar=
; Color for the line drawn in the 2nd to last line of the message
; area in the enhanced reader mode before a prompt
enhReaderPromptSepLineColor=nhg
enhReaderPromptSepLineColor=nhg
; Text to use for prompting the user whether or not to go to the previous or
; next message area (without the ? on the end)
goToPrevMsgAreaPromptText=nchGo to the previous message area
goToNextMsgAreaPromptText=nchGo to the next message area
goToPrevMsgAreaPromptText=\x01n\x01c\x01hGo to the previous message area
goToNextMsgAreaPromptText=\x01n\x01c\x01hGo to the next message area
; Colors for the enhanced reader help line text:
; Background
enhReaderHelpLineBkgColor=7
enhReaderHelpLineBkgColor=7
; The color for general text in the help line in the scrollable reader
; interface
enhReaderHelpLineGeneralColor=b
enhReaderHelpLineGeneralColor=b
; The color for the hotkeys in the help line in the scrollable reader
; interface
enhReaderHelpLineHotkeyColor=r
enhReaderHelpLineHotkeyColor=r
; The color for the ) separating the hotkeys from the general text in the
; help line in the scrollable reader interface
enhReaderHelpLineParenColor=m
enhReaderHelpLineParenColor=m
; The text to use for asking the user whether they want to post on a sub-board
; (for instance, after reading the last message). The two %s will be replaced
; with the message group name and sub-board description, respectively.
postOnSubBoard=ngPost on %s %s
postOnSubBoard=\x01n\x01gPost on %s %s
; -------- Search & scan colors & text --------
; The first text displayed when doing a new message scan, before
; the sub-board/group/all prompt is displayed
newMsgScanText=chNncew hMncessage hSnccan
newMsgScanText=\x01c\x01hN\x01n\x01cew \x01hM\x01n\x01cessage \x01hS\x01n\x01ccan
; The first text displayed when doing a new-to-you message scan, before
; the sub-board/group/all prompt is displayed
newToYouMsgScanText=chNncew hTnco hYncou hMncessage hSnccan
newToYouMsgScanText=\x01c\x01hN\x01n\x01cew \x01hT\x01n\x01co \x01hY\x01n\x01cou \x01hM\x01n\x01cessage \x01hS\x01n\x01ccan
; The first text displayed when doing a all-messages-to-you message scan,
; before the sub-board/group/all prompt is displayed
allToYouMsgScanText=chAncll hMncessages hTnco hYncou hSnccan
allToYouMsgScanText=\x01c\x01hA\x01n\x01cll \x01hM\x01n\x01cessages \x01hT\x01n\x01co \x01hY\x01n\x01cou \x01hS\x01n\x01ccan
; Text to display when the message scan is complete
msgScanCompleteText=nhcMncessage scan completehg.
msgScanCompleteText=\x01n\x01h\x01cM\x01n\x01cessage scan complete\x01h\x01g.
; Text to display when the message scan has been aborted
msgScanAbortedText=nhcMncessage scan hyiabortedn
msgScanAbortedText=\x01n\x01h\x01cM\x01n\x01cessage scan \x01h\x01y\x01iaborted\x01n
; Text for "Searching (current sub-board: ...)" above the search text prompt
; (%s is replaced with the sub-board name)
searchingSubBoardAbovePromptText=ncSearching (current sub-board: bh%snc)
searchingSubBoardAbovePromptText=\x01n\x01cSearching (current sub-board: \x01b\x01h%s\x01n\x01c)
; For displaying the sub-board name when doing a search. %s will be replaced
; with a sub-board name.
searchingSubBoardText=ncSearching h%snc...
searchingSubBoardText=\x01n\x01cSearching \x01h%s\x01n\x01c...
; No messages in a sub-board (i.e., trying to read a sub-board that has no
; messages). %s will be replaced with a sub-board name.
noMessagesInSubBoardText=nhbThere are no messages in the area w%sb.
noMessagesInSubBoardText=\x01n\x01h\x01bThere are no messages in the area \x01w%s\x01b.
; For no search results found in a sub-board. %s will be replaced with a
; sub-board name.
noSearchResultsInSubBoardText=nhbNo messages were found in the area w%sb with the given search criteria.
noSearchResultsInSubBoardText=\x01n\x01h\x01bNo messages were found in the area \x01w%s\x01b with the given search criteria.
; Prompt text to input a number of a message to read
readMsgNumPromptText=nghi* ncRead message #: h
readMsgNumPromptText=\x01n\x01g\x01h\x01i* \x01n\x01cRead message #: \x01h
; Invalid message number. %d will be replaced with the message number.
invalidMsgNumText=nyhInvalid message number: %d
invalidMsgNumText=\x01n\x01y\x01hInvalid message number: %d
; A message has been deleted. %d will be replaced with the message number.
msgHasBeenDeletedText=nhg* yMessage #w%d yhas been deleted.
msgHasBeenDeletedText=\x01n\x01h\x01g* \x01yMessage #\x01w%d \x01yhas been deleted.
; No kludge lines for this message
noKludgeLinesForThisMsgText=nhyThere are no kludge lines for this message.
noKludgeLinesForThisMsgText=\x01n\x01h\x01yThere are no kludge lines for this message.
; Text for "Seraching personal mail"
searchingPersonalMailText=whSearching personal mail
searchingPersonalMailText=\x01w\x01hSearching personal mail
; Text for prompting for search text
searchTextPromptText=cEnter the search textgh:nc
searchTextPromptText=\x01cEnter the search text\x01g\x01h:\x01n\x01c
; Text for prompting for a 'from' name
fromNamePromptText=cEnter the 'from' name to search forgh:nc
fromNamePromptText=\x01cEnter the 'from' name to search for\x01g\x01h:\x01n\x01c
; Text for prompting for a 'To' name
toNamePromptText=cEnter the 'to' name to search forgh:nc
toNamePromptText=\x01cEnter the 'to' name to search for\x01g\x01h:\x01n\x01c
; Text for an aborted operation (i.e., "Aborted")
abortedText=nyhiAbortedn
abortedText=\x01n\x01y\x01h\x01iAborted\x01n
; Text for no personal email messages
noPersonalEmailText=ncYou have no messages.
noPersonalEmailText=\x01n\x01cYou have no messages.
; -------- Traditional reader interface colors & text --------
; Text for the prompt for a message number for a message to be deleted
deleteMsgNumPromptText=ncNumber of the message to be deleted (or hENTERnc to cancel)gh: c
deleteMsgNumPromptText=\x01n\x01cNumber of the message to be deleted (or \x01hENTER\x01n\x01c to cancel)\x01g\x01h: \x01c
; Text for the prompt for a message number for a message to be edited
editMsgNumPromptText=ncNumber of the message to be edited (or hENTERnc to cancel)gh: c
editMsgNumPromptText=\x01n\x01cNumber of the message to be edited (or \x01hENTER\x01n\x01c to cancel)\x01g\x01h: \x01c
; Traditional/lightbar interface help screen text color
tradInterfaceHelpScreenColor=nc
tradInterfaceHelpScreenColor=nc
; -------- Colors for message header/kludge lines --------
hdrLineLabelColor=nc
hdrLineValueColor=nbh
hdrLineLabelColor=nc
hdrLineValueColor=nbh
; Selected message check mark color
selectedMsgMarkColor=wh
\ No newline at end of file
selectedMsgMarkColor=wh
\ No newline at end of file
Digital Distortion Message Reader
Version 1.62
Release date: 2023-01-30
Version 1.63
Release date: 2023-02-01
by
......
......@@ -5,6 +5,9 @@ Revision History (change log)
=============================
Version Date Description
------- ---- -----------
1.63 2023-02-01 Fix for reading colors from the theme file. Also, the
theme file now no longer needs the control character for
color codes.
1.62 2023-01-30 (Hopefully) Improved display of ANSI messages which would
previously look bad with empty lines evrey other line
1.61 2023-01-22 Fix: When replying to an email with an unknown sender
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment