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 82d07777..0cf911ce 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 0f52e946..1cec871c 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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 literal 0 HcmV?d00001 diff --git a/test/screenshotter/images/OldFont-firefox.png b/test/screenshotter/images/OldFont-firefox.png new file mode 100644 index 0000000000000000000000000000000000000000..97c782918725860ab9f544e50500ce979b42e4fe GIT binary patch literal 12119 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