chuvsu-js 5.0.0 → 5.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/tt/parse/overlays.js +14 -6
- package/package.json +1 -1
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { parseTeacher, text } from "../../common/parse.js";
|
|
2
2
|
import { parseGroupsString } from "./groups.js";
|
|
3
|
-
import { hasDistanceMarker } from "./entry-parts.js";
|
|
4
|
-
import {
|
|
3
|
+
import { containsGroupCode, hasDistanceMarker, linesAfterSubject, stripDistanceMarker, } from "./entry-parts.js";
|
|
4
|
+
import { LESSON_TYPE_RE, LESSON_TYPE_RE_I, SUBGROUP_RE, } from "./patterns.js";
|
|
5
5
|
const GROUP_CODE_RE = /[A-ZА-ЯЁ]{1,}(?:-[A-ZА-ЯЁa-zа-яё0-9]+)+/u;
|
|
6
|
+
const ROOM_CODE_RE = /^[А-Яа-яA-Za-z]-\d+$/u;
|
|
6
7
|
const BLUE_SPAN_RE = /<span\b(?=[^>]*(?:style=["'][^"']*color:\s*blue|class=["'][^"']*\bblue\b))[^>]*>([^<]+)<\/span>/i;
|
|
7
8
|
export function parseDate(dd, mm, yyyy) {
|
|
8
9
|
return `${yyyy}-${mm}-${dd}`;
|
|
@@ -94,8 +95,9 @@ export function parseSubstituteForDiv(div) {
|
|
|
94
95
|
const date = parseDate(m[1], m[2], m[3]);
|
|
95
96
|
// Original teacher: first blue span (right after "замена вместо:")
|
|
96
97
|
const origTeacherMatch = divHtml.match(/замена\s*вместо:\s*<\/b><\/span>\s*<span[^>]*>([^<]+)<\/span>/);
|
|
97
|
-
const
|
|
98
|
-
|
|
98
|
+
const originalValue = origTeacherMatch?.[1].trim();
|
|
99
|
+
const originalTeacher = originalValue && !ROOM_CODE_RE.test(originalValue)
|
|
100
|
+
? parseTeacher(originalValue)
|
|
99
101
|
: undefined;
|
|
100
102
|
// Subject: second blue span
|
|
101
103
|
const subjectEl = div.querySelectorAll('span[style*="color: blue"]');
|
|
@@ -111,14 +113,20 @@ export function parseSubstituteForDiv(div) {
|
|
|
111
113
|
return null;
|
|
112
114
|
const roomMatch = divHtml.match(/(?:<br\s*\/?>)\s*([А-Яа-яA-Za-z]-\d+)/);
|
|
113
115
|
const typeMatch = divText.match(LESSON_TYPE_RE);
|
|
114
|
-
const
|
|
116
|
+
const parts = linesAfterSubject(divHtml, subject);
|
|
117
|
+
const teacherLine = stripDistanceMarker(parts.find((line) => !containsGroupCode(stripDistanceMarker(line))) ?? "");
|
|
118
|
+
const groupsLine = parts
|
|
119
|
+
.filter((line) => containsGroupCode(stripDistanceMarker(line)))
|
|
120
|
+
.map(stripDistanceMarker)
|
|
121
|
+
.join(" ");
|
|
115
122
|
const subgroupMatch = divText.match(SUBGROUP_RE);
|
|
116
|
-
const groups = parseGroupsString(
|
|
123
|
+
const groups = parseGroupsString(groupsLine);
|
|
117
124
|
return {
|
|
118
125
|
entry: {
|
|
119
126
|
room: roomMatch?.[1] || undefined,
|
|
120
127
|
subject,
|
|
121
128
|
type: typeMatch?.[1] ?? "",
|
|
129
|
+
teacher: teacherLine ? parseTeacher(teacherLine) : undefined,
|
|
122
130
|
groups: groups.length > 0 ? groups : undefined,
|
|
123
131
|
subgroup: subgroupMatch ? parseInt(subgroupMatch[1]) : undefined,
|
|
124
132
|
isDistance: hasDistanceMarker(divText) || hasDistanceMarker(roomMatch?.[1] ?? ""),
|