diff options
Diffstat (limited to 'packages/integrations/mdx')
5 files changed, 43 insertions, 0 deletions
diff --git a/packages/integrations/mdx/package.json b/packages/integrations/mdx/package.json index 1d3caad5e..053cb3efb 100644 --- a/packages/integrations/mdx/package.json +++ b/packages/integrations/mdx/package.json @@ -43,6 +43,7 @@ "rehype-raw": "^6.1.1", "remark-frontmatter": "^4.0.1", "remark-gfm": "^3.0.1", + "remark-smartypants": "^2.0.0", "shiki": "^0.11.1", "unist-util-visit": "^4.1.0", "vfile": "^5.3.2" diff --git a/packages/integrations/mdx/src/index.ts b/packages/integrations/mdx/src/index.ts index 7a49498e6..756e6d24f 100644 --- a/packages/integrations/mdx/src/index.ts +++ b/packages/integrations/mdx/src/index.ts @@ -186,6 +186,7 @@ function applyDefaultOptions({ recmaPlugins: options.recmaPlugins ?? defaults.recmaPlugins, remarkRehype: options.remarkRehype ?? defaults.remarkRehype, gfm: options.gfm ?? defaults.gfm, + smartypants: options.smartypants ?? defaults.smartypants, remarkPlugins: options.remarkPlugins ?? defaults.remarkPlugins, rehypePlugins: options.rehypePlugins ?? defaults.rehypePlugins, shikiConfig: options.shikiConfig ?? defaults.shikiConfig, diff --git a/packages/integrations/mdx/src/plugins.ts b/packages/integrations/mdx/src/plugins.ts index f5557b8a3..6637b57d7 100644 --- a/packages/integrations/mdx/src/plugins.ts +++ b/packages/integrations/mdx/src/plugins.ts @@ -14,6 +14,7 @@ import type { Image } from 'mdast'; import { pathToFileURL } from 'node:url'; import rehypeRaw from 'rehype-raw'; import remarkGfm from 'remark-gfm'; +import remarkSmartypants from 'remark-smartypants'; import { visit } from 'unist-util-visit'; import type { VFile } from 'vfile'; import { MdxOptions } from './index.js'; @@ -153,6 +154,9 @@ export async function getRemarkPlugins( if (mdxOptions.gfm) { remarkPlugins.push(remarkGfm); } + if (mdxOptions.smartypants) { + remarkPlugins.push(remarkSmartypants); + } remarkPlugins = [...remarkPlugins, ...ignoreStringPlugins(mdxOptions.remarkPlugins)]; diff --git a/packages/integrations/mdx/test/fixtures/mdx-plugins/src/pages/with-plugins.mdx b/packages/integrations/mdx/test/fixtures/mdx-plugins/src/pages/with-plugins.mdx index fcd8ae181..8699f4a22 100644 --- a/packages/integrations/mdx/test/fixtures/mdx-plugins/src/pages/with-plugins.mdx +++ b/packages/integrations/mdx/test/fixtures/mdx-plugins/src/pages/with-plugins.mdx @@ -21,3 +21,5 @@ Oh cool, more text! And section 2, with a hyperlink to check GFM is preserved: https://handle-me-gfm.com <div data-recma-plugin-works={recmaPluginWorking}></div> + +> "Smartypants" is -- awesome diff --git a/packages/integrations/mdx/test/mdx-plugins.test.js b/packages/integrations/mdx/test/mdx-plugins.test.js index f74ded3ea..828bcb3d5 100644 --- a/packages/integrations/mdx/test/mdx-plugins.test.js +++ b/packages/integrations/mdx/test/mdx-plugins.test.js @@ -36,6 +36,19 @@ describe('MDX plugins', () => { expect(selectGfmLink(document)).to.not.be.null; }); + it('Applies SmartyPants by default', async () => { + const fixture = await buildFixture({ + integrations: [mdx()], + }); + + const html = await fixture.readFile(FILE); + const { document } = parseHTML(html); + + const quote = selectSmartypantsQuote(document); + expect(quote).to.not.be.null; + expect(quote.textContent).to.contain('“Smartypants” is — awesome'); + }); + it('supports custom rehype plugins', async () => { const fixture = await buildFixture({ integrations: [ @@ -88,6 +101,7 @@ describe('MDX plugins', () => { markdown: { remarkPlugins: [remarkToc], gfm: false, + smartypants: false, }, integrations: [ mdx({ @@ -129,6 +143,23 @@ describe('MDX plugins', () => { expect(selectGfmLink(document), 'Respects `markdown.gfm` unexpectedly.').to.not.be.null; } }); + + it('Handles smartypants', async () => { + const html = await fixture.readFile(FILE); + const { document } = parseHTML(html); + + const quote = selectSmartypantsQuote(document); + + if (extendMarkdownConfig === true) { + expect(quote.textContent, 'Does not respect `markdown.smartypants` option.').to.contain( + '"Smartypants" is -- awesome' + ); + } else { + expect(quote.textContent, 'Respects `markdown.smartypants` unexpectedly.').to.contain( + '“Smartypants” is — awesome' + ); + } + }); }); } @@ -202,6 +233,10 @@ function selectGfmLink(document) { return document.querySelector('a[href="https://handle-me-gfm.com"]'); } +function selectSmartypantsQuote(document) { + return document.querySelector('blockquote'); +} + function selectRemarkExample(document) { return document.querySelector('div[data-remark-plugin-works]'); } |