From 171e38f28a550f559d693eefc171ca55890ad9a8 Mon Sep 17 00:00:00 2001 From: Erik Demaine Date: Fri, 7 Apr 2017 17:06:23 -0400 Subject: [PATCH] Old font command support: \rm, \sf, \tt, \bf, \it (#675) Squashed: * \rm, \sf, \tt, \bf, \it support * Fix space consumption after macros without arguments * Add tests for old font commands --- src/Parser.js | 43 ++++++++++++++++-- src/functions.js | 5 ++ test/screenshotter/images/OldFont-chrome.png | Bin 0 -> 14214 bytes test/screenshotter/images/OldFont-firefox.png | Bin 0 -> 12119 bytes test/screenshotter/ss_data.yaml | 6 +++ 5 files changed, 49 insertions(+), 5 deletions(-) create mode 100644 test/screenshotter/images/OldFont-chrome.png create mode 100644 test/screenshotter/images/OldFont-firefox.png diff --git a/src/Parser.js b/src/Parser.js index 82d0777..0cf911c 100644 --- a/src/Parser.js +++ b/src/Parser.js @@ -394,6 +394,17 @@ const styleFuncs = [ "\\displaystyle", "\\textstyle", "\\scriptstyle", "\\scriptscriptstyle", ]; +// Old font functions +const oldFontFuncs = { + "\\rm": "mathrm", + "\\sf": "mathsf", + "\\tt": "mathtt", + "\\bf": "mathbf", + "\\it": "mathit", + //"\\sl": "textsl", + //"\\sc": "textsc", +}; + /** * Parses an implicit group, which is a group that starts at the end of a * specified, and ends right before a higher explicit group ends, or at EOL. It @@ -462,7 +473,8 @@ Parser.prototype.parseImplicitGroup = function() { result.position = end.position; return result; } else if (utils.contains(sizeFuncs, func)) { - // If we see a sizing function, parse out the implict body + // If we see a sizing function, parse out the implicit body + this.consumeSpaces(); const body = this.parseExpression(false); return new ParseNode("sizing", { // Figure out what size to use based on the list of functions above @@ -470,7 +482,8 @@ Parser.prototype.parseImplicitGroup = function() { value: body, }, this.mode); } else if (utils.contains(styleFuncs, func)) { - // If we see a styling function, parse out the implict body + // If we see a styling function, parse out the implicit body + this.consumeSpaces(); const body = this.parseExpression(true); return new ParseNode("styling", { // Figure out what style to use by pulling out the style from @@ -478,6 +491,22 @@ Parser.prototype.parseImplicitGroup = function() { style: func.slice(1, func.length - 5), value: body, }, this.mode); + } else if (func in oldFontFuncs) { + const style = oldFontFuncs[func]; + // If we see an old font function, parse out the implicit body + this.consumeSpaces(); + const body = this.parseExpression(true); + if (style.slice(0, 4) === 'text') { + return new ParseNode("text", { + style: style, + body: new ParseNode("ordgroup", body, this.mode), + }, this.mode); + } else { + return new ParseNode("font", { + font: style, + body: new ParseNode("ordgroup", body, this.mode), + }, this.mode); + } } else { // Defer to parseFunction if it's not a function we handle return this.parseFunction(start); @@ -629,9 +658,7 @@ Parser.prototype.parseGroupOfType = function(innerMode, optional) { if (innerMode === "text") { // text mode is special because it should ignore the whitespace before // it - while (this.nextToken.text === " ") { - this.consume(); - } + this.consumeSpaces(); } // By the time we get here, innerMode is one of "text" or "math". // We switch the mode of the parser, recurse, then restore the old mode. @@ -640,6 +667,12 @@ Parser.prototype.parseGroupOfType = function(innerMode, optional) { return res; }; +Parser.prototype.consumeSpaces = function() { + while (this.nextToken.text === " ") { + this.consume(); + } +}; + /** * Parses a group, essentially returning the string formed by the * brace-enclosed tokens plus some position information. diff --git a/src/functions.js b/src/functions.js index 0f52e94..1cec871 100644 --- a/src/functions.js +++ b/src/functions.js @@ -591,6 +591,11 @@ defineFunction([ "\\scriptscriptstyle", ], 0, null); +// Old font changing functions +defineFunction([ + "\\rm", "\\sf", "\\tt", "\\bf", "\\it", //"\\sl", "\\sc", +], 0, null); + defineFunction([ // styles "\\mathrm", "\\mathit", "\\mathbf", diff --git a/test/screenshotter/images/OldFont-chrome.png b/test/screenshotter/images/OldFont-chrome.png new file mode 100644 index 0000000000000000000000000000000000000000..9827a8f3fc8a965d0b0f1b237284621cb5c34324 GIT binary patch literal 14214 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 gH~Ie@u1=X2EwwjAW