├── .gitignore ├── README.md ├── index.js ├── package.json └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | mdx-loader 2 | ========== 3 | 4 | This project has moved to https://github.com/frontarm/mdx-util 5 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const url = require('url') 4 | const path = require('path') 5 | const loaderUtils = require('loader-utils') 6 | const frontMatter = require('front-matter') 7 | const Prism = require('prismjs') 8 | const MDXC = require('mdxc') 9 | 10 | 11 | const env = {}; 12 | 13 | 14 | const aliases = { 15 | 'js': 'jsx', 16 | 'html': 'markup' 17 | } 18 | function highlight(str, lang) { 19 | if (!lang) { 20 | return str 21 | } else { 22 | lang = aliases[lang] || lang 23 | require(`prismjs/components/prism-${lang}.js`) 24 | if (Prism.languages[lang]) { 25 | return Prism.highlight(str, Prism.languages[lang]) 26 | } else { 27 | return str 28 | } 29 | } 30 | } 31 | 32 | 33 | function mdImageReplacer(md) { 34 | md.core.ruler.push('imageReplacer', function(state) { 35 | function applyFilterToTokenHierarchy(token) { 36 | if (token.children) { 37 | token.children.map(applyFilterToTokenHierarchy); 38 | } 39 | 40 | if (token.type === 'image') { 41 | const src = token.attrGet('src') 42 | 43 | if(!loaderUtils.isUrlRequest(src)) return; 44 | 45 | const uri = url.parse(src); 46 | uri.hash = null; 47 | token.attrSet('src', { __jsx: 'require("'+uri.format()+'")' }); 48 | } 49 | } 50 | 51 | state.tokens.map(applyFilterToTokenHierarchy); 52 | }) 53 | } 54 | 55 | 56 | module.exports = function mdxLoader(content) { 57 | const loaderOptions = loaderUtils.getOptions(this) || {}; 58 | 59 | if (loaderOptions.linkify === undefined) loaderOptions.linkify = true; 60 | if (loaderOptions.typographer === undefined) loaderOptions.typographer = true; 61 | if (loaderOptions.highlight === undefined) loaderOptions.highlight = highlight; 62 | 63 | let md = new MDXC(loaderOptions).use(mdImageReplacer) 64 | 65 | if (loaderOptions.pragma) { 66 | Object.assign(md.factories, { 67 | codeBlock: '(props, children) => '+loaderOptions.pragma+'("pre", props, '+loaderOptions.pragma+'("code", { dangerouslySetInnerHTML: { __html: children || props.children } }))' 68 | }) 69 | } 70 | 71 | const data = frontMatter(content); 72 | const body = md.render(data.body, env); 73 | return body + `\n${loaderOptions.commonJS ? 'module.exports.meta' : 'export const meta'} = ${JSON.stringify(data.attributes, null, 2)}` 74 | } 75 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "mdx-loader", 3 | "version": "1.0.0-beta.3", 4 | "description": "Webpack loader for MDXC", 5 | "main": "index.js", 6 | "keywords": [ 7 | "markdown", 8 | "jsx", 9 | "webpack", 10 | "loader", 11 | "mdx" 12 | ], 13 | "author": "James K Nelson ", 14 | "license": "MIT", 15 | "peerDependencies": { 16 | "mdxc": "^1.0.0-beta.4" 17 | }, 18 | "dependencies": { 19 | "front-matter": "^2.1.2", 20 | "loader-utils": "^1.1.0", 21 | "prismjs": "^1.6.0" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | argparse@^1.0.7: 6 | version "1.0.9" 7 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" 8 | dependencies: 9 | sprintf-js "~1.0.2" 10 | 11 | big.js@^3.1.3: 12 | version "3.1.3" 13 | resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.1.3.tgz#4cada2193652eb3ca9ec8e55c9015669c9806978" 14 | 15 | clipboard@^1.5.5: 16 | version "1.5.16" 17 | resolved "https://registry.yarnpkg.com/clipboard/-/clipboard-1.5.16.tgz#916d5e739b0064be61b0b48a535731ecaef3d367" 18 | dependencies: 19 | good-listener "^1.2.0" 20 | select "^1.0.6" 21 | tiny-emitter "^1.0.0" 22 | 23 | delegate@^3.1.1: 24 | version "3.1.1" 25 | resolved "https://registry.yarnpkg.com/delegate/-/delegate-3.1.1.tgz#22a0e3ea8776c7f89e02d5950942ef9cdfd019cf" 26 | 27 | emojis-list@^2.0.0: 28 | version "2.1.0" 29 | resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" 30 | 31 | esprima@^2.6.0: 32 | version "2.7.3" 33 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" 34 | 35 | front-matter@^2.1.2: 36 | version "2.1.2" 37 | resolved "https://registry.yarnpkg.com/front-matter/-/front-matter-2.1.2.tgz#f75983b9f2f413be658c93dfd7bd8ce4078f5cdb" 38 | dependencies: 39 | js-yaml "^3.4.6" 40 | 41 | good-listener@^1.2.0: 42 | version "1.2.1" 43 | resolved "https://registry.yarnpkg.com/good-listener/-/good-listener-1.2.1.tgz#4c5b4681a3e8c91b00f1cb12d89a23b32473547b" 44 | dependencies: 45 | delegate "^3.1.1" 46 | 47 | js-yaml@^3.4.6: 48 | version "3.7.0" 49 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.7.0.tgz#5c967ddd837a9bfdca5f2de84253abe8a1c03b80" 50 | dependencies: 51 | argparse "^1.0.7" 52 | esprima "^2.6.0" 53 | 54 | json5@^0.5.0: 55 | version "0.5.1" 56 | resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" 57 | 58 | loader-utils@^1.1.0: 59 | version "1.1.0" 60 | resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd" 61 | dependencies: 62 | big.js "^3.1.3" 63 | emojis-list "^2.0.0" 64 | json5 "^0.5.0" 65 | 66 | prismjs@^1.6.0: 67 | version "1.6.0" 68 | resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.6.0.tgz#118d95fb7a66dba2272e343b345f5236659db365" 69 | optionalDependencies: 70 | clipboard "^1.5.5" 71 | 72 | select@^1.0.6: 73 | version "1.1.0" 74 | resolved "https://registry.yarnpkg.com/select/-/select-1.1.0.tgz#a6c520cd9ab919ad81c7d1a273e0452f504dd7a2" 75 | 76 | sprintf-js@~1.0.2: 77 | version "1.0.3" 78 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 79 | 80 | tiny-emitter@^1.0.0: 81 | version "1.1.0" 82 | resolved "https://registry.yarnpkg.com/tiny-emitter/-/tiny-emitter-1.1.0.tgz#ab405a21ffed814a76c19739648093d70654fecb" 83 | --------------------------------------------------------------------------------