From 1f9495099f630d245ee3e16923db8391476bc47d Mon Sep 17 00:00:00 2001 From: David Bolack Date: Wed, 12 Feb 2025 12:22:02 -0600 Subject: [PATCH 1/5] WIP --- package-lock.json | 35 ++++++++++++++++ package.json | 1 + shared/naturalcrit/markdown.js | 25 ++--------- tests/markdown/non-breaking-spaces.test.js | 49 +--------------------- 4 files changed, 40 insertions(+), 70 deletions(-) diff --git a/package-lock.json b/package-lock.json index add91f28e..a067fc932 100644 --- a/package-lock.json +++ b/package-lock.json @@ -38,6 +38,7 @@ "marked-emoji": "^1.4.3", "marked-extended-tables": "^1.1.0", "marked-gfm-heading-id": "^4.0.1", + "marked-nonbreaking-spaces": "file:../marked-nonbreaking-spaces", "marked-smartypants-lite": "^1.0.3", "markedLegacy": "npm:marked@^0.3.19", "moment": "^2.30.1", @@ -73,6 +74,36 @@ "npm": "^10.2.x" } }, + "../marked-nonbreaking-spaces": { + "version": "1.0.0", + "license": "MIT", + "devDependencies": { + "@babel/core": "^7.26.0", + "@babel/preset-env": "^7.26.0", + "@markedjs/testutils": "^15.0.0-0", + "@rollup/plugin-commonjs": "^28.0.2", + "@rollup/plugin-node-resolve": "^16.0.0", + "@semantic-release/changelog": "^6.0.3", + "@semantic-release/commit-analyzer": "^13.0.0", + "@semantic-release/git": "^10.0.1", + "@semantic-release/github": "^11.0.1", + "@semantic-release/npm": "^12.0.1", + "@semantic-release/release-notes-generator": "^14.0.2", + "babel-jest": "^29.5.0", + "eslint": "^8.57.1", + "eslint-config-standard": "^17.1.0", + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-node": "^11.1.0", + "eslint-plugin-promise": "^6.6.0", + "jest-cli": "^29.7.0", + "marked": "^15.0.4", + "rollup": "^4.29.2", + "semantic-release": "^24.2.0" + }, + "peerDependencies": { + "marked": ">=3 <16" + } + }, "node_modules/@ampproject/remapping": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", @@ -9874,6 +9905,10 @@ "marked": ">=13 <16" } }, + "node_modules/marked-nonbreaking-spaces": { + "resolved": "../marked-nonbreaking-spaces", + "link": true + }, "node_modules/marked-smartypants-lite": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/marked-smartypants-lite/-/marked-smartypants-lite-1.0.3.tgz", diff --git a/package.json b/package.json index 0097e5313..c36c71bba 100644 --- a/package.json +++ b/package.json @@ -112,6 +112,7 @@ "marked-emoji": "^1.4.3", "marked-extended-tables": "^1.1.0", "marked-gfm-heading-id": "^4.0.1", + "marked-nonbreaking-spaces": "file:../marked-nonbreaking-spaces", "marked-smartypants-lite": "^1.0.3", "markedLegacy": "npm:marked@^0.3.19", "moment": "^2.30.1", diff --git a/shared/naturalcrit/markdown.js b/shared/naturalcrit/markdown.js index 99766b536..6fc03b379 100644 --- a/shared/naturalcrit/markdown.js +++ b/shared/naturalcrit/markdown.js @@ -7,6 +7,7 @@ import MarkedExtendedTables from 'marked-extended-tables'; import { markedSmartypantsLite as MarkedSmartypantsLite } from 'marked-smartypants-lite'; import { gfmHeadingId as MarkedGFMHeadingId, resetHeadings as MarkedGFMResetHeadingIDs } from 'marked-gfm-heading-id'; import { markedEmoji as MarkedEmojis } from 'marked-emoji'; +import MarkedNonbreakingSpaces from 'marked-nonbreaking-spaces'; //Icon fonts included so they can appear in emoji autosuggest dropdown import diceFont from '../../themes/fonts/iconFonts/diceFont.js'; @@ -419,27 +420,6 @@ const forcedParagraphBreaks = { } }; -const nonbreakingSpaces = { - name : 'nonbreakingSpaces', - level : 'inline', - start(src) { return src.match(/:>+/m)?.index; }, // Hint to Marked.js to stop and check for a match - tokenizer(src, tokens) { - const regex = /:(>+)/ym; - const match = regex.exec(src); - if(match?.length) { - return { - type : 'nonbreakingSpaces', // Should match "name" above - raw : match[0], // Text to consume from the source - length : match[1].length, - text : '' - }; - } - }, - renderer(token) { - return ` `.repeat(token.length).concat(''); - } -}; - const definitionListsSingleLine = { name : 'definitionListsSingleLine', level : 'block', @@ -796,8 +776,9 @@ const tableTerminators = [ Marked.use(MarkedVariables()); Marked.use({ extensions : [justifiedParagraphs, definitionListsMultiLine, definitionListsSingleLine, forcedParagraphBreaks, - nonbreakingSpaces, superSubScripts, mustacheSpans, mustacheDivs, mustacheInjectInline] }); + superSubScripts, mustacheSpans, mustacheDivs, mustacheInjectInline] }); Marked.use(mustacheInjectBlock); +Marked.use(MarkedNonbreakingSpaces()); Marked.use({ renderer: renderer, tokenizer: tokenizer, mangle: false }); Marked.use(MarkedExtendedTables(tableTerminators), MarkedGFMHeadingId({ globalSlugs: true }), MarkedSmartypantsLite(), MarkedEmojis(MarkedEmojiOptions)); diff --git a/tests/markdown/non-breaking-spaces.test.js b/tests/markdown/non-breaking-spaces.test.js index 9dad4eb0f..1cc1fe6da 100644 --- a/tests/markdown/non-breaking-spaces.test.js +++ b/tests/markdown/non-breaking-spaces.test.js @@ -3,54 +3,7 @@ import Markdown from 'naturalcrit/markdown.js'; describe('Non-Breaking Spaces', ()=>{ - test('Single Space', function() { - const source = ':>\n\n'; - const rendered = Markdown.render(source).trim(); - expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`

 

