450 lines
20 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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.

let cards_content = [
[
"Einzug",
"Kreuzzeichen und liturgischer Gruß",
"Begrüßung und Einführung in die Feier",
"Schuldbekenntnis und Vergebungsbitte (Bußakt)",
"Kyrie",
"Gloria",
"Tagesgebet",
"Lesung (Altes Testament)",
"Zwischengesang / Antwortpsalm",
"Lesung (Neues Testament)",
"Hallelujaruf",
"Evangelium",
"Homilie / Predigt",
"Credo / Glaubensbekenntnis",
"Fürbitten",
"Gabenbereitung mit Gabengebet",
"Eucharistisches Hochgebet: Präfation",
"Sanctus",
"Einsetzungsbericht / Wandlung",
"Vaterunser",
"Friedensgruß",
"Brechen des Brotes / Agnus Dei Lamm Gottes",
"Kommunion",
"Dank- / Schlussgebet",
"Segen",
"Entlassung",
],
[
"Die versammelte Gemeinde wartet auf ihren Herrn, um mit ihm die Eucharistie zu feiern.",
"Wir beginnen mit der Feier. Das Kreuzzeichen macht uns bewusst, dass Gott (Vater, Sohn und Heiliger Geist) in unserer Gemeinschaft gegenwärtig ist. Es ist ein kurzes Glaubensbekenntnis",
"Die Gemeinde wird willkommen geheißen. Einstimmung auf den Gottesdienst und die damit verbundenen Anliegen.",
"Bekennen der eigenen Schuld, die uns voneinander und von Gott trennt, im Vertrauen darauf, dass Gott uns verzeiht und uns bedingungslos annimmt.",
"Begrüßungsruf, mit dem früher die Herrscher begrüßt wurden. Die Gläubigen rufen ihren Herrn Jesus Christus an und bitten ihn um seine Zuwendung.",
"Lobpreis Gottes",
"Kurzes zusammenfassendes Gebet im Namen der Gemeinde, verbunden mit dem Tagesanliegen des Gottesdienstes.",
"Die Erfahrungen des Volkes Israel mit seinem Gott Jahwe.",
"Meditation zur ersten Lesung",
"Erfahrungen der Apostel und der ersten Christengemeinden mit der Botschaft Jesu werden an uns heutige Menschen weitergegeben.",
"Jubelruf zur Begrüßung Jesu Christi.",
"Frohe Botschaft: Geschichte Gottes mit den Menschen auf das Leben und Wirken Jesu bezogen.",
"Deutung und Aktualisierung der frohen Botschaft für unser Leben.",
"Wir antworten auf Gottes Wort und seine Zuwendung, indem wir unseren Glauben an ihn bekennen.",
"Die Nöte und Sorgen der Menschen werden vor Gott ausgesprochen, mit der Bitte um seine Hilfe.",
"Mit Brot und Wein bringen wir uns selbst vor Gott, damit auch wir verwandelt werden. Wir bringen unsere Gaben für andere (Kollekte).",
"Großes Lob- und Dankgebet, Wechselgebet, Einleitung zum großen Dankgebet.",
"Lob Gottes",
"Jesus ist in den Zeichen von Brot und Wein bei uns. Die Gemeinschaft mit ihm befähigt uns, in seiner Nachfolge zu leben.",
"Im Gebet, das Jesus uns lehrte, sind die Grundbedürfnisse des Menschen angesprochen. Jesu Bitten sind unsere Bitten.",
"Frieden ist ein Geschenk Gottes. Gleichzeitig sind wir dazu aufgerufen, Frieden und Versöhnung unter den Menschen zu stiften.",
"Lamm Gottes: Das geteilte Brot, Zeichen dafür, dass alle Anteil haben an dem einen Leib Christi. Bitte um Erbarmen.",
"In Gemeinschaft verbunden mit Christus und untereinander. (Kumpane, lat. Cum pane = mit Brot; Kumpane sind Menschen, die miteinander durch gemeinsames Brotessen verbunden sind.)\nWir werden auf unserem Weg zu Gott gestärkt.",
"Dank für die Erfahrung der Nähe Gottes und dieser Gemeinschaft, Dank für die Stärkung durch die Kommunion.",
"Wir erhalten Stärkung und alle guten Wünsche für den Alltag, sowie den Auftrag, Gott in der Welt zu bezeugen.",
"Aufforderung, das Evangelium im Alltag zu leben und zu bezeugen.",
],
[
"„Denn wo zwei oder drei in meinem Namen versammelt sind, da bin ich mitten unter ihnen.“ (Mt 18,20)",
"„Tauft sie auf den Namen des Vaters und des Sohnes und des Heiligen Geistes.“ (Mt 28,19b)",
null,
"Bußpsalmen des Alten Testaments (z.B. Ps 51), in denen das Erbarmen Gottes angerufen wird; Jesis ruft zur Umkehr, (z.B. Mk 1,15: „Die Zeit ist erfüllt, das Reich Gottes ist nahe. Kehrt um und glaubt an das Evangelium.“)",
"Jesu Einzug in Jerusalem (Mt 21,5)",
"Lobgesang auf Gott, den Vater, nach Lk 2,14: „Verherrlicht ist Gott in der Höhe…“, Lobgesang auf Jesus Christus. Vgl. Phil 2,6-11.",
"Jesus betet, er spricht mit seinem Vater und er ermutigt seine Zuhörer, dass auch sie sich mit ihren Bitten an den Vater wenden. (z.B. Lk 11,1-13)",
"Texte aus den Schriften des Alten (Ersten) Testaments. (Vgl. Leseordnung)",
"Die Psalmen aus dem Alten (Ersten) Testament.",
"Texte aus den Apostelbriefen, der Apostelgeschichte, der Offenbarung des Johannes.",
null,
"Die vier Evangelien, Leben und Wirken Jesu",
"Auf dem Weg nach Emmaus erläutert Jesus den Jüngern was geschehen ist. Er deutet die Texte der Hl. Schrift.",
"Ursprünglich war das Credo Teil der Tauffeier. (Mk 16,15-16)",
"„Darum sage ich euch: Bittet, dann wird euch gegeben, sucht, dann werdet ihr finden, klopft an, dann wird euch aufgetan.“ (Lk 11,9)",
"Vorbereitung des Paschamahles (jüdisches Ostermahl) vgl. Mt 26,17-19",
null,
"„…Heilig, heilig, heilig, ist der Herr, der Heere. Von seiner Herrlichkeit ist die ganze Erde erfüllt.“ (Jes 6,3) „Hosanna! Gesegnet sei er, der kommt im Namen des Herrn“ (Mk 11,9)",
"„Denn sooft ihr von diesem Brot esst und aus diesem Kelch trinkt, verkündet ihr den Tod des Herrn, bis er kommt.“ Vgl. Mt 26,26-27, Mk 14,22-24, Lk 22,14-20, 1 Kor 11,23-26",
"Das Gebet, das Jesus seine Jünger lehrte. (Mt 6,9-13, Lk 11,2-4)",
"„Frieden hinterlasse ich euch, meinen Frieden gebe ich euch, nicht einen Frieden, wie die Welt ihn gibt, gebe ich euch.“ (Joh 14,27)",
"„…sprach das Dankgebet, brach das Brot und sagte…“ (1 Kor 11,24a)",
"„…das Brot, reichte es seinen Jüngern und sagte: Nehmt und esst, das ist mein Leib…“ (Mt 26,26-28)\n„Ein Brot ist es. Darum sind wir viele ein Leib, denn wir alle haben teil an dem einen Brot.“ (1 Kor 17)",
"„Dankt dem Vater mit Freude…“ (Kol 1,12)",
"„Der Herr segne dich und behüte dich, der Herr lasse sein Angesicht leuchten über dir und sei dir gnädig. Der Herr wende dir sein Angesicht zu und schenke dir Frieden.“ (Num 6,24-26)",
"„Gehet hin in Frieden“ (biblische Redensweise, vgl. Mk 5,34)",
],
[
"Einzug in die Kirche mit Leuchter\nLäuten der Glocke zum Einzug",
null,
null,
null,
null,
null,
null,
null,
null,
null,
null,
"Mit Leuchter am Ambo",
null,
null,
null,
"Kelch und Hostienschale zum Altar bringen, Wasser und Wein bringen, Handwaschung\nKollekte",
null,
null,
"Klingeln",
null,
null,
null,
"Kommunion empfangen\nanschließend Altar abräumen",
null,
null,
"Auszug",
],
];
function shuffle(a) {
for (let x = a.length-1; x>0; x--) {
let y = Math.floor(Math.random() * (x + 1));
let temp = a[x];
a[x] = a[y];
a[y] = temp;
}
}
function shuffle_cards(section) {
let a = [];
for (let i=0; i<cards_content[section].length; i++) {
if (cards_content[section][i] != null) {
a.push(i);
}
}
shuffle(a);
return a;
}
function choose_incorrects(elems) {
let options = {
"-1": [],
};
function chain_is_better(old_chain, new_chain) {
if (old_chain == null) {
return true;
} else if (new_chain.length > old_chain.length) {
return true;
} else if (new_chain.length < old_chain.length) {
return false;
}
let old_nums = old_chain.map(elem => elem[1]).sort((a, b) => a - b).reverse();
let new_nums = new_chain.map(elem => elem[1]).sort((a, b) => a - b).reverse();
for (let i=0; i<old_nums.length; i++) {
if (new_nums[i] < old_nums[i]) {
return true;
} else if (new_nums[i] > old_nums[i]) {
return false;
}
}
}
function build_chain(elem) {
let best = null;
for (let chain_end in options) {
let chain = options[chain_end];
chain_end = Number.parseInt(chain_end);
if (elem == null || chain_end < elem[0]) {
let newchain = chain.slice();
if (elem != null) {
newchain.push(elem);
}
if (chain_is_better(best, newchain)) {
best = newchain;
}
}
}
return best;
}
elems.forEach(elem => {
let chain = build_chain(elem);
options[chain[chain.length - 1][0]] = chain;
});
let result_chain = build_chain(null);
let corrects = result_chain.map(elem => elem[0]);
return elems.map(elem => !corrects.includes(elem[0]));
}
var app = new Vue({
el: "#quiz",
data: {
is_open: false,
store: {
section: 0,
selected: null,
items: shuffle_cards(0),
},
next_insert_num: null,
solution: [],
correction_visible: false,
},
computed: {
headings: function() {
return [
"Ablauf",
"Bedeutung",
"Biblischer Bezug",
"Ministrantendienst",
].slice(0, this.store.section + 1);
},
helptext: function() {
if (this.correction_visible) {
if (this.solution_correct) {
if (this.solution_revealed) {
return [
"Schau dir die Reihenfolge genau an. Elemente die zuvor nicht korrekt einsortiert waren, sind nun grün markiert.",
"Alle Bedeutungen sind jetzt am richtigen Platz. Die Bedeutungen die zuvor nicht korrekt zugeordnet waren, sind grün markiert.",
"Die biblichen Bezüge sind nun zugeordnet. Bezüge die zuvor nicht korrekt platziert waren, sind grün markiert.",
"Die Ministrantendienste sind nun am richtigen Platz. Was zuvor nicht korrekt zugeordnet war, ist grün markiert.\nDu hast es geschafft! Das Quiz ist nun zu Ende.",
][this.store.section];
} else {
return [
"Perfekt! Die Reihenfolge ist korrekt.",
"Super! Alle Bedeutungen sind korrekt eingeordnet.",
"Sehr gut! Die biblischen Bezüge sind alle korrekt zugeordnet.",
"Gut gemacht! Die Ministrantendienste sind alle passend zugeordnet.\nDu hast es geschafft! Das Quiz ist nun zu Ende.",
][this.store.section];
}
} else if (this.store.section == 0) {
return "Die Reihenfolge passt leider noch nicht ganz. Falsch eingeordnete Elemente sind rot markiert. Entferne diese mit einem Klick auf das rote X und füge sie neu ein, bis die Reihenfolge stimmt.";
} else {
return "Die Zuordnung passt leider noch nicht ganz. Falsch positionierte Elemente sind rot markiert. Entferne diese mit einem Klick auf das rote X und füge sie neu ein, bis alle richtig eingeordnet sind.";
}
} else {
if (this.solution.length == 0) {
return "Im ersten Schritt ist das Ziel, den Gottesdienstablauf in die richtige Reihenfolge zu bringen.\nKlicke hierfür zunächst unten auf ein beliebiges Element des Gottesdienstablaufs, um es nach links zu übernehmen.";
} else if (this.solution.length == 1) {
if (this.store.selected == null) {
return "Wähle nun von unten ein weiteres beliebiges Element aus.";
} else {
return "Klicke links auf einen grünen Pfeil, um es an der richtigen Stelle in die Liste einzuordnen.";
}
} else {
return [
"Bringe nun auch alle weiteren Elemente in die richtige Reihenfolge, wie sie bei einem Gottesdienst durchlaufen werden.\nFalls du etwas falsch eingeordnet hast, kannst du es mit einem Klick auf das rote X wieder löschen. (Wird sichtbar beim Überfahren mit der Maus)",
"Finde nun zu jedem Element des Gottesdienstablaufs die passende Bedeutung aus der Liste.",
"Welcher biblische Bezug gehört zum jeweiligen Element des Gottesdienstablaufs? Es gibt nicht zu jedem Punkt einen biblischen Bezug.",
"Ordne nun die gegebenen Ministrantendienste der jeweils passenden Zeile zu.",
][this.store.section];
}
}
},
revealing_text: function() {
if (this.all_inserted && !this.correction_visible) {
if (this.store.section == 0) {
return "Reihenfolge prüfen";
} else {
return "Zuordnung prüfen";
}
}
return null;
},
next_column_text: function() {
if (this.solution_correct) {
return [
"Nächster Schritt: Bedeutungen zuordnen",
"Nächster Schritt: Biblische Bezüge zuordnen",
"Nächster Schritt: Ministrantendienste zuordnen",
null,
][this.store.section];
}
return null;
},
all_inserted: function() {
if (this.store.section == 0) {
return this.solution.length == cards_content[0].length;
} else {
let available = this.store.items.length;
let inserted = 0;
for (let i=0; i<this.solution.length; i++) {
if (this.solution[i].idx.length > this.store.section) {
inserted++;
}
}
return inserted == available;
}
},
arrows_visible: function() {
return this.store.section == 0 && this.store.selected != null;
},
incorrects: function() {
if (!this.correction_visible) {
return this.solution.map(elem => false);
}
if (this.store.section == 0) {
let elems = this.solution.map(elem => [elem.idx[0], elem.insert_num]);
return choose_incorrects(elems);
} else {
return this.solution.map((elem, i) => {
return elem.idx.length > this.store.section
&& elem.idx[this.store.section] != i;
});
}
},
solution_correct: function() {
return this.correction_visible && this.all_inserted && !this.incorrects.includes(true);
},
reduced_store: function() {
let width = 2;
let reduced_list = [];
for (let row_begin = 0; row_begin < this.store.items.length; row_begin += width) {
let row = [];
let needed = false;
for (let cell = row_begin; cell < this.store.items.length && cell - row_begin < width; cell++) {
let item_idx = this.store.items[cell];
row.push(item_idx);
if (this.store_card_visible(item_idx)) {
needed = true;
}
}
if (needed) {
reduced_list.push(row);
}
}
return reduced_list;
},
solution_revealed: function() {
return this.solution.some(elem => elem.got_revealed);
},
},
methods: {
store_text: function(idx) {
return cards_content[this.store.section][idx];
},
store_card_visible: function(idx) {
return !this.solution.some(solution => solution.idx[this.store.section] == idx);
},
calculate_insert_num: function() {
if (this.next_insert_num == null) {
return null;
}
return this.next_insert_num++;
},
store_select: function(i) {
if (this.solution.length == 0) {
this.solution.push({
idx: [i],
got_revealed: false,
insert_num: this.calculate_insert_num(),
});
} else if (i == this.store.selected) {
this.store.selected = null;
} else {
this.store.selected = i;
}
},
solution_text: function(elem, column) {
return cards_content[column][elem.idx[column]];
},
insert_front: function() {
this.solution.splice(0, 0, {
idx: [this.store.selected],
got_revealed: false,
insert_num: this.calculate_insert_num(),
});
this.store.selected = null;
},
find_solution: function(elem) {
for (let i=0; i<this.solution.length; i++) {
if (this.solution[i] == elem) {
return i;
}
}
},
insert_after: function(elem) {
this.solution.splice(this.find_solution(elem)+1, 0, {
idx: [this.store.selected],
got_revealed: false,
insert_num: this.calculate_insert_num(),
});
this.store.selected = null;
},
remove_solution: function(row_idx) {
if (this.store.section == 0) {
this.solution.splice(row_idx, 1);
} else {
this.solution[row_idx].idx.pop();
}
},
show_correction: function() {
if (this.store.section == 0) {
this.solution.forEach((elem, i) => {
elem.insert_num = -i;
});
this.next_insert_num = 1;
}
this.correction_visible = true;
},
open_next_column: function() {
this.store.section++;
this.store.selected = null;
this.store.items = shuffle_cards(this.store.section);
this.correction_visible = false;
this.solution.forEach(elem => {
elem.got_revealed = false;
if (elem.idx.length < this.store.section) {
elem.idx.push(null);
}
});
},
add_card_to: function(row) {
this.solution[row].idx.push(this.store.selected);
this.store.selected = null;
},
reveal_solution: function() {
if (this.store.section == 0) {
// remove wrong elements
let incorrect_rows = [];
this.incorrects.forEach((incorrect, i) => {
if (incorrect) {
incorrect_rows.push(i);
}
});
incorrect_rows.reverse().forEach(rowNum => {
this.solution.splice(rowNum, 1);
});
// insert missing elements and mark them as 'got_revealed'
for (let i=0; i<cards_content[0].length; i++) {
if (this.solution.length <= i || this.solution[i].idx[0] != i) {
this.solution.splice(i, 0, {
idx: [i],
got_revealed: true,
});
}
}
} else {
this.solution.forEach((elem, i) => {
let card_inserted = elem.idx.length > this.store.section;
let card_needed = cards_content[this.store.section][i] != null;
if (!card_inserted && card_needed) {
elem.idx.push(i);
elem.got_revealed = true;
} else if (card_inserted && !card_needed) {
elem.idx.splice(this.store.section, 1);
} else if (card_inserted && card_needed && elem.idx[this.store.section] != i) {
Vue.set(elem.idx, this.store.section, i);
elem.got_revealed = true;
}
});
}
},
},
});