feat: 🎸 First implementation

This commit is contained in:
Johan Öbrink 2021-04-12 18:21:11 +02:00
parent da127553ba
commit e5438b0f26
13 changed files with 5898 additions and 0 deletions

17
.eslintrc.js Normal file
View File

@ -0,0 +1,17 @@
module.exports = {
parser: '@typescript-eslint/parser',
plugins: ['@typescript-eslint'],
extends: [
'plugin:@typescript-eslint/recommended',
'plugin:prettier/recommended',
'prettier',
],
parserOptions: {
project: './tsconfig.eslint.json',
ecmaVersion: 2018,
sourceType: 'module',
},
rules: {
'@typescript-eslint/semi': [2, 'never'],
},
}

33
.github/workflows/release.yml vendored Normal file
View File

@ -0,0 +1,33 @@
name: Release
on:
push:
branches:
- main
jobs:
release:
name: Release
runs-on: ubuntu-18.04
steps:
- name: Checkout
uses: actions/checkout@v2
with:
fetch-depth: 0
- name: Setup Node.js
uses: actions/setup-node@v1
with:
node-version: 14
- name: Setup timezone
uses: zcong1993/setup-timezone@master
with:
timezone: Europe/Stockholm
- name: Install dependencies
run: yarn install --immutable --silent --non-interactive 2> >(grep -v warning 1>&2)
- name: Audit
run: yarn audit
- name: Build
run: yarn build
- name: Release
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
run: npx semantic-release

27
.github/workflows/test.yml vendored Normal file
View File

@ -0,0 +1,27 @@
# This workflow will do a clean install of node dependencies and run tests
name: Test
on:
pull_request:
branches: [main]
jobs:
unit:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Setup Node.js and run tests
uses: actions/setup-node@v2.1.2
with:
node-version: 14.x
- name: Setup timezone
uses: zcong1993/setup-timezone@master
with:
timezone: Europe/Stockholm
- run: yarn install --immutable --silent --non-interactive 2> >(grep -v warning 1>&2)
- run: yarn audit
- run: yarn lint
- run: yarn test

106
.gitignore vendored Normal file
View File

@ -0,0 +1,106 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
lerna-debug.log*
# Diagnostic reports (https://nodejs.org/api/report.html)
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
# Runtime data
pids
*.pid
*.seed
*.pid.lock
# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov
# Coverage directory used by tools like istanbul
coverage
*.lcov
# nyc test coverage
.nyc_output
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
.grunt
# Bower dependency directory (https://bower.io/)
bower_components
# node-waf configuration
.lock-wscript
# Compiled binary addons (https://nodejs.org/api/addons.html)
build/Release
# Dependency directories
node_modules/
jspm_packages/
# TypeScript v1 declaration files
typings/
# TypeScript cache
*.tsbuildinfo
# Optional npm cache directory
.npm
# Optional eslint cache
.eslintcache
# Microbundle cache
.rpt2_cache/
.rts2_cache_cjs/
.rts2_cache_es/
.rts2_cache_umd/
# Optional REPL history
.node_repl_history
# Output of 'npm pack'
*.tgz
# Yarn Integrity file
.yarn-integrity
# dotenv environment variables file
.env
.env.test
# parcel-bundler cache (https://parceljs.org/)
.cache
# Next.js build output
.next
# Nuxt.js build / generate output
.nuxt
dist
# Gatsby files
.cache/
# Comment in the public line in if your project uses Gatsby and *not* Next.js
# https://nextjs.org/blog/next-9-1#public-directory-support
# public
# vuepress build output
.vuepress/dist
# Serverless directories
.serverless/
# FuseBox cache
.fusebox/
# DynamoDB Local files
.dynamodb/
# TernJS port file
.tern-port
record

10
.prettierrc Normal file
View File

@ -0,0 +1,10 @@
{
"printWidth": 80,
"tabWidth": 2,
"useTabs": false,
"semi": false,
"singleQuote": true,
"trailingComma": "es5",
"bracketSpacing": true,
"jsxBracketSameLine": false
}

3
.releaserc Normal file
View File

@ -0,0 +1,3 @@
{
"branches": ["main"]
}

4
jest.config.js Normal file
View File

@ -0,0 +1,4 @@
module.exports = {
preset: 'ts-jest',
testEnvironment: 'node',
}

28
package.json Normal file
View File

@ -0,0 +1,28 @@
{
"name": "@skolplattformen/curriculum",
"version": "0.1.0",
"description": "Swedish curriculum codes to plain text",
"main": "index.js",
"license": "Apache-2.0",
"private": false,
"scripts": {
"lint": "eslint 'src/*.ts' --quiet --fix",
"test": "jest",
"build": "tsc",
"prepare": "yarn build",
"publish-package": "npm publish --access public"
},
"devDependencies": {
"@types/eslint": "^7.2.9",
"@types/jest": "^26.0.22",
"@typescript-eslint/eslint-plugin": "^4.21.0",
"@typescript-eslint/parser": "^4.21.0",
"eslint": "^7.24.0",
"eslint-config-prettier": "^8.1.0",
"eslint-plugin-prettier": "^3.3.1",
"jest": "^26.6.3",
"prettier": "^2.2.1",
"ts-jest": "^26.5.4",
"typescript": "^4.2.4"
}
}

1048
src/index.test.ts Normal file

File diff suppressed because it is too large Load Diff

286
src/index.ts Normal file
View File

@ -0,0 +1,286 @@
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',
}
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 parse = (code: string): Subject => {
return (
parseSubject(code) ||
parseTrainingSubject(code) ||
parseLanguage(code) ||
parseAltLanguage(code) ||
parseNativeLanguage(code) || { code, category: 'Okänd', name: code }
)
}
export default parse

9
tsconfig.eslint.json Normal file
View File

@ -0,0 +1,9 @@
{
"extends": "./tsconfig.json",
"include": [
"src/*.ts"
],
"exclude": [
"node_modules"
]
}

17
tsconfig.json Normal file
View File

@ -0,0 +1,17 @@
{
"compilerOptions": {
"target": "ES2015",
"module": "CommonJS",
"declaration": true,
"outDir": "./dist",
"strict": true,
"sourceMap": true
},
"include": [
"src"
],
"exclude": [
"node_modules",
"**/*.test.ts"
]
}

4310
yarn.lock Normal file

File diff suppressed because it is too large Load Diff