Add course schedules for ISF and ITZS programs for 2026 and 2024 sessions
- Created new snapshot files for ISF credits and daily schedules for the 26-АРХ and 26-ПГС programs. - Added summer 2026 and winter 2024 exam schedules for the 23-ИТзс program, detailing lectures, labs, and consultations.
This commit is contained in:
31
README.md
31
README.md
@@ -80,14 +80,29 @@ npm run sync
|
|||||||
|
|
||||||
Это не универсальный парсер любых документов Word: без заголовков групп, дней и времени импорт возвращает понятную ошибку.
|
Это не универсальный парсер любых документов Word: без заголовков групп, дней и времени импорт возвращает понятную ошибку.
|
||||||
|
|
||||||
**Даты занятий рассчитываются по университетской таблице «Расписание белых и зеленых недель»** из корня каталога: неделя 1 начинается 01.09.2026 (вторник), нечётные недели белые, чётные зелёные. Пометка в белой или зелёной строке относится только к неделям этого цвета: `1-13н` в белой строке — недели 1, 3, …, 13, а в объединённой строке — каждая неделя. `с 3н.` означает «до конца таблицы». Текстовые даты вроде «15 октября» и списки дат числами («10.09;15.10;19.11;17.12», не меньше двух дат, чтобы время пары не путалось с датой) привязываются к своему дню. Нераспознанные пометки (`2,6-12-16н`) не скрываются, а помечаются для сверки с Word; исходная пометка всегда видна. Разбор пометок общий для сервера и браузера (`shared/weeks.js`), поэтому старые сохранённые расписания тоже получают даты. Вне периода таблицы приложение показывает все строки Word. Номера подгрупп соответствуют столбцам внутри группы; именованных подгрупп в этих шаблонах нет.
|
**Даты занятий рассчитываются по университетской таблице «Расписание белых и зеленых недель»** из корня каталога: неделя 1 начинается 01.09.2026 (вторник), нечётные недели белые, чётные зелёные. Пометка в белой или зелёной строке относится только к неделям этого цвета: `1-13н` в белой строке — недели 1, 3, …, 13, а в объединённой строке — каждая неделя. `с 3н.` означает «до конца таблицы», а части пометки через `;` или `,` (`1-4н.;6-12н.`, `2-5 н., 10-17 н.`) складываются. Текстовые даты вроде «15 октября» и списки дат числами («10.09;15.10;19.11;17.12», не меньше двух дат, чтобы время пары не путалось с датой) привязываются к своему дню. Нераспознанные пометки (`2,6-12-16н`) не скрываются, а помечаются для сверки с Word; исходная пометка всегда видна. Разбор пометок общий для сервера и браузера (`shared/weeks.js`), поэтому старые сохранённые расписания тоже получают даты. Вне периода таблицы приложение показывает все строки Word. Номера подгрупп соответствуют столбцам внутри группы; именованных подгрупп в этих шаблонах нет.
|
||||||
|
|
||||||
Поля предмета, преподавателя и аудитории извлекаются по типовым обозначениям; сложные многострочные записи могут содержать несколько преподавателей/аудиторий. Поэтому полный текст всегда доступен в деталях. Если в ячейке явно указано особое время, например `16.50` для кураторского часа, оно имеет приоритет; окончание не выдумывается.
|
Поля предмета, преподавателя и аудитории извлекаются по типовым обозначениям; сложные многострочные записи могут содержать несколько преподавателей/аудиторий. Поэтому полный текст всегда доступен в деталях. Если в ячейке явно указано особое время, например `16.50` для кураторского часа, `9.00`, `18.35.`, интервал `11:10-11:30` или несколько времён (`17.00 и 18.35`, `18.35+20.10` — тогда это отдельные занятия), оно имеет приоритет; окончание не выдумывается. Дата в начале ячейки (`13.10`, `3.12`, `24.11.`, `12.09.26г.`) делает запись разовой. Запись вида `20.10` может быть и датой, и началом восьмой пары: если такая дата приходится на другой день недели, чем строка, или после неё идёт пометка недель, это время.
|
||||||
|
|
||||||
Для старых `.doc` на сервере нужен LibreOffice Writer (`soffice` в PATH или `LIBREOFFICE_BIN`). Конвертация может изменить сложное форматирование, результат нужно сверить. Реальные документы выбранного источника — `.docx`; поддержка `.doc` проверяется отдельно на образце, преобразованном LibreOffice.
|
Для старых `.doc` на сервере нужен LibreOffice Writer (`soffice` в PATH или `LIBREOFFICE_BIN`). Конвертация может изменить сложное форматирование, результат нужно сверить. Реальные документы выбранного источника — `.docx`; поддержка `.doc` проверяется отдельно на образце, преобразованном LibreOffice.
|
||||||
|
|
||||||
PDF, Excel, изображения и сканы пока не импортируются. Они не выдаются за распознанное расписание.
|
PDF, Excel, изображения и сканы пока не импортируются. Они не выдаются за распознанное расписание.
|
||||||
|
|
||||||
|
**Подозрительные ячейки.** После разбора каждый документ каталога проверяется (`server/diagnostics.js`), и `GET /api/diagnostics` показывает ячейки, которые прочитаны неуверенно, с исходным текстом. Фильтры: `?group=23-АРХ`, `?doc=<id>`, `?code=weeks_partly`. Число таких ячеек есть и в `/api/health` (`directory.problems`). Коды:
|
||||||
|
- `weeks_partly` — пометка недель прочитана не целиком (`1-4н.;6-12н.`);
|
||||||
|
- `weeks_unreadable` — пометка недель не прочитана (`2,6-12-16н`);
|
||||||
|
- `weeks_like_date` — «недели» похожи на дату с опечаткой (`19,11, 03.12`);
|
||||||
|
- `weeks_out_of_range` — номер недели больше, чем недель в семестре;
|
||||||
|
- `date_in_subject`, `time_in_subject` — дата или время в начале ячейки попали в название (`24.11.`, `9.00`, `11:10-11:30`);
|
||||||
|
- `dates_unread` — в ячейке есть даты, но ни одна не распознана;
|
||||||
|
- `date_weekday` — дата приходится на другой день недели, чем строка;
|
||||||
|
- `date_out_of_year` — дата вне учебного года;
|
||||||
|
- `subject_missing` — название предмета не выделено;
|
||||||
|
- `time_invalid` — время пары неправдоподобно;
|
||||||
|
- `group_empty` — у группы из заголовка нет ни одного занятия.
|
||||||
|
|
||||||
|
Такие ячейки — повод сверить документ с Word и, если это новый формат, научить парсер.
|
||||||
|
|
||||||
## Проверки
|
## Проверки
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
@@ -95,7 +110,17 @@ npm test
|
|||||||
npm run build
|
npm run build
|
||||||
```
|
```
|
||||||
|
|
||||||
Тесты используют реальные Word-документы источника в `test/fixtures/` с URL и метаданными рядом. Проверяются изоляция 23-БА/23-ЛГ, общие события, объединения ячеек, варианты недель, отдельное время кураторского часа, даты сессии и отклонение повреждённых файлов, а также таблица недель и звонков, разбор пометок с учётом цвета строки и согласие всех пометок 23-БА с таблицей.
|
Тесты используют реальные Word-документы источника в `test/fixtures/` с URL и метаданными рядом. Результат разбора каждого из них вместе с найденными диагностикой ячейками сравнивается построчно со снимком в `test/snapshots/`. Если разбор изменился намеренно, снимки обновляются командой `UPDATE_SNAPSHOTS=1 npm test`; разницу в `test/snapshots/` стоит прочитать перед коммитом. Проверяются изоляция 23-БА/23-ЛГ, общие события, объединения ячеек, варианты недель, отдельное время кураторского часа, даты сессии и отклонение повреждённых файлов, а также таблица недель и звонков, разбор пометок с учётом цвета строки и согласие всех пометок 23-БА с таблицей.
|
||||||
|
|
||||||
|
Перед изменением парсера стоит снять снимок всего каталога и после правки сравнить с ним:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
npm run snapshot -- fetch # скачать все документы каталога в .data/originals/
|
||||||
|
npm run snapshot -- save # разобрать их текущим парсером и сохранить эталон
|
||||||
|
npm run snapshot # после правки: что изменилось по каждому документу
|
||||||
|
```
|
||||||
|
|
||||||
|
Проверка выводит по каждому документу пропавшие и появившиеся занятия (с `--all` — все, иначе первые десять) и как изменилось число подозрительных ячеек по кодам. Если что-то изменилось, команда завершается с кодом 1. Документы и эталон лежат в `.data/` и в git не попадают.
|
||||||
|
|
||||||
## Docker
|
## Docker
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -9,6 +9,7 @@
|
|||||||
"start": "node server/index.js",
|
"start": "node server/index.js",
|
||||||
"test": "node --test test/*.test.js",
|
"test": "node --test test/*.test.js",
|
||||||
"sync": "node scripts/sync.js",
|
"sync": "node scripts/sync.js",
|
||||||
|
"snapshot": "node scripts/snapshot.js",
|
||||||
"icons": "node scripts/icons.js"
|
"icons": "node scripts/icons.js"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
|||||||
36
scripts/snapshot-lines.js
Normal file
36
scripts/snapshot-lines.js
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
// One readable line per parsed lesson, the form both snapshots compare: what a student sees
|
||||||
|
// (day, time, weeks or dates, subject, kind, room, teacher, groups), not ids or source colours.
|
||||||
|
const DAYS = ["", "пн", "вт", "ср", "чт", "пт", "сб", "вс"];
|
||||||
|
|
||||||
|
const weeks = (ranges) =>
|
||||||
|
ranges?.map(([a, b]) => (b === null ? `с ${a}` : a === b ? `${a}` : `${a}-${b}`)).join(",") || "";
|
||||||
|
|
||||||
|
export const lessonLine = (l) =>
|
||||||
|
[
|
||||||
|
`${l.date || DAYS[l.day]} ${l.start}${l.end ? `–${l.end}` : ""}`,
|
||||||
|
(l.date ? "один раз" : l.dates?.length ? `даты ${l.dates.join(",")}` : l.weekRanges ? `нед. ${weeks(l.weekRanges)}` : "каждую неделю") +
|
||||||
|
(l.variant === "upper" ? ", верхняя строка" : l.variant === "lower" ? ", нижняя строка" : ""),
|
||||||
|
l.subject,
|
||||||
|
l.type,
|
||||||
|
l.room,
|
||||||
|
l.teacher,
|
||||||
|
[...l.groups, ...l.subgroups.map((s) => `${s.group}/${s.label.replace("Подгруппа ", "п")}`)].join(","),
|
||||||
|
]
|
||||||
|
.map((part) => String(part ?? "").replace(/\s+/g, " ").trim())
|
||||||
|
.join(" | ");
|
||||||
|
|
||||||
|
/** Sorted lesson lines of a parsed document, with its groups and period on top. */
|
||||||
|
export const snapshotOf = (schedule) => [
|
||||||
|
`# ${schedule.period} · ${schedule.groups.join(", ")}`,
|
||||||
|
...schedule.lessons.map(lessonLine).sort(),
|
||||||
|
];
|
||||||
|
|
||||||
|
/** Lines only in `before` (removed) and only in `after` (added), duplicates counted. */
|
||||||
|
export function diffLines(before, after) {
|
||||||
|
const count = (lines) => lines.reduce((m, x) => m.set(x, (m.get(x) || 0) + 1), new Map());
|
||||||
|
const a = count(before), b = count(after);
|
||||||
|
const removed = [], added = [];
|
||||||
|
for (const [line, n] of a) for (let i = b.get(line) || 0; i < n; i++) removed.push(line);
|
||||||
|
for (const [line, n] of b) for (let i = a.get(line) || 0; i < n; i++) added.push(line);
|
||||||
|
return { removed, added };
|
||||||
|
}
|
||||||
136
scripts/snapshot.js
Normal file
136
scripts/snapshot.js
Normal file
@@ -0,0 +1,136 @@
|
|||||||
|
// Catalog snapshot: every catalog document re-parsed by the current parser and compared with
|
||||||
|
// a saved result, so a parser change shows what it changes across all faculties before the
|
||||||
|
// container is rebuilt. The originals and the snapshot live in .data/ (not in git).
|
||||||
|
//
|
||||||
|
// npm run snapshot -- fetch download every catalog document into .data/originals/
|
||||||
|
// npm run snapshot -- save parse them and save the result as the reference
|
||||||
|
// npm run snapshot parse them again and print what changed (exit code 1 if anything)
|
||||||
|
// npm run snapshot -- --all the same, with every changed line instead of the first ten
|
||||||
|
import { readFile, writeFile, mkdir, readdir } from "node:fs/promises";
|
||||||
|
import { fileURLToPath } from "node:url";
|
||||||
|
import { parseWord, PARSER_VERSION } from "../server/parser.js";
|
||||||
|
import { diagnose } from "../server/diagnostics.js";
|
||||||
|
import { snapshotOf, diffLines } from "./snapshot-lines.js";
|
||||||
|
|
||||||
|
const data = fileURLToPath(new URL("../.data/", import.meta.url));
|
||||||
|
const originals = data + "originals/";
|
||||||
|
const reference = data + "snapshot.json";
|
||||||
|
const args = process.argv.slice(2);
|
||||||
|
const command = args.find((a) => !a.startsWith("--")) || "check";
|
||||||
|
const limit = args.includes("--all") ? Infinity : 10;
|
||||||
|
|
||||||
|
const catalog = async () => {
|
||||||
|
const { getCatalog } = await import("../server/source.js");
|
||||||
|
return getCatalog();
|
||||||
|
};
|
||||||
|
|
||||||
|
async function fetchAll() {
|
||||||
|
const { request } = await import("../server/source.js");
|
||||||
|
const files = (await catalog()).files;
|
||||||
|
await mkdir(originals, { recursive: true });
|
||||||
|
const index = {};
|
||||||
|
let failed = 0;
|
||||||
|
for (const file of files) {
|
||||||
|
try {
|
||||||
|
await writeFile(originals + file.id, await request(file.path));
|
||||||
|
index[file.id] = { name: file.name, year: file.year, modified: file.modified, faculty: file.faculty };
|
||||||
|
process.stdout.write(".");
|
||||||
|
} catch (e) {
|
||||||
|
failed++;
|
||||||
|
console.error(`\n${file.name}: ${e.message}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
await writeFile(originals + "index.json", JSON.stringify(index, null, 1));
|
||||||
|
console.log(`\nСкачано ${Object.keys(index).length} из ${files.length} документов${failed ? `, ошибок: ${failed}` : ""}.`);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Every downloaded document parsed now: {id: {name, lines, problems} | {name, error}}. */
|
||||||
|
async function parseAll() {
|
||||||
|
let index;
|
||||||
|
try {
|
||||||
|
index = JSON.parse(await readFile(originals + "index.json", "utf8"));
|
||||||
|
} catch {
|
||||||
|
throw new Error("Нет скачанных документов: сначала npm run snapshot -- fetch");
|
||||||
|
}
|
||||||
|
const present = new Set(await readdir(originals));
|
||||||
|
const result = {};
|
||||||
|
for (const [id, meta] of Object.entries(index)) {
|
||||||
|
if (!present.has(id)) continue;
|
||||||
|
try {
|
||||||
|
const schedule = await parseWord(await readFile(originals + id), { ...meta, fileId: id });
|
||||||
|
const problems = {};
|
||||||
|
for (const p of diagnose(schedule)) problems[p.code] = (problems[p.code] || 0) + 1;
|
||||||
|
result[id] = { name: meta.name, lines: snapshotOf(schedule), problems };
|
||||||
|
} catch (e) {
|
||||||
|
result[id] = { name: meta.name, error: e.message };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
const total = (docs) =>
|
||||||
|
Object.values(docs).reduce((sum, d) => {
|
||||||
|
for (const [code, n] of Object.entries(d.problems || {})) sum[code] = (sum[code] || 0) + n;
|
||||||
|
return sum;
|
||||||
|
}, {});
|
||||||
|
|
||||||
|
async function save() {
|
||||||
|
const docs = await parseAll();
|
||||||
|
await writeFile(reference, JSON.stringify({ parserVersion: PARSER_VERSION, savedAt: new Date().toISOString(), docs }));
|
||||||
|
const lessons = Object.values(docs).reduce((n, d) => n + (d.lines?.length - 1 || 0), 0);
|
||||||
|
console.log(`Снимок сохранён: ${Object.keys(docs).length} документов, ${lessons} занятий, парсер ${PARSER_VERSION}.`);
|
||||||
|
console.log("Подозрительные ячейки:", total(docs));
|
||||||
|
}
|
||||||
|
|
||||||
|
async function check() {
|
||||||
|
let saved;
|
||||||
|
try {
|
||||||
|
saved = JSON.parse(await readFile(reference, "utf8"));
|
||||||
|
} catch {
|
||||||
|
throw new Error("Нет сохранённого снимка: сначала npm run snapshot -- save");
|
||||||
|
}
|
||||||
|
const now = await parseAll();
|
||||||
|
let changed = 0, same = 0;
|
||||||
|
for (const id of new Set([...Object.keys(saved.docs), ...Object.keys(now)])) {
|
||||||
|
const before = saved.docs[id], after = now[id];
|
||||||
|
const name = (after || before).name;
|
||||||
|
if (!before || !after) {
|
||||||
|
changed++;
|
||||||
|
console.log(`\n${before ? "−" : "+"} ${name}: документ ${before ? "пропал" : "появился"}`);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (before.error || after.error) {
|
||||||
|
if (before.error === after.error) { same++; continue; }
|
||||||
|
changed++;
|
||||||
|
console.log(`\n~ ${name}: ${after.error ? `теперь не разбирается — ${after.error}` : "теперь разбирается"}`);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
const { removed, added } = diffLines(before.lines, after.lines);
|
||||||
|
if (!removed.length && !added.length) { same++; continue; }
|
||||||
|
changed++;
|
||||||
|
console.log(`\n~ ${name}: −${removed.length} +${added.length}`);
|
||||||
|
for (const line of removed.slice(0, limit)) console.log(` − ${line}`);
|
||||||
|
if (removed.length > limit) console.log(` … ещё ${removed.length - limit}`);
|
||||||
|
for (const line of added.slice(0, limit)) console.log(` + ${line}`);
|
||||||
|
if (added.length > limit) console.log(` … ещё ${added.length - limit}`);
|
||||||
|
}
|
||||||
|
const was = total(saved.docs), is = total(now);
|
||||||
|
const codes = [...new Set([...Object.keys(was), ...Object.keys(is)])].sort();
|
||||||
|
console.log(`\nПарсер ${saved.parserVersion} → ${PARSER_VERSION}. Изменённых документов: ${changed}, без изменений: ${same}.`);
|
||||||
|
if (codes.length)
|
||||||
|
console.log(
|
||||||
|
"Подозрительные ячейки:",
|
||||||
|
codes.map((c) => `${c} ${was[c] || 0}→${is[c] || 0}`).join(", "),
|
||||||
|
);
|
||||||
|
if (changed) process.exitCode = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
const commands = { fetch: fetchAll, save, check };
|
||||||
|
if (!commands[command]) {
|
||||||
|
console.error(`Неизвестная команда «${command}». Есть: fetch, save, check.`);
|
||||||
|
process.exitCode = 2;
|
||||||
|
} else
|
||||||
|
await commands[command]().catch((e) => {
|
||||||
|
console.error(e.message);
|
||||||
|
process.exitCode = 2;
|
||||||
|
});
|
||||||
116
server/diagnostics.js
Normal file
116
server/diagnostics.js
Normal file
@@ -0,0 +1,116 @@
|
|||||||
|
import { parseWeekRanges, weekday, DATE_LIST } from "../shared/weeks.js";
|
||||||
|
|
||||||
|
// The parser never guesses: a cell it cannot read becomes a lesson "every week" or keeps its
|
||||||
|
// whole text as the subject. These checks find such cells after parsing, so a new format or a
|
||||||
|
// typo in Word shows up as soon as the document is published instead of when a student notices.
|
||||||
|
|
||||||
|
const MONTHS = /(?<![а-яё])(?:январ|феврал|март|апрел|ма[йя]|июн|июл|август|сентябр|октябр|ноябр|декабр)[а-яё]*/iu;
|
||||||
|
// The longest semester has about twenty weeks; "27н." is a typo, not a week.
|
||||||
|
const LAST_WEEK = 24;
|
||||||
|
|
||||||
|
const message = {
|
||||||
|
weeks_unreadable: "Пометка недель не распознана: занятие показывается каждую неделю.",
|
||||||
|
weeks_out_of_range: "Номер недели больше, чем недель в семестре.",
|
||||||
|
weeks_like_date: "Пометка недель похожа на дату с опечаткой.",
|
||||||
|
dates_unread: "В ячейке есть даты, но ни одна не распознана: занятие показывается каждую неделю.",
|
||||||
|
date_weekday: "Дата приходится на другой день недели, чем строка таблицы.",
|
||||||
|
date_out_of_year: "Дата вне учебного года документа.",
|
||||||
|
weeks_partly: "Пометка недель прочитана не целиком: часть недель попала в название предмета.",
|
||||||
|
date_in_subject: "Дата в начале ячейки не распознана: занятие показывается каждую неделю.",
|
||||||
|
time_in_subject: "Время в начале ячейки не распознано: занятие стоит во время пары, а время попало в название.",
|
||||||
|
subject_missing: "Название предмета не выделено.",
|
||||||
|
time_invalid: "Время пары не распознано или выглядит неправдоподобно.",
|
||||||
|
group_empty: "В заголовке есть группа, но ни одного её занятия.",
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Problems found in one parsed document: `{code, message, groups, day, start, raw, …}`. */
|
||||||
|
export function diagnose(schedule) {
|
||||||
|
const found = [];
|
||||||
|
const add = (code, lesson, extra = {}) =>
|
||||||
|
found.push({
|
||||||
|
code,
|
||||||
|
message: message[code],
|
||||||
|
...(lesson && {
|
||||||
|
groups: lesson.groups,
|
||||||
|
day: lesson.day,
|
||||||
|
start: lesson.start || null,
|
||||||
|
raw: lesson.raw,
|
||||||
|
}),
|
||||||
|
...extra,
|
||||||
|
});
|
||||||
|
const year = Number(schedule.academicYear) || null;
|
||||||
|
for (const lesson of schedule.lessons) {
|
||||||
|
const raw = lesson.raw || "";
|
||||||
|
const dated = Boolean(lesson.date) || lesson.dates?.length > 0;
|
||||||
|
if (lesson.condition && !dated) {
|
||||||
|
const ranges = lesson.weekRanges ?? parseWeekRanges(lesson.condition);
|
||||||
|
// "19,11, 03.12, 17.12": a date typed with a comma reads as weeks 19 and 11.
|
||||||
|
if (!/н/i.test(lesson.condition) && DATE_LIST.test(raw.slice(lesson.condition.length - 1)))
|
||||||
|
add("weeks_like_date", lesson, { condition: lesson.condition });
|
||||||
|
else if (!ranges) add("weeks_unreadable", lesson, { condition: lesson.condition });
|
||||||
|
else if (ranges.some(([a, b]) => Math.max(a, b ?? a) > LAST_WEEK))
|
||||||
|
add("weeks_out_of_range", lesson, { condition: lesson.condition });
|
||||||
|
DATE_LIST.lastIndex = 0;
|
||||||
|
}
|
||||||
|
if (!dated && !lesson.condition && (MONTHS.test(raw) || /\b\d{1,2}\.\d{2}\.\d{4}\b/.test(raw)))
|
||||||
|
add("dates_unread", lesson);
|
||||||
|
for (const date of lesson.date ? [lesson.date] : lesson.dates || []) {
|
||||||
|
if (weekday(date) !== lesson.day) add("date_weekday", lesson, { date });
|
||||||
|
if (year && (date < `${year}-08-01` || date > `${year + 1}-08-31`))
|
||||||
|
add("date_out_of_year", lesson, { date });
|
||||||
|
}
|
||||||
|
const subject = (lesson.subject || "").trim();
|
||||||
|
const lead = subject.match(/^(\d{1,2})([.:])(\d{2})(\.?)(?:\s*[-–]\s*\d{1,2}[.:]\d{2})?/);
|
||||||
|
if (/^[;,]?\s*\d{1,2}(?:\s*[-–,;]\s*\d{1,2})*\s*н/i.test(subject)) add("weeks_partly", lesson, { subject });
|
||||||
|
else if (lead) {
|
||||||
|
const [whole, a, sep, b, dot] = lead;
|
||||||
|
// "3.12" or "24.11." is a date, "9.00", "17.00" or "11:10-11:30" a time.
|
||||||
|
const date = sep === "." && whole === `${a}.${b}${dot}` && Number(b) >= 1 && Number(b) <= 12 && (dot || Number(a) < 7 || Number(a) > 23);
|
||||||
|
add(date ? "date_in_subject" : "time_in_subject", lesson, { subject });
|
||||||
|
} else if (!subject || /^[\d.,;:–-]/.test(subject) || (subject === raw.trim() && raw.length > 120))
|
||||||
|
add("subject_missing", lesson, { subject });
|
||||||
|
const start = lesson.start || "";
|
||||||
|
if (!/^\d{2}:\d{2}$/.test(start) || start < "07:00" || start > "21:00" || (lesson.end && lesson.end <= start))
|
||||||
|
add("time_invalid", lesson, { end: lesson.end || null });
|
||||||
|
}
|
||||||
|
for (const group of schedule.groups)
|
||||||
|
if (!schedule.lessons.some((l) => l.groups.includes(group))) add("group_empty", null, { groups: [group] });
|
||||||
|
return found;
|
||||||
|
}
|
||||||
|
|
||||||
|
const reports = new WeakMap();
|
||||||
|
/**
|
||||||
|
* Every catalog document's problems, newest index only: computed once per index build.
|
||||||
|
* Filters: `group` (as printed, "23-АРХ"), `doc` (catalog id) and `code`.
|
||||||
|
*/
|
||||||
|
export function catalogDiagnostics(idx, { group = "", doc = "", code = "" } = {}) {
|
||||||
|
if (!reports.has(idx))
|
||||||
|
reports.set(
|
||||||
|
idx,
|
||||||
|
idx.docs.map(({ id, file, schedule }) => ({
|
||||||
|
doc: { id, name: file.name, faculty: file.faculty || schedule.source.faculty || null, url: file.url || null },
|
||||||
|
problems: diagnose(schedule),
|
||||||
|
})),
|
||||||
|
);
|
||||||
|
const key = group.replace(/\s+/g, "").toLowerCase();
|
||||||
|
const items = reports
|
||||||
|
.get(idx)
|
||||||
|
.filter((r) => !doc || r.doc.id === doc)
|
||||||
|
.map((r) => ({
|
||||||
|
...r,
|
||||||
|
problems: r.problems.filter(
|
||||||
|
(p) => (!code || p.code === code) && (!key || p.groups?.some((g) => g.toLowerCase() === key)),
|
||||||
|
),
|
||||||
|
}))
|
||||||
|
.filter((r) => r.problems.length);
|
||||||
|
const counts = {};
|
||||||
|
for (const r of items) for (const p of r.problems) counts[p.code] = (counts[p.code] || 0) + 1;
|
||||||
|
return {
|
||||||
|
builtAt: idx.builtAt,
|
||||||
|
documents: idx.docs.length,
|
||||||
|
problems: items.reduce((n, r) => n + r.problems.length, 0),
|
||||||
|
counts,
|
||||||
|
failed: doc || group || code ? [] : idx.failed,
|
||||||
|
items,
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
// University-wide directory: every catalog document parsed once and searched
|
// University-wide directory: every catalog document parsed once and searched
|
||||||
// by teacher, room and date. Answers come from the Word files only, so every
|
// by teacher, room and date. Answers come from the Word files only, so every
|
||||||
// response carries its coverage and the caller must present it as such.
|
// response carries its coverage and the caller must present it as such.
|
||||||
|
import { catalogDiagnostics } from "./diagnostics.js";
|
||||||
import { getCatalog, getCalendar } from "./source.js";
|
import { getCatalog, getCalendar } from "./source.js";
|
||||||
import { scheduleFor } from "./schedules.js";
|
import { scheduleFor } from "./schedules.js";
|
||||||
import {
|
import {
|
||||||
@@ -188,6 +189,8 @@ export const indexStatus = () =>
|
|||||||
failed: index.failed.length,
|
failed: index.failed.length,
|
||||||
builtAt: index.builtAt,
|
builtAt: index.builtAt,
|
||||||
rebuilding: Boolean(building),
|
rebuilding: Boolean(building),
|
||||||
|
// Cells that look misread, listed by /api/diagnostics.
|
||||||
|
problems: catalogDiagnostics(index).problems,
|
||||||
}
|
}
|
||||||
: { documents: 0, rebuilding: Boolean(building) };
|
: { documents: 0, rebuilding: Boolean(building) };
|
||||||
|
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import { rateLimit, semaphore } from "./limits.js";
|
|||||||
import { apiError, describe } from "./errors.js";
|
import { apiError, describe } from "./errors.js";
|
||||||
import { createHash } from "node:crypto";
|
import { createHash } from "node:crypto";
|
||||||
import { timetable } from "./timetable.js";
|
import { timetable } from "./timetable.js";
|
||||||
|
import { catalogDiagnostics } from "./diagnostics.js";
|
||||||
import {
|
import {
|
||||||
getIndex,
|
getIndex,
|
||||||
indexStatus,
|
indexStatus,
|
||||||
@@ -45,8 +46,9 @@ app.use("/api", (_req, res, next) => {
|
|||||||
// 2 — /api/timetable for the Android client; 3 — its range=semester;
|
// 2 — /api/timetable for the Android client; 3 — its range=semester;
|
||||||
// 4 — compression, ETag revalidation, throttled refresh and import limits;
|
// 4 — compression, ETag revalidation, throttled refresh and import limits;
|
||||||
// 5 — error codes (`code` beside `error`, see server/errors.js), timetable 304 before any work;
|
// 5 — error codes (`code` beside `error`, see server/errors.js), timetable 304 before any work;
|
||||||
// 6 — the timetable carries the group's exams and credits from other catalog documents.
|
// 6 — the timetable carries the group's exams and credits from other catalog documents;
|
||||||
const API_VERSION = 6;
|
// 7 — /api/diagnostics, cells the parser could not read with confidence.
|
||||||
|
const API_VERSION = 7;
|
||||||
|
|
||||||
// Liveness plus what the server currently reads from the university, without network calls.
|
// Liveness plus what the server currently reads from the university, without network calls.
|
||||||
app.get("/api/health", async (_req, res) => {
|
app.get("/api/health", async (_req, res) => {
|
||||||
@@ -163,6 +165,16 @@ app.get("/api/exams", async (req, res, next) => {
|
|||||||
next(e);
|
next(e);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
// Cells of catalog documents that look misread: a new layout or a typo in Word, with the
|
||||||
|
// original text, so they can be checked against the document and the parser taught.
|
||||||
|
app.get("/api/diagnostics", async (req, res, next) => {
|
||||||
|
try {
|
||||||
|
const text = (name) => String(req.query[name] || "").slice(0, 60);
|
||||||
|
res.json(catalogDiagnostics(await getIndex(), { group: text("group"), doc: text("doc"), code: text("code") }));
|
||||||
|
} catch (e) {
|
||||||
|
next(e);
|
||||||
|
}
|
||||||
|
});
|
||||||
app.get("/api/catalog", async (req, res, next) => {
|
app.get("/api/catalog", async (req, res, next) => {
|
||||||
try {
|
try {
|
||||||
res.json(await getCatalog(req.query.refresh === "1"));
|
res.json(await getCatalog(req.query.refresh === "1"));
|
||||||
|
|||||||
123
server/parser.js
123
server/parser.js
@@ -6,9 +6,9 @@ import { mkdtemp, readFile, writeFile, rm } from "node:fs/promises";
|
|||||||
import { tmpdir } from "node:os";
|
import { tmpdir } from "node:os";
|
||||||
import { join } from "node:path";
|
import { join } from "node:path";
|
||||||
import { createHash } from "node:crypto";
|
import { createHash } from "node:crypto";
|
||||||
import { parseWeekRanges, parseTextDates, DATE_LIST } from "../shared/weeks.js";
|
import { parseWeekRanges, parseTextDates, DATE_LIST, weekday } from "../shared/weeks.js";
|
||||||
const run = promisify(execFile);
|
const run = promisify(execFile);
|
||||||
export const PARSER_VERSION = 11;
|
export const PARSER_VERSION = 12;
|
||||||
const days = [
|
const days = [
|
||||||
"понедельник",
|
"понедельник",
|
||||||
"вторник",
|
"вторник",
|
||||||
@@ -46,10 +46,15 @@ function timesIn(value) {
|
|||||||
? { start: times[0], end: times.at(-1), original: value }
|
? { start: times[0], end: times.at(-1), original: value }
|
||||||
: null;
|
: null;
|
||||||
}
|
}
|
||||||
|
// One part of a week mark, "6-12" or "2,4", with its optional "н."; a mark is several parts
|
||||||
|
// joined by ";" or "," ("1-4н.;6-12н.", "2-5 н., 10-17 н.", "1-9;15,16н.") ending in "н".
|
||||||
|
const WEEK_PART = String.raw`\d{1,2}(?:\s*[-–,]\s*\d{1,2})*(?:\s*н(?:ед)?\.?)?`;
|
||||||
|
const WEEK_MARK = new RegExp(
|
||||||
|
String.raw`^(?:(?:с|со)\s*)?${WEEK_PART}(?:\s*[;,]\s*${WEEK_PART})*(?<=н|нед|н\.|нед\.)(?:\s*\.)?\s*`,
|
||||||
|
"i",
|
||||||
|
);
|
||||||
function conditionIn(value) {
|
function conditionIn(value) {
|
||||||
const m = value.match(
|
const m = value.match(WEEK_MARK);
|
||||||
/^(?:(?:с|со)\s*)?\d{1,2}(?:\s*[-–,]\s*\d{1,2})*\s*(?:н(?:ед)?\.?)(?:\s*\.)?\s*/i,
|
|
||||||
);
|
|
||||||
if (m) return m[0].trim();
|
if (m) return m[0].trim();
|
||||||
// Some university cells omit the week suffix (for example 1-8,10-17).
|
// Some university cells omit the week suffix (for example 1-8,10-17).
|
||||||
const range = value.match(
|
const range = value.match(
|
||||||
@@ -131,11 +136,7 @@ export function details(raw) {
|
|||||||
}
|
}
|
||||||
// Split only at an explicit new week condition. Keep unfamiliar wording intact.
|
// Split only at an explicit new week condition. Keep unfamiliar wording intact.
|
||||||
function alternatives(raw) {
|
function alternatives(raw) {
|
||||||
return raw
|
return raw.split(new RegExp(String.raw`\n(?=${WEEK_MARK.source.slice(1)})`, "i")).filter(Boolean);
|
||||||
.split(
|
|
||||||
/\n(?=(?:(?:с|со)\s*)?\d{1,2}(?:\s*[-–,]\s*\d{1,2})*\s*н(?:ед)?\.?)/i,
|
|
||||||
)
|
|
||||||
.filter(Boolean);
|
|
||||||
}
|
}
|
||||||
export function readDocx(buffer) {
|
export function readDocx(buffer) {
|
||||||
let zip;
|
let zip;
|
||||||
@@ -226,6 +227,43 @@ export function readDocx(buffer) {
|
|||||||
* columns is "Д.н." (the weekday with its date), "Время" and "Дисциплина, преподаватель,
|
* columns is "Д.н." (the weekday with its date), "Время" and "Дисциплина, преподаватель,
|
||||||
* аудитория", whose columns split in two where the subgroups have separate laboratory classes.
|
* аудитория", whose columns split in two where the subgroups have separate laboratory classes.
|
||||||
*/
|
*/
|
||||||
|
/**
|
||||||
|
* A date that opens a cell: "13.10 Химия", "3.12 Физика", "24.11. Графика", "12.09.26г. Алгебра",
|
||||||
|
* "09.09.Материалы". A one-digit day only below 7, so "9.10" stays ambiguous rather than a date.
|
||||||
|
*/
|
||||||
|
export function leadingDate(text, yearStart) {
|
||||||
|
const m = text.match(/^(\d{1,2})\.(\d{2})(?:\.(\d{4}|\d{2})(?!\d))?\.?(?:\s*г\.?)?(?=\s|[А-ЯЁа-яё])/u);
|
||||||
|
if (!m) return null;
|
||||||
|
const day = Number(m[1]), month = Number(m[2]);
|
||||||
|
if (day < 1 || day > 31 || month < 1 || month > 12 || (m[1].length === 1 && day >= 7)) return null;
|
||||||
|
const year = m[3] ? (m[3].length === 2 ? `20${m[3]}` : m[3]) : yearStart ? (month >= 8 ? Number(yearStart) : Number(yearStart) + 1) : null;
|
||||||
|
return {
|
||||||
|
text: m[0].trim(),
|
||||||
|
length: m[0].length,
|
||||||
|
date: year ? `${year}-${m[2]}-${m[1].padStart(2, "0")}` : null,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Times of their own that open a cell, for a curator's hour or a late pair: "16.50 Кураторский час",
|
||||||
|
* "9.00 Информационный час", "18.35. Налоговое право", "11:10-11:30 – информационный час",
|
||||||
|
* "17.00 и 18.35 Русский язык". With `loose`, also "20.10", which reads as a date as well.
|
||||||
|
*/
|
||||||
|
export function leadingTime(text, loose = false) {
|
||||||
|
const hm = (h, m) => `${h.padStart(2, "0")}:${m}`;
|
||||||
|
const range = text.match(/^([0-2]?\d)[.:]([0-5]\d)\s*[-–]\s*([0-2]?\d)[.:]([0-5]\d)(?=\s)/);
|
||||||
|
if (range && Number(range[1]) <= 23 && Number(range[3]) <= 23)
|
||||||
|
return { starts: [hm(range[1], range[2])], end: hm(range[3], range[4]), length: range[0].length };
|
||||||
|
const T = String.raw`[0-2]?\d[.:][0-5]\d`;
|
||||||
|
const list = text.match(new RegExp(String.raw`^${T}(?:\s*(?:и|\+|,)\s*${T})*\.?(?=\s|[А-ЯЁа-яё])`, "u"));
|
||||||
|
if (!list) return null;
|
||||||
|
const times = [...list[0].matchAll(/([0-2]?\d)([.:])([0-5]\d)/g)];
|
||||||
|
// One unmistakable time ("18.35+20.10") vouches for the others in the list.
|
||||||
|
const clear = ([, , sep, m]) => sep === ":" || Number(m) > 12 || m === "00";
|
||||||
|
if (!loose && !times.some(clear)) return null;
|
||||||
|
// Lessons run from 7 to 22: "3.12" next to a clear time is still not a time.
|
||||||
|
if (times.some((t) => Number(t[1]) > 23 || (!clear(t) && (Number(t[1]) < 7 || Number(t[1]) > 21)))) return null;
|
||||||
|
return { starts: times.map(([, h, , m]) => hm(h, m)), end: null, length: list[0].length };
|
||||||
|
}
|
||||||
function weekBlocks(rows) {
|
function weekBlocks(rows) {
|
||||||
for (let i = 0; i < Math.min(rows.length, 4); i++) {
|
for (let i = 0; i < Math.min(rows.length, 4); i++) {
|
||||||
const cells = rows[i];
|
const cells = rows[i];
|
||||||
@@ -411,43 +449,25 @@ export function parseDocx(buffer, source = {}) {
|
|||||||
rows[i + 1]?.find((c) => c.col === cell.col)?.merge === "continue";
|
rows[i + 1]?.find((c) => c.col === cell.col)?.merge === "continue";
|
||||||
for (const alternative of alternatives(raw)) {
|
for (const alternative of alternatives(raw)) {
|
||||||
// "Единый день информирования 10.09;15.10;19.11;17.12": the dates are not part of the subject.
|
// "Единый день информирования 10.09;15.10;19.11;17.12": the dates are not part of the subject.
|
||||||
const data = details(alternative.replace(DATE_LIST, "").replace(/[ \t]{2,}/g, " ").trim());
|
const read = (text) => {
|
||||||
|
const data = details(text.replace(DATE_LIST, "").replace(/[ \t]{2,}/g, " ").trim());
|
||||||
if (credits && data.type === "Занятие") data.type = "Зачёт";
|
if (credits && data.type === "Занятие") data.type = "Зачёт";
|
||||||
const dateCandidate = alternative.match(
|
return data;
|
||||||
/^(\d{2})[.](\d{2})(?:[.](\d{4}))?\s/,
|
};
|
||||||
);
|
let data = read(alternative);
|
||||||
const singleDate =
|
// "20.10" is 20 October or the eighth pair at 20:10. A date on another weekday than
|
||||||
dateCandidate &&
|
// the row, or followed by a week mark, is the time.
|
||||||
Number(dateCandidate[1]) >= 1 &&
|
let lead = leadingTime(alternative) || leadingDate(alternative, yearStart);
|
||||||
Number(dateCandidate[1]) <= 31 &&
|
if (lead?.date) {
|
||||||
Number(dateCandidate[2]) >= 1 &&
|
const after = alternative.slice(lead.length).trim();
|
||||||
Number(dateCandidate[2]) <= 12
|
const time = leadingTime(alternative, true);
|
||||||
? dateCandidate
|
if (time && (weekday(lead.date) !== day || WEEK_MARK.test(after))) lead = time;
|
||||||
: null;
|
|
||||||
const explicitTime = alternative.match(
|
|
||||||
/^([0-2]?\d)([.:])([0-5]\d)\s+/,
|
|
||||||
);
|
|
||||||
const ownTime =
|
|
||||||
explicitTime &&
|
|
||||||
Number(explicitTime[1]) <= 23 &&
|
|
||||||
(explicitTime[2] === ":" || Number(explicitTime[3]) > 12)
|
|
||||||
? `${explicitTime[1].padStart(2, "0")}:${explicitTime[3]}`
|
|
||||||
: null;
|
|
||||||
const oneDate =
|
|
||||||
singleDate && (singleDate[3] || academicYear)
|
|
||||||
? `${singleDate[3] || academicYear}-${singleDate[2]}-${singleDate[1]}`
|
|
||||||
: null;
|
|
||||||
if (singleDate) {
|
|
||||||
data.condition = singleDate[0].trim();
|
|
||||||
data.subject = details(
|
|
||||||
alternative.slice(singleDate[0].length),
|
|
||||||
).subject;
|
|
||||||
}
|
}
|
||||||
if (ownTime) {
|
const oneDate = lead?.date || null;
|
||||||
data.subject = details(
|
if (lead) {
|
||||||
alternative.slice(explicitTime[0].length),
|
// The rest of the cell is an ordinary entry: "17.00 1 нед. Математика (пр.) …".
|
||||||
).subject;
|
data = read(alternative.slice(lead.length).replace(/^[\s–—:-]+/, ""));
|
||||||
data.condition = "";
|
if (oneDate) data.condition = lead.text;
|
||||||
}
|
}
|
||||||
const subgroups = sessionColumns
|
const subgroups = sessionColumns
|
||||||
? []
|
? []
|
||||||
@@ -463,17 +483,18 @@ export function parseDocx(buffer, source = {}) {
|
|||||||
group: r.group,
|
group: r.group,
|
||||||
label: `Подгруппа ${cell.col - r.col + 1}`,
|
label: `Подгруппа ${cell.col - r.col + 1}`,
|
||||||
}));
|
}));
|
||||||
const id = createHash("sha256")
|
// "17.00 и 18.35 Русский язык": one lesson at each time.
|
||||||
.update([source.name, i, cell.col, alternative].join("|"))
|
for (const [n, start] of (lead?.starts || [null]).entries())
|
||||||
.digest("hex")
|
|
||||||
.slice(0, 16);
|
|
||||||
lessons.push({
|
lessons.push({
|
||||||
id,
|
id: createHash("sha256")
|
||||||
|
.update([source.name, i, cell.col, alternative, n || ""].join("|"))
|
||||||
|
.digest("hex")
|
||||||
|
.slice(0, 16),
|
||||||
day,
|
day,
|
||||||
date: date || oneDate,
|
date: date || oneDate,
|
||||||
pair: pair || null,
|
pair: pair || null,
|
||||||
...time,
|
...time,
|
||||||
...(ownTime ? { start: ownTime, end: null } : {}),
|
...(start && { start, end: lead.end }),
|
||||||
...data,
|
...data,
|
||||||
...overrides,
|
...overrides,
|
||||||
groups: targetGroups,
|
groups: targetGroups,
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ const MONTHS = [
|
|||||||
const DAY_MS = 86400000;
|
const DAY_MS = 86400000;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* "6-13н", "1-4,6-11н.", "с 3н.", "со 2 нед.", "1-8,10-17" → [[6, 13]], [[1, 4], [6, 11]], [[3, null]]…
|
* "6-13н", "1-4,6-11н.", "1-4н.;6-12н.", "с 3н.", "со 2 нед.", "1-8,10-17" → [[6, 13]], [[1, 4], [6, 11]], [[3, null]]…
|
||||||
* Returns null when the text is empty or not a pure week list.
|
* Returns null when the text is empty or not a pure week list.
|
||||||
*/
|
*/
|
||||||
export function parseWeekRanges(condition) {
|
export function parseWeekRanges(condition) {
|
||||||
@@ -28,10 +28,12 @@ export function parseWeekRanges(condition) {
|
|||||||
if (!text) return null;
|
if (!text) return null;
|
||||||
const from = text.match(/^(?:с|со)\s*(\d{1,2})\s*(?:н(?:ед)?)?[.\s]*$/);
|
const from = text.match(/^(?:с|со)\s*(\d{1,2})\s*(?:н(?:ед)?)?[.\s]*$/);
|
||||||
if (from) return [[Number(from[1]), null]];
|
if (from) return [[Number(from[1]), null]];
|
||||||
// "с 4-16н" reads as an ordinary range.
|
// "с 4-16н" reads as an ordinary range; "1-4н.;6-12н." and "2-5 н., 10-17 н." as one list.
|
||||||
text = text
|
text = text
|
||||||
.replace(/^(?:с|со)\s+/, "")
|
.replace(/^(?:с|со)\s+/, "")
|
||||||
.replace(/\s*н(?:ед)?[.\s]*$/, "")
|
.replace(/\s*н(?:ед)?[.\s]*$/, "")
|
||||||
|
.replace(/\s*н(?:ед)?\.?\s*(?=[;,])/g, "")
|
||||||
|
.replace(/\s*;\s*/g, ",")
|
||||||
.trim();
|
.trim();
|
||||||
if (!/^\d{1,2}(?:\s*[-–,]\s*\d{1,2})*$/.test(text)) return null;
|
if (!/^\d{1,2}(?:\s*[-–,]\s*\d{1,2})*$/.test(text)) return null;
|
||||||
const ranges = [];
|
const ranges = [];
|
||||||
|
|||||||
84
test/diagnostics.test.js
Normal file
84
test/diagnostics.test.js
Normal file
@@ -0,0 +1,84 @@
|
|||||||
|
import { test } from "node:test";
|
||||||
|
import assert from "node:assert/strict";
|
||||||
|
import { diagnose, catalogDiagnostics } from "../server/diagnostics.js";
|
||||||
|
|
||||||
|
const lesson = (raw, fields = {}) => ({
|
||||||
|
day: 1,
|
||||||
|
start: "09:00",
|
||||||
|
end: "10:20",
|
||||||
|
subject: raw,
|
||||||
|
condition: "",
|
||||||
|
weekRanges: null,
|
||||||
|
dates: [],
|
||||||
|
date: null,
|
||||||
|
groups: ["25-АРХ"],
|
||||||
|
subgroups: [],
|
||||||
|
raw,
|
||||||
|
...fields,
|
||||||
|
});
|
||||||
|
const codes = (...lessons) =>
|
||||||
|
diagnose({ academicYear: "2026", groups: ["25-АРХ"], lessons }).map((p) => p.code);
|
||||||
|
|
||||||
|
test("Диагностика: обычные занятия без замечаний", () => {
|
||||||
|
assert.deepEqual(
|
||||||
|
codes(
|
||||||
|
lesson("Химия (л.) Иванов И.И. 101", { subject: "Химия" }),
|
||||||
|
lesson("1-8н. Физика", { subject: "Физика", condition: "1-8н.", weekRanges: [[1, 8]] }),
|
||||||
|
lesson("Единый день 07.09;14.09", { subject: "Единый день", dates: ["2026-09-07", "2026-09-14"] }),
|
||||||
|
),
|
||||||
|
[],
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
test("Диагностика: пометка недель прочитана не целиком", () => {
|
||||||
|
assert.deepEqual(
|
||||||
|
codes(lesson("1-4н.;6-12н. Политэкономия", { subject: "6-12н. Политэкономия", condition: "1-4н.", weekRanges: [[1, 4]] })),
|
||||||
|
["weeks_partly"],
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
test("Диагностика: дата и время в начале ячейки", () => {
|
||||||
|
assert.deepEqual(codes(lesson("24.11. Компьютерная графика")), ["date_in_subject"]);
|
||||||
|
assert.deepEqual(codes(lesson("3.12 Микроконтроллеры")), ["date_in_subject"]);
|
||||||
|
assert.deepEqual(codes(lesson("9.00 Информационный час")), ["time_in_subject"]);
|
||||||
|
assert.deepEqual(codes(lesson("11:10-11:30 – информационный час")), ["time_in_subject"]);
|
||||||
|
});
|
||||||
|
|
||||||
|
test("Диагностика: опечатка в дате, нечитаемые недели, даты не того дня", () => {
|
||||||
|
assert.deepEqual(
|
||||||
|
codes(lesson("19,11, 03.12, 17.12 Микроконтроллеры", { subject: "Микроконтроллеры", condition: "19,11,", weekRanges: null })),
|
||||||
|
["weeks_like_date"],
|
||||||
|
);
|
||||||
|
assert.deepEqual(
|
||||||
|
codes(lesson("2,6-12-16н Управление проектами", { subject: "Управление проектами", condition: "2,6-12-16н" })),
|
||||||
|
["weeks_unreadable"],
|
||||||
|
);
|
||||||
|
// 2026-10-13 is a Tuesday, the row is Monday's.
|
||||||
|
assert.deepEqual(codes(lesson("13.10 Информационный час", { subject: "Информационный час", date: "2026-10-13" })), [
|
||||||
|
"date_weekday",
|
||||||
|
]);
|
||||||
|
assert.deepEqual(codes(lesson("15 октября Экскурсия", { subject: "Экскурсия" })), ["dates_unread"]);
|
||||||
|
});
|
||||||
|
|
||||||
|
test("Диагностика каталога: фильтры по группе и коду", () => {
|
||||||
|
const doc = (id, groups, lessons) => ({
|
||||||
|
id,
|
||||||
|
file: { name: `${id}.docx`, faculty: "ИСФ" },
|
||||||
|
schedule: { academicYear: "2026", groups, lessons, source: {} },
|
||||||
|
});
|
||||||
|
const idx = {
|
||||||
|
builtAt: "2026-10-19T00:00:00Z",
|
||||||
|
failed: [],
|
||||||
|
docs: [
|
||||||
|
doc("a", ["25-АРХ"], [lesson("9.00 Информационный час")]),
|
||||||
|
doc("b", ["24-ДС"], [lesson("3.12 Химия", { groups: ["24-ДС"] })]),
|
||||||
|
doc("c", ["23-ИТ"], [lesson("Химия", { groups: ["23-ИТ"] })]),
|
||||||
|
],
|
||||||
|
};
|
||||||
|
const all = catalogDiagnostics(idx);
|
||||||
|
assert.equal(all.documents, 3);
|
||||||
|
assert.equal(all.problems, 2);
|
||||||
|
assert.deepEqual(all.counts, { time_in_subject: 1, date_in_subject: 1 });
|
||||||
|
assert.deepEqual(catalogDiagnostics(idx, { group: "24-дс" }).items.map((i) => i.doc.id), ["b"]);
|
||||||
|
assert.deepEqual(catalogDiagnostics(idx, { code: "time_in_subject" }).items.map((i) => i.doc.id), ["a"]);
|
||||||
|
});
|
||||||
@@ -1,7 +1,8 @@
|
|||||||
import test from "node:test";
|
import test from "node:test";
|
||||||
import assert from "node:assert/strict";
|
import assert from "node:assert/strict";
|
||||||
import { readFileSync } from "node:fs";
|
import { readFileSync } from "node:fs";
|
||||||
import { groupsIn, parseDocx, parseWord } from "../server/parser.js";
|
import { groupsIn, parseDocx, parseWord, details, leadingDate, leadingTime } from "../server/parser.js";
|
||||||
|
import { parseWeekRanges } from "../shared/weeks.js";
|
||||||
import { decodeListing, fileMetadata } from "../server/source.js";
|
import { decodeListing, fileMetadata } from "../server/source.js";
|
||||||
const fixture = (name) =>
|
const fixture = (name) =>
|
||||||
readFileSync(new URL(`./fixtures/${name}.docx`, import.meta.url));
|
readFileSync(new URL(`./fixtures/${name}.docx`, import.meta.url));
|
||||||
@@ -236,3 +237,39 @@ test("Расписание зачетов: дата перед днём неде
|
|||||||
],
|
],
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test("Пометки недель из нескольких частей через «;» и «,»", () => {
|
||||||
|
for (const [cell, condition, ranges] of [
|
||||||
|
["1-4н.;6-12н. Современная политэкономия (п.з.)", "1-4н.;6-12н.", [[1, 4], [6, 12]]],
|
||||||
|
["1-4;10-14н. Материаловедение и технологии (л.)", "1-4;10-14н.", [[1, 4], [10, 14]]],
|
||||||
|
["2,4н.;10-16н. Охрана труда (л.з.)", "2,4н.;10-16н.", [[2, 2], [4, 4], [10, 16]]],
|
||||||
|
["2-5 н., 10-17 н. Конструкция автомобиля (л.)", "2-5 н., 10-17 н.", [[2, 5], [10, 17]]],
|
||||||
|
]) {
|
||||||
|
const d = details(cell);
|
||||||
|
assert.equal(d.condition, condition, cell);
|
||||||
|
assert.deepEqual(parseWeekRanges(d.condition), ranges, cell);
|
||||||
|
assert.ok(!/^\d/.test(d.subject), d.subject);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
test("Дата и время в начале ячейки", () => {
|
||||||
|
assert.equal(leadingDate("3.12 Микроконтроллерные устройства", 2026).date, "2026-12-03");
|
||||||
|
assert.equal(leadingDate("24.11. Алгоритмы компьютерной графики", 2026).date, "2026-11-24");
|
||||||
|
assert.equal(leadingDate("09.09.Конструкционные материалы", 2026).date, "2026-09-09");
|
||||||
|
assert.equal(leadingDate("12.09.26г. Аналитическая геометрия", 2026).date, "2026-09-12");
|
||||||
|
assert.equal(leadingDate("14.02 Химия", 2026).date, "2027-02-14");
|
||||||
|
// Not dates: a time, an ambiguous one-digit day, a list handled by DATE_LIST.
|
||||||
|
assert.equal(leadingDate("9.00 Информационный час", 2026), null);
|
||||||
|
assert.equal(leadingDate("9.10 Химия", 2026), null);
|
||||||
|
assert.equal(leadingDate("03.12, 17.12 Химия", 2026), null);
|
||||||
|
|
||||||
|
assert.deepEqual(leadingTime("11:10-11:30 – информационный час"), { starts: ["11:10"], end: "11:30", length: 11 });
|
||||||
|
assert.deepEqual(leadingTime("9.00 Информационный час").starts, ["09:00"]);
|
||||||
|
assert.deepEqual(leadingTime("18.35. Налоговое право").starts, ["18:35"]);
|
||||||
|
assert.deepEqual(leadingTime("17.00 и 18.35 Русский язык").starts, ["17:00", "18:35"]);
|
||||||
|
assert.deepEqual(leadingTime("18.35+20.10 Новополоцк").starts, ["18:35", "20:10"]);
|
||||||
|
// "20.10" is also 20 October: only taken as a time when the caller says so.
|
||||||
|
assert.equal(leadingTime("20.10 Теория государственного управления"), null);
|
||||||
|
assert.deepEqual(leadingTime("20.10 Теория государственного управления", true).starts, ["20:10"]);
|
||||||
|
assert.equal(leadingTime("3.12 Микроконтроллерные устройства", true), null);
|
||||||
|
});
|
||||||
|
|||||||
44
test/snapshot.test.js
Normal file
44
test/snapshot.test.js
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
import { test } from "node:test";
|
||||||
|
import assert from "node:assert/strict";
|
||||||
|
import { readFileSync, readdirSync, writeFileSync, existsSync, mkdirSync } from "node:fs";
|
||||||
|
import { parseDocx } from "../server/parser.js";
|
||||||
|
import { diagnose } from "../server/diagnostics.js";
|
||||||
|
import { snapshotOf, diffLines } from "../scripts/snapshot-lines.js";
|
||||||
|
|
||||||
|
// Every fixture parsed and compared line by line with test/snapshots/<name>.txt, together with
|
||||||
|
// the cells diagnostics flags. After an intended parser change: UPDATE_SNAPSHOTS=1 npm test,
|
||||||
|
// then read the diff of test/snapshots/ before committing it.
|
||||||
|
const fixtures = new URL("./fixtures/", import.meta.url);
|
||||||
|
const snapshots = new URL("./snapshots/", import.meta.url);
|
||||||
|
const update = process.env.UPDATE_SNAPSHOTS === "1";
|
||||||
|
// The bell schedule and the week table are calendar documents, not timetables.
|
||||||
|
const calendars = new Set(["bells.docx", "weeks.docx"]);
|
||||||
|
|
||||||
|
for (const file of readdirSync(fixtures).filter((f) => f.endsWith(".docx") && !calendars.has(f)).sort()) {
|
||||||
|
test(`снимок разбора: ${file}`, () => {
|
||||||
|
const meta = existsSync(new URL(`${file}.json`, fixtures))
|
||||||
|
? JSON.parse(readFileSync(new URL(`${file}.json`, fixtures), "utf8"))
|
||||||
|
: {};
|
||||||
|
const schedule = parseDocx(readFileSync(new URL(file, fixtures)), {
|
||||||
|
name: meta.name || file,
|
||||||
|
modified: meta.modified,
|
||||||
|
});
|
||||||
|
const lines = [
|
||||||
|
...snapshotOf(schedule),
|
||||||
|
...diagnose(schedule).map((p) => `! ${p.code} | ${(p.raw || p.groups?.join(",") || "").replace(/\s+/g, " ")}`),
|
||||||
|
];
|
||||||
|
const target = new URL(file.replace(/\.docx$/, ".txt"), snapshots);
|
||||||
|
if (update || !existsSync(target)) {
|
||||||
|
mkdirSync(snapshots, { recursive: true });
|
||||||
|
writeFileSync(target, lines.join("\n") + "\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const saved = readFileSync(target, "utf8").trimEnd().split("\n");
|
||||||
|
const { removed, added } = diffLines(saved, lines);
|
||||||
|
assert.ok(
|
||||||
|
!removed.length && !added.length,
|
||||||
|
`Разбор ${file} изменился (UPDATE_SNAPSHOTS=1 npm test, если так и задумано):\n` +
|
||||||
|
[...removed.map((l) => ` − ${l}`), ...added.map((l) => ` + ${l}`)].join("\n"),
|
||||||
|
);
|
||||||
|
});
|
||||||
|
}
|
||||||
69
test/snapshots/fef-23-ba.txt
Normal file
69
test/snapshots/fef-23-ba.txt
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
# Осенний семестр · 23-ЛГ, 23-БА
|
||||||
|
вт 08:30–09:55 | нед. 6-14, нижняя строка | Моделирование и проектирование логистических систем | Лабораторная | 342 | Пальчевская Т.С. | 23-ЛГ,23-ЛГ/п2
|
||||||
|
вт 08:30–09:55 | нед. 7-15, верхняя строка | Моделирование и проектирование логистических систем | Лабораторная | 342 | Пальчевская Т.С. | 23-ЛГ,23-ЛГ/п1
|
||||||
|
вт 10:05–11:30 | нед. 1-13 | Моделирование и проектирование логистических систем | Практика | 121 | Пальчевская Т.С. | 23-ЛГ
|
||||||
|
вт 10:05–11:30 | нед. 14-16 | Управление запасами | Лекция | 121 | Малей Е.Б. | 23-ЛГ
|
||||||
|
вт 10:05–11:30 | нед. 16, нижняя строка | Принятие управленческих решений и экономическая безопасность | Лекция | 331 | Гайдова М.В. | 23-БА
|
||||||
|
вт 10:05–11:30 | нед. 4-14, нижняя строка | Бизнес-анализ | Практика | 331 | Костюченко Е.А. | 23-БА
|
||||||
|
вт 11:45–13:10 | нед. 1-6,8-16 | Распределительная логистика | Лекция | 121 | Дубко Н.А. | 23-ЛГ
|
||||||
|
вт 11:45–13:10 | нед. 2-15 | Бизнес-анализ | Практика | 331 | Костюченко Е.А. | 23-БА
|
||||||
|
вт 11:45–13:10 | нед. 7 | Распределительная логистика | Практика | 121 | Пальчевская Т.С. | 23-ЛГ
|
||||||
|
вт 13:40–15:05 | каждую неделю | Распределительная логистика | Практика | 121 | Пальчевская Т.С. | 23-ЛГ
|
||||||
|
вт 13:40–15:05 | нед. 1-3,6-10,12-17 | Управление проектами | Лекция | 331 | Емельянов А.А. | 23-БА
|
||||||
|
вт 15:20–16:45 | нед. 1-17 | Управление проектами | Практика | 331 | Паньков П.И. | 23-БА
|
||||||
|
вт 15:20–16:45 | нед. 6-14, нижняя строка | Управление запасами | Лабораторная | 342 | Пальчевская Т.С. | 23-ЛГ,23-ЛГ/п1
|
||||||
|
вт 15:20–16:45 | нед. 7-15, верхняя строка | Управление запасами | Лабораторная | 342 | Пальчевская Т.С. | 23-ЛГ,23-ЛГ/п2
|
||||||
|
вт 17:00–18:25 | нед. 13-17, верхняя строка | Управление проектами | Практика | 331 | Паньков П.И. | 23-БА
|
||||||
|
пн 10:05–11:30 | нед. 3-13 | Корпоративная социальная ответственность | Лекция | 121 | Скопьюк В.А. | 23-БА
|
||||||
|
пн 11:45–13:10 | каждую неделю | Моделирование и проектирование логистических систем | Лекция | 123 | Пальчевская Т.С. | 23-ЛГ
|
||||||
|
пн 11:45–13:10 | нед. 3 | Корпоративная социальная ответственность | Лекция | 121 | Скопьюк В.А. | 23-БА
|
||||||
|
пн 11:45–13:10 | нед. с 4 | Принятие управленческих решений и экономическая безопасность | Лекция | 121 | Гайдова М.В. | 23-БА
|
||||||
|
пн 13:40–15:05 | нед. 1,2 | Моделирование и проектирование логистических систем | Лекция | 123 | Пальчевская Т.С. | 23-ЛГ
|
||||||
|
пн 13:40–15:05 | нед. 3 | Корпоративная социальная ответственность | Практика | 121 | Селезнева А.А. | 23-БА
|
||||||
|
пн 13:40–15:05 | нед. 4-16 | Принятие управленческих решений и экономическая безопасность | Практика | 121 | Горбатенко А.А. | 23-БА
|
||||||
|
пн 13:40–15:05 | нед. с 3 | Финансовая логистика | Лекция | 123 | Веретенникова Е.С. | 23-ЛГ
|
||||||
|
пн 15:20–16:45 | нед. 3-13 | Корпоративная социальная ответственность | Практика | 121 | Селезнева А.А. | 23-БА
|
||||||
|
пн 15:20–16:45 | нед. с 3 | Финансовая логистика | Практика | 123 | Веретенникова Е.С. | 23-ЛГ
|
||||||
|
пн 16:50 | каждую неделю | Информационный (кураторский) час | Занятие | 129 | Костюченко Е.А. | 23-БА
|
||||||
|
пн 17:00–18:25 | нед. 10-16, нижняя строка | Финансовая логистика | Практика | 123 | Веретенникова Е.С. | 23-ЛГ
|
||||||
|
пн 17:00–18:25 | нед. 9-15, верхняя строка | Финансовая логистика | Лекция | 123 | Веретенникова Е.С. | 23-ЛГ
|
||||||
|
пт 08:30–09:55 | нед. 6-13 | Инновационный менеджмент | Практика | 333 | Селезнева А.А. | 23-БА
|
||||||
|
пт 08:30–09:55 | нед. 8,9 | Распределительная логистика | Лекция | 121 | Дубко Н.А. | 23-ЛГ
|
||||||
|
пт 10:05–11:30 | нед. 1-4,6-11 | PR-менеджмент | Лекция | 129 | Потросова Е.С. | 23-БА
|
||||||
|
пт 10:05–11:30 | нед. 12-15 | Инновационный менеджмент | Практика | 129 | Селезнева А.А. | 23-БА
|
||||||
|
пт 10:05–11:30 | нед. 16 | Бизнес-планирование | Практика | 129 | Камеко О.А. | 23-БА
|
||||||
|
пт 10:05–11:30 | нед. 2-15 | Управление персоналом в логистике | Лекция | 121 | Дубко Н.А. | 23-ЛГ
|
||||||
|
пт 11:45–13:10 | нед. 2-15 | Управление персоналом в логистике | Практика | 121 | Дубко Н.А. | 23-ЛГ
|
||||||
|
пт 11:45–13:10 | нед. 3,4,6-16 | Бизнес-анализ | Лекция | 326 | Войтенок Ж.Е. | 23-БА
|
||||||
|
пт 13:40–15:05 | нед. 2-6 | Логистика в электронной торговле | Лекция | 121 | Розина А.П. | 23-ЛГ
|
||||||
|
пт 13:40–15:05 | нед. 7-10 | Логистика в электронной торговле | Практика | 121 | Розина А.П. | 23-ЛГ
|
||||||
|
ср 08:30–09:55 | нед. 1-16 | Риск-менеджмент | Лекция | 129 | Измайлович С.В. | 23-БА
|
||||||
|
ср 10:05–11:30 | нед. 1-16 | Риск-менеджмент | Практика | 129 | Измайлович С.В. | 23-БА
|
||||||
|
ср 10:05–11:30 | нед. 1-16 | Управление запасами | Лекция | 123 | Малей Е.Б. | 23-ЛГ
|
||||||
|
ср 11:45–13:10 | каждую неделю, нижняя строка | Управление проектами | Лекция | 100 | Емельянов А.А. | 23-БА
|
||||||
|
ср 11:45–13:10 | нед. 5-17, верхняя строка | Инновационный менеджмент | Лекция | 271 | Горбатенко А.А. | 23-БА
|
||||||
|
ср 11:45–13:10 | нед. с 3 | Экспедирование грузов | Лекция | 123 | Мещерякова О.М. | 23-ЛГ
|
||||||
|
ср 13:40–15:05 | каждую неделю, нижняя строка | Логистика в электронной торговле | Лекция | 332 | Розина А.П. | 23-ЛГ
|
||||||
|
ср 13:40–15:05 | нед. с 3, верхняя строка | Логистика в электронной торговле | Практика | 332 | Розина А.П. | 23-ЛГ
|
||||||
|
ср 15:20–16:45 | нед. 7-11, верхняя строка | Логистика в электронной торговле | Лабораторная | 327 | Розина А.П. | 23-ЛГ,23-ЛГ/п1
|
||||||
|
ср 15:20–16:45 | нед. 8-12, нижняя строка | Логистика в электронной торговле | Лабораторная | 327 | Розина А.П. | 23-ЛГ,23-ЛГ/п2
|
||||||
|
чт 08:30–09:55 | нед. 2-11 | PR-менеджмент | Практика | 125 | Селезнева А.А. | 23-БА
|
||||||
|
чт 09:30 | каждую неделю | Информационный (кураторский) час | Занятие | 121 | Мещерякова О.М. | 23-ЛГ
|
||||||
|
чт 10:05–11:30 | каждую неделю | Управление запасами | Практика | 121 | Пальчевская Т.С. | 23-ЛГ
|
||||||
|
чт 10:05–11:30 | нед. 2, нижняя строка | Бизнес-планирование | Практика | 430 | Камеко О.А. | 23-БА
|
||||||
|
чт 10:05–11:30 | нед. 3,5, верхняя строка | Бизнес-планирование | Лекция | 430 | Лисиченок Е.П. | 23-БА
|
||||||
|
чт 10:05–11:30 | нед. 4-12, нижняя строка | Бизнес-анализ | Лекция | 430 | Войтенок Ж.Е. | 23-БА
|
||||||
|
чт 10:05–11:30 | нед. 7,9,11, верхняя строка | Бизнес-анализ | Лекция | 430 | Войтенок Ж.Е. | 23-БА
|
||||||
|
чт 11:45–13:10 | нед. 1-8,10-17 | Бизнес-планирование | Лекция | 430 | Лисиченок Е.П. | 23-БА
|
||||||
|
чт 11:45–13:10 | нед. 3-15 | Экспедирование грузов | Практика | 121 | Мещерякова О.М. | 23-ЛГ
|
||||||
|
чт 13:40–15:05 | даты 2026-09-10,2026-10-15,2026-11-19,2026-12-17 | Единый день информирования: 10 сентября, 15 октября, 19 ноября, 17 декабря. | Занятие | | | 23-ЛГ,23-БА
|
||||||
|
чт 13:40–15:05 | нед. 1,3-17 | Бизнес-планирование | Практика | 430 | Камеко О.А. | 23-БА
|
||||||
|
чт 13:40–15:05 | нед. 3-15, верхняя строка | Таможенная логистика | Лекция | 121 | Мещерякова О.М. | 23-ЛГ
|
||||||
|
чт 13:40–15:05 | нед. 4-16, нижняя строка | Таможенная логистика | Практика | 121 | Мещерякова О.М. | 23-ЛГ
|
||||||
|
чт 15:20–16:45 | нед. 12-16, нижняя строка | Инновационный менеджмент | Лекция | 333 | Горбатенко А.А. | 23-БА
|
||||||
|
чт 15:20–16:45 | нед. 13-17, верхняя строка | Принятие управленческих решений и экономическая безопасность | Практика | 333 | Горбатенко А.А. | 23-БА
|
||||||
|
чт 15:20–16:45 | нед. 3,5, верхняя строка | Таможенная логистика | Лекция | 121 | Мещерякова О.М. | 23-ЛГ
|
||||||
|
чт 15:20–16:45 | нед. 4-16, нижняя строка | Таможенная логистика | Практика | 121 | Мещерякова О.М. | 23-ЛГ
|
||||||
|
чт 15:20–16:45 | нед. 7-13, верхняя строка | Экспедирование грузов | Лекция | 121 | Мещерякова О.М. | 23-ЛГ
|
||||||
|
чт 15:20–16:45 | нед. 9,11, верхняя строка | Инновационный менеджмент | Лекция | 333 | Горбатенко А.А. | 23-БА
|
||||||
|
! weeks_unreadable | 2,6-12-16н Управление проектами (л.) Емельянов А.А. ауд. 100
|
||||||
144
test/snapshots/fit-daily.txt
Normal file
144
test/snapshots/fit-daily.txt
Normal file
@@ -0,0 +1,144 @@
|
|||||||
|
# Осенний семестр · 24-ИТ-1, 24-ИТ-2
|
||||||
|
2026-09-03 15:20–16:45 | один раз, верхняя строка | Разработка и анализ требований к программному обеспечению | Лабораторная | 218Д | Струк Т.М. | 24-ИТ-1,24-ИТ-1/п3
|
||||||
|
2026-09-03 15:20–16:45 | один раз, верхняя строка | Разработка и анализ требований к программному обеспечению | Лабораторная | 218Д | Струк Т.М. | 24-ИТ-2,24-ИТ-2/п3
|
||||||
|
2026-09-07 08:30–09:55 | один раз, нижняя строка | Разработка и анализ требований к програм-мному обеспечению | Лабораторная | 213А | Струк Т.М. | 24-ИТ-1,24-ИТ-1/п5
|
||||||
|
2026-09-07 08:30–09:55 | один раз, нижняя строка | Разработка и анализ требований к програм-мному обеспечению | Лабораторная | 213А | Струк Т.М. | 24-ИТ-2,24-ИТ-2/п5
|
||||||
|
2026-09-07 15:20–16:45 | один раз, нижняя строка | Разработка и анализ требований к программному обеспечению | Лабораторная | 218Д | Струк Т.М. | 24-ИТ-1,24-ИТ-1/п1
|
||||||
|
2026-09-07 15:20–16:45 | один раз, нижняя строка | Разработка и анализ требований к программному обеспечению | Лабораторная | 218Д | Струк Т.М. | 24-ИТ-2,24-ИТ-2/п1
|
||||||
|
2026-09-21 15:20–16:45 | один раз, нижняя строка | Разработка и анализ требований к программному обеспечению | Лабораторная | 218Д | Струк Т.М. | 24-ИТ-1,24-ИТ-1/п2
|
||||||
|
2026-09-21 15:20–16:45 | один раз, нижняя строка | Разработка и анализ требований к программному обеспечению | Лабораторная | 218Д | Струк Т.М. | 24-ИТ-2,24-ИТ-2/п2
|
||||||
|
2026-10-01 15:20–16:45 | один раз, верхняя строка | Разработка и анализ требований к программному обеспечению | Лабораторная | 218Д | Струк Т.М. | 24-ИТ-1,24-ИТ-1/п4
|
||||||
|
2026-10-01 15:20–16:45 | один раз, верхняя строка | Разработка и анализ требований к программному обеспечению | Лабораторная | 218Д | Струк Т.М. | 24-ИТ-2,24-ИТ-2/п4
|
||||||
|
вт 08:30–09:55 | каждую неделю, нижняя строка | Базы данных | Лекция | 254В | Скуковская А.А. | 24-ИТ-1,24-ИТ-2
|
||||||
|
вт 08:30–09:55 | нед. 1, верхняя строка | Базы данных | Лекция | 254В | Скуковская А.А. | 24-ИТ-1,24-ИТ-2
|
||||||
|
вт 08:30–09:55 | нед. 3, верхняя строка | Веб-технологии | Лекция | 211А | Дьякова А.С. | 24-ИТ-1,24-ИТ-2
|
||||||
|
вт 10:05–11:30 | каждую неделю, верхняя строка | Веб-технологии | Лекция | 211А | Дьякова А.С. | 24-ИТ-1,24-ИТ-2
|
||||||
|
вт 10:05–11:30 | нед. 2, нижняя строка | Метрология, стандартизация и сертификация (в информационных технологиях | Лекция | 211А | Михнович О.В. | 24-ИТ-1,24-ИТ-2
|
||||||
|
вт 10:05–11:30 | нед. 4, нижняя строка | Стандартизация программного обеспечения | Лекция | 211А | Михнович О.В. | 24-ИТ-1,24-ИТ-2
|
||||||
|
вт 11:45–13:10 | каждую неделю, верхняя строка | Метрология, стандартизация и сертификация (в информационных технологиях | Лекция | 321Д | Михнович О.В. | 24-ИТ-1,24-ИТ-2
|
||||||
|
вт 11:45–13:10 | каждую неделю, нижняя строка | Стандартизация программного обеспечения | Лекция | 321Д | Михнович О.В. | 24-ИТ-1,24-ИТ-2
|
||||||
|
вт 13:40–15:05 | каждую неделю, верхняя строка | Метрология, стандартизация и сертификация (в информационных технологиях | Практика | 321Д | Михнович О.В. | 24-ИТ-1,24-ИТ-2
|
||||||
|
вт 13:40–15:05 | каждую неделю, нижняя строка | Стандартизация программного обеспечения | Практика | 321Д | Михнович О.В. | 24-ИТ-1,24-ИТ-2
|
||||||
|
вт 15:20–16:45 | каждую неделю | Ф И З И Ч Е С К А Я К У Л Ь Т У Р А | Занятие | | | 24-ИТ-1,24-ИТ-2
|
||||||
|
пн 08:30–09:55 | каждую неделю, верхняя строка | Объектно-ориентированные технологии програм-мирования и стандарты проектирования | Лабораторная | 311А | Гордевич Д.А. | 24-ИТ-1,24-ИТ-1/п3
|
||||||
|
пн 08:30–09:55 | каждую неделю, верхняя строка | Объектно-ориентированные технологии програм-мирования и стандарты проектирования | Лабораторная | 311А | Гордевич Д.А. | 24-ИТ-2,24-ИТ-2/п3
|
||||||
|
пн 08:30–09:55 | каждую неделю, нижняя строка | Системное программирование | Лабораторная | 207Г | Юрчишко Е.И. | 24-ИТ-1,24-ИТ-1/п4
|
||||||
|
пн 08:30–09:55 | каждую неделю, нижняя строка | Системное программирование | Лабораторная | 207Г | Юрчишко Е.И. | 24-ИТ-2,24-ИТ-2/п4
|
||||||
|
пн 10:05–11:30 | каждую неделю | Системное программирование | Лабораторная | 217Д | Юрчишко Е.И. | 24-ИТ-1,24-ИТ-1/п5
|
||||||
|
пн 10:05–11:30 | каждую неделю | Системное программирование | Лабораторная | 217Д | Юрчишко Е.И. | 24-ИТ-2,24-ИТ-2/п5
|
||||||
|
пн 10:05–11:30 | каждую неделю, верхняя строка | Разработка и анализ требований к программному обеспечению | Лабораторная | 213А | Струк Т.М. | 24-ИТ-1,24-ИТ-1/п3
|
||||||
|
пн 10:05–11:30 | каждую неделю, верхняя строка | Разработка и анализ требований к программному обеспечению | Лабораторная | 213А | Струк Т.М. | 24-ИТ-2,24-ИТ-2/п3
|
||||||
|
пн 10:05–11:30 | каждую неделю, верхняя строка | Системное программирование | Лабораторная | 207Г | Юрчишко Е.И. | 24-ИТ-2,24-ИТ-2/п4
|
||||||
|
пн 10:05–11:30 | каждую неделю, нижняя строка | Разработка и анализ требований к програм-мному обеспечению | Лабораторная | 320Д | Струк Т.М. | 24-ИТ-1,24-ИТ-1/п4
|
||||||
|
пн 10:05–11:30 | каждую неделю, нижняя строка | Разработка и анализ требований к програм-мному обеспечению | Лабораторная | 320Д | Струк Т.М. | 24-ИТ-2,24-ИТ-2/п4
|
||||||
|
пн 11:45–13:10 | нед. 1-14 | Объектно-ориентированные технологии программирования и стандарты проектирования | Лекция | 220Д | Глухова Т.М. | 24-ИТ-1,24-ИТ-2
|
||||||
|
пн 11:45–13:10 | нед. 15-16 | Веб-технологии | Лекция | 220Д | Дьякова А.С. | 24-ИТ-1,24-ИТ-2
|
||||||
|
пн 13:40–15:05 | каждую неделю | Разработка и анализ требований к программному обеспечению | Лекция | 220Д | Струк Т.М. | 24-ИТ-1,24-ИТ-2
|
||||||
|
пн 15:20–16:45 | каждую неделю, верхняя строка | Веб-технологии | Лабораторная | 302Г | Аврусевич К.Д. | 24-ИТ-1,24-ИТ-1/п5
|
||||||
|
пн 15:20–16:45 | каждую неделю, верхняя строка | Веб-технологии | Лабораторная | 302Г | Аврусевич К.Д. | 24-ИТ-2,24-ИТ-2/п5
|
||||||
|
пн 15:20–16:45 | каждую неделю, верхняя строка | Разработка и анализ требований к програм-мному обеспечению | Лабораторная | 218Д | Струк Т.М. | 24-ИТ-1,24-ИТ-1/п2
|
||||||
|
пн 15:20–16:45 | каждую неделю, верхняя строка | Разработка и анализ требований к програм-мному обеспечению | Лабораторная | 218Д | Струк Т.М. | 24-ИТ-2,24-ИТ-2/п2
|
||||||
|
пн 15:20–16:45 | каждую неделю, верхняя строка | Системное программирование | Лабораторная | 217Д | Юрчишко Е.И. | 24-ИТ-1,24-ИТ-1/п4
|
||||||
|
пн 15:20–16:45 | каждую неделю, верхняя строка | Системное программирование | Лабораторная | 217Д | Юрчишко Е.И. | 24-ИТ-2,24-ИТ-2/п4
|
||||||
|
пн 15:20–16:45 | каждую неделю, нижняя строка | Системное программирование | Лабораторная | 217Д | Юрчишко Е.И. | 24-ИТ-1,24-ИТ-1/п3
|
||||||
|
пн 15:20–16:45 | каждую неделю, нижняя строка | Системное программирование | Лабораторная | 217Д | Юрчишко Е.И. | 24-ИТ-2,24-ИТ-2/п3
|
||||||
|
пн 17:00–18:25 | нед. 2, нижняя строка | Объектно-ориентированные технологии програм-мирования и стандарты проектирования | Лабораторная | 311А | Гордевич Д.А. | 24-ИТ-1,24-ИТ-1/п3
|
||||||
|
пн 17:00–18:25 | нед. 2, нижняя строка | Объектно-ориентированные технологии програм-мирования и стандарты проектирования | Лабораторная | 311А | Гордевич Д.А. | 24-ИТ-2,24-ИТ-2/п3
|
||||||
|
пт 08:30–09:55 | каждую неделю, верхняя строка | Системное программирование | Лабораторная | 207Г | Скуковская А.А. | 24-ИТ-1,24-ИТ-1/п1
|
||||||
|
пт 08:30–09:55 | каждую неделю, верхняя строка | Системное программирование | Лабораторная | 207Г | Скуковская А.А. | 24-ИТ-2,24-ИТ-2/п1
|
||||||
|
пт 08:30–09:55 | каждую неделю, нижняя строка | Математическое программирование | Лабораторная | 303Г | Пастухов Д.Ф. | 24-ИТ-1,24-ИТ-1/п3
|
||||||
|
пт 08:30–09:55 | каждую неделю, нижняя строка | Математическое программирование | Лабораторная | 303Г | Пастухов Д.Ф. | 24-ИТ-2,24-ИТ-2/п3
|
||||||
|
пт 08:30–09:55 | нед. 1, верхняя строка | Математическое программирование | Лабораторная | 302Г | Пастухов Д.Ф. | 24-ИТ-1,24-ИТ-1/п2
|
||||||
|
пт 08:30–09:55 | нед. 1, верхняя строка | Математическое программирование | Лабораторная | 302Г | Пастухов Д.Ф. | 24-ИТ-2,24-ИТ-2/п2
|
||||||
|
пт 08:30–09:55 | нед. 2, нижняя строка | Объектно-ориентированные технологии програм-мирования и стандарты проектирования | Лабораторная | 302Г | Гордевич Д.А. | 24-ИТ-1,24-ИТ-1/п1
|
||||||
|
пт 08:30–09:55 | нед. 2, нижняя строка | Объектно-ориентированные технологии програм-мирования и стандарты проектирования | Лабораторная | 302Г | Гордевич Д.А. | 24-ИТ-2,24-ИТ-2/п1
|
||||||
|
пт 08:30–09:55 | нед. 4, нижняя строка | Объектно- ориентированные технологии программи-рования и стандарты проектирования | Лабораторная | 302Г | Гордевич Д.А. | 24-ИТ-1,24-ИТ-1/п2
|
||||||
|
пт 08:30–09:55 | нед. 4, нижняя строка | Объектно- ориентированные технологии программи-рования и стандарты проектирования | Лабораторная | 302Г | Гордевич Д.А. | 24-ИТ-2,24-ИТ-2/п2
|
||||||
|
пт 10:05–11:30 | каждую неделю, верхняя строка | Веб-технологии | Лабораторная | 302Г | Аврусевич К.Д. | 24-ИТ-1,24-ИТ-1/п2
|
||||||
|
пт 10:05–11:30 | каждую неделю, верхняя строка | Веб-технологии | Лабораторная | 302Г | Аврусевич К.Д. | 24-ИТ-2,24-ИТ-2/п2
|
||||||
|
пт 10:05–11:30 | каждую неделю, верхняя строка | Математическое программирование | Лабораторная | 217Д | Пастухов Д.Ф. | 24-ИТ-1,24-ИТ-1/п4
|
||||||
|
пт 10:05–11:30 | каждую неделю, верхняя строка | Математическое программирование | Лабораторная | 217Д | Пастухов Д.Ф. | 24-ИТ-2,24-ИТ-2/п4
|
||||||
|
пт 10:05–11:30 | каждую неделю, верхняя строка | Системное программирование | Лабораторная | 207Г | Скуковская А.А. | 24-ИТ-1,24-ИТ-1/п1
|
||||||
|
пт 10:05–11:30 | каждую неделю, верхняя строка | Системное программирование | Лабораторная | 207Г | Скуковская А.А. | 24-ИТ-2,24-ИТ-2/п1
|
||||||
|
пт 10:05–11:30 | каждую неделю, нижняя строка | Веб-технологии | Лабораторная | 303Г | Аврусевич К.Д. | 24-ИТ-1,24-ИТ-1/п3
|
||||||
|
пт 10:05–11:30 | каждую неделю, нижняя строка | Веб-технологии | Лабораторная | 303Г | Аврусевич К.Д. | 24-ИТ-2,24-ИТ-2/п3
|
||||||
|
пт 10:05–11:30 | каждую неделю, нижняя строка | Математическое программирование | Лабораторная | | Пастухов Д.Ф. | 24-ИТ-1,24-ИТ-1/п1
|
||||||
|
пт 10:05–11:30 | каждую неделю, нижняя строка | Математическое программирование | Лабораторная | | Пастухов Д.Ф. | 24-ИТ-2,24-ИТ-2/п1
|
||||||
|
пт 10:05–11:30 | каждую неделю, нижняя строка | Системное программирование | Лабораторная | 207Г | Скуковская А.А. | 24-ИТ-1,24-ИТ-1/п2
|
||||||
|
пт 10:05–11:30 | каждую неделю, нижняя строка | Системное программирование | Лабораторная | 207Г | Скуковская А.А. | 24-ИТ-2,24-ИТ-2/п2
|
||||||
|
пт 10:05–11:30 | нед. 2, нижняя строка | Объектно-ориентированне технологии программи-рования и стандарты проектирования | Лабораторная | 217Д | Гордевич Д.А. | 24-ИТ-1,24-ИТ-1/п4
|
||||||
|
пт 10:05–11:30 | нед. 2, нижняя строка | Объектно-ориентированне технологии программи-рования и стандарты проектирования | Лабораторная | 217Д | Гордевич Д.А. | 24-ИТ-2,24-ИТ-2/п4
|
||||||
|
пт 10:05–11:30 | нед. 4, нижняя строка | Объектно- ориентированные технологии программи-рования и стандарты проектирования | Лабораторная | 217Д | Гордевич Д.А. | 24-ИТ-1,24-ИТ-1/п5
|
||||||
|
пт 10:05–11:30 | нед. 4, нижняя строка | Объектно- ориентированные технологии программи-рования и стандарты проектирования | Лабораторная | 217Д | Гордевич Д.А. | 24-ИТ-2,24-ИТ-2/п5
|
||||||
|
пт 11:45–13:10 | нед. 1-13 | Математическое программирование | Лекция | 321Д | Пастухов Д.Ф. | 24-ИТ-1,24-ИТ-2
|
||||||
|
пт 11:45–13:10 | нед. 14-15 | Базы данных | Лекция | 321Д | Скуковская А.А. | 24-ИТ-1,24-ИТ-2
|
||||||
|
пт 13:40–15:05 | каждую неделю | Системное программирование | Лекция | 254В | Скуковская А.А. | 24-ИТ-1,24-ИТ-2
|
||||||
|
пт 15:20–16:45 | каждую неделю | Системное программирование | Лекция | 254В | Скуковская А.А. | 24-ИТ-1,24-ИТ-2
|
||||||
|
сб 10:05–11:30 | нед. 1-13 | Основы информационной безопасности | Лекция | 321Д | Пастухов Ю.Ф. | 24-ИТ-1,24-ИТ-2
|
||||||
|
сб 11:45–13:10 | даты 2026-09-12,2026-09-26,2026-10-10,2026-10-24, нижняя строка | Основы информационной безопасности | Практика | 321Д | Пастухов Ю.Ф. | 24-ИТ-1
|
||||||
|
сб 11:45–13:10 | даты 2026-09-12,2026-09-26,2026-10-10,2026-10-24, нижняя строка | Основы информационной безопасности | Практика | 321Д | Пастухов Ю.Ф. | 24-ИТ-2
|
||||||
|
сб 11:45–13:10 | каждую неделю, верхняя строка | Основы информационной безопасности | Практика | 321Д | Пастухов Ю.Ф. | 24-ИТ-1
|
||||||
|
сб 11:45–13:10 | каждую неделю, верхняя строка | Основы информационной безопасности | Практика | 321Д | Пастухов Ю.Ф. | 24-ИТ-2
|
||||||
|
ср 10:05–11:30 | каждую неделю | со 2 по 14 нед. М о д у л ь « М а й н о р » | Занятие | | | 24-ИТ-1,24-ИТ-2
|
||||||
|
чт 08:30–09:55 | каждую неделю, нижняя строка | Системное программирование | Лабораторная | 311А | Скуковская А.А. | 24-ИТ-1,24-ИТ-1/п2
|
||||||
|
чт 08:30–09:55 | каждую неделю, нижняя строка | Системное программирование | Лабораторная | 311А | Скуковская А.А. | 24-ИТ-2,24-ИТ-2/п2
|
||||||
|
чт 10:05–11:30 | каждую неделю | Ф И З И Ч Е С К А Я К У Л Ь Т У Р А | Занятие | | | 24-ИТ-1,24-ИТ-2
|
||||||
|
чт 11:45–13:10 | каждую неделю, верхняя строка | Базы данных | Лабораторная | 218Д | Дьякова А.С. | 24-ИТ-1,24-ИТ-1/п2
|
||||||
|
чт 11:45–13:10 | каждую неделю, верхняя строка | Базы данных | Лабораторная | 218Д | Дьякова А.С. | 24-ИТ-2,24-ИТ-2/п2
|
||||||
|
чт 11:45–13:10 | каждую неделю, верхняя строка | Веб-технологии | Лабораторная | 207Г | Аврусевич К.Д. | 24-ИТ-1,24-ИТ-1/п4
|
||||||
|
чт 11:45–13:10 | каждую неделю, верхняя строка | Веб-технологии | Лабораторная | 207Г | Аврусевич К.Д. | 24-ИТ-2,24-ИТ-2/п4
|
||||||
|
чт 11:45–13:10 | каждую неделю, верхняя строка | Математическое программирование | Лабораторная | | Пастухов Д.Ф. | 24-ИТ-1,24-ИТ-1/п5
|
||||||
|
чт 11:45–13:10 | каждую неделю, верхняя строка | Математическое программирование | Лабораторная | | Пастухов Д.Ф. | 24-ИТ-2,24-ИТ-2/п5
|
||||||
|
чт 11:45–13:10 | каждую неделю, верхняя строка | Разработка и анализ требований к программному обеспечению | Лабораторная | 217Д | Струк Т.М. | 24-ИТ-1,24-ИТ-1/п1
|
||||||
|
чт 11:45–13:10 | каждую неделю, верхняя строка | Разработка и анализ требований к программному обеспечению | Лабораторная | 217Д | Струк Т.М. | 24-ИТ-2,24-ИТ-2/п1
|
||||||
|
чт 11:45–13:10 | каждую неделю, верхняя строка | Системное программирование | Лабораторная | 219Д | Юрчишко Е.И. | 24-ИТ-1,24-ИТ-1/п3
|
||||||
|
чт 11:45–13:10 | каждую неделю, верхняя строка | Системное программирование | Лабораторная | 219Д | Юрчишко Е.И. | 24-ИТ-2,24-ИТ-2/п3
|
||||||
|
чт 11:45–13:10 | каждую неделю, нижняя строка | Базы данных | Лабораторная | 218Д | Дьякова А.С. | 24-ИТ-1,24-ИТ-1/п3
|
||||||
|
чт 11:45–13:10 | каждую неделю, нижняя строка | Базы данных | Лабораторная | 218Д | Дьякова А.С. | 24-ИТ-2,24-ИТ-2/п3
|
||||||
|
чт 11:45–13:10 | каждую неделю, нижняя строка | Базы данных | Лабораторная | 219Д | Юрчишко Е.И. | 24-ИТ-1,24-ИТ-1/п4
|
||||||
|
чт 11:45–13:10 | каждую неделю, нижняя строка | Базы данных | Лабораторная | 219Д | Юрчишко Е.И. | 24-ИТ-2,24-ИТ-2/п4
|
||||||
|
чт 11:45–13:10 | каждую неделю, нижняя строка | Веб-технологии | Лабораторная | 207Г | Аврусевич К.Д. | 24-ИТ-1,24-ИТ-1/п1
|
||||||
|
чт 11:45–13:10 | каждую неделю, нижняя строка | Веб-технологии | Лабораторная | 207Г | Аврусевич К.Д. | 24-ИТ-2,24-ИТ-2/п1
|
||||||
|
чт 11:45–13:10 | каждую неделю, нижняя строка | Математическое программирование | Лабораторная | | Пастухов Д.Ф. | 24-ИТ-1,24-ИТ-1/п2
|
||||||
|
чт 11:45–13:10 | каждую неделю, нижняя строка | Математическое программирование | Лабораторная | | Пастухов Д.Ф. | 24-ИТ-2,24-ИТ-2/п2
|
||||||
|
чт 11:45–13:10 | каждую неделю, нижняя строка | Разработка и анализ требований к программному обеспечению | Лабораторная | 217Д | Струк Т.М. | 24-ИТ-1,24-ИТ-1/п5
|
||||||
|
чт 11:45–13:10 | каждую неделю, нижняя строка | Разработка и анализ требований к программному обеспечению | Лабораторная | 217Д | Струк Т.М. | 24-ИТ-2,24-ИТ-2/п5
|
||||||
|
чт 13:40–15:05 | даты 2026-09-10,2026-10-15,2026-11-19,2026-12-17 | Единый день информирования: 10 сентября, 15 октября, 19 ноября, 17 декабря | Занятие | | | 24-ИТ-1,24-ИТ-2
|
||||||
|
чт 13:40–15:05 | нед. 1, верхняя строка | Базы данных | Лабораторная | 217Д | Дьякова А.С. | 24-ИТ-1,24-ИТ-1/п3
|
||||||
|
чт 13:40–15:05 | нед. 1, верхняя строка | Базы данных | Лабораторная | 217Д | Дьякова А.С. | 24-ИТ-2,24-ИТ-2/п3
|
||||||
|
чт 13:40–15:05 | нед. 1, верхняя строка | Базы данных | Лабораторная | 219Д | Юрчишко Е.И. | 24-ИТ-1,24-ИТ-1/п4
|
||||||
|
чт 13:40–15:05 | нед. 1, верхняя строка | Базы данных | Лабораторная | 219Д | Юрчишко Е.И. | 24-ИТ-2,24-ИТ-2/п4
|
||||||
|
чт 13:40–15:05 | нед. 1, верхняя строка | Математическое программирование | Лабораторная | 207Г | Пастухов Д.Ф. | 24-ИТ-1,24-ИТ-1/п5
|
||||||
|
чт 13:40–15:05 | нед. 1, верхняя строка | Математическое программирование | Лабораторная | 207Г | Пастухов Д.Ф. | 24-ИТ-2,24-ИТ-2/п5
|
||||||
|
чт 13:40–15:05 | нед. 1, верхняя строка | Объектно- ориентированные технологии программи-рования и стандарты проектирования | Лабораторная | 311А | Гордевич Д.А. | 24-ИТ-1,24-ИТ-1/п2
|
||||||
|
чт 13:40–15:05 | нед. 1, верхняя строка | Объектно- ориентированные технологии программи-рования и стандарты проектирования | Лабораторная | 311А | Гордевич Д.А. | 24-ИТ-2,24-ИТ-2/п2
|
||||||
|
чт 13:40–15:05 | нед. 2, нижняя строка | Базы данных | Лабораторная | 217Д | Дьякова А.С. | 24-ИТ-1,24-ИТ-1/п1
|
||||||
|
чт 13:40–15:05 | нед. 2, нижняя строка | Базы данных | Лабораторная | 217Д | Дьякова А.С. | 24-ИТ-2,24-ИТ-2/п1
|
||||||
|
чт 13:40–15:05 | нед. 2, нижняя строка | Математическое программирование | Лабораторная | 219Д | Пастухов Д.Ф. | 24-ИТ-1,24-ИТ-1/п4
|
||||||
|
чт 13:40–15:05 | нед. 2, нижняя строка | Математическое программирование | Лабораторная | 219Д | Пастухов Д.Ф. | 24-ИТ-2,24-ИТ-2/п4
|
||||||
|
чт 13:40–15:05 | нед. 2, нижняя строка | Объектно- ориентированные технологии программи-рования и стандарты проектирования | Лабораторная | 311А | Гордевич Д.А. | 24-ИТ-1,24-ИТ-1/п5
|
||||||
|
чт 13:40–15:05 | нед. 2, нижняя строка | Объектно- ориентированные технологии программи-рования и стандарты проектирования | Лабораторная | 311А | Гордевич Д.А. | 24-ИТ-2,24-ИТ-2/п5
|
||||||
|
чт 13:40–15:05 | нед. 3, верхняя строка | Базы данных | Лабораторная | 217Д | Дьякова А.С. | 24-ИТ-1,24-ИТ-1/п2
|
||||||
|
чт 13:40–15:05 | нед. 3, верхняя строка | Базы данных | Лабораторная | 217Д | Дьякова А.С. | 24-ИТ-2,24-ИТ-2/п2
|
||||||
|
чт 13:40–15:05 | нед. 3, верхняя строка | Базы данных | Лабораторная | 219Д | Юрчишко Е.И. | 24-ИТ-1,24-ИТ-1/п5
|
||||||
|
чт 13:40–15:05 | нед. 3, верхняя строка | Базы данных | Лабораторная | 219Д | Юрчишко Е.И. | 24-ИТ-2,24-ИТ-2/п5
|
||||||
|
чт 13:40–15:05 | нед. 3, верхняя строка | Математическое программирование | Лабораторная | 207Г | Пастухов Д.Ф. | 24-ИТ-1,24-ИТ-1/п3
|
||||||
|
чт 13:40–15:05 | нед. 3, верхняя строка | Математическое программирование | Лабораторная | 207Г | Пастухов Д.Ф. | 24-ИТ-2,24-ИТ-2/п3
|
||||||
|
чт 13:40–15:05 | нед. 3, верхняя строка | Объектно- ориентированные технологии программи-рования и стандарты проектирования | Лабораторная | 311А | Гордевич Д.А. | 24-ИТ-1,24-ИТ-1/п1
|
||||||
|
чт 13:40–15:05 | нед. 3, верхняя строка | Объектно- ориентированные технологии программи-рования и стандарты проектирования | Лабораторная | 311А | Гордевич Д.А. | 24-ИТ-2,24-ИТ-2/п1
|
||||||
|
чт 13:40–15:05 | нед. 4, нижняя строка | Математическое программирование | Лабораторная | 217Д | Пастухов Д.Ф. | 24-ИТ-1,24-ИТ-1/п1
|
||||||
|
чт 13:40–15:05 | нед. 4, нижняя строка | Математическое программирование | Лабораторная | 217Д | Пастухов Д.Ф. | 24-ИТ-2,24-ИТ-2/п1
|
||||||
|
чт 13:40–15:05 | нед. 4, нижняя строка | Объектно- ориентированные технологии программи-рования и стандарты проектирования | Лабораторная | 311А | Гордевич Д.А. | 24-ИТ-1,24-ИТ-1/п4
|
||||||
|
чт 13:40–15:05 | нед. 4, нижняя строка | Объектно- ориентированные технологии программи-рования и стандарты проектирования | Лабораторная | 311А | Гордевич Д.А. | 24-ИТ-2,24-ИТ-2/п4
|
||||||
|
чт 15:20–16:45 | каждую неделю, верхняя строка | Базы данных | Лабораторная | 219Д | Юрчишко Е.И. | 24-ИТ-1,24-ИТ-1/п5
|
||||||
|
чт 15:20–16:45 | каждую неделю, верхняя строка | Базы данных | Лабораторная | 219Д | Юрчишко Е.И. | 24-ИТ-2,24-ИТ-2/п5
|
||||||
|
чт 15:20–16:45 | каждую неделю, нижняя строка | Базы данных | Лабораторная | 207Д | Дьякова А.С. | 24-ИТ-1,24-ИТ-1/п1
|
||||||
|
чт 15:20–16:45 | каждую неделю, нижняя строка | Базы данных | Лабораторная | 207Д | Дьякова А.С. | 24-ИТ-2,24-ИТ-2/п1
|
||||||
|
чт 15:20–16:45 | нед. 1, верхняя строка | Объектно- ориентированные технологии программи-рования и стандарты проектирования | Лабораторная | 311А | Гордевич Д.А. | 24-ИТ-1,24-ИТ-1/п2
|
||||||
|
чт 15:20–16:45 | нед. 1, верхняя строка | Объектно- ориентированные технологии программи-рования и стандарты проектирования | Лабораторная | 311А | Гордевич Д.А. | 24-ИТ-2,24-ИТ-2/п2
|
||||||
|
чт 15:20–16:45 | нед. 2, нижняя строка | Объектно- ориентированные технологии программи-рования и стандарты проектирования | Лабораторная | 311А | Гордевич Д.А. | 24-ИТ-1,24-ИТ-1/п5
|
||||||
|
чт 15:20–16:45 | нед. 2, нижняя строка | Объектно- ориентированные технологии программи-рования и стандарты проектирования | Лабораторная | 311А | Гордевич Д.А. | 24-ИТ-2,24-ИТ-2/п5
|
||||||
|
чт 15:20–16:45 | нед. 3, верхняя строка | Объектно- ориентированные технологии программи-рования и стандарты проектирования | Лабораторная | 311А | Гордевич Д.А. | 24-ИТ-1,24-ИТ-1/п1
|
||||||
|
чт 15:20–16:45 | нед. 3, верхняя строка | Объектно- ориентированные технологии программи-рования и стандарты проектирования | Лабораторная | 311А | Гордевич Д.А. | 24-ИТ-2,24-ИТ-2/п1
|
||||||
|
чт 15:20–16:45 | нед. 4, нижняя строка | Объектно- ориентированные технологии программи-рования и стандарты проектирования | Лабораторная | 311А | Гордевич Д.А. | 24-ИТ-1,24-ИТ-1/п4
|
||||||
|
чт 15:20–16:45 | нед. 4, нижняя строка | Объектно- ориентированные технологии программи-рования и стандарты проектирования | Лабораторная | 311А | Гордевич Д.А. | 24-ИТ-2,24-ИТ-2/п4
|
||||||
11
test/snapshots/fit.txt
Normal file
11
test/snapshots/fit.txt
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
# Установочная сессия · 26-ИТзс
|
||||||
|
2026-09-17 11:00–11:30 | один раз | Организационное собрание | Занятие | 220Д | Петрович О.Н. | 26-ИТзс
|
||||||
|
2026-09-17 11:45–13:10 | один раз | Основы информационных технологий и компьютерной графики | Лекция | 312А | Михнович О.В. | 26-ИТзс
|
||||||
|
2026-09-17 13:40–15:05 | один раз | Алгоритмы и структуры данных | Лекция | 211А | Струк Т.С. | 26-ИТзс
|
||||||
|
2026-09-18 08:30–09:55 | один раз | Линейная алгебра и аналитическая геометрия | Лекция | 200 (ДО) | Забелендик О.Н. | 26-ИТзс
|
||||||
|
2026-09-18 10:05–11:30 | один раз | Конструирование программного обеспечения | Лекция | 200 (ДО) | Струк Т.С. | 26-ИТзс
|
||||||
|
2026-09-18 11:45–13:10 | один раз | Белорусский язык | Практика | 200 (ДО) | Богорадова Т.Р. | 26-ИТзс
|
||||||
|
2026-09-18 13:40–15:05 | один раз | Основы алгоритмизации и программирования | Лекция | 200 (ДО) | Макарычева В.А. | 26-ИТзс
|
||||||
|
2026-09-18 15:20–16:45 | один раз | Иностранный язык | Практика | 200 (ДО) | Жизневская Л.В. | 26-ИТзс
|
||||||
|
2026-09-19 08:30–09:55 | один раз | Дискретная математика | Лекция | 211А | Забелендик О.Н. | 26-ИТзс
|
||||||
|
2026-09-19 10:05–11:30 | один раз | Математический анализ | Лекция | 211А | Забелендик О.Н. | 26-ИТзс
|
||||||
82
test/snapshots/fkne-daily.txt
Normal file
82
test/snapshots/fkne-daily.txt
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
# Осенний семестр · 24-КБ, 24-КФ
|
||||||
|
вт 08:30–09:55 | каждую неделю, верхняя строка | Электродинамика | Лекция | 220н | Вабищевич С.А. | 24-КФ
|
||||||
|
вт 08:30–09:55 | нед. 2-16, нижняя строка | Электродинамика | Практика | 220н | Вабищевич С.А. | 24-КФ
|
||||||
|
вт 10:05–11:30 | каждую неделю, верхняя строка | Методы оптимизации и исследования операций | Лабораторная | 333н | Скоромник О.В. | 24-КБ,24-КБ/п1
|
||||||
|
вт 10:05–11:30 | каждую неделю, верхняя строка | Надежность программного обеспечения | Лабораторная | 330 | Карабец Д.П. | 24-КБ,24-КБ/п2
|
||||||
|
вт 10:05–11:30 | каждую неделю, нижняя строка | Методы оптимизации и исследования операций | Лабораторная | 333н | Скоромник О.В. | 24-КБ,24-КБ/п2
|
||||||
|
вт 10:05–11:30 | каждую неделю, нижняя строка | Надежность программного обеспечения | Лабораторная | 330 | Карабец Д.П. | 24-КБ,24-КБ/п1
|
||||||
|
вт 10:05–11:30 | нед. 1-16 | Электродинамика | Практика | 220н | Вабищевич С.А. | 24-КФ
|
||||||
|
вт 11:45–13:10 | каждую неделю | Ф и з и ч е с к а я к у л ь т у р а | Занятие | | | 24-КБ,24-КФ
|
||||||
|
вт 13:40–15:05 | каждую неделю, верхняя строка | Методы численного анализа | Лекция | 418н | Сковородко М.А. | 24-КБ
|
||||||
|
вт 13:40–15:05 | каждую неделю, верхняя строка | Физика атома и введение в квантовую механику | Лекция | 220н | Окунев Д.О. | 24-КФ
|
||||||
|
вт 13:40–15:05 | каждую неделю, нижняя строка | Надежность программного обеспечения | Лабораторная | 330 | Карабец Д.П. | 24-КБ,24-КБ/п2
|
||||||
|
вт 13:40–15:05 | каждую неделю, нижняя строка | Объектно-ориентированное программирование | Лекция | 220н | Солдатенко П.Н. | 24-КФ
|
||||||
|
вт 15:20–16:45 | каждую неделю, верхняя строка | Методы оптимизации и исследования операций | Лабораторная | 333н | Скоромник О.В. | 24-КБ,24-КБ/п1
|
||||||
|
вт 15:20–16:45 | каждую неделю, верхняя строка | Физический практикум: физика атома | Занятие | 210н | Окунев Д.О. | 24-КФ,24-КФ/п1
|
||||||
|
вт 15:20–16:45 | каждую неделю, нижняя строка | Методы оптимизации и исследования операций | Лабораторная | 333н | Скоромник О.В. | 24-КБ,24-КБ/п2
|
||||||
|
вт 15:20–16:45 | каждую неделю, нижняя строка | Физический практикум: физика атома | Занятие | 210н | Окунев Д.О. | 24-КФ,24-КФ/п2
|
||||||
|
вт 15:20–16:45 | нед. 2-14, верхняя строка | Криптографические методы защиты информации | Лабораторная | 421н | Кухта С.В. | 24-КБ,24-КБ/п2
|
||||||
|
вт 17:00–18:25 | нед. 1-13, верхняя строка | Криптографические методы защиты информации | Лабораторная | 421н | Кухта С.В. | 24-КБ,24-КБ/п1
|
||||||
|
пн 08:30–09:55 | каждую неделю | Русский язык как иностранный (для иностранных студентов) | Занятие | 412н | Козыренко А.Н. | 24-КБ
|
||||||
|
пн 10:05–11:30 | каждую неделю | Уравнения математической физики | Лекция | 336н | Козлов А.А. | 24-КБ
|
||||||
|
пн 11:45–13:10 | каждую неделю | Операционные системы | Лекция | 343 | Бураченок А.Л. | 24-КБ
|
||||||
|
пн 11:45–13:10 | каждую неделю | Электродинамика | Лекция | 402н | Вабищевич С.А. | 24-КФ
|
||||||
|
пн 13:40–15:05 | каждую неделю | Компьютерные сети | Лекция | 336н | Лукьянов А.О. | 24-КБ
|
||||||
|
пн 13:40–15:05 | каждую неделю | Основы математического моделирования | Лекция | 520н | Сковородко М.А. | 24-КФ
|
||||||
|
пн 15:20–16:45 | каждую неделю | Методы оптимизации и исследования операций | Лекция | 327н | Скоромник О.В. | 24-КБ
|
||||||
|
пн 15:20–16:45 | каждую неделю, верхняя строка | Основы радиоэлектроники | Лекция | 406н | Грозберг Ю.Г. | 24-КФ
|
||||||
|
пн 15:20–16:45 | каждую неделю, нижняя строка | Физика атома и введение в квантовую механику | Практика | 230н | Окунев Д.О. | 24-КФ
|
||||||
|
пн 17:00–18:25 | каждую неделю, верхняя строка | Лабораторный спецпрактикум: Объектно-ориентированное программирование | Занятие | 215н | Жусель Д.В. | 24-КФ,24-КФ/п2
|
||||||
|
пн 17:00–18:25 | каждую неделю, верхняя строка | Надежность программного обеспечения | Лабораторная | 330 | Карабец Д.П. | 24-КБ,24-КБ/п1
|
||||||
|
пн 17:00–18:25 | каждую неделю, нижняя строка | Лабораторный спецпрактикум: Объектно-ориентированное программирование Солдатенко | Занятие | 215н | | 24-КФ,24-КФ/п1
|
||||||
|
пн 17:00–18:25 | нед. 14,16, нижняя строка | Основы радиоэлектроники | Лабораторная | 406н | Грозберг Ю.Г. | 24-КФ,24-КФ/п2
|
||||||
|
пн 17:00–18:25 | нед. 15,17, верхняя строка | Основы радиоэлектроники | Лабораторная | 406н | Грозберг Ю.Г. | 24-КФ,24-КФ/п1
|
||||||
|
пт 08:30–09:55 | каждую неделю, верхняя строка | Лабораторный спецпрактикум: Объектно-ориентированное программирование Солдатенко | Занятие | 215н | | 24-КФ,24-КФ/п1
|
||||||
|
пт 08:30–09:55 | каждую неделю, верхняя строка | Физический практикум: физика атома | Занятие | 210н | Окунев Д.О. | 24-КФ,24-КФ/п2
|
||||||
|
пт 08:30–09:55 | каждую неделю, нижняя строка | Лабораторный спецпрактикум: Объектно-ориентированное программирование | Занятие | 215н | Жусель Д.В. | 24-КФ,24-КФ/п2
|
||||||
|
пт 08:30–09:55 | каждую неделю, нижняя строка | Физический практикум: физика атома | Занятие | 210н | Окунев Д.О. | 24-КФ,24-КФ/п1
|
||||||
|
пт 10:05–11:30 | каждую неделю, верхняя строка | Лабораторный спецпрактикум: Объектно-ориентированное программирование Солдатенко | Занятие | 215н | | 24-КФ,24-КФ/п1
|
||||||
|
пт 10:05–11:30 | каждую неделю, верхняя строка | Физический практикум: физика атома | Занятие | 210н | Окунев Д.О. | 24-КФ,24-КФ/п2
|
||||||
|
пт 10:05–11:30 | каждую неделю, нижняя строка | Лабораторный спецпрактикум: Объектно-ориентированное программирование | Занятие | 215н | Жусель Д.В. | 24-КФ,24-КФ/п2
|
||||||
|
пт 10:05–11:30 | каждую неделю, нижняя строка | Физический практикум: физика атома | Занятие | 210н | Окунев Д.О. | 24-КФ,24-КФ/п1
|
||||||
|
пт 10:05–11:30 | нед. 1-13, верхняя строка | Криптографические методы защиты информации | Лабораторная | 421н | Кухта С.В. | 24-КБ,24-КБ/п1
|
||||||
|
пт 10:05–11:30 | нед. 2-14, нижняя строка | Криптографические методы защиты информации | Лабораторная | 421н | Кухта С.В. | 24-КБ,24-КБ/п2
|
||||||
|
пт 11:45–13:10 | каждую неделю | Надежность программного обеспечения | Лекция | 336н | Бураченок И.Б. | 24-КБ
|
||||||
|
пт 11:45–13:10 | каждую неделю | Физика атома и введение в квантовую механику | Лекция | 327н | Окунев Д.О. | 24-КФ
|
||||||
|
пт 13:40–15:05 | каждую неделю | Физика атома и введение в квантовую механику | Практика | 327н | Окунев Д.О. | 24-КФ
|
||||||
|
пт 13:40–15:05 | каждую неделю, верхняя строка | Защита от вредоносного программного обеспечения | Лабораторная | 330н | Сахаров Д.Н. | 24-КБ,24-КБ/п1
|
||||||
|
пт 13:40–15:05 | каждую неделю, нижняя строка | Защита от вредоносного программного обеспечения | Лабораторная | 330н | Сахаров Д.Н. | 24-КБ,24-КБ/п2
|
||||||
|
пт 13:40–15:05 | нед. 2-14, нижняя строка | Операционные системы | Лабораторная | 343 | Бураченок А.Л. | 24-КБ,24-КБ/п1
|
||||||
|
пт 13:40–15:05 | нед. 3,7-17, верхняя строка | Операционные системы | Лабораторная | 343 | Бураченок А.Л. | 24-КБ,24-КБ/п2
|
||||||
|
пт 15:20–16:45 | каждую неделю, верхняя строка | Защита от вредоносного программного обеспечения | Лабораторная | 330н | Сахаров Д.Н. | 24-КБ,24-КБ/п1
|
||||||
|
пт 15:20–16:45 | каждую неделю, нижняя строка | Защита от вредоносного программного обеспечения | Лабораторная | 330н | Сахаров Д.Н. | 24-КБ,24-КБ/п2
|
||||||
|
пт 15:20–16:45 | нед. 17, верхняя строка | Основы радиоэлектроники | Лабораторная | 406н | Грозберг Ю.Г. | 24-КФ
|
||||||
|
пт 15:20–16:45 | нед. 2-14, нижняя строка | Операционные системы | Лабораторная | 343 | Бураченок А.Л. | 24-КБ,24-КБ/п1
|
||||||
|
пт 15:20–16:45 | нед. 2-16, нижняя строка | Электродинамика | Практика | 230н | Вабищевич С.А. | 24-КФ
|
||||||
|
пт 15:20–16:45 | нед. 3,7-17, верхняя строка | Операционные системы | Лабораторная | 343 | Бураченок А.Л. | 24-КБ,24-КБ/п2
|
||||||
|
сб 08:30–09:55 | нед. 6-10 | Коррупция и ее общественная опасность | Лекция | 412н | Катушонок О.В. | 24-КБ,24-КФ
|
||||||
|
сб 10:05–11:30 | каждую неделю, верхняя строка | Компьютерные сети | Лабораторная | 215н | Филиппов Ю.И. | 24-КБ,24-КБ/п1
|
||||||
|
сб 10:05–11:30 | каждую неделю, нижняя строка | Компьютерные сети | Лабораторная | 215н | Филиппов Ю.И. | 24-КБ,24-КБ/п2
|
||||||
|
сб 11:45–13:10 | каждую неделю, верхняя строка | Компьютерные сети | Лабораторная | 215н | Филиппов Ю.И. | 24-КБ,24-КБ/п1
|
||||||
|
сб 11:45–13:10 | каждую неделю, нижняя строка | Компьютерные сети | Лабораторная | 215н | Филиппов Ю.И. | 24-КБ,24-КБ/п2
|
||||||
|
ср 10:05–11:30 | нед. 2-14 | Модуль «Майнор» | Занятие | | | 24-КБ,24-КФ
|
||||||
|
чт 08:30–09:55 | каждую неделю | Ф и з и ч е с к а я к у л ь т у р а 24-КФ: Русский язык как иностранный (для иностранных студентов) | Занятие | 537н | Кириллова В.С. | 24-КБ,24-КФ
|
||||||
|
чт 10:05–11:30 | каждую неделю, верхняя строка | Криптографические методы защиты информации | Лекция | 329н | Кухта С.В. | 24-КБ
|
||||||
|
чт 10:05–11:30 | каждую неделю, верхняя строка | Основы математического моделирования | Лабораторная | 215н | Сковородко М.А. | 24-КФ,24-КФ/п1
|
||||||
|
чт 10:05–11:30 | каждую неделю, верхняя строка | Основы радиоэлектроники | Лабораторная | 406н | Грозберг Ю.Г. | 24-КФ,24-КФ/п2
|
||||||
|
чт 10:05–11:30 | каждую неделю, нижняя строка | Криптографические методы защиты информации | Лекция | 321н | Кухта С.В. | 24-КБ
|
||||||
|
чт 10:05–11:30 | каждую неделю, нижняя строка | Основы математического моделирования | Лабораторная | 215н | Сковородко М.А. | 24-КФ,24-КФ/п2
|
||||||
|
чт 10:05–11:30 | каждую неделю, нижняя строка | Основы радиоэлектроники | Лабораторная | 406н | Грозберг Ю.Г. | 24-КФ,24-КФ/п1
|
||||||
|
чт 11:45–13:10 | каждую неделю, верхняя строка | Основы математического моделирования | Лабораторная | 215н | Сковородко М.А. | 24-КФ,24-КФ/п1
|
||||||
|
чт 11:45–13:10 | каждую неделю, верхняя строка | Основы радиоэлектроники | Лабораторная | 406н | Грозберг Ю.Г. | 24-КФ,24-КФ/п2
|
||||||
|
чт 11:45–13:10 | каждую неделю, нижняя строка | Основы математического моделирования | Лабораторная | 215н | Сковородко М.А. | 24-КФ,24-КФ/п2
|
||||||
|
чт 11:45–13:10 | нед. 1-16 | Защита от вредоносного программного обеспечения | Лекция | 423н | Кухта С.В. | 24-КБ
|
||||||
|
чт 11:45–13:10 | нед. 14,16, нижняя строка | Основы радиоэлектроники | Лабораторная | 406н | Грозберг Ю.Г. | 24-КФ,24-КФ/п1
|
||||||
|
чт 13:40–15:05 | даты 2026-09-10,2026-10-15,2026-11-19,2026-12-17 | Единый день информирования: 10 сентября, 15 октября, 19 ноября, 17 декабря. | Занятие | | | 24-КБ,24-КФ
|
||||||
|
чт 13:40–15:05 | каждую неделю, верхняя строка | История и методология физики | Лекция | 220н | Окунев Д.О. | 24-КФ
|
||||||
|
чт 13:40–15:05 | каждую неделю, верхняя строка | Методы численного анализа | Лабораторная | 215н | Сковородко М.А. | 24-КБ,24-КБ/п2
|
||||||
|
чт 13:40–15:05 | каждую неделю, верхняя строка | Уравнения математической физики | Лабораторная | 336н | Козлов А.А. | 24-КБ,24-КБ/п1
|
||||||
|
чт 13:40–15:05 | каждую неделю, нижняя строка | История и методология физики | Практика | 220н | Окунев Д.О. | 24-КФ
|
||||||
|
чт 13:40–15:05 | каждую неделю, нижняя строка | Методы численного анализа | Лабораторная | 215н | Сковородко М.А. | 24-КБ,24-КБ/п1
|
||||||
|
чт 13:40–15:05 | каждую неделю, нижняя строка | Уравнения математической физики | Лабораторная | 336н | Козлов А.А. | 24-КБ,24-КБ/п2
|
||||||
|
чт 15:20–16:45 | каждую неделю | Объектно-ориентированное программирование | Лекция | 220н | Солдатенко П.Н. | 24-КФ
|
||||||
8
test/snapshots/fkne.txt
Normal file
8
test/snapshots/fkne.txt
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
# Установочная сессия · 26-ЭЭТзс
|
||||||
|
2026-09-17 11:00–11:40 | один раз | Организационное собрание | Занятие | 515н | Бословяк С.В. | 26-ЭЭТзс
|
||||||
|
2026-09-17 11:45–13:10 | один раз | Инженерная графика | Лекция | 518н | Малаховская В.В. | 26-ЭЭТзс
|
||||||
|
2026-09-17 13:40–15:05 | один раз | Химия | Лекция | 427н | Фонин М.Ф. | 26-ЭЭТзс
|
||||||
|
2026-09-17 15:20–16:45 | один раз | Иностранный язык (англ.) | Практика | 526н 325н 502н | Кузнечик Е.В. Струй О.М. Филимончик Н.А. | 26-ЭЭТзс
|
||||||
|
2026-09-18 15:20–16:45 | один раз | Математика | Лекция | 336н | Козлов А.А. | 26-ЭЭТзс
|
||||||
|
2026-09-18 17:00–18:25 | один раз | Конструкционные материалы | Лекция | 412н | Молодечкина Т.В. | 26-ЭЭТзс
|
||||||
|
2026-09-18 18:35–20:00 | один раз | Информатика | Лекция | 412н | Иванова К.И. | 26-ЭЭТзс
|
||||||
61
test/snapshots/gf-daily.txt
Normal file
61
test/snapshots/gf-daily.txt
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
# Осенний семестр · 25-РГФ-1, 25-РГФ-2
|
||||||
|
вт 08:30–09:55 | каждую неделю | Немецкий язык | Практика | 336Е | Найверт Ю.О. | 25-РГФ-1
|
||||||
|
вт 10:05–11:30 | нед. 2-14 | Философия | Практика | 206Г | Андрейчик Е.В. | 25-РГФ-1,25-РГФ-2
|
||||||
|
вт 11:45–13:10 | каждую неделю | Английский язык | Практика | 133Е | Лагун А.М. | 25-РГФ-2
|
||||||
|
вт 11:45–13:10 | нед. 1-13 | История литературы страны изучаемого языка XVII века | Лекция | 305Г | Смулькевич А.А. | 25-РГФ-1
|
||||||
|
вт 13:40–15:05 | каждую неделю, верхняя строка | Основы перевода | Лекция | 203Г | Смулькевич А.А. | 25-РГФ-1
|
||||||
|
вт 13:40–15:05 | каждую неделю, верхняя строка | Основы перевода | Практика | 330Е | Семченок Л.И. | 25-РГФ-2
|
||||||
|
вт 13:40–15:05 | каждую неделю, нижняя строка | Политология | Лекция | 211А | Радюк А.Л. | 25-РГФ-1,25-РГФ-2
|
||||||
|
вт 15:20–16:45 | каждую неделю, нижняя строка | История языка | Лекция | 208А | Логвинова И.В. | 25-РГФ-2
|
||||||
|
вт 15:20–16:45 | каждую неделю, нижняя строка | Современный разговорный иностранный язык (англ.) | Практика | 203Г | Ковшик О.С. | 25-РГФ-1,25-РГФ-1/п1
|
||||||
|
вт 15:20–16:45 | каждую неделю, нижняя строка | Современный разговорный иностранный язык (англ.) | Практика | 304Г | Федорович Н.Я. | 25-РГФ-1,25-РГФ-1/п2
|
||||||
|
вт 15:20–16:45 | нед. с 3, верхняя строка | Политология | Практика | 206Г | Радюк А.Л. | 25-РГФ-1,25-РГФ-2
|
||||||
|
пн 08:30–09:55 | каждую неделю | Русский язык как иностранный | Практика | 305Г | Немирская В.А. | 25-РГФ-1,25-РГФ-1/п1
|
||||||
|
пн 10:05–11:30 | каждую неделю | Немецкий язык | Практика | 336Е | Найверт Ю.О. | 25-РГФ-1
|
||||||
|
пн 10:05–11:30 | каждую неделю | Основы перевода | Практика | 331Е | Семченок Л.И. | 25-РГФ-2
|
||||||
|
пн 11:45–13:10 | каждую неделю | ФИЗИЧЕСКАЯ КУЛЬТУРА | Занятие | | | 25-РГФ-1,25-РГФ-2
|
||||||
|
пн 13:40–15:05 | каждую неделю | Практика устной и письменной речи (англ.) | Практика | 331Е | Федорович Н.Я. | 25-РГФ-1,25-РГФ-1/п2
|
||||||
|
пн 13:40–15:05 | каждую неделю | Практическая фонетика (англ) | Практика | 319Д | Кунчевская А.В. | 25-РГФ-1,25-РГФ-1/п1
|
||||||
|
пн 13:40–15:05 | каждую неделю | Практическая фонетика (нем) | Практика | 330Е | Логвинова И.В. | 25-РГФ-2
|
||||||
|
пн 15:20–16:45 | каждую неделю | Английский язык | Практика | 248Ж | Лагун А.М. | 25-РГФ-2
|
||||||
|
пн 15:20–16:45 | каждую неделю | Немецкий язык | Практика | 336Е | Найверт Ю.О. | 25-РГФ-1
|
||||||
|
пт 08:30–09:55 | каждую неделю | Основы перевода | Практика | 208А | Семченок Л.И. | 25-РГФ-2
|
||||||
|
пт 08:30–09:55 | каждую неделю, верхняя строка | Русский язык как иностранный | Практика | 307Г | Немирская В.А. | 25-РГФ-1,25-РГФ-1/п1
|
||||||
|
пт 08:30–09:55 | каждую неделю, нижняя строка | Французский язык | Практика | 336Е | Глобенко М.В. | 25-РГФ-1
|
||||||
|
пт 10:05–11:30 | каждую неделю | История зарубежной литературы Средних веков и Возрождения | Практика | 305Г | Лушневская Е.В. | 25-РГФ-1,25-РГФ-2
|
||||||
|
пт 11:45–13:10 | каждую неделю | Основы перевода | Практика | 203Г | Смулькевич А.А. | 25-РГФ-1
|
||||||
|
пт 11:45–13:10 | нед. 1-13 | История литературы страны изучаемого языка XVII века | Лекция | 248Ж | Гордеенок Т.М. | 25-РГФ-2
|
||||||
|
пт 13:40–15:05 | каждую неделю | Практика устной и письменной речи (англ.) | Практика | 305Г | Ковшик О.С. | 25-РГФ-1,25-РГФ-1/п1
|
||||||
|
пт 13:40–15:05 | каждую неделю | Практическая грамматика (англ.) | Практика | 204Г | Федорович Н.Я. | 25-РГФ-1,25-РГФ-1/п2
|
||||||
|
пт 13:40–15:05 | нед. 1-13 | История литературы страны изучаемого языка XVII века | Практика | 248Ж | Гордеенок Т.М. | 25-РГФ-2
|
||||||
|
пт 15:20–16:45 | каждую неделю | Практика устной и письменной речи (нем.) | Практика | 248Ж | Белоусова Э.А. | 25-РГФ-2
|
||||||
|
пт 15:20–16:45 | каждую неделю | Практическая грамматика (англ.) | Практика | 305Г | Ковшик О.С. | 25-РГФ-1,25-РГФ-1/п1
|
||||||
|
пт 15:20–16:45 | каждую неделю | Практическая фонетика (англ) | Практика | 319Д | Кунчевская А.В. | 25-РГФ-1,25-РГФ-1/п2
|
||||||
|
сб 08:30–09:55 | каждую неделю, верхняя строка | Современный разговорный иностранный язык (англ.) | Практика | 104Г | Федорович Н.Я. | 25-РГФ-1,25-РГФ-1/п2
|
||||||
|
сб 08:30–09:55 | каждую неделю, верхняя строка | Современный разговорный иностранный язык (англ.) | Практика | 206Г | Ковшик О.С. | 25-РГФ-1,25-РГФ-1/п1
|
||||||
|
сб 08:30–09:55 | каждую неделю, верхняя строка | Современный разговорный иностранный язык (нем.) | Практика | 208А | Белоусова Э.А. | 25-РГФ-2
|
||||||
|
сб 10:05–11:30 | каждую неделю | Практика устной и письменной речи (англ.) | Практика | 206Г | Ковшик О.С. | 25-РГФ-1,25-РГФ-1/п1
|
||||||
|
сб 10:05–11:30 | каждую неделю, верхняя строка | Практика устной и письменной речи (англ.) | Практика | 104Г | Федорович Н.Я. | 25-РГФ-1,25-РГФ-1/п2
|
||||||
|
сб 10:05–11:30 | каждую неделю, верхняя строка | Современный разговорный иностранный язык (нем.) | Практика | 208А | Белоусова Э.А. | 25-РГФ-2
|
||||||
|
сб 11:45–13:10 | каждую неделю, верхняя строка | Коммуникативная грамматика | Практика | 208А | Белоусова Э.А. | 25-РГФ-2
|
||||||
|
ср 08:30–09:55 | нед. с 2 | Английский язык | Практика | 248Ж | Лагун А.М. | 25-РГФ-2
|
||||||
|
ср 10:05–11:30 | каждую неделю, верхняя строка | Современный разговорный иностранный язык (англ.) | Практика | 304Г | Ковшик О.С. | 25-РГФ-1,25-РГФ-1/п1
|
||||||
|
ср 10:05–11:30 | каждую неделю, нижняя строка | Коммуникативная грамматика | Практика | 304Г | Ковшик О.С. | 25-РГФ-1,25-РГФ-1/п1
|
||||||
|
ср 10:05–11:30 | каждую неделю, нижняя строка | Коммуникативная грамматика | Практика | 308Г | Протас А.А. | 25-РГФ-1,25-РГФ-1/п2
|
||||||
|
ср 10:05–11:30 | нед. 2-15 | История языка | Практика | 248Ж | Логвинова И.В. | 25-РГФ-2
|
||||||
|
ср 11:45–13:10 | нед. с 2 | Русский язык как иностранный | Практика | | Немирская В.А. | 25-РГФ-1,25-РГФ-2
|
||||||
|
ср 13:40–15:05 | нед. 2-15 | История языка | Практика | 305Г | Ковшик О.С. | 25-РГФ-1
|
||||||
|
ср 15:20–16:45 | нед. 2-15 | Философия | Лекция | 211А | Борун Е.Н. | 25-РГФ-1,25-РГФ-2
|
||||||
|
чт 08:30–09:55 | каждую неделю | Русский язык как иностранный | Практика | 307Г | Немирская В.А. | 25-РГФ-1,25-РГФ-1/п1
|
||||||
|
чт 08:30–09:55 | каждую неделю, верхняя строка | Современный разговорный иностранный язык (англ.) | Практика | 304Г | Федорович Н.Я. | 25-РГФ-1,25-РГФ-1/п2
|
||||||
|
чт 08:30–09:55 | каждую неделю, нижняя строка | Практика устной и письменной речи (англ.) | Практика | 304Г | Федорович Н.Я. | 25-РГФ-1,25-РГФ-1/п2
|
||||||
|
чт 10:05–11:30 | каждую неделю, верхняя строка | История зарубежной литературы Средних веков и Возрождения | Лекция | 305Г | Лушневская Е.В. | 25-РГФ-1,25-РГФ-2
|
||||||
|
чт 10:05–11:30 | каждую неделю, нижняя строка | История языка | Лекция | 305Г | Третьяк З.И. | 25-РГФ-1
|
||||||
|
чт 10:05–11:30 | каждую неделю, нижняя строка | Современный разговорный иностранный язык (нем.) | Практика | 248Ж | Белоусова Э.А. | 25-РГФ-2
|
||||||
|
чт 11:45–13:10 | каждую неделю | Английский язык | Практика | 248Ж | Лагун А.М. | 25-РГФ-2
|
||||||
|
чт 11:45–13:10 | каждую неделю | Основы перевода | Практика | 120Д | Смулькевич А.А. | 25-РГФ-1
|
||||||
|
чт 13:40–15:05 | даты 2026-09-10,2026-10-15,2026-11-19,2026-12-17 | Единый день информирования: 10 сентября, 15 октября, 19 ноября, 17 декабря | Занятие | | | 25-РГФ-1,25-РГФ-2
|
||||||
|
чт 13:40–15:05 | каждую неделю | Практика устной и письменной речи (нем.) | Практика | 248Ж | Белоусова Э.А. | 25-РГФ-2
|
||||||
|
чт 13:40–15:05 | нед. 1-13 | История литературы страны изучаемого языка XVII века | Практика | 319Д | Смулькевич А.А. | 25-РГФ-1
|
||||||
|
чт 15:20–16:45 | каждую неделю | Немецкий язык | Практика | 208А | Найверт Ю.О. | 25-РГФ-1
|
||||||
|
чт 15:20–16:45 | каждую неделю | Практическая грамматика (нем.) | Практика | 248Ж | Белоусова Э.А. | 25-РГФ-2
|
||||||
10
test/snapshots/isf-credits-26-arh.txt
Normal file
10
test/snapshots/isf-credits-26-arh.txt
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
# Зачёты · 26-АРХ
|
||||||
|
2026-10-27 17:00 | один раз | Введение в архитектурное проектирование | Консультация | 359 | Кузякова О.Д. | 26-АРХ
|
||||||
|
2026-10-31 08:30 | один раз | Введение в архитектурное проектирование | Зачёт | 359 | Кузякова О.Д. | 26-АРХ
|
||||||
|
2026-12-18 08:30 | один раз | Проектирование небольшого архитектурного сооружения | Консультация | 359 | Захаркина Г.И. | 26-АРХ
|
||||||
|
2026-12-18 15:20 | один раз | Рисунок | Консультация | 371 | Кузякова О.Д. | 26-АРХ
|
||||||
|
2026-12-19 11:45 | один раз | Архитектурная графика | Зачёт | 371 | Яцкевич Т.А. | 26-АРХ
|
||||||
|
2026-12-21 15:20 | один раз | Проектирование небольшого архитектурного сооружения | Зачёт | 356 | Захаркина Г.И. | 26-АРХ
|
||||||
|
2026-12-22 17:00 | один раз | Рисунок | Зачёт | 361 | Кузякова О.Д. | 26-АРХ,26-АРХ/п1
|
||||||
|
2026-12-22 17:00 | один раз | Рисунок | Зачёт | 370 | Пискун А.А. | 26-АРХ,26-АРХ/п2
|
||||||
|
2026-12-23 08:30 | один раз | Физическая культура (дополнительный вид обучения) | Зачёт | | | 26-АРХ
|
||||||
61
test/snapshots/isf-daily.txt
Normal file
61
test/snapshots/isf-daily.txt
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
# Осенний семестр · 26-ПГС-1, 26-ПГС-2
|
||||||
|
вт 10:05–11:30 | каждую неделю | Химия | Лекция | 100(с3нед.) | Емельянова В.А. | 26-ПГС-1,26-ПГС-2
|
||||||
|
вт 11:45–13:10 | каждую неделю | Физика | Лекция | 333н | Солдатенко П.Н. | 26-ПГС-1,26-ПГС-2
|
||||||
|
вт 13:40–15:05 | каждую неделю, верхняя строка | Начертательная геометрия, инженерная и машинная графика | Практика | 543н | Малаховская В.В. | 26-ПГС-2,26-ПГС-2/п1
|
||||||
|
вт 13:40–15:05 | каждую неделю, верхняя строка | Физика | Практика | 337н | Солдатенко П.Н. | 26-ПГС-1
|
||||||
|
вт 13:40–15:05 | каждую неделю, нижняя строка | Информатика | Лекция | 362 | Василевский А.В. | 26-ПГС-1,26-ПГС-2
|
||||||
|
вт 15:20–16:45 | каждую неделю | Химия | Лабораторная | | Аврамёнок А.Н. | 26-ПГС-1,26-ПГС-1/п2
|
||||||
|
вт 15:20–16:45 | каждую неделю, верхняя строка | Начертательная геометрия, инженерная и машинная графика | Практика | 543н | Малаховская В.В. | 26-ПГС-1,26-ПГС-1/п1
|
||||||
|
вт 15:20–16:45 | нед. 13-17 | Иванов В.П. ауд.403 | Занятие | 403 | Иванов В.П. | 26-ПГС-1,26-ПГС-1/п2
|
||||||
|
пн 10:05–11:30 | каждую неделю | История белорусской государственности | Лекция | 432 | Кордюкевич О.Г. | 26-ПГС-1,26-ПГС-2
|
||||||
|
пн 11:45–13:10 | каждую неделю, верхняя строка | История белорусской государственности | Практика | 425 | Кордюкевич О.Г. | 26-ПГС-1
|
||||||
|
пн 11:45–13:10 | каждую неделю, верхняя строка | Физика | Практика | 337н | Солдатенко П.Н. | 26-ПГС-2
|
||||||
|
пн 11:45–13:10 | каждую неделю, нижняя строка | Инженерная геодезия | Лабораторная | 325н | Шевелев И.П. | 26-ПГС-1,26-ПГС-1/п1
|
||||||
|
пн 11:45–13:10 | каждую неделю, нижняя строка | История белорусской государственности | Практика | 425 | Кордюкевич О.Г. | 26-ПГС-2
|
||||||
|
пн 11:45–13:10 | каждую неделю, нижняя строка | Начертательная геометрия, инженерная и машинная графика | Практика | 543н | Малаховская В.В. | 26-ПГС-1,26-ПГС-1/п3
|
||||||
|
пн 13:40–15:05 | каждую неделю | Физическая культура | Занятие | | | 26-ПГС-1,26-ПГС-2
|
||||||
|
пн 15:20–16:45 | каждую неделю | Начертательная геометрия, инженерная и машинная графика | Практика | 543н | Малаховская В.В. | 26-ПГС-2,26-ПГС-2/п2
|
||||||
|
пн 15:20–16:45 | каждую неделю | Химия | Лабораторная | | Аврамёнок А.Н. | 26-ПГС-1,26-ПГС-1/п1
|
||||||
|
пн 15:20–16:45 | каждую неделю, нижняя строка | Инженерная геодезия | Лабораторная | 325н | Шевелев И.П. | 26-ПГС-1,26-ПГС-1/п3
|
||||||
|
пн 15:20–16:45 | нед. 13-17 | Иванов В.П. ауд.403 | Занятие | 403 | Иванов В.П. | 26-ПГС-1,26-ПГС-1/п1
|
||||||
|
пт 10:05–11:30 | каждую неделю, верхняя строка | Иностранный язык | Практика | 541н | Каменная В.А. | 26-ПГС-1,26-ПГС-1/п1
|
||||||
|
пт 10:05–11:30 | каждую неделю, верхняя строка | Начертательная геометрия, инженерная и машинная графика | Практика | 543н | Малаховская В.В. | 26-ПГС-1,26-ПГС-1/п2
|
||||||
|
пт 10:05–11:30 | каждую неделю, верхняя строка | Физика | Лабораторная | 205н | Сивацкий Д.С. | 26-ПГС-2,26-ПГС-2/п1
|
||||||
|
пт 10:05–11:30 | каждую неделю, нижняя строка | Начертательная геометрия, инженерная и машинная графика | Практика | 543н | Малаховская В.В. | 26-ПГС-1,26-ПГС-1/п1
|
||||||
|
пт 10:05–11:30 | каждую неделю, нижняя строка | Физика | Лабораторная | 205н | Сивацкий Д.С. | 26-ПГС-2,26-ПГС-2/п2
|
||||||
|
пт 11:45–13:10 | каждую неделю | Информатика | Практика | 372 | Василевский А.В. | 26-ПГС-1
|
||||||
|
пт 11:45–13:10 | каждую неделю, верхняя строка | Инженерная геодезия | Лабораторная | 325н | Стегашева В.С. | 26-ПГС-2,26-ПГС-2/п2
|
||||||
|
пт 11:45–13:10 | каждую неделю, верхняя строка | Физика | Лабораторная | 205н | Сивацкий Д.С. | 26-ПГС-2,26-ПГС-2/п1
|
||||||
|
пт 11:45–13:10 | каждую неделю, нижняя строка | Инженерная геодезия | Лабораторная | 325н | Стегашева В.С. | 26-ПГС-2,26-ПГС-2/п1
|
||||||
|
пт 11:45–13:10 | каждую неделю, нижняя строка | Физика | Лабораторная | 205н | Сивацкий Д.С. | 26-ПГС-2,26-ПГС-2/п2
|
||||||
|
пт 13:40–15:05 | каждую неделю | Иностранный язык | Практика | 533н | Каменная В.А. | 26-ПГС-1,26-ПГС-1/п2
|
||||||
|
пт 13:40–15:05 | каждую неделю, верхняя строка | Информатика | Практика | 372 | Василевский А.В. | 26-ПГС-2
|
||||||
|
пт 13:40–15:05 | каждую неделю, верхняя строка | Механика жидкости и газа | Лабораторная | 104 | Бердашкевич В.В. | 26-ПГС-1,26-ПГС-1/п1
|
||||||
|
пт 13:40–15:05 | каждую неделю, нижняя строка | Начертательная геометрия, инженерная и машинная графика | Практика | 543н | Малаховская В.В. | 26-ПГС-2,26-ПГС-2/п1
|
||||||
|
пт 15:20–16:45 | каждую неделю, верхняя строка | Механика жидкости и газа | Лабораторная | 104 | Бердашкевич В.В. | 26-ПГС-2,26-ПГС-2/п1
|
||||||
|
пт 15:20–16:45 | каждую неделю, нижняя строка | Иностранный язык | Практика | 533н | Каменная В.А. | 26-ПГС-1,26-ПГС-1/п2
|
||||||
|
сб 08:30–09:55 | каждую неделю, верхняя строка | Информатика | Практика | 372 | Василевский А.В. | 26-ПГС-2
|
||||||
|
сб 08:30–09:55 | каждую неделю, верхняя строка | Физика | Лабораторная | 205н | Сивацкий Д.С. | 26-ПГС-1,26-ПГС-1/п1
|
||||||
|
сб 08:30–09:55 | каждую неделю, нижняя строка | Математика | Практика | 329н | Посниченко Г.Н. | 26-ПГС-2
|
||||||
|
сб 08:30–09:55 | каждую неделю, нижняя строка | Физика | Лабораторная | 205н | Сивацкий Д.С. | 26-ПГС-1,26-ПГС-1/п2
|
||||||
|
сб 10:05–11:30 | каждую неделю, верхняя строка | Физика | Лабораторная | 205н | Сивацкий Д.С. | 26-ПГС-1,26-ПГС-1/п1
|
||||||
|
сб 10:05–11:30 | каждую неделю, нижняя строка | Математика | Практика | 329н | Посниченко Г.Н. | 26-ПГС-2
|
||||||
|
сб 10:05–11:30 | каждую неделю, нижняя строка | Физика | Лабораторная | 205н | Сивацкий Д.С. | 26-ПГС-1,26-ПГС-1/п2
|
||||||
|
ср 08:30–09:55 | каждую неделю | Физическая культура | Занятие | | | 26-ПГС-1,26-ПГС-2
|
||||||
|
ср 10:05–11:30 | каждую неделю | Начертательная геометрия, инженерная и машинная графика | Лекция | 537н | Малаховская В.В. | 26-ПГС-1,26-ПГС-2
|
||||||
|
ср 11:45–13:10 | каждую неделю | Математика | Лекция | 333н | Посниченко Г.Н. | 26-ПГС-1,26-ПГС-2
|
||||||
|
ср 13:40–15:05 | каждую неделю | Иностранный язык | Практика | 533н | Минчукова Е.М. | 26-ПГС-2,26-ПГС-2/п1
|
||||||
|
ср 13:40–15:05 | каждую неделю | Иностранный язык | Практика | 535н | Струй О.М. | 26-ПГС-2,26-ПГС-2/п2
|
||||||
|
ср 13:40–15:05 | каждую неделю | Математика | Практика | 333н | Посниченко Г.Н. | 26-ПГС-1
|
||||||
|
ср 15:20–16:45 | каждую неделю, нижняя строка | Иностранный язык | Практика | 533н | Минчукова Е.М. | 26-ПГС-2,26-ПГС-2/п1
|
||||||
|
ср 15:20–16:45 | каждую неделю, нижняя строка | Иностранный язык | Практика | 535н | Струй О.М. | 26-ПГС-2,26-ПГС-2/п2
|
||||||
|
чт 09:15 | каждую неделю | Информационный час | Занятие | 269 | | 26-ПГС-2
|
||||||
|
чт 09:15 | каждую неделю | Информационный час | Занятие | 366 | | 26-ПГС-1
|
||||||
|
чт 10:05–11:30 | каждую неделю | Иностранный язык | Практика | 533н | Каменная В.А. | 26-ПГС-1,26-ПГС-1/п1
|
||||||
|
чт 10:05–11:30 | каждую неделю | Химия | Лабораторная | 403 | Аврамёнок А.Н. | 26-ПГС-2,26-ПГС-2/п1
|
||||||
|
чт 10:05–11:30 | каждую неделю, верхняя строка | Механика жидкости и газа | Лабораторная | 104 | Бердашкевич В.В. | 26-ПГС-1,26-ПГС-1/п2
|
||||||
|
чт 10:05–11:30 | каждую неделю, нижняя строка | Механика жидкости и газа | Лабораторная | 104 | Бердашкевич В.В. | 26-ПГС-2,26-ПГС-2/п2
|
||||||
|
чт 11:45–13:10 | каждую неделю | Инженерная геодезия | Лекция | 321н | Шевелев И.П. | 26-ПГС-1,26-ПГС-2
|
||||||
|
чт 13:40–15:05 | даты 2026-09-10,2026-10-15,2026-11-19,2026-12-17 | Единый день информирования | Занятие | | | 26-ПГС-1,26-ПГС-2
|
||||||
|
чт 13:40–15:05 | каждую неделю | Механика жидкости и газа | Лекция | 362 | Моняк Т.М. | 26-ПГС-1,26-ПГС-2
|
||||||
|
чт 15:20–16:45 | каждую неделю | Химия | Лабораторная | 403 | Аврамёнок А.Н. | 26-ПГС-2,26-ПГС-2/п2
|
||||||
59
test/snapshots/itzs-summer-2026.txt
Normal file
59
test/snapshots/itzs-summer-2026.txt
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
# Лабораторно-экзаменационная сессия · 23-ИТзс
|
||||||
|
2026-06-08 10:05–11:30 | один раз | Системный анализ и машинное моделирование | Установочная лекция | 205Г | Пастухов Д.Ф. | 23-ИТзс
|
||||||
|
2026-06-08 11:45–13:10 | один раз | Основы бизнеса и права в сфере инфокоммуникационных технологий | Лекция | 205Г | Воронько Э.Н. | 23-ИТзс
|
||||||
|
2026-06-08 13:40–15:05 | один раз | Основы бизнеса и права в сфере инфокоммуникационных технологий | Практика | 305Г | Воронько Э.Н. | 23-ИТзс
|
||||||
|
2026-06-08 17:00–18:25 | один раз | Основы бизнеса и права в сфере инфокоммуникационных технологий | Консультация | 305Г | Воронько Э.Н. | 23-ИТзс
|
||||||
|
2026-06-09 08:30–09:55 | один раз | Программирование мобильных систем | Лекция | 305Г | Лукьянов А.О. | 23-ИТзс
|
||||||
|
2026-06-09 10:05–11:30 | один раз | Базы данных | Лабораторная | 317Д | Скуковская А.А. | 23-ИТзс,23-ИТзс/п2
|
||||||
|
2026-06-09 10:05–11:30 | один раз | Программирование мобильных систем | Лабораторная | 219Д | Лукьянов А.О. | 23-ИТзс,23-ИТзс/п1
|
||||||
|
2026-06-09 13:40–15:05 | один раз | Базы данных | Лабораторная | 317Д | Скуковская А.А. | 23-ИТзс,23-ИТзс/п1
|
||||||
|
2026-06-09 13:40–15:05 | один раз | Программирование мобильных систем | Лабораторная | 219Д | Лукьянов А.О. | 23-ИТзс,23-ИТзс/п2
|
||||||
|
2026-06-10 08:30–09:55 | один раз | Базы данных | Лабораторная | 319Д | Скуковская А.А. | 23-ИТзс,23-ИТзс/п2
|
||||||
|
2026-06-10 08:30–09:55 | один раз | Программирование мобильных систем | Лабораторная | 317Д | Лукьянов А.О. | 23-ИТзс,23-ИТзс/п1
|
||||||
|
2026-06-10 11:45–13:10 | один раз | Базы данных | Лабораторная | 319Д | Скуковская А.А. | 23-ИТзс,23-ИТзс/п1
|
||||||
|
2026-06-10 11:45–13:10 | один раз | Программирование мобильных систем | Лабораторная | 317Д | Лукьянов А.О. | 23-ИТзс,23-ИТзс/п2
|
||||||
|
2026-06-10 15:20–16:45 | один раз | Программирование мобильных систем | Консультация | 317Д | Лукьянов А.О. | 23-ИТзс
|
||||||
|
2026-06-11 08:30–09:55 | один раз | Базы данных | Лабораторная | 319Д | Скуковская А.А. | 23-ИТзс,23-ИТзс/п2
|
||||||
|
2026-06-11 08:30–09:55 | один раз | Программное обеспечение встроенных систем/Проектирование информационных систем | Лабораторная | 317Д | Михнович О.В. | 23-ИТзс,23-ИТзс/п1
|
||||||
|
2026-06-11 11:45–13:10 | один раз | Базы данных | Лабораторная | 319Д | Скуковская А.А. | 23-ИТзс,23-ИТзс/п1
|
||||||
|
2026-06-11 11:45–13:10 | один раз | Программное обеспечение встроенных систем/Проектирование информационных систем | Лабораторная | 317Д | Михнович О.В. | 23-ИТзс,23-ИТзс/п2
|
||||||
|
2026-06-12 08:30 | один раз | Программирование мобильных систем | Экзамен | 219Д | Лукьянов А.О. | 23-ИТзс
|
||||||
|
2026-06-12 13:40–15:05 | один раз | Сетевые технологии и администрирование операционных систем | Установочная лекция | 219Д | Бровко Н.В. | 23-ИТзс
|
||||||
|
2026-06-13 08:30–09:55 | один раз | Тестирование программного обеспечения и веб-ориентированных приложений | Лекция | 218Д | Конаплева Г.Ф. | 23-ИТзс
|
||||||
|
2026-06-13 10:05–11:30 | один раз | Методы и алгоритмы принятия | Лекция | 218Д | Конаплева Г.В. | 23-ИТзс
|
||||||
|
2026-06-13 11:45–13:10 | один раз | Тестирование программного обеспечения и веб-ориентированных приложений | Лабораторная | 218Д | Конаплева Г.Ф. | 23-ИТзс,23-ИТзс/п1
|
||||||
|
2026-06-15 08:30 | один раз | Основы бизнеса и права в сфере инфокоммуникационных технологий | Экзамен | 305Г | Воронько Э.Н. | 23-ИТзс
|
||||||
|
2026-06-15 13:40–15:05 | один раз | Алгоритмы компьютерной графики/Алгоритмы компьютерного зрения | Установочная лекция | 305Г | Адамовский Е.Р. | 23-ИТзс
|
||||||
|
2026-06-16 08:30–09:55 | один раз | Базы данных | Защита курсовой работы | 317Д | Скуковская А.А. | 23-ИТзс
|
||||||
|
2026-06-16 11:45–13:10 | один раз | Базы данных | Консультация | 317Д | Скуковская А.А. | 23-ИТзс
|
||||||
|
2026-06-16 13:40–15:05 | один раз | Распределенные вычисления | Лекция | 317Д | Сурто С.Г. | 23-ИТзс
|
||||||
|
2026-06-16 15:20–16:45 | один раз | Основы управления интеллектуальной собственностью | Установочная лекция | 317Д | Михнович О.В. | 23-ИТзс
|
||||||
|
2026-06-17 08:30–09:55 | один раз | Программное обеспечение встроенных систем/Проектирование информационных систем | Лабораторная | 303Г | Михнович О.В. | 23-ИТзс,23-ИТзс/п1
|
||||||
|
2026-06-17 08:30–09:55 | один раз | Современные платформы программирования | Лабораторная | 302Г | Макарычева В.А. | 23-ИТзс,23-ИТзс/п2
|
||||||
|
2026-06-17 11:45–13:10 | один раз | Программное обеспечение встроенных систем/Проектирование информационных систем | Лабораторная | 303Г | Михнович О.В. | 23-ИТзс,23-ИТзс/п2
|
||||||
|
2026-06-17 11:45–13:10 | один раз | Современные платформы программирования | Лабораторная | 302Г | Макарычева В.А. | 23-ИТзс,23-ИТзс/п1
|
||||||
|
2026-06-17 15:20–16:45 | один раз | Программное обеспечение встроенных систем/Проектирование информационных систем | Консультация | 219Д | Михнович О.В. | 23-ИТзс
|
||||||
|
2026-06-18 08:30 | один раз | Базы данных | Экзамен | 219Д | Скуковская А.А. | 23-ИТзс
|
||||||
|
2026-06-18 13:40–15:05 | один раз | Тестирование программного обеспечения и веб-ориентированных приложений | Лабораторная | 218Д | Конаплева Г.Ф. | 23-ИТзс,23-ИТзс/п1
|
||||||
|
2026-06-19 08:30 | один раз | Программное обеспечение встроенных систем/Проектирование информационных систем | Экзамен | 317Д | Михнович О.В. | 23-ИТзс
|
||||||
|
2026-06-19 13:40–15:05 | один раз | Управление инновационными проектами | Установочная лекция | 205Г | Дубко Н.А. | 23-ИТзс
|
||||||
|
2026-06-19 15:20–16:45 | один раз | Статистические методы анализа данных | Установочная лекция | 205Г | Пастухов Д.Ф. | 23-ИТзс
|
||||||
|
2026-06-20 08:30–09:55 | один раз | Тестирование программного обеспечения и веб-ориентированных приложений | Лабораторная | 218Д | Конаплева Г.Ф. | 23-ИТзс,23-ИТзс/п2
|
||||||
|
2026-06-20 11:45–13:10 | один раз | Методы и алгоритмы принятия | Лабораторная | 218Д | Конаплева Г.Ф. | 23-ИТзс,23-ИТзс/п1
|
||||||
|
2026-06-22 10:05–11:30 | один раз | Распределенные вычисления | Лабораторная | 303Г | Сурто С.Г. | 23-ИТзс,23-ИТзс/п1
|
||||||
|
2026-06-22 13:40–15:05 | один раз | Современные платформы программирования | Практика | 305Г | Макарычева В.А. | 23-ИТзс
|
||||||
|
2026-06-22 15:20–16:45 | один раз | Современные платформы программирования | Установочная лекция | 305Г | Макарычева В.А. | 23-ИТзс
|
||||||
|
2026-06-23 08:30–09:55 | один раз | Распределенные вычисления | Лабораторная | 207Г | Сурто С.Г. | 23-ИТзс,23-ИТзс/п2
|
||||||
|
2026-06-23 08:30–09:55 | один раз | Современные платформы программирования | Лабораторная | 303Г | Макарычева В.А. | 23-ИТзс,23-ИТзс/п1
|
||||||
|
2026-06-23 11:45–13:10 | один раз | Распределенные вычисления | Лабораторная | 207Г | Сурто С.Г. | 23-ИТзс,23-ИТзс/п1
|
||||||
|
2026-06-23 11:45–13:10 | один раз | Современные платформы программирования | Лабораторная | 303Г | Макарычева В.А. | 23-ИТзс,23-ИТзс/п2
|
||||||
|
2026-06-24 08:30–09:55 | один раз | Методы и алгоритмы принятия | Лабораторная | 218Д | Конаплева Г.Ф. | 23-ИТзс,23-ИТзс/п1
|
||||||
|
2026-06-24 08:30–09:55 | один раз | Распределенные вычисления | Лабораторная | 303Г | Сурто С.Г. | 23-ИТзс,23-ИТзс/п2
|
||||||
|
2026-06-24 13:40–15:05 | один раз | Современные платформы программирования | Зачёт | 217Д | Макарычева В.А. | 23-ИТзс
|
||||||
|
2026-06-25 11:45 | один раз | Распределенные вычисления | Зачёт | 217Д | Сурто С.Г. | 23-ИТзс
|
||||||
|
2026-06-25 15:20–16:45 | один раз | Тестирование программного обеспечения и веб-ориентированных приложений | Лабораторная | 218Д | Конаплева Г.Ф. | 23-ИТзс,23-ИТзс/п2
|
||||||
|
2026-06-26 08:30 | один раз | Тестирование программного обеспечения и веб-ориентированных приложений | Зачёт | 218Д | Конаплева Г.Ф. | 23-ИТзс
|
||||||
|
2026-06-26 11:45–13:10 | один раз | Методы и алгоритмы принятия | Лабораторная | 218Д | Конаплева Г.Ф. | 23-ИТзс,23-ИТзс/п2
|
||||||
|
2026-06-26 15:20–16:45 | один раз | Методы машинного обучения | Установочная лекция | 218Д | Конаплева Г.Ф. | 23-ИТзс
|
||||||
|
2026-06-27 08:30–09:55 | один раз | Методы и алгоритмы принятия | Лабораторная | 218Д | Конаплева Г.Ф. | 23-ИТзс,23-ИТзс/п2
|
||||||
|
2026-06-27 13:40 | один раз | Методы и алгоритмы принятия | Зачёт | 218Д | Конаплева Г.Ф. | 23-ИТзс
|
||||||
37
test/snapshots/itzs-winter-2024.txt
Normal file
37
test/snapshots/itzs-winter-2024.txt
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
# Лабораторно-экзаменационная сессия · 23-ИТзс
|
||||||
|
2024-01-08 11:45–13:10 | один раз | Основы алгоритмизации и программирования | Лабораторная | 218Д | Конаплева Г.Ф. | 23-ИТзс,23-ИТзс/п1
|
||||||
|
2024-01-08 13:40–15:05 | один раз | Основы информационных технологий и компьютерной графики | Лабораторная | 217Д | Михнович О.В. | 23-ИТзс,23-ИТзс/п2
|
||||||
|
2024-01-08 17:00–18:25 | один раз | Основы алгоритмизации и программирования | Лабораторная | 218Д | Конаплева Г.Ф. | 23-ИТзс,23-ИТзс/п2
|
||||||
|
2024-01-08 17:00–18:25 | один раз | Основы информационных технологий и компьютерной графики | Лабораторная | 217Д | Михнович О.В. | 23-ИТзс,23-ИТзс/п1
|
||||||
|
2024-01-08 18:35–20:00 | один раз | Основы программной инженерии | Лекция | 252В | Струк Т.С. | 23-ИТзс
|
||||||
|
2024-01-09 13:40–15:05 | один раз | Основы алгоритмизации и программирования | Лабораторная | 218Д | Конаплева Г.Ф. | 23-ИТзс,23-ИТзс/п2
|
||||||
|
2024-01-09 13:40–15:05 | один раз | Основы информационных технологий и компьютерной графики | Лабораторная | 217Д | Михнович О.В. | 23-ИТзс,23-ИТзс/п1
|
||||||
|
2024-01-10 08:30–09:55 | один раз | История белорусской государственности | Лекция | 220Д | Емельянчик О.А. | 23-ИТзс
|
||||||
|
2024-01-10 10:05–11:30 | один раз | Личностно-профессиональное развитие специалиста | Практика | 220Д | Брикса Ю.О. | 23-ИТзс
|
||||||
|
2024-01-10 11:45–13:10 | один раз | Основы алгоритмизации и программирования | Лабораторная | 218Д | Конаплева Г.Ф. | 23-ИТзс,23-ИТзс/п1
|
||||||
|
2024-01-11 10:05–11:30 | один раз | Личностно-профессиональное развитие специалиста | Зачёт | 204Г | Брикса Ю.О. | 23-ИТзс
|
||||||
|
2024-01-11 11:45–13:10 | один раз | Основы алгоритмизации и программирования | Лабораторная | 218Д | Конаплева Г.Ф. | 23-ИТзс,23-ИТзс/п1
|
||||||
|
2024-01-12 10:05–11:30 | один раз | Основы алгоритмизации и программирования | Лабораторная | 218Д | Конаплева Г.Ф. | 23-ИТзс,23-ИТзс/п2
|
||||||
|
2024-01-12 15:20–16:45 | один раз | Белорусский язык (профессиональная лексика) | Практика | 305Г | Богорадова Т.Р. | 23-ИТзс
|
||||||
|
2024-01-13 08:30–09:55 | один раз | Линейная алгебра и аналитическая геометрия | Практика | 254В | Забелендик О.Н. | 23-ИТзс
|
||||||
|
2024-01-13 10:05–11:30 | один раз | Дискретная математика | Лекция | 254В | Забелендик О.Н. | 23-ИТзс
|
||||||
|
2024-01-13 11:45–13:10 | один раз | Дискретная математика | Практика | 254В | Забелендик О.Н. | 23-ИТзс
|
||||||
|
2024-01-13 13:40–15:05 | один раз | История белорусской государственности | Практика | 254В | Емельянчик О.А. | 23-ИТзс
|
||||||
|
2024-01-14 08:30–09:55 | один раз | Основы программной инженерии | Практика | 254В | Струк Т.С. | 23-ИТзс
|
||||||
|
2024-01-14 10:05–11:30 | один раз | Основы программной инженерии | Практика | 254В | Струк Т.С. | 23-ИТзс
|
||||||
|
2024-01-15 11:45–13:10 | один раз | История белорусской государственности | Экзамен | 307Г | Емельянчик О.А. | 23-ИТзс
|
||||||
|
2024-01-15 15:20–16:45 | один раз | Основы алгоритмизации и программирования | Лабораторная | 218Д | Конаплева Г.Ф. | 23-ИТзс,23-ИТзс/п2
|
||||||
|
2024-01-15 17:00–18:25 | один раз | Математический анализ | Установочная лекция | 220Д | Забелендик О.Н. | 23-ИТзс
|
||||||
|
2024-01-16 10:05–11:30 | один раз | Белорусский язык (профессиональная лексика) | Зачёт | 304Г | Богорадова Т.Р. | 23-ИТзс
|
||||||
|
2024-01-16 13:40–15:05 | один раз | Основы алгоритмизации и программирования | Защита курсовой работы | 254В | Чертков В.М. | 23-ИТзс
|
||||||
|
2024-01-17 10:05–11:30 | один раз | Основы информационных технологий и компьютерной графики | Зачёт | 217Д | Михнович О.В. | 23-ИТзс
|
||||||
|
2024-01-17 11:45–13:10 | один раз | Иностранный язык | Установочное занятие | 204Г | Жизневская Л.В. | 23-ИТзс
|
||||||
|
2024-01-17 13:40–15:05 | один раз | Культурология | Установочная лекция | 252В | Огородников А.А. | 23-ИТзс
|
||||||
|
2024-01-18 08:30–09:55 | один раз | Основы алгоритмизации и программирования | Экзамен | Медиа | Чертков В.М. | 23-ИТзс
|
||||||
|
2024-01-18 11:45–13:10 | один раз | Программирование на языках высокого уровня | Установочная лекция | Медиа | Чертков В.М. | 23-ИТзс
|
||||||
|
2024-01-18 13:40–15:05 | один раз | Физика | Установочная лекция | 254В | Окунев Д.О. | 23-ИТзс
|
||||||
|
2024-01-19 11:45–13:10 | один раз | Линейная алгебра и аналитическая геометрия | Экзамен | 305Г | Забелендик О.Н. | 23-ИТзс
|
||||||
|
2024-01-19 15:20–16:45 | один раз | Алгоритмы и структуры данных | Установочная лекция | 305Г | Виноградова А.Д. | 23-ИТзс
|
||||||
|
2024-01-20 08:30–09:55 | один раз | Основы программной инженерии | Экзамен | 305Г | Струк Т.С. | 23-ИТзс
|
||||||
|
2024-01-20 11:45–13:10 | один раз | Конструирование программного обеспечения | Установочная лекция | 305Г | Струк Т.С. | 23-ИТзс
|
||||||
|
2024-01-22 15:20–16:45 | один раз | Дискретная математика | Экзамен | 205Г | Забелендик О.Н. | 23-ИТзс
|
||||||
@@ -63,6 +63,8 @@ test("Пометки недель: диапазоны, «с N», опечатк
|
|||||||
[6, 11],
|
[6, 11],
|
||||||
]);
|
]);
|
||||||
assert.deepEqual(parseWeekRanges("со 2 нед."), [[2, null]]);
|
assert.deepEqual(parseWeekRanges("со 2 нед."), [[2, null]]);
|
||||||
|
assert.deepEqual(parseWeekRanges("1-4н.;6-12н."), [[1, 4], [6, 12]]);
|
||||||
|
assert.deepEqual(parseWeekRanges("1-6н , 13-18н"), [[1, 6], [13, 18]]);
|
||||||
assert.deepEqual(parseWeekRanges("с 4-16н"), [[4, 16]]);
|
assert.deepEqual(parseWeekRanges("с 4-16н"), [[4, 16]]);
|
||||||
assert.deepEqual(parseWeekRanges("1-8,10-17"), [
|
assert.deepEqual(parseWeekRanges("1-8,10-17"), [
|
||||||
[1, 8],
|
[1, 8],
|
||||||
|
|||||||
Reference in New Issue
Block a user