flyt af kode-generator til eget repo
This commit is contained in:
+135
@@ -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>
|
||||
Reference in New Issue
Block a user