Prev / Next Buttons in den Tutorials
Die Prev/Next Navigation wird automatisch durch generate-navigation.js
basierend auf der manuellen Reihenfolge in manualOrder generiert.
Tutorial Navigation
Ähnlich in Blogs kannst du am Ende der Tutorials zum vorheringen oder zum nächsten Tutorial springen. Die Buttons werden automatisch generiert.
HTML-Struktur
Die Navigation wird am Ende des Tutorial-Contents eingefügt (vor dem schließenden </div> des Wrappers <div class="container">):
<!-- Prev/Next Navigation -->
<section class="tutorials-content">
<nav class="tutorial-nav">
<div class="tutorial-nav-prev">
<!-- Wird automatisch gefüllt -->
</div>
<div class="tutorial-nav-next">
<!-- Wird automatisch gefüllt -->
</div>
</nav>
</section>
</div> <!-- Ende Wrapper -->
Wie funktioniert's?
Das Script generate-navigation.js liest die Datei-Reihenfolge aus
manualOrder und generiert automatisch:
- Prev-Button: Link zum vorherigen Tutorial in der Reihenfolge
- Next-Button: Link zum nächsten Tutorial in der Reihenfolge
- Erstes Tutorial: Kein Prev-Button (leeres
div) - Letztes Tutorial: Kein Next-Button (leeres
div)
manualOrder Konfiguration
Die Reihenfolge wird in generate-navigation.js unter manualOrder definiert:
// ============================================================================
// Manuelle Sortierung für Tutorial-Seiten (Prev/Next Navigation)
// ============================================================================
const manualOrder = {
'tutorials/css/css-basics': [
'css-einbinden.html',
'css-color-units.html',
'css-variables.html',
'css-typografie.html',
'css-textstyling.html'
// Reihenfolge bestimmt Prev/Next Links
// Index 0 = Erstes Tutorial (kein Prev)
// Letzter Index = Letztes Tutorial (kein Next)
],
'tutorials/css/css-advanced': [
'css-positioning.html',
'css-z-index.html',
'css-transitions.html'
]
};
Neues Tutorial zur Reihenfolge hinzufügen
- Öffne
generate-navigation.js - Finde die passende Kategorie im
manualOrderObjekt - Füge den Dateinamen an der gewünschten Position ein:
'tutorials/css/css-basics': [
'css-einbinden.html',
'css-color-units.html',
'mein-neues-tutorial.html', // <-- Neues Tutorial an gewünschter Stelle einfügen
'css-variables.html',
'css-typografie.html'
]
Führe dann npm run generate aus, um die Navigation zu aktualisieren.
Button-Titel anpassen
Standardmäßig wird der Dateiname als Titel verwendet. Um einen individuellen Titel zu setzen,
füge ihn in customTitles hinzu:
// ============================================================================
// Custom Titles für einzelne Tutorial-Seiten (statt Dateinamen)
// ============================================================================
const customTitles = {
'tutorials/css/css-basics/css-einbinden.html': 'CSS einbinden',
'tutorials/css/css-advanced/css-z-index.html': 'Z-Index',
// Voller Pfad ab 'tutorials/' = Custom Title
};
Beispiel: Generierte Navigation
Wenn das Script läuft, wird aus der leeren Struktur eine vollständige Navigation:
<nav class="tutorial-nav">
<div class="tutorial-nav-prev">
<span class="tutorial-nav-label">← Vorheriges Tutorial</span>
<a href="/tutorials/css/css-basics/css-einbinden.html" class="tutorial-nav-link">CSS einbinden</a>
</div>
<div class="tutorial-nav-next">
<span class="tutorial-nav-label">Nächstes Tutorial →</span>
<a href="/tutorials/css/css-basics/css-variables.html" class="tutorial-nav-link">CSS Variables</a>
</div>
</nav>
Technische Details: Wie das Script arbeitet
Das Script durchläuft folgende Schritte:
- Datei erkennen: Liest die aktuelle Datei-URL
- Kategorie finden: Sucht passenden Eintrag in
manualOrder - Position bestimmen: Findet Index des aktuellen Tutorials im Array
- Prev/Next ermitteln: Index -1 = Prev, Index +1 = Next
- HTML generieren: Erstellt die Buttons mit Titeln aus
customTitles - DOM updaten: Ersetzt den Inhalt zwischen den
<nav>-Tags
JavaScript Code
// ============================================================================
// TUTORIAL NAVIGATION (PREV/NEXT)
// ============================================================================
/**
* Findet die vorherige und nächste Seite für Tutorial-Navigation
*/
function findPrevNext(currentFile) {
// Normalisiere den Pfad
currentFile = currentFile.replace(/\\/g, '/');
// Finde den passenden Ordner in manualOrder
for (const [folder, files] of Object.entries(manualOrder)) {
if (currentFile.includes(folder)) {
const fileName = path.basename(currentFile);
const index = files.indexOf(fileName);
if (index !== -1) {
const prev = index > 0 ? path.join(folder, files[index - 1]).replace(/\\/g, '/') : null;
const next = index < files.length - 1 ? path.join(folder, files[index + 1]).replace(/\\/g, '/') : null;
return { prev, next };
}
}
}
return { prev: null, next: null };
}
/**
* Generiert HTML für Tutorial Navigation
*/
function generateTutorialNav(currentFile, prev, next) {
let navHTML = '';
if (prev) {
const prevPath = '/' + prev; // Absoluter Pfad
const prevTitle = customTitles[prev] || fileNameToTitle(path.basename(prev));
navHTML += ` <div class="tutorial-nav-prev">
<span class="tutorial-nav-label">← Vorheriges Tutorial</span>
<a href="${prevPath}" class="tutorial-nav-link">${prevTitle}</a>
</div>\n`;
} else {
navHTML += ` <div class="tutorial-nav-prev"></div>\n`;
}
if (next) {
const nextPath = '/' + next; // Absoluter Pfad
const nextTitle = customTitles[next] || fileNameToTitle(path.basename(next));
navHTML += ` <div class="tutorial-nav-next">
<span class="tutorial-nav-label">Nächstes Tutorial →</span>
<a href="${nextPath}" class="tutorial-nav-link">${nextTitle}</a>
</div>`;
} else {
navHTML += ` <div class="tutorial-nav-next"></div>`;
}
return navHTML;
}
/**
* Aktualisiert die Tutorial Navigation in allen HTML-Dateien
*/
function updateTutorialNavigation(files) {
let updatedCount = 0;
files.forEach(file => {
const filePath = path.join(BASE_DIR, file);
let content = fs.readFileSync(filePath, 'utf8');
// Suche nach <nav class="tutorial-nav"></nav>
const navRegex = /<nav\s+class=["']tutorial-nav["'][^>]*>[\s\S]*?<\/nav>/;
if (navRegex.test(content)) {
const { prev, next } = findPrevNext(file);
if (prev || next) {
const newNav = `<nav class="tutorial-nav">\n${generateTutorialNav(file, prev, next)}\n </nav>`;
content = content.replace(navRegex, newNav);
fs.writeFileSync(filePath, content, 'utf8');
updatedCount++;
}
}
});
console.log(`✅ Tutorial Navigation aktualisiert in ${updatedCount} Dateien`);
}
Ausführen
Nach allen Änderungen ausführen:
npm run generate
Mehr aus DevPanicZone!
Tutorials werden geladen...