From a2c951c43a7cae1179631e858d8f1b3b33368c40 Mon Sep 17 00:00:00 2001 From: Kelly Joseph Price Date: Mon, 1 Mar 2021 16:21:54 -0800 Subject: [PATCH 1/6] bugs: fix html in callouts --- .../flavored-parsers.test.js.snap | 38 -------- __tests__/flavored-parsers.test.js | 7 -- .../__snapshots__/callouts.test.js.snap | 89 +++++++++++++++++++ __tests__/flavored-parsers/callouts.test.js | 24 +++++ processor/parse/flavored/callout.js | 3 +- 5 files changed, 114 insertions(+), 47 deletions(-) create mode 100644 __tests__/flavored-parsers/__snapshots__/callouts.test.js.snap create mode 100644 __tests__/flavored-parsers/callouts.test.js diff --git a/__tests__/__snapshots__/flavored-parsers.test.js.snap b/__tests__/__snapshots__/flavored-parsers.test.js.snap index 95ef39ac6..a593aa689 100644 --- a/__tests__/__snapshots__/flavored-parsers.test.js.snap +++ b/__tests__/__snapshots__/flavored-parsers.test.js.snap @@ -1,43 +1,5 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`Parse RDMD Syntax Callouts 1`] = ` -Object { - "children": Array [ - Object { - "children": Array [ - Object { - "children": Array [ - Object { - "type": "text", - "value": "️ Info Callout", - }, - ], - "type": "paragraph", - }, - ], - "data": Object { - "hName": "rdme-callout", - "hProperties": Object { - "icon": "ℹ", - "theme": "default", - "title": "️ Info Callout", - "value": "", - }, - }, - "type": "rdme-callout", - }, - Object { - "lang": null, - "meta": null, - "type": "code", - "value": "> -> Lorem ipsum dolor sit amet consectetur adipisicing elit.", - }, - ], - "type": "root", -} -`; - exports[`Parse RDMD Syntax Code Blocks Single Code Block 1`] = ` Object { "children": Array [ diff --git a/__tests__/flavored-parsers.test.js b/__tests__/flavored-parsers.test.js index 03549ddaa..7ddcf8f09 100644 --- a/__tests__/flavored-parsers.test.js +++ b/__tests__/flavored-parsers.test.js @@ -17,13 +17,6 @@ const process = (text, opts = options) => .parse(text); describe('Parse RDMD Syntax', () => { - it('Callouts', () => { - const text = `> ℹ️ Info Callout - > - > Lorem ipsum dolor sit amet consectetur adipisicing elit.`; - expect(process(text)).toMatchSnapshot(); - }); - describe('Code Blocks', () => { it('Tabbed Code Block', () => { const text = diff --git a/__tests__/flavored-parsers/__snapshots__/callouts.test.js.snap b/__tests__/flavored-parsers/__snapshots__/callouts.test.js.snap new file mode 100644 index 000000000..774396e43 --- /dev/null +++ b/__tests__/flavored-parsers/__snapshots__/callouts.test.js.snap @@ -0,0 +1,89 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Parse RDMD Callouts edge cases renders html inside a callout 1`] = ` +Object { + "children": Array [ + Object { + "children": Array [ + Object { + "children": Array [ + Object { + "type": "text", + "value": "️ Info Callout", + }, + ], + "type": "paragraph", + }, + Object { + "children": Array [ + Object { + "type": "html", + "value": "", + }, + Object { + "type": "text", + "value": "With html!", + }, + Object { + "type": "html", + "value": "", + }, + ], + "type": "paragraph", + }, + ], + "data": Object { + "hName": "rdme-callout", + "hProperties": Object { + "icon": "ℹ", + "theme": "default", + "title": "️ Info Callout", + "value": "With html!", + }, + }, + "type": "rdme-callout", + }, + ], + "type": "root", +} +`; + +exports[`Parse RDMD Callouts renders an info callout 1`] = ` +Object { + "children": Array [ + Object { + "children": Array [ + Object { + "children": Array [ + Object { + "type": "text", + "value": "️ Info Callout", + }, + ], + "type": "paragraph", + }, + Object { + "children": Array [ + Object { + "type": "text", + "value": "Lorem ipsum dolor sit amet consectetur adipisicing elit.", + }, + ], + "type": "paragraph", + }, + ], + "data": Object { + "hName": "rdme-callout", + "hProperties": Object { + "icon": "ℹ", + "theme": "default", + "title": "️ Info Callout", + "value": "Lorem ipsum dolor sit amet consectetur adipisicing elit.", + }, + }, + "type": "rdme-callout", + }, + ], + "type": "root", +} +`; diff --git a/__tests__/flavored-parsers/callouts.test.js b/__tests__/flavored-parsers/callouts.test.js new file mode 100644 index 000000000..382d45d37 --- /dev/null +++ b/__tests__/flavored-parsers/callouts.test.js @@ -0,0 +1,24 @@ +import { mdast } from '../../index'; + +describe('Parse RDMD Callouts', () => { + it('renders an info callout', () => { + const text = ` +> ℹ️ Info Callout +> +> Lorem ipsum dolor sit amet consectetur adipisicing elit.`; + + expect(mdast(text)).toMatchSnapshot(); + }); + + describe('edge cases', () => { + it('renders html inside a callout', () => { + const text = ` +> ℹ️ Info Callout +> +> With html! + `; + + expect(mdast(text)).toMatchSnapshot(); + }); + }); +}); diff --git a/processor/parse/flavored/callout.js b/processor/parse/flavored/callout.js index 4f0bfc142..a5791a357 100644 --- a/processor/parse/flavored/callout.js +++ b/processor/parse/flavored/callout.js @@ -8,7 +8,7 @@ function tokenizer(eat, value) { let [match, icon, title = '', text] = rgx.exec(value); icon = icon.trim(); - text = text.replace(/>(?:(\n)|(\s)?)/g, '$1').trim(); + text = text.replace(/^>(?:(\n)|(\s)?)/gm, '$1').trim(); title = title.trim(); const style = { @@ -22,7 +22,6 @@ function tokenizer(eat, value) { '\uD83D\uDED1': 'error', '\u2049\uFE0F': 'error', '\u203C\uFE0F': 'error', - // prettier-ignore '\u2139\uFE0F': 'info', '\u26A0': 'warn', }[icon]; From 5445b6257d987152d543edd126482771c33aa2f1 Mon Sep 17 00:00:00 2001 From: Kelly Joseph Price Date: Mon, 1 Mar 2021 16:24:06 -0800 Subject: [PATCH 2/6] add visual test --- docs/callouts-test.md | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 docs/callouts-test.md diff --git a/docs/callouts-test.md b/docs/callouts-test.md new file mode 100644 index 000000000..6c0ce91f2 --- /dev/null +++ b/docs/callouts-test.md @@ -0,0 +1,9 @@ +--- +title: "Callouts Tests" +slug: "callouts-tests" +hidden: true +--- + +> 👍 Success +> +> Vitae reprehenderit at aliquid error voluptates eum dignissimos. From 155554ad50e88942929e747e3affe612cca89203 Mon Sep 17 00:00:00 2001 From: Kelly Joseph Price Date: Mon, 1 Mar 2021 16:54:05 -0800 Subject: [PATCH 3/6] generate artifacts --- .github/workflows/ci.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 90fbcb243..cc9a06242 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -26,10 +26,11 @@ jobs: run: npm test - name: Run visual regression tests - run: CI=true npm run test.browser + #run: CI=true npm run test.browser + run: npm run test.browser - uses: actions/upload-artifact@v2 - if: ${{ failure() }} + #if: ${{ failure() }} with: name: image-snapshots path: __tests__/browser/ci From ee42dd1319c60724deaed92c698e1828f9d2dea2 Mon Sep 17 00:00:00 2001 From: Kelly Joseph Price Date: Tue, 2 Mar 2021 10:15:56 -0800 Subject: [PATCH 4/6] actually add visual test --- __tests__/browser/markdown.test.js | 1 + docs/{callouts-test.md => callout-tests.md} | 0 example/Fixtures/docs.js | 2 ++ 3 files changed, 3 insertions(+) rename docs/{callouts-test.md => callout-tests.md} (100%) diff --git a/__tests__/browser/markdown.test.js b/__tests__/browser/markdown.test.js index 800891d47..04cb12bb6 100644 --- a/__tests__/browser/markdown.test.js +++ b/__tests__/browser/markdown.test.js @@ -11,6 +11,7 @@ describe('visual regression tests', () => { const docs = [ 'callouts', + 'calloutTests', 'codeBlocks', 'embeds', 'features', diff --git a/docs/callouts-test.md b/docs/callout-tests.md similarity index 100% rename from docs/callouts-test.md rename to docs/callout-tests.md diff --git a/example/Fixtures/docs.js b/example/Fixtures/docs.js index f9164b807..12a34c35d 100644 --- a/example/Fixtures/docs.js +++ b/example/Fixtures/docs.js @@ -7,6 +7,7 @@ import images from '../../docs/images.md'; import lists from '../../docs/lists.md'; import tables from '../../docs/tables.md'; +import calloutTests from '../../docs/callout-tests.md'; import codeBlockTests from '../../docs/code-block-tests.md'; import tableOfContentsTests from '../../docs/table-of-contents-tests.md'; import varsTest from '../../docs/variable-tests.md'; @@ -22,6 +23,7 @@ const fixtureMap = Object.entries({ headings, images, features, + calloutTests, codeBlockTests, tableOfContentsTests, varsTest, From dc05216b91139cb6a6f5f0d4ef1e00841c232032 Mon Sep 17 00:00:00 2001 From: Kelly Joseph Price Date: Tue, 2 Mar 2021 10:21:50 -0800 Subject: [PATCH 5/6] ugh --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index cc9a06242..65050227d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -27,7 +27,7 @@ jobs: - name: Run visual regression tests #run: CI=true npm run test.browser - run: npm run test.browser + run: npm run test.browser -- -u - uses: actions/upload-artifact@v2 #if: ${{ failure() }} From 1ac24c5f56b42b6ff2535772646837a70a424938 Mon Sep 17 00:00:00 2001 From: Kelly Joseph Price Date: Tue, 2 Mar 2021 10:25:52 -0800 Subject: [PATCH 6/6] cleanup --- .github/workflows/ci.yml | 5 ++--- ...s-callout-tests-without-surprises-1-snap.png | Bin 0 -> 14551 bytes 2 files changed, 2 insertions(+), 3 deletions(-) create mode 100644 __tests__/browser/ci/markdown-test-js-visual-regression-tests-rdmd-syntax-renders-callout-tests-without-surprises-1-snap.png diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 65050227d..90fbcb243 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -26,11 +26,10 @@ jobs: run: npm test - name: Run visual regression tests - #run: CI=true npm run test.browser - run: npm run test.browser -- -u + run: CI=true npm run test.browser - uses: actions/upload-artifact@v2 - #if: ${{ failure() }} + if: ${{ failure() }} with: name: image-snapshots path: __tests__/browser/ci diff --git a/__tests__/browser/ci/markdown-test-js-visual-regression-tests-rdmd-syntax-renders-callout-tests-without-surprises-1-snap.png b/__tests__/browser/ci/markdown-test-js-visual-regression-tests-rdmd-syntax-renders-callout-tests-without-surprises-1-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..857ea886e54c586928644f80df14ba00af5c9578 GIT binary patch literal 14551 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 ZFCTy#Ihvi9n0e0^C) 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 TEY3l-$?NLu@pH>hSN{B8<=-)@ literal 0 HcmV?d00001