Files
danish-excercises/index.html
T
2026-05-16 12:34:39 +02:00

986 lines
73 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="da">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Danske Pronominer — PD3.4 Øvelser · 200 spørgsmål</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Fraunces:opsz,wght@9..144,400;9..144,500;9..144,600;9..144,700&family=Source+Serif+4:opsz,wght@8..60,400;8..60,500;8..60,600&family=Inter+Tight:wght@400;500;600&display=swap" rel="stylesheet">
<style>
:root {
--paper: #FBF6EC;
--paper-warm: #F4ECDD;
--ink: #1F2330;
--ink-soft: #4A4F5C;
--ink-mute: #8A8E97;
--rule: #E1D6C0;
--rule-soft: #ECE3D1;
--accent: #A82F2F;
--accent-soft: #F2DDD9;
--gold: #B8893A;
--gold-soft: #F4E8D0;
--green: #3F6B4E;
--green-soft: #DDE9DC;
--blue: #2C4A6B;
--blue-soft: #DDE5EE;
--serif-display: 'Fraunces', Georgia, serif;
--serif-body: 'Source Serif 4', Georgia, serif;
--sans: 'Inter Tight', -apple-system, sans-serif;
--radius: 10px;
--radius-lg: 14px;
}
* { box-sizing: border-box; }
html, body {
margin: 0;
padding: 0;
background: var(--paper);
color: var(--ink);
font-family: var(--serif-body);
font-size: 16px;
line-height: 1.55;
-webkit-font-smoothing: antialiased;
}
body {
background-image:
radial-gradient(circle at 25% 15%, rgba(184, 137, 58, 0.04) 0%, transparent 40%),
radial-gradient(circle at 80% 80%, rgba(168, 47, 47, 0.03) 0%, transparent 40%);
min-height: 100vh;
}
/* ============ Header ============ */
.masthead {
max-width: 880px;
margin: 0 auto;
padding: 56px 32px 40px;
text-align: center;
border-bottom: 1px dashed var(--rule);
}
.masthead .eyebrow {
font-family: var(--sans);
font-size: 11px;
font-weight: 500;
letter-spacing: 0.25em;
text-transform: uppercase;
color: var(--accent);
margin: 0 0 16px;
}
.masthead h1 {
font-family: var(--serif-display);
font-weight: 600;
font-size: clamp(38px, 6vw, 56px);
line-height: 1.05;
letter-spacing: -0.02em;
margin: 0 0 12px;
font-variation-settings: "opsz" 144;
}
.masthead h1 em {
font-style: italic;
color: var(--accent);
font-weight: 500;
}
.masthead .lede {
font-family: var(--serif-body);
font-size: 17px;
font-style: italic;
color: var(--ink-soft);
max-width: 540px;
margin: 0 auto;
line-height: 1.55;
}
.masthead .meta-row {
display: flex;
justify-content: center;
gap: 32px;
margin-top: 28px;
font-family: var(--sans);
font-size: 12px;
letter-spacing: 0.12em;
text-transform: uppercase;
color: var(--ink-mute);
}
.masthead .meta-row span { display: flex; align-items: center; gap: 6px; }
.masthead .meta-row .dot {
width: 4px; height: 4px; border-radius: 50%;
background: var(--gold);
display: inline-block;
}
/* ============ Sticky toolbar ============ */
.toolbar {
position: sticky;
top: 0;
z-index: 50;
background: rgba(251, 246, 236, 0.96);
backdrop-filter: blur(10px);
-webkit-backdrop-filter: blur(10px);
border-bottom: 1px solid var(--rule);
}
.toolbar-inner {
max-width: 880px;
margin: 0 auto;
padding: 14px 32px;
display: flex;
align-items: center;
justify-content: space-between;
gap: 16px;
flex-wrap: wrap;
}
.score-block {
display: flex;
align-items: center;
gap: 18px;
font-family: var(--sans);
}
.score-stat {
display: flex;
flex-direction: column;
line-height: 1.1;
}
.score-stat .label {
font-size: 10px;
letter-spacing: 0.16em;
text-transform: uppercase;
color: var(--ink-mute);
margin-bottom: 3px;
}
.score-stat .value {
font-family: var(--serif-display);
font-size: 22px;
font-weight: 500;
letter-spacing: -0.01em;
color: var(--ink);
font-variation-settings: "opsz" 60;
}
.score-stat .value .denom { color: var(--ink-mute); font-size: 0.7em; }
.progress-bar {
flex: 1;
min-width: 120px;
max-width: 200px;
height: 4px;
background: var(--rule-soft);
border-radius: 2px;
overflow: hidden;
}
.progress-fill {
height: 100%;
background: linear-gradient(90deg, var(--green), var(--gold));
width: 0%;
transition: width 0.4s ease;
}
.toolbar-actions {
display: flex;
gap: 6px;
}
.btn {
font-family: var(--sans);
font-size: 13px;
font-weight: 500;
padding: 7px 14px;
border: 1px solid var(--rule);
background: transparent;
color: var(--ink-soft);
border-radius: var(--radius);
cursor: pointer;
transition: all 0.15s;
letter-spacing: 0.01em;
}
.btn:hover { background: var(--paper-warm); border-color: var(--ink-mute); color: var(--ink); }
.btn.primary {
background: var(--ink);
color: var(--paper);
border-color: var(--ink);
}
.btn.primary:hover { background: var(--accent); border-color: var(--accent); }
.btn.danger:hover { background: var(--accent-soft); border-color: var(--accent); color: var(--accent); }
/* ============ Section navigation ============ */
.section-nav {
max-width: 880px;
margin: 24px auto 0;
padding: 0 32px;
display: flex;
gap: 8px;
flex-wrap: wrap;
font-family: var(--sans);
font-size: 12px;
letter-spacing: 0.04em;
}
.section-nav a {
color: var(--ink-soft);
text-decoration: none;
padding: 5px 12px;
border-radius: 999px;
border: 1px solid var(--rule);
transition: all 0.15s;
}
.section-nav a:hover { background: var(--paper-warm); border-color: var(--ink-mute); }
.section-nav a .num { color: var(--accent); font-weight: 500; margin-right: 6px; }
/* ============ Main content ============ */
main {
max-width: 880px;
margin: 0 auto;
padding: 48px 32px 96px;
}
/* ============ Section ============ */
.section { margin-bottom: 88px; }
.section:last-child { margin-bottom: 0; }
.section-header { margin-bottom: 36px; }
.section-meta {
display: flex;
align-items: baseline;
justify-content: space-between;
font-family: var(--sans);
font-size: 11px;
letter-spacing: 0.2em;
text-transform: uppercase;
color: var(--ink-mute);
padding-bottom: 12px;
border-bottom: 2px solid var(--ink);
margin-bottom: 16px;
}
.section-num { color: var(--accent); font-weight: 500; }
.section-title {
font-family: var(--serif-display);
font-size: 36px;
font-weight: 500;
letter-spacing: -0.015em;
margin: 0 0 6px;
line-height: 1.1;
font-variation-settings: "opsz" 144;
}
.section-subtitle {
font-family: var(--serif-body);
font-style: italic;
font-size: 16px;
color: var(--ink-soft);
margin: 0 0 24px;
}
.rule-card {
background: var(--paper-warm);
border: 1px solid var(--rule);
border-radius: var(--radius-lg);
padding: 20px 24px;
position: relative;
}
.rule-card::before {
content: "Regler";
position: absolute;
top: -10px;
left: 20px;
background: var(--paper);
padding: 0 10px;
font-family: var(--sans);
font-size: 10px;
letter-spacing: 0.2em;
text-transform: uppercase;
color: var(--accent);
font-weight: 500;
}
.rule-item {
display: grid;
grid-template-columns: 180px 1fr;
gap: 16px;
padding: 8px 0;
border-bottom: 1px dashed var(--rule);
align-items: baseline;
}
.rule-item:last-child { border-bottom: none; padding-bottom: 0; }
.rule-item:first-child { padding-top: 0; }
.rule-term {
font-family: var(--serif-display);
font-style: italic;
font-weight: 500;
font-size: 16px;
color: var(--accent);
font-variation-settings: "opsz" 60;
}
.rule-def {
font-family: var(--serif-body);
font-size: 14.5px;
color: var(--ink-soft);
line-height: 1.55;
}
.rule-def b { color: var(--ink); font-weight: 600; }
/* ============ Question ============ */
.question {
padding: 22px 4px;
border-bottom: 1px solid var(--rule);
scroll-margin-top: 100px;
}
.question:last-child { border-bottom: none; }
.question.answered.correct { background: linear-gradient(90deg, var(--green-soft) 0%, transparent 30%); border-radius: var(--radius); padding-left: 18px; margin-left: -22px; }
.question.answered.incorrect { background: linear-gradient(90deg, var(--accent-soft) 0%, transparent 30%); border-radius: var(--radius); padding-left: 18px; margin-left: -22px; }
.q-header {
display: flex;
align-items: center;
gap: 12px;
margin-bottom: 14px;
}
.q-number {
font-family: var(--sans);
font-size: 11px;
font-weight: 500;
letter-spacing: 0.18em;
color: var(--ink-mute);
text-transform: uppercase;
}
.q-type {
font-family: var(--sans);
font-size: 10px;
letter-spacing: 0.12em;
text-transform: uppercase;
padding: 2px 8px;
border: 1px solid var(--rule);
border-radius: 999px;
color: var(--ink-soft);
}
.q-type.multi { color: var(--accent); border-color: var(--accent); background: var(--accent-soft); }
.q-status {
margin-left: auto;
font-family: var(--sans);
font-size: 12px;
font-weight: 500;
}
.q-status.right { color: var(--green); }
.q-status.wrong { color: var(--accent); }
.q-sentence {
font-family: var(--serif-body);
font-size: 19px;
line-height: 1.75;
color: var(--ink);
margin: 0 0 16px;
}
/* Inline inputs inside sentences */
.q-blank-input {
display: inline-block;
width: 110px;
font-family: var(--serif-body);
font-size: 18px;
font-weight: 500;
color: var(--blue);
background: transparent;
border: none;
border-bottom: 2px solid var(--ink-soft);
padding: 0 6px;
margin: 0 2px;
text-align: center;
transition: all 0.2s;
}
.q-blank-input:focus { outline: none; border-color: var(--accent); }
.q-blank-input.right { color: var(--green); border-color: var(--green); }
.q-blank-input.wrong { color: var(--accent); border-color: var(--accent); text-decoration: line-through; }
.q-blank-correction {
display: inline-block;
font-family: var(--serif-body);
font-style: italic;
font-size: 16px;
color: var(--green);
margin-left: 4px;
}
/* Multiple choice options */
.q-options {
display: flex;
flex-wrap: wrap;
gap: 8px;
margin-top: 4px;
}
.q-opt {
font-family: var(--serif-body);
font-size: 16px;
padding: 7px 18px;
background: transparent;
border: 1px solid var(--ink-soft);
border-radius: var(--radius);
color: var(--ink);
cursor: pointer;
transition: all 0.15s;
}
.q-opt:hover:not(:disabled) { background: var(--paper-warm); border-color: var(--ink); }
.q-opt:disabled { cursor: default; }
.q-opt.picked.right { background: var(--green-soft); color: var(--green); border-color: var(--green); }
.q-opt.picked.wrong { background: var(--accent-soft); color: var(--accent); border-color: var(--accent); }
.q-opt.show-correct {
background: var(--green-soft);
color: var(--green);
border-color: var(--green);
border-style: dashed;
}
/* Check button */
.q-check-row {
margin-top: 14px;
display: flex;
gap: 8px;
align-items: center;
}
.q-check {
font-family: var(--sans);
font-size: 13px;
font-weight: 500;
padding: 7px 18px;
background: var(--ink);
color: var(--paper);
border: none;
border-radius: var(--radius);
cursor: pointer;
transition: background 0.15s;
}
.q-check:hover:not(:disabled) { background: var(--accent); }
.q-check:disabled { opacity: 0.4; cursor: default; }
.q-hint {
font-family: var(--serif-body);
font-style: italic;
font-size: 13px;
color: var(--ink-mute);
}
/* Feedback */
.q-feedback {
display: none;
margin-top: 14px;
padding: 12px 16px;
border-radius: var(--radius);
font-size: 14.5px;
line-height: 1.55;
font-family: var(--serif-body);
}
.q-feedback.show { display: block; }
.q-feedback.correct {
background: var(--green-soft);
color: #2A4A36;
border-left: 3px solid var(--green);
}
.q-feedback.incorrect {
background: var(--accent-soft);
color: #6B1F1F;
border-left: 3px solid var(--accent);
}
.q-feedback.reveal {
background: var(--blue-soft);
color: var(--blue);
border-left: 3px solid var(--blue);
}
.q-feedback .fb-icon {
font-family: var(--serif-display);
font-weight: 600;
font-style: italic;
margin-right: 6px;
}
.q-feedback .fb-correct-answer {
font-family: var(--serif-display);
font-style: italic;
font-weight: 500;
font-size: 1.05em;
}
.q-feedback .fb-explain {
display: block;
margin-top: 6px;
color: var(--ink-soft);
font-size: 13.5px;
}
/* ============ Footer ============ */
footer {
max-width: 880px;
margin: 0 auto;
padding: 32px;
border-top: 1px dashed var(--rule);
text-align: center;
font-family: var(--serif-body);
font-style: italic;
font-size: 14px;
color: var(--ink-mute);
}
footer .flag { color: var(--accent); }
/* ============ Score summary modal ============ */
.summary-card {
display: none;
position: fixed;
bottom: 24px;
right: 24px;
background: var(--paper);
border: 1px solid var(--ink);
border-radius: var(--radius-lg);
padding: 18px 22px;
box-shadow: 0 10px 40px rgba(31, 35, 48, 0.15);
z-index: 100;
font-family: var(--sans);
max-width: 280px;
}
.summary-card.show { display: block; }
.summary-card .close {
position: absolute;
top: 8px; right: 12px;
background: none; border: none;
font-size: 20px; cursor: pointer;
color: var(--ink-mute);
font-family: var(--serif-display);
}
.summary-card .close:hover { color: var(--accent); }
.summary-card h3 {
font-family: var(--serif-display);
font-style: italic;
font-size: 20px;
margin: 0 0 8px;
color: var(--accent);
font-variation-settings: "opsz" 60;
}
.summary-card .summary-total {
font-family: var(--serif-display);
font-size: 32px;
font-weight: 500;
letter-spacing: -0.01em;
margin: 6px 0;
}
.summary-card .summary-detail {
font-size: 12px;
color: var(--ink-soft);
line-height: 1.6;
}
/* ============ Responsive ============ */
@media (max-width: 640px) {
.masthead { padding: 36px 20px 28px; }
.masthead .meta-row { gap: 16px; flex-wrap: wrap; }
.toolbar-inner { padding: 12px 20px; gap: 12px; }
.progress-bar { display: none; }
main { padding: 32px 20px 64px; }
.section-title { font-size: 28px; }
.q-sentence { font-size: 17px; }
.rule-item { grid-template-columns: 1fr; gap: 4px; }
.section-nav { padding: 0 20px; }
.q-blank-input { width: 90px; font-size: 16px; }
}
/* ============ Print ============ */
@media print {
.toolbar, .section-nav, .q-check-row, .summary-card { display: none !important; }
.q-feedback.show { display: block !important; }
body { background: white; }
.question { page-break-inside: avoid; }
main { padding: 20px; }
}
</style>
</head>
<body>
<header class="masthead">
<p class="eyebrow">Prøve i Dansk 3 · Modul 3.4</p>
<h1>Danske <em>pronominer</em></h1>
<p class="lede">Et komplet praksisbatteri på 200 spørgsmål, der dækker personlige, refleksive, relative og ubestemte pronominer — med stigende sværhedsgrad fra enkle udfyldninger til sammensatte afsnit.</p>
<div class="meta-row">
<span><span class="dot"></span>200 spørgsmål</span>
<span><span class="dot"></span>5 sektioner</span>
<span><span class="dot"></span>40 sammensatte opgaver</span>
</div>
</header>
<div class="toolbar">
<div class="toolbar-inner">
<div class="score-block">
<div class="score-stat">
<span class="label">Korrekte</span>
<span class="value"><span id="score">0</span><span class="denom"> / <span id="answered">0</span></span></span>
</div>
<div class="progress-bar"><div class="progress-fill" id="progress-fill"></div></div>
</div>
<div class="toolbar-actions">
<button class="btn" id="btn-reveal">Vis alle svar</button>
<button class="btn" id="btn-print">Print</button>
<button class="btn danger" id="btn-reset">Nulstil</button>
</div>
</div>
</div>
<nav class="section-nav" aria-label="Sektioner">
<a href="#section-1"><span class="num">1</span>Personlige &amp; ejestedord</a>
<a href="#section-2"><span class="num">2</span>Refleksive</a>
<a href="#section-3"><span class="num">3</span>Relative</a>
<a href="#section-4"><span class="num">4</span>Ubestemte</a>
<a href="#section-5"><span class="num">5</span>Avanceret</a>
</nav>
<main>
<section class="section" id="section-1" data-section="1">
<header class="section-header">
<div class="section-meta">
<span class="section-num">Sektion 1</span>
<span class="section-count">Q1 Q50</span>
</div>
<h2 class="section-title">Personlige og ejestedord</h2>
<p class="section-subtitle">Personal pronouns and possessives</p>
<div class="rule-card">
<div class="rule-item"><span class="rule-term">Objektsform</span><span class="rule-def">mig · dig · ham · hende · den · det · os · jer · dem</span></div><div class="rule-item"><span class="rule-term">Ejestedord 1. person</span><span class="rule-def">min (en-ord) · mit (et-ord) · mine (flertal) · vores (flertal, alt sammen)</span></div><div class="rule-item"><span class="rule-term">Ejestedord 2. person</span><span class="rule-def">din · dit · dine · jeres (flertal)</span></div><div class="rule-item"><span class="rule-term">3. person ejestedord</span><span class="rule-def">hans · hendes · dens · dets · deres — ændrer sig aldrig</span></div>
</div>
</header>
<div class="questions">
</div>
</section>
<section class="section" id="section-2" data-section="2">
<header class="section-header">
<div class="section-meta">
<span class="section-num">Sektion 2</span>
<span class="section-count">Q51 Q100</span>
</div>
<h2 class="section-title">Refleksive pronominer</h2>
<p class="section-subtitle">Reflexive pronouns: sig, sin, sit, sine</p>
<div class="rule-card">
<div class="rule-item"><span class="rule-term">sig</span><span class="rule-def">3. person refleksiv objekt (han, hun, den, det, de). 1./2. person bruger mig, dig, os, jer.</span></div><div class="rule-item"><span class="rule-term">sin / sit / sine</span><span class="rule-def">Refleksiv ejestedord — bruges når <b>ejeren er sætningens subjekt</b> (3. person). sin (en-ord) · sit (et-ord) · sine (flertal).</span></div><div class="rule-item"><span class="rule-term">hans / hendes / deres</span><span class="rule-def">Bruges når ejeren <b>ikke</b> er subjektet.</span></div>
</div>
</header>
<div class="questions">
</div>
</section>
<section class="section" id="section-3" data-section="3">
<header class="section-header">
<div class="section-meta">
<span class="section-num">Sektion 3</span>
<span class="section-count">Q101 Q130</span>
</div>
<h2 class="section-title">Relative pronominer</h2>
<p class="section-subtitle">Relative pronouns: som, der, hvis</p>
<div class="rule-card">
<div class="rule-item"><span class="rule-term">som</span><span class="rule-def">Virker altid — både som subjekt og objekt i bisætningen.</span></div><div class="rule-item"><span class="rule-term">der</span><span class="rule-def">Kun når substantivet er <b>subjekt</b> i bisætningen — kan aldrig være objekt.</span></div><div class="rule-item"><span class="rule-term">hvis</span><span class="rule-def">Viser ejerskab (= engelsk "whose").</span></div>
</div>
</header>
<div class="questions">
</div>
</section>
<section class="section" id="section-4" data-section="4">
<header class="section-header">
<div class="section-meta">
<span class="section-num">Sektion 4</span>
<span class="section-count">Q131 Q160</span>
</div>
<h2 class="section-title">Ubestemte pronominer</h2>
<p class="section-subtitle">Indefinite pronouns: man, nogen/noget/nogle, ingen</p>
<div class="rule-card">
<div class="rule-item"><span class="rule-term">man</span><span class="rule-def">Generelt: "en, folk".</span></div><div class="rule-item"><span class="rule-term">nogen</span><span class="rule-def">Person (someone/anyone), ofte i spørgsmål og negationer.</span></div><div class="rule-item"><span class="rule-term">noget</span><span class="rule-def">Ikke-tællelig eller abstrakt (something/anything).</span></div><div class="rule-item"><span class="rule-term">nogle</span><span class="rule-def">Flertal tællelig i positive sætninger — lyder ens som nogen!</span></div><div class="rule-item"><span class="rule-term">ingen</span><span class="rule-def">Ingen person / nobody.</span></div>
</div>
</header>
<div class="questions">
</div>
</section>
<section class="section" id="section-5" data-section="5">
<header class="section-header">
<div class="section-meta">
<span class="section-num">Sektion 5</span>
<span class="section-count">Q161 Q200</span>
</div>
<h2 class="section-title">Blandet og avanceret</h2>
<p class="section-subtitle">Mixed & complex: multiple pronouns per sentence</p>
<div class="rule-card">
<div class="rule-item"><span class="rule-term">2 pronominer</span><span class="rule-def">Q161170: sætninger med to manglende pronominer.</span></div><div class="rule-item"><span class="rule-term">3 pronominer</span><span class="rule-def">Q171180: tre pronominer i hver opgave.</span></div><div class="rule-item"><span class="rule-term">4 pronominer</span><span class="rule-def">Q181190: små afsnit på 3 sætninger.</span></div><div class="rule-item"><span class="rule-term">5 pronominer</span><span class="rule-def">Q191200: hele afsnit på 4 sætninger.</span></div>
</div>
</header>
<div class="questions">
</div>
</section>
</main>
<footer>
<p>200 øvelser i danske pronominer <span class="flag">·</span> Sat sammen til PD3.4-forberedelse <span class="flag">·</span> God fornøjelse!</p>
</footer>
<div class="summary-card" id="summary-card">
<button class="close" id="close-summary" aria-label="Luk">×</button>
<h3>Færdig!</h3>
<div class="summary-total"><span id="sum-correct">0</span> / <span id="sum-total">0</span></div>
<div class="summary-detail" id="sum-breakdown"></div>
</div>
<script>
const QUESTIONS = [{"id": 1, "section": 1, "type": "input", "sentence": "Kender du Peter? Ja, jeg kender ___ godt.", "answers": ["ham"], "explain": "Peter = han → objektsform er ham."}, {"id": 2, "section": 1, "type": "mc", "sentence": "Vi har inviteret Anna og Lars. Vi kan godt lide ___.", "answers": ["dem"], "options": ["dem", "os", "jer"], "explain": "Anna og Lars = de → objektsform er dem."}, {"id": 3, "section": 1, "type": "input", "sentence": "Maria er sød. Jeg kan godt lide ___.", "answers": ["hende"], "explain": "Maria = hun → objektsform er hende."}, {"id": 4, "section": 1, "type": "mc", "sentence": "Tak for invitationen! Vi kommer hjem til ___.", "answers": ["jer"], "options": ["jer", "dem", "os"], "explain": "I (jer = you plural) → objektsform er jer."}, {"id": 5, "section": 1, "type": "input", "sentence": "Kan du hjælpe ___? (jeg)", "answers": ["mig"], "explain": "jeg → objektsform er mig."}, {"id": 6, "section": 1, "type": "mc", "sentence": "Hvor er bogen? Jeg kan ikke finde ___.", "answers": ["den"], "options": ["den", "det", "ham"], "explain": "en bog (en-ord) → den."}, {"id": 7, "section": 1, "type": "input", "sentence": "Børnene er trætte. Vi sender ___ i seng.", "answers": ["dem"], "explain": "børnene = de → objektsform er dem."}, {"id": 8, "section": 1, "type": "mc", "sentence": "Vi har et flot hus. Vi elsker ___.", "answers": ["det"], "options": ["den", "det", "dem"], "explain": "et hus (et-ord) → det."}, {"id": 9, "section": 1, "type": "input", "sentence": "Jeg har en god ven, Lars. Jeg taler ofte med ___.", "answers": ["ham"], "explain": "Lars = han → objektsform er ham."}, {"id": 10, "section": 1, "type": "mc", "sentence": "Min søster er flink. Jeg besøger ___ tit.", "answers": ["hende"], "options": ["ham", "hende", "den"], "explain": "min søster = hun → hende."}, {"id": 11, "section": 1, "type": "input", "sentence": "Lars og jeg er gode venner. Han hjælper altid ___. (jeg)", "answers": ["mig"], "explain": "jeg → mig som objekt."}, {"id": 12, "section": 1, "type": "mc", "sentence": "Når du har tid, så ring til ___. (jeg)", "answers": ["mig"], "options": ["mig", "dig", "ham"], "explain": "jeg → mig."}, {"id": 13, "section": 1, "type": "input", "sentence": "Hej børn! Jeg har en gave til ___.", "answers": ["jer"], "explain": "børn = I (du i flertal) → jer."}, {"id": 14, "section": 1, "type": "mc", "sentence": "Min mand laver mad til ___. (jeg)", "answers": ["mig"], "options": ["mig", "ham", "sig"], "explain": "jeg → mig."}, {"id": 15, "section": 1, "type": "input", "sentence": "Min nye cykel er flot. Jeg cykler på ___ hver dag.", "answers": ["den"], "explain": "en cykel (en-ord) → den."}, {"id": 16, "section": 1, "type": "input", "sentence": "Det er ___ bil. (jeg)", "answers": ["min"], "explain": "en bil (en-ord) + 1. person sg → min."}, {"id": 17, "section": 1, "type": "mc", "sentence": "Hvor er ___ hus? (du)", "answers": ["dit"], "options": ["din", "dit", "dine"], "explain": "et hus (et-ord) + 2. person sg → dit."}, {"id": 18, "section": 1, "type": "input", "sentence": "___ børn leger i haven. (vi)", "answers": ["Vores"], "explain": "1. person flertal er altid vores."}, {"id": 19, "section": 1, "type": "mc", "sentence": "Det er ___ jakke. (han)", "answers": ["hans"], "options": ["hans", "hendes", "deres"], "explain": "han → hans (uændret)."}, {"id": 20, "section": 1, "type": "input", "sentence": "Det er Marias bog. Det er ___ bog.", "answers": ["hendes"], "explain": "Maria = hun → hendes."}, {"id": 21, "section": 1, "type": "mc", "sentence": "___ bil er rød. (jeg)", "answers": ["Min"], "options": ["Min", "Mit", "Mine"], "explain": "en bil → min."}, {"id": 22, "section": 1, "type": "input", "sentence": "Hvor er ___ nøgler? (du)", "answers": ["dine"], "explain": "nøgler (flertal) + 2. person sg → dine."}, {"id": 23, "section": 1, "type": "mc", "sentence": "Vi elsker ___ familie. (vi)", "answers": ["vores"], "options": ["vores", "jeres", "deres"], "explain": "1. person flertal → vores."}, {"id": 24, "section": 1, "type": "input", "sentence": "Peter har en søn. ___ søn hedder Anders. (han)", "answers": ["Hans"], "explain": "Peter = han → hans."}, {"id": 25, "section": 1, "type": "mc", "sentence": "___ mor bor i Aarhus. (jeg)", "answers": ["Min"], "options": ["Min", "Mit", "Mine"], "explain": "en mor → min."}, {"id": 26, "section": 1, "type": "input", "sentence": "Det er ___ telefon. (jeg)", "answers": ["min"], "explain": "en telefon → min."}, {"id": 27, "section": 1, "type": "mc", "sentence": "Børnene leger med ___ legetøj. (de)", "answers": ["deres"], "options": ["deres", "sine", "sit"], "explain": "de → deres (her er børnene ikke subjekt af sætningen som ejer legetøjet... vent — de ER subjektet. Men deres bruges hyppigere end sine ved flertal. Begge accepteres traditionelt.)"}, {"id": 28, "section": 1, "type": "input", "sentence": "Hvor er ___ pas? (du)", "answers": ["dit"], "explain": "et pas + 2. person sg → dit."}, {"id": 29, "section": 1, "type": "mc", "sentence": "Sara har en cykel. ___ cykel er ny. (hun)", "answers": ["Hendes"], "options": ["Hendes", "Hans", "Deres"], "explain": "Sara = hun → hendes."}, {"id": 30, "section": 1, "type": "input", "sentence": "Det er ___ værelser. (jeg)", "answers": ["mine"], "explain": "værelser (flertal) → mine."}, {"id": 31, "section": 1, "type": "mc", "sentence": "Hvad er ___ navn? (du)", "answers": ["dit"], "options": ["din", "dit", "dine"], "explain": "et navn → dit."}, {"id": 32, "section": 1, "type": "input", "sentence": "___ lærer er meget sød. (vi)", "answers": ["Vores"], "explain": "1. person flertal → vores."}, {"id": 33, "section": 1, "type": "mc", "sentence": "Jeg har set ___ ven. (du)", "answers": ["din"], "options": ["din", "dit", "dine"], "explain": "en ven → din."}, {"id": 34, "section": 1, "type": "input", "sentence": "___ kollega er fra Sverige. (han)", "answers": ["Hans"], "explain": "han → hans."}, {"id": 35, "section": 1, "type": "mc", "sentence": "Er det ___ bil eller min? (du)", "answers": ["din"], "options": ["din", "dit", "dine"], "explain": "en bil → din."}, {"id": 36, "section": 1, "type": "input", "sentence": "Lars er ___ bedste ven. (jeg)", "answers": ["min"], "explain": "en ven (en-ord) → min."}, {"id": 37, "section": 1, "type": "mc", "sentence": "Pigen har en stor hund. Hun går ofte tur med ___.", "answers": ["den"], "options": ["den", "ham", "hende"], "explain": "en hund (en-ord, dyr) → den."}, {"id": 38, "section": 1, "type": "input", "sentence": "Anders og Sara har en lille kat. ___ kat hedder Mis.", "answers": ["Deres"], "explain": "Anders og Sara = de → deres."}, {"id": 39, "section": 1, "type": "mc", "sentence": "Vi besøger ___ bedsteforældre i weekenden. (vi)", "answers": ["vores"], "options": ["vores", "jeres", "deres"], "explain": "1. person flertal → vores."}, {"id": 40, "section": 1, "type": "input", "sentence": "Det er ___ ferie. Vi har planlagt den længe. (vi)", "answers": ["vores"], "explain": "vi → vores."}, {"id": 41, "section": 1, "type": "mc", "sentence": "Du skal hilse på ___ familie. (jeg)", "answers": ["min"], "options": ["min", "mit", "mine"], "explain": "en familie → min."}, {"id": 42, "section": 1, "type": "input", "sentence": "Børnene skriver et brev til ___ bedstemor. (de)", "answers": ["deres"], "explain": "de → deres."}, {"id": 43, "section": 1, "type": "mc", "sentence": "Han laver mad. ___ mad er meget lækker. (han)", "answers": ["Hans"], "options": ["Hans", "Hendes", "Sin"], "explain": "han → hans (her er mad subjekt, ikke han, så sin går ikke)."}, {"id": 44, "section": 1, "type": "input", "sentence": "Vi elsker ___ nye lejlighed. (vi)", "answers": ["vores"], "explain": "vi → vores."}, {"id": 45, "section": 1, "type": "mc", "sentence": "Peter har en bil. Han kører tit i ___.", "answers": ["den"], "options": ["den", "det", "ham"], "explain": "en bil → den (når vi henviser til bilen)."}, {"id": 46, "section": 1, "type": "input", "sentence": "Jeg har glemt ___ briller. (jeg)", "answers": ["mine"], "explain": "briller (flertal) → mine."}, {"id": 47, "section": 1, "type": "mc", "sentence": "Hvor er ___ tasker? (I, flertal)", "answers": ["jeres"], "options": ["jeres", "vores", "deres"], "explain": "I → jeres."}, {"id": 48, "section": 1, "type": "input", "sentence": "Børnene har ___ eget værelse hver. (de)", "answers": ["deres"], "explain": "de → deres."}, {"id": 49, "section": 1, "type": "mc", "sentence": "Han har en søster. ___ søster bor i Odense. (han)", "answers": ["Hans"], "options": ["Hans", "Hendes", "Sin"], "explain": "han → hans (søster er subjekt, ikke han)."}, {"id": 50, "section": 1, "type": "input", "sentence": "Vi har inviteret ___ til frokost. (du)", "answers": ["dig"], "explain": "du → dig."}, {"id": 51, "section": 2, "type": "input", "sentence": "Han vasker ___ hver morgen.", "answers": ["sig"], "explain": "3. person (han) refleksiv = sig."}, {"id": 52, "section": 2, "type": "mc", "sentence": "Jeg morer ___ til festen.", "answers": ["mig"], "options": ["mig", "sig", "dig"], "explain": "1. person bruger normal objektsform (mig), aldrig sig."}, {"id": 53, "section": 2, "type": "input", "sentence": "Børnene glæder ___ til ferien.", "answers": ["sig"], "explain": "3. person flertal refleksiv = sig."}, {"id": 54, "section": 2, "type": "mc", "sentence": "Du må passe på ___.", "answers": ["dig"], "options": ["sig", "dig", "mig"], "explain": "2. person bruger normal objektsform (dig)."}, {"id": 55, "section": 2, "type": "input", "sentence": "Hun føler ___ syg i dag.", "answers": ["sig"], "explain": "3. person (hun) refleksiv = sig."}, {"id": 56, "section": 2, "type": "mc", "sentence": "Vi keder ___ til mødet.", "answers": ["os"], "options": ["os", "sig", "jer"], "explain": "1. person flertal bruger normal objektsform (os)."}, {"id": 57, "section": 2, "type": "input", "sentence": "Lars klæder ___ på.", "answers": ["sig"], "explain": "3. person (han) refleksiv = sig."}, {"id": 58, "section": 2, "type": "mc", "sentence": "Jeg har skåret ___ i fingeren.", "answers": ["mig"], "options": ["mig", "sig", "dig"], "explain": "1. person → mig."}, {"id": 59, "section": 2, "type": "input", "sentence": "Anna har sat ___ på sofaen.", "answers": ["sig"], "explain": "3. person (hun) refleksiv = sig."}, {"id": 60, "section": 2, "type": "mc", "sentence": "Pas på, du skal ikke slå ___!", "answers": ["dig"], "options": ["sig", "dig", "mig"], "explain": "2. person → dig."}, {"id": 61, "section": 2, "type": "input", "sentence": "Han har glædet ___ hele ugen.", "answers": ["sig"], "explain": "han → sig."}, {"id": 62, "section": 2, "type": "mc", "sentence": "Børnene har lært at klæde ___ på selv.", "answers": ["sig"], "options": ["sig", "dem", "os"], "explain": "børnene = de → sig som refleksiv."}, {"id": 63, "section": 2, "type": "input", "sentence": "Jeg vasker ___, før jeg går i seng.", "answers": ["mig"], "explain": "1. person → mig."}, {"id": 64, "section": 2, "type": "mc", "sentence": "Hun har gemt ___ bag sofaen.", "answers": ["sig"], "options": ["sig", "hende", "sin"], "explain": "hun → sig (refleksiv objekt)."}, {"id": 65, "section": 2, "type": "input", "sentence": "Vi skal forberede ___ til eksamen.", "answers": ["os"], "explain": "vi → os."}, {"id": 66, "section": 2, "type": "mc", "sentence": "Du skal ikke bekymre ___ om det.", "answers": ["dig"], "options": ["sig", "dig", "mig"], "explain": "du → dig."}, {"id": 67, "section": 2, "type": "input", "sentence": "Han har lige barberet ___.", "answers": ["sig"], "explain": "han → sig."}, {"id": 68, "section": 2, "type": "mc", "sentence": "Hun har klippet ___ i håret.", "answers": ["sig"], "options": ["sig", "hende", "sin"], "explain": "hun har gjort det på sig selv → sig."}, {"id": 69, "section": 2, "type": "input", "sentence": "Vi har taget ___ god tid til det.", "answers": ["os"], "explain": "vi → os."}, {"id": 70, "section": 2, "type": "mc", "sentence": "Han skyndte ___ hjem fra arbejde.", "answers": ["sig"], "options": ["sig", "ham", "han"], "explain": "han → sig."}, {"id": 71, "section": 2, "type": "mc", "sentence": "Peter besøger ___ mor i weekenden. (Peters egen)", "answers": ["sin"], "options": ["sin", "sit", "sine"], "explain": "Peter er subjekt og ejer mor (en-ord) → sin."}, {"id": 72, "section": 2, "type": "mc", "sentence": "Anna har glemt ___ pas. (Annas eget)", "answers": ["sit"], "options": ["sin", "sit", "sine"], "explain": "et pas (et-ord), Anna er subjekt og ejer det → sit."}, {"id": 73, "section": 2, "type": "mc", "sentence": "Lars taler med ___ kolleger. (Lars' egne)", "answers": ["sine"], "options": ["sin", "sit", "sine"], "explain": "kolleger (flertal), Lars er subjekt → sine."}, {"id": 74, "section": 2, "type": "input", "sentence": "Hun læser ___ bog. (hendes egen, en bog)", "answers": ["sin"], "explain": "en bog + hun ejer den + hun er subjekt → sin."}, {"id": 75, "section": 2, "type": "mc", "sentence": "Han sælger ___ hus. (hans eget)", "answers": ["sit"], "options": ["sin", "sit", "sine"], "explain": "et hus + han er subjekt → sit."}, {"id": 76, "section": 2, "type": "input", "sentence": "Peter elsker ___ børn. (hans egne, flertal)", "answers": ["sine"], "explain": "børn (flertal) + Peter er subjekt → sine."}, {"id": 77, "section": 2, "type": "mc", "sentence": "Maria besøger ___ veninde. (hendes egen)", "answers": ["sin"], "options": ["sin", "sit", "sine"], "explain": "en veninde + Maria er subjekt → sin."}, {"id": 78, "section": 2, "type": "input", "sentence": "Han har mistet ___ ur. (hans eget, et ur)", "answers": ["sit"], "explain": "et ur + han er subjekt → sit."}, {"id": 79, "section": 2, "type": "mc", "sentence": "Han taler med ___ datter. (hans egen)", "answers": ["sin"], "options": ["sin", "sit", "sine"], "explain": "en datter + han er subjekt → sin."}, {"id": 80, "section": 2, "type": "input", "sentence": "Hun har sendt ___ brev. (hendes eget, et brev)", "answers": ["sit"], "explain": "et brev + hun er subjekt → sit."}, {"id": 81, "section": 2, "type": "mc", "sentence": "Han har solgt ___ gamle bil. (hans egen)", "answers": ["sin"], "options": ["sin", "sit", "sine"], "explain": "en bil + han er subjekt → sin."}, {"id": 82, "section": 2, "type": "input", "sentence": "Han har inviteret ___ venner. (hans egne)", "answers": ["sine"], "explain": "venner (flertal) + han er subjekt → sine."}, {"id": 83, "section": 2, "type": "mc", "sentence": "Anna kører ___ bil på arbejde. (hendes egen)", "answers": ["sin"], "options": ["sin", "sit", "sine"], "explain": "en bil + Anna er subjekt → sin."}, {"id": 84, "section": 2, "type": "input", "sentence": "Han har glemt ___ paraply. (hans egen)", "answers": ["sin"], "explain": "en paraply + han er subjekt → sin."}, {"id": 85, "section": 2, "type": "mc", "sentence": "Hun har malet ___ køkken. (hendes eget)", "answers": ["sit"], "options": ["sin", "sit", "sine"], "explain": "et køkken + hun er subjekt → sit."}, {"id": 86, "section": 2, "type": "input", "sentence": "Peter elsker ___ nye sko. (hans egne)", "answers": ["sine"], "explain": "sko (flertal) + Peter er subjekt → sine."}, {"id": 87, "section": 2, "type": "mc", "sentence": "Hun pakker ___ kufferter. (hendes egne)", "answers": ["sine"], "options": ["sin", "sit", "sine"], "explain": "kufferter (flertal) + hun er subjekt → sine."}, {"id": 88, "section": 2, "type": "input", "sentence": "Hun har mistet ___ telefon. (hendes egen)", "answers": ["sin"], "explain": "en telefon + hun er subjekt → sin."}, {"id": 89, "section": 2, "type": "mc", "sentence": "Lars er stolt af ___ arbejde. (hans eget)", "answers": ["sit"], "options": ["sin", "sit", "sine"], "explain": "et arbejde + Lars er subjekt → sit."}, {"id": 90, "section": 2, "type": "input", "sentence": "Han har talt med ___ chef. (hans egen)", "answers": ["sin"], "explain": "en chef + han er subjekt → sin."}, {"id": 91, "section": 2, "type": "mc", "sentence": "Maria besøger Peter og ___ kone. (Peters kone — Maria er subjekt)", "answers": ["hans"], "options": ["sin", "hans"], "explain": "Subjektet er Maria. Konen tilhører Peter (objektet), ikke subjektet → hans."}, {"id": 92, "section": 2, "type": "mc", "sentence": "Peter besøger Anna og ___ datter. (Annas datter — Peter er subjekt)", "answers": ["hendes"], "options": ["sin", "hendes"], "explain": "Subjektet er Peter. Datteren tilhører Anna → hendes."}, {"id": 93, "section": 2, "type": "mc", "sentence": "Lars er på ferie med ___ kone. (Lars' egen — Lars er subjekt)", "answers": ["sin"], "options": ["sin", "hans"], "explain": "Lars er subjekt og ejer konen → sin."}, {"id": 94, "section": 2, "type": "mc", "sentence": "Anna har inviteret Lars og ___ kone. (Lars' kone — Anna er subjekt)", "answers": ["hans"], "options": ["sin", "hans"], "explain": "Anna er subjekt, konen tilhører Lars → hans."}, {"id": 95, "section": 2, "type": "input", "sentence": "Han kører Maria hjem i ___ bil. (hans egen bil)", "answers": ["sin"], "explain": "han er subjekt, ejer bilen → sin."}, {"id": 96, "section": 2, "type": "mc", "sentence": "Hun låner penge af Peter og ___ bror. (Peters bror — hun er subjekt)", "answers": ["hans"], "options": ["sin", "hans"], "explain": "Hun er subjekt, broren tilhører Peter → hans."}, {"id": 97, "section": 2, "type": "input", "sentence": "Peter har lavet maden hos ___ mor. (Peters egen)", "answers": ["sin"], "explain": "Peter er subjekt og ejer mor → sin."}, {"id": 98, "section": 2, "type": "mc", "sentence": "Maria køber en gave til Lars og ___ kone. (Lars' kone)", "answers": ["hans"], "options": ["sin", "hans"], "explain": "Maria er subjekt, konen er Lars' → hans."}, {"id": 99, "section": 2, "type": "input", "sentence": "De har solgt ___ hus til naboen. (deres eget)", "answers": ["deres"], "alt": ["sit"], "explain": "de = flertal subjekt. Både 'deres' og 'sit' er teknisk korrekte, men deres er mest brugt."}, {"id": 100, "section": 2, "type": "mc", "sentence": "Peter og Lars besøger ___ forældre sammen. (deres egne)", "answers": ["deres"], "options": ["sine", "deres"], "alt": ["sine"], "explain": "Flertal subjekt. Begge accepteres traditionelt, men 'deres' bruges typisk."}, {"id": 101, "section": 3, "type": "mc", "sentence": "Bogen, ___ jeg læser nu, er meget spændende.", "answers": ["som"], "options": ["som", "der", "hvis"], "explain": "Bogen er OBJEKT i bisætningen (jeg læser bogen) → kun som."}, {"id": 102, "section": 3, "type": "input", "sentence": "Pigen, ___ cykel er væk, er ked af det.", "answers": ["hvis"], "explain": "Viser ejerskab (pigens cykel) → hvis."}, {"id": 103, "section": 3, "type": "mc", "sentence": "Filmen, ___ vi så i går, var rigtig god.", "answers": ["som"], "options": ["som", "der", "hvis"], "explain": "filmen er objekt (vi så filmen) → som."}, {"id": 104, "section": 3, "type": "mc", "sentence": "Kvinden, ___ hund løber i parken, er min nabo.", "answers": ["hvis"], "options": ["som", "der", "hvis"], "explain": "Ejerskab (kvindens hund) → hvis."}, {"id": 105, "section": 3, "type": "input", "sentence": "Manden, ___ bor ved siden af mig, er meget flink.", "answers": ["der"], "alt": ["som"], "explain": "manden er subjekt i bisætningen → både der og som er ok."}, {"id": 106, "section": 3, "type": "mc", "sentence": "Kagen, ___ min mor bagte, smagte godt.", "answers": ["som"], "options": ["som", "der", "hvis"], "explain": "kagen er objekt (min mor bagte kagen) → som."}, {"id": 107, "section": 3, "type": "mc", "sentence": "Drengen, ___ navn jeg ikke kan huske, ringede i går.", "answers": ["hvis"], "options": ["som", "der", "hvis"], "explain": "Ejerskab (drengens navn) → hvis."}, {"id": 108, "section": 3, "type": "input", "sentence": "Læreren, ___ underviser i dansk, er meget dygtig.", "answers": ["der"], "alt": ["som"], "explain": "læreren er subjekt → både der og som."}, {"id": 109, "section": 3, "type": "mc", "sentence": "Brevet, ___ jeg fik i går, var fra min mor.", "answers": ["som"], "options": ["som", "der", "hvis"], "explain": "brevet er objekt (jeg fik brevet) → som."}, {"id": 110, "section": 3, "type": "mc", "sentence": "Studenten, ___ eksamen var i går, er nervøs.", "answers": ["hvis"], "options": ["som", "der", "hvis"], "explain": "Ejerskab (studentens eksamen) → hvis."}, {"id": 111, "section": 3, "type": "input", "sentence": "Jeg kender en pige, ___ taler fem sprog.", "answers": ["der"], "alt": ["som"], "explain": "pigen er subjekt → der eller som."}, {"id": 112, "section": 3, "type": "mc", "sentence": "Den person, ___ vi mødte til festen, var rar.", "answers": ["som"], "options": ["som", "der", "hvis"], "explain": "personen er objekt (vi mødte personen) → som."}, {"id": 113, "section": 3, "type": "mc", "sentence": "Det er familien, ___ datter går i samme klasse som mit barn.", "answers": ["hvis"], "options": ["som", "der", "hvis"], "explain": "Ejerskab (familiens datter) → hvis."}, {"id": 114, "section": 3, "type": "input", "sentence": "Pakken, ___ kom i dag, er fra min far.", "answers": ["der"], "alt": ["som"], "explain": "pakken er subjekt → der eller som."}, {"id": 115, "section": 3, "type": "mc", "sentence": "Mit barn, ___ jeg er meget stolt af, læser meget.", "answers": ["som"], "options": ["som", "der", "hvis"], "explain": "barnet er objekt for 'stolt af' → som."}, {"id": 116, "section": 3, "type": "mc", "sentence": "Drengen, ___ forældre bor i Aarhus, læser i København.", "answers": ["hvis"], "options": ["som", "der", "hvis"], "explain": "Ejerskab (drengens forældre) → hvis."}, {"id": 117, "section": 3, "type": "input", "sentence": "Den sang, ___ vi hørte i radioen, var dejlig.", "answers": ["som"], "explain": "sangen er objekt (vi hørte sangen) → kun som."}, {"id": 118, "section": 3, "type": "mc", "sentence": "Manden, ___ vi taler om, kommer i morgen.", "answers": ["som"], "options": ["som", "der", "hvis"], "explain": "manden er objekt (vi taler om manden) → som."}, {"id": 119, "section": 3, "type": "mc", "sentence": "Bilen, ___ farve er rød, er min.", "answers": ["hvis"], "options": ["som", "der", "hvis"], "explain": "Ejerskab (bilens farve) → hvis."}, {"id": 120, "section": 3, "type": "input", "sentence": "Naboen, ___ altid er hjælpsom, har en hund.", "answers": ["der"], "alt": ["som"], "explain": "naboen er subjekt → der eller som."}, {"id": 121, "section": 3, "type": "mc", "sentence": "Lejligheden, ___ jeg lige har købt, er meget stor.", "answers": ["som"], "options": ["som", "der", "hvis"], "explain": "lejligheden er objekt (jeg købte lejligheden) → som."}, {"id": 122, "section": 3, "type": "mc", "sentence": "Pigen, ___ mor er læge, vil også være læge.", "answers": ["hvis"], "options": ["som", "der", "hvis"], "explain": "Ejerskab (pigens mor) → hvis."}, {"id": 123, "section": 3, "type": "input", "sentence": "Bogen, ___ ligger på bordet, er min.", "answers": ["der"], "alt": ["som"], "explain": "bogen er subjekt → der eller som."}, {"id": 124, "section": 3, "type": "mc", "sentence": "Min ven, ___ jeg har kendt i mange år, bor i Aarhus.", "answers": ["som"], "options": ["som", "der", "hvis"], "explain": "vennen er objekt (jeg har kendt vennen) → som."}, {"id": 125, "section": 3, "type": "mc", "sentence": "Manden, ___ bog jeg har lånt, hedder Peter.", "answers": ["hvis"], "options": ["som", "der", "hvis"], "explain": "Ejerskab (mandens bog) → hvis."}, {"id": 126, "section": 3, "type": "input", "sentence": "Læreren, ___ vi alle elsker, er meget sjov.", "answers": ["som"], "explain": "læreren er objekt (vi elsker læreren) → kun som."}, {"id": 127, "section": 3, "type": "mc", "sentence": "Hunden, ___ ejer er min ven, hedder Buddy.", "answers": ["hvis"], "options": ["som", "der", "hvis"], "explain": "Ejerskab (hundens ejer) → hvis."}, {"id": 128, "section": 3, "type": "mc", "sentence": "Filmen, ___ jeg så i går, var ikke særlig god.", "answers": ["som"], "options": ["som", "der", "hvis"], "explain": "filmen er objekt (jeg så filmen) → som."}, {"id": 129, "section": 3, "type": "input", "sentence": "Pigen, ___ sidder ved siden af mig, hedder Sara.", "answers": ["der"], "alt": ["som"], "explain": "pigen er subjekt → der eller som."}, {"id": 130, "section": 3, "type": "mc", "sentence": "Den studerende, ___ bog er forsvundet, leder overalt.", "answers": ["hvis"], "options": ["som", "der", "hvis"], "explain": "Ejerskab (den studerendes bog) → hvis."}, {"id": 131, "section": 4, "type": "input", "sentence": "I Danmark spiser ___ meget rugbrød.", "answers": ["man"], "explain": "Generelt 'folk/man' → man."}, {"id": 132, "section": 4, "type": "mc", "sentence": "Vil du have ___ kaffe?", "answers": ["noget"], "options": ["nogen", "noget", "nogle"], "explain": "kaffe er ikke-tællelig (mængde) → noget."}, {"id": 133, "section": 4, "type": "mc", "sentence": "Jeg har ___ gode venner i Aarhus.", "answers": ["nogle"], "options": ["nogen", "noget", "nogle"], "explain": "Positiv sætning + flertal tællelig → nogle (med l)."}, {"id": 134, "section": 4, "type": "input", "sentence": "Er der ___ hjemme?", "answers": ["nogen"], "explain": "Spørgsmål om en person → nogen."}, {"id": 135, "section": 4, "type": "mc", "sentence": "Jeg kan ikke se ___ i mørket.", "answers": ["noget"], "options": ["nogen", "noget", "nogle"], "explain": "Negativ + abstrakt 'noget som helst' → noget."}, {"id": 136, "section": 4, "type": "input", "sentence": "Der er ___ i huset. Det er helt tomt.", "answers": ["ingen"], "explain": "'Ingen person' → ingen."}, {"id": 137, "section": 4, "type": "mc", "sentence": "Han bor sammen med ___ venner fra studietiden.", "answers": ["nogle"], "options": ["nogen", "noget", "nogle"], "explain": "Positiv + flertal tællelig → nogle."}, {"id": 138, "section": 4, "type": "input", "sentence": "___ siger, at vejret bliver bedre i morgen.", "answers": ["Man"], "explain": "'Folk/man siger' → Man (stort M ved sætningsstart)."}, {"id": 139, "section": 4, "type": "mc", "sentence": "Vil du have ___ at drikke?", "answers": ["noget"], "options": ["nogen", "noget", "nogle"], "explain": "'Noget at drikke' (abstrakt) → noget."}, {"id": 140, "section": 4, "type": "input", "sentence": "Jeg har købt ___ blomster til min mor.", "answers": ["nogle"], "explain": "Positiv + flertal tællelig → nogle."}, {"id": 141, "section": 4, "type": "mc", "sentence": "Der er ikke ___ mælk tilbage.", "answers": ["noget"], "options": ["nogen", "noget", "nogle"], "explain": "mælk er ikke-tællelig → noget."}, {"id": 142, "section": 4, "type": "input", "sentence": "I sommerhuset kan ___ slappe godt af.", "answers": ["man"], "explain": "Generelt 'man/folk' → man."}, {"id": 143, "section": 4, "type": "mc", "sentence": "Har du ___ idé om, hvor han er?", "answers": ["nogen"], "options": ["nogen", "noget", "nogle"], "explain": "Spørgsmål + tællelig ental → nogen."}, {"id": 144, "section": 4, "type": "mc", "sentence": "Jeg har ikke fortalt ___ om det.", "answers": ["nogen"], "options": ["nogen", "noget", "nogle"], "explain": "Negativ + person ('nogen som helst person') → nogen."}, {"id": 145, "section": 4, "type": "input", "sentence": "___ skal lære at vente på sin tur.", "answers": ["Man"], "explain": "Generelt 'folk/alle' → Man."}, {"id": 146, "section": 4, "type": "mc", "sentence": "Vil du have ___ kage?", "answers": ["noget"], "options": ["nogen", "noget", "nogle"], "explain": "kage er ikke-tællelig her (mængde) → noget."}, {"id": 147, "section": 4, "type": "input", "sentence": "Jeg vil gerne høre ___ musik nu.", "answers": ["noget"], "explain": "musik er ikke-tællelig → noget."}, {"id": 148, "section": 4, "type": "mc", "sentence": "Er der ___ tilbage at gøre?", "answers": ["noget"], "options": ["nogen", "noget", "nogle"], "explain": "Abstrakt 'noget som helst' → noget."}, {"id": 149, "section": 4, "type": "input", "sentence": "Der er ___ til at hjælpe os.", "answers": ["ingen"], "explain": "'Ingen person' → ingen."}, {"id": 150, "section": 4, "type": "mc", "sentence": "Jeg har ___ vigtigt at fortælle dig.", "answers": ["noget"], "options": ["nogen", "noget", "nogle"], "explain": "Abstrakt 'noget som helst' → noget."}, {"id": 151, "section": 4, "type": "input", "sentence": "Når ___ rejser, ser man mange spændende steder.", "answers": ["man"], "explain": "Generelt 'man' → man."}, {"id": 152, "section": 4, "type": "mc", "sentence": "Vi har ___ planer for weekenden.", "answers": ["nogle"], "options": ["nogen", "noget", "nogle"], "explain": "Positiv + flertal tællelig → nogle."}, {"id": 153, "section": 4, "type": "mc", "sentence": "Han har ___ problemer i øjeblikket.", "answers": ["nogle"], "options": ["nogen", "noget", "nogle"], "explain": "Positiv + flertal tællelig → nogle."}, {"id": 154, "section": 4, "type": "input", "sentence": "Har du ___ at sige?", "answers": ["noget"], "explain": "Abstrakt 'noget' → noget."}, {"id": 155, "section": 4, "type": "mc", "sentence": "Jeg har ikke ___ tid lige nu.", "answers": ["noget"], "options": ["nogen", "noget", "nogle"], "explain": "tid er ikke-tællelig → noget."}, {"id": 156, "section": 4, "type": "input", "sentence": "Der er ___ kage tilbage. Vi har spist det hele.", "answers": ["ingen"], "explain": "'Ingen kage' → ingen."}, {"id": 157, "section": 4, "type": "mc", "sentence": "Vil du have ___ vand?", "answers": ["noget"], "options": ["nogen", "noget", "nogle"], "explain": "vand er ikke-tællelig → noget."}, {"id": 158, "section": 4, "type": "input", "sentence": "I dette land hilser ___ med et håndtryk.", "answers": ["man"], "explain": "Generelt 'man/folk' → man."}, {"id": 159, "section": 4, "type": "mc", "sentence": "Jeg så ___ interessante film i biografen.", "answers": ["nogle"], "options": ["nogen", "noget", "nogle"], "explain": "Positiv + flertal tællelig → nogle."}, {"id": 160, "section": 4, "type": "input", "sentence": "Der er ___ derhjemme. Alle er ude.", "answers": ["ingen"], "explain": "'Ingen person' → ingen."}, {"id": 161, "section": 5, "type": "multi", "sentence": "Jeg kender Lars godt. Han er ___ bedste ven, og jeg taler tit med ___.", "answers": ["min", "ham"], "explain": "min (en ven, 1. person), ham (Lars som objekt)."}, {"id": 162, "section": 5, "type": "multi", "sentence": "Anna har en stor have. ___ have er fyldt med blomster, som ___ selv har plantet.", "answers": ["Hendes", "hun"], "explain": "Hendes (Anna ejer haven, men haven er subjekt i sætningen), hun (Anna som subjekt i bisætningen)."}, {"id": 163, "section": 5, "type": "multi", "sentence": "Peter besøger ___ mor og hjælper ___ med havearbejdet.", "answers": ["sin", "hende"], "explain": "sin (Peter er subjekt, ejer mor), hende (mor som objekt)."}, {"id": 164, "section": 5, "type": "multi", "sentence": "Børnene har glædet ___ hele ugen. ___ ferie starter i morgen.", "answers": ["sig", "Deres"], "explain": "sig (refleksiv for de), Deres (de ejer ferien, men ferien er subjekt)."}, {"id": 165, "section": 5, "type": "multi", "sentence": "Min mand laver mad. Jeg synes, at ___ mad altid er lækker, og jeg spiser ___ med stor appetit.", "answers": ["hans", "den"], "explain": "hans (manden ejer maden, men maden er subjekt), den (mad = en-ord)."}, {"id": 166, "section": 5, "type": "multi", "sentence": "Vi har en ny kollega. ___ navn er Lars, og vi kan godt lide ___.", "answers": ["Hans", "ham"], "explain": "Hans (kollegaen ejer navnet, men navnet er subjekt), ham (Lars som objekt)."}, {"id": 167, "section": 5, "type": "multi", "sentence": "Anna ringer til Peter. Hun fortæller ___, at ___ har lyst til at gå i biografen.", "answers": ["ham", "hun"], "explain": "ham (Peter som objekt), hun (Anna som subjekt i bisætningen)."}, {"id": 168, "section": 5, "type": "multi", "sentence": "Hvor er ___ briller? Jeg kan ikke finde ___. (du, flertal)", "answers": ["dine", "dem"], "explain": "dine (briller flertal, 2. person), dem (briller som objekt)."}, {"id": 169, "section": 5, "type": "multi", "sentence": "Maria er glad. ___ har lige købt ___ første bil. (en bil, hendes egen)", "answers": ["Hun", "sin"], "explain": "Hun (subjekt), sin (Maria er subjekt og ejer bilen, en-ord)."}, {"id": 170, "section": 5, "type": "multi", "sentence": "Når Peter får ___ løn, køber han noget til ___ kone. (Peters egen løn og egen kone)", "answers": ["sin", "sin"], "explain": "sin (Peter er subjekt, ejer lønnen, en-ord), sin (Peter er subjekt, ejer konen, en-ord)."}, {"id": 171, "section": 5, "type": "multi", "sentence": "Jeg har en god ven. Han hedder Lars, og ___ er ___ bedste ven. ___ taler tit sammen.", "answers": ["han", "min", "Vi"], "explain": "han (subjekt), min (en ven, 1. person), Vi (vennen og jeg sammen)."}, {"id": 172, "section": 5, "type": "multi", "sentence": "Anna er flink. Jeg kan godt lide ___. ___ er en god veninde, og ___ hjælper altid mig.", "answers": ["hende", "Hun", "hun"], "explain": "hende (Anna som objekt), Hun (subjekt), hun (subjekt i ny sætningsdel)."}, {"id": 173, "section": 5, "type": "multi", "sentence": "Børnene leger i haven. ___ har glædet ___ hele dagen, og nu er ___ trætte.", "answers": ["De", "sig", "de"], "explain": "De (subjekt), sig (refleksiv for de), de (subjekt igen)."}, {"id": 174, "section": 5, "type": "multi", "sentence": "Peter elsker ___ kone og ___ børn. ___ tager dem ofte med på ferie.", "answers": ["sin", "sine", "Han"], "explain": "sin (Peter subjekt, kone en-ord), sine (børn flertal), Han (subjekt)."}, {"id": 175, "section": 5, "type": "multi", "sentence": "Vi har en ny lærer. ___ navn er Maria. Vi kan godt lide ___, fordi ___ er meget tålmodig.", "answers": ["Hendes", "hende", "hun"], "explain": "Hendes (læreren ejer navnet, men navnet er subjekt), hende (Maria som objekt), hun (subjekt i bisætning)."}, {"id": 176, "section": 5, "type": "multi", "sentence": "Anna er på vej hjem. ___ skal hjem og lave mad til ___ mand og ___ børn. (Annas egne)", "answers": ["Hun", "sin", "sine"], "explain": "Hun (subjekt), sin (Anna ejer mand, en-ord), sine (børn flertal)."}, {"id": 177, "section": 5, "type": "multi", "sentence": "Lars er glad i dag. Han har fået ___ første job, og ___ skal starte på arbejde i ___ nye firma i morgen.", "answers": ["sit", "han", "sit"], "explain": "sit (et job, Lars ejer det), han (subjekt), sit (et firma, Lars ejer det)."}, {"id": 178, "section": 5, "type": "multi", "sentence": "Min søster har en bil. ___ kører ofte ___ veninder til arbejde i ___. (bilen)", "answers": ["Hun", "sine", "den"], "explain": "Hun (subjekt), sine (veninder flertal, hun ejer dem), den (bilen, en-ord)."}, {"id": 179, "section": 5, "type": "multi", "sentence": "Vi har inviteret Anna og Lars. ___ kommer i morgen, og vi skal lave mad til ___. Jeg håber, ___ kan lide vores mad.", "answers": ["De", "dem", "de"], "explain": "De (subjekt), dem (objekt), de (subjekt i bisætning)."}, {"id": 180, "section": 5, "type": "multi", "sentence": "Peter taler med ___ chef. ___ chef vil gerne have, at ___ kommer på arbejde i weekenden. (Peters chef)", "answers": ["sin", "Hans", "han"], "explain": "sin (Peter subjekt, chef en-ord), Hans (chefen tilhører Peter, men chefen er subjekt nu), han (Peter som subjekt i bisætning)."}, {"id": 181, "section": 5, "type": "multi", "sentence": "Anna har en god ven, Peter. ___ er meget sød ved ___. ___ taler ofte sammen om ___ problemer.", "answers": ["Han", "hende", "De", "deres"], "explain": "Han (Peter subjekt), hende (Anna objekt), De (Anna og Peter sammen), deres (flertal subjekt ejer problemer)."}, {"id": 182, "section": 5, "type": "multi", "sentence": "Vi har lige fået en hund. ___ er meget legesyg. Børnene elsker ___, og ___ leger med ___ hele dagen.", "answers": ["Den", "den", "de", "den"], "explain": "Den (hunden, en-ord), den (hunden som objekt), de (børnene), den (hunden som objekt igen)."}, {"id": 183, "section": 5, "type": "multi", "sentence": "Peter besøger ___ mor i Aarhus. ___ er glad for at se ___ og laver ___ livret. (Peters egen mor)", "answers": ["sin", "Hun", "ham", "hans"], "explain": "sin (Peter subjekt, mor en-ord), Hun (moren subjekt), ham (Peter objekt), hans (livret tilhører Peter, men livret er subjekt)."}, {"id": 184, "section": 5, "type": "multi", "sentence": "Maria og Lars rejser til Italien. ___ har glædet ___ længe. ___ skal besøge ___ familie og rejse rundt med ___ børn.", "answers": ["De", "sig", "De", "deres", "deres"], "explain": "De (subjekt), sig (refleksiv for de), De (subjekt), deres (flertal ejer familie), deres (flertal ejer børn)."}, {"id": 185, "section": 5, "type": "multi", "sentence": "Jeg har en ny kollega. ___ hedder Anna, og ___ kommer fra Sverige. Jeg kan godt lide ___, og ___ taler ofte sammen i pausen.", "answers": ["Hun", "hun", "hende", "vi"], "explain": "Hun (Anna subjekt), hun (subjekt igen), hende (Anna objekt), vi (Anna og jeg sammen)."}, {"id": 186, "section": 5, "type": "multi", "sentence": "Peter har glemt ___ telefon hjemme. ___ kone har fundet ___. Hun siger, at ___ må passe bedre på ___ ting. (Peters egne)", "answers": ["sin", "Hans", "den", "han", "sine"], "explain": "sin (Peter ejer telefon, en-ord), Hans (konen tilhører Peter, men konen er subjekt), den (telefonen, en-ord), han (Peter subjekt i bisætning), sine (ting flertal, han ejer dem)."}, {"id": 187, "section": 5, "type": "multi", "sentence": "Anna møder ___ veninde til en kop kaffe. ___ taler om ___ planer for sommeren. Bagefter går Anna hjem og laver mad til ___ kæreste. (Annas egne)", "answers": ["sin", "De", "deres", "sin"], "explain": "sin (Anna subjekt, veninde en-ord), De (Anna og veninden), deres (flertal ejer planer), sin (Anna subjekt, kæreste en-ord)."}, {"id": 188, "section": 5, "type": "multi", "sentence": "Vi har lejet et sommerhus. ___ ligger ved havet. ___ kan godt lide ___, og børnene elsker at lege i haven.", "answers": ["Det", "Vi", "det"], "explain": "Det (huset, et-ord), Vi (subjekt), det (huset som objekt)."}, {"id": 189, "section": 5, "type": "multi", "sentence": "Min søn har lige fået ___ første cykel. ___ er meget glad for ___, og ___ kører rundt med ___ hver dag.", "answers": ["sin", "Han", "den", "han", "den"], "explain": "sin (sønnen subjekt, cykel en-ord), Han (subjekt), den (cyklen), han (subjekt), den (cyklen)."}, {"id": 190, "section": 5, "type": "multi", "sentence": "Anna er på arbejde. ___ taler med ___ chef om ___ projekt. ___ chef siger, at ___ skal levere det i morgen.", "answers": ["Hun", "sin", "sit", "Hendes", "hun"], "explain": "Hun (subjekt), sin (Anna ejer chef, en-ord), sit (projekt et-ord, Anna ejer), Hendes (chefen er Annas, men chefen er subjekt nu), hun (Anna subjekt i bisætning)."}, {"id": 191, "section": 5, "type": "multi", "sentence": "Lars har en god ven. ___ ven hedder Peter. ___ taler ofte sammen om ___ liv. Når Lars har problemer, ringer ___ til Peter. Peter giver altid ___ god rådgivning.", "answers": ["Hans", "De", "deres", "han", "ham"], "explain": "Hans (Lars ejer vennen, men vennen er subjekt), De (Lars og Peter), deres (flertal ejer liv), han (Lars subjekt), ham (Lars objekt)."}, {"id": 192, "section": 5, "type": "multi", "sentence": "Anna er taget på ferie til Spanien. ___ rejser sammen med ___ mand og ___ to børn. ___ skal besøge ___ forældre, som bor i Madrid.", "answers": ["Hun", "sin", "sine", "De", "deres"], "explain": "Hun (Anna subjekt), sin (mand en-ord, Anna ejer), sine (børn flertal, Anna ejer), De (Anna og familien sammen), deres (flertal subjekt ejer forældre)."}, {"id": 193, "section": 5, "type": "multi", "sentence": "Peter har en lille datter. ___ hedder Mia og er fem år gammel. ___ leger ofte med ___ venner. Peter elsker ___ meget og bruger meget tid med ___.", "answers": ["Hun", "Hun", "sine", "hende", "hende"], "explain": "Hun (Mia subjekt), Hun (subjekt), sine (venner flertal, Mia subjekt ejer dem), hende (Mia objekt), hende (Mia objekt)."}, {"id": 194, "section": 5, "type": "multi", "sentence": "Vi har en ny kollega på arbejdet. ___ hedder Lars, og ___ kommer fra Norge. ___ taler godt dansk, men ___ accent er stadig norsk. Jeg synes, ___ er meget sympatisk.", "answers": ["Han", "han", "Han", "hans", "han"], "explain": "Han (Lars subjekt), han (subjekt), Han (subjekt), hans (Lars ejer accent, men accent er subjekt), han (Lars subjekt)."}, {"id": 195, "section": 5, "type": "multi", "sentence": "Min søster har lige købt ___ første hus. ___ er meget stolt af ___. ___ har malet alle værelser selv. Vi besøger ___ på lørdag.", "answers": ["sit", "Hun", "det", "Hun", "hende"], "explain": "sit (hus et-ord, søsteren subjekt ejer), Hun (subjekt), det (huset), Hun (subjekt), hende (søsteren som objekt)."}, {"id": 196, "section": 5, "type": "multi", "sentence": "Børnene leger udenfor. ___ har glædet ___ til at lege hele dagen. Når ___ kommer ind, skal ___ vaske ___ og spise aftensmad.", "answers": ["De", "sig", "de", "de", "sig"], "explain": "De (subjekt), sig (refleksiv), de (subjekt), de (subjekt), sig (refleksiv)."}, {"id": 197, "section": 5, "type": "multi", "sentence": "Jeg har en gammel ven, Lars. Jeg har kendt ___ siden vi var børn. ___ er en del af ___ familie. Når jeg har problemer, ringer jeg altid til ___. ___ er der altid for mig.", "answers": ["ham", "Han", "min", "ham", "Han"], "explain": "ham (Lars objekt), Han (subjekt), min (1. person), ham (objekt), Han (subjekt)."}, {"id": 198, "section": 5, "type": "multi", "sentence": "Anna og hendes mand bor i et stort hus. ___ har boet i ___ hus i 20 år. ___ elsker ___ have og bruger meget tid i ___.", "answers": ["De", "deres", "De", "deres", "den"], "explain": "De (subjekt), deres (flertal ejer hus), De (subjekt), deres (flertal ejer have), den (haven, en-ord)."}, {"id": 199, "section": 5, "type": "multi", "sentence": "Vi har inviteret nogle venner til middag på lørdag. ___ skal lave mad, og ___ kommer kl. 19. Når ___ er færdige med at spise, vil ___ se en film sammen. Jeg glæder ___ til det. (jeg)", "answers": ["Vi", "de", "vi", "vi", "mig"], "explain": "Vi (subjekt), de (vennerne), vi (alle sammen som subjekt), vi (alle sammen), mig (refleksiv for jeg)."}, {"id": 200, "section": 5, "type": "multi", "sentence": "Maria har en stor familie. ___ har tre brødre og to søstre. ___ familie samles ofte til store fester. ___ taler altid meget højt, og ___ griner meget sammen. ___ elsker dem alle sammen.", "answers": ["Hun", "Hendes", "De", "de", "Hun"], "explain": "Hun (Maria subjekt), Hendes (Maria ejer familie, men familien er subjekt), De (familien som flertal subjekt), de (subjekt), Hun (Maria subjekt)."}];
const SECTION_LABELS = {
1: "Personlige & ejestedord",
2: "Refleksive",
3: "Relative",
4: "Ubestemte",
5: "Avanceret"
};
let answeredCount = 0;
let correctCount = 0;
const state = {};
function normalize(s) {
return (s || "").toLowerCase().trim().replace(/[.,!?;:]/g, "");
}
function renderQuestion(q) {
const article = document.createElement("article");
article.className = "question";
article.id = "q-" + q.id;
article.dataset.qid = q.id;
const isMulti = q.type === "multi" || q.answers.length > 1;
const typeLabel = q.type === "mc" ? "Vælg" : (isMulti ? `${q.answers.length} pronominer` : "Skriv");
const typeClass = q.type === "multi" ? "multi" : "";
// Header
const header = document.createElement("div");
header.className = "q-header";
header.innerHTML = `
<span class="q-number">Q${q.id}</span>
<span class="q-type ${typeClass}">${typeLabel}</span>
<span class="q-status" data-qid="${q.id}"></span>
`;
article.appendChild(header);
// Sentence + interactive elements
const sentence = document.createElement("p");
sentence.className = "q-sentence";
if (q.type === "mc") {
// Single MC: render sentence with blank, then options below
const parts = q.sentence.split("___");
sentence.innerHTML = parts[0] + `<span class="mc-blank" data-blank="0">_____</span>` + parts[1];
article.appendChild(sentence);
const opts = document.createElement("div");
opts.className = "q-options";
q.options.forEach(o => {
const btn = document.createElement("button");
btn.className = "q-opt";
btn.dataset.value = o;
btn.textContent = o;
btn.addEventListener("click", () => handleMC(q.id, o, btn));
opts.appendChild(btn);
});
article.appendChild(opts);
} else {
// Input or multi-input: render sentence with inline inputs
const parts = q.sentence.split("___");
let html = "";
parts.forEach((part, i) => {
html += part;
if (i < parts.length - 1) {
html += `<input type="text" class="q-blank-input" data-qid="${q.id}" data-blank="${i}" autocomplete="off" autocapitalize="off" spellcheck="false">`;
}
});
sentence.innerHTML = html;
article.appendChild(sentence);
// Check button row
const row = document.createElement("div");
row.className = "q-check-row";
const btn = document.createElement("button");
btn.className = "q-check";
btn.textContent = "Tjek svar";
btn.dataset.qid = q.id;
btn.addEventListener("click", () => handleInput(q.id));
row.appendChild(btn);
if (q.answers.length > 1) {
const hint = document.createElement("span");
hint.className = "q-hint";
hint.textContent = `Udfyld alle ${q.answers.length} felter`;
row.appendChild(hint);
}
article.appendChild(row);
}
// Feedback area
const fb = document.createElement("div");
fb.className = "q-feedback";
fb.dataset.qid = q.id;
article.appendChild(fb);
return article;
}
function handleInput(qid) {
const q = QUESTIONS.find(x => x.id === qid);
if (state[qid]) return;
const inputs = document.querySelectorAll(`.q-blank-input[data-qid="${qid}"]`);
let allCorrect = true;
const userAnswers = [];
inputs.forEach((input, i) => {
const expected = q.answers[i];
const alts = (q.alt && Array.isArray(q.alt)) ? (typeof q.alt[i] === 'string' ? [q.alt[i]] : (q.alt[i] || [])) : [];
const userVal = input.value;
userAnswers.push(userVal);
const norm = normalize(userVal);
const isCorrect = norm === normalize(expected) || alts.some(a => norm === normalize(a));
input.disabled = true;
if (isCorrect) {
input.classList.add("right");
} else {
input.classList.add("wrong");
allCorrect = false;
// append correction
const corr = document.createElement("span");
corr.className = "q-blank-correction";
corr.textContent = `${expected}`;
input.insertAdjacentElement("afterend", corr);
}
});
const btn = document.querySelector(`.q-check[data-qid="${qid}"]`);
if (btn) btn.disabled = true;
markAnswered(qid, allCorrect, q);
}
function handleMC(qid, value, btn) {
const q = QUESTIONS.find(x => x.id === qid);
if (state[qid]) return;
const expected = q.answers[0];
const alts = q.alt || [];
const norm = normalize(value);
const isCorrect = norm === normalize(expected) || alts.some(a => norm === normalize(a));
btn.classList.add("picked", isCorrect ? "right" : "wrong");
document.querySelectorAll(`#q-${qid} .q-opt`).forEach(o => {
o.disabled = true;
if (o.dataset.value === expected) o.classList.add("show-correct");
});
markAnswered(qid, isCorrect, q);
}
function markAnswered(qid, isCorrect, q) {
state[qid] = { correct: isCorrect };
const article = document.getElementById("q-" + qid);
article.classList.add("answered", isCorrect ? "correct" : "incorrect");
const status = document.querySelector(`.q-status[data-qid="${qid}"]`);
status.textContent = isCorrect ? "✓ rigtigt" : "✗ forkert";
status.classList.add(isCorrect ? "right" : "wrong");
const fb = document.querySelector(`.q-feedback[data-qid="${qid}"]`);
const correctText = q.answers.join(", ");
const altText = q.alt ? ` (eller ${(Array.isArray(q.alt) ? q.alt.flat().filter(Boolean) : [q.alt]).join(", ")})` : "";
if (isCorrect) {
fb.innerHTML = `<span class="fb-icon">✓</span> Rigtigt!<span class="fb-explain">${q.explain || ""}</span>`;
fb.className = "q-feedback show correct";
} else {
fb.innerHTML = `<span class="fb-icon">✗</span> Det rigtige svar: <span class="fb-correct-answer">${correctText}</span>${altText}<span class="fb-explain">${q.explain || ""}</span>`;
fb.className = "q-feedback show incorrect";
}
answeredCount++;
if (isCorrect) correctCount++;
updateScore();
if (answeredCount === QUESTIONS.length) showSummary();
}
function updateScore() {
document.getElementById("score").textContent = correctCount;
document.getElementById("answered").textContent = answeredCount;
const pct = (answeredCount / QUESTIONS.length) * 100;
document.getElementById("progress-fill").style.width = pct + "%";
}
function showSummary() {
const card = document.getElementById("summary-card");
document.getElementById("sum-correct").textContent = correctCount;
document.getElementById("sum-total").textContent = QUESTIONS.length;
// Per-section breakdown
const bySection = {};
QUESTIONS.forEach(q => {
if (!bySection[q.section]) bySection[q.section] = { total: 0, correct: 0 };
bySection[q.section].total++;
if (state[q.id] && state[q.id].correct) bySection[q.section].correct++;
});
const breakdown = Object.keys(bySection).map(s =>
`<div style="display:flex;justify-content:space-between;padding:3px 0"><span>${SECTION_LABELS[s]}</span><span><b>${bySection[s].correct}</b>/${bySection[s].total}</span></div>`
).join("");
document.getElementById("sum-breakdown").innerHTML = breakdown;
card.classList.add("show");
}
function revealAll() {
QUESTIONS.forEach(q => {
if (state[q.id]) return;
const article = document.getElementById("q-" + q.id);
article.classList.add("revealed");
if (q.type === "mc") {
document.querySelectorAll(`#q-${q.id} .q-opt`).forEach(o => {
o.disabled = true;
if (o.dataset.value === q.answers[0]) o.classList.add("show-correct");
});
} else {
const inputs = document.querySelectorAll(`.q-blank-input[data-qid="${q.id}"]`);
inputs.forEach((input, i) => {
if (!input.value) input.value = q.answers[i];
input.disabled = true;
input.classList.add("right");
});
const btn = document.querySelector(`.q-check[data-qid="${q.id}"]`);
if (btn) btn.disabled = true;
}
const fb = document.querySelector(`.q-feedback[data-qid="${q.id}"]`);
const correctText = q.answers.join(", ");
fb.innerHTML = `<span class="fb-icon">→</span> Svar: <span class="fb-correct-answer">${correctText}</span><span class="fb-explain">${q.explain || ""}</span>`;
fb.className = "q-feedback show reveal";
});
}
function resetAll() {
if (!confirm("Nulstil alle svar?")) return;
answeredCount = 0;
correctCount = 0;
for (const k in state) delete state[k];
document.querySelectorAll(".question").forEach(a => {
a.classList.remove("answered", "correct", "incorrect", "revealed");
});
document.querySelectorAll(".q-blank-input").forEach(i => {
i.disabled = false; i.value = ""; i.classList.remove("right", "wrong");
});
document.querySelectorAll(".q-blank-correction").forEach(c => c.remove());
document.querySelectorAll(".q-check").forEach(b => b.disabled = false);
document.querySelectorAll(".q-opt").forEach(o => {
o.disabled = false;
o.classList.remove("picked", "right", "wrong", "show-correct");
});
document.querySelectorAll(".q-feedback").forEach(fb => {
fb.className = "q-feedback"; fb.innerHTML = "";
});
document.querySelectorAll(".q-status").forEach(s => {
s.textContent = ""; s.classList.remove("right", "wrong");
});
document.getElementById("summary-card").classList.remove("show");
updateScore();
window.scrollTo({ top: 0, behavior: "smooth" });
}
// Build all question DOM nodes inside their section containers
function build() {
QUESTIONS.forEach(q => {
const sec = document.querySelector(`#section-${q.section} .questions`);
if (sec) sec.appendChild(renderQuestion(q));
});
updateScore();
}
document.getElementById("btn-reveal").addEventListener("click", revealAll);
document.getElementById("btn-reset").addEventListener("click", resetAll);
document.getElementById("btn-print").addEventListener("click", () => window.print());
document.getElementById("close-summary").addEventListener("click", () =>
document.getElementById("summary-card").classList.remove("show")
);
// Enter key checks the current input's question
document.addEventListener("keydown", (e) => {
if (e.key === "Enter" && e.target.classList && e.target.classList.contains("q-blank-input")) {
e.preventDefault();
const qid = parseInt(e.target.dataset.qid, 10);
handleInput(qid);
}
});
build();
</script>
</body>
</html>