不正确的字符串解析

问题描述:

我想将控制台输出的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 

希望这其中的一些是有道理的。

谢谢

+0

从哪里得到ANSI字符串?一份文件?标准输入?在代码中进行硬编码? – slebetman

试过吗?

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)