✍ ScriptieStijl

Steun

Schrijversprofiel

Stap 1 van 3 — Vul uw profiel in. U hoeft dit maar eenmaal te doen.

Het profiel combineert uw intake-antwoorden met metrieken uit uw tekstsamples — een lexicometrisch patroon van hoe ú schrijft.

Waartoe?

Inzicht in uw stijl én aansturing van de StijlSpiegel.

Wat kan het wel?

  • Uw stijl meten op zeven dimensies.
  • Afwijkingen tonen tussen zelfperceptie en meting.
  • Hergebruikt worden voor alle teksttypen.

Wat kan het niet?

  • Kwaliteit beoordelen — het meet hoe, niet hoe goed.
  • Persoonsnamen herkennen of vakinhoud interpreteren.
  • Bij minder dan 300 woorden zijn scores indicatief.
Privacymelding: De gegevens die u invult worden uitsluitend gebruikt om uw stijlprofiel te berekenen. Ze worden niet opgeslagen op een server en niet gedeeld met derden. Het stijlprofiel wordt alleen lokaal in uw browser bewaard totdat u de pagina sluit, tenzij u het zelf opslaat.
U hoeft deze vragenlijst maar eenmaal in te vullen. Sla het gegenereerde profiel op en hergebruik het voor alle toepassingen: scripties, e-mails, feedback en andere teksten. Laad een bestaand profiel via “Profiel laden” om direct door te gaan.

Kaart A — Demografisch profiel verplicht

Generatie beïnvloedt schrijfstijl: woordkeuze, zinslengte en register verschillen systematisch per cohort.
Geslacht correleert met stilistische keuzes in toon, perspectief en hedging (Pennebaker, LIWC).
Niet-moedertaalsprekers gebruiken soms afwijkende zinsstructuren. Het profiel houdt daar rekening mee.
Opleiding bepaalt het verwachte taalniveau en de referentienormen waartegen uw stijl wordt afgezet.
Uw vakgebied bepaalt welk jargon passend is en welke schrijfconventies in uw discipline gangbaar zijn.
Schrijfconventies verschillen per land en taalcultuur. Dit veld helpt bij de interpretatie van stilistische afwijkingen.

Kaart B — Intellectueel en communicatief profiel

Uw zelfbeeld als schrijver. De tool vergelijkt dit later met de gemeten metrieken — discrepanties zijn informatief.
Doelgroep stuurt woordkeuze, zinslengte en mate van jargon. Dit veld kalibreert de referentienormen.
Schrijven in een tweede taal beïnvloedt lexicale diversiteit en zinsstructuur. Dat is geen zwakte — het is context.
Zinslengte is de sterkste voorspeller van schrijfstijl (Mosteller & Wallace, 1963). Uw inschatting wordt vergeleken met de meting.
Altijd kort Altijd lang 3
Jargongebruik bepaalt de lexicale dichtheid. De StijlSpiegel gebruikt dit om jargon-instructies te formuleren.
Zelfperceptie correleert matig met gemeten MATTR. Afwijkingen tussen zelfbeeld en meting zijn een nuttig inzicht.
Beperkt Zeer uitgebreid 3
Ik-gebruik is meetbaar en stijlbepalend. Academische teksten vermijden de ik-vorm; coaching en feedback omarmen haar juist.

Kaart C — Schrijfervaring

Schrijfervaring correleert met woordenschatrijkdom en zinsbeheersing. Context voor de interpretatie van uw profiel.
Verschillende teksttypen hebben verschillende stijlconventies. Rapporten vragen andere metrieken dan blogs of e-mails.
Tekstlengte beïnvloedt de betrouwbaarheid van metrieken als MATTR. Bij kortere teksten zijn scores indicatiever.

Tekstsamples

Stap 2 van 3 — Voer uw tekst in voor analyse.

Privacy: Uw tekst wordt uitsluitend verwerkt in uw browser. Er worden geen gegevens naar een server verstuurd. Veelvoorkomende persoonsgevoelige patronen (e-mailadressen, BSN, IBAN, postcodes, telefoonnummers, geboortedatums) worden automatisch vervangen. Persoonsnamen worden niet herkend — verwijder deze zelf indien gewenst.
📝 Plak tekst
Woorden: 0
📄 PDF-upload
Klik of sleep PDF-bestanden

Maximaal 5 bestanden

