sprity/sprity

View on GitHub
lib/layout.js

Summary

Maintainability
A
1 hr
Test Coverage
'use strict';

var _ = require('lodash');
var layout = require('layout');
var through2 = require('through2');
var path = require('path');
var Err = require('./util/error');

var getOrientation = function (opt) {
  if (opt.orientation === 'vertical') {
    return 'top-down';
  }
  else {
    return opt.orientation === 'horizontal' ? 'left-right' : 'binary-tree';
  }
};

var getClassName = function (name, opt) {
  var sep = '';
  if (name === 'default') {
    name = '';
  }
  if (name.length > 0) {
    sep = '-';
  }
  if (opt.prefix) {
    return opt.prefix + sep + name;
  }
  else {
    return 'icon' + sep + name;
  }
};

var addTile = function (opt) {
  return function (tile, enc, cb) {
    if (tile instanceof Error) {
      cb(tile);
    }
    else {
      if (tile && tile.base && tile.width && tile.height) {
        var name = opt.split ? path.basename(tile.base) : 'default';
        if (!opt.layouts[name]) {
          opt.layouts[name] = layout(getOrientation(opt), {'sort': opt.sort});
        }
        var height = tile.height + 2 * opt.margin;
        var width = tile.width + 2 * opt.margin;
        opt.layouts[name].addItem({
          height: height,
          width: width,
          meta: tile
        });
      }
      cb();
    }
  };
};

var pushLayouts = function (opt) {
  return function (cb) {
    var stream = this;
    if (_.keys(opt.layouts).length === 0) {
      var e = new Err.LayoutError();
      stream.emit('error', e);
    }
    else {
      _.each(opt.layouts, function (l, key) {
        stream.push({
          name: key,
          classname: getClassName(key, opt),
          layout: l.export()
        });
      });
    }
    cb();
  };
};

module.exports = function (opt) {
  opt.layouts = {};
  return through2.obj(addTile(opt), pushLayouts(opt));
};