[
  {
    "path": ".gitignore",
    "content": "node_modules/\n"
  },
  {
    "path": "History.md",
    "content": "1.3.3 / 2016-10-06\n==================\n\n * Fix Incorrect dates in history\n\n1.3.2 / 2016-10-06\n==================\n\n * Fix size calculation\n\n1.3.1 / 2016-09-09\n==================\n\n * allow 0 padding\n\n1.3.0 / 2016-09-09\n==================\n\n * add option to set axis character\n * change default axis character to '.'\n\n\n1.2.0 / 2016-09-05\n==================\n\n * add options to set point characters\n * update docs\n * update repo link\n\n1.1.1 / 2014-03-25\n==================\n\n * rename\n\n1.1.0 / 2014-02-27\n==================\n\n * add excess head clipping for rolling data\n\n1.0.1 / 2014-02-27\n==================\n\n * bump array-matrix to try and get npm to work\n\n1.2.0 / 2014-02-26\n==================\n\n * add value mapping support\n\n1.1.0 / 2014-02-26\n==================\n\n * change to make .sort an option\n * docs\n"
  },
  {
    "path": "Makefile",
    "content": "\ntest:\n\t@./node_modules/.bin/mocha \\\n\t\t--require should \\\n\t\t--reporter dot \\\n\t\t--bail\n\n.PHONY: test"
  },
  {
    "path": "Readme.md",
    "content": "\n# Chart\n\n  Ascii bar chart for nodejs.\n\n  ![](https://dl.dropboxusercontent.com/u/6396913/misc/Screen%20Shot%202014-02-27%20at%208.56.42%20AM.png)\n\n## Installation\n\n```\n$ npm install jstrace/chart\n```\n\n## Example\n\n When `data` exceeds the available width the data will \"roll\" to the tail-end\n of the array. This may become an option in the future, but that's the default\n behaviour for now ;)\n\n```js\nvar chart = require('chart');\nvar clear = require('clear');\n\nvar data = [1, 2, ...];\n\nclear();\nconsole.log(chart(data, {\n  width: 130,\n  height: 30,\n  pointChar: '█',\n  negativePointChar: '░'\n}));\n```\n\n# License\n\n  MIT\n"
  },
  {
    "path": "examples/simple.js",
    "content": "\nvar chart = require('..');\nvar clear = require('clear');\n\nvar data = [\n  1,\n  5,\n  5,\n  13,\n  3,\n  2,\n  0,\n  2,\n  34,\n  22,\n  15,\n  12,\n  8,\n  4,\n  3,\n  6,\n  18,\n  -5,\n  -15,\n  -11,\n  -23,\n  -3,\n  10,\n  18,\n  23,\n  17,\n  4,\n  5,\n  6,\n  3,\n  12,\n  10,\n  7,\n  -4,\n  17,\n  30,\n  27,\n  25,\n  23,\n  16,\n  14,\n  12,\n  8,\n  6,\n  4,\n  2\n];\n\nclear();\nconsole.log(chart(data));\n"
  },
  {
    "path": "index.js",
    "content": "\n/**\n * Module dependencies.\n */\n\nvar matrix = require('array-matrix');\n\n/**\n * Expose `chart()`.\n */\n\nmodule.exports = chart;\n\n/**\n * Return ascii chart of `data`.\n *\n * - `width` total chart width [130]\n * - `height` total chart height [30]\n * - `padding` edge padding [3]\n * - `pointChar` character used to plot a point [█]\n * - `negativePointChar` character used to plot a negative point [░]\n * - `axisChar` character used to draw axis [.]\n *\n * @param {Array} data\n * @param {Object} [opts]\n * @return {String}\n * @api public\n */\n\nfunction chart(data, opts) {\n  opts = opts || {};\n\n  // options\n  var w = opts.width || 130;\n  var h = opts.height || 30;\n  var pc = opts.pointChar || '█';\n  var nc = opts.negativePointChar || '░';\n  var ac = opts.axisChar || '.';\n\n  // padding\n  var pad = typeof opts.padding === 'number' ? opts.padding : 3;\n  w -= pad * 2;\n  h -= pad * 2;\n\n  // setup\n  var out = matrix(w, h);\n  var m = max(data) || 0;\n  var label = Math.abs(m).toString();\n  var labelw = label.length;\n  var labelp = 1;\n\n  // chart sizes void of padding etc\n  var ch = h;\n  var cw = w - labelw - labelp;\n\n  // fill\n  for (var y = 0; y < h; y++) {\n    for (var x = 0; x < w; x++) {\n      out[y][x] = ' ';\n    }\n  }\n\n  // y-axis labels\n  for (var i = 0; i < labelw; i++) {\n    out[0][i] = label[i];\n  }\n\n  out[h - 1][labelw - labelp] = '0';\n\n  // y-axis\n  for (var y = 0; y < h; y++) {\n    out[y][labelw + labelp] = ac;\n  }\n\n  // x-axis\n  var x = labelw + labelp;\n  while (x < w) {\n    out[h - 1][x++] = ac;\n    out[h - 1][x++] = ' ';\n  }\n\n  // strip excess from head\n  // so that data may \"roll\"\n  var space = Math.floor(w / 2) - 1;\n  var excess = Math.max(0, data.length - space);\n  if (excess) data = data.slice(excess);\n\n  // plot data\n  var x = labelw + labelp + 2;\n  for (var i = 0; i < data.length; i++) {\n    var d = data[i];\n    var p = d / m;\n    var y = Math.round((h - 2) * p);\n    var c = y < 0 ? nc : pc;\n    if (y < 0) y = -y;\n\n    while (y--) {\n      out[Math.abs(y - h) - 2][x] = c;\n    }\n\n    x += 2;\n  }\n\n  // Return string\n  var str = string(out, h);\n  return pad ? padding(str, pad) : str;\n}\n\n/**\n * Apply padding.\n */\n\nfunction padding(str, n) {\n  var linew = str.split('\\n')[0].length;\n  var line = Array(linew).join(' ') + '\\n';\n\n  // y\n  str = Array(n).join(line) + str;\n  str = str + Array(n).join(line);\n\n  // x\n  str = str.replace(/^/gm, Array(n).join(' '));\n  return str;\n}\n\n/**\n * Convert matrix to a string.\n */\n\nfunction string(out) {\n  var buf = [];\n\n  for (var i = 0; i < out.length; i++) {\n    buf.push(out[i].join(''));\n  }\n\n  return buf.join('\\n');\n}\n\n/**\n * Return max in array.\n */\n\nfunction max(data) {\n  var n = Math.abs(data[0]);\n\n  for (var i = 1; i < data.length; i++) {\n    n = Math.abs(data[i]) > n ? Math.abs(data[i]) : n;\n  }\n\n  return n;\n}\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"chart\",\n  \"version\": \"1.3.3\",\n  \"repository\": \"jstrace/chart\",\n  \"description\": \"Ascii bar chart\",\n  \"keywords\": [\n    \"ascii\",\n    \"chart\",\n    \"bar\",\n    \"stats\",\n    \"data\",\n    \"cli\",\n    \"terminal\"\n  ],\n  \"dependencies\": {\n    \"array-matrix\": \"1.0.0\"\n  },\n  \"devDependencies\": {\n    \"mocha\": \"*\",\n    \"should\": \"*\",\n    \"bytes\": \"~0.2.1\",\n    \"clear\": \"0.0.1\"\n  },\n  \"license\": \"MIT\"\n}\n"
  }
]