mosmetro
Version:
Moscow Metro route search
237 lines (194 loc) • 7.85 kB
JavaScript
var restler = require('restler');
var argv = require('yargs').argv;
var inquirer = require('inquirer');
var html2text = require('html-to-text');
var clc = require('cli-color');
var moment = require('moment');
moment.locale('ru');
var c = function(string, color) {
return clc.xterm(parseInt(color))(string);
};
var _base = require('./base');
var doubles = _base.doubles;
var line = _base.line;
var base = _base.base;
var arg1 = argv._[0];
var arg2 = argv._[1];
if (typeof arg1 === 'undefined') {
console.error('Обшибка: Не указаны обязательные параметры'.red);
return;
}
if (typeof arg1 !== 'undefined' && typeof arg2 === 'undefined') {
// Указана только одна станция, следует вывести информацию по ней
var station = base[arg1.toLowerCase()];
if (station) {
Info(station);
} else if (!station && doubles[arg1.toLowerCase()]) {
inquirer.prompt({
type: 'list',
name: 'arg1_line',
message: 'Станция ' + base[arg1.toLowerCase() + ' (' + doubles[arg1.toLowerCase()][0].toLowerCase() + ')'].name + ' есть на нескольких ветках, вам какую?',
choices: [new inquirer.Separator()].concat(doubles[arg1.toLowerCase()])
}, function(answers) {
arg1 = (answers.arg1_line ? arg1 + ' (' + answers.arg1_line + ')' : arg1);
station = base[arg1];
Info(station);
return;
});
} else {
console.error('Обшибка: Станция не найдена'.red);
return;
}
return;
}
function Info(station) {
restler.get('http://metro.mwmoskva.ru/moscow-map/getStation.php?id=' + station.url + '&ln=' + station.ln)
// restler.get('http://metro.mwmoskva.ru/' + station.ln + '-linija/'+ station.url + '.html')
.on('complete', function(res) {
if (res instanceof Error) {
console.log(res.message);
} else {
var json = JSON.parse(res);
var text = html2text.fromString(json.html, {
tables: ['#invoice', '.address']
});
console.log(text);
}
});
}
var prompt = [];
if (doubles[arg1.toLowerCase()]) {
prompt.push({
type: 'list',
name: 'arg1_line',
message: 'Станция ' + base[arg1.toLowerCase() + ' (' + doubles[arg1.toLowerCase()][0].toLowerCase() + ')'].name + ' есть на нескольких ветках, вам какую?',
choices: [new inquirer.Separator()].concat(doubles[arg1.toLowerCase()])
});
}
if (doubles[arg2.toLowerCase()]) {
prompt.push({
type: 'list',
name: 'arg2_line',
message: 'Станция ' + base[arg2.toLowerCase() + ' (' + doubles[arg2.toLowerCase()][0].toLowerCase() + ')'].name + ' есть на нескольких ветках, вам какую?',
choices: [new inquirer.Separator()].concat(doubles[arg2.toLowerCase()])
});
}
if (prompt.length > 0) {
inquirer.prompt(prompt, function(answers) {
arg1 = (answers.arg1_line ? arg1 + ' (' + answers.arg1_line + ')' : arg1);
arg2 = (answers.arg2_line ? arg2 + ' (' + answers.arg2_line + ')' : arg2);
Metro();
});
} else {
Metro();
}
function Metro() {
var st_start = base[arg1.toLowerCase()];
var st_end = base[arg2.toLowerCase()];
if (st_start && st_end) {
var getRoute = function() {
restler
.get('http://metro.mwmoskva.ru/moscow-map/findWayAlt.php?start=' + ( st_start.url + '_' + st_start.ln ) + '&end=' + ( st_end.url + '_' + st_end.ln ) + '')
.on('complete', function(res) {
if (res instanceof Error) {
console.log(res.message);
} else {
var json = JSON.parse(res);
for (var i = 0, l = json.length; i < l; i++) {
visualizeRoute(json[i], i + 1, (argv.s || argv.short));
}
}
});
};
var visualizeRoute = function(route, iterator, inline) {
if (typeof inline === 'undefined') {
inline = false;
}
var time = 0;
for (var i in route.ln) {
time += parseFloat(route.ln[i].time);
}
if (route.stations[0].id !== st_start.id) {
route.stations.reverse();
}
if (!inline) {
if (iterator > 2) return;
// NOT INLINE
var title = (iterator !== 1 ? '\n' : '') + time + ' ' + declOfNum(time, declMinutes) + ' (' + moment().add(time, 'minutes').format('H:mm') + ')';
var subtitle = (new Array(title.length + 1)).join('—');
// console.log(subtitle);
console.log(clc.italic(title));
for (var i = 0, l = route.stations.length; i < l; i++) {
var symbol = '│';
var strings = [];
var is_shown = true;
var write_ln = false;
if (i === 0) {
symbol = '┬';
is_shown = true;
write_ln = true;
} else if (i === route.stations.length - 1) {
symbol = '┴';
is_shown = true;
if (route.stations[i - 1].ln !== route.stations[i].ln) write_ln = true;
} else if (i > 0 && route.stations[i].ln !== route.stations[i - 1].ln) {
symbol = '├︎';
is_shown = true;
write_ln = true;
} else if (i < route.stations.length - 1 && route.stations[i + 1].ln !== route.stations[i].ln) {
symbol = '├︎';
is_shown = true;
}
var string_symbol = c(symbol, line[route.stations[i].ln].color);
var string_ln = write_ln ? clc.italic.xterm(240)(route.stations[i].lnName) : '';
var string_station;
if (i === 0 || i === route.stations.length - 1) {
string_station = clc.underline(c(route.stations[i].name, line[route.stations[i].ln].color));
} else {
string_station = c(route.stations[i].name, line[route.stations[i].ln].color);
}
strings.push(string_symbol, string_station, string_ln);
if (is_shown) {
console.log(strings.join(' '));
}
}
} else {
// INLINE
var string = clc.italic('' + time + ' ' + declOfNum(time, declMinutes) + ' (' + moment().add(time, 'minutes').format('H:mm') + '): ');
for (var i = 0, l = route.stations.length; i < l; i++) {
var string_station = route.stations[i].name;
if (i === 0) {
// начало поездки
string += c(string_station + ' – ', line[route.stations[i].ln].color);
} else if (i < route.stations.length - 1 && route.stations[i + 1].ln !== route.stations[i].ln) {
// пересадка с
string += c(string_station, line[route.stations[i].ln].color) + ' → '.gray;
} else if (route.stations.length - 1 === i) {
// конец поездки
string += c(string_station, line[route.stations[i].ln].color);
console.log(string);
} else if (i > 0 && route.stations[i].ln !== route.stations[i - 1].ln) {
// пересадка на
string += c(string_station + ' – ', line[route.stations[i].ln].color);
}
}
}
// console.log(time);
};
var declMinutes = ['минута', 'минуты', 'минут'];
function declOfNum(number, titles) {
var cases = [2, 0, 1, 1, 1, 2];
return titles[(number % 100 > 4 && number % 100 < 20) ? 2 : cases[(number % 10 < 5) ? number % 10 : 5]];
}
getRoute();
} else {
if (!st_start) {
console.error(clc.red('Ошибка: Не найдена станция ' + arg1))
}
if (!st_end) {
console.error(clc.red('Ошибка: Не найдена станция ' + arg2))
}
}
// console.log(c('debug data: ' + JSON.stringify(argv), 239));
}