diff --git a/changelog.md b/changelog.md index 0cdb89c29..033eee86d 100644 --- a/changelog.md +++ b/changelog.md @@ -84,6 +84,65 @@ pre { ## changelog For a full record of development, visit our [Github Page](https://github.com/naturalcrit/homebrewery). +### Tuesday 8/13/2024 - v3.14.1 +{{taskList + +##### abquintic + +* [x] Allow Table of Contents to flow across columns + +Fixes issues [#2563](https://github.com/naturalcrit/homebrewery/issues/2563) + +* [x] Fix unusual margin spacing for adjacent `.descriptive` and `.wide` blocks + +Fixes issues [#2688](https://github.com/naturalcrit/homebrewery/issues/2688) + +* [x] Add code folding to :fas_paintbrush: {{openSans **STYLE**}} tab + +##### G-Ambatte + +* [x] Fix edge case where Table of Contents generator changed capitalization of headings + +Fixes issues [#3572](https://github.com/naturalcrit/homebrewery/issues/3572) + +* [x] Fix **Ink Friendly** snippet causing unselectable PDF text + +Fixes issues [#3563](https://github.com/naturalcrit/homebrewery/issues/3563) + +* [x] Prevent brews selecting themselves as a theme + +Fixes issues [#3614](https://github.com/naturalcrit/homebrewery/issues/3614) + +* [x] Fix info pages (`/faq`, `/migrate`, etc.) showing blank authorship info + +Fixes issues [#3568](https://github.com/naturalcrit/homebrewery/issues/3568) + +* [x] Add `abs()`, `sign()` and `signed()` functions to variable syntax math handler + +Fixes issues [#3537](https://github.com/naturalcrit/homebrewery/issues/3537) + +* [x] Fix variable math handler not processing commas (i.e., in `$[max(varA,varB)]` + +Fixes issues [#3613](https://github.com/naturalcrit/homebrewery/issues/3613) + +* [x] Fix variable math handler scrambling variables with names that are subsets of other variables + +Fixes issues [#3622](https://github.com/naturalcrit/homebrewery/issues/3622) + + +##### calculuschild + +* [x] Fix `/migrate` page using an editor context instead of share context + + +##### 5e-Cleric + +* [x] Fix Monster Stat Blocks losing color in Safari + +}} + +\page + ### Monday 7/29/2024 - v3.14.0 {{taskList diff --git a/package-lock.json b/package-lock.json index e025814ae..63df75509 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "homebrewery", - "version": "3.14.0", + "version": "3.14.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "homebrewery", - "version": "3.14.0", + "version": "3.14.1", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 2dbff24ed..b417e7e3b 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "homebrewery", "description": "Create authentic looking D&D homebrews using only markdown", - "version": "3.14.0", + "version": "3.14.1", "engines": { "npm": "^10.2.x", "node": "^20.8.x" diff --git a/shared/naturalcrit/markdown.js b/shared/naturalcrit/markdown.js index 518b48705..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 @@ -462,7 +462,7 @@ const replaceVar = function(input, hoist=false, allowUnresolved=false) { mathVars?.forEach((variable)=>{ const foundVar = lookupVar(variable, globalPageNumber, hoist); if(foundVar && foundVar.resolved && foundVar.content && !isNaN(foundVar.content)) // Only subsitute math values if fully resolved, not empty strings, and numbers - replacedLabel = replacedLabel.replaceAll(variable, foundVar.content); + replacedLabel = replacedLabel.replaceAll(new RegExp(`(?{ const rendered = renderAllPages([source0, source1]).join('\n\\page\n').trimReturns(); expect(rendered, `Input:\n${[source0, source1].join('\n\\page\n')}`, { showPrefix: false }).toBe('
two
one
\\pagetwo
'); }); +}); + +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('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
'); + }); }); \ No newline at end of file