diff --git a/client/js/libs/handlebars/ircmessageparser/parseStyle.js b/client/js/libs/handlebars/ircmessageparser/parseStyle.js index 642b4e52..39e06abe 100644 --- a/client/js/libs/handlebars/ircmessageparser/parseStyle.js +++ b/client/js/libs/handlebars/ircmessageparser/parseStyle.js @@ -23,7 +23,7 @@ const controlCodesRx = /[\u0000-\u001F]/g; // Converts a given text into an array of objects, each of them representing a // similarly styled section of the text. Each object carries the `text`, style -// information (`bold`, `textColor`, `bgcolor`, `reverse`, `italic`, +// information (`bold`, `textColor`, `bgcolor`, `italic`, // `underline`, `strikethrough`, `monospace`), and `start`/`end` cursors. function parseStyle(text) { const result = []; @@ -32,7 +32,7 @@ function parseStyle(text) { // At any given time, these carry style information since last time a styling // control code was met. - let colorCodes, bold, textColor, bgColor, hexColor, hexBgColor, reverse, italic, underline, strikethrough, monospace; + let colorCodes, bold, textColor, bgColor, hexColor, hexBgColor, italic, underline, strikethrough, monospace; const resetStyle = () => { bold = false; @@ -40,7 +40,6 @@ function parseStyle(text) { bgColor = undefined; hexColor = undefined; hexBgColor = undefined; - reverse = false; italic = false; underline = false; strikethrough = false; @@ -69,7 +68,6 @@ function parseStyle(text) { bgColor, hexColor, hexBgColor, - reverse, italic, underline, strikethrough, @@ -148,11 +146,13 @@ function parseStyle(text) { break; - case REVERSE: + case REVERSE: { emitFragment(); - reverse = !reverse; + const tmp = bgColor; + bgColor = textColor; + textColor = tmp; break; - + } case ITALIC: emitFragment(); italic = !italic; @@ -184,7 +184,7 @@ function parseStyle(text) { return result; } -const properties = ["bold", "textColor", "bgColor", "hexColor", "hexBgColor", "italic", "underline", "reverse", "strikethrough", "monospace"]; +const properties = ["bold", "textColor", "bgColor", "hexColor", "hexBgColor", "italic", "underline", "strikethrough", "monospace"]; function prepare(text) { return parseStyle(text) diff --git a/test/client/js/libs/handlebars/ircmessageparser/parseStyle.js b/test/client/js/libs/handlebars/ircmessageparser/parseStyle.js index 99f14a80..525851c2 100644 --- a/test/client/js/libs/handlebars/ircmessageparser/parseStyle.js +++ b/test/client/js/libs/handlebars/ircmessageparser/parseStyle.js @@ -12,7 +12,6 @@ describe("parseStyle", () => { bgColor: undefined, hexColor: undefined, hexBgColor: undefined, - reverse: false, italic: false, underline: false, strikethrough: false, @@ -36,7 +35,6 @@ describe("parseStyle", () => { bgColor: undefined, hexColor: undefined, hexBgColor: undefined, - reverse: false, italic: false, underline: false, strikethrough: false, @@ -60,7 +58,6 @@ describe("parseStyle", () => { bgColor: undefined, hexColor: undefined, hexBgColor: undefined, - reverse: false, italic: false, underline: false, strikethrough: true, @@ -84,7 +81,6 @@ describe("parseStyle", () => { bgColor: undefined, hexColor: undefined, hexBgColor: undefined, - reverse: false, italic: false, underline: false, strikethrough: false, @@ -108,7 +104,6 @@ describe("parseStyle", () => { bgColor: undefined, hexColor: undefined, hexBgColor: undefined, - reverse: false, italic: false, underline: false, strikethrough: false, @@ -123,7 +118,6 @@ describe("parseStyle", () => { bgColor: undefined, hexColor: undefined, hexBgColor: undefined, - reverse: false, italic: false, underline: false, strikethrough: false, @@ -138,7 +132,6 @@ describe("parseStyle", () => { bgColor: undefined, hexColor: undefined, hexBgColor: undefined, - reverse: false, italic: false, underline: false, strikethrough: false, @@ -153,7 +146,6 @@ describe("parseStyle", () => { bgColor: undefined, hexColor: undefined, hexBgColor: undefined, - reverse: false, italic: false, underline: false, strikethrough: false, @@ -177,7 +169,6 @@ describe("parseStyle", () => { bgColor: undefined, hexColor: undefined, hexBgColor: undefined, - reverse: false, italic: false, underline: true, strikethrough: false, @@ -192,7 +183,6 @@ describe("parseStyle", () => { bgColor: undefined, hexColor: undefined, hexBgColor: undefined, - reverse: false, italic: false, underline: true, strikethrough: false, @@ -207,7 +197,6 @@ describe("parseStyle", () => { bgColor: undefined, hexColor: undefined, hexBgColor: undefined, - reverse: false, italic: false, underline: false, strikethrough: false, @@ -222,7 +211,6 @@ describe("parseStyle", () => { bgColor: undefined, hexColor: undefined, hexBgColor: undefined, - reverse: false, italic: false, underline: false, strikethrough: false, @@ -246,7 +234,6 @@ describe("parseStyle", () => { bgColor: 9, hexColor: undefined, hexBgColor: undefined, - reverse: false, italic: false, underline: false, strikethrough: false, @@ -270,7 +257,6 @@ describe("parseStyle", () => { bgColor: undefined, hexColor: undefined, hexBgColor: undefined, - reverse: false, italic: true, underline: false, strikethrough: false, @@ -285,7 +271,6 @@ describe("parseStyle", () => { bgColor: undefined, hexColor: undefined, hexBgColor: undefined, - reverse: false, italic: true, underline: false, strikethrough: true, @@ -300,7 +285,6 @@ describe("parseStyle", () => { bgColor: undefined, hexColor: undefined, hexBgColor: undefined, - reverse: false, italic: false, underline: false, strikethrough: true, @@ -315,7 +299,6 @@ describe("parseStyle", () => { bgColor: undefined, hexColor: undefined, hexBgColor: undefined, - reverse: false, italic: false, underline: false, strikethrough: false, @@ -339,7 +322,6 @@ describe("parseStyle", () => { bgColor: 2, hexColor: undefined, hexBgColor: undefined, - reverse: false, italic: false, underline: false, strikethrough: false, @@ -354,7 +336,6 @@ describe("parseStyle", () => { bgColor: 2, hexColor: undefined, hexBgColor: undefined, - reverse: false, italic: false, underline: false, strikethrough: true, @@ -378,7 +359,6 @@ describe("parseStyle", () => { bgColor: 4, hexColor: undefined, hexBgColor: undefined, - reverse: false, italic: true, underline: false, strikethrough: true, @@ -402,7 +382,6 @@ describe("parseStyle", () => { bgColor: undefined, hexColor: undefined, hexBgColor: undefined, - reverse: false, italic: false, underline: false, strikethrough: false, @@ -417,7 +396,6 @@ describe("parseStyle", () => { bgColor: undefined, hexColor: undefined, hexBgColor: undefined, - reverse: false, italic: false, underline: false, strikethrough: true, @@ -432,7 +410,6 @@ describe("parseStyle", () => { bgColor: undefined, hexColor: undefined, hexBgColor: undefined, - reverse: false, italic: false, underline: false, strikethrough: false, @@ -447,7 +424,6 @@ describe("parseStyle", () => { bgColor: undefined, hexColor: undefined, hexBgColor: undefined, - reverse: false, italic: false, underline: false, strikethrough: true, @@ -471,7 +447,6 @@ describe("parseStyle", () => { bgColor: undefined, hexColor: undefined, hexBgColor: undefined, - reverse: false, italic: false, underline: false, strikethrough: false, @@ -495,7 +470,6 @@ describe("parseStyle", () => { hexColor: undefined, hexBgColor: undefined, bold: false, - reverse: false, italic: false, underline: false, strikethrough: false, @@ -519,7 +493,6 @@ describe("parseStyle", () => { bgColor: undefined, hexColor: undefined, hexBgColor: undefined, - reverse: false, italic: true, underline: false, strikethrough: false, @@ -543,7 +516,6 @@ describe("parseStyle", () => { bgColor: undefined, hexColor: undefined, hexBgColor: undefined, - reverse: false, italic: false, underline: false, strikethrough: false, @@ -558,7 +530,6 @@ describe("parseStyle", () => { bgColor: undefined, hexColor: "FFFFFF", hexBgColor: undefined, - reverse: false, italic: false, underline: false, strikethrough: false, @@ -573,7 +544,6 @@ describe("parseStyle", () => { bgColor: undefined, hexColor: undefined, hexBgColor: undefined, - reverse: false, italic: false, underline: false, strikethrough: false, @@ -588,7 +558,6 @@ describe("parseStyle", () => { bgColor: 4, hexColor: "FF00FF", hexBgColor: undefined, - reverse: false, italic: false, underline: false, strikethrough: false, @@ -603,7 +572,6 @@ describe("parseStyle", () => { bgColor: 4, hexColor: "EEEAFF", hexBgColor: "001122", - reverse: false, italic: false, underline: false, strikethrough: false, @@ -618,7 +586,6 @@ describe("parseStyle", () => { bgColor: undefined, hexColor: undefined, hexBgColor: undefined, - reverse: false, italic: false, underline: false, strikethrough: false, @@ -634,6 +601,219 @@ describe("parseStyle", () => { expect(actual).to.deep.equal(expected); }); + it("should reverse and format color", () => { + const input = "\x032,9text with fg and bg \x16with text reversed"; + const expected = [{ + bold: false, + textColor: 2, + bgColor: 9, + hexColor: undefined, + hexBgColor: undefined, + italic: false, + underline: false, + strikethrough: false, + monospace: false, + text: "text with fg and bg ", + + start: 0, + end: 20, + }, { + bold: false, + textColor: 9, + bgColor: 2, + hexColor: undefined, + hexBgColor: undefined, + italic: false, + underline: false, + strikethrough: false, + monospace: false, + text: "with text reversed", + + start: 20, + end: 38, + }]; + + const actual = parseStyle(input); + + expect(actual).to.deep.equal(expected); + }); + + it("should toggle reverse correctly", () => { + const input = "\x0305,11text \x16reversed and \x16back again and \x16reversed"; + const expected = [{ + bold: false, + textColor: 5, + bgColor: 11, + hexColor: undefined, + hexBgColor: undefined, + italic: false, + underline: false, + strikethrough: false, + monospace: false, + text: "text ", + + start: 0, + end: 5, + }, { + bold: false, + textColor: 11, + bgColor: 5, + hexColor: undefined, + hexBgColor: undefined, + italic: false, + underline: false, + strikethrough: false, + monospace: false, + text: "reversed and ", + + start: 5, + end: 18, + }, { + bold: false, + textColor: 5, + bgColor: 11, + hexColor: undefined, + hexBgColor: undefined, + italic: false, + underline: false, + strikethrough: false, + monospace: false, + text: "back again and ", + + start: 18, + end: 33, + }, { + bold: false, + textColor: 11, + bgColor: 5, + hexColor: undefined, + hexBgColor: undefined, + italic: false, + underline: false, + strikethrough: false, + monospace: false, + text: "reversed", + + start: 33, + end: 41, + }]; + + const actual = parseStyle(input); + + expect(actual).to.deep.equal(expected); + }); + + it("should escape reverse when a new style is applied", () => { + const input = "\x0311,02text \x16 reversed \x0304,05 and new style"; + const expected = [{ + bold: false, + textColor: 11, + bgColor: 2, + hexColor: undefined, + hexBgColor: undefined, + italic: false, + underline: false, + strikethrough: false, + monospace: false, + text: "text ", + + start: 0, + end: 5, + }, { + bold: false, + textColor: 2, + bgColor: 11, + hexColor: undefined, + hexBgColor: undefined, + italic: false, + underline: false, + strikethrough: false, + monospace: false, + text: " reversed ", + + start: 5, + end: 15, + }, { + bold: false, + textColor: 4, + bgColor: 5, + hexColor: undefined, + hexBgColor: undefined, + italic: false, + underline: false, + strikethrough: false, + monospace: false, + text: " and new style", + + start: 15, + end: 29, + }]; + + const actual = parseStyle(input); + + expect(actual).to.deep.equal(expected); + }); + + it("should not reverse if color is specified after reverse tag", () => { + const input = "\x16\x032,9text with fg and bg"; + const expected = [{ + bold: false, + textColor: 2, + bgColor: 9, + hexColor: undefined, + hexBgColor: undefined, + italic: false, + underline: false, + strikethrough: false, + monospace: false, + text: "text with fg and bg", + + start: 0, + end: 19, + }]; + + const actual = parseStyle(input); + + expect(actual).to.deep.equal(expected); + }); + + it("should reverse, bold, and italics", () => { + const input = "\x034,13\x16\x02some text with \x1ditalics"; + const expected = [{ + bold: true, + textColor: 13, + bgColor: 4, + hexColor: undefined, + hexBgColor: undefined, + italic: false, + underline: false, + strikethrough: false, + monospace: false, + text: "some text with ", + + start: 0, + end: 15, + }, { + bold: true, + textColor: 13, + bgColor: 4, + hexColor: undefined, + hexBgColor: undefined, + italic: true, + underline: false, + strikethrough: false, + monospace: false, + text: "italics", + + start: 15, + end: 22, + }]; + + const actual = parseStyle(input); + + expect(actual).to.deep.equal(expected); + }); + it("should carry state correctly forward", () => { const input = "\x02bold\x038yellow\x02nonBold\x03default"; const expected = [{ @@ -642,7 +822,6 @@ describe("parseStyle", () => { bgColor: undefined, hexColor: undefined, hexBgColor: undefined, - reverse: false, italic: false, underline: false, strikethrough: false, @@ -657,7 +836,6 @@ describe("parseStyle", () => { bgColor: undefined, hexColor: undefined, hexBgColor: undefined, - reverse: false, italic: false, underline: false, strikethrough: false, @@ -672,7 +850,6 @@ describe("parseStyle", () => { bgColor: undefined, hexColor: undefined, hexBgColor: undefined, - reverse: false, italic: false, underline: false, strikethrough: false, @@ -687,7 +864,6 @@ describe("parseStyle", () => { bgColor: undefined, hexColor: undefined, hexBgColor: undefined, - reverse: false, italic: false, underline: false, strikethrough: false, @@ -711,7 +887,6 @@ describe("parseStyle", () => { bgColor: undefined, hexColor: undefined, hexBgColor: undefined, - reverse: false, italic: false, underline: false, strikethrough: false, @@ -726,7 +901,6 @@ describe("parseStyle", () => { bgColor: undefined, hexColor: undefined, hexBgColor: undefined, - reverse: false, italic: false, underline: false, strikethrough: false, @@ -741,7 +915,6 @@ describe("parseStyle", () => { bgColor: undefined, hexColor: undefined, hexBgColor: undefined, - reverse: false, italic: false, underline: false, strikethrough: false, @@ -761,11 +934,10 @@ describe("parseStyle", () => { const input = "\x11\x1e\x02\x034\x16\x1d\x1ffull\x0fnone"; const expected = [{ bold: true, - textColor: 4, - bgColor: undefined, + textColor: undefined, + bgColor: 4, // \x16: fg- and bg- are reversed hexColor: undefined, hexBgColor: undefined, - reverse: true, italic: true, underline: true, strikethrough: true, @@ -780,7 +952,6 @@ describe("parseStyle", () => { bgColor: undefined, hexColor: undefined, hexBgColor: undefined, - reverse: false, italic: false, underline: false, strikethrough: false, @@ -804,7 +975,6 @@ describe("parseStyle", () => { bgColor: undefined, hexColor: undefined, hexBgColor: undefined, - reverse: false, italic: false, underline: false, strikethrough: false, @@ -830,7 +1000,6 @@ describe("parseStyle", () => { bgColor: undefined, hexColor: undefined, hexBgColor: undefined, - reverse: false, italic: false, underline: false, strikethrough: false, diff --git a/test/client/js/libs/handlebars/parse.js b/test/client/js/libs/handlebars/parse.js index bb9e0efe..61f582b0 100644 --- a/test/client/js/libs/handlebars/parse.js +++ b/test/client/js/libs/handlebars/parse.js @@ -243,6 +243,27 @@ describe("parse Handlebars helper", () => { name: "monospace", input: "\x11monospace", expected: 'monospace', + }, { + name: "reverse with foreground and background colors", + input: "\x0313,1fg and bg \x16and reversed", + expected: + 'fg and bg ' + + 'and reversed', + }, { + name: "toggle reverse with foreground and background colors", + input: "\x0305,11text \x16reversed and \x16back again and \x16reversed", + expected: + 'text ' + + 'reversed and ' + + 'back again and ' + + 'reversed', + }, { + name: "escape reverse when new colors are applied", + input: "\x0311,02text \x16 reversed \x0304,05 and new style", + expected: + 'text ' + + ' reversed ' + + ' and new style', }, { name: "resets", input: "\x02bold\x038yellow\x02nonBold\x03default",