Add new templates and tests for improved functionality

- Created index.html template for the homepage with service cards and partner logos.
- Added page_from_md.html template for rendering pages from markdown.
- Developed services.html template detailing various services offered.
- Implemented tests for link handling in markdown, ensuring external links open in new tabs and internal links function correctly.
- Enhanced markdown parser tests to validate heading extraction, content rendering, and link safety.
- Introduced utility tests for template rendering, HTML minification, and JavaScript minification.

Co-authored-by: Copilot <copilot@github.com>
This commit is contained in:
2026-05-02 13:05:43 +02:00
parent 559a6e4c56
commit 9f0a216c5e
79 changed files with 4700 additions and 0 deletions
+1
View File
@@ -0,0 +1 @@
document.getElementById('contact-form').addEventListener('submit', function(event) { event.preventDefault(); const formData = new FormData(event.target); fetch(event.target.action, { method: event.target.method, body: formData, }) .then(response => { if (!response.ok) { throw new Error('Network response was not ok'); } return response.json(); }) .then(data => { console.log('Success:', data); }) .catch((error) => { console.error('Error:', error); }); });
+1
View File
@@ -0,0 +1 @@
function HumansNotBots(replacement_method, strAT, strDOT) { if (document.getElementsByTagName) { if (strAT == null || strDOT == null) { strAT = "AT"; strDOT = "DOT"; } var disguisedForm = "([a-zA-Z0-9._%+-]+)\\s" + strAT + "\\s([a-zA-Z0-9.-]+)\\s" + strDOT + "\\s(co.uk|[a-zA-Z]{2,4})"; var htmlbody = document.getElementsByTagName("body")[0]; if (replacement_method == "innerhtml") HumansNotBots_innerhtml(htmlbody, disguisedForm); else if (replacement_method == "dom") HumansNotBots_dom(htmlbody, disguisedForm); } } function HumansNotBots_innerhtml(htmlbody, disguisedForm) { var matchexp = new RegExp(disguisedForm, "g"); var replacement = '<a href="mailto:$1@$2.$3">$1@$2.$3</a>'; var newInnerHTML = htmlbody.innerHTML.replace(matchexp, replacement); htmlbody.innerHTML = newInnerHTML; } function HumansNotBots_dom(element, disguisedForm) { if (element) { if (element.hasChildNodes()) { var child = element.firstChild; while (child) { HumansNotBots_dom(child, disguisedForm); child = child.nextSibling; } } else if (element.nodeValue) { var matchexp = new RegExp(disguisedForm, "g"); var disguisedEmailAddresses = element.nodeValue.match(matchexp); if (disguisedEmailAddresses !== null) { var unprocessedText = element.nodeValue; var newParentsChildren = new Array(); for (var i = 0; i < disguisedEmailAddresses.length; i++) { var disguisedEmailAddress = disguisedEmailAddresses[i]; var textBefore = unprocessedText.substring( 0, unprocessedText.search(new RegExp(disguisedEmailAddress)) ); if (textBefore) { newParentsChildren.push(document.createTextNode(textBefore)); } var matchexp1 = new RegExp(disguisedForm); var realEmailAddress = disguisedEmailAddress.replace( matchexp1, "$1@$2.$3" ); var a = document.createElement("a"); a.setAttribute("href", "mailto:" + realEmailAddress); a.appendChild(document.createTextNode(realEmailAddress)); newParentsChildren.push(a); unprocessedText = unprocessedText.substring( textBefore.length + disguisedEmailAddress.length ); } if (unprocessedText) { newParentsChildren.push(document.createTextNode(unprocessedText)); } var parent = element.parentNode; var child = newParentsChildren.shift(); while (child) { parent.insertBefore(child, element); child = newParentsChildren.shift(); } parent.removeChild(element); } } } }
+1
View File
@@ -0,0 +1 @@
document.addEventListener("DOMContentLoaded", function () { const hamburger = document.querySelector(".hamburger-menu"); const navMenu = document.querySelector(".nav-menu"); if (!hamburger || !navMenu) { return; } hamburger.addEventListener("click", function () { hamburger.classList.toggle("open"); navMenu.classList.toggle("open"); }); document.addEventListener("click", function (event) { if (!hamburger.contains(event.target) && !navMenu.contains(event.target)) { hamburger.classList.remove("open"); navMenu.classList.remove("open"); } }); navMenu.addEventListener("click", function (event) { if (event.target.tagName === "A") { hamburger.classList.remove("open"); navMenu.classList.remove("open"); } }); });
+1
View File
@@ -0,0 +1 @@
function partnerRotate(interval = 3000) { const partners = document.querySelectorAll("img[src*='img/partner/']"); for (let i = 1; i < partners.length; i++) { partners[i].classList.add("hidden"); } let currentIndex = 0; const totalPartners = partners.length; setInterval(() => { partners[currentIndex].classList.add("hidden"); currentIndex = (currentIndex + 1) % totalPartners; partners[currentIndex].classList.remove("hidden"); }, interval); } window.onload = function () { partnerRotate(5000); };