<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://hegel.kyletcreasey.me/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Kcreasey</id>
	<title>The Speculative Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://hegel.kyletcreasey.me/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Kcreasey"/>
	<link rel="alternate" type="text/html" href="https://hegel.kyletcreasey.me/index.php/Special:Contributions/Kcreasey"/>
	<updated>2026-04-18T13:46:42Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.42.3</generator>
	<entry>
		<id>https://hegel.kyletcreasey.me/index.php?title=List_of_Triads&amp;diff=252</id>
		<title>List of Triads</title>
		<link rel="alternate" type="text/html" href="https://hegel.kyletcreasey.me/index.php?title=List_of_Triads&amp;diff=252"/>
		<updated>2023-12-12T02:51:55Z</updated>

		<summary type="html">&lt;p&gt;Kcreasey: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;For the Triads exactly in the flow of the logic that Hegel derives, see [[List of Direct Triads]]&lt;br /&gt;
&lt;br /&gt;
* Being =&amp;gt; Essence =&amp;gt; Concept&lt;br /&gt;
* Logic =&amp;gt; Nature =&amp;gt; Spirit&lt;br /&gt;
* &#039;&#039;&#039;Being-in-itself =&amp;gt; Being-for-other =&amp;gt; Being-for-itself&#039;&#039;&#039;&lt;br /&gt;
* Subjectivity =&amp;gt; Objectivity =&amp;gt; Idea&lt;/div&gt;</summary>
		<author><name>Kcreasey</name></author>
	</entry>
	<entry>
		<id>https://hegel.kyletcreasey.me/index.php?title=Talk:Main_Page&amp;diff=251</id>
		<title>Talk:Main Page</title>
		<link rel="alternate" type="text/html" href="https://hegel.kyletcreasey.me/index.php?title=Talk:Main_Page&amp;diff=251"/>
		<updated>2023-12-02T16:24:26Z</updated>

		<summary type="html">&lt;p&gt;Kcreasey: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Idea for each aspect individually in the flow of logic ==&lt;br /&gt;
&lt;br /&gt;
* Object in its immediacy&lt;br /&gt;
* Object as negated/abstracted?&lt;br /&gt;
* Object as mediated/sublated&lt;br /&gt;
&lt;br /&gt;
In order to capture the flow and also the sublated part affects further determinations down the line&lt;br /&gt;
&lt;br /&gt;
Example: Being-for-self as sublated means pure quantity and even quantum are &#039;&#039;&#039;not&#039;&#039;&#039; limited as being-for-self itself is the affirmative/being form of true infinity.&lt;br /&gt;
&lt;br /&gt;
== Eternal Return ==&lt;br /&gt;
&lt;br /&gt;
Not sure yet exactly how I&#039;ll use this, but using Meow Wolf&#039;s first art installation &amp;quot;House of Eternal Return&amp;quot;, the latter part of that well describes what True Infinity is. It is a loop back upon itself, an return back to itself that continues back to itself.&lt;/div&gt;</summary>
		<author><name>Kcreasey</name></author>
	</entry>
	<entry>
		<id>https://hegel.kyletcreasey.me/index.php?title=Self-similarities_in_path_of_logic&amp;diff=250</id>
		<title>Self-similarities in path of logic</title>
		<link rel="alternate" type="text/html" href="https://hegel.kyletcreasey.me/index.php?title=Self-similarities_in_path_of_logic&amp;diff=250"/>
		<updated>2023-12-02T16:22:55Z</updated>

		<summary type="html">&lt;p&gt;Kcreasey: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!First Track&lt;br /&gt;
!Second Track&lt;br /&gt;
!Third Track&lt;br /&gt;
!Fourth Track&lt;br /&gt;
|-&lt;br /&gt;
|Being&lt;br /&gt;
|Something&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Nothing&lt;br /&gt;
|Other&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Becoming&lt;br /&gt;
|Change&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Stability/Development&lt;br /&gt;
|Self-Identity&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Determinate Being&lt;br /&gt;
|Something &amp;amp; Other&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Quality&lt;br /&gt;
|Being-for-other &amp;amp; Being-in-itself&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
As each appearent return to a previous concept as further determined, it becomes more obvious this is an actual return with more determinacy through the Being-for-itself/True Infinity loop of return.&lt;/div&gt;</summary>
		<author><name>Kcreasey</name></author>
	</entry>
	<entry>
		<id>https://hegel.kyletcreasey.me/index.php?title=List_of_Triads&amp;diff=249</id>
		<title>List of Triads</title>
		<link rel="alternate" type="text/html" href="https://hegel.kyletcreasey.me/index.php?title=List_of_Triads&amp;diff=249"/>
		<updated>2023-12-02T14:57:15Z</updated>

		<summary type="html">&lt;p&gt;Kcreasey: Created page with &amp;quot;For the Triads exactly in the flow of the logic that Hegel derives, see List of Direct Triads  * Being =&amp;gt; Essence =&amp;gt; Concept * Logic =&amp;gt; Nature =&amp;gt; Spirit * Being-in-itself =&amp;gt; Being-for-other =&amp;gt; Being-for-itself * Subjectivity =&amp;gt; Objectivity =&amp;gt; Idea&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;For the Triads exactly in the flow of the logic that Hegel derives, see [[List of Direct Triads]]&lt;br /&gt;
&lt;br /&gt;
* Being =&amp;gt; Essence =&amp;gt; Concept&lt;br /&gt;
* Logic =&amp;gt; Nature =&amp;gt; Spirit&lt;br /&gt;
* Being-in-itself =&amp;gt; Being-for-other =&amp;gt; Being-for-itself&lt;br /&gt;
* Subjectivity =&amp;gt; Objectivity =&amp;gt; Idea&lt;/div&gt;</summary>
		<author><name>Kcreasey</name></author>
	</entry>
	<entry>
		<id>https://hegel.kyletcreasey.me/index.php?title=List_of_Direct_Triads&amp;diff=248</id>
		<title>List of Direct Triads</title>
		<link rel="alternate" type="text/html" href="https://hegel.kyletcreasey.me/index.php?title=List_of_Direct_Triads&amp;diff=248"/>
		<updated>2023-12-02T14:55:33Z</updated>

		<summary type="html">&lt;p&gt;Kcreasey: Kcreasey moved page List of Triads to List of Direct Triads without leaving a redirect: Rephrasing this as the actual flow process. Other non-Direct triads are also going to be documented&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Doctrine of Being ===&lt;br /&gt;
==== Quality ====&lt;br /&gt;
&lt;br /&gt;
* [[Pure Being ⇒ Becoming]]&lt;br /&gt;
&lt;br /&gt;
* [[Becoming ⇒ Determinate Being]]&lt;br /&gt;
&lt;br /&gt;
* [[Determinate Being ⇒ Something]]&lt;br /&gt;
&lt;br /&gt;
* [[Something ⇒ Change]]&lt;br /&gt;
&lt;br /&gt;
* [[Change ⇒ Something &amp;amp; Other]]&lt;br /&gt;
&lt;br /&gt;
* [[Something &amp;amp; Other ⇒ Determination]]&lt;br /&gt;
&lt;br /&gt;
==== Quantity ====&lt;/div&gt;</summary>
		<author><name>Kcreasey</name></author>
	</entry>
	<entry>
		<id>https://hegel.kyletcreasey.me/index.php?title=Main_Page&amp;diff=247</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://hegel.kyletcreasey.me/index.php?title=Main_Page&amp;diff=247"/>
		<updated>2023-12-02T14:54:46Z</updated>

		<summary type="html">&lt;p&gt;Kcreasey: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a work in progress of documenting as I follow along with the course of the Logic&lt;br /&gt;
