From 46fb76c281f48c84cdd6a329fe0035b663477270 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcus=20Bl=C3=A4ttermann?= Date: Sun, 27 Nov 2022 02:37:23 +0100 Subject: [PATCH] Extract function to own file --- website/plugins/getProps.mjs | 38 ++++++++++++++++++++++ website/plugins/remarkCustomAttrs.mjs | 45 ++++----------------------- 2 files changed, 44 insertions(+), 39 deletions(-) create mode 100644 website/plugins/getProps.mjs diff --git a/website/plugins/getProps.mjs b/website/plugins/getProps.mjs new file mode 100644 index 000000000..1b9508ac0 --- /dev/null +++ b/website/plugins/getProps.mjs @@ -0,0 +1,38 @@ +const parseAttribute = (expression) => { + if (expression.type !== 'AssignmentExpression' || !expression.left || !expression.right) { + return + } + + const { left, right } = expression + + if (left.type !== 'Identifier' || right.type !== 'Literal' || !left.name || !right.value) { + return + } + + return [left.name, right.value] +} + +const getProps = (estree) => { + if (estree.type !== 'Program' || !estree.body || estree.body.length <= 0 || !estree.body[0]) { + return {} + } + + const estreeBodyFirstNode = estree.body[0] + + if (estreeBodyFirstNode.type !== 'ExpressionStatement' || !estreeBodyFirstNode.expression) { + return {} + } + + const statement = estreeBodyFirstNode.expression + + const attributeExpressions = [ + ...(statement.type === 'SequenceExpression' && statement.expressions + ? statement.expressions + : []), + ...(statement.type === 'AssignmentExpression' ? [statement] : []), + ] + + return Object.fromEntries(attributeExpressions.map(parseAttribute)) +} + +export default getProps diff --git a/website/plugins/remarkCustomAttrs.mjs b/website/plugins/remarkCustomAttrs.mjs index bd9a0baff..18274a09c 100644 --- a/website/plugins/remarkCustomAttrs.mjs +++ b/website/plugins/remarkCustomAttrs.mjs @@ -1,16 +1,4 @@ -const parseAttribute = (expression) => { - if (expression.type !== 'AssignmentExpression' || !expression.left || !expression.right) { - return - } - - const { left, right } = expression - - if (left.type !== 'Identifier' || right.type !== 'Literal' || !left.name || !right.value) { - return - } - - return { type: 'mdxJsxAttribute', name: left.name, value: right.value } -} +import getProps from './getProps.mjs' const handleNode = (node) => { if (node.type === 'section' && node.children) { @@ -31,34 +19,13 @@ const handleNode = (node) => { return node } - const { estree } = lastNode.data + const data = node.data || (node.data = {}) + data.hProperties = getProps(lastNode.data.estree) - if (estree.type !== 'Program' || !estree.body || estree.body.length <= 0 || !estree.body[0]) { - return node - } + // Only keep the text, drop the rest + node.children = [node.children[0]] - const estreeBodyFirstNode = estree.body[0] - - if (estreeBodyFirstNode.type !== 'ExpressionStatement' || !estreeBodyFirstNode.expression) { - return node - } - - const statement = estreeBodyFirstNode.expression - - const attributeExpressions = [ - ...(statement.type === 'SequenceExpression' && statement.expressions - ? statement.expressions - : []), - ...(statement.type === 'AssignmentExpression' ? [statement] : []), - ] - - // This replaces the markdown heading with a JSX element - return { - type: 'mdxJsxFlowElement', - name: `h${node.depth}`, - attributes: attributeExpressions.map(parseAttribute), - children: [node.children[0]], - } + return node } const parseAstTree = (markdownAST) => ({