UNPKG

markdown-it-include

Version:

Markdown-it plugin which adds the ability to include markdown fragment files.

1 lines 7.99 kB
{"version":3,"file":"markdownItInclude.mjs","sources":["../index.js"],"sourcesContent":["\nconst path = require('path');\nconst fs = require('fs');\n\nconst INCLUDE_RE = /!{3}\\s*include(.+?)!{3}/i;\nconst BRACES_RE = /\\((.+?)\\)/i;\n\nconst include_plugin = (md, options) => {\n const defaultOptions = {\n root: '.',\n getRootDir: (pluginOptions/*, state, startLine, endLine*/) => pluginOptions.root,\n includeRe: INCLUDE_RE,\n throwError: true,\n bracesAreOptional: false,\n notFoundMessage: 'File \\'{{FILE}}\\' not found.',\n circularMessage: 'Circular reference between \\'{{FILE}}\\' and \\'{{PARENT}}\\'.'\n };\n\n if (typeof options === 'string') {\n options = {\n ...defaultOptions,\n root: options\n };\n } else {\n options = {\n ...defaultOptions,\n ...options\n };\n }\n\n const _replaceIncludeByContent = (src, rootdir, parentFilePath, filesProcessed) => {\n filesProcessed = filesProcessed ? filesProcessed.slice() : []; // making a copy\n let cap, filePath, mdSrc, errorMessage;\n\n // store parent file path to check circular references\n if (parentFilePath) {\n filesProcessed.push(parentFilePath);\n }\n while ((cap = options.includeRe.exec(src))) {\n let includePath = cap[1].trim();\n const sansBracesMatch = BRACES_RE.exec(includePath);\n\n if (!sansBracesMatch && !options.bracesAreOptional) {\n errorMessage = `INCLUDE statement '${src.trim()}' MUST have '()' braces around the include path ('${includePath}')`;\n } else if (sansBracesMatch) {\n includePath = sansBracesMatch[1].trim();\n } else if (!/^\\s/.test(cap[1])) {\n // path SHOULD have been preceeded by at least ONE whitespace character!\n /* eslint max-len: \"off\" */\n errorMessage = `INCLUDE statement '${src.trim()}': when not using braces around the path ('${includePath}'), it MUST be preceeded by at least one whitespace character to separate the include keyword and the include path.`;\n }\n\n if (!errorMessage) {\n filePath = path.resolve(rootdir, includePath);\n\n // check if child file exists or if there is a circular reference\n if (!fs.existsSync(filePath)) {\n // child file does not exist\n errorMessage = options.notFoundMessage.replace('{{FILE}}', filePath);\n } else if (filesProcessed.indexOf(filePath) !== -1) {\n // reference would be circular\n errorMessage = options.circularMessage.replace('{{FILE}}', filePath).replace('{{PARENT}}', parentFilePath);\n }\n }\n\n // check if there were any errors\n if (errorMessage) {\n if (options.throwError) {\n throw new Error(errorMessage);\n }\n mdSrc = `\\n\\n# INCLUDE ERROR: ${errorMessage}\\n\\n`;\n } else {\n // get content of child file\n mdSrc = fs.readFileSync(filePath, 'utf8');\n // check if child file also has includes\n mdSrc = _replaceIncludeByContent(mdSrc, path.dirname(filePath), filePath, filesProcessed);\n // remove one trailing newline, if it exists: that way, the included content does NOT\n // automatically terminate the paragraph it is in due to the writer of the included\n // part having terminated the content with a newline.\n // However, when that snippet writer terminated with TWO (or more) newlines, these, minus one,\n // will be merged with the newline after the #include statement, resulting in a 2-NL paragraph\n // termination.\n const len = mdSrc.length;\n if (mdSrc[len - 1] === '\\n') {\n mdSrc = mdSrc.substring(0, len - 1);\n }\n }\n\n // replace include by file content\n src = src.slice(0, cap.index) + mdSrc + src.slice(cap.index + cap[0].length, src.length);\n }\n return src;\n };\n\n const _includeFileParts = (state, startLine, endLine/*, silent*/) => {\n state.src = _replaceIncludeByContent(state.src, options.getRootDir(options, state, startLine, endLine));\n };\n\n md.core.ruler.before('normalize', 'include', _includeFileParts);\n};\n\nmodule.exports = include_plugin;\n"],"names":["path","require","fs","INCLUDE_RE","BRACES_RE","include_plugin","md","options","defaultOptions","root","getRootDir","pluginOptions","includeRe","throwError","bracesAreOptional","notFoundMessage","circularMessage","_replaceIncludeByContent","src","rootdir","parentFilePath","filesProcessed","slice","cap","filePath","mdSrc","errorMessage","push","exec","includePath","trim","sansBracesMatch","test","resolve","existsSync","replace","indexOf","Error","readFileSync","dirname","len","length","substring","index","_includeFileParts","state","startLine","endLine","core","ruler","before","module","exports"],"mappings":"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"}