@metalsmith/markdown
Version:
A Metalsmith plugin to render markdown files to HTML
1 lines • 15.5 kB
Source Map (JSON)
{"version":3,"file":"index.cjs","sources":["../src/expand-wildcard-keypath.js","../src/index.js"],"sourcesContent":["import get from 'dlv'\n\n// istanbul ignore next\nfunction error(name, msg) {\n const err = new Error(msg)\n err.name = name\n return err\n}\n\nfunction isArray(arg) {\n return Array.isArray(arg)\n}\nfunction isString(arg) {\n return typeof arg === 'string'\n}\nfunction isObject(arg) {\n return typeof arg === 'object' && arg !== null\n}\n\n/**\n * Expand wildcard `char` for `keypaths` in `root`. The results can be used by a utility function like lodash.get or dlv. For example:\n * ```js\n * let keypaths = [\n * ['arr.*'],\n * ['arr.*.*']\n * ]\n * expand(keypaths, { arr: ['a','b','c']}) // => [['arr', 0], ['arr', 1], ['arr', 2]]\n * expand(keypaths, { arr: ['a','b','c']}) // => [['arr', 0], ['arr', 1], ['arr', 2]]\n * ```\n * @param {Object|Array} root\n * @param {Array<string|number>[]} keypaths\n * @param {string} [char='*']\n * @returns {Array<string|number>[]}\n */\nfunction expandWildcardKeypath(root, keypaths, char) {\n // istanbul ignore if\n if (!isObject(root)) {\n throw error('EINVALID_ARGUMENT', 'root must be an object or array')\n }\n // istanbul ignore if\n if (!isArray(keypaths) || keypaths.filter((keypath) => !isString(keypath) && !isArray(keypath)).length) {\n throw error('EINVALID_ARGUMENT', 'keypaths must be strings or arrays of strings')\n }\n\n const expanded = keypaths.reduce((result, keypath) => {\n if (isString(keypath)) keypath = keypath.split('.')\n const wildcard = keypath.indexOf(char)\n if (wildcard > -1) {\n const pre = keypath.slice(0, wildcard)\n const wildcardRoot = get(root, pre)\n\n if (!wildcardRoot) return result\n const looped = isArray(wildcardRoot) ? wildcardRoot : Object.keys(wildcardRoot)\n\n looped.forEach((entry, index) => {\n const pp = Array.from(keypath)\n pp.splice(wildcard, 1, isArray(wildcardRoot) ? index : entry)\n result.push(pp)\n })\n } else {\n result.push(keypath)\n }\n return result\n }, [])\n if (expanded.find((entry) => entry.indexOf(char) > -1)) {\n return expandWildcardKeypath(root, expanded, char)\n }\n return expanded\n}\n\nexport default expandWildcardKeypath\n","import { basename, dirname, extname, join } from 'path'\nimport get from 'dlv'\nimport { dset as set } from 'dset'\nimport { marked } from 'marked'\nimport expandWildcardKeypaths from './expand-wildcard-keypath.js'\n\nfunction defaultRender(source, options) {\n return marked(source, options)\n}\n\nfunction refsObjectToMarkdown(refsObject) {\n return Object.entries(refsObject)\n .map(([refname, value]) => `[${refname}]: ${value}`)\n .join('\\n')\n}\n\n/**\n * @callback Render\n * @param {string} source\n * @param {Object} engineOptions\n * @param {{ path: string, key: string}} context\n */\n\n/**\n * @typedef Options\n * @property {string[]|{files: string[], global: string[]}} [keys] - Key names of file metadata to render to HTML - can be nested\n * @property {boolean} [wildcard=false] - Expand `*` wildcards in keypaths\n * @property {string|Object<string, string>} [globalRefs] An object of `{ refname: 'link' }` pairs that will be made available for all markdown files and keys,\n * or a `metalsmith.metadata()` keypath containing such object\n * @property {Render} [render] - Specify a custom render function with the signature `(source, engineOptions, context) => string`.\n * `context` is an object with a `path` key containing the current file path, and `key` containing the target key.\n * @property {Object} [engineOptions] Options to pass to the markdown engine (default [marked](https://github.com/markedjs/marked))\n **/\n\nconst defaultOptions = {\n keys: {},\n wildcard: false,\n render: defaultRender,\n engineOptions: {},\n globalRefs: {}\n}\n\n/**\n * A Metalsmith plugin to render markdown files to HTML\n * @param {Options} [options]\n * @return {import('metalsmith').Plugin}\n */\nfunction markdown(options = defaultOptions) {\n if (options === true) {\n options = defaultOptions\n } else {\n options = Object.assign({}, defaultOptions, options)\n }\n\n if (Array.isArray(options.keys)) {\n options.keys = { files: options.keys }\n }\n\n return function markdown(files, metalsmith, done) {\n const debug = metalsmith.debug('@metalsmith/markdown')\n const matches = metalsmith.match('**/*.{md,markdown}', Object.keys(files))\n\n function renderKeys(keys, prepend, target, path) {\n if (options.wildcard) {\n keys = expandWildcardKeypaths(target, keys, '*')\n }\n\n keys.forEach((key) => {\n const value = get(target, key)\n if (typeof value === 'string') {\n const context = path === 'metalsmith.metadata()' ? { key } : { path, key }\n debug.info('Rendering key \"%s\" of target \"%s\"', key.join ? key.join('.') : key, path)\n set(target, key, options.render(prepend + value, options.engineOptions, context))\n } else if (typeof value !== 'undefined') {\n debug.warn('Couldn\\'t render key \"%s\" of target \"%s\": not a string', key.join ? key.join('.') : key, path)\n }\n })\n }\n\n const legacyEngineOptions = Object.keys(options).filter((opt) => !Object.keys(defaultOptions).includes(opt))\n if (legacyEngineOptions.length) {\n debug.warn('Starting from version 2.0 marked engine options will need to be specified as options.engineOptions')\n legacyEngineOptions.forEach((opt) => {\n options.engineOptions[opt] = options[opt]\n })\n debug.warn('Moved engine options %s to options.engineOptions', legacyEngineOptions.join(', '))\n }\n\n debug('Running with options: %O', options)\n if (matches.length === 0) {\n debug.warn('No markdown files found.')\n } else {\n debug('Processing %s markdown file(s)', matches.length)\n }\n\n let globalRefsMarkdown = ''\n if (typeof options.globalRefs === 'string') {\n const found = get(metalsmith.metadata(), options.globalRefs)\n if (found) {\n globalRefsMarkdown = refsObjectToMarkdown(found)\n } else {\n const err = new Error(`globalRefs not found in metalsmith.metadata().${options.globalRefs}`)\n err.name = 'Error @metalsmith/markdown'\n done(err)\n }\n } else if (typeof options.globalRefs === 'object' && options.globalRefs !== null) {\n globalRefsMarkdown = refsObjectToMarkdown(options.globalRefs)\n }\n\n if (globalRefsMarkdown.length) globalRefsMarkdown += '\\n\\n'\n\n matches.forEach(function (file) {\n const data = files[file]\n const dir = dirname(file)\n let html = basename(file, extname(file)) + '.html'\n if ('.' != dir) html = join(dir, html)\n\n debug.info('Rendering file \"%s\" as \"%s\"', file, html)\n const str = options.render(globalRefsMarkdown + data.contents.toString(), options.engineOptions, {\n path: file,\n key: 'contents'\n })\n data.contents = Buffer.from(str)\n\n const keys = options.keys && options.keys.files ? options.keys.files : []\n renderKeys(keys, globalRefsMarkdown, data, file)\n\n delete files[file]\n files[html] = data\n })\n\n if (options.keys && options.keys.global) {\n debug.info('Processing metalsmith.metadata()')\n const meta = metalsmith.metadata()\n renderKeys(options.keys.global, globalRefsMarkdown, meta, 'metalsmith.metadata()')\n }\n\n done()\n }\n}\n\nexport default markdown\n"],"names":["error","name","msg","err","Error","isArray","arg","Array","isString","isObject","expandWildcardKeypath","root","keypaths","char","filter","keypath","length","expanded","reduce","result","split","wildcard","indexOf","pre","slice","wildcardRoot","get","looped","Object","keys","forEach","entry","index","pp","from","splice","push","find","defaultRender","source","options","marked","refsObjectToMarkdown","refsObject","entries","map","refname","value","join","defaultOptions","render","engineOptions","globalRefs","markdown","assign","files","metalsmith","done","debug","matches","match","renderKeys","prepend","target","path","expandWildcardKeypaths","key","context","info","set","warn","legacyEngineOptions","opt","includes","globalRefsMarkdown","found","metadata","file","data","dir","dirname","html","basename","extname","str","contents","toString","Buffer","global","meta"],"mappings":"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"}