Woorden (PDF): 0
Totaal: 0 woorden. Minimum 300 (aanbevolen: 500+).

Stijlprofiel

Stap 3 van 3 — Uw lexicometrisch stijlprofiel.

JSON-profiel
{}
Referentiewaarden gebaseerd op SoNaR-rapporten (Oostdijk, 2013). Kalibratie op HBO-scriptiecorpus volgt in v2.0. Flesch-Douma is een benadering (heuristische lettergreeptelling).

ScriptieStijl is gratis. Een vrijwillige bijdrage helpt de ontwikkeling voort te zetten.

☕ Steun via Ko-fi

Tekst analyseren...

✦ Vergelijking — volledig scherm

`; } // ── PROFIELOPSLAG ──────────────────────────────────────────────────────── async function saveProfileToDirectory() { if (!APP.profile) return; if (!window.showDirectoryPicker) { // Fallback: gewone download (werkt in alle browsers) downloadJSON(); showToast('Maptoegang niet beschikbaar in deze browser — profiel gedownload als bestand.', 'success'); return; } try { if (!APP.dirHandle) { APP.dirHandle = await window.showDirectoryPicker({ id:'scriptiestijl-profielen', mode:'readwrite', startIn:'documents' }); } const ts = new Date().toISOString().slice(0,10); const veld = APP.profile.intake.field_of_study || 'profiel'; const naam = `ScriptieStijl_${veld}_${ts}.json`.replace(/[\s/\\:*?"<>|]/g,'_'); const fh = await APP.dirHandle.getFileHandle(naam, { create: true }); const w = await fh.createWritable(); await w.write(JSON.stringify(APP.profile, null, 2)); await w.close(); showToast('Profiel opgeslagen: ' + naam); } catch(e) { if (e.name !== 'AbortError') showToast('Opslaan mislukt: ' + e.message, 'error'); } } async function loadProfileFromFile() { // Fallback voor browsers zonder File System Access API (o.a. Firefox) if (!window.showOpenFilePicker) { document.getElementById('profile-file-input').value = ''; document.getElementById('profile-file-input').click(); return; } try { const [fh] = await window.showOpenFilePicker({ types: [{ description: 'ScriptieStijl profiel', accept: { 'application/json': ['.json'] } }], startIn: 'documents', }); const file = await fh.getFile(); const text = await file.text(); const profile = JSON.parse(text); validateProfile(profile); APP.profile = profile; renderResults(profile); unlockSpiegelTab(); goToScreen(3); showToast('Profiel geladen: ' + file.name); } catch(e) { if (e.name !== 'AbortError') showToast('Laden mislukt: ' + e.message, 'error'); } } function handleProfileFileInput(input) { const file = input.files[0]; if (!file) return; const reader = new FileReader(); reader.onload = function(e) { try { const profile = JSON.parse(e.target.result); validateProfile(profile); APP.profile = profile; renderResults(profile); goToScreen(3); showToast('Profiel geladen: ' + file.name); } catch(err) { showToast('Laden mislukt: ' + err.message, 'error'); } }; reader.onerror = () => showToast('Bestand lezen mislukt.', 'error'); reader.readAsText(file); } async function showProfilesList() { if (!APP.dirHandle) { showModal('

Kies eerst een opslagmap via "Opslaan in map" om uw profielen te bekijken. Of laad een profiel via "Profiel laden" op scherm 1.

', 'Mijn profielen'); return; } try { const profiles = await listProfilesInDirectory(); if (!profiles.length) { showModal('

Geen profielen gevonden in de geselecteerde map.

', 'Mijn profielen'); return; } let html = '

Klik op een profiel om het te laden.

'; profiles.forEach(p => { html += `
${p.field || 'Onbekend vakgebied'}
${new Date(p.date).toLocaleDateString('nl-NL')} · v${p.version} · ${p.name}
`; }); showModal(html, 'Mijn profielen (' + profiles.length + ')'); } catch(e) { showToast('Fout bij laden lijst: ' + e.message, 'error'); } } async function loadProfileByName(name) { try { const fh = await APP.dirHandle.getFileHandle(name); const file = await fh.getFile(); const text = await file.text(); const profile = JSON.parse(text); validateProfile(profile); APP.profile = profile; renderResults(profile); closeModal(); showToast('Profiel geladen: ' + name); } catch(e) { showToast('Laden mislukt: ' + e.message, 'error'); } } async function listProfilesInDirectory() { if (!APP.dirHandle) return []; const profiles = []; for await (const [name, handle] of APP.dirHandle.entries()) { if (handle.kind === 'file' && name.endsWith('.json')) { try { const file = await handle.getFile(); const text = await file.text(); const p = JSON.parse(text); if (p.meta?.tool === 'ScriptieStijl') profiles.push({ name, date: p.meta.generated_at, field: p.intake.field_of_study, version: p.meta.version }); } catch {} } } return profiles.sort((a,b) => b.date.localeCompare(a.date)); } // ══ KETENCONTRACT ════════════════════════════════════════════════════════ // ScriptieStijl — Schakel 1 in de gereedschapsketen // Input: intake + tekstsamples // Output: JSON-stijlprofiel (schema_version 1.0) // Verplichte meta-velden: tool, version, schema_version, generated_at, sample_word_count // Verplichte metrics-blokken: sentence_structure, lexical_diversity, rhythm, // function_words, readability // // Downstream tools kopiëren validateProfile() als startpunt. // function validateProfile(profile) { if (profile?.meta?.tool !== 'ScriptieStijl') throw new Error('Geen geldig ScriptieStijl-profiel.'); const v = profile.meta.schema_version?.split('.').map(Number); if (v && v[0] > 1) throw new Error('Profiel heeft een nieuwere schema-versie dan ondersteund.'); const req = ['sentence_structure','lexical_diversity','rhythm','function_words','readability']; for (const k of req) if (!profile.metrics?.[k]) throw new Error('Ontbrekend metriekblok: ' + k); return true; } // ══ EINDE KETENCONTRACT ═══════════════════════════════════════════════════ // ── SESSION RESET ──────────────────────────────────────────────────────── function clearSessionData() { APP.intake = {}; APP.rawText = ''; APP.metrics = null; APP.inputCurated = false; // APP.profile en APP.dirHandle bewaard } function resetApp() { clearSessionData(); APP.profile = null; pdfTextExtracted = ''; // Formulier resetten document.getElementById('d1').value = ''; document.querySelectorAll('input[name="d2"]').forEach(r => r.checked = false); document.getElementById('d3').value = ''; document.getElementById('d4').value = ''; document.getElementById('d5').value = ''; document.getElementById('d6').value = ''; document.querySelectorAll('input[name="i1"]').forEach(c => c.checked = false); document.getElementById('i2').value = ''; document.getElementById('i3').value = ''; document.getElementById('i4').value = 3; document.getElementById('i4-val').textContent = 3; document.querySelectorAll('input[name="i5"]').forEach(r => r.checked = false); document.getElementById('i6').value = 3; document.getElementById('i6-val').textContent = 3; document.querySelectorAll('input[name="i7"]').forEach(r => r.checked = false); document.getElementById('e1').value = ''; document.querySelectorAll('input[name="e2"]').forEach(c => c.checked = false); document.getElementById('e3').value = ''; // Tekstvelden document.getElementById('text-paste').value = ''; document.getElementById('wc-paste').textContent = '0'; document.getElementById('wc-pdf').textContent = '0'; document.getElementById('wc-total').textContent = '0'; document.getElementById('pdf-list').innerHTML = ''; document.getElementById('pdf-list').style.display = 'none'; document.getElementById('pdf-status').textContent = ''; document.getElementById('word-warning').style.display = 'none'; document.getElementById('btn-naar-2').disabled = true; goToScreen(1); showToast('Sessie gereset. Profiel gewist.'); } function showProfileSummary(profile) { const date = profile.meta.generated_at.slice(0,10); const words = profile.meta.sample_word_count; const field = profile.intake.field_of_study || 'niet opgegeven'; return `Profiel: ${field} | Aangemaakt: ${date} | Tekstbasis: ${words} woorden`; } // ── GEDEELDE UI HELPERS ────────────────────────────────────────────────── function showToast(message, type='success') { const t = document.createElement('div'); t.className = 'toast toast-' + type; t.textContent = message; document.body.appendChild(t); setTimeout(() => t.remove(), 3500); } function showModal(content, title='ScriptieStijl') { const m = document.getElementById('global-modal'); document.getElementById('modal-title').textContent = title; document.getElementById('modal-body').innerHTML = content; m.classList.add('open'); } function closeModal() { document.getElementById('global-modal').classList.remove('open'); } // ── OVER POPUP ─────────────────────────────────────────────────────────── function openOverPopup() { const m = document.getElementById('over-modal'); m.style.display = 'flex'; } function switchTab(n) { document.querySelectorAll('.tab-btn').forEach((b,i) => b.classList.toggle('active', i === n)); document.querySelectorAll('.tab-panel').forEach((p,i) => p.classList.toggle('active', i === n)); } // placeholder betalingslogica v2.5 function showUpgradeModal() { showModal('ScriptieStijl Pro geeft toegang tot alle functies. Beschikbaar vanaf versie 2.5. Houd ko-fi.com/scriptiecheck in de gaten voor aankondigingen.', 'Pro-upgrade'); } // TODO v2.0: spellingcorrectie via browser-native spellcheck API of lichtgewicht NL-woordenlijst (OpenTaal) // TODO v2.0: curateSpeechTranscript() voor speech-to-text transcripties // function curateSpeechTranscript(transcript, maxWords = 600) { // transcript = transcript.replace(/\b(uhm|uh|eh|hmm)\b/gi, '').replace(/\s{2,}/g, ' ').trim(); // return curateInput(transcript, maxWords); // } // Privacytabel (documentatie voor toekomstige ontwikkelaars): // | Gegeven | Opgeslagen? | Waar? | Hoe lang? | // | Intake-antwoorden | Alleen geheugen | APP.intake object | Tot reset/pagina sluiten| // | Tekstsamples | Alleen geheugen | APP.rawText string | Tot reset/pagina sluiten| // | JSON-profiel | Op verzoek | Gekozen map | Tot gebruiker verwijdert| // | PII-patronen | Nooit | Verwijderd vóór opslag | N.v.t. | // | API-aanroepen v1.5 | Niet door tool | CF Worker logs | CF Workers policy | // ══ STIJLSPIEGEL BRIDGE ═══════════════════════════════════════ function openStijlSpiegel(){ if(!APP.profile){showToast('Maak eerst een stijlprofiel aan.','error');return;} ss_APP.profiel=APP.profile; ss_SLIDERS.forEach(function(s){var v=s.profiel(APP.profile);ss_APP.profielWaarden[s.id]=v;ss_APP.sliderWaarden[s.id]=v;}); ss_TOON_SLIDERS.forEach(function(s){ss_APP.toonWaarden[s.id]=3;}); ss_APP_MODE='profiel'; var mp=document.getElementById('ss-mode-profiel');if(mp)mp.classList.add('actief'); var md=document.getElementById('ss-mode-doel');if(md)md.classList.remove('actief'); var dz=document.getElementById('ss-doel-zone');if(dz)dz.classList.remove('visible'); var iz=document.getElementById('ss-instellingen-zone');if(iz)iz.classList.add('visible'); ss_bouwPresets();ss_bouwSliders();ss_bouwToonSliders();ss_updatePreview();ss_checkKnop(); var pb=document.getElementById('ss-profile-badge-bar'); if(pb&&APP.profile){var m=APP.profile.metrics,i=APP.profile.intake; pb.innerHTML=''+(i.education_level||'?')+(i.field_of_study?' — '+i.field_of_study:'')+'<\/strong>' +' · FD '+m.readability.flesch_douma.toFixed(0) +' · Zin '+m.sentence_structure.avg_sentence_length.toFixed(1)+'w' +' · MATTR '+m.lexical_diversity.mattr_50;} goToScreen(4); } function openStijlSpiegelTab(){if(!APP.profile){showToast('Maak eerst een stijlprofiel aan.','error');return;}openStijlSpiegel();} function unlockSpiegelTab(){var t=document.getElementById('step-4');if(t){t.classList.add('unlocked');t.removeAttribute('title');}} function ss_toast(msg,type){showToast(msg,type||'success');}

✦ StijlSpiegel

Pas tekst aan op basis van uw stijlprofiel

Gebruik: Laad uw profiel → kies een modus → plak uw tekst → aanpassen.

Doelcontext
Schrijfstijl
Toon & houding

Tekst aanpassen

Woorden: 0
⚠ De StijlSpiegel werkt het beste met onopgemaakte tekst — geen koppen, opsommingen of vetgedrukte woorden.
Tekst aanpassen aan uw doelstijl...
1 / 1
📄 Originele tekst
✦ Aangepaste tekst

Lichtblauwe markering = gewijzigd of nieuw woord (benadering).