From e28367573d86cc6eaeacc3e692022037445b6a87 Mon Sep 17 00:00:00 2001 From: Florian Knoch Date: Sat, 31 Aug 2019 23:12:02 +0200 Subject: [PATCH] Initial commit --- .gitignore | 2 + README.md | 16 ++++++++ index.js | 95 +++++++++++++++++++++++++++++++++++++++++++++++ package-lock.json | 33 ++++++++++++++++ package.json | 14 +++++++ 5 files changed, 160 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 index.js create mode 100644 package-lock.json create mode 100644 package.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..26eaa0b --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +node_modules/ +result.txt \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..d8b5e04 --- /dev/null +++ b/README.md @@ -0,0 +1,16 @@ +# Generator für HTML zu Projekten und Seminaren + +Als Fachschaft schicken wir kurz vor Beginn eines jeden Semesters eine Email zu allen verfügbaren Seminaren und Projekten mit Beschreibung, Links und Anmeldefristen raus. +Die dazu nach und nach eintrudelnden Informationen der verschiedenen Lehrstühle können dank dieses Tools in einer einfachen Tabellendatei gesammelt und dann ganz automatisch daraus generiert werden. + +Hierzu muss das Repository geklont werden. Anschließend sind folgende Schritte notwendig, für die Node.js benötigt wird: + +```bash +cd path/to/this/directory +node index.js path/to/file.csv +``` + +Aus der Datei `file.csv` wird automatisiert Markup erstellt, das anschließend im Ordner des Programmes (genau dieser hier) unter `result.txt` zu finden ist. +Es kann nach Belieben in VC-Kurse eingebunden werden. +Der Dateipfad sollte entweder absolut oder relativ zum Programmordner angegeben werden. +Zur Struktur der Quelldatei empfiehlt sich ein Blick in die Dateien ehemaliger Semester in der Cloud. \ No newline at end of file diff --git a/index.js b/index.js new file mode 100644 index 0000000..066e433 --- /dev/null +++ b/index.js @@ -0,0 +1,95 @@ +const csv = require('fast-csv') +const fs = require('fs') + +let records = [] + +/** + * Parse CSV file and call processor functions on every line. + */ +function start (dataFile) { + csv + .parseFile(dataFile, { + delimiter: ';' + }) + .on("data", function (data) { + if (data[0] !== 'Bereich') processInput(...data) + }) + .on("end", createHTML) +} + +/** + * Generate one object for every line in the CSV file and push + * it to the records array. + */ +function processInput (section, chair, category, audience, abbreviation, + topic, description, deadline, link) { + records.push({ + section, chair, category, audience, abbreviation, topic, description, deadline, link + }) +} + +/** + * Generate HTML from the records array. + * The resulting markup is written to ./result.txt. + */ +function createHTML() { + let resultString = '' + const recordsBySection = groupBy(records, x => x.section) + + Array.from(['Informatik', 'Angewandte Informatik', 'Wirtschaftsinformatik']) + .forEach(function (section) { + if (recordsBySection.has(section)) { + resultString += `

${section}

\n` + + let recordsByChair = groupBy(recordsBySection.get(section), x => x.chair) + let chairs = [...recordsByChair.keys()].sort() + chairs.forEach(function (chair) { + resultString += `

${chair}

\n` + + let recordsByCategory = groupBy(recordsByChair.get(chair), x => x.category) + let categories = [...recordsByCategory.keys()].sort() + categories.forEach(function (category) { + + recordsByCategory.get(category).forEach(function (cur) { + resultString += `
${category}` + resultString += cur.abbreviation ? ` ${cur.abbreviation}` : '' + resultString += `: ${cur.topic} (${cur.audience})
\n` + resultString += `

Kurzbeschreibung: ${cur.description}

\n` + resultString += `

Anmeldefrist: ${cur.deadline}

\n` + resultString += `

Weitere Informationen und Anmeldung: ` + resultString += cur.link.startsWith('http') ? `
${cur.link}` : cur.link + resultString += `

\n` + }) + }) + }) + } + }) + + fs.writeFileSync('result.txt', resultString) + console.log(`Successfully parsed ${process.argv[2]}.`) +} + +if (process.argv[2]) { + start(process.argv[2]) +} else { + console.error("Missing argument. You have to pass the name of the data file.") +} + +/** + * Group an array of records by a given key. + * Taken from the answer to this question: + * https: //stackoverflow.com/questions/14446511/most-efficient-method-to-groupby-on-an-array-of-objects#38327540 + */ +function groupBy(list, keyGetter) { + const map = new Map(); + list.forEach((item) => { + const key = keyGetter(item); + const collection = map.get(key); + if (!collection) { + map.set(key, [item]); + } else { + collection.push(item); + } + }); + return map; +} diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..cba2b21 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,33 @@ +{ + "name": "projekte-und-seminare", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/lodash": { + "version": "4.14.138", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.138.tgz", + "integrity": "sha512-A4uJgHz4hakwNBdHNPdxOTkYmXNgmUAKLbXZ7PKGslgeV0Mb8P3BlbYfPovExek1qnod4pDfRbxuzcVs3dlFLg==" + }, + "@types/node": { + "version": "12.7.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.7.3.tgz", + "integrity": "sha512-3SiLAIBkDWDg6vFo0+5YJyHPWU9uwu40Qe+v+0MH8wRKYBimHvvAOyk3EzMrD/TrIlLYfXrqDqrg913PynrMJQ==" + }, + "fast-csv": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/fast-csv/-/fast-csv-3.4.0.tgz", + "integrity": "sha512-/vPTDJc/l6VLOLIqcrMjuhyi8ZVTipTNl2GkVvaYiHlyh16oQMYPUkUVfREurT3MYE9j3mLQDk2Q8kPq30qQCg==", + "requires": { + "@types/lodash": "^4.14.132", + "@types/node": "^12.0.2", + "lodash": "^4.17.13" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..808fa56 --- /dev/null +++ b/package.json @@ -0,0 +1,14 @@ +{ + "name": "projekte-und-seminare", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "ISC", + "dependencies": { + "fast-csv": "^3.4.0" + } +}