<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://hna.wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=ReisuDesign</id>
	<title>Honkai: Nexus Anima Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://hna.wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=ReisuDesign"/>
	<link rel="alternate" type="text/html" href="https://hna.wiki/Special:Contributions/ReisuDesign"/>
	<updated>2026-10-13T07:11:40Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.46.0</generator>
	<entry>
		<id>https://hna.wiki/MediaWiki:Common.css?diff=10650</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://hna.wiki/MediaWiki:Common.css?diff=10650"/>
		<updated>2026-10-10T17:55:38Z</updated>

		<summary type="html">&lt;p&gt;ReisuDesign: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS placed here will be applied to all skins (including the mobile skin) */&lt;br /&gt;
@import url(&amp;quot;/index.php?title=MediaWiki:Mbox.css&amp;amp;action=raw&amp;amp;ctype=text/css&amp;amp;cb=3&amp;quot;);&lt;br /&gt;
@import url(&amp;quot;/index.php?title=MediaWiki:FD_Mbox.css&amp;amp;action=raw&amp;amp;ctype=text/css&amp;amp;cb=3&amp;quot;);&lt;br /&gt;
@import url(&amp;quot;/index.php?title=MediaWiki:Quotes.css&amp;amp;action=raw&amp;amp;ctype=text/css&amp;amp;cb=3&amp;quot;);&lt;br /&gt;
@import url(&amp;quot;/index.php?title=MediaWiki:Navbox.css&amp;amp;action=raw&amp;amp;ctype=text/css&amp;amp;cb=3&amp;quot;);&lt;br /&gt;
@import url(&amp;quot;/index.php?title=MediaWiki:Font.css&amp;amp;action=raw&amp;amp;ctype=text/css&amp;amp;cb=3&amp;quot;);&lt;br /&gt;
@import url(&amp;quot;/index.php?title=MediaWiki:Item.css&amp;amp;action=raw&amp;amp;ctype=text/css&amp;amp;cb=3&amp;quot;);&lt;br /&gt;
@import url(&amp;quot;/index.php?title=MediaWiki:Gallery.css&amp;amp;action=raw&amp;amp;ctype=text/css&amp;amp;cb=3&amp;quot;);&lt;br /&gt;
@import url(&amp;quot;/index.php?title=MediaWiki:CustomTabs.css&amp;amp;action=raw&amp;amp;ctype=text/css&amp;amp;cb=3&amp;quot;);&lt;br /&gt;
@import url(&amp;quot;/index.php?title=MediaWiki:Tables.css&amp;amp;action=raw&amp;amp;ctype=text/css&amp;amp;cb=3&amp;quot;);&lt;br /&gt;
@import url(&amp;quot;/index.php?title=MediaWiki:EditorDashboard.css&amp;amp;action=raw&amp;amp;ctype=text/css&amp;amp;cb=3&amp;quot;);&lt;br /&gt;
@import url(&amp;quot;/index.php?title=MediaWiki:Documentation.css&amp;amp;action=raw&amp;amp;ctype=text/css&amp;amp;cb=3&amp;quot;);&lt;br /&gt;
@import url(&amp;quot;/index.php?title=MediaWiki:Dialogue.css&amp;amp;action=raw&amp;amp;ctype=text/css&amp;amp;cb=3&amp;quot;);&lt;br /&gt;
@import url(&amp;quot;/index.php?title=MediaWiki:StaffColors.css&amp;amp;action=raw&amp;amp;ctype=text/css&amp;amp;cb=3&amp;quot;);&lt;br /&gt;
@import url(&amp;quot;/index.php?title=MediaWiki:Attributes.css&amp;amp;action=raw&amp;amp;ctype=text/css&amp;amp;cb=3&amp;quot;);&lt;br /&gt;
@import url(&amp;quot;/index.php?title=MediaWiki:ChangeHistory.css&amp;amp;action=raw&amp;amp;ctype=text/css&amp;amp;cb=3&amp;quot;);&lt;br /&gt;
@import url(&amp;quot;/index.php?title=MediaWiki:Edios Infobox.css&amp;amp;action=raw&amp;amp;ctype=text/css&amp;amp;cb=3&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
/* Import Font */&lt;br /&gt;
@import url(&#039;https://fonts.googleapis.com/css2?family=Quicksand:wght@300..700&amp;amp;display=swap&#039;);&lt;br /&gt;
@import url(&#039;https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;700&amp;amp;family=Noto+Sans+KR:wght@400;700&amp;amp;family=Noto+Sans+SC:wght@400;700&amp;amp;family=Noto+Sans+TC:wght@400;700&amp;amp;family=Noto+Sans+Thai:wght@400;700&amp;amp;family=Noto+Sans:ital,wght@0,400;0,700;1,400;1,700&amp;amp;family=Noto+Sans+Avestan:wght@400;700&amp;amp;family=Noto+Sans+Hebrew:wght@400;700&amp;amp;display=swap&#039;);&lt;br /&gt;
&lt;br /&gt;
:root {&lt;br /&gt;
	--theme-page-headings-font: &#039;Quicksand&#039;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Class to add text hidden from view that is usable by screen readers */&lt;br /&gt;
.screen-reader-text { font-size: 0; }&lt;br /&gt;
&lt;br /&gt;
/* [[Template:Description]] styles */&lt;br /&gt;
div.description-wrapper {&lt;br /&gt;
	border: 1px solid var(--border-color);&lt;br /&gt;
	overflow: hidden;&lt;br /&gt;
	border-radius: 8px;&lt;br /&gt;
	background: var(--theme-color-9);&lt;br /&gt;
}&lt;br /&gt;
div.description-content {&lt;br /&gt;
	font-size: 15px;&lt;br /&gt;
	text-align: left;&lt;br /&gt;
	overflow: auto;&lt;br /&gt;
	line-height: 1.35em;&lt;br /&gt;
	padding: 12px 12px 12px 12px;&lt;br /&gt;
}&lt;br /&gt;
div.description-source {&lt;br /&gt;
	font-size: 15px;&lt;br /&gt;
	overflow: auto;&lt;br /&gt;
	padding: 5px 12px;&lt;br /&gt;
}&lt;br /&gt;
hr.description-separator {&lt;br /&gt;
	width: 97.5%;&lt;br /&gt;
	margin: auto;&lt;br /&gt;
}&lt;br /&gt;
div.description-title {&lt;br /&gt;
	font-size: 15px;&lt;br /&gt;
	text-align: left;&lt;br /&gt;
	overflow: auto;&lt;br /&gt;
	padding: 10px 12px 6px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* For [[Module:Formatting]] */&lt;br /&gt;
.custom-formatting-code {&lt;br /&gt;
	display: inline-block;&lt;br /&gt;
	line-height: 21px;&lt;br /&gt;
}&lt;br /&gt;
.custom-formatting-code.code-block-table { display: table; }&lt;br /&gt;
span.variable { opacity: 0.65; }&lt;br /&gt;
span.variable::after {&lt;br /&gt;
	opacity: 0.65;&lt;br /&gt;
	content: &amp;quot;&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
span.variable::before {&lt;br /&gt;
	opacity: 0.65;&lt;br /&gt;
	content: &amp;quot;&amp;lt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
.custom-formatting-nested { display: none; }&lt;br /&gt;
.custom-formatting-resulting { display: inline; }&lt;br /&gt;
.custom-formatting-code .custom-formatting-nested { display: inline-block; }&lt;br /&gt;
.custom-formatting-code .custom-formatting-resulting { display: none; }&lt;br /&gt;
/* End for [[Module:Formatting]] */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Styling for [[Template:tt]] */&lt;br /&gt;
.text-tooltip {&lt;br /&gt;
	cursor: help;    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.text-tooltip:not(.no-underline) {&lt;br /&gt;
	border-bottom-color: rgb(128, 128, 128);&lt;br /&gt;
	border-bottom-width: 1px;&lt;br /&gt;
	border-bottom-style: dotted;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Additional inverts and filters */&lt;br /&gt;
/* Default MediaWiki invert classes: .skin-invert and .skin-invert-image */&lt;br /&gt;
.skin-theme-clientpref-day .day-invert-image,&lt;br /&gt;
.skin-theme-clientpref-day .light-invert-image {&lt;br /&gt;
    filter: invert(65%) hue-rotate(180deg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-theme-clientpref-night .night-invert-image,&lt;br /&gt;
.skin-theme-clientpref-night .dark-invert-image {&lt;br /&gt;
    filter: invert(85%) hue-rotate(180deg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media screen and (prefers-color-scheme: dark) {&lt;br /&gt;
    .skin-theme-clientpref-os .night-invert-image,&lt;br /&gt;
    .skin-theme-clientpref-os .dark-invert-image {&lt;br /&gt;
        filter: invert(85%) hue-rotate(180deg);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>ReisuDesign</name></author>
	</entry>
	<entry>
		<id>https://hna.wiki/MediaWiki:Gadget-InvertImages.json?diff=10649</id>
		<title>MediaWiki:Gadget-InvertImages.json</title>
		<link rel="alternate" type="text/html" href="https://hna.wiki/MediaWiki:Gadget-InvertImages.json?diff=10649"/>
		<updated>2026-10-10T17:51:18Z</updated>

		<summary type="html">&lt;p&gt;ReisuDesign: Created page with &amp;quot;{ 	&amp;quot;day&amp;quot;: [ 		&amp;quot;Beauty Aspect Icon.png&amp;quot;, 		&amp;quot;Change Aspect Icon.png&amp;quot;, 		&amp;quot;Competition Aspect Icon.png&amp;quot;, 		&amp;quot;Dark Aspect Icon.png&amp;quot;, 		&amp;quot;Hate Aspect Icon.png&amp;quot;, 		&amp;quot;Insatiability Aspect Icon.png&amp;quot;, 		&amp;quot;Joy Aspect Icon.png&amp;quot;, 		&amp;quot;Light Aspect Icon.png&amp;quot;, 		&amp;quot;Love Aspect Icon.png&amp;quot;, 		&amp;quot;Memory Aspect Icon.png&amp;quot;, 		&amp;quot;Oblivion Aspect Icon.png&amp;quot;, 		&amp;quot;Peace Aspect Icon.png&amp;quot;, 		&amp;quot;Pride Aspect Icon (0.3.0).png&amp;quot;, 		&amp;quot;Pride Aspect Icon.png&amp;quot;, 		&amp;quot;Reality Aspect Icon (0.3.0).png&amp;quot;, 		&amp;quot;Reality Aspect Icon.pn...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{&lt;br /&gt;
	&amp;quot;day&amp;quot;: [&lt;br /&gt;
		&amp;quot;Beauty Aspect Icon.png&amp;quot;,&lt;br /&gt;
		&amp;quot;Change Aspect Icon.png&amp;quot;,&lt;br /&gt;
		&amp;quot;Competition Aspect Icon.png&amp;quot;,&lt;br /&gt;
		&amp;quot;Dark Aspect Icon.png&amp;quot;,&lt;br /&gt;
		&amp;quot;Hate Aspect Icon.png&amp;quot;,&lt;br /&gt;
		&amp;quot;Insatiability Aspect Icon.png&amp;quot;,&lt;br /&gt;
		&amp;quot;Joy Aspect Icon.png&amp;quot;,&lt;br /&gt;
		&amp;quot;Light Aspect Icon.png&amp;quot;,&lt;br /&gt;
		&amp;quot;Love Aspect Icon.png&amp;quot;,&lt;br /&gt;
		&amp;quot;Memory Aspect Icon.png&amp;quot;,&lt;br /&gt;
		&amp;quot;Oblivion Aspect Icon.png&amp;quot;,&lt;br /&gt;
		&amp;quot;Peace Aspect Icon.png&amp;quot;,&lt;br /&gt;
		&amp;quot;Pride Aspect Icon (0.3.0).png&amp;quot;,&lt;br /&gt;
		&amp;quot;Pride Aspect Icon.png&amp;quot;,&lt;br /&gt;
		&amp;quot;Reality Aspect Icon (0.3.0).png&amp;quot;,&lt;br /&gt;
		&amp;quot;Reality Aspect Icon.png&amp;quot;,&lt;br /&gt;
		&amp;quot;Regret Aspect Icon.png&amp;quot;,&lt;br /&gt;
		&amp;quot;Right Aspect Icon.png&amp;quot;,&lt;br /&gt;
		&amp;quot;Satiation Aspect Icon.png&amp;quot;,&lt;br /&gt;
		&amp;quot;Strength Aspect Icon (0.3.0).png&amp;quot;,&lt;br /&gt;
		&amp;quot;Strength Aspect Icon.png&amp;quot;,&lt;br /&gt;
		&amp;quot;Ugliness Aspect Icon (0.3.0).png&amp;quot;,&lt;br /&gt;
		&amp;quot;Ugliness Aspect Icon.png&amp;quot;,&lt;br /&gt;
		&amp;quot;War Aspect Icon.png&amp;quot;,&lt;br /&gt;
		&amp;quot;Weakness Aspect Icon.png&amp;quot;&lt;br /&gt;
	]&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>ReisuDesign</name></author>
	</entry>
	<entry>
		<id>https://hna.wiki/File:Strength_Aspect_Icon.png?diff=10648</id>
		<title>File:Strength Aspect Icon.png</title>
		<link rel="alternate" type="text/html" href="https://hna.wiki/File:Strength_Aspect_Icon.png?diff=10648"/>
		<updated>2026-10-10T17:50:18Z</updated>

		<summary type="html">&lt;p&gt;ReisuDesign: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Summary==&lt;br /&gt;
{{Placeholder Image|release=1}}&lt;br /&gt;
{{File|Aspect Icons;Icons to Invert}}&lt;br /&gt;
&lt;br /&gt;
==Licensing==&lt;br /&gt;
{{Fairuse}}&lt;/div&gt;</summary>
		<author><name>ReisuDesign</name></author>
	</entry>
	<entry>
		<id>https://hna.wiki/File:Strength_Aspect_Icon_(0.3.0).png?diff=10647</id>
		<title>File:Strength Aspect Icon (0.3.0).png</title>
		<link rel="alternate" type="text/html" href="https://hna.wiki/File:Strength_Aspect_Icon_(0.3.0).png?diff=10647"/>
		<updated>2026-10-10T17:50:10Z</updated>

		<summary type="html">&lt;p&gt;ReisuDesign: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Summary==&lt;br /&gt;
{{Removed}}&lt;br /&gt;
{{File|Aspect Icons;Icons to Invert}}&lt;br /&gt;
&lt;br /&gt;
==Licensing==&lt;br /&gt;
{{Fairuse}}&lt;/div&gt;</summary>
		<author><name>ReisuDesign</name></author>
	</entry>
	<entry>
		<id>https://hna.wiki/File:Satiation_Aspect_Icon.png?diff=10646</id>
		<title>File:Satiation Aspect Icon.png</title>
		<link rel="alternate" type="text/html" href="https://hna.wiki/File:Satiation_Aspect_Icon.png?diff=10646"/>
		<updated>2026-10-10T17:50:07Z</updated>

		<summary type="html">&lt;p&gt;ReisuDesign: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Summary==&lt;br /&gt;
{{Placeholder Image|release=1}}&lt;br /&gt;
{{File|Aspect Icons;Icons to Invert}}&lt;br /&gt;
&lt;br /&gt;
==Licensing==&lt;br /&gt;
{{Fairuse}}&lt;/div&gt;</summary>
		<author><name>ReisuDesign</name></author>
	</entry>
	<entry>
		<id>https://hna.wiki/File:Weakness_Aspect_Icon.png?diff=10645</id>
		<title>File:Weakness Aspect Icon.png</title>
		<link rel="alternate" type="text/html" href="https://hna.wiki/File:Weakness_Aspect_Icon.png?diff=10645"/>
		<updated>2026-10-10T17:48:47Z</updated>

		<summary type="html">&lt;p&gt;ReisuDesign: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Summary==&lt;br /&gt;
{{Placeholder Image|release=1}}&lt;br /&gt;
{{File|Aspect Icons;Icons to Invert}}&lt;br /&gt;
&lt;br /&gt;
==Licensing==&lt;br /&gt;
{{Fairuse}}&lt;/div&gt;</summary>
		<author><name>ReisuDesign</name></author>
	</entry>
	<entry>
		<id>https://hna.wiki/File:Right_Aspect_Icon.png?diff=10644</id>
		<title>File:Right Aspect Icon.png</title>
		<link rel="alternate" type="text/html" href="https://hna.wiki/File:Right_Aspect_Icon.png?diff=10644"/>
		<updated>2026-10-10T17:48:42Z</updated>

		<summary type="html">&lt;p&gt;ReisuDesign: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Summary==&lt;br /&gt;
{{Placeholder Image|release=1}}&lt;br /&gt;
{{File|Aspect Icons;Icons to Invert}}&lt;br /&gt;
&lt;br /&gt;
==Licensing==&lt;br /&gt;
{{Fairuse}}&lt;/div&gt;</summary>
		<author><name>ReisuDesign</name></author>
	</entry>
	<entry>
		<id>https://hna.wiki/File:War_Aspect_Icon.png?diff=10643</id>
		<title>File:War Aspect Icon.png</title>
		<link rel="alternate" type="text/html" href="https://hna.wiki/File:War_Aspect_Icon.png?diff=10643"/>
		<updated>2026-10-10T17:48:39Z</updated>

		<summary type="html">&lt;p&gt;ReisuDesign: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Summary==&lt;br /&gt;
{{Placeholder Image|release=1}}&lt;br /&gt;
{{File|Aspect Icons;Icons to Invert}}&lt;br /&gt;
&lt;br /&gt;
==Licensing==&lt;br /&gt;
{{Fairuse}}&lt;/div&gt;</summary>
		<author><name>ReisuDesign</name></author>
	</entry>
	<entry>
		<id>https://hna.wiki/File:Regret_Aspect_Icon.png?diff=10642</id>
		<title>File:Regret Aspect Icon.png</title>
		<link rel="alternate" type="text/html" href="https://hna.wiki/File:Regret_Aspect_Icon.png?diff=10642"/>
		<updated>2026-10-10T17:48:34Z</updated>

		<summary type="html">&lt;p&gt;ReisuDesign: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Summary==&lt;br /&gt;
{{Placeholder Image|release=1}}&lt;br /&gt;
{{File|Aspect Icons;Icons to Invert}}&lt;br /&gt;
&lt;br /&gt;
==Licensing==&lt;br /&gt;
{{Fairuse}}&lt;/div&gt;</summary>
		<author><name>ReisuDesign</name></author>
	</entry>
	<entry>
		<id>https://hna.wiki/File:Ugliness_Aspect_Icon.png?diff=10641</id>
		<title>File:Ugliness Aspect Icon.png</title>
		<link rel="alternate" type="text/html" href="https://hna.wiki/File:Ugliness_Aspect_Icon.png?diff=10641"/>
		<updated>2026-10-10T17:48:30Z</updated>

		<summary type="html">&lt;p&gt;ReisuDesign: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Summary==&lt;br /&gt;
{{Placeholder Image|release=1}}&lt;br /&gt;
{{File|Aspect Icons;Icons to Invert}}&lt;br /&gt;
&lt;br /&gt;
==Licensing==&lt;br /&gt;
{{Fairuse}}&lt;/div&gt;</summary>
		<author><name>ReisuDesign</name></author>
	</entry>
	<entry>
		<id>https://hna.wiki/File:Ugliness_Aspect_Icon_(0.3.0).png?diff=10640</id>
		<title>File:Ugliness Aspect Icon (0.3.0).png</title>
		<link rel="alternate" type="text/html" href="https://hna.wiki/File:Ugliness_Aspect_Icon_(0.3.0).png?diff=10640"/>
		<updated>2026-10-10T17:48:24Z</updated>

		<summary type="html">&lt;p&gt;ReisuDesign: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Summary==&lt;br /&gt;
{{Removed}}&lt;br /&gt;
{{File|Aspect Icons;Icons to Invert}}&lt;br /&gt;
&lt;br /&gt;
==Licensing==&lt;br /&gt;
{{Fairuse}}&lt;/div&gt;</summary>
		<author><name>ReisuDesign</name></author>
	</entry>
	<entry>
		<id>https://hna.wiki/File:Reality_Aspect_Icon.png?diff=10639</id>
		<title>File:Reality Aspect Icon.png</title>
		<link rel="alternate" type="text/html" href="https://hna.wiki/File:Reality_Aspect_Icon.png?diff=10639"/>
		<updated>2026-10-10T17:48:19Z</updated>

		<summary type="html">&lt;p&gt;ReisuDesign: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Summary==&lt;br /&gt;
{{Placeholder Image|release=1}}&lt;br /&gt;
{{File|Aspect Icons;Icons to Invert}}&lt;br /&gt;
&lt;br /&gt;
==Licensing==&lt;br /&gt;
{{Fairuse}}&lt;/div&gt;</summary>
		<author><name>ReisuDesign</name></author>
	</entry>
	<entry>
		<id>https://hna.wiki/File:Memory_Aspect_Icon.png?diff=10638</id>
		<title>File:Memory Aspect Icon.png</title>
		<link rel="alternate" type="text/html" href="https://hna.wiki/File:Memory_Aspect_Icon.png?diff=10638"/>
		<updated>2026-10-10T17:48:12Z</updated>

		<summary type="html">&lt;p&gt;ReisuDesign: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Summary==&lt;br /&gt;
{{Placeholder Image|release=1}}&lt;br /&gt;
{{File|Aspect Icons;Icons to Invert}}&lt;br /&gt;
&lt;br /&gt;
==Licensing==&lt;br /&gt;
{{Fairuse}}&lt;/div&gt;</summary>
		<author><name>ReisuDesign</name></author>
	</entry>
	<entry>
		<id>https://hna.wiki/File:Oblivion_Aspect_Icon.png?diff=10637</id>
		<title>File:Oblivion Aspect Icon.png</title>
		<link rel="alternate" type="text/html" href="https://hna.wiki/File:Oblivion_Aspect_Icon.png?diff=10637"/>
		<updated>2026-10-10T17:47:41Z</updated>

		<summary type="html">&lt;p&gt;ReisuDesign: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Summary==&lt;br /&gt;
{{Placeholder Image|release=1}}&lt;br /&gt;
{{File|Aspect Icons;Icons to Invert}}&lt;br /&gt;
&lt;br /&gt;
==Licensing==&lt;br /&gt;
{{Fairuse}}&lt;/div&gt;</summary>
		<author><name>ReisuDesign</name></author>
	</entry>
	<entry>
		<id>https://hna.wiki/File:Peace_Aspect_Icon.png?diff=10636</id>
		<title>File:Peace Aspect Icon.png</title>
		<link rel="alternate" type="text/html" href="https://hna.wiki/File:Peace_Aspect_Icon.png?diff=10636"/>
		<updated>2026-10-10T17:47:34Z</updated>

		<summary type="html">&lt;p&gt;ReisuDesign: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Summary==&lt;br /&gt;
{{Placeholder Image|release=1}}&lt;br /&gt;
{{File|Aspect Icons;Icons to Invert}}&lt;br /&gt;
&lt;br /&gt;
==Licensing==&lt;br /&gt;
{{Fairuse}}&lt;/div&gt;</summary>
		<author><name>ReisuDesign</name></author>
	</entry>
	<entry>
		<id>https://hna.wiki/File:Pride_Aspect_Icon_(0.3.0).png?diff=10635</id>
		<title>File:Pride Aspect Icon (0.3.0).png</title>
		<link rel="alternate" type="text/html" href="https://hna.wiki/File:Pride_Aspect_Icon_(0.3.0).png?diff=10635"/>
		<updated>2026-10-10T17:34:14Z</updated>

		<summary type="html">&lt;p&gt;ReisuDesign: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Summary==&lt;br /&gt;
{{Removed}}&lt;br /&gt;
{{File|Aspect Icons;Icons to Invert}}&lt;br /&gt;
&lt;br /&gt;
==Licensing==&lt;br /&gt;
{{Fairuse}}&lt;/div&gt;</summary>
		<author><name>ReisuDesign</name></author>
	</entry>
	<entry>
		<id>https://hna.wiki/File:Pride_Aspect_Icon.png?diff=10634</id>
		<title>File:Pride Aspect Icon.png</title>
		<link rel="alternate" type="text/html" href="https://hna.wiki/File:Pride_Aspect_Icon.png?diff=10634"/>
		<updated>2026-10-10T17:34:10Z</updated>

		<summary type="html">&lt;p&gt;ReisuDesign: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Summary==&lt;br /&gt;
{{Placeholder Image|release=1}}&lt;br /&gt;
{{File|Aspect Icons;Icons to Invert}}&lt;br /&gt;
&lt;br /&gt;
==Licensing==&lt;br /&gt;
{{Fairuse}}&lt;/div&gt;</summary>
		<author><name>ReisuDesign</name></author>
	</entry>
	<entry>
		<id>https://hna.wiki/File:Reality_Aspect_Icon_(0.3.0).png?diff=10633</id>
		<title>File:Reality Aspect Icon (0.3.0).png</title>
		<link rel="alternate" type="text/html" href="https://hna.wiki/File:Reality_Aspect_Icon_(0.3.0).png?diff=10633"/>
		<updated>2026-10-10T17:34:06Z</updated>

		<summary type="html">&lt;p&gt;ReisuDesign: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Summary==&lt;br /&gt;
{{Removed}}&lt;br /&gt;
{{File|Aspect Icons;Icons to Invert}}&lt;br /&gt;
&lt;br /&gt;
==Licensing==&lt;br /&gt;
{{Fairuse}}&lt;/div&gt;</summary>
		<author><name>ReisuDesign</name></author>
	</entry>
	<entry>
		<id>https://hna.wiki/File:Love_Aspect_Icon.png?diff=10632</id>
		<title>File:Love Aspect Icon.png</title>
		<link rel="alternate" type="text/html" href="https://hna.wiki/File:Love_Aspect_Icon.png?diff=10632"/>
		<updated>2026-10-10T17:34:01Z</updated>

		<summary type="html">&lt;p&gt;ReisuDesign: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Summary==&lt;br /&gt;
{{Placeholder Image|release=1}}&lt;br /&gt;
{{File|Aspect Icons;Icons to Invert}}&lt;br /&gt;
&lt;br /&gt;
==Licensing==&lt;br /&gt;
{{Fairuse}}&lt;/div&gt;</summary>
		<author><name>ReisuDesign</name></author>
	</entry>
	<entry>
		<id>https://hna.wiki/File:Light_Aspect_Icon.png?diff=10631</id>
		<title>File:Light Aspect Icon.png</title>
		<link rel="alternate" type="text/html" href="https://hna.wiki/File:Light_Aspect_Icon.png?diff=10631"/>
		<updated>2026-10-10T17:33:57Z</updated>

		<summary type="html">&lt;p&gt;ReisuDesign: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Summary==&lt;br /&gt;
{{Placeholder Image|release=1}}&lt;br /&gt;
{{File|Aspect Icons;Icons to Invert}}&lt;br /&gt;
&lt;br /&gt;
==Licensing==&lt;br /&gt;
{{Fairuse}}&lt;/div&gt;</summary>
		<author><name>ReisuDesign</name></author>
	</entry>
	<entry>
		<id>https://hna.wiki/File:Joy_Aspect_Icon.png?diff=10630</id>
		<title>File:Joy Aspect Icon.png</title>
		<link rel="alternate" type="text/html" href="https://hna.wiki/File:Joy_Aspect_Icon.png?diff=10630"/>
		<updated>2026-10-10T17:33:53Z</updated>

		<summary type="html">&lt;p&gt;ReisuDesign: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Summary==&lt;br /&gt;
{{Placeholder Image|release=1}}&lt;br /&gt;
{{File|Aspect Icons;Icons to Invert}}&lt;br /&gt;
&lt;br /&gt;
==Licensing==&lt;br /&gt;
{{Fairuse}}&lt;/div&gt;</summary>
		<author><name>ReisuDesign</name></author>
	</entry>
	<entry>
		<id>https://hna.wiki/File:Insatiability_Aspect_Icon.png?diff=10629</id>
		<title>File:Insatiability Aspect Icon.png</title>
		<link rel="alternate" type="text/html" href="https://hna.wiki/File:Insatiability_Aspect_Icon.png?diff=10629"/>
		<updated>2026-10-10T17:33:48Z</updated>

		<summary type="html">&lt;p&gt;ReisuDesign: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Summary==&lt;br /&gt;
{{Placeholder Image|release=1}}&lt;br /&gt;
{{File|Aspect Icons;Icons to Invert}}&lt;br /&gt;
&lt;br /&gt;
==Licensing==&lt;br /&gt;
{{Fairuse}}&lt;/div&gt;</summary>
		<author><name>ReisuDesign</name></author>
	</entry>
	<entry>
		<id>https://hna.wiki/File:Hate_Aspect_Icon.png?diff=10628</id>
		<title>File:Hate Aspect Icon.png</title>
		<link rel="alternate" type="text/html" href="https://hna.wiki/File:Hate_Aspect_Icon.png?diff=10628"/>
		<updated>2026-10-10T17:33:43Z</updated>

		<summary type="html">&lt;p&gt;ReisuDesign: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Summary==&lt;br /&gt;
{{Placeholder Image|release=1}}&lt;br /&gt;
{{File|Aspect Icons;Icons to Invert}}&lt;br /&gt;
&lt;br /&gt;
==Licensing==&lt;br /&gt;
{{Fairuse}}&lt;/div&gt;</summary>
		<author><name>ReisuDesign</name></author>
	</entry>
	<entry>
		<id>https://hna.wiki/File:Dark_Aspect_Icon.png?diff=10627</id>
		<title>File:Dark Aspect Icon.png</title>
		<link rel="alternate" type="text/html" href="https://hna.wiki/File:Dark_Aspect_Icon.png?diff=10627"/>
		<updated>2026-10-10T17:30:55Z</updated>

		<summary type="html">&lt;p&gt;ReisuDesign: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Summary==&lt;br /&gt;
{{Placeholder Image|release=1}}&lt;br /&gt;
{{File|Aspect Icons;Icons to Invert}}&lt;br /&gt;
&lt;br /&gt;
==Licensing==&lt;br /&gt;
{{Fairuse}}&lt;/div&gt;</summary>
		<author><name>ReisuDesign</name></author>
	</entry>
	<entry>
		<id>https://hna.wiki/File:Competition_Aspect_Icon.png?diff=10626</id>
		<title>File:Competition Aspect Icon.png</title>
		<link rel="alternate" type="text/html" href="https://hna.wiki/File:Competition_Aspect_Icon.png?diff=10626"/>
		<updated>2026-10-10T17:30:49Z</updated>

		<summary type="html">&lt;p&gt;ReisuDesign: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Summary==&lt;br /&gt;
{{Placeholder Image|release=1}}&lt;br /&gt;
{{File|Aspect Icons;Icons to Invert}}&lt;br /&gt;
&lt;br /&gt;
==Licensing==&lt;br /&gt;
{{Fairuse}}&lt;/div&gt;</summary>
		<author><name>ReisuDesign</name></author>
	</entry>
	<entry>
		<id>https://hna.wiki/File:Change_Aspect_Icon.png?diff=10625</id>
		<title>File:Change Aspect Icon.png</title>
		<link rel="alternate" type="text/html" href="https://hna.wiki/File:Change_Aspect_Icon.png?diff=10625"/>
		<updated>2026-10-10T17:30:40Z</updated>

		<summary type="html">&lt;p&gt;ReisuDesign: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Summary==&lt;br /&gt;
{{Placeholder Image|release=1}}&lt;br /&gt;
{{File|Aspect Icons;Icons to Invert}}&lt;br /&gt;
&lt;br /&gt;
==Licensing==&lt;br /&gt;
{{Fairuse}}&lt;/div&gt;</summary>
		<author><name>ReisuDesign</name></author>
	</entry>
	<entry>
		<id>https://hna.wiki/File:Beauty_Aspect_Icon.png?diff=10624</id>
		<title>File:Beauty Aspect Icon.png</title>
		<link rel="alternate" type="text/html" href="https://hna.wiki/File:Beauty_Aspect_Icon.png?diff=10624"/>
		<updated>2026-10-10T17:28:23Z</updated>

		<summary type="html">&lt;p&gt;ReisuDesign: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Summary==&lt;br /&gt;
{{Placeholder Image|release=1}}&lt;br /&gt;
{{File|Aspect Icons;Icons to Invert}}&lt;br /&gt;
&lt;br /&gt;
==Licensing==&lt;br /&gt;
{{Fairuse}}&lt;/div&gt;</summary>
		<author><name>ReisuDesign</name></author>
	</entry>
	<entry>
		<id>https://hna.wiki/Module:Data_to_Table/doc?diff=10623</id>
		<title>Module:Data to Table/doc</title>
		<link rel="alternate" type="text/html" href="https://hna.wiki/Module:Data_to_Table/doc?diff=10623"/>
		<updated>2026-10-10T17:25:41Z</updated>

		<summary type="html">&lt;p&gt;ReisuDesign: Created page with &amp;quot;{{Documentation/Header}} This module implements {{T|Data to Table}}.&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Documentation/Header}}&lt;br /&gt;
This module implements {{T|Data to Table}}.&lt;/div&gt;</summary>
		<author><name>ReisuDesign</name></author>
	</entry>
	<entry>
		<id>https://hna.wiki/Module:Data_to_Table?diff=10622</id>
		<title>Module:Data to Table</title>
		<link rel="alternate" type="text/html" href="https://hna.wiki/Module:Data_to_Table?diff=10622"/>
		<updated>2026-10-10T17:25:15Z</updated>

		<summary type="html">&lt;p&gt;ReisuDesign: Created page with &amp;quot;local p = {}  local CleanTT = require(&amp;#039;Module:tt&amp;#039;).CleanTT local lib = require(&amp;#039;Module:Feature&amp;#039;) local ne = lib.isNotEmpty  local block = false  -- Check if the entry is the first on the level local first = {true, true, true}  -- Check if the entry is right after the end of a deeper level local previous = {false, false, false}   -- Escape characters for Lua strings local function clean(txt) 	return txt 		:gsub(&amp;#039;\\&amp;#039;, &amp;#039;\\\\&amp;#039;) 		:gsub(&amp;#039;\&amp;#039;&amp;#039;, &amp;#039;\\\&amp;#039;&amp;#039;) end   -- Parse DPL data l...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
local CleanTT = require(&#039;Module:tt&#039;).CleanTT&lt;br /&gt;
local lib = require(&#039;Module:Feature&#039;)&lt;br /&gt;
local ne = lib.isNotEmpty&lt;br /&gt;
&lt;br /&gt;
local block = false&lt;br /&gt;
&lt;br /&gt;
-- Check if the entry is the first on the level&lt;br /&gt;
local first = {true, true, true}&lt;br /&gt;
&lt;br /&gt;
-- Check if the entry is right after the end of a deeper level&lt;br /&gt;
local previous = {false, false, false}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Escape characters for Lua strings&lt;br /&gt;
local function clean(txt)&lt;br /&gt;
	return txt&lt;br /&gt;
		:gsub(&#039;\\&#039;, &#039;\\\\&#039;)&lt;br /&gt;
		:gsub(&#039;\&#039;&#039;, &#039;\\\&#039;&#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Parse DPL data&lt;br /&gt;
local function parseInfo(info, frame)&lt;br /&gt;
	if not info then&lt;br /&gt;
		return {}&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if ne(frame.args.cleanTT) then&lt;br /&gt;
		info = CleanTT(info)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return lib.parseTemplateFormat(&lt;br /&gt;
		info,&lt;br /&gt;
		&#039;;;&#039;,&lt;br /&gt;
		&#039;$$$&#039;,&lt;br /&gt;
		&#039;==&#039;&lt;br /&gt;
	)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Get grouped JSON data&lt;br /&gt;
local function getJsonGroups(frame)&lt;br /&gt;
	local groups = {}&lt;br /&gt;
&lt;br /&gt;
	local i = 1&lt;br /&gt;
&lt;br /&gt;
	while true do&lt;br /&gt;
		local groupName = frame.args[&#039;group&#039; .. i]&lt;br /&gt;
		local groupInfo = frame.args[&#039;group&#039; .. i .. &#039;_info&#039;]&lt;br /&gt;
&lt;br /&gt;
		-- Stop when neither argument exists.&lt;br /&gt;
		if groupName == nil and groupInfo == nil then&lt;br /&gt;
			break&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		if ne(groupName) and groupInfo ~= nil then&lt;br /&gt;
&lt;br /&gt;
			local info = parseInfo(groupInfo, frame)&lt;br /&gt;
			local entries = {}&lt;br /&gt;
&lt;br /&gt;
			-- Collect entries&lt;br /&gt;
			for _, entry in lib.spairs(&lt;br /&gt;
				info,&lt;br /&gt;
				function(tVal, a, b)&lt;br /&gt;
					local aPage = tostring(tVal[a].page or a)&lt;br /&gt;
					local bPage = tostring(tVal[b].page or b)&lt;br /&gt;
&lt;br /&gt;
					return aPage &amp;lt; bPage&lt;br /&gt;
				end&lt;br /&gt;
			) do&lt;br /&gt;
&lt;br /&gt;
				if ne(entry.page) then&lt;br /&gt;
					entries[#entries + 1] = entry.page&lt;br /&gt;
				end&lt;br /&gt;
&lt;br /&gt;
			end&lt;br /&gt;
&lt;br /&gt;
			-- Only add the group if it actually contains entries.&lt;br /&gt;
			if #entries &amp;gt; 0 then&lt;br /&gt;
				groups[groupName] = entries&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		i = i + 1&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return groups&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Format grouped data as readable JSON&lt;br /&gt;
function p.FormatJSONGroups(groups)&lt;br /&gt;
	local result = {}&lt;br /&gt;
&lt;br /&gt;
	table.insert(result, &#039;{&#039;)&lt;br /&gt;
&lt;br /&gt;
	-- Get group names&lt;br /&gt;
	local groupNames = {}&lt;br /&gt;
&lt;br /&gt;
	for name in pairs(groups) do&lt;br /&gt;
		groupNames[#groupNames + 1] = name&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	table.sort(groupNames)&lt;br /&gt;
&lt;br /&gt;
	-- Build each group&lt;br /&gt;
	for i, name in ipairs(groupNames) do&lt;br /&gt;
&lt;br /&gt;
		local entries = groups[name]&lt;br /&gt;
		local groupComma = (i &amp;lt; #groupNames) and &#039;,&#039; or &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
		table.insert(&lt;br /&gt;
			result,&lt;br /&gt;
			&#039;\t&#039; ..&lt;br /&gt;
			mw.text.jsonEncode(name) ..&lt;br /&gt;
			&#039;: [&#039;&lt;br /&gt;
		)&lt;br /&gt;
&lt;br /&gt;
		for j, entry in ipairs(entries) do&lt;br /&gt;
&lt;br /&gt;
			local entryComma = (j &amp;lt; #entries) and &#039;,&#039; or &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
			table.insert(&lt;br /&gt;
				result,&lt;br /&gt;
				&#039;\t\t&#039; ..&lt;br /&gt;
				mw.text.jsonEncode(entry) ..&lt;br /&gt;
				entryComma&lt;br /&gt;
			)&lt;br /&gt;
&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		table.insert(&lt;br /&gt;
			result,&lt;br /&gt;
			&#039;\t]&#039; .. groupComma&lt;br /&gt;
		)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	table.insert(result, &#039;}&#039;)&lt;br /&gt;
&lt;br /&gt;
	return table.concat(result, &#039;\n&#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
	local info = {}&lt;br /&gt;
	local dataKeys = {}&lt;br /&gt;
	local rawKeys = {}&lt;br /&gt;
&lt;br /&gt;
	-- ============================================================&lt;br /&gt;
	-- JSON MODE&lt;br /&gt;
	-- ============================================================&lt;br /&gt;
&lt;br /&gt;
	if tostring(frame.args.json) == &#039;1&#039; then&lt;br /&gt;
&lt;br /&gt;
		-- --------------------------------------------------------&lt;br /&gt;
		-- Grouped JSON mode&lt;br /&gt;
		-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
		local groups = getJsonGroups(frame)&lt;br /&gt;
&lt;br /&gt;
		-- If groups were supplied, output the complete JSON object.&lt;br /&gt;
		if next(groups) ~= nil then&lt;br /&gt;
&lt;br /&gt;
			local jsonText = p.FormatJSONGroups(groups)&lt;br /&gt;
&lt;br /&gt;
			return frame:extensionTag(&lt;br /&gt;
				&#039;syntaxhighlight&#039;,&lt;br /&gt;
				jsonText,&lt;br /&gt;
				{&lt;br /&gt;
					lang = &#039;json&#039;,&lt;br /&gt;
					copy = &#039;&#039;&lt;br /&gt;
				}&lt;br /&gt;
			)&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		-- --------------------------------------------------------&lt;br /&gt;
		-- Simple JSON array mode&lt;br /&gt;
		-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
		if frame.args.info then&lt;br /&gt;
&lt;br /&gt;
			info = parseInfo(frame.args.info, frame)&lt;br /&gt;
&lt;br /&gt;
			local jsonEntries = {}&lt;br /&gt;
&lt;br /&gt;
			for _, entry in lib.spairs(&lt;br /&gt;
				info,&lt;br /&gt;
				function(tVal, a, b)&lt;br /&gt;
					local aPage = tostring(tVal[a].page or a)&lt;br /&gt;
					local bPage = tostring(tVal[b].page or b)&lt;br /&gt;
&lt;br /&gt;
					return aPage &amp;lt; bPage&lt;br /&gt;
				end&lt;br /&gt;
			) do&lt;br /&gt;
&lt;br /&gt;
				if ne(entry.page) then&lt;br /&gt;
					jsonEntries[#jsonEntries + 1] = entry.page&lt;br /&gt;
				end&lt;br /&gt;
&lt;br /&gt;
			end&lt;br /&gt;
&lt;br /&gt;
			local jsonText = mw.text.jsonEncode(jsonEntries)&lt;br /&gt;
&lt;br /&gt;
			return frame:extensionTag(&lt;br /&gt;
				&#039;syntaxhighlight&#039;,&lt;br /&gt;
				jsonText,&lt;br /&gt;
				{&lt;br /&gt;
					lang = &#039;json&#039;,&lt;br /&gt;
					copy = &#039;&#039;&lt;br /&gt;
				}&lt;br /&gt;
			)&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	-- ============================================================&lt;br /&gt;
	-- NORMAL LUA MODE&lt;br /&gt;
	-- ============================================================&lt;br /&gt;
&lt;br /&gt;
	-- Parse DPL data&lt;br /&gt;
	if frame.args.info then&lt;br /&gt;
&lt;br /&gt;
		info = parseInfo(frame.args.info, frame)&lt;br /&gt;
&lt;br /&gt;
	else&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	-- Parse keys&lt;br /&gt;
	if frame.args.keys then&lt;br /&gt;
		dataKeys = p.ParseKeys(frame.args.keys)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	-- Parse unquoted/raw keys&lt;br /&gt;
	if frame.args.unquoted then&lt;br /&gt;
		rawKeys = p.ParseKeys(frame.args.unquoted)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	-- Block formatting&lt;br /&gt;
	if ne(frame.args.block) then&lt;br /&gt;
		block = true&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	local sortkey = frame.args.sortkey or &#039;page&#039;&lt;br /&gt;
	local subtable = frame.args.subtable&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	-- Constant value mode&lt;br /&gt;
	-- If |value=day is supplied, every page gets that value.&lt;br /&gt;
	local constantValue = frame.args.value&lt;br /&gt;
	local valueUnquoted = false&lt;br /&gt;
&lt;br /&gt;
	if constantValue ~= nil then&lt;br /&gt;
&lt;br /&gt;
		for _, rawKey in ipairs(rawKeys) do&lt;br /&gt;
&lt;br /&gt;
			if rawKey == &#039;value&#039; then&lt;br /&gt;
				valueUnquoted = true&lt;br /&gt;
				break&lt;br /&gt;
			end&lt;br /&gt;
&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	-- Check whether a key should be output as raw Lua&lt;br /&gt;
	local function isUnquotedKey(key)&lt;br /&gt;
&lt;br /&gt;
		for _, rawKey in ipairs(rawKeys) do&lt;br /&gt;
&lt;br /&gt;
			if rawKey == key then&lt;br /&gt;
				return true&lt;br /&gt;
			end&lt;br /&gt;
&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	-- Build result&lt;br /&gt;
	local result = mw.html.create()&lt;br /&gt;
		:wikitext(&#039;return {\n&#039;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	for _, entry in lib.spairs(&lt;br /&gt;
		info,&lt;br /&gt;
		function(tVal, a, b)&lt;br /&gt;
&lt;br /&gt;
			if sortkey == &#039;INPUT&#039; then&lt;br /&gt;
				return a &amp;lt; b&lt;br /&gt;
			else&lt;br /&gt;
				return (tVal[a][sortkey] or &#039;&#039;) &amp;lt;&lt;br /&gt;
					(tVal[b][sortkey] or &#039;&#039;)&lt;br /&gt;
			end&lt;br /&gt;
&lt;br /&gt;
		end&lt;br /&gt;
	) do&lt;br /&gt;
&lt;br /&gt;
		if ne(entry.page) then&lt;br /&gt;
&lt;br /&gt;
			entry.page = clean(entry.page)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			-- ----------------------------------------------------&lt;br /&gt;
			-- Constant value mode&lt;br /&gt;
			-- ----------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
			if constantValue ~= nil and #dataKeys == 0 then&lt;br /&gt;
&lt;br /&gt;
				local value&lt;br /&gt;
&lt;br /&gt;
				if valueUnquoted then&lt;br /&gt;
					value = clean(constantValue)&lt;br /&gt;
				else&lt;br /&gt;
					value = &#039;\&#039;&#039; ..&lt;br /&gt;
						clean(constantValue) ..&lt;br /&gt;
						&#039;\&#039;&#039;&lt;br /&gt;
				end&lt;br /&gt;
&lt;br /&gt;
				result:wikitext(&lt;br /&gt;
					&#039;\t[\&#039;&#039;,&lt;br /&gt;
					entry.page,&lt;br /&gt;
					&#039;\&#039;] = &#039;,&lt;br /&gt;
					value,&lt;br /&gt;
					&#039;,\n&#039;&lt;br /&gt;
				)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			-- ----------------------------------------------------&lt;br /&gt;
			-- No data keys&lt;br /&gt;
			-- ----------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
			elseif #dataKeys == 0 then&lt;br /&gt;
&lt;br /&gt;
				result:wikitext(&lt;br /&gt;
					&#039;\t\&#039;&#039;,&lt;br /&gt;
					entry.page,&lt;br /&gt;
					&#039;\&#039;,\n&#039;&lt;br /&gt;
				)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			-- ----------------------------------------------------&lt;br /&gt;
			-- Normal nested table mode&lt;br /&gt;
			-- ----------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
			else&lt;br /&gt;
&lt;br /&gt;
				-- Reset formatting state for every entry&lt;br /&gt;
				first = {true, true, true}&lt;br /&gt;
				previous = {false, false, false}&lt;br /&gt;
&lt;br /&gt;
				local valid = false&lt;br /&gt;
				local values = mw.html.create()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
				-- Entry name&lt;br /&gt;
				values:wikitext(&lt;br /&gt;
					&#039;\t[\&#039;&#039;,&lt;br /&gt;
					entry.page,&lt;br /&gt;
					&#039;\&#039;] = {&#039;&lt;br /&gt;
				)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
				-- Build entry&lt;br /&gt;
				local function parseLevels(K, level)&lt;br /&gt;
&lt;br /&gt;
					level = level or 1&lt;br /&gt;
&lt;br /&gt;
					if type(K) == &#039;string&#039; then&lt;br /&gt;
&lt;br /&gt;
						valid = true&lt;br /&gt;
&lt;br /&gt;
						-- Use the value if present.&lt;br /&gt;
						-- BuildEntry handles missing values.&lt;br /&gt;
						values:node(&lt;br /&gt;
							p.BuildEntry(&lt;br /&gt;
								entry[K],&lt;br /&gt;
								K,&lt;br /&gt;
								level,&lt;br /&gt;
								subtable,&lt;br /&gt;
								isUnquotedKey(K)&lt;br /&gt;
							)&lt;br /&gt;
						)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
					elseif type(K) == &#039;table&#039; then&lt;br /&gt;
&lt;br /&gt;
						level = level + 1&lt;br /&gt;
&lt;br /&gt;
						for _, K2 in ipairs(K) do&lt;br /&gt;
							parseLevels(K2, level)&lt;br /&gt;
						end&lt;br /&gt;
&lt;br /&gt;
						values:wikitext(&lt;br /&gt;
							&#039;\n&#039;,&lt;br /&gt;
							string.rep(&#039;\t&#039;, level - 1),&lt;br /&gt;
							&#039;},&#039;&lt;br /&gt;
						)&lt;br /&gt;
&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
				parseLevels(dataKeys, 1)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
				-- Return table if there is valid data&lt;br /&gt;
				if valid then&lt;br /&gt;
&lt;br /&gt;
					values:wikitext(&#039;\n&#039;)&lt;br /&gt;
					result:node(values)&lt;br /&gt;
&lt;br /&gt;
				else&lt;br /&gt;
&lt;br /&gt;
					result:wikitext(&lt;br /&gt;
						&#039;\t\&#039;&#039;,&lt;br /&gt;
						entry.page,&lt;br /&gt;
						&#039;\&#039;,\n&#039;&lt;br /&gt;
					)&lt;br /&gt;
&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	result:wikitext(&#039;}&#039;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	-- ============================================================&lt;br /&gt;
	-- LUA SYNTAX HIGHLIGHT&lt;br /&gt;
	-- ============================================================&lt;br /&gt;
&lt;br /&gt;
	local luaText = tostring(result)&lt;br /&gt;
&lt;br /&gt;
	-- Decode HTML entities introduced by mw.html&lt;br /&gt;
	luaText = mw.text.decode(luaText)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	local output = frame:extensionTag(&lt;br /&gt;
		&#039;syntaxhighlight&#039;,&lt;br /&gt;
		luaText,&lt;br /&gt;
		{&lt;br /&gt;
			lang = &#039;lua&#039;,&lt;br /&gt;
			copy = &#039;&#039;&lt;br /&gt;
		}&lt;br /&gt;
	)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	-- ============================================================&lt;br /&gt;
	-- COPY BUTTON&lt;br /&gt;
	-- ============================================================&lt;br /&gt;
&lt;br /&gt;
	-- Keep Module:CopyText for normal Lua output.&lt;br /&gt;
	if frame.args.copy then&lt;br /&gt;
&lt;br /&gt;
		output = require(&#039;Module:CopyText&#039;)._main({&lt;br /&gt;
			output,&lt;br /&gt;
			frame.args.copy,&lt;br /&gt;
			&#039;Copy Table&#039;&lt;br /&gt;
		})&lt;br /&gt;
&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	return output&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ================================================================&lt;br /&gt;
-- FORMAT DATA&lt;br /&gt;
-- ================================================================&lt;br /&gt;
&lt;br /&gt;
function p.BuildEntry(value, key, level, subtable, unquoted)&lt;br /&gt;
&lt;br /&gt;
	level = level or 1&lt;br /&gt;
&lt;br /&gt;
	local container = mw.html.create()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	-- Default missing values&lt;br /&gt;
	if value == nil or value == &#039;&#039; then&lt;br /&gt;
&lt;br /&gt;
		if key == &#039;number&#039; then&lt;br /&gt;
&lt;br /&gt;
			value = &#039;0&#039;&lt;br /&gt;
			unquoted = true&lt;br /&gt;
&lt;br /&gt;
		else&lt;br /&gt;
&lt;br /&gt;
			value = &#039;&#039;&lt;br /&gt;
			unquoted = false&lt;br /&gt;
&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	-- Format value&lt;br /&gt;
	if subtable and value ~= &#039;&#039; and value:find(subtable) then&lt;br /&gt;
&lt;br /&gt;
		value = lib.split(&lt;br /&gt;
			clean(value),&lt;br /&gt;
			subtable&lt;br /&gt;
		)&lt;br /&gt;
&lt;br /&gt;
		value = &#039;{ \&#039;&#039; ..&lt;br /&gt;
			table.concat(value, &#039;\&#039;, \&#039;&#039;) ..&lt;br /&gt;
			&#039; }&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	elseif unquoted and value ~= &#039;&#039; then&lt;br /&gt;
&lt;br /&gt;
		-- Raw Lua value&lt;br /&gt;
		value = clean(value)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	else&lt;br /&gt;
&lt;br /&gt;
		-- String value&lt;br /&gt;
		value = &#039;\&#039;&#039; ..&lt;br /&gt;
			clean(value) ..&lt;br /&gt;
			&#039;\&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	-- Format key as [&#039;key&#039;]&lt;br /&gt;
	local formattedKey =&lt;br /&gt;
		&#039;[\&#039;&#039; .. clean(key) .. &#039;\&#039;]&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	-- First item on this level&lt;br /&gt;
	if first[level] then&lt;br /&gt;
&lt;br /&gt;
		container:wikitext(&lt;br /&gt;
			&#039;\n&#039;,&lt;br /&gt;
			string.rep(&#039;\t&#039;, level),&lt;br /&gt;
			formattedKey,&lt;br /&gt;
			&#039; = &#039;,&lt;br /&gt;
			value,&lt;br /&gt;
			&#039;,&#039;&lt;br /&gt;
		)&lt;br /&gt;
&lt;br /&gt;
		first[level] = false&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		if level &amp;gt; 2 then&lt;br /&gt;
			first[2] = false&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		if level &amp;gt; 1 then&lt;br /&gt;
			first[1] = false&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	-- Subsequent item on this level&lt;br /&gt;
	else&lt;br /&gt;
&lt;br /&gt;
		container:wikitext(&lt;br /&gt;
			&#039;\n&#039;,&lt;br /&gt;
			string.rep(&#039;\t&#039;, level),&lt;br /&gt;
			formattedKey,&lt;br /&gt;
			&#039; = &#039;,&lt;br /&gt;
			value,&lt;br /&gt;
			&#039;,&#039;&lt;br /&gt;
		)&lt;br /&gt;
&lt;br /&gt;
		previous[level] = false&lt;br /&gt;
&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	return container&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ================================================================&lt;br /&gt;
-- PARSE DATA KEYS INTO SPECIFIED LEVELS&lt;br /&gt;
-- ================================================================&lt;br /&gt;
&lt;br /&gt;
function p.ParseKeys(keys)&lt;br /&gt;
&lt;br /&gt;
	keys = lib.split(keys, &#039;;;&#039;)&lt;br /&gt;
&lt;br /&gt;
	for i, key in pairs(keys) do&lt;br /&gt;
&lt;br /&gt;
		if key:find(&#039;//&#039;) then&lt;br /&gt;
&lt;br /&gt;
			local keys2 = lib.split(key, &#039;//&#039;)&lt;br /&gt;
&lt;br /&gt;
			for i2, key2 in pairs(keys2) do&lt;br /&gt;
&lt;br /&gt;
				if key2:find(&#039;@@&#039;) then&lt;br /&gt;
					keys2[i2] = lib.split(key, &#039;@@&#039;)&lt;br /&gt;
				end&lt;br /&gt;
&lt;br /&gt;
			end&lt;br /&gt;
&lt;br /&gt;
			keys[i] = keys2&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return keys&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>ReisuDesign</name></author>
	</entry>
	<entry>
		<id>https://hna.wiki/Template:Data_to_Table/doc?diff=10621</id>
		<title>Template:Data to Table/doc</title>
		<link rel="alternate" type="text/html" href="https://hna.wiki/Template:Data_to_Table/doc?diff=10621"/>
		<updated>2026-10-10T17:23:18Z</updated>

		<summary type="html">&lt;p&gt;ReisuDesign: Created page with &amp;quot;{{Documentation/Header}} {{Lua}} Lua module to allow users to create &amp;quot;copy-pastable&amp;quot; data tables based on custom DPL queries, as well as JSON data from DPL queries.  ==Syntax== * {{F|info}} &amp;amp;mdash; The raw output of a DPL query (see usage examples). * {{F|keys}} &amp;amp;mdash; A {{F|;;}}-separated list of keys to extract from the info. You can use nested levels with {{F|//}} and {{F|@@}}. ** Note that although the page itself must be included in your DPL include statement, it i...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Documentation/Header}}&lt;br /&gt;
{{Lua}}&lt;br /&gt;
Lua module to allow users to create &amp;quot;copy-pastable&amp;quot; data tables based on custom DPL queries, as well as JSON data from DPL queries.&lt;br /&gt;
&lt;br /&gt;
==Syntax==&lt;br /&gt;
* {{F|info}} &amp;amp;mdash; The raw output of a DPL query (see usage examples).&lt;br /&gt;
* {{F|keys}} &amp;amp;mdash; A {{F|;;}}-separated list of keys to extract from the info. You can use nested levels with {{F|//}} and {{F|@@}}.&lt;br /&gt;
** Note that although the page itself must be included in your DPL include statement, it is used as the table&#039;s key by default, so there is no need to specify it.&lt;br /&gt;
* {{F|unquoted}} &#039;&#039;(optional)&#039;&#039; &amp;amp;mdash; A {{F|;;}}-separated list of keys whose values should be output as raw Lua values instead of strings.&lt;br /&gt;
* {{F|value}} &#039;&#039;(optional)&#039;&#039; &amp;amp;mdash; Sets the same value for every entry when no {{F|keys}} are specified.&lt;br /&gt;
* {{F|sortkey}} &#039;&#039;(optional)&#039;&#039; &amp;amp;mdash; Specifies which key to sort the data by, using the page name by default. Use {{F|INPUT}} to preserve the original order.&lt;br /&gt;
* {{F|subtable}} &#039;&#039;(optional)&#039;&#039; &amp;amp;mdash; Splits values into subtables.&lt;br /&gt;
* {{F|block}} &#039;&#039;(optional)&#039;&#039; &amp;amp;mdash; Display the results using block formatting.&lt;br /&gt;
* {{F|copy}} &#039;&#039;(optional)&#039;&#039; &amp;amp;mdash; Enter your header here. Adds a button to copy the generated Lua table to your clipboard at the top.&lt;br /&gt;
* {{F|cleanTT}} &#039;&#039;(optional)&#039;&#039; &amp;amp;mdash; Auto-parse out any {{T|tt}} format in the output.&lt;br /&gt;
&lt;br /&gt;
===JSON Mode===&lt;br /&gt;
* {{F|json}} &amp;amp;mdash; Set to {{F|1}} to output JSON instead of a Lua table.&lt;br /&gt;
* {{F|group1}}, {{F|group2}}, etc. &amp;amp;mdash; The name of a JSON group.&lt;br /&gt;
* {{F|group1_info}}, {{F|group2_info}}, etc. &amp;amp;mdash; The DPL output used to populate the corresponding group.&lt;br /&gt;
** Groups may be numbered sequentially up to {{F|group10}}.&lt;br /&gt;
** Empty groups are automatically omitted from the generated JSON.&lt;br /&gt;
** JSON mode uses the built-in copy button provided by the syntax highlighting extension.&lt;br /&gt;
&lt;br /&gt;
When {{F|json}} is set to {{F|1}}, the module supports both simple JSON arrays and grouped JSON objects.&lt;br /&gt;
&lt;br /&gt;
==Examples==&lt;br /&gt;
&lt;br /&gt;
===Lua Table===&lt;br /&gt;
A basic DPL query can be converted into a Lua data table:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{Data to Table&lt;br /&gt;
|keys=number;;quality;;galaxy&lt;br /&gt;
|unquoted=number&lt;br /&gt;
|info={{#DPL:&lt;br /&gt;
|namespace=&lt;br /&gt;
|category=Fish&lt;br /&gt;
|uses=Template:Creature Infobox&lt;br /&gt;
|include={Creature Infobox}:%PAGE%,{Creature Infobox}:number,{Creature Infobox}:quality,{Creature Infobox}:distribution&lt;br /&gt;
|format=,,,&lt;br /&gt;
|secseparators=page==,;;number==,,;;quality==,,;;galaxy==,,$$$&lt;br /&gt;
}}&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This produces output in the following format:&lt;br /&gt;
{{sh|&amp;lt;nowiki&amp;gt;return {&lt;br /&gt;
	[&#039;Anchovy&#039;] = {&lt;br /&gt;
		[&#039;number&#039;] = 074,&lt;br /&gt;
		[&#039;quality&#039;] = &#039;Gray&#039;,&lt;br /&gt;
		[&#039;galaxy&#039;] = &#039;Taffeh&#039;,&lt;br /&gt;
	},&lt;br /&gt;
	[&#039;Barred Spinefoot&#039;] = {&lt;br /&gt;
		[&#039;number&#039;] = 085,&lt;br /&gt;
		[&#039;quality&#039;] = &#039;Purple&#039;,&lt;br /&gt;
		[&#039;galaxy&#039;] = &#039;All Regions&#039;,&lt;br /&gt;
	},&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;|lua}}&lt;br /&gt;
&lt;br /&gt;
===Constant Values===&lt;br /&gt;
{{F|value}} can be used when every entry should have the same value:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{Data to Table&lt;br /&gt;
|value=day&lt;br /&gt;
|info={{#DPL:&lt;br /&gt;
|namespace=File&lt;br /&gt;
|category=Icons to Invert&lt;br /&gt;
|format=,page==%PAGE%$$$,,&lt;br /&gt;
}}&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This produces:&lt;br /&gt;
{{sh|&amp;lt;nowiki&amp;gt;return {&lt;br /&gt;
	[&#039;Crab Icon.png&#039;] = &#039;day&#039;,&lt;br /&gt;
	[&#039;Crayfish Icon.png&#039;] = &#039;day&#039;,&lt;br /&gt;
	[&#039;Fish Icon.png&#039;] = &#039;day&#039;,&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;|lua}}&lt;br /&gt;
&lt;br /&gt;
If the value should be output as a raw Lua value rather than a string, include {{F|value}} in {{F|unquoted}}.&lt;br /&gt;
&lt;br /&gt;
===Simple JSON Array===&lt;br /&gt;
JSON mode can also be used without groups:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{Data to Table&lt;br /&gt;
|json=1&lt;br /&gt;
|info={{#DPL:&lt;br /&gt;
|namespace=File&lt;br /&gt;
|category=Icons to Invert&lt;br /&gt;
|format=,page==%PAGE%$$$,,&lt;br /&gt;
}}&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This produces:&lt;br /&gt;
{{sh|&amp;lt;nowiki&amp;gt;[&lt;br /&gt;
	&amp;quot;Crab Icon.png&amp;quot;,&lt;br /&gt;
	&amp;quot;Crayfish Icon.png&amp;quot;,&lt;br /&gt;
	&amp;quot;Fish Icon.png&amp;quot;&lt;br /&gt;
]&amp;lt;/nowiki&amp;gt;|json}}&lt;br /&gt;
&lt;br /&gt;
===Grouped JSON===&lt;br /&gt;
Multiple DPL queries can be combined into a single JSON object using groups:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{Data to Table&lt;br /&gt;
|json=1&lt;br /&gt;
&lt;br /&gt;
|group1=day&lt;br /&gt;
|group1_info={{#DPL:&lt;br /&gt;
|namespace=File&lt;br /&gt;
|category=Icons to Invert&lt;br /&gt;
|format=,page==%PAGE%$$$,,&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
|group2=night&lt;br /&gt;
|group2_info={{#DPL:&lt;br /&gt;
|namespace=File&lt;br /&gt;
|category=Icons to Invert Night&lt;br /&gt;
|format=,page==%PAGE%$$$,,&lt;br /&gt;
}}&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This produces:&lt;br /&gt;
&lt;br /&gt;
{{sh|&amp;lt;nowiki&amp;gt;{&lt;br /&gt;
	&amp;quot;day&amp;quot;: [&lt;br /&gt;
		&amp;quot;Crab Icon.png&amp;quot;,&lt;br /&gt;
		&amp;quot;Crayfish Icon.png&amp;quot;,&lt;br /&gt;
		&amp;quot;Fish Icon.png&amp;quot;&lt;br /&gt;
	],&lt;br /&gt;
	&amp;quot;night&amp;quot;: [&lt;br /&gt;
		&amp;quot;Special Icon.png&amp;quot;&lt;br /&gt;
	]&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;|json}}&lt;br /&gt;
&lt;br /&gt;
Groups with no results are automatically omitted. For example, if the night category is empty, the output will simply be:&lt;br /&gt;
&lt;br /&gt;
{{sh|&amp;lt;nowiki&amp;gt;{&lt;br /&gt;
	&amp;quot;day&amp;quot;: [&lt;br /&gt;
		&amp;quot;Crab Icon.png&amp;quot;,&lt;br /&gt;
		&amp;quot;Crayfish Icon.png&amp;quot;,&lt;br /&gt;
		&amp;quot;Fish Icon.png&amp;quot;&lt;br /&gt;
	]&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;|json}}&lt;br /&gt;
&lt;br /&gt;
===Multiple Groups===&lt;br /&gt;
Additional groups can be added by continuing the numbering:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
|group1=day&lt;br /&gt;
|group1_info=...&lt;br /&gt;
&lt;br /&gt;
|group2=night&lt;br /&gt;
|group2_info=...&lt;br /&gt;
&lt;br /&gt;
|group3=special&lt;br /&gt;
|group3_info=...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Up to {{F|group10}} / {{F|group10_info}} are supported.&lt;br /&gt;
&lt;br /&gt;
==DPL Formatting for JSON==&lt;br /&gt;
When using JSON mode, each DPL query should output an entry using the {{F|1=page==...$$$}} format.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
|format=,page==%PAGE%$$$,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The {{F|page}} value is used as the value in the JSON array.&lt;br /&gt;
&lt;br /&gt;
For file categories, the resulting JSON can therefore contain the full filename, such as:&lt;br /&gt;
&lt;br /&gt;
{{sh|&amp;lt;nowiki&amp;gt;&amp;quot;Crab Icon.png&amp;quot;&amp;lt;/nowiki&amp;gt;|json}}&lt;br /&gt;
&lt;br /&gt;
rather than only the page title or the filename without its extension.&lt;br /&gt;
&lt;br /&gt;
==Notes==&lt;br /&gt;
* JSON output is sorted alphabetically by page name.&lt;br /&gt;
* Lua output is sorted according to {{F|sortkey}}, which defaults to the page name.&lt;br /&gt;
* JSON mode does not use {{M|CopyText}}; it uses the copy button provided by the syntax highlighting extension.&lt;br /&gt;
* Normal Lua output can still use {{F|copy}} to add the custom copy button.&lt;br /&gt;
* The module automatically omits empty JSON groups.&lt;br /&gt;
* The module is intended to be used with DPL output, rather than being tied to any particular data source.&lt;br /&gt;
&lt;br /&gt;
==Template Data==&lt;br /&gt;
&amp;lt;templatedata&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;params&amp;quot;: {&lt;br /&gt;
		&amp;quot;info&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;DPL output&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;The raw output of a DPL query.&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
			&amp;quot;required&amp;quot;: true&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;keys&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Keys&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;A ;;-separated list of keys to extract from the DPL output. Nested levels can be created with // and @@.&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;unquoted&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Unquoted keys&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;A ;;-separated list of keys whose values should be output as raw Lua values instead of strings.&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;value&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Constant value&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;Sets the same value for every entry when no keys are specified.&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;sortkey&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Sort key&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;The key used to sort the Lua output. Defaults to the page name. Use INPUT to preserve the original order.&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;subtable&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Subtable separator&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;Splits values into subtables using the specified separator.&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;block&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Block formatting&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;Display the generated Lua table using block formatting.&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;boolean&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;copy&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Copy button&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;Adds a copy button to the generated Lua table using the supplied header text.&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;cleanTT&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Clean Template:Tt&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;Automatically parses Template:Tt formatting from the DPL output.&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;boolean&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;json&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;JSON mode&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;Set to 1 to output JSON instead of a Lua table.&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;boolean&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;group1&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;JSON group 1&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;The name of the first JSON group.&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;group1_info&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;JSON group 1 data&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;The DPL output used to populate JSON group 1.&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;group2&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;JSON group 2&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;The name of the second JSON group.&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;group2_info&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;JSON group 2 data&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;The DPL output used to populate JSON group 2.&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;group3&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;JSON group 3&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;The name of the third JSON group.&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;group3_info&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;JSON group 3 data&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;The DPL output used to populate JSON group 3.&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;group4&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;JSON group 4&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;The name of the fourth JSON group.&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;group4_info&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;JSON group 4 data&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;The DPL output used to populate JSON group 4.&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;group5&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;JSON group 5&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;The name of the fifth JSON group.&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;group5_info&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;JSON group 5 data&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;The DPL output used to populate JSON group 5.&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;group6&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;JSON group 6&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;The name of the sixth JSON group.&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;group6_info&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;JSON group 6 data&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;The DPL output used to populate JSON group 6.&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;group7&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;JSON group 7&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;The name of the seventh JSON group.&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;group7_info&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;JSON group 7 data&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;The DPL output used to populate JSON group 7.&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;group8&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;JSON group 8&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;The name of the eighth JSON group.&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;group8_info&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;JSON group 8 data&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;The DPL output used to populate JSON group 8.&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;group9&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;JSON group 9&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;The name of the ninth JSON group.&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;group9_info&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;JSON group 9 data&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;The DPL output used to populate JSON group 9.&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;group10&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;JSON group 10&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;The name of the tenth JSON group.&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;group10_info&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;JSON group 10 data&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;The DPL output used to populate JSON group 10.&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
		}&lt;br /&gt;
	},&lt;br /&gt;
	&amp;quot;description&amp;quot;: &amp;quot;Converts custom DPL output into copy-pastable Lua tables or JSON data.&amp;quot;,&lt;br /&gt;
	&amp;quot;format&amp;quot;: &amp;quot;{{_\n|_ = _\n}}&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/templatedata&amp;gt;&lt;/div&gt;</summary>
		<author><name>ReisuDesign</name></author>
	</entry>
	<entry>
		<id>https://hna.wiki/Template:Data_to_Table?diff=10620</id>
		<title>Template:Data to Table</title>
		<link rel="alternate" type="text/html" href="https://hna.wiki/Template:Data_to_Table?diff=10620"/>
		<updated>2026-10-10T17:21:13Z</updated>

		<summary type="html">&lt;p&gt;ReisuDesign: Created page with &amp;quot;&amp;lt;includeonly&amp;gt;{{#invoke:Data to Table|main |info={{{info|}}} |keys={{{keys|}}} |unquoted={{{unquoted|}}} |block={{{block|}}} |sortkey={{{sortkey|}}} |subtable={{{subtable|}}} |cleanTT={{{cleanTT|}}} |value={{{value|}}} |json={{{json|}}} |copy={{{copy|}}}  |group1={{{group1|}}} |group1_info={{{group1_info|}}}  |group2={{{group2|}}} |group2_info={{{group2_info|}}}  |group3={{{group3|}}} |group3_info={{{group3_info|}}}  |group4={{{group4|}}} |group4_info={{{group4_info|}}}...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;includeonly&amp;gt;{{#invoke:Data to Table|main&lt;br /&gt;
|info={{{info|}}}&lt;br /&gt;
|keys={{{keys|}}}&lt;br /&gt;
|unquoted={{{unquoted|}}}&lt;br /&gt;
|block={{{block|}}}&lt;br /&gt;
|sortkey={{{sortkey|}}}&lt;br /&gt;
|subtable={{{subtable|}}}&lt;br /&gt;
|cleanTT={{{cleanTT|}}}&lt;br /&gt;
|value={{{value|}}}&lt;br /&gt;
|json={{{json|}}}&lt;br /&gt;
|copy={{{copy|}}}&lt;br /&gt;
&lt;br /&gt;
|group1={{{group1|}}}&lt;br /&gt;
|group1_info={{{group1_info|}}}&lt;br /&gt;
&lt;br /&gt;
|group2={{{group2|}}}&lt;br /&gt;
|group2_info={{{group2_info|}}}&lt;br /&gt;
&lt;br /&gt;
|group3={{{group3|}}}&lt;br /&gt;
|group3_info={{{group3_info|}}}&lt;br /&gt;
&lt;br /&gt;
|group4={{{group4|}}}&lt;br /&gt;
|group4_info={{{group4_info|}}}&lt;br /&gt;
&lt;br /&gt;
|group5={{{group5|}}}&lt;br /&gt;
|group5_info={{{group5_info|}}}&lt;br /&gt;
&lt;br /&gt;
|group6={{{group6|}}}&lt;br /&gt;
|group6_info={{{group6_info|}}}&lt;br /&gt;
&lt;br /&gt;
|group7={{{group7|}}}&lt;br /&gt;
|group7_info={{{group7_info|}}}&lt;br /&gt;
&lt;br /&gt;
|group8={{{group8|}}}&lt;br /&gt;
|group8_info={{{group8_info|}}}&lt;br /&gt;
&lt;br /&gt;
|group9={{{group9|}}}&lt;br /&gt;
|group9_info={{{group9_info|}}}&lt;br /&gt;
&lt;br /&gt;
|group10={{{group10|}}}&lt;br /&gt;
|group10_info={{{group10_info|}}}&lt;br /&gt;
}}&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;{{Documentation}}&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>ReisuDesign</name></author>
	</entry>
	<entry>
		<id>https://hna.wiki/MediaWiki:Gadget-InvertImages/copy?diff=10619</id>
		<title>MediaWiki:Gadget-InvertImages/copy</title>
		<link rel="alternate" type="text/html" href="https://hna.wiki/MediaWiki:Gadget-InvertImages/copy?diff=10619"/>
		<updated>2026-10-10T17:20:30Z</updated>

		<summary type="html">&lt;p&gt;ReisuDesign: Created page with &amp;quot;For {{F|InvertImages.json}} {{Data to Table |json=1  |group1=day |group1_info={{#DPL: |namespace=File |category=Icons to Invert |format=,page==²{Replace¦²{Replace¦%PAGE%¦File:}²¦:}²$$$,, }}  |group2=night |group2_info={{#DPL: |namespace=File |category=Icons to Invert Night |format=,page==²{Replace¦²{Replace¦%PAGE%¦File:}²¦:}²$$$,, }} }}&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;For {{F|[[MediaWiki:Gadget-InvertImages.json|InvertImages.json]]}}&lt;br /&gt;
{{Data to Table&lt;br /&gt;
|json=1&lt;br /&gt;
&lt;br /&gt;
|group1=day&lt;br /&gt;
|group1_info={{#DPL:&lt;br /&gt;
|namespace=File&lt;br /&gt;
|category=Icons to Invert&lt;br /&gt;
|format=,page==²{Replace¦²{Replace¦%PAGE%¦File:}²¦:}²$$$,,&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
|group2=night&lt;br /&gt;
|group2_info={{#DPL:&lt;br /&gt;
|namespace=File&lt;br /&gt;
|category=Icons to Invert Night&lt;br /&gt;
|format=,page==²{Replace¦²{Replace¦%PAGE%¦File:}²¦:}²$$$,,&lt;br /&gt;
}}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>ReisuDesign</name></author>
	</entry>
	<entry>
		<id>https://hna.wiki/MediaWiki:Gadgets-definition?diff=10618</id>
		<title>MediaWiki:Gadgets-definition</title>
		<link rel="alternate" type="text/html" href="https://hna.wiki/MediaWiki:Gadgets-definition?diff=10618"/>
		<updated>2026-10-10T17:18:31Z</updated>

		<summary type="html">&lt;p&gt;ReisuDesign: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Styles==&lt;br /&gt;
* Colors[ResourceLoader|default|hidden|type=styles]|Colors.css&lt;br /&gt;
* Infobox[ResourceLoader|default|hidden|type=styles]|Infobox.css&lt;br /&gt;
* Mainpage[ResourceLoader|default|hidden|type=styles|categories=Honkai: Nexus Anima Wiki]|Mainpage.css&lt;br /&gt;
&lt;br /&gt;
==Utilities==&lt;br /&gt;
* Tooltip[ResourceLoader|default]|Tooltip.css|Tooltip.js&lt;br /&gt;
* InvertImages[ResourceLoader|default|hidden]|InvertImages.js|InvertImages.css&lt;/div&gt;</summary>
		<author><name>ReisuDesign</name></author>
	</entry>
	<entry>
		<id>https://hna.wiki/MediaWiki:Gadget-InvertImages.js?diff=10617</id>
		<title>MediaWiki:Gadget-InvertImages.js</title>
		<link rel="alternate" type="text/html" href="https://hna.wiki/MediaWiki:Gadget-InvertImages.js?diff=10617"/>
		<updated>2026-10-10T17:17:33Z</updated>

		<summary type="html">&lt;p&gt;ReisuDesign: Created page with &amp;quot;(function () { 	&amp;#039;use strict&amp;#039;;  	// Prevent duplicate initialization 	if (window.PetitPlanetInvertImagesLoaded) { 		return; 	}  	window.PetitPlanetInvertImagesLoaded = true;   	// ============================================================ 	// CONFIG 	// ============================================================  	var JSON_PAGE = &amp;#039;MediaWiki:Gadget-InvertImages.json&amp;#039;;  	var DAY_CLASS = &amp;#039;day-invert-image&amp;#039;; 	var NIGHT_CLASS = &amp;#039;night-invert-image&amp;#039;;   	// ==================...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;(function () {&lt;br /&gt;
	&#039;use strict&#039;;&lt;br /&gt;
&lt;br /&gt;
	// Prevent duplicate initialization&lt;br /&gt;
	if (window.PetitPlanetInvertImagesLoaded) {&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	window.PetitPlanetInvertImagesLoaded = true;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	// ============================================================&lt;br /&gt;
	// CONFIG&lt;br /&gt;
	// ============================================================&lt;br /&gt;
&lt;br /&gt;
	var JSON_PAGE = &#039;MediaWiki:Gadget-InvertImages.json&#039;;&lt;br /&gt;
&lt;br /&gt;
	var DAY_CLASS = &#039;day-invert-image&#039;;&lt;br /&gt;
	var NIGHT_CLASS = &#039;night-invert-image&#039;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	// ============================================================&lt;br /&gt;
	// STATE&lt;br /&gt;
	// ============================================================&lt;br /&gt;
&lt;br /&gt;
	var dayImages = new Set();&lt;br /&gt;
	var nightImages = new Set();&lt;br /&gt;
&lt;br /&gt;
	var loaded = false;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	// ============================================================&lt;br /&gt;
	// NORMALIZE FILE NAME&lt;br /&gt;
	// ============================================================&lt;br /&gt;
&lt;br /&gt;
	function normalizeFileName(name) {&lt;br /&gt;
		if (!name) {&lt;br /&gt;
			return &#039;&#039;;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		name = String(name);&lt;br /&gt;
&lt;br /&gt;
		// Decode URL encoding&lt;br /&gt;
		try {&lt;br /&gt;
			name = decodeURIComponent(name);&lt;br /&gt;
		} catch (e) {&lt;br /&gt;
			// Ignore decoding errors&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// Remove File: namespace&lt;br /&gt;
		name = name.replace(/^File:/i, &#039;&#039;);&lt;br /&gt;
&lt;br /&gt;
		// MediaWiki treats underscores and spaces equivalently&lt;br /&gt;
		name = name.replace(/_/g, &#039; &#039;);&lt;br /&gt;
&lt;br /&gt;
		return name.trim();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	// ============================================================&lt;br /&gt;
	// GET FILE NAME FROM IMAGE&lt;br /&gt;
	// ============================================================&lt;br /&gt;
&lt;br /&gt;
	function getFileName(img) {&lt;br /&gt;
		if (!img) {&lt;br /&gt;
			return null;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		// --------------------------------------------------------&lt;br /&gt;
		// 1. MediaWiki&#039;s File link&lt;br /&gt;
		// --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
		/*&lt;br /&gt;
		 * This is the most reliable method.&lt;br /&gt;
		 *&lt;br /&gt;
		 * Normal wiki images:&lt;br /&gt;
		 *&lt;br /&gt;
		 * &amp;lt;a href=&amp;quot;/File:Crab_Icon.png&amp;quot;&amp;gt;&lt;br /&gt;
		 *     &amp;lt;img ...&amp;gt;&lt;br /&gt;
		 * &amp;lt;/a&amp;gt;&lt;br /&gt;
		 *&lt;br /&gt;
		 * Category pages / galleries use the same structure.&lt;br /&gt;
		 */&lt;br /&gt;
&lt;br /&gt;
		var link = img.closest(&#039;a.mw-file-description&#039;);&lt;br /&gt;
&lt;br /&gt;
		if (!link) {&lt;br /&gt;
			link = img.closest(&#039;a&#039;);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if (link) {&lt;br /&gt;
&lt;br /&gt;
			// Check href&lt;br /&gt;
			var href = link.getAttribute(&#039;href&#039;);&lt;br /&gt;
&lt;br /&gt;
			if (href) {&lt;br /&gt;
&lt;br /&gt;
				/*&lt;br /&gt;
				 * Matches:&lt;br /&gt;
				 *&lt;br /&gt;
				 * /File:Crab_Icon.png&lt;br /&gt;
				 * /wiki/File:Crab_Icon.png&lt;br /&gt;
				 * ./File:Crab_Icon.png&lt;br /&gt;
				 */&lt;br /&gt;
&lt;br /&gt;
				var match = href.match(&lt;br /&gt;
					/(?:^|\/)(?:wiki\/)?File:([^#?]+)/i&lt;br /&gt;
				);&lt;br /&gt;
&lt;br /&gt;
				if (match) {&lt;br /&gt;
					return normalizeFileName(match[1]);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			// Check title as another MediaWiki fallback&lt;br /&gt;
			var title = link.getAttribute(&#039;title&#039;);&lt;br /&gt;
&lt;br /&gt;
			if (title &amp;amp;&amp;amp; /^File:/i.test(title)) {&lt;br /&gt;
				return normalizeFileName(title);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		// --------------------------------------------------------&lt;br /&gt;
		// 2. MediaWiki resource attribute&lt;br /&gt;
		// --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
		var resource = img.getAttribute(&#039;resource&#039;);&lt;br /&gt;
&lt;br /&gt;
		if (resource) {&lt;br /&gt;
&lt;br /&gt;
			var resourceMatch = resource.match(&lt;br /&gt;
				/(?:File:|\/File:)([^#?]+)/i&lt;br /&gt;
			);&lt;br /&gt;
&lt;br /&gt;
			if (resourceMatch) {&lt;br /&gt;
				return normalizeFileName(resourceMatch[1]);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		// --------------------------------------------------------&lt;br /&gt;
		// 3. File-specific data attributes&lt;br /&gt;
		// --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
		var dataAttributes = [&lt;br /&gt;
			&#039;data-file-name&#039;,&lt;br /&gt;
			&#039;data-filename&#039;,&lt;br /&gt;
			&#039;data-file&#039;&lt;br /&gt;
		];&lt;br /&gt;
&lt;br /&gt;
		for (var i = 0; i &amp;lt; dataAttributes.length; i++) {&lt;br /&gt;
&lt;br /&gt;
			var value = img.getAttribute(&lt;br /&gt;
				dataAttributes[i]&lt;br /&gt;
			);&lt;br /&gt;
&lt;br /&gt;
			if (value) {&lt;br /&gt;
				return normalizeFileName(value);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		// --------------------------------------------------------&lt;br /&gt;
		// 4. Image source&lt;br /&gt;
		// --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
		var sources = [&lt;br /&gt;
			img.currentSrc,&lt;br /&gt;
			img.src,&lt;br /&gt;
			img.getAttribute(&#039;data-src&#039;),&lt;br /&gt;
			img.getAttribute(&#039;data-lazy-src&#039;)&lt;br /&gt;
		];&lt;br /&gt;
&lt;br /&gt;
		for (var j = 0; j &amp;lt; sources.length; j++) {&lt;br /&gt;
&lt;br /&gt;
			var source = sources[j];&lt;br /&gt;
&lt;br /&gt;
			if (!source) {&lt;br /&gt;
				continue;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			try {&lt;br /&gt;
&lt;br /&gt;
				var url = new URL(&lt;br /&gt;
					source,&lt;br /&gt;
					window.location.href&lt;br /&gt;
				);&lt;br /&gt;
&lt;br /&gt;
				var path = url.pathname;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
				/*&lt;br /&gt;
				 * Thumbnail URL:&lt;br /&gt;
				 *&lt;br /&gt;
				 * /thumb/a/ab/&lt;br /&gt;
				 * Crab_Icon.png/&lt;br /&gt;
				 * 150px-Crab_Icon.png&lt;br /&gt;
				 */&lt;br /&gt;
&lt;br /&gt;
				var thumbMatch = path.match(&lt;br /&gt;
					/\/thumb\/[^/]+\/[^/]+\/([^/]+)\/[^/]+$/i&lt;br /&gt;
				);&lt;br /&gt;
&lt;br /&gt;
				if (thumbMatch) {&lt;br /&gt;
					return normalizeFileName(&lt;br /&gt;
						thumbMatch[1]&lt;br /&gt;
					);&lt;br /&gt;
				}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
				// Last path component&lt;br /&gt;
				var parts = path.split(&#039;/&#039;);&lt;br /&gt;
				var filename = parts[parts.length - 1];&lt;br /&gt;
&lt;br /&gt;
				if (filename) {&lt;br /&gt;
&lt;br /&gt;
					// Remove thumbnail size prefix&lt;br /&gt;
					filename = filename.replace(&lt;br /&gt;
						/^\d+px-/i,&lt;br /&gt;
						&#039;&#039;&lt;br /&gt;
					);&lt;br /&gt;
&lt;br /&gt;
					return normalizeFileName(filename);&lt;br /&gt;
				}&lt;br /&gt;
&lt;br /&gt;
			} catch (e) {&lt;br /&gt;
				// Ignore invalid URLs&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		return null;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	// ============================================================&lt;br /&gt;
	// PROCESS ONE IMAGE&lt;br /&gt;
	// ============================================================&lt;br /&gt;
&lt;br /&gt;
	function processImage(img) {&lt;br /&gt;
&lt;br /&gt;
		if (!img || img.nodeType !== 1) {&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if (&lt;br /&gt;
			!img.tagName ||&lt;br /&gt;
			img.tagName.toLowerCase() !== &#039;img&#039;&lt;br /&gt;
		) {&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		var fileName = getFileName(img);&lt;br /&gt;
&lt;br /&gt;
		if (!fileName) {&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		// --------------------------------------------------------&lt;br /&gt;
		// Determine desired class&lt;br /&gt;
		// --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
		var desiredClass = null;&lt;br /&gt;
&lt;br /&gt;
		if (nightImages.has(fileName)) {&lt;br /&gt;
&lt;br /&gt;
			desiredClass = NIGHT_CLASS;&lt;br /&gt;
&lt;br /&gt;
		} else if (dayImages.has(fileName)) {&lt;br /&gt;
&lt;br /&gt;
			desiredClass = DAY_CLASS;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		// --------------------------------------------------------&lt;br /&gt;
		// Apply desired state&lt;br /&gt;
		// --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
		if (desiredClass === NIGHT_CLASS) {&lt;br /&gt;
&lt;br /&gt;
			img.classList.add(NIGHT_CLASS);&lt;br /&gt;
			img.classList.remove(DAY_CLASS);&lt;br /&gt;
&lt;br /&gt;
		} else if (desiredClass === DAY_CLASS) {&lt;br /&gt;
&lt;br /&gt;
			img.classList.add(DAY_CLASS);&lt;br /&gt;
			img.classList.remove(NIGHT_CLASS);&lt;br /&gt;
&lt;br /&gt;
		} else {&lt;br /&gt;
&lt;br /&gt;
			// Not in either JSON list&lt;br /&gt;
			img.classList.remove(DAY_CLASS);&lt;br /&gt;
			img.classList.remove(NIGHT_CLASS);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	// ============================================================&lt;br /&gt;
	// PROCESS ALL IMAGES&lt;br /&gt;
	// ============================================================&lt;br /&gt;
&lt;br /&gt;
	function processAllImages(root) {&lt;br /&gt;
&lt;br /&gt;
		root = root || document;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		// Root itself&lt;br /&gt;
		if (&lt;br /&gt;
			root.nodeType === 1 &amp;amp;&amp;amp;&lt;br /&gt;
			root.tagName &amp;amp;&amp;amp;&lt;br /&gt;
			root.tagName.toLowerCase() === &#039;img&#039;&lt;br /&gt;
		) {&lt;br /&gt;
			processImage(root);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		if (!root.querySelectorAll) {&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		var images = root.querySelectorAll(&#039;img&#039;);&lt;br /&gt;
&lt;br /&gt;
		for (var i = 0; i &amp;lt; images.length; i++) {&lt;br /&gt;
			processImage(images[i]);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	// ============================================================&lt;br /&gt;
	// LOAD JSON&lt;br /&gt;
	// ============================================================&lt;br /&gt;
&lt;br /&gt;
	function loadJSON() {&lt;br /&gt;
&lt;br /&gt;
		var url = mw.util.getUrl(&lt;br /&gt;
			JSON_PAGE,&lt;br /&gt;
			{&lt;br /&gt;
				action: &#039;raw&#039;&lt;br /&gt;
			}&lt;br /&gt;
		);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		fetch(url, {&lt;br /&gt;
			credentials: &#039;same-origin&#039;,&lt;br /&gt;
			cache: &#039;no-cache&#039;&lt;br /&gt;
		})&lt;br /&gt;
&lt;br /&gt;
		.then(function (response) {&lt;br /&gt;
&lt;br /&gt;
			if (!response.ok) {&lt;br /&gt;
				throw new Error(&lt;br /&gt;
					&#039;Failed to load &#039; +&lt;br /&gt;
					JSON_PAGE +&lt;br /&gt;
					&#039; (&#039; +&lt;br /&gt;
					response.status +&lt;br /&gt;
					&#039;)&#039;&lt;br /&gt;
				);&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			return response.text();&lt;br /&gt;
		})&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		.then(function (text) {&lt;br /&gt;
&lt;br /&gt;
			var data;&lt;br /&gt;
&lt;br /&gt;
			try {&lt;br /&gt;
&lt;br /&gt;
				data = JSON.parse(text);&lt;br /&gt;
&lt;br /&gt;
			} catch (e) {&lt;br /&gt;
&lt;br /&gt;
				throw new Error(&lt;br /&gt;
					&#039;Invalid JSON in &#039; +&lt;br /&gt;
					JSON_PAGE&lt;br /&gt;
				);&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			// ----------------------------------------------------&lt;br /&gt;
			// Day&lt;br /&gt;
			// ----------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
			dayImages.clear();&lt;br /&gt;
&lt;br /&gt;
			if (Array.isArray(data.day)) {&lt;br /&gt;
&lt;br /&gt;
				data.day.forEach(function (fileName) {&lt;br /&gt;
&lt;br /&gt;
					var normalized =&lt;br /&gt;
						normalizeFileName(fileName);&lt;br /&gt;
&lt;br /&gt;
					if (normalized) {&lt;br /&gt;
						dayImages.add(normalized);&lt;br /&gt;
					}&lt;br /&gt;
				});&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			// ----------------------------------------------------&lt;br /&gt;
			// Night&lt;br /&gt;
			// ----------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
			nightImages.clear();&lt;br /&gt;
&lt;br /&gt;
			if (Array.isArray(data.night)) {&lt;br /&gt;
&lt;br /&gt;
				data.night.forEach(function (fileName) {&lt;br /&gt;
&lt;br /&gt;
					var normalized =&lt;br /&gt;
						normalizeFileName(fileName);&lt;br /&gt;
&lt;br /&gt;
					if (normalized) {&lt;br /&gt;
						nightImages.add(normalized);&lt;br /&gt;
					}&lt;br /&gt;
				});&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			loaded = true;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			// Process everything currently rendered&lt;br /&gt;
			processAllImages(document);&lt;br /&gt;
&lt;br /&gt;
		})&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		.catch(function (error) {&lt;br /&gt;
&lt;br /&gt;
			console.error(&lt;br /&gt;
				&#039;[InvertImages] &#039; +&lt;br /&gt;
				error.message&lt;br /&gt;
			);&lt;br /&gt;
&lt;br /&gt;
		});&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	// ============================================================&lt;br /&gt;
	// DYNAMIC CONTENT / LAZY LOADING&lt;br /&gt;
	// ============================================================&lt;br /&gt;
&lt;br /&gt;
	var observer = new MutationObserver(function (mutations) {&lt;br /&gt;
&lt;br /&gt;
		if (!loaded) {&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		for (var i = 0; i &amp;lt; mutations.length; i++) {&lt;br /&gt;
&lt;br /&gt;
			var mutation = mutations[i];&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			// ----------------------------------------------------&lt;br /&gt;
			// Newly inserted elements&lt;br /&gt;
			// ----------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
			if (mutation.type === &#039;childList&#039;) {&lt;br /&gt;
&lt;br /&gt;
				for (&lt;br /&gt;
					var j = 0;&lt;br /&gt;
					j &amp;lt; mutation.addedNodes.length;&lt;br /&gt;
					j++&lt;br /&gt;
				) {&lt;br /&gt;
&lt;br /&gt;
					var node = mutation.addedNodes[j];&lt;br /&gt;
&lt;br /&gt;
					if (node.nodeType === 1) {&lt;br /&gt;
						processAllImages(node);&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			// ----------------------------------------------------&lt;br /&gt;
			// Lazy-loaded / changed image&lt;br /&gt;
			// ----------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
			if (&lt;br /&gt;
				mutation.type === &#039;attributes&#039; &amp;amp;&amp;amp;&lt;br /&gt;
				mutation.target &amp;amp;&amp;amp;&lt;br /&gt;
				mutation.target.tagName &amp;amp;&amp;amp;&lt;br /&gt;
				mutation.target.tagName.toLowerCase() === &#039;img&#039;&lt;br /&gt;
			) {&lt;br /&gt;
&lt;br /&gt;
				processImage(mutation.target);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	observer.observe(&lt;br /&gt;
		document.documentElement,&lt;br /&gt;
		{&lt;br /&gt;
			childList: true,&lt;br /&gt;
			subtree: true,&lt;br /&gt;
			attributes: true,&lt;br /&gt;
			attributeFilter: [&lt;br /&gt;
				&#039;src&#039;,&lt;br /&gt;
				&#039;srcset&#039;,&lt;br /&gt;
				&#039;resource&#039;,&lt;br /&gt;
				&#039;data-src&#039;,&lt;br /&gt;
				&#039;data-lazy-src&#039;,&lt;br /&gt;
				&#039;data-file-name&#039;,&lt;br /&gt;
				&#039;data-filename&#039;,&lt;br /&gt;
				&#039;data-file&#039;&lt;br /&gt;
			]&lt;br /&gt;
		}&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	// ============================================================&lt;br /&gt;
	// START&lt;br /&gt;
	// ============================================================&lt;br /&gt;
&lt;br /&gt;
	loadJSON();&lt;br /&gt;
&lt;br /&gt;
})();&lt;/div&gt;</summary>
		<author><name>ReisuDesign</name></author>
	</entry>
	<entry>
		<id>https://hna.wiki/User:ReisuDesign?diff=10616</id>
		<title>User:ReisuDesign</title>
		<link rel="alternate" type="text/html" href="https://hna.wiki/User:ReisuDesign?diff=10616"/>
		<updated>2026-10-10T12:00:04Z</updated>

		<summary type="html">&lt;p&gt;ReisuDesign: Created page with &amp;quot;&amp;lt;!--{{Bot Owner|ReisuBot}}--&amp;gt;  ==Edits Counts== {{#vardefine:columns|Main;Template;User;File;Category;Module;Honkai: Nexus Anima Wiki;MediaWiki}} {| class=&amp;quot;wikitable alternating-colors-table&amp;quot; |-  {{Array|Account;{{Replace|{{#var:columns}}|Honkai: Nexus Anima Wiki|Project}};Total|;|3=! style=&amp;quot;width: 80px&amp;quot; {{!}}{item}{newline} }} |- !Main {{Array|1={{#var:columns}}|2=;|3={{!}}²{Special:Editcount/ReisuDesign/{item} }²{newline}|template=1}} !{{Special:...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!--{{Bot Owner|ReisuBot}}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Edits Counts==&lt;br /&gt;
{{#vardefine:columns|Main;Template;User;File;Category;Module;Honkai: Nexus Anima Wiki;MediaWiki}}&lt;br /&gt;
{| class=&amp;quot;wikitable alternating-colors-table&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
{{Array|Account;{{Replace|{{#var:columns}}|Honkai: Nexus Anima Wiki|Project}};Total|;|3=! style=&amp;quot;width: 80px&amp;quot; {{!}}{item}{newline} }}&lt;br /&gt;
|-&lt;br /&gt;
![[User:ReisuDesign|Main]]&lt;br /&gt;
{{Array|1={{#var:columns}}|2=;|3={{!}}²{Special:Editcount/ReisuDesign/{item} }²{newline}|template=1}}&lt;br /&gt;
!{{Special:Editcount/ReisuDesign}}&lt;br /&gt;
|-&lt;br /&gt;
![[User:ReisuBot|Bot]]&lt;br /&gt;
{{Array|1={{#var:columns}}|2=;|3={{!}}²{Special:Editcount/ReisuBot/{item} }²{newline}|template=1}}&lt;br /&gt;
!{{Special:Editcount/ReisuBot}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==My Subpages==&lt;br /&gt;
{{#DPL:&lt;br /&gt;
|namespace     = User&lt;br /&gt;
|titleregexp   = ReisuDesign.*?\.css&lt;br /&gt;
|format        = &amp;lt;ul class=&amp;quot;pill-list&amp;quot;&amp;gt;,&amp;lt;li&amp;gt;[[%PAGE%|²{Replace¦²{Replace¦%PAGE%¦User:ReisuDesign/}²¦.css}²]],&amp;lt;/li&amp;gt;,&amp;lt;/ul&amp;gt;&lt;br /&gt;
|resultsheader = %PAGES% CSS Subpages:&lt;br /&gt;
|ordermethod   = title&lt;br /&gt;
|order         =&lt;br /&gt;
}}&lt;br /&gt;
{{#DPL:&lt;br /&gt;
|namespace     = User&lt;br /&gt;
|titleregexp   = ReisuDesign.*?\.js&lt;br /&gt;
|format        = &amp;lt;ul class=&amp;quot;pill-list&amp;quot;&amp;gt;,&amp;lt;li&amp;gt;[[%PAGE%|²{Replace¦²{Replace¦%PAGE%¦User:ReisuDesign/}²¦.js}²]],&amp;lt;/li&amp;gt;,&amp;lt;/ul&amp;gt;&lt;br /&gt;
|resultsheader = %PAGES% JS Subpages:&lt;br /&gt;
|ordermethod   = title&lt;br /&gt;
|order         =&lt;br /&gt;
}}&lt;br /&gt;
{{#DPL:&lt;br /&gt;
|namespace     = User&lt;br /&gt;
|titleregexp   = ReisuDesign.*?&lt;br /&gt;
|nottitleregexp = ReisuDesign.*?\.js&lt;br /&gt;
|nottitleregexp = ReisuDesign.*?\.css&lt;br /&gt;
|format        = &amp;lt;ul class=&amp;quot;pill-list&amp;quot;&amp;gt;,&amp;lt;li&amp;gt;[[%PAGE%|²{Replace¦%PAGE%¦User:ReisuDesign/}²]],&amp;lt;/li&amp;gt;,&amp;lt;/ul&amp;gt;&lt;br /&gt;
|resultsheader = %PAGES% Subpages:&lt;br /&gt;
|ordermethod   = title&lt;br /&gt;
|order         =&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>ReisuDesign</name></author>
	</entry>
</feed>