diff --git a/.gitignore b/.gitignore index debb9ce..676d3f0 100644 --- a/.gitignore +++ b/.gitignore @@ -31,3 +31,7 @@ node_modules *~ *.swp +# JetBrains, MacOS +.idea +*.iml +.DS_Store \ No newline at end of file diff --git a/README.md b/README.md index 00bf90d..4a91487 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,36 @@ Also, the underlying Markdown and GithubMarkdown classes are readable stream cla and may be used however you like (e.g., pipe to an http response or to stdout). Includes a demo of a web server app that uses both the classes. +--- +## Updated in fork +- Process markdown from string: + - Was: + ```javascript + let filename = 'test.md' + markdown.renderFromString(filename, opts, function (err) { + if (err) { + console.error('>>>' + err); + process.exit(); + } + + // handle stream + }); + ``` + - And now: + ```javascript + markdown.renderFromString("# Test pls", opts, function (err) { + if (err) { + console.error('>>>' + err); + process.exit(); + } + + // same stream handling + }); + ``` +- Some code refactoring (removed unnecessary dependencies, removed test files, `var` -> `let` etc) + +--- + ## Installation #### To use the command line utilities diff --git a/index.js b/index.js index c648369..2d2d350 100644 --- a/index.js +++ b/index.js @@ -1,4 +1,3 @@ exports.Markdown = require('./lib/markdown.js'); -exports.GithubMarkdown = require('./lib/github-markdown.js'); - +exports.GithubMarkdown = require('./lib/github-markdown.js'); \ No newline at end of file diff --git a/lib/markdown.js b/lib/markdown.js index 19bf044..d992f37 100644 --- a/lib/markdown.js +++ b/lib/markdown.js @@ -1,93 +1,100 @@ 'use strict'; -// Converts a markdown file into an HTML file, writing it to stdout. -// Implemented as a readable stream. -// -// Usage: -// node format_markdown -// -var marked = require('marked'); -var pygmentize = require('pygmentize-bundled'); -var linkify = require('../lib/gfm-linkify'); -var fs = require('fs'); -var path = require('path'); -var util = require('util'); - -var Readable = require('stream').Readable; + +const marked = require('marked'); +const pygmentize = require('pygmentize-bundled'); +const linkify = require('../lib/gfm-linkify'); +const fs = require('fs'); +const path = require('path'); +const util = require('util'); + +const Readable = require('stream').Readable; util.inherits(Markdown, Readable); function Markdown() { - this.super_ = this.constructor.super_; - this.super_.call(this); - this.debug = false; - this.bufmax = 1024; - this.html = ''; - this.setEncoding('utf8'); + this.super_ = this.constructor.super_; + this.super_.call(this); + this.debug = false; + this.bufmax = 1024; + this.html = ''; + this.setEncoding('utf8'); } -Markdown.prototype.render = function(fileName, opts, onDone) { - var flavour = opts.flavor || 'gfm', - highlight = opts.highlight, - stylesheet = opts.stylesheet, - context = opts.context, - title = opts.title, - titleText = title, - htmlTemplate = opts.template; - - if (title) { - var dirName = path.dirname(fileName), - baseName = path.basename(fileName), - pathName = path.resolve(fileName); - titleText = titleText.replace('$FILENAME', fileName); - titleText = titleText.replace('$DIRNAME', dirName); - titleText = titleText.replace('$BASENAME', baseName); - titleText = titleText.replace('$PATHNAME', pathName); - } - - this.done = false; - - this.once('error', function(err) { - if (onDone) onDone(err) - else console.error('>>>' + err); - }); - - if (fileName === null) { - if (onDone) onDone('Missing file name arg'); - else console.error('>>>Missing file name arg'); - } - - //====================================================== - // Read the file content. - //====================================================== - fs.readFile(fileName, onFileReady.bind(this)); - - //====================================================== - // Process the file content. - //====================================================== - function onFileReady(err, data) { - if (err) { - if (onDone) onDone(err); - else console.error('>>>' + err); - return; +const CONTENT_FILE = "content_file", CONTENT_TEXT = "content_text"; + +const TEMPLATE_FILE = "template_file", TEMPLATE_TEXT = "template_text"; + +Markdown.prototype.render = function (content, opts, onDone) { + let flavour = opts.flavor || 'gfm', + highlight = opts.highlight, + stylesheet = opts.stylesheet, + context = opts.context, + title = opts.title, + titleText = title, + markdownType = opts.content_type, + templateType = opts.template_type, + htmlTemplate = opts.template; + + if (title && markdownType === CONTENT_FILE) { + let dirName = path.dirname(content), + baseName = path.basename(content), + pathName = path.resolve(content); + titleText = titleText.replace('$FILENAME', content); + titleText = titleText.replace('$DIRNAME', dirName); + titleText = titleText.replace('$BASENAME', baseName); + titleText = titleText.replace('$PATHNAME', pathName); + } + + this.done = false; + + this.once('error', function (err) { + if (onDone) onDone(err); + else console.error('>>> ' + err); + }); + + if (!content) { + if (onDone) onDone('Missing markdown content'); + else console.error('>>> Missing markdown content'); } - var fileContent = data.toString(); + //====================================================== + // Read the file content. + //====================================================== + let markdownContent; + + switch (markdownType) { + case CONTENT_FILE: { + markdownContent = fs.readFileSync(content).toString(); + break; + } + case CONTENT_TEXT: { + markdownContent = content; + break; + } + default: throw new Error('Unknown type of markdown content: ' + markdownType); + } - var options = { - gfm: (flavour === 'gfm') ? true : false, - breaks: true, - tables: true, - sanitize: true + //====================================================== + // Process the file content. + //====================================================== + let options = { + gfm: (flavour === 'gfm'), + breaks: true, + tables: true, + sanitize: true }; if (highlight) { - options['highlight'] = function(code, lang, callback) { - pygmentize({lang: lang, format: 'html'}, code, function(err, result) { - if (err) { - callback(err); - } - callback(err, result.toString()); - }); - } + options['highlight'] = function (code, lang, callback) { + pygmentize({ + lang: lang, + format: 'html' + }, code, function (err, result) { + if (err) { + callback(err); + } + callback(err, result.toString()); + }); + } } //====================================================== @@ -95,11 +102,11 @@ Markdown.prototype.render = function(fileName, opts, onDone) { //====================================================== if (this.debug) console.error('>>>starting to get code'); try { - marked.setOptions(options); - marked(fileContent, getCode.bind(this)); - } catch(err) { - if (onDone) onDone(err) - else console.error('>>>' + err); + marked.setOptions(options); + marked(markdownContent, getCode.bind(this)); + } catch (err) { + if (onDone) onDone(err); + else console.error('>>> ' + err); } //====================================================== @@ -107,76 +114,98 @@ Markdown.prototype.render = function(fileName, opts, onDone) { // or trailer. Linkify if context specified. //====================================================== function getCode(err, code) { - if (err) { - if (onDone) onDone(err) - else console.error('>>>' + err); - return; - } - - if (htmlTemplate) { - this.cat(fs.readFileSync(htmlTemplate)); - - let mdCode = '' - if (context) { - mdCode = linkify(code, context); - } else { - mdCode = code; - } - this.replace(mdCode); - } else { - if (stylesheet || title) { - if (titleText == null) titleText = fileName; - this.cat('\n' + - '\n' + - '\n' + - ' ' + - ' ' + titleText + '\n'); - if (stylesheet) { - this.cat(' \n'); - } - this.cat('\n\n' ); + if (err) { + if (onDone) onDone(err); + else console.error('>>> ' + err); + return; } - if (context) { - this.cat( linkify(code, context) ); + if (templateType && htmlTemplate) { + let templateContent; + + switch (templateType) { + case TEMPLATE_FILE: { + templateContent = fs.readFileSync(htmlTemplate); + break; + } + case TEMPLATE_TEXT: { + templateContent = htmlTemplate; + break; + } + default: { + throw new Error('Unknown html template type: ' + templateType); + } + } + + this.cat(templateContent); + + let mdCode = ''; + if (context) { + mdCode = linkify(code, context); + } else { + mdCode = code; + } + this.replace(mdCode); + if (title) { + this.html = this.html.replace('{title}', titleText); + } } else { - this.cat( code ); + if (stylesheet || title) { + if (titleText == null) titleText = fileName; + this.cat("\n\n\n " + titleText + '\n'); + if (stylesheet) { + this.cat(' \n'); + } + this.cat('\n\n'); + } + + if (context) { + this.cat(linkify(code, context)); + } else { + this.cat(code); + } + + if (stylesheet || title) { + this.cat('\n\n'); + } } - if (stylesheet || title) { - this.cat( '\n\n' ); - } - } - - if (this.debug) console.error('>>>finished getting code'); - this.done = true; - if (onDone) onDone(); - } // end getCode - } // end onFileReady -} // end render - -Markdown.prototype.cat = function(data) { - this.html += data; -} - -Markdown.prototype.replace = function(data) { - this.html = this.html.replace('{markdown}', data); -} - -Markdown.prototype._read = function(size) { - var pushSize = Math.min(size, this.bufmax); - if (this.html.length > 0) { - if (this.debug) console.error('>>>_read size=' + pushSize + ', html="' + this.html.substr(0, pushSize) + '"'); - this.push(this.html.substr(0, pushSize)); - this.html = this.html.slice(pushSize); - if (this.done && this.html.length === 0) { - this.push(null); // eof + if (this.debug) console.error('>>>finished getting code'); + this.done = true; + if (onDone) streamToString(this, data => onDone(null, data)); } - } else { - if (this.debug) console.error('>>>_read - nothing to push'); - } - return; +}; + +Markdown.prototype.cat = function (data) { + this.html += data; +}; + +Markdown.prototype.replace = function (data) { + this.html = this.html.replace('{markdown}', data); +}; + +Markdown.prototype._read = function (size) { + const pushSize = Math.min(size, this.bufmax); + if (this.html.length > 0) { + if (this.debug) console.error('>>>_read size=' + pushSize + ', html="' + this.html.substr(0, pushSize) + '"'); + this.push(this.html.substr(0, pushSize)); + this.html = this.html.slice(pushSize); + if (this.done && this.html.length === 0) { + this.push(null); // eof + } + } else { + if (this.debug) console.error('>>>_read - nothing to push'); + } +}; + +function streamToString(stream, callback) { + const chunks = []; + stream.on('data', (chunk) => { + chunks.push(chunk.toString()); + }); + stream.on('end', () => { + callback(chunks.join('')); + }); } -module.exports = Markdown; - +module.exports = Markdown; \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..ee9c851 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1060 @@ +{ + "name": "markdown-to-html", + "version": "0.0.13", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "accepts": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", + "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", + "dev": true, + "requires": { + "mime-types": "~2.1.18", + "negotiator": "0.6.1" + } + }, + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "requires": { + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" + } + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "dev": true + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + }, + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + }, + "aws4": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz", + "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==" + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "basic-auth": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.0.tgz", + "integrity": "sha1-AV2z81PgLlY3d1X5YnQuiYHnu7o=", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", + "dev": true + } + } + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "optional": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "bl": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/bl/-/bl-0.4.2.tgz", + "integrity": "sha1-XbMdcvA4xU5orcOVeBJf47Ct3JY=", + "requires": { + "readable-stream": "~1.0.2" + } + }, + "body-parser": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", + "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", + "dev": true, + "requires": { + "bytes": "3.0.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.1", + "http-errors": "~1.6.2", + "iconv-lite": "0.4.19", + "on-finished": "~2.3.0", + "qs": "6.5.1", + "raw-body": "2.3.2", + "type-is": "~1.6.15" + }, + "dependencies": { + "qs": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", + "dev": true + } + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" + }, + "combined-stream": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", + "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=", + "dev": true + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true + }, + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "css-parse": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-1.7.0.tgz", + "integrity": "sha1-Mh9s9zeCpv91ERE5D8BeLGV9jJs=", + "dev": true + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "ecc-jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "optional": true, + "requires": { + "jsbn": "~0.1.0" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, + "errorhandler": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/errorhandler/-/errorhandler-1.5.0.tgz", + "integrity": "sha1-6rpkyl1UKjEayUX1gt78M2Fl2fQ=", + "dev": true, + "requires": { + "accepts": "~1.3.3", + "escape-html": "~1.0.3" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true + }, + "express": { + "version": "4.16.3", + "resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz", + "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=", + "dev": true, + "requires": { + "accepts": "~1.3.5", + "array-flatten": "1.1.1", + "body-parser": "1.18.2", + "content-disposition": "0.5.2", + "content-type": "~1.0.4", + "cookie": "0.3.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.1.1", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.3", + "qs": "6.5.1", + "range-parser": "~1.2.0", + "safe-buffer": "5.1.1", + "send": "0.16.2", + "serve-static": "1.13.2", + "setprototypeof": "1.1.0", + "statuses": "~1.4.0", + "type-is": "~1.6.16", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "qs": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", + "dev": true + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", + "dev": true + } + } + }, + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, + "fast-deep-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=" + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + }, + "finalhandler": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", + "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.4.0", + "unpipe": "~1.0.0" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "form-data": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", + "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "1.0.6", + "mime-types": "^2.1.12" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "dev": true + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "gfm-linkify": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/gfm-linkify/-/gfm-linkify-0.1.0.tgz", + "integrity": "sha1-aGfMPnT8YY87FOdDGPjVkKAIVzs=" + }, + "glob": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz", + "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.2", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + }, + "har-validator": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", + "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", + "requires": { + "ajv": "^5.1.0", + "har-schema": "^2.0.0" + } + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "iconv-lite": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ipaddr.js": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.6.0.tgz", + "integrity": "sha1-4/o1e3c9phnybpXwSdBVxyeW+Gs=", + "dev": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "optional": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "marked": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.19.tgz", + "integrity": "sha512-ea2eGWOqNxPcXv8dyERdSr/6FmzvWwzjMxpfGB/sbMccXoct+xY+YukPD+QTUZwyvK7BZwcr4m21WBOW41pAkg==" + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "method-override": { + "version": "2.3.10", + "resolved": "https://registry.npmjs.org/method-override/-/method-override-2.3.10.tgz", + "integrity": "sha1-49r41d7hDdLc59SuiNYrvud0drQ=", + "dev": true, + "requires": { + "debug": "2.6.9", + "methods": "~1.1.2", + "parseurl": "~1.3.2", + "vary": "~1.1.2" + } + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true + }, + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", + "dev": true + }, + "mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==" + }, + "mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "requires": { + "mime-db": "~1.33.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "morgan": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.0.tgz", + "integrity": "sha1-0B+mxlhZt2/PMbPLU6OCGjEdgFE=", + "dev": true, + "requires": { + "basic-auth": "~2.0.0", + "debug": "2.6.9", + "depd": "~1.1.1", + "on-finished": "~2.3.0", + "on-headers": "~1.0.1" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "negotiator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", + "dev": true + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" + }, + "object-keys": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", + "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", + "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "open": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/open/-/open-0.0.5.tgz", + "integrity": "sha1-QsPhjslUZra/DcQvOilFw/DK2Pw=" + }, + "parseurl": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "proxy-addr": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz", + "integrity": "sha512-jQTChiCJteusULxjBp8+jftSQE5Obdl3k4cnmLA6WXtK6XFuWRnvVL7aCiBqaLPM8c4ph0S4tKna8XvmIwEnXQ==", + "dev": true, + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.6.0" + } + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + }, + "pygmentize-bundled": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pygmentize-bundled/-/pygmentize-bundled-2.3.0.tgz", + "integrity": "sha1-1CXe2o0TaXW5M+3jYxNfYjNQgUo=", + "requires": { + "bl": "~0.4.1", + "through2": "~0.2.1" + } + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + }, + "range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", + "dev": true + }, + "raw-body": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", + "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", + "dev": true, + "requires": { + "bytes": "3.0.0", + "http-errors": "1.6.2", + "iconv-lite": "0.4.19", + "unpipe": "1.0.0" + }, + "dependencies": { + "depd": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", + "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=", + "dev": true + }, + "http-errors": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", + "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", + "dev": true, + "requires": { + "depd": "1.1.1", + "inherits": "2.0.3", + "setprototypeof": "1.0.3", + "statuses": ">= 1.3.1 < 2" + } + }, + "setprototypeof": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", + "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=", + "dev": true + } + } + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "request": { + "version": "2.87.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.87.0.tgz", + "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==", + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.6.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.1", + "forever-agent": "~0.6.1", + "form-data": "~2.3.1", + "har-validator": "~5.0.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.17", + "oauth-sign": "~0.8.2", + "performance-now": "^2.1.0", + "qs": "~6.5.1", + "safe-buffer": "^5.1.1", + "tough-cookie": "~2.3.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.1.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "sax": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/sax/-/sax-0.5.8.tgz", + "integrity": "sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE=", + "dev": true + }, + "send": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.4.0" + } + }, + "serve-favicon": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.5.0.tgz", + "integrity": "sha1-k10kDN/g9YBTB/3+ln2IlCosvPA=", + "dev": true, + "requires": { + "etag": "~1.8.1", + "fresh": "0.5.2", + "ms": "2.1.1", + "parseurl": "~1.3.2", + "safe-buffer": "5.1.1" + }, + "dependencies": { + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", + "dev": true + } + } + }, + "serve-static": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", + "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.2", + "send": "0.16.2" + } + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + }, + "sshpk": { + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz", + "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=", + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", + "dev": true + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "stylus": { + "version": "0.54.5", + "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.5.tgz", + "integrity": "sha1-QrlWCTHKcJDOhRWnmLqeaqPW3Hk=", + "dev": true, + "requires": { + "css-parse": "1.7.x", + "debug": "*", + "glob": "7.0.x", + "mkdirp": "0.5.x", + "sax": "0.5.x", + "source-map": "0.1.x" + } + }, + "through2": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.2.3.tgz", + "integrity": "sha1-6zKE2k6jEbbMis42U3SKUqvyWj8=", + "requires": { + "readable-stream": "~1.1.9", + "xtend": "~2.1.1" + }, + "dependencies": { + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + } + } + }, + "tmp": { + "version": "0.0.24", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.24.tgz", + "integrity": "sha1-1qXhmNFKmDXMby18PZ4wJCjIzxI=" + }, + "tough-cookie": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", + "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", + "requires": { + "punycode": "^1.4.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "optional": true + }, + "type-is": { + "version": "1.6.16", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", + "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.18" + } + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true + }, + "uuid": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", + "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "xtend": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", + "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", + "requires": { + "object-keys": "~0.4.0" + } + }, + "yargs": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-1.3.3.tgz", + "integrity": "sha1-BU3oth8i7v23IHBZ6u+da4P7kxo=" + } + } +} diff --git a/package.json b/package.json index 6e2241c..7095be1 100644 --- a/package.json +++ b/package.json @@ -11,9 +11,7 @@ }, "preferGlobal": true, "scripts": { - "test": "bash script/test", - "clean": "bash script/clean", - "start": "bash script/web-demo" + "clean": "bash script/clean" }, "repository": { "type": "git", @@ -47,12 +45,11 @@ "test": "test" }, "devDependencies": { - "errorhandler": "1.1.x", - "express": "4.6.x", - "jade": "1.4.x", - "method-override": "2.1.x", - "morgan": "1.5.x", - "serve-favicon": "2.0.x", - "stylus": "0.47.x" + "errorhandler": "^1.5.0", + "express": "^4.16.3", + "method-override": "^2.3.10", + "morgan": "^1.9.0", + "serve-favicon": "^2.5.0", + "stylus": "^0.54.5" } } diff --git a/script/test b/script/test deleted file mode 100755 index 1af7367..0000000 --- a/script/test +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/bash -echo ======Testing markdown======== -node bin/markdown test/test.md -h -s style.css -c cwjohan/node-redis-queue -t 'file $BASENAME in $DIRNAME' >test/markdown.html -result=`diff -q -w test/markdown-ref.html test/markdown.html` -if [ -z "$result" ]; then - echo Passed -else - echo Failed - echo $result - diff -w test/markdown-ref.html test/markdown.html -fi - -echo -echo =======Testing github-markdown========= -node bin/github-markdown test/test.md -s style.css -c cwjohan/node-redis-queue -t 'file $BASENAME in $DIRNAME' >test/github-markdown.html -result=`diff -q -w test/github-markdown-ref.html test/github-markdown.html` -if [ -z "$result" ]; then - echo Passed -else - echo Failed - echo $result - diff -w test/github-markdown-ref.html test/github-markdown.html -fi - diff --git a/script/web-demo b/script/web-demo deleted file mode 100755 index 80d70f0..0000000 --- a/script/web-demo +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash -cd web-demo -export NODE_PATH=../.. -node web - diff --git a/test/github-markdown-ref.html b/test/github-markdown-ref.html deleted file mode 100644 index 8aa942b..0000000 --- a/test/github-markdown-ref.html +++ /dev/null @@ -1,158 +0,0 @@ - - - - file test.md in test - - - -