`); - }); - - test('Double Space', function() { - const source = ':>>\n\n'; - const rendered = Markdown.render(source).trim(); - expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`

  

`); - }); - - test('Triple Space', function() { - const source = ':>>>\n\n'; - const rendered = Markdown.render(source).trim(); - expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`

   

`); - }); - - test('Many Space', function() { - const source = ':>>>>>>>>>>\n\n'; - const rendered = Markdown.render(source).trim(); - expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`

          

`); - }); - - test('Multiple sets of Spaces', function() { - const source = ':>>>\n:>>>\n:>>>'; - const rendered = Markdown.render(source).trim(); - expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`

   \n   \n   

`); - }); - - test('Pair of inline Spaces', function() { - const source = ':>>:>>'; - const rendered = Markdown.render(source).trim(); - expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`

    

`); - }); - - test('Space directly between two paragraphs', function() { - const source = 'Line 1\n:>>\nLine 2'; - const rendered = Markdown.render(source).trim(); - expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`

Line 1\n  \nLine 2

`); - }); - - test('Ignored inside a code block', function() { - const source = '```\n\n:>\n\n```\n'; - const rendered = Markdown.render(source).trim(); - expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`
\n:>\n
`); - }); - +// Interaction tests test('I am actually a single-line definition list!', function() { const source = 'Term ::> Definition 1\n'; const rendered = Markdown.render(source).trim(); From 3cfdb7eeb093e7607f59316520d50acf5a0c69a1 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Wed, 12 Feb 2025 12:26:02 -0600 Subject: [PATCH 2/5] Temporarily restore old tests. --- tests/markdown/non-breaking-spaces.test.js | 49 +++++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) diff --git a/tests/markdown/non-breaking-spaces.test.js b/tests/markdown/non-breaking-spaces.test.js index 1cc1fe6da..9dad4eb0f 100644 --- a/tests/markdown/non-breaking-spaces.test.js +++ b/tests/markdown/non-breaking-spaces.test.js @@ -3,7 +3,54 @@ import Markdown from 'naturalcrit/markdown.js'; describe('Non-Breaking Spaces', ()=>{ -// Interaction tests + test('Single Space', function() { + const source = ':>\n\n'; + const rendered = Markdown.render(source).trim(); + expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`

 

`); + }); + + test('Double Space', function() { + const source = ':>>\n\n'; + const rendered = Markdown.render(source).trim(); + expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`

  

`); + }); + + test('Triple Space', function() { + const source = ':>>>\n\n'; + const rendered = Markdown.render(source).trim(); + expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`

   

`); + }); + + test('Many Space', function() { + const source = ':>>>>>>>>>>\n\n'; + const rendered = Markdown.render(source).trim(); + expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`

          

