Here is my solution:
Writeln('Standard write without special color');
ColoredWrite('This {color:yellow}Text {color:red}is {color:blue}very {color:black_on_blue} colorful{color:reset} but ends without color');
Writeln('');
ColoredWrite('{color:red}Red{color:red2}Red2{color:green}Green{color:green2}Green2{color:blue}Blue{color:blue2}Blue2'
+ '{color:yellow}Yellow{color:yellow2}Yellow2{color:purple}Purple{color:purple2}Purple2'
+ '{color:gray}Gray{color:black_on_blue}Black on Blue{color:white} White {color:red_on_white}Red on White'
+ '{color:reset} Original Color');
Writeln('');
Writeln('Standard write without special color');
The result looks like this:

And here is the necessary function:
uses Winapi.Windows, System.Generics.Collections;
procedure ColoredWrite(sString: string);
var
ConOut: THandle;
BufInfo: TConsoleScreenBufferInfo;
ColorDict: TDictionary<string, integer>;
iPos, iFirstPos: integer;
sFirstFind: string;
sKey: string;
begin
ColorDict := TDictionary<string, integer>.Create();
ColorDict.Add('{color:red}', FOREGROUND_RED);
ColorDict.Add('{color:red2}', FOREGROUND_INTENSITY or FOREGROUND_RED);
ColorDict.Add('{color:green}', FOREGROUND_INTENSITY or FOREGROUND_GREEN);
ColorDict.Add('{color:green2}', FOREGROUND_GREEN);
ColorDict.Add('{color:blue}', FOREGROUND_BLUE);
ColorDict.Add('{color:blue2}', FOREGROUND_INTENSITY or FOREGROUND_BLUE);
ColorDict.Add('{color:yellow}', FOREGROUND_RED or FOREGROUND_GREEN);
ColorDict.Add('{color:yellow2}', FOREGROUND_INTENSITY or FOREGROUND_RED or FOREGROUND_GREEN);
ColorDict.Add('{color:purple}', FOREGROUND_BLUE or FOREGROUND_RED);
ColorDict.Add('{color:purple2}', FOREGROUND_INTENSITY or FOREGROUND_BLUE or FOREGROUND_RED);
ColorDict.Add('{color:gray}', FOREGROUND_INTENSITY);
ColorDict.Add('{color:white}', FOREGROUND_INTENSITY or FOREGROUND_RED or FOREGROUND_GREEN or FOREGROUND_BLUE);
ColorDict.Add('{color:black_on_blue}', 0 or {BACKGROUND_RED or} BACKGROUND_BLUE or BACKGROUND_GREEN);
ColorDict.Add('{color:red_on_white}', FOREGROUND_INTENSITY or FOREGROUND_RED or 0 or BACKGROUND_INTENSITY or BACKGROUND_RED or BACKGROUND_BLUE or BACKGROUND_GREEN);
//Write(' '); // If there is no text output before retrieving BufInfo.wAttributes, then {color:reset} will set foreground and background color to black...
ConOut := TTextRec(Output).Handle;
GetConsoleScreenBufferInfo(ConOut, BufInfo);
ColorDict.Add('{color:reset}', BufInfo.wAttributes);
while sString.Length > 0 do begin
iFirstPos := sString.Length;
for sKey in ColorDict.Keys do begin
if sString.Contains(sKey) then begin
iPos := Pos(sKey, sString);
if iPos < iFirstPos then begin
iFirstPos := iPos;
sFirstFind := sKey;
end;
end;
end;
if iFirstPos < sString.Length then begin
Write(Copy(sString, 1, iFirstPos-1));
sString := Copy(sString, iFirstPos+sFirstFind.Length);
SetConsoleTextAttribute(TTextRec(Output).Handle, ColorDict[sFirstFind]);
end else begin
Write(sString);
sString := '';
end;
end;
ColorDict.Free;
end;