Historische Entwicklung des Web

Entwicklung in drei größeren Stufen, die Vorlesung folgt dieser Entwicklung
  1. Präsentation von Informationen
  2. Zusätzlich: Bearbeitung von Informationen
  3. Komplexe Applikationen die ausschließlich im Browser dargestellt werden
Jede dieser Varianten ist auch heute noch relevant
  • Technische Dokumentation (Stufe 1)
  • Werbe- / Informationsseiten zu bestimmten Produkten (Stufe 1)
  • Abstimmung und Terminkoordination (Stufe 2)
  • Kommentarsysteme (Stufe 2)
  • Soziale Netzwerke (Stufe 3)
  • Textverarbeitung (Stufe 3)

Das “ursprüngliche” Web

Zeitlich: 1989 - 2001
  • 1989: Erfindung des World Wide Web (WWW) am CERN durch Tim Berners Lee (HTTP, HTML, Webserver, Browser, …)
  • 1995: Internet Explorer und Netscape Navigator für Windows 95
  • 2001: Gründung der Wikipedia
Dominierendes Motiv: Bereitstellung von Dokumenten
Sinngemäß eine Alternative zu Anschlägen am schwarzen Brett oder zu Büchern
Abstrakt: Zugriff auf Informationsressourcen
Hinterlegt als statische Dateien auf Webservern
Menschen als primäre Konsumenten
Verwendung eines “User Agents” (Webbrowser)
Eindeutige Identifikation von Ressourcen über Namen und Adressen
Konzept der Hyperlinks
Formatierung von Inhalten mit HTML
Textauszeichnungssprache zur Beschreibung von statischen Webseiten

Das “Web 2.0”

Zeitlich: 2001 - 2009
  • 2001: Gründung der Wikipedia
  • 2006: Standarisierung des XMLHttpRequest für AJAX
  • 2009: Initiale Veröffentlichung von Angular JS
Anlegen von Informationsresourcen
Benutzer können das Internet direkt über Ihren Browser erweitern (Wikipedia, Blogs, …)
Typisch: Serverseitige Erstellung von dynamischen Webseiten
PHP, Perl, Java, …
Zunehmend: Maschine-Maschine Kommunikation über das Web
Konzept der “Webservices” welche einfach nur Rohdaten bereitstellen, keine Dokumente
Möglich: Clientseitige Dynamik mit AJAX
Interaktion im Client (Knopf drücken, Link folgen, …) lädt die Seite nicht notwendigerweise neu

Single Page Applications

Zeitlich: 2009 - Heute
  • 2009: Initiale Veröffentlichung von Angular JS
  • 2009: Google bezeichnet die ursprüngliche Version von “Google Docs” als stabil
  • 2011: Facebook führt den “Messenger”, dieser läuft vollständig eingebettet in den “normalen” Webauftritt
Wesentliches Merkmal: Darstellung der Seite findet ausschließlich im Browser statt
Server liefert aus:
  • Programm zur Steuerung der Darstellung
  • Darzustellende Daten
Heute: Entwicklung solcher Browser-Anwendungen als Alternative zu nativen Programmen
Entwicklung nicht komplexer als z.B. mit JavaFX, Windows Forms, WPF oder Qt

Technische Grundlagen

Grundsätzlich: Alle clientseitigen Aspekte einer Web-Anwendung / einer Webseite lassen sich im Browser untersuchen
  • Jeder Browser bietet Entwicklerwerkzeuge
  • Jedoch keine Zugriff auf den Quelltext des Servers
HTTP: Hypertext Transfer Protocol
Zum Austausch der Daten zwischen Server & Client
HTML: Hypertext Markup Language
  • Zur Auszeichnung der Dokumente im Browser
  • Gibt den Inhalten (Texten) eine Struktur
CSS: Cascading Stylesheets
Zur Anpassung der Darstellung im Browser
JavaScript
  • Auf dem Server: Erzeugen von HTML-Seiten
  • Auf dem Client: Reaktion auf Ereignisse, Änderungen an der Dokumentstruktur

Webserver

Ein beliebiger Rechner mit Internetanschluss
Dezidierte IP von Vorteil, aber nicht zwingend nötig
Typisch: Verwendung einer Server-Software, niemand sollte HTTP-Server von Hand schreiben

