123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273 |
- #!/usr/bin/env node
- var path = require('path')
- var fs = require('fs')
- var chalk = require('chalk')
- var mkdirp = require('mkdirp')
- var postcss = require('postcss')
- var rtlcss = require('../lib/rtlcss')
- var configLoader = require('../lib/config-loader')
- var input, output, directory, ext, config, currentErrorcode, arg
- var args = process.argv.slice(2)
- var shouldBreak = false
- process.on('exit', function () { process.reallyExit(currentErrorcode) })
- function printWarning () {
- console.warn(chalk.yellow.apply(this, printWarning.arguments))
- }
- function printInfo () {
- console.info(chalk.green.apply(this, printInfo.arguments))
- }
- function printError () {
- console.error(chalk.red.apply(this, printError.arguments))
- }
- function printHelp () {
- console.log('Usage: rtlcss [option option=parameter ...] [source] [destination]')
- console.log('')
- /*eslint-disable*/
- var options = [
- 'Option ' , 'Description ',
- '--------------', '----------------------------------------------',
- '-h,--help' , 'Print help (this message) and exit.',
- '-v,--version' , 'Print version number and exit.',
- '-c,--config' , 'Path to configuration settings file.',
- '- ,--stdin' , 'Read from stdin stream.',
- '-d,--dirctory' , 'Process all *.css files from input directory (recursive).',
- '-e,--ext' , 'Used with -d option to set the output files extension.\n\t\t Default: ".rtl.css".',
- '-s,--silent' , 'Silent mode, no warnings or errors are printed.'
- ]
- /*eslint-enable */
- for (var x = 0; x < options.length; x++) {
- console.log(options[x++], '\t', options[x])
- }
- console.log('')
- console.log('*If no destination is specified, output will be written to the same input folder as {source}.rtl.{ext}')
- console.log('')
- printInfo('RTLCSS version: ' + require('../package.json').version)
- printInfo('Report issues to: https://github.com/MohammadYounes/rtlcss/issues')
- }
- while ((arg = args.shift())) {
- switch (arg) {
- case '-h':
- case '--help':
- printHelp()
- shouldBreak = true
- break
- case '-v':
- case '--version':
- printInfo('rtlcss version: ' + require('../package.json').version)
- shouldBreak = true
- break
- case '-c':
- case '--config':
- arg = args.shift()
- try {
- config = configLoader.load(path.resolve(arg))
- } catch (e) {
- printError('rtlcss: invalid config file. ', e)
- shouldBreak = true
- currentErrorcode = 1
- }
- break
- case '-d':
- case '--directory':
- directory = true
- break
- case '-e':
- case '--ext':
- ext = args.shift()
- break
- case '-s':
- case '--silent':
- console.log = console.info = console.warn = function () {}
- break
- case '-':
- case '--stdin':
- input = '-'
- break
- default:
- if (arg[0] === '-') {
- printError('rtlcss: unknown option. ' + arg)
- shouldBreak = true
- } else {
- if (!input) {
- input = path.resolve(arg)
- } else if (!output) {
- output = path.resolve(arg)
- }
- }
- break
- }
- }
- if (!shouldBreak) {
- if (!directory && !input) {
- printError('rtlcss: no input file')
- console.log('')
- printHelp()
- shouldBreak = true
- }
- if (!config && input !== '-') {
- try {
- var cwd = input
- if (directory !== true) {
- cwd = path.dirname(input)
- }
- config = configLoader.load(null, cwd)
- } catch (e) {
- printError('rtlcss: invalid config file. ', e)
- currentErrorcode = 1
- shouldBreak = true
- }
- }
- }
- if (!shouldBreak) {
- if (!output && input !== '-') {
- if (directory !== true) {
- output = path.extname(input) ? input.replace(/\.[^.]*$/, function (ext) { return '.rtl' + ext }) : input + '.rtl'
- } else {
- output = input
- }
- }
- var processCSSFile = function (e, data, outputName) {
- if (e) {
- printError('rtlcss: ' + e.message)
- return
- }
- var result
- var opt = { map: false }
- if (input !== '-') {
- opt.from = input
- opt.to = output
- }
- if (!config) {
- printWarning('rtlcss: Warning! No config present, using defaults.')
- result = postcss([rtlcss]).process(data, opt)
- } else {
- if ('map' in config === true && input !== '-') {
- opt.map = config.map
- }
- result = postcss([rtlcss.configure(config)]).process(data, opt)
- }
- if (output) {
- var savePath = outputName
- if (directory !== true) {
- savePath = output
- }
- printInfo('Saving:', savePath)
- fs.writeFile(savePath, result.css, 'utf8', function (err) { err && printError(err) })
- if (result.map) {
- fs.writeFile(savePath + '.map', result.map, 'utf8', function (err) { err && printError(err) })
- }
- } else {
- console.log(result.css)
- }
- }
- var walk = function (dir, done) {
- fs.readdir(dir, function (error, list) {
- if (error) {
- return done(error)
- }
- var i = 0
- ;(function next () {
- var file = list[i++]
- if (!file) {
- return done(null)
- }
- file = dir + path.sep + file
- fs.stat(file, function (err, stat) {
- if (err) {
- printError(err)
- } else if (stat && stat.isDirectory()) {
- walk(file, function (err) {
- if (err) {
- printError(err)
- } else {
- next()
- }
- })
- } else {
- // process only *.css
- if (/\.(css)$/.test(file)) {
- // compute output directory
- var relativePath = path.relative(input, file).split(path.sep)
- relativePath.pop()
- relativePath.push(path.basename(file).replace('.css', ext || '.rtl.css'))
- // set rtl file name
- var rtlFile = path.join(output, relativePath.join(path.sep))
- // create output directory if it does not exist
- var dirName = path.dirname(rtlFile)
- if (!fs.existsSync(dirName)) {
- mkdirp.sync(dirName)
- }
- // read and process the file.
- fs.readFile(file, 'utf8', function (e, data) {
- try {
- processCSSFile(e, data, rtlFile)
- } catch (e) {
- printError('rtlcss: error processing file', file)
- printError(e)
- }
- })
- }
- next()
- }
- })
- })()
- })
- }
- if (input !== '-') {
- if (directory !== true) {
- fs.stat(input, function (error, stat) {
- if (error) {
- printError(error)
- } else if (stat && stat.isDirectory()) {
- printError('rtlcss: Input expected to be a file, use -d option to process a directory.')
- } else {
- fs.readFile(input, 'utf8', function (e, data) {
- try {
- processCSSFile(e, data)
- } catch (e) {
- printError('rtlcss: error processing file', input)
- printError(e)
- }
- })
- }
- })
- } else {
- walk(input, function (error) {
- if (error) {
- printError('rtlcss: ' + error)
- }
- })
- }
- } else {
- process.stdin.resume()
- process.stdin.setEncoding('utf8')
- var buffer = ''
- process.stdin.on('data', function (data) {
- buffer += data
- })
- process.on('SIGINT', function () {
- processCSSFile(false, buffer)
- process.exit()
- })
- process.stdin.on('end', function () {
- processCSSFile(false, buffer)
- })
- }
- }
|