UNPKG

marked-code-jsx-renderer

Version:

A marked extension to render JSX code blocks using a custom renderer and components

3 lines (2 loc) 1.51 kB
"use strict";const h=require("attributes-parser"),v=require("@babel/core"),O=/\s*renderable(?:=(?:"[^"]*"|'[^']*'|[^"'\s]*))?$|renderable(?:=(?:"[^"]*"|'[^']*'|[^"'\s]*))?\s*/g,k={name:"babel-plugin-remove-import",visitor:{ImportDeclaration(e){e.remove()}}};function A(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function R(e,c){const{index:i,parent:f,hooksData:t,components:n={},Fragment:l,jsx:s,jsxs:r,renderer:u,sanitizer:a,unwrap:y,errorHandler:b}=c;if(!s||!u)return;const p={type:"code",raw:""},x=e.text;try{const d=a?a(x):x,m=v.transformSync(d,{plugins:[k],presets:[["@babel/preset-react",{runtime:"automatic",development:!1}]]}),w=new Function("Fragment","_jsx","_jsxs",...Object.keys(n),...Object.keys(t),`return ${m==null?void 0:m.code}`),o=u(w(l,s,r,...Object.values(n),...Object.values(t)));if(y)Object.assign(p,{type:"html",block:!0,raw:o,pre:!1,text:o});else{const g=e.lang.replace(O,"").split(" ");g.splice(0,1,"html");const j=g.join(" ");Object.assign(p,{lang:j,raw:"```"+j+` `+o+"\n```",text:o})}f.splice(i,1,p)}catch(d){typeof b=="function"&&b(d)}}function T(e={}){const{unwrap:c}=e,i=["react","javascriptreact","jsx"];return{extensions:[{name:"code",level:"block",tokenizer(f,t){t.forEach((n,l)=>{if(n.type!=="code"||!n.lang||!n.text)return;const{data:s={}}=this.lexer.options.hooks||{data:{}},{renderable:r}=h(n.lang);if(!(r&&i.indexOf(n.lang.split(" ")[0])!==-1))return;const a=A(r)?r:{};R(n,{index:l,parent:t,hooksData:s,...e,unwrap:a.unwrap||c})})}}]}}module.exports=T;