Browser / Client / User Agent

Typisch: Verwendung einer Browser-Software, niemand sollte HTML-Darstellung von Hand versuchen
  • Firefox
  • Chrome
  • Edge
  • Internet Explorer
  • Safari

Während der SchülerUni

Nutzung eines speziellen Webservers: fhw-web
Technisch gesehen eine node.js-Anwendung mit eingebauten Templating-Funktionen
Vorteil: Konzentration auf genau jene Aspekte, die wir in der Vorlesung behandeln
  • Programmierung mit SQL und Templating-Anweisungen
  • Installation ist im Vergleich zu “richtiger” Serversoftware recht einfach
Nachteil: Spezialsoftware ohne nennenswerte Verbreitung
  • Dokumentation vergleichsweise spärlich
  • Hosting erfordert einen Anbieter mit node.js-Unterstützung

Textauszeichnungssprachen

Trennung von Inhalt und Darstellung
Unterscheidung von Inhalt einerseits und Auszeichnung des Inhalts durch Markup (in Form von Tags) andererseits
Darstellung
Interpretation der Auszeichnung und Umwandlung in eine (angemessene) Darstellung auf der Client-Seite
Häufig genutztes Strukturierungselement: Tags
Zur Abgrenzung von Elementen
Nicht Domänenspezifisch
Markierte Strukturen unabhängig von Semantik des Dokumentinhaltes (Gesetzestext, Drehbuch, Kommentar, Roman, …)
Beziehungen zwischen Inhalten
Zusätzlich Markierung von Verweisen auf andere (HTML-)Dokumente

Ein zu beschreibender Text

  • intro_html/ow-text.html | Validieren
    GOTY-Nominees
    
    Overwatch is a team-based multiplayer FPS video game developed
    and published by Blizzard Entertainment. It was released in the
    end of May 2016 for Microsoft Windows, PlayStation 4 & Xbox One.
    

