Compare commits
6 Commits
86f71bf178
...
939633b675
| Author | SHA1 | Date | |
|---|---|---|---|
|
939633b675
|
|||
|
95766c62a0
|
|||
|
3094ec1501
|
|||
|
ed5e493912
|
|||
|
38b494f066
|
|||
|
448b565835
|
+12
-3
@@ -12,10 +12,19 @@
|
|||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import parseV1V2 from "./parse/v1_v2.js";
|
import ExcelJS from "exceljs"
|
||||||
|
|
||||||
|
//import parseV1V2 from "./parse/v1_v2.js";
|
||||||
import parseV3 from "./parse/v3.js";
|
import parseV3 from "./parse/v3.js";
|
||||||
|
import generateArchivedV1_V2 from "./parse/archived/v1_v2.js";
|
||||||
|
|
||||||
export default async function parseThisShit(downloadedFilePath: string) {
|
export default async function parseThisShit(downloadedFilePath: string) {
|
||||||
await parseV1V2(downloadedFilePath);
|
const workbook = new ExcelJS.Workbook();
|
||||||
await parseV3(downloadedFilePath);
|
await workbook.xlsx.readFile(downloadedFilePath);
|
||||||
|
|
||||||
|
//await parseV1V2(workbook);
|
||||||
|
await generateArchivedV1_V2();
|
||||||
|
await parseV3(workbook, downloadedFilePath);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// parseThisShit("volume/db/current.xlsx")
|
||||||
|
|||||||
@@ -0,0 +1,78 @@
|
|||||||
|
import fs from "fs"
|
||||||
|
|
||||||
|
const CLASSES: string[] = [
|
||||||
|
"A1a", "A1b", "A1c", "C1a", "C1b", "C1c", "A2", "C2a", "C2b", "C2c", "E2", "C3a", "C3b", "C3c", "E3"
|
||||||
|
];
|
||||||
|
|
||||||
|
function formatDate(date: Date): string {
|
||||||
|
const year = date.getFullYear();
|
||||||
|
const month = String(date.getMonth() + 1).padStart(2, "0");
|
||||||
|
const day = String(date.getDate()).padStart(2, "0");
|
||||||
|
return `${year}-${month}-${day}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
const EXAMPLE_SCHEDULE: (string | null)[] = [
|
||||||
|
"Verze 1 API bude ukončena",
|
||||||
|
"Prosím aktualizujte si aplikaci.",
|
||||||
|
"Po ukončení Vám nebude fungovat",
|
||||||
|
"mimořádný rozvrh.",
|
||||||
|
null,
|
||||||
|
"Pokud jste vývojář aplikace,",
|
||||||
|
"podívejte se na dokumentaci na",
|
||||||
|
"jecnarozvrh.jzitnik.dev",
|
||||||
|
null,
|
||||||
|
null
|
||||||
|
];
|
||||||
|
|
||||||
|
function getCurrentWeekMondayToFriday(referenceDate: Date = new Date()): string[] {
|
||||||
|
const date = new Date(referenceDate);
|
||||||
|
const day = date.getDay();
|
||||||
|
const diffToMonday = day === 0 ? -6 : 1 - day;
|
||||||
|
const monday = new Date(date);
|
||||||
|
monday.setDate(date.getDate() + diffToMonday);
|
||||||
|
const week: string[] = [];
|
||||||
|
for (let i = 0; i < 5; i++) {
|
||||||
|
const d = new Date(monday);
|
||||||
|
d.setDate(monday.getDate() + i);
|
||||||
|
week.push(formatDate(d));
|
||||||
|
}
|
||||||
|
return week;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface ScheduleData {
|
||||||
|
schedule: Record<string, (string | null)[]>[];
|
||||||
|
props: { date: string; priprava: boolean }[];
|
||||||
|
status: { lastUpdated: string };
|
||||||
|
}
|
||||||
|
|
||||||
|
export default function generateArchivedV1_V2(): void {
|
||||||
|
const dates = getCurrentWeekMondayToFriday();
|
||||||
|
const currentDate = new Date();
|
||||||
|
const lastUpdated = currentDate.getHours().toString().padStart(2, "0") + ":" + currentDate.getMinutes().toString().padStart(2, "0");
|
||||||
|
|
||||||
|
const data: ScheduleData = {
|
||||||
|
schedule: [],
|
||||||
|
props: [],
|
||||||
|
status: {
|
||||||
|
lastUpdated
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
for (const date of dates) {
|
||||||
|
data.props.push({
|
||||||
|
date,
|
||||||
|
priprava: false
|
||||||
|
});
|
||||||
|
|
||||||
|
const d: Record<string, (string | null)[]> = {};
|
||||||
|
|
||||||
|
for (const cls of CLASSES) {
|
||||||
|
d[cls] = EXAMPLE_SCHEDULE;
|
||||||
|
}
|
||||||
|
|
||||||
|
data.schedule.push(d);
|
||||||
|
}
|
||||||
|
|
||||||
|
fs.writeFileSync("volume/db/v1.json", JSON.stringify(data, null, 2));
|
||||||
|
fs.writeFileSync("volume/db/v2.json", JSON.stringify(data, null, 2));
|
||||||
|
}
|
||||||
@@ -12,7 +12,7 @@
|
|||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import ExcelJS, { Worksheet } from "exceljs"
|
import { Workbook, Worksheet } from "exceljs"
|
||||||
import fs from "fs"
|
import fs from "fs"
|
||||||
import parseAbsence, { AbsenceResult } from "../utils/parseAbsence.js"
|
import parseAbsence, { AbsenceResult } from "../utils/parseAbsence.js"
|
||||||
import parseTeachers from "../utils/parseTeachers.js"
|
import parseTeachers from "../utils/parseTeachers.js"
|
||||||
@@ -27,9 +27,7 @@ interface ScheduleDay {
|
|||||||
ABSENCE?: AbsenceResult[];
|
ABSENCE?: AbsenceResult[];
|
||||||
}
|
}
|
||||||
|
|
||||||
export default async function parseV1V2(downloadedFilePath: string) {
|
export default async function parseV1V2(workbook: Workbook) {
|
||||||
const workbook = new ExcelJS.Workbook();
|
|
||||||
await workbook.xlsx.readFile(downloadedFilePath);
|
|
||||||
const teacherMap = await parseTeachers();
|
const teacherMap = await parseTeachers();
|
||||||
|
|
||||||
const dateRegex = /^(pondělí|úterý|středa|čtvrtek|pátek|po|út|ut|st|čt|ct|pa|pá)\s+(\d{1,2})\.\s*(\d{1,2})\.\s*(\d{4}|\d{2})/i;
|
const dateRegex = /^(pondělí|úterý|středa|čtvrtek|pátek|po|út|ut|st|čt|ct|pa|pá)\s+(\d{1,2})\.\s*(\d{1,2})\.\s*(\d{4}|\d{2})/i;
|
||||||
|
|||||||
+3
-9
@@ -15,7 +15,7 @@
|
|||||||
import fs from "fs";
|
import fs from "fs";
|
||||||
import parseAbsence from "../utils/parseAbsence.js"
|
import parseAbsence from "../utils/parseAbsence.js"
|
||||||
import parseTeachers from "../utils/parseTeachers.js"
|
import parseTeachers from "../utils/parseTeachers.js"
|
||||||
import ExcelJS, { Worksheet, Cell, Row } from "exceljs"
|
import ExcelJS, { Worksheet, Cell, Row, Workbook } from "exceljs"
|
||||||
import JSZip from "jszip";
|
import JSZip from "jszip";
|
||||||
import { parseStringPromise } from "xml2js";
|
import { parseStringPromise } from "xml2js";
|
||||||
|
|
||||||
@@ -42,8 +42,6 @@ async function getThemeColors(filePath: string): Promise<ThemeColors | null> {
|
|||||||
const data = fs.readFileSync(filePath);
|
const data = fs.readFileSync(filePath);
|
||||||
const zip = await JSZip.loadAsync(data);
|
const zip = await JSZip.loadAsync(data);
|
||||||
|
|
||||||
// list all files for debug
|
|
||||||
|
|
||||||
const themeFile = zip.file("xl/theme/theme1.xml");
|
const themeFile = zip.file("xl/theme/theme1.xml");
|
||||||
if (!themeFile) {
|
if (!themeFile) {
|
||||||
return null;
|
return null;
|
||||||
@@ -118,9 +116,7 @@ function resolveCellColor(cell: Cell, themeColors: ThemeColors | null) {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
export default async function parseV3(downloadedFilePath: string) {
|
export default async function parseV3(workbook: Workbook, downloadedFilePath: string) {
|
||||||
const workbook = new ExcelJS.Workbook();
|
|
||||||
await workbook.xlsx.readFile(downloadedFilePath);
|
|
||||||
const themeColors = await getThemeColors(downloadedFilePath);
|
const themeColors = await getThemeColors(downloadedFilePath);
|
||||||
|
|
||||||
const teacherMap = await parseTeachers();
|
const teacherMap = await parseTeachers();
|
||||||
@@ -157,7 +153,7 @@ export default async function parseV3(downloadedFilePath: string) {
|
|||||||
//
|
//
|
||||||
|
|
||||||
function getUpcomingSheets(workbook: ExcelJS.Workbook): ResolvedDay[] {
|
function getUpcomingSheets(workbook: ExcelJS.Workbook): ResolvedDay[] {
|
||||||
const dateRegex = /^(pondělí|úterý|středa|čtvrtek|pátek|po|út|ut|st|čt|ct|pa|pá)\s+(\d{1,2})\.\s*(\d{1,2})\.\s*(\d{4}|\d{2})/i;
|
const dateRegex = /^(pondělí|úterý|středa|čtvrtek|pátek|po|út|ut|st|čt|ct|pa|pá)\s+(\d{1,2})\.+\s*(\d{1,2})\.+\s*(\d{4}|\d{2})/i;
|
||||||
|
|
||||||
const today = new Date();
|
const today = new Date();
|
||||||
const todayMidnight = new Date(today.getFullYear(), today.getMonth(), today.getDate());
|
const todayMidnight = new Date(today.getFullYear(), today.getMonth(), today.getDate());
|
||||||
@@ -427,5 +423,3 @@ function formatNowTime() {
|
|||||||
now.getMinutes().toString().padStart(2, "0")
|
now.getMinutes().toString().padStart(2, "0")
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
//parseV3("volume/db/current.xlsx")
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ TocOpen: true
|
|||||||
|
|
||||||
Ječná Rozvrh API má svoji Rust knihovnu pro komunikaci s API. Obsahuje mappings pro Kotlin. Pro další jazyky budou mappingy v budoucnu.
|
Ječná Rozvrh API má svoji Rust knihovnu pro komunikaci s API. Obsahuje mappings pro Kotlin. Pro další jazyky budou mappingy v budoucnu.
|
||||||
|
|
||||||
[Zdrojový kód knihovny](https://gitea.local.jzitnik.dev/jzitnik/jecna-supl-client)
|
[Zdrojový kód knihovny](https://gitea.jzitnik.dev/jzitnik/jecna-supl-client)
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
|
|||||||
@@ -6,6 +6,8 @@ tags: ["api", "docs"]
|
|||||||
|
|
||||||
Vítejte v dokumentaci pro API systému Ječná Rozvrh. Toto API poskytuje programový přístup k rozvrhům, suplování a dalším informacím.
|
Vítejte v dokumentaci pro API systému Ječná Rozvrh. Toto API poskytuje programový přístup k rozvrhům, suplování a dalším informacím.
|
||||||
|
|
||||||
|
OpenAPI spec a SwaggerUI je v přípravě!
|
||||||
|
|
||||||
## Oficiální knihovna
|
## Oficiální knihovna
|
||||||
|
|
||||||
[Oficiální knihovna pro komunikaci s Ječná Rozvrh API](../lib)
|
[Oficiální knihovna pro komunikaci s Ječná Rozvrh API](../lib)
|
||||||
@@ -36,16 +38,14 @@ API je verzované, aby byla zajištěna zpětná kompatibilita. Zde je seznam do
|
|||||||
|
|
||||||
Toto je aktuální a doporučená verze API. Obsahuje velké změny oproti V2 a obsahuje nové data.
|
Toto je aktuální a doporučená verze API. Obsahuje velké změny oproti V2 a obsahuje nové data.
|
||||||
|
|
||||||
- ### [Verze 2 (v2)](../v2)
|
- ### [~Verze 2 (v2)~](../v2)
|
||||||
**Status:** Stabilní
|
**Status:** Archivováno (API již není v provozu)
|
||||||
**Endpoint:** `/versioned/v2`
|
**Endpoint:** `/versioned/v2`
|
||||||
|
|
||||||
- ### [~Verze 1 (v1)~](../v1)
|
- ### [~Verze 1 (v1)~](../v1)
|
||||||
**Status:** Deprecated
|
**Status:** Archivováno (API již není v provozu)
|
||||||
**Endpoint:** `/versioned/v1`
|
**Endpoint:** `/versioned/v1`
|
||||||
|
|
||||||
Verze 1 bude v budoucnu odstaněna. Migrujte na novější verze
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Nezařazené Endpointy
|
## Nezařazené Endpointy
|
||||||
|
|||||||
@@ -5,8 +5,8 @@ tags: ["api", "docs", "v1"]
|
|||||||
hiddenInHomelist: true
|
hiddenInHomelist: true
|
||||||
---
|
---
|
||||||
|
|
||||||
{{< admonition type="warning" title="Deprecated" >}}
|
{{< admonition type="warning" title="Archoviváno" >}}
|
||||||
Tato verze je **deprecated**. Prosím nepoužívejte ji, bude brzy odstraněna.
|
Tato verze je **archovována**. API již není v provozu.
|
||||||
{{< /admonition >}}
|
{{< /admonition >}}
|
||||||
|
|
||||||
Tato stránka detailně popisuje **Verzi 1 (v1)** API Ječná Rozvrh.
|
Tato stránka detailně popisuje **Verzi 1 (v1)** API Ječná Rozvrh.
|
||||||
|
|||||||
@@ -5,6 +5,10 @@ tags: ["api", "docs", "v2"]
|
|||||||
hiddenInHomelist: true
|
hiddenInHomelist: true
|
||||||
---
|
---
|
||||||
|
|
||||||
|
{{< admonition type="warning" title="Archoviváno" >}}
|
||||||
|
Tato verze je **archovována**. API již není v provozu.
|
||||||
|
{{< /admonition >}}
|
||||||
|
|
||||||
Tato stránka detailně popisuje **Verzi 2 (v2)** API Ječná Rozvrh.
|
Tato stránka detailně popisuje **Verzi 2 (v2)** API Ječná Rozvrh.
|
||||||
|
|
||||||
## Endpoint: `GET /versioned/v2`
|
## Endpoint: `GET /versioned/v2`
|
||||||
|
|||||||
@@ -5,8 +5,6 @@ tags: ["code", "contribution"]
|
|||||||
hiddenInHomelist: true
|
hiddenInHomelist: true
|
||||||
---
|
---
|
||||||
|
|
||||||
# Contributing
|
|
||||||
|
|
||||||
Děkuji za váš zájem přispět do tohoto projektu.
|
Děkuji za váš zájem přispět do tohoto projektu.
|
||||||
Příspěvky jsou vítány, ale **přijímám je pouze e-mailem ve formě `.patch` souborů**.
|
Příspěvky jsou vítány, ale **přijímám je pouze e-mailem ve formě `.patch` souborů**.
|
||||||
|
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ Použití Dockeru je nejjednodušší způsob, jak projekt spustit, protože aut
|
|||||||
|
|
||||||
1. **Klonování repozitáře**:
|
1. **Klonování repozitáře**:
|
||||||
```bash
|
```bash
|
||||||
git clone https://gitea.local.jzitnik.dev/jzitnik/jecnarozvrh.git
|
git clone https://gitea.jzitnik.dev/jzitnik/jecnarozvrh.git
|
||||||
cd jecnarozvrh
|
cd jecnarozvrh
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user