diff --git a/shared/naturalcrit/markdown.js b/shared/naturalcrit/markdown.js index f7f1763e5..9388e912a 100644 --- a/shared/naturalcrit/markdown.js +++ b/shared/naturalcrit/markdown.js @@ -452,7 +452,7 @@ const replaceVar = function(input, hoist=false, allowUnresolved=false) { const label = match[2]; //v=====--------------------< HANDLE MATH >-------------------=====v// - const mathRegex = /[a-z]+\(|[+\-*/^()]/g; + const mathRegex = /[a-z]+\(|[+\-*/^(),]/g; const matches = label.split(mathRegex); const mathVars = matches.filter((match)=>isNaN(match))?.map((s)=>s.trim()); // Capture any variable names diff --git a/tests/markdown/variables.test.js b/tests/markdown/variables.test.js index 3a03d64f6..2c8db375e 100644 --- a/tests/markdown/variables.test.js +++ b/tests/markdown/variables.test.js @@ -372,14 +372,32 @@ describe('Cross-page variables', ()=>{ }); }); -describe('Variable name as a subset of a function or other variable name', ()=>{ - it('Variable name as a subset of a function', function() { +describe('Math function parameter handling', ()=>{ + it('allows variables in single-parameter functions', function() { + const source = '[var]:4.1\n\n$[floor(var)]'; + const rendered = Markdown.render(source).trimReturns(); + expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`

4

`); + }); + it('allows one variable and a number in two-parameter functions', function() { + const source = '[var]:4\n\n$[min(1,var)]'; + const rendered = Markdown.render(source).trimReturns(); + expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`

1

`); + }); + it('allows two variables in two-parameter functions', function() { + const source = '[var1]:4\n\n[var2]:8\n\n$[min(var1,var2)]'; + const rendered = Markdown.render(source).trimReturns(); + expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`

4

`); + }); +}); + +describe('Variable names that are subsets of other names', ()=>{ + it('do not conflict with function names', function() { const source = `[a]: -1\n\n$[abs(a)]`; const rendered = Markdown.render(source).trimReturns(); expect(rendered).toBe('

1

'); }); - it('Variable name as a subset of another variable name', function() { + it('do not conflict with other variable names', function() { const source = `[ab]: 2\n\n[aba]: 8\n\n[ba]: 4\n\n$[ab + aba + ba]`; const rendered = Markdown.render(source).trimReturns(); expect(rendered).toBe('

14

');