* predefined_mci.js: General method for resolving MCI codes -> string
* Changed MCI resolution to use object to function mapping so entries not yet available would not be executed * enigmaToAnsi() can now (optionally) resolve MCI codes * pipeWrite() resolves MCI codes
This commit is contained in:
parent
870e5a9136
commit
6b03b5357f
|
@ -138,7 +138,7 @@ ClientTerminal.prototype.rawWrite = function(s) {
|
||||||
};
|
};
|
||||||
|
|
||||||
ClientTerminal.prototype.pipeWrite = function(s) {
|
ClientTerminal.prototype.pipeWrite = function(s) {
|
||||||
this.write(enigmaToAnsi(s));
|
this.write(enigmaToAnsi(s, this));
|
||||||
};
|
};
|
||||||
|
|
||||||
ClientTerminal.prototype.encode = function(s, convertLineFeeds) {
|
ClientTerminal.prototype.encode = function(s, convertLineFeeds) {
|
||||||
|
|
|
@ -1,9 +1,11 @@
|
||||||
/* jslint node: true */
|
/* jslint node: true */
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
var ansi = require('./ansi_term.js');
|
var ansi = require('./ansi_term.js');
|
||||||
|
var getPredefinedMCIValue = require('./predefined_mci.js').getPredefinedMCIValue;
|
||||||
|
|
||||||
var assert = require('assert');
|
var assert = require('assert');
|
||||||
|
var _ = require('lodash');
|
||||||
|
|
||||||
exports.pipeToAnsi = exports.enigmaToAnsi = enigmaToAnsi;
|
exports.pipeToAnsi = exports.enigmaToAnsi = enigmaToAnsi;
|
||||||
exports.stripPipeCodes = exports.stripEnigmaCodes = stripEnigmaCodes;
|
exports.stripPipeCodes = exports.stripEnigmaCodes = stripEnigmaCodes;
|
||||||
|
@ -21,13 +23,13 @@ exports.renegadeToAnsi = renegadeToAnsi;
|
||||||
// * fromWWIV(): <ctrl-c><0-7>
|
// * fromWWIV(): <ctrl-c><0-7>
|
||||||
// * fromSyncronet(): <ctrl-a><colorCode>
|
// * fromSyncronet(): <ctrl-a><colorCode>
|
||||||
// See http://wiki.synchro.net/custom:colors
|
// See http://wiki.synchro.net/custom:colors
|
||||||
function enigmaToAnsi(s) {
|
function enigmaToAnsi(s, client) {
|
||||||
if(-1 == s.indexOf('|')) {
|
if(-1 == s.indexOf('|')) {
|
||||||
return s; // no pipe codes present
|
return s; // no pipe codes present
|
||||||
}
|
}
|
||||||
|
|
||||||
var result = '';
|
var result = '';
|
||||||
var re = /\|(\d{2}|\|)/g;
|
var re = /\|([A-Z\d]{2}|\|)/g;
|
||||||
var m;
|
var m;
|
||||||
var lastIndex = 0;
|
var lastIndex = 0;
|
||||||
while((m = re.exec(s))) {
|
while((m = re.exec(s))) {
|
||||||
|
@ -41,22 +43,33 @@ function enigmaToAnsi(s) {
|
||||||
// convert to number
|
// convert to number
|
||||||
val = parseInt(val, 10);
|
val = parseInt(val, 10);
|
||||||
if(isNaN(val)) {
|
if(isNaN(val)) {
|
||||||
val = 0;
|
//
|
||||||
|
// ENiGMA MCI code? Only available if |client|
|
||||||
|
// is supplied.
|
||||||
|
//
|
||||||
|
console.log('attempting to resolve ' + m[1])
|
||||||
|
val = getPredefinedMCIValue(client, m[1]) || ('|' + m[1]); // value itself or literal
|
||||||
|
console.log(val)
|
||||||
}
|
}
|
||||||
|
|
||||||
assert(val >= 0 && val <= 47);
|
if(_.isString(val)) {
|
||||||
|
result += s.substr(lastIndex, m.index - lastIndex) + val;
|
||||||
|
} else {
|
||||||
|
assert(val >= 0 && val <= 47);
|
||||||
|
|
||||||
var attr = '';
|
var attr = '';
|
||||||
if(7 == val) {
|
if(7 == val) {
|
||||||
attr = ansi.sgr('normal');
|
attr = ansi.sgr('normal');
|
||||||
} else if (val < 7 || val >= 16) {
|
} else if (val < 7 || val >= 16) {
|
||||||
attr = ansi.sgr(['normal', val]);
|
attr = ansi.sgr(['normal', val]);
|
||||||
} else if (val <= 15) {
|
} else if (val <= 15) {
|
||||||
attr = ansi.sgr(['normal', val - 8, 'bold']);
|
attr = ansi.sgr(['normal', val - 8, 'bold']);
|
||||||
}
|
}
|
||||||
|
|
||||||
result += s.substr(lastIndex, m.index - lastIndex) + attr;
|
result += s.substr(lastIndex, m.index - lastIndex) + attr;
|
||||||
lastIndex = re.lastIndex;
|
}
|
||||||
|
|
||||||
|
lastIndex = re.lastIndex;
|
||||||
}
|
}
|
||||||
|
|
||||||
result = (0 === result.length ? s : result + s.substr(lastIndex));
|
result = (0 === result.length ? s : result + s.substr(lastIndex));
|
||||||
|
@ -65,7 +78,7 @@ function enigmaToAnsi(s) {
|
||||||
}
|
}
|
||||||
|
|
||||||
function stripEnigmaCodes(s) {
|
function stripEnigmaCodes(s) {
|
||||||
return s.replace(/\|[\d]{2}/g, '');
|
return s.replace(/\|[A-Z\d]{2}/g, '');
|
||||||
}
|
}
|
||||||
|
|
||||||
function enigmaStrLen(s) {
|
function enigmaStrLen(s) {
|
||||||
|
|
|
@ -86,9 +86,9 @@ function prepareTerminal(term) {
|
||||||
function displayBanner(term) {
|
function displayBanner(term) {
|
||||||
// :TODO: add URL(s) to banner
|
// :TODO: add URL(s) to banner
|
||||||
term.pipeWrite(
|
term.pipeWrite(
|
||||||
('|33Conected to |32EN|33|01i|00|32|22GMA|32|01½|00 |33BBS version|31|01 {0}\n' +
|
'|33Conected to |32EN|33|01i|00|32|22GMA|32|01½|00 |33BBS version|31|01 |VN\n' +
|
||||||
'|00|33Copyright (c) 2014-2015 Bryan Ashby |33|01- |31|01http://l33t.codes/\n' +
|
'|00|33Copyright (c) 2014-2015 Bryan Ashby |33|01- |31|01http://l33t.codes/\n' +
|
||||||
'|00').format(packageJson.version));
|
'|00');
|
||||||
}
|
}
|
||||||
|
|
||||||
function connectEntry(client) {
|
function connectEntry(client) {
|
||||||
|
|
|
@ -11,17 +11,13 @@ var ToggleMenuView = require('./toggle_menu_view.js').ToggleMenuView;
|
||||||
var MaskEditTextView = require('./mask_edit_text_view.js').MaskEditTextView;
|
var MaskEditTextView = require('./mask_edit_text_view.js').MaskEditTextView;
|
||||||
var StatusBarView = require('./status_bar_view.js').StatusBarView;
|
var StatusBarView = require('./status_bar_view.js').StatusBarView;
|
||||||
var MultiLineEditTextView = require('./multi_line_edit_text_view.js').MultiLineEditTextView;
|
var MultiLineEditTextView = require('./multi_line_edit_text_view.js').MultiLineEditTextView;
|
||||||
var getMessageAreaByName = require('./message_area.js').getMessageAreaByName;
|
var getPredefinedMCIValue = require('./predefined_mci.js').getPredefinedMCIValue;
|
||||||
|
|
||||||
var Config = require('./config.js').config;
|
|
||||||
var ansi = require('./ansi_term.js');
|
var ansi = require('./ansi_term.js');
|
||||||
|
|
||||||
var packageJson = require('../package.json');
|
var packageJson = require('../package.json');
|
||||||
|
|
||||||
var assert = require('assert');
|
var assert = require('assert');
|
||||||
var os = require('os');
|
|
||||||
var _ = require('lodash');
|
var _ = require('lodash');
|
||||||
var moment = require('moment');
|
|
||||||
|
|
||||||
exports.MCIViewFactory = MCIViewFactory;
|
exports.MCIViewFactory = MCIViewFactory;
|
||||||
|
|
||||||
|
@ -29,94 +25,6 @@ function MCIViewFactory(client) {
|
||||||
this.client = client;
|
this.client = client;
|
||||||
}
|
}
|
||||||
|
|
||||||
// :TODO: This portion should be made more generic so pipe code formatting can use it!
|
|
||||||
// e..g MCIPrint() -> enigmaToAnsi() ->
|
|
||||||
MCIViewFactory.prototype.getPredefinedViewLabel = function(code) {
|
|
||||||
|
|
||||||
var self = this;
|
|
||||||
|
|
||||||
function getMessageAreaDescription() {
|
|
||||||
var area = getMessageAreaByName(self.client.user.properties.message_area_name);
|
|
||||||
return area ? area.desc : '';
|
|
||||||
}
|
|
||||||
|
|
||||||
function getCurrentMenuDescription() {
|
|
||||||
return _.has(self, 'client.currentMenuModule.menuConfig.desc') ? self.client.currentMenuModule.menuConfig.desc : '';
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
return {
|
|
||||||
BN : Config.general.boardName,
|
|
||||||
VL : 'ENiGMA½ v' + packageJson.version,
|
|
||||||
VN : packageJson.version,
|
|
||||||
|
|
||||||
UN : this.client.user.username,
|
|
||||||
UI : this.client.user.userId.toString(),
|
|
||||||
UG : _.values(this.client.user.groups).join(', '),
|
|
||||||
UR : this.client.user.properties.real_name,
|
|
||||||
LO : this.client.user.properties.location,
|
|
||||||
UA : this.client.user.getAge().toString(),
|
|
||||||
UB : moment(this.client.user.properties.birthdate).format(this.client.currentTheme.helpers.getDateFormat()),
|
|
||||||
US : this.client.user.properties.sex,
|
|
||||||
UE : this.client.user.properties.email_address,
|
|
||||||
UW : this.client.user.properties.web_address,
|
|
||||||
UF : this.client.user.properties.affiliation,
|
|
||||||
UT : this.client.user.properties.theme_id,
|
|
||||||
UC : this.client.user.properties.login_count.toString(),
|
|
||||||
|
|
||||||
MS : moment(this.client.user.properties.account_created).format(this.client.currentTheme.helpers.getDateFormat()),
|
|
||||||
CS : this.client.currentStatus,
|
|
||||||
MD : getCurrentMenuDescription(),
|
|
||||||
|
|
||||||
MA : getMessageAreaDescription(),
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
SH : this.client.term.termHeight.toString(),
|
|
||||||
SW : this.client.term.termWidth.toString(),
|
|
||||||
|
|
||||||
ND : this.client.node.toString(),
|
|
||||||
|
|
||||||
// :TODO: change to CD for 'Current Date'
|
|
||||||
DT : moment().format(this.client.currentTheme.helpers.getDateFormat()),
|
|
||||||
CT : moment().format(this.client.currentTheme.helpers.getTimeFormat()),
|
|
||||||
|
|
||||||
|
|
||||||
OS : {
|
|
||||||
linux : 'Linux',
|
|
||||||
darwin : 'Mac OS X',
|
|
||||||
win32 : 'Windows',
|
|
||||||
sunos : 'SunOS',
|
|
||||||
freebsd : 'FreeBSD',
|
|
||||||
}[os.platform()] || os.type(),
|
|
||||||
|
|
||||||
OA : os.arch(),
|
|
||||||
SC : os.cpus()[0].model,
|
|
||||||
|
|
||||||
IP : this.client.address().address,
|
|
||||||
}[code];
|
|
||||||
} catch(e) {
|
|
||||||
this.client.log.warn( { code : code, exception : e.message }, 'Exception caught attempting to construct predefined label');
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
MCIViewFactory.getUserViewClass = function(code) {
|
|
||||||
return {
|
|
||||||
TL : TextView,
|
|
||||||
ET : EditTextView,
|
|
||||||
ME : MaskEditTextView,
|
|
||||||
MT : MultiLineEditTextView,
|
|
||||||
PL : TextView,
|
|
||||||
BT : ButtonView,
|
|
||||||
VM : VerticalMenuView,
|
|
||||||
HM : HorizontalMenuView,
|
|
||||||
SM : SpinnerMenuView,
|
|
||||||
TM : ToggleMenuView,
|
|
||||||
}[code];
|
|
||||||
};
|
|
||||||
*/
|
|
||||||
|
|
||||||
MCIViewFactory.UserViewCodes = [
|
MCIViewFactory.UserViewCodes = [
|
||||||
'TL', 'ET', 'ME', 'MT', 'PL', 'BT', 'VM', 'HM', 'SM', 'TM'
|
'TL', 'ET', 'ME', 'MT', 'PL', 'BT', 'VM', 'HM', 'SM', 'TM'
|
||||||
];
|
];
|
||||||
|
@ -202,7 +110,7 @@ MCIViewFactory.prototype.createFromMCI = function(mci) {
|
||||||
// Pre-defined Label (Text View)
|
// Pre-defined Label (Text View)
|
||||||
case 'PL' :
|
case 'PL' :
|
||||||
if(mci.args.length > 0) {
|
if(mci.args.length > 0) {
|
||||||
options.text = this.getPredefinedViewLabel(mci.args[0]);
|
options.text = getPredefinedMCIValue(this.client, mci.args[0]);
|
||||||
if(options.text) {
|
if(options.text) {
|
||||||
setOption(1, 'textStyle');
|
setOption(1, 'textStyle');
|
||||||
setOption(2, 'justify');
|
setOption(2, 'justify');
|
||||||
|
@ -272,7 +180,7 @@ MCIViewFactory.prototype.createFromMCI = function(mci) {
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default :
|
default :
|
||||||
options.text = this.getPredefinedViewLabel(mci.code);
|
options.text = getPredefinedMCIValue(this.client, mci.code);
|
||||||
if(_.isString(options.text)) {
|
if(_.isString(options.text)) {
|
||||||
setWidth(0);
|
setWidth(0);
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,84 @@
|
||||||
|
/* jslint node: true */
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
var Config = require('./config.js').config;
|
||||||
|
var Log = require('./logger.js').log;
|
||||||
|
var getMessageAreaByName = require('./message_area.js').getMessageAreaByName;
|
||||||
|
|
||||||
|
var packageJson = require('../package.json');
|
||||||
|
var assert = require('assert');
|
||||||
|
var os = require('os');
|
||||||
|
var _ = require('lodash');
|
||||||
|
var moment = require('moment');
|
||||||
|
|
||||||
|
exports.getPredefinedMCIValue = getPredefinedMCIValue;
|
||||||
|
|
||||||
|
function getPredefinedMCIValue(client, code) {
|
||||||
|
|
||||||
|
if(!client || !code) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
return {
|
||||||
|
BN : function boardName() { return Config.general.boardName },
|
||||||
|
VL : function versionLabel() { return 'ENiGMA½ v' + packageJson.version },
|
||||||
|
VN : function version() { return packageJson.version },
|
||||||
|
|
||||||
|
UN : function userName() { return client.user.username },
|
||||||
|
UI : function userId() { return client.user.userId.toString() },
|
||||||
|
UG : function groups() { return _.values(client.user.groups).join(', ') },
|
||||||
|
UR : function realName() { return client.user.properties.real_name },
|
||||||
|
LO : function location() { return client.user.properties.location },
|
||||||
|
UA : function age() { return client.user.getAge().toString() },
|
||||||
|
UB : function birthdate() { return moment(client.user.properties.birthdate).format(client.currentTheme.helpers.getDateFormat()) },
|
||||||
|
US : function sex() { return client.user.properties.sex },
|
||||||
|
UE : function emailAddres() { return client.user.properties.email_address },
|
||||||
|
UW : function webAddress() { return client.user.properties.web_address },
|
||||||
|
UF : function affils() { return client.user.properties.affiliation },
|
||||||
|
UT : function themeId() { return client.user.properties.theme_id },
|
||||||
|
UC : function loginCount() { return client.user.properties.login_count.toString() },
|
||||||
|
|
||||||
|
MS : function accountCreated() { return moment(client.user.properties.account_created).format(client.currentTheme.helpers.getDateFormat()) },
|
||||||
|
CS : function currentStatus() { return client.currentStatus },
|
||||||
|
|
||||||
|
MD : function currentMenuDescription() {
|
||||||
|
return _.has(self, 'client.currentMenuModule.menuConfig.desc') ? client.currentMenuModule.menuConfig.desc : '';
|
||||||
|
},
|
||||||
|
|
||||||
|
MA : function messageAreaDescription() {
|
||||||
|
var area = getMessageAreaByName(client.user.properties.message_area_name);
|
||||||
|
return area ? area.desc : '';
|
||||||
|
},
|
||||||
|
|
||||||
|
SH : function termHeight() { return client.term.termHeight.toString() },
|
||||||
|
SW : function termWidth() { return client.term.termWidth.toString() },
|
||||||
|
|
||||||
|
ND : function connectedNode() { return client.node.toString() },
|
||||||
|
|
||||||
|
// :TODO: change to CD for 'Current Date'
|
||||||
|
DT : function date() { return moment().format(client.currentTheme.helpers.getDateFormat()) },
|
||||||
|
CT : function time() { return moment().format(client.currentTheme.helpers.getTimeFormat()) },
|
||||||
|
|
||||||
|
|
||||||
|
OS : function operatingSystem() {
|
||||||
|
return {
|
||||||
|
linux : 'Linux',
|
||||||
|
darwin : 'Mac OS X',
|
||||||
|
win32 : 'Windows',
|
||||||
|
sunos : 'SunOS',
|
||||||
|
freebsd : 'FreeBSD',
|
||||||
|
}[os.platform()] || os.type();
|
||||||
|
},
|
||||||
|
|
||||||
|
OA : function systemArchitecture() { return os.arch() },
|
||||||
|
SC : function systemCpuModel() { return os.cpus()[0].model },
|
||||||
|
|
||||||
|
IP : function clientIpAddress() { return client.address().address },
|
||||||
|
}[code]();
|
||||||
|
|
||||||
|
} catch(e) {
|
||||||
|
// Don't use client.log here as we may not have a client logger established yet!!
|
||||||
|
Log.warn( { code : code, exception : e.message }, 'Exception caught attempting to construct predefined label');
|
||||||
|
}
|
||||||
|
}
|
|
@ -2,9 +2,17 @@
|
||||||
/*
|
/*
|
||||||
ENiGMA½ Menu Configuration
|
ENiGMA½ Menu Configuration
|
||||||
|
|
||||||
See http://hjson.org/ for syntax
|
This configuration is in HJSON format. Strict to-spec JSON is also
|
||||||
|
perfectly valid. The hjson npm can be used to convert to/from JSON.
|
||||||
|
|
||||||
|
See http://hjson.org/ for more information and syntax.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
|
:TODO: Fully convert to HJSON
|
||||||
|
|
||||||
Menu Configuration
|
Menu Configuration
|
||||||
|
|
||||||
Tip: demjson's jsonlint is an excellent tool for linting JSON files
|
Tip: demjson's jsonlint is an excellent tool for linting JSON files
|
||||||
|
@ -422,6 +430,7 @@
|
||||||
config: {
|
config: {
|
||||||
art: {
|
art: {
|
||||||
header: MSGVHDR
|
header: MSGVHDR
|
||||||
|
// :TODO: fix these!!
|
||||||
body: demo_fse_netmail_body.ans
|
body: demo_fse_netmail_body.ans
|
||||||
footerEdit: demo_fse_netmail_footer_edit.ans
|
footerEdit: demo_fse_netmail_footer_edit.ans
|
||||||
footerEditMenu: demo_fse_netmail_footer_edit_menu.ans
|
footerEditMenu: demo_fse_netmail_footer_edit_menu.ans
|
||||||
|
|
Loading…
Reference in New Issue