Add support for markdown plugins (#1650)
This commit is contained in:
parent
8206421ffa
commit
7f95d706e9
7 changed files with 42 additions and 46 deletions
|
@ -5,16 +5,19 @@
|
||||||
// VSCode and other TypeScript-enabled text editors will provide auto-completion,
|
// VSCode and other TypeScript-enabled text editors will provide auto-completion,
|
||||||
// helpful tooltips, and warnings if your exported object is invalid.
|
// helpful tooltips, and warnings if your exported object is invalid.
|
||||||
// You can disable this by removing "@ts-check" and `@type` comments below.
|
// You can disable this by removing "@ts-check" and `@type` comments below.
|
||||||
|
import astroRemark from '@astrojs/markdown-remark';
|
||||||
|
|
||||||
// @ts-check
|
// @ts-check
|
||||||
export default /** @type {import('astro').AstroUserConfig} */ ({
|
export default /** @type {import('astro').AstroUserConfig} */ ({
|
||||||
// Enable Custom Markdown options, plugins, etc.
|
// Enable Custom Markdown options, plugins, etc.
|
||||||
markdownOptions: {
|
markdownOptions: {
|
||||||
|
render: [astroRemark, {
|
||||||
remarkPlugins: ['remark-code-titles', 'remark-slug'],
|
remarkPlugins: ['remark-code-titles', 'remark-slug'],
|
||||||
rehypePlugins: [
|
rehypePlugins: [
|
||||||
['rehype-autolink-headings', { behavior: 'prepend' }],
|
['rehype-autolink-headings', { behavior: 'prepend' }],
|
||||||
['rehype-toc', { headings: ['h2', 'h3'] }],
|
['rehype-toc', { headings: ['h2', 'h3'] }],
|
||||||
['rehype-add-classes', { 'h1,h2,h3': 'title' }],
|
['rehype-add-classes', { 'h1,h2,h3': 'title' }],
|
||||||
],
|
]
|
||||||
|
}]
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
|
@ -53,7 +53,7 @@
|
||||||
"test": "mocha --parallel --timeout 15000"
|
"test": "mocha --parallel --timeout 15000"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@astrojs/compiler": "^0.2.13",
|
"@astrojs/compiler": "^0.2.16",
|
||||||
"@astrojs/language-server": "^0.7.16",
|
"@astrojs/language-server": "^0.7.16",
|
||||||
"@astrojs/markdown-remark": "^0.3.1",
|
"@astrojs/markdown-remark": "^0.3.1",
|
||||||
"@astrojs/markdown-support": "0.3.1",
|
"@astrojs/markdown-support": "0.3.1",
|
||||||
|
|
|
@ -42,8 +42,6 @@ export const AstroConfigSchema = z.object({
|
||||||
.object({
|
.object({
|
||||||
footnotes: z.boolean().optional(),
|
footnotes: z.boolean().optional(),
|
||||||
gfm: z.boolean().optional(),
|
gfm: z.boolean().optional(),
|
||||||
remarkPlugins: z.array(z.any()).optional(),
|
|
||||||
rehypePlugins: z.array(z.any()).optional(),
|
|
||||||
render: z.any().optional().default(['@astrojs/markdown-remark', {}]),
|
render: z.any().optional().default(['@astrojs/markdown-remark', {}]),
|
||||||
})
|
})
|
||||||
.optional()
|
.optional()
|
||||||
|
|
|
@ -1,9 +1,10 @@
|
||||||
/**
|
|
||||||
* UNCOMMENT: add markdown plugin support
|
|
||||||
import { expect } from 'chai';
|
import { expect } from 'chai';
|
||||||
import cheerio from 'cheerio';
|
import cheerio from 'cheerio';
|
||||||
import { loadFixture } from './test-utils.js';
|
import { loadFixture } from './test-utils.js';
|
||||||
|
import markdownRemark from '@astrojs/markdown-remark';
|
||||||
|
|
||||||
|
|
||||||
|
describe('Astro Markdown plugins', () => {
|
||||||
let fixture;
|
let fixture;
|
||||||
|
|
||||||
before(async () => {
|
before(async () => {
|
||||||
|
@ -11,11 +12,13 @@ before(async () => {
|
||||||
projectRoot: './fixtures/astro-markdown-plugins/',
|
projectRoot: './fixtures/astro-markdown-plugins/',
|
||||||
renderers: ['@astrojs/renderer-preact'],
|
renderers: ['@astrojs/renderer-preact'],
|
||||||
markdownOptions: {
|
markdownOptions: {
|
||||||
|
render: [markdownRemark, {
|
||||||
remarkPlugins: ['remark-code-titles', 'remark-slug', ['rehype-autolink-headings', { behavior: 'prepend' }]],
|
remarkPlugins: ['remark-code-titles', 'remark-slug', ['rehype-autolink-headings', { behavior: 'prepend' }]],
|
||||||
rehypePlugins: [
|
rehypePlugins: [
|
||||||
['rehype-toc', { headings: ['h2', 'h3'] }],
|
['rehype-toc', { headings: ['h2', 'h3'] }],
|
||||||
['rehype-add-classes', { 'h1,h2,h3': 'title' }],
|
['rehype-add-classes', { 'h1,h2,h3': 'title' }],
|
||||||
],
|
],
|
||||||
|
}],
|
||||||
},
|
},
|
||||||
buildOptions: {
|
buildOptions: {
|
||||||
sitemap: false,
|
sitemap: false,
|
||||||
|
@ -24,8 +27,6 @@ before(async () => {
|
||||||
await fixture.build();
|
await fixture.build();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
describe('Astro Markdown plugins', () => {
|
|
||||||
it('Can render markdown with plugins', async () => {
|
it('Can render markdown with plugins', async () => {
|
||||||
const html = await fixture.readFile('/index.html');
|
const html = await fixture.readFile('/index.html');
|
||||||
const $ = cheerio.load(html);
|
const $ = cheerio.load(html);
|
||||||
|
@ -34,7 +35,7 @@ describe('Astro Markdown plugins', () => {
|
||||||
expect($('.toc')).to.have.lengthOf(1);
|
expect($('.toc')).to.have.lengthOf(1);
|
||||||
|
|
||||||
// teste 2: Added .title to h1
|
// teste 2: Added .title to h1
|
||||||
expect($('#hello-world').hasClass('title')).toBeTrue();
|
expect($('#hello-world').hasClass('title')).to.equal(true);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('Can render Astro <Markdown> with plugins', async () => {
|
it('Can render Astro <Markdown> with plugins', async () => {
|
||||||
|
@ -45,9 +46,6 @@ describe('Astro Markdown plugins', () => {
|
||||||
expect($('.toc')).to.have.lengthOf(1);
|
expect($('.toc')).to.have.lengthOf(1);
|
||||||
|
|
||||||
// teste 2: Added .title to h1
|
// teste 2: Added .title to h1
|
||||||
expect($('#hello-world').hasClass('title')).toBeTrue();
|
expect($('#hello-world').hasClass('title')).to.equal(true);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
*/
|
|
||||||
|
|
||||||
it.skip('is skipped', () => {});
|
|
||||||
|
|
|
@ -6,7 +6,6 @@ import { remarkExpressions, loadRemarkExpressions } from './remark-expressions.j
|
||||||
import rehypeExpressions from './rehype-expressions.js';
|
import rehypeExpressions from './rehype-expressions.js';
|
||||||
import { remarkJsx, loadRemarkJsx } from './remark-jsx.js';
|
import { remarkJsx, loadRemarkJsx } from './remark-jsx.js';
|
||||||
import rehypeJsx from './rehype-jsx.js';
|
import rehypeJsx from './rehype-jsx.js';
|
||||||
//import { remarkCodeBlock } from './codeblock.js';
|
|
||||||
import remarkPrism from './remark-prism.js';
|
import remarkPrism from './remark-prism.js';
|
||||||
import remarkUnwrap from './remark-unwrap.js';
|
import remarkUnwrap from './remark-unwrap.js';
|
||||||
import { loadPlugins } from './load-plugins.js';
|
import { loadPlugins } from './load-plugins.js';
|
||||||
|
@ -53,7 +52,6 @@ export async function renderMarkdown(content: string, opts?: MarkdownRenderingOp
|
||||||
.use(isMDX ? [remarkJsx] : [])
|
.use(isMDX ? [remarkJsx] : [])
|
||||||
.use(isMDX ? [remarkExpressions] : [])
|
.use(isMDX ? [remarkExpressions] : [])
|
||||||
.use([remarkUnwrap])
|
.use([remarkUnwrap])
|
||||||
.use([remarkPrism(scopedClassName)])
|
|
||||||
|
|
||||||
const loadedRemarkPlugins = await Promise.all(loadPlugins(remarkPlugins));
|
const loadedRemarkPlugins = await Promise.all(loadPlugins(remarkPlugins));
|
||||||
const loadedRehypePlugins = await Promise.all(loadPlugins(rehypePlugins));
|
const loadedRehypePlugins = await Promise.all(loadPlugins(rehypePlugins));
|
||||||
|
@ -66,7 +64,7 @@ export async function renderMarkdown(content: string, opts?: MarkdownRenderingOp
|
||||||
parser.use([scopedStyles(scopedClassName)]);
|
parser.use([scopedStyles(scopedClassName)]);
|
||||||
}
|
}
|
||||||
|
|
||||||
//parser.use(remarkCodeBlock);
|
parser.use([remarkPrism(scopedClassName)]);
|
||||||
parser.use([[markdownToHtml as any, { allowDangerousHtml: true, passThrough: ['raw', 'mdxTextExpression', 'mdxJsxTextElement', 'mdxJsxFlowElement']}]]);
|
parser.use([[markdownToHtml as any, { allowDangerousHtml: true, passThrough: ['raw', 'mdxTextExpression', 'mdxJsxTextElement', 'mdxJsxFlowElement']}]]);
|
||||||
|
|
||||||
loadedRehypePlugins.forEach(([plugin, opts]) => {
|
loadedRehypePlugins.forEach(([plugin, opts]) => {
|
||||||
|
@ -86,7 +84,6 @@ export async function renderMarkdown(content: string, opts?: MarkdownRenderingOp
|
||||||
.process(content);
|
.process(content);
|
||||||
result = vfile.toString();
|
result = vfile.toString();
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
debugger;
|
|
||||||
console.error(err);
|
console.error(err);
|
||||||
throw err;
|
throw err;
|
||||||
}
|
}
|
||||||
|
|
|
@ -58,7 +58,7 @@ function transformer(className: MaybeString) {
|
||||||
if(className) {
|
if(className) {
|
||||||
classes.push(className);
|
classes.push(className);
|
||||||
}
|
}
|
||||||
node.value = `<pre class="${classes.join(' ')}"><code class="${classLanguage}">${html}</code></pre>`;
|
node.value = `<pre class="${classes.join(' ')}"><code data-astro-raw class="${classLanguage}">${html}</code></pre>`;
|
||||||
return node;
|
return node;
|
||||||
};
|
};
|
||||||
return visit(tree, 'code', visitor)
|
return visit(tree, 'code', visitor)
|
||||||
|
|
|
@ -106,10 +106,10 @@
|
||||||
"@algolia/logger-common" "4.10.5"
|
"@algolia/logger-common" "4.10.5"
|
||||||
"@algolia/requester-common" "4.10.5"
|
"@algolia/requester-common" "4.10.5"
|
||||||
|
|
||||||
"@astrojs/compiler@^0.2.13":
|
"@astrojs/compiler@^0.2.16":
|
||||||
version "0.2.13"
|
version "0.2.16"
|
||||||
resolved "https://registry.yarnpkg.com/@astrojs/compiler/-/compiler-0.2.13.tgz#ea67f9865efdd69a69cb296c0e71f8002f059da9"
|
resolved "https://registry.yarnpkg.com/@astrojs/compiler/-/compiler-0.2.16.tgz#e2b560d699c586bb26e5332255050f8b97d1a19d"
|
||||||
integrity sha512-KfbY475EdQLPYe8B3Pyqeu4rCYY/aHad5QkoCHIvIDYU2XCM8vMA/PLtpLdi05TSAw6NGFLAZmQJOE1dzsBRLg==
|
integrity sha512-PVMIxBePkzxkg56g9WJXmKkeW0xCmAMOrmSpW0uySucWbdyAMc31sSZb9v6dhYt4lrFiV6CDOCCqcEmRc2wHoA==
|
||||||
dependencies:
|
dependencies:
|
||||||
typescript "^4.3.5"
|
typescript "^4.3.5"
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue