UNPKG

readme-ssi

Version:

Update your markdown readme's ToC and snippets without seperate template or docs files, according to directives that remind of Server Side Includes. [npm search keywords: code examples, documentation, table of contents]

72 lines (58 loc) 2.03 kB
/*jslint indent: 2, maxlen: 80, continue: false, unparam: false, node: true */ /* -*- tab-width: 2 -*- */ 'use strict'; var EX = module.exports, coreCmds = require('./core_cmds.js'), wordWrap = require('./ersatz_wordwrap.js'), objdive = require('objdive'), xmldefuse = require('xmlunidefuse'), kisi = require('./kitchen_sink.js'); EX.cmd = {}; EX.cmd.echo = function (text, tag, buf) { if (text) { tag.err('unexpected input text'); } tag.try(coreCmds.replaceUntilMark, [buf]); var renderer = this, srcFn, opts = { before: tag.popAttr('before', ''), after: tag.popAttr('after', ''), raw: +tag.popAttr('raw'), wrap: (+tag.popAttr('wrap') || 78), underline: tag.popAttr('underline', ''), cutHead: tag.popAttr('cut-head'), cutTail: tag.popAttr('cut-tail'), }; srcFn = tag.popAttr('json'); if (srcFn) { opts.diveDataObj = tag.popAttr('key', ''); switch (srcFn + '$' + opts.diveDataObj) { case 'package.json$description': kisi.defaultProp(opts, 'cutTail', ' [npm search keywords: '); break; } return function ssiEchoJsonFetcher(deliver) { renderer.readFileRel(srcFn, 'json', EX.echoGeneric.bind(renderer, opts, deliver)); }; } return tag.err('No source file specified'); }; EX.echoGeneric = function (opts, deliver, readErr, data) { if (readErr) { return deliver(readErr); } data = objdive(data, opts.diveDataObj); switch (data && typeof data) { case 'string': break; default: data = JSON.stringify(data, null, 2); } data = kisi.multiMarkSplit(data, opts.cutHead, -1); data = kisi.multiMarkSplit(data, opts.cutTail, 0); if (!opts.raw) { data = xmldefuse(data); } data = (opts.before || '') + data + (opts.after || ''); if (opts.wrap) { data = wordWrap(data, opts.wrap); } if (data && opts.underline) { data += '\n' + data.replace(/\S|\s/g, opts.underline ).substr(0, data.length); } if (data) { data += '\n'; } return deliver(null, data); }; /*scroll*/