px2rem.js 2.74 KB
#!/usr/bin/env node

var program = require('commander');
var pkg = require('../package.json');
var Px2rem = require('../index');
var chalk = require('chalk');
var path = require('path');
var fs = require('fs-extra');


// string to variables of proper type(thanks to zepto)
function deserializeValue(value) {
  var num;
  try {
    return value ?
      value == "true" || value == true ||
      (value == "false" || value == false ? false :
        value == "null" ? null :
        !/^0/.test(value) && !isNaN(num = Number(value)) ? num :
        /^[\[\{]/.test(value) ? JSON.parse(value) :
        value)
      : value;
  } catch (e) {
    return value;
  }
}

function saveFile(filePath, content) {
  fs.createFileSync(filePath);
  fs.writeFileSync(filePath, content, {encoding: 'utf8'});
  console.log(chalk.green.bold('[Success]: ') + filePath);
}


program.version(pkg.version)
  .option('-u, --remUnit [value]', 'set `rem` unit value (default: 75)', 75)
  .option('-x, --threeVersion [value]', 'whether to generate @1x, @2x and @3x version stylesheet (default: false)', false)
  .option('-r, --remVersion [value]', 'whether to generate rem version stylesheet (default: true)', true)
  .option('-b, --baseDpr [value]', 'set base device pixel ratio (default: 2)', 2)
  .option('-p, --remPrecision [value]', 'set rem value precision (default: 6)', 6)
  .option('-o, --output [path]', 'the output file dirname')
  .parse(process.argv);

if (!program.args.length) {
  console.log(chalk.yellow.bold('[Info]: ') + 'No files to process!');
  return false;
}

var config = {
  remUnit: deserializeValue(program.remUnit),
  threeVersion: deserializeValue(program.threeVersion),
  remVersion: deserializeValue(program.remVersion),
  baseDpr: deserializeValue(program.baseDpr),
  remPrecision: deserializeValue(program.remPrecision)
};

var px2remIns = new Px2rem(config);

program.args.forEach(function (filePath) {

  if (path.extname(filePath) !== '.css') {
    return;
  }

  var cssText = fs.readFileSync(filePath, {encoding: 'utf8'});
  var outputPath = program.output || path.dirname(filePath);
  var fileName = path.basename(filePath);

  // generate @1x, @2x and @3x version stylesheet
  if (config.threeVersion) {
    for (var dpr = 1; dpr <= 3; dpr++) {
      var newCssText = px2remIns.generateThree(cssText, dpr);
      var newFileName = fileName.replace(/(.debug)?.css/, dpr + 'x.debug.css');
      var newFilepath = path.join(outputPath, newFileName);
      saveFile(newFilepath, newCssText);
    }
  }

  // generate rem version stylesheet
  if (config.remVersion) {
    var newCssText = px2remIns.generateRem(cssText);
    var newFileName = fileName.replace(/(.debug)?.css/, '.debug.css');
    var newFilepath = path.join(outputPath, newFileName);
    saveFile(newFilepath, newCssText);
  }
});