flyt af kode-generator til eget repo

This commit is contained in:
2026-07-15 15:26:23 +02:00
commit e9364dd7fe
6 changed files with 820 additions and 0 deletions
BIN
View File
Binary file not shown.
+12
View File
@@ -0,0 +1,12 @@
FROM nginx:alpine
# Copy nginx config
COPY nginx/default.conf /etc/nginx/conf.d/default.conf
# Copy homepage files
COPY html/ /usr/share/nginx/html/
# Change permissions for NGINX access
RUN chmod -R 755 /usr/share/nginx/html/
EXPOSE 80
+13
View File
@@ -0,0 +1,13 @@
services:
nginx:
#build: .
image: glennigen/kode-generator:latest
container_name: 03-kode-generator-server
restart: unless-stopped
networks:
- proxy
# Access to proxy network
networks:
proxy:
external: true
+135
View File
@@ -0,0 +1,135 @@
<!DOCTYPE html>
<html lang="da">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Kodegenerator</title>
<style>
* { box-sizing: border-box; margin: 0; }
body { font-family: -apple-system, sans-serif; background: #f5f5f5; padding: 2rem; }
.container { max-width: 800px; margin: 0 auto; }
h1 { margin-bottom: 1.5rem; }
.grid { display: grid; grid-template-columns: 1fr 1fr; gap: 1.5rem; }
.card { background: #fff; border-radius: 8px; padding: 1.5rem; box-shadow: 0 1px 3px rgba(0,0,0,.1); }
.card h2 { font-size: 1rem; margin-bottom: .75rem; }
textarea { width: 100%; height: 200px; font-family: monospace; font-size: .9rem; padding: .5rem; border: 1px solid #ccc; border-radius: 4px; resize: vertical; }
label { display: flex; align-items: center; gap: .5rem; margin-bottom: .5rem; font-size: .9rem; }
input[type="number"] { width: 70px; padding: .3rem; border: 1px solid #ccc; border-radius: 4px; }
.controls { display: flex; gap: .75rem; flex-wrap: wrap; align-items: center; margin: 1rem 0; }
button { padding: .6rem 1.2rem; border: none; border-radius: 6px; cursor: pointer; font-size: .9rem; }
.btn-primary { background: #2563eb; color: #fff; }
.btn-primary:hover { background: #1d4ed8; }
.btn-secondary { background: #6b7280; color: #fff; }
.btn-secondary:hover { background: #4b5563; }
#output { width: 100%; height: 300px; font-family: monospace; font-size: .9rem; padding: .5rem; border: 1px solid #ccc; border-radius: 4px; resize: vertical; background: #fafafa; }
.info { font-size: .8rem; color: #666; margin-top: .5rem; }
</style>
</head>
<body>
<div class="container">
<h1>Kodegenerator</h1>
<div class="grid">
<div class="card">
<h2>Ordbog (kun navneord)</h2>
<textarea id="words" placeholder="Vent på indlæsning..." readonly></textarea>
</div>
<div class="card">
<h2>Opsætning</h2>
<p style="font-size:.85rem;color:#666;margin-bottom:.75rem">Format: Ord1 + Ord2 + suffix</p>
<label>Separator mellem ord: <input type="text" id="separator" value="" style="width:30px;padding:.3rem;border:1px solid #ccc;border-radius:4px"></label>
<label>Suffix længde: <input type="number" id="suffixLen" value="5" min="1" max="10"></label>
<label><input type="checkbox" id="useSymbols" checked> Specialtegn (!@#$%&*+-=?)</label>
<label><input type="checkbox" id="useDigits" checked> Tal (0-9)</label>
<label>Antal koder: <input type="number" id="count" value="3" min="1" max="20"></label>
<div class="controls">
<button class="btn-primary" onclick="generate()">Generer</button>
<button class="btn-secondary" onclick="copy()">Kopiér</button>
<button class="btn-secondary" onclick="clearOutput()">Ryd</button>
</div>
<div class="info" id="status"></div>
</div>
</div>
<textarea id="output" placeholder="Genererede koder vises her..." readonly></textarea>
</div>
<script>
async function loadWords() {
const el = document.getElementById('words');
try {
const res = await fetch('ordliste.txt');
if (!res.ok) throw new Error('HTTP ' + res.status);
const text = await res.text();
el.value = text.trim();
el.readOnly = false;
el.placeholder = 'Et ord pr. linje';
document.getElementById('status').textContent = 'Indlæst ' + text.trim().split('\n').length + ' ord';
} catch (e) {
el.placeholder = 'Kunne ikke indlæse ordliste.txt (' + e.message + ')';
}
}
loadWords();
const SYMBOLS = '!@#$%&*+-=?';
const DIGITS = '0123456789';
function rand(n) { return Math.floor(Math.random() * n); }
function getSuffixCharset() {
const useSym = document.getElementById('useSymbols').checked;
const useDig = document.getElementById('useDigits').checked;
let s = '';
if (useSym) s += SYMBOLS;
if (useDig) s += DIGITS;
return s;
}
function randomSuffix(len, charset) {
let r = '';
for (let i = 0; i < len; i++) r += charset[rand(charset.length)];
return r;
}
function generate() {
const words = document.getElementById('words').value.split('\n').map(w => w.trim()).filter(w => w);
let suffixLen = parseInt(document.getElementById('suffixLen').value, 10);
if (isNaN(suffixLen) || suffixLen < 1) suffixLen = 5;
const countEl = document.getElementById('count');
let count = parseInt(countEl.value, 10);
if (isNaN(count) || count < 1) count = 3;
const sep = document.getElementById('separator').value;
const output = document.getElementById('output');
const charset = getSuffixCharset();
const status = document.getElementById('status');
if (!words.length) { output.value = 'Tilføj mindst ét ord i ordbogen.'; status.textContent = ''; return; }
if (words.length < 2) { output.value = 'Brug mindst 2 ord i ordbogen.'; status.textContent = ''; return; }
if (!charset.length) { output.value = 'Vælg mindst én suffix-type (specialtegn eller tal).'; status.textContent = ''; return; }
if (suffixLen === 1 && charset.length > 1) { output.value = 'Ved suffix længde 1 skal du vælge enten specialtegn eller tal (ikke begge).'; status.textContent = ''; return; }
const codes = [];
for (let i = 0; i < count; i++) {
let w1, w2;
do { w1 = words[rand(words.length)]; w2 = words[rand(words.length)]; } while (w1 === w2);
codes.push(w1 + sep + w2 + randomSuffix(suffixLen, charset));
}
output.value = codes.join('\n');
status.textContent = `Genereret ${count} koder`;
}
function copy() {
const el = document.getElementById('output');
if (!el.value) return;
navigator.clipboard.writeText(el.value).then(() => {
document.getElementById('status').textContent = 'Kopieret til udklipsholder';
}).catch(() => {
el.select();
document.execCommand('copy');
document.getElementById('status').textContent = 'Kopieret';
});
}
function clearOutput() {
document.getElementById('output').value = '';
document.getElementById('status').textContent = '';
}
</script>
</body>
</html>
+635
View File
@@ -0,0 +1,635 @@
Abrikos
Aftale
Agent
Aktiv
Aktivitet
Alarm
Altan
Ambition
Anledning
Arbejde
Arkitekt
Arkiv
Armatur
Atlas
Bageri
Bakke
Balance
Balkon
Bane
Bank
Barn
Barriere
Batteri
Begivenhed
Begreb
Behandling
Bekendt
Belysning
Beregner
Berg
Besked
Beskrivelse
Betydning
Bevilling
Bidrag
Billede
Billet
Biograf
Bistand
Blad
Blanding
Blik
Blod
Blok
Blomst
Blus
Bluse
Blyant
Bogstav
Bombe
Bonde
Bord
Borg
Branche
Brand
Brev
Brug
Brygge
Budget
Buffer
Bund
Bunker
Bytte
Campus
Center
Chance
Check
Cirkel
Citat
Citron
Club
Cykel
Dame
Damp
Dans
Dato
Deal
Definition
Design
Desktop
Dialog
Diesel
Diplom
Direktor
Display
Dokument
Dokumentation
Domino
Dosis
Drama
Drift
Dronning
Ekko
Eksamen
Eksempel
Eksperiment
Eksport
Elbil
Elefant
Element
Elite
Emne
Energi
Enhed
Erfaring
Event
Eventyr
Evne
Fabrik
Fakta
Fald
Fane
Farve
Fase
Fedt
Felt
Ferie
Fest
Figur
Filter
Firma
Fjord
Flag
Flaske
Flimmer
Flirt
Flod
Flugt
Fokus
Fold
Folie
Folk
Fond
Forbindelse
Force
Fordel
Form
Format
Formel
Formue
Forside
Forsker
Fortid
Forum
Fossil
Fragment
Frihed
Frist
Front
Frost
Frugt
Fund
Fusion
Gade
Gaffel
Gang
Garage
Garderobe
Gave
Gear
Geni
Genre
Gift
Gigant
Gitter
Glas
Glimt
Globus
Grad
Graf
Grafik
Gran
Greb
Gren
Grotte
Grund
Guitar
Guld
Gulv
Gymnastik
Hage
Hals
Hastighed
Have
Havn
Hegn
Held
Helikopter
Helte
Hensyn
Hest
Himmel
Hindring
Hjerte
Hjul
Hold
Honning
Hotel
Hoved
Hund
Hval
Hvede
Identitet
Illustration
Image
Import
Indeks
Indgang
Indhold
Indsats
Industri
Infektion
Information
Initiativ
Installation
Instruks
Interface
Interval
Introduktion
Investering
Ironi
Jagt
Jazz
Jern
Jord
Journal
Kabel
Kabinet
Kaffe
Kaktus
Kald
Kalkun
Kamera
Kamp
Kanal
Kandidat
Kanin
Kanon
Kant
Kapitel
Kappe
Kasse
Katedral
Kategori
Kedel
Kerne
Ketchup
Kilde
Kind
Kiosk
Kirke
Kiste
Kittel
Klarinet
Klasse
Klient
Klima
Klinge
Kloak
Klode
Klokke
Klub
Klynge
Knald
Knap
Kniv
Knogle
Knude
Kobber
Kode
Kokos
Kolbe
Kollega
Komet
Komfur
Kommentar
Kommunikation
Komponent
Kontakt
Konto
Kontrol
Konverter
Kopi
Koral
Kork
Korn
Kort
Kost
Krabbe
Kraft
Kran
Krav
Kredit
Kridt
Krise
Krop
Kryds
Krystal
Kugle
Kunde
Kunst
Kupon
Kurv
Kvalitet
Kvittering
Laboratorie
Lager
Lakrids
Lampe
Land
Lantern
Larm
Last
Layout
Leder
Lejlighed
Lektie
Lektion
Lemon
Lever
Levering
Lift
Limit
Linje
Link
Linse
Liste
Liter
Litteratur
Logik
Lokale
Lomme
Lort
Lotus
Lugt
Lykke
Magasin
Magt
Majs
Makro
Mappe
Mareridt
Mark
Marked
Marmor
Maskine
Master
Materiale
Matrix
Medarbejder
Meddelelse
Medie
Medium
Mening
Menu
Messe
Metal
Metode
Mikrofon
Mikroskop
Millimeter
Million
Mineral
Minut
Mission
Mobil
Mode
Modul
Monster
Montering
Monument
Morgen
Motor
Mulighed
Mund
Muse
Muskel
Musling
Myndighed
Natur
Navn
Nektar
Nerve
Niveau
Nord
Notat
Notifikation
Nylon
Oase
Objekt
Observator
Oktav
Olie
Omdrejning
Opera
Optik
Orbit
Ordre
Organ
Organisation
Orientering
Oscillation
Overblik
Overflade
Overraskelse
Pakke
Palads
Palme
Panel
Papir
Paradoks
Park
Partner
Pause
Peber
Pedal
Penge
Pengetank
Person
Pilot
Plads
Plan
Plastik
Platform
Platin
Pleje
Politi
Port
Portal
Position
Post
Potte
Presse
Prik
Prioritet
Problem
Procedure
Produktion
Profil
Program
Projekt
Prop
Protokol
Provins
Pude
Puls
Punkt
Punktum
Puslespil
Pynt
Rabat
Radio
Ramme
Refleksion
Regel
Registrering
Regn
Regning
Rente
Reserve
Respekt
Rest
Resultat
Retning
Ridse
Risiko
Rock
Rolle
Rotte
Rubin
Rude
Runde
Rust
Rute
Rytme
Saft
Saks
Salat
Salt
Samling
Sand
Scene
Sektion
Sektor
Sekund
Sensor
Serie
Service
Signal
Signatur
Silke
Situation
Sjal
Skab
Skat
Skib
Skift
Skimmel
Skinne
Skitse
Skjold
Skole
Skridt
Skrivebord
Skrue
Skum
Slange
Slave
Slim
Slot
Smag
Smed
Smerte
Smil
Snor
Software
Sort
Spil
Spiral
Spole
Sport
Sprog
Stald
Stamme
Stand
Stang
Stativ
Status
Sted
Stempel
Sten
Stige
Stil
Stilhed
Stol
Strand
Streg
Struktur
Stue
Stykke
Styr
Sukker
Support
Svar
Svend
Synd
System
Tablet
Tale
Tand
Tang
Tapet
Tast
Tavle
Tegn
Tegning
Telt
Tempel
Temperatur
Tempo
Tenant
Terminal
Termostat
Terning
Test
Tilstand
Time
Ting
Tirsdag
Titel
Tivoli
Tommel
Tone
Torsdag
Trafik
Transaktion
Transport
Trekant
Trend
Trin
Trolley
Trone
Trug
Trussel
Tunnel
Tusch
Ubehag
Udbetaling
Udbytte
Uddannelse
Udfordring
Udlejning
Udsigt
Udskrift
Udsnit
Udsugning
Udvalg
Uheld
Uhyre
Ukrudt
Uland
Ulempe
Ulighed
Ulykke
Underretning
Undersogelse
Undervisning
Univers
Urskov
Uvidenhed
Vagt
Vakuum
Valg
Vand
Vare
Vask
Vejr
Vektor
Velfaerd
Verdensdel
Version
Viden
Videnskab
Vind
Vindue
Visa
Vision
Vogn
Vold
Volumen
Vrede
Vulkan
Zebra
Zenit
Zone
+25
View File
@@ -0,0 +1,25 @@
server {
listen 80;
server_name primegrading.dk www.primegrading.dk localhost;
root /usr/share/nginx/html;
index index.html;
# Gzip
gzip on;
gzip_types text/plain text/css application/javascript text/html;
location / {
try_files $uri $uri/ /index.html;
}
# Cache static assets
location ~* \.(css|js|png|jpg|jpeg|gif|ico|svg|woff2?)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
# Security headers
add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";
}