node-plantuml
Version:
A Node.js module and CLI for running PlantUML
240 lines (201 loc) • 5.01 kB
JavaScript
var plantumlExecutor = require('./plantuml-executor')
var fs = require('fs')
var stream = require('stream')
var util = require('util')
var path = require('path')
var plantumlEncoder = require('plantuml-encoder')
var DECODE = '-decodeurl'
var PIPE = '-pipe'
var UNICODE = '-tutxt'
var ASCII = '-ttxt'
var SVG = '-tsvg'
var EPS = '-eps'
var CONFIG = '-config'
var TESTDOT = '-testdot'
var DOT = '-graphvizdot'
var CHARSET = '-charset'
var CONFIGS = {
classic: path.join(__dirname, '../resources/classic.puml'),
monochrome: path.join(__dirname, '../resources/monochrome.puml')
}
module.exports.useNailgun = plantumlExecutor.useNailgun
function PlantumlEncodeStream () {
stream.Transform.call(this)
this.chunks = []
}
util.inherits(PlantumlEncodeStream, stream.Transform)
PlantumlEncodeStream.prototype._transform = function (chunk, encoding, done) {
this.chunks.push(chunk)
done()
}
PlantumlEncodeStream.prototype._flush = function (done) {
var uml = Buffer.concat(this.chunks).toString()
var encoded = plantumlEncoder.encode(uml)
this.push(Buffer.from(encoded, 'ascii'))
done()
}
function isPath (input) {
try {
fs.lstatSync(input)
return true
} catch (e) {
return false
}
}
function arrangeArguments (input, options, callback) {
if (typeof input === 'function') {
callback = input
input = undefined
} else {
if (typeof options === 'function') {
callback = options
options = undefined
}
if (typeof input !== 'string' && !(input instanceof String)) {
options = input
input = undefined
}
}
return {
input: input,
options: options,
callback: callback
}
}
function joinOptions (argv, options) {
options.format = options.format || 'png'
switch (options.format) {
case 'ascii':
argv.push(ASCII)
break
case 'unicode':
argv.push(UNICODE)
break
case 'svg':
argv.push(SVG)
break
case 'eps':
argv.push(EPS)
break
case 'png':
default:
break
}
if (options.config) {
var template = CONFIGS[options.config]
var file = template || options.config
argv.push(CONFIG)
argv.push(file)
}
if (options.dot) {
argv.push(DOT)
argv.push(options.dot)
}
if (options.charset) {
argv.push(CHARSET)
argv.push(options.charset)
}
return argv
}
function generateFromStdin (child) {
return {
in: child.stdin,
out: child.stdout
}
}
function generateFromFile (path, child) {
var rs = fs.createReadStream(path)
rs.pipe(child.stdin)
return {
out: child.stdout
}
}
function generateFromText (text, child) {
child.stdin.write(text)
child.stdin.end()
return {
out: child.stdout
}
}
module.exports.generate = function (input, options, callback) {
var args = arrangeArguments(input, options, callback)
input = args.input
options = args.options || {}
callback = args.callback
var o = joinOptions([PIPE], options)
var child = plantumlExecutor.exec(o, options.include, callback)
if (!input) {
return generateFromStdin(child)
} else {
if (isPath(input)) {
return generateFromFile(input, child)
} else {
return generateFromText(input, child)
}
}
}
function encodeFromStdin (encodeStream) {
return {
in: encodeStream,
out: encodeStream
}
}
function encodeFromFile (path, encodeStream) {
var rs = fs.createReadStream(path)
rs.pipe(encodeStream)
return {
out: encodeStream
}
}
function encodeFromText (text, encodeStream) {
encodeStream.write(text)
encodeStream.end()
return {
out: encodeStream
}
}
module.exports.encode = function (input, options, callback) {
var args = arrangeArguments(input, options, callback)
input = args.input
options = args.options || {}
callback = args.callback
var encodeStream = new PlantumlEncodeStream()
if (typeof callback === 'function') {
var chunks = []
encodeStream.on('data', function (chunk) { chunks.push(chunk) })
encodeStream.on('end', function () {
var data = Buffer.concat(chunks)
callback(null, data.toString())
})
}
if (!input) {
return encodeFromStdin(encodeStream)
} else {
if (isPath(input)) {
return encodeFromFile(input, encodeStream)
} else {
return encodeFromText(input, encodeStream)
}
}
}
module.exports.decode = function (encoded, callback) {
var child = plantumlExecutor.exec([DECODE, encoded], callback)
return {
out: child.stdout
}
}
module.exports.testdot = function (callback) {
var child = plantumlExecutor.exec([TESTDOT])
var chunks = []
child.stdout.on('data', function (chunk) { chunks.push(chunk) })
child.stdout.on('end', function () {
var data = Buffer.concat(chunks)
var dotOkCheck = 'Installation seems OK. File generation OK'
var dotOk = data.toString().indexOf(dotOkCheck) !== -1
if (typeof callback === 'function') callback(dotOk)
})
return {
out: child.stdout
}
}