Main Page: Difference between revisions
No edit summary |
No edit summary |
||
| Line 1: | Line 1: | ||
__NOTOC__ | |||
<html> | <html> | ||
| Line 561: | Line 559: | ||
.vu-people-controls { | .vu-people-controls { | ||
display: grid; | display: grid; | ||
grid-template-columns: auto auto minmax(0, 1fr) auto; | grid-template-columns: auto auto minmax(0, 1fr) auto auto; | ||
align-items: center; | align-items: center; | ||
gap: 8px; | gap: 8px; | ||
| Line 929: | Line 927: | ||
.vu-people-controls { | .vu-people-controls { | ||
grid-template-columns: auto auto minmax(50px, 1fr) auto; | grid-template-columns: auto auto minmax(50px, 1fr) auto auto; | ||
} | } | ||
| Line 1,119: | Line 1,117: | ||
<section class="vu-people" id="vu-people-slider" aria-label="People slideshow"> | <section class="vu-people" id="vu-people-slider" aria-label="People slideshow"> | ||
<div class="vu-people-status" id="vu-people-status">Loading | <div class="vu-people-status" id="vu-people-status">Loading biographies…</div> | ||
<div class="vu-people-stage"> | <div class="vu-people-stage"> | ||
| Line 1,130: | Line 1,128: | ||
<div class="vu-person-copy"> | <div class="vu-person-copy"> | ||
<h2 class="vu-person-title" id="vu-person-title">Toonio Noord</h2> | <h2 class="vu-person-title" id="vu-person-title">Toonio Noord</h2> | ||
| Line 1,246: | Line 1,243: | ||
ready(function () { | ready(function () { | ||
var root = document.querySelector(".vu-main"); | var root = document.querySelector(".vu-main"); | ||
if (!root || !window.fetch || !window.DOMParser) return; | |||
var fallbackImage = "/wiki/Special:Redirect/file/Vu-logo.png"; | var fallbackImage = "/wiki/Special:Redirect/file/Vu-logo.png"; | ||
var slider = document.getElementById("vu-people-slider"); | var slider = document.getElementById("vu-people-slider"); | ||
var status = document.getElementById("vu-people-status"); | var status = document.getElementById("vu-people-status"); | ||
| Line 1,354: | Line 1,256: | ||
var next = document.getElementById("vu-person-next"); | var next = document.getElementById("vu-person-next"); | ||
var toggle = document.getElementById("vu-person-toggle"); | var toggle = document.getElementById("vu-person-toggle"); | ||
if (!slider || !status || !image || !title || !extract || !link || !count || !previous || !next || !toggle) return; | |||
function wikiUrl(name) { | |||
if (window.mw && mw.util) return mw.util.getUrl(name); | |||
return "/wiki/" + encodeURIComponent(name.replace(/ /g, "_")).replace(/%2F/g, "/"); | |||
return; | |||
} | } | ||
function fetchText(url) { | |||
return fetch(url, { credentials: "same-origin", cache: "no-store" }).then(function (response) { | |||
if (!response.ok) throw new Error("Request failed"); | |||
return response.text(); | |||
}); | |||
} | |||
function shuffle(items) { | function shuffle(items) { | ||
| Line 1,384: | Line 1,278: | ||
} | } | ||
return items; | return items; | ||
} | |||
function unique(items) { | |||
var seen = {}; | |||
return items.filter(function (item) { | |||
if (!item || !item.title || seen[item.title]) return false; | |||
seen[item.title] = true; | |||
return true; | |||
}); | |||
} | |||
function markMissingLinks() { | |||
if (!window.mw || !mw.loader) return; | |||
mw.loader.using(["mediawiki.api", "mediawiki.util"]).then(function () { | |||
var api = new mw.Api(); | |||
var links = Array.prototype.slice.call(root.querySelectorAll("a[data-wiki-title]")); | |||
var titles = links.map(function (item) { return item.getAttribute("data-wiki-title"); }) | |||
.filter(function (item, index, all) { return item && all.indexOf(item) === index; }); | |||
for (var i = 0; i < titles.length; i += 50) { | |||
(function (batch) { | |||
api.get({ action: "query", formatversion: 2, titles: batch.join("|") }).then(function (data) { | |||
var missing = {}; | |||
if (data.query && data.query.pages) { | |||
data.query.pages.forEach(function (page) { if (page.missing) missing[page.title] = true; }); | |||
} | |||
links.forEach(function (item) { | |||
var pageTitle = item.getAttribute("data-wiki-title"); | |||
if (!missing[pageTitle]) return; | |||
item.classList.add("new"); | |||
item.href = mw.util.getUrl(pageTitle, { action: "edit", redlink: 1 }); | |||
item.title = pageTitle + " (page does not exist)"; | |||
}); | |||
}).catch(function () {}); | |||
})(titles.slice(i, i + 50)); | |||
} | |||
}).catch(function () {}); | |||
} | |||
markMissingLinks(); | |||
var fallbackTitles = [ | |||
"Abdelkrim El Berkani", "Alessandro Nostrini", "Alexandru Ionuț", "Ana-Maria Nistor", | |||
"Andrei Ionuț", "Angela Noord", "Angelo Angedrik Noord", "Angelo Martin Zuid", | |||
"Antonie Ronald Paap", "Ben Paap", "Benny Paap", "Bob Noord", "Cees Paap", | |||
"Charlie Churchill", "Derek Paap", "Domenico Nostrini", "Eef Hoos", "Eef Paap", | |||
"Emiel Noord", "Eva Noord", "Evert Angedrik Noord", "Francesco Nostrini", | |||
"Girolamo Nostrini", "Grozav Ionuț", "Humphrey van Hetten", "Jan Paap", | |||
"Kateryna Moroz", "Kenzi Schladenberg", "Lorenzo Nostrini", "Lourens Schroeter", | |||
"Martin Noord", "Matteo Nostrini", "Nicolae Ionuț", "Otto Hoos", "Rasmus Rogganoid", | |||
"Richard Hoos", "Rikard Rogganoid", "Toonio Noord", "Viorica Rogganoid", "Walter Noord" | |||
]; | |||
function fallbackMembers() { | |||
return fallbackTitles.map(function (name) { return { title: name, url: wikiUrl(name) }; }); | |||
} | |||
function parseCategory(html) { | |||
var doc = new DOMParser().parseFromString(html, "text/html"); | |||
var area = doc.querySelector("#mw-pages") || doc.querySelector(".mw-category"); | |||
if (!area) return []; | |||
var anchors = Array.prototype.slice.call(area.querySelectorAll(".mw-category-group a, .mw-category a")); | |||
return unique(anchors.map(function (anchor) { | |||
var name = (anchor.textContent || "").trim(); | |||
var href = anchor.getAttribute("href") || ""; | |||
if (!name || !href || /^(Category|Special|File|Template|Help|Talk|User|MediaWiki):/i.test(name)) return null; | |||
return { title: name, url: new URL(href, window.location.href).href }; | |||
})); | |||
} | |||
function getMembers() { | |||
return fetchText(wikiUrl("Category:People")).then(function (html) { | |||
var members = parseCategory(html); | |||
if (members.length < 2) throw new Error("No category members"); | |||
return members; | |||
}).catch(function () { return fallbackMembers(); }); | |||
} | |||
function clean(text) { | |||
return (text || "").replace(/\[\s*\d+(?:\.\d+)?\s*\]/g, "").replace(/\s+/g, " ").trim(); | |||
} | } | ||
function shorten(text, limit) { | function shorten(text, limit) { | ||
if (! | var value = clean(text); | ||
if (value.length <= limit) return value; | |||
var cut = value.slice(0, limit); | |||
var stop = Math.max(cut.lastIndexOf(". "), cut.lastIndexOf("! "), cut.lastIndexOf("? ")); | |||
if (stop > 180) return cut.slice(0, stop + 1); | |||
var space = cut.lastIndexOf(" "); | |||
return cut.slice(0, space > 0 ? space : limit) + "…"; | |||
} | |||
function findLead(content) { | |||
if (!content) return ""; | |||
var paragraphs = Array.prototype.slice.call(content.children).filter(function (element) { return element.tagName === "P"; }); | |||
paragraphs = paragraphs.concat(Array.prototype.slice.call(content.querySelectorAll("p"))); | |||
for (var i = 0; i < paragraphs.length; i++) { | |||
var paragraph = paragraphs[i]; | |||
if (paragraph.closest("table") || paragraph.closest(".navbox") || paragraph.closest(".mw-references-wrap")) continue; | |||
var value = clean(paragraph.textContent); | |||
if (value.length >= 70) return value; | |||
} | } | ||
return ""; | |||
} | |||
function scoreImage(element, pageTitle) { | |||
var source = element.getAttribute("src") || element.getAttribute("data-src") || ""; | |||
var alt = ((element.getAttribute("alt") || "") + " " + (element.getAttribute("title") || "")).toLowerCase(); | |||
var combined = (source + " " + alt).toLowerCase(); | |||
if (!source || /(logo|icon|button|spinner|poweredby|powered_by|wikimedia-button|ambox|question_book|edit-clear|magnify-clip)/i.test(combined)) return -1000; | |||
var score = 0; | |||
if (/(signature|coat of arms|flag of|map of|location map)/i.test(alt)) score -= 8; | |||
if (alt.indexOf(pageTitle.toLowerCase()) !== -1) score += 12; | |||
if (element.closest(".infobox")) score += 10; | |||
if (element.closest("table")) score += 4; | |||
var width = parseInt(element.getAttribute("width"), 10) || 0; | |||
var height = parseInt(element.getAttribute("height"), 10) || 0; | |||
if (width >= 150 || height >= 180) score += 3; | |||
return score; | |||
} | |||
var | function findImage(content, pageTitle, pageUrl) { | ||
if (!content) return ""; | |||
var images = Array.prototype.slice.call(content.querySelectorAll(".infobox img, table img, figure img, .thumb img, img")); | |||
var best = null; | |||
var bestScore = -1000; | |||
images.forEach(function (candidate) { | |||
var score = scoreImage(candidate, pageTitle); | |||
if (score > bestScore) { bestScore = score; best = candidate; } | |||
}); | |||
if (!best || bestScore < 0) return ""; | |||
var source = best.getAttribute("src") || best.getAttribute("data-src") || ""; | |||
try { return new URL(source, pageUrl).href; } catch (error) { return ""; } | |||
} | |||
function parsePerson(member, html) { | |||
var doc = new DOMParser().parseFromString(html, "text/html"); | |||
} | var content = doc.querySelector("#mw-content-text .mw-parser-output") || doc.querySelector(".mw-parser-output"); | ||
var heading = doc.querySelector("#firstHeading"); | |||
var pageTitle = heading ? heading.textContent.trim() : member.title; | |||
var lead = findLead(content); | |||
var pageImage = findImage(content, pageTitle, member.url); | |||
if (!lead || !pageImage) return null; | |||
return { title: pageTitle, extract: shorten(lead, 660), image: pageImage, url: member.url }; | |||
} | |||
function loadPerson(member) { | |||
return fetchText(member.url).then(function (html) { return parsePerson(member, html); }).catch(function () { return null; }); | |||
} | |||
if ( | function loadPeople(members, desired) { | ||
var candidates = shuffle(unique(members).slice()).slice(0, 60); | |||
var results = []; | |||
var cursor = 0; | |||
function worker() { | |||
if (cursor >= candidates.length || results.length >= desired) return Promise.resolve(); | |||
var member = candidates[cursor++]; | |||
return loadPerson(member).then(function (person) { | |||
if (person && !results.some(function (existing) { return existing.title === person.title; })) results.push(person); | |||
}).then(worker); | |||
} | } | ||
var workers = []; | |||
for (var i = 0; i < 6; i++) workers.push(worker()); | |||
return Promise.all(workers).then(function () { return results.slice(0, desired); }); | |||
} | |||
var people = []; | |||
var current = 0; | |||
var timer = null; | |||
var playing = true; | |||
var interval = 9000; | |||
function restartProgress() { | function restartProgress() { | ||
slider.classList.remove("is-playing"); | slider.classList.remove("is-playing"); | ||
void slider.offsetWidth; | void slider.offsetWidth; | ||
if (playing && people.length > 1) slider.classList.add("is-playing"); | |||
if (playing) | |||
} | } | ||
function schedule() { | function schedule() { | ||
if (timer) | if (timer) window.clearTimeout(timer); | ||
restartProgress(); | restartProgress(); | ||
if (!playing || people.length < 2) return; | |||
if (!playing || people.length < 2) | timer = window.setTimeout(function () { show(current + 1); }, interval); | ||
timer = window.setTimeout(function () { | |||
} | } | ||
function show(index) { | function show(index) { | ||
if (!people.length) | if (!people.length) return; | ||
current = (index + people.length) % people.length; | current = (index + people.length) % people.length; | ||
var person = people[current]; | var person = people[current]; | ||
slider.classList.add("is-changing"); | slider.classList.add("is-changing"); | ||
window.setTimeout(function () { | window.setTimeout(function () { | ||
image.src = person.image || fallbackImage; | image.src = person.image || fallbackImage; | ||
image.alt = person.title; | image.alt = person.title; | ||
title.textContent = person.title; | title.textContent = person.title; | ||
extract.textContent = | extract.textContent = person.extract; | ||
link.href = person.url | link.href = person.url; | ||
count.textContent = (current + 1) + " / " + people.length; | count.textContent = (current + 1) + " / " + people.length; | ||
window.setTimeout(function () { slider.classList.remove("is-changing"); }, 40); | |||
window.setTimeout(function () { | |||
}, 150); | }, 150); | ||
schedule(); | schedule(); | ||
} | } | ||
function setPlaying(value) { | function setPlaying(value) { | ||
playing = value; | playing = value && people.length > 1; | ||
toggle.textContent = playing ? "Pause" : "Play"; | toggle.textContent = playing ? "Pause" : "Play"; | ||
toggle.setAttribute( | toggle.setAttribute("aria-label", playing ? "Pause slideshow" : "Play slideshow"); | ||
if (playing) schedule(); | |||
else { | |||
if (timer) window.clearTimeout(timer); | |||
if (playing) | |||
if (timer) | |||
slider.classList.remove("is-playing"); | slider.classList.remove("is-playing"); | ||
} | } | ||
} | } | ||
previous.addEventListener("click", function () { | previous.addEventListener("click", function () { show(current - 1); }); | ||
next.addEventListener("click", function () { show(current + 1); }); | |||
toggle.addEventListener("click", function () { setPlaying(!playing); }); | |||
next.addEventListener("click", function () { | |||
toggle.addEventListener("click", function () { | |||
slider.addEventListener("mouseenter", function () { | slider.addEventListener("mouseenter", function () { | ||
if (playing && timer) { | if (playing && timer) { window.clearTimeout(timer); slider.classList.remove("is-playing"); } | ||
}); | }); | ||
slider.addEventListener("mouseleave", function () { if (playing) schedule(); }); | |||
image.addEventListener("error", function () { if (image.src.indexOf("Vu-logo.png") === -1) image.src = fallbackImage; }); | |||
status.hidden = false; | status.hidden = false; | ||
getMembers() | |||
.then(function (members) { return loadPeople(members, 12); }) | |||
.then( | .then(function (loaded) { | ||
.then(function ( | if (loaded.length >= 2) return loaded; | ||
if (! | return loadPeople(fallbackMembers(), 12).then(function (fallbackLoaded) { return unique(loaded.concat(fallbackLoaded)); }); | ||
}) | |||
.then(function (loaded) { | |||
status.hidden = true; | |||
if (!loaded.length) { | |||
count.textContent = "1 / 1"; | |||
setPlaying(false); | |||
return; | |||
} | } | ||
people = shuffle(loaded); | |||
people = shuffle( | previous.disabled = people.length < 2; | ||
next.disabled = people.length < 2; | |||
toggle.disabled = people.length < 2; | |||
show(0); | show(0); | ||
setPlaying(people.length > 1); | |||
}) | }) | ||
.catch(function () { | .catch(function () { | ||
status. | status.hidden = true; | ||
count.textContent = "1 / 1"; | count.textContent = "1 / 1"; | ||
previous.disabled = true; | |||
next.disabled = true; | |||
toggle.disabled = true; | |||
setPlaying(false); | setPlaying(false); | ||
}); | }); | ||
| Line 1,623: | Line 1,531: | ||
})(); | })(); | ||
</script> | </script> | ||
</html> | </html> | ||
| Line 1,632: | Line 1,541: | ||
[[Category:Reference pages]] | [[Category:Reference pages]] | ||
Revision as of 12:53, 19 June 2026
About the wiki
The Vrienden Universe began in 2019 as De Lijers De Vrienden, a project about De Vrienden. The project expanded as related pages were added and became a single encyclopedia covering the wider history around its original subject.
The wiki now contains hundreds of connected pages developed over several years. Information established on one page is carried into related articles, allowing readers to follow the same history throughout the site.
Reichsministerium für Bergbau und Rohstoffe
The Reichsministerium für Bergbau und Rohstoffe was a central ministry of the Government of the Tanoa Einsatzgruppen. It administered mining and the state supply of raw materials.
The ministry supported the command economy of Tanoa and supplied the regime's industrial system.
Open page
Browse
Toonio Noord
Toonio Noord, born 4 April 1969, is a Dutch registration official and former security guard from Vriendendam. He works for the Stichting Noord Registratiebureau and is a member of the Noord family.
Open biographyChoose a starting point
Most articles link directly to the subjects needed to continue through the history. Readers can begin with De Vrienden or select a broader section above.
The principal family pages provide the main route from De Vrienden into family history. Index pages provide access to the rest of the site.
Principal families
Community
Information about contributing is available on the community page.
Details
Information about the scope of the site is available in the disclaimer.