1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
//! modul obsahující jednotlivé objektu cat-prepu
//!
//! každý model spočívá v páru karta - profil,
//! kdy karta odpovídá TOMLu přečtenému z headeru
//! souboru (nebo ze souboru ucitel.toml)

use std::path::PathBuf;
use serde::{Serialize, Deserialize};

/// Karta učitele
///
/// Tato struktura reprezentuje konfigurační soubor
/// `teachers/ucitel.toml`, který obsahuje základní
/// informace o vyučujícím.
///
/// Tento soubor je následně využíván k identifikace
/// autora, zodpovědných osob, vytvoření profilu
/// učitele a asociaci předmětů a jednotlivých materiálů
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TeacherCard {
	/// jméno vyučujícího,
	/// mělo by být opravdové jméno
	/// a korespondovat s gitovou
	/// konfigurační hodnotou `user.name`
	pub jmeno:    String,
	/// email vyučujícího,
	/// měl by korespondovat
	/// s gitovou konfigurační hodnotou
	/// `user.email`
	pub email:    String,
	/// uživatelské jméno uživatele,
	/// nesmí obsahovat mezery,
	/// využit pro mezistránkové odkazy,
	/// další kritérium pro vyhledávání
	/// souborů v repozitáři modifikovaných/vytvořených
	/// uživatelem
	pub username: String,
	/// popisek vyučujícího.
	/// může obsahovat cokoliv,
	/// formátováno jako markdown
	pub bio:      String,
}

/// Karta článku
///
/// Tato struktura reprezentuje konfigurační
/// hodnoty daného článku ve formátu TOML,
/// odděleno řádkem `+++` od těla článku
///
/// využito při generování metadat článku,
/// a generování odkazů na mnoha jiných místech
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ArticleCard {
	/// název článku,
	/// bude se objevovat v odkazech
	/// a nahoře v kartě článku
	pub nazev:          String,
	/// seznam tagů, které má daný článek
	/// využit pro vytvoření databáze tagů
	/// a následné nalinkování
	pub tagy:           Vec<String>,
	/// datum, může obsahovat cokoliv
	pub datum:          Option<String>,
	/// tato složka je pomocná a nemá být
	/// konfigurována v markdown souboru,
	/// jejím účelem je uchovávat cestu k souboru,
	/// ke kterému karta patří v kontextech,
	/// kde není použít [`Article`]
	/// (nebo dokud není sestavena databáze článků)
	pub _resolved_path: Option<PathBuf>,
}

/// Článek
///
/// Tato struktura reprezentuje všechna
/// metadata daného materiálu, slouží jako
/// hlavní zdroj informací.
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Article {
	/// karta článku
	pub card:              ArticleCard,
	/// kdy byl naposled článek modifikován;
	/// vypočítáno pomocí gitu.
	pub last_modified:     String,
	/// kým byl článek naposledy modifikován;
	/// informaca získané z gitu.
	pub modified_by:       String,
	/// autor daného materiálu,
	/// informace získaná z gitu,
	/// viz [`Teacher::files_created`].
	pub author:            String,
	/// cesta k článku,
	/// relativní ke složce `src`
	/// (a tudíž kořenovému adresáři webu)
	pub path:              PathBuf,
	/// pokud se podle [`Article::modified_by`] podařilo
	/// najít vyučujícího, bude zde uložena jeho karta
	pub modified_resolved: Option<TeacherCard>,
	/// pokud se podle [`Article::author`] podařilo
	/// najít vyučujícího, bude zde uložena jeho karta
	pub resolved_author:   Option<TeacherCard>,
	/// zde se nalézá přiřazená karta předmětu,
	/// typ `Option` je použit proto, protože v době
	/// parsování není známý předmět, ke kterému článek patří
	pub subject_card:      Option<SubjectCard>,
}

/// Karta předmětu
///
/// Tato struktura obsahuje informace z headeru
/// předmětu. Je využita pro generování profilu
/// předmětu a obsahuje základní informace.
///
/// Také využita v místech, kde není potřeba,
/// nebo není dostupný,
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SubjectCard {
	/// název předmětu, bude použit ve všech odkazech
	/// a seznamech.
	pub nazev:            String,
	/// osoba zodpovědná za daný předmět,
	/// buď hlavní vyučující, nebo vyučující
	/// zodpovědný za dokumentaci (v případě více vyučujícíh)
	pub zodpovedna_osoba: String,
	/// krátký popisek předmětu
	pub bio:              String,
	/// cesta k předmětu,
	/// pro účely, kde je dostupná jenom karta
	/// předmětu nebo dokud není vytvořený profil
	/// předmětu
	pub _resolved_path:   Option<PathBuf>,
}

/// Předmět
///
/// Tato struktura reprezentuje celý profil předmětu,
/// využitý pro sestavování hierarchie knihy,
/// kategorizace článků a podobně.
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Subject {
	/// karta předmětu
	pub card:            SubjectCard,
	/// cesta k předmětu
	pub path:            PathBuf,
	/// kořen předmětu,
	/// všechny `mdbook` kapitoly,
	/// jejichž cesta má `path_root` jako
	/// prefix jsou považovány za články
	/// spadající pod tento předmět
	pub path_root:       PathBuf,
	/// články spadající pod tento předmět
	pub articles:        Vec<Article>,
	/// pokud se podařilo vyřešit identitu
	/// zodpovědné osoby, zde je uložena
	/// její karta
	pub resolved_author: Option<TeacherCard>,
}

/// Učitel
///
/// Tato struktura obsahuje kompletní profil učitele.
/// Jedná se o stěžejní strukturu pro generování výstupu.
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Teacher {
	/// karta učitele
	pub card:          TeacherCard,
	/// předměty, na kterých se
	/// vyučující podílel
	pub subjects:      Vec<Subject>,
	/// články, které vyučující založil
	pub articles:      Vec<Article>,
	/// seznam souborů, které uživatel přidal
	/// do gitu a stále existují
	pub files_created: Vec<PathBuf>,
}