`); + }); + + test('Multiple sets of Spaces', function() { + const source = ':>>>\n:>>>\n:>>>'; + const rendered = Markdown.render(source).trim(); + expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`

   \n   \n   

`); + }); + + test('Pair of inline Spaces', function() { + const source = ':>>:>>'; + const rendered = Markdown.render(source).trim(); + expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`

    

`); + }); + + test('Space directly between two paragraphs', function() { + const source = 'Line 1\n:>>\nLine 2'; + const rendered = Markdown.render(source).trim(); + expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`

Line 1\n  \nLine 2

`); + }); + + test('Ignored inside a code block', function() { + const source = '```\n\n:>\n\n```\n'; + const rendered = Markdown.render(source).trim(); + expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`
\n:>\n
`); + }); + test('I am actually a single-line definition list!', function() { const source = 'Term ::> Definition 1\n'; const rendered = Markdown.render(source).trim(); From 777f51c661bbe5d6b2597e20a592be2535b1c3e8 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Wed, 12 Feb 2025 12:32:28 -0600 Subject: [PATCH 3/5] First pass testing If completes, remove most tests. --- package-lock.json | 41 ++++++++--------------------------------- package.json | 2 +- 2 files changed, 9 insertions(+), 34 deletions(-) diff --git a/package-lock.json b/package-lock.json index a067fc932..e78af217c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -38,7 +38,7 @@ "marked-emoji": "^1.4.3", "marked-extended-tables": "^1.1.0", "marked-gfm-heading-id": "^4.0.1", - "marked-nonbreaking-spaces": "file:../marked-nonbreaking-spaces", + "marked-nonbreaking-spaces": "^1.0.0", "marked-smartypants-lite": "^1.0.3", "markedLegacy": "npm:marked@^0.3.19", "moment": "^2.30.1", @@ -74,36 +74,6 @@ "npm": "^10.2.x" } }, - "../marked-nonbreaking-spaces": { - "version": "1.0.0", - "license": "MIT", - "devDependencies": { - "@babel/core": "^7.26.0", - "@babel/preset-env": "^7.26.0", - "@markedjs/testutils": "^15.0.0-0", - "@rollup/plugin-commonjs": "^28.0.2", - "@rollup/plugin-node-resolve": "^16.0.0", - "@semantic-release/changelog": "^6.0.3", - "@semantic-release/commit-analyzer": "^13.0.0", - "@semantic-release/git": "^10.0.1", - "@semantic-release/github": "^11.0.1", - "@semantic-release/npm": "^12.0.1", - "@semantic-release/release-notes-generator": "^14.0.2", - "babel-jest": "^29.5.0", - "eslint": "^8.57.1", - "eslint-config-standard": "^17.1.0", - "eslint-plugin-import": "^2.31.0", - "eslint-plugin-node": "^11.1.0", - "eslint-plugin-promise": "^6.6.0", - "jest-cli": "^29.7.0", - "marked": "^15.0.4", - "rollup": "^4.29.2", - "semantic-release": "^24.2.0" - }, - "peerDependencies": { - "marked": ">=3 <16" - } - }, "node_modules/@ampproject/remapping": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", @@ -9906,8 +9876,13 @@ } }, "node_modules/marked-nonbreaking-spaces": { - "resolved": "../marked-nonbreaking-spaces", - "link": true + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/marked-nonbreaking-spaces/-/marked-nonbreaking-spaces-1.0.0.tgz", + "integrity": "sha512-/HXGblHehErt6LNi+wKGp+iupl8vU0FSsyzSDA6N9WAioCkuJiN6RwogXPQCe/8jyFaW+e+14lVu0ANZ9TmVLw==", + "license": "MIT", + "peerDependencies": { + "marked": ">=3 <16" + } }, "node_modules/marked-smartypants-lite": { "version": "1.0.3", diff --git a/package.json b/package.json index c36c71bba..20999aa4d 100644 --- a/package.json +++ b/package.json @@ -112,7 +112,7 @@ "marked-emoji": "^1.4.3", "marked-extended-tables": "^1.1.0", "marked-gfm-heading-id": "^4.0.1", - "marked-nonbreaking-spaces": "file:../marked-nonbreaking-spaces", + "marked-nonbreaking-spaces": "^1.0.0", "marked-smartypants-lite": "^1.0.3", "markedLegacy": "npm:marked@^0.3.19", "moment": "^2.30.1", From 0c2f0ac31e8aceee1abca433f9c9f736f0e3daf3 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Wed, 12 Feb 2025 12:52:01 -0600 Subject: [PATCH 4/5] Remove tests performed in nonbreaking space module --- tests/markdown/non-breaking-spaces.test.js | 50 +--------------------- 1 file changed, 1 insertion(+), 49 deletions(-) diff --git a/tests/markdown/non-breaking-spaces.test.js b/tests/markdown/non-breaking-spaces.test.js index 9dad4eb0f..e682de07a 100644 --- a/tests/markdown/non-breaking-spaces.test.js +++ b/tests/markdown/non-breaking-spaces.test.js @@ -2,55 +2,7 @@ import Markdown from 'naturalcrit/markdown.js'; -describe('Non-Breaking Spaces', ()=>{ - test('Single Space', function() { - const source = ':>\n\n'; - const rendered = Markdown.render(source).trim(); - expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`

 

