<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://unfinishedprojects.net/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-projects.js</id>
	<title>MediaWiki:Gadget-projects.js - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://unfinishedprojects.net/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-projects.js"/>
	<link rel="alternate" type="text/html" href="https://unfinishedprojects.net/index.php?title=MediaWiki:Gadget-projects.js&amp;action=history"/>
	<updated>2026-04-05T22:24:10Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://unfinishedprojects.net/index.php?title=MediaWiki:Gadget-projects.js&amp;diff=1205&amp;oldid=prev</id>
		<title>Anthony at 00:56, 5 April 2026</title>
		<link rel="alternate" type="text/html" href="https://unfinishedprojects.net/index.php?title=MediaWiki:Gadget-projects.js&amp;diff=1205&amp;oldid=prev"/>
		<updated>2026-04-05T00:56:20Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 00:56, 5 April 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l386&quot;&gt;Line 386:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 386:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;                         titles: chunk.map( function ( c ) { return c.page; } ).join( &amp;#039;|&amp;#039; ),&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;                         titles: chunk.map( function ( c ) { return c.page; } ).join( &amp;#039;|&amp;#039; ),&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;                         prop: &amp;#039;revisions|contributors&amp;#039;,&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;                         prop: &amp;#039;revisions|contributors&amp;#039;,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;                         rvprop: &#039;timestamp&#039;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;, rvlimit: 1, pclimit: 20&lt;/del&gt;,&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;                         rvprop: &#039;timestamp&#039;,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;                         format: &amp;#039;json&amp;#039;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;                         format: &amp;#039;json&amp;#039;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;                     } ).done( function ( data ) {&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;                     } ).done( function ( data ) {&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Anthony</name></author>
	</entry>
	<entry>
		<id>https://unfinishedprojects.net/index.php?title=MediaWiki:Gadget-projects.js&amp;diff=1201&amp;oldid=prev</id>
		<title>Anthony at 00:36, 5 April 2026</title>
		<link rel="alternate" type="text/html" href="https://unfinishedprojects.net/index.php?title=MediaWiki:Gadget-projects.js&amp;diff=1201&amp;oldid=prev"/>
		<updated>2026-04-05T00:36:33Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 00:36, 5 April 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l281&quot;&gt;Line 281:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 281:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;         // ── Card rendering ────────────────────────────────────────────────────&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;         // ── Card rendering ────────────────────────────────────────────────────&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;        function parseWikitext( text ) {&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;            if ( !text ) { return &#039;&#039;; }&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;            text = String( text );&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;            // External links: [https://url Display Text]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;            text = text.replace( /\[(\S+?)\s+([^\]]+?)\]/g, function ( m, url, display ) {&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;                if ( !/^https?:\/\//i.test( url ) ) { return mw.html.escape( m ); }&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;                return &#039;&amp;lt;a href=&quot;&#039; + url.replace( /&quot;/g, &#039;%22&#039; ) + &#039;&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&amp;gt;&#039; +&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;                    mw.html.escape( display ) + &#039;&amp;lt;/a&amp;gt;&#039;;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;            } );&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;            // Internal links: [[Page Name|Display]] or [[Page Name]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;            text = text.replace( /\[\[([^\]|]+?)(?:\|([^\]]+?))?\]\]/g, function ( m, page, display ) {&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;                return &#039;&amp;lt;a href=&quot;&#039; + mw.util.getUrl( page.trim() ) + &#039;&quot;&amp;gt;&#039; +&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;                    mw.html.escape( ( display || page ).trim() ) + &#039;&amp;lt;/a&amp;gt;&#039;;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;            } );&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;            // Newlines to line breaks&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;            text = text.replace( /\n/g, &#039;&amp;lt;br&amp;gt;&#039; );&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;            return text;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;        }&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;         function esc( s ) { return mw.html.escape( s || &amp;#039;&amp;#039; ); }&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;         function esc( s ) { return mw.html.escape( s || &amp;#039;&amp;#039; ); }&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l319&quot;&gt;Line 319:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 338:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;                     extras += &amp;#039;&amp;lt;div class=&amp;quot;project-card-extra&amp;quot;&amp;gt;&amp;#039; +&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;                     extras += &amp;#039;&amp;lt;div class=&amp;quot;project-card-extra&amp;quot;&amp;gt;&amp;#039; +&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;                         esc( row[ &amp;#039;field&amp;#039; + i + &amp;#039;label&amp;#039; ] ) +&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;                         esc( row[ &amp;#039;field&amp;#039; + i + &amp;#039;label&amp;#039; ] ) +&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;                         &#039;: &amp;lt;strong&amp;gt;&#039; + &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;esc&lt;/del&gt;( row[ &#039;field&#039; + i + &#039;value&#039; ] ) + &#039;&amp;lt;/strong&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;                         &#039;: &amp;lt;strong&amp;gt;&#039; + &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;parseWikitext&lt;/ins&gt;( row[ &#039;field&#039; + i + &#039;value&#039; ] ) + &#039;&amp;lt;/strong&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;                 }&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;                 }&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;             }&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;             }&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l373&quot;&gt;Line 373:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 392:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;                         $.each( data.query.pages || {}, function ( _, page ) {&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;                         $.each( data.query.pages || {}, function ( _, page ) {&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;                             if ( page.missing !== undefined ) { return; }&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;                             if ( page.missing !== undefined ) { return; }&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;                             var match = chunk.filter( function ( c ) { return c.page === page.title; } );&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;                            var normalise = function ( s ) { return ( s || &#039;&#039; ).replace( /_/g, &#039; &#039; ); };&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;                             var match = chunk.filter( function ( c ) { return &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;normalise( &lt;/ins&gt;c.page &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;) &lt;/ins&gt;=== &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;normalise( &lt;/ins&gt;page.title &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;)&lt;/ins&gt;; } );&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;                             if ( !match.length ) { return; }&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;                             if ( !match.length ) { return; }&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;                             var $el = match[ 0 ].$el;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;                             var $el = match[ 0 ].$el;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Anthony</name></author>
	</entry>
	<entry>
		<id>https://unfinishedprojects.net/index.php?title=MediaWiki:Gadget-projects.js&amp;diff=1147&amp;oldid=prev</id>
		<title>Anthony at 02:47, 2 April 2026</title>
		<link rel="alternate" type="text/html" href="https://unfinishedprojects.net/index.php?title=MediaWiki:Gadget-projects.js&amp;diff=1147&amp;oldid=prev"/>
		<updated>2026-04-02T02:47:57Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 02:47, 2 April 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l326&quot;&gt;Line 326:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 326:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;                 &amp;#039;&amp;lt;div class=&amp;quot;project-card-wrap&amp;quot;&amp;gt;&amp;#039;,&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;                 &amp;#039;&amp;lt;div class=&amp;quot;project-card-wrap&amp;quot;&amp;gt;&amp;#039;,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;                   &amp;#039;&amp;lt;div class=&amp;quot;project-card&amp;quot;&amp;gt;&amp;#039;,&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;                   &amp;#039;&amp;lt;div class=&amp;quot;project-card&amp;quot;&amp;gt;&amp;#039;,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;                     &#039;&amp;lt;div class=&quot;project-card-image&quot;&amp;gt;&#039;, img, &#039;&amp;lt;/div&amp;gt;&#039;,&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;                     &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&#039;&amp;lt;div class=&quot;project-card-inner&quot;&amp;gt;&#039;,&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;                    &lt;/del&gt;&#039;&amp;lt;div class=&quot;project-card-body&quot;&amp;gt;&#039;,&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;                      &#039;&amp;lt;div class=&quot;project-card-front&quot;&amp;gt;&#039;,&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;                      &lt;/del&gt;&#039;&amp;lt;div class=&quot;project-card-title&quot;&amp;gt;&amp;lt;a href=&quot;&#039;, url, &#039;&quot;&amp;gt;&#039;, esc( name ), &#039;&amp;lt;/a&amp;gt;&amp;lt;/div&amp;gt;&#039;,&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;                        &lt;/ins&gt;&#039;&amp;lt;div class=&quot;project-card-image&quot;&amp;gt;&#039;, img, &#039;&amp;lt;/div&amp;gt;&#039;,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;                      &lt;/del&gt;&#039;&amp;lt;div class=&quot;project-card-badges&quot;&amp;gt;&#039;, badges, &#039;&amp;lt;/div&amp;gt;&#039;,&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;                        &lt;/ins&gt;&#039;&amp;lt;div class=&quot;project-card-body&quot;&amp;gt;&#039;,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;                      &lt;/del&gt;row.creator&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;                          &lt;/ins&gt;&#039;&amp;lt;div class=&quot;project-card-title&quot;&amp;gt;&amp;lt;a href=&quot;&#039;, url, &#039;&quot;&amp;gt;&#039;, esc( name ), &#039;&amp;lt;/a&amp;gt;&amp;lt;/div&amp;gt;&#039;,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;                        &lt;/del&gt;? &#039;&amp;lt;div class=&quot;project-card-creator&quot;&amp;gt;&amp;lt;span class=&quot;project-card-label&quot;&amp;gt;By&amp;lt;/span&amp;gt; &#039; +&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;                          &lt;/ins&gt;&#039;&amp;lt;div class=&quot;project-card-badges&quot;&amp;gt;&#039;, badges, &#039;&amp;lt;/div&amp;gt;&#039;,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;                          &lt;/del&gt;esc( row.creator ) + &#039;&amp;lt;/div&amp;gt;&#039;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;                          &lt;/ins&gt;row.creator ? &#039;&amp;lt;div class=&quot;project-card-creator&quot;&amp;gt;&amp;lt;span class=&quot;project-card-label&quot;&amp;gt;By&amp;lt;/span&amp;gt; &#039; + esc( row.creator ) + &#039;&amp;lt;/div&amp;gt;&#039; : &#039;&#039;,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;                        &lt;/del&gt;: &#039;&#039;,&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;                          &lt;/ins&gt;extras,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;                      &lt;/del&gt;extras,&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;                          &lt;/ins&gt;tags ? &#039;&amp;lt;div class=&quot;project-card-tags&quot;&amp;gt;&#039; + tags + &#039;&amp;lt;/div&amp;gt;&#039; : &#039;&#039;,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;                      &lt;/del&gt;tags ? &#039;&amp;lt;div class=&quot;project-card-tags&quot;&amp;gt;&#039; + tags + &#039;&amp;lt;/div&amp;gt;&#039; : &#039;&#039;,&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;                          &lt;/ins&gt;&#039;&amp;lt;div class=&quot;project-card-footer&quot;&amp;gt;&#039;,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;                      &lt;/del&gt;&#039;&amp;lt;div class=&quot;project-card-footer&quot;&amp;gt;&#039;,&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;                            &lt;/ins&gt;&#039;&amp;lt;span class=&quot;project-card-meta-item project-card-contributors&quot;&amp;gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;—&lt;/ins&gt;&amp;lt;/span&amp;gt;&#039;,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;                        &lt;/del&gt;&#039;&amp;lt;span class=&quot;project-card-meta-item project-card-contributors&quot;&amp;gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;\u2014&lt;/del&gt;&amp;lt;/span&amp;gt;&#039;,&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;                            &lt;/ins&gt;&#039;&amp;lt;span class=&quot;project-card-meta-item project-card-updated&quot;&amp;gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;—&lt;/ins&gt;&amp;lt;/span&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;gt;&#039;,&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;                        &lt;/del&gt;&#039;&amp;lt;span class=&quot;project-card-meta-item project-card-updated&quot;&amp;gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;\u2014&lt;/del&gt;&amp;lt;/span&amp;gt;&#039;,&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;                            &#039;&amp;lt;button class=&quot;js-flip-btn project-card-flip-btn&quot;&amp;gt;Read more&amp;lt;/button&amp;gt;&#039;,&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;                          &#039;&amp;lt;/div&amp;gt;&#039;,&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;                        &#039;&amp;lt;/div&amp;gt;&#039;,&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;                      &#039;&amp;lt;/div&amp;gt;&#039;,&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;                      &#039;&amp;lt;div class=&quot;project-card-back&quot;&amp;gt;&#039;,&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;                         &#039;&amp;lt;div class=&quot;project-card-back-header&quot;&amp;gt;&#039;,&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;                            &#039;&amp;lt;span class=&quot;project-card-back-title&quot;&amp;gt;About&amp;lt;/span&amp;gt;&#039;,&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;                            &#039;&amp;lt;button class=&quot;js-flip-btn project-card-flip-btn&quot;&amp;gt;Close&amp;lt;/button&amp;gt;&#039;,&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;                         &#039;&amp;lt;/div&amp;gt;&#039;,&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;                         &#039;&amp;lt;div class=&quot;project-card-back-content&quot;&amp;gt;&#039;,&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;                            row.description ? esc( row.description ) : &#039;No description provided.&#039;,&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;                         &#039;&amp;lt;/div&lt;/ins&gt;&amp;gt;&#039;,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;                       &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;,&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;                       &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;                     &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;,&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;                     &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;                    row.description&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;                      ? &#039;&amp;lt;div class=&quot;project-card-description&quot;&amp;gt;&#039; + esc( row.description ) + &#039;&amp;lt;/div&amp;gt;&#039;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;                      : &#039;&#039;,&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;                   &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;,&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;                   &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;                 &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;                 &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Anthony</name></author>
	</entry>
	<entry>
		<id>https://unfinishedprojects.net/index.php?title=MediaWiki:Gadget-projects.js&amp;diff=1140&amp;oldid=prev</id>
		<title>Anthony at 02:35, 2 April 2026</title>
		<link rel="alternate" type="text/html" href="https://unfinishedprojects.net/index.php?title=MediaWiki:Gadget-projects.js&amp;diff=1140&amp;oldid=prev"/>
		<updated>2026-04-02T02:35:58Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 02:35, 2 April 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l129&quot;&gt;Line 129:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 129:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;                     &amp;quot; OR creator LIKE &amp;#039;%&amp;quot; + q + &amp;quot;%&amp;#039;&amp;quot; +&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;                     &amp;quot; OR creator LIKE &amp;#039;%&amp;quot; + q + &amp;quot;%&amp;#039;&amp;quot; +&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;                     &amp;quot; OR license LIKE &amp;#039;%&amp;quot; + q + &amp;quot;%&amp;#039;&amp;quot; +&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;                     &amp;quot; OR license LIKE &amp;#039;%&amp;quot; + q + &amp;quot;%&amp;#039;&amp;quot; +&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;                     &quot; OR description &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;LIKE &#039;%&quot; + q + &quot;%&#039;&quot; +&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;                     &quot; OR description LIKE &#039;%&quot; + q + &quot;%&#039; )&quot;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;                    &quot; OR tags &lt;/del&gt;LIKE &#039;%&quot; + q + &quot;%&#039; )&quot;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;                 );&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;                 );&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;             }&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;             }&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Anthony</name></author>
	</entry>
	<entry>
		<id>https://unfinishedprojects.net/index.php?title=MediaWiki:Gadget-projects.js&amp;diff=1133&amp;oldid=prev</id>
		<title>Anthony at 01:31, 2 April 2026</title>
		<link rel="alternate" type="text/html" href="https://unfinishedprojects.net/index.php?title=MediaWiki:Gadget-projects.js&amp;diff=1133&amp;oldid=prev"/>
		<updated>2026-04-02T01:31:44Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;a href=&quot;https://unfinishedprojects.net/index.php?title=MediaWiki:Gadget-projects.js&amp;amp;diff=1133&amp;amp;oldid=1118&quot;&gt;Show changes&lt;/a&gt;</summary>
		<author><name>Anthony</name></author>
	</entry>
	<entry>
		<id>https://unfinishedprojects.net/index.php?title=MediaWiki:Gadget-projects.js&amp;diff=1118&amp;oldid=prev</id>
		<title>Anthony at 00:41, 2 April 2026</title>
		<link rel="alternate" type="text/html" href="https://unfinishedprojects.net/index.php?title=MediaWiki:Gadget-projects.js&amp;diff=1118&amp;oldid=prev"/>
		<updated>2026-04-02T00:41:58Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;a href=&quot;https://unfinishedprojects.net/index.php?title=MediaWiki:Gadget-projects.js&amp;amp;diff=1118&amp;amp;oldid=872&quot;&gt;Show changes&lt;/a&gt;</summary>
		<author><name>Anthony</name></author>
	</entry>
	<entry>
		<id>https://unfinishedprojects.net/index.php?title=MediaWiki:Gadget-projects.js&amp;diff=872&amp;oldid=prev</id>
		<title>Anthony: Removed protection from &quot;MediaWiki:Gadget-projects.js&quot;</title>
		<link rel="alternate" type="text/html" href="https://unfinishedprojects.net/index.php?title=MediaWiki:Gadget-projects.js&amp;diff=872&amp;oldid=prev"/>
		<updated>2026-03-14T05:06:46Z</updated>

		<summary type="html">&lt;p&gt;Removed protection from &amp;quot;&lt;a href=&quot;/wiki/MediaWiki:Gadget-projects.js&quot; title=&quot;MediaWiki:Gadget-projects.js&quot;&gt;MediaWiki:Gadget-projects.js&lt;/a&gt;&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;/* =============================================================================&lt;br /&gt;
   Gadget-projects.js&lt;br /&gt;
   Handles: tag rendering, filter bar, contributor count + last edited.&lt;br /&gt;
   ============================================================================= */&lt;br /&gt;
( function () {&lt;br /&gt;
    var pageName = mw.config.get( &amp;#039;wgPageName&amp;#039; ) || &amp;#039;&amp;#039;;&lt;br /&gt;
    if ( !/^Projects[:/][^/]+$/.test( pageName ) ) return;&lt;br /&gt;
&lt;br /&gt;
    $( function () {&lt;br /&gt;
        var $grid      = $( &amp;#039;.project-hub-grid&amp;#039; );&lt;br /&gt;
        var $filterBar = $( &amp;#039;.project-hub-filters&amp;#039; );&lt;br /&gt;
        if ( !$grid.length || !$filterBar.length ) return;&lt;br /&gt;
&lt;br /&gt;
        var $cards   = $grid.find( &amp;#039;.project-card-wrap&amp;#039; );&lt;br /&gt;
        var total    = $cards.length;&lt;br /&gt;
        var hubSlug  = pageName.replace( /^Projects[:/]/, &amp;#039;&amp;#039; );&lt;br /&gt;
&lt;br /&gt;
        // --- Tag spans -------------------------------------------------------&lt;br /&gt;
        $( &amp;#039;.project-card-tags[data-tags]&amp;#039; ).each( function () {&lt;br /&gt;
            var $el = $( this );&lt;br /&gt;
            $el.attr( &amp;#039;data-tags&amp;#039; ).trim().split( /[\s,]+/ ).forEach( function ( tag ) {&lt;br /&gt;
                if ( tag ) $el.append( $( &amp;#039;&amp;lt;span&amp;gt;&amp;#039; ).addClass( &amp;#039;project-card-tag&amp;#039; ).text( tag ) );&lt;br /&gt;
            } );&lt;br /&gt;
        } );&lt;br /&gt;
&lt;br /&gt;
        // --- Filter bar (options populated from Cargo) -----------------------&lt;br /&gt;
        var $search  = $( &amp;#039;&amp;lt;input&amp;gt;&amp;#039; ).attr( { type: &amp;#039;text&amp;#039;, placeholder: &amp;#039;Search projects, tags, creators...&amp;#039;, &amp;#039;class&amp;#039;: &amp;#039;project-hub-search&amp;#039; } );&lt;br /&gt;
        var $status  = $( &amp;#039;&amp;lt;select&amp;gt;&amp;#039; ).addClass( &amp;#039;project-hub-select&amp;#039; ).append( $( &amp;#039;&amp;lt;option&amp;gt;&amp;#039; ).val( &amp;#039;&amp;#039; ).text( &amp;#039;All statuses&amp;#039; ) );&lt;br /&gt;
        var $license = $( &amp;#039;&amp;lt;select&amp;gt;&amp;#039; ).addClass( &amp;#039;project-hub-select&amp;#039; ).append( $( &amp;#039;&amp;lt;option&amp;gt;&amp;#039; ).val( &amp;#039;&amp;#039; ).text( &amp;#039;All licenses&amp;#039; ) );&lt;br /&gt;
        var $sort    = $( &amp;#039;&amp;lt;select&amp;gt;&amp;#039; ).addClass( &amp;#039;project-hub-select&amp;#039; ).append(&lt;br /&gt;
            $( &amp;#039;&amp;lt;option&amp;gt;&amp;#039; ).val( &amp;#039;alpha&amp;#039; ).text( &amp;#039;A – Z&amp;#039; ),&lt;br /&gt;
            $( &amp;#039;&amp;lt;option&amp;gt;&amp;#039; ).val( &amp;#039;edited&amp;#039; ).text( &amp;#039;Recently edited&amp;#039; ),&lt;br /&gt;
            $( &amp;#039;&amp;lt;option&amp;gt;&amp;#039; ).val( &amp;#039;contributors&amp;#039; ).text( &amp;#039;Most contributors&amp;#039; )&lt;br /&gt;
        );&lt;br /&gt;
        var $count = $( &amp;#039;&amp;lt;span&amp;gt;&amp;#039; ).addClass( &amp;#039;project-hub-count&amp;#039; )&lt;br /&gt;
            .text( total + &amp;#039; project&amp;#039; + ( total === 1 ? &amp;#039;&amp;#039; : &amp;#039;s&amp;#039; ) );&lt;br /&gt;
&lt;br /&gt;
        $filterBar.append( $search, $status, $license, $sort, $count );&lt;br /&gt;
&lt;br /&gt;
        // Populate status + license options from Cargo&lt;br /&gt;
        var apiBase = mw.util.wikiScript( &amp;#039;api&amp;#039; );&lt;br /&gt;
&lt;br /&gt;
        $.getJSON( apiBase, {&lt;br /&gt;
            action   : &amp;#039;cargoquery&amp;#039;,&lt;br /&gt;
            tables   : &amp;#039;Projects&amp;#039;,&lt;br /&gt;
            fields   : &amp;#039;status&amp;#039;,&lt;br /&gt;
            where    : &amp;#039;categories HOLDS \&amp;#039;&amp;#039; + hubSlug + &amp;#039;\&amp;#039; AND status IS NOT NULL AND status != \&amp;#039;\&amp;#039;&amp;#039;,&lt;br /&gt;
            group_by : &amp;#039;status&amp;#039;,&lt;br /&gt;
            order_by : &amp;#039;status&amp;#039;,&lt;br /&gt;
            limit    : 20,&lt;br /&gt;
            format   : &amp;#039;json&amp;#039;&lt;br /&gt;
        } ).done( function ( data ) {&lt;br /&gt;
            ( data.cargoquery || [] ).forEach( function ( row ) {&lt;br /&gt;
                var v = row.title &amp;amp;&amp;amp; row.title.status;&lt;br /&gt;
                if ( v ) $status.append( $( &amp;#039;&amp;lt;option&amp;gt;&amp;#039; ).val( v.toLowerCase() ).text( v ) );&lt;br /&gt;
            } );&lt;br /&gt;
        } );&lt;br /&gt;
&lt;br /&gt;
        $.getJSON( apiBase, {&lt;br /&gt;
            action   : &amp;#039;cargoquery&amp;#039;,&lt;br /&gt;
            tables   : &amp;#039;Projects&amp;#039;,&lt;br /&gt;
            fields   : &amp;#039;license&amp;#039;,&lt;br /&gt;
            where    : &amp;#039;categories HOLDS \&amp;#039;&amp;#039; + hubSlug + &amp;#039;\&amp;#039; AND license IS NOT NULL AND license != \&amp;#039;\&amp;#039;&amp;#039;,&lt;br /&gt;
            group_by : &amp;#039;license&amp;#039;,&lt;br /&gt;
            order_by : &amp;#039;license&amp;#039;,&lt;br /&gt;
            limit    : 20,&lt;br /&gt;
            format   : &amp;#039;json&amp;#039;&lt;br /&gt;
        } ).done( function ( data ) {&lt;br /&gt;
            ( data.cargoquery || [] ).forEach( function ( row ) {&lt;br /&gt;
                var v = row.title &amp;amp;&amp;amp; row.title.license;&lt;br /&gt;
                if ( v ) $license.append( $( &amp;#039;&amp;lt;option&amp;gt;&amp;#039; ).val( v.toLowerCase() ).text( v ) );&lt;br /&gt;
            } );&lt;br /&gt;
        } );&lt;br /&gt;
&lt;br /&gt;
        // --- Filter + sort ---------------------------------------------------&lt;br /&gt;
        function applyFilters() {&lt;br /&gt;
            var q = $search.val().toLowerCase().trim();&lt;br /&gt;
            var s = $status.val();&lt;br /&gt;
            var l = $license.val();&lt;br /&gt;
            var visible = 0;&lt;br /&gt;
&lt;br /&gt;
            $cards.each( function () {&lt;br /&gt;
                var $c = $( this );&lt;br /&gt;
                var hay = [ $c.data(&amp;#039;name&amp;#039;), $c.data(&amp;#039;tags&amp;#039;), $c.data(&amp;#039;creator&amp;#039;), $c.data(&amp;#039;extra&amp;#039;) ]&lt;br /&gt;
                    .join( &amp;#039; &amp;#039; ).toLowerCase();&lt;br /&gt;
                var show = ( !q || hay.indexOf(q) !== -1 ) &amp;amp;&amp;amp;&lt;br /&gt;
                           ( !s || ( $c.data(&amp;#039;status&amp;#039;)  || &amp;#039;&amp;#039; ).toLowerCase() === s ) &amp;amp;&amp;amp;&lt;br /&gt;
                           ( !l || ( $c.data(&amp;#039;license&amp;#039;) || &amp;#039;&amp;#039; ).toLowerCase() === l );&lt;br /&gt;
                $c.toggle( show );&lt;br /&gt;
                if ( show ) visible++;&lt;br /&gt;
            } );&lt;br /&gt;
&lt;br /&gt;
            $count.text( ( q||s||l ? visible + &amp;#039; / &amp;#039; : &amp;#039;&amp;#039; ) + total + &amp;#039; project&amp;#039; + ( total===1 ? &amp;#039;&amp;#039; : &amp;#039;s&amp;#039; ) );&lt;br /&gt;
            $( &amp;#039;.project-hub-empty&amp;#039; ).toggle( visible === 0 );&lt;br /&gt;
&lt;br /&gt;
            var sortVal = $sort.val();&lt;br /&gt;
            $cards.filter( &amp;#039;:visible&amp;#039; ).toArray().sort( function ( a, b ) {&lt;br /&gt;
                if ( sortVal === &amp;#039;alpha&amp;#039;        ) return ( $( a ).data(&amp;#039;name&amp;#039;) || &amp;#039;&amp;#039; ).localeCompare( $( b ).data(&amp;#039;name&amp;#039;) || &amp;#039;&amp;#039; );&lt;br /&gt;
                if ( sortVal === &amp;#039;edited&amp;#039;       ) return ( $( b ).data(&amp;#039;timestamp&amp;#039;) || &amp;#039;&amp;#039; ).localeCompare( $( a ).data(&amp;#039;timestamp&amp;#039;) || &amp;#039;&amp;#039; );&lt;br /&gt;
                if ( sortVal === &amp;#039;contributors&amp;#039; ) return ( +$( b ).data(&amp;#039;contributor-count&amp;#039;) || 0 ) - ( +$( a ).data(&amp;#039;contributor-count&amp;#039;) || 0 );&lt;br /&gt;
                return 0;&lt;br /&gt;
            } ).forEach( function ( el ) { $grid.append( el ); } );&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        $search.on( &amp;#039;input&amp;#039;, applyFilters );&lt;br /&gt;
        $status.on( &amp;#039;change&amp;#039;, applyFilters );&lt;br /&gt;
        $license.on( &amp;#039;change&amp;#039;, applyFilters );&lt;br /&gt;
        $sort.on( &amp;#039;change&amp;#039;, applyFilters );&lt;br /&gt;
&lt;br /&gt;
        // --- API calls -------------------------------------------------------&lt;br /&gt;
        var pageNames = $cards.map( function () {&lt;br /&gt;
            return decodeURIComponent( $( this ).data(&amp;#039;page&amp;#039;) || &amp;#039;&amp;#039; ).replace( /_/g, &amp;#039; &amp;#039; ) || null;&lt;br /&gt;
        } ).get().filter( Boolean );&lt;br /&gt;
&lt;br /&gt;
        mw.loader.using( &amp;#039;mediawiki.api&amp;#039; ).then( function () {&lt;br /&gt;
            var api = new mw.Api();&lt;br /&gt;
&lt;br /&gt;
            // Card enrichment: contributor count + last edited&lt;br /&gt;
            if ( pageNames.length ) {&lt;br /&gt;
                for ( var i = 0; i &amp;lt; pageNames.length; i += 20 ) {&lt;br /&gt;
                    ( function ( batch ) {&lt;br /&gt;
                        api.get( {&lt;br /&gt;
                            action  : &amp;#039;query&amp;#039;,&lt;br /&gt;
                            titles  : batch.join( &amp;#039;|&amp;#039; ),&lt;br /&gt;
                            prop    : &amp;#039;revisions|contributors&amp;#039;,&lt;br /&gt;
                            rvprop  : &amp;#039;timestamp&amp;#039;,&lt;br /&gt;
                            rvlimit : 1,&lt;br /&gt;
                            pclimit : 20,&lt;br /&gt;
                            format  : &amp;#039;json&amp;#039;&lt;br /&gt;
                        } ).done( function ( data ) {&lt;br /&gt;
                            if ( !data || !data.query || !data.query.pages ) return;&lt;br /&gt;
                            $.each( data.query.pages, function ( _, page ) {&lt;br /&gt;
                                if ( page.missing !== undefined ) return;&lt;br /&gt;
                                var ts = page.revisions &amp;amp;&amp;amp; page.revisions[0] &amp;amp;&amp;amp; page.revisions[0].timestamp || &amp;#039;&amp;#039;;&lt;br /&gt;
                                var n  = ( page.contributors ? page.contributors.length : 0 )&lt;br /&gt;
                                       + ( page.anoncontributors || 0 );&lt;br /&gt;
                                var $c = $cards.filter( function () {&lt;br /&gt;
                                    return decodeURIComponent( $( this ).data(&amp;#039;page&amp;#039;) || &amp;#039;&amp;#039; ).replace( /_/g, &amp;#039; &amp;#039; ) === page.title;&lt;br /&gt;
                                } );&lt;br /&gt;
                                if ( !$c.length ) return;&lt;br /&gt;
                                $c.data( &amp;#039;timestamp&amp;#039;, ts ).data( &amp;#039;contributor-count&amp;#039;, n );&lt;br /&gt;
                                var d = ts ? new Date( ts ).toLocaleDateString( &amp;#039;en-GB&amp;#039;, { year: &amp;#039;numeric&amp;#039;, month: &amp;#039;short&amp;#039; } ) : &amp;#039;—&amp;#039;;&lt;br /&gt;
                                $c.find( &amp;#039;.project-card-contributors&amp;#039; ).text( n + ( n === 1 ? &amp;#039; contributor&amp;#039; : &amp;#039; contributors&amp;#039; ) ).addClass( &amp;#039;loaded&amp;#039; );&lt;br /&gt;
                                $c.find( &amp;#039;.project-card-updated&amp;#039; ).text( &amp;#039;Edited &amp;#039; + d ).addClass( &amp;#039;loaded&amp;#039; );&lt;br /&gt;
                            } );&lt;br /&gt;
                        } );&lt;br /&gt;
                    }( pageNames.slice( i, i + 20 ) ) );&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            // Hub header: most recently touched page in this hub&amp;#039;s category&lt;br /&gt;
            api.get( {&lt;br /&gt;
                action  : &amp;#039;query&amp;#039;,&lt;br /&gt;
                list    : &amp;#039;categorymembers&amp;#039;,&lt;br /&gt;
                cmtitle : &amp;#039;Category:Projects/&amp;#039; + hubSlug,&lt;br /&gt;
                cmsort  : &amp;#039;timestamp&amp;#039;,&lt;br /&gt;
                cmdir   : &amp;#039;desc&amp;#039;,&lt;br /&gt;
                cmlimit : 1,&lt;br /&gt;
                cmtype  : &amp;#039;page&amp;#039;,&lt;br /&gt;
                cmprop  : &amp;#039;ids|title|timestamp&amp;#039;,&lt;br /&gt;
                format  : &amp;#039;json&amp;#039;&lt;br /&gt;
            } ).done( function ( data ) {&lt;br /&gt;
                var members = data.query &amp;amp;&amp;amp; data.query.categorymembers;&lt;br /&gt;
                if ( !members || !members.length ) return;&lt;br /&gt;
                var name = members[0].title.replace( /^.*\//, &amp;#039;&amp;#039; );&lt;br /&gt;
                var date = members[0].timestamp&lt;br /&gt;
                    ? new Date( members[0].timestamp ).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; } )&lt;br /&gt;
                    : &amp;#039;—&amp;#039;;&lt;br /&gt;
                var str = name + &amp;#039; — &amp;#039; + date;&lt;br /&gt;
                $( &amp;#039;#hub-meta-last-submission&amp;#039; ).text( str );&lt;br /&gt;
                $( &amp;#039;#hub-meta-last-edit&amp;#039; ).text( str );&lt;br /&gt;
            } );&lt;br /&gt;
        } );&lt;br /&gt;
&lt;br /&gt;
    } );&lt;br /&gt;
}() );&lt;/div&gt;</summary>
		<author><name>Anthony</name></author>
	</entry>
</feed>