Merge branch 'content' of gitlab.uniworx.de:uniworx/uniworx.de into content
This commit is contained in:
commit
8090828327
@ -22,7 +22,7 @@ stages:
|
||||
|
||||
pages:
|
||||
stage: deploy
|
||||
script: &build-script
|
||||
script:
|
||||
- nix develop -c gup public
|
||||
artifacts:
|
||||
paths:
|
||||
@ -32,7 +32,9 @@ pages:
|
||||
|
||||
review:start:
|
||||
stage: review
|
||||
script: *build-script
|
||||
script:
|
||||
- rm -fv static/_redirects
|
||||
- nix develop -c gup public
|
||||
artifacts:
|
||||
paths:
|
||||
- public
|
||||
|
||||
14
checksum.gup
Normal file
14
checksum.gup
Normal file
@ -0,0 +1,14 @@
|
||||
#!/usr/bin/env zsh
|
||||
|
||||
gup --always
|
||||
base=${2:t}
|
||||
base=${base#"."}
|
||||
base=${base%".chksum"}
|
||||
base=${2:h}/${base}
|
||||
while IFS= read -d $'\0' file; do
|
||||
if [[ -f "${file}" ]]; then
|
||||
b2sum "${file}"
|
||||
else
|
||||
echo "${file}"
|
||||
fi
|
||||
done > >(gup --contents) < <(find "${base}" -print0)
|
||||
@ -1,5 +1,12 @@
|
||||
---
|
||||
title: Seite befindet sich im Aufbau
|
||||
tags:
|
||||
- index
|
||||
sort: -9001
|
||||
---
|
||||
```{=html}
|
||||
<div class="px-4 py-5 my-5 text-center">
|
||||
<h1 class="display-5 fw-bold text-body-emphasis">UniWorX Systems</h1>
|
||||
<h1 class="display-5 fw-bold text-body-emphasis">UniWorX Systems GmbH</h1>
|
||||
<div class="col-lg-6 mx-auto">
|
||||
<p class="lead">
|
||||
Diese Seite befindet sich aktuell noch im Aufbau.
|
||||
@ -7,3 +14,4 @@
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
```
|
||||
7
content-old/markdown.md
Normal file
7
content-old/markdown.md
Normal file
@ -0,0 +1,7 @@
|
||||
---
|
||||
title: Seite unterstützt Markdown
|
||||
tags: meta
|
||||
sort: 0
|
||||
---
|
||||
Text kann auch in allen Pandoc-unterstützten Formaten angegeben werden, statt nur in HTML.
|
||||
Hier: Markdown
|
||||
8
content-old/tags.md
Normal file
8
content-old/tags.md
Normal file
@ -0,0 +1,8 @@
|
||||
---
|
||||
title: Tags sind echte Tags
|
||||
tags:
|
||||
- meta
|
||||
- example
|
||||
sort: 100
|
||||
---
|
||||
Beliebig viele Tags pro Item.
|
||||
12
content/about.md
Normal file
12
content/about.md
Normal file
@ -0,0 +1,12 @@
|
||||
---
|
||||
title: Über uns
|
||||
tags: about
|
||||
sort: 0
|
||||
---
|
||||
# Über uns
|
||||
|
||||
Die UniWorX Systems GmbH ist eine in München ansässige Firma mit Fokus auf Entwurf, Entwicklung und Wartung von Kommunikations- und Verwaltungssoftware.
|
||||
|
||||
Wir verfolgen das Ziel, die Digitalisierung der Verwaltung im öffentlichen, universitären aber auch im firmeninternen Bereich voranzutreiben.
|
||||
|
||||
Typische und erprobte Anwendungsbereiche sind Universitätsverwaltung, Lehrverwaltung sowie Fahrschulverwaltung.
|
||||
21
content/clients.md
Normal file
21
content/clients.md
Normal file
@ -0,0 +1,21 @@
|
||||
---
|
||||
title: Unsere Partner
|
||||
tags:
|
||||
- index
|
||||
- about
|
||||
sort: 9999
|
||||
show: "False"
|
||||
---
|
||||
# Unsere Partner
|
||||
|
||||
```{=html}
|
||||
<div class="text-center">
|
||||
<a href="https://www.lmu.de/" target="_blank" rel="noreferrer noopener">
|
||||
<img src="../images/LMU_Muenchen_Logo.svg" width="200" alt="LMU München Logo"/>
|
||||
</a>
|
||||
|
||||
<a href="https://www.fraport.com/" target="_blank" rel="noreferrer noopener">
|
||||
<img src="../images/Fraport_Logo.svg" width="200" alt="Fraport AG Logo" id="fraport-logo"/>
|
||||
</a>
|
||||
</div>
|
||||
```
|
||||
23
content/contact.md
Normal file
23
content/contact.md
Normal file
@ -0,0 +1,23 @@
|
||||
---
|
||||
title: Kontakt
|
||||
tags: contact
|
||||
sort: 9999
|
||||
---
|
||||
# Kontakt
|
||||
|
||||
## UniWorX Systems GmbH
|
||||
|
||||
> UniWorX Systems GmbH
|
||||
> Savitsstraße 43
|
||||
> D-81929 München
|
||||
> Bavaria, Germany
|
||||
|
||||
### Geschäftsführung
|
||||
|
||||
> Sarah Vaupel
|
||||
> Savitsstraße 43
|
||||
> D-81929 München
|
||||
> Bavaria, Germany
|
||||
|
||||
> E-Mail: [sarah.vaupel@uniworx.de](mailto:sarah.vaupel@uniworx.de)
|
||||
> Telefon: [+49 179 4130707](tel:+491794130707)
|
||||
9
content/fradrive.md
Normal file
9
content/fradrive.md
Normal file
@ -0,0 +1,9 @@
|
||||
---
|
||||
title: FraDrive
|
||||
tags:
|
||||
- projects
|
||||
---
|
||||
# FraDrive
|
||||
Vorfeld- und Rollfeld-Fahrschulverwaltung in Kooperation mit der Fraport AG
|
||||
|
||||
...
|
||||
15
content/index.md
Normal file
15
content/index.md
Normal file
@ -0,0 +1,15 @@
|
||||
---
|
||||
title: Seite befindet sich im Aufbau
|
||||
tags: index
|
||||
sort: -9001
|
||||
---
|
||||
```{=html}
|
||||
<div class="px-4 py-5 my-5 text-center">
|
||||
<h1 class="display-5 fw-bold text-body-emphasis">UniWorX Systems GmbH</h1>
|
||||
<div class="col-lg-6 mx-auto">
|
||||
<p class="lead">
|
||||
Diese Seite befindet sich aktuell noch im Aufbau.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
```
|
||||
13
content/open-source.md
Normal file
13
content/open-source.md
Normal file
@ -0,0 +1,13 @@
|
||||
---
|
||||
title: Open Source
|
||||
tags:
|
||||
- about
|
||||
sort: 100
|
||||
---
|
||||
# Open Source
|
||||
|
||||
TODO Warum quelloffene Software
|
||||
|
||||
TODO Wie wir quelloffene Software bereitstellen
|
||||
|
||||
TODO Wie wir die open source community unterstützen
|
||||
18
content/services.md
Normal file
18
content/services.md
Normal file
@ -0,0 +1,18 @@
|
||||
---
|
||||
title: Dienstleistungen
|
||||
tags:
|
||||
- services
|
||||
---
|
||||
# Dienstleistungen
|
||||
|
||||
## Unterstützung in der Digitalisierung und Optimierung von Geschäftsprozessen
|
||||
|
||||
Wir analysieren und begleiten Ihre Geschäftsprozesse im laufenden Betrieb.
|
||||
Darauf aufbauend erstellen wir eine Digitalisierungsstrategie für den Prozess mit unserem bewährten UniWorX-Workflow-System.
|
||||
|
||||
Weiter begleiten wir den kontinuierlichen Übergang des Geschäftsprozesses in das neue System, um alle am Prozess beteiligten Personen mitzunehmen und zu entlasten.
|
||||
|
||||
Der so erreichte neue Prozess behält die Flexibilität des alten Prozesses so weit wie gewünscht und setzt gleichzeitig die erforderlichen Grenzen um;
|
||||
seien es notwendige Grenzen aufgrund von Funktionsanforderungen, rechtlichen Vorgaben, oder ...
|
||||
|
||||
Bei geänderten Anforderungen kann der Prozess jederzeit dynamisch weiterentwickelt werden.
|
||||
12
content/uni2work.md
Normal file
12
content/uni2work.md
Normal file
@ -0,0 +1,12 @@
|
||||
---
|
||||
title: Uni2work
|
||||
tags:
|
||||
- projects
|
||||
---
|
||||
# Uni2work
|
||||
Campus-Management-Software in Kooperation mit der Ludwig-Maximilians-Universität München
|
||||
|
||||
Uni2work ist eine Campus-Management-Software zur Verwaltung von Hochschullehre und Prüfungsamt.
|
||||
Das Projekt wurde am Institut für Informatik der Ludwig-Maximilians-Universität (LMU) München begonnen und später als quelloffene Software veröffentlicht.
|
||||
|
||||
...
|
||||
12
content/workflows.md
Normal file
12
content/workflows.md
Normal file
@ -0,0 +1,12 @@
|
||||
---
|
||||
title: Workflows
|
||||
tags:
|
||||
- projects
|
||||
---
|
||||
# Workflows
|
||||
|
||||
Das Workflow-System als Bestandteil von Uni2work wurde als Kommunikations-Framework zur digitalen Abwicklung von Lehr- und Universitätsverwaltungs-bezogenen Kommunikationsprozessen entwickelt.
|
||||
|
||||
Im universitären Umfeld werden Workflows bereits zur digitalen Verwaltung von Abschlussarbeiten, Leistungsanerkennungen und vielem mehr eingesetzt.
|
||||
|
||||
...
|
||||
@ -71,6 +71,8 @@
|
||||
})
|
||||
yarn
|
||||
gup
|
||||
zsh
|
||||
coreutils
|
||||
];
|
||||
shellHook = ''
|
||||
${config.pre-commit.installationScript}
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
#!/usr/bin/env sh
|
||||
|
||||
gup --always
|
||||
gup -u node_modules
|
||||
gup -u node_modules webpack.config.js postcss.config.js
|
||||
gup -u .src.chksum
|
||||
rm -rf dist
|
||||
yarn run build
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
#!/usr/bin/env sh
|
||||
|
||||
gup --always
|
||||
gup -u package.json yarn.lock
|
||||
yarn install --frozen-lockfile --check-files --non-interactive
|
||||
touch node_modules
|
||||
|
||||
@ -1,11 +1,13 @@
|
||||
{
|
||||
"name": "my-webpack-project",
|
||||
"name": "uniworx.de",
|
||||
"version": "1.0.0",
|
||||
"main": "index.js",
|
||||
"private": true,
|
||||
"dependencies": {
|
||||
"@fortawesome/fontawesome-free": "^6.4.2",
|
||||
"@popperjs/core": "^2.11.7",
|
||||
"bootstrap": "^5.2.3"
|
||||
"bootstrap": "^5.2.3",
|
||||
"typeface-source-sans-pro": "^1.1.13"
|
||||
},
|
||||
"scripts": {
|
||||
"build": "webpack"
|
||||
|
||||
@ -1,3 +1,3 @@
|
||||
import 'bootstrap/scss/bootstrap.scss'
|
||||
import * as bootstrap from 'bootstrap'
|
||||
|
||||
import {} from 'bootstrap'
|
||||
import {} from './main.sass'
|
||||
|
||||
67
frontend/src/main.sass
Normal file
67
frontend/src/main.sass
Normal file
@ -0,0 +1,67 @@
|
||||
@use "sass:string"
|
||||
|
||||
@use "~@fortawesome/fontawesome-free/scss/fontawesome" as * with ( $fa-font-path: "~@fortawesome/fontawesome-pro/webfonts" )
|
||||
@forward "~@fortawesome/fontawesome-free/scss/fontawesome"
|
||||
@use "~@fortawesome/fontawesome-free/scss/solid"
|
||||
|
||||
@use "~typeface-source-sans-pro" as source-sans-pro
|
||||
|
||||
@use "~bootstrap/scss/bootstrap" with ( $primary: hsl(268, 20%, 34%), $navbar-toggler-padding-y: 0.5rem, $navbar-padding-x: 1rem, $font-family-sans-serif: string.unquote("\"Source Sans Pro\", system-ui, sans-serif") )
|
||||
|
||||
|
||||
.custom-navbar-toggler-icon
|
||||
@include fa-icon-solid($fa-var-times)
|
||||
|
||||
.collapsed &
|
||||
@include fa-icon-solid($fa-var-bars)
|
||||
|
||||
body
|
||||
display: flex
|
||||
flex-direction: column
|
||||
min-height: 100vh
|
||||
|
||||
main
|
||||
flex: 1
|
||||
margin: 1rem
|
||||
|
||||
.multi-col
|
||||
columns: 3 500px
|
||||
column-gap: 3em
|
||||
column-rule: 1px solid #ddd
|
||||
|
||||
.small-headlines
|
||||
h1
|
||||
font-size: 2rem
|
||||
h2
|
||||
font-size: 1.5rem
|
||||
h3
|
||||
font-size: 1.25rem
|
||||
font-weight: 500
|
||||
h4,h5,h6
|
||||
font-size: 1.0rem
|
||||
font-weight: 600
|
||||
|
||||
footer > nav > ul
|
||||
width: 100%
|
||||
background-color: hsl(268, 20%, 34%)
|
||||
|
||||
margin: 1rem 0 0 0
|
||||
padding: 1rem 0
|
||||
|
||||
display: flex
|
||||
justify-content: center
|
||||
gap: 1rem
|
||||
|
||||
a,a:visited,a:hover,a:active
|
||||
text-decoration: none
|
||||
color: white
|
||||
opacity: 0.55
|
||||
transition: 0.15s
|
||||
&:hover,:active
|
||||
opacity: 0.75
|
||||
|
||||
& > li
|
||||
display: block
|
||||
|
||||
#fraport-logo
|
||||
filter: brightness(0) saturate(100%) invert(18%) sepia(37%) saturate(3738%) hue-rotate(216deg) brightness(98%) contrast(88%)
|
||||
@ -24,7 +24,8 @@ const config = {
|
||||
chunkFilename: '[chunkhash].js',
|
||||
filename: '[chunkhash].js',
|
||||
path: path.resolve(__dirname, 'dist', `wp-${webpackVersion}`),
|
||||
publicPath: `/wp-${webpackVersion}/`,
|
||||
// publicPath: `/wp-${webpackVersion}/`,
|
||||
publicPath: `./`,
|
||||
hashFunction: 'shake256',
|
||||
hashDigestLength: 36
|
||||
},
|
||||
|
||||
3007
frontend/yarn.lock
3007
frontend/yarn.lock
File diff suppressed because it is too large
Load Diff
3
images/Fraport_Logo.svg
Normal file
3
images/Fraport_Logo.svg
Normal file
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 9.8 KiB |
104
images/LMU_Muenchen_Logo.svg
Normal file
104
images/LMU_Muenchen_Logo.svg
Normal file
@ -0,0 +1,104 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 14.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 43363) -->
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
width="760px" height="398px" viewBox="0 0 760 398" enable-background="new 0 0 760 398" xml:space="preserve">
|
||||
<rect x="35.525" y="35.568" fill="#2F854C" width="326.715" height="326.875"/>
|
||||
<rect x="397.752" y="35.568" fill="#2F854C" width="326.715" height="326.875"/>
|
||||
<path fill="#FFFFFF" d="M233.115,294.498v-69.621h38.574v73.449c0,5.211,1.191,8.922,3.578,11.133
|
||||
c2.398,2.215,5.602,3.32,9.605,3.32c4.012,0,7.242-1.105,9.688-3.32c2.445-2.211,3.684-5.922,3.684-11.133v-73.449h38.391v69.621
|
||||
c0,8.309-1.25,15.367-3.754,21.188c-2.496,5.82-6.012,10.547-10.512,14.211c-4.512,3.664-9.969,6.32-16.367,7.969
|
||||
c-6.402,1.672-13.449,2.5-21.129,2.5c-7.566,0-14.527-0.828-20.871-2.5c-6.34-1.648-11.801-4.305-16.359-7.969
|
||||
c-4.57-3.664-8.137-8.391-10.688-14.211C234.389,309.865,233.115,302.807,233.115,294.498z M164.986,311.947
|
||||
c0,0.77,0.379,1.16,1.164,1.16c0.547,0,0.832-0.391,0.832-1.16c1-7.316,2.281-15.312,3.84-24.012
|
||||
c1.566-8.695,3.109-17.172,4.676-25.43c1.559-8.242,3.062-15.754,4.504-22.5c1.449-6.77,2.562-11.797,3.348-15.129h36.066v112.5
|
||||
h-21.703v-94.715c0-0.559-0.398-0.832-1.172-0.832c-0.441,0-0.668,0.273-0.668,0.832c-0.887,4.422-1.84,9.383-2.836,14.871
|
||||
c-1.012,5.48-2.23,11.902-3.684,19.27c-1.445,7.371-3.195,15.984-5.25,25.836c-2.059,9.867-4.484,21.438-7.266,34.738h-22.551
|
||||
c-2.777-13.074-5.145-24.375-7.094-33.906c-1.957-9.52-3.652-17.879-5.098-25.09c-1.441-7.195-2.727-13.621-3.84-19.273
|
||||
c-1.105-5.648-2.223-11.133-3.34-16.445c0-0.559-0.391-0.832-1.172-0.832c-0.438,0-0.664,0.273-0.664,0.832v94.715h-19.867v-112.5
|
||||
h36.23c0.559,2.434,1.234,5.586,2.008,9.473c0.77,3.887,1.645,8.223,2.582,13.047c0.953,4.805,1.918,9.969,2.93,15.438
|
||||
c0.996,5.5,2,11.086,3.004,16.797c1.004,5.703,1.918,11.301,2.758,16.789C163.557,301.896,164.311,307.076,164.986,311.947z
|
||||
M58.775,224.877h11.02v104.191h32.059v8.309H58.775V224.877z"/>
|
||||
<polygon fill="#FFFFFF" points="421.791,205.6 421.791,181.709 426.244,181.709 426.244,202.057 438.119,202.057 438.119,205.6 "/>
|
||||
<path fill="#FFFFFF" d="M454.377,206.088c-5.141,0-9.988-1.848-9.988-10.043v-14.336h4.469v14.746c0,3.789,1.816,6.348,5.52,6.348
|
||||
c3.641,0,5.418-2.391,5.418-6.348v-14.746h4.465v14.336C464.26,203.658,459.314,206.088,454.377,206.088z"/>
|
||||
<path fill="#FFFFFF" d="M480.354,185.088h-2.535v17.102h2.535c5.078,0,7.855-2.25,7.855-8.703
|
||||
C488.209,187.889,485.525,185.088,480.354,185.088z M480.557,205.6h-7.203v-23.891h7.203c8.508,0,12.312,4.914,12.312,11.777
|
||||
C492.869,201.338,488.275,205.6,480.557,205.6z"/>
|
||||
<polygon fill="#FFFFFF" points="523.779,205.6 519.037,205.6 514.408,188.838 509.779,205.6 505.045,205.6 497.775,181.709
|
||||
502.744,181.709 507.619,200.412 512.217,183.654 516.943,183.654 521.518,200.412 526.354,181.709 531.021,181.709 "/>
|
||||
<rect x="537.775" y="181.709" fill="#FFFFFF" width="4.461" height="23.891"/>
|
||||
<path fill="#FFFFFF" d="M562.135,206.088c-7.273,0-11.625-4.992-11.625-12.637c0-8.266,6.066-12.223,11.625-12.223
|
||||
c3.914,0,6.449,1.23,8.066,2.664l-1.824,3.344c-1.301-1.469-3.078-2.801-6.242-2.801c-4.016,0-7,3.59-7,9.016
|
||||
c0,5.562,2.984,9.422,7.203,9.422c2.438,0,3.848-0.617,4.426-1.156v-6.082h-5.352v-3.277h9.648v11.473
|
||||
C568.994,205.092,566.217,206.088,562.135,206.088z"/>
|
||||
<rect x="577.197" y="193.416" fill="#FFFFFF" width="9.367" height="2.973"/>
|
||||
<polygon fill="#FFFFFF" points="443.443,249.506 442.623,231.342 436.541,246.225 432.49,246.225 426.283,231.342 425.561,249.506
|
||||
421.205,249.506 422.611,225.6 428.174,225.6 434.721,241.439 440.939,225.6 446.494,225.6 447.896,249.506 "/>
|
||||
<path fill="#FFFFFF" d="M465.463,230.045l-3.738,10.445h7.547L465.463,230.045z M472.529,249.506l-2.094-5.812h-9.805l-2.125,5.812
|
||||
h-4.707l9.539-23.906h4.672l9.465,23.906H472.529z"/>
|
||||
<polygon fill="#FFFFFF" points="499.393,249.506 492.908,239.865 486.295,249.506 480.939,249.506 490.135,237.115 481.658,225.6
|
||||
487.252,225.6 493.154,234.475 498.916,225.6 504.271,225.6 495.826,237.115 504.986,249.506 "/>
|
||||
<rect x="511.541" y="225.6" fill="#FFFFFF" width="4.465" height="23.906"/>
|
||||
<polygon fill="#FFFFFF" points="547.229,249.506 546.396,231.342 540.326,246.225 536.275,246.225 530.068,231.342 529.346,249.506
|
||||
524.99,249.506 526.4,225.6 531.959,225.6 538.506,241.439 544.721,225.6 550.283,225.6 551.682,249.506 "/>
|
||||
<rect x="560.674" y="225.6" fill="#FFFFFF" width="4.453" height="23.906"/>
|
||||
<polygon fill="#FFFFFF" points="591.033,249.506 591.033,245.951 579.166,245.951 579.166,225.6 574.701,225.6 574.701,249.506 "/>
|
||||
<rect x="598.623" y="225.6" fill="#FFFFFF" width="4.453" height="23.906"/>
|
||||
<path fill="#FFFFFF" d="M621.369,230.045l-3.742,10.445h7.547L621.369,230.045z M628.432,249.506l-2.094-5.812h-9.812l-2.125,5.812
|
||||
h-4.699l9.531-23.906h4.668l9.477,23.906H628.432z"/>
|
||||
<polygon fill="#FFFFFF" points="654.264,249.506 644.252,231.686 644.252,249.506 639.854,249.506 639.854,225.6 645.689,225.6
|
||||
655.713,243.42 655.713,225.6 660.096,225.6 660.096,249.506 "/>
|
||||
<path fill="#FFFFFF" d="M685.521,242.873c0-3.609-2.191-5.32-4.902-6.484l-4.734-2.008c-1.48-0.617-3.023-1.438-3.023-3.148
|
||||
c0-1.367,1.203-2.898,3.844-2.898c2.988,0,4.668,1.328,6.039,3.008l1.891-2.969c-1.727-2.051-4.738-3.25-7.93-3.25
|
||||
c-3.844,0-8.41,2.254-8.41,6.863c0,2.941,1.988,4.883,4.566,5.977l4.734,2.012c1.852,0.789,3.258,1.672,3.258,3.555
|
||||
c0,1.531-1.406,3.242-4.422,3.242c-3.055,0-5.039-1.367-6.766-3.312l-1.879,3c1.129,1.336,3.84,3.516,8.574,3.516
|
||||
C683.564,249.975,685.521,245.334,685.521,242.873z"/>
|
||||
<rect x="691.252" y="237.311" fill="#FFFFFF" width="9.363" height="2.977"/>
|
||||
<path fill="#FFFFFF" d="M431.436,293.881c-5.152,0-9.984-1.855-9.984-10.039v-14.344h4.453v14.742c0,3.789,1.82,6.359,5.531,6.359
|
||||
c3.629,0,5.418-2.391,5.418-6.359v-14.742h4.453v14.344C441.307,291.451,436.377,293.881,431.436,293.881z"/>
|
||||
<polygon fill="#FFFFFF" points="464.818,293.393 454.795,275.568 454.795,293.393 450.4,293.393 450.4,269.498 456.236,269.498
|
||||
466.256,287.318 466.256,269.498 470.639,269.498 470.639,293.393 "/>
|
||||
<rect x="480.213" y="269.498" fill="#FFFFFF" width="4.465" height="23.895"/>
|
||||
<polygon fill="#FFFFFF" points="504.877,293.393 500.15,293.393 490.604,269.498 495.65,269.498 502.619,288.889 509.584,269.498
|
||||
514.42,269.498 "/>
|
||||
<polygon fill="#FFFFFF" points="521.033,293.393 521.033,269.498 537.127,269.498 537.127,272.982 525.498,272.982 525.498,279.264
|
||||
536.205,279.264 536.205,282.678 525.498,282.678 525.498,289.85 537.58,289.85 537.58,293.393 "/>
|
||||
<path fill="#FFFFFF" d="M553.529,272.873h-3.848v6.938h3.848c3.438,0,4.289-1.672,4.289-3.656
|
||||
C557.818,274.35,556.408,272.873,553.529,272.873z M559.053,293.393l-4.832-7.199c-1.238-1.844-2.305-3.113-3.43-3.113h-1.109
|
||||
v10.312h-4.453v-23.895h9.16c4.219,0,8.027,2.215,8.027,6.656c0,4.504-4.051,6.184-6.109,6.418c0.691,0.441,1.578,1.602,1.891,2.051
|
||||
l6.18,8.77H559.053z"/>
|
||||
<path fill="#FFFFFF" d="M577.686,293.881c-4.738,0-7.445-2.195-8.582-3.516l1.887-3.008c1.723,1.945,3.711,3.312,6.762,3.312
|
||||
c3.02,0,4.426-1.711,4.426-3.242c0-1.887-1.406-2.773-3.258-3.555l-4.734-2.016c-2.578-1.094-4.566-3.035-4.566-5.977
|
||||
c0-4.609,4.566-6.863,8.406-6.863c3.195,0,6.207,1.191,7.93,3.242l-1.887,2.969c-1.371-1.668-3.051-2.996-6.043-2.996
|
||||
c-2.641,0-3.84,1.531-3.84,2.898c0,1.711,1.543,2.531,3.02,3.145l4.727,2.012c2.711,1.164,4.914,2.871,4.914,6.484
|
||||
C586.846,289.232,584.889,293.881,577.686,293.881z"/>
|
||||
<rect x="594.873" y="269.498" fill="#FFFFFF" width="4.465" height="23.895"/>
|
||||
<polygon fill="#FFFFFF" points="618.51,273.053 618.51,293.393 614.057,293.393 614.057,273.053 605.99,273.053 605.99,269.498
|
||||
626.572,269.498 626.572,273.053 "/>
|
||||
<path fill="#FFFFFF" d="M645.17,267.318c-1.273,0-2.328-1.094-2.328-2.297c0-1.188,1.027-2.281,2.328-2.281s2.332,1.094,2.332,2.281
|
||||
C647.502,266.225,646.447,267.318,645.17,267.318z M641.803,273.939l-3.738,10.441h7.547L641.803,273.939z M638.545,267.318
|
||||
c-1.266,0-2.328-1.094-2.328-2.297c0-1.188,1.023-2.281,2.328-2.281c1.309,0,2.34,1.094,2.34,2.281
|
||||
C640.885,266.225,639.814,267.318,638.545,267.318z M648.881,293.393l-2.094-5.801h-9.82l-2.121,5.801h-4.699l9.531-23.895h4.672
|
||||
l9.465,23.895H648.881z"/>
|
||||
<polygon fill="#FFFFFF" points="669.9,273.053 669.9,293.393 665.447,293.393 665.447,273.053 657.389,273.053 657.389,269.498
|
||||
677.971,269.498 677.971,273.053 "/>
|
||||
<polygon fill="#FFFFFF" points="443.443,337.287 442.623,319.135 436.541,334.018 432.49,334.018 426.283,319.135 425.561,337.287
|
||||
421.205,337.287 422.611,313.393 428.174,313.393 434.721,329.232 440.939,313.393 446.494,313.393 447.896,337.287 "/>
|
||||
<path fill="#FFFFFF" d="M469.381,311.205c-1.277,0-2.34-1.094-2.34-2.285s1.035-2.285,2.34-2.285c1.297,0,2.367,1.094,2.367,2.285
|
||||
S470.639,311.205,469.381,311.205z M462.752,311.205c-1.262,0-2.328-1.094-2.328-2.285s1.027-2.285,2.328-2.285
|
||||
s2.371,1.094,2.371,2.285S464.025,311.205,462.752,311.205z M466.396,337.768c-5.152,0-9.984-1.836-9.984-10.039v-14.336h4.453
|
||||
v14.754c0,3.789,1.82,6.352,5.531,6.352c3.629,0,5.418-2.395,5.418-6.352v-14.754h4.453v14.336
|
||||
C476.268,335.346,471.338,337.768,466.396,337.768z"/>
|
||||
<polygon fill="#FFFFFF" points="499.779,337.287 489.756,319.475 489.756,337.287 485.361,337.287 485.361,313.393 491.197,313.393
|
||||
501.217,331.217 501.217,313.393 505.6,313.393 505.6,337.287 "/>
|
||||
<path fill="#FFFFFF" d="M525.127,337.768c-7.75,0-11.391-6.004-11.391-12.598c0-6.453,4.422-12.258,11.391-12.258
|
||||
c3.438,0,6.109,1.133,7.93,3.039l-1.754,3.32c-1.34-1.504-2.668-3.078-6.105-3.078c-4.055,0-6.793,3.93-6.793,8.977
|
||||
c0,4.953,2.949,9.328,6.832,9.328c2.852,0,4.727-0.961,6.75-3.117l1.715,3.418C530.924,336.92,528.908,337.768,525.127,337.768z"/>
|
||||
<polygon fill="#FFFFFF" points="555.83,337.287 555.83,326.467 545.131,326.467 545.131,337.287 540.67,337.287 540.67,313.393
|
||||
545.131,313.393 545.131,323.197 555.83,323.197 555.83,313.393 560.291,313.393 560.291,337.287 "/>
|
||||
<polygon fill="#FFFFFF" points="569.732,337.287 569.732,313.393 585.822,313.393 585.822,316.881 574.193,316.881 574.193,323.158
|
||||
584.896,323.158 584.896,326.576 574.193,326.576 574.193,333.744 586.268,333.744 586.268,337.287 "/>
|
||||
<polygon fill="#FFFFFF" points="608.33,337.287 598.311,319.475 598.311,337.287 593.916,337.287 593.916,313.393 599.744,313.393
|
||||
609.771,331.217 609.771,313.393 614.166,313.393 614.166,337.287 "/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 10 KiB |
10
package.yaml
10
package.yaml
@ -6,9 +6,8 @@ default-extensions:
|
||||
- NoImplicitPrelude
|
||||
- ViewPatterns
|
||||
- DerivingStrategies
|
||||
- DeriveGeneric
|
||||
- GeneralizedNewtypeDeriving
|
||||
- TypeApplications
|
||||
- MultiWayIf
|
||||
language: GHC2021
|
||||
|
||||
executables:
|
||||
site:
|
||||
@ -33,3 +32,8 @@ executables:
|
||||
- yaml
|
||||
- containers
|
||||
- Glob
|
||||
- transformers
|
||||
- mtl
|
||||
- megaparsec
|
||||
- text
|
||||
- network-uri
|
||||
|
||||
239
special/data-protection.md
Normal file
239
special/data-protection.md
Normal file
@ -0,0 +1,239 @@
|
||||
---
|
||||
title: Datenschutzerklärung
|
||||
---
|
||||
<div markdown="1" class="multi-col small-headlines">
|
||||
# Datenschutzerklärung
|
||||
*Stand: 27.10.2023*
|
||||
|
||||
Wir informieren Sie nachfolgend gemäß den gesetzlichen Vorgaben des Datenschutzrechts (insb. gemäß BDSG n.F. und der europäischen Datenschutz-Grundverordnung „DSGVO“) über die Art, den Umfang und Zweck der Verarbeitung personenbezogener Daten durch unser Unternehmen. Diese Datenschutzerklärung gilt auch für unsere Webseiten und Social-Media-Profile. Bezüglich der Definition von Begriffen wie etwa „personenbezogene Daten“ oder „Verarbeitung“ verweisen wir auf Art. 4 DSGVO.
|
||||
|
||||
## Verantwortliche Personen
|
||||
|
||||
### Verantwortliche Person für den Inhalt
|
||||
|
||||
Unsere verantwortliche Person (nachfolgend „Verantwortlicher“) i.S.d. Art. 4 Zif. 7 DSGVO ist:
|
||||
|
||||
> UniWorX Systems GmbH
|
||||
> Savitsstraße 43
|
||||
> D-81929 München
|
||||
> Bavaria, Germany
|
||||
>
|
||||
> Geschäftsführerin: Sarah Vaupel
|
||||
> E-Mail: [sarah.vaupel@uniworx.de](mailto:sarah.vaupel@uniworx.de)
|
||||
> Telefon: +49 179 4130707
|
||||
|
||||
### Datenschutzbeauftragte Person
|
||||
|
||||
> Sarah Vaupel
|
||||
> Savitsstraße 43
|
||||
> D-81929 München
|
||||
> Bavaria, Germany
|
||||
>
|
||||
> E-Mail: [sarah.vaupel@uniworx.de](mailto:sarah.vaupel@uniworx.de)
|
||||
> Telefon: +49 179 4130707
|
||||
|
||||
## Datenarten, Zwecke der Verarbeitung und Kategorien betroffener Personen
|
||||
|
||||
Nachfolgend informieren wir Sie über Art, Umfang und Zweck der Erhebung, Verarbeitung und Nutzung personenbezogener Daten.
|
||||
|
||||
1. **Arten der Daten, die wir verarbeiten**
|
||||
|
||||
Kommunikationsdaten (IP-Adresse etc.),
|
||||
|
||||
2. **Zwecke der Verarbeitung nach Art. 13 Abs. 1 c) DSGVO**
|
||||
|
||||
- Erfüllung gesetzlicher Aufbewahrungspflichten,
|
||||
- Vermeidung von SPAM und Missbrauch,
|
||||
- Maßnahmen der Sicherheit,
|
||||
- Unterbrechungsfreier, sicherer Betrieb unserer Webseite,
|
||||
|
||||
3. **Kategorien der betroffenen Personen nach Art. 13 Abs. 1 e) DSGVO**
|
||||
|
||||
Besucher/Nutzer der Webseite.
|
||||
|
||||
Die betroffenen Personen werden zusammenfassend als „Nutzer“ bezeichnet.
|
||||
|
||||
## Rechtsgrundlagen der Verarbeitung personenbezogener Daten
|
||||
|
||||
Nachfolgend Informieren wir Sie über die Rechtsgrundlagen der Verarbeitung personenbezogener Daten.
|
||||
|
||||
1. Wenn wir Ihre Einwilligung für die Verarbeitung personenbezogenen Daten eingeholt haben, ist Art. 6 Abs. 1 S. 1 lit. a) DSGVO Rechtsgrundlage.
|
||||
|
||||
2. Ist die Verarbeitung zur Erfüllung eines Vertrags oder zur Durchführung vorvertraglicher Maßnahmen erforderlich, die auf Ihre Anfrage hin erfolgen, so ist Art. 6 Abs. 1 S. 1 lit. b) DSGVO Rechtsgrundlage.
|
||||
|
||||
3. Ist die Verarbeitung zur Erfüllung einer rechtlichen Verpflichtung erforderlich, der wir unterliegen (z.B. gesetzliche Aufbewahrungspflichten), so ist Art. 6 Abs. 1 S. 1 lit. c) DSGVO Rechtsgrundlage.
|
||||
|
||||
4. Ist die Verarbeitung erforderlich, um lebenswichtige Interessen der betroffenen Person oder einer anderen natürlichen Person zu schützen, so ist Art. 6 Abs. 1 S. 1 lit. d) DSGVO Rechtsgrundlage.
|
||||
|
||||
5. Ist die Verarbeitung zur Wahrung unserer oder der berechtigten Interessen eines Dritten erforderlich und überwiegen diesbezüglich Ihre Interessen oder Grundrechte und Grundfreiheiten nicht, so ist Art. 6 Abs. 1 S. 1 lit. f) DSGVO Rechtsgrundlage.
|
||||
|
||||
## Weitergabe personenbezogener Daten an Dritte und Auftragsverarbeiter
|
||||
|
||||
Ohne Ihre Einwilligung geben wir grundsätzlich keine Daten an Dritte weiter. Sollte dies doch der Fall sein, dann erfolgt die Weitergabe auf der Grundlage der zuvor genannten Rechtsgrundlagen z.B. bei der Weitergabe von Daten an Online-Paymentanbieter zur Vertragserfüllung oder aufgrund gerichtlicher Anordnung oder wegen einer gesetzlichen Verpflichtung zur Herausgabe der Daten zum Zwecke der Strafverfolgung, zur Gefahrenabwehr oder zur Durchsetzung der Rechte am geistigen Eigentum.
|
||||
|
||||
Wir setzen zudem Auftragsverarbeiter (externe Dienstleister z.B. zum Webhosting unserer Webseiten und Datenbanken) zur Verarbeitung Ihrer Daten ein. Wenn im Rahmen einer Vereinbarung zur Auftragsverarbeitung an die Auftragsverarbeiter Daten weitergegeben werden, erfolgt dies immer nach Art. 28 DSGVO. Wir wählen dabei unsere Auftragsverarbeiter sorgfältig aus, kontrollieren diese regelmäßig und haben uns ein Weisungsrecht hinsichtlich der Daten einräumen lassen. Zudem müssen die Auftragsverarbeiter geeignete technische und organisatorische Maßnahmen getroffen haben und die Datenschutzvorschriften gem. BDSG n.F. und DSGVO einhalten.
|
||||
|
||||
## Datenübermittlung in Drittstaaten
|
||||
|
||||
Durch die Verabschiedung der europäischen Datenschutz-Grundverordnung (DSGVO) wurde eine einheitliche Grundlage für den Datenschutz in Europa geschaffen. Ihre Daten werden daher vorwiegend durch Unternehmen verarbeitet, für die die DSGVO Anwendung findet. Sollte doch die Verarbeitung durch Dienste Dritter außerhalb der Europäischen Union oder des Europäischen Wirtschaftsraums stattfinden, so müssen diese die besonderen Voraussetzungen der Art. 44 ff. DSGVO erfüllen. Das bedeutet, die Verarbeitung erfolgt aufgrund besonderer Garantien, wie etwa die von der EU-Kommission offiziell anerkannte Feststellung eines der EU entsprechenden Datenschutzniveaus oder der Beachtung offiziell anerkannter spezieller vertraglicher Verpflichtungen, der so genannten „Standardvertragsklauseln“.
|
||||
|
||||
Soweit wir aufgrund der Unwirksamkeit des sog. „Privacy Shields“, nach Art. 49 Abs. 1 S. 1 lit. a) DSGVO die ausdrückliche Einwilligung in die Datenübermittlung in die USA von Ihnen einholen, weisen wir diesbezüglich auf das Risiko eines geheimen Zugriffs durch US-Behörden und die Nutzung der Daten zu Überwachungszwecken, ggf. ohne Rechtsbehelfsmöglichkeiten für EU-Bürger, hin.
|
||||
|
||||
## Löschung von Daten und Speicherdauer
|
||||
|
||||
Sofern nicht in dieser Datenschutzerklärung ausdrücklich angegeben, werden Ihre personenbezogen Daten gelöscht oder gesperrt, sobald die zur Verarbeitung erteilte Einwilligung von Ihnen widerrufen wird oder der Zweck für die Speicherung entfällt bzw. die Daten für den Zweck nicht mehr erforderlich sind, es sei denn deren weitere Aufbewahrung ist zu Beweiszwecken erforderlich oder dem stehen gesetzliche Aufbewahrungspflichten entgegenstehen. Darunter fallen etwa handelsrechtliche Aufbewahrungspflichten von Geschäftsbriefen nach § 257 Abs. 1 HGB (6 Jahre) sowie steuerrechtliche Aufbewahrungspflichten nach § 147 Abs. 1 AO von Belegen (10 Jahre). Wenn die vorgeschriebene Aufbewahrungsfrist abläuft, erfolgt eine Sperrung oder Löschung Ihrer Daten, es sei denn die Speicherung ist weiterhin für einen Vertragsabschluss oder zur Vertragserfüllung erforderlich.
|
||||
|
||||
## Bestehen einer automatisierten Entscheidungsfindung
|
||||
|
||||
Wir setzen keine automatische Entscheidungsfindung und kein Profiling ein.
|
||||
|
||||
## Bereitstellung unserer Webseite und Erstellung von Logfiles
|
||||
|
||||
1. Wenn Sie unsere Webseite lediglich informatorisch nutzen (also keine Registrierung und auch keine anderweitige Übermittlung von Informationen), erheben wir nur die personenbezogenen Daten, die Ihr Browser an unseren Server übermittelt. Wenn Sie unsere Webseite betrachten möchten, erheben wir die folgenden Daten:
|
||||
|
||||
- IP-Adresse;
|
||||
- Internet-Service-Provider des Nutzers;
|
||||
- Datum und Uhrzeit des Abrufs;
|
||||
- Browsertyp;
|
||||
- Sprache und Browser-Version;
|
||||
- Inhalt des Abrufs;
|
||||
- Zeitzone;
|
||||
- Zugriffsstatus/HTTP-Statuscode;
|
||||
- Datenmenge;
|
||||
- Webseiten, von denen die Anforderung kommt;
|
||||
- Betriebssystem.
|
||||
|
||||
Eine Speicherung dieser Daten zusammen mit anderen personenbezogenen Daten von Ihnen findet nicht statt.
|
||||
|
||||
2. Diese Daten dienen dem Zweck der nutzerfreundlichen, funktionsfähigen und sicheren Auslieferung unserer Webseite an Sie mit Funktionen und Inhalten sowie deren Optimierung und statistischen Auswertung.
|
||||
|
||||
3. Rechtsgrundlage hierfür ist unser in den obigen Zwecken auch liegendes berechtigtes Interesse an der Datenverarbeitung nach Art. 6 Abs. 1 S.1 lit. f) DSGVO.
|
||||
|
||||
4. Wir speichern aus Sicherheitsgründen diese Daten in Server-Logfiles für die Speicherdauer von 30 Tagen. Nach Ablauf dieser Frist werden diese automatisch gelöscht, es sei denn wir benötigen deren Aufbewahrung zu Beweiszwecken bei Angriffen auf die Serverinfrastruktur oder anderen Rechtsverletzungen.
|
||||
|
||||
## Präsenz in sozialen Medien
|
||||
|
||||
1. Wir unterhalten in sozialen Medien Profile bzw. Fanpages. Bei der Nutzung und dem Aufruf unseres Profils im jeweiligen Netzwerk durch Sie gelten die jeweiligen Datenschutzhinweise und Nutzungsbedingungen des jeweiligen Netzwerks.
|
||||
|
||||
2. **Datenkategorien und Beschreibung der Datenverarbeitung:**
|
||||
|
||||
- Nutzungsdaten,
|
||||
- Kontaktdaten,
|
||||
- Inhaltsdaten,
|
||||
- Bestandsdaten.
|
||||
|
||||
Ferner werden die Daten der Nutzer innerhalb sozialer Netzwerke im Regelfall für Marktforschungs- und Werbezwecke verarbeitet. So können z.B. anhand des Nutzungsverhaltens und sich daraus ergebender Interessen der Nutzer Nutzungsprofile erstellt werden. Die Nutzungsprofile können wiederum verwendet werden, um z.B. Werbeanzeigen innerhalb und außerhalb der Netzwerke zu schalten, die mutmaßlich den Interessen der Nutzer entsprechen. Zu diesen Zwecken werden im Regelfall Cookies auf den Rechnern der Nutzer gespeichert, in denen das Nutzungsverhalten und die Interessen der Nutzer gespeichert werden. Ferner können in den Nutzungsprofilen auch Daten unabhängig der von den Nutzern verwendeten Geräte gespeichert werden (insbesondere, wenn die Nutzer Mitglieder der jeweiligen Plattformen sind und bei diesen eingeloggt sind). Für eine detaillierte Darstellung der jeweiligen Verarbeitungsformen und der Widerspruchsmöglichkeiten (Opt-Out) verweisen wir auf die Datenschutzerklärungen und Angaben der Betreiber der jeweiligen Netzwerke. Auch im Fall von Auskunftsanfragen und der Geltendmachung von Betroffenenrechten weisen wir darauf hin, dass diese am effektivsten bei den Anbietern geltend gemacht werden können. Nur die Anbieter haben jeweils Zugriff auf die Daten der Nutzer und können direkt entsprechende Maßnahmen ergreifen und Auskünfte geben. Sollten Sie dennoch Hilfe benötigen, dann können Sie sich an uns wenden.
|
||||
|
||||
3. **Zweck der Verarbeitung:**
|
||||
|
||||
- Kommunikation mit den auf den sozialen Netzwerken angeschlossenen und registrierten Nutzern;
|
||||
- Information und Werbung für unsere Produkte, Angebote und Dienstleistungen;
|
||||
- Außerdarstellung und Imagepflege;
|
||||
- Auswertung und Analyse der Nutzer und Inhalte unserer Präsenzen in den sozialen Medien.
|
||||
|
||||
4. **Rechtsgrundlagen:**
|
||||
|
||||
Die Rechtsgrundlage für die Verarbeitung der personenbezogenen Daten ist unser in den obigen Zwecken liegendes berechtigtes Interesse gemäß Art. 6 Abs. 1 S. 1 lit. f) DSGVO. Soweit Sie uns bzw. dem Verantwortlichen des sozialen Netzwerks eine Einwilligung in die Verarbeitung Ihrer personenbezogenen Daten erteilt haben, ist Rechtsgrundlage Art. 6 Abs. 1 S. 1 lit. a) i.V.m. Art. 7 DSGVO.
|
||||
|
||||
5. **Datenübermittlung/Empfängerkategorie:**
|
||||
|
||||
Soziales Netzwerk.
|
||||
|
||||
6. **Datenschutzhinweise, Auskunftsmöglichkeiten und Widerspruchmöglichkeiten (Opt-Out) der jeweiligen Netzwerke/Diensteanbieter:**
|
||||
|
||||
- **XING** – Diensteanbieter: XING AG, Dammtorstraße 29-32, 20354 Hamburg, Deutschland) - Datenschutzerklärung/ Opt-Out: <a href="https://privacy.xing.com/de/datenschutzerklaerung" target="_blank" rel="nofollow">https://privacy.xing.com/de/datenschutzerklaerung</a>
|
||||
- **LinkedIn** – Diensteanbieter: LinkedIn Ireland Unlimited Company, Wilton Place, Dublin 2, Irland) – Datenschutzerklärung: <a href="https://www.linkedin.com/legal/privacy-policy" target="_blank" rel="nofollow">https://www.linkedin.com/legal/privacy-policy</a>, Cookie-Richtlinie und Opt-Out: <a href="https://www.linkedin.com/legal/cookie-policy" target="_blank" rel="nofollow">https://www.linkedin.com/legal/cookie-policy</a>
|
||||
|
||||
## Social-Media-Plug-ins
|
||||
|
||||
1. Wir setzen auf unserer Webseite Social-Media-Plug-ins von sozialen Netzwerken ein. Dabei nutzen wir die sog. „Zwei-Klick-Lösung“-Shariff von c’t bzw. heise.de: <a href="https://www.heise.de/ct/artikel/Shariff-Social-Media-Buttons-mit-Datenschutz-2467514.html" rel="nofollow" target="_blank">https://www.heise.de/ct/artikel/Shariff-Social-Media-Buttons-mit-Datenschutz-2467514.html</a>; Dienstanbieter: Heise Medien GmbH & Co. KG, Karl-Wiechert-Allee 10, 30625 Hannover, Deutschland; Datenschutzerklärung: <a href="https://www.heise.de/Datenschutzerklaerung-der-Heise-Medien-GmbH-Co-KG-4860.html" rel="nofollow" target="_blank">https://www.heise.de/Datenschutzerklaerung-der-Heise-Medien-GmbH-Co-KG-4860.html</a>.
|
||||
|
||||
2. **Datenkategorie und Beschreibung der Datenverarbeitung:**
|
||||
|
||||
- Nutzungsdaten,
|
||||
- Inhaltsdaten,
|
||||
- Bestandsdaten.
|
||||
|
||||
Beim Abruf unserer Webseite werden durch „Shariff“ <strong>keine personenbezogenen</strong> Daten an die Drittanbieter der Social-Plug-ins übermittelt. Neben dem Logo bzw. der Marke des sozialen Netzwerks finden Sie einen Regler, mit dem Sie das Plug-in per Klick aktivieren können. Diese Aktivierung stellt Ihre <strong>Einwilligung</strong> in der Form dar, dass der jeweilige Anbieter des sozialen Netzwerks die Information erhält, dass Sie unsere Webseite aufgerufen haben und Ihre personenbezogenen Daten an den Anbieter des Plug-ins übermittelt und dort gespeichert werden. Hierbei handelt es sich um sog. Thirdparty Cookies. Bei einigen Anbietern wie Facebook und XING wird nach deren Angaben Ihre IP nach der Erhebung sofort anonymisiert. Die über den Nutzer erhobenen Daten speichert der Plug-in-Anbieter als Nutzungsprofile.
|
||||
*Sie können Ihre Einwilligung jederzeit durch die Deaktivierung des Reglers widerrufen.*
|
||||
|
||||
3. **Zweck der Datenverarbeitung:**
|
||||
|
||||
- Verbesserung und Optimierung unserer Webseite;
|
||||
- Steigerung unserer Bekanntheit mittels sozialer Netzwerke;
|
||||
- Möglichkeit der Interaktion mit Ihnen und der Nutzer untereinander über soziale Netzwerke;
|
||||
- Werbung, Analyse und/oder bedarfsgerechten Gestaltung der Webseite.
|
||||
|
||||
4. **Rechtsgrundlagen:**
|
||||
|
||||
Die Rechtsgrundlage für die Verarbeitung der personenbezogenen Daten ist unser in den obigen Zwecken liegendes berechtigtes Interesse gemäß Art. 6 Abs. 1 S. 1 lit. f) DSGVO. Soweit Sie uns bzw. dem Verantwortlichen des sozialen Netzwerks eine Einwilligung in die Verarbeitung Ihrer personenbezogenen Daten erteilt haben, ist Rechtsgrundlage Art. 6 Abs. 1 S. 1 lit. a) i.V.m. Art. 7 DSGVO. Bei vorvertraglichen Anfragen oder bei der Nutzung Ihrer personenbezogenen Daten zur Vertragserfüllung, ist Art. 6 Abs. 1 S. 1 lit. b) DSGVO Rechtsgrundlage.
|
||||
|
||||
5. **Datenübermittlung/Empfängerkategorie:**
|
||||
|
||||
Soziales Netzwerk.
|
||||
|
||||
6. **Genutzte soziale Netzwerke und Widerspruch:**
|
||||
|
||||
Wir verweisen hinsichtlich des Zwecks und Umfangs der Datenerhebung und Verarbeitung auf die jeweiligen Datenschutzerklärungen der sozialen Netzwerke. Zudem finden Sie dort auch Hinweise zu Ihren Rechten und Einstellungsmöglichkeiten zum Schutz Ihrer personenbezogenen Daten. Ihnen steht ein Widerspruchsrecht gegen die Bildung dieser Nutzerprofile zu, wobei Sie sich zur Ausübung dieser Rechte direkt an den jeweiligen Plug-in-Anbieter wenden können.
|
||||
|
||||
## XING
|
||||
|
||||
1. Wir haben auf unserer Webseite Plug-ins vom sozialen Netzwerk XING (XING AG, Dammtorstraße 29-32, 20354 Hamburg, Deutschland) im Rahmen der sog. „Zwei-Klick-Lösung“ von Shariff integriert. Diese erkennen Sie am Share-Button mit weißem Logo von XING und dem „X“ Symbol auf grünem Hintergrund.
|
||||
|
||||
2. Wenn Sie auf unserer Webseite den Share-Button von XING willentlich aktivieren, führt dies beim Aufruf der jeweiligen Internetseite dazu, dass Ihr Browser eine Verbindung mit dem Server von XING aufbaut. Dabei werden laut XING keine Daten über den Aufruf gespeichert, aus denen XING einen unmittelbaren Personenbezug herleiten könnte. XING speichert insbesondere keine IP-Adressen von Ihnen und verwendet auch keine Cookies. Beim Klick auf den Share-Button werden Sie zur Startseite von XING umgeleitet, auf der Sie dann - falls Sie eingeloggt sind – unsere Seite empfehlen können, was dem Zweck der Steigerung unserer Bekanntheit und Reichweite dient. Hinsichtlich dieser Aktivitäten auf der XING Plattform gilt die unten genannte Datenschutzerklärung von XING.
|
||||
|
||||
3. Wenn Sie sich bei XING vor dem Besuch unserer Webseite ausloggen und Ihre Cookies löschen, werden bei der Aktivierung des Plug-ins keine Daten über den Besuch unserer Webseite Ihrem Profil auf XING zugeordnet.
|
||||
|
||||
4. Zweck und Umfang der Datenerhebung sowie ihre weitere Verarbeitung und Nutzung der Daten durch XING sowie Ihre diesbezüglichen Rechte und Einstellungsmöglichkeiten zum Schutz Ihrer Privatsphäre, können Sie den Datenschutzhinweisen von XING zum Share-Button entnehmen unter <a href="https://www.xing.com/app/share%3Fop%3Ddata_protection" target="_blank" rel="nofollow">https://www.xing.com/app/share%3Fop%3Ddata_protection</a> sowie der allgemeinen Datenschutzerklärung von XING unter <a href="https://privacy.xing.com/de/datenschutzerklaerung" target="_blank" rel="nofollow">https://privacy.xing.com/de/datenschutzerklaerung</a>.<br /><br /></li>
|
||||
|
||||
## Rechte der betroffenen Person
|
||||
|
||||
1. **Widerspruch oder Widerruf gegen die Verarbeitung Ihrer Daten**
|
||||
|
||||
Soweit die Verarbeitung auf Ihrer Einwilligung gemäß Art. 6 Abs. 1 S. 1 lit. a), Art. 7 DSGVO beruht, haben Sie das Recht, die Einwilligung jederzeit zu widerrufen. Die Rechtmäßigkeit der aufgrund der Einwilligung bis zum Widerruf erfolgten Verarbeitung wird dadurch nicht berührt.
|
||||
|
||||
Soweit wir die Verarbeitung Ihrer personenbezogenen Daten auf die Interessenabwägung gemäß Art. 6 Abs. 1 S. 1 lit. f) DSGVO stützen, können Sie Widerspruch gegen die Verarbeitung einlegen. Dies ist der Fall, wenn die Verarbeitung insbesondere nicht zur Erfüllung eines Vertrags mit Ihnen erforderlich ist, was von uns jeweils bei der nachfolgenden Beschreibung der Funktionen dargestellt wird. Bei Ausübung eines solchen Widerspruchs bitten wir um Darlegung der Gründe, weshalb wir Ihre personenbezogenen Daten nicht wie von uns durchgeführt verarbeiten sollten. Im Falle Ihres begründeten Widerspruchs prüfen wir die Sachlage und werden entweder die Datenverarbeitung einstellen bzw. anpassen oder Ihnen unsere zwingenden schutzwürdigen Gründe aufzeigen, aufgrund derer wir die Verarbeitung fortführen.
|
||||
|
||||
Sie können der Verarbeitung Ihrer personenbezogenen Daten für Zwecke der Werbung und Datenanalyse jederzeit widersprechen. Das Widerspruchsrecht können Sie kostenfrei ausüben. Über Ihren Werbewiderspruch können Sie uns unter folgenden Kontaktdaten informieren:
|
||||
|
||||
> UniWorX Systems GmbH
|
||||
> Savitsstraße 43
|
||||
> D-81929 München
|
||||
> Bavaria, Germany
|
||||
>
|
||||
> Geschäftsführerin: Sarah Vaupel
|
||||
> E-Mail: [sarah.vaupel@uniworx.de](mailto:sarah.vaupel@uniworx.de)
|
||||
|
||||
2. **Recht auf Auskunft**
|
||||
|
||||
Sie haben das Recht, von uns eine Bestätigung darüber zu verlangen, ob Sie betreffende personenbezogene Daten verarbeitet werden. Sofern dies der Fall ist, haben Sie ein Recht auf Auskunft über Ihre bei uns gespeicherten persönlichen Daten nach Art. 15 DSGVO. Dies beinhaltet insbesondere die Auskunft über die Verarbeitungszwecke, die Kategorie der personenbezogenen Daten, die Kategorien von Empfängern, gegenüber denen Ihre Daten offengelegt wurden oder werden, die geplante Speicherdauer, die Herkunft ihrer Daten, sofern diese nicht direkt bei Ihnen erhoben wurden.
|
||||
|
||||
3. **Recht auf Berichtigung**
|
||||
|
||||
Sie haben ein Recht auf Berichtigung unrichtiger oder auf Vervollständigung richtiger Daten nach Art. 16 DSGVO.
|
||||
|
||||
4. **Recht auf Löschung**
|
||||
|
||||
Sie haben ein Recht auf Löschung Ihrer bei uns gespeicherten Daten nach Art. 17 DSGVO, es sei denn gesetzliche oder vertraglichen Aufbewahrungsfristen oder andere gesetzliche Pflichten bzw. Rechte zur weiteren Speicherung stehen dieser entgegen.
|
||||
|
||||
5. **Recht auf Einschränkung**
|
||||
|
||||
Sie haben das Recht, eine Einschränkung bei der Verarbeitung Ihrer personenbezogenen Daten zu verlangen, wenn eine der Voraussetzungen in Art. 18 Abs. 1 lit. a) bis d) DSGVO erfüllt ist:
|
||||
|
||||
- Wenn Sie die Richtigkeit der Sie betreffenden personenbezogenen für eine Dauer bestreiten, die es dem Verantwortlichen ermöglicht, die Richtigkeit der personenbezogenen Daten zu überprüfen;
|
||||
- die Verarbeitung unrechtmäßig ist und Sie die Löschung der personenbezogenen Daten ablehnen und stattdessen die Einschränkung der Nutzung der personenbezogenen Daten verlangen;
|
||||
- der Verantwortliche die personenbezogenen Daten für die Zwecke der Verarbeitung nicht länger benötigt, Sie diese jedoch zur Geltendmachung, Ausübung oder Verteidigung von Rechtsansprüchen benötigen, oder
|
||||
- wenn Sie Widerspruch gegen die Verarbeitung gemäß Art. 21 Abs. 1 DSGVO eingelegt haben und noch nicht feststeht, ob die berechtigten Gründe des Verantwortlichen gegenüber Ihren Gründen überwiegen.
|
||||
|
||||
6. **Recht auf Datenübertragbarkeit**
|
||||
|
||||
Sie haben ein Recht auf Datenübertragbarkeit nach Art. 20 DSGVO, was bedeutet, dass Sie die bei uns über Sie gespeicherten personenbezogenen Daten in einem strukturierten, gängigen und maschinenlesbaren Format erhalten können oder die Übermittlung an einen anderen Verantwortlichen verlangen können.
|
||||
|
||||
7. **Recht auf Beschwerde**
|
||||
|
||||
Sie haben ein Recht auf Beschwerde bei einer Aufsichtsbehörde. In der Regel können Sie sich hierfür an die Aufsichtsbehörde insbesondere in dem Mitgliedstaat ihres Aufenthaltsorts, ihres Arbeitsplatzes oder des Orts des mutmaßlichen Verstoßes wenden.
|
||||
|
||||
## Datensicherheit
|
||||
|
||||
Um alle personenbezogen Daten, die an uns übermittelt werden, zu schützen und um sicherzustellen, dass die Datenschutzvorschriften von uns, aber auch unseren externen Dienstleistern eingehalten werden, haben wir geeignete technische und organisatorische Sicherheitsmaßnahmen getroffen. Deshalb werden unter anderem alle Daten zwischen Ihrem Browser und unserem Server über eine sichere SSL-Verbindung verschlüsselt übertragen.
|
||||
</div>
|
||||
48
special/imprint.md
Normal file
48
special/imprint.md
Normal file
@ -0,0 +1,48 @@
|
||||
---
|
||||
title: Impressum
|
||||
---
|
||||
<div markdown="1" class="multi-col small-headlines">
|
||||
# Impressum
|
||||
|
||||
## Angaben gemäß § 5 TMG
|
||||
|
||||
> UniWorX Systems GmbH
|
||||
> Savitsstraße 43
|
||||
> D-81929 München
|
||||
> Bavaria, Germany
|
||||
>
|
||||
> Geschäftsführerin: Sarah Vaupel
|
||||
> E-Mail: [sarah.vaupel@uniworx.de](mailto:sarah.vaupel@uniworx.de)
|
||||
> Telefon: +49 179 4130707
|
||||
|
||||
## Verantwortlich für den Inhalt gemäß § 55 Abs. 2 RStV
|
||||
|
||||
> UniWorX Systems GmbH
|
||||
> Savitsstraße 43
|
||||
> D-81929 München
|
||||
> Bavaria, Germany
|
||||
>
|
||||
> Geschäftsführerin: Sarah Vaupel
|
||||
> E-Mail: [sarah.vaupel@uniworx.de](mailto:sarah.vaupel@uniworx.de)
|
||||
> Telefon: +49 179 4130707
|
||||
|
||||
## Disclaimer – Rechtliche Hinweise
|
||||
|
||||
### § 1 Warnhinweis zu Inhalten
|
||||
|
||||
Die kostenlosen und frei zugänglichen Inhalte dieser Webseite wurden mit größtmöglicher Sorgfalt erstellt. Der Anbieter dieser Webseite übernimmt jedoch keine Gewähr für die Richtigkeit und Aktualität der bereitgestellten kostenlosen und frei zugänglichen journalistischen Ratgeber und Nachrichten. Namentlich gekennzeichnete Beiträge geben die Meinung des jeweiligen Autors und nicht immer die Meinung des Anbieters wieder. Allein durch den Aufruf der kostenlosen und frei zugänglichen Inhalte kommt keinerlei Vertragsverhältnis zwischen dem Nutzer und dem Anbieter zustande, insoweit fehlt es am Rechtsbindungswillen des Anbieters.
|
||||
|
||||
### § 2 Externe Links
|
||||
|
||||
Diese Website enthält Verknüpfungen zu Websites Dritter („externe Links“). Diese Webseiten unterliegen der Haftung der jeweiligen Betreiber. Der Anbieter hat bei der erstmaligen Verknüpfung der externen Links die fremden Inhalte daraufhin überprüft, ob etwaige Rechtsverstöße bestehen. Zu dem Zeitpunkt waren keine Rechtsverstöße ersichtlich. Der Anbieter hat keinerlei Einfluss auf die aktuelle und zukünftige Gestaltung und auf die Inhalte der verknüpften Seiten. Das Setzen von externen Links bedeutet nicht, dass sich der Anbieter die hinter dem Verweis oder Link liegenden Inhalte zu Eigen macht. Eine ständige Kontrolle der externen Links ist für den Anbieter ohne konkrete Hinweise auf Rechtsverstöße nicht zumutbar. Bei Kenntnis von Rechtsverstößen werden jedoch derartige externe Links unverzüglich gelöscht.
|
||||
|
||||
### § 3 Urheber- und Leistungsschutzrechte
|
||||
|
||||
Die auf dieser Website veröffentlichten Inhalte unterliegen dem deutschen Urheber- und Leistungsschutzrecht. Jede vom deutschen Urheber- und Leistungsschutzrecht nicht zugelassene Verwertung bedarf der vorherigen schriftlichen Zustimmung des Anbieters oder jeweiligen Rechteinhabers. Dies gilt insbesondere für Vervielfältigung, Bearbeitung, Übersetzung, Einspeicherung, Verarbeitung bzw. Wiedergabe von Inhalten in Datenbanken oder anderen elektronischen Medien und Systemen. Inhalte und Rechte Dritter sind dabei als solche gekennzeichnet. Die unerlaubte Vervielfältigung oder Weitergabe einzelner Inhalte oder kompletter Seiten ist nicht gestattet und strafbar. Lediglich die Herstellung von Kopien und Downloads für den persönlichen, privaten und nicht kommerziellen Gebrauch ist erlaubt.
|
||||
|
||||
Die Darstellung dieser Website in fremden Frames ist nur mit schriftlicher Erlaubnis zulässig.
|
||||
|
||||
### § 4 Besondere Nutzungsbedingungen
|
||||
|
||||
Soweit besondere Bedingungen für einzelne Nutzungen dieser Website von den oben genannten Paragraphen abweichen, wird an entsprechender Stelle ausdrücklich darauf hingewiesen. In diesem Falle gelten im jeweiligen Einzelfall die besonderen Nutzungsbedingungen.
|
||||
</div>
|
||||
276
src/Main.hs
276
src/Main.hs
@ -4,70 +4,262 @@ import Prelude
|
||||
|
||||
import Hakyll
|
||||
|
||||
import qualified Data.List as List
|
||||
import Data.Bool
|
||||
import Data.List qualified as List
|
||||
import Data.Maybe
|
||||
import System.FilePath
|
||||
import qualified System.FilePath.Glob as Glob
|
||||
|
||||
import qualified Data.Yaml as Yaml
|
||||
import System.FilePath
|
||||
import System.FilePath.Glob qualified as Glob
|
||||
|
||||
import Data.Yaml qualified as Yaml
|
||||
|
||||
import Data.Map (Map)
|
||||
import qualified Data.Map as Map
|
||||
import Data.Map qualified as Map
|
||||
|
||||
import Control.Monad
|
||||
import Control.Monad.Reader.Class
|
||||
import Control.Monad.Trans.Maybe
|
||||
import Control.Monad.Trans.Reader (Reader, runReader)
|
||||
|
||||
import Control.Applicative
|
||||
|
||||
import Data.Text.Lazy qualified as Lazy (Text)
|
||||
import Data.Text.Lazy.IO qualified as LT
|
||||
import Text.Megaparsec (Parsec, ParsecT)
|
||||
import Text.Megaparsec qualified as MP
|
||||
import Text.Megaparsec.Char qualified as MP
|
||||
|
||||
import Data.Text (Text)
|
||||
import Data.Text qualified as T
|
||||
|
||||
import Control.Exception
|
||||
import System.IO.Error
|
||||
|
||||
import Data.Void
|
||||
|
||||
import Network.URI
|
||||
|
||||
import System.Environment (lookupEnv)
|
||||
|
||||
config :: Configuration
|
||||
config =
|
||||
defaultConfiguration
|
||||
{ destinationDirectory = "public"
|
||||
, previewPort = 8008
|
||||
}
|
||||
|
||||
stripPathPrefix :: FilePath -> Routes
|
||||
routeAsFilePath :: (FilePath -> FilePath) -> Routes
|
||||
routeAsFilePath f = customRoute $ f . toFilePath
|
||||
|
||||
stripPathPrefix :: FilePath -> (FilePath -> FilePath)
|
||||
stripPathPrefix (splitDirectories -> prefix) =
|
||||
customRoute $
|
||||
joinPath . (\x -> fromMaybe x $ List.stripPrefix prefix x) . splitDirectories . toFilePath
|
||||
joinPath . (\x -> fromMaybe x $ List.stripPrefix prefix x) . splitDirectories
|
||||
|
||||
handleIf :: Exception e => (e -> Bool) -> (e -> IO a) -> IO a -> IO a
|
||||
handleIf predicate handler = handle $ \exc -> bool throwIO handler (predicate exc) exc
|
||||
|
||||
metadataShow :: [Item w] -> Compiler [Item w]
|
||||
metadataShow = filterM $ \Item{itemIdentifier} -> maybe (True :: Bool) read <$> getMetadataField itemIdentifier "show"
|
||||
|
||||
metadataSort :: [Item w] -> Compiler [Item w]
|
||||
metadataSort = sortOnM $ \Item{itemIdentifier} -> maybe (0 :: Integer) read <$> getMetadataField itemIdentifier "sort"
|
||||
where
|
||||
sortOnM :: forall m a b. (Monad m, Ord b) => (a -> m b) -> [a] -> m [a]
|
||||
sortOnM f = fmap (map snd . List.sortOn fst) . mapM (\x -> (,x) <$> f x)
|
||||
|
||||
metadata :: [Item w] -> Compiler [Item w]
|
||||
metadata = metadataShow >=> metadataSort
|
||||
|
||||
unwrapped :: Snapshot
|
||||
unwrapped = "unwrapped"
|
||||
|
||||
main :: IO ()
|
||||
main = hakyllWith config $ do
|
||||
frontendManifest <-
|
||||
preprocess $
|
||||
Yaml.decodeFileThrow @_ @(Map String [FilePath]) "frontend/dist/.manifest.yaml"
|
||||
main =
|
||||
lookupEnv "LOCALHOST" >>= \((Nothing /=) -> localhost) -> hakyllWith config $ do
|
||||
frontendManifest <-
|
||||
preprocess $
|
||||
Yaml.decodeFileThrow @_ @(Map String [FilePath]) "frontend/dist/.manifest.yaml"
|
||||
let
|
||||
frontendContext = jsContext <> cssContext
|
||||
where
|
||||
cssContext = listField "css" innerContext genCSSItems
|
||||
where
|
||||
innerContext = urlField "url"
|
||||
genCSSItems = genManifestItems $ Glob.compile "**/*.css"
|
||||
jsContext = listField "js" innerContext genCSSItems
|
||||
where
|
||||
innerContext = urlField "url"
|
||||
genCSSItems = genManifestItems $ Glob.compile "**/*.js"
|
||||
|
||||
match "content/index.html" $ do
|
||||
route $ stripPathPrefix "content"
|
||||
genManifestItems :: Glob.Pattern -> Compiler [Item CopyFile]
|
||||
genManifestItems p = do
|
||||
let entryPoint = "main"
|
||||
resources = filter (Glob.match p) $ frontendManifest Map.! entryPoint
|
||||
forM resources $ load . fromFilePath . ("frontend/dist" </>) . dropDrive
|
||||
|
||||
let context =
|
||||
defaultContext
|
||||
<> jsContext
|
||||
<> cssContext
|
||||
netlifyRedirects <-
|
||||
if localhost
|
||||
then return []
|
||||
else
|
||||
preprocess . handleIf isDoesNotExistError (const $ return []) $
|
||||
let pNetlify :: ParsecT Void Lazy.Text m [(FilePath, FilePath)]
|
||||
pNetlify = catMaybes <$> MP.sepBy (MP.space *> pLine <* MP.hspace) pEOL <* MP.eof
|
||||
where
|
||||
pEOL :: ParsecT Void Lazy.Text m ()
|
||||
pEOL = void . MP.label "linebreak" $ MP.eol
|
||||
pLine :: ParsecT Void Lazy.Text m (Maybe (FilePath, FilePath))
|
||||
pLine = MP.label "line" $ (mempty <$ pComment) <|> pRedirect <|> pure Nothing
|
||||
pComment :: ParsecT Void Lazy.Text m ()
|
||||
pComment = void $ MP.char '#' *> MP.label "comment" (MP.manyTill MP.anySingle $ MP.lookAhead MP.eol)
|
||||
pRedirect :: ParsecT Void Lazy.Text m (Maybe (FilePath, FilePath))
|
||||
pRedirect = do
|
||||
fromRoute <- MP.label "fromRoute" $ MP.manyTill MP.anySingle MP.separatorChar
|
||||
MP.hspace
|
||||
toRoute <- MP.label "toRoute" $ MP.manyTill MP.anySingle MP.separatorChar
|
||||
MP.hspace
|
||||
redirectMode <- MP.label "mode" $ asum [MP.string "200", MP.string "301", MP.string "302"]
|
||||
return $
|
||||
if
|
||||
| redirectMode == "200" -> Just (fromRoute, toRoute)
|
||||
| otherwise -> Nothing
|
||||
in either throwIO return =<< MP.runParserT pNetlify "static/_redirects" =<< LT.readFile "static/_redirects"
|
||||
let
|
||||
renderRoute r
|
||||
| fromRoute : _ <- mapMaybe (matchNetlifyRedirect r) netlifyRedirects =
|
||||
fromRoute
|
||||
| otherwise =
|
||||
r
|
||||
where
|
||||
matchNetlifyRedirect :: FilePath -> (FilePath, FilePath) -> Maybe FilePath
|
||||
matchNetlifyRedirect r' (fromRoute, toRoute) = do
|
||||
tokens <- MP.parseMaybe pToSpec toRoute
|
||||
Right subst <- return $ runReader (MP.runParserT (pRoute tokens <* MP.eof) "" r') Map.empty
|
||||
return . T.unpack $ Map.foldrWithKey doSubst (T.pack fromRoute) subst
|
||||
where
|
||||
pToSpec :: Parsec Void FilePath [Either FilePath String]
|
||||
pToSpec =
|
||||
MP.some $
|
||||
Left <$> MP.someTill (MP.anySingleBut ':') (MP.lookAhead $ MP.eof <|> void (MP.single ':'))
|
||||
<|> Right <$> (MP.char ':' *> MP.some MP.letterChar)
|
||||
pRoute :: [Either FilePath String] -> ParsecT Void FilePath (Reader (Map String String)) (Map String String)
|
||||
pRoute [] = MP.eof *> ask
|
||||
pRoute (t : ts) = case t of
|
||||
Left str -> MP.string str *> pRoute ts
|
||||
Right p -> do
|
||||
pVal <- asks $ Map.lookup p
|
||||
case pVal of
|
||||
Nothing -> do
|
||||
mLength <- length <$> MP.getInput
|
||||
asum . flip map [0 .. mLength] $ \l -> MP.try $ do
|
||||
val <- MP.takeP (Just $ ':' : p) l
|
||||
newSubst <- asks $ Map.insert p val
|
||||
newSubst <$ local (const newSubst) (pRoute ts)
|
||||
Just pVal' -> MP.string pVal' *> ask
|
||||
|
||||
cssContext = listField "css" innerContext genCSSItems
|
||||
where
|
||||
innerContext = urlField "url"
|
||||
genCSSItems = genManifestItems $ Glob.compile "**/*.css"
|
||||
jsContext = listField "js" innerContext genCSSItems
|
||||
where
|
||||
innerContext = urlField "url"
|
||||
genCSSItems = genManifestItems $ Glob.compile "**/*.js"
|
||||
doSubst :: String -> String -> Text -> Text
|
||||
doSubst k s = T.intercalate (T.pack s) . T.splitOn (T.pack $ ':' : k)
|
||||
normalizeUrls :: Item String -> Compiler (Item String)
|
||||
normalizeUrls item = do
|
||||
itemRoute <- getRoute $ itemIdentifier item
|
||||
let relativizeUrls' x = case itemRoute of
|
||||
Just r
|
||||
| "/" `List.isPrefixOf` x && not ("//" `List.isPrefixOf` x) ->
|
||||
toSiteRoot r ++ x
|
||||
_other -> x
|
||||
overPath f str = case parseURIReference str of
|
||||
Nothing -> f str
|
||||
Just uri@URI{uriPath} -> uriToString id uri{uriPath = f uriPath} mempty
|
||||
return $ withUrls (relativizeUrls' . overPath renderRoute) <$> item
|
||||
|
||||
genManifestItems :: Glob.Pattern -> Compiler [Item CopyFile]
|
||||
genManifestItems p = do
|
||||
let entryPoint = "main"
|
||||
resources = filter (Glob.match p) $ frontendManifest Map.! entryPoint
|
||||
forM resources $ load . fromFilePath . ("frontend/dist" </>) . dropDrive
|
||||
tags <- buildTags "content/**" $ fromCapture "tags/*.html"
|
||||
|
||||
compile $ do
|
||||
getResourceBody
|
||||
>>= loadAndApplyTemplate "templates/site-layout.html" context
|
||||
>>= relativizeUrls
|
||||
let
|
||||
applySiteLayout = loadAndApplyTemplate "templates/site-layout.html" . (<> ctx')
|
||||
where
|
||||
ctx' =
|
||||
mconcat
|
||||
[ listField "tags-nav" defaultContext (metadata <=< mapM (uncurry renderTagNav) $ tagsMap tags)
|
||||
, listField "special-nav" defaultContext $ metadata =<< mapM (flip loadSnapshot unwrapped) =<< getMatches (fromGlob "special/**")
|
||||
, frontendContext
|
||||
, defaultContext
|
||||
]
|
||||
renderTagNav tag' ids = do
|
||||
tagItems' <- getMatches . fromGlob $ toFilePath (tagsMakeId tags tag') -<.> "*"
|
||||
let
|
||||
tagItem' = return $ Item (fromMaybe (tagsMakeId tags tag') $ listToMaybe tagItems') (mempty :: String)
|
||||
|
||||
match "frontend/dist/wp-*/**" $ do
|
||||
route $ stripPathPrefix "frontend/dist"
|
||||
navRoute = "/" <> tag' <> ".html"
|
||||
|
||||
compile copyFileCompiler
|
||||
tagNavCtx =
|
||||
mconcat
|
||||
[ constField "tag" tag'
|
||||
, field "title" . const $
|
||||
fmap (fromMaybe tag') . runMaybeT . asum $
|
||||
map (\itemId -> MaybeT $ getMetadataField itemId "title") tagItems'
|
||||
, constField "route" navRoute
|
||||
, listField "posts" (constField "tag" tag' <> constField "route" navRoute <> postContext) (metadata =<< mapM load ids)
|
||||
]
|
||||
|
||||
match "templates/*" $ compile templateBodyCompiler
|
||||
tagNavTemplate
|
||||
| length ids > 1 = "templates/tag-nav.html"
|
||||
| otherwise = "templates/tag-nav-singleton.html"
|
||||
tagItem'
|
||||
>>= loadAndApplyTemplate tagNavTemplate tagNavCtx
|
||||
>>= normalizeUrls
|
||||
postContext =
|
||||
mconcat
|
||||
[ field "identifier" (return . takeBaseName . toFilePath . itemIdentifier)
|
||||
, defaultContext
|
||||
]
|
||||
specialContext = defaultContext
|
||||
|
||||
match "static/**" $ do
|
||||
route $ stripPathPrefix "static"
|
||||
compile copyFileCompiler
|
||||
match "images/*" $ do
|
||||
route idRoute
|
||||
compile copyFileCompiler
|
||||
|
||||
match "content/**" $ do
|
||||
compile $
|
||||
pandocCompiler
|
||||
>>= normalizeUrls
|
||||
|
||||
match "special/**" $ do
|
||||
route . routeAsFilePath $ (-<.> "html") . stripPathPrefix "special"
|
||||
compile $
|
||||
pandocCompiler
|
||||
>>= saveSnapshot unwrapped
|
||||
>>= applySiteLayout specialContext
|
||||
>>= normalizeUrls
|
||||
|
||||
forM_ (tagsMap tags) $ \(tag, fromList -> posts) ->
|
||||
rulesExtraDependencies [tagsDependency tags] $ do
|
||||
tagItems <- getMatches . fromGlob $ toFilePath (tagsMakeId tags tag) -<.> "*"
|
||||
let tagItem = pandocCompiler <|> makeItem mempty
|
||||
rule
|
||||
| [] <- tagItems = create [tagsMakeId tags tag]
|
||||
| otherwise = match (fromList tagItems)
|
||||
|
||||
rule $ do
|
||||
route . routeAsFilePath $ (-<.> "html") . stripPathPrefix "tags"
|
||||
compile $ do
|
||||
let
|
||||
ctx =
|
||||
mconcat
|
||||
[ listField "posts" postContext (metadataSort =<< loadAll posts)
|
||||
, defaultContext
|
||||
]
|
||||
|
||||
tagItem
|
||||
>>= loadAndApplyTemplate "templates/tag.html" ctx
|
||||
>>= applySiteLayout ctx
|
||||
>>= normalizeUrls
|
||||
|
||||
match "frontend/dist/wp-*/**" $ do
|
||||
route . routeAsFilePath $ stripPathPrefix "frontend/dist"
|
||||
|
||||
compile copyFileCompiler
|
||||
|
||||
match "templates/*" $ compile templateBodyCompiler
|
||||
|
||||
match "static/**" $ do
|
||||
route . routeAsFilePath $ stripPathPrefix "static"
|
||||
compile copyFileCompiler
|
||||
|
||||
@ -1 +1,3 @@
|
||||
/ /index.html 200
|
||||
|
||||
/:tag /:tag.html 200
|
||||
|
||||
3
tags/about.md
Normal file
3
tags/about.md
Normal file
@ -0,0 +1,3 @@
|
||||
---
|
||||
title: Über uns
|
||||
---
|
||||
4
tags/contact.md
Normal file
4
tags/contact.md
Normal file
@ -0,0 +1,4 @@
|
||||
---
|
||||
title: Kontakt
|
||||
sort: 9999
|
||||
---
|
||||
5
tags/index.md
Normal file
5
tags/index.md
Normal file
@ -0,0 +1,5 @@
|
||||
---
|
||||
title: Index
|
||||
sort: -9999
|
||||
show: "False"
|
||||
---
|
||||
3
tags/open-source.md
Normal file
3
tags/open-source.md
Normal file
@ -0,0 +1,3 @@
|
||||
---
|
||||
title: Open Source
|
||||
---
|
||||
3
tags/projects.md
Normal file
3
tags/projects.md
Normal file
@ -0,0 +1,3 @@
|
||||
---
|
||||
title: Projekte
|
||||
---
|
||||
3
tags/services.md
Normal file
3
tags/services.md
Normal file
@ -0,0 +1,3 @@
|
||||
---
|
||||
title: Dienstleistungen
|
||||
---
|
||||
@ -7,13 +7,41 @@
|
||||
$for(css)$
|
||||
<link rel="stylesheet" href="$url$">
|
||||
$endfor$
|
||||
<title>UniWorX Systems</title>
|
||||
<title>UniWorX Systems$if(title)$ - $title$$endif$</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<header>
|
||||
<nav class="navbar navbar-expand-md navbar-dark bg-primary">
|
||||
<button class="navbar-toggler collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#navbarMain">
|
||||
<span class="custom-navbar-toggler-icon"></span>
|
||||
</button>
|
||||
<a class="navbar-brand" href="/">
|
||||
UniWorX Systems
|
||||
</a>
|
||||
<div class="collapse navbar-collapse" id="navbarMain">
|
||||
<ul class="navbar-nav">
|
||||
$for(tags-nav)$
|
||||
$body$
|
||||
$endfor$
|
||||
</ul>
|
||||
</div>
|
||||
</nav>
|
||||
</header>
|
||||
<main>
|
||||
$body$
|
||||
</main>
|
||||
<footer class="text-center">
|
||||
<nav>
|
||||
<ul>
|
||||
$for(special-nav)$
|
||||
<li>
|
||||
<a href="$url$$if(localhost)$.html$endif$">$title$</a>
|
||||
</li>
|
||||
$endfor$
|
||||
</ul>
|
||||
</nav>
|
||||
</footer>
|
||||
$for(js)$
|
||||
<script src="$url$"></script>
|
||||
$endfor$
|
||||
|
||||
5
templates/tag-nav-singleton.html
Normal file
5
templates/tag-nav-singleton.html
Normal file
@ -0,0 +1,5 @@
|
||||
<li class="nav-link">
|
||||
<a class="nav-link" href="$route$">
|
||||
$title$
|
||||
</a>
|
||||
</li>
|
||||
13
templates/tag-nav.html
Normal file
13
templates/tag-nav.html
Normal file
@ -0,0 +1,13 @@
|
||||
<li class="nav-link dropdown">
|
||||
<a class="nav-link dropdown-toggle" href="$route$" data-bs-toggle="dropdown";>
|
||||
$title$
|
||||
</a>
|
||||
|
||||
<ul class="dropdown-menu dropdown-menu-dark bg-primary">
|
||||
$for(posts)$
|
||||
<li class="dropdown-item">
|
||||
<a class="nav-link" href="$route$#$identifier$">$title$</a>
|
||||
</li>
|
||||
$endfor$
|
||||
</ul>
|
||||
</li>
|
||||
5
templates/tag.html
Normal file
5
templates/tag.html
Normal file
@ -0,0 +1,5 @@
|
||||
$for(posts)$
|
||||
<article id="$identifier$">
|
||||
$body$
|
||||
</article>
|
||||
$endfor$
|
||||
Loading…
Reference in New Issue
Block a user