Beispiel: LaTeX

  • basics/markup.tex
    \documentclass{article}
    
    \begin{document}
    \section{Overwatch}
    \label{game:overwatch}
    
    Overwatch ist ein Mehrspieler-FPS\footnote{First Person Shooter}
    des US-amerikanischen Spielentwicklers Blizzard Entertainment.
    Das Spielgeschehen ist nach Warcraft, StarCraft und Diablo im
    insgesamt vierten Phantasieuniversum Blizzards angesiedelt.
    Overwatch erschien im Mai 2016 f{\"u}r Microsoft Windows, PlayStation
    4 und Xbox One. Seither werden in regelm{\"a}{\ss}igen Abst{\"a}nden
    Patches\footnote{Fehlerbereinigungen} und Updates ver\-{\"o}ffent\-licht. 
    
    \textbf{Siehe auch}: Kapitel \ref{game:paladins} zu einem Spiel
    das ganz und gar nicht Inhalte direkt aus Overwatch übernommen hat.
    
    \newpage
    
    \section{Paladins}
    \label{game:paladins}
    
    Ganz und gar nicht Overwatch. \cite{videogamedunkey}
    
    \end{document}
    
\section
bezeichnet einen Abschnitt, eine Nummerierung wird ggfs. automatisch erzeugt
\footnote
Setzt den eingeklammerten Text als Fußnote
\cite
Markiert ein Zitat und setzt ggfs. einen Link auf die Quelle
\ref
Verweist auf eine andere Stelle

Beispiel: Markdown

  • basics/markup.md
    # Overwatch
    
    Overwatch ist ein Mehrspieler-FPS des US-amerikanischen
    Spielentwicklers Blizzard Entertainment. Das Spielgeschehen ist
    nach Warcraft, StarCraft und Diablo im insgesamt vierten
    Phantasieuniversum Blizzards angesiedelt. Overwatch erschien
    im Mai 2016 für 
    
    * Microsoft Windows
    * PlayStation 4
    * Xbox One.
    
    Seither werden in regelmäßigen Abständen Fehlerbereinigungen
    (englisch Patches) und Updates veröffentlicht. 
    
    **Siehe auch**: [Kapitel 2](paladins.html) zu einem Spiel
    das ganz und gar nicht Inhalte direkt aus Overwatch übernommen hat.
Überschriften
Werden mit einem #-Symbol eingeleitet. Die Anzahl der Wiederholungen steht für die Art der Überschrift.
Links
Werden in Klammerpaaren notiert: [Text](Ziel)
Aufzählungen
Werden mit einem * eingeleitet

Beispiel: HTML

  • intro_html/ow-html.html | Validieren
    <h1><abbr title="Game of the Year">GOTY</abbr>-Nominees</h1>
    
    <p>
      Overwatch is a team-based multiplayer <abbr title="First Person Shooter">
      FPS</abbr> video game developed and published by
      <a href="http://www.blizzard.com"> Blizzard Entertainment.</a> It was
      released in <time datetime="2001-05-15T19:00">the end of May 2016</time>
      for Microsoft Windows, PlayStation 4 &amp; Xbox One.
    </p>
    

Verwendung von HTML

Historisch: HTML als Sprache zur Beschreibung von Dokumenten
Alternative zu gedruckten Büchern, PDF-Dokumenten, Libre Office, Microsoft Word …
Später: Automatisch generierte und vereinzelt dynamische Inhalte
Forensysteme, Blogs, Kommentarfunktionen, …
Heute: Komplexe Programme im Browser

HTML-Syntax

Notation von “Elementen” in spitzen Klammern
Haben einen Namen und kennzeichnen einen Bereich, Schachtelung von Elementen ist möglich
  • Öffnendes (<element>) und schließendes (</element>) Tag
  • Einige Elemente sind leer und haben kein schließendes Tag
Elemente können mit “Attributen” genauer beschrieben werden
Werden als Name-Wert-Paare im öffnenden Tag notiert
  • Der Name ist eine einfache Zeichenkette ohne Leerzeichen
  • Der Wert wird in Anführungszeichen notiert und darf Leerzeichen enthalten
Mit “Entitäten” können Syntax-Bestandteile im Text dargestellt werden
Werden von einem “kaufmännischen und” (&) eingeleitet und mit einem Semikolon (;) beendet.
  • &lt; erzeugt “<”
  • &gt; erzeugt “>”
  • &amp; erzeugt “&”
  • &quot; erzeugt "

Fehlende Informationen

Art des Dokuments
Woher weiß ein Anzeigeprogramm um welche Auszeichnungssprache es sich handelt?
Titel
Welcher Titel soll im Browser für das Fenster / den Tab angezeigt werden?
Textkodierung
Wie sollen die Bytes in dem Dokument interpretiert werden?

Ein vollständiges Dokument

Zeile 1
Deklaration des Dokumenttyps
Zeile 3 - 6
head-Knoten für Metadaten
Zeile 4
Angabe des Encodings
Zeile 5
Titel des Dokuments
Zeile 7 - 15
body-Knoten als Wurzel für Inhalt des Dokuments
  • intro_html/snippet.html | Validieren
    <!DOCTYPE html>
    <html lang="de">
      <head>
        <meta charset="UTF-8">
        <title>HTML-Dökümént</title>
      </head>
      <body>
        <h1>👋 Überschrift 😎</h1>
        <p>💛💚 Absatz 💙💜</p>
      </body>
    </html>
    

Wichtige HTML-Elemente

Grundlegende Auswahl an semantischen Elementen
  • Geben an welche Bedeutung gewisse Texte haben
  • Große Nähe zu Textverarbeitungssystemen: Überschriften, Listen, Tabellen, …

Überschriften

HTML erlaubt sechs Ebenen für Überschriften
Assistenzsysteme und Crawler navigieren häufig anhand dieser Angaben
Keine automatische Nummerierung
Anders als in z.B. Textverarbeitungssystemen
  • intro_html/headings.html | Validieren
    <h1>Oberste Ebene</h1>
    <h2>Zweite Ebene</h2>
    <h3>Dritte Ebene</h3>
    <h4>Vierte Ebene</h4>
    <h5>Fünfte Ebene</h5>
    <h6>Sechste Ebene</h6>
    
    
    
    
    
    
    

Absätze & Texthervorhebungen

Absätze werden mit dem p-Element (paragraph) ausgezeichnet
Umbrüche erfolgen anhand des verfügbaren Platzes im Browser
Betonungen mit em-Elementen (emphasis)
Wird typischerweise kursiv dargestellt, meint aber eine Betonung
Wörtliche Rede oder kurze Zitate mit q-Elementen (quote)
Typografische Anführungszeichen werden ergänzt
Hervorhebungen mit mark
Sinnbildlicher Textmarker
  • intro_html/paragraph.html | Validieren
    <p>
      Gorrister went white. It was almost as though he had seen a voodoo
      icon, and was afraid of the future. <q>Oh, God,</q> he mumbled,
      and walked away. The three of us followed him after a time, and found
      him sitting with his back to one of the smaller chittering banks,
      his head in his hands. Ellen knelt down beside him and stroked his
      hair. He didn't move, but his voice came out of his covered face
      quite clearly. <q><em>Why</em> doesn't it just do us in and get it
      over with? Christ, I don't know how much longer I can go on like
      this.</q>
    </p>
    
    <p>
      It was our <mark>one hundred and ninth year</mark> in the computer.
    </p>
    

Listen

Sortierte und unsortierte Listen
Unterscheidung durch übergeordnetes Element
Elemente der Liste
Werden mit einem li-Element beschrieben
  • intro_html/lists.html | Validieren
    <ul>
      <li>Route 66</li>
      <li>Numbani</li>
      <li>Eichenwalde</li>
    </ul>
    <ol>
      <li>Mei</li>
      <li>Lucio</li>
      <li>Reinhardt</li>
    </ol>
    

Geschachtelte Listen

Regel: <ul> und <ol>-Elemente dürfen nur <li>-Elemente enthalten
Beliebter Fehler bei Schachtelung

Beispiel für falsche Schachtelung

Listen mit formatierten Elementen

  • intro_html/lists-complex.html | Validieren
    <ul>
      <li>
        <h1>Eichenwalde</h1>
        <p>
          Eichenwalde is located in the middle of the Black
          Forest. It consists of the following checkpoints:
        </p>
        <ol>
          <li>Battering Ram</li>
          <li>Castle Door</li>
          <li>Throne Room</li>
        </ol>
      </li>
    </ul>
    

Kommentare

Syntax
Verwendung <!-- und --> um den kommentierten Bereich zu markieren.
Mehrzeiliger Kommentar
Bestehende HTML-Elemente können auskommentiert werden
Kommentare sind in der Quelltext-Ansicht zu sehen
Es gibt (normalerweise) keinen Compiler, der die Kommentare entfernen würde
  • intro_html/comments.html | Validieren
    <ul>
        <li>Offense</li>
        <ul>
            <!-- Für Kiddies -->
            <li>Genji</li>
            <li>McCree</li>
            <li>Reaper</li>
            <!-- Ganz OK -->
            <li>Pharah</li>
            <li>Tracer</li>
            <li>Soldier: 76</li>
            <!-- <li>Eike Harms</li> -->
        </ul>
    </ul>
    

Beschreibungslisten

Liste von zu beschreibenden Begriffen (<dt>, “term”) mit anschließender Erläuterung (<dd>)
  • Eine Erläuterung kann auch mehrere Begriffe erklären
  • Ein Begriff kann auch mehrere Erläuterungen haben
  • intro_html/definitionlists.html | Validieren
    <dl>
      <dt>Carrot Ironfoundersson</dt>
      <dd>Adopted dwarf, member of the nightwatch</dd>
      
      <dt>Bill Door</dt>
      <dt>Beau Nidle</dt>
      <dt>Mr Scrub</dt>
      <dd>Death (literally)</dd>
    
      <dt>GNU</dt>
      <dd>Virus-like signal on the clacks</dd>
      <dd>Project that aims to free software</dd>
      <dd>Asteroid 9965 is named GNU</dd>
    </dl>
    

Tabellen

Kein Layout-Element, sondern zur Anzeige von tabellarischen Daten!
Faustregel: Wenn man ausgehend von einer Zelle die Spalten- und Zeilenbeschriftungen nicht braucht ist es keine Tabelle.
  • Beispiel Stundenplan: Zeilen- und Spaltenüberschriften geben Wochentag und Zeitraum an.
Notwendige und mögliche HTML-Elemente
  • Optional: Ein <caption>-Element als Titel. Sollte als erstes oder letztes Kind genutzt werden, so dass es über oder unter der eigentlichen Tabelle steht.
  • Struktur: <thead>- und/oder <tfoot>-Elemente für Kopf- oder Fußzeilen.
  • Struktur: Eines oder mehrere <tbody>-Elemente, in denen die eigentlichen Tabellenzellen definiert sind.
  • Eines oder mehrere <tr>-Elemente (für Zeilen) mit jeweils der gleichen Anzahl von <td>-Elementen (für Spalten).
  • Die Tabellenzellen ergeben sich dann aus dem Inhalt der <td>-Elemente.

Beispieltabelle

  • intro_html/tables-intro.html | Validieren
    <table>
      <caption>Gebäudeliste</caption>
      <thead>
        <tr>
          <th>Name</th>
          <th>Kosten</th>
          <th>Größe</th>
        </tr>
      </thead>
      <tbody>
        <tr>
          <td>Polizei</td><td>500</td><td>9</td>
        </tr>
        <tr>
          <td>Feuerwehr</td><td>500</td><td>9</td>
        </tr>
        <tr>
          <td>Stadion</td><td>3000</td><td>16</td>
        </tr>
        <tr>
          <td>Hafen</td><td>5000</td><td>16</td>
        </tr>
      </tbody>
    </table>
    

Bilder

Bilder sind “leere” Elemente
Haben also niemals Kinder oder ein schließendes End-Element
Angabe der Bild-URL im Attribut src
Sollte auf ein vom Browser interpretierbares Bildformat zeigen
Angabe eines alternativen Textes im Attribut alt
Wird häufig ignoriert, das widerspricht aber dem Standard
Optional: Angabe von width und height
  • Bei nur einer Angabe wird proportional skaliert, sonst werden die Maße übernommen
  • Angabe der Dimensionen kann Ladezeiten reduzieren
  • Bilder werden unabhängig von diesen Angaben in der vollständigen Größe übertragen

Skalierung von Vektorgrafiken

Wenn aufgrund des Bildmaterials möglich: Skalierbare Vektorgrafiken (SVG) benutzen
Optimale Darstellung unter (fast) allen Auflösungen
  • intro_html/svg.html | Validieren
    <img height="128px" src="/assets/icons/squirrel.svg">
    <img height="128px" src="/assets/icons/squirrel.png">
    
    <img height="128px" src="/assets/icons/spider-web.svg">
    <img height="128px" src="/assets/icons/spider-web.png">
    
    <p>
      Diese Grafiken stammen von
      <a href="http://game-icons.net/">game-icons.net</a>
    </p>
    
Erlauben die Navigation zu anderen Dokumenten anhand einer URL
Laden die Seite dabei im Normalfall komplett neu
  • intro_html/links-intro-1.html | Validieren
    <h1>Links Intro 1</h1>
    
    <a href="links-intro-2.html">Relativ zu Intro 2</a>
    <br>
    <a href="/snippets/intro_html/links-intro-2.html">
      Mit absolutem Pfad zu Intro 2
    </a>
    <br>
    <a href="https://webanwendungen.fh-wedel.de/snippets/intro_html/links-intro-1.html">
      Mit absoluter URL zu Intro 2
    </a>
    

Fortschrittsbalken

Wie auf dem Desktop: Zeigt den Grad der Erfüllung einer bestimmten Aufgabe an
Typischerweise animiert, geht aber auch ohne
Passt sich dem Stil des Desktop Managers an
Sieht unter Windows 7 also anders aus als unter MacOS, Linux oder auch anderen Windows-Versionen
  • intro_html/progress.html | Validieren
    <progress value="70" max="100">70%</progress>
    <progress>Windows File Transfer</progress>
    <progress value="9005" max="9000"></progress>
    

Verbergen von Details

Manche Informationen sind nicht für alle Anwender relevant
Anzeige nur auf Aufforderung
  • intro_html/details.html | Validieren
    <details>
      <summary>System Requirements</summary>
      <p>Requires a computer running an operating system. The computer
        must have some memory and ideally some kind of long-term storage.
        An input device as well as some form of output device is
        recommended.</p>
    </details>

Veraltete Elemente

Diese Elemente dürfen im Rahmen der Klausur oder der Übung nicht verwendet werden
In der Praxis werden Sie einigen davon aber begegnen …
Explizit verboten sind …
  • <center> zur Zentrierung von Inhalten
  • <marquee> um Text zu bewegen
  • <blink> um Inhalte blinken zu lassen
  • <font> um Schriftart, Größe und weitere Stile wie in einem WYSIWYG-Editor zu setzen
Frage:

Was haben diese veralteten Elemente gemeinsam?

Antwort:

Sie definieren sich über optische Vorgaben, nicht über inhaltliche Bedeutungen.

Semantische Auszeichnung

Content is king!
Mit HTML sollten Inhalte beschrieben werden, nicht Layoutvorgaben vorgenommen werden.
Keine Nutzung von veralteten Attributen
Viele veraltete Attribute haben CSS-Entsprechungen
Gut für SEO und Assistenzsysteme
Sowohl Google als auch blinde Leser belohnen sinnvoll ausgezeichnete Dokumente
Sehr bewegtes Gebiet
Unterschiedlichste Auszeichungsmethoden verfügbar
In dieser Veranstaltung: Reduktion auf alltäglich relevantes für normale Endanwender
Genutzt für z.B. Linkvorschauen in Suchmaschinen, Messenger, sozialen Netzwerken, …

Bereichsauszeichnung

Die folgenden Elemente sind für den Benutzer unsichtbar, werden aber von Assistenzsystemen oder Suchmaschinen berücksichtigt.

<header>
Bezeichnet einen Bereich “über” dem eigentlichen Inhalt, typischerweise findet sich hier die Navigation und gestalterische Elemente wie Logos
<footer>
Bezeichnet einen Bereich “unter” dem eigentlichen Inhalt, typischerweise finden sich hier Kontaktdaten oder Lizenzbedingungen
<nav>
Bezeichnet den Navigationsbereich, mit dem innerhalb der gesamten Seite navigiert werden kann.
<main>
Der inhaltliche Grund, aus welchem sich Besucher auf ihre Seite begeben haben.
<article>
Bezeichnet einen in sich geschlossenen Bereich, der theroetisch auch für sich stehen könnte. Typische Beispiele sind Artikel in Blogs oder anderen redaktionellen Angeboten.
<section>
Bezeichnet einen typischerweise inhaltlich zusammenhängenden Abschnitt eines Dokumentes, welcher mit einer Überschrift ausgezeichnet werden sollte.

Beispiel

  • intro_html/semantic-doc.html | Validieren
    <main>
      <article>
        <h1>First Contact War</h1>
        <section>
          <h2>Synopsis</h2>
          <p>
            The First Contact War, referred to as the Relay 314 Incident by the
            turians, was a small, three-month conflict between the human Systems
            Alliance and the Turian Hierarchy.
          </p>
        </section>
        <section>
          <h2>Progression</h2>
          <p>
            After discovering the Charon Relay, humans began a rapid expansion
            thanks to their new-found connection to the mass relay network.
            Hoping to expand their territory and driven by immense curiosity,
            they began activating every mass relay they could find.
          </p>
        </section>
      </article>
    </main>
    <aside>
      <h1>Advertisement</h1>
      <p>Watch the all-elcor rendition of Shakespeare's Hamlet</p>
    </aside>
    <footer>
      <p>(c) 2010 The favourite store on the Citadel</p>
    </footer>
    

HTML-Templatingsprachen

Historisch
Aufwändige Pflege der Webseiten “von Hand”
Erste Automatisierung
Erste Entwurfsmuster für serverseitigen Code
  • Frameworks wie Ruby on Rails prägen das “Model-View-Controller”-Muster
  • Templatingsprachen erlauben eine strikte Trennung von Daten und ihrer Darstellung
Zunehmende Verlagerung der Logik in den Client machen neue Muster erforderlich
“Single Page Applications” - Thema der fortgeschrittenen Web-Anwendungen
Déjà-vu: Generatoren für statische Webseiten werden wieder modern
Erlauben “auf Knopfdruck” das Erzeugen von Webseiten, die auf komplexen Datenbeständen basieren

Die Templatingsprache Handlebars

Quelloffene Templatingsprache
In HTML eingebettete Sprache
  • Arbeitet ausschließlich mit vorab aufbereiteten Daten
  • Folglich: Erzeugt oder verändert unter keinen Umständen neue Datensätze
Kennt aus Programmiersprachen bekannte Kontrollstrukturen
Schleifen, Verzweigungen
Trivial erweiterbar durch Entwickler
Für komplexe Darstellungsaufgaben

Angabe von Daten im “Frontmatter”

Erweiterung: HTML-Dokumente können auch Daten enthalten (“Template”)
  • Daten-Bereich wird durch drei Bindestriche (---) vom HTML- und Handlebars-Quelltext getrennt
  • Erfordert Interpretation durch ein anderes Programm als den Browser
  • Streng genommen ein eigenes Dateiformat, daher Endung .hbs
Angabe von YAML-Daten, welche zu einem bestimmten Dokument gehören
  • Werte lassen sich dann im Template einsetzen
  • Wer es kennt: Angabe von JSON-Dokumenten ebenfalls möglich
Konvention: Aufteilung des Datenbestandes in Namensräume
  • page für alle Daten der konkreten Seite
  • global für global verfügbare Daten (Name des Webauftritts, …)

Einsetzen von Daten (Interpolation / “Handlebars Expression”)

  • framework_projects/vorlesung/pages/interpolation-basic-1-yaml.hbs
    vorname: "James"
    nachname: "Bond"
    ---
    <p>
      Der Name ist {{ page.nachname }},
      <em>{{ page.vorname }}</em> {{ page.nachname }}.
    </p>
    
Daten im Frontmatter bilden ein “Objekt”
  • Daten im Objekt werden in name: wert-Paaren angegeben
  • Der name ist immer eine Zeichenkette und kann auch in Anführungszeichen notiert werden
  • Der wert folgt komplexeren Regeln, kann aber auch eine Zeichenkette sein
Doppelt geschweifte Klammern {{ }} im HTML setzen die Werte ein
Angabe eines “Pfades” zu den Werten im Frontmatter
  • framework_projects/vorlesung/pages/interpolation-basic-2-yaml.hbs
    vorname: "Harry"
    nachname: "Potter"
    ---
    <p>
      Der Name ist {{ page.nachname }},
      <em>{{ page.vorname }}</em> {{ page.nachname }}.
    </p>
    

Wahrheitswerte, Zahlen und Zeichenketten

Grundsätzliche Frage: Welche Typen dürfen auf der rechten Seite angegeben werden?
Exakter: Was ist die Menge der erlaubten Werte auf der rechten Seite?
Wahrheitswerte: Sind exakt true oder false
Keine Anführungszeichen, immer komplett klein geschrieben
Zahlen: Alle Ziffern von 0 bis 9, maximal 1 . für Nachkommastellen und Vorzeichen mit + oder -
Keine Anführungszeichen
Zeichenketten: Alle Buchstaben außer dem Zeilenumbruch für neue Zeilen
Werden immer in Anführungszeichen notiert
  • framework_projects/vorlesung/pages/interpolation-types-yaml.hbs
    vorname: "Hermine"
    nachname: "Granger"
    weiblich: true
    geburtsjahr: 1988
    ---
    <ul>
      <li>Vorname: {{ page.vorname }}</li>
      <li>Nachname: {{ page.nachname }}</li>
      <li>Weiblich: {{ page.weiblich }}</li>
      <li>Männlich: {{ page.männlich }}</li>
      <li>Geburtsjahr: {{ page.geburtsjahr }}</li>
    </li>

SQL-Abfragen für skalare Werte

Statt statischer Werte können auch SQL-Abfragen im Frontmatter notiert werden
Diese werden dann ausgeführt und durch das entsprechende Ergebnis ersetzt
Skalare Ergebnisse enhalten exakt eine Spalte und eine Zeile
Können wie ein “normaler” Wert direkt eingesetzt werden
  • framework_projects/vorlesung/pages/db-scalar.hbs
    num_chapters: SELECT COUNT(*) FROM chapter;
    num_choices: SELECT COUNT(*) FROM next_chapter;
    ---
    Es gibt {{ page.num_chapters }} Kapitel und
    insgesamt {{ page.num_choices }} Entscheidungen
    in diesem Buch.
    

SQL-Abfragen für einzelne Ergebnis-Zeilen

Enthält das Ergebnis exakt eine Zeile, sind die Spalten dieser Zeile mit einem . zugreifbar
Vorsicht: Fehlende Werte machen sich nur durch Abwesenheit bemerkbar
  • framework_projects/vorlesung/pages/db-single-row.hbs
    chapter: SELECT * FROM chapter WHERE chapter_id = 2;
    ---
    Das Kapitel mit der ID {{ page.chapter.chapter_id }}
    heißt "{{ page.chapter.caption }}".
    

Mehrzeilige Notation von SQL-Abfragen

Bei längeren Abfragen wünschenswert: Mehr als eine Zeile Platz für die Notation
Typischerweise Umbruch nach SELECT, FROM, WHERE und GROUP BY
Nutzung des > Operators für mehrzeilige Werte
Entsprechend eingerückte Zeilen werden als zusammenhängend betrachtet
Mehrzeilig bezieht sich auf die Notation der Eingabe! Mehrzeilige Ergebnisse werden in der nächsten Vorlesung besprechen.
  • framework_projects/vorlesung/pages/db-multi-line-notation.hbs
    chapter: >
      SELECT *
      FROM chapter
      WHERE chapter_id = 2;
    ---
    Das Kapitel mit der ID {{ page.chapter.chapter_id }}
    heißt "{{ page.chapter.caption }}".
    

Mehrstufige Templating-Logik

Problem: Bestimmte Konstrukte müssen auf jeder Seite wiederholt werden
Gut ersichtlich am ersten Beispiel: Der HTML-Code für zwei verschiedene Dokumente ist identisch
  • framework_projects/vorlesung/pages/interpolation-basic-1-yaml.hbs
    vorname: "James"
    nachname: "Bond"
    ---
    <p>
      Der Name ist {{ page.nachname }},
      <em>{{ page.vorname }}</em> {{ page.nachname }}.
    </p>
    
  • framework_projects/vorlesung/pages/interpolation-basic-2-yaml.hbs
    vorname: "Harry"
    nachname: "Potter"
    ---
    <p>
      Der Name ist {{ page.nachname }},
      <em>{{ page.vorname }}</em> {{ page.nachname }}.
    </p>
    

Einbindung mit template und content

Eine mögliche Lösung: Angabe eines template im Frontmatter
  • Keine Standard-Funktion von Handlebars
  • “Magischer” Wert der von der Laufzeitumgebung für die Übung interpretiert wird
Referenzierte Templates sollten eine {{content}} Anweisung beinhalten
An dieser Stelle wird das aufrufende Dokument eingesetzt

Valides HTML-Dokument mit template und content

  • framework_projects/vorlesung/templates/template-html.hbs
    <!-- templates/template-html.hbs -->
    <!DOCTYPE html>
    <html lang="de">
      <head>
        <meta charset="UTF-8">
        <title>{{ page.title }}</title>
      </head>
      <body>
        {{ content }}
      </body>
    </html>
  • framework_projects/vorlesung/pages/template-valid-document-yaml.hbs
    title: "Template Beispiel I"
    template: "template-html"
    ---
    <p>Ich bin ein valides Dokument</p>

Unterschiedliche Templates für unterschiedliche Anforderungen

Typisches Vorgehen: Ein Template für das HTML-Gerüst
Enthält nur das Minimum an technisch notwendigen Elementen
Weitere Templates für bestimmte Seitenarten
  • Bauen auf dem “Basis”-HTML-Template auf
  • Zum Beispiel für Neuigkeiten, Shopartikel, Videoseiten, Bildergallerien, …
Spezielle Templates verlassen sich oftmals auf bestimmte Daten im Frontmatter
Korrekte Dokumentation daher essentiell

Einbindung der Navigation mit template

  • framework_projects/vorlesung/pages/template-nav-yaml.hbs
    title: "Template Beispiel II"
    template: "template-nav-yaml"
    ---
    <p>Ich bin ein valides Dokument (mit Navigation)</p>
  • framework_projects/vorlesung/templates/template-nav-yaml.hbs
    template: "template-html"
    ---
    <!-- templates/template-nav-yaml.hbs -->
    <nav>
      <ul>
        <li><a href="#">Hauptseite</a></li>
        <li><a href="#">Keine Hauptseite</a></li>
      </ul>
    </nav>
    {{ content }}