Experimental UTF-8 -> CP437 (aka nix -> ansi) override to work around terms such as NR that report 'xterm' but want CP437
This commit is contained in:
parent
372494e376
commit
d5bd2d5adf
|
@ -56,6 +56,74 @@ function ansiDiscoverHomePosition(client, cb) {
|
||||||
client.term.write(`${ansi.goHome()}${ansi.queryPos()}`); // go home, query pos
|
client.term.write(`${ansi.goHome()}${ansi.queryPos()}`); // go home, query pos
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function ansiAttemptDetectUTF8(client, cb) {
|
||||||
|
//
|
||||||
|
// Trick to attempt and detect UTF-8. While there is a lot more than
|
||||||
|
// just UTF-8 and CP437, many those are the main concerns, when it comes
|
||||||
|
// terminals that for example tell us they are "xterm" but still want CP437.
|
||||||
|
//
|
||||||
|
// Try to detect UTF-8 by discovering the cursor position, writing some
|
||||||
|
// multi-byte UTF-8, and checking the position again. If the term is really
|
||||||
|
// UTF-8, we should get a proper position, otherwise we'll be further out.
|
||||||
|
//
|
||||||
|
// We currently only do this if the term hasn't already been ID'd as a
|
||||||
|
// "*nix" terminal -- that is, xterm, etc.
|
||||||
|
//
|
||||||
|
if(!client.term.isNixTerm()) {
|
||||||
|
return cb(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
let posStage = 1;
|
||||||
|
let initialPosition;
|
||||||
|
let giveUpTimer;
|
||||||
|
|
||||||
|
const giveUp = () => {
|
||||||
|
client.removeListener('cursor position report', cprListener);
|
||||||
|
clearTimeout(giveUpTimer);
|
||||||
|
return cb(null);
|
||||||
|
};
|
||||||
|
|
||||||
|
const ASCIIPortion = ' Character encoding detection ';
|
||||||
|
|
||||||
|
const cprListener = (pos) => {
|
||||||
|
switch(posStage) {
|
||||||
|
case 1 :
|
||||||
|
posStage = 2;
|
||||||
|
|
||||||
|
initialPosition = pos;
|
||||||
|
clearTimeout(giveUpTimer);
|
||||||
|
|
||||||
|
giveUpTimer = setTimeout( () => {
|
||||||
|
return giveUp();
|
||||||
|
}, 2000);
|
||||||
|
|
||||||
|
client.once('cursor position report', cprListener);
|
||||||
|
client.term.rawWrite(`\u9760${ASCIIPortion}\u9760`); // Unicode skulls on each side
|
||||||
|
client.term.rawWrite(ansi.queryPos());
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 2 :
|
||||||
|
{
|
||||||
|
clearTimeout(giveUpTimer);
|
||||||
|
const len = pos[1] - initialPosition[1];
|
||||||
|
if(!isNaN(len) && len >= ASCIIPortion.length + 6) { // CP437 displays 3 chars each Unicode skull
|
||||||
|
client.log.info('Terminal identified as UTF-8 but does not appear to be. Overriding to "ansi".');
|
||||||
|
client.setTermType('ansi');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return cb(null);
|
||||||
|
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
giveUpTimer = setTimeout( () => {
|
||||||
|
return giveUp();
|
||||||
|
}, 2000);
|
||||||
|
|
||||||
|
client.once('cursor position report', cprListener);
|
||||||
|
client.term.rawWrite(ansi.goHome() + ansi.queryPos());
|
||||||
|
}
|
||||||
|
|
||||||
function ansiQueryTermSizeIfNeeded(client, cb) {
|
function ansiQueryTermSizeIfNeeded(client, cb) {
|
||||||
if(client.term.termHeight > 0 || client.term.termWidth > 0) {
|
if(client.term.termHeight > 0 || client.term.termWidth > 0) {
|
||||||
return cb(null);
|
return cb(null);
|
||||||
|
@ -164,7 +232,7 @@ function connectEntry(client, nextMenu) {
|
||||||
// We still don't have something good for term height/width.
|
// We still don't have something good for term height/width.
|
||||||
// Default to DOS size 80x25.
|
// Default to DOS size 80x25.
|
||||||
//
|
//
|
||||||
// :TODO: Netrunner is currenting hitting this and it feels wrong. Why is NAWS/ENV/CPR all failing???
|
// :TODO: Netrunner is currently hitting this and it feels wrong. Why is NAWS/ENV/CPR all failing???
|
||||||
client.log.warn( { reason : err.message }, 'Failed to negotiate term size; Defaulting to 80x25!');
|
client.log.warn( { reason : err.message }, 'Failed to negotiate term size; Defaulting to 80x25!');
|
||||||
|
|
||||||
term.termHeight = 25;
|
term.termHeight = 25;
|
||||||
|
@ -175,6 +243,9 @@ function connectEntry(client, nextMenu) {
|
||||||
return callback(null);
|
return callback(null);
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
function checkUtf8IfNeeded(callback) {
|
||||||
|
return ansiAttemptDetectUTF8(client, callback);
|
||||||
|
}
|
||||||
],
|
],
|
||||||
() => {
|
() => {
|
||||||
prepareTerminal(term);
|
prepareTerminal(term);
|
||||||
|
|
Loading…
Reference in New Issue