`); - }); - - test('Double Space', function() { - const source = ':>>\n\n'; - const rendered = Markdown.render(source).trim(); - expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`

  

`); - }); - - test('Triple Space', function() { - const source = ':>>>\n\n'; - const rendered = Markdown.render(source).trim(); - expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`

   

`); - }); - - test('Many Space', function() { - const source = ':>>>>>>>>>>\n\n'; - const rendered = Markdown.render(source).trim(); - expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`

          

`); - }); - - test('Multiple sets of Spaces', function() { - const source = ':>>>\n:>>>\n:>>>'; - const rendered = Markdown.render(source).trim(); - expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`

   \n   \n   

`); - }); - - test('Pair of inline Spaces', function() { - const source = ':>>:>>'; - const rendered = Markdown.render(source).trim(); - expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`

    

`); - }); - - test('Space directly between two paragraphs', function() { - const source = 'Line 1\n:>>\nLine 2'; - const rendered = Markdown.render(source).trim(); - expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`

Line 1\n  \nLine 2

`); - }); - - test('Ignored inside a code block', function() { - const source = '```\n\n:>\n\n```\n'; - const rendered = Markdown.render(source).trim(); - expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`
\n:>\n
`); - }); - +describe('Non-Breaking Spaces Interactions', ()=>{ test('I am actually a single-line definition list!', function() { const source = 'Term ::> Definition 1\n'; const rendered = Markdown.render(source).trim(); From 46093ba6ba6a9a99f8f7d266576281c5faa0deb8 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Wed, 5 Mar 2025 11:23:29 -0600 Subject: [PATCH 5/5] Update package versions --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1d1658dd9..832019217 100644 --- a/package-lock.json +++ b/package-lock.json @@ -38,7 +38,7 @@ "marked-emoji": "^1.4.3", "marked-extended-tables": "^1.1.0", "marked-gfm-heading-id": "^4.0.1", - "marked-nonbreaking-spaces": "^1.0.0", + "marked-nonbreaking-spaces": "^1.0.1", "marked-smartypants-lite": "^1.0.3", "marked-subsuper-text": "^1.0.3", "markedLegacy": "npm:marked@^0.3.19", @@ -9872,9 +9872,9 @@ } }, "node_modules/marked-nonbreaking-spaces": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/marked-nonbreaking-spaces/-/marked-nonbreaking-spaces-1.0.0.tgz", - "integrity": "sha512-/HXGblHehErt6LNi+wKGp+iupl8vU0FSsyzSDA6N9WAioCkuJiN6RwogXPQCe/8jyFaW+e+14lVu0ANZ9TmVLw==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/marked-nonbreaking-spaces/-/marked-nonbreaking-spaces-1.0.1.tgz", + "integrity": "sha512-CUeFRc6OdMMSJThgOM7WAkUjL59VfSf79urKyKYtH9fs3hnrhC3+syFBimYh4vpvUZmjnXoZX0K6V3vZKmyRWQ==", "license": "MIT", "peerDependencies": { "marked": ">=3 <16" diff --git a/package.json b/package.json index e73471556..15aa900d8 100644 --- a/package.json +++ b/package.json @@ -112,7 +112,7 @@ "marked-emoji": "^1.4.3", "marked-extended-tables": "^1.1.0", "marked-gfm-heading-id": "^4.0.1", - "marked-nonbreaking-spaces": "^1.0.0", + "marked-nonbreaking-spaces": "^1.0.1", "marked-smartypants-lite": "^1.0.3", "marked-subsuper-text": "^1.0.3", "markedLegacy": "npm:marked@^0.3.19",