-Something Really Cool

- -

Hello world github/linguist#1 cool, and #1!
-And that is not all.

- -

-Lists

- -

-Numbered List

- -
    -
  1. Item One
  2. -
  3. Item Two
  4. -
  5. Item Three
  6. -
- -

-Bullet List

- -
    -
  • Item One
  • -
  • Item Two
  • -
  • Item Three
  • -
- -

-Code Example

- -

-Code enclosed in 'backquotes':

- -

Always use var to define a variable. For example, var baz = 'initial value'; would define -variable baz.

- -

-This is some nonsense javascript code:

- -
    var fs = require('fs');
-    var count = 0, text;
-    exports.bar = {
-      boo: true,
-      baz: 'Fred'
-    };
-
-    function foo(inc) {
-      try {
-        console.log("foo has been called");
-        count = count + inc;
-        if (count >= 10) {
-          count = 0;
-        } else {
-          text = fs.readFileSync('foo.txt');
-        }
-      catch(err) {
-        throw new Error('Help! ' + err);
-      }
-    }
-
- -

-Fenced Javascript Code

- -
var fs = require('fs');
-var count = 0, text;
-exports.bar = {
-  boo: true,
-  baz: 'Fred'
-};
-
-function foo(inc) {
-  try {
-    console.log("foo has been called");
-    count = count + inc;
-    if (count >= 10) {
-      count = 0;
-    } else {
-      text = fs.readFileSync('foo.txt');
-    }
-  catch(err) {
-    throw new Error('Help! ' + err);
-  }
-}
- -

-Fenced Ruby Code

- -
require "bunny"
-
-conn = Bunny.new(:hostname => "127.0.0.1", :port => 5672)
-conn.start
-
-ch = conn.create_channel
-q = ch.queue("hello")
-
-q.subscribe(:ack => true, :block => true,) do |delivery_info, properties, body|
-    puts " [x] Received '#{body}'"
-    # imitate some work
-    sleep body.count(".").to_i
-    puts " [x] Done"
-    ch.ack(delivery_info.delivery_tag)
-    if body == "stop"
-        delivery_info.consumer.cancel
-    end
-end
- -

-Fenced Coffeescript Code

- -
fs = require 'fs'
-count = 0
-text = null
-exports.bar =
-  boo: true
-  baz: 'Fred'
-
-foo = (inc) ->
-  try
-    console.log "foo has been called"
-    count = count + inc
-    if count >= 10
-      count = 0
-    else
-      text = fs.readFileSync 'foo.txt'
-  catch err
-    throw new Error 'Help! ' + err
- -

-Fenced Python Code

- -
def fib(n):
-    if n > 1:
-        return n * fib(n -1)
-    else:
-        return 1
-
-if __name__ == '__main__':
-    import sys
-    n = int(sys.argv[1]) if len(sys.argv) > 1 else 5
-    f = fib(n)
-    print 'fib(', n, ') is ', f
- -

-In Conclusion

- -

You can do it too! -Try to enclose code in backquotes.

- - - diff --git a/test/github-style.css b/test/github-style.css deleted file mode 100644 index 9083b53..0000000 --- a/test/github-style.css +++ /dev/null @@ -1,57 +0,0 @@ -body { - background-color: White; - margin-left: 15px; -} -h1 { - color: maroon; -} -code, div.highlight { - background-color: MintCream; - padding-left: -5px; - margin-left: 5px; -} - -div.highlight { - padding-top: 10px; - padding-bottom: 10px; - width: 80%; -} -.p { - color: Black; -} -.n, .pl-vpf { - color: Black; - font-weight: medium; -} -.nf, .pl-enf { - color: DarkGreen; -} -.nx { - color: #005B5B; - font-weight: medium; -} -.o, .pl-ko { - color: black; -} -.mi, .pl-cn { - color: Brown; - font-weight: bold; -} -.k, .pl-s, .pl-k { - color: DarkSlateBlue; - font-weight: bold; -} -.kd { - color: DarkSlate; - font-weight: bold; -} -.s1 { - color: Chocolate; - font-weight: 500; -} -.s2 { - color: Red; -} -.c, .pl-c { - color: Orange; -} diff --git a/test/markdown-ref.html b/test/markdown-ref.html deleted file mode 100644 index 1910e4c..0000000 --- a/test/markdown-ref.html +++ /dev/null @@ -1,134 +0,0 @@ - - - - file test.md in test - - - -

Something Really Cool

-

Hello world github/linguist#1 cool, and #1!
And that is not all.

-

Lists

-

Numbered List

-
    -
  1. Item One
  2. -
  3. Item Two
  4. -
  5. Item Three
  6. -
-

Bullet List

-
    -
  • Item One
  • -
  • Item Two
  • -
  • Item Three
  • -
-

Code Example

-

Code enclosed in 'backquotes':

-

Always use var to define a variable. For example, var baz = 'initial value'; would define
variable baz.

-

This is some nonsense javascript code:

-
    var fs = require('fs');
-    var count = 0, text;
-    exports.bar = {
-      boo: true,
-      baz: 'Fred'
-    };
-
-    function foo(inc) {
-      try {
-        console.log("foo has been called");
-        count = count + inc;
-        if (count >= 10) {
-          count = 0;
-        } else {
-          text = fs.readFileSync('foo.txt');
-        }
-      catch(err) {
-        throw new Error('Help! ' + err);
-      }
-    }
-
- -

Fenced Javascript Code

-
var fs = require('fs');
-var count = 0, text;
-exports.bar = {
-  boo: true,
-  baz: 'Fred'
-};
-
-function foo(inc) {
-  try {
-    console.log("foo has been called");
-    count = count + inc;
-    if (count >= 10) {
-      count = 0;
-    } else {
-      text = fs.readFileSync('foo.txt');
-    }
-  catch(err) {
-    throw new Error('Help! ' + err);
-  }
-}
-
- -
-

Fenced Ruby Code

-
require "bunny"
-
-conn = Bunny.new(:hostname => "127.0.0.1", :port => 5672)
-conn.start
-
-ch = conn.create_channel
-q = ch.queue("hello")
-
-q.subscribe(:ack => true, :block => true,) do |delivery_info, properties, body|
-    puts " [x] Received '#{body}'"
-    # imitate some work
-    sleep body.count(".").to_i
-    puts " [x] Done"
-    ch.ack(delivery_info.delivery_tag)
-    if body == "stop"
-        delivery_info.consumer.cancel
-    end
-end
-
- -
-

Fenced Coffeescript Code

-
fs = require 'fs'
-count = 0
-text = null
-exports.bar =
-  boo: true
-  baz: 'Fred'
-
-foo = (inc) ->
-  try
-    console.log "foo has been called"
-    count = count + inc
-    if count >= 10
-      count = 0
-    else
-      text = fs.readFileSync 'foo.txt'
-  catch err
-    throw new Error 'Help! ' + err
-
- -
-

Fenced Python Code

-
def fib(n):
-    if n > 1:
-        return n * fib(n -1)
-    else:
-        return 1
-
-if __name__ == '__main__':
-    import sys
-    n = int(sys.argv[1]) if len(sys.argv) > 1 else 5
-    f = fib(n)
-    print 'fib(', n, ') is ', f
-
- -
-

In Conclusion

-

You can do it too!
Try to enclose code in backquotes.

- - diff --git a/test/style.css b/test/style.css deleted file mode 100644 index 417b2c4..0000000 --- a/test/style.css +++ /dev/null @@ -1,47 +0,0 @@ -body { - background-color: White; - margin-left: 15px; -} -h1 { - color: maroon; -} -code, div.highlight { - background-color: MintCream; - padding-left: -5px; - margin-left: 5px; -} - -div.highlight { - padding-top: 10px; - padding-bottom: 10px; - width: 80%; -} -.p { - color: black; -} -.nx { - color: #005B5B; - font-weight: medium; -} -.o { - color: black; -} -.mi { - color: Brown; - font-weight: bold; -} -.k { - color: DarkSlateBlue; - font-weight: bold; -} -.kd { - color: DarkSlate; - font-weight: bold; -} -.s1 { - color: Chocolate; - font-weight: 500; -} -.s2 { - color: Red; -} diff --git a/test/test.md b/test/test.md deleted file mode 100644 index 71df857..0000000 --- a/test/test.md +++ /dev/null @@ -1,141 +0,0 @@ -Something Really Cool -========= - -Hello world github/linguist#1 **cool**, and #1! -And that is not all. - -#Lists - -##Numbered List - -1. Item One -1. Item Two -1. Item Three - -##Bullet List - -* Item One -* Item Two -* Item Three - -#Code Example - -##Code enclosed in 'backquotes': - -Always use `var` to define a variable. For example, `var baz = 'initial value';` would define -variable `baz`. - -##This is some nonsense javascript code: - - var fs = require('fs'); - var count = 0, text; - exports.bar = { - boo: true, - baz: 'Fred' - }; - - function foo(inc) { - try { - console.log("foo has been called"); - count = count + inc; - if (count >= 10) { - count = 0; - } else { - text = fs.readFileSync('foo.txt'); - } - catch(err) { - throw new Error('Help! ' + err); - } - } - -#Fenced Javascript Code - -```js -var fs = require('fs'); -var count = 0, text; -exports.bar = { - boo: true, - baz: 'Fred' -}; - -function foo(inc) { - try { - console.log("foo has been called"); - count = count + inc; - if (count >= 10) { - count = 0; - } else { - text = fs.readFileSync('foo.txt'); - } - catch(err) { - throw new Error('Help! ' + err); - } -} -``` - -##Fenced Ruby Code - -```ruby -require "bunny" - -conn = Bunny.new(:hostname => "127.0.0.1", :port => 5672) -conn.start - -ch = conn.create_channel -q = ch.queue("hello") - -q.subscribe(:ack => true, :block => true,) do |delivery_info, properties, body| - puts " [x] Received '#{body}'" - # imitate some work - sleep body.count(".").to_i - puts " [x] Done" - ch.ack(delivery_info.delivery_tag) - if body == "stop" - delivery_info.consumer.cancel - end -end -``` - -##Fenced Coffeescript Code - -```coffee -fs = require 'fs' -count = 0 -text = null -exports.bar = - boo: true - baz: 'Fred' - -foo = (inc) -> - try - console.log "foo has been called" - count = count + inc - if count >= 10 - count = 0 - else - text = fs.readFileSync 'foo.txt' - catch err - throw new Error 'Help! ' + err -``` - -##Fenced Python Code - -```py -def fib(n): - if n > 1: - return n * fib(n -1) - else: - return 1 - -if __name__ == '__main__': - import sys - n = int(sys.argv[1]) if len(sys.argv) > 1 else 5 - f = fib(n) - print 'fib(', n, ') is ', f -``` - -#In Conclusion - -You _can_ do it __too__! -Try to enclose `code` in *backquotes*. - diff --git a/web-demo/.gitignore b/web-demo/.gitignore deleted file mode 100644 index b5ad5b4..0000000 --- a/web-demo/.gitignore +++ /dev/null @@ -1,75 +0,0 @@ -# Logs -logs -*.log - -# Runtime data -pids -*.pid -*.seed -*.out -*.log -*.dat -dump.rdb - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul -coverage - -# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# Compiled binary addons (http://nodejs.org/api/addons.html) -build/Release - -# Dependency directory -# Deployed apps should consider commenting this line out: -# see https://npmjs.org/doc/faq.html#Should-I-check-my-node_modules-folder-into-git -node_modules - -# ========================= -# Operating System Files -# ========================= - -# OSX -# ========================= - -.DS_Store -.AppleDouble -.LSOverride - -# Icon must ends with two \r. -Icon - -# Thumbnails -._* - -# Files that might appear on external disk -.Spotlight-V100 -.Trashes - -# Windows -# ========================= - -# Windows image file caches -Thumbs.db -ehthumbs.db - -# Folder config file -Desktop.ini - -# Recycle Bin used on file shares -$RECYCLE.BIN/ - -# Windows Installer files -*.cab -*.msi -*.msm -*.msp - -# Development directories/files to skip -node_modules -*~ -*.swp - diff --git a/web-demo/LICENSE.txt b/web-demo/LICENSE.txt deleted file mode 100644 index 5c2e99f..0000000 --- a/web-demo/LICENSE.txt +++ /dev/null @@ -1,18 +0,0 @@ -Copyright (c) 2014, Craig Johannsen. All rights reserved. -(portions generated by VS 2013 for Web) - -Redistribution and use in source and binary forms, with or without -modification, is not permitted. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - diff --git a/web-demo/Procfile b/web-demo/Procfile deleted file mode 100644 index c6eb35f..0000000 --- a/web-demo/Procfile +++ /dev/null @@ -1,2 +0,0 @@ -web: node web.js - diff --git a/web-demo/README.md b/web-demo/README.md deleted file mode 100644 index 5bbcec0..0000000 --- a/web-demo/README.md +++ /dev/null @@ -1,6 +0,0 @@ -markdown-to-html web demo -=============== - -Demonstrates how to use markdown-to-html's Markdown and GithubMarkdown -classes to convert markdown text to HTML and stream it to an http response. - diff --git a/web-demo/package.json b/web-demo/package.json deleted file mode 100644 index 4df8ab4..0000000 --- a/web-demo/package.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "name": "markdown-to-html web demo", - "version": "1.0.1", - "description": - "A very simple web app that uses Express, Jade and Stylus to demonstrate markdown-to-html streaming", - "main": "app.js", - "author": "Craig Johannsen", - "license": "BSD-3-Clause", - "dependencies": { - "errorhandler": "1.1.x", - "express": "4.6.x", - "jade": "1.4.x", - "method-override": "2.1.x", - "morgan": "1.5.x", - "serve-favicon": "2.0.x", - "stylus": "0.47.x" - }, - "engines": { "node": ">=0.10.29" }, - "os": ["win32", "win64", "linux"], - "scripts": { - "start": "node web.js" - } -} diff --git a/web-demo/public/images/Favicon.png b/web-demo/public/images/Favicon.png deleted file mode 100644 index 45c324b..0000000 Binary files a/web-demo/public/images/Favicon.png and /dev/null differ diff --git a/web-demo/public/images/Favicon2.ico b/web-demo/public/images/Favicon2.ico deleted file mode 100644 index bbb4034..0000000 Binary files a/web-demo/public/images/Favicon2.ico and /dev/null differ diff --git a/web-demo/public/stylesheets/ghstyle.css b/web-demo/public/stylesheets/ghstyle.css deleted file mode 100644 index 9083b53..0000000 --- a/web-demo/public/stylesheets/ghstyle.css +++ /dev/null @@ -1,57 +0,0 @@ -body { - background-color: White; - margin-left: 15px; -} -h1 { - color: maroon; -} -code, div.highlight { - background-color: MintCream; - padding-left: -5px; - margin-left: 5px; -} - -div.highlight { - padding-top: 10px; - padding-bottom: 10px; - width: 80%; -} -.p { - color: Black; -} -.n, .pl-vpf { - color: Black; - font-weight: medium; -} -.nf, .pl-enf { - color: DarkGreen; -} -.nx { - color: #005B5B; - font-weight: medium; -} -.o, .pl-ko { - color: black; -} -.mi, .pl-cn { - color: Brown; - font-weight: bold; -} -.k, .pl-s, .pl-k { - color: DarkSlateBlue; - font-weight: bold; -} -.kd { - color: DarkSlate; - font-weight: bold; -} -.s1 { - color: Chocolate; - font-weight: 500; -} -.s2 { - color: Red; -} -.c, .pl-c { - color: Orange; -} diff --git a/web-demo/public/stylesheets/style.css b/web-demo/public/stylesheets/style.css deleted file mode 100644 index 6cc61f8..0000000 --- a/web-demo/public/stylesheets/style.css +++ /dev/null @@ -1,31 +0,0 @@ -body { - padding: 40px; - font: 14px "Lucida Grande", Helvetica, Arial, sans-serif; -} -h1 { - color: #00f; - font-size: 24pt; -} -p.greeting { - font: 18px "Arial", sans-serif; -} -a { - color: #f00; -} -div.author-quote { - padding-top: 20px; -} -div.author { - padding-top: 15px; -} -span.author { - font: 14px "Arial", sans-serif; -} -div.quote { - padding-top: 15px; - padding-bottom: 15px; -} -span.quote { - font: 14px "Arial", italic; - font-style: italic; -} diff --git a/web-demo/public/stylesheets/style.styl b/web-demo/public/stylesheets/style.styl deleted file mode 100644 index 722355e..0000000 --- a/web-demo/public/stylesheets/style.styl +++ /dev/null @@ -1,31 +0,0 @@ -body - padding: 40px - font: 14px "Lucida Grande", Helvetica, Arial, sans-serif - -h1 - color:blue - font-size: 24pt - -p.greeting - font: 18px "Arial", sans-serif - -a - color: red - -div.author-quote - padding-top: 20px - -div.author - padding-top: 15px - -span.author - font: 14px "Arial", sans-serif - -div.quote - padding-top: 15px - padding-bottom: 15px - -span.quote - font: 14px "Arial", italic - font-style: italic - diff --git a/web-demo/routes/home.js b/web-demo/routes/home.js deleted file mode 100644 index 89e46bc..0000000 --- a/web-demo/routes/home.js +++ /dev/null @@ -1,21 +0,0 @@ -'use strict'; -/* - * GET home page. - */ - -// Class Home. -function Home() { - // option hash values are set in the routes index.js module - // and shared by all routing modules. - this.options = {title: 'Default', randomQuote: false}; // Default value only. - - this.routeMe = function(req, res) { - var fileName = req.params[0]; - res.render('home', { title: this.options.title }); - return; - }; -} - -var singleton = new Home(); -singleton.routeMe = singleton.routeMe.bind(singleton); -module.exports = singleton; diff --git a/web-demo/routes/index.js b/web-demo/routes/index.js deleted file mode 100644 index 2b4f9cd..0000000 --- a/web-demo/routes/index.js +++ /dev/null @@ -1,20 +0,0 @@ -'use strict'; -var home = require('./home'); -var renderMarkdown = require('./renderMarkdown'); -var renderGithubMarkdown = require('./renderGithubMarkdown'); - -// options shared to all routing modules -function setOptions(options) { - exports.options = options; - home.options = options; - renderMarkdown.options = options; - renderGithubMarkdown.options = options; -} - -// exports: -exports.setOptions = setOptions; -exports.home = home; -exports.markdown = renderMarkdown; -exports.github_markdown = renderGithubMarkdown; - - diff --git a/web-demo/routes/renderGithubMarkdown.js b/web-demo/routes/renderGithubMarkdown.js deleted file mode 100644 index 906f852..0000000 --- a/web-demo/routes/renderGithubMarkdown.js +++ /dev/null @@ -1,44 +0,0 @@ -'use strict'; -/* - * GET /github-markdown/:filename. - */ -var jade = require('jade'); -var path = require('path'); -var GithubMarkdown = require('markdown-to-html').GithubMarkdown; - -var mdOpts = { - flavor: 'markdown', - context: 'cwjohan/node-redis-queue', - username: 'guest' -}; -var viewsDir = path.join(path.dirname(__dirname), 'views'); - -// Class RenderGithubMarkdown. -function RenderGithubMarkdown() { - this.options = {}; // Default value only. - - this.routeMe = function(req, res) { - var md = new GithubMarkdown(); - var debug = req.param('debug', false); - md.debug = debug; - md.bufmax = 2048; - var fileName = path.join(viewsDir, req.params.filename); - if (debug) console.error('>>>renderMarkdown: fileName="' + fileName + '"'); - res.write(jade.renderFile( - path.join(viewsDir, 'mdheader.jade'), - {title: this.options.title, subtitle: 'Github-Markdown', pretty: true})); - md.once('end', function() { - res.write(jade.renderFile(path.join(viewsDir, 'mdtrailer.jade'), {pretty: true})); - res.end(); - }); - md.render(fileName, mdOpts, function(err) { - if (debug) console.error('>>>renderMarkdown: err=' + err); - if (err) { res.write('>>>' + err); res.end(); return; } - else md.pipe(res); - }); - }; -} - -var singleton = new RenderGithubMarkdown(); -singleton.routeMe = singleton.routeMe.bind(singleton); -module.exports = singleton; diff --git a/web-demo/routes/renderMarkdown.js b/web-demo/routes/renderMarkdown.js deleted file mode 100644 index bce5a09..0000000 --- a/web-demo/routes/renderMarkdown.js +++ /dev/null @@ -1,43 +0,0 @@ -'use strict'; -/* - * GET /markdown/:filename. - */ -var jade = require('jade'); -var path = require('path'); -var Markdown = require('markdown-to-html').Markdown; - -var mdOpts = { - highlight: true, - context: 'cwjohan/markdown-to-html' -}; -var viewsDir = path.join(path.dirname(__dirname), 'views'); - -// Class RenderMarkdown. -function RenderMarkdown() { - this.options = {}; // Default value only. - - this.routeMe = function(req, res) { - var md = new Markdown(); - var debug = req.param('debug', false); - md.debug = debug; - md.bufmax = 2048; - var fileName = path.join(viewsDir, req.params.filename); - if (debug) console.error('>>>renderMarkdown: fileName="' + fileName + '"'); - res.write(jade.renderFile( - path.join(viewsDir, 'mdheader.jade'), - {title: this.options.title, subtitle: 'Markdown', pretty: true})); - md.once('end', function() { - res.write(jade.renderFile(path.join(viewsDir, 'mdtrailer.jade'), {pretty: true})); - res.end(); - }); - md.render(fileName, mdOpts, function(err) { - if (debug) console.error('>>>renderMarkdown: err=' + err); - if (err) { res.write('>>>' + err); res.end(); return; } - else md.pipe(res); - }); - }; -} - -var singleton = new RenderMarkdown(); -singleton.routeMe = singleton.routeMe.bind(singleton); -module.exports = singleton; diff --git a/web-demo/script/clean b/web-demo/script/clean deleted file mode 100644 index 7e6ecdc..0000000 --- a/web-demo/script/clean +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash -echo removing: -find . -path ./node_modules -prune -o \( -name \*~ -type f -print -exec rm {} \; \) -find ./test -name \*js -type f -print -exec rm {} \; diff --git a/web-demo/views/README.md b/web-demo/views/README.md deleted file mode 100644 index 70c5a7b..0000000 --- a/web-demo/views/README.md +++ /dev/null @@ -1,102 +0,0 @@ -markdown-to-html -================ - -Command-line utility to convert Github Flavored Markdown to HTML. -Output may be to stdout or to your default browser. -Also, the underlying Markdown and GithubMarkdown classes are readable stream classes -and may be used however you like (e.g., pipe to an http response or to stdout). - -##Installation - -``` -npm install markdown-to-html -g -``` - -##Example Usage - -####Command line utility to output HTML to stdout - -``` -markdown myfile.md [] -``` -####Command line utility to output HTML to default browser - -``` -markdownb myfile.md [] -``` - -####Command line utility to output the Github API results to stdout - -``` -github-markdown myfile.md -``` - -####Command line utility to output the Github API results to default browser - -``` -github-markdownb myfile.md -``` - -####Run the web demo - -1. Run `npm start`. -1. In a web browser address field type [localhost:3000](http://localhost:3000). - -###Use the Markdown class to render markdown text - -```js -var Markdown = require('markdown-to-html').Markdown; -var md = new Markdown(); -md.bufmax = 2048; -var opts = {title: 'File $BASENAME in $DIRNAME', stylesheet: 'test/style.css'}; -... -md.render(fileName, opts, function(err) { - if (err) { - console.error('>>>' + err); - process.exit(); - } - md.pipe(process.stdout); -}); -``` - -##Options for markdown and markdownb - -`--flavor ` -- Format as type 'gfm' (default) or just plain 'markdown'. May be abbreviated `-f`. - -`--highlight` -- Highlight code blocks with style info. Highlight has no effect in -github-markdown. May be abbreviated `-h`. Defaults to `false`. - -`--stylesheet ` -- Output HTML header with link element referring to -the given stylesheet. May be abbreviated `-s`. - -`--title ` -- Output HTML header with given title. Title string may include -`$FILENAME`, `$DIRNAME`, `$BASENAME`, or `$PATHNAME` variables which are replaced by the -corresponding .md filename, directory name, base name, or full path, respectively. -Alternatively, the title may be any text you wish. May be abbreviated `-t`. - -`--context <context>` -- Github user/project to use with #<n> issue number references. -May be abbreviated `-c`. - -`--verbose` -- Verbose output. May be abbreviated `-v`. Defaults to `false` unless debug has -been specified, in which case it is set to `true`. - -`--debug` -- Debug output. May be abbreviated `-d`. Defaults to `false`. - -`--help` -- Output usage info. - -##Markdown and GithubMarkdown class properties - -`bufmax` -- The maximum amout of data to push to the read operation at any given time. -Defaults to 1024. - -`debug` -- Debug output (e.g., individual chunks of data pushed to output). Defaults to `false`. - -##Markdown and GithubMarkdown class methods - -`render(fileName, opts, onDone)` -- Renders the markdown text in the given file using the given -options. Calls the onDone callback function when finished if specified. If you are going to -pipe the output to another stream, this is most reliably done in the callback function. - -The `onDone` callback takes a single error parameter, which ought to be tested before -performing any other operations on the Markdown or GithubMarkdown stream. - diff --git a/web-demo/views/home.jade b/web-demo/views/home.jade deleted file mode 100644 index 6159b34..0000000 --- a/web-demo/views/home.jade +++ /dev/null @@ -1,21 +0,0 @@ -extends layout - -block content - h1= title - p.greeting. - Welcome to the #{title}. - div - hr - h3 Example of Markdown Rendering: - div Click - a(href="/markdown/test.md") here - span to see test.md rendered as a Markdown file. - p Try substituting test2.md for test.md. - - h3 Example of Github-Markdown rendering: - div Click - a(href="/github-markdown/test.md") here - span to see test.md rendered as a Github-Markdown file. - p Try substituting test2.md for test.md. - hr - diff --git a/web-demo/views/layout.jade b/web-demo/views/layout.jade deleted file mode 100644 index 83b89ce..0000000 --- a/web-demo/views/layout.jade +++ /dev/null @@ -1,9 +0,0 @@ -doctype html -html(lang="en") - head - meta(charset="UTF-8") - title= title - meta(name="keywords" content="stories, writing, publishing, read, news, internet, domain, sale") - link(rel='stylesheet', href='/stylesheets/style.css') - body - block content diff --git a/web-demo/views/mdheader.jade b/web-demo/views/mdheader.jade deleted file mode 100644 index f42bf48..0000000 --- a/web-demo/views/mdheader.jade +++ /dev/null @@ -1,12 +0,0 @@ -|<!DOCTYPE html> -|<html lang="en"> -head - meta(charset="UTF-8") - title= title - meta(name="keywords" content="markdown, html, convert, transform") - link(rel='stylesheet', href='/stylesheets/style.css') - link(rel='stylesheet', href='/stylesheets/ghstyle.css') -|<body> -h2= subtitle -div.md - hr diff --git a/web-demo/views/mdtrailer.jade b/web-demo/views/mdtrailer.jade deleted file mode 100644 index 53ed8cd..0000000 --- a/web-demo/views/mdtrailer.jade +++ /dev/null @@ -1,5 +0,0 @@ -div.trailer - hr - | and that's all. -|</body> -|</html> diff --git a/web-demo/views/test.html b/web-demo/views/test.html deleted file mode 100644 index d6535cf..0000000 --- a/web-demo/views/test.html +++ /dev/null @@ -1,138 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <title>test/test.md - - - -

Something Really Cool

-

Hello world github/linguist#1 cool, and #1!
And that is not all.

-

Lists

-

Numbered List

-
    -
  1. Item One
  2. -
  3. Item Two
  4. -
  5. Item Three
  6. -
-

Bullet List

-
    -
  • Item One
  • -
  • Item Two
  • -
  • Item Three
  • -
-

Code Example

-

Code enclosed in 'backquotes':

-

Always use var to define a variable. For example, var baz = 'initial value'; would define
variable baz.

-

This is some nonsense javascript code:

-
    var fs = require('fs');
-    var count = 0, text;
-    exports.bar = {
-      boo: true,
-      baz: 'Fred'
-    };
-
-    function foo(inc) {
-      try {
-        console.log("foo has been called");
-        count = count + inc;
-        if (count >= 10) {
-          count = 0;
-        } else {
-          text = fs.readFileSync('foo.txt');
-        }
-      catch(err) {
-        throw new Error('Help! ' + err);
-      }
-    }
-
- -

Fenced Javascript Code

-
```js    
-var fs = require('fs');
-var count = 0, text;
-exports.bar = {
-  boo: true,
-  baz: 'Fred'
-};
-
-function foo(inc) {
-  try {
-    console.log("foo has been called");
-    count = count + inc;
-    if (count >= 10) {
-      count = 0;
-    } else {
-      text = fs.readFileSync('foo.txt');
-    }
-  catch(err) {
-    throw new Error('Help! ' + err);
-  }
-}
-```
-
- -

Fenced Ruby Code

-
```ruby
-require "bunny"
-
-conn = Bunny.new(:hostname => "127.0.0.1", :port => 5672)
-conn.start
-
-ch = conn.create_channel
-q = ch.queue("hello")
-
-q.subscribe(:ack => true, :block => true,) do |delivery_info, properties, body|
-    puts " [x] Received '#{body}'"
-    # imitate some work
-    sleep body.count(".").to_i
-    puts " [x] Done"
-    ch.ack(delivery_info.delivery_tag)
-    if body == "stop"
-        delivery_info.consumer.cancel
-    end
-end
-```
-
- -

Fenced Coffeescript Code

-
```coffee
-fs = require 'fs'
-count = 0
-text = null
-exports.bar =
-  boo: true
-  baz: 'Fred'
-
-foo = (inc) ->
-  try
-    console.log "foo has been called"
-    count = count + inc
-    if count >= 10
-      count = 0
-    else
-      text = fs.readFileSync 'foo.txt'
-  catch err
-    throw new Error 'Help! ' + err
-```
-
- -

Fenced Python Code

-
```py
-def fib(n):
-    if n > 1:
-        return n * fib(n -1)
-    else:
-        return 1
-
-if __name__ == '__main__':
-    import sys
-    n = int(sys.argv[1]) if len(sys.argv) > 1 else 5
-    f = fib(n)
-    print 'fib(', n, ') is ', f
-```
-
- -

In Conclusion

-

You can do it too!
Try to enclose code in backquotes.

- - diff --git a/web-demo/views/test.md b/web-demo/views/test.md deleted file mode 100644 index f6322bd..0000000 --- a/web-demo/views/test.md +++ /dev/null @@ -1,141 +0,0 @@ -Something Really Cool -========= - -Hello world github/linguist#1 **cool**, and #1! -And that is not all. - -#Lists - -##Numbered List - -1. Item One -1. Item Two -1. Item Three - -##Bullet List - -* Item One -* Item Two -* Item Three - -#Code Example - -##Code enclosed in 'backquotes': - -Always use `var` to define a variable. For example, `var baz = 'initial value';` would define -variable `baz`. - -##This is some nonsense javascript code: - - var fs = require('fs'); - var count = 0, text; - exports.bar = { - boo: true, - baz: 'Fred' - }; - - function foo(inc) { - try { - console.log("foo has been called"); - count = count + inc; - if (count >= 10) { - count = 0; - } else { - text = fs.readFileSync('foo.txt'); - } - catch(err) { - throw new Error('Help! ' + err); - } - } - -#Fenced Javascript Code - -```js -var fs = require('fs'); -var count = 0, text; -exports.bar = { - boo: true, - baz: 'Fred' -}; - -function foo(inc) { - try { - console.log("foo has been called"); - count = count + inc; - if (count >= 10) { - count = 0; - } else { - text = fs.readFileSync('foo.txt'); - } - catch(err) { - throw new Error('Help! ' + err); - } -} -``` - -##Fenced Ruby Code - -```ruby -require "bunny" - -conn = Bunny.new(:hostname => "127.0.0.1", :port => 5672) -conn.start - -ch = conn.create_channel -q = ch.queue("hello") - -q.subscribe(:ack => true, :block => true,) do |delivery_info, properties, body| - puts " [x] Received '#{body}'" - # imitate some work - sleep body.count(".").to_i - puts " [x] Done" - ch.ack(delivery_info.delivery_tag) - if body == "stop" - delivery_info.consumer.cancel - end -end -``` - -##Fenced Coffeescript Code - -```coffee -fs = require 'fs' -count = 0 -text = null -exports.bar = - boo: true - baz: 'Fred' - -foo = (inc) -> - try - console.log "foo has been called" - count = count + inc - if count >= 10 - count = 0 - else - text = fs.readFileSync 'foo.txt' - catch err - throw new Error 'Help! ' + err -``` - -##Fenced Python Code - -```py -def fib(n): - if n > 1: - return n * fib(n -1) - else: - return 1 - -if __name__ == '__main__': - import sys - n = int(sys.argv[1]) if len(sys.argv) > 1 else 5 - f = fib(n) - print 'fib(', n, ') is ', f -``` - -#In Conclusion - -You _can_ do it __too__! -Try to enclose `code` in *backquotes*. - diff --git a/web-demo/views/test2.md b/web-demo/views/test2.md deleted file mode 100644 index 85947b2..0000000 --- a/web-demo/views/test2.md +++ /dev/null @@ -1,17 +0,0 @@ -This github/linguist#1 and #1 'is' surprising. -And so 'is' this. - -##Code like `foo` enclosed in 'backquotes': - -```py -def fib(n): # write Fibonacci series up to n - a, b = 0, 1 - while b < n: - print b, - a, b = b, a+b - -# Now call the function we just defined: -fib(2000) -``` - - diff --git a/web-demo/web.js b/web-demo/web.js deleted file mode 100644 index cd31409..0000000 --- a/web-demo/web.js +++ /dev/null @@ -1,56 +0,0 @@ -'use strict'; -/** - * Module dependencies. - */ -var express = require('express'); -var routes = require('./routes'); // loads ./routes/index.js -var http = require('http'); -var path = require('path'); - -var serveFavicon = require('serve-favicon'); -var logger = require('morgan'); -var errorHandler = require('errorhandler'); -var port = process.env.PORT || 3000; - -// Options: -routes.setOptions({ - title: 'Markdown-to-HTML Demo App', -}); - -// Middleware: -var web = express(); -web.set('views', path.join(__dirname, 'views')); -web.set('view engine', 'jade'); -web.use(serveFavicon(path.join(__dirname, 'public/images/Favicon.png'))); -web.use(logger(isDevelopment() ? 'dev' : 'combined')); -web.use(require('stylus').middleware(path.join(__dirname, 'public'))); -web.use(express.static(path.join(__dirname, 'public'))); - -// Development only: -if (isDevelopment()) { - // Handle errors and respond with content negotiation. - // Sends full error stack back to client. - web.use(errorHandler()); -} - -web.get('/', routes.home.routeMe); -web.get('/markdown/:filename', routes.markdown.routeMe); -web.get('/github-markdown/:filename', routes.github_markdown.routeMe); - -process.on('SIGTERM', shutDown); // Doesn't work in win32 os. -process.on('SIGINT', shutDown); - -http.createServer(web).listen(port, function(){ - console.log('Express server listening on port ' + port); - console.log('options=', routes.options); -}); - -function isDevelopment() { - return 'development' === web.get('env'); // NODE_ENV setting, defaults to 'development'. -} - -function shutDown() { - console.log('Shutting server down. No longer listening on port ' + port + '.'); - process.exit(); -} -