UNPKG

snip-text

Version:

Snip and extract parts from text content. Useful for generating code examples from unit tests.

84 lines (83 loc) 2.79 kB
"use strict"; var snipRegEx = /^\W*-{3,}\s*snip/; var snippetRegEx = /^\W*-{3,}\s*snippet:?\s*([^-]*)\s*/i; function defaultMatcher(line) { var snippetMatch = snippetRegEx.exec(line); if (snippetMatch) return typeof snippetMatch[1] === "string" ? snippetMatch[1].trim() : true; var snipMatch = snipRegEx.exec(line); if (snipMatch) return true; return false; } var spaceRegEx = /^\s+/; var tabRegEx = /^\t+/; var nonspaceRegEx = /\S/; function snip(contents, options) { options = options || {}; options.joiner = options.joiner || "\n"; options.matcher = options.matcher || defaultMatcher; options.tabSize = options.tabSize || 4; var tabStr = options.unindent ? "\t" : makeSpace(options.tabSize); var lines = contents.split(/\r?\n/); var snipping = false; var snippets = {}; var snippet; lines.forEach(function (line) { var match = options.matcher(line); if (match) { if (typeof match === "string") { snippet = snippets[match] || (snippets[match] = { lines: [] }); snipping = true; } else if (!snipping) { if (!snippet) snippet = snippets[" "] = { lines: [] }; snipping = true; } else snipping = false; } else if (snipping && snippet) { if (options.unindent && nonspaceRegEx.test(line)) { var tabs = tabRegEx.exec(line); if (tabs) line = makeSpace(tabs[0].length * options.tabSize) + line.substr(tabs[0].length); if (snippet.indent !== 0) { var indent = spaceRegEx.exec(line); if (indent) { if (snippet.indent === undefined || indent[0].length < snippet.indent) snippet.indent = indent[0].length; } else { snippet.indent = 0; } } } snippet.lines.push(line); } }); if (options.unindent) { Object.getOwnPropertyNames(snippets).forEach(function (key) { var snippet = snippets[key]; if (snippet.indent) { for (var i = 0; i < snippet.lines.length; i++) snippet.lines[i] = snippet.lines[i].substr(snippet.indent); } }); } var result = {}; Object.keys(snippets).forEach(function (key) { result[key] = snippets[key].lines.join(options.joiner); }); return result; } exports.snip = snip; function makeSpace(n) { var res = ""; while (n) { res += " "; n--; } return res; }