<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.thehomecounty.com/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3ACommon.js</id>
	<title>MediaWiki:Common.js - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.thehomecounty.com/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3ACommon.js"/>
	<link rel="alternate" type="text/html" href="https://wiki.thehomecounty.com/index.php?title=MediaWiki:Common.js&amp;action=history"/>
	<updated>2026-10-05T13:14:28Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.11</generator>
	<entry>
		<id>https://wiki.thehomecounty.com/index.php?title=MediaWiki:Common.js&amp;diff=1876&amp;oldid=prev</id>
		<title>Hedgehoger97: Setup Home County wiki</title>
		<link rel="alternate" type="text/html" href="https://wiki.thehomecounty.com/index.php?title=MediaWiki:Common.js&amp;diff=1876&amp;oldid=prev"/>
		<updated>2026-10-04T15:34:54Z</updated>

		<summary type="html">&lt;p&gt;Setup Home County wiki&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
/* BEGIN HOME COUNTY HOMEPAGE V1 */&lt;br /&gt;
/* ResourceLoader-compatible homepage search backed by the live wiki index. */&lt;br /&gt;
mw.hook(&amp;#039;wikipage.content&amp;#039;).add(function () {&lt;br /&gt;
    var home = document.getElementById(&amp;#039;hc-home&amp;#039;);&lt;br /&gt;
    if (!home || home.getAttribute(&amp;#039;data-enhanced&amp;#039;)) { return; }&lt;br /&gt;
    var input = home.querySelector(&amp;#039;input[name=&amp;quot;search&amp;quot;]&amp;#039;);&lt;br /&gt;
    var form = input &amp;amp;&amp;amp; input.closest(&amp;#039;form&amp;#039;);&lt;br /&gt;
    if (!form) { return; }&lt;br /&gt;
    home.setAttribute(&amp;#039;data-enhanced&amp;#039;, &amp;#039;true&amp;#039;);&lt;br /&gt;
    input.setAttribute(&amp;#039;aria-label&amp;#039;, &amp;#039;Search the wiki&amp;#039;);&lt;br /&gt;
    input.setAttribute(&amp;#039;autocomplete&amp;#039;, &amp;#039;off&amp;#039;);&lt;br /&gt;
    input.setAttribute(&amp;#039;spellcheck&amp;#039;, &amp;#039;false&amp;#039;);&lt;br /&gt;
    input.setAttribute(&amp;#039;role&amp;#039;, &amp;#039;combobox&amp;#039;);&lt;br /&gt;
    input.setAttribute(&amp;#039;aria-autocomplete&amp;#039;, &amp;#039;list&amp;#039;);&lt;br /&gt;
    input.setAttribute(&amp;#039;aria-controls&amp;#039;, &amp;#039;hc-search-results&amp;#039;);&lt;br /&gt;
    input.setAttribute(&amp;#039;aria-expanded&amp;#039;, &amp;#039;false&amp;#039;);&lt;br /&gt;
    var results = document.createElement(&amp;#039;div&amp;#039;);&lt;br /&gt;
    results.id = &amp;#039;hc-search-results&amp;#039;;&lt;br /&gt;
    results.className = &amp;#039;search-results&amp;#039;;&lt;br /&gt;
    results.setAttribute(&amp;#039;role&amp;#039;, &amp;#039;listbox&amp;#039;);&lt;br /&gt;
    results.setAttribute(&amp;#039;aria-label&amp;#039;, &amp;#039;Wiki search suggestions&amp;#039;);&lt;br /&gt;
    results.hidden = true;&lt;br /&gt;
    form.appendChild(results);&lt;br /&gt;
    var topics = [], labels = {}, generation = 0, timer, pending;&lt;br /&gt;
    var apiReady = mw.loader.using(&amp;#039;mediawiki.api&amp;#039;).then(function () { return new mw.Api(); });&lt;br /&gt;
    Array.prototype.forEach.call(home.querySelectorAll(&amp;#039;.topic-entry &amp;gt; span:last-child a&amp;#039;), function (link) {&lt;br /&gt;
        var label = link.textContent.trim();&lt;br /&gt;
        if (!labels[label]) { topics.push({label: label, href: link.href}); labels[label] = true; }&lt;br /&gt;
    });&lt;br /&gt;
    function hideResults() {&lt;br /&gt;
        generation++;&lt;br /&gt;
        window.clearTimeout(timer);&lt;br /&gt;
        var request = pending;&lt;br /&gt;
        pending = null;&lt;br /&gt;
        if (request &amp;amp;&amp;amp; request.abort) { request.abort(); }&lt;br /&gt;
        results.hidden = true;&lt;br /&gt;
        input.setAttribute(&amp;#039;aria-expanded&amp;#039;, &amp;#039;false&amp;#039;);&lt;br /&gt;
        input.setAttribute(&amp;#039;aria-busy&amp;#039;, &amp;#039;false&amp;#039;);&lt;br /&gt;
    }&lt;br /&gt;
    function render(term, articles) {&lt;br /&gt;
        var focused = results.contains(document.activeElement) ? document.activeElement.href : null;&lt;br /&gt;
        results.textContent = &amp;#039;&amp;#039;;&lt;br /&gt;
        var seen = {}, entries = articles.concat(topics.filter(function (topic) {&lt;br /&gt;
            return topic.label.toLowerCase().indexOf(term.toLowerCase()) !== -1;&lt;br /&gt;
        }));&lt;br /&gt;
        var count = 0;&lt;br /&gt;
        function add(label, href) {&lt;br /&gt;
            var link = document.createElement(&amp;#039;a&amp;#039;);&lt;br /&gt;
            link.textContent = label;&lt;br /&gt;
            link.href = href;&lt;br /&gt;
            link.setAttribute(&amp;#039;role&amp;#039;, &amp;#039;option&amp;#039;);&lt;br /&gt;
            results.appendChild(link);&lt;br /&gt;
            if (focused &amp;amp;&amp;amp; link.href === focused) { link.focus(); }&lt;br /&gt;
        }&lt;br /&gt;
        entries.forEach(function (entry) {&lt;br /&gt;
            var key = entry.label.toLowerCase();&lt;br /&gt;
            if (seen[key] || count &amp;gt;= 6) { return; }&lt;br /&gt;
            seen[key] = true;&lt;br /&gt;
            count++;&lt;br /&gt;
            add(entry.label, entry.href);&lt;br /&gt;
        });&lt;br /&gt;
        add(&amp;#039;Search all pages for “&amp;#039; + term + &amp;#039;”&amp;#039;, &amp;#039;/Special:Search?search=&amp;#039; + encodeURIComponent(term));&lt;br /&gt;
        results.hidden = false;&lt;br /&gt;
        input.setAttribute(&amp;#039;aria-expanded&amp;#039;, &amp;#039;true&amp;#039;);&lt;br /&gt;
    }&lt;br /&gt;
    input.addEventListener(&amp;#039;input&amp;#039;, function () {&lt;br /&gt;
        hideResults();&lt;br /&gt;
        var term = input.value.trim();&lt;br /&gt;
        if (!term) { return; }&lt;br /&gt;
        render(term, []);&lt;br /&gt;
        var version = generation;&lt;br /&gt;
        timer = window.setTimeout(function () {&lt;br /&gt;
            apiReady.then(function (api) {&lt;br /&gt;
                if (version !== generation) { return; }&lt;br /&gt;
                input.setAttribute(&amp;#039;aria-busy&amp;#039;, &amp;#039;true&amp;#039;);&lt;br /&gt;
                pending = api.get({action: &amp;#039;opensearch&amp;#039;, search: term, namespace: 0, limit: 6, redirects: &amp;#039;resolve&amp;#039;});&lt;br /&gt;
                pending.then(function (data) {&lt;br /&gt;
                    if (version !== generation || input.value.trim() !== term) { return; }&lt;br /&gt;
                    pending = null;&lt;br /&gt;
                    input.setAttribute(&amp;#039;aria-busy&amp;#039;, &amp;#039;false&amp;#039;);&lt;br /&gt;
                    var articles = (data[1] || []).map(function (title) {&lt;br /&gt;
                        return {label: title, href: mw.util.getUrl(title)};&lt;br /&gt;
                    });&lt;br /&gt;
                    render(term, articles);&lt;br /&gt;
                }, function () {&lt;br /&gt;
                    if (version === generation) { pending = null; input.setAttribute(&amp;#039;aria-busy&amp;#039;, &amp;#039;false&amp;#039;); }&lt;br /&gt;
                    // Keep local topic suggestions and native full-wiki search usable on an API failure.&lt;br /&gt;
                });&lt;br /&gt;
            }, function () {});&lt;br /&gt;
        }, 180);&lt;br /&gt;
    });&lt;br /&gt;
    input.addEventListener(&amp;#039;keydown&amp;#039;, function (event) {&lt;br /&gt;
        if (event.key === &amp;#039;Escape&amp;#039;) { hideResults(); }&lt;br /&gt;
        if (event.key === &amp;#039;ArrowDown&amp;#039; &amp;amp;&amp;amp; !results.hidden) {&lt;br /&gt;
            var first = results.querySelector(&amp;#039;a&amp;#039;);&lt;br /&gt;
            if (first) { event.preventDefault(); first.focus(); }&lt;br /&gt;
        }&lt;br /&gt;
    });&lt;br /&gt;
    results.addEventListener(&amp;#039;keydown&amp;#039;, function (event) {&lt;br /&gt;
        if (event.key === &amp;#039;Escape&amp;#039;) { hideResults(); input.focus(); return; }&lt;br /&gt;
        if (event.key !== &amp;#039;ArrowUp&amp;#039; &amp;amp;&amp;amp; event.key !== &amp;#039;ArrowDown&amp;#039;) { return; }&lt;br /&gt;
        var links = Array.prototype.slice.call(results.querySelectorAll(&amp;#039;a&amp;#039;));&lt;br /&gt;
        var current = links.indexOf(document.activeElement);&lt;br /&gt;
        if (current &amp;lt; 0) { return; }&lt;br /&gt;
        event.preventDefault();&lt;br /&gt;
        var next = current + (event.key === &amp;#039;ArrowDown&amp;#039; ? 1 : -1);&lt;br /&gt;
        if (next &amp;lt; 0) { input.focus(); }&lt;br /&gt;
        else { links[Math.min(next, links.length - 1)].focus(); }&lt;br /&gt;
    });&lt;br /&gt;
    document.addEventListener(&amp;#039;click&amp;#039;, function (event) {&lt;br /&gt;
        if (!form.contains(event.target)) { hideResults(); }&lt;br /&gt;
    });&lt;br /&gt;
    form.addEventListener(&amp;#039;focusout&amp;#039;, function (event) {&lt;br /&gt;
        if (!form.contains(event.relatedTarget)) { hideResults(); }&lt;br /&gt;
    });&lt;br /&gt;
    form.addEventListener(&amp;#039;submit&amp;#039;, function (event) {&lt;br /&gt;
        if (!input.value.trim()) { event.preventDefault(); input.focus(); }&lt;br /&gt;
        else { hideResults(); }&lt;br /&gt;
    });&lt;br /&gt;
    var login = home.querySelector(&amp;#039;.page-tools a[href*=&amp;quot;UserLogin&amp;quot;]&amp;#039;);&lt;br /&gt;
    if (login &amp;amp;&amp;amp; mw.config.get(&amp;#039;wgUserName&amp;#039;)) {&lt;br /&gt;
        login.textContent = &amp;#039;Account&amp;#039;;&lt;br /&gt;
        login.href = &amp;#039;/Special:Preferences&amp;#039;;&lt;br /&gt;
    }&lt;br /&gt;
});&lt;br /&gt;
/* END HOME COUNTY HOMEPAGE V1 */&lt;br /&gt;
&lt;br /&gt;
/* BEGIN HOME COUNTY ARTICLE THEME */&lt;br /&gt;
/* Keep site-script syntax compatible with MediaWiki ResourceLoader. */&lt;br /&gt;
mw.hook(&amp;#039;wikipage.content&amp;#039;).add(function () {&lt;br /&gt;
    // Sidebar pinning no longer applies; preserve access to native menu/tools.&lt;br /&gt;
    function keepMenuInDropdown(name) {&lt;br /&gt;
        var menu = document.getElementById(name);&lt;br /&gt;
        var target = document.getElementById(name + &amp;#039;-unpinned-container&amp;#039;);&lt;br /&gt;
        if (!menu || !target || target.contains(menu)) { return; }&lt;br /&gt;
        target.appendChild(menu);&lt;br /&gt;
        var header = menu.querySelector(&amp;#039;.vector-pinnable-header&amp;#039;);&lt;br /&gt;
        if (header) {&lt;br /&gt;
            header.classList.remove(&amp;#039;vector-pinnable-header-pinned&amp;#039;);&lt;br /&gt;
            header.classList.add(&amp;#039;vector-pinnable-header-unpinned&amp;#039;);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    keepMenuInDropdown(&amp;#039;vector-main-menu&amp;#039;);&lt;br /&gt;
    keepMenuInDropdown(&amp;#039;vector-page-tools&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
    if (document.getElementById(&amp;#039;hc-home&amp;#039;) || mw.config.get(&amp;#039;wgAction&amp;#039;) !== &amp;#039;view&amp;#039;) { return; }&lt;br /&gt;
    var content = document.querySelector(&amp;#039;#mw-content-text .mw-parser-output&amp;#039;);&lt;br /&gt;
    if (!content) { return; }&lt;br /&gt;
&lt;br /&gt;
    Array.prototype.forEach.call(content.querySelectorAll(&amp;#039;table.articleList, table.wikitable, table.fandom-table&amp;#039;), function (table) {&lt;br /&gt;
        if (table.closest(&amp;#039;.portable-infobox&amp;#039;) || table.parentNode.classList.contains(&amp;#039;hc-table-scroll&amp;#039;)) { return; }&lt;br /&gt;
        var panel = document.createElement(&amp;#039;div&amp;#039;);&lt;br /&gt;
        panel.className = &amp;#039;hc-table-scroll&amp;#039;;&lt;br /&gt;
        panel.tabIndex = 0;&lt;br /&gt;
        panel.setAttribute(&amp;#039;role&amp;#039;, &amp;#039;region&amp;#039;);&lt;br /&gt;
        panel.setAttribute(&amp;#039;aria-label&amp;#039;, &amp;#039;Scrollable data table&amp;#039;);&lt;br /&gt;
        table.parentNode.insertBefore(panel, table);&lt;br /&gt;
        panel.appendChild(table);&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    if (mw.config.get(&amp;#039;wgNamespaceNumber&amp;#039;) &amp;lt; 0 || content.querySelector(&amp;#039;#hc-article-contents, #toc&amp;#039;)) { return; }&lt;br /&gt;
    var source = document.getElementById(&amp;#039;mw-panel-toc-list&amp;#039;);&lt;br /&gt;
    var sections = Array.prototype.filter.call(content.querySelectorAll(&amp;#039;h2, h3, h4, h5, h6&amp;#039;), function (heading) {&lt;br /&gt;
        return !heading.closest(&amp;#039;.portable-infobox&amp;#039;) &amp;amp;&amp;amp; (heading.id || heading.querySelector(&amp;#039;.mw-headline[id]&amp;#039;));&lt;br /&gt;
    });&lt;br /&gt;
    if (!sections.length || !source) { return; }&lt;br /&gt;
    function convertList(original) {&lt;br /&gt;
        var list = document.createElement(&amp;#039;ul&amp;#039;);&lt;br /&gt;
        Array.prototype.forEach.call(original.children, function (originalItem) {&lt;br /&gt;
            var sourceLink = originalItem.querySelector(&amp;#039;a.vector-toc-link&amp;#039;);&lt;br /&gt;
            var number = sourceLink &amp;amp;&amp;amp; sourceLink.querySelector(&amp;#039;.vector-toc-numb&amp;#039;);&lt;br /&gt;
            if (!sourceLink || !number) { return; }&lt;br /&gt;
            var item = document.createElement(&amp;#039;li&amp;#039;);&lt;br /&gt;
            var link = document.createElement(&amp;#039;a&amp;#039;);&lt;br /&gt;
            link.setAttribute(&amp;#039;href&amp;#039;, sourceLink.getAttribute(&amp;#039;href&amp;#039;));&lt;br /&gt;
            var index = document.createElement(&amp;#039;span&amp;#039;);&lt;br /&gt;
            index.className = &amp;#039;hc-contents-number&amp;#039;;&lt;br /&gt;
            index.textContent = number.textContent.trim();&lt;br /&gt;
            link.appendChild(index);&lt;br /&gt;
            var text = sourceLink.querySelector(&amp;#039;.vector-toc-text&amp;#039;);&lt;br /&gt;
            var label = text.textContent.trim().replace(/^\s*[\d.]+\s*/, &amp;#039;&amp;#039;);&lt;br /&gt;
            link.appendChild(document.createTextNode(label));&lt;br /&gt;
            item.appendChild(link);&lt;br /&gt;
            Array.prototype.forEach.call(originalItem.children, function (child) {&lt;br /&gt;
                if (child.tagName === &amp;#039;UL&amp;#039; &amp;amp;&amp;amp; child.children.length) { item.appendChild(convertList(child)); }&lt;br /&gt;
            });&lt;br /&gt;
            list.appendChild(item);&lt;br /&gt;
        });&lt;br /&gt;
        return list;&lt;br /&gt;
    }&lt;br /&gt;
    var list = convertList(source);&lt;br /&gt;
    if (!list.children.length) { return; }&lt;br /&gt;
    var box = document.createElement(&amp;#039;nav&amp;#039;);&lt;br /&gt;
    box.id = &amp;#039;hc-article-contents&amp;#039;;&lt;br /&gt;
    box.className = &amp;#039;hc-contents&amp;#039;;&lt;br /&gt;
    box.setAttribute(&amp;#039;aria-label&amp;#039;, &amp;#039;Contents&amp;#039;);&lt;br /&gt;
    var title = document.createElement(&amp;#039;div&amp;#039;);&lt;br /&gt;
    title.className = &amp;#039;hc-contents-title&amp;#039;;&lt;br /&gt;
    var heading = document.createElement(&amp;#039;strong&amp;#039;);&lt;br /&gt;
    heading.textContent = &amp;#039;Contents&amp;#039;;&lt;br /&gt;
    title.appendChild(heading);&lt;br /&gt;
    var toggle = document.createElement(&amp;#039;button&amp;#039;);&lt;br /&gt;
    toggle.className = &amp;#039;hc-contents-toggle&amp;#039;;&lt;br /&gt;
    toggle.type = &amp;#039;button&amp;#039;;&lt;br /&gt;
    toggle.textContent = &amp;#039;[hide]&amp;#039;;&lt;br /&gt;
    toggle.setAttribute(&amp;#039;aria-expanded&amp;#039;, &amp;#039;true&amp;#039;);&lt;br /&gt;
    toggle.setAttribute(&amp;#039;aria-controls&amp;#039;, &amp;#039;hc-contents-list&amp;#039;);&lt;br /&gt;
    list.id = &amp;#039;hc-contents-list&amp;#039;;&lt;br /&gt;
    toggle.addEventListener(&amp;#039;click&amp;#039;, function () {&lt;br /&gt;
        list.hidden = !list.hidden;&lt;br /&gt;
        toggle.textContent = list.hidden ? &amp;#039;[show]&amp;#039; : &amp;#039;[hide]&amp;#039;;&lt;br /&gt;
        toggle.setAttribute(&amp;#039;aria-expanded&amp;#039;, list.hidden ? &amp;#039;false&amp;#039; : &amp;#039;true&amp;#039;);&lt;br /&gt;
    });&lt;br /&gt;
    title.appendChild(toggle);&lt;br /&gt;
    box.appendChild(title);&lt;br /&gt;
    box.appendChild(list);&lt;br /&gt;
    var first = sections[0];&lt;br /&gt;
    var insertion = first.parentNode.classList.contains(&amp;#039;mw-heading&amp;#039;) ? first.parentNode : first;&lt;br /&gt;
    var narrow = window.matchMedia(&amp;#039;(max-width: 720px)&amp;#039;);&lt;br /&gt;
    function positionContents() {&lt;br /&gt;
        var infobox = content.querySelector(&amp;#039;.portable-infobox&amp;#039;);&lt;br /&gt;
        if (narrow.matches &amp;amp;&amp;amp; infobox &amp;amp;&amp;amp; infobox.parentNode === content) {&lt;br /&gt;
            content.insertBefore(box, infobox);&lt;br /&gt;
        } else {&lt;br /&gt;
            insertion.parentNode.insertBefore(box, insertion);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    positionContents();&lt;br /&gt;
    if (narrow.addEventListener) { narrow.addEventListener(&amp;#039;change&amp;#039;, positionContents); }&lt;br /&gt;
    else { narrow.addListener(positionContents); }&lt;br /&gt;
});&lt;br /&gt;
/* END HOME COUNTY ARTICLE THEME */&lt;br /&gt;
&lt;br /&gt;
/* BEGIN HOME COUNTY CURRENCY */&lt;br /&gt;
/* Decorate floren and token values; preserve prices, article markup and sorting. */&lt;br /&gt;
mw.hook(&amp;#039;wikipage.content&amp;#039;).add(function ($content) {&lt;br /&gt;
    var content = $content &amp;amp;&amp;amp; $content[0];&lt;br /&gt;
    if (!content || mw.config.get(&amp;#039;wgAction&amp;#039;) !== &amp;#039;view&amp;#039;) { return; }&lt;br /&gt;
    var numericPrice = /^\s*(\d[\d,]*(?:\.\d+)?)\s*$/;&lt;br /&gt;
    var currencyWords = /(?:flor(?:en|in)[sx]?|tokens?)/i;&lt;br /&gt;
    var labelledPrice = /\b\d[\d,]*(?:\.\d+)?\s*(?:[x\u00d7]\s*)?(?:flor(?:en|in)[sx]?|tokens?)\b/gi;&lt;br /&gt;
    var priceField = /^(?:buy|sell|prize_sale|base_price|prize_base_price|base price|prixe price|price|sell_price|buy_price|seed_cost)$/i;&lt;br /&gt;
    var priceHeading = /(?:\bpric(?:e|es|ing)\b|\bcost\b|\bsales?\b|\bsells?\s+for\b|\b(?:base|prize)\s+(?:prize\s+)?value\b)/i;&lt;br /&gt;
&lt;br /&gt;
    function makePrice(text, kind) {&lt;br /&gt;
        kind = kind || (/tokens?/i.test(text) ? &amp;#039;token&amp;#039; : &amp;#039;floren&amp;#039;);&lt;br /&gt;
        var label = kind === &amp;#039;token&amp;#039; ? &amp;#039;Tokens&amp;#039; : &amp;#039;Florens&amp;#039;;&lt;br /&gt;
        var price = document.createElement(&amp;#039;span&amp;#039;);&lt;br /&gt;
        price.className = &amp;#039;hc-price hc-currency-&amp;#039; + kind;&lt;br /&gt;
        var coin = document.createElement(&amp;#039;span&amp;#039;);&lt;br /&gt;
        coin.className = kind === &amp;#039;token&amp;#039; ? &amp;#039;hc-token-icon&amp;#039; : &amp;#039;hc-floren-icon&amp;#039;;&lt;br /&gt;
        coin.title = label;&lt;br /&gt;
        if (currencyWords.test(text)) {&lt;br /&gt;
            coin.setAttribute(&amp;#039;aria-hidden&amp;#039;, &amp;#039;true&amp;#039;);&lt;br /&gt;
        } else {&lt;br /&gt;
            coin.setAttribute(&amp;#039;role&amp;#039;, &amp;#039;img&amp;#039;);&lt;br /&gt;
            coin.setAttribute(&amp;#039;aria-label&amp;#039;, label);&lt;br /&gt;
        }&lt;br /&gt;
        price.appendChild(coin);&lt;br /&gt;
        var amount = document.createElement(&amp;#039;span&amp;#039;);&lt;br /&gt;
        amount.className = &amp;#039;hc-price-amount&amp;#039;;&lt;br /&gt;
        amount.textContent = text;&lt;br /&gt;
        price.appendChild(amount);&lt;br /&gt;
        return price;&lt;br /&gt;
    }&lt;br /&gt;
    function decorateNumber(cell, kind) {&lt;br /&gt;
        if (cell.querySelector(&amp;#039;.hc-price&amp;#039;)) { return; }&lt;br /&gt;
        var match = cell.textContent.match(numericPrice);&lt;br /&gt;
        if (!match) { return; } // Empty/unknown prices and non-money prose stay untouched.&lt;br /&gt;
        var walker = document.createTreeWalker(cell, NodeFilter.SHOW_TEXT, null, false);&lt;br /&gt;
        var nodes = [];&lt;br /&gt;
        while (walker.nextNode()) { nodes.push(walker.currentNode); }&lt;br /&gt;
        nodes.forEach(function (node) {&lt;br /&gt;
            if (node.nodeValue.match(numericPrice)) {&lt;br /&gt;
                node.parentNode.replaceChild(makePrice(node.nodeValue.trim(), kind), node);&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        if (cell.tagName === &amp;#039;TD&amp;#039; &amp;amp;&amp;amp; !cell.hasAttribute(&amp;#039;data-sort-value&amp;#039;)) {&lt;br /&gt;
            cell.setAttribute(&amp;#039;data-sort-value&amp;#039;, match[1].replace(/,/g, &amp;#039;&amp;#039;));&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // PortableInfobox exposes source names on both horizontal and stacked fields.&lt;br /&gt;
    Array.prototype.forEach.call(content.querySelectorAll(&amp;#039;.portable-infobox [data-source]&amp;#039;), function (field) {&lt;br /&gt;
        var source = field.getAttribute(&amp;#039;data-source&amp;#039;);&lt;br /&gt;
        var tokenField = /^(?:tokens?|token_cost|token_reward|token_amount)$/i.test(source);&lt;br /&gt;
        if (!tokenField &amp;amp;&amp;amp; !priceField.test(source)) { return; }&lt;br /&gt;
        var value = field.classList.contains(&amp;#039;pi-data-value&amp;#039;) ? field : field.querySelector(&amp;#039;.pi-data-value&amp;#039;);&lt;br /&gt;
        if (value) { decorateNumber(value, tokenField ? &amp;#039;token&amp;#039; : &amp;#039;floren&amp;#039;); }&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    // Map real table columns, including spanning headers; levels/counts are not prices.&lt;br /&gt;
    Array.prototype.forEach.call(content.querySelectorAll(&amp;#039;table.articleList, table.wikitable, table.fandom-table&amp;#039;), function (table) {&lt;br /&gt;
        var priceColumns = {};&lt;br /&gt;
        var occupied = [];&lt;br /&gt;
        Array.prototype.forEach.call(table.rows, function (row, rowIndex) {&lt;br /&gt;
            occupied[rowIndex] = occupied[rowIndex] || [];&lt;br /&gt;
            var col = 0;&lt;br /&gt;
            Array.prototype.forEach.call(row.cells, function (cell) {&lt;br /&gt;
                while (occupied[rowIndex][col]) { col++; }&lt;br /&gt;
                var width = cell.colSpan || 1;&lt;br /&gt;
                var height = cell.rowSpan || 1;&lt;br /&gt;
                for (var y = rowIndex; y &amp;lt; rowIndex + height; y++) {&lt;br /&gt;
                    occupied[y] = occupied[y] || [];&lt;br /&gt;
                    for (var x = col; x &amp;lt; col + width; x++) { occupied[y][x] = true; }&lt;br /&gt;
                }&lt;br /&gt;
                if (cell.tagName === &amp;#039;TH&amp;#039; &amp;amp;&amp;amp; (/\btokens?\b/i.test(cell.textContent) || priceHeading.test(cell.textContent))) {&lt;br /&gt;
                    var kind = /\btokens?\b/i.test(cell.textContent) ? &amp;#039;token&amp;#039; : &amp;#039;floren&amp;#039;;&lt;br /&gt;
                    for (var i = col; i &amp;lt; col + width; i++) { priceColumns[i] = kind; }&lt;br /&gt;
                } else if (cell.tagName === &amp;#039;TD&amp;#039; &amp;amp;&amp;amp; width === 1 &amp;amp;&amp;amp; priceColumns[col]) {&lt;br /&gt;
                    decorateNumber(cell, priceColumns[col]);&lt;br /&gt;
                }&lt;br /&gt;
                col += width;&lt;br /&gt;
            });&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    // Token rewards, monetary rewards and prices written in prose retain their original wording.&lt;br /&gt;
    var walker = document.createTreeWalker(content, NodeFilter.SHOW_TEXT, null, false);&lt;br /&gt;
    var nodes = [];&lt;br /&gt;
    while (walker.nextNode()) {&lt;br /&gt;
        var node = walker.currentNode;&lt;br /&gt;
        if (!node.parentElement.closest(&amp;#039;.hc-price, script, style, textarea, pre, code&amp;#039;)) { nodes.push(node); }&lt;br /&gt;
    }&lt;br /&gt;
    nodes.forEach(function (node) {&lt;br /&gt;
        labelledPrice.lastIndex = 0;&lt;br /&gt;
        var match;&lt;br /&gt;
        var offset = 0;&lt;br /&gt;
        var fragment = document.createDocumentFragment();&lt;br /&gt;
        while ((match = labelledPrice.exec(node.nodeValue))) {&lt;br /&gt;
            fragment.appendChild(document.createTextNode(node.nodeValue.slice(offset, match.index)));&lt;br /&gt;
            fragment.appendChild(makePrice(match[0]));&lt;br /&gt;
            offset = match.index + match[0].length;&lt;br /&gt;
        }&lt;br /&gt;
        if (!offset) { return; }&lt;br /&gt;
        fragment.appendChild(document.createTextNode(node.nodeValue.slice(offset)));&lt;br /&gt;
        node.parentNode.replaceChild(fragment, node);&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
/* END HOME COUNTY CURRENCY */&lt;br /&gt;
&lt;br /&gt;
/* BEGIN HOME COUNTY WEATHER */&lt;br /&gt;
/* Add original game weather artwork only to explicitly labelled weather fields. */&lt;br /&gt;
mw.hook(&amp;#039;wikipage.content&amp;#039;).add(function ($content) {&lt;br /&gt;
    var content = $content &amp;amp;&amp;amp; $content[0];&lt;br /&gt;
    if (!content || mw.config.get(&amp;#039;wgAction&amp;#039;) !== &amp;#039;view&amp;#039;) { return; }&lt;br /&gt;
    var words = /\b(clear|sunny|rainy?|thunderstorms?|lightning|hail|snow|heat(?:\s*wave)?|cold\s*front|any(?:\s+weather)?|all(?:\s+weather)?)\b/gi;&lt;br /&gt;
    function weatherKey(word) {&lt;br /&gt;
        var key = word.toLowerCase().replace(/\s/g, &amp;#039;&amp;#039;);&lt;br /&gt;
        if (/^(clear|sunny)$/.test(key)) { return &amp;#039;sunny&amp;#039;; }&lt;br /&gt;
        if (/^rain/.test(key)) { return &amp;#039;rain&amp;#039;; }&lt;br /&gt;
        if (/^(lightning|thunderstorms?)$/.test(key)) { return &amp;#039;thunderstorm&amp;#039;; }&lt;br /&gt;
        if (/^heat/.test(key)) { return &amp;#039;heatwave&amp;#039;; }&lt;br /&gt;
        if (key === &amp;#039;coldfront&amp;#039;) { return &amp;#039;snow&amp;#039;; }&lt;br /&gt;
        if (/^(any|all)/.test(key)) { return &amp;#039;any&amp;#039;; }&lt;br /&gt;
        return key;&lt;br /&gt;
    }&lt;br /&gt;
    function icon(key) {&lt;br /&gt;
        var img = document.createElement(&amp;#039;img&amp;#039;);&lt;br /&gt;
        var artwork = key === &amp;#039;heatwave&amp;#039; || key === &amp;#039;sunny&amp;#039; ? &amp;#039;Heatwave&amp;#039; : key.charAt(0).toUpperCase() + key.slice(1);&lt;br /&gt;
        img.className = &amp;#039;hc-weather-icon hc-weather-&amp;#039; + key;&lt;br /&gt;
        img.src = &amp;#039;/Special:Redirect/file/Home_County_Weather_&amp;#039; + artwork + &amp;#039;.png&amp;#039;;&lt;br /&gt;
        img.alt = &amp;#039;&amp;#039;;&lt;br /&gt;
        img.setAttribute(&amp;#039;aria-hidden&amp;#039;, &amp;#039;true&amp;#039;);&lt;br /&gt;
        img.width = 24;&lt;br /&gt;
        img.height = 24;&lt;br /&gt;
        return img;&lt;br /&gt;
    }&lt;br /&gt;
    function decorate(field) {&lt;br /&gt;
        var walker = document.createTreeWalker(field, NodeFilter.SHOW_TEXT, null, false);&lt;br /&gt;
        var nodes = [];&lt;br /&gt;
        while (walker.nextNode()) {&lt;br /&gt;
            if (!walker.currentNode.parentElement.closest(&amp;#039;.hc-weather, script, style, code, pre&amp;#039;)) {&lt;br /&gt;
                nodes.push(walker.currentNode);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        nodes.forEach(function (node) {&lt;br /&gt;
            words.lastIndex = 0;&lt;br /&gt;
            var match, offset = 0;&lt;br /&gt;
            var fragment = document.createDocumentFragment();&lt;br /&gt;
            while ((match = words.exec(node.nodeValue))) {&lt;br /&gt;
                fragment.appendChild(document.createTextNode(node.nodeValue.slice(offset, match.index)));&lt;br /&gt;
                var key = weatherKey(match[0]);&lt;br /&gt;
                var item = document.createElement(&amp;#039;span&amp;#039;);&lt;br /&gt;
                item.className = &amp;#039;hc-weather hc-weather-condition-&amp;#039; + key;&lt;br /&gt;
                if (key === &amp;#039;any&amp;#039;) {&lt;br /&gt;
                    var stack = document.createElement(&amp;#039;span&amp;#039;);&lt;br /&gt;
                    stack.className = &amp;#039;hc-weather-any-icons&amp;#039;;&lt;br /&gt;
                    stack.title = &amp;#039;Any weather&amp;#039;;&lt;br /&gt;
                    [&amp;#039;sunny&amp;#039;, &amp;#039;rain&amp;#039;, &amp;#039;snow&amp;#039;].forEach(function (part) { stack.appendChild(icon(part)); });&lt;br /&gt;
                    item.appendChild(stack);&lt;br /&gt;
                } else {&lt;br /&gt;
                    item.appendChild(icon(key));&lt;br /&gt;
                }&lt;br /&gt;
                item.appendChild(document.createTextNode(match[0]));&lt;br /&gt;
                fragment.appendChild(item);&lt;br /&gt;
                offset = match.index + match[0].length;&lt;br /&gt;
            }&lt;br /&gt;
            if (!offset) { return; }&lt;br /&gt;
            fragment.appendChild(document.createTextNode(node.nodeValue.slice(offset)));&lt;br /&gt;
            node.parentNode.replaceChild(fragment, node);&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
    Array.prototype.forEach.call(content.querySelectorAll(&amp;#039;.portable-infobox [data-source=&amp;quot;weather&amp;quot;], .portable-infobox [data-source=&amp;quot;conditions&amp;quot;]&amp;#039;), function (field) {&lt;br /&gt;
        var value = field.classList.contains(&amp;#039;pi-data-value&amp;#039;) ? field : field.querySelector(&amp;#039;.pi-data-value&amp;#039;);&lt;br /&gt;
        if (value) { decorate(value); }&lt;br /&gt;
    });&lt;br /&gt;
    Array.prototype.forEach.call(content.querySelectorAll(&amp;#039;table.articleList, table.wikitable, table.fandom-table&amp;#039;), function (table) {&lt;br /&gt;
        var columns = {}, occupied = [];&lt;br /&gt;
        Array.prototype.forEach.call(table.rows, function (row, rowIndex) {&lt;br /&gt;
            occupied[rowIndex] = occupied[rowIndex] || [];&lt;br /&gt;
            var column = 0;&lt;br /&gt;
            Array.prototype.forEach.call(row.cells, function (cell) {&lt;br /&gt;
                while (occupied[rowIndex][column]) { column++; }&lt;br /&gt;
                var width = cell.colSpan || 1, height = cell.rowSpan || 1;&lt;br /&gt;
                for (var y = rowIndex; y &amp;lt; rowIndex + height; y++) {&lt;br /&gt;
                    occupied[y] = occupied[y] || [];&lt;br /&gt;
                    for (var x = column; x &amp;lt; column + width; x++) { occupied[y][x] = true; }&lt;br /&gt;
                }&lt;br /&gt;
                if (cell.tagName === &amp;#039;TH&amp;#039; &amp;amp;&amp;amp; /\b(?:weather|conditions)\b/i.test(cell.textContent)) {&lt;br /&gt;
                    for (var i = column; i &amp;lt; column + width; i++) { columns[i] = true; }&lt;br /&gt;
                } else if (cell.tagName === &amp;#039;TD&amp;#039; &amp;amp;&amp;amp; width === 1 &amp;amp;&amp;amp; columns[column]) {&lt;br /&gt;
                    decorate(cell);&lt;br /&gt;
                }&lt;br /&gt;
                column += width;&lt;br /&gt;
            });&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
/* END HOME COUNTY WEATHER */&lt;br /&gt;
&lt;br /&gt;
/* BEGIN HOME COUNTY STEAM RSS */&lt;br /&gt;
/* Home County Steam RSS updates: same-origin endpoint, text-only rendering. */&lt;br /&gt;
mw.hook(&amp;#039;wikipage.content&amp;#039;).add(function () {&lt;br /&gt;
    var home = document.getElementById(&amp;#039;hc-home&amp;#039;);&lt;br /&gt;
    var list = home &amp;amp;&amp;amp; home.querySelector(&amp;#039;.updates-panel .update-list&amp;#039;);&lt;br /&gt;
    if (!list || list.getAttribute(&amp;#039;data-steam-feed-enhanced&amp;#039;)) { return; }&lt;br /&gt;
    list.setAttribute(&amp;#039;data-steam-feed-enhanced&amp;#039;, &amp;#039;true&amp;#039;);&lt;br /&gt;
    var inFlight = false;&lt;br /&gt;
    var timer;&lt;br /&gt;
    function titleFor(title) {&lt;br /&gt;
        if (title === &amp;#039;Patch Notes &amp;amp; Life Update!&amp;#039;) { return &amp;#039;Life Update&amp;#039;; }&lt;br /&gt;
        if (title === &amp;#039;Patch Notes &amp;amp; A Surprise!&amp;#039;) { return &amp;#039;Patch Notes&amp;#039;; }&lt;br /&gt;
        return title.replace(/&amp;amp;/g, &amp;#039;and&amp;#039;);&lt;br /&gt;
    }&lt;br /&gt;
    function newsItem(item) {&lt;br /&gt;
        if (!item || typeof item.title !== &amp;#039;string&amp;#039; || !item.title.trim() || item.title.length &amp;gt; 240 ||&lt;br /&gt;
            typeof item.url !== &amp;#039;string&amp;#039; || typeof item.date !== &amp;#039;string&amp;#039;) { return null; }&lt;br /&gt;
        var link = document.createElement(&amp;#039;a&amp;#039;);&lt;br /&gt;
        link.href = item.url;&lt;br /&gt;
        var validUrl = link.protocol === &amp;#039;https:&amp;#039; &amp;amp;&amp;amp; !link.port &amp;amp;&amp;amp; !link.username &amp;amp;&amp;amp; !link.password &amp;amp;&amp;amp;&lt;br /&gt;
            ((link.hostname === &amp;#039;store.steampowered.com&amp;#039; &amp;amp;&amp;amp; link.pathname.indexOf(&amp;#039;/news/app/3672100/&amp;#039;) === 0) ||&lt;br /&gt;
             (link.hostname === &amp;#039;steamcommunity.com&amp;#039; &amp;amp;&amp;amp; link.pathname.indexOf(&amp;#039;/games/3672100/announcements/&amp;#039;) === 0));&lt;br /&gt;
        var date = new Date(item.date);&lt;br /&gt;
        if (!validUrl || !isFinite(date.getTime())) { return null; }&lt;br /&gt;
        return {title: titleFor(item.title.trim()), url: link.href, date: date};&lt;br /&gt;
    }&lt;br /&gt;
    function render(data) {&lt;br /&gt;
        if (!data || !Array.isArray(data.items)) { return; }&lt;br /&gt;
        var items = data.items.map(newsItem).filter(function (item) { return item !== null; });&lt;br /&gt;
        items.sort(function (a, b) { return b.date.getTime() - a.date.getTime(); });&lt;br /&gt;
        items = items.slice(0, 3);&lt;br /&gt;
        if (!items.length) { return; }&lt;br /&gt;
        var fragment = document.createDocumentFragment();&lt;br /&gt;
        items.forEach(function (item) {&lt;br /&gt;
            var row = document.createElement(&amp;#039;li&amp;#039;);&lt;br /&gt;
            var date = document.createElement(&amp;#039;time&amp;#039;);&lt;br /&gt;
            date.className = &amp;#039;update-date&amp;#039;;&lt;br /&gt;
            date.setAttribute(&amp;#039;datetime&amp;#039;, item.date.toISOString().slice(0, 10));&lt;br /&gt;
            date.textContent = item.date.toLocaleDateString(&amp;#039;en-GB&amp;#039;, {day: &amp;#039;numeric&amp;#039;, month: &amp;#039;short&amp;#039;, year: &amp;#039;numeric&amp;#039;, timeZone: &amp;#039;UTC&amp;#039;});&lt;br /&gt;
            var link = document.createElement(&amp;#039;a&amp;#039;);&lt;br /&gt;
            link.href = item.url;&lt;br /&gt;
            link.textContent = item.title;&lt;br /&gt;
            row.appendChild(date);&lt;br /&gt;
            row.appendChild(link);&lt;br /&gt;
            fragment.appendChild(row);&lt;br /&gt;
        });&lt;br /&gt;
        list.textContent = &amp;#039;&amp;#039;;&lt;br /&gt;
        list.appendChild(fragment);&lt;br /&gt;
        list.setAttribute(&amp;#039;data-steam-feed-loaded&amp;#039;, &amp;#039;true&amp;#039;);&lt;br /&gt;
        if (typeof data.updated_at === &amp;#039;string&amp;#039;) {&lt;br /&gt;
            list.setAttribute(&amp;#039;data-steam-feed-updated&amp;#039;, data.updated_at);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    function refresh() {&lt;br /&gt;
        if (!document.documentElement.contains(list)) {&lt;br /&gt;
            clearInterval(timer);&lt;br /&gt;
            document.removeEventListener(&amp;#039;visibilitychange&amp;#039;, visibilityChanged);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if (inFlight || document.hidden) { return; }&lt;br /&gt;
        inFlight = true;&lt;br /&gt;
        $.ajax({url: &amp;#039;/api/steam-news&amp;#039;, dataType: &amp;#039;json&amp;#039;, timeout: 10000})&lt;br /&gt;
            .done(render)&lt;br /&gt;
            .always(function () { inFlight = false; });&lt;br /&gt;
        // On failure the existing successful list remains visible.&lt;br /&gt;
    }&lt;br /&gt;
    function visibilityChanged() {&lt;br /&gt;
        if (!document.hidden) { refresh(); }&lt;br /&gt;
    }&lt;br /&gt;
    refresh();&lt;br /&gt;
    timer = setInterval(refresh, 300000);&lt;br /&gt;
    document.addEventListener(&amp;#039;visibilitychange&amp;#039;, visibilityChanged);&lt;br /&gt;
});&lt;br /&gt;
/* END HOME COUNTY STEAM RSS */&lt;/div&gt;</summary>
		<author><name>Hedgehoger97</name></author>
	</entry>
</feed>