assets/js/fetchText.js

411 lines
14 KiB
JavaScript

var freeFetchedText = null;
var makeupForm = null;
var chartAcceptanceData = null;
var chartAcceptance = null;
function createAcceptanceChart (id) {
chartAcceptance = Highcharts.chart(id, {
chart: {
type: 'column'
},
yAxis: {
title: {
enabled: false
}
},
xAxis: {
categories: ['-5', '-4', '-3', '-2', '-1', '+1', '+2', '+3', '+4', '+5']
},
legend:{ enabled:false },
title: {
text: 'Zustimmung'
},
series: [
{
name: 'Umfrage, erste Iteration',
color: 'black',
data: [5,8,1,10,3,3,2,6,3,2]
}
],
});
};
window.showAcceptance = function (arr, autor) {
if (!document.getElementById('HoverInfo'))
return;
document.getElementById('HoverInfo').hidden = !(arr || autor);
if (autor) {
document.getElementById('AutorInfo').textContent = 'Autor: '+autor;
document.getElementById('AutorInfo').hidden = false;
} else
document.getElementById('AutorInfo').hidden = true;
if (arr && makeupForm.showAcceptance.checked) {
document.getElementById('Acceptance').hidden = false;
if (arr == chartAcceptanceData) return;
chartAcceptanceData = arr;
chartAcceptance.series[0].setData(arr);
if (arr.length == 10)
chartAcceptance.xAxis[0].update({categories: ['-5', '-4', '-3', '-2', '-1', '+1', '+2', '+3', '+4', '+5']});
else if (arr.length == 3)
chartAcceptance.xAxis[0].update({categories: ['Nein', 'Enthaltung', 'Ja']});
else throw 'Unknown vote system!';
} else
document.getElementById('Acceptance').hidden = true;
};
function setMakeupForm (el, showingRelease) {
makeupForm = el;
if (showingRelease) {
makeupForm.showingRelease = true;
makeupForm.showComments.checked = false;
makeupForm.showAccepted.checked = false;
makeupForm.showDeletedContent.checked = false;
makeupForm.showAcceptance.checked = false;
}
let inp = el.getElementsByTagName('input');
for (let i = 0; i < inp.length; i++)
inp[i].addEventListener('input', function () {
makeupText(currentSite);
}, false);
el.genderSelect.addEventListener('input', function () {
makeupText(currentSite);
}, false);
if (el.selectProgram)
el.selectProgram.addEventListener('input', function () {
filterProgram(currentSite);
}, false);
if (el.createRelease)
el.createRelease.addEventListener('click', function () {
makeupForm.isRelease = true;
dynFrame.getActiveCommunicator().el.src += ''; // reload
el.createRelease.disabled = true;
}, false);
}
function filterProgram (win) {
let head = win.document.getElementsByTagName('head')[0];
let sty = win.document.getElementById('programFilter');
if (!sty) {
sty = win.document.createElement('style');
sty.setAttribute('type', 'text\/css');
sty.setAttribute('id', 'programFilter');
head.appendChild(sty);
}
switch (makeupForm.selectProgram.value) {
case 'grundsatz':
sty.innerHTML = '.eu { display: none; }'+"\n"
+'.bundestag { display: none; }';
break;
case 'eu':
sty.innerHTML = '.grundsatz { display: none; }'+"\n"
+'.bundestag { display: none; }';
break;
case 'bundestag':
sty.innerHTML = '.eu { display: none; }'+"\n"
+'.grundsatz { display: none; }';
break;
default:
sty.innerHTML = '';
break;
}
}
function makeupText (win) {
let sty = win.document.getElementById('makeupStyle');
if (!sty) {
sty = win.document.createElement('style');
sty.setAttribute('id', 'makeupStyle');
win.document.getElementsByTagName('head')[0].appendChild(sty);
}
let css = '';
if (makeupForm.showComments.checked) css += "body { padding-right:250px; }\n";
else css += "commentnote { display: none; }\n";
if (makeupForm.showAccepted.checked)
css += ""
+".accepted, commentnote.accepted div {\n"
+" background-color: #CFC;\n"
+"}\n"
+".rejected, commentnote.rejected div {\n"
+" background-color: #FCC;\n"
+"}\n";
switch (makeupForm.genderSelect.selectedIndex) {
case 0:
css += ""
+".end-f::after { content: 'innen'; }\n"
+".end-m::before { content: ' und '; }\n"
+".or.end-m::before { content: ' oder '; }\n"
+".dash.end-m::before { content: '- und '; }\n";
break;
case 1:
css += ""
+".end-f::after { content: '*innen'; }\n"
+".end-m { display: none; }\n";
break;
case 2:
css += ""
+".end-f::after { content: ':innen'; }\n"
+".end-m { display: none; }\n";
break;
case 3:
css += ""
+".end-f::after { content: 'Innen'; }\n"
+".end-m { display: none; }\n";
break;
case 4:
css += ""
+".end-f { display: none; }\n";
break;
case 5:
css += ""
+".end-f::after { content: 'innen'; }\n"
+".end-m { display: none; }\n";
break;
}
if (!makeupForm.showDeletedContent.checked) css += "del, .rejected { display: none; }\n";
sty.innerHTML = css;
}
function fetchText (win) {
let query = window.location.href.split('#').shift().split('?').pop().split('&');
for (let i = 0; i < query.length; i++) {
query[i] = query[i].split('=');
if (query[i].length == 2 && query[i][0] == 'program') {
makeupForm.selectProgram.value = query[i][1];
}
}
if (makeupForm.showingRelease) {
makeupText(win);
return;
}
if (freeFetchedText) freeFetchedText();
var counterComments = 0;
var release = false;
if (makeupForm.isRelease) release = true;
function isInProgram (className, program) {
let programs = ['grundsatz', 'eu', 'bundestag'];
if ((program == 'alles') || ((typeof className) != 'string')) return true;
let spl = className.split(' ');
let hasProgram = false;
let hasGivenProgram = false;
for (let i = 0; i < spl.length; i++) {
if (programs.includes(spl[i])) hasProgram = true;
if (spl[i] == program) hasGivenProgram = true;
}
return !hasProgram || hasGivenProgram;
}
function deleteElementExtra (el) { // deletes an element from parent and in some special cases also recursively the parent, if it is empty afterwards.
let p = el.parentElement;
p.removeChild(el);
let empty = true;
for (let i = 0; i < p.childNodes.length; i++) {
if (p.childNodes[i].nodeType == 1) {
empty = false;
break;
}
if (p.childNodes[i].nodeType == 3) {
let str = p.childNodes[i].textContent;
if (str.split(' ').join('').split("\n").join('') != '') {
empty = false;
break;
}
}
}
if (empty && (p.tagName.toLowerCase() == 'p' || p.tagName.toLowerCase() == 'h1' || p.tagName.toLowerCase() == 'h2' || p.tagName.toLowerCase() == 'h3' || p.tagName.toLowerCase() == 'li' || p.tagName.toLowerCase() == 'ul' || p.tagName.toLowerCase() == 'ol'))
deleteElementExtra(p);
}
function interpretAcceptance (str) {
if (str == '?')
return {
arr: null,
average: Number.NaN,
accepted: false
};
let arr = str.split(',');
let accepted = false;
let average = 0;
if (arr.length == 10) {
let nPositiv = 0;
let sum = 0;
for (let j = 0; j < 10; j++) {
arr[j] = parseInt(arr[j]);
sum += arr[j];
if (j < 5) {
average += arr[j] * (j-5);
} else {
nPositiv += arr[j];
average += arr[j] * (j-4);
}
}
average /= sum;
accepted = (average > 0) && (nPositiv >= sum / 3 * 2);
} else if (arr.length == 3) {
arr[0] = parseInt(arr[0]);
arr[1] = parseInt(arr[1]);
arr[2] = parseInt(arr[2]);
accepted = arr[0] < arr[2];
average = (arr[2] - arr[0]) / (arr[0]+arr[1]+arr[2]);
} else return;
return {
arr: arr,
average: average,
accepted: accepted
};
}
function iterateContent (el) {
for (let i = el.childNodes.length-1; i >= 0; i--) {
if (el.childNodes[i].nodeType == 8) { // comments
if (release) {
el.removeChild(el.childNodes[i]);
continue;
} else { // convert comment to element
let insertEl = win.document.createElement('commentnote');
let textbox = win.document.createElement('div');
textbox.style.top = (counterComments % 3 - 2) * 0.4 + 'em';
counterComments++;
textbox.textContent = el.childNodes[i].nodeValue.trim();
if (textbox.textContent.indexOf('Überarbeitung:') == 0) insertEl.className += ' redaction';
insertEl.appendChild(textbox);
el.insertBefore(insertEl, el.childNodes[i]);
el.removeChild(el.childNodes[i+1]);
if (textbox.textContent.indexOf('zustimmung="') == 0) {
let zuEnd = textbox.textContent.indexOf('"', 12);
insertEl.setAttribute('zustimmung', textbox.textContent.substring(12, zuEnd));
textbox.textContent = textbox.textContent.substring(zuEnd+2, textbox.textContent.length);
}
}
}
if (el.childNodes[i].nodeType == 1) { // elements
if (release && ((el.childNodes[i].tagName.toLowerCase() == 'del') || (!isInProgram(el.childNodes[i].className, makeupForm.selectProgram.value)))) {
deleteElementExtra(el.childNodes[i]);
continue;
}
let str = el.childNodes[i].getAttribute('zustimmung');
if (str !== null && str != '') {
let acceptance = interpretAcceptance(str);
if (acceptance) {
el.childNodes[i].acceptance = acceptance;
if (!acceptance.accepted && release) {
deleteElementExtra(el.childNodes[i]);
continue;
}
if (release)
el.childNodes[i].removeAttribute('zustimmung');
else {
if (!acceptance.arr) el.childNodes[i].className += ' pending';
else if (acceptance.accepted) el.childNodes[i].className += ' accepted';
else el.childNodes[i].className += ' rejected';
}
}
}
str = el.childNodes[i].getAttribute('ref');
if (release) {
el.childNodes[i].removeAttribute('ref');
el.childNodes[i].removeAttribute('date');
el.childNodes[i].removeAttribute('autor');
} else if (str !== null && str != '') {
let a = win.document.createElement('a');
a.href = str;
a.textContent = '🗨';
a.style.position = 'relative';
a.style.float = 'left';
a.style.width = '0px';
a.style.left = '-35px';
a.style.textDecoration = 'none';
el.childNodes[i].insertBefore(a, el.childNodes[i].firstChild);
}
iterateContent(el.childNodes[i]);
if ((el.tagName.toLowerCase() == 'div') && ((' '+el.className+' ').indexOf(' thema ') >= 0) && (el.childNodes[i].tagName.toLowerCase() == 'div')) { // Themensektion, anklickbaren Header erzeugen
let flapoutHeader = document.createElement('div');
flapoutHeader.className = 'flapout';
flapoutHeader.setAttribute('onclick', 'toggleFlapout(this)');
let spl = el.childNodes[i].className.split(' ');
for (let j = 0; j < spl.length; j++)
switch (spl[j]) {
case 'einleitung':
flapoutHeader.textContent = 'Einleitung in das Thema';
flapoutHeader.className += ' open';
el.childNodes[i].className += ' open';
break;
case 'problem':
flapoutHeader.textContent = 'Problembeschreibung';
break;
case 'forderungen':
flapoutHeader.textContent = 'Forderungen';
flapoutHeader.className += ' open';
el.childNodes[i].className += ' open';
break;
case 'fortschritt':
flapoutHeader.textContent = 'Fortschritt';
break;
case 'beispiel':
flapoutHeader.textContent = 'Beispiel';
break;
case 'kosten':
flapoutHeader.textContent = 'Kosten';
break;
case 'ziel':
flapoutHeader.textContent = 'Ziel';
break;
case 'verteidigung':
flapoutHeader.textContent = 'Entkräften von Gegenargumenten';
break;
case 'relevanz':
flapoutHeader.textContent = 'Relevanz';
break;
case 'quellen':
flapoutHeader.textContent = 'Weitere Quellen';
break;
}
el.insertBefore(flapoutHeader, el.childNodes[i]);
}
}
}
}
iterateContent(win.document.body);
let scr = document.createElement('script');
scr.setAttribute('type', 'text/javascript');
function toggleFlapout (el) {
let i = 0;
while (el.parentElement.childNodes[i] != el) i++;
do
i++;
while (el.parentElement.childNodes[i].nodeType != 1);
let spl = el.parentElement.childNodes[i].className.split(' ');
let j = spl.indexOf('open');
if (j >= 0) spl.splice(j, 1);
else spl.push('open');
el.parentElement.childNodes[i].className = spl.join(' ');
spl = el.className.split(' ');
j = spl.indexOf('open');
if (j >= 0) spl.splice(j, 1);
else spl.push('open');
el.className = spl.join(' ');
}
scr.innerHTML = toggleFlapout.toString();
win.document.body.appendChild(scr);
if (release) {
document.getElementById('Codeblock').textContent = win.document.body.innerHTML;
document.getElementById('Codeblock').style.display = 'block';
} else
win.addEventListener('mousemove', function (ev) {
let el = ev.target;
let arr = null;
let autor = '';
while (el) {
if (arr == null && el.acceptance)
arr = el.acceptance.arr;
if (autor == '' && el.getAttribute('autor'))
autor = el.getAttribute('autor');
if (autor && arr)
break;
el = el.parentElement;
}
parent.showAcceptance(arr, autor);
}, false);
makeupText(win);
filterProgram(win);
};