Compare commits
6 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 0a3d7baf82 | |||
| 885a96dced | |||
| f437fb8c5a | |||
| 366d0dd454 | |||
| 80b1b2b0cc | |||
| 269a651325 |
@@ -19,8 +19,8 @@ android {
|
||||
applicationId "ru.ua1zbe.bus127"
|
||||
minSdk 26
|
||||
targetSdk 34
|
||||
versionCode 4
|
||||
versionName "2.2"
|
||||
versionCode 6
|
||||
versionName "2.4"
|
||||
}
|
||||
|
||||
buildTypes {
|
||||
|
||||
@@ -125,17 +125,31 @@ const SCHEDULE = [
|
||||
["20:20","21:10","21:40","22:05"]
|
||||
];
|
||||
const TRIPS_SHOWN = 5; // сколько ближайших рейсов показывать в карточке
|
||||
|
||||
// Время в пути Полярные Зори ↔ Кандалакша. В таблице расписания его нет:
|
||||
// в 12 строках из 13 Кандалакша → ПЗ занимает ровно 50 минут
|
||||
// (в первой строке 60 — по всей видимости опечатка).
|
||||
const RIDE_PZ_KAND = 50;
|
||||
|
||||
// arrs — список прибытий: {label, col} — время из колонки таблицы,
|
||||
// {label, offset} — «время в пути» от отправления (если col не задан).
|
||||
const DIRECTIONS = {
|
||||
// От Кандалакши и Зашейка все рейсы идут через Полярные Зори — одна карточка
|
||||
"Кандалакша": [
|
||||
{to:"Полярные Зори, Зашеек", dep:0, arr:2, arrLabel:"Зашеек", via:"через Полярные Зори"}
|
||||
{to:"Полярные Зори, Зашеек", dep:0, via:"через Полярные Зори",
|
||||
arrs:[{label:"Полярные Зори", col:1},
|
||||
{label:"Зашеек", col:2}]}
|
||||
],
|
||||
"Полярные Зори": [
|
||||
{to:"Зашеек", dep:1, arr:2, via:"≈ 30 мин в пути"},
|
||||
{to:"Кандалакша", dep:3, arr:null, via:"≈ 1 час в пути"}
|
||||
{to:"Зашеек", dep:1, via:"≈ 30 мин в пути",
|
||||
arrs:[{label:"Зашеек", col:2}]},
|
||||
{to:"Кандалакша", dep:3, via:"≈ 50 мин в пути",
|
||||
arrs:[{label:"Кандалакша", offset:RIDE_PZ_KAND}]}
|
||||
],
|
||||
"Зашеек": [
|
||||
{to:"Полярные Зори, Кандалакша", dep:2, arr:3, arrLabel:"Кандалакша", via:"через Полярные Зори"}
|
||||
{to:"Полярные Зори, Кандалакша", dep:2, via:"через Полярные Зори",
|
||||
arrs:[{label:"Полярные Зори", col:3},
|
||||
{label:"Кандалакша", col:3, offset:RIDE_PZ_KAND}]}
|
||||
]
|
||||
};
|
||||
const DAYS = ["воскресенье","понедельник","вторник","среда","четверг","пятница","суббота"];
|
||||
@@ -174,6 +188,12 @@ function nowMs(){
|
||||
second: d.getUTCSeconds(), day: d.getUTCDay() };
|
||||
}
|
||||
|
||||
function fmtHM(m){
|
||||
const p = n=>String(n).padStart(2,"0");
|
||||
m = ((m % 1440) + 1440) % 1440; // на случай перехода через полночь
|
||||
return `${p(Math.floor(m/60))}:${p(m%60)}`;
|
||||
}
|
||||
|
||||
function fmtWait(m){
|
||||
if(m <= 0) return "отправление сейчас";
|
||||
const h = Math.floor(m/60), mm = m%60;
|
||||
@@ -190,13 +210,21 @@ function render(){
|
||||
const dirs = DIRECTIONS[currentStop];
|
||||
document.getElementById("dirBox").innerHTML = dirs.map(d=>{
|
||||
const upcoming = SCHEDULE
|
||||
.map((r,ri)=>({dep:toMin(r[d.dep]), arr:d.arr!==null?r[d.arr]:null, ri}))
|
||||
.map((r,ri)=>{
|
||||
const dep = toMin(r[d.dep]);
|
||||
const arrs = d.arrs.map(a=>{
|
||||
const base = a.col!==undefined ? toMin(r[a.col]) : dep;
|
||||
return {label:a.label, t:fmtHM(base + (a.offset||0))};
|
||||
});
|
||||
return {dep, arrs, ri};
|
||||
})
|
||||
.filter(x=>x.dep >= curMin)
|
||||
.sort((a,b)=>a.dep-b.dep)
|
||||
.slice(0,TRIPS_SHOWN)
|
||||
.map(x=>{
|
||||
const w = x.dep - curMin;
|
||||
const arr = x.arr ? `<small>прибытие${d.arrLabel ? " "+d.arrLabel : ""} ${x.arr}</small>` : "";
|
||||
// .trip .t small имеет display:block, поэтому каждый <small> — своя строка
|
||||
const arr = x.arrs.map(a=>`<small>прибытие ${a.label} ${a.t}</small>`).join("");
|
||||
return `<div class="trip ${w<15?'soon':''}">
|
||||
<span class="t">${SCHEDULE[x.ri][d.dep]}${arr}</span>
|
||||
<span class="w">${fmtWait(w)}</span>
|
||||
|
||||
@@ -125,17 +125,31 @@ const SCHEDULE = [
|
||||
["20:20","21:10","21:40","22:05"]
|
||||
];
|
||||
const TRIPS_SHOWN = 5; // сколько ближайших рейсов показывать в карточке
|
||||
|
||||
// Время в пути Полярные Зори ↔ Кандалакша. В таблице расписания его нет:
|
||||
// в 12 строках из 13 Кандалакша → ПЗ занимает ровно 50 минут
|
||||
// (в первой строке 60 — по всей видимости опечатка).
|
||||
const RIDE_PZ_KAND = 50;
|
||||
|
||||
// arrs — список прибытий: {label, col} — время из колонки таблицы,
|
||||
// {label, offset} — «время в пути» от отправления (если col не задан).
|
||||
const DIRECTIONS = {
|
||||
// От Кандалакши и Зашейка все рейсы идут через Полярные Зори — одна карточка
|
||||
"Кандалакша": [
|
||||
{to:"Полярные Зори, Зашеек", dep:0, arr:2, arrLabel:"Зашеек", via:"через Полярные Зори"}
|
||||
{to:"Полярные Зори, Зашеек", dep:0, via:"через Полярные Зори",
|
||||
arrs:[{label:"Полярные Зори", col:1},
|
||||
{label:"Зашеек", col:2}]}
|
||||
],
|
||||
"Полярные Зори": [
|
||||
{to:"Зашеек", dep:1, arr:2, via:"≈ 30 мин в пути"},
|
||||
{to:"Кандалакша", dep:3, arr:null, via:"≈ 1 час в пути"}
|
||||
{to:"Зашеек", dep:1, via:"≈ 30 мин в пути",
|
||||
arrs:[{label:"Зашеек", col:2}]},
|
||||
{to:"Кандалакша", dep:3, via:"≈ 50 мин в пути",
|
||||
arrs:[{label:"Кандалакша", offset:RIDE_PZ_KAND}]}
|
||||
],
|
||||
"Зашеек": [
|
||||
{to:"Полярные Зори, Кандалакша", dep:2, arr:3, arrLabel:"Кандалакша", via:"через Полярные Зори"}
|
||||
{to:"Полярные Зори, Кандалакша", dep:2, via:"через Полярные Зори",
|
||||
arrs:[{label:"Полярные Зори", col:3},
|
||||
{label:"Кандалакша", col:3, offset:RIDE_PZ_KAND}]}
|
||||
]
|
||||
};
|
||||
const DAYS = ["воскресенье","понедельник","вторник","среда","четверг","пятница","суббота"];
|
||||
@@ -174,6 +188,12 @@ function nowMs(){
|
||||
second: d.getUTCSeconds(), day: d.getUTCDay() };
|
||||
}
|
||||
|
||||
function fmtHM(m){
|
||||
const p = n=>String(n).padStart(2,"0");
|
||||
m = ((m % 1440) + 1440) % 1440; // на случай перехода через полночь
|
||||
return `${p(Math.floor(m/60))}:${p(m%60)}`;
|
||||
}
|
||||
|
||||
function fmtWait(m){
|
||||
if(m <= 0) return "отправление сейчас";
|
||||
const h = Math.floor(m/60), mm = m%60;
|
||||
@@ -190,13 +210,21 @@ function render(){
|
||||
const dirs = DIRECTIONS[currentStop];
|
||||
document.getElementById("dirBox").innerHTML = dirs.map(d=>{
|
||||
const upcoming = SCHEDULE
|
||||
.map((r,ri)=>({dep:toMin(r[d.dep]), arr:d.arr!==null?r[d.arr]:null, ri}))
|
||||
.map((r,ri)=>{
|
||||
const dep = toMin(r[d.dep]);
|
||||
const arrs = d.arrs.map(a=>{
|
||||
const base = a.col!==undefined ? toMin(r[a.col]) : dep;
|
||||
return {label:a.label, t:fmtHM(base + (a.offset||0))};
|
||||
});
|
||||
return {dep, arrs, ri};
|
||||
})
|
||||
.filter(x=>x.dep >= curMin)
|
||||
.sort((a,b)=>a.dep-b.dep)
|
||||
.slice(0,TRIPS_SHOWN)
|
||||
.map(x=>{
|
||||
const w = x.dep - curMin;
|
||||
const arr = x.arr ? `<small>прибытие${d.arrLabel ? " "+d.arrLabel : ""} ${x.arr}</small>` : "";
|
||||
// .trip .t small имеет display:block, поэтому каждый <small> — своя строка
|
||||
const arr = x.arrs.map(a=>`<small>прибытие ${a.label} ${a.t}</small>`).join("");
|
||||
return `<div class="trip ${w<15?'soon':''}">
|
||||
<span class="t">${SCHEDULE[x.ri][d.dep]}${arr}</span>
|
||||
<span class="w">${fmtWait(w)}</span>
|
||||
|
||||
Reference in New Issue
Block a user