HTML
-Fragmentenname
und org
<!DOCTYPE html>
<html>
<head>
<title>PHP</title>
</head>
<body>
<?php
$mysqli = new mysqli("dbsrv", "user", "pass", "db");
$res = $mysqli->query("SELECT name, org FROM party");
while ($row = $res->fetch_assoc()) {
echo "<h1> " . $row['name'] . "</h1>";
echo "<p> " . $row['org'] . "</p>";
}
?>
</body>
</html>
HTML
-Dokumente können auch Daten enthalten (“Template”)---
) vom HTML
- und Handlebars-Quelltext getrennt.hbs
JSON
-Daten, welche zu einem bestimmten Dokument gehörenpage
für alle Daten der konkreten Seiteglobal
für global verfügbare Daten (Name des Webauftritts, …){
"vorname": "James",
"nachname": "Bond"
}
---
<p>
Der Name ist {{ page.nachname }},
<em>{{ page.vorname }}</em> {{ page.nachname }}.
</p>
{}
im Frontmatter bilden ein “Objekt”"name": "wert"
-Paaren angegebenname
ist immer eine Zeichenkette und muss immer in Anführungszeichen ("
) notiert werdenwert
folgt komplexeren Regeln, kann aber auch eine Zeichenkette sein"name": "wert"
-Paare werden durch Kommata getrennt{{ }}
im HTML
setzen die Werte ein{
"vorname": "Harry",
"nachname": "Potter"
}
---
<p>
Der Name ist {{ page.nachname }},
<em>{{ page.vorname }}</em> {{ page.nachname }}.
</p>
true
oder false
0
bis 9
, maximal 1 .
für Nachkommastellen und Vorzeichen mit +
oder -
undefined
und null
{
"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>
if
-Block{{#name}}
eingeleitet und mit {{/name}}
geschlossen#
-Zeichen kennzeichnet einen öffnenden Blockname
des Blocks muss beim Öffnen und Schließen identisch seinif
-Block: Angabe eines Wahrheitswertesfalse
0
""
(leere Zeichenkette)null
und undefined
[]
(leere Liste, Erklärung folgt später)true
, Strings mit Inhalt, Zahlen ≠ 0, …if
-Block{
"vorname": "Hermine",
"nachname": "Granger",
"weiblich": true,
"geburtsjahr": 1979
}
---
<ul>
<li>Vorname: {{ page.vorname }}</li>
<li>Nachname: {{ page.nachname }}</li>
{{#if page.weiblich}}
<li>Geschlecht: Weiblich</li>
{{/if }}
{{#if page.männlich}}
<li>Geschlecht: Männlich</li>
{{/if}}
<li>Geburtsjahr: {{ page.geburtsjahr }}</li>
</ul>
if
-Block: Redundanz vermeiden{
"vorname": "Ronald Bilius",
"nachname": "Weasley",
"männlich": true,
"geburtsjahr": 1980
}
---
<ul>
<li>Vorname: {{ page.vorname }}</li>
<li>Nachname: {{ page.nachname }}</li>
<li>
Geschlecht:
{{#if page.weiblich}}
Weiblich
{{/if }}
{{#if page.männlich}}
Männlich
{{/if}}
</li>
<li>Geburtsjahr: {{ page.geburtsjahr }}</li>
</ul>
if
-Block: Doppelte Geschlechter{
"vorname": "Kim",
"nachname": "Sheringham",
"weiblich": true,
"männlich": true,
"geburtsjahr": 1979
}
---
<ul>
<li>Vorname: {{ page.vorname }}</li>
<li>Nachname: {{ page.nachname }}</li>
<li>
Geschlecht:
{{#if page.weiblich}}
Weiblich
{{/if }}
{{#if page.männlich}}
Männlich
{{/if}}
</li>
<li>Geburtsjahr: {{ page.geburtsjahr }}</li>
</ul>
else
-Blockif
-Block kann optional ein else
-Block definiert werdenif
-Block eben nicht ausgeführt wurde{
"vorname": "Firenze",
"nachname": "(Zentaur)",
"geburtsjahr": "unbekannt"
}
---
<ul>
<li>Vorname: {{ page.vorname }}</li>
<li>Nachname: {{ page.nachname }}</li>
<li>
Geschlecht:
{{#if page.weiblich}}
Weiblich
{{else}}
Nicht weiblich (Männlich?)
{{/if}}
</li>
<li>Geburtsjahr: {{ page.geburtsjahr }}</li>
</ul>
[]
notiert und durch Kommata getrennt#each
ermöglicht die Iteration über Listen#each
-Blocks wird für jedes Element der Liste einmal ausgeführt#each
-Bereich ohne Präfix zur Verfügungthis
{
"dinge": ["Hase", "Katze", "🐈", true, "Hase", 13, "💩"]
}
---
<h1>Auflistung von Dingen</h1>
<ol>
{{#each page.dinge }}
<li>Ding: {{ this }}</li>
{{/each}}
</ol>
this
kann auf den aktuellen Kontext zugegriffen werdenthis.page.wert
schreiben können../
kann auf den Kontext der übergeordneten Ebene zugegriffen werdeneach
) eröffnen einen neuen Kontextif
) hingegen nicht{
"name": "Hagrid",
"tiere": [
"Spinne", "Flubberwürmer", "Hippogreif",
"Niffler", "Knallrümpfige Kröter"
]
}
---
<ul>
{{#each page.tiere}}
<li>{{../page.name}} stellte vor: {{ this }}</li>
{{/each}}
</ul>
{
"hobbies": ["lesen", "schwimmen", "reiten"],
"name": "Thomas"
}
---
<p>
Mein Name ist {{ page.name }} und meine Hobbies sind
<ul>
{{#each page.hobbies }}
<li>{{ this }}</li>
{{/each}}
</ul>
</p>
{
"personen": [
{
"hobbies": ["lesen", "schwimmen", "reiten"],
"name": "Thomas"
},
{
"name": "Annika",
"hobbies": ["Xbox", "PC"]
}
]
}
---
{{#each page.personen}}
<p>
Mein Name ist {{ this.name }} und meine Hobbies sind
<ul>
{{#each this.hobbies }}
<li>{{ this }}</li>
{{/each}}
</ul>
</p>
{{/each}}
this
taucht zweimal mit verschiedenen Bedeutungen auf{
"numbers": [
[1,2,3,4,5,6],
[2,4,6,8,10,12],
[3,6,9,12,15,18],
[4,8,12,16,20,24],
[5,10,15,20,25,30]
]
}
---
<table border="1">
{{#each page.numbers}}
<tr>
{{#each this}}
<td>
{{ this }}
</td>
{{/each}}
</tr>
{{/each}}
</table>
{ }
.
(Punkt) zum navigieren in eine tiefere Ebene{
"person": {
"name": "Ronald Bilius Weasley",
"spitzname": "Won-Won"
},
"schule": {
"name": "Hogwarts",
"ort": "England"
}
}
---
<p>
{{ page.person.name }} ("{{ page.person.spitzname}}")
studiert in {{ page.schule.name }} ({{ page.schule.ort }}).
</p>
{
"date": {
"year": 2018, "month": 10, "day": 13
}
}
---
<p>
Für Europäer:
{{ page.date.day }}.{{ page.date.month }}.{{ page.date.year }}
</p>
<p>
Für Amerikaner:
{{ page.date.month }}/{{ page.date.day }}/{{ page.date.year }}
</p>
<p>
Für Informatiker:
{{ page.date.year }}{{ page.date.month }}{{ page.date.day }}
</p>
HTML
-Code für zwei verschiedene Dokumente ist identisch{
"vorname": "James",
"nachname": "Bond"
}
---
<p>
Der Name ist {{ page.nachname }},
<em>{{ page.vorname }}</em> {{ page.nachname }}.
</p>
{
"vorname": "Harry",
"nachname": "Potter"
}
---
<p>
Der Name ist {{ page.nachname }},
<em>{{ page.vorname }}</em> {{ page.nachname }}.
</p>
include
templates
hinterlegt<!-- templates/person-greeting.hbs -->
<p>
Der Name ist {{ page.nachname }},
<em>{{ page.vorname }}</em> {{ page.nachname }}.
</p>
{
"vorname": "James",
"nachname": "Bond"
}
---
{{include "person-greeting"}}
HTML
-DokumenteHTML
-Dokumente waren ungültig!DOCTYPE
, keine html
-, head
- oder body
-ElementeHTML
-Fragmente einbindenbody
, einmal alles “nach” dem body
<!-- templates/include-html-head.hbs -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>{{ page.title }}</title>
</head>
<body>
<!-- templates/include-html-foot.hbs -->
</body>
</html>
{ "title": "Include Beispiel I" }
---
{{include "include-html-head"}}
<p>Ich bin ein valides Dokument</p>
{{include "include-html-foot"}}
<!-- templates/include-navigation.hbs -->
<nav>
<ul>
<li><a href="#">Hauptseite</a></li>
<li><a href="#">Keine Hauptseite</a></li>
</ul>
</nav>
{ "title": "Include Beispiel II" }
---
{{include "include-html-head"}}
{{include "include-navigation" }}
<p>Ich bin ein valides Dokument (mit Navigation)</p>
{{include "include-html-foot"}}
<!-- templates/alt-include-html-head.hbs -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>{{ page.title }}</title>
</head>
<body>
{{include "include-navigation" }}
<!-- templates/alt-include-html-foot.hbs -->
</body>
</html>
{ "title": "Include Beispiel III" }
---
{{include "alt-include-html-head"}}
<p>Ich bin ein valides Dokument (mit Navigation)</p>
{{include "alt-include-html-foot"}}
template
und content
include
: Inhaltlich zusammengehörige Fragmente werden zerrissenhead
& foot
)template
im Frontmatter{{content}}
Anweisung beinhaltenHTML
-Dokument mit template
und content
<!-- templates/template-html.hbs -->
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<title>{{ page.title }}</title>
</head>
<body>
{{ content }}
</body>
</html>
{
"title": "Template Beispiel I",
"template": "template-html"
}
---
<p>Ich bin ein valides Dokument</p>
HTML
-GerüstHTML
-Template auftemplate
{ "template": "template-html" }
---
<!-- templates/template-nav.hbs -->
<nav>
<ul>
<li><a href="#">Hauptseite</a></li>
<li><a href="#">Keine Hauptseite</a></li>
</ul>
</nav>
{{ content }}
{
"title": "Template Beispiel II",
"template": "template-nav"
}
---
<p>Ich bin ein valides Dokument (mit Navigation)</p>
template
hat kein Bezeichner eine feste Bedeutungglobal.json
global.json
im gleichen Ordner wie die package.json
anlegenglobal
zur VerfügungdebugJson
-Anweisung{
"hallo": "welt",
"optionen": [1,2,3],
"wahr": false
}
---
{{ debugJson }}
Antwort: {{ global.answer }}
{
"a" : 1,
"b" : 2,
"c" : [3,4],
"d" : { "hallo": "welt" }
}
---
<p>Daten aus der Seite</p>
{{ debugJson }}
{{ include "data-hierarchy-1" }}
<p>Daten aus der Seite</p>
{{ debugJson }}
{
"a" : "eins",
"c" : [5,6],
"d" : { "hello": "world" }
}
---
<!-- templates/data-hierarchy-1.hbs -->
<p>Daten aus <code>data-hierarchy-1</code></p>
{{ debugJson }}
HTML
-Code zuHTML
-Code aus den Frontmatter-Daten wird durch Entitäten ersetzt<
wird zu <
, >
zu >
, …{{{ }}}
{
"headline": "<h1>Ich bin eine Überschrift</h1>",
"rede": "Er schrie <aaaaah>",
"smiley": "<O_o>"
}
---
{{ page.headline }}
<hr>
{{{ page.headline }}}
<hr>
{{ page.rede }}
<hr>
{{{ page.rede }}}
<hr>
{{ page.smiley }}
<hr>
{{{ page.smiley }}}
title
-Angabe zur Steuerung des <title>
-Elements<!-- templates/template-html.hbs -->
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<title>{{ page.title }}</title>
</head>
<body>
{{ content }}
</body>
</html>
page.title
{{#if page.title }}
{{ page.title }} - {{ global.name }}
{{else}}
{{ global.name }}
{{/if}}
{ "template": "template-html" }
---
<!-- templates/template-draft.hbs -->
{{#if page.unfinished}}
<p>Achtung: Diese Seite ist noch unfertig!</p>
{{/if}}
{{ content }}
{
"unfinished": true,
"template": "template-draft"
}
---
<h1>Herzlich willkommen auf meiner Webseite</h1>
{
"template": "template-draft"
}
---
<h1>Herzlich willkommen auf meinem Lebenslauf</h1>
<ul>
<li>Geboren</li>
<li>Grundschule</li>
</ul>
URL
zum Bild{ "template": "template-html" }
---
<h1>{{ page.title }}</h1>
<p>{{ page.description }}</p>
{{#each page.images}}
<figure>
<figcaption>{{ title }}</figcaption>
<img src="{{ src }}" width="400">
</figure>
{{/each}}
{
"template": "gallery",
"title": "Meine erste Gallerie",
"description": "Bilder von tollen Spielen",
"images": [
{
"src": "/assets/screenshot/dwarf-fortress.png",
"title": "Adventures of Boatmurdered"
},
{
"src": "/assets/screenshot/evil-genius.png",
"title": "Sei ein fieses Genie!"
}
]
}
---
{ "template": "template-html" }
---
<h1>{{ page.title }}</h1>
{{ content }}
{{#each page.images}}
<figure>
<figcaption>{{ title }}</figcaption>
<img src="{{ src }}" width="400">
</figure>
{{/each}}
{
"template": "gallery-content",
"title": "Meine erste Gallerie",
"images": [
{
"src": "/assets/screenshot/dwarf-fortress.png",
"title": "Crossover of Dungeon Keeper & The Sims"
},
{
"src": "/assets/screenshot/evil-genius.png",
"title": "Evil will always win because Good is very, very, very dumb"
}
]
}
---
<p>
Auf dieser Seite beschreibe ich einige tolle Spiele.
Alle hier beschriebenen Spiele gibt es
<abbr title="Digital Rights Management">DRM</abbr>-
frei auf <a href="https://www.gog.com">gog.com</a>.
</p>
pages
-Ordnertemplates
-Ordnerglobal.json
case
/ of
, select
/ case
, switch
/ case
) ist komplexe LogikJSON
)number
& string
array
& object
[42, "Pi", null, true]
{
"answer": 42,
"3.141" : "Pi",
"unknown": null,
"important": true
}
JSON
-DatenJSON
ist ein kompaktes Format mit dem sich beliebige Datensätze gut notieren lassenJSON
ist ein kompaktes Format mit dem sich beliebige Datensätze gut notieren lassen{
"Harry" : {
"Jahrgang": 1980,
"Freunde": ["Hermine", "Ron"],
"Muggel": false,
"Haus": "Gryffindor"
},
"Tom": {
"Jahrgang": 1926,
"Freunde": [],
"Muggel": false,
"Haus": "Slytherin"
},
"Dudley": {
"Jahrgang": 1980,
"Freunde": ["Piers", "Malcolm"],
"Muggel": true
},
}
[
{
"Name": "Harry",
"Jahrgang": 1980,
"Freunde": ["Hermine", "Ron"],
"Muggel": false,
"Haus": "Gryffindor"
},
{
"Name": "Tom",
"Jahrgang": 1926,
"Freunde": [],
"Muggel": false,
"Haus": "Slytherin"
},
{
"Name": "Dudley",
"Jahrgang": 1980,
"Freunde": ["Piers", "Malcolm"],
"Muggel": true
}
]
#each
nur über Listen möglich["Lawful", "Neutral", "Chaotic"],
["Good", "Neutral", "Evil"],
{
/* Alignments used as described above */
goodness: 0, // "Lawful"
niceness: 2, // "Evil"
},
{
law: "implies honor, trustworthiness, obedience
to authority, and reliability.",
chaos: "implies freedom, adaptability, and flexibility"
}
]
JSON
-Objekt darf nur einen Wert an der Wurzel habenJSON
-Spezifikation sieht keinerlei Kommentare vor\n
maskiert werden, darf nicht ohne Maskierung verwendet werden]
zuviel{
"Morte": {
"Alignment": "Chaotic Good",
"Special Abilities": [
"Litany of Curses",
"Skull Mob"
],
"Class": "Fighter",
"Attributes": [12, 16, 16, 13, 9, 6]
},
"Annah": {
"Alignment": "Chaotic Neutral",
"Class": [
"Fighter",
"Thief"
]
"Attributes": [14, 18, 16, 10, 13]
}
}
Annah
fehlt die Liste an SpezialfähigkeitenMorte
verwendet für Klassen einen String, Annah
eine Liste von StringsAnnah
hat nur 5 AttributeXML
erlaubt wesentlich erprobtere Formen der Schema-Angabe