skolplattformen-backup/src/index.ts

309 lines
6.6 KiB
TypeScript

export interface Subject {
code: string
category: string
name: string
comment?: string
}
type Repo = { [key: string]: string | undefined }
const subjects: Repo = {
BL: 'Bild',
EN: 'Engelska',
HKK: 'Hem & Konsumentkunskap',
IDH: 'Idrott & Hälsa',
MA: 'Matematik',
MU: 'Musik',
NO: 'Naturorienterande ämnen',
BI: 'Biologi',
FY: 'Fysik',
KE: 'Kemi',
SO: 'Samhällsorienterande ämnen',
GE: 'Geografi',
HI: 'Historia',
RE: 'Religionskunskap',
SH: 'Samhällskunskap',
SL: 'Slöjd',
SV: 'Svenska',
SVA: 'Svenska som andraspråk',
TN: 'Teckenspråk',
TK: 'Teknik',
DA: 'Förberedande dansarutbildning',
JU: 'Judiska studier',
ES: 'Estetisk verksamhet',
}
const traningsskolaSubjects: Repo = {
KOM: 'Kommunikation',
MOT: 'Motorik',
VAA: 'Vardagsaktiviteter',
VEU: 'Verklighetsuppfattning',
}
const specialLanguages: Repo = {
EN: 'Engelska',
FR: 'Franska',
FI: 'Finska',
IT: 'Italienska',
JAP: 'Japanska',
KI: 'Kinesiska',
PO: 'Portugisiska',
RY: 'Ryska',
SAM: 'Samiska',
SP: 'Spanska',
SV: 'Svenska',
SVA: 'Svenska som andraspråk',
TN: 'Teckenspråk',
TY: 'Tyska',
}
const languages: Repo = {
...specialLanguages,
ACE: 'Acehnesiska',
ACH: 'Acoli',
AAR: 'Afar, Danakil ',
AFR: 'Afrikaans',
AKA: 'Akan, Asante, Fante',
SQI: 'Albanska',
AMH: 'Amhariska',
ARA: 'Arabiska',
HYE: 'Armeniska',
AII: 'Assyriska, Nyarameiska',
AYM: 'Aymara',
AZE: 'Azerbadjanska',
BAL: 'Baluchi, Baloci, Baluci, Makrani',
BAM: 'Bambara',
BAI: 'Bamileke',
EUS: 'Baskiska',
BEM: 'Bemba, Chibemba, Chiwemba, Ichibemba, Wemba',
BEN: 'Bengaliska',
BER: 'Berbiska',
BIL: 'Bile',
BYN: 'Bilen, Bilein, Bileno, Bilin',
BOS: 'Bosniska',
BUL: 'Bulgariska',
MYA: 'Burmesiska',
CEB: 'Cebuanska, Binisaya, Sebuano, Sugbuanon, Sugbuhanon, Visayan',
DAN: 'Danska',
DAR: 'Darginska, Dargi, Dargin, Dargintsy, Khiurkilinskii, Uslar',
PRS: 'Dari, Parsi, Persian',
DMQ: 'Dimli',
DIV: 'Divehi',
ENG: 'Engelska',
EST: 'Estniska',
EWE: 'Ewe',
FIJ: 'Fijianska',
FIN: 'Finska',
VLS: 'Flamländska',
FRA: 'Franska',
FAO: 'Färöiska',
GAA: 'Ga',
KAT: 'Georgiska',
GRE: 'Grekiska',
KAL: 'Grönländska',
GUJ: 'Gujarati',
HEB: 'Hebreiska',
HIN: 'Hindi',
IBO: 'Ibo',
IND: 'Indonesiska',
ISL: 'Isländska',
ITA: 'Italienska',
JPN: 'Japanska',
YID: 'Jiddisch',
KAM: 'Kamba, Kekamba, Kikamba',
KHM: 'Khmer',
KAN: 'Kannada',
KAR: 'Karenska',
CAT: 'Katalanska',
KAZ: 'Kazakiska',
KIK: 'Kikuyu',
ZHO: 'Kinesiska',
CMN: 'Kinesiska, Mandarin',
HAK: 'Kinesiska, Hakka',
YUE: 'Kinesiska, Kantonesiska',
NAN: 'Kinesiska, Min Nan',
KIN: 'Kinyarwanda',
KIR: 'Kirgisiska',
RUN: 'Kirundi',
KON: 'Kongo',
KOR: 'Koreanska',
ROP: 'Kreolska',
HRV: 'Kroatiska',
KRO: 'Kru',
KUR: 'Kurdiska',
CKB: 'Kurdiska, centr.',
KMR: 'Kurdiska, norra',
SDH: 'Kurdiska, södra',
LAO: 'Laotiska',
LAV: 'Lettiska',
LMA: 'Limba',
LIN: 'Lingala',
LIT: 'Litauiska',
LUG: 'Luganda/Ganda',
LUO: 'Luo',
MKD: 'Makedonska',
MLG: 'Malagaskiska',
MSA: 'Malajiska',
MAL: 'Malayalami',
MLT: 'Maltesiska',
MNK: 'Mandinka',
MRI: 'Maori',
MAR: 'Marathi',
MYX: 'Masaaba, Gisu, Gugisu, Lumasaaba, Masaba',
FIT: 'Meänkieli',
MON: 'Mongoliska',
NLD: 'Nederländska',
NEP: 'Nepalesiska',
NOR: 'Norska',
NYA: 'Nyanja',
ORM: 'Oromo',
PUS: 'Pashto',
PTN: 'Patani',
FAS: 'Persiska',
POL: 'Polska',
POR: 'Portugisiska',
PAN: 'Punjabi',
ROM: 'Romani',
RMC: 'Romani, Karpaterna',
RML: 'Romani, Baltisk',
RMN: 'Romani, Arli',
RMF: 'Romani, Kalé',
RMO: 'Romani, Sinti',
RMU: 'Romani, Tavringer',
RMY: 'Romani, Lovari, Kalderari',
RON: 'Rumänska',
RUS: 'Ryska',
SSY: 'Saho',
NSM: 'Samiska, (norra)',
SMI: 'Samiska',
SMJ: 'Samiska, Lulesamiska',
SJE: 'Samiska, Pitesamiska',
SMA: 'Samiska, Sydsamiska',
SJU: 'Samiska, Umesamiska',
SMO: 'Samoanska',
SRP: 'Serbiska',
HBS: 'Serbokroatiska',
SOT: 'Sesotho, Sisutho, Souto, Suthu, Suto',
SNA: 'Shona',
SIN: 'Singalesiska',
SLK: 'Slovakiska',
SLV: 'Slovenska',
SOM: 'Somaliska',
SPA: 'Spanska',
SWA: 'Swahili',
SYC: 'Syrianska/assyriska, suryaya, suryoyo',
SYR: 'Syriska',
TRU: 'Syriska, Turoyo',
TLG: 'Tagalog',
TAM: 'Tamil',
TAT: 'Tatariska',
TEL: 'Telugu',
THA: 'Thai',
TIB: 'Tibetanska',
TIG: 'Tigre',
TIR: 'Tigrinja',
CES: 'Tjeckiska',
TON: 'Tonganska',
TSN: 'Tswana, Setswana',
TUR: 'Turkiska',
DEU: 'Tyska',
UIG: 'Uiguriska',
UKR: 'Ukrainska',
HUN: 'Ungerska',
URD: 'Urdu',
UZB: 'Uzbekiska',
VIE: 'Vietnamesiska',
WOL: 'Wolof',
YOR: 'Yoruba, Yariba, Yooba',
ZUL: 'Zulu',
SPK: 'Övriga språk',
}
const misc: Repo = {
Lunch: 'Lunch',
Prandium: 'Lunch',
MTID: 'Mentorstid',
}
type Parser = (code: string) => Subject | null
const parseSubject: Parser = (code) => {
if (!subjects[code]) return null
return {
code,
category: '',
name: subjects[code] as string,
}
}
const parseTrainingSubject: Parser = (code) => {
if (!traningsskolaSubjects[code]) return null
return {
code,
category: 'Träningsskolans ämnesområden',
name: traningsskolaSubjects[code] as string,
}
}
const parseLanguage: Parser = (code) => {
if (!code.startsWith('M1') && !code.startsWith('M2')) return null
const category =
'Moderna språk, ' + (code.startsWith('M1') ? 'elevens val' : 'språkval')
const language = code.substr(2)
return {
code,
category,
name: languages[language] || 'Okänt',
}
}
const parseAltLanguage: Parser = (code) => {
if (!code.startsWith('ASSV')) return null
const language = code.substr(4)
return {
code,
category: 'Alt moderna språk, språkval',
name: languages[language] || 'Okänt',
}
}
const parseNativeLanguage: Parser = (code) => {
if (!code.startsWith('ML')) return null
const language = code.substr(2)
return {
code,
category: 'Modersmål',
name: languages[language] || 'Okänt',
}
}
const parseMisc: Parser = (code) => {
if (!misc[code]) return null
return {
code,
category: 'Diverse',
name: misc[code] as string,
}
}
const parse = (code: string): Subject => {
const [subjectCode, ...rest] = code.split(' ')
const result: Subject = parseSubject(subjectCode) ||
parseTrainingSubject(subjectCode) ||
parseLanguage(subjectCode) ||
parseAltLanguage(subjectCode) ||
parseNativeLanguage(subjectCode) ||
parseMisc(subjectCode) || {
code: subjectCode,
category: 'Okänd',
name: subjectCode,
}
if (rest.length) result.comment = rest.join(' ').trim()
return result
}
export default parse