You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
47 lines
1.0 KiB
JavaScript
47 lines
1.0 KiB
JavaScript
"use strict";
|
|
|
|
// NOTE: Originates from https://git.pixie.town/f0x/shayu-doc/src/branch/master/components/code.jsx
|
|
|
|
const defaultValue = require('default-value');
|
|
const React = require('react');
|
|
const {default: SyntaxHighlighter} = require('react-syntax-highlighter');
|
|
|
|
function findLanguageClass(className='') {
|
|
let lang;
|
|
let classes = className.split(' ');
|
|
classes.some((classStr) => {
|
|
let match = classStr.match(/^language-(.+)/);
|
|
if (match) {
|
|
lang = match[1];
|
|
}
|
|
return match;
|
|
});
|
|
return lang
|
|
}
|
|
|
|
let langPresets = {
|
|
default: {
|
|
showLineNumbers: true,
|
|
},
|
|
shell: {
|
|
showLineNumbers: false
|
|
}
|
|
}
|
|
|
|
function code({className, children}) {
|
|
let lang = findLanguageClass(className);
|
|
let preset = defaultValue(langPresets[lang], langPresets.default);
|
|
preset = {...langPresets.default, ...preset};
|
|
|
|
return <SyntaxHighlighter
|
|
language={defaultValue(lang, "text")}
|
|
className={className}
|
|
useInlineStyles={false}
|
|
showLineNumbers={preset.showLineNumbers}
|
|
>
|
|
{children}
|
|
</SyntaxHighlighter>
|
|
}
|
|
|
|
module.exports = code;
|