不正确的字符串解析
问题描述:
我想将控制台输出的ansi色码转换为HTML。我有一个脚本来做到这一点,但我似乎无法让它解析节点js内的字符串。我曾尝试过JSON.stringify它也包括特殊字符,但它不工作。不正确的字符串解析
forever list
[32minfo[39m: Forever processes running
[90mscript[39m [37mforever[39m [37mpid[39m [37mid[39m
[90mdata[39m: [37m [39m [37muid[39m [90mcommand[39m
我从节点js中的ssh2shell获得这样的输出。我有一个脚本: https://github.com/pixelb/scripts/blob/master/scripts/ansi2html.sh
这是应该将上述转换为html并添加适当的颜色代码。它正常工作正常终端输出为例:
npm install --color=always | ansi2html.sh > npminstall.html
这是在Linux机器上输出到文件的原始输出。看起来JS字符串在console.log中显示时缺少这些转义符,但它们也缺少换行符。也许它是因为我把它们直接连接到字符串并删除特殊字符?
total 24
-rwxr-xr-x 1 admin admin 17002 May 13 02:52 ^[[0m^[[38;5;34mansi2html.sh^[[0m
drwxr-xr-x 4 admin admin 4096 May 13 00:00 ^[[38;5;27mgit^[[0m
-rw-r--r-- 1 admin admin 0 May 13 02:57 ls.html
希望这其中的一些是有道理的。
谢谢
答
试过吗?
https://github.com/hughsk/ansi-html-stream
var spawn = require('child_process').spawn
, ansi = require('ansi-html-stream')
, fs = require('fs')
var npm = spawn('npm', ['install', 'browserify', '--color', 'always'], {
cwd: process.cwd()
})
var stream = ansi({ chunked: false })
, file = fs.createWriteStream('browserify.html', 'utf8')
npm.stdout.pipe(stream)
npm.stderr.pipe(stream)
stream.pipe(file, { end: false })
stream.once('end', function() {
file.end('</pre>\n')
})
file.write('<pre>\n');
答
有一对夫妇的过滤器,SSH2shell适用于来自命令的输出。第一个从响应中删除非标准ASCII,然后移除颜色格式代码。
在v1.6.0中,我添加了pipe()/ unpipe(),两者的事件并暴露了stream.on('data',function(data){})事件,因此您可以直接访问流输出没有SSH2shell以任何方式与它进行交互。 这应该通过给你访问原始数据来解决从SSH2shell获得正确输出的问题。
var fs = require('fs')
var host = {
server: {
host: mydomain.com,
port: 22,
userName: user,
password: password:)
},
commands: [
"`Test session text message: passed`",
"msg:console test notification: passed",
"ls -la"
],
}
//until npm published use the cloned dir path.
var SSH2Shell = require ('ssh2shell')
//run the commands in the shell session
var SSH = new SSH2Shell(host),
callback = function(sessionText){
console.log ("-----Callback session text:\n" + sessionText);
console.log ("-----Callback end");
},
firstLog = fs.createWriteStream('first.log'),
secondLog = fs.createWriteStream('second.log'),
buffer = ""
//multiple pipes can be added but they wont be bound to the stream until the connection is established
SSH.pipe(firstLog).pipe(secondLog);
SSH.on('data', function(data){
//do something with the data chunk
console.log(data)
})
SSH.connect(callback)
从哪里得到ANSI字符串?一份文件?标准输入?在代码中进行硬编码? – slebetman