diff --git a/PseudoCode.js b/PseudoCode.js index e59e739c0df3daac536aaeb4f4200ec7f2d53922..90498792734fb091f438aa0b6f0b3bf53b6062c6 100644 --- a/PseudoCode.js +++ b/PseudoCode.js @@ -77,7 +77,6 @@ closely mirrors that of the grammar. TODO: * comment - * noend * color{#FF0000}{text} * line number every k lines: \begin{algorithmic}[k] * caption without the number: \caption*{} @@ -359,7 +358,7 @@ Parser.prototype._parseAlgorithmicInner = function() { while (true) { var node; if (!(node = this._parseCommand(CONDITION_COMMANDS)) && - !(node = this._parseBlock())) break; + !((node = this._parseBlock()).children.length > 0)) break; algmicNode.addChild(node); } @@ -400,7 +399,7 @@ Parser.prototype._parseBlock = function() { break; } - return blockNode.children.length > 0 ? blockNode : null; + return blockNode; }; Parser.prototype._parseControl = function() { @@ -630,10 +629,20 @@ RendererOptions.prototype._parseEmVal = function(emVal) { color - variant - none, small-caps */ -function TextStyle(outerTextStyle) { +function TextStyle(outerFontSize) { this._css = {}; - this._fontSize = 1.0; - this._outerFontSize = outerTextStyle ? outerTextStyle.fontSize() : 1.0; + + this._fontSize = this._outerFontSize + = outerFontSize != null ? outerFontSize : 1.0; +} + +TextStyle.prototype.outerFontSize = function(size) { + if (size != null) this._outerFontSize = size; + return this._outerFontSize; +} + +TextStyle.prototype.fontSize = function() { + return this._fontSize; } /* Update the font state by TeX command @@ -688,10 +697,6 @@ TextStyle.prototype._sizingScalesTable = { Huge: 2.28 }; -TextStyle.prototype.fontSize = function() { - return this._fontSize; -} - TextStyle.prototype.updateByCommand = function(cmd) { // Font command var cmdStyles = this._fontCommandTable[cmd]; @@ -704,9 +709,8 @@ TextStyle.prototype.updateByCommand = function(cmd) { // Sizing command var fontSize = this._sizingScalesTable[cmd]; if (fontSize !== undefined) { - var scale = fontSize / this._outerFontSize; - this._css['font-size'] = scale + 'em'; - this._fontSize = this._outerFontSize = fontSize; + this._outerFontSize = this._fontSize; + this._fontSize = fontSize; return; } @@ -720,6 +724,9 @@ TextStyle.prototype.toCSS = function() { if (val == null) continue; cssStr += attr + ':' + this._css[attr] + ';'; } + if (this._fontSize !== this._outerFontSize) { + cssStr += 'font-size:' + (this._fontSize / this._outerFontSize) + 'em;'; + } return cssStr; }; @@ -743,6 +750,10 @@ TextEnvironment.prototype.renderToHTML = function() { var mathHTML = katex.renderToString(math); this._html.putSpan(mathHTML); break; + case 'bool': + var text = node.value.toLowerCase(); + this._html.beginSpan('ps-keyword').putText(text).endSpan(); + break; case 'special': var escapedStr = node.value; var replace = { @@ -759,7 +770,7 @@ TextEnvironment.prototype.renderToHTML = function() { this._html.putText(replaceStr); break; case 'close-text': - var newTextStyle = new TextStyle(); + var newTextStyle = new TextStyle(this._textStyle.fontSize()); var textEnv = new TextEnvironment(node.children, newTextStyle); this._html.putSpan(textEnv.renderToHTML()); break; @@ -795,7 +806,7 @@ TextEnvironment.prototype.renderToHTML = function() { if (textNode.type !== 'close-text') continue; var cmdName = node.value; - var innerTextStyle = new TextStyle(); + var innerTextStyle = new TextStyle(this._textStyle.fontSize()); innerTextStyle.updateByCommand(cmdName); this._html.beginSpan(null, innerTextStyle.toCSS()); var textEnv = new TextEnvironment(textNode.children, innerTextStyle); @@ -807,6 +818,7 @@ TextEnvironment.prototype.renderToHTML = function() { } } + return this._html.toMarkup(); }; @@ -982,6 +994,9 @@ Renderer.prototype._newLine = function() { this._openLine = true; + // For every new line, reset the relative sizing of text style + this._globalTextStyle.outerFontSize(1.0); + var indentSize = this._options.indentSize; // if this line is for code (e.g. \STATE) if (this._blockLevel > 0) { @@ -1240,7 +1255,8 @@ Renderer.prototype._buildTree = function(node) { this._html.putSpan(textEnv.renderToHTML()); break; case 'close-text': - var newTextStyle = new TextStyle(); + var outerFontSize = this._globalTextStyle.fontSize(); + var newTextStyle = new TextStyle(outerFontSize); var textEnv = new TextEnvironment(node.children, newTextStyle); this._html.putSpan(textEnv.renderToHTML()); break; diff --git a/css/PseudoCode.css b/css/PseudoCode.css index 08ca949d10263dfa0403022e1612c6ed7d61e30b..f9db55717de1f012fb291e5673d30d12c7397c71 100644 --- a/css/PseudoCode.css +++ b/css/PseudoCode.css @@ -6,7 +6,6 @@ } .ps-root .ps-algorithm { margin: 0.8em 0; - padding-bottom: 0.2em; /* algorithm environment has borders; algorithmic has not */ border-top: 3px solid black; border-bottom: 2px solid black; diff --git a/static.html b/test-suite.html similarity index 55% rename from static.html rename to test-suite.html index ac1a2a74aa09a17b482f2d2380dc2c78a887b51a..896a27092b59f2d109a0cd107499c04e6436cf73 100644 --- a/static.html +++ b/test-suite.html @@ -6,11 +6,53 @@ <script src="lib/katex/katex.min.js" type="text/javascript"></script> <link href="css/PseudoCode.css" type="text/css" rel="stylesheet"> <script src="PseudoCode.js" type="text/javascript"></script> - <title>Hard-coded Result of PseudoCode.js</title> - <style media="screen" type="text/css"> + <title>Test suite of PseudoCode.js</title> </style> </head> <body> + <pre id="test0" style="display:none"> + \begin{algorithmic} + \STATE \tiny tiny \normalsize normalsize + \STATE font sizings: \tiny tiny \scriptsize scriptsize \footnotesize + footnotesize \small small \normalsize normal \large large \Large Large + \LARGE LARGE \huge huge \Huge Huge \normalsize + \STATE should be normal size + \end{algorithmic} + </pre> + <pre id="test1" style="display:none"> + \begin{algorithm} + \caption{Test text-style} + \begin{algorithmic} + \PROCEDURE{Test-Declarations}{} + \STATE font families: {\sffamily sffamily, \ttfamily ttfamily, \normalfont normalfont, \rmfamily rmfamily.} + \STATE font weights: {normal weight, \bfseries bold, \mdseries medium, \lfseries lighter.} + \STATE font shapes: {\itshape itshape \scshape Small-Caps \slshape slshape \upshape upshape.} + \STATE font sizings: \tiny tiny \scriptsize scriptsize \footnotesize + footnotesize \small small \normalsize normal \large large \Large Large + \LARGE LARGE \huge huge \Huge Huge \normalsize + \ENDPROCEDURE + \PROCEDURE{Test-Commands}{} + \STATE \textnormal{textnormal,} \textrm{textrm,} \textsf{textsf,} \texttt{texttt.} + \STATE \textbf{textbf,} \textmd{textmd,} \textlf{textlf.} + \STATE \textup{textup,} \textit{textit,} \textsc{textsc,} \textsl{textsl.} + \STATE \uppercase{uppercase,} \lowercase{LOWERCASE.} + \ENDPROCEDURE + \PROCEDURE{Test-Colors}{} + \ENDPROCEDURE + \end{algorithmic} + \end{algorithm} + + \begin{algorithm} + \caption{Test symbols} + \begin{algorithmic} + \STATE \textbf{Specials:} \{ \} \$ \& \# \% \_ + \STATE \textbf{Bool:} \AND \OR \NOT \TRUE \FALSE + \STATE \textbf{Enter:} first part of line \\ second part of line + \end{algorithmic} + \end{algorithm} + </pre> + <pre id="test2" style="display:none"> + </pre> <pre id="code" style="display:none"> \begin{algorithm} \caption{123!} @@ -22,9 +64,6 @@ \STATE pre \texttt{typewriter} after \STATE asjo aosd j asodij jdsf $y \leftarrow 1$ a js j djioas jo j \STATE Test text-style commands: - \STATE different font-family: {\sffamily sffamily \ttfamily ttfamily \rmfamily rmfamily} - \STATE different wieghts: {normal weight \bfseries bold \mdseries medium \lfseries lighter} - \STATE different shapes: {\itshape itshape \scshape Small-Caps \slshape slshape \upshape upshape} \STATE {normal text vs. \slshape after slshape} \STATE \uppercase{ all is uppercase} vs. \lowercase{ ALL lOWER Case} \STATE sizing {\tiny tiny \scriptsize scriptsize \footnotesize @@ -72,7 +111,7 @@ \end{algorithmic} </pre> <script type="text/javascript"> - var code = document.getElementById("code").textContent; + var code = document.getElementById("test1").textContent; // var html = PseudoCode.renderToString(code); // console.log(html); PseudoCode.render(code, document.body, {