Kaynağa Gözat

Merge branch 'feature/cli' into develop

Conflicts:
	.gitignore
	src/subParsers/headers.js
Estevão Soares dos Santos 10 yıl önce
ebeveyn
işleme
d079154260

+ 0 - 1
.gitignore

@@ -3,5 +3,4 @@
 .DS_Store
 node_modules
 npm-debug.log
-localtest.html
 /*.test.*

+ 2 - 0
.jshintignore

@@ -1,3 +1,5 @@
 Gruntfile.js
 dist/**/*.js
 build/**/*.js
+src/options.js
+bin/*

+ 3 - 1
CREDITS.md

@@ -37,10 +37,12 @@ Credits
       Bug fixes and build optimization
     * [Karthik Balakrishnan](https://github.com/torcellite)<br/>
       Support for table alignment
+    * [rheber](https://github.com/rheber)<br/>
+      Cli
       
 
   - Original Project
     * [John Gruber](http://daringfireball.net/projects/markdown/)<br/>
       Author of Markdown
-    * [John Fraser](http://attacklab.net/)
+    * [John Fraser](http://attacklab.net/)<br/>
       Author of Showdown

+ 1 - 0
Gruntfile.js

@@ -20,6 +20,7 @@ module.exports = function (grunt) {
       },
       dist: {
         src: [
+          'src/options.js',
           'src/showdown.js',
           'src/helpers.js',
           'src/converter.js',

+ 2 - 0
bin/showdown.js

@@ -0,0 +1,2 @@
+#!/usr/bin/env node
+require('../src/cli/cli');

+ 108 - 34
dist/showdown.js

@@ -1,5 +1,86 @@
 ;/*! showdown 13-07-2015 */
 (function(){
+/**
+ * Created by Tivie on 13-07-2015.
+ */
+
+function getDefaultOpts(simple) {
+  'use strict';
+
+  var defaultOptions = {
+    omitExtraWLInCodeBlocks: {
+      default: false,
+      describe: 'Omit the default extra whiteline added to code blocks',
+      type: 'boolean'
+    },
+    noHeaderId: {
+      default: false,
+      describe: 'Turn on/off generated header id',
+      type: 'boolean'
+    },
+    prefixHeaderId: {
+      default: false,
+      describe: 'Specify a prefix to generated header ids',
+      type: 'string'
+    },
+    headerLevelStart: {
+      default: false,
+      describe: 'The header blocks level start',
+      type: 'integer'
+    },
+    parseImgDimensions: {
+      default: false,
+      describe: 'Turn on/off image dimension parsing',
+      type: 'boolean'
+    },
+    simplifiedAutoLink: {
+      default: false,
+      describe: 'Turn on/off GFM autolink style',
+      type: 'boolean'
+    },
+    literalMidWordUnderscores: {
+      default: false,
+      describe: 'Parse midword underscores as literal underscores',
+      type: 'boolean'
+    },
+    strikethrough: {
+      default: false,
+      describe: 'Turn on/off strikethrough support',
+      type: 'boolean'
+    },
+    tables: {
+      default: false,
+      describe: 'Turn on/off tables support',
+      type: 'boolean'
+    },
+    tablesHeaderId: {
+      default: false,
+      describe: 'Add an id to table headers',
+      type: 'boolean'
+    },
+    ghCodeBlocks: {
+      default: true,
+      describe: 'Turn on/off GFM fenced code blocks support',
+      type: 'boolean'
+    },
+    tasklists: {
+      default: false,
+      describe: 'Turn on/off GFM tasklist support',
+      type: 'boolean'
+    }
+  };
+  if (simple === false) {
+    return JSON.parse(JSON.stringify(defaultOptions));
+  }
+  var ret = {};
+  for (var opt in defaultOptions) {
+    if (defaultOptions.hasOwnProperty(opt)) {
+      ret[opt] = defaultOptions[opt].default;
+    }
+  }
+  return ret;
+}
+
 /**
  * Created by Tivie on 06-01-2015.
  */
@@ -8,21 +89,7 @@
 var showdown = {},
     parsers = {},
     extensions = {},
-    defaultOptions = {
-      omitExtraWLInCodeBlocks:   false,
-      prefixHeaderId:            false,
-      noHeaderId:                false,
-      headerLevelStart:          1,
-      parseImgDimensions:        false,
-      simplifiedAutoLink:        false,
-      literalMidWordUnderscores: false,
-      strikethrough:             false,
-      tables:                    false,
-      tablesHeaderId:            false,
-      ghCodeBlocks:              true,  // true due to historical reasons
-      tasklists:                 false
-    },
-    globalOptions = JSON.parse(JSON.stringify(defaultOptions)),
+    globalOptions = getDefaultOpts(true),
     flavor = {
       github: {
         omitExtraWLInCodeBlocks:   true,
@@ -35,7 +102,7 @@ var showdown = {},
         ghCodeBlocks:              true,
         tasklists:                 true
       },
-      vanilla: JSON.parse(JSON.stringify(defaultOptions))
+      vanilla: getDefaultOpts(true)
     };
 
 /**
@@ -90,7 +157,7 @@ showdown.getOptions = function () {
  */
 showdown.resetOptions = function () {
   'use strict';
-  globalOptions = JSON.parse(JSON.stringify(defaultOptions));
+  globalOptions = getDefaultOpts(true);
 };
 
 /**
@@ -112,11 +179,12 @@ showdown.setFlavor = function (name) {
 /**
  * Get the default options
  * @static
+ * @param {boolean} [simple=true]
  * @returns {{}}
  */
-showdown.getDefaultOptions = function () {
+showdown.getDefaultOptions = function (simple) {
   'use strict';
-  return defaultOptions;
+  return getDefaultOpts(simple);
 };
 
 /**
@@ -235,7 +303,7 @@ function validate(extension, name) {
   }
 
   for (var i = 0; i < extension.length; ++i) {
-    var baseMsg = errMsg + 'sub-extension ' + i + ': ',
+    var baseMsg = errMsg + ' sub-extension ' + i + ': ',
         ext = extension[i];
     if (typeof ext !== 'object') {
       ret.valid = false;
@@ -532,13 +600,16 @@ showdown.Converter = function (converterOptions) {
   /**
    * Parse extension
    * @param {*} ext
+   * @param {string} [name='']
    * @private
    */
-  function _parseExtension(ext) {
+  function _parseExtension(ext, name) {
 
+    name = name || null;
     // If it's a string, the extension was previously loaded
     if (showdown.helper.isString(ext)) {
       ext = showdown.helper.stdExtName(ext);
+      name = ext;
 
       // LEGACY_SUPPORT CODE
       if (showdown.extensions[ext]) {
@@ -564,8 +635,9 @@ showdown.Converter = function (converterOptions) {
       ext = [ext];
     }
 
-    if (!showdown.validateExtension(ext)) {
-      return;
+    var validExt = validate(ext, name);
+    if (!validExt.valid) {
+      throw Error(validExt.error);
     }
 
     for (var i = 0; i < ext.length; ++i) {
@@ -718,9 +790,11 @@ showdown.Converter = function (converterOptions) {
   /**
    * Add extension to THIS converter
    * @param {{}} extension
+   * @param {string} [name=null]
    */
-  this.addExtension = function (extension) {
-    _parseExtension(extension);
+  this.addExtension = function (extension, name) {
+    name = name || null;
+    _parseExtension(extension, name);
   };
 
   /**
@@ -1498,7 +1572,7 @@ showdown.subParser('headers', function (text, options, globals) {
   'use strict';
 
   var prefixHeader = options.prefixHeaderId,
-    headerLevelStart = (isNaN(parseInt(options.headerLevelStart))) ? 1 : parseInt(options.headerLevelStart);
+      headerLevelStart = (isNaN(parseInt(options.headerLevelStart))) ? 1 : parseInt(options.headerLevelStart);
 
   // Set text-style headers:
   //	Header 1
@@ -1510,16 +1584,16 @@ showdown.subParser('headers', function (text, options, globals) {
   text = text.replace(/^(.+)[ \t]*\n=+[ \t]*\n+/gm, function (wholeMatch, m1) {
 
     var spanGamut = showdown.subParser('spanGamut')(m1, options, globals),
-      hID = (options.noHeaderId) ? '' : ' id="' + headerId(m1) + '"',
-      hLevel = headerLevelStart,
-      hashBlock = '<h' + hLevel + hID + '>' + spanGamut + '</h' + hLevel + '>';
+        hID = (options.noHeaderId) ? '' : ' id="' + headerId(m1) + '"',
+        hLevel = headerLevelStart,
+        hashBlock = '<h' + hLevel + hID + '>' + spanGamut + '</h' + hLevel + '>';
     return showdown.subParser('hashBlock')(hashBlock, options, globals);
   });
 
   text = text.replace(/^(.+)[ \t]*\n-+[ \t]*\n+/gm, function (matchFound, m1) {
     var spanGamut = showdown.subParser('spanGamut')(m1, options, globals),
-      hID = (options.noHeaderId) ? '' : ' id="' + headerId(m1) + '"',
-      hLevel = headerLevelStart + 1,
+        hID = (options.noHeaderId) ? '' : ' id="' + headerId(m1) + '"',
+        hLevel = headerLevelStart + 1,
       hashBlock = '<h' + hLevel + hID + '>' + spanGamut + '</h' + hLevel + '>';
     return showdown.subParser('hashBlock')(hashBlock, options, globals);
   });
@@ -1545,9 +1619,9 @@ showdown.subParser('headers', function (text, options, globals) {
 
   text = text.replace(/^(#{1,6})[ \t]*(.+?)[ \t]*#*\n+/gm, function (wholeMatch, m1, m2) {
     var span = showdown.subParser('spanGamut')(m2, options, globals),
-      hID = (options.noHeaderId) ? '' : ' id="' + headerId(m2) + '"',
-      hLevel = headerLevelStart - 1 + m1.length,
-      header = '<h' + hLevel + hID + '>' + span + '</h' + hLevel + '>';
+        hID = (options.noHeaderId) ? '' : ' id="' + headerId(m2) + '"',
+        hLevel = headerLevelStart - 1 + m1.length,
+        header = '<h' + hLevel + hID + '>' + span + '</h' + hLevel + '>';
 
     return showdown.subParser('hashBlock')(header, options, globals);
   });

Dosya farkı çok büyük olduğundan ihmal edildi
+ 0 - 0
dist/showdown.js.map


Dosya farkı çok büyük olduğundan ihmal edildi
+ 0 - 0
dist/showdown.min.js


Dosya farkı çok büyük olduğundan ihmal edildi
+ 0 - 0
dist/showdown.min.js.map


+ 6 - 0
package.json

@@ -35,6 +35,9 @@
   "scripts": {
     "test": "grunt test"
   },
+  "bin": {
+    "showdown": "bin/showdown.js"
+  },
   "devDependencies": {
     "chai": "^1.10.0",
     "grunt": "^0.4.5",
@@ -50,5 +53,8 @@
     "quiet-grunt": "^0.2.3",
     "sinon": "^1.14.1",
     "source-map-support": "^0.2.9"
+  },
+  "dependencies": {
+    "yargs": "^3.15.0"
   }
 }

+ 30 - 0
src/cli/cli.js

@@ -0,0 +1,30 @@
+'use strict';
+
+var version = require('../../package.json').version,
+    yargs = require('yargs');
+
+yargs
+  .version(version, 'v')
+  .alias('v', 'version')
+  .option('h', {
+    alias: 'help',
+    description: 'Show help'
+  })
+  .usage('Usage: showdown <command> [options]')
+  .demand(1, 'You must provide a valid command')
+  .command('makehtml', 'Converts markdown into html')
+  .example('showdown makehtml -i foo.md -o bar.html', 'Converts \'foo.md\' to \'bar.html\'')
+  .wrap(yargs.terminalWidth());
+
+var argv = yargs.argv,
+  command = argv._[0];
+if (command === 'makehtml') {
+  require('./makehtml.cmd.js').run();
+} else {
+  yargs.showHelp();
+}
+
+if (argv.help) {
+  yargs.showHelp();
+}
+process.exit(0);

+ 6 - 0
src/cli/errorexit.js

@@ -0,0 +1,6 @@
+module.exports = exports = function errorExit(e) {
+  'use strict';
+  console.error('ERROR: ' + e.message);
+  console.error('Run \'showdown <command> -h\' for help');
+  process.exit(1);
+};

+ 123 - 0
src/cli/makehtml.cmd.js

@@ -0,0 +1,123 @@
+var yargs = require('yargs'),
+    fs = require('fs'),
+    errorExit = require('./errorexit.js'),
+    showdown = require('../../dist/showdown');
+
+yargs.reset()
+  .usage('Usage: showdown makehtml [options]')
+  .example('showdown makehtml -i', 'Reads from stdin and outputs to stdout')
+  .example('showdown makehtml -i foo.md -o bar.html', 'Reads \'foo.md\' and writes to \'bar.html\'')
+  //.demand(['i'])
+  .option('i', {
+    alias : 'input',
+    describe: 'Input source. Usually a md file. If omitted or empty, reads from stdin',
+    type: 'string'
+  })
+  .option('o', {
+    alias : 'output',
+    describe: 'Output target. Usually a html file. If omitted or empty, writes to stdout',
+    type: 'string',
+    default: false
+  })
+  .option('u', {
+    alias : 'encoding',
+    describe: 'Input encoding',
+    type: 'string'
+  })
+  .option('a', {
+    alias : 'append',
+    describe: 'Append data to output instead of overwriting',
+    type: 'string'
+  })
+  .option('e', {
+    alias : 'extensions',
+    describe: 'Load the specified extensions. Should be valid paths to node compatible extensions',
+    type: 'array'
+  })
+  .config('c')
+  .alias('c', 'config')
+  .help('h')
+  .alias('h', 'help');
+
+yargs.options(showdown.getDefaultOptions(false));
+argv = yargs.argv;
+
+function run() {
+  'use strict';
+  var input = '',
+    enc = 'utf8',
+    output;
+
+  if (argv.encoding) {
+    enc = argv.encoding;
+  }
+
+  // to avoid passing extensions to converter
+  delete argv.extensions;
+  var converter = new showdown.Converter(argv);
+
+  // Load extensions
+  if (argv.e) {
+    for (var i = 0; i < argv.e.length; ++i) {
+      loadExtension(argv.e[i], converter);
+    }
+  }
+
+  if (!argv.i || argv.i === '') {
+    // 'i' is undefined or empty, read from stdin
+    try {
+      var size = fs.fstatSync(process.stdin.fd).size;
+      input = size > 0 ? fs.readSync(process.stdin.fd, size)[0] : '';
+    } catch (e) {
+      var err = new Error('Could not read from stdin, reason: ' + e.message);
+      errorExit(err);
+    }
+  } else {
+    // 'i' has a value, read from file
+    try {
+      input = fs.readFileSync(argv.i, enc);
+    } catch (err) {
+      errorExit(err);
+    }
+  }
+
+  // parse and convert file
+  output = converter.makeHtml(input);
+
+  // Write output
+  if (!argv.o || argv.o === '') {
+    // o is undefined or empty, write to stdout
+    process.stdout.write(output);
+    // we won't print anything since it would conspurcate stdout and,
+    // consequently, the outputted file
+  } else {
+    // o is has a value, presumably a file, write to it.
+
+    // If a flag is passed, it means we should append instead of overwriting.
+    // Only works with files, obviously
+    var write = (argv.a) ? fs.appendFileSync : fs.writeFileSync;
+
+    try {
+      write(argv.o, output);
+    } catch (err) {
+      errorExit(err);
+    }
+    console.error('DONE!');
+  }
+}
+
+function loadExtension(path, converter) {
+  'use strict';
+  var ext;
+  try {
+    ext = require(path);
+    converter.addExtension(ext, path);
+  } catch (e) {
+    console.error('Could not load extension ' + path + '. Reason:');
+    console.error(e.message);
+  }
+}
+
+module.exports = exports = {
+  run: run
+};

+ 11 - 5
src/converter.js

@@ -86,13 +86,16 @@ showdown.Converter = function (converterOptions) {
   /**
    * Parse extension
    * @param {*} ext
+   * @param {string} [name='']
    * @private
    */
-  function _parseExtension(ext) {
+  function _parseExtension(ext, name) {
 
+    name = name || null;
     // If it's a string, the extension was previously loaded
     if (showdown.helper.isString(ext)) {
       ext = showdown.helper.stdExtName(ext);
+      name = ext;
 
       // LEGACY_SUPPORT CODE
       if (showdown.extensions[ext]) {
@@ -118,8 +121,9 @@ showdown.Converter = function (converterOptions) {
       ext = [ext];
     }
 
-    if (!showdown.validateExtension(ext)) {
-      return;
+    var validExt = validate(ext, name);
+    if (!validExt.valid) {
+      throw Error(validExt.error);
     }
 
     for (var i = 0; i < ext.length; ++i) {
@@ -272,9 +276,11 @@ showdown.Converter = function (converterOptions) {
   /**
    * Add extension to THIS converter
    * @param {{}} extension
+   * @param {string} [name=null]
    */
-  this.addExtension = function (extension) {
-    _parseExtension(extension);
+  this.addExtension = function (extension, name) {
+    name = name || null;
+    _parseExtension(extension, name);
   };
 
   /**

+ 80 - 0
src/options.js

@@ -0,0 +1,80 @@
+/**
+ * Created by Tivie on 13-07-2015.
+ */
+
+function getDefaultOpts(simple) {
+  'use strict';
+
+  var defaultOptions = {
+    omitExtraWLInCodeBlocks: {
+      default: false,
+      describe: 'Omit the default extra whiteline added to code blocks',
+      type: 'boolean'
+    },
+    noHeaderId: {
+      default: false,
+      describe: 'Turn on/off generated header id',
+      type: 'boolean'
+    },
+    prefixHeaderId: {
+      default: false,
+      describe: 'Specify a prefix to generated header ids',
+      type: 'string'
+    },
+    headerLevelStart: {
+      default: false,
+      describe: 'The header blocks level start',
+      type: 'integer'
+    },
+    parseImgDimensions: {
+      default: false,
+      describe: 'Turn on/off image dimension parsing',
+      type: 'boolean'
+    },
+    simplifiedAutoLink: {
+      default: false,
+      describe: 'Turn on/off GFM autolink style',
+      type: 'boolean'
+    },
+    literalMidWordUnderscores: {
+      default: false,
+      describe: 'Parse midword underscores as literal underscores',
+      type: 'boolean'
+    },
+    strikethrough: {
+      default: false,
+      describe: 'Turn on/off strikethrough support',
+      type: 'boolean'
+    },
+    tables: {
+      default: false,
+      describe: 'Turn on/off tables support',
+      type: 'boolean'
+    },
+    tablesHeaderId: {
+      default: false,
+      describe: 'Add an id to table headers',
+      type: 'boolean'
+    },
+    ghCodeBlocks: {
+      default: true,
+      describe: 'Turn on/off GFM fenced code blocks support',
+      type: 'boolean'
+    },
+    tasklists: {
+      default: false,
+      describe: 'Turn on/off GFM tasklist support',
+      type: 'boolean'
+    }
+  };
+  if (simple === false) {
+    return JSON.parse(JSON.stringify(defaultOptions));
+  }
+  var ret = {};
+  for (var opt in defaultOptions) {
+    if (defaultOptions.hasOwnProperty(opt)) {
+      ret[opt] = defaultOptions[opt].default;
+    }
+  }
+  return ret;
+}

+ 7 - 20
src/showdown.js

@@ -6,21 +6,7 @@
 var showdown = {},
     parsers = {},
     extensions = {},
-    defaultOptions = {
-      omitExtraWLInCodeBlocks:   false,
-      prefixHeaderId:            false,
-      noHeaderId:                false,
-      headerLevelStart:          1,
-      parseImgDimensions:        false,
-      simplifiedAutoLink:        false,
-      literalMidWordUnderscores: false,
-      strikethrough:             false,
-      tables:                    false,
-      tablesHeaderId:            false,
-      ghCodeBlocks:              true,  // true due to historical reasons
-      tasklists:                 false
-    },
-    globalOptions = JSON.parse(JSON.stringify(defaultOptions)),
+    globalOptions = getDefaultOpts(true),
     flavor = {
       github: {
         omitExtraWLInCodeBlocks:   true,
@@ -33,7 +19,7 @@ var showdown = {},
         ghCodeBlocks:              true,
         tasklists:                 true
       },
-      vanilla: JSON.parse(JSON.stringify(defaultOptions))
+      vanilla: getDefaultOpts(true)
     };
 
 /**
@@ -88,7 +74,7 @@ showdown.getOptions = function () {
  */
 showdown.resetOptions = function () {
   'use strict';
-  globalOptions = JSON.parse(JSON.stringify(defaultOptions));
+  globalOptions = getDefaultOpts(true);
 };
 
 /**
@@ -110,11 +96,12 @@ showdown.setFlavor = function (name) {
 /**
  * Get the default options
  * @static
+ * @param {boolean} [simple=true]
  * @returns {{}}
  */
-showdown.getDefaultOptions = function () {
+showdown.getDefaultOptions = function (simple) {
   'use strict';
-  return defaultOptions;
+  return getDefaultOpts(simple);
 };
 
 /**
@@ -233,7 +220,7 @@ function validate(extension, name) {
   }
 
   for (var i = 0; i < extension.length; ++i) {
-    var baseMsg = errMsg + 'sub-extension ' + i + ': ',
+    var baseMsg = errMsg + ' sub-extension ' + i + ': ',
         ext = extension[i];
     if (typeof ext !== 'object') {
       ret.valid = false;

+ 9 - 9
src/subParsers/headers.js

@@ -2,7 +2,7 @@ showdown.subParser('headers', function (text, options, globals) {
   'use strict';
 
   var prefixHeader = options.prefixHeaderId,
-    headerLevelStart = (isNaN(parseInt(options.headerLevelStart))) ? 1 : parseInt(options.headerLevelStart);
+      headerLevelStart = (isNaN(parseInt(options.headerLevelStart))) ? 1 : parseInt(options.headerLevelStart);
 
   // Set text-style headers:
   //	Header 1
@@ -14,16 +14,16 @@ showdown.subParser('headers', function (text, options, globals) {
   text = text.replace(/^(.+)[ \t]*\n=+[ \t]*\n+/gm, function (wholeMatch, m1) {
 
     var spanGamut = showdown.subParser('spanGamut')(m1, options, globals),
-      hID = (options.noHeaderId) ? '' : ' id="' + headerId(m1) + '"',
-      hLevel = headerLevelStart,
-      hashBlock = '<h' + hLevel + hID + '>' + spanGamut + '</h' + hLevel + '>';
+        hID = (options.noHeaderId) ? '' : ' id="' + headerId(m1) + '"',
+        hLevel = headerLevelStart,
+        hashBlock = '<h' + hLevel + hID + '>' + spanGamut + '</h' + hLevel + '>';
     return showdown.subParser('hashBlock')(hashBlock, options, globals);
   });
 
   text = text.replace(/^(.+)[ \t]*\n-+[ \t]*\n+/gm, function (matchFound, m1) {
     var spanGamut = showdown.subParser('spanGamut')(m1, options, globals),
-      hID = (options.noHeaderId) ? '' : ' id="' + headerId(m1) + '"',
-      hLevel = headerLevelStart + 1,
+        hID = (options.noHeaderId) ? '' : ' id="' + headerId(m1) + '"',
+        hLevel = headerLevelStart + 1,
       hashBlock = '<h' + hLevel + hID + '>' + spanGamut + '</h' + hLevel + '>';
     return showdown.subParser('hashBlock')(hashBlock, options, globals);
   });
@@ -49,9 +49,9 @@ showdown.subParser('headers', function (text, options, globals) {
 
   text = text.replace(/^(#{1,6})[ \t]*(.+?)[ \t]*#*\n+/gm, function (wholeMatch, m1, m2) {
     var span = showdown.subParser('spanGamut')(m2, options, globals),
-      hID = (options.noHeaderId) ? '' : ' id="' + headerId(m2) + '"',
-      hLevel = headerLevelStart - 1 + m1.length,
-      header = '<h' + hLevel + hID + '>' + span + '</h' + hLevel + '>';
+        hID = (options.noHeaderId) ? '' : ' id="' + headerId(m2) + '"',
+        hLevel = headerLevelStart - 1 + m1.length,
+        header = '<h' + hLevel + hID + '>' + span + '</h' + hLevel + '>';
 
     return showdown.subParser('hashBlock')(header, options, globals);
   });

+ 3 - 0
test/cli/basic.html

@@ -0,0 +1,3 @@
+<h1 id="sometitle">some title</h1>
+
+<p>Test <strong>bold</strong> and <em>italic</em></p>

+ 3 - 0
test/cli/basic.md

@@ -0,0 +1,3 @@
+# some title
+
+Test **bold** and _italic_

+ 13 - 0
test/node/cli.js

@@ -0,0 +1,13 @@
+var execSync = require('child_process').execSync;
+
+describe('showdown cli', function () {
+  'use strict';
+
+  it('basic stdin stdout', function () {
+    var otp = execSync('showdown makehtml', {
+      encoding: 'utf8',
+      input: '**foo**'
+    });
+    otp.trim().should.equal('<p><strong>foo</strong></p>');
+  });
+});

+ 1 - 14
test/node/showdown.js

@@ -17,20 +17,7 @@ describe('showdown.options', function () {
 
   describe('getDefaultOptions()', function () {
     it('should get default options', function () {
-      var opts = {
-        omitExtraWLInCodeBlocks:   false,
-        prefixHeaderId:            false,
-        noHeaderId:                false,
-        headerLevelStart:          1,
-        parseImgDimensions:        false,
-        simplifiedAutoLink:        false,
-        literalMidWordUnderscores: false,
-        strikethrough:             false,
-        tables:                    false,
-        tablesHeaderId:            false,
-        ghCodeBlocks:              true,
-        tasklists:                 false
-      };
+      var opts = require('../optionswp').getDefaultOpts(true);
       expect(showdown.getDefaultOptions()).to.be.eql(opts);
     });
   });

+ 9 - 0
test/optionswp.js

@@ -0,0 +1,9 @@
+/* jshint ignore:start */
+var fs = require('fs'),
+    filedata;
+filedata = fs.readFileSync('src/options.js', 'utf8');
+eval(filedata);
+module.exports = {
+  getDefaultOpts: getDefaultOpts
+};
+/* jshint ignore:end */

Bu fark içinde çok fazla dosya değişikliği olduğu için bazı dosyalar gösterilmiyor