* [[List of Triads]]&lt;br /&gt;
* [[Negation of the negation]]&lt;br /&gt;
* [[Thesis, Antithesis, Synthesis]]&lt;br /&gt;
* [[Self-similarities in path of logic]]&lt;br /&gt;
* [[Syllogisms]]&lt;br /&gt;
* [[Map of Science of Logic]]&lt;br /&gt;
&lt;br /&gt;
== Other sources ==&lt;br /&gt;
[https://speculativescience.github.io/en/#!index.md The Speculative Science] - Another attempt at a Wiki on the Science of Logic&lt;br /&gt;
&lt;br /&gt;
[https://hegel.net/ Hegel.net] - A site for navigating the Logic; uses triangles as visual aids for the syllogistic nature of the logic. Does perchance miss some negation transitions in this process&lt;/div&gt;</summary>
		<author><name>Kcreasey</name></author>
	</entry>
	<entry>
		<id>https://hegel.kyletcreasey.me/index.php?title=Talk:Main_Page&amp;diff=246</id>
		<title>Talk:Main Page</title>
		<link rel="alternate" type="text/html" href="https://hegel.kyletcreasey.me/index.php?title=Talk:Main_Page&amp;diff=246"/>
		<updated>2023-12-02T13:51:59Z</updated>

		<summary type="html">&lt;p&gt;Kcreasey: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Idea for each aspect individually in the flow of logic ==&lt;br /&gt;
&lt;br /&gt;
* Object in its immediacy&lt;br /&gt;
* Object as negated/abstracted?&lt;br /&gt;
* Object as mediated/sublated&lt;br /&gt;
&lt;br /&gt;
In order to capture the flow and also the sublated part affects further determinations down the line&lt;br /&gt;
&lt;br /&gt;
Example: Being-for-self as sublated means pure quantity and even quantum are &#039;&#039;&#039;not&#039;&#039;&#039; limited as being-for-self itself is the affirmative/being form of true infinity.&lt;/div&gt;</summary>
		<author><name>Kcreasey</name></author>
	</entry>
	<entry>
		<id>https://hegel.kyletcreasey.me/index.php?title=Talk:Main_Page&amp;diff=245</id>
		<title>Talk:Main Page</title>
		<link rel="alternate" type="text/html" href="https://hegel.kyletcreasey.me/index.php?title=Talk:Main_Page&amp;diff=245"/>
		<updated>2023-12-02T13:50:19Z</updated>

		<summary type="html">&lt;p&gt;Kcreasey: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Idea for each aspect individually in the flow of logic ==&lt;br /&gt;
&lt;br /&gt;
* Object in its immediacy&lt;br /&gt;
* Object as negated/abstracted?&lt;br /&gt;
* Object as mediated/sublated&lt;br /&gt;
&lt;br /&gt;
In order to capture the flow and also the sublated part affects further determinations down the line&lt;br /&gt;
Example: Being-for-self as sublated means pure quantity and even quantum are &#039;&#039;&#039;not&#039;&#039;&#039; limited as being-for-self itself is the affirmative/being form of true infinity.&lt;/div&gt;</summary>
		<author><name>Kcreasey</name></author>
	</entry>
	<entry>
		<id>https://hegel.kyletcreasey.me/index.php?title=Talk:Main_Page&amp;diff=244</id>
		<title>Talk:Main Page</title>
		<link rel="alternate" type="text/html" href="https://hegel.kyletcreasey.me/index.php?title=Talk:Main_Page&amp;diff=244"/>
		<updated>2023-12-02T13:50:14Z</updated>

		<summary type="html">&lt;p&gt;Kcreasey: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Idea for each aspect individually in the flow of logic ==&lt;br /&gt;
&lt;br /&gt;
* Object in it&#039;s immediacy&lt;br /&gt;
* Object as negated/abstracted?&lt;br /&gt;
* Object as mediated/sublated&lt;br /&gt;
&lt;br /&gt;
In order to capture the flow and also the sublated part affects further determinations down the line&lt;br /&gt;
Example: Being-for-self as sublated means pure quantity and even quantum are &#039;&#039;&#039;not&#039;&#039;&#039; limited as being-for-self itself is the affirmative/being form of true infinity.&lt;/div&gt;</summary>
		<author><name>Kcreasey</name></author>
	</entry>
	<entry>
		<id>https://hegel.kyletcreasey.me/index.php?title=Talk:Main_Page&amp;diff=243</id>
		<title>Talk:Main Page</title>
		<link rel="alternate" type="text/html" href="https://hegel.kyletcreasey.me/index.php?title=Talk:Main_Page&amp;diff=243"/>
		<updated>2023-12-02T13:50:00Z</updated>

		<summary type="html">&lt;p&gt;Kcreasey: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Idea for each aspect individually in the flow of logic ==&lt;br /&gt;
&lt;br /&gt;
Object in it&#039;s immediacy&lt;br /&gt;
Object as negated/abstracted?&lt;br /&gt;
Object as mediated/sublated&lt;br /&gt;
&lt;br /&gt;
In order to capture the flow and also the sublated part affects further determinations down the line&lt;br /&gt;
Example: Being-for-self as sublated means pure quantity and even quantum are &#039;&#039;&#039;not&#039;&#039;&#039; limited as being-for-self itself is the affirmative/being form of true infinity.&lt;/div&gt;</summary>
		<author><name>Kcreasey</name></author>
	</entry>
	<entry>
		<id>https://hegel.kyletcreasey.me/index.php?title=Talk:Main_Page&amp;diff=242</id>
		<title>Talk:Main Page</title>
		<link rel="alternate" type="text/html" href="https://hegel.kyletcreasey.me/index.php?title=Talk:Main_Page&amp;diff=242"/>
		<updated>2023-12-02T13:49:41Z</updated>

		<summary type="html">&lt;p&gt;Kcreasey: Created page with &amp;quot;Idea for each aspect individually in the flow of logic  Object in it&amp;#039;s immediacy Object as negated/abstracted? Object as mediated/sublated  In order to capture the flow and also the sublated part affects further determinations down the line Example: Being-for-self as sublated means pure quantity and even quantum are &amp;#039;&amp;#039;&amp;#039;not&amp;#039;&amp;#039;&amp;#039; limited as being-for-self itself is the affirmative/being form of true infinity.&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Idea for each aspect individually in the flow of logic&lt;br /&gt;
&lt;br /&gt;
Object in it&#039;s immediacy&lt;br /&gt;
Object as negated/abstracted?&lt;br /&gt;
Object as mediated/sublated&lt;br /&gt;
&lt;br /&gt;
In order to capture the flow and also the sublated part affects further determinations down the line&lt;br /&gt;
Example: Being-for-self as sublated means pure quantity and even quantum are &#039;&#039;&#039;not&#039;&#039;&#039; limited as being-for-self itself is the affirmative/being form of true infinity.&lt;/div&gt;</summary>
		<author><name>Kcreasey</name></author>
	</entry>
	<entry>
		<id>https://hegel.kyletcreasey.me/index.php?title=Template:Infobox_triad&amp;diff=241</id>
		<title>Template:Infobox triad</title>
		<link rel="alternate" type="text/html" href="https://hegel.kyletcreasey.me/index.php?title=Template:Infobox_triad&amp;diff=241"/>
		<updated>2023-11-28T13:37:33Z</updated>

		<summary type="html">&lt;p&gt;Kcreasey: Still working to fix why Houlgate isn&amp;#039;t showing up&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox&lt;br /&gt;
| title = {{PAGENAME}}&lt;br /&gt;
| headerstyle = background: #ddddff&lt;br /&gt;
| autoheaders = y&lt;br /&gt;
&lt;br /&gt;
| header1 = Science of Logic&lt;br /&gt;
| data2 = {{SoL divisions|{{{soldivision|}}}}}&lt;br /&gt;
&lt;br /&gt;
| header3 = Triad&lt;br /&gt;
| label4 = {{{thesislabel|}}}&lt;br /&gt;
| data4 = {{#if: {{{thesis|}}} | [[{{{thesis}}}]] }}&lt;br /&gt;
| label5 = A&lt;br /&gt;
| data5 = {{#if: {{{thesisa|}}} | [[{{{thesisa}}}]] }}&lt;br /&gt;
| label6 = B&lt;br /&gt;
| data6 = {{#if: {{{thesisb|}}} | [[{{{thesisb}}}]] }}&lt;br /&gt;
| label7 = {{{antithesislabel|}}}&lt;br /&gt;
| data7 = {{#if: {{{antithesis|}}} | [[{{{antithesis}}}]] }}&lt;br /&gt;
| label8 = A&lt;br /&gt;
| data8 = {{#if: {{{antithesisa|}}} | [[{{{antithesisa}}}]] }}&lt;br /&gt;
| label9 = B&lt;br /&gt;
| data9 = {{#if: {{{antithesisb|}}} | [[{{{antithesisb}}}]] }}&lt;br /&gt;
| label10 = {{{sublationlabel|}}}&lt;br /&gt;
| data10 = {{#if: {{{sublation|}}} | [[{{{sublation}}}]] }}&lt;br /&gt;
| label11 = A&lt;br /&gt;
| data11 = {{#if: {{{sublationa|}}} | [[{{{sublationa}}}]] }}&lt;br /&gt;
| label12 = B&lt;br /&gt;
| data12 = {{#if: {{{sublationb|}}} | [[{{{sublationb}}}]] }}&lt;br /&gt;
| header13 = Nav&lt;br /&gt;
| data14 = {{#if: {{{prev|}}} | [[{{{prev}}}]] | (Beginning) }}&lt;br /&gt;
| data15 = {{#if: {{{next|}}} | [[{{{next}}}]] | (End) }}&lt;br /&gt;
| header16 = Hegel&lt;br /&gt;
| data17 = {{Infobox | subbox = yes | headerstyle = background: #CDCDFE| header1 = Science of Logic | header2 = {{{slstart}}}-{{{slend}}} | label3 = Miller | data3 = p.{{{millerpage}}}-{{{millerend}}} | label4 = Giovanni | data4 = p.{{{giovannipage}}}-{{{giovanniend}}} }}&lt;br /&gt;
| data18 = {{Infobox | subbox = yes | headerstyle = background: #CDCDFE| header1 = Encyclopedia Logic I | header2 = §{{{subsection}}}-{{{subsectionend}}} | label3 = Wallace | data3 = p.{{{wallacepage}}}-{{{wallacepage}}} | label4 = Hackett | data4 = p.{{{hackettpage}}}-{{{hackettend}}} }}&lt;br /&gt;
| header19 = Houlgate&lt;br /&gt;
| label20: The Opening to the Logic&lt;br /&gt;
| data20: t{{#if: {{{hotl|}}}| Chp. {{{hotl}}} [p.{{{hotlstart}}}-{{{hotlend}}} }}&lt;br /&gt;
| label21: On Being&lt;br /&gt;
| data21: {{#if: {{{honbv|}}}| Vol. {{{honbv}}}, Chp. {{{honbc}}} [p.{{{honbstart}}}-{{{honbend}}} }}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Kcreasey</name></author>
	</entry>
	<entry>
		<id>https://hegel.kyletcreasey.me/index.php?title=Module:String&amp;diff=240</id>
		<title>Module:String</title>
		<link rel="alternate" type="text/html" href="https://hegel.kyletcreasey.me/index.php?title=Module:String&amp;diff=240"/>
		<updated>2023-11-28T13:36:40Z</updated>

		<summary type="html">&lt;p&gt;Kcreasey: Created page with &amp;quot;--[[  This module is intended to provide access to basic string functions.  Most of the functions provided here can be invoked with named parameters, unnamed parameters, or a mixture.  If named parameters are used, Mediawiki will automatically remove any leading or trailing whitespace from the parameter. Depending on the intended use, it may be advantageous to either preserve or remove such whitespace.  Global options     ignore_errors: If set to &amp;#039;true&amp;#039; or 1, any error c...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--[[&lt;br /&gt;
&lt;br /&gt;
This module is intended to provide access to basic string functions.&lt;br /&gt;
&lt;br /&gt;
Most of the functions provided here can be invoked with named parameters,&lt;br /&gt;
unnamed parameters, or a mixture.  If named parameters are used, Mediawiki will&lt;br /&gt;
automatically remove any leading or trailing whitespace from the parameter.&lt;br /&gt;
Depending on the intended use, it may be advantageous to either preserve or&lt;br /&gt;
remove such whitespace.&lt;br /&gt;
&lt;br /&gt;
Global options&lt;br /&gt;
    ignore_errors: If set to &#039;true&#039; or 1, any error condition will result in&lt;br /&gt;
        an empty string being returned rather than an error message.&lt;br /&gt;
&lt;br /&gt;
    error_category: If an error occurs, specifies the name of a category to&lt;br /&gt;
        include with the error message.  The default category is&lt;br /&gt;
        [Category:Errors reported by Module String].&lt;br /&gt;
&lt;br /&gt;
    no_category: If set to &#039;true&#039; or 1, no category will be added if an error&lt;br /&gt;
        is generated.&lt;br /&gt;
&lt;br /&gt;
Unit tests for this module are available at Module:String/tests.&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local str = {}&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
len&lt;br /&gt;
&lt;br /&gt;
This function returns the length of the target string.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
{{#invoke:String|len|target_string|}}&lt;br /&gt;
OR&lt;br /&gt;
{{#invoke:String|len|s=target_string}}&lt;br /&gt;
&lt;br /&gt;
Parameters&lt;br /&gt;
    s: The string whose length to report&lt;br /&gt;
&lt;br /&gt;
If invoked using named parameters, Mediawiki will automatically remove any leading or&lt;br /&gt;
trailing whitespace from the target string.&lt;br /&gt;
]]&lt;br /&gt;
function str.len( frame )&lt;br /&gt;
	local new_args = str._getParameters( frame.args, {&#039;s&#039;} )&lt;br /&gt;
	local s = new_args[&#039;s&#039;] or &#039;&#039;&lt;br /&gt;
	return mw.ustring.len( s )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
sub&lt;br /&gt;
&lt;br /&gt;
This function returns a substring of the target string at specified indices.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
{{#invoke:String|sub|target_string|start_index|end_index}}&lt;br /&gt;
OR&lt;br /&gt;
{{#invoke:String|sub|s=target_string|i=start_index|j=end_index}}&lt;br /&gt;
&lt;br /&gt;
Parameters&lt;br /&gt;
    s: The string to return a subset of&lt;br /&gt;
    i: The first index of the substring to return, defaults to 1.&lt;br /&gt;
    j: The last index of the string to return, defaults to the last character.&lt;br /&gt;
&lt;br /&gt;
The first character of the string is assigned an index of 1.  If either i or j&lt;br /&gt;
is a negative value, it is interpreted the same as selecting a character by&lt;br /&gt;
counting from the end of the string.  Hence, a value of -1 is the same as&lt;br /&gt;
selecting the last character of the string.&lt;br /&gt;
&lt;br /&gt;
If the requested indices are out of range for the given string, an error is&lt;br /&gt;
reported.&lt;br /&gt;
]]&lt;br /&gt;
function str.sub( frame )&lt;br /&gt;
	local new_args = str._getParameters( frame.args, { &#039;s&#039;, &#039;i&#039;, &#039;j&#039; } )&lt;br /&gt;
	local s = new_args[&#039;s&#039;] or &#039;&#039;&lt;br /&gt;
	local i = tonumber( new_args[&#039;i&#039;] ) or 1&lt;br /&gt;
	local j = tonumber( new_args[&#039;j&#039;] ) or -1&lt;br /&gt;
&lt;br /&gt;
	local len = mw.ustring.len( s )&lt;br /&gt;
&lt;br /&gt;
	-- Convert negatives for range checking&lt;br /&gt;
	if i &amp;lt; 0 then&lt;br /&gt;
		i = len + i + 1&lt;br /&gt;
	end&lt;br /&gt;
	if j &amp;lt; 0 then&lt;br /&gt;
		j = len + j + 1&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if i &amp;gt; len or j &amp;gt; len or i &amp;lt; 1 or j &amp;lt; 1 then&lt;br /&gt;
		return str._error( &#039;String subset index out of range&#039; )&lt;br /&gt;
	end&lt;br /&gt;
	if j &amp;lt; i then&lt;br /&gt;
		return str._error( &#039;String subset indices out of order&#039; )&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return mw.ustring.sub( s, i, j )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
This function implements that features of {{str sub old}} and is kept in order&lt;br /&gt;
to maintain these older templates.&lt;br /&gt;
]]&lt;br /&gt;
function str.sublength( frame )&lt;br /&gt;
	local i = tonumber( frame.args.i ) or 0&lt;br /&gt;
	local len = tonumber( frame.args.len )&lt;br /&gt;
	return mw.ustring.sub( frame.args.s, i + 1, len and ( i + len ) )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
_match&lt;br /&gt;
&lt;br /&gt;
This function returns a substring from the source string that matches a&lt;br /&gt;
specified pattern. It is exported for use in other modules&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
strmatch = require(&amp;quot;Module:String&amp;quot;)._match&lt;br /&gt;
sresult = strmatch( s, pattern, start, match, plain, nomatch )&lt;br /&gt;
&lt;br /&gt;
Parameters&lt;br /&gt;
    s: The string to search&lt;br /&gt;
    pattern: The pattern or string to find within the string&lt;br /&gt;
    start: The index within the source string to start the search.  The first&lt;br /&gt;
        character of the string has index 1.  Defaults to 1.&lt;br /&gt;
    match: In some cases it may be possible to make multiple matches on a single&lt;br /&gt;
        string.  This specifies which match to return, where the first match is&lt;br /&gt;
        match= 1.  If a negative number is specified then a match is returned&lt;br /&gt;
        counting from the last match.  Hence match = -1 is the same as requesting&lt;br /&gt;
        the last match.  Defaults to 1.&lt;br /&gt;
    plain: A flag indicating that the pattern should be understood as plain&lt;br /&gt;
        text.  Defaults to false.&lt;br /&gt;
    nomatch: If no match is found, output the &amp;quot;nomatch&amp;quot; value rather than an error.&lt;br /&gt;
&lt;br /&gt;
For information on constructing Lua patterns, a form of [regular expression], see:&lt;br /&gt;
&lt;br /&gt;
* http://www.lua.org/manual/5.1/manual.html#5.4.1&lt;br /&gt;
* http://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#Patterns&lt;br /&gt;
* http://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#Ustring_patterns&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
-- This sub-routine is exported for use in other modules&lt;br /&gt;
function str._match( s, pattern, start, match_index, plain_flag, nomatch )&lt;br /&gt;
	if s == &#039;&#039; then&lt;br /&gt;
		return str._error( &#039;Target string is empty&#039; )&lt;br /&gt;
	end&lt;br /&gt;
	if pattern == &#039;&#039; then&lt;br /&gt;
		return str._error( &#039;Pattern string is empty&#039; )&lt;br /&gt;
	end&lt;br /&gt;
	start = tonumber(start) or 1&lt;br /&gt;
	if math.abs(start) &amp;lt; 1 or math.abs(start) &amp;gt; mw.ustring.len( s ) then&lt;br /&gt;
		return str._error( &#039;Requested start is out of range&#039; )&lt;br /&gt;
	end&lt;br /&gt;
	if match_index == 0 then&lt;br /&gt;
		return str._error( &#039;Match index is out of range&#039; )&lt;br /&gt;
	end&lt;br /&gt;
	if plain_flag then&lt;br /&gt;
		pattern = str._escapePattern( pattern )&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local result&lt;br /&gt;
	if match_index == 1 then&lt;br /&gt;
		-- Find first match is simple case&lt;br /&gt;
		result = mw.ustring.match( s, pattern, start )&lt;br /&gt;
	else&lt;br /&gt;
		if start &amp;gt; 1 then&lt;br /&gt;
			s = mw.ustring.sub( s, start )&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local iterator = mw.ustring.gmatch(s, pattern)&lt;br /&gt;
		if match_index &amp;gt; 0 then&lt;br /&gt;
			-- Forward search&lt;br /&gt;
			for w in iterator do&lt;br /&gt;
				match_index = match_index - 1&lt;br /&gt;
				if match_index == 0 then&lt;br /&gt;
					result = w&lt;br /&gt;
					break&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			-- Reverse search&lt;br /&gt;
			local result_table = {}&lt;br /&gt;
			local count = 1&lt;br /&gt;
			for w in iterator do&lt;br /&gt;
				result_table[count] = w&lt;br /&gt;
				count = count + 1&lt;br /&gt;
			end&lt;br /&gt;
&lt;br /&gt;
			result = result_table[ count + match_index ]&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if result == nil then&lt;br /&gt;
		if nomatch == nil then&lt;br /&gt;
			return str._error( &#039;Match not found&#039; )&lt;br /&gt;
		else&lt;br /&gt;
			return nomatch&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		return result&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
match&lt;br /&gt;
&lt;br /&gt;
This function returns a substring from the source string that matches a&lt;br /&gt;
specified pattern.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
{{#invoke:String|match|source_string|pattern_string|start_index|match_number|plain_flag|nomatch_output}}&lt;br /&gt;
OR&lt;br /&gt;
{{#invoke:String|match|s=source_string|pattern=pattern_string|start=start_index&lt;br /&gt;
    |match=match_number|plain=plain_flag|nomatch=nomatch_output}}&lt;br /&gt;
&lt;br /&gt;
Parameters&lt;br /&gt;
    s: The string to search&lt;br /&gt;
    pattern: The pattern or string to find within the string&lt;br /&gt;
    start: The index within the source string to start the search.  The first&lt;br /&gt;
        character of the string has index 1.  Defaults to 1.&lt;br /&gt;
    match: In some cases it may be possible to make multiple matches on a single&lt;br /&gt;
        string.  This specifies which match to return, where the first match is&lt;br /&gt;
        match= 1.  If a negative number is specified then a match is returned&lt;br /&gt;
        counting from the last match.  Hence match = -1 is the same as requesting&lt;br /&gt;
        the last match.  Defaults to 1.&lt;br /&gt;
    plain: A flag indicating that the pattern should be understood as plain&lt;br /&gt;
        text.  Defaults to false.&lt;br /&gt;
    nomatch: If no match is found, output the &amp;quot;nomatch&amp;quot; value rather than an error.&lt;br /&gt;
&lt;br /&gt;
If invoked using named parameters, Mediawiki will automatically remove any leading or&lt;br /&gt;
trailing whitespace from each string.  In some circumstances this is desirable, in&lt;br /&gt;
other cases one may want to preserve the whitespace.&lt;br /&gt;
&lt;br /&gt;
If the match_number or start_index are out of range for the string being queried, then&lt;br /&gt;
this function generates an error.  An error is also generated if no match is found.&lt;br /&gt;
If one adds the parameter ignore_errors=true, then the error will be suppressed and&lt;br /&gt;
an empty string will be returned on any failure.&lt;br /&gt;
&lt;br /&gt;
For information on constructing Lua patterns, a form of [regular expression], see:&lt;br /&gt;
&lt;br /&gt;
* http://www.lua.org/manual/5.1/manual.html#5.4.1&lt;br /&gt;
* http://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#Patterns&lt;br /&gt;
* http://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#Ustring_patterns&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
-- This is the entry point for #invoke:String|match&lt;br /&gt;
function str.match( frame )&lt;br /&gt;
	local new_args = str._getParameters( frame.args, {&#039;s&#039;, &#039;pattern&#039;, &#039;start&#039;, &#039;match&#039;, &#039;plain&#039;, &#039;nomatch&#039;} )&lt;br /&gt;
	local s = new_args[&#039;s&#039;] or &#039;&#039;&lt;br /&gt;
	local start = tonumber( new_args[&#039;start&#039;] ) or 1&lt;br /&gt;
	local plain_flag = str._getBoolean( new_args[&#039;plain&#039;] or false )&lt;br /&gt;
	local pattern = new_args[&#039;pattern&#039;] or &#039;&#039;&lt;br /&gt;
	local match_index = math.floor( tonumber(new_args[&#039;match&#039;]) or 1 )&lt;br /&gt;
	local nomatch = new_args[&#039;nomatch&#039;]&lt;br /&gt;
&lt;br /&gt;
	return str._match( s, pattern, start, match_index, plain_flag, nomatch )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
pos&lt;br /&gt;
&lt;br /&gt;
This function returns a single character from the target string at position pos.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
{{#invoke:String|pos|target_string|index_value}}&lt;br /&gt;
OR&lt;br /&gt;
{{#invoke:String|pos|target=target_string|pos=index_value}}&lt;br /&gt;
&lt;br /&gt;
Parameters&lt;br /&gt;
    target: The string to search&lt;br /&gt;
    pos: The index for the character to return&lt;br /&gt;
&lt;br /&gt;
If invoked using named parameters, Mediawiki will automatically remove any leading or&lt;br /&gt;
trailing whitespace from the target string.  In some circumstances this is desirable, in&lt;br /&gt;
other cases one may want to preserve the whitespace.&lt;br /&gt;
&lt;br /&gt;
The first character has an index value of 1.&lt;br /&gt;
&lt;br /&gt;
If one requests a negative value, this function will select a character by counting backwards&lt;br /&gt;
from the end of the string.  In other words pos = -1 is the same as asking for the last character.&lt;br /&gt;
&lt;br /&gt;
A requested value of zero, or a value greater than the length of the string returns an error.&lt;br /&gt;
]]&lt;br /&gt;
function str.pos( frame )&lt;br /&gt;
	local new_args = str._getParameters( frame.args, {&#039;target&#039;, &#039;pos&#039;} )&lt;br /&gt;
	local target_str = new_args[&#039;target&#039;] or &#039;&#039;&lt;br /&gt;
	local pos = tonumber( new_args[&#039;pos&#039;] ) or 0&lt;br /&gt;
&lt;br /&gt;
	if pos == 0 or math.abs(pos) &amp;gt; mw.ustring.len( target_str ) then&lt;br /&gt;
		return str._error( &#039;String index out of range&#039; )&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return mw.ustring.sub( target_str, pos, pos )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
str_find&lt;br /&gt;
&lt;br /&gt;
This function duplicates the behavior of {{str_find}}, including all of its quirks.&lt;br /&gt;
This is provided in order to support existing templates, but is NOT RECOMMENDED for&lt;br /&gt;
new code and templates.  New code is recommended to use the &amp;quot;find&amp;quot; function instead.&lt;br /&gt;
&lt;br /&gt;
Returns the first index in &amp;quot;source&amp;quot; that is a match to &amp;quot;target&amp;quot;.  Indexing is 1-based,&lt;br /&gt;
and the function returns -1 if the &amp;quot;target&amp;quot; string is not present in &amp;quot;source&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Important Note: If the &amp;quot;target&amp;quot; string is empty / missing, this function returns a&lt;br /&gt;
value of &amp;quot;1&amp;quot;, which is generally unexpected behavior, and must be accounted for&lt;br /&gt;
separatetly.&lt;br /&gt;
]]&lt;br /&gt;
function str.str_find( frame )&lt;br /&gt;
	local new_args = str._getParameters( frame.args, {&#039;source&#039;, &#039;target&#039;} )&lt;br /&gt;
	local source_str = new_args[&#039;source&#039;] or &#039;&#039;&lt;br /&gt;
	local target_str = new_args[&#039;target&#039;] or &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	if target_str == &#039;&#039; then&lt;br /&gt;
		return 1&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local start = mw.ustring.find( source_str, target_str, 1, true )&lt;br /&gt;
	if start == nil then&lt;br /&gt;
		start = -1&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return start&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
find&lt;br /&gt;
&lt;br /&gt;
This function allows one to search for a target string or pattern within another&lt;br /&gt;
string.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
{{#invoke:String|find|source_str|target_string|start_index|plain_flag}}&lt;br /&gt;
OR&lt;br /&gt;
{{#invoke:String|find|source=source_str|target=target_str|start=start_index|plain=plain_flag}}&lt;br /&gt;
&lt;br /&gt;
Parameters&lt;br /&gt;
    source: The string to search&lt;br /&gt;
    target: The string or pattern to find within source&lt;br /&gt;
    start: The index within the source string to start the search, defaults to 1&lt;br /&gt;
    plain: Boolean flag indicating that target should be understood as plain&lt;br /&gt;
        text and not as a Lua style regular expression, defaults to true&lt;br /&gt;
&lt;br /&gt;
If invoked using named parameters, Mediawiki will automatically remove any leading or&lt;br /&gt;
trailing whitespace from the parameter.  In some circumstances this is desirable, in&lt;br /&gt;
other cases one may want to preserve the whitespace.&lt;br /&gt;
&lt;br /&gt;
This function returns the first index &amp;gt;= &amp;quot;start&amp;quot; where &amp;quot;target&amp;quot; can be found&lt;br /&gt;
within &amp;quot;source&amp;quot;.  Indices are 1-based.  If &amp;quot;target&amp;quot; is not found, then this&lt;br /&gt;
function returns 0.  If either &amp;quot;source&amp;quot; or &amp;quot;target&amp;quot; are missing / empty, this&lt;br /&gt;
function also returns 0.&lt;br /&gt;
&lt;br /&gt;
This function should be safe for UTF-8 strings.&lt;br /&gt;
]]&lt;br /&gt;
function str.find( frame )&lt;br /&gt;
	local new_args = str._getParameters( frame.args, {&#039;source&#039;, &#039;target&#039;, &#039;start&#039;, &#039;plain&#039; } )&lt;br /&gt;
	local source_str = new_args[&#039;source&#039;] or &#039;&#039;&lt;br /&gt;
	local pattern = new_args[&#039;target&#039;] or &#039;&#039;&lt;br /&gt;
	local start_pos = tonumber(new_args[&#039;start&#039;]) or 1&lt;br /&gt;
	local plain = new_args[&#039;plain&#039;] or true&lt;br /&gt;
&lt;br /&gt;
	if source_str == &#039;&#039; or pattern == &#039;&#039; then&lt;br /&gt;
		return 0&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	plain = str._getBoolean( plain )&lt;br /&gt;
&lt;br /&gt;
	local start = mw.ustring.find( source_str, pattern, start_pos, plain )&lt;br /&gt;
	if start == nil then&lt;br /&gt;
		start = 0&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return start&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
replace&lt;br /&gt;
&lt;br /&gt;
This function allows one to replace a target string or pattern within another&lt;br /&gt;
string.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
{{#invoke:String|replace|source_str|pattern_string|replace_string|replacement_count|plain_flag}}&lt;br /&gt;
OR&lt;br /&gt;
{{#invoke:String|replace|source=source_string|pattern=pattern_string|replace=replace_string|&lt;br /&gt;
   count=replacement_count|plain=plain_flag}}&lt;br /&gt;
&lt;br /&gt;
Parameters&lt;br /&gt;
    source: The string to search&lt;br /&gt;
    pattern: The string or pattern to find within source&lt;br /&gt;
    replace: The replacement text&lt;br /&gt;
    count: The number of occurences to replace, defaults to all.&lt;br /&gt;
    plain: Boolean flag indicating that pattern should be understood as plain&lt;br /&gt;
        text and not as a Lua style regular expression, defaults to true&lt;br /&gt;
]]&lt;br /&gt;
function str.replace( frame )&lt;br /&gt;
	local new_args = str._getParameters( frame.args, {&#039;source&#039;, &#039;pattern&#039;, &#039;replace&#039;, &#039;count&#039;, &#039;plain&#039; } )&lt;br /&gt;
	local source_str = new_args[&#039;source&#039;] or &#039;&#039;&lt;br /&gt;
	local pattern = new_args[&#039;pattern&#039;] or &#039;&#039;&lt;br /&gt;
	local replace = new_args[&#039;replace&#039;] or &#039;&#039;&lt;br /&gt;
	local count = tonumber( new_args[&#039;count&#039;] )&lt;br /&gt;
	local plain = new_args[&#039;plain&#039;] or true&lt;br /&gt;
&lt;br /&gt;
	if source_str == &#039;&#039; or pattern == &#039;&#039; then&lt;br /&gt;
		return source_str&lt;br /&gt;
	end&lt;br /&gt;
	plain = str._getBoolean( plain )&lt;br /&gt;
&lt;br /&gt;
	if plain then&lt;br /&gt;
		pattern = str._escapePattern( pattern )&lt;br /&gt;
		replace = mw.ustring.gsub( replace, &amp;quot;%%&amp;quot;, &amp;quot;%%%%&amp;quot; ) --Only need to escape replacement sequences.&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local result&lt;br /&gt;
&lt;br /&gt;
	if count ~= nil then&lt;br /&gt;
		result = mw.ustring.gsub( source_str, pattern, replace, count )&lt;br /&gt;
	else&lt;br /&gt;
		result = mw.ustring.gsub( source_str, pattern, replace )&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
    simple function to pipe string.rep to templates.&lt;br /&gt;
]]&lt;br /&gt;
function str.rep( frame )&lt;br /&gt;
	local repetitions = tonumber( frame.args[2] )&lt;br /&gt;
	if not repetitions then&lt;br /&gt;
		return str._error( &#039;function rep expects a number as second parameter, received &amp;quot;&#039; .. ( frame.args[2] or &#039;&#039; ) .. &#039;&amp;quot;&#039; )&lt;br /&gt;
	end&lt;br /&gt;
	return string.rep( frame.args[1] or &#039;&#039;, repetitions )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
escapePattern&lt;br /&gt;
&lt;br /&gt;
This function escapes special characters from a Lua string pattern. See [1]&lt;br /&gt;
for details on how patterns work.&lt;br /&gt;
&lt;br /&gt;
[1] https://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#Patterns&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
{{#invoke:String|escapePattern|pattern_string}}&lt;br /&gt;
&lt;br /&gt;
Parameters&lt;br /&gt;
    pattern_string: The pattern string to escape.&lt;br /&gt;
]]&lt;br /&gt;
function str.escapePattern( frame )&lt;br /&gt;
	local pattern_str = frame.args[1]&lt;br /&gt;
	if not pattern_str then&lt;br /&gt;
		return str._error( &#039;No pattern string specified&#039; )&lt;br /&gt;
	end&lt;br /&gt;
	local result = str._escapePattern( pattern_str )&lt;br /&gt;
	return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
count&lt;br /&gt;
This function counts the number of occurrences of one string in another.&lt;br /&gt;
]]&lt;br /&gt;
function str.count(frame)&lt;br /&gt;
	local args = str._getParameters(frame.args, {&#039;source&#039;, &#039;pattern&#039;, &#039;plain&#039;})&lt;br /&gt;
	local source = args.source or &#039;&#039;&lt;br /&gt;
	local pattern = args.pattern or &#039;&#039;&lt;br /&gt;
	local plain = str._getBoolean(args.plain or true)&lt;br /&gt;
	if plain then&lt;br /&gt;
		pattern = str._escapePattern(pattern)&lt;br /&gt;
	end&lt;br /&gt;
	local _, count = mw.ustring.gsub(source, pattern, &#039;&#039;)&lt;br /&gt;
	return count&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
endswith&lt;br /&gt;
This function determines whether a string ends with another string.&lt;br /&gt;
]]&lt;br /&gt;
function str.endswith(frame)&lt;br /&gt;
	local args = str._getParameters(frame.args, {&#039;source&#039;, &#039;pattern&#039;})&lt;br /&gt;
	local source = args.source or &#039;&#039;&lt;br /&gt;
	local pattern = args.pattern or &#039;&#039;&lt;br /&gt;
	if pattern == &#039;&#039; then&lt;br /&gt;
		-- All strings end with the empty string.&lt;br /&gt;
		return &amp;quot;yes&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	if mw.ustring.sub(source, -mw.ustring.len(pattern), -1) == pattern then&lt;br /&gt;
		return &amp;quot;yes&amp;quot;&lt;br /&gt;
	else&lt;br /&gt;
		return &amp;quot;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
join&lt;br /&gt;
&lt;br /&gt;
Join all non empty arguments together; the first argument is the separator.&lt;br /&gt;
Usage:&lt;br /&gt;
{{#invoke:String|join|sep|one|two|three}}&lt;br /&gt;
]]&lt;br /&gt;
function str.join(frame)&lt;br /&gt;
	local args = {}&lt;br /&gt;
	local sep&lt;br /&gt;
	for _, v in ipairs( frame.args ) do&lt;br /&gt;
		if sep then&lt;br /&gt;
			if v ~= &#039;&#039; then&lt;br /&gt;
				table.insert(args, v)&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			sep = v&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return table.concat( args, sep or &#039;&#039; )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
Helper function that populates the argument list given that user may need to use a mix of&lt;br /&gt;
named and unnamed parameters.  This is relevant because named parameters are not&lt;br /&gt;
identical to unnamed parameters due to string trimming, and when dealing with strings&lt;br /&gt;
we sometimes want to either preserve or remove that whitespace depending on the application.&lt;br /&gt;
]]&lt;br /&gt;
function str._getParameters( frame_args, arg_list )&lt;br /&gt;
	local new_args = {}&lt;br /&gt;
	local index = 1&lt;br /&gt;
	local value&lt;br /&gt;
&lt;br /&gt;
	for _, arg in ipairs( arg_list ) do&lt;br /&gt;
		value = frame_args[arg]&lt;br /&gt;
		if value == nil then&lt;br /&gt;
			value = frame_args[index]&lt;br /&gt;
			index = index + 1&lt;br /&gt;
		end&lt;br /&gt;
		new_args[arg] = value&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return new_args&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
Helper function to handle error messages.&lt;br /&gt;
]]&lt;br /&gt;
function str._error( error_str )&lt;br /&gt;
	local frame = mw.getCurrentFrame()&lt;br /&gt;
	local error_category = frame.args.error_category or &#039;Errors reported by Module String&#039;&lt;br /&gt;
	local ignore_errors = frame.args.ignore_errors or false&lt;br /&gt;
	local no_category = frame.args.no_category or false&lt;br /&gt;
&lt;br /&gt;
	if str._getBoolean(ignore_errors) then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local error_str = &#039;&amp;lt;strong class=&amp;quot;error&amp;quot;&amp;gt;String Module Error: &#039; .. error_str .. &#039;&amp;lt;/strong&amp;gt;&#039;&lt;br /&gt;
	if error_category ~= &#039;&#039; and not str._getBoolean( no_category ) then&lt;br /&gt;
		error_str = &#039;[[Category:&#039; .. error_category .. &#039;]]&#039; .. error_str&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return error_str&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
Helper Function to interpret boolean strings&lt;br /&gt;
]]&lt;br /&gt;
function str._getBoolean( boolean_str )&lt;br /&gt;
	local boolean_value&lt;br /&gt;
&lt;br /&gt;
	if type( boolean_str ) == &#039;string&#039; then&lt;br /&gt;
		boolean_str = boolean_str:lower()&lt;br /&gt;
		if boolean_str == &#039;false&#039; or boolean_str == &#039;no&#039; or boolean_str == &#039;0&#039;&lt;br /&gt;
				or boolean_str == &#039;&#039; then&lt;br /&gt;
			boolean_value = false&lt;br /&gt;
		else&lt;br /&gt;
			boolean_value = true&lt;br /&gt;
		end&lt;br /&gt;
	elseif type( boolean_str ) == &#039;boolean&#039; then&lt;br /&gt;
		boolean_value = boolean_str&lt;br /&gt;
	else&lt;br /&gt;
		error( &#039;No boolean value found&#039; )&lt;br /&gt;
	end&lt;br /&gt;
	return boolean_value&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
Helper function that escapes all pattern characters so that they will be treated&lt;br /&gt;
as plain text.&lt;br /&gt;
]]&lt;br /&gt;
function str._escapePattern( pattern_str )&lt;br /&gt;
	return mw.ustring.gsub( pattern_str, &amp;quot;([%(%)%.%%%+%-%*%?%[%^%$%]])&amp;quot;, &amp;quot;%%%1&amp;quot; )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return str&lt;/div&gt;</summary>
		<author><name>Kcreasey</name></author>
	</entry>
	<entry>
		<id>https://hegel.kyletcreasey.me/index.php?title=Template:Remove_first_word&amp;diff=239</id>
		<title>Template:Remove first word</title>
		<link rel="alternate" type="text/html" href="https://hegel.kyletcreasey.me/index.php?title=Template:Remove_first_word&amp;diff=239"/>
		<updated>2023-11-28T13:36:02Z</updated>

		<summary type="html">&lt;p&gt;Kcreasey: Created page with &amp;quot;{{&amp;lt;includeonly&amp;gt;safesubst:&amp;lt;/includeonly&amp;gt;#invoke:String|replace|source={{{1}}}|pattern=^[^{{{sep|%s}}}]*{{{sep|%s}}}*|replace=|plain=false}}&amp;lt;noinclude&amp;gt;{{Documentation}}&amp;lt;/noinclude&amp;gt;&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{&amp;lt;includeonly&amp;gt;safesubst:&amp;lt;/includeonly&amp;gt;#invoke:String|replace|source={{{1}}}|pattern=^[^{{{sep|%s}}}]*{{{sep|%s}}}*|replace=|plain=false}}&amp;lt;noinclude&amp;gt;{{Documentation}}&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Kcreasey</name></author>
	</entry>
	<entry>
		<id>https://hegel.kyletcreasey.me/index.php?title=Template:Str_left&amp;diff=238</id>
		<title>Template:Str left</title>
		<link rel="alternate" type="text/html" href="https://hegel.kyletcreasey.me/index.php?title=Template:Str_left&amp;diff=238"/>
		<updated>2023-11-28T13:34:10Z</updated>

		<summary type="html">&lt;p&gt;Kcreasey: Created page with &amp;quot;&amp;lt;includeonly&amp;gt;{{safesubst:padleft:|{{{2|1}}}|{{{1}}}}}&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt; {{documentation}} &amp;lt;!-- Categories go on the /doc subpage, and interwikis go on Wikidata. --&amp;gt; &amp;lt;/noinclude&amp;gt;&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;includeonly&amp;gt;{{safesubst:padleft:|{{{2|1}}}|{{{1}}}}}&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{documentation}}&lt;br /&gt;
&amp;lt;!-- Categories go on the /doc subpage, and interwikis go on Wikidata. --&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Kcreasey</name></author>
	</entry>
	<entry>
		<id>https://hegel.kyletcreasey.me/index.php?title=Template:Infobox_triad&amp;diff=237</id>
		<title>Template:Infobox triad</title>
		<link rel="alternate" type="text/html" href="https://hegel.kyletcreasey.me/index.php?title=Template:Infobox_triad&amp;diff=237"/>
		<updated>2023-11-28T13:32:31Z</updated>

		<summary type="html">&lt;p&gt;Kcreasey: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox&lt;br /&gt;
| title = {{PAGENAME}}&lt;br /&gt;
| headerstyle = background: #ddddff&lt;br /&gt;
| autoheaders = n&lt;br /&gt;
&lt;br /&gt;
| header1 = Science of Logic&lt;br /&gt;
| data2 = {{SoL divisions|{{{soldivision|}}}}}&lt;br /&gt;
&lt;br /&gt;
| header3 = Triad&lt;br /&gt;
| label4 = {{{thesislabel|}}}&lt;br /&gt;
| data4 = {{#if: {{{thesis|}}} | [[{{{thesis}}}]] }}&lt;br /&gt;
| label5 = A&lt;br /&gt;
| data5 = {{#if: {{{thesisa|}}} | [[{{{thesisa}}}]] }}&lt;br /&gt;
| label6 = B&lt;br /&gt;
| data6 = {{#if: {{{thesisb|}}} | [[{{{thesisb}}}]] }}&lt;br /&gt;
| label7 = {{{antithesislabel|}}}&lt;br /&gt;
| data7 = {{#if: {{{antithesis|}}} | [[{{{antithesis}}}]] }}&lt;br /&gt;
| label8 = A&lt;br /&gt;
| data8 = {{#if: {{{antithesisa|}}} | [[{{{antithesisa}}}]] }}&lt;br /&gt;
| label9 = B&lt;br /&gt;
| data9 = {{#if: {{{antithesisb|}}} | [[{{{antithesisb}}}]] }}&lt;br /&gt;
| label10 = {{{sublationlabel|}}}&lt;br /&gt;
| data10 = {{#if: {{{sublation|}}} | [[{{{sublation}}}]] }}&lt;br /&gt;
| label11 = A&lt;br /&gt;
| data11 = {{#if: {{{sublationa|}}} | [[{{{sublationa}}}]] }}&lt;br /&gt;
| label12 = B&lt;br /&gt;
| data12 = {{#if: {{{sublationb|}}} | [[{{{sublationb}}}]] }}&lt;br /&gt;
| header13 = Nav&lt;br /&gt;
| data14 = {{#if: {{{prev|}}} | [[{{{prev}}}]] | (Beginning) }}&lt;br /&gt;
| data15 = {{#if: {{{next|}}} | [[{{{next}}}]] | (End) }}&lt;br /&gt;
| header16 = Hegel&lt;br /&gt;
&lt;br /&gt;
| header19 = Houlgate&lt;br /&gt;
| label20: The Opening to the Logic&lt;br /&gt;
| data20: t{{#if: {{{hotl|}}}| Chp. {{{hotl}}} [p.{{{hotlstart}}}-{{{hotlend}}} }}&lt;br /&gt;
| label21: On Being&lt;br /&gt;
| data21: {{#if: {{{honbv|}}}| Vol. {{{honbv}}}, Chp. {{{honbc}}} [p.{{{honbstart}}}-{{{honbend}}} }}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Kcreasey</name></author>
	</entry>
	<entry>
		<id>https://hegel.kyletcreasey.me/index.php?title=Template:Infobox_triad&amp;diff=236</id>
		<title>Template:Infobox triad</title>
		<link rel="alternate" type="text/html" href="https://hegel.kyletcreasey.me/index.php?title=Template:Infobox_triad&amp;diff=236"/>
		<updated>2023-11-28T13:29:52Z</updated>

		<summary type="html">&lt;p&gt;Kcreasey: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox&lt;br /&gt;
| title = {{PAGENAME}}&lt;br /&gt;
| headerstyle = background: #ddddff&lt;br /&gt;
| autoheaders = n&lt;br /&gt;
&lt;br /&gt;
| header1 = Science of Logic&lt;br /&gt;
| data2 = {{SoL divisions|{{{soldivision|}}}}}&lt;br /&gt;
&lt;br /&gt;
| header3 = Triad&lt;br /&gt;
| label4 = {{{thesislabel|}}}&lt;br /&gt;
| data4 = {{#if: {{{thesis|}}} | [[{{{thesis}}}]] }}&lt;br /&gt;
| label5 = A&lt;br /&gt;
| data5 = {{#if: {{{thesisa|}}} | [[{{{thesisa}}}]] }}&lt;br /&gt;
| label6 = B&lt;br /&gt;
| data6 = {{#if: {{{thesisb|}}} | [[{{{thesisb}}}]] }}&lt;br /&gt;
| label7 = {{{antithesislabel|}}}&lt;br /&gt;
| data7 = {{#if: {{{antithesis|}}} | [[{{{antithesis}}}]] }}&lt;br /&gt;
| label8 = A&lt;br /&gt;
| data8 = {{#if: {{{antithesisa|}}} | [[{{{antithesisa}}}]] }}&lt;br /&gt;
| label9 = B&lt;br /&gt;
| data9 = {{#if: {{{antithesisb|}}} | [[{{{antithesisb}}}]] }}&lt;br /&gt;
| label10 = {{{sublationlabel|}}}&lt;br /&gt;
| data10 = {{#if: {{{sublation|}}} | [[{{{sublation}}}]] }}&lt;br /&gt;
| label11 = A&lt;br /&gt;
| data11 = {{#if: {{{sublationa|}}} | [[{{{sublationa}}}]] }}&lt;br /&gt;
| label12 = B&lt;br /&gt;
| data12 = {{#if: {{{sublationb|}}} | [[{{{sublationb}}}]] }}&lt;br /&gt;
| header13 = Nav&lt;br /&gt;
| data14 = {{#if: {{{prev|}}} | [[{{{prev}}}]] | (Beginning) }}&lt;br /&gt;
| data15 = {{#if: {{{next|}}} | [[{{{next}}}]] | (End) }}&lt;br /&gt;
| header16 = Hegel&lt;br /&gt;
| data17 = {{Infobox | subbox = yes | headerstyle = background: #CDCDFE| header1 = Science of Logic | header2 = {{{slstart}}}-{{{slend}}} | label3 = Miller | data3 = p.{{{millerpage}}}-{{{millerend}}} | label4 = Giovanni | data4 = p.{{{giovannipage}}}-{{{giovanniend}}} }}&lt;br /&gt;
| data18 = {{Infobox | subbox = yes | headerstyle = background: #CDCDFE| header1 = Encyclopedia Logic I | header2 = §{{{subsection}}}-{{{subsectionend}}} | label3 = Wallace | data3 = p.{{{wallacepage}}}-{{{wallacepage}}} | label4 = Hackett | data4 = p.{{{hackettpage}}}-{{{hackettend}}} }}&lt;br /&gt;
| header19 = Houlgate&lt;br /&gt;
| label20: The Opening to the Logic&lt;br /&gt;
| data20: t{{#if: {{{hotl|}}}| Chp. {{{hotl}}} [p.{{{hotlstart}}}-{{{hotlend}}} }}&lt;br /&gt;
| label21: On Being&lt;br /&gt;
| data21: {{#if: {{{honbv|}}}| Vol. {{{honbv}}}, Chp. {{{honbc}}} [p.{{{honbstart}}}-{{{honbend}}} }}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Kcreasey</name></author>
	</entry>
	<entry>
		<id>https://hegel.kyletcreasey.me/index.php?title=Template:Infobox_triad&amp;diff=235</id>
		<title>Template:Infobox triad</title>
		<link rel="alternate" type="text/html" href="https://hegel.kyletcreasey.me/index.php?title=Template:Infobox_triad&amp;diff=235"/>
		<updated>2023-11-28T13:29:12Z</updated>

		<summary type="html">&lt;p&gt;Kcreasey: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox&lt;br /&gt;
| title = {{PAGENAME}}&lt;br /&gt;
| headerstyle = background: #ddddff&lt;br /&gt;
| autoheaders = y&lt;br /&gt;
&lt;br /&gt;
| header1 = Science of Logic&lt;br /&gt;
| data2 = {{SoL divisions|{{{soldivision|}}}}}&lt;br /&gt;
&lt;br /&gt;
| header3 = Triad&lt;br /&gt;
| label4 = {{{thesislabel|}}}&lt;br /&gt;
| data4 = {{#if: {{{thesis|}}} | [[{{{thesis}}}]] }}&lt;br /&gt;
| label5 = A&lt;br /&gt;
| data5 = {{#if: {{{thesisa|}}} | [[{{{thesisa}}}]] }}&lt;br /&gt;
| label6 = B&lt;br /&gt;
| data6 = {{#if: {{{thesisb|}}} | [[{{{thesisb}}}]] }}&lt;br /&gt;
| label7 = {{{antithesislabel|}}}&lt;br /&gt;
| data7 = {{#if: {{{antithesis|}}} | [[{{{antithesis}}}]] }}&lt;br /&gt;
| label8 = A&lt;br /&gt;
| data8 = {{#if: {{{antithesisa|}}} | [[{{{antithesisa}}}]] }}&lt;br /&gt;
| label9 = B&lt;br /&gt;
| data9 = {{#if: {{{antithesisb|}}} | [[{{{antithesisb}}}]] }}&lt;br /&gt;
| label10 = {{{sublationlabel|}}}&lt;br /&gt;
| data10 = {{#if: {{{sublation|}}} | [[{{{sublation}}}]] }}&lt;br /&gt;
| label11 = A&lt;br /&gt;
| data11 = {{#if: {{{sublationa|}}} | [[{{{sublationa}}}]] }}&lt;br /&gt;
| label12 = B&lt;br /&gt;
| data12 = {{#if: {{{sublationb|}}} | [[{{{sublationb}}}]] }}&lt;br /&gt;
| header13 = Nav&lt;br /&gt;
| data14 = {{#if: {{{prev|}}} | [[{{{prev}}}]] | (Beginning) }}&lt;br /&gt;
| data15 = {{#if: {{{next|}}} | [[{{{next}}}]] | (End) }}&lt;br /&gt;
| header16 = Hegel&lt;br /&gt;
| data17 = {{Infobox | subbox = yes | headerstyle = background: #CDCDFE| header1 = Science of Logic | header2 = {{{slstart}}}-{{{slend}}} | label3 = Miller | data3 = p.{{{millerpage}}}-{{{millerend}}} | label4 = Giovanni | data4 = p.{{{giovannipage}}}-{{{giovanniend}}}}}&lt;br /&gt;
| data18 = {{Infobox | subbox = yes | headerstyle = background: #CDCDFE| header1 = Encyclopedia Logic I | header2 = §{{{subsection}}}-{{{subsectionend}}} | label3 = Wallace | data3 = p.{{{wallacepage}}}-{{{wallacepage}}} | label4 = Hackett | data4 = p.{{{hackettpage}}}-{{{hackettend}}}}}&lt;br /&gt;
|header19 = Houlgate&lt;br /&gt;
|label20: The Opening to the Logic&lt;br /&gt;
|data20: t{{#if: {{{hotl|}}}| Chp. {{{hotl}}} [p.{{{hotlstart}}}-{{{hotlend}}} }}&lt;br /&gt;
|label21: On Being&lt;br /&gt;
|data21: {{#if: {{{honbv|}}}| Vol. {{{honbv}}}, Chp. {{{honbc}}} [p.{{{honbstart}}}-{{{honbend}}} }}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Kcreasey</name></author>
	</entry>
	<entry>
		<id>https://hegel.kyletcreasey.me/index.php?title=Pure_Being_%E2%87%92_Becoming&amp;diff=234</id>
		<title>Pure Being ⇒ Becoming</title>
		<link rel="alternate" type="text/html" href="https://hegel.kyletcreasey.me/index.php?title=Pure_Being_%E2%87%92_Becoming&amp;diff=234"/>
		<updated>2023-11-28T13:28:08Z</updated>

		<summary type="html">&lt;p&gt;Kcreasey: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox triad&lt;br /&gt;
|soldivision=being&lt;br /&gt;
|thesislabel=Being&lt;br /&gt;
|antithesislabel=Negation&lt;br /&gt;
|sublationlabel=Sublation&lt;br /&gt;
|thesis=Pure Being&lt;br /&gt;
|antithesis=Pure Nothing&lt;br /&gt;
|sublation=Becoming&lt;br /&gt;
|sublationa=Coming-To-Be&lt;br /&gt;
|sublationb=Ceasing-To-Be&lt;br /&gt;
|next=Becoming ⇒ Determinate Being&lt;br /&gt;
|millerpage=82&lt;br /&gt;
|millerend=108&lt;br /&gt;
|giovannipage=59&lt;br /&gt;
|giovanniend=82&lt;br /&gt;
|subsection=86&lt;br /&gt;
|subsectionend=89&lt;br /&gt;
|wallacepage=124&lt;br /&gt;
|wallaceend=134&lt;br /&gt;
|hackettpage=136&lt;br /&gt;
|hackettend=146&lt;br /&gt;
|slstart=1.1.1.1.A&lt;br /&gt;
|slend=1.1.1.3&lt;br /&gt;
|hotl=14|hotlstart=263|hotlend=283}}&lt;br /&gt;
&lt;br /&gt;
== Accents ==&lt;br /&gt;
Being is &#039;&#039;&amp;lt;u&amp;gt;pure&amp;lt;/u&amp;gt;&#039;&#039;, indeterminate &#039;&#039;&amp;lt;u&amp;gt;immediacy&amp;lt;/u&amp;gt;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Nothing is pure, &#039;&#039;&amp;lt;u&amp;gt;indeterminate&amp;lt;/u&amp;gt;&#039;&#039; immediacy.&lt;/div&gt;</summary>
		<author><name>Kcreasey</name></author>
	</entry>
	<entry>
		<id>https://hegel.kyletcreasey.me/index.php?title=Map_of_Science_of_Logic&amp;diff=233</id>
		<title>Map of Science of Logic</title>
		<link rel="alternate" type="text/html" href="https://hegel.kyletcreasey.me/index.php?title=Map_of_Science_of_Logic&amp;diff=233"/>
		<updated>2023-11-28T13:15:07Z</updated>

		<summary type="html">&lt;p&gt;Kcreasey: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#widget:SoLMap}}&lt;/div&gt;</summary>
		<author><name>Kcreasey</name></author>
	</entry>
	<entry>
		<id>https://hegel.kyletcreasey.me/index.php?title=Widget:SoLMap&amp;diff=232</id>
		<title>Widget:SoLMap</title>
		<link rel="alternate" type="text/html" href="https://hegel.kyletcreasey.me/index.php?title=Widget:SoLMap&amp;diff=232"/>
		<updated>2023-11-28T13:14:35Z</updated>

		<summary type="html">&lt;p&gt;Kcreasey: Created page with &amp;quot;&amp;lt;iframe style=&amp;quot;border:none&amp;quot; width=&amp;quot;800&amp;quot; height=&amp;quot;450&amp;quot; src=&amp;quot;https://whimsical.com/embed/TmsM6oqDahcVK6HaprJrDB&amp;quot;&amp;gt;&amp;lt;/iframe&amp;gt;&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;iframe style=&amp;quot;border:none&amp;quot; width=&amp;quot;800&amp;quot; height=&amp;quot;450&amp;quot; src=&amp;quot;https://whimsical.com/embed/TmsM6oqDahcVK6HaprJrDB&amp;quot;&amp;gt;&amp;lt;/iframe&amp;gt;&lt;/div&gt;</summary>
		<author><name>Kcreasey</name></author>
	</entry>
	<entry>
		<id>https://hegel.kyletcreasey.me/index.php?title=Map_of_Science_of_Logic&amp;diff=231</id>
		<title>Map of Science of Logic</title>
		<link rel="alternate" type="text/html" href="https://hegel.kyletcreasey.me/index.php?title=Map_of_Science_of_Logic&amp;diff=231"/>
		<updated>2023-11-28T13:06:11Z</updated>

		<summary type="html">&lt;p&gt;Kcreasey: Created page with &amp;quot;https://whimsical.com/science-of-logic-TmsM6oqDahcVK6HaprJrDB&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;https://whimsical.com/science-of-logic-TmsM6oqDahcVK6HaprJrDB&lt;/div&gt;</summary>
		<author><name>Kcreasey</name></author>
	</entry>
	<entry>
		<id>https://hegel.kyletcreasey.me/index.php?title=Main_Page&amp;diff=230</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://hegel.kyletcreasey.me/index.php?title=Main_Page&amp;diff=230"/>
		<updated>2023-11-28T13:03:27Z</updated>

		<summary type="html">&lt;p&gt;Kcreasey: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a work in progress of documenting as I follow along with the course of the Logic&lt;br /&gt;
* [[List of Triads]]&lt;br /&gt;
* [[Negation of the negation]]&lt;br /&gt;
* [[Thesis, Antithesis, Synthesis]]&lt;br /&gt;
* [[Self-similarities in path of logic]]&lt;br /&gt;
* [[Rough Patterns]]&lt;br /&gt;
* [[Syllogisms]]&lt;br /&gt;
* [[Map of Science of Logic]]&lt;br /&gt;
&lt;br /&gt;
== Other sources ==&lt;br /&gt;
[https://speculativescience.github.io/en/#!index.md The Speculative Science] - Another attempt at a Wiki on the Science of Logic&lt;br /&gt;
&lt;br /&gt;
[https://hegel.net/ Hegel.net] - A site for navigating the Logic; uses triangles as visual aids for the syllogistic nature of the logic. Does perchance miss some negation transitions in this process&lt;/div&gt;</summary>
		<author><name>Kcreasey</name></author>
	</entry>
	<entry>
		<id>https://hegel.kyletcreasey.me/index.php?title=List_of_Direct_Triads&amp;diff=229</id>
		<title>List of Direct Triads</title>
		<link rel="alternate" type="text/html" href="https://hegel.kyletcreasey.me/index.php?title=List_of_Direct_Triads&amp;diff=229"/>
		<updated>2023-11-28T13:02:33Z</updated>

		<summary type="html">&lt;p&gt;Kcreasey: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Doctrine of Being ===&lt;br /&gt;
==== Quality ====&lt;br /&gt;
&lt;br /&gt;
* [[Pure Being ⇒ Becoming]]&lt;br /&gt;
&lt;br /&gt;
* [[Becoming ⇒ Determinate Being]]&lt;br /&gt;
&lt;br /&gt;
* [[Determinate Being ⇒ Something]]&lt;br /&gt;
&lt;br /&gt;
* [[Something ⇒ Change]]&lt;br /&gt;
&lt;br /&gt;
* [[Change ⇒ Something &amp;amp; Other]]&lt;br /&gt;
&lt;br /&gt;
* [[Something &amp;amp; Other ⇒ Determination]]&lt;br /&gt;
&lt;br /&gt;
==== Quantity ====&lt;/div&gt;</summary>
		<author><name>Kcreasey</name></author>
	</entry>
	<entry>
		<id>https://hegel.kyletcreasey.me/index.php?title=Stability&amp;diff=228</id>
		<title>Stability</title>
		<link rel="alternate" type="text/html" href="https://hegel.kyletcreasey.me/index.php?title=Stability&amp;diff=228"/>
		<updated>2023-11-28T13:01:36Z</updated>

		<summary type="html">&lt;p&gt;Kcreasey: Created page with &amp;quot;At this point, this seems to be the logical term to use for &amp;quot;vanishing of the vanishing&amp;quot;. This seems somehow different than Nothing or Other when it comes to the kind of property it is. More akin self-relating&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;At this point, this seems to be the logical term to use for &amp;quot;vanishing of the vanishing&amp;quot;.&lt;br /&gt;
This seems somehow different than Nothing or Other when it comes to the kind of property it is. More akin self-relating&lt;/div&gt;</summary>
		<author><name>Kcreasey</name></author>
	</entry>
	<entry>
		<id>https://hegel.kyletcreasey.me/index.php?title=Becoming_%E2%87%92_Determinate_Being&amp;diff=227</id>
		<title>Becoming ⇒ Determinate Being</title>
		<link rel="alternate" type="text/html" href="https://hegel.kyletcreasey.me/index.php?title=Becoming_%E2%87%92_Determinate_Being&amp;diff=227"/>
		<updated>2023-11-28T12:59:47Z</updated>

		<summary type="html">&lt;p&gt;Kcreasey: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox triad&lt;br /&gt;
|thesislabel=Being&lt;br /&gt;
|thesis=Becoming&lt;br /&gt;
|antithesislabel=Negation&lt;br /&gt;
|antithesis=Stability&lt;br /&gt;
|sublationlabel=Sublation&lt;br /&gt;
|sublation=Determinate Being&lt;br /&gt;
|prev=Pure Being ⇒ Becoming&lt;br /&gt;
|next=Determinate Being ⇒ Something&lt;br /&gt;
|millerpage=&lt;br /&gt;
|millerend=&lt;br /&gt;
|giovannipage=&lt;br /&gt;
|giovanniend=&lt;br /&gt;
|subsection=&lt;br /&gt;
|subsectionend=&lt;br /&gt;
|wallacepage=&lt;br /&gt;
|wallaceend=&lt;br /&gt;
|hackettpage=&lt;br /&gt;
|hackettend=&lt;br /&gt;
|soldivision=being}}&lt;br /&gt;
== Accents ==&lt;/div&gt;</summary>
		<author><name>Kcreasey</name></author>
	</entry>
	<entry>
		<id>https://hegel.kyletcreasey.me/index.php?title=Template:Infobox_triad&amp;diff=226</id>
		<title>Template:Infobox triad</title>
		<link rel="alternate" type="text/html" href="https://hegel.kyletcreasey.me/index.php?title=Template:Infobox_triad&amp;diff=226"/>
		<updated>2023-11-28T12:58:31Z</updated>

		<summary type="html">&lt;p&gt;Kcreasey: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox&lt;br /&gt;
| title = {{PAGENAME}}&lt;br /&gt;
| headerstyle = background: #ddddff&lt;br /&gt;
| autoheaders = y&lt;br /&gt;
&lt;br /&gt;
| header1 = Science of Logic&lt;br /&gt;
| data2 = {{SoL divisions|{{{soldivision|}}}}}&lt;br /&gt;
&lt;br /&gt;
| header3 = Triad&lt;br /&gt;
| label4 = {{{thesislabel|}}}&lt;br /&gt;
| data4 = {{#if: {{{thesis|}}} | [[{{{thesis}}}]] }}&lt;br /&gt;
| label5 = A&lt;br /&gt;
| data5 = {{#if: {{{thesisa|}}} | [[{{{thesisa}}}]] }}&lt;br /&gt;
| label6 = B&lt;br /&gt;
| data6 = {{#if: {{{thesisb|}}} | [[{{{thesisb}}}]] }}&lt;br /&gt;
| label7 = {{{antithesislabel|}}}&lt;br /&gt;
| data7 = {{#if: {{{antithesis|}}} | [[{{{antithesis}}}]] }}&lt;br /&gt;
| label8 = A&lt;br /&gt;
| data8 = {{#if: {{{antithesisa|}}} | [[{{{antithesisa}}}]] }}&lt;br /&gt;
| label9 = B&lt;br /&gt;
| data9 = {{#if: {{{antithesisb|}}} | [[{{{antithesisb}}}]] }}&lt;br /&gt;
| label10 = {{{sublationlabel|}}}&lt;br /&gt;
| data10 = {{#if: {{{sublation|}}} | [[{{{sublation}}}]] }}&lt;br /&gt;
| label11 = A&lt;br /&gt;
| data11 = {{#if: {{{sublationa|}}} | [[{{{sublationa}}}]] }}&lt;br /&gt;
| label12 = B&lt;br /&gt;
| data12 = {{#if: {{{sublationb|}}} | [[{{{sublationb}}}]] }}&lt;br /&gt;
| header13 = Nav&lt;br /&gt;
| data14 = {{#if: {{{prev|}}} | [[{{{prev}}}]] | (Beginning) }}&lt;br /&gt;
| data15 = {{#if: {{{next|}}} | [[{{{next}}}]] | (End) }}&lt;br /&gt;
| header16 = Hegel&lt;br /&gt;
| data17 = {{Infobox | subbox = yes | headerstyle = background: #CDCDFE| header1 = Science of Logic | header2 = {{{slstart}}}-{{{slend}}} | label3 = Miller | data3 = p.{{{millerpage}}}-{{{millerend}}} | label4 = Giovanni | data4 = p.{{{giovannipage}}}-{{{giovanniend}}}}}&lt;br /&gt;
| data18 = {{Infobox | subbox = yes | headerstyle = background: #CDCDFE| header1 = Encyclopedia Logic I | header2 = §{{{subsection}}}-{{{subsectionend}}} | label3 = Wallace | data3 = p.{{{wallacepage}}}-{{{wallacepage}}} | label4 = Hackett | data4 = p.{{{hackettpage}}}-{{{hackettend}}}}}&lt;br /&gt;
|header19 = Houlgate&lt;br /&gt;
|label20: The Opening to the Logic&lt;br /&gt;
|data20: {{#if: {{{hotl|}}}| Chp. {{{hotl}}} [p.{{{hotlstart}}}-{{{hotlend}}} }}&lt;br /&gt;
|label21: On Being&lt;br /&gt;
|data21: {{#if: {{{honbv|}}}| Vol. {{{honbv}}}, Chp. {{{honbc}}} [p.{{{honbstart}}}-{{{honbend}}} }}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Kcreasey</name></author>
	</entry>
	<entry>
		<id>https://hegel.kyletcreasey.me/index.php?title=Template:Infobox_triad&amp;diff=225</id>
		<title>Template:Infobox triad</title>
		<link rel="alternate" type="text/html" href="https://hegel.kyletcreasey.me/index.php?title=Template:Infobox_triad&amp;diff=225"/>
		<updated>2023-11-28T12:46:25Z</updated>

		<summary type="html">&lt;p&gt;Kcreasey: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox&lt;br /&gt;
| title = {{PAGENAME}}&lt;br /&gt;
| headerstyle = background: #ddddff&lt;br /&gt;
| autoheaders = y&lt;br /&gt;
&lt;br /&gt;
| header1 = Science of Logic&lt;br /&gt;
| data2 = {{SoL divisions|{{{soldivision|}}}}}&lt;br /&gt;
&lt;br /&gt;
| header3 = Triad&lt;br /&gt;
| label4 = {{{thesislabel|}}}&lt;br /&gt;
| data4 = {{#if: {{{thesis|}}} | [[{{{thesis}}}]] }}&lt;br /&gt;
| label5 = A&lt;br /&gt;
| data5 = {{#if: {{{thesisa|}}} | [[{{{thesisa}}}]] }}&lt;br /&gt;
| label6 = B&lt;br /&gt;
| data6 = {{#if: {{{thesisb|}}} | [[{{{thesisb}}}]] }}&lt;br /&gt;
| label7 = {{{antithesislabel|}}}&lt;br /&gt;
| data7 = {{#if: {{{antithesis|}}} | [[{{{antithesis}}}]] }}&lt;br /&gt;
| label8 = A&lt;br /&gt;
| data8 = {{#if: {{{antithesisa|}}} | [[{{{antithesisa}}}]] }}&lt;br /&gt;
| label9 = B&lt;br /&gt;
| data9 = {{#if: {{{antithesisb|}}} | [[{{{antithesisb}}}]] }}&lt;br /&gt;
| label10 = {{{sublationlabel|}}}&lt;br /&gt;
| data10 = [[{{{sublation|}}}]]&lt;br /&gt;
| label11 = A&lt;br /&gt;
| data11 = [[{{{sublationa|}}}]]&lt;br /&gt;
| label12 = B&lt;br /&gt;
| data12 = [[{{{sublationb|}}}]]&lt;br /&gt;
| header13 = Nav&lt;br /&gt;
| data14 = [[{{{prev|}}}]]&lt;br /&gt;
| data15 = [[{{{next|}}}]]&lt;br /&gt;
| header16 = Hegel&lt;br /&gt;
| data17 = {{Infobox | subbox = yes | headerstyle = background: #CDCDFE| header1 = Science of Logic | header2 = {{{slstart}}}-{{{slend}}} | label3 = Miller | data3 = p.{{{millerpage}}}-{{{millerend}}} | label4 = Giovanni | data4 = p.{{{giovannipage}}}-{{{giovanniend}}}}}&lt;br /&gt;
| data18 = {{Infobox | subbox = yes | headerstyle = background: #CDCDFE| header1 = Encyclopedia Logic I | header2 = §{{{subsection}}}-{{{subsectionend}}} | label3 = Wallace | data3 = p.{{{wallacepage}}}-{{{wallacepage}}} | label4 = Hackett | data4 = p.{{{hackettpage}}}-{{{hackettend}}}}}&lt;br /&gt;
|header19 = Houlgate&lt;br /&gt;
|label20: The Opening to the Logic&lt;br /&gt;
|data20: {{#if: {{{hotl|}}}| Chp. {{{hotl}}} [p.{{{hotlstart}}}-{{{hotlend}}} }}&lt;br /&gt;
|label21: On Being&lt;br /&gt;
|data21: {{#if: {{{honbv|}}}| Vol. {{{honbv}}}, Chp. {{{honbc}}} [p.{{{honbstart}}}-{{{honbend}}} }}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Kcreasey</name></author>
	</entry>
	<entry>
		<id>https://hegel.kyletcreasey.me/index.php?title=Template:Infobox_triad&amp;diff=224</id>
		<title>Template:Infobox triad</title>
		<link rel="alternate" type="text/html" href="https://hegel.kyletcreasey.me/index.php?title=Template:Infobox_triad&amp;diff=224"/>
		<updated>2023-11-28T12:43:10Z</updated>

		<summary type="html">&lt;p&gt;Kcreasey: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox&lt;br /&gt;
| title = {{PAGENAME}}&lt;br /&gt;
| headerstyle = background: #ddddff&lt;br /&gt;
| autoheaders = y&lt;br /&gt;
&lt;br /&gt;
| header1 = Science of Logic&lt;br /&gt;
| data2 = {{SoL divisions|{{{soldivision|}}}}}&lt;br /&gt;
&lt;br /&gt;
| header3 = Triad&lt;br /&gt;
| label4 = {{{thesislabel|}}}&lt;br /&gt;
| data4 = [[{{{thesis|}}}]]&lt;br /&gt;
| label5 = A&lt;br /&gt;
| data5 = [[{{{thesisa|}}}]]&lt;br /&gt;
| label6 = B&lt;br /&gt;
| data6 = [[{{{thesisb|}}}]]&lt;br /&gt;
| label7 = {{{antithesislabel|}}}&lt;br /&gt;
| data7 = [[{{{antithesis|}}}]]&lt;br /&gt;
| label8 = A&lt;br /&gt;
| data8 = [[{{{antithesisa|}}}]]&lt;br /&gt;
| label9 = B&lt;br /&gt;
| data9 = [[{{{antithesisb|}}}]]&lt;br /&gt;
| label10 = {{{sublationlabel|}}}&lt;br /&gt;
| data10 = [[{{{sublation|}}}]]&lt;br /&gt;
| label11 = A&lt;br /&gt;
| data11 = [[{{{sublationa|}}}]]&lt;br /&gt;
| label12 = B&lt;br /&gt;
| data12 = [[{{{sublationb|}}}]]&lt;br /&gt;
| header13 = Nav&lt;br /&gt;
| data14 = [[{{{prev|}}}]]&lt;br /&gt;
| data15 = [[{{{next|}}}]]&lt;br /&gt;
| header16 = Hegel&lt;br /&gt;
| data17 = {{Infobox | subbox = yes | headerstyle = background: #CDCDFE| header1 = Science of Logic | header2 = {{{slstart}}}-{{{slend}}} | label3 = Miller | data3 = p.{{{millerpage}}}-{{{millerend}}} | label4 = Giovanni | data4 = p.{{{giovannipage}}}-{{{giovanniend}}}}}&lt;br /&gt;
| data18 = {{Infobox | subbox = yes | headerstyle = background: #CDCDFE| header1 = Encyclopedia Logic I | header2 = §{{{subsection}}}-{{{subsectionend}}} | label3 = Wallace | data3 = p.{{{wallacepage}}}-{{{wallacepage}}} | label4 = Hackett | data4 = p.{{{hackettpage}}}-{{{hackettend}}}}}&lt;br /&gt;
|header19 = Houlgate&lt;br /&gt;
|label20: The Opening to the Logic&lt;br /&gt;
|data20: {{#if: {{{hotl|}}}| Chp. {{{hotl}}} [p.{{{hotlstart}}}-{{{hotlend}}} }}&lt;br /&gt;
|label21: On Being&lt;br /&gt;
|data21: {{#if: {{{honbv|}}}| Vol. {{{honbv}}}, Chp. {{{honbc}}} [p.{{{honbstart}}}-{{{honbend}}} }}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Kcreasey</name></author>
	</entry>
	<entry>
		<id>https://hegel.kyletcreasey.me/index.php?title=Template:Infobox_triad&amp;diff=223</id>
		<title>Template:Infobox triad</title>
		<link rel="alternate" type="text/html" href="https://hegel.kyletcreasey.me/index.php?title=Template:Infobox_triad&amp;diff=223"/>
		<updated>2023-11-27T23:47:52Z</updated>

		<summary type="html">&lt;p&gt;Kcreasey: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox&lt;br /&gt;
| title = {{PAGENAME}}&lt;br /&gt;
| headerstyle = background: #ddddff&lt;br /&gt;
| autoheaders = y&lt;br /&gt;
&lt;br /&gt;
| header1 = Science of Logic&lt;br /&gt;
| data2 = {{SoL divisions|{{{soldivision|}}}}}&lt;br /&gt;
&lt;br /&gt;
| header3 = Triad&lt;br /&gt;
| label4 = {{{thesislabel|}}}&lt;br /&gt;
| data4 = {{{thesis|}}}&lt;br /&gt;
| label5 = A&lt;br /&gt;
| data5 = {{{thesisa|}}}&lt;br /&gt;
| label6 = B&lt;br /&gt;
| data6 = {{{thesisb|}}}&lt;br /&gt;
| label7 = {{{antithesislabel|}}}&lt;br /&gt;
| data7 = {{{antithesis|}}}&lt;br /&gt;
| label8 = A&lt;br /&gt;
| data8 = {{{antithesisa|}}}&lt;br /&gt;
| label9 = B&lt;br /&gt;
| data9 = {{{antithesisb|}}}&lt;br /&gt;
| label10 = {{{sublationlabel|}}}&lt;br /&gt;
| data10 = {{{sublation|}}}&lt;br /&gt;
| label11 = A&lt;br /&gt;
| data11 = {{{sublationa|}}}&lt;br /&gt;
| label12 = B&lt;br /&gt;
| data12 = {{{sublationb|}}}&lt;br /&gt;
| header13 = Nav&lt;br /&gt;
| data14 = {{{prev|}}}&lt;br /&gt;
| data15 = {{{next|}}}&lt;br /&gt;
| header16 = Hegel&lt;br /&gt;
| data17 = {{Infobox | subbox = yes | headerstyle = background: #CDCDFE| header1 = Science of Logic | header2 = {{{slstart}}}-{{{slend}}} | label3 = Miller | data3 = p.{{{millerpage}}}-{{{millerend}}} | label4 = Giovanni | data4 = p.{{{giovannipage}}}-{{{giovanniend}}}}}&lt;br /&gt;
| data18 = {{Infobox | subbox = yes | headerstyle = background: #CDCDFE| header1 = Encyclopedia Logic I | header2 = §{{{subsection}}}-{{{subsectionend}}} | label3 = Wallace | data3 = p.{{{wallacepage}}}-{{{wallacepage}}} | label4 = Hackett | data4 = p.{{{hackettpage}}}-{{{hackettend}}}}}&lt;br /&gt;
|header19 = Houlgate&lt;br /&gt;
|label20: The Opening to the Logic&lt;br /&gt;
|data20: {{#if: {{{hotl|}}}| Chp. {{{hotl}}} [p.{{{hotlstart}}}-{{{hotlend}}} }}&lt;br /&gt;
|label21: On Being&lt;br /&gt;
|data21: {{#if: {{{honbv|}}}| Vol. {{{honbv}}}, Chp. {{{honbc}}} [p.{{{honbstart}}}-{{{honbend}}} }}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Kcreasey</name></author>
	</entry>
	<entry>
		<id>https://hegel.kyletcreasey.me/index.php?title=Template:Infobox_triad&amp;diff=222</id>
		<title>Template:Infobox triad</title>
		<link rel="alternate" type="text/html" href="https://hegel.kyletcreasey.me/index.php?title=Template:Infobox_triad&amp;diff=222"/>
		<updated>2023-11-27T23:43:12Z</updated>

		<summary type="html">&lt;p&gt;Kcreasey: Kcreasey moved page Template:Infobox triad2 to Template:Infobox triad without leaving a redirect: Moving template into place&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox&lt;br /&gt;
| title = {{PAGENAME}}&lt;br /&gt;
| headerstyle = background: #ddddff&lt;br /&gt;
| autoheaders = y&lt;br /&gt;
&lt;br /&gt;
| header1 = Science of Logic&lt;br /&gt;
| data2 = {{SoL divisions|{{{soldivision|}}}}}&lt;br /&gt;
&lt;br /&gt;
| header3 = Triad&lt;br /&gt;
| label4 = {{{thesislabel|}}}&lt;br /&gt;
| data4 = {{{thesis|}}}&lt;br /&gt;
| label5 = A&lt;br /&gt;
| data5 = {{{thesisa|}}}&lt;br /&gt;
| label6 = B&lt;br /&gt;
| data6 = {{{thesisb|}}}&lt;br /&gt;
| label7 = {{{antithesislabel|}}}&lt;br /&gt;
| data7 = {{{antithesis|}}}&lt;br /&gt;
| label8 = A&lt;br /&gt;
| data8 = {{{antithesisa|}}}&lt;br /&gt;
| label9 = B&lt;br /&gt;
| data9 = {{{antithesisb|}}}&lt;br /&gt;
| label10 = {{{sublationlabel|}}}&lt;br /&gt;
| data10 = {{{sublation|}}}&lt;br /&gt;
| label11 = A&lt;br /&gt;
| data11 = {{{sublationa|}}}&lt;br /&gt;
| label12 = B&lt;br /&gt;
| data12 = {{{sublationb|}}}&lt;br /&gt;
| header13 = Nav&lt;br /&gt;
| data14 = {{{prev|}}}&lt;br /&gt;
| data15 = {{{next|}}}&lt;br /&gt;
| header16 = Hegel&lt;br /&gt;
| data17 = {{Infobox | subbox = yes | headerstyle = background: #CDCDFE| header1 = Science of Logic | header2 = {{{slstart}}}-{{{slend}}} | label3 = Miller | data3 = p.{{{millerpage}}}-{{{millerend}}} | label4 = Giovanni | data4 = p.{{{giovannipage}}}-{{{giovanniend}}}}}&lt;br /&gt;
| data18 = {{Infobox | subbox = yes | headerstyle = background: #CDCDFE| header1 = Encyclopedia Logic I | header2 = §{{{subsection}}}-{{{subsectionend}}} | label3 = Wallace | data3 = p.{{{wallacepage}}}-{{{wallacepage}}} | label4 = Hackett | data4 = p.{{{hackettpage}}}-{{{hackettend}}}}}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Kcreasey</name></author>
	</entry>
	<entry>
		<id>https://hegel.kyletcreasey.me/index.php?title=Pure_Being_%E2%87%92_Becoming&amp;diff=221</id>
		<title>Pure Being ⇒ Becoming</title>
		<link rel="alternate" type="text/html" href="https://hegel.kyletcreasey.me/index.php?title=Pure_Being_%E2%87%92_Becoming&amp;diff=221"/>
		<updated>2023-11-27T23:42:33Z</updated>

		<summary type="html">&lt;p&gt;Kcreasey: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox triad&lt;br /&gt;
|soldivision=being&lt;br /&gt;
|thesislabel=Being&lt;br /&gt;
|antithesislabel=Negation&lt;br /&gt;
|sublationlabel=Sublation&lt;br /&gt;
|thesis=Pure Being&lt;br /&gt;
|antithesis=Pure Nothing&lt;br /&gt;
|sublation=Becoming&lt;br /&gt;
|sublationa=Coming-To-Be&lt;br /&gt;
|sublationb=Ceasing-To-Be&lt;br /&gt;
|next=Becoming ⇒ Determinate Being&lt;br /&gt;
|millerpage=82&lt;br /&gt;
|millerend=108&lt;br /&gt;
|giovannipage=59&lt;br /&gt;
|giovanniend=82&lt;br /&gt;
|subsection=86&lt;br /&gt;
|subsectionend=89&lt;br /&gt;
|wallacepage=124&lt;br /&gt;
|wallaceend=134&lt;br /&gt;
|hackettpage=136&lt;br /&gt;
|hackettend=146&lt;br /&gt;
|slstart=1.1.1.1.A&lt;br /&gt;
|slend=1.1.1.3&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Accents ==&lt;br /&gt;
Being is &#039;&#039;&amp;lt;u&amp;gt;pure&amp;lt;/u&amp;gt;&#039;&#039;, indeterminate &#039;&#039;&amp;lt;u&amp;gt;immediacy&amp;lt;/u&amp;gt;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Nothing is pure, &#039;&#039;&amp;lt;u&amp;gt;indeterminate&amp;lt;/u&amp;gt;&#039;&#039; immediacy.&lt;/div&gt;</summary>
		<author><name>Kcreasey</name></author>
	</entry>
	<entry>
		<id>https://hegel.kyletcreasey.me/index.php?title=Template:Infobox_triad&amp;diff=220</id>
		<title>Template:Infobox triad</title>
		<link rel="alternate" type="text/html" href="https://hegel.kyletcreasey.me/index.php?title=Template:Infobox_triad&amp;diff=220"/>
		<updated>2023-11-27T23:41:57Z</updated>

		<summary type="html">&lt;p&gt;Kcreasey: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox&lt;br /&gt;
| title = {{PAGENAME}}&lt;br /&gt;
| headerstyle = background: #ddddff&lt;br /&gt;
| autoheaders = y&lt;br /&gt;
&lt;br /&gt;
| header1 = Science of Logic&lt;br /&gt;
| data2 = {{SoL divisions|{{{soldivision|}}}}}&lt;br /&gt;
&lt;br /&gt;
| header3 = Triad&lt;br /&gt;
| label4 = {{{thesislabel|}}}&lt;br /&gt;
| data4 = {{{thesis|}}}&lt;br /&gt;
| label5 = A&lt;br /&gt;
| data5 = {{{thesisa|}}}&lt;br /&gt;
| label6 = B&lt;br /&gt;
| data6 = {{{thesisb|}}}&lt;br /&gt;
| label7 = {{{antithesislabel|}}}&lt;br /&gt;
| data7 = {{{antithesis|}}}&lt;br /&gt;
| label8 = A&lt;br /&gt;
| data8 = {{{antithesisa|}}}&lt;br /&gt;
| label9 = B&lt;br /&gt;
| data9 = {{{antithesisb|}}}&lt;br /&gt;
| label10 = {{{sublationlabel|}}}&lt;br /&gt;
| data10 = {{{sublation|}}}&lt;br /&gt;
| label11 = A&lt;br /&gt;
| data11 = {{{sublationa|}}}&lt;br /&gt;
| label12 = B&lt;br /&gt;
| data12 = {{{sublationb|}}}&lt;br /&gt;
| header13 = Nav&lt;br /&gt;
| data14 = {{{prev|}}}&lt;br /&gt;
| data15 = {{{next|}}}&lt;br /&gt;
| header16 = Hegel&lt;br /&gt;
| data17 = {{Infobox | subbox = yes | headerstyle = background: #CDCDFE| header1 = Science of Logic | header2 = {{{slstart}}}-{{{slend}}} | label3 = Miller | data3 = p.{{{millerpage}}}-{{{millerend}}} | label4 = Giovanni | data4 = p.{{{giovannipage}}}-{{{giovanniend}}}}}&lt;br /&gt;
| data18 = {{Infobox | subbox = yes | headerstyle = background: #CDCDFE| header1 = Encyclopedia Logic I | header2 = §{{{subsection}}}-{{{subsectionend}}} | label3 = Wallace | data3 = p.{{{wallacepage}}}-{{{wallacepage}}} | label4 = Hackett | data4 = p.{{{hackettpage}}}-{{{hackettend}}}}}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Kcreasey</name></author>
	</entry>
	<entry>
		<id>https://hegel.kyletcreasey.me/index.php?title=Pure_Being_%E2%87%92_Becoming&amp;diff=219</id>
		<title>Pure Being ⇒ Becoming</title>
		<link rel="alternate" type="text/html" href="https://hegel.kyletcreasey.me/index.php?title=Pure_Being_%E2%87%92_Becoming&amp;diff=219"/>
		<updated>2023-11-27T23:35:32Z</updated>

		<summary type="html">&lt;p&gt;Kcreasey: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox triad&lt;br /&gt;
|soldivision=being&lt;br /&gt;
|being=Pure Being&lt;br /&gt;
|negation=Pure Nothing&lt;br /&gt;
|sublation=Becoming&lt;br /&gt;
|sublation_a=Ceasing-To-Be&lt;br /&gt;
|sublation_b=Coming-To-Be&lt;br /&gt;
|next=Becoming ⇒ Determinate Being&lt;br /&gt;
|millerpage=82&lt;br /&gt;
|millerend=108&lt;br /&gt;
|giovannipage=59&lt;br /&gt;
|giovanniend=82&lt;br /&gt;
|subsection=86&lt;br /&gt;
|subsectionend=89&lt;br /&gt;
|wallacepage=124&lt;br /&gt;
|wallaceend=134&lt;br /&gt;
|hackettpage=136&lt;br /&gt;
|hackettend=146&lt;br /&gt;
|slstart=1.1.1.1.A&lt;br /&gt;
|slend=1.1.1.3&lt;br /&gt;
}}&lt;br /&gt;
{{Infobox triad2&lt;br /&gt;
|soldivision=being&lt;br /&gt;
|thesislabel=Being&lt;br /&gt;
|antithesislabel=Negation&lt;br /&gt;
|sublationlabel=Sublation&lt;br /&gt;
|thesis=Pure Being&lt;br /&gt;
|antithesis=Pure Nothing&lt;br /&gt;
|sublation=Becoming&lt;br /&gt;
|sublationa=Coming-To-Be&lt;br /&gt;
|sublationb=Ceasing-To-Be&lt;br /&gt;
|next=Becoming ⇒ Determinate Being&lt;br /&gt;
|millerpage=82&lt;br /&gt;
|millerend=108&lt;br /&gt;
|giovannipage=59&lt;br /&gt;
|giovanniend=82&lt;br /&gt;
|subsection=86&lt;br /&gt;
|subsectionend=89&lt;br /&gt;
|wallacepage=124&lt;br /&gt;
|wallaceend=134&lt;br /&gt;
|hackettpage=136&lt;br /&gt;
|hackettend=146&lt;br /&gt;
|slstart=1.1.1.1.A&lt;br /&gt;
|slend=1.1.1.3&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Accents ==&lt;br /&gt;
Being is &#039;&#039;&amp;lt;u&amp;gt;pure&amp;lt;/u&amp;gt;&#039;&#039;, indeterminate &#039;&#039;&amp;lt;u&amp;gt;immediacy&amp;lt;/u&amp;gt;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Nothing is pure, &#039;&#039;&amp;lt;u&amp;gt;indeterminate&amp;lt;/u&amp;gt;&#039;&#039; immediacy.&lt;/div&gt;</summary>
		<author><name>Kcreasey</name></author>
	</entry>
	<entry>
		<id>https://hegel.kyletcreasey.me/index.php?title=Template:Infobox_triad&amp;diff=218</id>
		<title>Template:Infobox triad</title>
		<link rel="alternate" type="text/html" href="https://hegel.kyletcreasey.me/index.php?title=Template:Infobox_triad&amp;diff=218"/>
		<updated>2023-11-27T23:35:01Z</updated>

		<summary type="html">&lt;p&gt;Kcreasey: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox&lt;br /&gt;
| title = {{PAGENAME}}&lt;br /&gt;
| headerstyle = background: #ddddff&lt;br /&gt;
| autoheaders = y&lt;br /&gt;
&lt;br /&gt;
| header1 = Science of Logic&lt;br /&gt;
| data2 = {{SoL divisions|{{{soldivision|}}}}}&lt;br /&gt;
&lt;br /&gt;
| header3 = Triad&lt;br /&gt;
| label4 = {{{thesislabel|}}}&lt;br /&gt;
| data4 = {{{thesis|}}}&lt;br /&gt;
| label5 = A&lt;br /&gt;
| data5 = {{{thesisa|}}}&lt;br /&gt;
| label6 = B&lt;br /&gt;
| data6 = {{{thesisb|}}}&lt;br /&gt;
| label7 = {{{antithesislabel|}}}&lt;br /&gt;
| data7 = {{{antithesis|}}}&lt;br /&gt;
| label8 = A&lt;br /&gt;
| data8 = {{{antithesisa|}}}&lt;br /&gt;
| label9 = B&lt;br /&gt;
| data9 = {{{antithesisb|}}}&lt;br /&gt;
| label10 = {{{sublationlabel|}}}&lt;br /&gt;
| data10 = {{{sublation|}}}&lt;br /&gt;
| label11 = A&lt;br /&gt;
| data11 = {{{sublationa|}}}&lt;br /&gt;
| label12 = B&lt;br /&gt;
| data12 = {{{sublationb|}}}&lt;br /&gt;
| header13 = Nav&lt;br /&gt;
| data14 = {{{prev}}}&lt;br /&gt;
| data15 = {{{next}}}&lt;br /&gt;
| header16 = Hegel&lt;br /&gt;
| data17 = {{Infobox | subbox = yes | header1 = Science of Logic | header2 = {{{slstart}}}-{{{slend}}} | label3 = Miller | data3 = p.{{{millerpage}}}={{{millerend}}} }}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Kcreasey</name></author>
	</entry>
	<entry>
		<id>https://hegel.kyletcreasey.me/index.php?title=Template:Infobox_triad&amp;diff=217</id>
		<title>Template:Infobox triad</title>
		<link rel="alternate" type="text/html" href="https://hegel.kyletcreasey.me/index.php?title=Template:Infobox_triad&amp;diff=217"/>
		<updated>2023-11-27T23:33:37Z</updated>

		<summary type="html">&lt;p&gt;Kcreasey: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox&lt;br /&gt;
| title = {{PAGENAME}}&lt;br /&gt;
| headerstyle = background: #ddddff&lt;br /&gt;
| autoheaders = y&lt;br /&gt;
&lt;br /&gt;
| header1 = Science of Logic&lt;br /&gt;
| data2 = {{SoL divisions|{{{soldivision|}}}}}&lt;br /&gt;
&lt;br /&gt;
| header3 = Triad&lt;br /&gt;
| label4 = {{{thesislabel|}}}&lt;br /&gt;
| data4 = {{{thesis|}}}&lt;br /&gt;
| label5 = A&lt;br /&gt;
| data5 = {{{thesisa|}}}&lt;br /&gt;
| label6 = B&lt;br /&gt;
| data6 = {{{thesisb|}}}&lt;br /&gt;
| label7 = {{{antithesislabel|}}}&lt;br /&gt;
| data7 = {{{antithesis|}}}&lt;br /&gt;
| label8 = A&lt;br /&gt;
| data8 = {{{antithesisa|}}}&lt;br /&gt;
| label9 = B&lt;br /&gt;
| data9 = {{{antithesisb|}}}&lt;br /&gt;
| label10 = {{{sublationlabel|}}}&lt;br /&gt;
| data10 = {{{sublation|}}}&lt;br /&gt;
| label11 = A&lt;br /&gt;
| data11 = {{{sublationa|}}}&lt;br /&gt;
| label12 = B&lt;br /&gt;
| data12 = {{{sublationb|}}}&lt;br /&gt;
| header13 = Nav&lt;br /&gt;
| data14 = {{prev}}&lt;br /&gt;
| data15 = {{next}}&lt;br /&gt;
| header16 = Hegel&lt;br /&gt;
| data17 = {{Infobox | subbox = yes | header1 = Science of Logic | header2 = {{{slstart}}}-{{{slend}}} | label3 = Miller | data3 = p.{{{millerpage}}}={{{millerend}}} }}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Kcreasey</name></author>
	</entry>
	<entry>
		<id>https://hegel.kyletcreasey.me/index.php?title=Template:Infobox_triad&amp;diff=216</id>
		<title>Template:Infobox triad</title>
		<link rel="alternate" type="text/html" href="https://hegel.kyletcreasey.me/index.php?title=Template:Infobox_triad&amp;diff=216"/>
		<updated>2023-11-27T23:27:49Z</updated>

		<summary type="html">&lt;p&gt;Kcreasey: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox&lt;br /&gt;
| title = {{PAGENAME}}&lt;br /&gt;
| headerstyle = background: #ddddff&lt;br /&gt;
| autoheaders = y&lt;br /&gt;
&lt;br /&gt;
| header1 = Science of Logic&lt;br /&gt;
| data2 = {{SoL divisions|{{{soldivision|}}}}}&lt;br /&gt;
&lt;br /&gt;
| header3 = Triad&lt;br /&gt;
| label4 = {{{thesislabel|}}}&lt;br /&gt;
| data4 = {{{thesis|}}}&lt;br /&gt;
| label5 = A&lt;br /&gt;
| data5 = {{{thesisa|}}}&lt;br /&gt;
| label6 = B&lt;br /&gt;
| data6 = {{{thesisb|}}}&lt;br /&gt;
| label7 = {{{antithesislabel|}}}&lt;br /&gt;
| data7 = {{{antithesis|}}}&lt;br /&gt;
| label8 = A&lt;br /&gt;
| data8 = {{{antithesisa|}}}&lt;br /&gt;
| label9 = B&lt;br /&gt;
| data9 = {{{antithesisb|}}}&lt;br /&gt;
| label10 = {{{sublationlabel|}}}&lt;br /&gt;
| data10 = {{{sublation|}}}&lt;br /&gt;
| label11 = A&lt;br /&gt;
| data11 = {{{sublationa|}}}&lt;br /&gt;
| label12 = B&lt;br /&gt;
| data12 = {{{sublationb|}}}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Kcreasey</name></author>
	</entry>
	<entry>
		<id>https://hegel.kyletcreasey.me/index.php?title=Template:Infobox_triad&amp;diff=215</id>
		<title>Template:Infobox triad</title>
		<link rel="alternate" type="text/html" href="https://hegel.kyletcreasey.me/index.php?title=Template:Infobox_triad&amp;diff=215"/>
		<updated>2023-11-27T23:25:14Z</updated>

		<summary type="html">&lt;p&gt;Kcreasey: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox&lt;br /&gt;
| title = {{PAGENAME}}&lt;br /&gt;
| headerstyle = background: #ddddff&lt;br /&gt;
| autoheaders = y&lt;br /&gt;
&lt;br /&gt;
| header1 = Science of Logic&lt;br /&gt;
| data2 = {{SoL divisions|{{{soldivision|}}}}}&lt;br /&gt;
&lt;br /&gt;
| header3 = Triad&lt;br /&gt;
| label4 = {{{thesislabel|}}}&lt;br /&gt;
| data4 = {{{thesis|}}}&lt;br /&gt;
| data5 = {{#if: {{{thesisa|}}} | {{Plainlist|{{{thesisa}}}| {{{thesisb|}}}}} }}&lt;br /&gt;
| label6 = {{{antithesislabel|}}}&lt;br /&gt;
| data6 = {{{antithesis|}}}&lt;br /&gt;
| data7 = {{#if: {{{anithesisa|}}} | {{Infobox | decat = yes | child = yes | datastyle=float: right | data1 = anithesisa| data2 = anithesisb}} }}&lt;br /&gt;
| label8 = {{{sublationlabel|}}}&lt;br /&gt;
| data8 = {{{sublation|}}}&lt;br /&gt;
| label10 = A&lt;br /&gt;
| data10 = {{{sublationa|}}}&lt;br /&gt;
| label11 = B&lt;br /&gt;
| data11 = {{{sublationb|}}}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Kcreasey</name></author>
	</entry>
	<entry>
		<id>https://hegel.kyletcreasey.me/index.php?title=Template:Infobox_triad&amp;diff=214</id>
		<title>Template:Infobox triad</title>
		<link rel="alternate" type="text/html" href="https://hegel.kyletcreasey.me/index.php?title=Template:Infobox_triad&amp;diff=214"/>
		<updated>2023-11-27T23:22:07Z</updated>

		<summary type="html">&lt;p&gt;Kcreasey: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox&lt;br /&gt;
| title = {{PAGENAME}}&lt;br /&gt;
| headerstyle = background: #ddddff&lt;br /&gt;
| autoheaders = y&lt;br /&gt;
&lt;br /&gt;
| header1 = Science of Logic&lt;br /&gt;
| data2 = {{SoL divisions|{{{soldivision|}}}}}&lt;br /&gt;
&lt;br /&gt;
| header3 = Triad&lt;br /&gt;
| label4 = {{{thesislabel|}}}&lt;br /&gt;
| data4 = {{{thesis|}}}&lt;br /&gt;
| data5 = {{#if: {{{thesisa|}}} | {{Plainlist|{{{thesisa}}}| {{{thesisb|}}}}} }}&lt;br /&gt;
| label6 = {{{antithesislabel|}}}&lt;br /&gt;
| data6 = {{{antithesis|}}}&lt;br /&gt;
| data7 = {{#if: {{{anithesisa|}}} | {{Infobox | decat = yes | child = yes | datastyle=float: right | data1 = anithesisa| data2 = anithesisb}} }}&lt;br /&gt;
| label8 = {{{sublationlabel|}}}&lt;br /&gt;
| data8 = {{{sublation|}}}&lt;br /&gt;
| data9 = {{#if: {{{sublationa|}}} | {{Plainlist|{{{sublationa}}}| {{{sublationb}}} }} }}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Kcreasey</name></author>
	</entry>
	<entry>
		<id>https://hegel.kyletcreasey.me/index.php?title=Template:Infobox_triad&amp;diff=213</id>
		<title>Template:Infobox triad</title>
		<link rel="alternate" type="text/html" href="https://hegel.kyletcreasey.me/index.php?title=Template:Infobox_triad&amp;diff=213"/>
		<updated>2023-11-27T23:20:26Z</updated>

		<summary type="html">&lt;p&gt;Kcreasey: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox&lt;br /&gt;
| title = {{PAGENAME}}&lt;br /&gt;
| headerstyle = background: #ddddff&lt;br /&gt;
| autoheaders = y&lt;br /&gt;
&lt;br /&gt;
| header1 = Science of Logic&lt;br /&gt;
| data2 = {{SoL divisions|{{{soldivision|}}}}}&lt;br /&gt;
&lt;br /&gt;
| header3 = Triad&lt;br /&gt;
| label4 = {{{thesislabel|}}}&lt;br /&gt;
| data4 = {{{thesis|}}}&lt;br /&gt;
| data5 = {{#if: {{{thesisa|}}} | {{Plainlist|{{{thesisa}}}| {{{thesisb|}}}}} }}&lt;br /&gt;
| label6 = {{{antithesislabel|}}}&lt;br /&gt;
| data6 = {{{antithesis|}}}&lt;br /&gt;
| data7 = {{#if: {{{anithesisa|}}} | {{Infobox | decat = yes | child = yes | datastyle=float: right | data1 = anithesisa| data2 = anithesisb}} }}&lt;br /&gt;
| label8 = {{{sublationlabel|}}}&lt;br /&gt;
| data8 = {{{sublation|}}}&lt;br /&gt;
| data9 = {{#if: {{{sublationa|}}} | {{Plainlist|{{{sublationa}}}| {{{sublationb|}}}}} }}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Kcreasey</name></author>
	</entry>
	<entry>
		<id>https://hegel.kyletcreasey.me/index.php?title=Template:Infobox_triad&amp;diff=212</id>
		<title>Template:Infobox triad</title>
		<link rel="alternate" type="text/html" href="https://hegel.kyletcreasey.me/index.php?title=Template:Infobox_triad&amp;diff=212"/>
		<updated>2023-11-27T23:20:07Z</updated>

		<summary type="html">&lt;p&gt;Kcreasey: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox&lt;br /&gt;
| title = {{PAGENAME}}&lt;br /&gt;
| headerstyle = background: #ddddff&lt;br /&gt;
| autoheaders = y&lt;br /&gt;
&lt;br /&gt;
| header1 = Science of Logic&lt;br /&gt;
| data2 = {{SoL divisions|{{{soldivision|}}}}}&lt;br /&gt;
&lt;br /&gt;
| header3 = Triad&lt;br /&gt;
| label4 = {{{thesislabel|}}}&lt;br /&gt;
| data4 = {{{thesis|}}}&lt;br /&gt;
| data5 = {{#if: {{{thesisa|}}} | {{Plainlist|{{{thesisa}}}| {{{thesisb|}}}}} }}&lt;br /&gt;
| label6 = {{{antithesislabel|}}}&lt;br /&gt;
| data6 = {{{antithesis|}}}&lt;br /&gt;
| data7 = {{#if: {{{anithesisa|}}} | {{Infobox | decat = yes | child = yes | datastyle=float: right | data1 = anithesisa| data2 = anithesisb}} }}&lt;br /&gt;
| label8 = {{{sublationlabel|}}}&lt;br /&gt;
| data8 = {{{sublation|}}}&lt;br /&gt;
| data9 = {{#if: {{{sublationa|}}} | {{Plainlist|item_style=text-align: right;|{{{sublationa}}}| {{{sublationb|}}}}} }}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Kcreasey</name></author>
	</entry>
	<entry>
		<id>https://hegel.kyletcreasey.me/index.php?title=Template:Plainlist&amp;diff=211</id>
		<title>Template:Plainlist</title>
		<link rel="alternate" type="text/html" href="https://hegel.kyletcreasey.me/index.php?title=Template:Plainlist&amp;diff=211"/>
		<updated>2023-11-27T23:19:49Z</updated>

		<summary type="html">&lt;p&gt;Kcreasey: Created page with &amp;quot;&amp;lt;templatestyles src=&amp;quot;Plainlist/styles.css&amp;quot;/&amp;gt;&amp;lt;div class=&amp;quot;plainlist {{{class|}}}&amp;quot; {{#if:{{{style|}}}{{{indent|}}}|style=&amp;quot;{{#if:{{{indent|}}}|margin-left: {{#expr:{{{indent}}}*1.6}}em;}} {{{style|}}}&amp;quot;}}&amp;gt;{{#if:{{{1|}}}| {{{1}}} &amp;lt;/div&amp;gt;}}&amp;lt;noinclude&amp;gt;&amp;lt;/div&amp;gt; {{documentation}} &amp;lt;/noinclude&amp;gt;&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;templatestyles src=&amp;quot;Plainlist/styles.css&amp;quot;/&amp;gt;&amp;lt;div class=&amp;quot;plainlist {{{class|}}}&amp;quot; {{#if:{{{style|}}}{{{indent|}}}|style=&amp;quot;{{#if:{{{indent|}}}|margin-left: {{#expr:{{{indent}}}*1.6}}em;}} {{{style|}}}&amp;quot;}}&amp;gt;{{#if:{{{1|}}}|&lt;br /&gt;
{{{1}}}&lt;br /&gt;
&amp;lt;/div&amp;gt;}}&amp;lt;noinclude&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
{{documentation}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Kcreasey</name></author>
	</entry>
	<entry>
		<id>https://hegel.kyletcreasey.me/index.php?title=Template:Infobox_triad&amp;diff=210</id>
		<title>Template:Infobox triad</title>
		<link rel="alternate" type="text/html" href="https://hegel.kyletcreasey.me/index.php?title=Template:Infobox_triad&amp;diff=210"/>
		<updated>2023-11-27T23:18:55Z</updated>

		<summary type="html">&lt;p&gt;Kcreasey: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox&lt;br /&gt;
| title = {{PAGENAME}}&lt;br /&gt;
| headerstyle = background: #ddddff&lt;br /&gt;
| autoheaders = y&lt;br /&gt;
&lt;br /&gt;
| header1 = Science of Logic&lt;br /&gt;
| data2 = {{SoL divisions|{{{soldivision|}}}}}&lt;br /&gt;
&lt;br /&gt;
| header3 = Triad&lt;br /&gt;
| label4 = {{{thesislabel|}}}&lt;br /&gt;
| data4 = {{{thesis|}}}&lt;br /&gt;
| data5 = {{#if: {{{thesisa|}}} | {{Unbulleted list|{{{thesisa}}}| {{{thesisb|}}}}} }}&lt;br /&gt;
| label6 = {{{antithesislabel|}}}&lt;br /&gt;
| data6 = {{{antithesis|}}}&lt;br /&gt;
| data7 = {{#if: {{{anithesisa|}}} | {{Infobox | decat = yes | child = yes | datastyle=float: right | data1 = anithesisa| data2 = anithesisb}} }}&lt;br /&gt;
| label8 = {{{sublationlabel|}}}&lt;br /&gt;
| data8 = {{{sublation|}}}&lt;br /&gt;
| data9 = {{#if: {{{sublationa|}}} | {{Unbulleted list|item_style=text-align: right;|{{{sublationa}}}| {{{sublationb|}}}}} }}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Kcreasey</name></author>
	</entry>
	<entry>
		<id>https://hegel.kyletcreasey.me/index.php?title=Template:Infobox_triad&amp;diff=209</id>
		<title>Template:Infobox triad</title>
		<link rel="alternate" type="text/html" href="https://hegel.kyletcreasey.me/index.php?title=Template:Infobox_triad&amp;diff=209"/>
		<updated>2023-11-27T23:17:50Z</updated>

		<summary type="html">&lt;p&gt;Kcreasey: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox&lt;br /&gt;
| title = {{PAGENAME}}&lt;br /&gt;
| headerstyle = background: #ddddff&lt;br /&gt;
| autoheaders = y&lt;br /&gt;
&lt;br /&gt;
| header1 = Science of Logic&lt;br /&gt;
| data2 = {{SoL divisions|{{{soldivision|}}}}}&lt;br /&gt;
&lt;br /&gt;
| header3 = Triad&lt;br /&gt;
| label4 = {{{thesislabel|}}}&lt;br /&gt;
| data4 = {{{thesis|}}}&lt;br /&gt;
| data5 = {{#if: {{{thesisa|}}} | {{Unbulleted list|{{{thesisa}}}| {{{thesisb|}}}}} }}&lt;br /&gt;
| label6 = {{{antithesislabel|}}}&lt;br /&gt;
| data6 = {{{antithesis|}}}&lt;br /&gt;
| data7 = {{#if: {{{anithesisa|}}} | {{Infobox | decat = yes | child = yes | datastyle=float: right | data1 = anithesisa| data2 = anithesisb}} }}&lt;br /&gt;
| label8 = {{{sublationlabel|}}}&lt;br /&gt;
| data8 = {{{sublation|}}}&lt;br /&gt;
| data9 = {{#if: {{{sublationa|}}} | {{Unbulleted list|{{{sublationa}}}| {{{sublationb|}}}}} }}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Kcreasey</name></author>
	</entry>
	<entry>
		<id>https://hegel.kyletcreasey.me/index.php?title=Template:Infobox_triad&amp;diff=208</id>
		<title>Template:Infobox triad</title>
		<link rel="alternate" type="text/html" href="https://hegel.kyletcreasey.me/index.php?title=Template:Infobox_triad&amp;diff=208"/>
		<updated>2023-11-27T23:17:05Z</updated>

		<summary type="html">&lt;p&gt;Kcreasey: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox&lt;br /&gt;
| title = {{PAGENAME}}&lt;br /&gt;
| headerstyle = background: #ddddff&lt;br /&gt;
| autoheaders = y&lt;br /&gt;
&lt;br /&gt;
| header1 = Science of Logic&lt;br /&gt;
| data2 = {{SoL divisions|{{{soldivision|}}}}}&lt;br /&gt;
&lt;br /&gt;
| header3 = Triad&lt;br /&gt;
| label4 = {{{thesislabel|}}}&lt;br /&gt;
| data4 = {{{thesis|}}}&lt;br /&gt;
| data5 = {{#if: {{{thesisa|}}} | {{Unbulleted list {{{thesisa}}}| data2 = {{{thesisb|}}}}} }}&lt;br /&gt;
| label6 = {{{antithesislabel|}}}&lt;br /&gt;
| data6 = {{{antithesis|}}}&lt;br /&gt;
| data7 = {{#if: {{{anithesisa|}}} | {{Infobox | decat = yes | child = yes | datastyle=float: right | data1 = anithesisa| data2 = anithesisb}} }}&lt;br /&gt;
| label8 = {{{sublationlabel|}}}&lt;br /&gt;
| data8 = {{{sublation|}}}&lt;br /&gt;
| data9 = {{#if: {{{sublationa|}}} | {{Unbulleted list {{{sublationa}}}| data2 = {{{sublationb|}}}}} }}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Kcreasey</name></author>
	</entry>
	<entry>
		<id>https://hegel.kyletcreasey.me/index.php?title=Template:Infobox_triad&amp;diff=207</id>
		<title>Template:Infobox triad</title>
		<link rel="alternate" type="text/html" href="https://hegel.kyletcreasey.me/index.php?title=Template:Infobox_triad&amp;diff=207"/>
		<updated>2023-11-27T23:16:35Z</updated>

		<summary type="html">&lt;p&gt;Kcreasey: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox&lt;br /&gt;
| title = {{PAGENAME}}&lt;br /&gt;
| headerstyle = background: #ddddff&lt;br /&gt;
| autoheaders = y&lt;br /&gt;
&lt;br /&gt;
| header1 = Science of Logic&lt;br /&gt;
| data2 = {{SoL divisions|{{{soldivision|}}}}}&lt;br /&gt;
&lt;br /&gt;
| header3 = Triad&lt;br /&gt;
| label4 = {{{thesislabel|}}}&lt;br /&gt;
| data4 = {{{thesis|}}}&lt;br /&gt;
| data5 = {{#if: {{{thesisa|}}} | {{Unbulleted list {{{thesisa}}}| data2 = {{{thesisb|}}}}} }}&lt;br /&gt;
| label6 = {{{antithesislabel|}}}&lt;br /&gt;
| data6 = {{{antithesis|}}}&lt;br /&gt;
| data7 = {{#if: {{{anithesisa|}}} | {{Infobox | decat = yes | child = yes | datastyle=float: right | data1 = anithesisa| data2 = anithesisb}} }}&lt;br /&gt;
| label8 = {{{sublationlabel|}}}&lt;br /&gt;
| data8 = {{{sublation|}}}&lt;br /&gt;
| data9 = {{#if: {{{thesisa|}}} | {{Unbulleted list {{{sublationa}}}| data2 = {{{sublationb|}}}}} }}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Kcreasey</name></author>
	</entry>
	<entry>
		<id>https://hegel.kyletcreasey.me/index.php?title=Template:Infobox_triad&amp;diff=206</id>
		<title>Template:Infobox triad</title>
		<link rel="alternate" type="text/html" href="https://hegel.kyletcreasey.me/index.php?title=Template:Infobox_triad&amp;diff=206"/>
		<updated>2023-11-27T23:16:13Z</updated>

		<summary type="html">&lt;p&gt;Kcreasey: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox&lt;br /&gt;
| title = {{PAGENAME}}&lt;br /&gt;
| headerstyle = background: #ddddff&lt;br /&gt;
| autoheaders = y&lt;br /&gt;
&lt;br /&gt;
| header1 = Science of Logic&lt;br /&gt;
| data2 = {{SoL divisions|{{{soldivision|}}}}}&lt;br /&gt;
&lt;br /&gt;
| header3 = Triad&lt;br /&gt;
| label4 = {{{thesislabel|}}}&lt;br /&gt;
| data4 = {{{thesis|}}}&lt;br /&gt;
| data5 = {{#if: {{{thesisa|}}} | {{Unbulleted list {{{thesisa}}}| data2 = {{{thesisb|}}}}} }}&lt;br /&gt;
| label6 = {{{antithesislabel|}}}&lt;br /&gt;
| data6 = {{{antithesis|}}}&lt;br /&gt;
| data7 = {{#if: {{{anithesisa|}}} | {{Infobox | decat = yes | child = yes | datastyle=float: right | data1 = anithesisa| data2 = anithesisb}} }}&lt;br /&gt;
| label8 = {{{sublationlabel|}}}&lt;br /&gt;
| data8 = {{{sublation|}}}&lt;br /&gt;
| data9 = {{#if: {{{sublationa|}}} | {{Infobox | decat = yes | child = yes | data1 = {{{sublationa}}}| data2 = {{{sublationb}}}}} }}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Kcreasey</name></author>
	</entry>
	<entry>
		<id>https://hegel.kyletcreasey.me/index.php?title=Module:Arguments&amp;diff=205</id>
		<title>Module:Arguments</title>
		<link rel="alternate" type="text/html" href="https://hegel.kyletcreasey.me/index.php?title=Module:Arguments&amp;diff=205"/>
		<updated>2023-11-27T23:15:33Z</updated>

		<summary type="html">&lt;p&gt;Kcreasey: Created page with &amp;quot;-- This module provides easy processing of arguments passed to Scribunto from -- #invoke. It is intended for use by other Lua modules, and should not be -- called from #invoke directly.  local libraryUtil = require(&amp;#039;libraryUtil&amp;#039;) local checkType = libraryUtil.checkType  local arguments = {}  -- Generate four different tidyVal functions, so that we don&amp;#039;t have to check the -- options every time we call it.  local function tidyValDefault(key, val) 	if type(val) == &amp;#039;string&amp;#039;...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- This module provides easy processing of arguments passed to Scribunto from&lt;br /&gt;
-- #invoke. It is intended for use by other Lua modules, and should not be&lt;br /&gt;
-- called from #invoke directly.&lt;br /&gt;
&lt;br /&gt;
local libraryUtil = require(&#039;libraryUtil&#039;)&lt;br /&gt;
local checkType = libraryUtil.checkType&lt;br /&gt;
&lt;br /&gt;
local arguments = {}&lt;br /&gt;
&lt;br /&gt;
-- Generate four different tidyVal functions, so that we don&#039;t have to check the&lt;br /&gt;
-- options every time we call it.&lt;br /&gt;
&lt;br /&gt;
local function tidyValDefault(key, val)&lt;br /&gt;
	if type(val) == &#039;string&#039; then&lt;br /&gt;
		val = val:match(&#039;^%s*(.-)%s*$&#039;)&lt;br /&gt;
		if val == &#039;&#039; then&lt;br /&gt;
			return nil&lt;br /&gt;
		else&lt;br /&gt;
			return val&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		return val&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function tidyValTrimOnly(key, val)&lt;br /&gt;
	if type(val) == &#039;string&#039; then&lt;br /&gt;
		return val:match(&#039;^%s*(.-)%s*$&#039;)&lt;br /&gt;
	else&lt;br /&gt;
		return val&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function tidyValRemoveBlanksOnly(key, val)&lt;br /&gt;
	if type(val) == &#039;string&#039; then&lt;br /&gt;
		if val:find(&#039;%S&#039;) then&lt;br /&gt;
			return val&lt;br /&gt;
		else&lt;br /&gt;
			return nil&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		return val&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function tidyValNoChange(key, val)&lt;br /&gt;
	return val&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function matchesTitle(given, title)&lt;br /&gt;
	local tp = type( given )&lt;br /&gt;
	return (tp == &#039;string&#039; or tp == &#039;number&#039;) and mw.title.new( given ).prefixedText == title&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local translate_mt = { __index = function(t, k) return k end }&lt;br /&gt;
&lt;br /&gt;
function arguments.getArgs(frame, options)&lt;br /&gt;
	checkType(&#039;getArgs&#039;, 1, frame, &#039;table&#039;, true)&lt;br /&gt;
	checkType(&#039;getArgs&#039;, 2, options, &#039;table&#039;, true)&lt;br /&gt;
	frame = frame or {}&lt;br /&gt;
	options = options or {}&lt;br /&gt;
&lt;br /&gt;
	--[[&lt;br /&gt;
	-- Set up argument translation.&lt;br /&gt;
	--]]&lt;br /&gt;
	options.translate = options.translate or {}&lt;br /&gt;
	if getmetatable(options.translate) == nil then&lt;br /&gt;
		setmetatable(options.translate, translate_mt)&lt;br /&gt;
	end&lt;br /&gt;
	if options.backtranslate == nil then&lt;br /&gt;
		options.backtranslate = {}&lt;br /&gt;
		for k,v in pairs(options.translate) do&lt;br /&gt;
			options.backtranslate[v] = k&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if options.backtranslate and getmetatable(options.backtranslate) == nil then&lt;br /&gt;
		setmetatable(options.backtranslate, {&lt;br /&gt;
			__index = function(t, k)&lt;br /&gt;
				if options.translate[k] ~= k then&lt;br /&gt;
					return nil&lt;br /&gt;
				else&lt;br /&gt;
					return k&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		})&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	--[[&lt;br /&gt;
	-- Get the argument tables. If we were passed a valid frame object, get the&lt;br /&gt;
	-- frame arguments (fargs) and the parent frame arguments (pargs), depending&lt;br /&gt;
	-- on the options set and on the parent frame&#039;s availability. If we weren&#039;t&lt;br /&gt;
	-- passed a valid frame object, we are being called from another Lua module&lt;br /&gt;
	-- or from the debug console, so assume that we were passed a table of args&lt;br /&gt;
	-- directly, and assign it to a new variable (luaArgs).&lt;br /&gt;
	--]]&lt;br /&gt;
	local fargs, pargs, luaArgs&lt;br /&gt;
	if type(frame.args) == &#039;table&#039; and type(frame.getParent) == &#039;function&#039; then&lt;br /&gt;
		if options.wrappers then&lt;br /&gt;
			--[[&lt;br /&gt;
			-- The wrappers option makes Module:Arguments look up arguments in&lt;br /&gt;
			-- either the frame argument table or the parent argument table, but&lt;br /&gt;
			-- not both. This means that users can use either the #invoke syntax&lt;br /&gt;
			-- or a wrapper template without the loss of performance associated&lt;br /&gt;
			-- with looking arguments up in both the frame and the parent frame.&lt;br /&gt;
			-- Module:Arguments will look up arguments in the parent frame&lt;br /&gt;
			-- if it finds the parent frame&#039;s title in options.wrapper;&lt;br /&gt;
			-- otherwise it will look up arguments in the frame object passed&lt;br /&gt;
			-- to getArgs.&lt;br /&gt;
			--]]&lt;br /&gt;
			local parent = frame:getParent()&lt;br /&gt;
			if not parent then&lt;br /&gt;
				fargs = frame.args&lt;br /&gt;
			else&lt;br /&gt;
				local title = parent:getTitle():gsub(&#039;/sandbox$&#039;, &#039;&#039;)&lt;br /&gt;
				local found = false&lt;br /&gt;
				if matchesTitle(options.wrappers, title) then&lt;br /&gt;
					found = true&lt;br /&gt;
				elseif type(options.wrappers) == &#039;table&#039; then&lt;br /&gt;
					for _,v in pairs(options.wrappers) do&lt;br /&gt;
						if matchesTitle(v, title) then&lt;br /&gt;
							found = true&lt;br /&gt;
							break&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
&lt;br /&gt;
				-- We test for false specifically here so that nil (the default) acts like true.&lt;br /&gt;
				if found or options.frameOnly == false then&lt;br /&gt;
					pargs = parent.args&lt;br /&gt;
				end&lt;br /&gt;
				if not found or options.parentOnly == false then&lt;br /&gt;
					fargs = frame.args&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			-- options.wrapper isn&#039;t set, so check the other options.&lt;br /&gt;
			if not options.parentOnly then&lt;br /&gt;
				fargs = frame.args&lt;br /&gt;
			end&lt;br /&gt;
			if not options.frameOnly then&lt;br /&gt;
				local parent = frame:getParent()&lt;br /&gt;
				pargs = parent and parent.args or nil&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if options.parentFirst then&lt;br /&gt;
			fargs, pargs = pargs, fargs&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		luaArgs = frame&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Set the order of precedence of the argument tables. If the variables are&lt;br /&gt;
	-- nil, nothing will be added to the table, which is how we avoid clashes&lt;br /&gt;
	-- between the frame/parent args and the Lua args.&lt;br /&gt;
	local argTables = {fargs}&lt;br /&gt;
	argTables[#argTables + 1] = pargs&lt;br /&gt;
	argTables[#argTables + 1] = luaArgs&lt;br /&gt;
&lt;br /&gt;
	--[[&lt;br /&gt;
	-- Generate the tidyVal function. If it has been specified by the user, we&lt;br /&gt;
	-- use that; if not, we choose one of four functions depending on the&lt;br /&gt;
	-- options chosen. This is so that we don&#039;t have to call the options table&lt;br /&gt;
	-- every time the function is called.&lt;br /&gt;
	--]]&lt;br /&gt;
	local tidyVal = options.valueFunc&lt;br /&gt;
	if tidyVal then&lt;br /&gt;
		if type(tidyVal) ~= &#039;function&#039; then&lt;br /&gt;
			error(&lt;br /&gt;
				&amp;quot;bad value assigned to option &#039;valueFunc&#039;&amp;quot;&lt;br /&gt;
					.. &#039;(function expected, got &#039;&lt;br /&gt;
					.. type(tidyVal)&lt;br /&gt;
					.. &#039;)&#039;,&lt;br /&gt;
				2&lt;br /&gt;
			)&lt;br /&gt;
		end&lt;br /&gt;
	elseif options.trim ~= false then&lt;br /&gt;
		if options.removeBlanks ~= false then&lt;br /&gt;
			tidyVal = tidyValDefault&lt;br /&gt;
		else&lt;br /&gt;
			tidyVal = tidyValTrimOnly&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		if options.removeBlanks ~= false then&lt;br /&gt;
			tidyVal = tidyValRemoveBlanksOnly&lt;br /&gt;
		else&lt;br /&gt;
			tidyVal = tidyValNoChange&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	--[[&lt;br /&gt;
	-- Set up the args, metaArgs and nilArgs tables. args will be the one&lt;br /&gt;
	-- accessed from functions, and metaArgs will hold the actual arguments. Nil&lt;br /&gt;
	-- arguments are memoized in nilArgs, and the metatable connects all of them&lt;br /&gt;
	-- together.&lt;br /&gt;
	--]]&lt;br /&gt;
	local args, metaArgs, nilArgs, metatable = {}, {}, {}, {}&lt;br /&gt;
	setmetatable(args, metatable)&lt;br /&gt;
&lt;br /&gt;
	local function mergeArgs(tables)&lt;br /&gt;
		--[[&lt;br /&gt;
		-- Accepts multiple tables as input and merges their keys and values&lt;br /&gt;
		-- into one table. If a value is already present it is not overwritten;&lt;br /&gt;
		-- tables listed earlier have precedence. We are also memoizing nil&lt;br /&gt;
		-- values, which can be overwritten if they are &#039;s&#039; (soft).&lt;br /&gt;
		--]]&lt;br /&gt;
		for _, t in ipairs(tables) do&lt;br /&gt;
			for key, val in pairs(t) do&lt;br /&gt;
				if metaArgs[key] == nil and nilArgs[key] ~= &#039;h&#039; then&lt;br /&gt;
					local tidiedVal = tidyVal(key, val)&lt;br /&gt;
					if tidiedVal == nil then&lt;br /&gt;
						nilArgs[key] = &#039;s&#039;&lt;br /&gt;
					else&lt;br /&gt;
						metaArgs[key] = tidiedVal&lt;br /&gt;
					end&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;
	-- Define metatable behaviour. Arguments are memoized in the metaArgs table,&lt;br /&gt;
	-- and are only fetched from the argument tables once. Fetching arguments&lt;br /&gt;
	-- from the argument tables is the most resource-intensive step in this&lt;br /&gt;
	-- module, so we try and avoid it where possible. For this reason, nil&lt;br /&gt;
	-- arguments are also memoized, in the nilArgs table. Also, we keep a record&lt;br /&gt;
	-- in the metatable of when pairs and ipairs have been called, so we do not&lt;br /&gt;
	-- run pairs and ipairs on the argument tables more than once. We also do&lt;br /&gt;
	-- not run ipairs on fargs and pargs if pairs has already been run, as all&lt;br /&gt;
	-- the arguments will already have been copied over.&lt;br /&gt;
	--]]&lt;br /&gt;
&lt;br /&gt;
	metatable.__index = function (t, key)&lt;br /&gt;
		--[[&lt;br /&gt;
		-- Fetches an argument when the args table is indexed. First we check&lt;br /&gt;
		-- to see if the value is memoized, and if not we try and fetch it from&lt;br /&gt;
		-- the argument tables. When we check memoization, we need to check&lt;br /&gt;
		-- metaArgs before nilArgs, as both can be non-nil at the same time.&lt;br /&gt;
		-- If the argument is not present in metaArgs, we also check whether&lt;br /&gt;
		-- pairs has been run yet. If pairs has already been run, we return nil.&lt;br /&gt;
		-- This is because all the arguments will have already been copied into&lt;br /&gt;
		-- metaArgs by the mergeArgs function, meaning that any other arguments&lt;br /&gt;
		-- must be nil.&lt;br /&gt;
		--]]&lt;br /&gt;
		if type(key) == &#039;string&#039; then&lt;br /&gt;
			key = options.translate[key]&lt;br /&gt;
		end&lt;br /&gt;
		local val = metaArgs[key]&lt;br /&gt;
		if val ~= nil then&lt;br /&gt;
			return val&lt;br /&gt;
		elseif metatable.donePairs or nilArgs[key] then&lt;br /&gt;
			return nil&lt;br /&gt;
		end&lt;br /&gt;
		for _, argTable in ipairs(argTables) do&lt;br /&gt;
			local argTableVal = tidyVal(key, argTable[key])&lt;br /&gt;
			if argTableVal ~= nil then&lt;br /&gt;
				metaArgs[key] = argTableVal&lt;br /&gt;
				return argTableVal&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		nilArgs[key] = &#039;h&#039;&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	metatable.__newindex = function (t, key, val)&lt;br /&gt;
		-- This function is called when a module tries to add a new value to the&lt;br /&gt;
		-- args table, or tries to change an existing value.&lt;br /&gt;
		if type(key) == &#039;string&#039; then&lt;br /&gt;
			key = options.translate[key]&lt;br /&gt;
		end&lt;br /&gt;
		if options.readOnly then&lt;br /&gt;
			error(&lt;br /&gt;
				&#039;could not write to argument table key &amp;quot;&#039;&lt;br /&gt;
					.. tostring(key)&lt;br /&gt;
					.. &#039;&amp;quot;; the table is read-only&#039;,&lt;br /&gt;
				2&lt;br /&gt;
			)&lt;br /&gt;
		elseif options.noOverwrite and args[key] ~= nil then&lt;br /&gt;
			error(&lt;br /&gt;
				&#039;could not write to argument table key &amp;quot;&#039;&lt;br /&gt;
					.. tostring(key)&lt;br /&gt;
					.. &#039;&amp;quot;; overwriting existing arguments is not permitted&#039;,&lt;br /&gt;
				2&lt;br /&gt;
			)&lt;br /&gt;
		elseif val == nil then&lt;br /&gt;
			--[[&lt;br /&gt;
			-- If the argument is to be overwritten with nil, we need to erase&lt;br /&gt;
			-- the value in metaArgs, so that __index, __pairs and __ipairs do&lt;br /&gt;
			-- not use a previous existing value, if present; and we also need&lt;br /&gt;
			-- to memoize the nil in nilArgs, so that the value isn&#039;t looked&lt;br /&gt;
			-- up in the argument tables if it is accessed again.&lt;br /&gt;
			--]]&lt;br /&gt;
			metaArgs[key] = nil&lt;br /&gt;
			nilArgs[key] = &#039;h&#039;&lt;br /&gt;
		else&lt;br /&gt;
			metaArgs[key] = val&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function translatenext(invariant)&lt;br /&gt;
		local k, v = next(invariant.t, invariant.k)&lt;br /&gt;
		invariant.k = k&lt;br /&gt;
		if k == nil then&lt;br /&gt;
			return nil&lt;br /&gt;
		elseif type(k) ~= &#039;string&#039; or not options.backtranslate then&lt;br /&gt;
			return k, v&lt;br /&gt;
		else&lt;br /&gt;
			local backtranslate = options.backtranslate[k]&lt;br /&gt;
			if backtranslate == nil then&lt;br /&gt;
				-- Skip this one. This is a tail call, so this won&#039;t cause stack overflow&lt;br /&gt;
				return translatenext(invariant)&lt;br /&gt;
			else&lt;br /&gt;
				return backtranslate, v&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	metatable.__pairs = function ()&lt;br /&gt;
		-- Called when pairs is run on the args table.&lt;br /&gt;
		if not metatable.donePairs then&lt;br /&gt;
			mergeArgs(argTables)&lt;br /&gt;
			metatable.donePairs = true&lt;br /&gt;
		end&lt;br /&gt;
		return translatenext, { t = metaArgs }&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function inext(t, i)&lt;br /&gt;
		-- This uses our __index metamethod&lt;br /&gt;
		local v = t[i + 1]&lt;br /&gt;
		if v ~= nil then&lt;br /&gt;
			return i + 1, v&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	metatable.__ipairs = function (t)&lt;br /&gt;
		-- Called when ipairs is run on the args table.&lt;br /&gt;
		return inext, t, 0&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return args&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return arguments&lt;/div&gt;</summary>
		<author><name>Kcreasey</name></author>
	</entry>
	<entry>
		<id>https://hegel.kyletcreasey.me/index.php?title=Module:TableTools&amp;diff=204</id>
		<title>Module:TableTools</title>
		<link rel="alternate" type="text/html" href="https://hegel.kyletcreasey.me/index.php?title=Module:TableTools&amp;diff=204"/>
		<updated>2023-11-27T23:14:52Z</updated>

		<summary type="html">&lt;p&gt;Kcreasey: Created page with &amp;quot;------------------------------------------------------------------------------------ --                                   TableTools                                   -- --                                                                                -- -- This module includes a number of functions for dealing with Lua tables.        -- -- It is a meta-module, meant to be called from other Lua modules, and should not -- -- be called directly from #invoke....&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;------------------------------------------------------------------------------------&lt;br /&gt;
--                                   TableTools                                   --&lt;br /&gt;
--                                                                                --&lt;br /&gt;
-- This module includes a number of functions for dealing with Lua tables.        --&lt;br /&gt;
-- It is a meta-module, meant to be called from other Lua modules, and should not --&lt;br /&gt;
-- be called directly from #invoke.                                               --&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local libraryUtil = require(&#039;libraryUtil&#039;)&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
-- Define often-used variables and functions.&lt;br /&gt;
local floor = math.floor&lt;br /&gt;
local infinity = math.huge&lt;br /&gt;
local checkType = libraryUtil.checkType&lt;br /&gt;
local checkTypeMulti = libraryUtil.checkTypeMulti&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- isPositiveInteger&lt;br /&gt;
--&lt;br /&gt;
-- This function returns true if the given value is a positive integer, and false&lt;br /&gt;
-- if not. Although it doesn&#039;t operate on tables, it is included here as it is&lt;br /&gt;
-- useful for determining whether a given table key is in the array part or the&lt;br /&gt;
-- hash part of a table.&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
function p.isPositiveInteger(v)&lt;br /&gt;
	return type(v) == &#039;number&#039; and v &amp;gt;= 1 and floor(v) == v and v &amp;lt; infinity&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- isNan&lt;br /&gt;
--&lt;br /&gt;
-- This function returns true if the given number is a NaN value, and false if&lt;br /&gt;
-- not. Although it doesn&#039;t operate on tables, it is included here as it is useful&lt;br /&gt;
-- for determining whether a value can be a valid table key. Lua will generate an&lt;br /&gt;
-- error if a NaN is used as a table key.&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
function p.isNan(v)&lt;br /&gt;
	return type(v) == &#039;number&#039; and v ~= v&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- shallowClone&lt;br /&gt;
--&lt;br /&gt;
-- This returns a clone of a table. The value returned is a new table, but all&lt;br /&gt;
-- subtables and functions are shared. Metamethods are respected, but the returned&lt;br /&gt;
-- table will have no metatable of its own.&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
function p.shallowClone(t)&lt;br /&gt;
	checkType(&#039;shallowClone&#039;, 1, t, &#039;table&#039;)&lt;br /&gt;
	local ret = {}&lt;br /&gt;
	for k, v in pairs(t) do&lt;br /&gt;
		ret[k] = v&lt;br /&gt;
	end&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- removeDuplicates&lt;br /&gt;
--&lt;br /&gt;
-- This removes duplicate values from an array. Non-positive-integer keys are&lt;br /&gt;
-- ignored. The earliest value is kept, and all subsequent duplicate values are&lt;br /&gt;
-- removed, but otherwise the array order is unchanged.&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
function p.removeDuplicates(arr)&lt;br /&gt;
	checkType(&#039;removeDuplicates&#039;, 1, arr, &#039;table&#039;)&lt;br /&gt;
	local isNan = p.isNan&lt;br /&gt;
	local ret, exists = {}, {}&lt;br /&gt;
	for _, v in ipairs(arr) do&lt;br /&gt;
		if isNan(v) then&lt;br /&gt;
			-- NaNs can&#039;t be table keys, and they are also unique, so we don&#039;t need to check existence.&lt;br /&gt;
			ret[#ret + 1] = v&lt;br /&gt;
		else&lt;br /&gt;
			if not exists[v] then&lt;br /&gt;
				ret[#ret + 1] = v&lt;br /&gt;
				exists[v] = true&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- numKeys&lt;br /&gt;
--&lt;br /&gt;
-- This takes a table and returns an array containing the numbers of any numerical&lt;br /&gt;
-- keys that have non-nil values, sorted in numerical order.&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
function p.numKeys(t)&lt;br /&gt;
	checkType(&#039;numKeys&#039;, 1, t, &#039;table&#039;)&lt;br /&gt;
	local isPositiveInteger = p.isPositiveInteger&lt;br /&gt;
	local nums = {}&lt;br /&gt;
	for k in pairs(t) do&lt;br /&gt;
		if isPositiveInteger(k) then&lt;br /&gt;
			nums[#nums + 1] = k&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	table.sort(nums)&lt;br /&gt;
	return nums&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- affixNums&lt;br /&gt;
--&lt;br /&gt;
-- This takes a table and returns an array containing the numbers of keys with the&lt;br /&gt;
-- specified prefix and suffix. For example, for the table&lt;br /&gt;
-- {a1 = &#039;foo&#039;, a3 = &#039;bar&#039;, a6 = &#039;baz&#039;} and the prefix &amp;quot;a&amp;quot;, affixNums will return&lt;br /&gt;
-- {1, 3, 6}.&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
function p.affixNums(t, prefix, suffix)&lt;br /&gt;
	checkType(&#039;affixNums&#039;, 1, t, &#039;table&#039;)&lt;br /&gt;
	checkType(&#039;affixNums&#039;, 2, prefix, &#039;string&#039;, true)&lt;br /&gt;
	checkType(&#039;affixNums&#039;, 3, suffix, &#039;string&#039;, true)&lt;br /&gt;
&lt;br /&gt;
	local function cleanPattern(s)&lt;br /&gt;
		-- Cleans a pattern so that the magic characters ()%.[]*+-?^$ are interpreted literally.&lt;br /&gt;
		return s:gsub(&#039;([%(%)%%%.%[%]%*%+%-%?%^%$])&#039;, &#039;%%%1&#039;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	prefix = prefix or &#039;&#039;&lt;br /&gt;
	suffix = suffix or &#039;&#039;&lt;br /&gt;
	prefix = cleanPattern(prefix)&lt;br /&gt;
	suffix = cleanPattern(suffix)&lt;br /&gt;
	local pattern = &#039;^&#039; .. prefix .. &#039;([1-9]%d*)&#039; .. suffix .. &#039;$&#039;&lt;br /&gt;
&lt;br /&gt;
	local nums = {}&lt;br /&gt;
	for k in pairs(t) do&lt;br /&gt;
		if type(k) == &#039;string&#039; then&lt;br /&gt;
			local num = mw.ustring.match(k, pattern)&lt;br /&gt;
			if num then&lt;br /&gt;
				nums[#nums + 1] = tonumber(num)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	table.sort(nums)&lt;br /&gt;
	return nums&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- numData&lt;br /&gt;
--&lt;br /&gt;
-- Given a table with keys like {&amp;quot;foo1&amp;quot;, &amp;quot;bar1&amp;quot;, &amp;quot;foo2&amp;quot;, &amp;quot;baz2&amp;quot;}, returns a table&lt;br /&gt;
-- of subtables in the format&lt;br /&gt;
-- {[1] = {foo = &#039;text&#039;, bar = &#039;text&#039;}, [2] = {foo = &#039;text&#039;, baz = &#039;text&#039;}}.&lt;br /&gt;
-- Keys that don&#039;t end with an integer are stored in a subtable named &amp;quot;other&amp;quot;. The&lt;br /&gt;
-- compress option compresses the table so that it can be iterated over with&lt;br /&gt;
-- ipairs.&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
function p.numData(t, compress)&lt;br /&gt;
	checkType(&#039;numData&#039;, 1, t, &#039;table&#039;)&lt;br /&gt;
	checkType(&#039;numData&#039;, 2, compress, &#039;boolean&#039;, true)&lt;br /&gt;
	local ret = {}&lt;br /&gt;
	for k, v in pairs(t) do&lt;br /&gt;
		local prefix, num = mw.ustring.match(tostring(k), &#039;^([^0-9]*)([1-9][0-9]*)$&#039;)&lt;br /&gt;
		if num then&lt;br /&gt;
			num = tonumber(num)&lt;br /&gt;
			local subtable = ret[num] or {}&lt;br /&gt;
			if prefix == &#039;&#039; then&lt;br /&gt;
				-- Positional parameters match the blank string; put them at the start of the subtable instead.&lt;br /&gt;
				prefix = 1&lt;br /&gt;
			end&lt;br /&gt;
			subtable[prefix] = v&lt;br /&gt;
			ret[num] = subtable&lt;br /&gt;
		else&lt;br /&gt;
			local subtable = ret.other or {}&lt;br /&gt;
			subtable[k] = v&lt;br /&gt;
			ret.other = subtable&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if compress then&lt;br /&gt;
		local other = ret.other&lt;br /&gt;
		ret = p.compressSparseArray(ret)&lt;br /&gt;
		ret.other = other&lt;br /&gt;
	end&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- compressSparseArray&lt;br /&gt;
--&lt;br /&gt;
-- This takes an array with one or more nil values, and removes the nil values&lt;br /&gt;
-- while preserving the order, so that the array can be safely traversed with&lt;br /&gt;
-- ipairs.&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
function p.compressSparseArray(t)&lt;br /&gt;
	checkType(&#039;compressSparseArray&#039;, 1, t, &#039;table&#039;)&lt;br /&gt;
	local ret = {}&lt;br /&gt;
	local nums = p.numKeys(t)&lt;br /&gt;
	for _, num in ipairs(nums) do&lt;br /&gt;
		ret[#ret + 1] = t[num]&lt;br /&gt;
	end&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- sparseIpairs&lt;br /&gt;
--&lt;br /&gt;
-- This is an iterator for sparse arrays. It can be used like ipairs, but can&lt;br /&gt;
-- handle nil values.&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
function p.sparseIpairs(t)&lt;br /&gt;
	checkType(&#039;sparseIpairs&#039;, 1, t, &#039;table&#039;)&lt;br /&gt;
	local nums = p.numKeys(t)&lt;br /&gt;
	local i = 0&lt;br /&gt;
	local lim = #nums&lt;br /&gt;
	return function ()&lt;br /&gt;
		i = i + 1&lt;br /&gt;
		if i &amp;lt;= lim then&lt;br /&gt;
			local key = nums[i]&lt;br /&gt;
			return key, t[key]&lt;br /&gt;
		else&lt;br /&gt;
			return nil, nil&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- size&lt;br /&gt;
--&lt;br /&gt;
-- This returns the size of a key/value pair table. It will also work on arrays,&lt;br /&gt;
-- but for arrays it is more efficient to use the # operator.&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
function p.size(t)&lt;br /&gt;
	checkType(&#039;size&#039;, 1, t, &#039;table&#039;)&lt;br /&gt;
	local i = 0&lt;br /&gt;
	for _ in pairs(t) do&lt;br /&gt;
		i = i + 1&lt;br /&gt;
	end&lt;br /&gt;
	return i&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function defaultKeySort(item1, item2)&lt;br /&gt;
	-- &amp;quot;number&amp;quot; &amp;lt; &amp;quot;string&amp;quot;, so numbers will be sorted before strings.&lt;br /&gt;
	local type1, type2 = type(item1), type(item2)&lt;br /&gt;
	if type1 ~= type2 then&lt;br /&gt;
		return type1 &amp;lt; type2&lt;br /&gt;
	elseif type1 == &#039;table&#039; or type1 == &#039;boolean&#039; or type1 == &#039;function&#039; then&lt;br /&gt;
		return tostring(item1) &amp;lt; tostring(item2)&lt;br /&gt;
	else&lt;br /&gt;
		return item1 &amp;lt; item2&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- keysToList&lt;br /&gt;
--&lt;br /&gt;
-- Returns an array of the keys in a table, sorted using either a default&lt;br /&gt;
-- comparison function or a custom keySort function.&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
function p.keysToList(t, keySort, checked)&lt;br /&gt;
	if not checked then&lt;br /&gt;
		checkType(&#039;keysToList&#039;, 1, t, &#039;table&#039;)&lt;br /&gt;
		checkTypeMulti(&#039;keysToList&#039;, 2, keySort, {&#039;function&#039;, &#039;boolean&#039;, &#039;nil&#039;})&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local arr = {}&lt;br /&gt;
	local index = 1&lt;br /&gt;
	for k in pairs(t) do&lt;br /&gt;
		arr[index] = k&lt;br /&gt;
		index = index + 1&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if keySort ~= false then&lt;br /&gt;
		keySort = type(keySort) == &#039;function&#039; and keySort or defaultKeySort&lt;br /&gt;
		table.sort(arr, keySort)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return arr&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- sortedPairs&lt;br /&gt;
--&lt;br /&gt;
-- Iterates through a table, with the keys sorted using the keysToList function.&lt;br /&gt;
-- If there are only numerical keys, sparseIpairs is probably more efficient.&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
function p.sortedPairs(t, keySort)&lt;br /&gt;
	checkType(&#039;sortedPairs&#039;, 1, t, &#039;table&#039;)&lt;br /&gt;
	checkType(&#039;sortedPairs&#039;, 2, keySort, &#039;function&#039;, true)&lt;br /&gt;
&lt;br /&gt;
	local arr = p.keysToList(t, keySort, true)&lt;br /&gt;
&lt;br /&gt;
	local i = 0&lt;br /&gt;
	return function ()&lt;br /&gt;
		i = i + 1&lt;br /&gt;
		local key = arr[i]&lt;br /&gt;
		if key ~= nil then&lt;br /&gt;
			return key, t[key]&lt;br /&gt;
		else&lt;br /&gt;
			return nil, nil&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- isArray&lt;br /&gt;
--&lt;br /&gt;
-- Returns true if the given value is a table and all keys are consecutive&lt;br /&gt;
-- integers starting at 1.&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
function p.isArray(v)&lt;br /&gt;
	if type(v) ~= &#039;table&#039; then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	local i = 0&lt;br /&gt;
	for _ in pairs(v) do&lt;br /&gt;
		i = i + 1&lt;br /&gt;
		if v[i] == nil then&lt;br /&gt;
			return false&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- isArrayLike&lt;br /&gt;
--&lt;br /&gt;
-- Returns true if the given value is iterable and all keys are consecutive&lt;br /&gt;
-- integers starting at 1.&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
function p.isArrayLike(v)&lt;br /&gt;
	if not pcall(pairs, v) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	local i = 0&lt;br /&gt;
	for _ in pairs(v) do&lt;br /&gt;
		i = i + 1&lt;br /&gt;
		if v[i] == nil then&lt;br /&gt;
			return false&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- invert&lt;br /&gt;
--&lt;br /&gt;
-- Transposes the keys and values in an array. For example, {&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;} -&amp;gt;&lt;br /&gt;
-- {a = 1, b = 2, c = 3}. Duplicates are not supported (result values refer to&lt;br /&gt;
-- the index of the last duplicate) and NaN values are ignored.&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
function p.invert(arr)&lt;br /&gt;
	checkType(&amp;quot;invert&amp;quot;, 1, arr, &amp;quot;table&amp;quot;)&lt;br /&gt;
	local isNan = p.isNan&lt;br /&gt;
	local map = {}&lt;br /&gt;
	for i, v in ipairs(arr) do&lt;br /&gt;
		if not isNan(v) then&lt;br /&gt;
			map[v] = i&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return map&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- listToSet&lt;br /&gt;
--&lt;br /&gt;
-- Creates a set from the array part of the table. Indexing the set by any of the&lt;br /&gt;
-- values of the array returns true. For example, {&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;} -&amp;gt;&lt;br /&gt;
-- {a = true, b = true, c = true}. NaN values are ignored as Lua considers them&lt;br /&gt;
-- never equal to any value (including other NaNs or even themselves).&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
function p.listToSet(arr)&lt;br /&gt;
	checkType(&amp;quot;listToSet&amp;quot;, 1, arr, &amp;quot;table&amp;quot;)&lt;br /&gt;
	local isNan = p.isNan&lt;br /&gt;
	local set = {}&lt;br /&gt;
	for _, v in ipairs(arr) do&lt;br /&gt;
		if not isNan(v) then&lt;br /&gt;
			set[v] = true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return set&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- deepCopy&lt;br /&gt;
--&lt;br /&gt;
-- Recursive deep copy function. Preserves identities of subtables.&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
local function _deepCopy(orig, includeMetatable, already_seen)&lt;br /&gt;
	-- Stores copies of tables indexed by the original table.&lt;br /&gt;
	already_seen = already_seen or {}&lt;br /&gt;
&lt;br /&gt;
	local copy = already_seen[orig]&lt;br /&gt;
	if copy ~= nil then&lt;br /&gt;
		return copy&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if type(orig) == &#039;table&#039; then&lt;br /&gt;
		copy = {}&lt;br /&gt;
		for orig_key, orig_value in pairs(orig) do&lt;br /&gt;
			copy[_deepCopy(orig_key, includeMetatable, already_seen)] = _deepCopy(orig_value, includeMetatable, already_seen)&lt;br /&gt;
		end&lt;br /&gt;
		already_seen[orig] = copy&lt;br /&gt;
&lt;br /&gt;
		if includeMetatable then&lt;br /&gt;
			local mt = getmetatable(orig)&lt;br /&gt;
			if mt ~= nil then&lt;br /&gt;
				local mt_copy = _deepCopy(mt, includeMetatable, already_seen)&lt;br /&gt;
				setmetatable(copy, mt_copy)&lt;br /&gt;
				already_seen[mt] = mt_copy&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	else -- number, string, boolean, etc&lt;br /&gt;
		copy = orig&lt;br /&gt;
	end&lt;br /&gt;
	return copy&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.deepCopy(orig, noMetatable, already_seen)&lt;br /&gt;
	checkType(&amp;quot;deepCopy&amp;quot;, 3, already_seen, &amp;quot;table&amp;quot;, true)&lt;br /&gt;
	return _deepCopy(orig, not noMetatable, already_seen)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- sparseConcat&lt;br /&gt;
--&lt;br /&gt;
-- Concatenates all values in the table that are indexed by a number, in order.&lt;br /&gt;
-- sparseConcat{a, nil, c, d}  =&amp;gt;  &amp;quot;acd&amp;quot;&lt;br /&gt;
-- sparseConcat{nil, b, c, d}  =&amp;gt;  &amp;quot;bcd&amp;quot;&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
function p.sparseConcat(t, sep, i, j)&lt;br /&gt;
	local arr = {}&lt;br /&gt;
&lt;br /&gt;
	local arr_i = 0&lt;br /&gt;
	for _, v in p.sparseIpairs(t) do&lt;br /&gt;
		arr_i = arr_i + 1&lt;br /&gt;
		arr[arr_i] = v&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return table.concat(arr, sep, i, j)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- length&lt;br /&gt;
--&lt;br /&gt;
-- Finds the length of an array, or of a quasi-array with keys such as &amp;quot;data1&amp;quot;,&lt;br /&gt;
-- &amp;quot;data2&amp;quot;, etc., using an exponential search algorithm. It is similar to the&lt;br /&gt;
-- operator #, but may return a different value when there are gaps in the array&lt;br /&gt;
-- portion of the table. Intended to be used on data loaded with mw.loadData. For&lt;br /&gt;
-- other tables, use #.&lt;br /&gt;
-- Note: #frame.args in frame object always be set to 0, regardless of  the number&lt;br /&gt;
-- of unnamed template parameters, so use this function for frame.args.&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
function p.length(t, prefix)&lt;br /&gt;
	-- requiring module inline so that [[Module:Exponential search]] which is&lt;br /&gt;
	-- only needed by this one function doesn&#039;t get millions of transclusions&lt;br /&gt;
	local expSearch = require(&amp;quot;Module:Exponential search&amp;quot;)&lt;br /&gt;
	checkType(&#039;length&#039;, 1, t, &#039;table&#039;)&lt;br /&gt;
	checkType(&#039;length&#039;, 2, prefix, &#039;string&#039;, true)&lt;br /&gt;
	return expSearch(function (i)&lt;br /&gt;
		local key&lt;br /&gt;
		if prefix then&lt;br /&gt;
			key = prefix .. tostring(i)&lt;br /&gt;
		else&lt;br /&gt;
			key = i&lt;br /&gt;
		end&lt;br /&gt;
		return t[key] ~= nil&lt;br /&gt;
	end) or 0&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- inArray&lt;br /&gt;
--&lt;br /&gt;
-- Returns true if valueToFind is a member of the array, and false otherwise.&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
function p.inArray(arr, valueToFind)&lt;br /&gt;
	checkType(&amp;quot;inArray&amp;quot;, 1, arr, &amp;quot;table&amp;quot;)&lt;br /&gt;
	-- if valueToFind is nil, error?&lt;br /&gt;
&lt;br /&gt;
	for _, v in ipairs(arr) do&lt;br /&gt;
		if v == valueToFind then&lt;br /&gt;
			return true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Kcreasey</name></author>
	</entry>
	<entry>
		<id>https://hegel.kyletcreasey.me/index.php?title=Module:List&amp;diff=203</id>
		<title>Module:List</title>
		<link rel="alternate" type="text/html" href="https://hegel.kyletcreasey.me/index.php?title=Module:List&amp;diff=203"/>
		<updated>2023-11-27T23:14:10Z</updated>

		<summary type="html">&lt;p&gt;Kcreasey: Created page with &amp;quot;local libUtil = require(&amp;#039;libraryUtil&amp;#039;) local checkType = libUtil.checkType local mTableTools = require(&amp;#039;Module:TableTools&amp;#039;)  local p = {}  local listTypes = { 	[&amp;#039;bulleted&amp;#039;] = true, 	[&amp;#039;unbulleted&amp;#039;] = true, 	[&amp;#039;horizontal&amp;#039;] = true, 	[&amp;#039;ordered&amp;#039;] = true, 	[&amp;#039;horizontal_ordered&amp;#039;] = true }  function p.makeListData(listType, args) 	-- Constructs a data table to be passed to p.renderList. 	local data = {}  	-- Classes and TemplateStyles 	data.classes = {} 	data.templatestyles = &amp;#039;&amp;#039;...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local libUtil = require(&#039;libraryUtil&#039;)&lt;br /&gt;
local checkType = libUtil.checkType&lt;br /&gt;
local mTableTools = require(&#039;Module:TableTools&#039;)&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
local listTypes = {&lt;br /&gt;
	[&#039;bulleted&#039;] = true,&lt;br /&gt;
	[&#039;unbulleted&#039;] = true,&lt;br /&gt;
	[&#039;horizontal&#039;] = true,&lt;br /&gt;
	[&#039;ordered&#039;] = true,&lt;br /&gt;
	[&#039;horizontal_ordered&#039;] = true&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function p.makeListData(listType, args)&lt;br /&gt;
	-- Constructs a data table to be passed to p.renderList.&lt;br /&gt;
	local data = {}&lt;br /&gt;
&lt;br /&gt;
	-- Classes and TemplateStyles&lt;br /&gt;
	data.classes = {}&lt;br /&gt;
	data.templatestyles = &#039;&#039;&lt;br /&gt;
	if listType == &#039;horizontal&#039; or listType == &#039;horizontal_ordered&#039; then&lt;br /&gt;
		table.insert(data.classes, &#039;hlist&#039;)&lt;br /&gt;
		data.templatestyles = mw.getCurrentFrame():extensionTag{&lt;br /&gt;
			name = &#039;templatestyles&#039;, args = { src = &#039;Hlist/styles.css&#039; }&lt;br /&gt;
		}&lt;br /&gt;
	elseif listType == &#039;unbulleted&#039; then&lt;br /&gt;
		table.insert(data.classes, &#039;plainlist&#039;)&lt;br /&gt;
		data.templatestyles = mw.getCurrentFrame():extensionTag{&lt;br /&gt;
			name = &#039;templatestyles&#039;, args = { src = &#039;Plainlist/styles.css&#039; }&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
	table.insert(data.classes, args.class)&lt;br /&gt;
&lt;br /&gt;
	-- Main div style&lt;br /&gt;
	data.style = args.style&lt;br /&gt;
&lt;br /&gt;
	-- Indent for horizontal lists&lt;br /&gt;
	if listType == &#039;horizontal&#039; or listType == &#039;horizontal_ordered&#039; then&lt;br /&gt;
		local indent = tonumber(args.indent)&lt;br /&gt;
		indent = indent and indent * 1.6 or 0&lt;br /&gt;
		if indent &amp;gt; 0 then&lt;br /&gt;
			data.marginLeft = indent .. &#039;em&#039;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- List style types for ordered lists&lt;br /&gt;
	-- This could be &amp;quot;1, 2, 3&amp;quot;, &amp;quot;a, b, c&amp;quot;, or a number of others. The list style&lt;br /&gt;
	-- type is either set by the &amp;quot;type&amp;quot; attribute or the &amp;quot;list-style-type&amp;quot; CSS&lt;br /&gt;
	-- property.&lt;br /&gt;
	if listType == &#039;ordered&#039; or listType == &#039;horizontal_ordered&#039; then &lt;br /&gt;
		data.listStyleType = args.list_style_type or args[&#039;list-style-type&#039;]&lt;br /&gt;
		data.type = args[&#039;type&#039;]&lt;br /&gt;
&lt;br /&gt;
		-- Detect invalid type attributes and attempt to convert them to&lt;br /&gt;
		-- list-style-type CSS properties.&lt;br /&gt;
		if data.type &lt;br /&gt;
			and not data.listStyleType&lt;br /&gt;
			and not tostring(data.type):find(&#039;^%s*[1AaIi]%s*$&#039;)&lt;br /&gt;
		then&lt;br /&gt;
			data.listStyleType = data.type&lt;br /&gt;
			data.type = nil&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- List tag type&lt;br /&gt;
	if listType == &#039;ordered&#039; or listType == &#039;horizontal_ordered&#039; then&lt;br /&gt;
		data.listTag = &#039;ol&#039;&lt;br /&gt;
	else&lt;br /&gt;
		data.listTag = &#039;ul&#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Start number for ordered lists&lt;br /&gt;
	data.start = args.start&lt;br /&gt;
	if listType == &#039;horizontal_ordered&#039; then&lt;br /&gt;
		-- Apply fix to get start numbers working with horizontal ordered lists.&lt;br /&gt;
		local startNum = tonumber(data.start)&lt;br /&gt;
		if startNum then&lt;br /&gt;
			data.counterReset = &#039;listitem &#039; .. tostring(startNum - 1)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- List style&lt;br /&gt;
	 -- ul_style and ol_style are included for backwards compatibility. No&lt;br /&gt;
	 -- distinction is made for ordered or unordered lists.&lt;br /&gt;
	data.listStyle = args.list_style&lt;br /&gt;
&lt;br /&gt;
	-- List items&lt;br /&gt;
	-- li_style is included for backwards compatibility. item_style was included&lt;br /&gt;
	-- to be easier to understand for non-coders.&lt;br /&gt;
	data.itemStyle = args.item_style or args.li_style&lt;br /&gt;
	data.items = {}&lt;br /&gt;
	for _, num in ipairs(mTableTools.numKeys(args)) do&lt;br /&gt;
		local item = {}&lt;br /&gt;
		item.content = args[num]&lt;br /&gt;
		item.style = args[&#039;item&#039; .. tostring(num) .. &#039;_style&#039;]&lt;br /&gt;
			or args[&#039;item_style&#039; .. tostring(num)]&lt;br /&gt;
		item.value = args[&#039;item&#039; .. tostring(num) .. &#039;_value&#039;]&lt;br /&gt;
			or args[&#039;item_value&#039; .. tostring(num)]&lt;br /&gt;
		table.insert(data.items, item)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return data&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.renderList(data)&lt;br /&gt;
	-- Renders the list HTML.&lt;br /&gt;
	&lt;br /&gt;
	-- Return the blank string if there are no list items.&lt;br /&gt;
	if type(data.items) ~= &#039;table&#039; or #data.items &amp;lt; 1 then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Render the main div tag.&lt;br /&gt;
	local root = mw.html.create(&#039;div&#039;)&lt;br /&gt;
	for _, class in ipairs(data.classes or {}) do&lt;br /&gt;
		root:addClass(class)&lt;br /&gt;
	end&lt;br /&gt;
	root:css{[&#039;margin-left&#039;] = data.marginLeft}&lt;br /&gt;
	if data.style then&lt;br /&gt;
		root:cssText(data.style)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Render the list tag.&lt;br /&gt;
	local list = root:tag(data.listTag or &#039;ul&#039;)&lt;br /&gt;
	list&lt;br /&gt;
		:attr{start = data.start, type = data.type}&lt;br /&gt;
		:css{&lt;br /&gt;
			[&#039;counter-reset&#039;] = data.counterReset,&lt;br /&gt;
			[&#039;list-style-type&#039;] = data.listStyleType&lt;br /&gt;
		}&lt;br /&gt;
	if data.listStyle then&lt;br /&gt;
		list:cssText(data.listStyle)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Render the list items&lt;br /&gt;
	for _, t in ipairs(data.items or {}) do&lt;br /&gt;
		local item = list:tag(&#039;li&#039;)&lt;br /&gt;
		if data.itemStyle then&lt;br /&gt;
			item:cssText(data.itemStyle)&lt;br /&gt;
		end&lt;br /&gt;
		if t.style then&lt;br /&gt;
			item:cssText(t.style)&lt;br /&gt;
		end&lt;br /&gt;
		item&lt;br /&gt;
			:attr{value = t.value}&lt;br /&gt;
			:wikitext(t.content)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return data.templatestyles .. tostring(root)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.renderTrackingCategories(args)&lt;br /&gt;
	local isDeprecated = false -- Tracks deprecated parameters.&lt;br /&gt;
	for k, v in pairs(args) do&lt;br /&gt;
		k = tostring(k)&lt;br /&gt;
		if k:find(&#039;^item_style%d+$&#039;) or k:find(&#039;^item_value%d+$&#039;) then&lt;br /&gt;
			isDeprecated = true&lt;br /&gt;
			break&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	local ret = &#039;&#039;&lt;br /&gt;
	if isDeprecated then&lt;br /&gt;
		ret = ret .. &#039;[[Category:List templates with deprecated parameters]]&#039;&lt;br /&gt;
	end&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.makeList(listType, args)&lt;br /&gt;
	if not listType or not listTypes[listType] then&lt;br /&gt;
		error(string.format(&lt;br /&gt;
			&amp;quot;bad argument #1 to &#039;makeList&#039; (&#039;%s&#039; is not a valid list type)&amp;quot;,&lt;br /&gt;
			tostring(listType)&lt;br /&gt;
		), 2)&lt;br /&gt;
	end&lt;br /&gt;
	checkType(&#039;makeList&#039;, 2, args, &#039;table&#039;)&lt;br /&gt;
	local data = p.makeListData(listType, args)&lt;br /&gt;
	local list = p.renderList(data)&lt;br /&gt;
	local trackingCategories = p.renderTrackingCategories(args)&lt;br /&gt;
	return list .. trackingCategories&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for listType in pairs(listTypes) do&lt;br /&gt;
	p[listType] = function (frame)&lt;br /&gt;
		local mArguments = require(&#039;Module:Arguments&#039;)&lt;br /&gt;
		local origArgs = mArguments.getArgs(frame, {&lt;br /&gt;
			valueFunc = function (key, value)&lt;br /&gt;
			if not value or not mw.ustring.find(value, &#039;%S&#039;) then return nil end&lt;br /&gt;
			if mw.ustring.find(value, &#039;^%s*[%*#;:]&#039;) then&lt;br /&gt;
				return value&lt;br /&gt;
			else&lt;br /&gt;
				return value:match(&#039;^%s*(.-)%s*$&#039;)&lt;br /&gt;
			end&lt;br /&gt;
			return nil&lt;br /&gt;
		end&lt;br /&gt;
		})&lt;br /&gt;
		-- Copy all the arguments to a new table, for faster indexing.&lt;br /&gt;
		local args = {}&lt;br /&gt;
		for k, v in pairs(origArgs) do&lt;br /&gt;
			args[k] = v&lt;br /&gt;
		end&lt;br /&gt;
		return p.makeList(listType, args)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Kcreasey</name></author>
	</entry>
</feed>