Index example text in Markdown, converted to React components. The current package is the loader
of webpack
, which loads the markdown
document by configuring the current loader
, returning a JS
object containing the markdown
text, the example index in the markdown
text.
npm i markdown-react-code-preview-loader -D
After installing the dependency (loader), we need to configure the loader
into the webpack
configuration. Learn how to use the configuration loader
by using two configuration methods in kkt
.
① The first method, use the mdCodeModulesLoader method
mdCodeModulesLoader
method for adding markdown-react-code-preview-loader
to webpack config.
// .kktrc.ts
import scopePluginOptions from '@kkt/scope-plugin-options';
import { LoaderConfOptions, WebpackConfiguration } from 'kkt';
import { mdCodeModulesLoader } from 'markdown-react-code-preview-loader';
export default (conf: WebpackConfiguration, env: 'development' | 'production', options: LoaderConfOptions) => {
// ....
conf = mdCodeModulesLoader(conf);
// ....
return conf;
};
import webpack from 'webpack';
import { Options } from 'markdown-react-code-preview-loader';
/**
* `mdCodeModulesLoader` method for adding `markdown-react-code-preview-loader` to webpack config.
* @param {webpack.Configuration} config webpack config
* @param {string[]} lang Parsing language
* @param {Options} option Loader Options
* @returns {webpack.Configuration}
* **/
export declare const mdCodeModulesLoader: (config: webpack.Configuration, lang?: string[], option?: Options) => webpack.Configuration;
② The second method is to manually add the configuration
The configuration and usage methods are consistent in Webpack.
// .kktrc.ts
import webpack, { Configuration } from 'webpack';
import scopePluginOptions from '@kkt/scope-plugin-options';
import { LoaderConfOptions } from 'kkt';
export default (conf: Configuration, env: 'development' | 'production', options: LoaderConfOptions) => {
// ....
config.module.rules.forEach((ruleItem) => {
if (typeof ruleItem === 'object') {
if (ruleItem.oneOf) {
ruleItem.oneOf.unshift({
test: /.md$/,
use: [
{
loader: 'markdown-react-code-preview-loader',
options: { lang:["jsx","tsx"] },
},
],
});
}
}
});
// ....
return conf;
};
import { PluginItem } from '@babel/core';
import { Options as RemoveImportsOptions } from 'babel-plugin-transform-remove-imports'
export type Options = {
/**
* Language to parse code blocks, default: `["jsx","tsx"]`
*/
lang?: string[];
/**
* Option settings for the babel (babel-plugin-transform-remove-imports) package
* https://github.com/uiwjs/babel-plugin-transform-remove-imports
*/
removeImports?: RemoveImportsOptions;
/**
* Add babel plugins.
*/
babelPlugins?: PluginItem[];
/**Do you want to parse the title*/
isHeading?: boolean
}
After adding loader
, use the method to load markdown
text in the project project:
import mdObj from 'markdown-react-code-preview-loader/README.md';
mdObj.source // => `README.md` raw string text
mdObj.components // => The component index object, the React component converted from the markdown indexed example. (need to configure meta)
mdObj.data // => The component source code index object, the sample source code indexed from markdown. (need to configure meta)
mdObj.headings // => This is the parsed header data
{
data: {
77: {
code: "\"use strict\";\n\nfunction ......"
language: "jsx"
name: 77,
meta: {},
value: "impo....."
},
demo12: {
code: "\"use strict\";\n\nfunction ......"
language: "jsx"
name: 'demo12',
meta: {},
value: "impo....."
}
},
components: { 77: ƒ, demo12: ƒ },
source: "# Alert 确认对话框....",
headings:[{depth:1,value:"标题", ...},...]
}
export type CodeBlockItem = {
/** The code after the source code conversion. **/
code?: string;
/** original code block **/
value?: string;
/** code block programming language **/
language?: string;
/** The index name, which can be customized, can be a row number. */
name?: string | number;
/** The `meta` parameter is converted into an `object`. */
meta?: Record<string, string>;
};
export type CodeBlockData = {
source: string;
components: Record<CodeBlockItem['name'], React.FC>;
data: Record<CodeBlockItem['name'], CodeBlockItem>;
headings?: HeadingItem[]
};
import { isMeta } from 'markdown-react-code-preview-loader';
isMeta('mdx:preview') // => true
isMeta('mdx:preview:demo12') // => true
isMeta('mdx:preview--demo12') // => false
import { getMetaId } from 'markdown-react-code-preview-loader';
getMetaId('mdx:preview') // => ''
getMetaId('mdx:preview:demo12') // => 'demo12'
import { getURLParameters } from 'markdown-react-code-preview-loader';
getURLParameters('name=Adam&surname=Smith') // => { name: 'Adam', surname: "Smith" }
getURLParameters('mdx:preview:demo12') // => { }
getURLParameters('mdx:preview:demo12&name=Adam&surname=Smith') // => { name: 'Adam', surname: "Smith" }
getURLParameters('mdx:preview:demo12&code=true&boreder=0') // => { code: 'true', boreder: "0" }
getURLParameters('mdx:preview:demo12?code=true&boreder=0') // => { code: 'true', boreder: "0" }
\```tsx mdx:preview:demo12&code=true&boreder=0
import React from "react"
const Demo = ()=>{
return <div>测试</div>
}
export default Demo
\```
{
data: {
demo12: {
code: "\"use strict\";\n\nfunction ......"
language: "jsx"
name: 'demo12',
meta: { code: 'true', boreder: '0' },
value: "impo....."
}
},
components: { demo12: ƒ },
source: "# Alert 确认对话框...."
}
const getCodeBlock: (child: MarkdownParseData['children'], opts?: Options) => CodeBlockData['data'];
Note meta
identifier to the code block example, and loader
will index the react
example for code conversion.
Meta Tag Meta ID Meta Param
┈┈┈┈┈┈┈┈ ┈┈┈┈┈┈┈ ┈┈┈┈┈┈┈┈┈┈
╭┈┈┈┈┈┈┈┈━╲━━━━━━━━━━━━╱━━━━━━━╱━━━━━┈┈┈┈╮
┆ ```jsx mdx:preview:demo12&boreder=0 ┆
┆ import React from "react" ┆
┆ const Demo = () => <div>Test</div> ┆
┆ export default Demo ┆
┆ ``` ┆
╰┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈╯
mdx:
special identifier prefixmdx:preview
Controls whether to perform example indexing, and obtain the required example object through the corresponding line number.mdx:preview:demo12
Uniquely identified bydemo12
, accurately obtain theexample code
orexample component object
of the index.mdx:preview:&code=true&border=0
pass the parameters for the rendering layer to use.
\```tsx mdx:preview
import React from "react"
const Demo = ()=>{
return <div>测试</div>
}
export default Demo
\```
\```tsx mdx:preview:demo12
import React from "react"
const Demo = ()=>{
return <div>测试</div>
}
export default Demo
\```
\```tsx mdx:preview:demo12&code=true&boreder=0
import React from "react"
const Demo = ()=>{
return <div>测试</div>
}
export default Demo
\```
npm install # Install dependencies
npm install --workspaces # Install sub packages dependencies
npm run watch
npm run start
As always, thanks to our amazing contributors!
Made with action-contributors.
Licensed under the MIT License.