mirror of https://github.com/IoTcat/Ushio-js.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
149 lines
3.9 KiB
149 lines
3.9 KiB
5 years ago
|
#!/usr/bin/env node
|
||
|
|
||
|
/**
|
||
|
* UglifyCSS
|
||
|
* Port of YUI CSS Compressor to NodeJS
|
||
|
* Author: Franck Marcia - https://github.com/fmarcia
|
||
|
* MIT licenced
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* cssmin.js
|
||
|
* Author: Stoyan Stefanov - http://phpied.com/
|
||
|
* This is a JavaScript port of the CSS minification tool
|
||
|
* distributed with YUICompressor, itself a port
|
||
|
* of the cssmin utility by Isaac Schlueter - http://foohack.com/
|
||
|
* Permission is hereby granted to use the JavaScript version under the same
|
||
|
* conditions as the YUICompressor (original YUICompressor note below).
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* YUI Compressor
|
||
|
* http://developer.yahoo.com/yui/compressor/
|
||
|
* Author: Julien Lecomte - http://www.julienlecomte.net/
|
||
|
* Copyright (c) 2011 Yahoo! Inc. All rights reserved.
|
||
|
* The copyrights embodied in the content of this file are licensed
|
||
|
* by Yahoo! Inc. under the BSD (revised) open source license.
|
||
|
*/
|
||
|
|
||
|
const { defaultOptions, processString, processFiles } = require('./')
|
||
|
const { writeFileSync } = require('fs')
|
||
|
|
||
|
const UGLIFYCSS_VERSION = '0.0.29'
|
||
|
|
||
|
// Info namespace
|
||
|
const info = {}
|
||
|
|
||
|
// Print usage
|
||
|
info.help = _ => {
|
||
|
console.log(`
|
||
|
Usage: uglifycss [options] file1.css [file2.css [...]] > output
|
||
|
options:
|
||
|
--max-line-len n add a newline every n characters
|
||
|
--expand-vars expand variables
|
||
|
--ugly-comments remove newlines within preserved comments
|
||
|
--cute-comments preserve newlines within and around preserved comments
|
||
|
--convert-urls d convert relative urls using the d directory as location target
|
||
|
--debug print full error stack on error
|
||
|
--output f put the result in f file
|
||
|
--help show this help
|
||
|
--version display version number`
|
||
|
.replace(/^\s+/gm, '')
|
||
|
)
|
||
|
}
|
||
|
|
||
|
// Print version
|
||
|
info.version = _ => {
|
||
|
console.log(`uglifycss ${UGLIFYCSS_VERSION}`)
|
||
|
}
|
||
|
|
||
|
// Transform strings like "the-parameter" to "theParameter"
|
||
|
const par2var = param =>
|
||
|
param.replace(
|
||
|
/-(.)/g,
|
||
|
(_, ch) => ch === '-' ? '' : ch.toUpperCase()
|
||
|
)
|
||
|
|
||
|
|
||
|
// Parse parameters from command line
|
||
|
const parseArguments = argv => {
|
||
|
|
||
|
const params = {
|
||
|
options: defaultOptions,
|
||
|
files: []
|
||
|
}
|
||
|
|
||
|
const len = argv.length
|
||
|
|
||
|
for (let i = 2; i < len; i += 1) {
|
||
|
|
||
|
// get "propertyName" from "--argument-name"
|
||
|
let v = par2var(argv[i])
|
||
|
|
||
|
// boolean parameters
|
||
|
if (typeof params.options[v] === 'boolean') {
|
||
|
params.options[v] = true
|
||
|
|
||
|
// string parameter
|
||
|
} else if (typeof params.options[v] === 'string') {
|
||
|
params.options[v] = argv[i + 1] || ''
|
||
|
i += 1
|
||
|
|
||
|
// integer parameter
|
||
|
} else if (typeof params.options[v] !== 'undefined') {
|
||
|
params.options[v] = parseInt(argv[i + 1], 10)
|
||
|
i += 1
|
||
|
|
||
|
// help
|
||
|
} else if (argv[i] === '--help') {
|
||
|
return 'help'
|
||
|
|
||
|
// version
|
||
|
} else if (argv[i] === '--version') {
|
||
|
return 'version'
|
||
|
|
||
|
// file
|
||
|
} else {
|
||
|
params.files.push(argv[i])
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return params
|
||
|
}
|
||
|
|
||
|
// Entry
|
||
|
{
|
||
|
// parameters
|
||
|
const params = parseArguments(process.argv)
|
||
|
|
||
|
// info
|
||
|
if (params === 'help' || params === 'version') {
|
||
|
return info[params]()
|
||
|
}
|
||
|
|
||
|
// files
|
||
|
if (params.files.length) {
|
||
|
const ugly = processFiles(params.files, params.options)
|
||
|
if (params.options.output) {
|
||
|
return writeFileSync(params.options.output, ugly)
|
||
|
} else {
|
||
|
return console.log(ugly)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// no file, no stdin: help
|
||
|
if (process.stdin.isTTY) {
|
||
|
return info.help()
|
||
|
}
|
||
|
|
||
|
// stdin
|
||
|
if (params.options.convertUrls) {
|
||
|
return console.error('uglifycss: stdin input and --convert-urls are not compatible')
|
||
|
}
|
||
|
let content = ''
|
||
|
process.stdin.on('data', part => content += part)
|
||
|
process.stdin.on('end', _ =>
|
||
|
console.log(processString(content, params.options))
|
||
|
)
|
||
|
}
|