<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://camnet.oetterer.eu/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Anatol</id>
	<title>CamNet - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="https://camnet.oetterer.eu/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Anatol"/>
	<link rel="alternate" type="text/html" href="https://camnet.oetterer.eu/Spezial:Beitr%C3%A4ge/Anatol"/>
	<updated>2026-05-01T18:53:27Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.39.8</generator>
	<entry>
		<id>https://camnet.oetterer.eu/index.php?title=Attribut:Targets&amp;diff=6505</id>
		<title>Attribut:Targets</title>
		<link rel="alternate" type="text/html" href="https://camnet.oetterer.eu/index.php?title=Attribut:Targets&amp;diff=6505"/>
		<updated>2022-05-08T18:18:08Z</updated>

		<summary type="html">&lt;p&gt;Anatol: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Description ==&lt;br /&gt;
&amp;lt;div class=&amp;quot;description-box&amp;quot;&amp;gt;Wenn ein Clan Blutlinien hat, hier bitte eintragen.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Type ==&lt;br /&gt;
* This is an attribute of the datatype [[Has type::Page]].&lt;br /&gt;
&lt;br /&gt;
== Allowed values ==&lt;br /&gt;
No restriction given&lt;br /&gt;
&lt;br /&gt;
{{#invoke:Clan|categorize}}&lt;br /&gt;
&amp;lt;!-- Note: The class engine sets category &amp;quot;CamNet properties&amp;quot; automatically in function categorize --&amp;gt;&amp;lt;!--null edit--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Anatol</name></author>
	</entry>
	<entry>
		<id>https://camnet.oetterer.eu/index.php?title=Attribut:Targets&amp;diff=6504</id>
		<title>Attribut:Targets</title>
		<link rel="alternate" type="text/html" href="https://camnet.oetterer.eu/index.php?title=Attribut:Targets&amp;diff=6504"/>
		<updated>2022-05-08T18:16:31Z</updated>

		<summary type="html">&lt;p&gt;Anatol: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Description ==&lt;br /&gt;
&amp;lt;div class=&amp;quot;description-box&amp;quot;&amp;gt;Das Ziel des Spruches, z.B. 'alle Personen im Raum', 'ein Angreifer in max. 30m' oder 'selbst'.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Type ==&lt;br /&gt;
* This is an attribute of the datatype [[Has type::Text]].&lt;br /&gt;
&lt;br /&gt;
== Allowed values ==&lt;br /&gt;
No restriction given&lt;br /&gt;
&lt;br /&gt;
{{#invoke:Discipline/ability|categorize}}&lt;br /&gt;
&amp;lt;!-- Note: The class engine sets category &amp;quot;CamNet properties&amp;quot; automatically in function categorize --&amp;gt;&amp;lt;!--null edit--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Anatol</name></author>
	</entry>
	<entry>
		<id>https://camnet.oetterer.eu/index.php?title=Harmonie_und_Dissonanz&amp;diff=5181</id>
		<title>Harmonie und Dissonanz</title>
		<link rel="alternate" type="text/html" href="https://camnet.oetterer.eu/index.php?title=Harmonie_und_Dissonanz&amp;diff=5181"/>
		<updated>2017-11-20T20:12:44Z</updated>

		<summary type="html">&lt;p&gt;Anatol: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Chapter&lt;br /&gt;
|title=Harmonie und Dissonanz&lt;br /&gt;
|number=14.3&lt;br /&gt;
|start_date=2000/06/13&lt;br /&gt;
|end_date=2000/06/15&lt;br /&gt;
|city=New York&lt;br /&gt;
|auxiliary_settings=Jersey City&lt;br /&gt;
|pcs=Liz,Neil&lt;br /&gt;
|npcs=Kat,McKenzie,Porter,Collin,Amanda Dimitros,David Hamilton,Iliana,Calebros,Chandrakant,Eli Navarro,Oliver Russow,Theodore Pursley,Milele,Pavel Sokolov,Cameron Douglas,Rodney Holcomb,Ricardo,Benison,Ashley,Harley,Anne,Noémi St. John,Tanika,Kyle,Carter Morgan&lt;br /&gt;
|session_date=2017/10/27&lt;br /&gt;
|session_duration=3&lt;br /&gt;
|session_location=Paderborn&lt;br /&gt;
|description=Nachdem sie ein paar Probleme vor Ort angegangen sind, leisten Liz und Neil Amtshilfe für den Baron in Jersey City. Das Ende des Erlebnis ist durchwachsen.&lt;br /&gt;
|gathered_information={{Info&lt;br /&gt;
|payload=[[Ekaterine]] tritt in der Gegenwart als [[Kat]] auf.&lt;br /&gt;
|source=Kat&lt;br /&gt;
|target=Kat&lt;br /&gt;
|type=Hintergrund&lt;br /&gt;
}}{{Info&lt;br /&gt;
|payload=[[Vegel]] war [[Hesha]]s Kind&lt;br /&gt;
|source=Amanda Dimitros&lt;br /&gt;
|target=Hesha,Vegel&lt;br /&gt;
|type=Hintergrund&lt;br /&gt;
}}&lt;br /&gt;
}}&lt;br /&gt;
== 13. Juni ==&lt;br /&gt;
=== Das Elysium ===&lt;br /&gt;
Der neue Zugang zum exklusiven Bereich des Hurricanes ist praktisch fertig gestellt und eine große Anzahl an Kainiten nutzen den VIP-Bereich als Treffpunkt, um zu sehen und gesehen zu werden. Liz ist als Hüterin natürlich anwesend. Neil auch.&lt;br /&gt;
&lt;br /&gt;
Liz unterhält sich mit Kyle Amador und schließt sich dann einem Gespräch zwischen Neil, Kat und Jack an, in dem es um die Anarchen auf der anderen Seite des Hudson River geht. Dort ist etwas Unruhe, da Vampire aus New York immer wieder in die dortigen Geschehnisse eingreifen. Jack und Kat möchten die Situation jedoch beruhigen, um einen stabilen Frieden zu schaffen. Daher bitten die beiden Liz und Neil, sich mit dem Baron in Jersey City zu treffen, um ihm bei einem Problem zu helfen. Damit könne man Pluspunkte sammeln und zeigen, dass man hier gewillt sei, sich einander anzunähern.&lt;br /&gt;
&lt;br /&gt;
Liz und Neil sagen zu, den Baron zu treffen und sich zumindest das Problem anzuhören. Kat nennt daraufhin einen Treffpunkt für die kommende Nacht.&lt;br /&gt;
&lt;br /&gt;
Dann wird ein Gesangsstück angekündigt und eine junge, blonde Frau tritt auf. Sie singt &amp;quot;Sound of Silence&amp;quot; und zieht damit alle Anwesenden in ihren Bann. Denn die Frau singt nicht nur besonders schön, sondern insbesondere auch mit scheinbar zwei Stimmen zugleich. Viele, insbesondere auch ältere Vampire sind derart berührt von der Vorstellung, dass sie sich nach Beendigung der Vorstellung nur mühsam wieder auf andere Dinge konzentrieren können oder einige blutige Tränen wegwischen.&lt;br /&gt;
&lt;br /&gt;
Liz spricht die Sängerin, deren Name Iliana ist, und den in ihrer Nähe befindlichen Theodore Pursley an. Zumindest er ist Malkavianer und scheint etwas auf die junge Frau zu achten, die verunsichert, schüchtern und abwesend zugleich scheint. Als Benison, der sich mit einigen anderen in einem Nachbarraum befunden hat, in den Hauptraum tritt und die Sängerin erblickt, scheint er aufgebracht zu sein. Theodore gelingt es jedoch, ihn im Gespräch zu beruhigen, so dass er sich in das Nebenzimmer zurückzieht. Anschließend verlässt Theodore mit Iliana das Elysium in Richtung Oper, da die mittlerweile ertönende künstliche Musik aus den Lautsprechern zu dissonant für die junge Frau sei. Auch er selbst habe nichts dafür übrig.&lt;br /&gt;
&lt;br /&gt;
Liz hört zufällig einige Fetzen eines Gesprächs zwischen dem soeben eingetroffenen &amp;quot;Brillen-Lala&amp;quot; (ich finde seinen Namen nicht im Wiki...) und Ezekiel Porter. Sie mischt sich, gefolgt von Neil, in das Gespräch ein, bei dem es um Gerüchte zu einem LaSombra geht, der sich in Harlem aufhalten soll. Porter versucht &amp;quot;Brillen-Lala&amp;quot; zu überzeugen diesem Gerücht nachzugehen, um sich für seinen Start in NY einen guten Namen zu machen. Neil redet ihm das aber schnell aus. &lt;br /&gt;
&lt;br /&gt;
Ein Anruf von David Hamilton bei Neil beendet die heitere Zusammenkunft, denn offenbar besteht Redebedarf. Auch Liz soll mit in Davids Büro kommen. Da sich die Sache recht ernst anhört, brechen die beiden kurz danach in Richtung Polizeigebäude auf. Liz schwingt sich hinter Neil auf sein Motorrad und gemeinsam düsen die zwei zu David.&lt;br /&gt;
&lt;br /&gt;
=== Amanda ===&lt;br /&gt;
Liz und Neil bekommen im Polizeihauptquartier ihre Besucherausweise und dürfen dann direkt zu David rein, der jedoch nicht allein ist. Mit im Büro befindet sich Amanda Dimitros, die in keinem guten psychischen Zustand zu sein scheint. David schildert die Dinge aus seiner Sicht, wobei einerseits der nachlässige Umgang mit der Maskerade beim Trinkversuch mit Peter und Franzi thematisiert wird, als auch die in seinen Augen barbarischen Regeln kritisiert werden, die Amanda praktisch zum Eigentum Heshas machen. Offenbar musste ein schwer verletzter Kellner in ein Krankenhaus eingeliegert werden, und die Erklärungsversuche zum Dasein der Vampire haben Amanda wohl mehr verängstigt und verstört als angenommen.&lt;br /&gt;
&lt;br /&gt;
Liz und Neil versuchen gemeinsam sowohl David als auch Amanda davon zu überzeugen, dass Peter und Franzi sicher nur Gutes im Sinn hatten. Ferner besteht Einigkeit darüber, dass man Amanda nicht sofort Hesha übergibt und sie zunächst in eine Art Schutzhaft genommen wird. David bietet Amanda an als ihre Blutquelle zu fungieren (wie Susan DAS wohl findet?!?). &lt;br /&gt;
&lt;br /&gt;
Danach führt Liz ein persönliches Gespräch mit David, in dem es hauptsächlich um Susan geht. Das Gespräch scheint zumindest teilweise zu seiner Beruhigung zu führen, dennoch stehen ihm Tränen in den Augen. &lt;br /&gt;
&lt;br /&gt;
Neil unterhält sich derweil mit Amanda und erfährt einiges über ihre Vorgeschichte. Sie war vorher im Rutherford House tätig, ist dort aber irgendwann Hesha aufgefallen, der dorthin Kontakte hat. Als dann Amandas Vorgänger Vegel plötzlich Ende letzten Jahres verstarb, lieh Hesha sie für die Position der Forschungsleiterin aus. Sie übernahm daraufhin einige von Vegels Projekte.&lt;br /&gt;
&lt;br /&gt;
Irgendwann muss es dann zu einer Begebenheit gekommen sein, bei der Thompson - vermutlich bei irgendeinem Auftrag - schwer verletzt wurde. In der Folge wurde Hesha Amanda gegenüber direkter und machte auch Andeutungen über seine Natur. Seit dieser Zeit fühlte sich Amanda nicht mehr wie eine geschätzte Mitarbeiterin, sondern eher wie eine wichtige Gefangene.&lt;br /&gt;
&lt;br /&gt;
Im Rahmen der Forschungen war eines von Vegels Projekten ein alter Steinblock, in dem Gegenstände vermutet wurden. Vegel hatte sich bis dahin an alle Regeln der archäologischen Kunst gehalten, war aber nicht fündig geworden. Amanda fand jedoch durch eine Art Eingebung einen Ring, der zwei verschlungene und sich gegenseitig in den Schwanz beißende Schlangen darstellt und mit einem Rubin geschmückt ist, dessen Einfassung mit Hieroglyphen versehen ist. Amandas Einschätzung nach muss dieser Ring aus einer sehr frühen Dynastie stammen, kann aber ohne ihre Aufzeichnungen leider kaum weitere Informationen liefern.&lt;br /&gt;
&lt;br /&gt;
Nachdem die Gespräche beendet sind und Neil Amanda den Kontakt von Minx gegeben hat, um mit Gleichgesinnten die Regeln der Kainiten zu lernen, verabschiedet man sich. Als Amanda Neils Hand ergreift, überkommt sie eine Vision:&lt;br /&gt;
Es geht um eine junge Frau...ein Mädchen, dass blind, einsam und verängstigt auf der Suche nach einem Weg nach Hause ist. Sie weint um ihre gefallene Schwester, die im Osten - gezeichnet vom Licht der drei Sonnen - das Grab des gefallenen Gottes jagt. Die Vision endet mit einem eindringlichen Hinweis, dass Neil sie nicht berühren dürfe.&lt;br /&gt;
&lt;br /&gt;
Amanda kann sich daran nicht mehr erinnern, als sie wieder zu sich kommt. &lt;br /&gt;
&lt;br /&gt;
== 14. Juni ==&lt;br /&gt;
=== Jersey City ===&lt;br /&gt;
==== Der Auftrag ====&lt;br /&gt;
Am nächsten Abend holt Neil Liz wieder ab, gemeinsam geht es zum verabredeten Treffpunkt. Dort sprechen sie mit Kat, bevor Neil und Liz sich auf den Weg zum Baron machen. Dabei bestätigt sie auf Nachfrage, dass sie die Ekaterine aus den Briefwechseln des Ordens des Roten Sterns ist. Sie habe diesen Weg aber bereits vor langer Zeit verlassen. Die Erwähnung des Ordens verschlechtert ihre Laune deutlich.&lt;br /&gt;
&lt;br /&gt;
Jersey ist ein eher ärmlicher bzw. zu weiten Teilen auch verlassener Bereich. Hier gibt es viele Mülldeponien. Der Weg führt die Beiden in Richtung eines Steinhauses, in dem sie ein Helfer des örtlichen Barons Cameron Douglas begrüßt. Zum Erstaunen der Beiden handelt es sich um Ricardo Montalban, der Liz überschwänglich begrüßt und ihnen den Weg zum Baron weist.&lt;br /&gt;
&lt;br /&gt;
Cameron berichtet etwas über seinen Werdegang (Software-Entwickler, Ventrue) und erklärt, dass die Anarchen in New Jersey eigentlich nur ihre Ruhe haben wollen. Sie würden dafür auch verhindern, dass Feinde von hier aus New York erreichen. Leider würde man sich von New Yorker Seite immer wieder in die hiesigen Belange einmischen und hier jagen (insbesondere Berman, Sinclair und Vitel sind hier wohl Antreiber). Außerdem würde auch die Geißel immer wieder Ausflüge hierher unternehmen und sich Personen rauspicken, die sich nicht beim Prinzen vorgestellt haben - obwohl Jersey ja eigentlich gar nicht zum New Yorker Gebiet gehört.&lt;br /&gt;
Man sei aber trotzdem bereit, sich um Einigung zu bemühen. Daher habe er nach Vermittlung durch Kat und Jack entschieden, Liz und Neil die Möglichkeit zu geben, Vertrauen in Jersey zu gewinnen, indem ein Todesfall aufgeklärt wird.&lt;br /&gt;
&lt;br /&gt;
Seit einiger Zeit gibt es Streit unter einigen einflussreicheren Kainiten Jerseys. Dabei geht es um die Verwendung und den Besitz eines kleinen Waldstücks, dem Beltower Forrest. Als Vermittler wurde ein Kainit namens Rodney bestellt. Dieser habe mit allen Beteiligten ein Treffen vereinbart, das vor zwei Nächten stattfand. Rodney überlebte dieses Treffen nicht und die vier anderen Teilnehmer an der Verhandlung beschuldigen sich nun gegenseitig, der Mörder zu sein. Bei diesen handelt es sich um&lt;br /&gt;
# Chandrakant, einen Ravnos&lt;br /&gt;
# Eli, einen Gangrel und Mitglied einer Gang&lt;br /&gt;
# Milele, einer Gangrel aus Afrika&lt;br /&gt;
# Pavel Sokolov, einem Nosferatu&lt;br /&gt;
&lt;br /&gt;
Liz und Neil sollen nun herausfinden, wer für den Tod Rodneys verantwortlich ist und ihn dem Baron melden.&lt;br /&gt;
&lt;br /&gt;
==== Der Tatort ====&lt;br /&gt;
Ricardo begleitet Liz und Neil zum Tatort, teilt ihnen die Aufenthaltsorte der vier Verdächtigen mit und gibt auch noch den Hinweis, dass ein Malkavianer namens Oliver hier in der Nähe wohnt und möglicherweise Hinweise geben könnte, obwohl er sein Haus nie verlässt. Eine Kommunikation mit ihm sei jedoch extrem schwierig.&lt;br /&gt;
&lt;br /&gt;
Beim Tatort handelt es sich um eine ehemalige Bar, bei der man die Trümmer des Mobiliars an die Seitenwände geräumt, aber einen Tisch und sechs Stühle neu aufgestellt hat, um den Anwesenden eine passable Gesprächsatmosphäre zu bieten. Im hinteren Bereich liegt der geköpfte Körper von Rodney. Der Kopf liegt etwas weiter weg. Scheinbar wurde ein sehr scharfer Gegenstand genutzt. Eine Begutachtung des Raumes ergibt, dass Rodney vermutlich von hinten erwischt wurde. Ricardos Erläuterungen zufolge soll dies während der Verhandlungen passiert sein, weswegen die bisherigen, sehr unterschiedlichen Schuldzuweisungen keinen Sinn machen. Doch angeblich habe man auch Maßnahmen ergriffen, die eine Einmischung von außen verhindern sollten.&lt;br /&gt;
&lt;br /&gt;
Während Neil den Tatort untersucht, führen Liz und Ricardo ein Gespräch unter vier Augen (hoffentlich!). Sie macht sich große Sorgen um ihn und beschwört ihn erst einmal nicht mehr nach NY zurückzukommen. Insgesamt erscheint Ricardo ruhig und nicht mehr wütend wie zuvor; außerdem behauptet er nicht mehr dem Sabbat anzugehören und auch nicht mehr das Blutband zu seinem Pack zu spüren. Wer weiß...&lt;br /&gt;
&lt;br /&gt;
==== Der agoraphobische Malkavianer ====&lt;br /&gt;
Im Anschluss an die Tatortbesichtigung suchen Liz und Neil Oliver auf, während Ricardo zurückbleibt. Die Bude von Oliver ist vollgestellt mit allerlei Kram, Möbeln und Zeitschriftenstapeln. Er selbst redet immer wieder mit sich selbst bzw. einer nicht vorhandenen Person. Dies beginnt bereits bei der Beantwortung von Neils Frage, ob man eintreten dürfe.&lt;br /&gt;
&lt;br /&gt;
Das folgende Gespräch ist tatsächlich recht schwierig, da Oliver nur sehr wenig über die Ereignisse berichten kann. Er sei schließlich immer hier gewesen. Es ist aber offenkundig, dass seine Wahrnehmung über die Grenzen seines Einzimmerappartements hinaus geht. Er bedauert das Dahinscheiden Rodneys und hatte auch kürzlich noch Kontakt mit ihm. Rodney hatte sich bei Oliver nach Theodore Pursely erkundigt und wie man mit ihm am besten in Kontakt treten könne, da dieser der Eigentümer des streitgegenständlichen Waldstücks sei.&lt;br /&gt;
&lt;br /&gt;
Beim Verlassen des Raumes fällt auf, dass Oliver mit ein paar Zahnstochern spielt. Er hat sie in kleinen Gruppen vor sich ausgelegt: Einmal zwei, einmal drei und letztlich ein einzelner. Dan schiebt er einen von der Dreiergruppe zum einzelnen und zerbricht dann letzteren.&lt;br /&gt;
&lt;br /&gt;
==== Die vier Verdächtigen ====&lt;br /&gt;
Liz und Neil einigen sich darauf, zunächst Milele aufzusuchen. Diese treffen die beiden im Garten eines Hauses an, der zu einer Art Ritual- oder Kampfplatz mit am Rand aufgestellten Laternen gemacht wurde. Die Gangrel hat zunächst die Gestalt eines schwarzen Panthers und verwandelt sich vor den Augen von Liz und Neil.&lt;br /&gt;
Im Gespräch nennt sie die beiden &amp;quot;Wahrheitssucher&amp;quot;, ist aber verwundert, warum sie kein Totem haben, da es ohne Totem doch nahezu unmöglich sei, die Aufgaben eines Wahrheitssuchers auszuüben. Auch wenn es sicherlich interessant wäre, mehr über die Glaubenswelt der Afrikanerin zu erfahren, konzentriert man sich schnell auf die Ereignisse der vorletzten Nacht. Milele erweist sich als hilfsbereit und berichtet ihre Version.&lt;br /&gt;
&lt;br /&gt;
Danach sollen alle bis auf Eli pünktlich zum Treffen erschienen sein. Nach einem kurzen gemeinsamen Gespräch in einer bestimmten Sitzordnung habe Rodney dann vorgeschlagen, in kleinen Gruppen miteinander zu reden und eine Lösung zu suchen. Während dieser Gespräche habe Eli in der Nähe Rodneys gestanden. Dann habe man Rodney aufschreien gehört und als man sich dorthin umgewandt hat, fiel er bereits nach vorne über, der Kopf abgetrennt. Man habe dann fluchtartig das Gebäude verlassen.&lt;br /&gt;
&lt;br /&gt;
Weitere Nachfragen ergeben, dass sich Milele absolut sicher sei, dass niemand von außen dazugestoßen sein könne. Der Geruch habe sich seit dem Beginn der Verhandlung nicht geändert.&lt;br /&gt;
Auch die Katze des Inders Chandrakant habe auf dem Tisch am Kopfende beruhigend geschnurrt, so dass Milele nicht von einer Bedrohung ausgegangen sei.&lt;br /&gt;
&lt;br /&gt;
Doch bei einer Nachfrage wirkt die Gangrel verwirrt. Zwar kann sie sich genau erinnern, wo die vier Verdächtigen gesessen haben. Doch eine Frage nach den beiden weiteren Stühlen beantwortet sie dahingehend, dass nur fünf Stühle vorhanden gewesen seien. Die zögerliche Antwort macht auf Liz und Neil nicht den Eindruck, als würde sie lügen, sondern schürt eher den Verdacht, dass jemand mit ihrem Gedächtnis gespielt hat. Die Anwendung der Disziplin Beherrschung im Anschluss an die Tat wird daher von Liz und Neil in Betracht gezogen.&lt;br /&gt;
&lt;br /&gt;
Letztlich erklärt Milele ihr Interesse an dem Wald mit der relativen Abgeschiedenheit.&lt;br /&gt;
&lt;br /&gt;
Danach soll Eli befragt werden. Dieser ist Teil einer Motorrad-Gang. Die Mitglieder sind naturgemäß provozierend und es entwickelt sich ein kleines Wortgefecht, das im Angebot von Eli mündet, dass sich Liz und Neil ja im Rahmen eines kleinen Tests bewähren könnten. Die beiden willigen ein und Liz wird von einem bulligen Biker zur Schlägerei herausgefordert.&lt;br /&gt;
Im folgenden Kampf ohne Einsatz von Disziplinen erleidet Liz zwar einige Treffer, die besonders aufgrund der nicht ganz zurückgebildeten Krallenhände des Gangrel schmerzhaft sind. Aber die erlernten Kampfkünste und die hohe Beweglichkeit versetzen Liz in die Lage, den Kampf für sich zu entscheiden und ihren Gegner auf den Asphalt zu befördern.&lt;br /&gt;
&lt;br /&gt;
Eli bittet Neil daraufhin, ihn ein paar Schritte zu begleiten. Dann beginnt er, die Regeln für die folgende Konfrontation zu erläutern: Keine Disziplinen und die Maskerade muss zwingend gewahrt bleiben. Während Neil sich bereits den Hoodie auszieht, um sich kampfbereit zu machen, tritt Eli auf die Straße und wird von einem Fahrzeug erfasst. Er wird aufgeladen und schlägt schwer verletzt auf der Straße auf. Der Fahrer steigt aus und hastet panisch zu Eli.&lt;br /&gt;
&lt;br /&gt;
Der Mensch zückt weinerlich sein Handy, um einen Krankebwagen zu rufen. Dann kapiert auch Neil, dass es sich um den eigentlich Test handeln muss und überzeugt den Unfallfahrer, dass ein Krankenwagen bereits unterwegs sei. Die erste zaghafte Beruhigung des Mannes wird zunichte gemacht, da Eli sich nun zu regen beginnt und sich schwer verletzt aufrichtet, was eine mittlere Panikattacke bei dem Fahrer auslöst. Was würde Präsenz die Angelegenheit vereinfachen...aber: keine Disziplinen.&lt;br /&gt;
&lt;br /&gt;
Mit Mühe gelingt es Neil, den Mann davon zu überzeugen, dass er wohl unter Schock stehen muss und führt ihn weiter vom Unfallort weg, während Eli seine Knochen und sein heraushängendes Auge richtet. Leider ist der Unfall nicht unbemerkt geblieben, so dass sich schnell drei Schaulustige nähern. Doch Neils Aufforderung, dem Fahrer zu helfen, vertreibt zwei davon schnell, die plötzlich wichtige andere Sachen zu erledigen haben. Der Dritte bemüht sich dann aber tatsächlich um den Fahrer, während Neil zu dem amüsiert grinsenden Eli zurückkehrt, der darauf hinweist, dass die Angelegenheit noch nicht ganz gelöst ist.&lt;br /&gt;
&lt;br /&gt;
Schließlich gelingt es Neil, den Unfallfahrer (wohl eher das Opfer) von seinem Schockzustand zu überzeugen, den weiteren Zeugen loszuwerden und einen Abschleppdienst zu rufen, der in der Lage ist, etwaige verräterische Spuren am stark zerstörten Wagen zu beseitigen. Der arme Mann wird von Neil nach Hause gebracht und Neil versichert, sich um alles zu kümmern und sich zu melden, wenn es noch Probleme geben sollte.&lt;br /&gt;
&lt;br /&gt;
Nach der für die Gangrel offenbar erheiternden Sequenz ist Eli bereit, seine Version der Geschichte beizusteuern. Im Wesentlichen ähnelt diese der Version Mileles. Doch Eli behauptet, der Ravnos sei zu spät gekommen und habe zuletzt in der Nähe Rodneys gestanden, so dass er der Mörder sein müsse. Eli meint zwar, einen sechsten Stuhl gesehen zu haben, dieser sei aber nicht benutzt worden...soweit er sich erinnere. Liz und Neil sind sich aber sicher, dass alle Stühle vom Tisch abgerückt waren und damit benutzt aussahen.&lt;br /&gt;
Das Schnurren der Katze war für Eli eher nervend. Eli behauptet, dass er während des Tatzeitpunkts mit Pavel verhandelt habe; aber die Positionen der beiden seien unvereinbar.&lt;br /&gt;
&lt;br /&gt;
Letztlich verrät er, dass sich im Waldstück wohl Werwesen aufhalten und eine anderweitige Nutzung mit Sicherheit gewaltsam verhindern würden. Diese Auseinandersetzung wolle man vermeiden, weswegen Eli Anspruch erhoben habe.&lt;br /&gt;
&lt;br /&gt;
Der nächste Verdächtige, den Liz und Neil aufsuchen, ist der Nosferatu. Bei ihm handelt es sich im einen Geschäftsmann im Entsorungsgewerbe, der aus dem Wald eine neue Deponie machen will. Nachdem Neil darauf besteht, über die Ereignisse um Rodney zu sprechen, wird Pavel kurz etwas unleidlich, bis er durch einen anderen Nosferatu, der plötzlich aus seiner Verdunklung in der Gesprächsrunde auftaucht, zur Raison gebracht wird: Calebros.&lt;br /&gt;
&lt;br /&gt;
Im anschließenden Gespräch meint Pavel, Milele sei die Nachzüglerin gewesen und als Afrikanerin per se verdächtig. Jedenfalls habe sie Rodney auf dem Gewissen.&lt;br /&gt;
&lt;br /&gt;
Pavel ist sich relativ sicher, dass es nur fünf Stühle gegeben hat; aber auch er wirkt etwas verunsichert. Außerdem habe er zu Beginn der Verhandlungen sichergestellt, dass sich niemand verdunkelt im Raum befindet. Er bestätigt auch, dass Eli zum genauen Tatzeitpunkt mit ihm geredet habe.&lt;br /&gt;
&lt;br /&gt;
Hier verdichten sich die Hinweise, dass es wohl eher nicht Beherrschung ist, die angewendet wurde, da diese schwierig auf mehrere anzuwenden ist und wohl auch keine unterschiedlichen Versionen erzeugen kann. Aber die Ravnos sind ja geübt in Illusionen. Daher wird nun Chandrakant aufgesucht.&lt;br /&gt;
&lt;br /&gt;
Der Ravnos haust in einer windschiefen Lagerhalle. Doch von innen sieht es eher aus wie ein indischer Palast. Neils Meinung nach eine Illusion, wenn auch alles komplett real wirkt. Chandrakant ist offenbar blind und teilt auf Nachfrage etwas zögerlich seine Version mit. Offenbar kann er durch die Augen seiner Katze sehen, die während des Gesprächs auf Liz' Schoß springt und sich schnurrend kraulen lässt.&lt;br /&gt;
&lt;br /&gt;
Nach Auffassung des Ravnos ist Pavel zu spät gekommen und stand auch als letzter in der Nähe Rodneys. Auch er meint, dass nur fünf Stühle dort waren und auch nur fünf Personen. Das Waldstücke hätte er im Falle des Erwerbs zur Ausbildung seiner Tiervertrauten genutzt. Tatsächlich ist uns in Jersey eine unnaturliche Anzahl und Mischung an verschiedenen Tieren aufgefallen - insbesondere Raben, Krähen und Tauben. Doch Chandrakant teilt mit, dass er seinen Anspruch bereits aufgegeben habe und sich nach Alternativen umschaut.&lt;br /&gt;
&lt;br /&gt;
==== Letzte Erkundigungen ====&lt;br /&gt;
Dann folgt ein Telefonat mit Theodore Pursley, um ggf. zu ergründen, ob er noch Informationen zu Rodney hat. Immerhin wollte dieser ihn wegen der Eigentumsverhältnisse sprechen. Theodore teilt mit, dass ihn niemand wegen des Waldstückes kontaktiert habe. Er sei zwar bereits seit langem nicht mehr da gewesen. erworben habe er es 1923. Aber vielleicht wolle er irgendwann mal wieder den dortigen Tönen lauschen.&lt;br /&gt;
&lt;br /&gt;
Bei der Gelegenheit interviewt Liz den Malkavianer hinsichtlich der besonderen Sängerin Iliana. Diese sei wegen einiger Ereignisse in Atlanta, unter besonderer Beobachtung von Benison. Die Blutsschwestern Ilianas hätten damals eine Art Aufstand gegen den Prinzen geprobt. In der Folge der Ereignisse sind einige Kainiten umgekommen, unter anderem auch die Tochter von Benison.&lt;br /&gt;
&lt;br /&gt;
Etwas ratlos diskutieren Liz und Neil ihre Erkenntnisse. Niemand der Verdächtigen hatte ein durchschlagendes Motiv. Niemand - soweit beurteilbar - wirklich die Fähigkeit, die Wahrnehmung von mehreren anderen Personen so sehr zu beeinflussen. Außer vielleicht der Ravnos, der aber bereits von seinem Anspruch zurückgetreten war.&lt;br /&gt;
&lt;br /&gt;
Neil befragt nach einer Stippvisite beim Baron mit Sachstandmeldung per Text Kat zu Disziplinen, die die beschriebenen Effekte haben können und Robert zu Informationen zu den Verdächtigen. Doch eigentlich ist klar, dass wohl eine ominöse sechste Person dahinter stecken muss und mit den verwirrenden Angaben der anderen vier von sich ablenken will. Die Infos von Robert geben keine besonderen Hinweise mehr. Kat jedoch bestätigt eine Annahme von Liz und Neil, dass auch Malkavianer in der Lage sein könnten, die Wahrnehmung so extrem wie im vorliegenden Fall zu beeinflussen.&lt;br /&gt;
&lt;br /&gt;
Danach wird wegen eines entsprechenden Hinweises des Baron aus dem vorangegangenen Gespräch ein weiteres Mal Oliver aufgesucht.&lt;br /&gt;
&lt;br /&gt;
Das Gespräch gestaltet sich zwar wieder etwas schwierig, doch die zwischenzeitlich gesammelten Informationen bringen etwas mehr Licht in die Aussagen und auch das Zahnstocherbild, das Oliver wohl zwischenzeitlich fertig gestellt hat. Es zeigt ein Haus. Auf der linken Seite befinden sich sechs Zahnstocher, im Inneren fünf und der zerbrochene und rechts davon fünf. Seine Aussage &amp;quot;Sechs sind gekommen, fünf sind gegangen&amp;quot; bestätigt die Vermutung, dass es eben tatsächlich noch einen Teilnehmer der Verhandlungen gegeben haben muss. Weitere Hinweise des Malkavianers können dahingehend gedeutet werden, wie viele Räder die Fortbewegungsmittel hatten, mit denen die Personen angekommen sind. Vermutlich ist der sechste Teilnehmer mit einem Auto gefahren.&lt;br /&gt;
Dann wiederum brabbelt Oliver etwas von der Freiheitsstatue und Miss Harmonie. Ein langsam aufkeimenden Verdacht Neils bestätigt schließlich durch die nächste Aussage, dass Miss Harmony und/oder die Freiheitsstatue auf einem kleinen Metallschild gefangen sind; verwunderlich sei aber, dass statt dem O eine Null steht: Der sechste Teilnehmer ist aus New York gekommen. Die Autokennzeichen in New York zeigen die Freiheitsstatue und Harm0ny wird vermutlich der Schriftzug sein. Jemand, der auffällig nach (musikalischer) Harmonie strebt und zufällig auch ein älterer Malkavianer ist, ist auch der Eigentümer des Waldes. Plötzlich passt alles zusammen.&lt;br /&gt;
&lt;br /&gt;
==== Schlussfolgerung ====&lt;br /&gt;
Rodney muss Theodore Pursley doch kontaktiert haben und hat ihn vermutlich sogar zum Treffen eingeladen. Dieser war tatsächlich da, nachdem er mit seinem Wagen von New York herüber gefahren ist und hat auf dem sechsten Stuhl gesessen - vor ihm die Katze des Ravnos, die er gekrault hat und die deswegen laut geschnurrt hat. Er hat in den Einzelgesprächen zunächst bei zwei anderen gestanden und ist dann zu Rodney gegangen. Aus irgendeinem Grund hat er Rodney dann getötet und die Erinnerung an die Ereignisse bei den anderen Anwesenden vermutlich durch dei Disziplin &amp;quot;Wahnsinn&amp;quot; geändert.&lt;br /&gt;
&lt;br /&gt;
Nachdem Liz und Neil Oliver wieder verlassen haben, bestätigt sich durch eine Kennzeichenabfrage, dass tatsächlich ein Wagen mit dem Kennzeichen ''Harm0ny'' auf Theodore Pursley zugelassen ist.&lt;br /&gt;
&lt;br /&gt;
Das Ergebnis teilen Liz und Neil dem Baron mit, der zwar einerseits etwas erleichtert erscheint, weil keiner der Bewohner Jersey Citys der Täter ist, andererseits aber auch unzufrieden, da er keinen Einfluss auf dem Gebiet von New York hat, um den Täter zur Rechenschaft zu ziehen. Er appeliert diesbezüglich an Neils Gerechtigkeitsempfinden und bittet abschließend um eine Einschätzung hinsichtlich des Waldstücks. Liz und Neil sind sich einig, dass Elis Position wohl die stärkste ist. Ein Eindringen von Vampiren würden Werwesen dort wohl nicht zulassen. Ein Konflikt so nah vor der Haustür New Yorks wäre bestenfalls unschön.&lt;br /&gt;
&lt;br /&gt;
=== New York ===&lt;br /&gt;
==== Das Urteil ====&lt;br /&gt;
Nach einer Besprechung mit Berman über die rechtliche Einschätzung der Angelegenheit - es ist ein ziemlicher Graubereich - und mögliche Strafen für die Vernichtung eines Vampirs ohne Erlaubnis des Prinzen oder in Selbstverteidigung, brechen Liz und Neil zum Haus von Theodore Pursley in Brooklyn auf. Vor einer endgültigen Entscheidung muss er jedenfalls gehört werden.&lt;br /&gt;
&lt;br /&gt;
Der Malkavianer empfängt die beiden Ermittler in seiner Wohnung. Nach etwas verbalem Geplänkel mit Fragen und Gegenfragen gesteht Pursley, Rodney getötet zu haben. Grund seien die Dissonanzen gewesen, die von ihm ausgegangen seien. Er sei sicher gewesen, dass diese Dissonanzen sich weiter ausgebreitet und auch die Töne in New York negativ verändert hätten. Daher habe es keine andere Möglichkeit gegeben, als die Quelle der Dissonanzen verstummen zu lassen und als Nebeneffekt zugleich die Dissonanzen in Jersey City zu erhöhen.&lt;br /&gt;
&lt;br /&gt;
Neil kann sich nicht dazu durchringen, die Todesstrafe auszusprechen (und zu vollziehen). Daher fordert er zunächst die Eigentumsübetragung des Waldstücks an den Baron, damit dieser auch rechtlich in der Lage ist, darüber weiter zu entscheiden.&lt;br /&gt;
Ferner wird Theodore für die Dauer von drei Monaten verboten, das Elysium - und damit die dortigen Auftritte von Künstlern - zu besuchen. Während Neil dies in Anbetracht der langen Lebensdauer Pursleys im Nachhinein als zu kurz empfindet, scheint für den Malkavianer fast schon eine Welt zusammen zu brechen. Er äußert jedenfalls, dass er diese Strafe als grausam empfindet. Während Neil bereits aufsteht und geht, bittet Theodore Liz um eine Äußerung ihres Verständnisses für sein Vorgehen...welche diese ihm nicht geben kann. Liz bekommt dennoch den Kontakt von Iliana, um sie erneut bei sich im Elysium auftreten zu lassen. &lt;br /&gt;
&lt;br /&gt;
Neil setzt Liz zu Hause ab und begibt sich dann nach Hause. Die Ereignisse dieser Nacht schreien nach einer ausgiebigen Meditation.&lt;br /&gt;
&lt;br /&gt;
Liz geht derweil in ihr Appartment, in dem Collin am Küchentisch sitzend schon auf sie wartet. Er eröffnet Liz mit der Rückgabe seiner Wohnungsschlüssel, dass er sie verlässt, weil er sie nicht mehr liebt. Für Liz tut sich ein Abgrund unter ihren Füßen auf und sie fällt... und fällt... &lt;br /&gt;
Collin schlägt die Tür ins Schloss und verschwindet in der Nacht.&lt;br /&gt;
&lt;br /&gt;
==== Cutscene ====&lt;br /&gt;
Eine Gestalt verlässt das Haus in Brooklyn, in dem Theodore Pursley wohnt und geht in Richtung eines Motorrades. Beim Motorrad angekommen, holt sie ein neumodisches Klapphandy hervor und berührt eine Schnellwahltaste. der Person am anderen Ende teilt sie mit, dass &amp;quot;er&amp;quot; (Theodore) nichts gesagt habe. &amp;quot;Sie&amp;quot; wüssten nichts und &amp;quot;''Neil hat die Erklärung geschluckt.''&amp;quot; Im Anschluss erkundigt sich die Gestalt nach dem nächsten Ziel.&lt;br /&gt;
&lt;br /&gt;
Danach wird das Gespräch beendet. Kurz bevor Sie davonfährt schlägt Sie Ihre Kapuze zurück und die Gestalt entpuppt sich als Lydia, die nun in die späte Nacht davon braust.&lt;br /&gt;
{{Navbox chapter}}&lt;/div&gt;</summary>
		<author><name>Anatol</name></author>
	</entry>
	<entry>
		<id>https://camnet.oetterer.eu/index.php?title=Harmonie_und_Dissonanz&amp;diff=5180</id>
		<title>Harmonie und Dissonanz</title>
		<link rel="alternate" type="text/html" href="https://camnet.oetterer.eu/index.php?title=Harmonie_und_Dissonanz&amp;diff=5180"/>
		<updated>2017-11-20T20:08:46Z</updated>

		<summary type="html">&lt;p&gt;Anatol: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Chapter&lt;br /&gt;
|title=Harmonie und Dissonanz&lt;br /&gt;
|number=14.3&lt;br /&gt;
|start_date=2000/06/13&lt;br /&gt;
|end_date=2000/06/15&lt;br /&gt;
|city=New York&lt;br /&gt;
|auxiliary_settings=Jersey City&lt;br /&gt;
|pcs=Liz,Neil&lt;br /&gt;
|npcs=Kat,McKenzie,Porter,Collin,Amanda Dimitros,David Hamilton,Iliana,Calebros,Chandrakant,Eli Navarro,Oliver Russow,Theodore Pursley,Milele,Pavel Sokolov,Cameron Douglas,Rodney Holcomb,Ricardo,Benison,Ashley,Harley,Anne,Noémi St. John,Tanika,Kyle,Carter Morgan&lt;br /&gt;
|session_date=2017/10/27&lt;br /&gt;
|session_duration=3&lt;br /&gt;
|session_location=Paderborn&lt;br /&gt;
|description=Nachdem sie ein paar Probleme vor Ort angegangen sind, leisten Liz und Neil Amtshilfe für den Baron in Jersey City. Das Ende des Erlebnis ist durchwachsen.&lt;br /&gt;
|gathered_information={{Info&lt;br /&gt;
|payload=[[Ekaterine]] tritt in der Gegenwart als [[Kat]] auf.&lt;br /&gt;
|source=Kat&lt;br /&gt;
|target=Kat&lt;br /&gt;
|type=Hintergrund&lt;br /&gt;
}}&lt;br /&gt;
}}&lt;br /&gt;
== 13. Juni ==&lt;br /&gt;
=== Das Elysium ===&lt;br /&gt;
Der neue Zugang zum exklusiven Bereich des Hurricanes ist praktisch fertig gestellt und eine große Anzahl an Kainiten nutzen den VIP-Bereich als Treffpunkt, um zu sehen und gesehen zu werden. Liz ist als Hüterin natürlich anwesend. Neil auch.&lt;br /&gt;
&lt;br /&gt;
Liz unterhält sich mit Kyle Amador und schließt sich dann einem Gespräch zwischen Neil, Kat und Jack an, in dem es um die Anarchen auf der anderen Seite des Hudson River geht. Dort ist etwas Unruhe, da Vampire aus New York immer wieder in die dortigen Geschehnisse eingreifen. Jack und Kat möchten die Situation jedoch beruhigen, um einen stabilen Frieden zu schaffen. Daher bitten die beiden Liz und Neil, sich mit dem Baron in Jersey City zu treffen, um ihm bei einem Problem zu helfen. Damit könne man Pluspunkte sammeln und zeigen, dass man hier gewillt sei, sich einander anzunähern.&lt;br /&gt;
&lt;br /&gt;
Liz und Neil sagen zu, den Baron zu treffen und sich zumindest das Problem anzuhören. Kat nennt daraufhin einen Treffpunkt für die kommende Nacht.&lt;br /&gt;
&lt;br /&gt;
Dann wird ein Gesangsstück angekündigt und eine junge, blonde Frau tritt auf. Sie singt &amp;quot;Sound of Silence&amp;quot; und zieht damit alle Anwesenden in ihren Bann. Denn die Frau singt nicht nur besonders schön, sondern insbesondere auch mit scheinbar zwei Stimmen zugleich. Viele, insbesondere auch ältere Vampire sind derart berührt von der Vorstellung, dass sie sich nach Beendigung der Vorstellung nur mühsam wieder auf andere Dinge konzentrieren können oder einige blutige Tränen wegwischen.&lt;br /&gt;
&lt;br /&gt;
Liz spricht die Sängerin, deren Name Iliana ist, und den in ihrer Nähe befindlichen Theodore Pursley an. Zumindest er ist Malkavianer und scheint etwas auf die junge Frau zu achten, die verunsichert, schüchtern und abwesend zugleich scheint. Als Benison, der sich mit einigen anderen in einem Nachbarraum befunden hat, in den Hauptraum tritt und die Sängerin erblickt, scheint er aufgebracht zu sein. Theodore gelingt es jedoch, ihn im Gespräch zu beruhigen, so dass er sich in das Nebenzimmer zurückzieht. Anschließend verlässt Theodore mit Iliana das Elysium in Richtung Oper, da die mittlerweile ertönende künstliche Musik aus den Lautsprechern zu dissonant für die junge Frau sei. Auch er selbst habe nichts dafür übrig.&lt;br /&gt;
&lt;br /&gt;
Liz hört zufällig einige Fetzen eines Gesprächs zwischen dem soeben eingetroffenen &amp;quot;Brillen-Lala&amp;quot; (ich finde seinen Namen nicht im Wiki...) und Ezekiel Porter. Sie mischt sich, gefolgt von Neil, in das Gespräch ein, bei dem es um Gerüchte zu einem LaSombra geht, der sich in Harlem aufhalten soll. Porter versucht &amp;quot;Brillen-Lala&amp;quot; zu überzeugen diesem Gerücht nachzugehen, um sich für seinen Start in NY einen guten Namen zu machen. Neil redet ihm das aber schnell aus. &lt;br /&gt;
&lt;br /&gt;
Ein Anruf von David Hamilton bei Neil beendet die heitere Zusammenkunft, denn offenbar besteht Redebedarf. Auch Liz soll mit in Davids Büro kommen. Da sich die Sache recht ernst anhört, brechen die beiden kurz danach in Richtung Polizeigebäude auf. Liz schwingt sich hinter Neil auf sein Motorrad und gemeinsam düsen die zwei zu David.&lt;br /&gt;
&lt;br /&gt;
=== Amanda ===&lt;br /&gt;
Liz und Neil bekommen im Polizeihauptquartier ihre Besucherausweise und dürfen dann direkt zu David rein, der jedoch nicht allein ist. Mit im Büro befindet sich Amanda Dimitros, die in keinem guten psychischen Zustand zu sein scheint. David schildert die Dinge aus seiner Sicht, wobei einerseits der nachlässige Umgang mit der Maskerade beim Trinkversuch mit Peter und Franzi thematisiert wird, als auch die in seinen Augen barbarischen Regeln kritisiert werden, die Amanda praktisch zum Eigentum Heshas machen. Offenbar musste ein schwer verletzter Kellner in ein Krankenhaus eingeliegert werden, und die Erklärungsversuche zum Dasein der Vampire haben Amanda wohl mehr verängstigt und verstört als angenommen.&lt;br /&gt;
&lt;br /&gt;
Liz und Neil versuchen gemeinsam sowohl David als auch Amanda davon zu überzeugen, dass Peter und Franzi sicher nur Gutes im Sinn hatten. Ferner besteht Einigkeit darüber, dass man Amanda nicht sofort Hesha übergibt und sie zunächst in eine Art Schutzhaft genommen wird. David bietet Amanda an als ihre Blutquelle zu fungieren (wie Susan DAS wohl findet?!?). &lt;br /&gt;
&lt;br /&gt;
Danach führt Liz ein persönliches Gespräch mit David, in dem es hauptsächlich um Susan geht. Das Gespräch scheint zumindest teilweise zu seiner Beruhigung zu führen, dennoch stehen ihm Tränen in den Augen. &lt;br /&gt;
&lt;br /&gt;
Neil unterhält sich derweil mit Amanda und erfährt einiges über ihre Vorgeschichte. Sie war vorher im Rutherford House tätig, ist dort aber irgendwann Hesha aufgefallen, der dorthin Kontakte hat. Als dann Amandas Vorgänger Vegel plötzlich Ende letzten Jahres verstarb, lieh Hesha sie für die Position der Forschungsleiterin aus. Sie übernahm daraufhin einige von Vegels Projekte.&lt;br /&gt;
&lt;br /&gt;
Irgendwann muss es dann zu einer Begebenheit gekommen sein, bei der Thompson - vermutlich bei irgendeinem Auftrag - schwer verletzt wurde. In der Folge wurde Hesha Amanda gegenüber direkter und machte auch Andeutungen über seine Natur. Seit dieser Zeit fühlte sich Amanda nicht mehr wie eine geschätzte Mitarbeiterin, sondern eher wie eine wichtige Gefangene.&lt;br /&gt;
&lt;br /&gt;
Im Rahmen der Forschungen war eines von Vegels Projekten ein alter Steinblock, in dem Gegenstände vermutet wurden. Vegel hatte sich bis dahin an alle Regeln der archäologischen Kunst gehalten, war aber nicht fündig geworden. Amanda fand jedoch durch eine Art Eingebung einen Ring, der zwei verschlungene und sich gegenseitig in den Schwanz beißende Schlangen darstellt und mit einem Rubin geschmückt ist, dessen Einfassung mit Hieroglyphen versehen ist. Amandas Einschätzung nach muss dieser Ring aus einer sehr frühen Dynastie stammen, kann aber ohne ihre Aufzeichnungen leider kaum weitere Informationen liefern.&lt;br /&gt;
&lt;br /&gt;
Nachdem die Gespräche beendet sind und Neil Amanda den Kontakt von Minx gegeben hat, um mit Gleichgesinnten die Regeln der Kainiten zu lernen, verabschiedet man sich. Als Amanda Neils Hand ergreift, überkommt sie eine Vision:&lt;br /&gt;
Es geht um eine junge Frau...ein Mädchen, dass blind, einsam und verängstigt auf der Suche nach einem Weg nach Hause ist. Sie weint um ihre gefallene Schwester, die im Osten - gezeichnet vom Licht der drei Sonnen - das Grab des gefallenen Gottes jagt. Die Vision endet mit einem eindringlichen Hinweis, dass Neil sie nicht berühren dürfe.&lt;br /&gt;
&lt;br /&gt;
Amanda kann sich daran nicht mehr erinnern, als sie wieder zu sich kommt. &lt;br /&gt;
&lt;br /&gt;
== 14. Juni ==&lt;br /&gt;
=== Jersey City ===&lt;br /&gt;
==== Der Auftrag ====&lt;br /&gt;
Am nächsten Abend holt Neil Liz wieder ab, gemeinsam geht es zum verabredeten Treffpunkt. Dort sprechen sie mit Kat, bevor Neil und Liz sich auf den Weg zum Baron machen. Dabei bestätigt sie auf Nachfrage, dass sie die Ekaterine aus den Briefwechseln des Ordens des Roten Sterns ist. Sie habe diesen Weg aber bereits vor langer Zeit verlassen. Die Erwähnung des Ordens verschlechtert ihre Laune deutlich.&lt;br /&gt;
&lt;br /&gt;
Jersey ist ein eher ärmlicher bzw. zu weiten Teilen auch verlassener Bereich. Hier gibt es viele Mülldeponien. Der Weg führt die Beiden in Richtung eines Steinhauses, in dem sie ein Helfer des örtlichen Barons Cameron Douglas begrüßt. Zum Erstaunen der Beiden handelt es sich um Ricardo Montalban, der Liz überschwänglich begrüßt und ihnen den Weg zum Baron weist.&lt;br /&gt;
&lt;br /&gt;
Cameron berichtet etwas über seinen Werdegang (Software-Entwickler, Ventrue) und erklärt, dass die Anarchen in New Jersey eigentlich nur ihre Ruhe haben wollen. Sie würden dafür auch verhindern, dass Feinde von hier aus New York erreichen. Leider würde man sich von New Yorker Seite immer wieder in die hiesigen Belange einmischen und hier jagen (insbesondere Berman, Sinclair und Vitel sind hier wohl Antreiber). Außerdem würde auch die Geißel immer wieder Ausflüge hierher unternehmen und sich Personen rauspicken, die sich nicht beim Prinzen vorgestellt haben - obwohl Jersey ja eigentlich gar nicht zum New Yorker Gebiet gehört.&lt;br /&gt;
Man sei aber trotzdem bereit, sich um Einigung zu bemühen. Daher habe er nach Vermittlung durch Kat und Jack entschieden, Liz und Neil die Möglichkeit zu geben, Vertrauen in Jersey zu gewinnen, indem ein Todesfall aufgeklärt wird.&lt;br /&gt;
&lt;br /&gt;
Seit einiger Zeit gibt es Streit unter einigen einflussreicheren Kainiten Jerseys. Dabei geht es um die Verwendung und den Besitz eines kleinen Waldstücks, dem Beltower Forrest. Als Vermittler wurde ein Kainit namens Rodney bestellt. Dieser habe mit allen Beteiligten ein Treffen vereinbart, das vor zwei Nächten stattfand. Rodney überlebte dieses Treffen nicht und die vier anderen Teilnehmer an der Verhandlung beschuldigen sich nun gegenseitig, der Mörder zu sein. Bei diesen handelt es sich um&lt;br /&gt;
# Chandrakant, einen Ravnos&lt;br /&gt;
# Eli, einen Gangrel und Mitglied einer Gang&lt;br /&gt;
# Milele, einer Gangrel aus Afrika&lt;br /&gt;
# Pavel Sokolov, einem Nosferatu&lt;br /&gt;
&lt;br /&gt;
Liz und Neil sollen nun herausfinden, wer für den Tod Rodneys verantwortlich ist und ihn dem Baron melden.&lt;br /&gt;
&lt;br /&gt;
==== Der Tatort ====&lt;br /&gt;
Ricardo begleitet Liz und Neil zum Tatort, teilt ihnen die Aufenthaltsorte der vier Verdächtigen mit und gibt auch noch den Hinweis, dass ein Malkavianer namens Oliver hier in der Nähe wohnt und möglicherweise Hinweise geben könnte, obwohl er sein Haus nie verlässt. Eine Kommunikation mit ihm sei jedoch extrem schwierig.&lt;br /&gt;
&lt;br /&gt;
Beim Tatort handelt es sich um eine ehemalige Bar, bei der man die Trümmer des Mobiliars an die Seitenwände geräumt, aber einen Tisch und sechs Stühle neu aufgestellt hat, um den Anwesenden eine passable Gesprächsatmosphäre zu bieten. Im hinteren Bereich liegt der geköpfte Körper von Rodney. Der Kopf liegt etwas weiter weg. Scheinbar wurde ein sehr scharfer Gegenstand genutzt. Eine Begutachtung des Raumes ergibt, dass Rodney vermutlich von hinten erwischt wurde. Ricardos Erläuterungen zufolge soll dies während der Verhandlungen passiert sein, weswegen die bisherigen, sehr unterschiedlichen Schuldzuweisungen keinen Sinn machen. Doch angeblich habe man auch Maßnahmen ergriffen, die eine Einmischung von außen verhindern sollten.&lt;br /&gt;
&lt;br /&gt;
Während Neil den Tatort untersucht, führen Liz und Ricardo ein Gespräch unter vier Augen (hoffentlich!). Sie macht sich große Sorgen um ihn und beschwört ihn erst einmal nicht mehr nach NY zurückzukommen. Insgesamt erscheint Ricardo ruhig und nicht mehr wütend wie zuvor; außerdem behauptet er nicht mehr dem Sabbat anzugehören und auch nicht mehr das Blutband zu seinem Pack zu spüren. Wer weiß...&lt;br /&gt;
&lt;br /&gt;
==== Der agoraphobische Malkavianer ====&lt;br /&gt;
Im Anschluss an die Tatortbesichtigung suchen Liz und Neil Oliver auf, während Ricardo zurückbleibt. Die Bude von Oliver ist vollgestellt mit allerlei Kram, Möbeln und Zeitschriftenstapeln. Er selbst redet immer wieder mit sich selbst bzw. einer nicht vorhandenen Person. Dies beginnt bereits bei der Beantwortung von Neils Frage, ob man eintreten dürfe.&lt;br /&gt;
&lt;br /&gt;
Das folgende Gespräch ist tatsächlich recht schwierig, da Oliver nur sehr wenig über die Ereignisse berichten kann. Er sei schließlich immer hier gewesen. Es ist aber offenkundig, dass seine Wahrnehmung über die Grenzen seines Einzimmerappartements hinaus geht. Er bedauert das Dahinscheiden Rodneys und hatte auch kürzlich noch Kontakt mit ihm. Rodney hatte sich bei Oliver nach Theodore Pursely erkundigt und wie man mit ihm am besten in Kontakt treten könne, da dieser der Eigentümer des streitgegenständlichen Waldstücks sei.&lt;br /&gt;
&lt;br /&gt;
Beim Verlassen des Raumes fällt auf, dass Oliver mit ein paar Zahnstochern spielt. Er hat sie in kleinen Gruppen vor sich ausgelegt: Einmal zwei, einmal drei und letztlich ein einzelner. Dan schiebt er einen von der Dreiergruppe zum einzelnen und zerbricht dann letzteren.&lt;br /&gt;
&lt;br /&gt;
==== Die vier Verdächtigen ====&lt;br /&gt;
Liz und Neil einigen sich darauf, zunächst Milele aufzusuchen. Diese treffen die beiden im Garten eines Hauses an, der zu einer Art Ritual- oder Kampfplatz mit am Rand aufgestellten Laternen gemacht wurde. Die Gangrel hat zunächst die Gestalt eines schwarzen Panthers und verwandelt sich vor den Augen von Liz und Neil.&lt;br /&gt;
Im Gespräch nennt sie die beiden &amp;quot;Wahrheitssucher&amp;quot;, ist aber verwundert, warum sie kein Totem haben, da es ohne Totem doch nahezu unmöglich sei, die Aufgaben eines Wahrheitssuchers auszuüben. Auch wenn es sicherlich interessant wäre, mehr über die Glaubenswelt der Afrikanerin zu erfahren, konzentriert man sich schnell auf die Ereignisse der vorletzten Nacht. Milele erweist sich als hilfsbereit und berichtet ihre Version.&lt;br /&gt;
&lt;br /&gt;
Danach sollen alle bis auf Eli pünktlich zum Treffen erschienen sein. Nach einem kurzen gemeinsamen Gespräch in einer bestimmten Sitzordnung habe Rodney dann vorgeschlagen, in kleinen Gruppen miteinander zu reden und eine Lösung zu suchen. Während dieser Gespräche habe Eli in der Nähe Rodneys gestanden. Dann habe man Rodney aufschreien gehört und als man sich dorthin umgewandt hat, fiel er bereits nach vorne über, der Kopf abgetrennt. Man habe dann fluchtartig das Gebäude verlassen.&lt;br /&gt;
&lt;br /&gt;
Weitere Nachfragen ergeben, dass sich Milele absolut sicher sei, dass niemand von außen dazugestoßen sein könne. Der Geruch habe sich seit dem Beginn der Verhandlung nicht geändert.&lt;br /&gt;
Auch die Katze des Inders Chandrakant habe auf dem Tisch am Kopfende beruhigend geschnurrt, so dass Milele nicht von einer Bedrohung ausgegangen sei.&lt;br /&gt;
&lt;br /&gt;
Doch bei einer Nachfrage wirkt die Gangrel verwirrt. Zwar kann sie sich genau erinnern, wo die vier Verdächtigen gesessen haben. Doch eine Frage nach den beiden weiteren Stühlen beantwortet sie dahingehend, dass nur fünf Stühle vorhanden gewesen seien. Die zögerliche Antwort macht auf Liz und Neil nicht den Eindruck, als würde sie lügen, sondern schürt eher den Verdacht, dass jemand mit ihrem Gedächtnis gespielt hat. Die Anwendung der Disziplin Beherrschung im Anschluss an die Tat wird daher von Liz und Neil in Betracht gezogen.&lt;br /&gt;
&lt;br /&gt;
Letztlich erklärt Milele ihr Interesse an dem Wald mit der relativen Abgeschiedenheit.&lt;br /&gt;
&lt;br /&gt;
Danach soll Eli befragt werden. Dieser ist Teil einer Motorrad-Gang. Die Mitglieder sind naturgemäß provozierend und es entwickelt sich ein kleines Wortgefecht, das im Angebot von Eli mündet, dass sich Liz und Neil ja im Rahmen eines kleinen Tests bewähren könnten. Die beiden willigen ein und Liz wird von einem bulligen Biker zur Schlägerei herausgefordert.&lt;br /&gt;
Im folgenden Kampf ohne Einsatz von Disziplinen erleidet Liz zwar einige Treffer, die besonders aufgrund der nicht ganz zurückgebildeten Krallenhände des Gangrel schmerzhaft sind. Aber die erlernten Kampfkünste und die hohe Beweglichkeit versetzen Liz in die Lage, den Kampf für sich zu entscheiden und ihren Gegner auf den Asphalt zu befördern.&lt;br /&gt;
&lt;br /&gt;
Eli bittet Neil daraufhin, ihn ein paar Schritte zu begleiten. Dann beginnt er, die Regeln für die folgende Konfrontation zu erläutern: Keine Disziplinen und die Maskerade muss zwingend gewahrt bleiben. Während Neil sich bereits den Hoodie auszieht, um sich kampfbereit zu machen, tritt Eli auf die Straße und wird von einem Fahrzeug erfasst. Er wird aufgeladen und schlägt schwer verletzt auf der Straße auf. Der Fahrer steigt aus und hastet panisch zu Eli.&lt;br /&gt;
&lt;br /&gt;
Der Mensch zückt weinerlich sein Handy, um einen Krankebwagen zu rufen. Dann kapiert auch Neil, dass es sich um den eigentlich Test handeln muss und überzeugt den Unfallfahrer, dass ein Krankenwagen bereits unterwegs sei. Die erste zaghafte Beruhigung des Mannes wird zunichte gemacht, da Eli sich nun zu regen beginnt und sich schwer verletzt aufrichtet, was eine mittlere Panikattacke bei dem Fahrer auslöst. Was würde Präsenz die Angelegenheit vereinfachen...aber: keine Disziplinen.&lt;br /&gt;
&lt;br /&gt;
Mit Mühe gelingt es Neil, den Mann davon zu überzeugen, dass er wohl unter Schock stehen muss und führt ihn weiter vom Unfallort weg, während Eli seine Knochen und sein heraushängendes Auge richtet. Leider ist der Unfall nicht unbemerkt geblieben, so dass sich schnell drei Schaulustige nähern. Doch Neils Aufforderung, dem Fahrer zu helfen, vertreibt zwei davon schnell, die plötzlich wichtige andere Sachen zu erledigen haben. Der Dritte bemüht sich dann aber tatsächlich um den Fahrer, während Neil zu dem amüsiert grinsenden Eli zurückkehrt, der darauf hinweist, dass die Angelegenheit noch nicht ganz gelöst ist.&lt;br /&gt;
&lt;br /&gt;
Schließlich gelingt es Neil, den Unfallfahrer (wohl eher das Opfer) von seinem Schockzustand zu überzeugen, den weiteren Zeugen loszuwerden und einen Abschleppdienst zu rufen, der in der Lage ist, etwaige verräterische Spuren am stark zerstörten Wagen zu beseitigen. Der arme Mann wird von Neil nach Hause gebracht und Neil versichert, sich um alles zu kümmern und sich zu melden, wenn es noch Probleme geben sollte.&lt;br /&gt;
&lt;br /&gt;
Nach der für die Gangrel offenbar erheiternden Sequenz ist Eli bereit, seine Version der Geschichte beizusteuern. Im Wesentlichen ähnelt diese der Version Mileles. Doch Eli behauptet, der Ravnos sei zu spät gekommen und habe zuletzt in der Nähe Rodneys gestanden, so dass er der Mörder sein müsse. Eli meint zwar, einen sechsten Stuhl gesehen zu haben, dieser sei aber nicht benutzt worden...soweit er sich erinnere. Liz und Neil sind sich aber sicher, dass alle Stühle vom Tisch abgerückt waren und damit benutzt aussahen.&lt;br /&gt;
Das Schnurren der Katze war für Eli eher nervend. Eli behauptet, dass er während des Tatzeitpunkts mit Pavel verhandelt habe; aber die Positionen der beiden seien unvereinbar.&lt;br /&gt;
&lt;br /&gt;
Letztlich verrät er, dass sich im Waldstück wohl Werwesen aufhalten und eine anderweitige Nutzung mit Sicherheit gewaltsam verhindern würden. Diese Auseinandersetzung wolle man vermeiden, weswegen Eli Anspruch erhoben habe.&lt;br /&gt;
&lt;br /&gt;
Der nächste Verdächtige, den Liz und Neil aufsuchen, ist der Nosferatu. Bei ihm handelt es sich im einen Geschäftsmann im Entsorungsgewerbe, der aus dem Wald eine neue Deponie machen will. Nachdem Neil darauf besteht, über die Ereignisse um Rodney zu sprechen, wird Pavel kurz etwas unleidlich, bis er durch einen anderen Nosferatu, der plötzlich aus seiner Verdunklung in der Gesprächsrunde auftaucht, zur Raison gebracht wird: Calebros.&lt;br /&gt;
&lt;br /&gt;
Im anschließenden Gespräch meint Pavel, Milele sei die Nachzüglerin gewesen und als Afrikanerin per se verdächtig. Jedenfalls habe sie Rodney auf dem Gewissen.&lt;br /&gt;
&lt;br /&gt;
Pavel ist sich relativ sicher, dass es nur fünf Stühle gegeben hat; aber auch er wirkt etwas verunsichert. Außerdem habe er zu Beginn der Verhandlungen sichergestellt, dass sich niemand verdunkelt im Raum befindet. Er bestätigt auch, dass Eli zum genauen Tatzeitpunkt mit ihm geredet habe.&lt;br /&gt;
&lt;br /&gt;
Hier verdichten sich die Hinweise, dass es wohl eher nicht Beherrschung ist, die angewendet wurde, da diese schwierig auf mehrere anzuwenden ist und wohl auch keine unterschiedlichen Versionen erzeugen kann. Aber die Ravnos sind ja geübt in Illusionen. Daher wird nun Chandrakant aufgesucht.&lt;br /&gt;
&lt;br /&gt;
Der Ravnos haust in einer windschiefen Lagerhalle. Doch von innen sieht es eher aus wie ein indischer Palast. Neils Meinung nach eine Illusion, wenn auch alles komplett real wirkt. Chandrakant ist offenbar blind und teilt auf Nachfrage etwas zögerlich seine Version mit. Offenbar kann er durch die Augen seiner Katze sehen, die während des Gesprächs auf Liz' Schoß springt und sich schnurrend kraulen lässt.&lt;br /&gt;
&lt;br /&gt;
Nach Auffassung des Ravnos ist Pavel zu spät gekommen und stand auch als letzter in der Nähe Rodneys. Auch er meint, dass nur fünf Stühle dort waren und auch nur fünf Personen. Das Waldstücke hätte er im Falle des Erwerbs zur Ausbildung seiner Tiervertrauten genutzt. Tatsächlich ist uns in Jersey eine unnaturliche Anzahl und Mischung an verschiedenen Tieren aufgefallen - insbesondere Raben, Krähen und Tauben. Doch Chandrakant teilt mit, dass er seinen Anspruch bereits aufgegeben habe und sich nach Alternativen umschaut.&lt;br /&gt;
&lt;br /&gt;
==== Letzte Erkundigungen ====&lt;br /&gt;
Dann folgt ein Telefonat mit Theodore Pursley, um ggf. zu ergründen, ob er noch Informationen zu Rodney hat. Immerhin wollte dieser ihn wegen der Eigentumsverhältnisse sprechen. Theodore teilt mit, dass ihn niemand wegen des Waldstückes kontaktiert habe. Er sei zwar bereits seit langem nicht mehr da gewesen. erworben habe er es 1923. Aber vielleicht wolle er irgendwann mal wieder den dortigen Tönen lauschen.&lt;br /&gt;
&lt;br /&gt;
Bei der Gelegenheit interviewt Liz den Malkavianer hinsichtlich der besonderen Sängerin Iliana. Diese sei wegen einiger Ereignisse in Atlanta, unter besonderer Beobachtung von Benison. Die Blutsschwestern Ilianas hätten damals eine Art Aufstand gegen den Prinzen geprobt. In der Folge der Ereignisse sind einige Kainiten umgekommen, unter anderem auch die Tochter von Benison.&lt;br /&gt;
&lt;br /&gt;
Etwas ratlos diskutieren Liz und Neil ihre Erkenntnisse. Niemand der Verdächtigen hatte ein durchschlagendes Motiv. Niemand - soweit beurteilbar - wirklich die Fähigkeit, die Wahrnehmung von mehreren anderen Personen so sehr zu beeinflussen. Außer vielleicht der Ravnos, der aber bereits von seinem Anspruch zurückgetreten war.&lt;br /&gt;
&lt;br /&gt;
Neil befragt nach einer Stippvisite beim Baron mit Sachstandmeldung per Text Kat zu Disziplinen, die die beschriebenen Effekte haben können und Robert zu Informationen zu den Verdächtigen. Doch eigentlich ist klar, dass wohl eine ominöse sechste Person dahinter stecken muss und mit den verwirrenden Angaben der anderen vier von sich ablenken will. Die Infos von Robert geben keine besonderen Hinweise mehr. Kat jedoch bestätigt eine Annahme von Liz und Neil, dass auch Malkavianer in der Lage sein könnten, die Wahrnehmung so extrem wie im vorliegenden Fall zu beeinflussen.&lt;br /&gt;
&lt;br /&gt;
Danach wird wegen eines entsprechenden Hinweises des Baron aus dem vorangegangenen Gespräch ein weiteres Mal Oliver aufgesucht.&lt;br /&gt;
&lt;br /&gt;
Das Gespräch gestaltet sich zwar wieder etwas schwierig, doch die zwischenzeitlich gesammelten Informationen bringen etwas mehr Licht in die Aussagen und auch das Zahnstocherbild, das Oliver wohl zwischenzeitlich fertig gestellt hat. Es zeigt ein Haus. Auf der linken Seite befinden sich sechs Zahnstocher, im Inneren fünf und der zerbrochene und rechts davon fünf. Seine Aussage &amp;quot;Sechs sind gekommen, fünf sind gegangen&amp;quot; bestätigt die Vermutung, dass es eben tatsächlich noch einen Teilnehmer der Verhandlungen gegeben haben muss. Weitere Hinweise des Malkavianers können dahingehend gedeutet werden, wie viele Räder die Fortbewegungsmittel hatten, mit denen die Personen angekommen sind. Vermutlich ist der sechste Teilnehmer mit einem Auto gefahren.&lt;br /&gt;
Dann wiederum brabbelt Oliver etwas von der Freiheitsstatue und Miss Harmonie. Ein langsam aufkeimenden Verdacht Neils bestätigt schließlich durch die nächste Aussage, dass Miss Harmony und/oder die Freiheitsstatue auf einem kleinen Metallschild gefangen sind; verwunderlich sei aber, dass statt dem O eine Null steht: Der sechste Teilnehmer ist aus New York gekommen. Die Autokennzeichen in New York zeigen die Freiheitsstatue und Harm0ny wird vermutlich der Schriftzug sein. Jemand, der auffällig nach (musikalischer) Harmonie strebt und zufällig auch ein älterer Malkavianer ist, ist auch der Eigentümer des Waldes. Plötzlich passt alles zusammen.&lt;br /&gt;
&lt;br /&gt;
==== Schlussfolgerung ====&lt;br /&gt;
Rodney muss Theodore Pursley doch kontaktiert haben und hat ihn vermutlich sogar zum Treffen eingeladen. Dieser war tatsächlich da, nachdem er mit seinem Wagen von New York herüber gefahren ist und hat auf dem sechsten Stuhl gesessen - vor ihm die Katze des Ravnos, die er gekrault hat und die deswegen laut geschnurrt hat. Er hat in den Einzelgesprächen zunächst bei zwei anderen gestanden und ist dann zu Rodney gegangen. Aus irgendeinem Grund hat er Rodney dann getötet und die Erinnerung an die Ereignisse bei den anderen Anwesenden vermutlich durch dei Disziplin &amp;quot;Wahnsinn&amp;quot; geändert.&lt;br /&gt;
&lt;br /&gt;
Nachdem Liz und Neil Oliver wieder verlassen haben, bestätigt sich durch eine Kennzeichenabfrage, dass tatsächlich ein Wagen mit dem Kennzeichen ''Harm0ny'' auf Theodore Pursley zugelassen ist.&lt;br /&gt;
&lt;br /&gt;
Das Ergebnis teilen Liz und Neil dem Baron mit, der zwar einerseits etwas erleichtert erscheint, weil keiner der Bewohner Jersey Citys der Täter ist, andererseits aber auch unzufrieden, da er keinen Einfluss auf dem Gebiet von New York hat, um den Täter zur Rechenschaft zu ziehen. Er appeliert diesbezüglich an Neils Gerechtigkeitsempfinden und bittet abschließend um eine Einschätzung hinsichtlich des Waldstücks. Liz und Neil sind sich einig, dass Elis Position wohl die stärkste ist. Ein Eindringen von Vampiren würden Werwesen dort wohl nicht zulassen. Ein Konflikt so nah vor der Haustür New Yorks wäre bestenfalls unschön.&lt;br /&gt;
&lt;br /&gt;
=== New York ===&lt;br /&gt;
==== Das Urteil ====&lt;br /&gt;
Nach einer Besprechung mit Berman über die rechtliche Einschätzung der Angelegenheit - es ist ein ziemlicher Graubereich - und mögliche Strafen für die Vernichtung eines Vampirs ohne Erlaubnis des Prinzen oder in Selbstverteidigung, brechen Liz und Neil zum Haus von Theodore Pursley in Brooklyn auf. Vor einer endgültigen Entscheidung muss er jedenfalls gehört werden.&lt;br /&gt;
&lt;br /&gt;
Der Malkavianer empfängt die beiden Ermittler in seiner Wohnung. Nach etwas verbalem Geplänkel mit Fragen und Gegenfragen gesteht Pursley, Rodney getötet zu haben. Grund seien die Dissonanzen gewesen, die von ihm ausgegangen seien. Er sei sicher gewesen, dass diese Dissonanzen sich weiter ausgebreitet und auch die Töne in New York negativ verändert hätten. Daher habe es keine andere Möglichkeit gegeben, als die Quelle der Dissonanzen verstummen zu lassen und als Nebeneffekt zugleich die Dissonanzen in Jersey City zu erhöhen.&lt;br /&gt;
&lt;br /&gt;
Neil kann sich nicht dazu durchringen, die Todesstrafe auszusprechen (und zu vollziehen). Daher fordert er zunächst die Eigentumsübetragung des Waldstücks an den Baron, damit dieser auch rechtlich in der Lage ist, darüber weiter zu entscheiden.&lt;br /&gt;
Ferner wird Theodore für die Dauer von drei Monaten verboten, das Elysium - und damit die dortigen Auftritte von Künstlern - zu besuchen. Während Neil dies in Anbetracht der langen Lebensdauer Pursleys im Nachhinein als zu kurz empfindet, scheint für den Malkavianer fast schon eine Welt zusammen zu brechen. Er äußert jedenfalls, dass er diese Strafe als grausam empfindet. Während Neil bereits aufsteht und geht, bittet Theodore Liz um eine Äußerung ihres Verständnisses für sein Vorgehen...welche diese ihm nicht geben kann. Liz bekommt dennoch den Kontakt von Iliana, um sie erneut bei sich im Elysium auftreten zu lassen. &lt;br /&gt;
&lt;br /&gt;
Neil setzt Liz zu Hause ab und begibt sich dann nach Hause. Die Ereignisse dieser Nacht schreien nach einer ausgiebigen Meditation.&lt;br /&gt;
&lt;br /&gt;
Liz geht derweil in ihr Appartment, in dem Collin am Küchentisch sitzend schon auf sie wartet. Er eröffnet Liz mit der Rückgabe seiner Wohnungsschlüssel, dass er sie verlässt, weil er sie nicht mehr liebt. Für Liz tut sich ein Abgrund unter ihren Füßen auf und sie fällt... und fällt... &lt;br /&gt;
Collin schlägt die Tür ins Schloss und verschwindet in der Nacht.&lt;br /&gt;
&lt;br /&gt;
==== Cutscene ====&lt;br /&gt;
Eine Gestalt verlässt das Haus in Brooklyn, in dem Theodore Pursley wohnt und geht in Richtung eines Motorrades. Beim Motorrad angekommen, holt sie ein neumodisches Klapphandy hervor und berührt eine Schnellwahltaste. der Person am anderen Ende teilt sie mit, dass &amp;quot;er&amp;quot; (Theodore) nichts gesagt habe. &amp;quot;Sie&amp;quot; wüssten nichts und &amp;quot;''Neil hat die Erklärung geschluckt.''&amp;quot; Im Anschluss erkundigt sich die Gestalt nach dem nächsten Ziel.&lt;br /&gt;
&lt;br /&gt;
Danach wird das Gespräch beendet. Kurz bevor Sie davonfährt schlägt Sie Ihre Kapuze zurück und die Gestalt entpuppt sich als Lydia, die nun in die späte Nacht davon braust.&lt;br /&gt;
{{Navbox chapter}}&lt;/div&gt;</summary>
		<author><name>Anatol</name></author>
	</entry>
	<entry>
		<id>https://camnet.oetterer.eu/index.php?title=Das_Erbe_des_Kappadozius&amp;diff=5084</id>
		<title>Das Erbe des Kappadozius</title>
		<link rel="alternate" type="text/html" href="https://camnet.oetterer.eu/index.php?title=Das_Erbe_des_Kappadozius&amp;diff=5084"/>
		<updated>2017-10-27T19:02:31Z</updated>

		<summary type="html">&lt;p&gt;Anatol: /* Echo 3 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Chapter&lt;br /&gt;
|title=Das Erbe des Kappadozius&lt;br /&gt;
|number=14&lt;br /&gt;
|start_date=2000/06/01&lt;br /&gt;
|end_date=2000/06/11&lt;br /&gt;
|city=Kaymakli&lt;br /&gt;
|auxiliary_settings=New York&lt;br /&gt;
|pcs=Franzi,Liz,Neil,Olaf,Peter,Susan&lt;br /&gt;
|npcs=Amanda Dimitros,Collin,Hesha,Minx,Robert Sinclair,Theagenes von Megara,Thompson,Von Braun,Shepherd&lt;br /&gt;
|artefacts=Herz der Dunkelheit,Rayzeels Träne&lt;br /&gt;
|session_date=2017/04/28&lt;br /&gt;
|session_duration=4&lt;br /&gt;
|session_location=Jesberg&lt;br /&gt;
|description=Auf der Suche nach einer Prophezeiung von Saulot begeben sich die Spieler in Kappadozius' legendäre Felsenstadt Kaymakli.&lt;br /&gt;
|gathered_information={{Info&lt;br /&gt;
|payload=* ist das Kind von Jafet, der das Kind von Kappadozius ist.&lt;br /&gt;
* war in Kaymakli und hat ausgewählt, wer von den Kappadozianern die Stadt verlassen darf und wer bleiben muss (vgl. Kap. 14, 6. Erinnerung&lt;br /&gt;
|source=Susan&lt;br /&gt;
|target=Larimas&lt;br /&gt;
|type=Hintergrund&lt;br /&gt;
}}&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;div class=&amp;quot;nonumtoc&amp;quot;&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
==Intro==&lt;br /&gt;
Susan liegt auf der Couch einer/s Psychaterin/s und berichtet von ihrer Queste und ihrem Klüngel:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Wer zählt zu Ihren Verbündeteten?&amp;quot; - Die Reihenfolge ist: Liz, Olaf, Neil, Marc, Franzi, Peter. Dann von Braun, Federico, Bedford. Vielleicht Minx und Collin. Unsicher: Larimas und Hazimel.&lt;br /&gt;
&lt;br /&gt;
Susan reflektiert ihre Beziehungen zu all diesen Personen. An Liz wird ihr Verständnis für Susan und ihr Wille gelobt, an Olaf Inspiration und die Möglichkeit der Auseinandersetzung, an Neil seine Standhaftigkeit. Alle anderen - nun, Marc ist &amp;quot;eigen&amp;quot;, Franziska eine Freundin, wobei man sie von Peter nicht trennen kann, der Prinz ein enger Verbündeter, aber kein Freund, Federico ein wichtiger Mentor für Liz, aber auch ein Geheimniskrämer. Larimas verfolgt lediglich eigene Pläne, der ist kein Verbündeter. &amp;quot;Ich hoffe, wir stehen auf der gleichen Seite, wenn nicht, müssen wir etwas unternehmen. Die Kluft ist zu groß. Ich sehe nicht, wie wir näher zusammen kommen können.&amp;quot; Hazimel ist schon eher ein Verbündeter, &amp;quot;wir haben viele ähnliche Ziele. Ich weiß nicht, ob wir das gleiche Ende planen. Wir können ihn auf unsere Seite ziehen, eher als Larimas&amp;quot;. ''Nunja.'' Die Beschreibung der Beziehung Franzi-Peter auch nicht gerade rosig: &amp;quot;Da ist Liebe, aber auch Tragik - gerade für Peter.&amp;quot; ''Hm.''&lt;br /&gt;
&lt;br /&gt;
Über Anatol möchte Susan nicht gerne reden. &amp;quot;Sein Pfad, seine Geschichte berührt mich sehr, er ist eine herausragende Persönlichkeit.&amp;quot; Die Begegnung mit ihm war ein Wendepunkt in mehrfacher Hinsicht.&lt;br /&gt;
&lt;br /&gt;
Gesammelte Hilfsmittel: Die Speerspitze von Jerusalem, ein mächtiges Artefakt, und Hazimels Gaben: Stab und Kette. &lt;br /&gt;
&lt;br /&gt;
New York ist sicher! Das haben wir uns erschaffen!&lt;br /&gt;
&lt;br /&gt;
Und der Plan? Nun, wir wissen, was wir wollen. &lt;br /&gt;
&lt;br /&gt;
&amp;quot;Ich weiß, dass wir es schaffen können. Aber ich habe keine Ahnung, wie. Es geht nur zusammen, mit meinen Gefährten.&amp;quot; &lt;br /&gt;
&lt;br /&gt;
''Wie meinen?''&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Am 1. Juni werden wir weitere Schritte tun, endlich unseren Pfad einzuschlagen.&amp;quot; &lt;br /&gt;
&lt;br /&gt;
''Nun, immerhin...''&lt;br /&gt;
&lt;br /&gt;
==1.6.2000 Reiseplanung==&lt;br /&gt;
Wir treffen uns im Hurricane und berichten uns von den vergangenen Wochen seit unserem Ausflug nach Atlanta. Kleinere Verstimmungen wegen Franzis und Peters spontanem Urlaub am Meer. Collin ist anwesend und wir besprechen uns noch einmal mit ihm im Nachgang der Erlebnisse im Traumpalast. Federico ist verschwunden. Collin wirkt durchaus so, als müssten wir nur fragen und dann würde er helfen, wir lassen ihn aber gehen und sich um seine Bar kümmern. Hm.&lt;br /&gt;
&lt;br /&gt;
Der Prinz sendet Nachricht, dass er sich verspäten wird. Aber Hesha kommt vorbei mit guten Neuigkeiten. Er hat die Informationen entschlüsselt, die wir aus Hazatlan mitgebracht haben. Wir können aufbrechen nach [[Kaymakli]]. Hesha fasst die zentralen Informationen für uns noch einmal zusammen: &lt;br /&gt;
&lt;br /&gt;
* Kaymakli war ein Wissenhort der Kappadozianer.&lt;br /&gt;
* Kaymakli ist versiegelt worden von Kappadocius selbst, zwischen 700 und 850 C.E.&lt;br /&gt;
* Es gab dort Schriften auf Pergament, Papyrus und in Stein gemeißelt. Was davon erhalten ist, ist unklar.&lt;br /&gt;
* Kaymakli ist verborgen. Es braucht zudem ein Ritual, um das Tor zu öffnen. Hesha weiß nun, wo das Ritual zu finden ist, nämlich etwa eine Tagesreise von Kaymakli entfernt. Das ist genau die Info, die wir aus Hazatlan mitgebracht haben.&lt;br /&gt;
* Heshas Expedition startet 04:00 Uhr in der nächsten Nacht und er rechnet damit, dass wir mitkommen wollen.&lt;br /&gt;
* Er selbst will eine Krone und einen Stab haben, setitische Gegenstände.&lt;br /&gt;
&lt;br /&gt;
Amanda ist auch mitgekommen, sie wirkt sehr ruhig und still. Offenbar hat Hesha ihr etwas erzählt, denn sonst wurde sie ja immer rausgeschickt. Susan sucht das Gespräch mit ihr, aber mit Hesha im Raum ist nicht viel aus ihr herauszubekommen. Wir besprechen noch einmal die Details unserer Abmachung, dann geht Hesha (und nimmt Amanda mit...)&lt;br /&gt;
&lt;br /&gt;
Kurz darauf trifft der Prinz zusammen mit Robert ein. Er hat uns nicht gerade verziehen, aber er ist bereit, weiter mit uns zusammen zu arbeiten. Insbesondere schafft er mehr Offenheit, indem er die Existenz des sogenannten Triumvirats (von Braun, [[Robert_Sinclair]] und [[Halmar]] (Nosferatu zz. in Köln)) bestätigt, eine Karte vorzeigt, auf der Verbündete in aller Welt eingetragen sind und überhaupt sich so offen gibt wie nie zuvor. Der Prinz gibt sogar [[Lichtbringers_Freiheit]] und den [[Trank_des_Blutbandbrechers]] scheinbar unmotiviert wieder an Peter (der beide Gegenstände später an Franziska weiterreicht). Er warnt noch einmal vor Hesha, wir versprechen unser Bestes zu geben, dann verbringen wir den Rest der Nacht mit Planung und Einkäufen.&lt;br /&gt;
&lt;br /&gt;
Im Büro des Hurricane findet noch ein Gespräch zwischen Collin, Liz und Susan statt. Auf die Frage, ob Collin mitkommen möchte, antwortet er, dass er lieber im Hurricane bleiben und die Umbauarbeiten beaufsichtigen möchte. Außerdem ist es ein Test für ihn, wie gut er allein klar kommt und auf Liz Hilfe verzichten kann. Rückfragen von Susan bezüglich der Time Square - Sequenz im Traumpalast lassen in Collin die Sorge entstehen, dass Susan an ihrer Aufgabe zweifelt: &amp;quot;Du darfst nicht zweifeln, auf deinen Schultern liegt noch eine viel größere Last&amp;quot;. Susan versichert, dass sie nicht zweifelt, aber nach Selbsterkenntnis strebt.&lt;br /&gt;
&lt;br /&gt;
==2.6.2000 Der Flug==&lt;br /&gt;
Neil redet noch einmal ausführlich mit Minx, Liz mit Federico. Olaf geht einkaufen (Ausrüstung bis zum Abwinken und Lara-Croft-Outfit für Liz), Susan besorgt Blutkonserven, dann treffen wir uns am Flughafen. Hesha erwartet uns, Thompson und Amanda sind bei ihm. Wir steigen in eine Frachtmaschine, in der schon drei Humvees stehen. Alles ist sehr zweckmäßig eingerichtet.&lt;br /&gt;
&lt;br /&gt;
Während des Fluges versucht Olaf so lange im Cockpit zu bleiben, wie es eben geht, bevor die Sonne aufgeht. &lt;br /&gt;
&lt;br /&gt;
==3.6.2000 Das leere Nest==&lt;br /&gt;
Vor der Landung erläutert Hesha die näheren Details. Wir werden einmal übertagen müssen bevor sich die Gruppe dann trennen wird. Wir alle besorgen das Ritual, um Kaymakli zu öffnen, die Helfer, Thompson und Amanda errichten das Basislager vor Kaymakli.&lt;br /&gt;
&lt;br /&gt;
Wir schaffen es auch, uns mit Amanda zu unterhalten. Sie hat viele Nachfragen zu Vampiren und wir antworten geduldig, bis wir endlich begreifen, wie wenig Hesha ihr eigentlich erzählt hat und das das möglicherweise Absicht war. Nun, wir versuchen zu retten, was zu retten ist und wenigstens Amandas sichtbares Entsetzen über die Existenz von Vampiren einzudämmen.&lt;br /&gt;
&lt;br /&gt;
Die Frachtmaschine landet in Ankara, wir steigen in die Humvees und los geht's hinein in die anatolische Nacht. &lt;br /&gt;
&lt;br /&gt;
Übertagen wollen wir auf einem großen Anwesen. Aber das Anwesen liegt still, zu still. Aus der Tiefe nur ein schwaches Summen, an der Grenze des Hörbaren, selbst für Franziska und Susan. Vorsichtig sichern wir das Gelände - unser Unterschlupf ist überfallen worden. Die menschlichen Wachen oben sind verschwunden - auf den Sicherheitskameras aber kann man erkennen, dass sie angegriffen wurden. Nur den Angreifer sieht man nicht. Was auch immer es war, ist durch das Dach gekommen. Im Keller Blutkonserven, die klinisch sauber entleert und anschließend zu einem Spinnenmuster angeordnet wurden. Wir finden einen großen Salzkristall (den Hesha letztendlich mitnimmt), an dem Fett haftet, genau dort, wo wir vermuten dass der Anführer des Nosferatunestes gestanden haben muss. Was ist denn hier geschehen? Ein Schrecknet-Account ist noch offen. Eine Warnung ist hereingekommen, aber wohl zu spät. &amp;quot;Nein, es können nicht N... sein...&amp;quot; Hm, wer mögen die N. sein? Nosferatu? Aber wäre das so erstaunlich?&lt;br /&gt;
&lt;br /&gt;
Wir übertagen in einer Ersatzunterkunft. Es ist sehr beengt, aber wir wussten ja, dass dies kein Luxustrip wird.&lt;br /&gt;
&lt;br /&gt;
==4.6.2000 Überraschung in der Feste==&lt;br /&gt;
Olaf ruft bei Puk an, natürlich geht, ob der Zeitdifferenz, nur der AB dran (&amp;quot;Pizzaservice&amp;quot;). Olaf beschreibt ausführlich, warum die &amp;quot;Zweigstelle überraschend geschlossen wurde und alle Angestellten plötzlich entlassen. Hauptzutat fehlte völlig.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wir trennen uns von den menschlichen Begleitern (Amanda bekommt die Aufsicht zu Thompsons Ärger), lassen die Humvees stehen und wandern ins Gebirge. Bei einem Bergdorf werden wir angehalten, aber Hesha verhandelt unser freies Geleit. Allerdings lassen wir zu, dass das Dorf von den örtlichen Milizen ausgelöscht wird. Helden sehen anders aus.&lt;br /&gt;
&lt;br /&gt;
Das Ritual soll in einer alten, verlassenen Bergfeste zu finden sein. Alt ist sie, verlassen weniger. Wir werden begrüßt von [[Zahira_Rahim]]: &amp;quot;Willkommen im Heim von [[Theagenes_von_Megara]]. Zafira ist etwas zwischen Mensch und Ghul. Es gitb aber auch Ghule in der Festung also muss irgendwo ein Vampir sein. Wir folgen ihr in den Berg hinein, dessen Spitze ausgehöhlt wurde. Es sieht aus, als habe jemand den Stein geformt. Hesha zuckt zusammen, als er wir eintreten, ganz als schmerze ihn etwas. In der Feste sind viele Menschen in bunten Gewändern, auch Kämpfer mit Kalaschnikows. Wir folgen einem Bogengang, vorbei an angeketteten Bauern und Dienern, die in armseliger Kleidung den Boden kehren.&lt;br /&gt;
&lt;br /&gt;
Der Thronsaal ist mit Teppichen auf dem Boden und an den Wänden geschmückt. Darauf sind Jagdszenen, an den Wänden hängen jede Menge Waffen, die meisten davon sehr, sehr alt. Auf dem Thron sitzt Theagenes:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Ich freue mich über Gäste, unerwartet, aber willkommen. Gemäß der Lex Talionis des dunklen Vaters biete ich Euch mein Dach als Schild vor der Sonne, meine Herde als Nahrung für den Körper und Diskurs und Gesellschaft als Nahrung des Geistes. Ich erwarte Respekt vor meiner Domäne. Wer seid ihr? Ich bin Theagenes, Kind von Jorak, Kind von Tzimisce.&amp;quot; Ein Tzimisce der fünften Generation. Oh Mist.&lt;br /&gt;
&lt;br /&gt;
Wir stellen uns vor, wobei Peter sich als Toreador ausgibt, um nicht direkt hingerichtet zu werden. Man teilt uns auf in hohe (Tzimisce, Brujah, Toreador) und niedere (Malkavianer, Setiten) Clans. Wir werden sehr verschieden versorgt und untergebracht. Für die kommende Nacht kündigt Theagenes ein Fest zu unseren Ehren an.&lt;br /&gt;
&lt;br /&gt;
==5.6.2000 Das Fest==&lt;br /&gt;
Am nächsten Abend bekommen die Angehörigen der hohen Clans edle Roben als Geschenk (die wir natürlich am Ende mitnehmen - wir können bald eine ganze Ausstellung dieser Dinger vorzeigen). Auch die Sitzordnung bei Theagenes' Fest ist eindeutig. Es gibt die hohe Tafel und die niederen Tische. Nun, Susan ist nicht böse drum und plaudert angeregt mit Hesha. Es treten Tänzer auf, alles wirkt sehr edel und altertümlich. Höhepunkt des Festes ist das Opfer eines Kainskindes. Heißt das, Theagenes kann sich nur noch von Vitae ernähren? Wir haben derlei Gerüchte gehört, trauen uns aber nicht, nachzufragen. Nachdem Theagenes getrunken hat, bietet er den hohen Gästen der Reihe nach vom Opfer an. Olaf dankt und trinkt, Neil lehnt höflich ab, Liz lehnt höflich ab. &amp;quot;Von einem Philosophen habe ich nichts anderes erwartet&amp;quot;, sagt Theagenes und ist sichtlich unwirsch. Welchen Grund kann eine Lasombra haben, sein Angebot abzulehnen? Liz' Erklärung, die Camarilla verbiete es, lehnt er rundweg ab. Er möchte nach dem Fest nichts mehr mit ihr zu tun haben. Brrr. Franziska trinkt und Peter, der noch versucht hat, aus der Nummer rauszukommen, indem er Franziska um Erlaubnis bittet, muss schließlich auch, weil sie euphorisch &amp;quot;Aber sicher!&amp;quot; antwortet. Susan ist wieder einmal nicht böse, gar nicht erst in die Verlegenheit zu kommen.&lt;br /&gt;
&lt;br /&gt;
Dann ist der offizielle Teil des Festes zu Ende und Theagenes zieht sich mit den Hohen Gästen zurück, das heißt mit den hohen Gästen, die getrunken haben, denn Liz ist unerwünscht und Neil hat nicht das Gefühl, dass er ein Gespräch mit Theagenes durchstehen kann. In der Privataudienz gibt sich Theagenes geradezu umgänglich. Wir wissen allerdings, in welcher Gefahr wir weiterhin schweben. Franziska und Peter preisen die Schönheit des Palastes und fragen nach Euklid. Kannte unser Gastgeber den? Diese Art von geistigem Wissen findet er allerdings abwegig und blickt abschätzig auf uns herab. Und es verleitet ihn, eine Geschichte über die Schönheit zum Besten zu geben:&lt;br /&gt;
&lt;br /&gt;
Silla verliebte sich in die Schönheit von Absilimiliard, den größten Jäger seiner Zeit, aber auch eitel war. Sie machte ihn zu ihrem Kind. Er konnte ihr nie verzeihen, weil er dabei seine Schönheit verlor. (Das ist der Punkt von Theagenes' Geschichte.) Er wiederum fand die größte Hexe, Baba Yaga, die jedoch nach dem Kuss floh, so dass er sie nicht an sich binden konnte. Sie wurde zur Mutter aller Nosferatu. Angeblich liegt Absimiliard in Starre, erwacht aber alle 400 Jahre, wenn Reisende zu ihm Pilgern, um Nektuku zu zeugen. (Da sind sie, unsere N. aus der überfallenen Unterkunft!) Die Nektuku jagen die Nosferatu, oder werden es tun, eines Tages. &amp;quot;Und selbst meine Freundin Baba Yaga, die kürzlich erwacht ist, trägt immer noch die Furcht in ihrem Herzen.&amp;quot; Das ist eine Menge Information über die Nosferatu aus erster Hand - Magie (!), die Nosferatu haben sozusagen gar keinen Altvorderen, weil Baba Yaga nicht gebunden wurde, ihre Angst vor den Nektuku, den Kindern des Absimiliard - aber genau jetzt wissen wir das nicht zu würdigen.&lt;br /&gt;
&lt;br /&gt;
Olaf berichtet von unserer Zeit. Als er von der Volderie des Sabbath berichtet, rät Theagenes ihm eindringlich ab: &amp;quot;Ich spüre, wie die Saat unseres Schöpfers aufgeht, in seiner gesamten Brut. Jedesmal, wenn ihr dieser Gabe nachgeht, riskiert ihr, dass ihr dem Verfall anheimfallt. Vergesst, was ihr dort gelernt habt.&amp;quot; Und dann lehrt er Olaf die Anfänge der Wassermagie. Nicht mehr Fleischformen, Wasserformen! Das ist so spektakulär, das wir gar nicht Recht begreifen, dass Theagenes nebenbei auch erwähnt, dass er erwacht ist weil &amp;quot;ein Schrei durch das Kontinuum ging&amp;quot; - es war also ein Großereignis, das ihn geweckt hat. Das Zerreißen des Schleiers? Der misslungene Sprung in Peter hinein? Oder gar Ravnos' Tod? Und der Schöpfer (also Kain?) hat seine Gaben mit sehr konkreten Flüchen belegt, die viel konkreter sind als die Clansnachteile? Gilt das nur für die Tzimisce oder für alle Clans? Wir sind zu beschäftigt, um nachzufragen. Wasser, das sich wie Feuer formen lässt. Peter ist zutiefst fasziniert.&lt;br /&gt;
&lt;br /&gt;
Diese Lehrstunde lässt uns so viel Vertrauen fassen, das wir schlicht nach dem Ritual fragen. Theagenes klopft unsere Referenzen ab, erfährt, dass Hazimel noch lebt, erst als wir erwähnen, dass der Kappadocianer Larimas selbst uns quasi geschickt hat, gibt er sein Geheimnis preis. Mit Bedauern -- denn er ist sicher, dass wir in Kaymakli alle sterben werden -- führt er uns in eine große Halle mit drei kunsvoll verzierten Säulen. Das Ritual!&lt;br /&gt;
&lt;br /&gt;
In der Zwischenzeit werden Hesha, Susan, Liz und Neil von Zahira Rahim eingeladen, sich die Festung zeigen zu lassen. Da sie Verpflichtungen bei den hohen Gästen hat, ruft sie Mas'ud Rahim herbei, der uns herum führen soll. Wir lassen uns von ihm und seiner Familie berichten. Er ist erst 200 Jahre alt und gibt zu, recht ungestüm zu sein (Jugendlicher eben). Er ist dabei eine Reihe von Sprachen zu lernen und er würde gerne von der Welt da draußen mehr erfahren. Er gehört zu Familie der Gouhle Theagenes, die ihrerseits Nachkommen gezeugt haben. Diese Nachkommen habe nie Vitea getrunken, jedoch viele Eigenschaften eines Gouhls geerbt. Die Mutter selbst hat viele Male das Blut von Theagenes getrunken, sie ist über 1000 Jahre alt. Wir begegnen der schwangeren Erie und erfahren von Mas'ud, dass ihre Schwangerschaft bereits 35 Monate dauert. Susan ist beeindruckt, ob der Maßstäbe des Lebens, die hier gelten. &lt;br /&gt;
&lt;br /&gt;
Viel kann sie nicht nachfragen, denn schon wird die kleine Gruppe in die Kampfarena geführt, in der viele schöne Menschen / Gouhle dabei sind, zu trainieren und ihren Körper zu formen. Sie bereiten sich darauf vor, Vampir zu werden und ihrem Herren zu dienen. Es ist eine große Ehre ausgewählt zu werden, die dem Vampir, der letzte Nacht als Festmahl dienste, wiederfahren ist. Auch ihn dürfen wir noch einmal bewundern. Er liegt in einem Nebenraum auf einem Steinpodest und blutet aus. Mit seinem letzten Blut füllt er eine Glasamphore, die unter ihm steht. Eine Reihe weiterer Amphoren zieren die Regale an der Wand dieses Raumes. &lt;br /&gt;
&lt;br /&gt;
Mas'ud selbst möchte auch Vampir werden, doch er hofft, vorher noch einem edlen Herrn Jahr(hundert)e treu zu dienen und fragt uns aus, wie unser Leben so sei und ob es bei uns auch Diener gäbe. Fast möchte man ihn einladen, mit nach NYC zu kommen, doch keiner von uns spricht diese Einladung aus. Dann fragen wir nach weiteren Räumen in der Tiefe der Festung. Wir werden von Mas'ud zu einer großen, kreisrunden Halle mit beeindruckenden Mosaiken und drei kunstvoll verzierten Säulen, den Schlüsseln Kappadozius, geführt. Beeindruckend! &lt;br /&gt;
&lt;br /&gt;
Und dann geht es noch tiefer hinab und wir erreichen eine riesige dunkle Halle/Höhle mit einem großen unterirdischen See. Als Beleuchtung diesen Fackeln, deren Licht auch auszureichen scheint für den Anbau von Pilzen auf Feldern neben dem See. Mas'ud berichtet, dass das Wasser ist die Quelle des Reichtums hier ist, denn es ist das größte Wasserreservior der Umgebung. Der Handel mit dem Wasser ist schon Jahrhunderte sehr lukrativ. Wir bekommen noch einen Eindruck von Mas'ud Stärke, als er einen großen Felsbrocken (Durchmesser 60 cm) mit bloßen Händen hochheben kann. &lt;br /&gt;
&lt;br /&gt;
Da wir von oben Stimmen hören, eilen wir zurück zur Halle mit des Säulen und finden dort den Herren des Hauses mit den hohen Gästen.&lt;br /&gt;
Theagenes ist überrascht und verärgert Mes'ud mit den niederen Gästen hier unten anzutreffen. Liz rettet den Diener, indem sie angibt, das sei ihre Idee gewesen. Mas'ud ist froh, gehen zu dürfen. Theagenes warnt uns noch einmal vor Kaymakli, dann lässt er uns mit dem Ritual allein.&lt;br /&gt;
&lt;br /&gt;
Franziska und Peter fassen die Säulen an, um das Ritual zu erspüren, eine Fähigkeit, die sie sich in ihrer Abwesenheit von New York angeeignet haben. Schließlich haben wir nicht die Zeit, Monate mit dem Erlernen eines Rituals zuzubringen. Wir sind erfolgreich, an zwei Säulen erhalten wir zudem Visionen durch Franziska. Die dritte Säule bekommen wir nur durch pure Willenskraft überhaupt erschlossen, für eine Vision reicht es da nicht mehr.&lt;br /&gt;
&lt;br /&gt;
[In den Visionen ging es um Kappadocius, der mit Larimas Kaymakli verschließt (und damit auch seine &amp;quot;größten Triumphe und Fehler&amp;quot; einschließt), Wächter aufstellt und so fort. In der zweiten Vision führt Kappadozius seinen Schüler Larimas und die anderen Erleuchteten fort vom verschlossen Kaymakli Richtung Venedig in eine neue Zeit... Helft mal aus, bitte.]&lt;br /&gt;
&lt;br /&gt;
==6.6.2000 Das Basislager==&lt;br /&gt;
In der folgenden Nacht tritt Theagenes nicht mehr in Erscheinung. Wir wandern durch die Berge zurück, nehmen die Humvees und erreichen am Ende der Nacht das Basislager, eine kleine Zeltstadt direkt vor der Felswand, die Kaymakli verschließt und die wir schon aus den Visionen kennen. Wir übertagen.&lt;br /&gt;
&lt;br /&gt;
==7.6.2000 Kaymakli==&lt;br /&gt;
Peter vollführt das Ritual, die Tore nach [[Kaymakli]] öffnen sich. Offenbar ist die Stadt aber von einem Erdbeben heimgesucht worden: Die Wächter stehen nicht mehr und das Tor hat Risse. Während wir vorsichtig in den Tunnel hineinschreiten, finden wir ein kleines Lager. Jemand hat vor uns versucht, hineinzukommen, ist aber offenbar gescheitert. Den Zeichnungen an der Wand zufolge hat wer immer es war eine Woche ausgeharrt, bevor er er oder sie aufgab. &amp;quot;Fehlendes Ritual?&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Im eigentlichen Eingang, der raffiniert so gehalten ist, dass kein Licht weiter hinein dringen kann, stellen wir fest, dass Thompson uns nicht folgen kann. Hä? Wir wollen zurück, können aber nicht hinaus. Hesha verbrennt sich, aber Amanda kann in beide Richtungen durch die unsichtbare Barriere. Hm. Hm, hm. Nun, einstweilen ist da nichts zu machen, wir lassen also Thompson zurück und gehen weiter hinein. Unter uns liegt eine riesige Stadt. Am anderen Ende ist ein Palast, verschiedene hohe Gebäude ragen aus dem Häusermeer empor. Ein sanfter Lichtschimmer wandert die Decke der riesigen Kuppel entlang.&lt;br /&gt;
&lt;br /&gt;
Auf Bitten von Hesha bewegen wir uns zuerst zum Tempel des Set, gut zu erkennen an der Statue und den vielen Schlangensymbolen. Unterwegs zum Tempel stellen wir fest, dass es Menschen gegeben haben muss in der Stadt - wer sonst bräuchte eine Bäckerei. Der Staub, der überall herumliegt, ist Asche - aber es gibt keine Anzeichen für ein großes Feuer. Stammt die Asche vollständig von Vampiren? Meine Güte! Auch gehen hier durchsichtige Gestalten umher. Geister? Berühren sie einen, so durchfährt einen ein kalter Schauer. Vor allem aber können wir unsere eigenen Gefühle und Meinungen nicht gut von denen der Geister trennen, was im Folgenden dazu führt, dass wir nach und nach immer paranoider werden. Haben Liz und Peter Blicke getauscht? Warten Neil und Olaf nur darauf, um den anderen in den Rücken zu fallen? Allein Susan (und Neil?) scheinen immun, allerdings wirkt Susan seltsam weggetreten.&lt;br /&gt;
&lt;br /&gt;
Im Tempel des Set finden wir tatsächlich eine riesige Statue, die eine Krone trägt und einen Stab hält. Hesha nähert sich ehrfurchtsvoll, greift den Stab, wendet ihn und zerbicht ihn im Zorn. Es ist eine Replika, jemand hat den echten Stab entwendet. Wir haben so eine Idee, wer das gewesen sein könnte, schließlich haben wir im Traumpalast eine Vision von Clemence mit dem Stab gehabt. Aber wir halten den Mund, kein Grund derart wertvole Informationen an Hesha auszuplaudern. &lt;br /&gt;
&lt;br /&gt;
Dann plötzlich verdreht Amanda die Augen und spricht in Zungen, zu unserer Überraschung auf Deutsch. Zunächst zu Liz:&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
''You left a piece of self behind''&lt;br /&gt;
&lt;br /&gt;
''Beware: The portal of the shadow king leads to freedom from eternal stone''&lt;br /&gt;
&lt;br /&gt;
''But your darkness from within guards it viciously''&lt;br /&gt;
&lt;br /&gt;
''You dare not face it alone''&lt;br /&gt;
&lt;br /&gt;
''Your dare not face it until the very end''&lt;br /&gt;
&lt;br /&gt;
''Let it be the last you do in here''&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann zu Franziska:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
''To look behind doors of molten silver the rose must carry her lantern''&lt;br /&gt;
&lt;br /&gt;
''Take hold of two friends and look back''&lt;br /&gt;
&lt;br /&gt;
''Only memories will greet her''&lt;br /&gt;
&lt;br /&gt;
''It is time to get lost in them''&lt;br /&gt;
&lt;br /&gt;
''Beware: Once you venture down this path, there is no time left anymore''&lt;br /&gt;
&lt;br /&gt;
''Let it be the last you do in here.''&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann bricht Amanda erschöpft zusammen. Die Anweisungen sind für solche Sinnsprüche verhältnismäßig verständlich und obwohl wir zunächst glauben, dass die Laterne für Peter steht (aber warum muss Franzi ihn tragen?), sind wir zuversichtlich, eine Anleitung zum Überleben und Entkommen gefunden zu haben. Interessanterweise hat Hesha von Amandas Gerede auf Deutsch nichts mitbekommen, was die Frage aufwirft, warum. Und wer hat da zu uns gesprochen? Oder hatte Amanda nur eine Eingebung? Hm. &lt;br /&gt;
&lt;br /&gt;
Hesha greift sich ehrfurchtsvoll die Krone von der Statue und lässt Franziska sie berühren. Die sieht mehr, als ein Mensch oder die meisten Vampire fassen können. &amp;quot;Wenn mein Geist nur groß genug gewesen wäre, hätte ich die letzten paar tausend Jahre verstehen können.&amp;quot; Franziska fühlt Allmacht und sieht einen Streitwagen, auf dem sie steht, Krone und Stab bei sich, und ein gegnerisches Heer, das mit einer Handbewegung und ohne Anstrengung von ihr hinweggefegt wird. Mit einem Aufschrei (&amp;quot;Nimmes von mir!&amp;quot;) lässt sie die Krone fallen, Peter fängt sie, Hesha die Krone auf.&lt;br /&gt;
&lt;br /&gt;
Mit Krone und zerbrochenem Stab im Gepäck macht Hesha sich auf den Weg zum Ausgang, um Amanda dort ruhig zu lagern. Er verspricht auf uns zu warten. Ja sicher. Aber egal, wir wissen ja jetzt, wie wir rauskommen. Glauben wir.&lt;br /&gt;
&lt;br /&gt;
Auf dem Weg zum nächsten großen Gebäude, steigert sich unsere Paranoia, so dass klar wird, wie sehr alle anderen (aber nicht ich!) von diesem Ort betroffen sind. Wir warnen uns gegenseitig, aber niemand nimmt ernst, dass auch die eigene Wahrnehmung unzuverlässiger wird. Die Struktur ist verteidigt worden, wir finden Barrikaden und Spuren von Kämpfen wie Pfeilspitzen und Axtkerben. Dieser Bau ist absichtlich zerstört worden. Statuen mit Schwertern und eine Balkenwaage über dem Eingang deuten an, was dies für ein Gebäude war -- wir sind aber zu aufgeregt, um in Ruhe nachzudenken und bekommen es nicht heraus. Neil findet den Kopf einer Statue. Sie trägt eine Krone, auf der eine Stadt und ebenfalls eine Balkenwaage abgebildet sind. Da der Eingang verschüttet ist, gehen wir erst einmal weiter -- und werden nie zurückkehren.&lt;br /&gt;
&lt;br /&gt;
Auf dem Weg zum Palast eskaliert der Streit zwischen uns. Wir beschuldigen uns gegenseitig, unser vorzeitiges Ende zu planen und es braucht Neils Präsenz, um alle zur Räson zu bringen. Wir ahnen, dass wir die Geister der in Kaymakli verendeten Vampire channeln, beruhigen uns aber so weit, dass wir von nun an einigermaßen ungestört weiterlaufen können. Allerdings wissen wir, dass nicht mehr viel Zeit bleibt. Es ist klar, dass wir nicht alles in Ruhe durchsuchen können. Eine zweite Nacht hier würden wir nicht überleben.&lt;br /&gt;
&lt;br /&gt;
Der Weg zum Palast führt durch eine große Arena, in der sechs riesige Golems auf uns warten. Als Neil vortritt, bewegt sich einer von ihnen auf ihn zu. Wir lassen den Palast samt silbernen Türen, die wir sehen können, erst einmal Palast sein und wenden uns zum Turm.&lt;br /&gt;
&lt;br /&gt;
Der Turm war die Bibliothek von Kaymakli, ein wirklich wundervolles Gebäude mit weitem Blick über die Stadt. Über der Tür: &amp;quot;Qui scientiam querit, hic inveniet&amp;quot;. Leider ist die Bibliothek nicht nur verwüstet, sondern auch vollständig ausgebrannt. Einzige Hoffnung ist, dass in den oberen Geschossen offenbar Werke fehlen, von denen wir annehmen, dass Kappadocius sie mitgenommen hat, als er die Stadt verließ. Im Keller ein aufgebrochenes Lager mit mathematischen Schriften. Jemand ist also hier gewesen und hat enttäuscht feststellen müssen, dass nicht mehr da ist, was er sucht. Liz, Susan und Peter stecken trotz allem mathematische Schriften ein, Peter achtet darauf, Schriften zu erwischen, die bekanntlich verschollen sind. Unmöglich, die später zu verkaufen, wie Susan und Liz es planen, aber die Faszination ist zu groß.&lt;br /&gt;
&lt;br /&gt;
Nächster Stop: Der Lasombratempel. Darin ist alles in Schatten getaucht und Liz ist die Einzige, die gut sehen kann. Sie erkundet das Gebäude. Irgendwie schaltet sie eine Beleuchtung an, indem sie an einem Auge dreht. Es stellt sich heraus, dass sie vier Schatten hat. An den Wänden Reliefs phönizischer Art: Seefahrer, eine Insel und ihre Besiedelung, deren Untergang, eine Rückkehr -- ist das die Atlantissage? Liz zeigt uns ein großes Tor mitten im Raum, worin nur Schwärze zu sehen ist. Wir nehmen für den Moment an, dass es sich um den Ausgang handelt, den Amanda uns beschrieben hat. Da wir noch nicht haben, weswegen wir kamen, wenden wir uns zurück zum Palast. Damit lassen wir die restliche Stadt unerforscht, wir müssen uns beeilen.&lt;br /&gt;
&lt;br /&gt;
Susan führt zwichendurch ein fatales Funkgespräch mit Hesha. Auch er scheint den Einflüssen der Geister erlegen zu sein...&lt;br /&gt;
&lt;br /&gt;
In der Arena stellen wir uns in Zweikämpfen den Golems. Alle gewinnen wir unsere Kämpfe. Olaf gewinnt durch Kraft, Liz durch ihre Schattententakel, Franziska durch Geschwindigkeit, Peter zu kompliziert durch Fesselung, Neil durch pure Coolness. Und Susans Gegner gibt auf, bevor der Kampf begonnen hat. War er schon defekt oder ist sie das gewesen? Nach gewonnenem Zweikampf öffnen die Golems jeweils ihre Brust und entnehmen einen Gegenstand, den sie uns überreichen. Es bekommen:&lt;br /&gt;
&lt;br /&gt;
* Liz das [[Herz_der_Dunkelheit]]&lt;br /&gt;
* Susan ein Buch&lt;br /&gt;
* Franziska eine Laterne (ah, die Laterne!)&lt;br /&gt;
* Neil eine Armeschiene mit einer silbernen Träne darauf: [[Rayzeels_Träne]]&lt;br /&gt;
* Olaf eine Phiole mit Saat&lt;br /&gt;
* Peter ein Buch prall gefüllt mit Magie&lt;br /&gt;
&lt;br /&gt;
Wir haben keine Zeit, diese Gegenstände ausgiebig zu bewundern oder gar zu erforschen. In der Eile geht auch die Frage unter: Wer hat diese Gegenstände hier plaziert für uns? Denn sie sind bemerkenswert auf uns zugeschnitten. Wer wusste, das wir kommen würden? Ist es dieselbe Person, die in Amanda gefahren ist? Hm.&lt;br /&gt;
&lt;br /&gt;
Eine kurze Durchsuchung des Palastes fördert nichts zutage. Wir gehen seitwärts über die Brücke und zu den Toren aus geschmolzenem Silber. Als wir die halbe Brücke überquert haben, fangen Susans Augen an Blut zu tränen und die Silbertore zeigen eine Vision:&lt;br /&gt;
&lt;br /&gt;
Hesha versucht Amanda zu überreden mit ihm zu fliehen. &amp;quot;Sie haben gesagt, sie würden uns zurücklassen. Wir aber können hier raus.&amp;quot; Was hat er an Susans Nachricht so missverstanden? Ihre Proteste gehen im Rest der Vision unter: Amanda versucht, Hesha zu pflöcken, doch der bewegt sich einfach weiter! Kann er etwa auch dieses Ritual? Mit Kummer in der Stimme sagt er ihr, dass er dies nicht tun wollte. Dann trinkt er sie beinahe leer, hebt sie hoch und trägt sie durch die Barriere. (Wir nehmen an, durch ihr Blut hat er kurzfristig ihre Fähigkeit des Durchquerens gewonnen. Pfiffig. Funktioniert aber nur für genau einen, war das von Anfang an sein Plan?) Auf der anderen Seite gibt er ihr den Kuss, lässt sie aber so liegen, dass die aufgehende Sonne sie vernichten wird. Noch ein Grund, sich zu beeilen!&lt;br /&gt;
&lt;br /&gt;
Franziska greift die Laterne und aus alter Gewohntheit Susans und Peters Hand, aber etwas stimmt nicht: Dies sind nicht die richtigen Freunde. Sofort lässt sie den empörten Peter los. Kurzes Durchtesten zeigt: Olaf ist der Richtige. Na sowas! Das Tor schwingt im Gleichklang und die drei verschwinden.&lt;br /&gt;
&lt;br /&gt;
===Gruppe Schattentor===&lt;br /&gt;
Neil und Liz wollen direkt zurück zum Tempel Lasombras, aber Peter will nicht fort. Sie können doch nicht den Ausgang nehmen und die drei anderen zurücklassen. Neil und Liz beschwören ihn, dass Susan, Franziska und Olaf einen anderen Ausgang genommen haben -- und als Liz einen Schatten von sich löst, der Richtung Lasombratempel geht und ihm folgt, gibt Peter endlich nach. (Tatsächlich haben beide Parteien Recht. SuFrOl haben keinen Ausgang genommen und brauchen NeLiPe, aber Warten ist nicht gut: Am Ende muss Alles sehr schnell gehen.)&lt;br /&gt;
&lt;br /&gt;
In der Unterkunft der Dunkelheit geift der Schatten etwas, berührt das Portal und Schwärze ergießt sich daraus. Der Schatten blickt sich um und springt hinein. Wir folgen.&lt;br /&gt;
&lt;br /&gt;
Zu unserem Schrecken steht vor uns Clemence, die einen schlangenverzierten Stab in der Hand hält. Wir nehmen Liz' Hände, Clemence tritt zur Seite und wir stehen in einem Meer aus Schwärze. Wir können uns irgendwie sehen, aber Liz hat als einzige einen Schatten. Clemence lässt den Stab fallen, der zerfasert und verschwindet. Dann stellt sich heraus, es ist gar nicht Clemence, sondern das Echo, das sie an diesem Ort hinterlassen hat. Denn sie sagt Dinge wie &amp;quot;Du bist sie, aber du bist nicht sie. Du bist die Reflektion der Reflektion&amp;quot; oder &amp;quot;Du trägst das Herz der Dunkelheit, also bist Du eine Herrin&amp;quot; (was Liz bejaht) oder &amp;quot;Aber du bist schwächer als sie, die vorher hier war (mit dem Stab), aber stark genug, um mir Gestalt zu geben.&amp;quot; Und es stellt sich heraus, dass das Echo Liz durchaus helfen will. (Wir hatten ja nach Amandas Worten mit erheblichem Widerstand gerechnet.) &amp;quot;Ich will dir ein Echo schenken&amp;quot;, sagt es, dann folgen gleich drei Visionen. Denn das Echo weiß alles (oder zumindest viel von dem) was Clemence zum Zeitpunkt ihrer Durchreise wusste.&lt;br /&gt;
&lt;br /&gt;
====Echo 1====&lt;br /&gt;
Wir sind in mittelalterlichen Gemäuern. Kerzenlicht erleuchtet den Gang vor uns. Neil trägt Felle und ein Kettenhemd, Peter Lumpen, einen Stab (ohne Schlangen) und ein Kreuz. In der Mitte geht Liz, die ein nachtschwarzes Kleid trägt und ein Kreuz um den Hals. Wir werden vorgelassen bei Lady Ennlin in Florenz und wir sind offenbar Clemence, Beckett und Anatol. &lt;br /&gt;
&lt;br /&gt;
Lady Ennlin ist eine ältere Dame, eine Lasombra, unter deren Schutz Clemence sich stellen will und bei der sie lernen möchte. Beckett und Anatol sind ihre Fürsprecher. Clemence kniet nieder, dann redet vor allem Lady Ennlin, fragt Clemence nach ihrem Erzeuger (Federico) aus (&amp;quot;ein Feigling&amp;quot;), ob er sie geprüft habe, indem er ihr Leben, wie unter Lasombra üblich, mehr und mehr zerstört habe (&amp;quot;Ja&amp;quot;), was sie wohlgestimmt als &amp;quot;Test der Willenskraft&amp;quot; bezeichnet.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Aber darüber hinaus hat er deine Fähigkeiten und deine Willenskraft unterschätzt.&amp;quot; Lady Ennlin versteht die prekäre Lage selbstdenkender Frauen und deswegen wird sie Clemence helfen, findet sogar die eher schäbigen Fürsprecher in Ordnung als Zeichen der Rebellion gegen die patriarchalischen Regeln. Sie nimmt Clemence als Mündel an und verspricht, ihr Regeln und Intrigen und überhaupt alles beizubringen. Allerdings hat ihre feministische Ader, wenn man so sagen kann, eine dunkle Seite. Denn Clemences unglückliches Verhältnis zu ihrem Erzeuger wird von ihr endgültig in die falschen Bahnen gelenkt: &amp;quot;Schöpfe Kraft aus Deinem Schmerz, vergiss, was Dich als Sterbliche erhalten hat. Vergiss Liebe (!), vergrabe alle Gefühle (!) und beginne neu! Kannst du das nicht, vernichte den Erzeuger der Gefühle und beginne neu!&amp;quot; Neil und Peter sehen sich besorgt an.&lt;br /&gt;
&lt;br /&gt;
Dann sind wir zurück in der schwarzen Halle, aber bevor wir uns groß bespechen können, folgt schon&lt;br /&gt;
&lt;br /&gt;
====Echo 2====&lt;br /&gt;
Clemence hat jemanden zu sich nach Rom bestellt -- Beckett. Sie möchte von ihm über Gehenna erfahren. Er gibt an, verschiedene Prophezeiungen schon widerlegt zu haben. Mehr und mehr verlegt er sich auf Artefakte. Die biblischen Beschreibungen sind kompletter Unsinn. Kain und Abel hat es nie gegeben. Woher wir wirklich kommen ist ein Rätsel -- und am Besten über Gegenstände aufzulösen!&lt;br /&gt;
&lt;br /&gt;
Wichtig ist für Beckett die (berechtigte) Angst vor den Älteren. Das Blut lässt ihnen keine Möglichkeit mehr, sich zu bewegen. Die Älteren müssen Vitae trinken. Manche schaffen Kinder, um zu trinken, andere sammeln Vitae wie z.B. Hardestadt der Ältere, der einen ganzen Keller kostbarer, alter Vitae besitzen soll! Hardestadt will übrigens eine Gesetzgebung schaffen, aber noch hört niemand auf ihn. (Wir haben also vor 1496, Konzil von Thorun.)&lt;br /&gt;
&lt;br /&gt;
Lasombra, so Beckett, wandert natürlich noch umher und Beckett bittet Clemence um eine Audienz bei ihm oder zumindest bei Montano, seinem Kind. &lt;br /&gt;
&lt;br /&gt;
&amp;quot;Wie verhindere ich Gehenna&amp;quot;, fragt Clemence.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Vernichte alle Alten&amp;quot;, ist Becketts Antwort. Genauer: &amp;quot;Alle, die älter als 2000 Jahre sind.&amp;quot; Dann berichtet Beckett von Hardestadt dem Älteren, der eine Möglichkeit gefunden haben soll alle Ventrue, wo auch immer sie sind, zu kontrollieren. Er hat Kriege begonnen, nur um einen möglichen Gegner frühzeitig aus dem Weg zu räumen. (Uns ist ein wenig unklar, ob der Punkt dieser Geschichte ist, dass die Ältesten nur an sich denken und aus dem Weg geräumt werden müssen oder dass sie ohnehin unbesiegbar sind. Mitten in Becketts Monolog kippt er nämlich von der einen Haltung in die andere.) &amp;quot;Oder, wenn ''du'' überleben willst: Vernichte Lasombra. Quatsch. Tue es nicht. Es geht ohnehin nicht.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Und damit verschwindet Beckett und lässt uns und Clemence nachdenklich zurück. Schließlich wissen wir schon, dass zwar die Altvorderen hauptsächlich ihre eigenen Nachkommen töten, doch dass sie Kollateralschäden durchaus gern in Kauf nehmen. Und sind nicht alte Wesen wie Theagenes unsere beste Chance gegen die Altvorderen zu bestehen? Warum sollten wir die vernichten? Hm.&lt;br /&gt;
&lt;br /&gt;
Wir sind zurück in der Schattenhalle und nun fragt Liz, wie wir entkommen können. Es stellt sich heraus, dass wir nicht wie Clemence durch den Abyss gehen können. Mit zwei oder fünf Gefährten gar, ist es unmöglich. (Sobald wir nicht direkt hier weiterkommen, nehmen wir nun doch an, dass wir den Ausgang auch für die anderen organisieren müssen. Peter bricht es fast das Herz: Er hat gegen besseres Wissen Franziska zurückgelassen...) Aber eine sehr kurze Strecke durch die Schatten kann Liz uns führen, wenn das Echo ihr beibringt, wie das geht. Vorher aber will das Echo ihr noch etwas zeigen, nämlich&lt;br /&gt;
&lt;br /&gt;
====Echo 3====&lt;br /&gt;
Wir steigen eine Treppe hinab in ein Mausoleum, in die Kühle unter Rom. Liz/Clemence geht in der Mitte, links von ihr Neil in Plattenrüstung und Wappenrock, er ist ein Prometeer, auf der anderen Seite ein Mann in Roben mit Turban, Krummdolch und einem in Leder eingebundenen Buch am Gürtel, ein Magier der Assamiten. (Können eigentlich neuerdings alle zaubern? Tzimisce, Assamiten, Nosferatu -- Peter wundert sich nicht schlecht.)&lt;br /&gt;
&lt;br /&gt;
Unten wartet neben einem Sarkophag Lady Ennlin, die ihr Mündel wenn nicht herzlich, so doch nicht unfreundlich begrüßt. Sie bewundert, wie weit Clemence gekommen ist, dass sie gar Sherrif von Florenz war (oder noch ist). Der Ritter, so Lady Ennlin, ist sicher hier als gutes Gewissen, als jemand der Clemence abraten soll von dem, was sie vorhat. Das &amp;quot;Kind von Ibn-al Nafis&amp;quot; wird ihr von den Vorteilen erzählen wollen. &lt;br /&gt;
&lt;br /&gt;
Dann schleudert die alte Dame ohne Mühe den Deckel des Sarkophages beiseite. Darin liegt ein blasser Mann, blond, reich geschmückt, ein Lorbeerkranz ist erhalten. Bemerkenswert. Der in Starre liegende Vampir wird uns vorgestellt als Atticus, einer der ältesten Ventrue, der damals den Untergang Karthagos anordnete. (Also von den vielen Atticus vielleicht Aulus Manlius Torquatus Atticus, der als Konsul den ersten punischen Krieg erfolgreich beendete?) &lt;br /&gt;
&lt;br /&gt;
&amp;quot;Die Dunkelheit ist ein schlechter Ort, um sich zu verstecken vor uns&amp;quot;, sagt Lady Ennlin und dann wird klar, was hier geschehen soll: &amp;quot;Du hast gefragt, wie du dem Willen deines Erzeugers entkommst. Hier ist deine Freiheit. (Denn Beherrschung funktioniert nicht an Vampiren niederer Generation.)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Neil und Peter beziehen nun Stellung, der eine rät eindringlich ab, der andere durchaus zu. Liz zögert, am Ende aber folgt sie ihrer Schwester und diablerisiert Atticus. Vielleicht nur, weil sie nicht anders kann, vielleicht aber auch, weil die versprochene Freiheit und Macht zu gut klingt...&lt;br /&gt;
&lt;br /&gt;
Dann sind wir zurück in der Schattenhalle. Und nun lehrt das Echo Liz etwas über die Schatten, eine Erinnerung, einen Schattenpanzer, der sie vor Feuer schützt. (Das wird Federico bei seinem vorgetäuschten Tod benutzt haben.) Damit verbunden ist auch das Wissen um das Dahinter, das einem zu Toren verhilft und einen von Schatten zu Schatten gehen lässt, wenn man nur beide Schatten sehen kann. Das Echo schafft Duplikate von Neil und Peter aus Schatten, die Liz mit ihren neuen Kräften locker besiegt, obwohl sie zu zweit sind und sich nicht zurückhalten. Neil ist sehr zufrieden, Peter eher beunruhigt.&lt;br /&gt;
&lt;br /&gt;
Bevor wir gehen, stellt Liz noch zwei Fragen, schließlich weiß das Echo alles, was Clemence damals wusste. &amp;quot;Wozu ist der Stab nötig?&amp;quot; Jemand namens Anatol hat ihr gesagt, dass sie damit ein Tor öffnen kann, um an einen Ort zu gelangen, wo sie eine Aufgabe erfüllen muss. Was das ist, ist unklar. &lt;br /&gt;
&lt;br /&gt;
&amp;quot;Was hat Clemence damals für Federico empfunden?&amp;quot; Schmerz, mehr kann das Echo nicht sagen.&lt;br /&gt;
&lt;br /&gt;
Nun, wir haben, weshalb wir gekommen sind, verabschieden uns höflich und gehen.&lt;br /&gt;
&lt;br /&gt;
===Gruppe Silbertor===&lt;br /&gt;
Franziska tritt vor das Tor, Olaf und Susan an der Hand. Zu dritt, wie in Madrid auf den Spuren Michaels, damals noch unwissend Sascha Vykos als Bibliothekar vor sich zu haben. Jetzt zusammen auf den Spuren Saulots und in der Hoffnung im Palast einen Hinweis zum Gehenna-Mythos zu finden. Sie sehen sich selbst im spiegelnden Silbertor, dann sich selbst davor stehend und dann blicken sie zurück und werden fortgerissen in die Dunkelheit - &lt;br /&gt;
&lt;br /&gt;
====Die erste Erinnerung==== &lt;br /&gt;
Die Tore des Palastes sind geöffnet, viele berobte Gestalten gehen beschäftigt aus und ein, die Arena ist voller Personen, die Stadt mit einer Vielzahl Lichter beleuchtet. Vor uns stehen zwei Gestalten, denen Susan eine Schriftrolle gibt. Olaf wird gefragt, ob alles fertig vorbereitet sei. Die Gestalten wollen davon eilen, ihren Auftrag zu erfüllen. Als Susan bittet, die Schriftrolle noch einmal sehen zu können, um zu prüfen, ob es die richtige ist (und um selbst nachlesen zu können, was sie aus den Händen gegeben hat) verschwimmt die Szene und wir treiben durch die Dunkelheit begleitet von einem laut summenden Geräusch.&lt;br /&gt;
&lt;br /&gt;
====Die zweite Erinnerung====&lt;br /&gt;
Wir drei stehen an einem von vielen Marktständen auf dem Platz vor dem Palast. Das rege Markttreiben wird von Felswände umfasst, in die noch keine Sitzreihen für die Arena gehauen wurden. Olaf ist der Verkäufer, Susan und Franzi sind zwei Frauen, die sich die Waren anschauen. Neben ihnen stehen zwei weitere Kunden, fünf Herzschläge sind zu hören. Bei den beiden Männern handelt es sich um Etrius und Nikolai (vom Clan der Tremere), die sich als Mitglieder des Ordens des Hermes vorstellen. Sie wollen eine Jade (?) - Figur der Erdenmutter kaufen, die Franziska bereits in den Händen hält. Sie benötigen Sie für ein Geomantie-Ritual. Wir treiben den Preis in die Höhe, aber der Händler macht deutlich, dass er die Figur lieber an die zwei Herren verkaufen möchte und man wird sich schließlich handelseinig. Etrius steckt erfreut die Figur in seine Tasche. Nikolai fragt den Händler noch nach gestoßenem Elfenbein eines Elefanten vom Nil, doch der Händler muss hierzu leider passen. In der Menge sieht Susan Shephert, den Antiquariar vom Wissenshort, der sie andersherum nicht zu kennen scheint.&lt;br /&gt;
&lt;br /&gt;
====Die dritte Erinnerung====&lt;br /&gt;
Die beiden Frauen finden sich in menschlichen Körper, die in einfache Leinenkleider gehüllt sind, wieder, jede am einem gegenüberliegenden Rand der gefüllten Arena (nur Steinsitze, noch ohne Holzemporen), angekettet am Knöchel. Vor ihnen zwei Kämpfer in stattlichen Rüstungen. Franziska steht hinter dem Legaten Torenus von Itaha, der eine goldene Maske trägt. Susans Kämpfer vor sich trägt eine schwarze Maske. In der Mitte steht Theagenes von Megara und verkündet, das der Gewinner dieses Duels für die nächsten 13 Jahre sein Schüler sei. Dann eröffnet er den Kampf und tritt zurück. Die beiden Kontrahenten beginnen unerbittlich gegeneinander zu kämpfen, dabei wird Erde zu Dornen geformt, die wie Lanzen aus dem Boden stoßen, Blitze schlagen vom Himmel und es sieht so aus, als behalte der Mann in der goldenen Maske (Olaf) die Überhand. Der Kämpfer mit der schwarzen Maske wendet sich als erster der angekettenen Frau zu und trinkt. Susan spürt die Extase, die sein Biss und die ersten Schlucke auslösen, dann flackern ihre Augen, sie spürt ein davongleiten in die Dunkelheit und irgendwann fällt der leergetrunkene Körper der jungen Frau schlaff auf den Boden. Aber auch der Legat Torenus nutzt diese Pause und trinkt aus dem Hals der jungen Frau (Franziska) hinter ihm. Beide betrachten von nun an den weiteren Kampf aus einer beobachtenden Position oberhalb der leblosen Frauenkörper. Der Kampf endet, als sich der Mann mit der schwarzen Maske hinkniet und mit einer ausholenden Geste und einem ohrenbetäubenden Knall einen Blitz in den Legaten Torenus einschlagen lässt, der diesen fast entzwei teilt. &amp;quot;Stopp&amp;quot;, ruft Theagenes. Der Kampf ist entschieden. Gewinner und damit Schüler Theagenes für die nächsten dreizehn Jahre ist Lucius Marcus Vitelus Sejamus. Bei diesen Worten nimmt der Sieger seine schwarze Maske vom Gesicht und wir erkennen den ehemaligen Prinzen von Washington [[Vitel|Marcus Vitel]]! &lt;br /&gt;
&lt;br /&gt;
Wer hätte das gedacht? Marcus Vitel ist schon so alt und mächtig und war Schüler von Theagenes. Puh. Susan wird ganz anders, wenn sie nachspürt, wer da aus &amp;quot;ihrem&amp;quot; Hals getrunken hat.&lt;br /&gt;
&lt;br /&gt;
====Die vierte Erinnerung====&lt;br /&gt;
Von der Dunkelheit auf eine Bühne, aufgereiht neben vielen anderen Frauen, Männern und Kindern und neben weiteren Bühnen auf dem vollen Platz der Arena finden sich Franziska und Susan in den schönen Körpern zweier menschlicher Frauen wieder. Sie werden von einem rundlichen älteren Händler angepriesen (Olaf). Ein Käufer möchte wissen, woher die beiden schönen Frauen kommen und ob sie auch gebildet seien. Um dies zu prüfen, hält er einen lateinischen Text vor die Frauen, den Franziska immerhin lesen und Susan auch noch übersetzen kann. Für 18 (?) wird man sich handelseinig und die Frauen von der Bühne geführt. In diesem Moment tritt eine große, farbige Gestalt an die Bühne und kritisiert frei heraus das Sklaventum. Es ist [[Julius|Jules]], den wir als Archont des Clans Brujah aus NYC kennen. Mit lauter Stimme spricht er Franziska an: &amp;quot;Möchtest du frei sein?&amp;quot; Ein schüchterndes Ja ist zu hören. Die gleiche Frage an die zweite Frau und ein gefestigtes Ja ist zu hören. Beide werden gefragt, was sie denn machen möchten, wenn sie frei seien? Die eine möchte lernen, die zweite die Welt erkunden. Mit einer einzigen Bewegung löst Jules die Fesseln jeder Frau, die immer sicherern Schrittes über den Platz davon gehen. Jules wendet sich dem Händler zu, der wie ein Häufchen Elend an einer der Seitenwände lehnt und wirft ihm einen Sack Münzen zu. Der Händler entschuldigt sich kläglich beim eigentlichen Käufer. Die Aktionen am Stand des Sklavenhändlers haben ein großes Publikum in den Bann gezogen und aus dieser Menge fällt [[Shepherd|Shepherds]] Blick auf Jules und beginnt zu lächeln.&lt;br /&gt;
&lt;br /&gt;
====Die fünfte Erinnerung====&lt;br /&gt;
Erneut finden wir uns auf dem gut besuchtem Marktplatz zu einer frühen Zeit Kaymaklis wieder. Wir stehen als Menschen in Reisekleidung in der Menge und beobachten, wie sich [[Shepherd|Shepherd]] von einer Salubri umarmend verabschiedet. Die Salubri verschwindet hinter sich in der Menge, Shepherd kommt jedoch in unsere Richtung und möchte an uns vorbei gehen. Susan spricht ihn an und erkundigt sich nach der Salubri und nimmt sie zum Anlass nach Saulot zu fragen. Ob er (Shepherd) uns bitte zur Bibliothek bringen könne und wir dort Schriften von Saulot finden würden? &amp;quot;Welcher Art?&amp;quot; &amp;quot;Wir suchen Saulots Wissen über Gehenna. Bitte bring uns hin.&amp;quot; Shepherd ist sehr überrascht, dass wir Menschen etwas über Gehenna wissen und danach fragen. Wir dürften nicht in den Bereich der Bibliothek, der den ''Verdammten'' vorbehalten sei, aber ein Gouhl Saulots (leider habe ich den Namen nicht aufgeschrieben) hätte Schriften erstellt, die im Turm hinterlegt seien. Shephert bringt uns in die Bibliothek und verabschiedet sich dann, da er mit einer alten Freundin verabredet sei, einer Tochter Saulots, der Salubri [[Rayzeel]]. Uns wird klar, dass wir Rayzeel auf dem Marktplatz gesehen haben. Wir treten in die Bibliothek bzw. in die Dunkelheit hinein...&lt;br /&gt;
&lt;br /&gt;
====Die sechste Erinnerung====&lt;br /&gt;
Wir sitzen zwischen Vielen in der Arena und Larimas spricht zu allen und fragt der Reihe nach, um eine Auswahl zu treffen:&lt;br /&gt;
Wer ist des Lesens und Schreibens mächtig? Jeder 8. zeigt auf und diese werden von Larimas fortgeschickt.&lt;br /&gt;
Wer folgt nicht dem Pfad der Menschlichkeit oder dem Pfad des Himmels? Fast die Hälft der Leute zeigt auf und wird von Larimas zum Viertel der Wasserträger geschickt.&lt;br /&gt;
Wer hat noch keinen Tempel oder Kirche gebaut? Nicht sehr viele erheben sich und gehen zu den Steinmetzen.&lt;br /&gt;
Wer hat noch nicht an der Lösung des größten Problems gearbeitet? Viele, auch wir, heben die Hände. Diese werden in die Bibliothek geschickt, aber Larimas deutet uns zu bleiben.&lt;br /&gt;
&lt;br /&gt;
Der Rest der Anwesenden darf die Stadt verlassen, aber nicht zurück schauen. Fünf Leute in Gewandung der Kappadozianer bleiben bei Larimas stehen, davon drei, in denen wir erleben. Susan übergibt Larimas die Schriftrolle, die sie am Anfang weggegeben bzw. erhalten hatte. Er entrollt sie und Franziska und Olaf stehen so glücklich, dass sie die lateinischen Wörter auf der Schriftrolle erkennen können. Susan steht Larima direkt gegen über und kann leider nicht mit auf die Schriftrolle schauen. Da Susan jedoch die einizige ist, die Latein gelernt hat, schafft sie es, mit den Angaben von Franzika, die durch Olaf immer wieder sehr glücklich ergänzt werden können, die fünf lateinischen Wörter richtig auszusprechen... und wir vergehen wieder in Dunkelheit...&lt;br /&gt;
&lt;br /&gt;
====Schatzkammer====&lt;br /&gt;
...um in die Schatzkammer des Palastes zu kommen. Im Zentrum all des Reichtums und Goldglanzes, der uns gerade zu überwältigt, steht ein Podest auf dem die Schriftrolle Saulots liegt. Susan steckt sie in die Lederhülle und dann haben wir es sehr eilig zurück zu unseren Freunden zu kommen.&lt;br /&gt;
&lt;br /&gt;
===Die Flucht===&lt;br /&gt;
Die Schattengruppe läuft zur Arena. Ein Gong ertönt einmal, zweimal, dann sind viele Stimmen zu hören. &amp;quot;Ich kann sie riechen, sehen!&amp;quot; Die Silbertorgruppe schreitet durch eben jenes, Susan mit einer Lederkartusche unter dem Arm. Aber um uns verfestigen sich die Stimmen und Geister mehr und mehr. Wir rennen quer durch die Stadt zum Ausgang, Liz fegt mit ihren Schattententakeln den Weg frei, die Gestalten strömen uns nach, wir spüren ihren Hunger. Wir wissen, es ist kurz vor Sonnenaufgang, zu kurz. An der Barriere öffnet Liz ein Schattenportal, das auns auf die andere Seite bringt, Peter hält die Geister mit einer Feuerwand auf, dann springt Liz als Letzte durch das Tor. &lt;br /&gt;
&lt;br /&gt;
Es dämmert schon längst, gleich muss die Sonne über die Berge steigen. Neil greift sich Amanda, die noch immer hilflos herumliegt, dann sprinten wir zu den Zelten, angefeuert von Heshas Wachen. Keine Sekunde zu früh fallen wir in einen tiefen Schlaf.&lt;br /&gt;
&lt;br /&gt;
==8.-10.6.2000 Rückreise==&lt;br /&gt;
Wir fahren nach Ankara, übertagen, dann nehmen wir den Flieger nach New York. Amanda kommt für den Moment bei Susan unter.&lt;br /&gt;
&lt;br /&gt;
==11.6.2000 Debriefing==&lt;br /&gt;
Am nächsten Abend treffen wir uns im Hurricane, um in Ruhe die Ereignisse zu besprechen und unseren Fund zu begutachten. Susan weiht [[Shepherd]] ein, den die Silbergruppe in Kaymakli getroffen hat. Insbesondere sagt sie ihm, dass wir die Falken sind. Er übersetzt [[Text:00000013]] für uns. &lt;br /&gt;
&lt;br /&gt;
Der Prinz kommt vorbei und wir berichten. Er hört erfreut (die Prophezeiung) und erschüttert (Neuigkeiten über [[Vitel]]) zu. Nach einigem Nachdenken und ausführlichem Lob für uns (was ist denn in den gefahren?), gibt er vier mögliche Pläne aus, die eint, dass es nun ander Zeit ist, nach vorne zu schauen. Etwas Besseres als Saulots Prophezeiung werden wir wohl kaum mehr finden. Wenn wir die Vorsintflutlichen wirklich erledigen wollen, brauchen wir einen guten Plan.&lt;br /&gt;
&lt;br /&gt;
(1) Es gibt nach wie vor menschliche Magier, den Orden des Hermes, aus dem die Tremere einst hervorgingen. Die könnte man versuchen, als Verbündete zu gewinnen.&lt;br /&gt;
&lt;br /&gt;
(2) Ein Vorsintflutlicher ist ja schon besiegt worden: Ravnos. Wenn man herausfinden könnten, was in Kalkutta während der Woche des Wahnsinns geschah, hätte man möglicherweise einen kopierbaren Plan. Die Reise nach Indien gilt als äußerst gefährlich. Von Braun möchte uns noch nicht mal bitten dorthin zu gehen, andererseits haben wir Kaymakli überstanden... Wenn irgendjemand, dann schafft es unser Klüngel an Informationen zu kommen.&lt;br /&gt;
&lt;br /&gt;
(3) Baba Yaga, die Mutter aller Nosferatu und laut Theagenes die mächstigste Hexe überhaupt, hat allen Grund, ihren Vorsintflutlichen zu fürchten, wie wir wissen. Und das heißt, dass eine echte Chance besteht, die als Verbündete zu gewinnen. Und wer besser als Verbündeter gegen einen Vorsintflutlichen als ein Vampir 4ter Generation?&lt;br /&gt;
&lt;br /&gt;
(4) Laut Gerüchten aus dem inneren Zirkel in Wien ist eine Tochter Saulots aufgespürt worden. Die könnten wir versuchen, zu kontaktieren mit derselben Idee wie bei Baba Yaga. Die hat nun keinen Grund ihren Vorsintflutlichen zu erledigen, der bekanntermaßen diablerisiert wurde, aber wird immer noch mächtig sein und vielleicht noch Wissen aus persönlichen Gesprächen mit Saulot haben.&lt;br /&gt;
&lt;br /&gt;
Wir diskutieren in die Nacht hinein...&lt;br /&gt;
&lt;br /&gt;
==Outro==&lt;br /&gt;
===Szene 1: Der Orden des Hermes===&lt;br /&gt;
Eine Kneipe in New York. Unbemerkt von den übrigen Gästen und der Bedienung, die einfach an ihnen vorbeischaut, treffen sich zwei Magier. Der eine hat eine magische Karte und bietet Aufträge an. Es gibt Informationen aus Indien, nein, nicht das Wahre. (&amp;quot;Nicht unsere Aufgabe.&amp;quot;) Die Spur des Objektes in Russland verliert sich am Ural. (&amp;quot;Die Koinzidenz (mit was?) ist beängstigend.&amp;quot; &amp;quot;Vielleicht eines der anderen Häuser?&amp;quot; Dann gab es eine &amp;quot;Erschütterung&amp;quot; in der Türkei. Auch daran ist Nr. 2 nicht interessiert. &lt;br /&gt;
&lt;br /&gt;
&amp;quot;Dann bleibt ja nur die letzte Aufgabe&amp;quot; und auf der Karte erscheint  ein Pin in New York. &lt;br /&gt;
&lt;br /&gt;
&amp;quot;Also geht es wirklich gegen den Big Apple. Nur ich ich oder der ganze Orden?&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Du wirst nicht allein sein, diesmal.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Klingt, als würden wir endlich etwas tun.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Und dann wünschen sie sich Glück, an das sie nicht glauben, es aber selbst erschaffen und heben den Zauber auf, der auf der Bar liegt und gehen.&lt;br /&gt;
&lt;br /&gt;
===Szene 2: Ein Brief an Baba Yaga===&lt;br /&gt;
Zahira steht neben Theagenes in dessen Thronsaal. Theagenes bittet sie, noch einmal den Brief vorzulesen, den er ihr diktiert hat. &lt;br /&gt;
&lt;br /&gt;
&amp;quot;Geehrte Freundin! Ich muss gestehen, dass mich die Sorge um Dich umtreibt. Deine Nachricht hat meine Sinne geschärft, auf Gefahren für Dich zu achten. Am Rande meiner Domäne kam es zu der Vernichtung eines Baus. Es kann sein, dass Deine Befürchtungen stimmen. Die Kinder deines Vaters sind erwacht. Es war nur ein Wesen, das den Angrif ausführte. Ich sende dieses Schreiben über die alten Wege.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Theagenes diktiert ein Addendum hinzu: &amp;quot;Ich hatte kürzlich das Glück ein paar äußerst interessante Individuen kennenlernen zu dürfen. Jünglinge, die Kappadocius letztes Geheimnis entschlüsseln wollten. Sie zeigten Kraft, Mut und Zuversicht. Das heißt, diese Zeiten sind gefährlicher (!) als wir angenommen haben. Pass gut auf dich auf, liebe Freundin.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Szene 3: Bericht über Kalkutta===&lt;br /&gt;
Eine asiatische Stadt, hell erleuchtet, im nächtlichen Regen, trotzdem Gewürzgeruch. Im obersten Stockwerk eines Hauses, das die anderen in der Umgegend überragt, offene Fenster, unterhalten sich zwei Gestalten. &lt;br /&gt;
&lt;br /&gt;
&amp;quot;Wir haben das westliche, obere Delta durchsucht. Keine Spuren von Überlebenden.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Die Älteren?&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Nein.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Drei unserer Ältesten sind gefallen? Was ist mit dem Wesen?&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Keine Spuren. Alles deutet darauf hin, dass das Wesen die Konfrontation nicht überlebt hat.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Wissen wir mehr über die Waffen der menschlichen Zauberer?&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Nein.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Aber die menschlichen Zauberer haben Waffen geschaffen, uns zu vernichten? Wir müssen das Geheimnis dieser Waffen in Erfahrung bringen. Wenn die Macht von drei Altehrwürdigen nicht ausreicht, um einen zu besiegen, brauchen wir diese Waffen.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Und auf einem Hausdach in der Nähe hockt eine lauschende Gestalt im Regen -- Beckett, ungesehen und ungehört.&lt;br /&gt;
&lt;br /&gt;
===Szene 4: Der Ruf===&lt;br /&gt;
Adeptus Quintus sitzt in einer einsamen Kammer. Er ist beschäftigt mit Korrespondenz. Ein anderer Vampir (älterer Mann) tritt ein ohne zu klopfen. &lt;br /&gt;
&lt;br /&gt;
&amp;quot;Der Regent hat eine wichtige Aufgabe für unseren fähigsten Sucher. Alles andere muss zurückstehen.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Adeptus Quintus protestiert, er habe Wichtiges zu tun, wird aber unterbrochen.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Etrius selbst erteilt diesen Auftrag. Alle herkömmlichen Methoden, Rituale, etc. sind fehlgeschlagen.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Ah, ein interessante Fall...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Hier ist das Rückrufschreiben. Kontaktieren sie Adeptus Kruder so schnell wie möglich...&amp;quot; (Elend, Not, Kreuz, Schmach und Tod!)&lt;br /&gt;
{{Navbox chapter}}&lt;/div&gt;</summary>
		<author><name>Anatol</name></author>
	</entry>
	<entry>
		<id>https://camnet.oetterer.eu/index.php?title=Kategorie:Classes_with_errors&amp;diff=1077</id>
		<title>Kategorie:Classes with errors</title>
		<link rel="alternate" type="text/html" href="https://camnet.oetterer.eu/index.php?title=Kategorie:Classes_with_errors&amp;diff=1077"/>
		<updated>2016-02-10T15:21:25Z</updated>

		<summary type="html">&lt;p&gt;Anatol: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#invoke:Classgenerator|gardeningCategoryPage}}{{#invoke:Classgenerator|categorize}}[[Category:Class engine]]&lt;br /&gt;
&amp;lt;!-- Note: The class engine sets category &amp;quot;CamNet entities with erroneous input&amp;quot; automatically in function categorize --&amp;gt;&lt;/div&gt;</summary>
		<author><name>Anatol</name></author>
	</entry>
	<entry>
		<id>https://camnet.oetterer.eu/index.php?title=Kategorie:CamNet_entities_with_erroneous_input&amp;diff=1075</id>
		<title>Kategorie:CamNet entities with erroneous input</title>
		<link rel="alternate" type="text/html" href="https://camnet.oetterer.eu/index.php?title=Kategorie:CamNet_entities_with_erroneous_input&amp;diff=1075"/>
		<updated>2016-02-10T15:19:56Z</updated>

		<summary type="html">&lt;p&gt;Anatol: Die Seite wurde neu angelegt: „{{MediaWiki:Classengine-content-project-gardening-supercategory}}“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{MediaWiki:Classengine-content-project-gardening-supercategory}}&lt;/div&gt;</summary>
		<author><name>Anatol</name></author>
	</entry>
	<entry>
		<id>https://camnet.oetterer.eu/index.php?title=Modul:Foundationclass/globalconfig&amp;diff=1074</id>
		<title>Modul:Foundationclass/globalconfig</title>
		<link rel="alternate" type="text/html" href="https://camnet.oetterer.eu/index.php?title=Modul:Foundationclass/globalconfig&amp;diff=1074"/>
		<updated>2016-02-10T15:19:21Z</updated>

		<summary type="html">&lt;p&gt;Anatol: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--[==[ if you start off, please fill the entries and create the appropriate categories&lt;br /&gt;
		--  formCategory (e.g. 'Project forms')&lt;br /&gt;
		--	gardeningSuperCategory (e.g. 'Erroneous objects') (this is a global category. you can define an individual one for each class)&lt;br /&gt;
        --  moduleCategory (e.g. 'Project modules')&lt;br /&gt;
		--  projectSuperCategory (e.g. 'Project category')&lt;br /&gt;
		--	propertyCategory, if you use datastore smw (e.g. 'Project properties')&lt;br /&gt;
		--  templateCategory (e.g. 'Project templates')&lt;br /&gt;
	-- also, remember to choose your prefered storage method. atm supported are: 'cargo', 'smw',  or 'both'&lt;br /&gt;
	-- when using datastore 'smw' uncomment all smwSpecialProperties that are active in your installation (and create the properties for smwClassProperty and uidFieldName)&lt;br /&gt;
	-- HINT: When you use the classgenerator form and its autocreation feature, it creates all your categories defined here as well. to modify their content, please refer to [[Module:Classgenerator/class]]'s documentation page&lt;br /&gt;
--]==]&lt;br /&gt;
local superglobal = {&lt;br /&gt;
	cargoSpecialFields = {},	-- filled further down below&lt;br /&gt;
	cargoTypesElegibleForSize = {'text', 'string', 'wikitext', 'url'},&lt;br /&gt;
	cargoTypesElegibleForValue = {'text', 'integer', 'string', 'url'},&lt;br /&gt;
	classCategory = 'Lua class modules',	-- this is the category, all classes based on this engine are put automatically&lt;br /&gt;
	dataStore = 'smw',	-- supported types are 'cargo', 'smw', and 'both'&lt;br /&gt;
	debugLevel = false, -- set this to the level you wish to display at render. false if disabled. this is a global setting, causing all children to debug. you can set this individually at any class&lt;br /&gt;
	formCategory = 'CamNet forms',	-- the category of the form pages&lt;br /&gt;
	formTableClass = 'formtable',&lt;br /&gt;
	gardeningSuperCategory = 'CamNet entities with erroneous input',&lt;br /&gt;
	moduleCategory = 'CamNet modules',&lt;br /&gt;
	moduleUseRatingTemplate = true,&lt;br /&gt;
	projectSuperCategory = 'CamNet',	-- The category, all the categories are placed in.'&lt;br /&gt;
	propertyCategory = 'CamNet properties',	-- category for all the properties pages - if data store smw is used&lt;br /&gt;
	restrictionRole = 'sysop',	-- if you wish to set fields to a default restriction role, name it here&lt;br /&gt;
	selectedCheckboxSubmitValue = 'Ja',	-- (const) this is the value, a semantic forms checkbox submits when selected. used for plausibilityTest only&lt;br /&gt;
	smwClassProperty = 'is_member_of_class',	-- the name of the property, members of the class will be identified by; you have to create the property page, though&lt;br /&gt;
	smwPropertyTypesAvailable = { 'Annotation URI', 'Boolean', 'Code', 'Date', 'Email', 'Geographic coordinate', 'Number', 'Page', 'Quantity', 'Record', 'Telephone number', 'Temperature', 'Text', 'URL' },&lt;br /&gt;
		-- if you have more types of properties (due to an extension), add them here). in fact, Foundationclass does use this, but classgenerator/parameter makes a reference&lt;br /&gt;
	smwSpecialProperties = {},	-- filled further down below&lt;br /&gt;
	templateCategory = 'CamNet templates',	-- the category for the templates&lt;br /&gt;
	templateUseDocumentationSubsystem = true,&lt;br /&gt;
	uidFieldName = 'classengine_identifies_this_by',	-- the name of the property/table fields, the individual object will be identified by (in cargo and smw respectively);&lt;br /&gt;
						-- if you use smw, you have to create the property page manually&lt;br /&gt;
						-- WARNING: If you reset this after beginning operation, you have to rebuild all cargo data tables, and/or create the new property and refresh all properties&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
superglobal.cargoSpecialFields = {&lt;br /&gt;
	_ID = 'Integer, &amp;lt;small&amp;gt;holds a unique ID for this row&amp;lt;/small&amp;gt;',&lt;br /&gt;
	_pageName = 'Text, &amp;lt;small&amp;gt;holds the name of the page from which this row of values was stored&amp;lt;/small&amp;gt;',&lt;br /&gt;
	_pageTitle = 'Text, &amp;lt;small&amp;gt;similar to _pageName, but leaves out the namespace, if there is one&amp;lt;/small&amp;gt;',&lt;br /&gt;
	_pageNamespace = 'Integer, &amp;lt;small&amp;gt;holds the numerical ID of the namespace of the page from which this row of values was stored&amp;lt;/small&amp;gt;',&lt;br /&gt;
	_pageID = 'Integer, &amp;lt;small&amp;gt;holds the internal MediaWiki ID for that page&amp;lt;/small&amp;gt;',&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
superglobal.smwSpecialProperties = {&lt;br /&gt;
	-- by default, only _MDAT is active. see https://www.semantic-mediawiki.org/wiki/Help:$smwgPageSpecialProperties for documentation&lt;br /&gt;
	-- please uncomment all special properties that apply to your installation&lt;br /&gt;
	Creation_date = 'Date, &amp;lt;small&amp;gt;Erstelldatum der Seite.&amp;lt;/small&amp;gt; (Alias _CDAT)',&lt;br /&gt;
	Is_a_new_page = 'Boolean, &amp;lt;small&amp;gt;Ist die Seite neu? Gibt es nur eine einzige Revision?&amp;lt;/small&amp;gt; (Alias _NEWP)',&lt;br /&gt;
	Last_editor_is = 'Page, &amp;lt;small&amp;gt;Benutzername des letzten Bearbeiters.&amp;lt;/small&amp;gt; (Alias _LEDT)',&lt;br /&gt;
	--Media_type = 'Text, &amp;lt;small&amp;gt;Speichert den Medientyp einer hochgeladenen Datei.&amp;lt;/small&amp;gt; (Alias _MEDIA)',&lt;br /&gt;
	--MIME_type = 'Text, &amp;lt;small&amp;gt;Speichert den MIME Typ einer hochgeladenen Datei.&amp;lt;/small&amp;gt; (Alias _MIME)',&lt;br /&gt;
	Modification_date = 'Date, &amp;lt;small&amp;gt;Datum der letzten Bearbeitung der Seite.&amp;lt;/small&amp;gt; (Alias _MDAT)',&lt;br /&gt;
&lt;br /&gt;
	-- from Extension: Extra Special Properties&lt;br /&gt;
	Seitenersteller = 'Page, &amp;lt;small&amp;gt;Erstellerbenutzer&amp;lt;/small&amp;gt;',&lt;br /&gt;
	Seitenbearbeiter = 'List of Pages, &amp;lt;small&amp;gt;Liste der Benutzer, die an der Seite mitgewirkt haben.&amp;lt;/small&amp;gt;',&lt;br /&gt;
	--EXIFDATA = 'Text, &amp;lt;small&amp;gt;Exif Daten einer Datei (Nur im Namensraum &amp;quot;Datei&amp;quot; gesetzt)&amp;lt;/small&amp;gt;',&lt;br /&gt;
	--PAGEID = 'Number, &amp;lt;small&amp;gt;ID der Seite&amp;lt;/small&amp;gt;',&lt;br /&gt;
	Bearbeitungskennung = 'Number, &amp;lt;small&amp;gt;ID der aktuellen Revision&amp;lt;/small&amp;gt;',&lt;br /&gt;
	--NREV = 'Number, &amp;lt;small&amp;gt;Geschätzte Anzahl der Revisionen.&amp;lt;/small&amp;gt;',&lt;br /&gt;
	--NTREV = 'Number, &amp;lt;small&amp;gt;Geschätzte Anzahl der Revisionen der Diskussionsseite.&amp;lt;/small&amp;gt;',&lt;br /&gt;
	--SHORTURL = 'Text, &amp;lt;small&amp;gt;KurzURL der Seite (Nur bei Verwendung der Extension:ShortUrl verfügbar)&amp;lt;/small&amp;gt;',&lt;br /&gt;
	Unterseite = 'List of Pages, &amp;lt;small&amp;gt;Liste der Unterseiten&amp;lt;/small&amp;gt;',&lt;br /&gt;
	--USERREG = 'Date, &amp;lt;small&amp;gt;Datum der Registrierung eines Benutzers (Nur im Namensraum &amp;quot;Benutzer&amp;quot; gesetzt)&amp;lt;/small&amp;gt;',&lt;br /&gt;
	--VIEWS = 'Number, &amp;lt;small&amp;gt;Geschätzte Anzahl der Seitenaufrufe (Achtung: Aufgrund von Caching kann die tatsächliche Zahl stark abweichen).&amp;lt;/small&amp;gt;',&lt;br /&gt;
	--CUSER = 'Page, &amp;lt;small&amp;gt;Erstellerbenutzer&amp;lt;/small&amp;gt;',&lt;br /&gt;
	--EUSER = 'List of Pages, &amp;lt;small&amp;gt;Liste der Benutzer, die an der Seite mitgewirkt haben.&amp;lt;/small&amp;gt;',&lt;br /&gt;
	--EXIFDATA = 'Text, &amp;lt;small&amp;gt;Exif Daten einer Datei (Nur im Namensraum &amp;quot;Datei&amp;quot; gesetzt)&amp;lt;/small&amp;gt;',&lt;br /&gt;
	--PAGEID = 'Number, &amp;lt;small&amp;gt;ID der Seite&amp;lt;/small&amp;gt;',&lt;br /&gt;
	--REVID = 'Number, &amp;lt;small&amp;gt;ID der aktuellen Revision&amp;lt;/small&amp;gt;',&lt;br /&gt;
	--NREV = 'Number, &amp;lt;small&amp;gt;Geschätzte Anzahl der Revisionen.&amp;lt;/small&amp;gt;',&lt;br /&gt;
	--NTREV = 'Number, &amp;lt;small&amp;gt;Geschätzte Anzahl der Revisionen der Diskussionsseite.&amp;lt;/small&amp;gt;',&lt;br /&gt;
	--SHORTURL = 'Text, &amp;lt;small&amp;gt;KurzURL der Seite (Nur bei Verwendung der Extension:ShortUrl verfügbar)&amp;lt;/small&amp;gt;',&lt;br /&gt;
	--SUBP = 'List of Pages, &amp;lt;small&amp;gt;Liste der Unterseiten&amp;lt;/small&amp;gt;',&lt;br /&gt;
	--USERREG = 'Date, &amp;lt;small&amp;gt;Datum der Registrierung eines Benutzers (Nur im Namensraum &amp;quot;Benutzer&amp;quot; gesetzt)&amp;lt;/small&amp;gt;',&lt;br /&gt;
	--VIEWS = 'Number, &amp;lt;small&amp;gt;Geschätzte Anzahl der Seitenaufrufe (Achtung: Aufgrund von Caching kann die tatsächliche Zahl stark abweichen).&amp;lt;/small&amp;gt;',&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
return superglobal&lt;/div&gt;</summary>
		<author><name>Anatol</name></author>
	</entry>
	<entry>
		<id>https://camnet.oetterer.eu/index.php?title=Kategorie:CamNet_properties&amp;diff=1073</id>
		<title>Kategorie:CamNet properties</title>
		<link rel="alternate" type="text/html" href="https://camnet.oetterer.eu/index.php?title=Kategorie:CamNet_properties&amp;diff=1073"/>
		<updated>2016-02-10T12:22:18Z</updated>

		<summary type="html">&lt;p&gt;Anatol: Page created automatically by parser function on page Class:Character&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{MediaWiki:Classengine-content-project-property-category}}&lt;/div&gt;</summary>
		<author><name>Anatol</name></author>
	</entry>
	<entry>
		<id>https://camnet.oetterer.eu/index.php?title=Kategorie:CamNet_forms&amp;diff=1045</id>
		<title>Kategorie:CamNet forms</title>
		<link rel="alternate" type="text/html" href="https://camnet.oetterer.eu/index.php?title=Kategorie:CamNet_forms&amp;diff=1045"/>
		<updated>2016-02-10T12:22:05Z</updated>

		<summary type="html">&lt;p&gt;Anatol: Page created automatically by parser function on page Class:Character&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{MediaWiki:Classengine-content-project-form-category}}&lt;/div&gt;</summary>
		<author><name>Anatol</name></author>
	</entry>
	<entry>
		<id>https://camnet.oetterer.eu/index.php?title=Modul:Classgenerator/class&amp;diff=1036</id>
		<title>Modul:Classgenerator/class</title>
		<link rel="alternate" type="text/html" href="https://camnet.oetterer.eu/index.php?title=Modul:Classgenerator/class&amp;diff=1036"/>
		<updated>2016-02-10T12:19:18Z</updated>

		<summary type="html">&lt;p&gt;Anatol: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local FoundationClass = require('Module:Foundationclass')&lt;br /&gt;
local ClassDebug = require('Module:Debug/class')&lt;br /&gt;
&lt;br /&gt;
-- ****************************************************************&lt;br /&gt;
-- *                         inheritance                          *&lt;br /&gt;
-- ****************************************************************&lt;br /&gt;
local Classgenerator = FoundationClass:subclass('Classgenerator')&lt;br /&gt;
-- setting class's configuration data&lt;br /&gt;
Classgenerator.static.myConfiguration = mw.loadData('Module:Classgenerator/config')&lt;br /&gt;
--   being in a static method, use self.myConfiguration&lt;br /&gt;
--   being in a private method, that knows self or in a public method, use self.class.myConfiguration&lt;br /&gt;
&lt;br /&gt;
-- ****************************************************************&lt;br /&gt;
-- *                          properties                          *&lt;br /&gt;
-- ****************************************************************&lt;br /&gt;
&lt;br /&gt;
-- **************** initialization of table for private properties&lt;br /&gt;
local _private = setmetatable({}, {__mode = 'k'})   -- weak table storing all private attributes&lt;br /&gt;
&lt;br /&gt;
-- **************** declaration of public static properties&lt;br /&gt;
-- Classgenerator.static.myPropertyModule = require('Module:extern')&lt;br /&gt;
-- Classgenerator.static.staticProperty = 'value'&lt;br /&gt;
&lt;br /&gt;
-- remember the static classes provided by Foundationclass:&lt;br /&gt;
-- Classgenerator.globalConfig&lt;br /&gt;
-- Classgenerator.myCargoUtil&lt;br /&gt;
-- Classgenerator.myTableTools&lt;br /&gt;
&lt;br /&gt;
-- **************** declaration of (global) private properties&lt;br /&gt;
-- for properties you should rather use constructor and _private[self]. this only, if you need a private class property&lt;br /&gt;
-- you should, however predeclare private methods here&lt;br /&gt;
local _debug	-- private method declared later&lt;br /&gt;
local _privateMethodAhead	-- declaration ahead, so this private method can be used in the constructor and in other private methods&lt;br /&gt;
&lt;br /&gt;
-- ***************************************************************&lt;br /&gt;
-- *                           methods                           *&lt;br /&gt;
-- ***************************************************************&lt;br /&gt;
 &lt;br /&gt;
-- **************** declaration of static methods&lt;br /&gt;
function Classgenerator:initialize(uid)&lt;br /&gt;
	local _CFG = self.class.myConfiguration&lt;br /&gt;
	FoundationClass.initialize(self, uid)&lt;br /&gt;
	local page = mw.title.getCurrentTitle().text&lt;br /&gt;
	if uid and mw.ustring.match(uid, '^' .. _CFG.global.namespace .. ':.+$') then&lt;br /&gt;
		page = mw.ustring.match(uid, '^' .. _CFG.global.namespace .. ':(.+)$')&lt;br /&gt;
	end&lt;br /&gt;
	_private[self] = {&lt;br /&gt;
		dbg = ClassDebug:new(tostring(self.class) .. ': id ' .. uid),&lt;br /&gt;
		pagename = page&lt;br /&gt;
	}&lt;br /&gt;
	_debug(self, 1, ' Classgenerator: done initializing object &amp;amp;quot;' .. uid ..'&amp;amp;quot;, from ' .. tostring(self))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- use use self.myConfiguration to access your configuration in a static method&lt;br /&gt;
function Classgenerator.static:aStaticMethod(var)&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator.static:aStaticMethod() to do something, from ' .. tostring(self))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Classgenerator.static:mySfDynamicFieldAttribute(fieldname, attribute, value)&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator.static:mySfDynamicFieldAttribute(fieldname, attribute, value), from ' .. tostring(self))&lt;br /&gt;
	_debug(self, 2, ' with parameters &amp;amp;quot;' .. fieldname .. '&amp;amp;quot;, &amp;amp;quot;' .. attribute .. '&amp;amp;quot; and a ' .. type(value) .. ' value')&lt;br /&gt;
	-- function that can process any attribute/value pair just before rendering the semantic forms field&lt;br /&gt;
	-- usually done, to generate a dynamic 'default' value&lt;br /&gt;
	-- keep in mind: you can completely disable a form field, if you return true on attribute &amp;quot;disable&amp;quot;. note however, that this causes the field to not show at all, no data will be transported/saved&lt;br /&gt;
	local pagename = mw.title.getCurrentTitle().rootText&lt;br /&gt;
	local val = value&lt;br /&gt;
	if Classgenerator.myTableTools.inTable({'template_name', 'global_entityTitle'}, fieldname) and attribute == 'default' then&lt;br /&gt;
		val = pagename&lt;br /&gt;
	end&lt;br /&gt;
	if fieldname == 'global_cargoTable' and attribute == 'default' then&lt;br /&gt;
		val = mw.ustring.lower(pagename)&lt;br /&gt;
	end&lt;br /&gt;
	if Classgenerator.globalConfig.dataStore ~= 'cargo' and Classgenerator.globalConfig.dataStore ~= 'both' then&lt;br /&gt;
		if fieldname == 'global_cargoTable' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
		if fieldname == 'global_cargoUidFieldname' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if Classgenerator.globalConfig.dataStore ~= 'smw' and Classgenerator.globalConfig.dataStore ~= 'both' then&lt;br /&gt;
		if fieldname == 'global_smwIsSubobject' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
		if fieldname == 'global_smwUseStorage' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
		if fieldname == 'global_autocreate_property' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return val	-- this value will be used as new value for field's attribute&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Classgenerator.static:sfGenerateForm()&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator.static:sfGenerateForm(), from ' .. tostring(self))&lt;br /&gt;
	local _CFG = self.myConfiguration&lt;br /&gt;
	local ClassgeneratorParameter  = require('Module:Classgenerator/parameter/class')&lt;br /&gt;
	local ClassSFfield = require('Module:SFfield/class')&lt;br /&gt;
	local tagStart = '{{{'&lt;br /&gt;
	local tagEnd = '}}}'&lt;br /&gt;
	local frame = mw.getCurrentFrame()&lt;br /&gt;
	-- create the form header&lt;br /&gt;
	local notification = mw.html.create('')&lt;br /&gt;
	if _CFG.form.notification and mw.ustring.len(_CFG.form.notification) &amp;gt; 0 then&lt;br /&gt;
		local mbox = require('Module:Message box')&lt;br /&gt;
		notification:wikitext(mbox.main('ombox', { text = _CFG.form.notification }))&lt;br /&gt;
			:newline()&lt;br /&gt;
	end&lt;br /&gt;
	local formheader = mw.html.create('')&lt;br /&gt;
	formheader:wikitext(self:sfGenerateFormInfoTag())&lt;br /&gt;
		:wikitext('&amp;lt;h2&amp;gt;' .. _CFG.global.entityTitle .. '&amp;lt;/h2&amp;gt;')&lt;br /&gt;
		:tag('p')&lt;br /&gt;
			:wikitext(_CFG.form.headerText)&lt;br /&gt;
			:done()&lt;br /&gt;
			:newline()&lt;br /&gt;
		:node(notification)&lt;br /&gt;
		:tag('div')&lt;br /&gt;
			:attr('id', 'wikiPreview')&lt;br /&gt;
			:cssText('display: none; padding-bottom: 25px; margin-bottom: 25px; border-bottom: 1px solid #AAAAAA;')&lt;br /&gt;
			:done()&lt;br /&gt;
			:newline()&lt;br /&gt;
	-- create the form buttons&lt;br /&gt;
	local formbuttons = mw.html.create('div')&lt;br /&gt;
	for _, button in pairs(_CFG.form.buttons) do&lt;br /&gt;
		formbuttons:wikitext(tagStart .. 'standard input&amp;amp;#124;' .. button .. tagEnd)&lt;br /&gt;
	end&lt;br /&gt;
	formbuttons:addClass('formbuttons')&lt;br /&gt;
		:done()&lt;br /&gt;
	-- calculate the fieldlists:&lt;br /&gt;
	local fieldlists = {}&lt;br /&gt;
	for _, field in pairs(_CFG.form.fieldOrder) do&lt;br /&gt;
		local tab = mw.ustring.match(field, '^([a-z]+)_.+')&lt;br /&gt;
		if not fieldlists[tab] then&lt;br /&gt;
			fieldlists[tab] = {}&lt;br /&gt;
		end&lt;br /&gt;
		table.insert(fieldlists[tab], field)&lt;br /&gt;
	end&lt;br /&gt;
	-- assemble everything, so start the html object&lt;br /&gt;
	local html = mw.html.create('div')&lt;br /&gt;
	html:node(formheader)&lt;br /&gt;
		:wikitext('&amp;lt;h1&amp;gt;GLOBAL-Section&amp;lt;/h1&amp;gt;')&lt;br /&gt;
		:newline()&lt;br /&gt;
		:tag('div')&lt;br /&gt;
			:wikitext('This section deals with all the class\'s global data, i.e. all data you need for your &amp;quot;template&amp;quot; part as wenn as for your form, ... ')&lt;br /&gt;
			:done()&lt;br /&gt;
			:newline()&lt;br /&gt;
		:wikitext(tagStart .. 'for template|' .. _CFG.template.name .. '|label=' .. _CFG.global.entityTitle .. tagEnd)&lt;br /&gt;
		:newline()&lt;br /&gt;
		:node(self:sfGenerateFormTable(fieldlists.global))&lt;br /&gt;
		:newline()&lt;br /&gt;
		:wikitext('&amp;lt;h1&amp;gt;FORM-Section&amp;lt;/h1&amp;gt;')&lt;br /&gt;
		:newline()&lt;br /&gt;
		:tag('div')&lt;br /&gt;
			:wikitext('This section deals with all the data, you need to create and operate a form for this class. If you don\'t want a form, disable this section. ' ..&lt;br /&gt;
					'If you need a form (e.g. as part of another form), but no form page, enable this section but leave the field for form page name emtpy.')&lt;br /&gt;
			:done()&lt;br /&gt;
			:newline()&lt;br /&gt;
		:node(self:sfGenerateFormTable(fieldlists.form))&lt;br /&gt;
		:newline()&lt;br /&gt;
		:wikitext('&amp;lt;h1&amp;gt;TEMPLATE-Section&amp;lt;/h1&amp;gt;')&lt;br /&gt;
		:newline()&lt;br /&gt;
		:tag('div')&lt;br /&gt;
			:wikitext('This section deals with all the data, you need to create and operate a template for this class. If you need tempalte specific parameters ' ..&lt;br /&gt;
				'(meaning parameteres that you only need to operate the &amp;quot;action&amp;quot;-part), put them into this section\'s custom field')&lt;br /&gt;
			:done()&lt;br /&gt;
			:newline()&lt;br /&gt;
		:node(self:sfGenerateFormTable(fieldlists.template))&lt;br /&gt;
		:newline()&lt;br /&gt;
		:wikitext('&amp;lt;h1&amp;gt;PARAMETERS-Section&amp;lt;/h1&amp;gt;')&lt;br /&gt;
		:newline()&lt;br /&gt;
		:tag('div')&lt;br /&gt;
			:wikitext('This section deals with all your parameters. You need an entry for every form input field, every template parameter, every data field you want to store, and even every notification line.')&lt;br /&gt;
			:tag('ul')&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(&amp;quot;To produce a normal parameter, add an entry, choose storage type, set '''Regular form parameter''' to yes, choose a form input type, and a template doc type.&amp;quot;)&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(&amp;quot;If you want a data field to be stored in your data storage but not defined in the form, choose a data storage type and set '''Regular form parameter''' to no. &amp;quot;)&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(&amp;quot;If you want a mutiple template to be parsed to a parameter, create a normal parameter (as described above) and choose '''Regular form parameter''' to  be ''Holds template''.&amp;quot;)&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(&amp;quot;A parameter with a form input that is not stored is created like a regular parameter but without setting any data storage type.&amp;quot;)&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(&amp;quot;Finally, you can create a message line. This is useful, if you want to convey any information to the user, that is to important for a description-tooltip. &amp;quot; ..&lt;br /&gt;
						&amp;quot;What you need to do is disable everything ('''Template doc parameter type ''', data storage) and set '''Regular form parameter''' to ''Information''. &amp;quot; ..&lt;br /&gt;
						&amp;quot;You probalby want to add the parameter to one or more ''show on select'' entries, too.&amp;quot;)&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
				:done()&lt;br /&gt;
				:newline()&lt;br /&gt;
			:done()&lt;br /&gt;
			:newline()&lt;br /&gt;
		:node(self:sfInitField('parameter_parameter'):render())&lt;br /&gt;
		:newline()&lt;br /&gt;
		:wikitext(frame:extensionTag('headertabs'))&lt;br /&gt;
		:newline()&lt;br /&gt;
		:wikitext(&amp;quot;'''(*) Pflichtfeld'''&amp;quot;)&lt;br /&gt;
		:newline()&lt;br /&gt;
		:wikitext(tagStart .. 'end template' .. tagEnd)&lt;br /&gt;
		:newline()&lt;br /&gt;
		:wikitext(ClassgeneratorParameter:sfGenerateForm())&lt;br /&gt;
		:newline()&lt;br /&gt;
		:node(formbuttons)&lt;br /&gt;
	local debugLevel = FoundationClass.globalConfig.debugLevel or self.myConfiguration.global.debugLevel&lt;br /&gt;
	if debugLevel then&lt;br /&gt;
		html:newline()&lt;br /&gt;
			:newline()&lt;br /&gt;
			:wikitext(ClassDebug:printLog(debugLevel))&lt;br /&gt;
	end&lt;br /&gt;
	return html&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- **************** declaration of private methods&lt;br /&gt;
-- use self.class.myConfiguration to access your configuration in a public or a private method that is called by a public method&lt;br /&gt;
_debug = function (self, level, text)&lt;br /&gt;
	if _private[self] and _private[self].dbg then&lt;br /&gt;
		local debugLevel = FoundationClass.globalConfig.debugLevel or self.class.myConfiguration.global.debugLevel&lt;br /&gt;
		if debugLevel and level &amp;lt;= debugLevel then&lt;br /&gt;
			_private[self].dbg:log(level, text)&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		local debugLevel = FoundationClass.globalConfig.debugLevel or self.myConfiguration.global.debugLevel&lt;br /&gt;
		if debugLevel and level &amp;lt;= debugLevel then&lt;br /&gt;
			ClassDebug:log(level, text, tostring(self) .. '.static')&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local _namespaceName = function (self, namespaceId)&lt;br /&gt;
	_debug(self, 1, 'entering private _namespaceName() to translate namespace namespaceId ' .. namespaceId .. ' into a universal name, from ' .. tostring(self))&lt;br /&gt;
	local ret, nulProperty = pcall(mw.title.new, 'NUL', 'Property')&lt;br /&gt;
	if ret and (namespaceId == nulProperty.namespace) then&lt;br /&gt;
		return 'property'	-- if you change this, check on other places, this is checked against and change that, too&lt;br /&gt;
	else&lt;br /&gt;
		return mw.site.namespaces[namespaceId].canonicalName&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local _processAttribute = function (self, attr, indent, name)&lt;br /&gt;
	_debug(self, 1, 'entering private _processAttribute() to print a line for attribute ' .. attr .. ', from ' .. tostring(self))&lt;br /&gt;
	local coreData = self:getCoreData()&lt;br /&gt;
	local attr = attr&lt;br /&gt;
	local val = coreData[attr]&lt;br /&gt;
	if type(val) == 'boolean' then&lt;br /&gt;
		val = val and 'true' or 'false'&lt;br /&gt;
	end&lt;br /&gt;
	local ret = ''&lt;br /&gt;
	local fieldname = mw.ustring.match(attr, '^[^_]+_(.+)$')&lt;br /&gt;
	ret = indent .. (name and name or fieldname) .. ' = '&lt;br /&gt;
	if not val then&lt;br /&gt;
		ret = ret .. 'nil'&lt;br /&gt;
	elseif type(val) == 'table' then&lt;br /&gt;
		ret = ret .. Classgenerator.myTableTools.printTable(val, 'inline')&lt;br /&gt;
	elseif val == 'true' or val == 'false' or mw.ustring.match(val, '^[0-9]+$') or (attr == 'global_gardeningCategory' and val == 'superglobal.gardeningCategory') then&lt;br /&gt;
		ret = ret .. val&lt;br /&gt;
	else&lt;br /&gt;
		ret = ret .. &amp;quot;'&amp;quot; .. mw.ustring.gsub(mw.ustring.gsub(mw.ustring.gsub(val, &amp;quot;\\'&amp;quot;, &amp;quot;'&amp;quot;), &amp;quot;'&amp;quot;, &amp;quot;\\'&amp;quot;), '\n', '\\n\' ..\n' .. indent .. '\t\'') .. &amp;quot;'&amp;quot;	-- the gsub catches multiline input from textareas&lt;br /&gt;
	end&lt;br /&gt;
	ret = ret .. ','&lt;br /&gt;
	if self.class.myConfiguration.template.addCommentsToConfig then&lt;br /&gt;
		ret = ret .. '\t-- ' .. self.class.myConfiguration.parameter[attr].description&lt;br /&gt;
	end&lt;br /&gt;
	ret = ret .. '\n'&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local _privateMethod = function (self)&lt;br /&gt;
	_debug(self, 1, 'entering private _privateMethod() to do something, from ' .. tostring(self))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- **************** declaration of public methods&lt;br /&gt;
-- use self.class.myConfiguration to access your configuration in a public method&lt;br /&gt;
function Classgenerator:addInfobox()&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator:addInfobox(), from ' .. tostring(self))&lt;br /&gt;
	if self:goodToGo() then&lt;br /&gt;
		local _CFG = self.class.myConfiguration&lt;br /&gt;
		local coreData = self:getCoreData()&lt;br /&gt;
		local usesSmw = FoundationClass.globalConfig.dataStore and (FoundationClass.globalConfig.dataStore == 'both' or FoundationClass.globalConfig.dataStore == 'smw') and FoundationClass.myYesno(coreData.global_smwUseStorage)&lt;br /&gt;
		local ib_args = {&lt;br /&gt;
			bodyclass = 'infobox_name',&lt;br /&gt;
			aboveclass = 'objtitle titletext',&lt;br /&gt;
			headerclass = 'headertext',&lt;br /&gt;
			labelstyle = 'width: 30%;',&lt;br /&gt;
			datastyle = 'width: 70%;',&lt;br /&gt;
			title = coreData.className,&lt;br /&gt;
			subheader = 'Class',&lt;br /&gt;
			label1 = 'Title',&lt;br /&gt;
			data1 = coreData.global_entityTitle and coreData.global_entityTitle or '',&lt;br /&gt;
			label2 = _CFG.parameter.global_edit_timestamp.label,&lt;br /&gt;
			data2 = coreData.last_edited,&lt;br /&gt;
			label3 = 'Store available',&lt;br /&gt;
			data3 = (FoundationClass.globalConfig.dataStore and mw.ustring.len(FoundationClass.globalConfig.dataStore) &amp;gt; 0) and FoundationClass.globalConfig.dataStore or '',&lt;br /&gt;
			label5 = 'Cargo table',&lt;br /&gt;
			data5 = (FoundationClass.globalConfig.dataStore and (FoundationClass.globalConfig.dataStore == 'both' or FoundationClass.globalConfig.dataStore == 'cargo')) and coreData.global_cargoTable or '',&lt;br /&gt;
			label6 = 'Smw class',&lt;br /&gt;
			data6 = usesSmw and _private[self].pagename or '',&lt;br /&gt;
			data7 = coreData.global_description,&lt;br /&gt;
			header10 = 'Pages',&lt;br /&gt;
			label12 = 'Module',&lt;br /&gt;
			data12 = _private[self].pagename and '[[Module:' .. _private[self].pagename .. ']]' or '',&lt;br /&gt;
			label13 = 'Class',&lt;br /&gt;
			data13 = _private[self].pagename and '[[Module:' .. _private[self].pagename .. '/class]]' or '',&lt;br /&gt;
			label14 = 'Config',&lt;br /&gt;
			data14 = _private[self].pagename and '[[Module:' .. _private[self].pagename .. '/config]]' or '',&lt;br /&gt;
			label17 = 'Template',&lt;br /&gt;
			data17 = coreData.template_name and '[[Template:' .. coreData.template_name .. ']]' or '',&lt;br /&gt;
			label19 = 'Form',&lt;br /&gt;
			data19 = coreData.page.form and '[[:' .. coreData.page.form.name .. ']]' or '',&lt;br /&gt;
			label21 = 'Category',&lt;br /&gt;
			data21 = coreData.page.category and '[[:' .. coreData.page.category.name .. ']]' or '',&lt;br /&gt;
			label22 = 'Gardening',&lt;br /&gt;
			data22 = coreData.page.gardeningCategory and '[[:' .. coreData.page.gardeningCategory.name .. ']]' or '',&lt;br /&gt;
		}&lt;br /&gt;
		if usesSmw and coreData.properties.order and #coreData.properties.order &amp;gt; 0 then&lt;br /&gt;
			ib_args.header30 = 'Properties'&lt;br /&gt;
			local i = 31&lt;br /&gt;
			for _, property in pairs(coreData.properties.order) do&lt;br /&gt;
				ib_args['label' .. i] = coreData.properties.data[property].type&lt;br /&gt;
				ib_args['data' .. i] = '[[Property:' .. property .. '|' .. property .. ']]'&lt;br /&gt;
				i = i + 1&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		self:addOutput(require('Module:Infobox').infobox(ib_args))&lt;br /&gt;
		return true&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Classgenerator:addPageBody()&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator:addPageBody(), from ' .. tostring(self))&lt;br /&gt;
	_debug(self, 2, ' rendering errors and warnings and adding them to output')&lt;br /&gt;
	self:addOutput(self:renderErrors())&lt;br /&gt;
	self:addOutput(self:renderWarnings())&lt;br /&gt;
	if self:goodToGo() then&lt;br /&gt;
		local frame = mw.getCurrentFrame()&lt;br /&gt;
		local lang = mw.language.new('en-gb')&lt;br /&gt;
		local _CFG = self.class.myConfiguration&lt;br /&gt;
		local coreData = self:getCoreData()&lt;br /&gt;
		-- start&lt;br /&gt;
		local widthTh = '300px'&lt;br /&gt;
		local widthTd = '200px'&lt;br /&gt;
		-- build the page status table&lt;br /&gt;
		-- first the two status table cells &amp;quot;green&amp;quot; and &amp;quot;red&amp;quot;&lt;br /&gt;
		local imgYes = '[[File:Yes check.png|13px|alt=Yes|link=]]'&lt;br /&gt;
		local imgNo = '[[File:X mark.png|13px|alt=No|link=]]'&lt;br /&gt;
		local tdYa = mw.html.create('td')&lt;br /&gt;
		tdYa:cssText('background: #90ff90; color:black; vertical-align: middle; text-align: center; width:' .. widthTd)&lt;br /&gt;
			:addClass('table-yes')&lt;br /&gt;
			:wikitext(imgYes)&lt;br /&gt;
		local tdNa = mw.html.create('td')&lt;br /&gt;
		tdNa:cssText('background: #FF9090; color:black; vertical-align: middle; text-align: center; width:' .. widthTd)&lt;br /&gt;
			:addClass('table-no')&lt;br /&gt;
			:wikitext(imgNo)&lt;br /&gt;
		local classExists = coreData.page.class.exists and coreData.page.config.exists&lt;br /&gt;
		local modulesExist = coreData.page.base.exists and classExists&lt;br /&gt;
		local thisClass&lt;br /&gt;
		local thisConfig&lt;br /&gt;
		if classExists then&lt;br /&gt;
			thisClass = require(coreData.page.class.name)&lt;br /&gt;
			thisConfig = require(coreData.page.config.name)&lt;br /&gt;
		end&lt;br /&gt;
		local thisUsesCargo = (FoundationClass.globalConfig.dataStore == 'both' or FoundationClass.globalConfig.dataStore == 'cargo') and coreData.global_cargoTable and #coreData.global_cargoTable &amp;gt; 0&lt;br /&gt;
		local thisUsesSmw = (FoundationClass.globalConfig.dataStore == 'both' or FoundationClass.globalConfig.dataStore == 'smw') and FoundationClass.myYesno(coreData.global_smwUseStorage)&lt;br /&gt;
		-- write the 2do checklist&lt;br /&gt;
		local done = true&lt;br /&gt;
		local step1&lt;br /&gt;
		local step2&lt;br /&gt;
		local step3&lt;br /&gt;
		if modulesExist then&lt;br /&gt;
			step1 = imgYes .. ' You created all your modules'&lt;br /&gt;
		else&lt;br /&gt;
			done = false&lt;br /&gt;
			step1 = imgNo .. ' You have to create your module pages. This, you have to do &amp;lt;b&amp;gt;manually&amp;lt;/b&amp;gt;. Go to [[#Page contents|section Page contents]], copy the module content and edit the corresponding module, ' ..&lt;br /&gt;
				'pasting all the copied content. Save and close. You have to do this for the following module(s): &amp;lt;ul&amp;gt; ' ..&lt;br /&gt;
				(not coreData.page.base.exists and '&amp;lt;li&amp;gt;[[#Page contents|' .. coreData.page.base.name .. ']]&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
				(not coreData.page.class.exists and '&amp;lt;li&amp;gt;[[#Page contents|' .. coreData.page.class.name .. ']]&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
				(not coreData.page.config.exists and '&amp;lt;li&amp;gt;[[#Page contents|' .. coreData.page.config.name .. ']]&amp;lt;/li&amp;gt;' or '') .. '&amp;lt;/ul&amp;gt;'&lt;br /&gt;
		end&lt;br /&gt;
		if coreData.page.baseDoc.exists and coreData.page.classDoc.exists and coreData.page.configDoc.exists and coreData.page.template.exists and coreData.page.templateDoc.exists and&lt;br /&gt;
				(not coreData.page.form or coreData.page.form.exists) and (not coreData.page.category or coreData.page.category.exists) and (not coreData.page.gardeningCategory or coreData.page.gardeningCategory.exists) then&lt;br /&gt;
			step2 = imgYes .. ' You created all auxilliary pages'&lt;br /&gt;
		else&lt;br /&gt;
			done = false&lt;br /&gt;
			step2 = imgNo .. ' You have to create auxilliary pages. This, you can do &amp;lt;b&amp;gt;automatically&amp;lt;/b&amp;gt;. Go to [[#Page autocreation|section Page autocreation]], hit the corresponding &amp;quot;Create&amp;quot;-button or ' ..&lt;br /&gt;
				'create all pages at once. Please do this for the following page(s): &amp;lt;ul&amp;gt; ' ..&lt;br /&gt;
				(not (coreData.page.baseDoc.exists or coreData.page.classDoc.exists or coreData.page.configDoc.exists) and '&amp;lt;li&amp;gt;Module documentation pages&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
				(not (coreData.page.template.exists or coreData.page.templateDoc.exists) and '&amp;lt;li&amp;gt;Template and/or template documentation page&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
				((coreData.page.form and not coreData.page.form.exists) and '&amp;lt;li&amp;gt;Form page&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
				(((coreData.page.category and not coreData.page.category.exists) or (coreData.page.gardeningCategory and not coreData.page.gardeningCategory.exists)) and '&amp;lt;li&amp;gt;Category page(s)&amp;lt;/li&amp;gt;' or '') .. '&amp;lt;/ul&amp;gt;'&lt;br /&gt;
		end&lt;br /&gt;
		local storeCargoInstruction&lt;br /&gt;
		local allPropertiesThere = true&lt;br /&gt;
		local cargoTableCreateLink = false&lt;br /&gt;
		if thisUsesCargo then&lt;br /&gt;
			-- we actually use cargo. check, if cargo table is there or throws an error? if all right, then yes, else instruction above&lt;br /&gt;
			if modulesExist and coreData.page.template.exists then&lt;br /&gt;
				cargoTableCreateLink = true&lt;br /&gt;
				attr = { limit = 1, default = '' }&lt;br /&gt;
				attr['more results text'] = ''&lt;br /&gt;
				local tableEntryId = mw.text.trim(mw.text.unstrip(FoundationClass.myCargoUtil.rawquery({tables = coreData.global_cargoTable, fields = {'_ID'}}, attr)))&lt;br /&gt;
				if mw.ustring.match(mw.text.trim(tableEntryId), '^[0-9]*$') then&lt;br /&gt;
					storeCargoInstruction = imgYes .. ' Your cargo table does exist! (Note: When you change your cargo table\'s declaration, you need to [[#Page autocreation|rebuild it]], though)'&lt;br /&gt;
				else&lt;br /&gt;
					done = false&lt;br /&gt;
					storeCargoInstruction = imgNo .. ' Please [[#Page autocreation|create your cargo table]]!'&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				done = false&lt;br /&gt;
				storeCargoInstruction = imgNo .. ' To be able to create your cargo table, you have to create the following page(s): &amp;lt;ul&amp;gt;' ..&lt;br /&gt;
					(not coreData.page.base.exists and '&amp;lt;li&amp;gt;' .. coreData.page.base.name .. '&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
					(not coreData.page.class.exists and '&amp;lt;li&amp;gt;' .. coreData.page.class.name .. '&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
					(not coreData.page.config.exists and '&amp;lt;li&amp;gt;' .. coreData.page.config.name .. '&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
					(not coreData.page.template.exists and '&amp;lt;li&amp;gt;' .. coreData.page.template.name .. '&amp;lt;/li&amp;gt;' or '') .. '&amp;lt;/ul&amp;gt;'&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if thisUsesSmw then&lt;br /&gt;
			-- we actually use smw. check, if all properties are present? if all right, then yes, else instruction above&lt;br /&gt;
			if coreData.properties and coreData.properties.data and FoundationClass.myTableTools.size(coreData.properties.data) &amp;gt; 0 then&lt;br /&gt;
				for property, propertyData in pairs(coreData.properties.data) do&lt;br /&gt;
					allPropertiesThere = allPropertiesThere and propertyData.exists&lt;br /&gt;
				end&lt;br /&gt;
				if allPropertiesThere then&lt;br /&gt;
					storeSwmInstruction = imgYes .. ' All your property pages are present and accounted for!'&lt;br /&gt;
				else&lt;br /&gt;
					done = false&lt;br /&gt;
					storeSwmInstruction = imgNo .. ' Please &amp;lt;b&amp;gt;[[#Page autocreation|autocreate]]&amp;lt;/b&amp;gt; your properties! The following are missing: &amp;lt;ul&amp;gt;'&lt;br /&gt;
					for _, property in pairs(coreData.properties.order) do&lt;br /&gt;
						local pdata = coreData.properties.data[property]&lt;br /&gt;
						if not pdata or not pdata.exists then&lt;br /&gt;
							storeSwmInstruction = storeSwmInstruction .. '&amp;lt;li&amp;gt;[[Property:' .. property .. ']]&amp;lt;/li&amp;gt;'&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
					storeSwmInstruction = storeSwmInstruction .. '&amp;lt;/ul&amp;gt;'&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				done = false&lt;br /&gt;
				storeSwmInstruction = imgNo .. ' To be able to create your smw properties, you have to create the following page(s): &amp;lt;ul&amp;gt;' ..&lt;br /&gt;
					(not coreData.page.class.exists and '&amp;lt;li&amp;gt;' .. coreData.page.class.name .. '&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
					(not coreData.page.config.exists and '&amp;lt;li&amp;gt;' .. coreData.page.config.name .. '&amp;lt;/li&amp;gt;' or '') .. '&amp;lt;/ul&amp;gt;'&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if storeCargoInstruction or storeSwmInstruction then&lt;br /&gt;
			if storeCargoInstruction and storeSwmInstruction then&lt;br /&gt;
				step3 = 'Your class used cargo AND smw store. You have to create both data stores: &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;' .. storeCargoInstruction .. '&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;' .. storeSwmInstruction .. '&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;'&lt;br /&gt;
			else&lt;br /&gt;
				step3 = storeCargoInstruction or storeSwmInstruction&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			step3 = imgYes .. ' This class does not use a data store. Nothing to be done here!'&lt;br /&gt;
		end&lt;br /&gt;
		local step4 = done and imgYes .. ' You are done. Remember, when you want to change parameters in your config, edit this page and write your [' .. coreData.page.config.editlink .. ' config file] new' or &lt;br /&gt;
			imgNo .. ' You are not finished yet, please tend to your tasks.'&lt;br /&gt;
		local manual = mw.html.create('')&lt;br /&gt;
		manual:wikitext('&amp;lt;h2&amp;gt;Your 2do checklist&amp;lt;/h2&amp;gt;')&lt;br /&gt;
			:tag('ol')&lt;br /&gt;
				:cssText('margin: 0.3em 0 0 1.6em; padding: 0')&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(step1)&lt;br /&gt;
					:done()&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(step2)&lt;br /&gt;
					:done()&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(step3)&lt;br /&gt;
					:done()&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(step4)&lt;br /&gt;
					:done()&lt;br /&gt;
				:done()&lt;br /&gt;
		-- get the data store details, if all the modules exist and we have a datastore configured&lt;br /&gt;
		local datastore = mw.html.create('')&lt;br /&gt;
		if thisClass then&lt;br /&gt;
			datastore:node(thisClass:explainDataStore())&lt;br /&gt;
				:newline()&lt;br /&gt;
		end&lt;br /&gt;
		-- build the status table&lt;br /&gt;
		local statusTrs = mw.html.create('')&lt;br /&gt;
		for _, pid in pairs(coreData.page.order) do&lt;br /&gt;
			statusTrs:tag('tr')&lt;br /&gt;
				:tag('th')&lt;br /&gt;
					:css('text-align', 'left')&lt;br /&gt;
					:css('width', widthTh)&lt;br /&gt;
					:wikitext(coreData.page[pid].name)&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
				:node(coreData.page[pid].exists and tdYa or tdNa)&lt;br /&gt;
				:newline()&lt;br /&gt;
				:done()&lt;br /&gt;
				:newline()&lt;br /&gt;
		end&lt;br /&gt;
		if thisUsesSmw and coreData.properties and coreData.properties.data and FoundationClass.myTableTools.size(coreData.properties.data) &amp;gt; 0 then&lt;br /&gt;
			statusTrs:tag('tr')&lt;br /&gt;
				:tag('th')&lt;br /&gt;
					:css('text-align', 'center')&lt;br /&gt;
					:css('width', widthTh)&lt;br /&gt;
					:attr('colspan', 2)&lt;br /&gt;
					:wikitext('Property pages for your smw store')&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
			for _, property in pairs(coreData.properties.order) do&lt;br /&gt;
				statusTrs:tag('tr')&lt;br /&gt;
					:tag('th')&lt;br /&gt;
						:css('text-align', 'left')&lt;br /&gt;
						:css('width', widthTh)&lt;br /&gt;
						:wikitext('Property:' .. property)&lt;br /&gt;
						:done()&lt;br /&gt;
						:newline()&lt;br /&gt;
					:node(coreData.properties.data[property].exists and tdYa or tdNa)&lt;br /&gt;
					:newline()&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		local statusTable = mw.html.create('table')&lt;br /&gt;
		statusTable:node(statusTrs)&lt;br /&gt;
		-- page autocreation&lt;br /&gt;
		local extAutoCreatePage = pcall(frame.callParserFunction, frame, {name = '#createpageifnotex:Module:Classgenerator', {'NUL'}})&lt;br /&gt;
		local autoCreation = _CFG.template.createPages and extAutoCreatePage&lt;br /&gt;
		local pageAutoCreation = mw.html.create('')&lt;br /&gt;
		pageAutoCreation:wikitext('&amp;lt;h2&amp;gt;Page autocreation&amp;lt;/h2&amp;gt;')&lt;br /&gt;
			:newline()&lt;br /&gt;
		if autoCreation then&lt;br /&gt;
			-- depending on parameters and existence of pages do the autocreate or print the button&lt;br /&gt;
			-- first see, which pagecomplexes (modules(docs), templates, form, category) are missing&lt;br /&gt;
			local missing = {}&lt;br /&gt;
			-- in missing we store, if a page in a given namespace is missing. Namespaces are stored by their ids (numbers)&lt;br /&gt;
			for _, pid in pairs(coreData.page.order) do&lt;br /&gt;
				-- due to extension autocreatepage messing up module pages, in namepace module we only autocreate doc pages&lt;br /&gt;
				if not coreData.page[pid].exists and not Classgenerator.myTableTools.inTable(missing, coreData.page[pid].namespace) and &lt;br /&gt;
						(coreData.page[pid].namespace ~= 828 or coreData.page[pid].isDocPage) then&lt;br /&gt;
					table.insert(missing, coreData.page[pid].namespace)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			if thisUsesSmw and not allPropertiesThere then&lt;br /&gt;
				table.insert(missing, mw.title.new('NUL', 'Property').namespace)&lt;br /&gt;
			end&lt;br /&gt;
			-- now generate the printout or call the parser function depending on global_autocreate_* status&lt;br /&gt;
			-- remember the switches 'global_autocreate_module', 'global_autocreate_template', 'global_autocreate_form', 'global_autocreate_category', and 'global_autocreate_property'&lt;br /&gt;
			local actable = mw.html.create('table')&lt;br /&gt;
			for _, nsid  in pairs(missing) do&lt;br /&gt;
				local ns = mw.ustring.lower(_namespaceName(self, nsid))&lt;br /&gt;
				local information = ''&lt;br /&gt;
				if coreData.autocreate[ns] and coreData.autocreate[ns] &amp;gt; os.time() - _CFG.template.autoCreationTimeDiff then&lt;br /&gt;
					-- ************************************* actual autocreation is done here&lt;br /&gt;
					-- we iterate over all namespaces for which pages are missing (var missing) and spring into action, if we have a numeric value supplied for that namespace coreData.autocreate[ns] that is recent enough&lt;br /&gt;
					-- now we have a namespace, we want to create pages for (var nsid) (all that is done in the recent 4 lines). what we do in the following lines:&lt;br /&gt;
					-- we iterate over all pages in coreData.page.order and spring into action, if the interation instance (pid) is in the namespace (nsid), the page is non exist and is not a module&lt;br /&gt;
					-- in that action body, we create the page with the precalcualted content&lt;br /&gt;
					-- also: for convenience, we create some global project (meta)categories, if related to the current page (project-form-category if nsid for forms, etc.) and configured in Foundationclass/globalconfig. here is an overview&lt;br /&gt;
					--	Classgenerator.globalConfig.formCategory			: MediaWiki:Classengine-content-project-form-category&lt;br /&gt;
					--	Classgenerator.globalConfig.gardeningSuperCategory	: MediaWiki:Classengine-content-project-gardening-supercategory&lt;br /&gt;
					--	Classgenerator.globalConfig.moduleCategory			: MediaWiki:Classengine-content-project-module-category&lt;br /&gt;
					--	Classgenerator.globalConfig.projectSuperCategory	: MediaWiki:Classengine-content-project-supercategory&lt;br /&gt;
					--	Classgenerator.globalConfig.propertyCategory		: MediaWiki:Classengine-content-project-property-category&lt;br /&gt;
					--	Classgenerator.globalConfig.templateCategory		: MediaWiki:Classengine-content-project-templates&lt;br /&gt;
					for _, pid in pairs(coreData.page.order) do&lt;br /&gt;
						_debug(self, 3, ' testing page &amp;quot;' .. coreData.page[pid].name .. '&amp;quot;: namespace id is ' .. coreData.page[pid].namespace ..&lt;br /&gt;
							', and page does ' ..(not coreData.page[pid].exists and 'not ' or '') .. 'exist')&lt;br /&gt;
						if coreData.page[pid].namespace == nsid and not coreData.page[pid].exists and (nsid ~= 828 or coreData.page[pid].isDocPage) then&lt;br /&gt;
							if pid == 'gardeningCategory' and Classgenerator.globalConfig.gardeningSuperCategory and #Classgenerator.globalConfig.gardeningSuperCategory &amp;gt; 0 then&lt;br /&gt;
								-- we just iterated over the gardening category page (so this class has one) but we did not create it, yet)&lt;br /&gt;
								-- blindly try to create the gardening supercategory first, in case the class's gardening category is the gardening supercategory, we dont want the class specific content&lt;br /&gt;
								local content = '{{MediaWiki:Classengine-content-project-gardening-supercategory}}'&lt;br /&gt;
								_debug(self, 3, ' trying to autocreate garderning supercategory page &amp;quot;' .. Classgenerator.globalConfig.gardeningSuperCategory .. '&amp;quot; with # of content being ' .. #content)&lt;br /&gt;
								local ret = frame:callParserFunction{ name = '#createpageifnotex:Category:' .. Classgenerator.globalConfig.gardeningSuperCategory, args = { content } }&lt;br /&gt;
								if #ret &amp;gt; 0 then&lt;br /&gt;
									information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
								end&lt;br /&gt;
							end&lt;br /&gt;
							_debug(self, 3, ' trying to autocreate page &amp;quot;' .. coreData.page[pid].name .. '&amp;quot; with # of content being ' .. #coreData.page[pid].content)&lt;br /&gt;
							local ret = frame:callParserFunction{ name = '#createpageifnotex:' .. coreData.page[pid].name, args = { frame:preprocess(coreData.page[pid].content) } }&lt;br /&gt;
							if #ret &amp;gt; 0 then&lt;br /&gt;
								information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
							end&lt;br /&gt;
							if pid == 'form' and Classgenerator.globalConfig.formCategory and #Classgenerator.globalConfig.formCategory &amp;gt; 0 then&lt;br /&gt;
								-- we just iterated over the form page (so this class has one) and created it (yay). Now blindly create the formCategory as well...&lt;br /&gt;
								local content = '{{MediaWiki:Classengine-content-project-form-category}}'&lt;br /&gt;
								_debug(self, 3, ' trying to autocreate form category page &amp;quot;' .. Classgenerator.globalConfig.formCategory .. '&amp;quot; with # of content being ' .. #content)&lt;br /&gt;
								local ret = frame:callParserFunction{ name = '#createpageifnotex:Category:' .. Classgenerator.globalConfig.formCategory, args = { content } }&lt;br /&gt;
								if #ret &amp;gt; 0 then&lt;br /&gt;
									information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
								end&lt;br /&gt;
							elseif nsid ~= 828 and Classgenerator.globalConfig.moduleCategory and #Classgenerator.globalConfig.moduleCategory &amp;gt; 0 then&lt;br /&gt;
								-- we just iterated a module doc page (so this class has one) and created it (yay). Now blindly create the moduleCategory as well...&lt;br /&gt;
								local content = '{{MediaWiki:Classengine-content-project-module-category}}'&lt;br /&gt;
								_debug(self, 3, ' trying to autocreate module category page &amp;quot;' .. Classgenerator.globalConfig.moduleCategory .. '&amp;quot; with # of content being ' .. #content)&lt;br /&gt;
								local ret = frame:callParserFunction{ name = '#createpageifnotex:Category:' .. Classgenerator.globalConfig.moduleCategory, args = { content } }&lt;br /&gt;
								if #ret &amp;gt; 0 then&lt;br /&gt;
									information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
								end&lt;br /&gt;
							elseif pid == 'category' and Classgenerator.globalConfig.projectSuperCategory and #Classgenerator.globalConfig.projectSuperCategory &amp;gt; 0 then&lt;br /&gt;
								-- we just iterated over the category page (so this class has one) and created it (yay). Now blindly create the supercategory as well...&lt;br /&gt;
								local content = '{{MediaWiki:Classengine-content-project-supercategory}}'&lt;br /&gt;
								_debug(self, 3, ' trying to autocreate super category page &amp;quot;' .. Classgenerator.globalConfig.projectSuperCategory .. '&amp;quot; with # of content being ' .. #content)&lt;br /&gt;
								local ret = frame:callParserFunction{ name = '#createpageifnotex:Category:' .. Classgenerator.globalConfig.projectSuperCategory, args = { content } }&lt;br /&gt;
								if #ret &amp;gt; 0 then&lt;br /&gt;
									information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
								end&lt;br /&gt;
							elseif nsid == 10 and Classgenerator.globalConfig.templateCategory and #Classgenerator.globalConfig.templateCategory &amp;gt; 0 then&lt;br /&gt;
								-- we just iterated over a page in template namespace (so this class has one) and created it (yay). Now blindly create the templateCategory as well...&lt;br /&gt;
								local content = '{{MediaWiki:Classengine-content-project-template-category}}'&lt;br /&gt;
								_debug(self, 3, ' trying to autocreate template category page &amp;quot;' .. Classgenerator.globalConfig.templateCategory .. '&amp;quot; with # of content being ' .. #content)&lt;br /&gt;
								local ret = frame:callParserFunction{ name = '#createpageifnotex:Category:' .. Classgenerator.globalConfig.templateCategory, args = { content } }&lt;br /&gt;
								if #ret &amp;gt; 0 then&lt;br /&gt;
									information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
								end&lt;br /&gt;
							end&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
					if thisUsesSmw and (nsid == mw.title.new('NUL', 'Property').namespace) and coreData.properties.data then&lt;br /&gt;
						-- add here autocreation of properties&lt;br /&gt;
						for property, pdata in pairs(coreData.properties.data) do&lt;br /&gt;
							if not pdata.exists then&lt;br /&gt;
								local content = pdata.content&lt;br /&gt;
								_debug(self, 3, ' trying to autocreate property page &amp;quot;' .. property .. '&amp;quot; with # of content being ' .. #content)&lt;br /&gt;
								local ret = frame:callParserFunction{ name = '#createpageifnotex:Property:' .. property, args = { frame:preprocess(pdata.content) } }&lt;br /&gt;
								if #ret &amp;gt; 0 then&lt;br /&gt;
									information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
								end&lt;br /&gt;
							end&lt;br /&gt;
						end&lt;br /&gt;
						-- we just iterated over all missing property pages (so this class has some) and created them (yay). Now blindly create the propertyCategory as well...&lt;br /&gt;
						local content = '{{MediaWiki:Classengine-content-project-property-category}}'&lt;br /&gt;
						_debug(self, 3, ' trying to autocreate property category page &amp;quot;' .. Classgenerator.globalConfig.propertyCategory .. '&amp;quot; with # of content being ' .. #content)&lt;br /&gt;
						local ret = frame:callParserFunction{ name = '#createpageifnotex:Category:' .. Classgenerator.globalConfig.propertyCategory, args = { content } }&lt;br /&gt;
						if #ret &amp;gt; 0 then&lt;br /&gt;
							information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				-- create the tr for the ns&lt;br /&gt;
				actable:tag('tr')&lt;br /&gt;
					:tag('th')&lt;br /&gt;
						:css('text-align', 'left')&lt;br /&gt;
						:css('width', widthTh)&lt;br /&gt;
						:wikitext('Create ' .. ((nsid == 828 and 'module docs' or (ns == 'property' and 'properties' or (ns .. (ns == 'template' and 's' or '')))) .. ':'))&lt;br /&gt;
							-- note: nsid == mw.title.new('NUL', 'Property').namespace is necessary since canonicalname for property namespace does not translate uniquely over different languages :(&lt;br /&gt;
						:done()&lt;br /&gt;
						:newline()&lt;br /&gt;
					:tag('td')&lt;br /&gt;
						:cssText('color:black; vertical-align: middle; text-align: center; width:' .. widthTd)&lt;br /&gt;
						:css('background', (coreData.autocreate[ns] and coreData.autocreate[ns] &amp;gt; os.time() - _CFG.template.autoCreationTimeDiff) and '#90ff90' or '#FF9090' )&lt;br /&gt;
						:wikitext(frame:callParserFunction{name = '#autoedit', args={form='Classgenerator', target=self:getUid(),&lt;br /&gt;
							'link text=' .. (coreData.autocreate[ns] and 'Requested on ' .. os.date('%d.%m.%Y %X', coreData.autocreate[ns]) or 'Create automatically!')  .. &lt;br /&gt;
								(#information &amp;gt; 0 and ('Call returned ' .. information) or ''),&lt;br /&gt;
							'reload', summary=&amp;quot;Requesting the autocreation of &amp;quot; .. coreData.className .. ' for pages of type ' .. ns,&lt;br /&gt;
							'query string=Classgenerator[global_autocreate_' .. ns .. ']=' .. os.time()}&lt;br /&gt;
							})&lt;br /&gt;
						:done()&lt;br /&gt;
						:newline()&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
&lt;br /&gt;
			end&lt;br /&gt;
			if Classgenerator.myTableTools.size(missing) &amp;gt; 0 then&lt;br /&gt;
				-- show the all button&lt;br /&gt;
				local querystring = ''&lt;br /&gt;
				for _, nsid in pairs(missing) do&lt;br /&gt;
					local ns = mw.ustring.lower(_namespaceName(self, nsid))&lt;br /&gt;
					querystring = querystring .. 'Classgenerator[global_autocreate_' .. ns .. ']=' .. os.time() .. '&amp;amp;'&lt;br /&gt;
				end&lt;br /&gt;
				querystring = mw.ustring.sub(querystring, 1, -2)&lt;br /&gt;
				actable:tag('tr')&lt;br /&gt;
					:tag('th')&lt;br /&gt;
						:css('text-align', 'left')&lt;br /&gt;
						:css('width', widthTh)&lt;br /&gt;
						:wikitext('Create all pages:')&lt;br /&gt;
						:done()&lt;br /&gt;
						:newline()&lt;br /&gt;
					:tag('td')&lt;br /&gt;
						:cssText('background: #FF9090; color:black; vertical-align: middle; text-align: center; width:' .. widthTd)&lt;br /&gt;
						:wikitext(frame:callParserFunction{name = '#autoedit', args={form='Classgenerator', target=self:getUid(),&lt;br /&gt;
							'link text=Create automatically!', 'reload', summary=&amp;quot;Requesting the autocreation of all missing pages&amp;quot;, 'query string=' .. querystring }&lt;br /&gt;
							})&lt;br /&gt;
						:done()&lt;br /&gt;
						:newline()&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
				pageAutoCreation:wikitext('&amp;lt;b&amp;gt;Note:&amp;lt;/b&amp;gt; Creation of module pages is impossible due to an incompatibility issue.')&lt;br /&gt;
					:newline()&lt;br /&gt;
					:node(actable)&lt;br /&gt;
					:newline()&lt;br /&gt;
			else&lt;br /&gt;
				pageAutoCreation:wikitext('All pages present!')&lt;br /&gt;
					:newline()&lt;br /&gt;
					:tag('p')&lt;br /&gt;
						:wikitext('&amp;lt;small&amp;gt;&amp;lt;b&amp;gt;Note:&amp;lt;/b&amp;gt; Creation of module pages is impossible due to an incompatibility issue.&amp;lt;/small&amp;gt;')&lt;br /&gt;
						:newline()&lt;br /&gt;
						:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			pageAutoCreation:wikitext('Page autocreation is only possible if activated in your [[Module:Classgenerator/config]]-file (see template-section) and '&lt;br /&gt;
					.. 'Extension AutoCreatePage being installed.')&lt;br /&gt;
				:newline()&lt;br /&gt;
		end&lt;br /&gt;
		if cargoTableCreateLink then&lt;br /&gt;
			pageAutoCreation:wikitext('&amp;lt;b&amp;gt;Cargo data store:&amp;lt;/b&amp;gt;To (re-)create your cargo table, follow &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[' .. coreData.page.template.recreatedata .. ' this link]&amp;lt;/span&amp;gt; and then press ok!')&lt;br /&gt;
				:newline()&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		-- build the content collapses&lt;br /&gt;
		local collapse = require('Module:Collapse').main&lt;br /&gt;
		local bg_sets = { exist = {'#cfc', '#9c9'}, nonexist = {'#fcc', '#c99'} }&lt;br /&gt;
		local bg = 1&lt;br /&gt;
		local pageContent = mw.html.create('')&lt;br /&gt;
		for _, pid in pairs(coreData.page.order) do&lt;br /&gt;
			local content&lt;br /&gt;
			local bgs = coreData.page[pid].exists and bg_sets.exist or bg_sets.nonexist&lt;br /&gt;
			if coreData.page[pid].namespace == 828 and not coreData.page[pid].isDocPage then&lt;br /&gt;
				content = frame:expandTemplate{ title = 'Code', args = {lang = 'lua', code = coreData.page[pid].content, line = '1'}}&lt;br /&gt;
			else&lt;br /&gt;
				content = '&amp;lt;pre style=&amp;quot;white-space:-moz-pre-wrap; white-space:-pre-wrap; white-space:-o-pre-wrap; white-space:pre-wrap; word-wrap:break-word;&amp;quot;&amp;gt;' .. &lt;br /&gt;
					mw.text.nowiki(frame:preprocess(coreData.page[pid].content)) .. '&amp;lt;/pre&amp;gt;'&lt;br /&gt;
			end&lt;br /&gt;
			pageContent:wikitext(collapse({ header = 'Contents of &amp;lt;b&amp;gt;[[:' .. coreData.page[pid].name .. ']]&amp;lt;/b&amp;gt; ' ..&lt;br /&gt;
							'&amp;lt;span class=&amp;quot;plainlinks&amp;quot; style=&amp;quot;font-size:75%;&amp;quot;&amp;gt;&amp;amp;#91;[' .. coreData.page[pid].editlink ..&lt;br /&gt;
							' EDIT]&amp;amp;#93;&amp;lt;/span&amp;gt;',&lt;br /&gt;
						content = content, left = true, bg = bgs[bg]&lt;br /&gt;
					}))&lt;br /&gt;
				:newline()&lt;br /&gt;
			bg = (bg == 2 and 1 or 2)&lt;br /&gt;
		end&lt;br /&gt;
		if thisUsesSmw and coreData.properties.order then&lt;br /&gt;
			-- add here the collpases of the properties&lt;br /&gt;
			pageContent:tag('p')&lt;br /&gt;
				:wikitext('&amp;lt;h3&amp;gt;All property pages&amp;lt;/h3&amp;gt;')&lt;br /&gt;
				:done()&lt;br /&gt;
			for _, property in pairs(coreData.properties.order) do&lt;br /&gt;
				local bgs = coreData.properties.data[property].exists and bg_sets.exist or bg_sets.nonexist&lt;br /&gt;
				local content = '&amp;lt;pre style=&amp;quot;white-space:-moz-pre-wrap; white-space:-pre-wrap; white-space:-o-pre-wrap; white-space:pre-wrap; word-wrap:break-word;&amp;quot;&amp;gt;' .. &lt;br /&gt;
					mw.text.nowiki(frame:preprocess(coreData.properties.data[property].content)) .. '&amp;lt;/pre&amp;gt;'&lt;br /&gt;
				pageContent:wikitext(collapse({ header = 'Contents of &amp;lt;b&amp;gt;[[:Property:' .. property .. ']]&amp;lt;/b&amp;gt; ' ..&lt;br /&gt;
								'&amp;lt;span class=&amp;quot;plainlinks&amp;quot; style=&amp;quot;font-size:75%;&amp;quot;&amp;gt;&amp;amp;#91;[' .. coreData.properties.data[property].editlink ..&lt;br /&gt;
								' EDIT]&amp;amp;#93;&amp;lt;/span&amp;gt;',&lt;br /&gt;
							content = content, left = true, bg = bgs[bg]&lt;br /&gt;
						}))&lt;br /&gt;
					:newline()&lt;br /&gt;
				bg = (bg == 2 and 1 or 2)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		local updateWarning = mw.html.create('')&lt;br /&gt;
		if coreData.now_timestamp - coreData.edit_timestamp &amp;lt; 2*60*60 then&lt;br /&gt;
			local mbox = require('Module:Message box')&lt;br /&gt;
			updateWarning:wikitext(mbox.main('ombox', { type='content', text = 'Note: You updated the class ' .. coreData.edit_time_before .. ' ago. Did you write your [[#Page contents|config file]] new? ' ..&lt;br /&gt;
						'Changes won\'t take effect unless you do!' .. ((thisUsesCargo and cargoTableCreateLink) and '&amp;lt;p&amp;gt;&amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;Also: If you changed your cargo table\'s declaration, [' .. &lt;br /&gt;
						coreData.page.template.editlink .. ' edit your template] and [[#Page autocreation|rebuild your cargo table]]!&amp;lt;/span&amp;gt;' or '')}))&lt;br /&gt;
				:newline()&lt;br /&gt;
		end&lt;br /&gt;
		local smwPropertyHint = mw.html.create('')&lt;br /&gt;
		if (FoundationClass.globalConfig.dataStore == 'both' or FoundationClass.globalConfig.dataStore == 'smw')&lt;br /&gt;
				and FoundationClass.myYesno(coreData.global_smwUseStorage)&lt;br /&gt;
				and not coreData.properties.order then&lt;br /&gt;
			local mbox = require('Module:Message box')&lt;br /&gt;
			smwPropertyHint:wikitext(mbox.main('ombox', { type='notice', text = 'Hint: If you use properties in your class, they will not display in &amp;lt;i&amp;gt;Page contents&amp;lt;/i&amp;gt;, nor be listed in &amp;lt;i&amp;gt;Page status&amp;lt;/i&amp;gt; or '&lt;br /&gt;
					.. 'autocreated in &amp;lt;i&amp;gt;Page autocreation&amp;lt;/i&amp;gt; unless you have your class and config page created!'}))&lt;br /&gt;
				:newline()&lt;br /&gt;
		end&lt;br /&gt;
		-- assemble everything&lt;br /&gt;
		local html = mw.html.create('')&lt;br /&gt;
		html:wikitext(coreData.global_description)&lt;br /&gt;
			:newline()&lt;br /&gt;
			:node(updateWarning)&lt;br /&gt;
			:node(smwPropertyHint)&lt;br /&gt;
			:node(manual)&lt;br /&gt;
			:newline()&lt;br /&gt;
			:node(datastore)&lt;br /&gt;
			:wikitext('&amp;lt;h2&amp;gt;Page status&amp;lt;/h2&amp;gt;')&lt;br /&gt;
			:newline()&lt;br /&gt;
			:wikitext(autoCreation and 'This status may be inaccurate, if you just created pages. In that case, run jobs and clear cache of this page.' or '')&lt;br /&gt;
			:node(statusTable)&lt;br /&gt;
			:newline()&lt;br /&gt;
			:node(pageAutoCreation)&lt;br /&gt;
			:wikitext('&amp;lt;h2&amp;gt;Page contents&amp;lt;/h2&amp;gt;')&lt;br /&gt;
			:newline()&lt;br /&gt;
			:node(pageContent)&lt;br /&gt;
			:newline()&lt;br /&gt;
			:done()&lt;br /&gt;
		local debugLevel = FoundationClass.globalConfig.debugLevel or _CFG.global.debugLevel&lt;br /&gt;
		if debugLevel then&lt;br /&gt;
			html:tag('pre')&lt;br /&gt;
--				:wikitext(FoundationClass.myTableTools.printTable(coreData))&lt;br /&gt;
--				:wikitext(FoundationClass.myTableTools.printTable(thisClass:smwProperty2ParameterTranslationTable()))&lt;br /&gt;
				:wikitext(ClassDebug:printLog(debugLevel))&lt;br /&gt;
				:done()&lt;br /&gt;
		end&lt;br /&gt;
		self:addOutput(html)&lt;br /&gt;
&lt;br /&gt;
		return true&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Classgenerator:myArgumentProcessing(coreData)&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator:myArgumentProcessing(args) to process coreData, from ' .. tostring(self))&lt;br /&gt;
	-- function that performs some individual transformation args --&amp;amp;amp;gt; coreData&lt;br /&gt;
	local _CFG = self.class.myConfiguration&lt;br /&gt;
	local coreData = coreData&lt;br /&gt;
	local lang = mw.language.new('en')&lt;br /&gt;
	coreData.className = lang:ucfirst(mw.text.trim(mw.ustring.gsub(self:getUid(), ':', '')))&lt;br /&gt;
	coreData.edit_timestamp = lang:formatDate('U', coreData.global_edit_timestamp)&lt;br /&gt;
	coreData.now_timestamp = lang:formatDate('U') + 60*60&lt;br /&gt;
	coreData.edit_time_before = lang:formatDuration(coreData.now_timestamp-coreData.edit_timestamp)&lt;br /&gt;
	coreData.last_edited = lang:formatDate('d.m.Y H:i:s', coreData.global_edit_timestamp)&lt;br /&gt;
	if coreData.global_gardeningCategory_chooser and mw.ustring.lower(coreData.global_gardeningCategory_chooser) == 'global' then&lt;br /&gt;
		coreData.global_gardeningCategory = 'superglobal.gardeningCategory'&lt;br /&gt;
	end&lt;br /&gt;
	if mw.ustring.find(coreData.className, ' ', 1, true) then&lt;br /&gt;
		local tmp = ''&lt;br /&gt;
		for fragment in mw.text.gsplit(coreData.className, ' ', true) do&lt;br /&gt;
			tmp = tmp .. lang:ucfirst(fragment)&lt;br /&gt;
		end&lt;br /&gt;
		coreData.className = tmp&lt;br /&gt;
	end&lt;br /&gt;
	if coreData.global_cargoTable then&lt;br /&gt;
		coreData.global_cargoTable = mw.ustring.gsub(mw.ustring.lower(coreData.global_cargoTable), ' ', '_')&lt;br /&gt;
	end&lt;br /&gt;
	if coreData.form_createInfotext and #coreData.form_createInfotext &amp;gt; 0 and mw.ustring.sub(coreData.form_createInfotext, -1) ~= ' ' then&lt;br /&gt;
		coreData.form_createInfotext = coreData.form_createInfotext .. ' '&lt;br /&gt;
	end&lt;br /&gt;
	local parameter_parameter&lt;br /&gt;
	local fieldOrder&lt;br /&gt;
	if coreData.parameter_parameter then&lt;br /&gt;
		parameters = ''&lt;br /&gt;
		fieldOrder = {}&lt;br /&gt;
		local classGenParamConfig = mw.loadData('Module:Classgenerator/parameter/config')&lt;br /&gt;
		for result in mw.text.gsplit(coreData.parameter_parameter, classGenParamConfig.template.delimiterResult, true) do&lt;br /&gt;
			local fieldname, parameter = mw.ustring.match(result, '^([^#]*)' .. classGenParamConfig.template.delimiterFormFieldName .. '(.+)$')&lt;br /&gt;
			if fieldname and mw.ustring.len(mw.text.trim(fieldname)) &amp;gt; 0 then&lt;br /&gt;
				table.insert(fieldOrder, mw.text.trim(fieldname))&lt;br /&gt;
			end&lt;br /&gt;
			if parameter and mw.ustring.len(parameter) &amp;gt; 0 then&lt;br /&gt;
				parameters = parameters .. parameter&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	coreData.parameter_parameter = parameters&lt;br /&gt;
	coreData.form_enable = FoundationClass.myYesno(coreData.form_enable)&lt;br /&gt;
	if coreData.form_enable then&lt;br /&gt;
		coreData.form_fieldOrder = fieldOrder&lt;br /&gt;
		form_buttons = { 'save' }&lt;br /&gt;
		if coreData.form_buttons and #coreData.form_buttons &amp;gt; 0 then&lt;br /&gt;
			for _, button in pairs(coreData.form_buttons) do&lt;br /&gt;
				table.insert(form_buttons, button)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		table.insert(form_buttons, 'cancel')&lt;br /&gt;
	end&lt;br /&gt;
	coreData.form_buttons = form_buttons&lt;br /&gt;
	-- here build the class config&lt;br /&gt;
	local contentClassConfig = mw.ustring.gsub(_CFG.template.configIntro, _CFG.template.placeHolderClassName, coreData.className) ..&lt;br /&gt;
		'local global = {\n' ..&lt;br /&gt;
		'\tdebugLevel = false,'&lt;br /&gt;
	if self.class.myConfiguration.template.addCommentsToConfig then&lt;br /&gt;
		contentClassConfig = contentClassConfig .. '\t-- set this to the level you wish to display at render. false if disabled. this is a class based setting. ' ..&lt;br /&gt;
			'you can set this globally at Foundationclass/globalconfig, causing all child classes to debug.'&lt;br /&gt;
	end&lt;br /&gt;
	contentClassConfig = contentClassConfig .. '\n'&lt;br /&gt;
	-- calculate the fieldlists:&lt;br /&gt;
	local fieldlists = {}&lt;br /&gt;
	for _, field in pairs(_CFG.form.fieldOrder) do&lt;br /&gt;
		local tab = mw.ustring.match(field, '^([a-z]+)_.+')&lt;br /&gt;
		if not fieldlists[tab] then&lt;br /&gt;
			fieldlists[tab] = {}&lt;br /&gt;
		end&lt;br /&gt;
		table.insert(fieldlists[tab], field)&lt;br /&gt;
	end&lt;br /&gt;
	local omissionList = {'global_autocreate_module', 'global_autocreate_template', 'global_autocreate_form', 'global_autocreate_category', 'global_autocreate_property', 'global_edit_timestamp', 'global_gardeningCategory_chooser',&lt;br /&gt;
		'form_textareaAttributes_cols', 'form_textareaAttributes_rows', 'form_textareaAttributes_autogrow', 'form_textareaAttributes_editor', 'form_createLinkInfo', &lt;br /&gt;
		'global_customization', 'form_customization', 'template_customization' }&lt;br /&gt;
	for _, attr in pairs(fieldlists.global) do&lt;br /&gt;
		if not Classgenerator.myTableTools.inTable(omissionList, attr) and self.class.myConfiguration.parameter[attr] then&lt;br /&gt;
			contentClassConfig = contentClassConfig .. _processAttribute(self, attr, '\t')&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if coreData.global_customization then&lt;br /&gt;
		for line in mw.text.gsplit(coreData.global_customization, '\n', true) do&lt;br /&gt;
			contentClassConfig = contentClassConfig .. '\t' .. line .. '\n'&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	contentClassConfig = contentClassConfig .. '}\n\nlocal form = {\n'&lt;br /&gt;
	for _, attr in pairs(fieldlists.form) do&lt;br /&gt;
		if not Classgenerator.myTableTools.inTable(omissionList, attr) and self.class.myConfiguration.parameter[attr] then&lt;br /&gt;
			contentClassConfig = contentClassConfig .. _processAttribute(self, attr, '\t')&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	contentClassConfig = contentClassConfig .. '\ttextareaAttributes = {	-- the defaults for your textarea fields\n'&lt;br /&gt;
	for _, attr in pairs({'form_textareaAttributes_cols', 'form_textareaAttributes_rows', 'form_textareaAttributes_autogrow', 'form_textareaAttributes_editor'}) do&lt;br /&gt;
		local name = mw.ustring.match(attr, '^form_textareaAttributes_(.+)$')&lt;br /&gt;
		contentClassConfig = contentClassConfig .. _processAttribute(self, attr, '\t\t', name)&lt;br /&gt;
	end&lt;br /&gt;
	contentClassConfig = contentClassConfig .. '\t},\n'&lt;br /&gt;
	contentClassConfig = contentClassConfig .. _processAttribute(self, 'form_fieldOrder', '\t')&lt;br /&gt;
	if coreData.form_customization then&lt;br /&gt;
		for line in mw.text.gsplit(coreData.form_customization, '\n', true) do&lt;br /&gt;
			contentClassConfig = contentClassConfig .. '\t' .. line .. '\n'&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	contentClassConfig = contentClassConfig .. '}\n\nlocal template = {\n'&lt;br /&gt;
	for _, attr in pairs(fieldlists.template) do&lt;br /&gt;
		if not Classgenerator.myTableTools.inTable(omissionList, attr) and self.class.myConfiguration.parameter[attr] then&lt;br /&gt;
			contentClassConfig = contentClassConfig .. _processAttribute(self, attr, '\t')&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if coreData.template_customization then&lt;br /&gt;
		for line in mw.text.gsplit(coreData.template_customization, '\n', true) do&lt;br /&gt;
			contentClassConfig = contentClassConfig .. '\t' .. mw.text.trim(line) .. '\n'&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	contentClassConfig = contentClassConfig .. '}\n\nlocal parameter = {\n' .. coreData.parameter_parameter .. '}\n\n' ..&lt;br /&gt;
		'return {\n' ..&lt;br /&gt;
		'\tform = form,\n' ..&lt;br /&gt;
		'\tglobal = global,\n' ..&lt;br /&gt;
		'\tparameter = parameter,\n' ..&lt;br /&gt;
		'\ttemplate = template,\n}\n'&lt;br /&gt;
	local classCategory = Classgenerator.globalConfig.classCategory or 'none'&lt;br /&gt;
	local formCategory = Classgenerator.globalConfig.formCategory or 'none'&lt;br /&gt;
	local gardeningCategory = Classgenerator.globalConfig.gardeningSuperCategory or 'none'&lt;br /&gt;
	local moduleCategory = Classgenerator.globalConfig.moduleCategory or 'none'&lt;br /&gt;
	local propertyCategory = Classgenerator.globalConfig.propertyCategory or 'none'&lt;br /&gt;
	local superCategory = Classgenerator.globalConfig.projectSuperCategory or 'none'&lt;br /&gt;
	local templateCategory = Classgenerator.globalConfig.templateCategory or 'none'&lt;br /&gt;
	local page = {}&lt;br /&gt;
	page.order = {'base', 'baseDoc', 'class', 'classDoc', 'config', 'configDoc', 'template', 'templateDoc'}&lt;br /&gt;
	page.base = {&lt;br /&gt;
		name = 'Module:' .. _private[self].pagename,&lt;br /&gt;
		content = mw.message.new('classengine-template-module-page'):rawParams(_private[self].pagename):plain()&lt;br /&gt;
	}&lt;br /&gt;
	page.baseDoc = {&lt;br /&gt;
		name = 'Module:' .. _private[self].pagename .. '/doc',&lt;br /&gt;
		content = mw.message.new('classengine-template-module-documentation-page'):rawParams(_private[self].pagename, moduleCategory):plain()&lt;br /&gt;
	}&lt;br /&gt;
	page.class = {&lt;br /&gt;
		name = 'Module:' .. _private[self].pagename .. '/class',&lt;br /&gt;
		content = mw.message.new('classengine-template-module-class-page'):rawParams(_private[self].pagename, coreData.className):plain()&lt;br /&gt;
	}&lt;br /&gt;
	page.classDoc = {&lt;br /&gt;
		name = 'Module:' .. _private[self].pagename .. '/class/doc',&lt;br /&gt;
		content = mw.message.new('classengine-template-module-class-documentation-page'):rawParams(_private[self].pagename, coreData.className, moduleCategory, classCategory):plain()&lt;br /&gt;
	}&lt;br /&gt;
	page.config = {&lt;br /&gt;
		name = 'Module:' .. _private[self].pagename .. '/config',&lt;br /&gt;
		content = contentClassConfig,&lt;br /&gt;
	}&lt;br /&gt;
	page.configDoc = {&lt;br /&gt;
		name = 'Module:' .. _private[self].pagename .. '/config/doc',&lt;br /&gt;
		content = mw.message.new('classengine-template-module-config-documentation-page'):rawParams(_private[self].pagename, moduleCategory, classCategory):plain()&lt;br /&gt;
	}&lt;br /&gt;
	page.template = {&lt;br /&gt;
		name = 'Template:' .. coreData.template_name,&lt;br /&gt;
		content = mw.message.new('classengine-template-template-page'):rawParams(_private[self].pagename):plain()&lt;br /&gt;
	}&lt;br /&gt;
	page.templateDoc = {&lt;br /&gt;
		name = 'Template:' .. coreData.template_name .. '/doc',&lt;br /&gt;
		content = mw.message.new('classengine-template-template-documentation-page'):rawParams(_private[self].pagename, templateCategory):plain()&lt;br /&gt;
	}&lt;br /&gt;
	if coreData.form_name and #coreData.form_name &amp;gt; 0 then&lt;br /&gt;
		table.insert(page.order, 'form')&lt;br /&gt;
		page.form = {&lt;br /&gt;
			name = 'Form:' .. coreData.form_name,&lt;br /&gt;
			content = mw.message.new('classengine-template-form-page'):rawParams(_private[self].pagename, formCategory):plain()&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
	if coreData.global_category and #coreData.global_category&amp;gt; 0 then&lt;br /&gt;
		table.insert(page.order, 'category')&lt;br /&gt;
		page.category = {&lt;br /&gt;
			name = 'Category:' .. coreData.global_category,&lt;br /&gt;
			content = mw.message.new('classengine-template-category-page'):rawParams(_private[self].pagename, superCategory):plain()&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
	if coreData.global_gardeningCategory and #coreData.global_gardeningCategory &amp;gt; 0 then&lt;br /&gt;
		table.insert(page.order, 'gardeningCategory')&lt;br /&gt;
		local pagename = coreData.global_gardeningCategory&lt;br /&gt;
		if pagename == 'superglobal.gardeningCategory' then&lt;br /&gt;
			pagename = FoundationClass.globalConfig.gardeningCategory&lt;br /&gt;
		end&lt;br /&gt;
		page.gardeningCategory = {&lt;br /&gt;
			name = 'Category:' .. pagename,&lt;br /&gt;
			content = mw.message.new('classengine-template-gardeningcategory-page'):rawParams(_private[self].pagename, gardeningCategory):plain()&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
	for _, pid in pairs(page.order) do&lt;br /&gt;
		local obj = mw.title.new(page[pid].name)&lt;br /&gt;
		page[pid].exists = obj.exists&lt;br /&gt;
		page[pid].namespace = obj.namespace&lt;br /&gt;
		page[pid].editlink = obj:fullUrl{action='edit'}&lt;br /&gt;
		if pid == 'template' then&lt;br /&gt;
			page[pid].recreatedata = obj:fullUrl{action='recreatedata'}&lt;br /&gt;
		end&lt;br /&gt;
		page[pid].isDocPage = (mw.ustring.sub(page[pid].name, -4) == '/doc')&lt;br /&gt;
		if page[pid].isDocPage then&lt;br /&gt;
			page[pid].content = page[pid].content .. '&amp;lt;h2&amp;gt;Maintenanace notes&amp;lt;/h2&amp;gt;\n' ..&lt;br /&gt;
				'This page was created by [[Module:Classgenerator]] and belongs to [[' .. self:getUid() .. ']].\n'&lt;br /&gt;
			if pid == 'configDoc' then&lt;br /&gt;
				page[pid].content = page[pid].content .. '\n{{((}}ombox| type=content | text = It is strongly advised, to not edit this page but to use [' ..&lt;br /&gt;
				'https://{{((}}SERVERNAME{{))}}{{((}}SCRIPTPATH{{))}}/Special:FormEdit/Classgenerator/' .. mw.uri.encode(self:getUid(), &amp;quot;PATH&amp;quot;) .. ' ' .. &lt;br /&gt;
					'the Classgenerator form] instead! After that, use your new configuration to replace the contents of this page.{{))}}'&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	local thisClass&lt;br /&gt;
	local thisConfig&lt;br /&gt;
	if page.class.exists and page.config.exists then&lt;br /&gt;
		thisClass = require(page.class.name)&lt;br /&gt;
		thisConfig = require(page.config.name)&lt;br /&gt;
	end&lt;br /&gt;
	if page.form and (not coreData.form_typeCreateLink or coreData.form_typeCreateLink ~= 'forminput') and coreData.form_createLinkPageName and mw.ustring.len(coreData.form_createLinkPageName) &amp;gt; 0 then&lt;br /&gt;
		local pageName = coreData.form_createLinkPageName&lt;br /&gt;
		if coreData.global_namespace and mw.ustring.len(coreData.global_namespace) &amp;gt; 0 and not mw.ustring.match(pageName, '^' .. coreData.global_namespace .. ':.+$') then&lt;br /&gt;
			pageName = coreData.global_namespace .. ':' .. pageName&lt;br /&gt;
		end&lt;br /&gt;
		local infostr = '{{((}}{info|page name=' .. pageName .. '|add title=' .. (coreData.form_labelCreate or 'create entity') .. '|edit title=' .. (coreData.form_labelEdit or 'edit entity') .. '}{{))}}'&lt;br /&gt;
		page.form.content = page.form.content .. '&amp;lt;!{{#invoke:String|rep|-|2}} this is a workaround, needed because of a SF bug: ' .. infostr ..&lt;br /&gt;
			'. see https://phabricator.wikimedia.org/T123230 for more information {{#invoke:String|rep|-|2}}&amp;gt;'&lt;br /&gt;
	end&lt;br /&gt;
	coreData.page = page&lt;br /&gt;
	local autocreate = {}&lt;br /&gt;
	autocreate.module = FoundationClass.myYesno(coreData.global_autocreate_module, tonumber(coreData.global_autocreate_module))&lt;br /&gt;
	autocreate.template = FoundationClass.myYesno(coreData.global_autocreate_template, tonumber(coreData.global_autocreate_template))&lt;br /&gt;
	autocreate.form = coreData.form_name and FoundationClass.myYesno(coreData.global_autocreate_form, tonumber(coreData.global_autocreate_form))&lt;br /&gt;
	autocreate.category = (coreData.global_category or coreData.global_gardeningCategory) and FoundationClass.myYesno(coreData.global_autocreate_category, tonumber(coreData.global_autocreate_category))&lt;br /&gt;
	if (FoundationClass.globalConfig.dataStore == 'both' or FoundationClass.globalConfig.dataStore == 'smw') and FoundationClass.myYesno(coreData.global_smwUseStorage) then&lt;br /&gt;
		local propertyNSName = _namespaceName(self, mw.title.new('NUL', 'Property').namespace)&lt;br /&gt;
		autocreate[propertyNSName] = FoundationClass.myYesno(coreData['global_autocreate_' .. propertyNSName], tonumber(coreData['global_autocreate_' .. propertyNSName]))&lt;br /&gt;
	end&lt;br /&gt;
	coreData.autocreate = autocreate&lt;br /&gt;
	local propertyData&lt;br /&gt;
	local propertyOrder&lt;br /&gt;
	if (FoundationClass.globalConfig.dataStore == 'both' or FoundationClass.globalConfig.dataStore == 'smw') and FoundationClass.myYesno(coreData.global_smwUseStorage) and thisClass and thisConfig then&lt;br /&gt;
		-- we use smw and class and config are created and accessible. we can get property information and prepare data&lt;br /&gt;
		local matrix = thisClass:smwGetProperty2ParameterTranslationTable()&lt;br /&gt;
		propertyData = {}&lt;br /&gt;
		propertyOrder = {}&lt;br /&gt;
		for property, parameter in pairs(matrix) do&lt;br /&gt;
			table.insert(propertyOrder, property)&lt;br /&gt;
			local obj = mw.title.new(property, 'Property')&lt;br /&gt;
			propertyData[property] = { &lt;br /&gt;
				editlink = obj:fullUrl{action='edit'},&lt;br /&gt;
				exists = obj.exists,&lt;br /&gt;
				parameter = parameter,&lt;br /&gt;
			}&lt;br /&gt;
			if thisConfig.parameter[parameter] then&lt;br /&gt;
				propertyData[property].description = thisConfig.parameter[parameter].description&lt;br /&gt;
				propertyData[property].type = thisConfig.parameter[parameter].property_type&lt;br /&gt;
				propertyData[property].values = thisConfig.parameter[parameter].values&lt;br /&gt;
			elseif parameter == FoundationClass.globalConfig.smwClassProperty then&lt;br /&gt;
				propertyData[property].description = 'Automatisch hinzugefügt! Wird verwendet, um Mitglieder dieser Klasse zu finden (funktioniert auch, ohne dass eine Kategorie definiert wird und auch fur subobjects)'&lt;br /&gt;
				propertyData[property].type = 'Text'&lt;br /&gt;
			elseif parameter == FoundationClass.globalConfig.uidFieldName then&lt;br /&gt;
				propertyData[property].description = 'Automatisch hinzugefügt! Wird verwendet, um individuelle Objekte innerhalb der Klasse zu identifizieren.'&lt;br /&gt;
				propertyData[property].type = 'Text'&lt;br /&gt;
			end&lt;br /&gt;
			local values = ''&lt;br /&gt;
			if propertyData[property].values then&lt;br /&gt;
				values = values .. 'The allowed values are:'&lt;br /&gt;
				for _, value in pairs(propertyData[property].values) do&lt;br /&gt;
					values = values .. '\n* [[Allows value::' .. value .. ']]'&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				values = 'No restriction given'&lt;br /&gt;
			end&lt;br /&gt;
			propertyData[property].content = mw.message.new('classengine-template-property-page'):rawParams(propertyData[property].description, propertyData[property].type, values, _private[self].pagename, propertyCategory):plain()&lt;br /&gt;
		end&lt;br /&gt;
		table.sort(propertyOrder)&lt;br /&gt;
	end&lt;br /&gt;
	coreData.properties = { data = propertyData, order = propertyOrder }&lt;br /&gt;
	return coreData	-- this is your new coreData.&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Classgenerator:myPlausibilityTest(args)&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator:myPlausibilityTest(args) to test arguments, from ' .. tostring(self))&lt;br /&gt;
	-- function that performs the individual plausibility tests&lt;br /&gt;
	-- note: before you access a field args.fieldname you should check for existance&lt;br /&gt;
	-- self:addError(text)&lt;br /&gt;
	return false	-- return value will be ignored. but if you add any error, the object's initialization will fail with the error&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Classgenerator:myStashAdjustments(stash)&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator:myStashAdjustments(stash) to do some minor adjustments on data before storing, from ' .. tostring(self))&lt;br /&gt;
	-- function that alters the stash before storing the data&lt;br /&gt;
	local stash = stash&lt;br /&gt;
	return stash	-- this is your new stash. this will be stored. it has format (fieldname: value)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Classgenerator:method()&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator:method() to do something, from ' .. tostring(self))&lt;br /&gt;
	return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return Classgenerator&lt;/div&gt;</summary>
		<author><name>Anatol</name></author>
	</entry>
	<entry>
		<id>https://camnet.oetterer.eu/index.php?title=MediaWiki:Classengine-template-property-page&amp;diff=1035</id>
		<title>MediaWiki:Classengine-template-property-page</title>
		<link rel="alternate" type="text/html" href="https://camnet.oetterer.eu/index.php?title=MediaWiki:Classengine-template-property-page&amp;diff=1035"/>
		<updated>2016-02-10T12:17:44Z</updated>

		<summary type="html">&lt;p&gt;Anatol: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Description==&lt;br /&gt;
&amp;lt;div class=&amp;quot;description-box&amp;quot;&amp;gt;$1&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Type==&lt;br /&gt;
* This is an attribute of the datatype [[Has type::$2]].&lt;br /&gt;
&lt;br /&gt;
==Allowed values==&lt;br /&gt;
$3&lt;br /&gt;
&lt;br /&gt;
{{((}}#invoke:$4|categorize{{))}}&lt;br /&gt;
&amp;lt;!{{#invoke:String|rep|-|2}} Note: The class engine sets category &amp;quot;$5&amp;quot; automatically in function categorize {{#invoke:String|rep|-|2}}&amp;gt;&lt;/div&gt;</summary>
		<author><name>Anatol</name></author>
	</entry>
	<entry>
		<id>https://camnet.oetterer.eu/index.php?title=Modul:Foundationclass/globalconfig&amp;diff=1034</id>
		<title>Modul:Foundationclass/globalconfig</title>
		<link rel="alternate" type="text/html" href="https://camnet.oetterer.eu/index.php?title=Modul:Foundationclass/globalconfig&amp;diff=1034"/>
		<updated>2016-02-10T12:12:47Z</updated>

		<summary type="html">&lt;p&gt;Anatol: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--[==[ if you start off, please fill the entries and create the appropriate categories&lt;br /&gt;
		--  formCategory (e.g. 'Project forms')&lt;br /&gt;
		--	gardeningSuperCategory (e.g. 'Erroneous objects') (this is a global category. you can define an individual one for each class)&lt;br /&gt;
        --  moduleCategory (e.g. 'Project modules')&lt;br /&gt;
		--  projectSuperCategory (e.g. 'Project category')&lt;br /&gt;
		--	propertyCategory, if you use datastore smw (e.g. 'Project properties')&lt;br /&gt;
		--  templateCategory (e.g. 'Project templates')&lt;br /&gt;
	-- also, remember to choose your prefered storage method. atm supported are: 'cargo', 'smw',  or 'both'&lt;br /&gt;
	-- when using datastore 'smw' uncomment all smwSpecialProperties that are active in your installation (and create the properties for smwClassProperty and uidFieldName)&lt;br /&gt;
	-- HINT: When you use the classgenerator form and its autocreation feature, it creates all your categories defined here as well. to modify their content, please refer to [[Module:Classgenerator/class]]'s documentation page&lt;br /&gt;
--]==]&lt;br /&gt;
local superglobal = {&lt;br /&gt;
	cargoSpecialFields = {},	-- filled further down below&lt;br /&gt;
	cargoTypesElegibleForSize = {'text', 'string', 'wikitext', 'url'},&lt;br /&gt;
	cargoTypesElegibleForValue = {'text', 'integer', 'string', 'url'},&lt;br /&gt;
	classCategory = 'Lua class modules',	-- this is the category, all classes based on this engine are put automatically&lt;br /&gt;
	dataStore = 'smw',	-- supported types are 'cargo', 'smw', and 'both'&lt;br /&gt;
	debugLevel = false, -- set this to the level you wish to display at render. false if disabled. this is a global setting, causing all children to debug. you can set this individually at any class&lt;br /&gt;
	formCategory = 'CamNet forms',	-- the category of the form pages&lt;br /&gt;
	formTableClass = 'formtable',&lt;br /&gt;
	gardeningSuperCategory = 'Project entities with erroneous input',&lt;br /&gt;
	moduleCategory = 'CamNet modules',&lt;br /&gt;
	moduleUseRatingTemplate = true,&lt;br /&gt;
	projectSuperCategory = 'CamNet',	-- The category, all the categories are placed in.'&lt;br /&gt;
	propertyCategory = 'CamNet properties',	-- category for all the properties pages - if data store smw is used&lt;br /&gt;
	restrictionRole = 'sysop',	-- if you wish to set fields to a default restriction role, name it here&lt;br /&gt;
	selectedCheckboxSubmitValue = 'Ja',	-- (const) this is the value, a semantic forms checkbox submits when selected. used for plausibilityTest only&lt;br /&gt;
	smwClassProperty = 'is_member_of_class',	-- the name of the property, members of the class will be identified by; you have to create the property page, though&lt;br /&gt;
	smwPropertyTypesAvailable = { 'Annotation URI', 'Boolean', 'Code', 'Date', 'Email', 'Geographic coordinate', 'Number', 'Page', 'Quantity', 'Record', 'Telephone number', 'Temperature', 'Text', 'URL' },&lt;br /&gt;
		-- if you have more types of properties (due to an extension), add them here). in fact, Foundationclass does use this, but classgenerator/parameter makes a reference&lt;br /&gt;
	smwSpecialProperties = {},	-- filled further down below&lt;br /&gt;
	templateCategory = 'CamNet templates',	-- the category for the templates&lt;br /&gt;
	templateUseDocumentationSubsystem = true,&lt;br /&gt;
	uidFieldName = 'classengine_identifies_this_by',	-- the name of the property/table fields, the individual object will be identified by (in cargo and smw respectively);&lt;br /&gt;
						-- if you use smw, you have to create the property page manually&lt;br /&gt;
						-- WARNING: If you reset this after beginning operation, you have to rebuild all cargo data tables, and/or create the new property and refresh all properties&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
superglobal.cargoSpecialFields = {&lt;br /&gt;
	_ID = 'Integer, &amp;lt;small&amp;gt;holds a unique ID for this row&amp;lt;/small&amp;gt;',&lt;br /&gt;
	_pageName = 'Text, &amp;lt;small&amp;gt;holds the name of the page from which this row of values was stored&amp;lt;/small&amp;gt;',&lt;br /&gt;
	_pageTitle = 'Text, &amp;lt;small&amp;gt;similar to _pageName, but leaves out the namespace, if there is one&amp;lt;/small&amp;gt;',&lt;br /&gt;
	_pageNamespace = 'Integer, &amp;lt;small&amp;gt;holds the numerical ID of the namespace of the page from which this row of values was stored&amp;lt;/small&amp;gt;',&lt;br /&gt;
	_pageID = 'Integer, &amp;lt;small&amp;gt;holds the internal MediaWiki ID for that page&amp;lt;/small&amp;gt;',&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
superglobal.smwSpecialProperties = {&lt;br /&gt;
	-- by default, only _MDAT is active. see https://www.semantic-mediawiki.org/wiki/Help:$smwgPageSpecialProperties for documentation&lt;br /&gt;
	-- please uncomment all special properties that apply to your installation&lt;br /&gt;
	Creation_date = 'Date, &amp;lt;small&amp;gt;Erstelldatum der Seite.&amp;lt;/small&amp;gt; (Alias _CDAT)',&lt;br /&gt;
	Is_a_new_page = 'Boolean, &amp;lt;small&amp;gt;Ist die Seite neu? Gibt es nur eine einzige Revision?&amp;lt;/small&amp;gt; (Alias _NEWP)',&lt;br /&gt;
	Last_editor_is = 'Page, &amp;lt;small&amp;gt;Benutzername des letzten Bearbeiters.&amp;lt;/small&amp;gt; (Alias _LEDT)',&lt;br /&gt;
	--Media_type = 'Text, &amp;lt;small&amp;gt;Speichert den Medientyp einer hochgeladenen Datei.&amp;lt;/small&amp;gt; (Alias _MEDIA)',&lt;br /&gt;
	--MIME_type = 'Text, &amp;lt;small&amp;gt;Speichert den MIME Typ einer hochgeladenen Datei.&amp;lt;/small&amp;gt; (Alias _MIME)',&lt;br /&gt;
	Modification_date = 'Date, &amp;lt;small&amp;gt;Datum der letzten Bearbeitung der Seite.&amp;lt;/small&amp;gt; (Alias _MDAT)',&lt;br /&gt;
&lt;br /&gt;
	-- from Extension: Extra Special Properties&lt;br /&gt;
	Seitenersteller = 'Page, &amp;lt;small&amp;gt;Erstellerbenutzer&amp;lt;/small&amp;gt;',&lt;br /&gt;
	Seitenbearbeiter = 'List of Pages, &amp;lt;small&amp;gt;Liste der Benutzer, die an der Seite mitgewirkt haben.&amp;lt;/small&amp;gt;',&lt;br /&gt;
	--EXIFDATA = 'Text, &amp;lt;small&amp;gt;Exif Daten einer Datei (Nur im Namensraum &amp;quot;Datei&amp;quot; gesetzt)&amp;lt;/small&amp;gt;',&lt;br /&gt;
	--PAGEID = 'Number, &amp;lt;small&amp;gt;ID der Seite&amp;lt;/small&amp;gt;',&lt;br /&gt;
	Bearbeitungskennung = 'Number, &amp;lt;small&amp;gt;ID der aktuellen Revision&amp;lt;/small&amp;gt;',&lt;br /&gt;
	--NREV = 'Number, &amp;lt;small&amp;gt;Geschätzte Anzahl der Revisionen.&amp;lt;/small&amp;gt;',&lt;br /&gt;
	--NTREV = 'Number, &amp;lt;small&amp;gt;Geschätzte Anzahl der Revisionen der Diskussionsseite.&amp;lt;/small&amp;gt;',&lt;br /&gt;
	--SHORTURL = 'Text, &amp;lt;small&amp;gt;KurzURL der Seite (Nur bei Verwendung der Extension:ShortUrl verfügbar)&amp;lt;/small&amp;gt;',&lt;br /&gt;
	Unterseite = 'List of Pages, &amp;lt;small&amp;gt;Liste der Unterseiten&amp;lt;/small&amp;gt;',&lt;br /&gt;
	--USERREG = 'Date, &amp;lt;small&amp;gt;Datum der Registrierung eines Benutzers (Nur im Namensraum &amp;quot;Benutzer&amp;quot; gesetzt)&amp;lt;/small&amp;gt;',&lt;br /&gt;
	--VIEWS = 'Number, &amp;lt;small&amp;gt;Geschätzte Anzahl der Seitenaufrufe (Achtung: Aufgrund von Caching kann die tatsächliche Zahl stark abweichen).&amp;lt;/small&amp;gt;',&lt;br /&gt;
	--CUSER = 'Page, &amp;lt;small&amp;gt;Erstellerbenutzer&amp;lt;/small&amp;gt;',&lt;br /&gt;
	--EUSER = 'List of Pages, &amp;lt;small&amp;gt;Liste der Benutzer, die an der Seite mitgewirkt haben.&amp;lt;/small&amp;gt;',&lt;br /&gt;
	--EXIFDATA = 'Text, &amp;lt;small&amp;gt;Exif Daten einer Datei (Nur im Namensraum &amp;quot;Datei&amp;quot; gesetzt)&amp;lt;/small&amp;gt;',&lt;br /&gt;
	--PAGEID = 'Number, &amp;lt;small&amp;gt;ID der Seite&amp;lt;/small&amp;gt;',&lt;br /&gt;
	--REVID = 'Number, &amp;lt;small&amp;gt;ID der aktuellen Revision&amp;lt;/small&amp;gt;',&lt;br /&gt;
	--NREV = 'Number, &amp;lt;small&amp;gt;Geschätzte Anzahl der Revisionen.&amp;lt;/small&amp;gt;',&lt;br /&gt;
	--NTREV = 'Number, &amp;lt;small&amp;gt;Geschätzte Anzahl der Revisionen der Diskussionsseite.&amp;lt;/small&amp;gt;',&lt;br /&gt;
	--SHORTURL = 'Text, &amp;lt;small&amp;gt;KurzURL der Seite (Nur bei Verwendung der Extension:ShortUrl verfügbar)&amp;lt;/small&amp;gt;',&lt;br /&gt;
	--SUBP = 'List of Pages, &amp;lt;small&amp;gt;Liste der Unterseiten&amp;lt;/small&amp;gt;',&lt;br /&gt;
	--USERREG = 'Date, &amp;lt;small&amp;gt;Datum der Registrierung eines Benutzers (Nur im Namensraum &amp;quot;Benutzer&amp;quot; gesetzt)&amp;lt;/small&amp;gt;',&lt;br /&gt;
	--VIEWS = 'Number, &amp;lt;small&amp;gt;Geschätzte Anzahl der Seitenaufrufe (Achtung: Aufgrund von Caching kann die tatsächliche Zahl stark abweichen).&amp;lt;/small&amp;gt;',&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
return superglobal&lt;/div&gt;</summary>
		<author><name>Anatol</name></author>
	</entry>
	<entry>
		<id>https://camnet.oetterer.eu/index.php?title=Modul:Classgenerator/class&amp;diff=1031</id>
		<title>Modul:Classgenerator/class</title>
		<link rel="alternate" type="text/html" href="https://camnet.oetterer.eu/index.php?title=Modul:Classgenerator/class&amp;diff=1031"/>
		<updated>2016-02-10T11:56:09Z</updated>

		<summary type="html">&lt;p&gt;Anatol: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local FoundationClass = require('Module:Foundationclass')&lt;br /&gt;
local ClassDebug = require('Module:Debug/class')&lt;br /&gt;
&lt;br /&gt;
-- ****************************************************************&lt;br /&gt;
-- *                         inheritance                          *&lt;br /&gt;
-- ****************************************************************&lt;br /&gt;
local Classgenerator = FoundationClass:subclass('Classgenerator')&lt;br /&gt;
-- setting class's configuration data&lt;br /&gt;
Classgenerator.static.myConfiguration = mw.loadData('Module:Classgenerator/config')&lt;br /&gt;
--   being in a static method, use self.myConfiguration&lt;br /&gt;
--   being in a private method, that knows self or in a public method, use self.class.myConfiguration&lt;br /&gt;
&lt;br /&gt;
-- ****************************************************************&lt;br /&gt;
-- *                          properties                          *&lt;br /&gt;
-- ****************************************************************&lt;br /&gt;
&lt;br /&gt;
-- **************** initialization of table for private properties&lt;br /&gt;
local _private = setmetatable({}, {__mode = 'k'})   -- weak table storing all private attributes&lt;br /&gt;
&lt;br /&gt;
-- **************** declaration of public static properties&lt;br /&gt;
-- Classgenerator.static.myPropertyModule = require('Module:extern')&lt;br /&gt;
-- Classgenerator.static.staticProperty = 'value'&lt;br /&gt;
&lt;br /&gt;
-- remember the static classes provided by Foundationclass:&lt;br /&gt;
-- Classgenerator.globalConfig&lt;br /&gt;
-- Classgenerator.myCargoUtil&lt;br /&gt;
-- Classgenerator.myTableTools&lt;br /&gt;
&lt;br /&gt;
-- **************** declaration of (global) private properties&lt;br /&gt;
-- for properties you should rather use constructor and _private[self]. this only, if you need a private class property&lt;br /&gt;
-- you should, however predeclare private methods here&lt;br /&gt;
local _debug	-- private method declared later&lt;br /&gt;
local _privateMethodAhead	-- declaration ahead, so this private method can be used in the constructor and in other private methods&lt;br /&gt;
&lt;br /&gt;
-- ***************************************************************&lt;br /&gt;
-- *                           methods                           *&lt;br /&gt;
-- ***************************************************************&lt;br /&gt;
 &lt;br /&gt;
-- **************** declaration of static methods&lt;br /&gt;
function Classgenerator:initialize(uid)&lt;br /&gt;
	local _CFG = self.class.myConfiguration&lt;br /&gt;
	FoundationClass.initialize(self, uid)&lt;br /&gt;
	local page = mw.title.getCurrentTitle().text&lt;br /&gt;
	if uid and mw.ustring.match(uid, '^' .. _CFG.global.namespace .. ':.+$') then&lt;br /&gt;
		page = mw.ustring.match(uid, '^' .. _CFG.global.namespace .. ':(.+)$')&lt;br /&gt;
	end&lt;br /&gt;
	_private[self] = {&lt;br /&gt;
		dbg = ClassDebug:new(tostring(self.class) .. ': id ' .. uid),&lt;br /&gt;
		pagename = page&lt;br /&gt;
	}&lt;br /&gt;
	_debug(self, 1, ' Classgenerator: done initializing object &amp;amp;quot;' .. uid ..'&amp;amp;quot;, from ' .. tostring(self))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- use use self.myConfiguration to access your configuration in a static method&lt;br /&gt;
function Classgenerator.static:aStaticMethod(var)&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator.static:aStaticMethod() to do something, from ' .. tostring(self))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Classgenerator.static:mySfDynamicFieldAttribute(fieldname, attribute, value)&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator.static:mySfDynamicFieldAttribute(fieldname, attribute, value), from ' .. tostring(self))&lt;br /&gt;
	_debug(self, 2, ' with parameters &amp;amp;quot;' .. fieldname .. '&amp;amp;quot;, &amp;amp;quot;' .. attribute .. '&amp;amp;quot; and a ' .. type(value) .. ' value')&lt;br /&gt;
	-- function that can process any attribute/value pair just before rendering the semantic forms field&lt;br /&gt;
	-- usually done, to generate a dynamic 'default' value&lt;br /&gt;
	-- keep in mind: you can completely disable a form field, if you return true on attribute &amp;quot;disable&amp;quot;. note however, that this causes the field to not show at all, no data will be transported/saved&lt;br /&gt;
	local pagename = mw.title.getCurrentTitle().rootText&lt;br /&gt;
	local val = value&lt;br /&gt;
	if Classgenerator.myTableTools.inTable({'template_name', 'global_entityTitle'}, fieldname) and attribute == 'default' then&lt;br /&gt;
		val = pagename&lt;br /&gt;
	end&lt;br /&gt;
	if fieldname == 'global_cargoTable' and attribute == 'default' then&lt;br /&gt;
		val = mw.ustring.lower(pagename)&lt;br /&gt;
	end&lt;br /&gt;
	if Classgenerator.globalConfig.dataStore ~= 'cargo' and Classgenerator.globalConfig.dataStore ~= 'both' then&lt;br /&gt;
		if fieldname == 'global_cargoTable' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
		if fieldname == 'global_cargoUidFieldname' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if Classgenerator.globalConfig.dataStore ~= 'smw' and Classgenerator.globalConfig.dataStore ~= 'both' then&lt;br /&gt;
		if fieldname == 'global_smwIsSubobject' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
		if fieldname == 'global_smwUseStorage' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
		if fieldname == 'global_autocreate_property' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return val	-- this value will be used as new value for field's attribute&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Classgenerator.static:sfGenerateForm()&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator.static:sfGenerateForm(), from ' .. tostring(self))&lt;br /&gt;
	local _CFG = self.myConfiguration&lt;br /&gt;
	local ClassgeneratorParameter  = require('Module:Classgenerator/parameter/class')&lt;br /&gt;
	local ClassSFfield = require('Module:SFfield/class')&lt;br /&gt;
	local tagStart = '{{{'&lt;br /&gt;
	local tagEnd = '}}}'&lt;br /&gt;
	local frame = mw.getCurrentFrame()&lt;br /&gt;
	-- create the form header&lt;br /&gt;
	local notification = mw.html.create('')&lt;br /&gt;
	if _CFG.form.notification and mw.ustring.len(_CFG.form.notification) &amp;gt; 0 then&lt;br /&gt;
		local mbox = require('Module:Message box')&lt;br /&gt;
		notification:wikitext(mbox.main('ombox', { text = _CFG.form.notification }))&lt;br /&gt;
			:newline()&lt;br /&gt;
	end&lt;br /&gt;
	local formheader = mw.html.create('')&lt;br /&gt;
	formheader:wikitext(self:sfGenerateFormInfoTag())&lt;br /&gt;
		:wikitext('&amp;lt;h2&amp;gt;' .. _CFG.global.entityTitle .. '&amp;lt;/h2&amp;gt;')&lt;br /&gt;
		:tag('p')&lt;br /&gt;
			:wikitext(_CFG.form.headerText)&lt;br /&gt;
			:done()&lt;br /&gt;
			:newline()&lt;br /&gt;
		:node(notification)&lt;br /&gt;
		:tag('div')&lt;br /&gt;
			:attr('id', 'wikiPreview')&lt;br /&gt;
			:cssText('display: none; padding-bottom: 25px; margin-bottom: 25px; border-bottom: 1px solid #AAAAAA;')&lt;br /&gt;
			:done()&lt;br /&gt;
			:newline()&lt;br /&gt;
	-- create the form buttons&lt;br /&gt;
	local formbuttons = mw.html.create('div')&lt;br /&gt;
	for _, button in pairs(_CFG.form.buttons) do&lt;br /&gt;
		formbuttons:wikitext(tagStart .. 'standard input&amp;amp;#124;' .. button .. tagEnd)&lt;br /&gt;
	end&lt;br /&gt;
	formbuttons:addClass('formbuttons')&lt;br /&gt;
		:done()&lt;br /&gt;
	-- calculate the fieldlists:&lt;br /&gt;
	local fieldlists = {}&lt;br /&gt;
	for _, field in pairs(_CFG.form.fieldOrder) do&lt;br /&gt;
		local tab = mw.ustring.match(field, '^([a-z]+)_.+')&lt;br /&gt;
		if not fieldlists[tab] then&lt;br /&gt;
			fieldlists[tab] = {}&lt;br /&gt;
		end&lt;br /&gt;
		table.insert(fieldlists[tab], field)&lt;br /&gt;
	end&lt;br /&gt;
	-- assemble everything, so start the html object&lt;br /&gt;
	local html = mw.html.create('div')&lt;br /&gt;
	html:node(formheader)&lt;br /&gt;
		:wikitext('&amp;lt;h1&amp;gt;GLOBAL-Section&amp;lt;/h1&amp;gt;')&lt;br /&gt;
		:newline()&lt;br /&gt;
		:tag('div')&lt;br /&gt;
			:wikitext('This section deals with all the class\'s global data, i.e. all data you need for your &amp;quot;template&amp;quot; part as wenn as for your form, ... ')&lt;br /&gt;
			:done()&lt;br /&gt;
			:newline()&lt;br /&gt;
		:wikitext(tagStart .. 'for template|' .. _CFG.template.name .. '|label=' .. _CFG.global.entityTitle .. tagEnd)&lt;br /&gt;
		:newline()&lt;br /&gt;
		:node(self:sfGenerateFormTable(fieldlists.global))&lt;br /&gt;
		:newline()&lt;br /&gt;
		:wikitext('&amp;lt;h1&amp;gt;FORM-Section&amp;lt;/h1&amp;gt;')&lt;br /&gt;
		:newline()&lt;br /&gt;
		:tag('div')&lt;br /&gt;
			:wikitext('This section deals with all the data, you need to create and operate a form for this class. If you don\'t want a form, disable this section. ' ..&lt;br /&gt;
					'If you need a form (e.g. as part of another form), but no form page, enable this section but leave the field for form page name emtpy.')&lt;br /&gt;
			:done()&lt;br /&gt;
			:newline()&lt;br /&gt;
		:node(self:sfGenerateFormTable(fieldlists.form))&lt;br /&gt;
		:newline()&lt;br /&gt;
		:wikitext('&amp;lt;h1&amp;gt;TEMPLATE-Section&amp;lt;/h1&amp;gt;')&lt;br /&gt;
		:newline()&lt;br /&gt;
		:tag('div')&lt;br /&gt;
			:wikitext('This section deals with all the data, you need to create and operate a template for this class. If you need tempalte specific parameters ' ..&lt;br /&gt;
				'(meaning parameteres that you only need to operate the &amp;quot;action&amp;quot;-part), put them into this section\'s custom field')&lt;br /&gt;
			:done()&lt;br /&gt;
			:newline()&lt;br /&gt;
		:node(self:sfGenerateFormTable(fieldlists.template))&lt;br /&gt;
		:newline()&lt;br /&gt;
		:wikitext('&amp;lt;h1&amp;gt;PARAMETERS-Section&amp;lt;/h1&amp;gt;')&lt;br /&gt;
		:newline()&lt;br /&gt;
		:tag('div')&lt;br /&gt;
			:wikitext('This section deals with all your parameters. You need an entry for every form input field, every template parameter, every data field you want to store, and even every notification line.')&lt;br /&gt;
			:tag('ul')&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(&amp;quot;To produce a normal parameter, add an entry, choose storage type, set '''Regular form parameter''' to yes, choose a form input type, and a template doc type.&amp;quot;)&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(&amp;quot;If you want a data field to be stored in your data storage but not defined in the form, choose a data storage type and set '''Regular form parameter''' to no. &amp;quot;)&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(&amp;quot;If you want a mutiple template to be parsed to a parameter, create a normal parameter (as described above) and choose '''Regular form parameter''' to  be ''Holds template''.&amp;quot;)&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(&amp;quot;A parameter with a form input that is not stored is created like a regular parameter but without setting any data storage type.&amp;quot;)&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(&amp;quot;Finally, you can create a message line. This is useful, if you want to convey any information to the user, that is to important for a description-tooltip. &amp;quot; ..&lt;br /&gt;
						&amp;quot;What you need to do is disable everything ('''Template doc parameter type ''', data storage) and set '''Regular form parameter''' to ''Information''. &amp;quot; ..&lt;br /&gt;
						&amp;quot;You probalby want to add the parameter to one or more ''show on select'' entries, too.&amp;quot;)&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
				:done()&lt;br /&gt;
				:newline()&lt;br /&gt;
			:done()&lt;br /&gt;
			:newline()&lt;br /&gt;
		:node(self:sfInitField('parameter_parameter'):render())&lt;br /&gt;
		:newline()&lt;br /&gt;
		:wikitext(frame:extensionTag('headertabs'))&lt;br /&gt;
		:newline()&lt;br /&gt;
		:wikitext(&amp;quot;'''(*) Pflichtfeld'''&amp;quot;)&lt;br /&gt;
		:newline()&lt;br /&gt;
		:wikitext(tagStart .. 'end template' .. tagEnd)&lt;br /&gt;
		:newline()&lt;br /&gt;
		:wikitext(ClassgeneratorParameter:sfGenerateForm())&lt;br /&gt;
		:newline()&lt;br /&gt;
		:node(formbuttons)&lt;br /&gt;
	local debugLevel = FoundationClass.globalConfig.debugLevel or self.myConfiguration.global.debugLevel&lt;br /&gt;
	if debugLevel then&lt;br /&gt;
		html:newline()&lt;br /&gt;
			:newline()&lt;br /&gt;
			:wikitext(ClassDebug:printLog(debugLevel))&lt;br /&gt;
	end&lt;br /&gt;
	return html&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- **************** declaration of private methods&lt;br /&gt;
-- use self.class.myConfiguration to access your configuration in a public or a private method that is called by a public method&lt;br /&gt;
_debug = function (self, level, text)&lt;br /&gt;
	if _private[self] and _private[self].dbg then&lt;br /&gt;
		local debugLevel = FoundationClass.globalConfig.debugLevel or self.class.myConfiguration.global.debugLevel&lt;br /&gt;
		if debugLevel and level &amp;lt;= debugLevel then&lt;br /&gt;
			_private[self].dbg:log(level, text)&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		local debugLevel = FoundationClass.globalConfig.debugLevel or self.myConfiguration.global.debugLevel&lt;br /&gt;
		if debugLevel and level &amp;lt;= debugLevel then&lt;br /&gt;
			ClassDebug:log(level, text, tostring(self) .. '.static')&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local _namespaceName = function (self, namespaceId)&lt;br /&gt;
	_debug(self, 1, 'entering private _namespaceName() to translate namespace namespaceId ' .. namespaceId .. ' into a universal name, from ' .. tostring(self))&lt;br /&gt;
	local ret, nulProperty = pcall(mw.title.new, 'NUL', 'Property')&lt;br /&gt;
	if ret and (namespaceId == nulProperty.namespace) then&lt;br /&gt;
		return 'property'	-- if you change this, check on other places, this is checked against and change that, too&lt;br /&gt;
	else&lt;br /&gt;
		return mw.site.namespaces[namespaceId].canonicalName&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local _processAttribute = function (self, attr, indent, name)&lt;br /&gt;
	_debug(self, 1, 'entering private _processAttribute() to print a line for attribute ' .. attr .. ', from ' .. tostring(self))&lt;br /&gt;
	local coreData = self:getCoreData()&lt;br /&gt;
	local attr = attr&lt;br /&gt;
	local val = coreData[attr]&lt;br /&gt;
	if type(val) == 'boolean' then&lt;br /&gt;
		val = val and 'true' or 'false'&lt;br /&gt;
	end&lt;br /&gt;
	local ret = ''&lt;br /&gt;
	local fieldname = mw.ustring.match(attr, '^[^_]+_(.+)$')&lt;br /&gt;
	ret = indent .. (name and name or fieldname) .. ' = '&lt;br /&gt;
	if not val then&lt;br /&gt;
		ret = ret .. 'nil'&lt;br /&gt;
	elseif type(val) == 'table' then&lt;br /&gt;
		ret = ret .. Classgenerator.myTableTools.printTable(val, 'inline')&lt;br /&gt;
	elseif val == 'true' or val == 'false' or mw.ustring.match(val, '^[0-9]+$') or (attr == 'global_gardeningCategory' and val == 'superglobal.gardeningCategory') then&lt;br /&gt;
		ret = ret .. val&lt;br /&gt;
	else&lt;br /&gt;
		ret = ret .. &amp;quot;'&amp;quot; .. mw.ustring.gsub(mw.ustring.gsub(mw.ustring.gsub(val, &amp;quot;\\'&amp;quot;, &amp;quot;'&amp;quot;), &amp;quot;'&amp;quot;, &amp;quot;\\'&amp;quot;), '\n', '\\n\' ..\n' .. indent .. '\t\'') .. &amp;quot;'&amp;quot;	-- the gsub catches multiline input from textareas&lt;br /&gt;
	end&lt;br /&gt;
	ret = ret .. ','&lt;br /&gt;
	if self.class.myConfiguration.template.addCommentsToConfig then&lt;br /&gt;
		ret = ret .. '\t-- ' .. self.class.myConfiguration.parameter[attr].description&lt;br /&gt;
	end&lt;br /&gt;
	ret = ret .. '\n'&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local _privateMethod = function (self)&lt;br /&gt;
	_debug(self, 1, 'entering private _privateMethod() to do something, from ' .. tostring(self))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- **************** declaration of public methods&lt;br /&gt;
-- use self.class.myConfiguration to access your configuration in a public method&lt;br /&gt;
function Classgenerator:addInfobox()&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator:addInfobox(), from ' .. tostring(self))&lt;br /&gt;
	if self:goodToGo() then&lt;br /&gt;
		local _CFG = self.class.myConfiguration&lt;br /&gt;
		local coreData = self:getCoreData()&lt;br /&gt;
		local usesSmw = FoundationClass.globalConfig.dataStore and (FoundationClass.globalConfig.dataStore == 'both' or FoundationClass.globalConfig.dataStore == 'smw') and FoundationClass.myYesno(coreData.global_smwUseStorage)&lt;br /&gt;
		local ib_args = {&lt;br /&gt;
			bodyclass = 'infobox_name',&lt;br /&gt;
			aboveclass = 'objtitle titletext',&lt;br /&gt;
			headerclass = 'headertext',&lt;br /&gt;
			labelstyle = 'width: 30%;',&lt;br /&gt;
			datastyle = 'width: 70%;',&lt;br /&gt;
			title = coreData.className,&lt;br /&gt;
			subheader = 'Class',&lt;br /&gt;
			label1 = 'Title',&lt;br /&gt;
			data1 = coreData.global_entityTitle and coreData.global_entityTitle or '',&lt;br /&gt;
			label2 = _CFG.parameter.global_edit_timestamp.label,&lt;br /&gt;
			data2 = coreData.last_edited,&lt;br /&gt;
			label3 = 'Store available',&lt;br /&gt;
			data3 = (FoundationClass.globalConfig.dataStore and mw.ustring.len(FoundationClass.globalConfig.dataStore) &amp;gt; 0) and FoundationClass.globalConfig.dataStore or '',&lt;br /&gt;
			label5 = 'Cargo table',&lt;br /&gt;
			data5 = (FoundationClass.globalConfig.dataStore and (FoundationClass.globalConfig.dataStore == 'both' or FoundationClass.globalConfig.dataStore == 'cargo')) and coreData.global_cargoTable or '',&lt;br /&gt;
			label6 = 'Smw class',&lt;br /&gt;
			data6 = usesSmw and _private[self].pagename or '',&lt;br /&gt;
			data7 = coreData.global_description,&lt;br /&gt;
			header10 = 'Pages',&lt;br /&gt;
			label12 = 'Module',&lt;br /&gt;
			data12 = _private[self].pagename and '[[Module:' .. _private[self].pagename .. ']]' or '',&lt;br /&gt;
			label13 = 'Class',&lt;br /&gt;
			data13 = _private[self].pagename and '[[Module:' .. _private[self].pagename .. '/class]]' or '',&lt;br /&gt;
			label14 = 'Config',&lt;br /&gt;
			data14 = _private[self].pagename and '[[Module:' .. _private[self].pagename .. '/config]]' or '',&lt;br /&gt;
			label17 = 'Template',&lt;br /&gt;
			data17 = coreData.template_name and '[[Template:' .. coreData.template_name .. ']]' or '',&lt;br /&gt;
			label19 = 'Form',&lt;br /&gt;
			data19 = coreData.page.form and '[[:' .. coreData.page.form.name .. ']]' or '',&lt;br /&gt;
			label21 = 'Category',&lt;br /&gt;
			data21 = coreData.page.category and '[[:' .. coreData.page.category.name .. ']]' or '',&lt;br /&gt;
			label22 = 'Gardening',&lt;br /&gt;
			data22 = coreData.page.gardeningCategory and '[[:' .. coreData.page.gardeningCategory.name .. ']]' or '',&lt;br /&gt;
		}&lt;br /&gt;
		if usesSmw and coreData.properties.order and #coreData.properties.order &amp;gt; 0 then&lt;br /&gt;
			ib_args.header30 = 'Properties'&lt;br /&gt;
			local i = 31&lt;br /&gt;
			for _, property in pairs(coreData.properties.order) do&lt;br /&gt;
				ib_args['label' .. i] = coreData.properties.data[property].type&lt;br /&gt;
				ib_args['data' .. i] = '[[Property:' .. property .. '|' .. property .. ']]'&lt;br /&gt;
				i = i + 1&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		self:addOutput(require('Module:Infobox').infobox(ib_args))&lt;br /&gt;
		return true&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Classgenerator:addPageBody()&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator:addPageBody(), from ' .. tostring(self))&lt;br /&gt;
	_debug(self, 2, ' rendering errors and warnings and adding them to output')&lt;br /&gt;
	self:addOutput(self:renderErrors())&lt;br /&gt;
	self:addOutput(self:renderWarnings())&lt;br /&gt;
	if self:goodToGo() then&lt;br /&gt;
		local frame = mw.getCurrentFrame()&lt;br /&gt;
		local lang = mw.language.new('en-gb')&lt;br /&gt;
		local _CFG = self.class.myConfiguration&lt;br /&gt;
		local coreData = self:getCoreData()&lt;br /&gt;
		-- start&lt;br /&gt;
		local widthTh = '300px'&lt;br /&gt;
		local widthTd = '200px'&lt;br /&gt;
		-- build the page status table&lt;br /&gt;
		-- first the two status table cells &amp;quot;green&amp;quot; and &amp;quot;red&amp;quot;&lt;br /&gt;
		local imgYes = '[[File:Yes check.png|13px|alt=Yes|link=]]'&lt;br /&gt;
		local imgNo = '[[File:X mark.png|13px|alt=No|link=]]'&lt;br /&gt;
		local tdYa = mw.html.create('td')&lt;br /&gt;
		tdYa:cssText('background: #90ff90; color:black; vertical-align: middle; text-align: center; width:' .. widthTd)&lt;br /&gt;
			:addClass('table-yes')&lt;br /&gt;
			:wikitext(imgYes)&lt;br /&gt;
		local tdNa = mw.html.create('td')&lt;br /&gt;
		tdNa:cssText('background: #FF9090; color:black; vertical-align: middle; text-align: center; width:' .. widthTd)&lt;br /&gt;
			:addClass('table-no')&lt;br /&gt;
			:wikitext(imgNo)&lt;br /&gt;
		local classExists = coreData.page.class.exists and coreData.page.config.exists&lt;br /&gt;
		local modulesExist = coreData.page.base.exists and classExists&lt;br /&gt;
		local thisClass&lt;br /&gt;
		local thisConfig&lt;br /&gt;
		if classExists then&lt;br /&gt;
			thisClass = require(coreData.page.class.name)&lt;br /&gt;
			thisConfig = require(coreData.page.config.name)&lt;br /&gt;
		end&lt;br /&gt;
		local thisUsesCargo = (FoundationClass.globalConfig.dataStore == 'both' or FoundationClass.globalConfig.dataStore == 'cargo') and coreData.global_cargoTable and #coreData.global_cargoTable &amp;gt; 0&lt;br /&gt;
		local thisUsesSmw = (FoundationClass.globalConfig.dataStore == 'both' or FoundationClass.globalConfig.dataStore == 'smw') and FoundationClass.myYesno(coreData.global_smwUseStorage)&lt;br /&gt;
		-- write the 2do checklist&lt;br /&gt;
		local done = true&lt;br /&gt;
		local step1&lt;br /&gt;
		local step2&lt;br /&gt;
		local step3&lt;br /&gt;
		if modulesExist then&lt;br /&gt;
			step1 = imgYes .. ' You created all your modules'&lt;br /&gt;
		else&lt;br /&gt;
			done = false&lt;br /&gt;
			step1 = imgNo .. ' You have to create your module pages. This, you have to do &amp;lt;b&amp;gt;manually&amp;lt;/b&amp;gt;. Go to [[#Page contents|section Page contents]], copy the module content and edit the corresponding module, ' ..&lt;br /&gt;
				'pasting all the copied content. Save and close. You have to do this for the following module(s): &amp;lt;ul&amp;gt; ' ..&lt;br /&gt;
				(not coreData.page.base.exists and '&amp;lt;li&amp;gt;[[#Page contents|' .. coreData.page.base.name .. ']]&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
				(not coreData.page.class.exists and '&amp;lt;li&amp;gt;[[#Page contents|' .. coreData.page.class.name .. ']]&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
				(not coreData.page.config.exists and '&amp;lt;li&amp;gt;[[#Page contents|' .. coreData.page.config.name .. ']]&amp;lt;/li&amp;gt;' or '') .. '&amp;lt;/ul&amp;gt;'&lt;br /&gt;
		end&lt;br /&gt;
		if coreData.page.baseDoc.exists and coreData.page.classDoc.exists and coreData.page.configDoc.exists and coreData.page.template.exists and coreData.page.templateDoc.exists and&lt;br /&gt;
				(not coreData.page.form or coreData.page.form.exists) and (not coreData.page.category or coreData.page.category.exists) and (not coreData.page.gardeningCategory or coreData.page.gardeningCategory.exists) then&lt;br /&gt;
			step2 = imgYes .. ' You created all auxilliary pages'&lt;br /&gt;
		else&lt;br /&gt;
			done = false&lt;br /&gt;
			step2 = imgNo .. ' You have to create auxilliary pages. This, you can do &amp;lt;b&amp;gt;automatically&amp;lt;/b&amp;gt;. Go to [[#Page autocreation|section Page autocreation]], hit the corresponding &amp;quot;Create&amp;quot;-button or ' ..&lt;br /&gt;
				'create all pages at once. Please do this for the following page(s): &amp;lt;ul&amp;gt; ' ..&lt;br /&gt;
				(not (coreData.page.baseDoc.exists or coreData.page.classDoc.exists or coreData.page.configDoc.exists) and '&amp;lt;li&amp;gt;Module documentation pages&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
				(not (coreData.page.template.exists or coreData.page.templateDoc.exists) and '&amp;lt;li&amp;gt;Template and/or template documentation page&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
				((coreData.page.form and not coreData.page.form.exists) and '&amp;lt;li&amp;gt;Form page&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
				(((coreData.page.category and not coreData.page.category.exists) or (coreData.page.gardeningCategory and not coreData.page.gardeningCategory.exists)) and '&amp;lt;li&amp;gt;Category page(s)&amp;lt;/li&amp;gt;' or '') .. '&amp;lt;/ul&amp;gt;'&lt;br /&gt;
		end&lt;br /&gt;
		local storeCargoInstruction&lt;br /&gt;
		local allPropertiesThere = true&lt;br /&gt;
		local cargoTableCreateLink = false&lt;br /&gt;
		if thisUsesCargo then&lt;br /&gt;
			-- we actually use cargo. check, if cargo table is there or throws an error? if all right, then yes, else instruction above&lt;br /&gt;
			if modulesExist and coreData.page.template.exists then&lt;br /&gt;
				cargoTableCreateLink = true&lt;br /&gt;
				attr = { limit = 1, default = '' }&lt;br /&gt;
				attr['more results text'] = ''&lt;br /&gt;
				local tableEntryId = mw.text.trim(mw.text.unstrip(FoundationClass.myCargoUtil.rawquery({tables = coreData.global_cargoTable, fields = {'_ID'}}, attr)))&lt;br /&gt;
				if mw.ustring.match(mw.text.trim(tableEntryId), '^[0-9]*$') then&lt;br /&gt;
					storeCargoInstruction = imgYes .. ' Your cargo table does exist! (Note: When you change your cargo table\'s declaration, you need to [[#Page autocreation|rebuild it]], though)'&lt;br /&gt;
				else&lt;br /&gt;
					done = false&lt;br /&gt;
					storeCargoInstruction = imgNo .. ' Please [[#Page autocreation|create your cargo table]]!'&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				done = false&lt;br /&gt;
				storeCargoInstruction = imgNo .. ' To be able to create your cargo table, you have to create the following page(s): &amp;lt;ul&amp;gt;' ..&lt;br /&gt;
					(not coreData.page.base.exists and '&amp;lt;li&amp;gt;' .. coreData.page.base.name .. '&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
					(not coreData.page.class.exists and '&amp;lt;li&amp;gt;' .. coreData.page.class.name .. '&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
					(not coreData.page.config.exists and '&amp;lt;li&amp;gt;' .. coreData.page.config.name .. '&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
					(not coreData.page.template.exists and '&amp;lt;li&amp;gt;' .. coreData.page.template.name .. '&amp;lt;/li&amp;gt;' or '') .. '&amp;lt;/ul&amp;gt;'&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if thisUsesSmw then&lt;br /&gt;
			-- we actually use smw. check, if all properties are present? if all right, then yes, else instruction above&lt;br /&gt;
			if coreData.properties and coreData.properties.data and FoundationClass.myTableTools.size(coreData.properties.data) &amp;gt; 0 then&lt;br /&gt;
				for property, propertyData in pairs(coreData.properties.data) do&lt;br /&gt;
					allPropertiesThere = allPropertiesThere and propertyData.exists&lt;br /&gt;
				end&lt;br /&gt;
				if allPropertiesThere then&lt;br /&gt;
					storeSwmInstruction = imgYes .. ' All your property pages are present and accounted for!'&lt;br /&gt;
				else&lt;br /&gt;
					done = false&lt;br /&gt;
					storeSwmInstruction = imgNo .. ' Please &amp;lt;b&amp;gt;[[#Page autocreation|autocreate]]&amp;lt;/b&amp;gt; your properties! The following are missing: &amp;lt;ul&amp;gt;'&lt;br /&gt;
					for _, property in pairs(coreData.properties.order) do&lt;br /&gt;
						local pdata = coreData.properties.data[property]&lt;br /&gt;
						if not pdata or not pdata.exists then&lt;br /&gt;
							storeSwmInstruction = storeSwmInstruction .. '&amp;lt;li&amp;gt;[[Property:' .. property .. ']]&amp;lt;/li&amp;gt;'&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
					storeSwmInstruction = storeSwmInstruction .. '&amp;lt;/ul&amp;gt;'&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				done = false&lt;br /&gt;
				storeSwmInstruction = imgNo .. ' To be able to create your smw properties, you have to create the following page(s): &amp;lt;ul&amp;gt;' ..&lt;br /&gt;
					(not coreData.page.class.exists and '&amp;lt;li&amp;gt;' .. coreData.page.class.name .. '&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
					(not coreData.page.config.exists and '&amp;lt;li&amp;gt;' .. coreData.page.config.name .. '&amp;lt;/li&amp;gt;' or '') .. '&amp;lt;/ul&amp;gt;'&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if storeCargoInstruction or storeSwmInstruction then&lt;br /&gt;
			if storeCargoInstruction and storeSwmInstruction then&lt;br /&gt;
				step3 = 'Your class used cargo AND smw store. You have to create both data stores: &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;' .. storeCargoInstruction .. '&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;' .. storeSwmInstruction .. '&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;'&lt;br /&gt;
			else&lt;br /&gt;
				step3 = storeCargoInstruction or storeSwmInstruction&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			step3 = imgYes .. ' This class does not use a data store. Nothing to be done here!'&lt;br /&gt;
		end&lt;br /&gt;
		local step4 = done and imgYes .. ' You are done. Remember, when you want to change parameters in your config, edit this page and write your [' .. coreData.page.config.editlink .. ' config file] new' or &lt;br /&gt;
			imgNo .. ' You are not finished yet, please tend to your tasks.'&lt;br /&gt;
		local manual = mw.html.create('')&lt;br /&gt;
		manual:wikitext('&amp;lt;h2&amp;gt;Your 2do checklist&amp;lt;/h2&amp;gt;')&lt;br /&gt;
			:tag('ol')&lt;br /&gt;
				:cssText('margin: 0.3em 0 0 1.6em; padding: 0')&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(step1)&lt;br /&gt;
					:done()&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(step2)&lt;br /&gt;
					:done()&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(step3)&lt;br /&gt;
					:done()&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(step4)&lt;br /&gt;
					:done()&lt;br /&gt;
				:done()&lt;br /&gt;
		-- get the data store details, if all the modules exist and we have a datastore configured&lt;br /&gt;
		local datastore = mw.html.create('')&lt;br /&gt;
		if thisClass then&lt;br /&gt;
			datastore:node(thisClass:explainDataStore())&lt;br /&gt;
				:newline()&lt;br /&gt;
		end&lt;br /&gt;
		-- build the status table&lt;br /&gt;
		local statusTrs = mw.html.create('')&lt;br /&gt;
		for _, pid in pairs(coreData.page.order) do&lt;br /&gt;
			statusTrs:tag('tr')&lt;br /&gt;
				:tag('th')&lt;br /&gt;
					:css('text-align', 'left')&lt;br /&gt;
					:css('width', widthTh)&lt;br /&gt;
					:wikitext(coreData.page[pid].name)&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
				:node(coreData.page[pid].exists and tdYa or tdNa)&lt;br /&gt;
				:newline()&lt;br /&gt;
				:done()&lt;br /&gt;
				:newline()&lt;br /&gt;
		end&lt;br /&gt;
		if thisUsesSmw and coreData.properties and coreData.properties.data and FoundationClass.myTableTools.size(coreData.properties.data) &amp;gt; 0 then&lt;br /&gt;
			statusTrs:tag('tr')&lt;br /&gt;
				:tag('th')&lt;br /&gt;
					:css('text-align', 'center')&lt;br /&gt;
					:css('width', widthTh)&lt;br /&gt;
					:attr('colspan', 2)&lt;br /&gt;
					:wikitext('Property pages for your smw store')&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
			for _, property in pairs(coreData.properties.order) do&lt;br /&gt;
				statusTrs:tag('tr')&lt;br /&gt;
					:tag('th')&lt;br /&gt;
						:css('text-align', 'left')&lt;br /&gt;
						:css('width', widthTh)&lt;br /&gt;
						:wikitext('Property:' .. property)&lt;br /&gt;
						:done()&lt;br /&gt;
						:newline()&lt;br /&gt;
					:node(coreData.properties.data[property].exists and tdYa or tdNa)&lt;br /&gt;
					:newline()&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		local statusTable = mw.html.create('table')&lt;br /&gt;
		statusTable:node(statusTrs)&lt;br /&gt;
		-- page autocreation&lt;br /&gt;
		local extAutoCreatePage = pcall(frame.callParserFunction, frame, {name = '#createpageifnotex:Module:Classgenerator', {'NUL'}})&lt;br /&gt;
		local autoCreation = _CFG.template.createPages and extAutoCreatePage&lt;br /&gt;
		local pageAutoCreation = mw.html.create('')&lt;br /&gt;
		pageAutoCreation:wikitext('&amp;lt;h2&amp;gt;Page autocreation&amp;lt;/h2&amp;gt;')&lt;br /&gt;
			:newline()&lt;br /&gt;
		if autoCreation then&lt;br /&gt;
			-- depending on parameters and existence of pages do the autocreate or print the button&lt;br /&gt;
			-- first see, which pagecomplexes (modules(docs), templates, form, category) are missing&lt;br /&gt;
			local missing = {}&lt;br /&gt;
			-- in missing we store, if a page in a given namespace is missing. Namespaces are stored by their ids (numbers)&lt;br /&gt;
			for _, pid in pairs(coreData.page.order) do&lt;br /&gt;
				-- due to extension autocreatepage messing up module pages, in namepace module we only autocreate doc pages&lt;br /&gt;
				if not coreData.page[pid].exists and not Classgenerator.myTableTools.inTable(missing, coreData.page[pid].namespace) and &lt;br /&gt;
						(coreData.page[pid].namespace ~= 828 or coreData.page[pid].isDocPage) then&lt;br /&gt;
					table.insert(missing, coreData.page[pid].namespace)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			if thisUsesSmw and not allPropertiesThere then&lt;br /&gt;
				table.insert(missing, mw.title.new('NUL', 'Property').namespace)&lt;br /&gt;
			end&lt;br /&gt;
			-- now generate the printout or call the parser function depending on global_autocreate_* status&lt;br /&gt;
			-- remember the switches 'global_autocreate_module', 'global_autocreate_template', 'global_autocreate_form', 'global_autocreate_category', and 'global_autocreate_property'&lt;br /&gt;
			local actable = mw.html.create('table')&lt;br /&gt;
			for _, nsid  in pairs(missing) do&lt;br /&gt;
				local ns = mw.ustring.lower(_namespaceName(self, nsid))&lt;br /&gt;
				local information = ''&lt;br /&gt;
				if coreData.autocreate[ns] and coreData.autocreate[ns] &amp;gt; os.time() - _CFG.template.autoCreationTimeDiff then&lt;br /&gt;
					-- ************************************* actual autocreation is done here&lt;br /&gt;
					-- we iterate over all namespaces for which pages are missing (var missing) and spring into action, if we have a numeric value supplied for that namespace coreData.autocreate[ns] that is recent enough&lt;br /&gt;
					-- now we have a namespace, we want to create pages for (var nsid) (all that is done in the recent 4 lines). what we do in the following lines:&lt;br /&gt;
					-- we iterate over all pages in coreData.page.order and spring into action, if the interation instance (pid) is in the namespace (nsid), the page is non exist and is not a module&lt;br /&gt;
					-- in that action body, we create the page with the precalcualted content&lt;br /&gt;
					-- also: for convenience, we create some global project (meta)categories, if related to the current page (project-form-category if nsid for forms, etc.) and configured in Foundationclass/globalconfig. here is an overview&lt;br /&gt;
					--	Classgenerator.globalConfig.formCategory			: MediaWiki:Classengine-content-project-form-category&lt;br /&gt;
					--	Classgenerator.globalConfig.gardeningSuperCategory	: MediaWiki:Classengine-content-project-gardening-supercategory&lt;br /&gt;
					--	Classgenerator.globalConfig.moduleCategory			: MediaWiki:Classengine-content-project-module-category&lt;br /&gt;
					--	Classgenerator.globalConfig.projectSuperCategory	: MediaWiki:Classengine-content-project-supercategory&lt;br /&gt;
					--	Classgenerator.globalConfig.propertyCategory		: MediaWiki:Classengine-content-project-property-category&lt;br /&gt;
					--	Classgenerator.globalConfig.templateCategory		: MediaWiki:Classengine-content-project-templates&lt;br /&gt;
					for _, pid in pairs(coreData.page.order) do&lt;br /&gt;
						_debug(self, 3, ' testing page &amp;quot;' .. coreData.page[pid].name .. '&amp;quot;: namespace id is ' .. coreData.page[pid].namespace ..&lt;br /&gt;
							', and page does ' ..(not coreData.page[pid].exists and 'not ' or '') .. 'exist')&lt;br /&gt;
						if coreData.page[pid].namespace == nsid and not coreData.page[pid].exists and (nsid ~= 828 or coreData.page[pid].isDocPage) then&lt;br /&gt;
							if pid == 'gardeningCategory' and Classgenerator.globalConfig.gardeningSuperCategory and #Classgenerator.globalConfig.gardeningSuperCategory &amp;gt; 0 then&lt;br /&gt;
								-- we just iterated over the gardening category page (so this class has one) but we did not create it, yet)&lt;br /&gt;
								-- blindly try to create the gardening supercategory first, in case the class's gardening category is the gardening supercategory, we dont want the class specific content&lt;br /&gt;
								local content = '{{MediaWiki:Classengine-content-project-gardening-supercategory}}'&lt;br /&gt;
								_debug(self, 3, ' trying to autocreate garderning supercategory page &amp;quot;' .. Classgenerator.globalConfig.gardeningSuperCategory .. '&amp;quot; with # of content being ' .. #content)&lt;br /&gt;
								local ret = frame:callParserFunction{ name = '#createpageifnotex:Category:' .. Classgenerator.globalConfig.gardeningSuperCategory, args = { content } }&lt;br /&gt;
								if #ret &amp;gt; 0 then&lt;br /&gt;
									information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
								end&lt;br /&gt;
							end&lt;br /&gt;
							_debug(self, 3, ' trying to autocreate page &amp;quot;' .. coreData.page[pid].name .. '&amp;quot; with # of content being ' .. #coreData.page[pid].content)&lt;br /&gt;
							local ret = frame:callParserFunction{ name = '#createpageifnotex:' .. coreData.page[pid].name, args = { frame:preprocess(coreData.page[pid].content) } }&lt;br /&gt;
							if #ret &amp;gt; 0 then&lt;br /&gt;
								information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
							end&lt;br /&gt;
							if pid == 'form' and Classgenerator.globalConfig.formCategory and #Classgenerator.globalConfig.formCategory &amp;gt; 0 then&lt;br /&gt;
								-- we just iterated over the form page (so this class has one) and created it (yay). Now blindly create the formCategory as well...&lt;br /&gt;
								local content = '{{MediaWiki:Classengine-content-project-form-category}}'&lt;br /&gt;
								_debug(self, 3, ' trying to autocreate form category page &amp;quot;' .. Classgenerator.globalConfig.formCategory .. '&amp;quot; with # of content being ' .. #content)&lt;br /&gt;
								local ret = frame:callParserFunction{ name = '#createpageifnotex:Category:' .. Classgenerator.globalConfig.formCategory, args = { content } }&lt;br /&gt;
								if #ret &amp;gt; 0 then&lt;br /&gt;
									information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
								end&lt;br /&gt;
							elseif nsid ~= 828 and Classgenerator.globalConfig.moduleCategory and #Classgenerator.globalConfig.moduleCategory &amp;gt; 0 then&lt;br /&gt;
								-- we just iterated a module doc page (so this class has one) and created it (yay). Now blindly create the moduleCategory as well...&lt;br /&gt;
								local content = '{{MediaWiki:Classengine-content-project-module-category}}'&lt;br /&gt;
								_debug(self, 3, ' trying to autocreate module category page &amp;quot;' .. Classgenerator.globalConfig.moduleCategory .. '&amp;quot; with # of content being ' .. #content)&lt;br /&gt;
								local ret = frame:callParserFunction{ name = '#createpageifnotex:Category:' .. Classgenerator.globalConfig.moduleCategory, args = { content } }&lt;br /&gt;
								if #ret &amp;gt; 0 then&lt;br /&gt;
									information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
								end&lt;br /&gt;
							elseif pid == 'category' and Classgenerator.globalConfig.projectSuperCategory and #Classgenerator.globalConfig.projectSuperCategory &amp;gt; 0 then&lt;br /&gt;
								-- we just iterated over the category page (so this class has one) and created it (yay). Now blindly create the supercategory as well...&lt;br /&gt;
								local content = '{{MediaWiki:Classengine-content-project-supercategory}}'&lt;br /&gt;
								_debug(self, 3, ' trying to autocreate super category page &amp;quot;' .. Classgenerator.globalConfig.projectSuperCategory .. '&amp;quot; with # of content being ' .. #content)&lt;br /&gt;
								local ret = frame:callParserFunction{ name = '#createpageifnotex:Category:' .. Classgenerator.globalConfig.projectSuperCategory, args = { content } }&lt;br /&gt;
								if #ret &amp;gt; 0 then&lt;br /&gt;
									information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
								end&lt;br /&gt;
							elseif nsid == 10 and Classgenerator.globalConfig.templateCategory and #Classgenerator.globalConfig.templateCategory &amp;gt; 0 then&lt;br /&gt;
								-- we just iterated over a page in template namespace (so this class has one) and created it (yay). Now blindly create the templateCategory as well...&lt;br /&gt;
								local content = '{{MediaWiki:Classengine-content-project-template-category}}'&lt;br /&gt;
								_debug(self, 3, ' trying to autocreate template category page &amp;quot;' .. Classgenerator.globalConfig.templateCategory .. '&amp;quot; with # of content being ' .. #content)&lt;br /&gt;
								local ret = frame:callParserFunction{ name = '#createpageifnotex:Category:' .. Classgenerator.globalConfig.templateCategory, args = { content } }&lt;br /&gt;
								if #ret &amp;gt; 0 then&lt;br /&gt;
									information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
								end&lt;br /&gt;
							end&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
					if thisUsesSmw and (nsid == mw.title.new('NUL', 'Property').namespace) and coreData.properties.data then&lt;br /&gt;
						-- add here autocreation of properties&lt;br /&gt;
						for property, pdata in pairs(coreData.properties.data) do&lt;br /&gt;
							if not pdata.exists then&lt;br /&gt;
								local content = pdata.content&lt;br /&gt;
								_debug(self, 3, ' trying to autocreate property page &amp;quot;' .. property .. '&amp;quot; with # of content being ' .. #content)&lt;br /&gt;
								local ret = frame:callParserFunction{ name = '#createpageifnotex:Property:' .. property, args = { frame:preprocess(pdata.content) } }&lt;br /&gt;
								if #ret &amp;gt; 0 then&lt;br /&gt;
									information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
								end&lt;br /&gt;
							end&lt;br /&gt;
						end&lt;br /&gt;
						-- we just iterated over all missing property pages (so this class has some) and created them (yay). Now blindly create the propertyCategory as well...&lt;br /&gt;
						local content = '{{MediaWiki:Classengine-content-project-property-category}}'&lt;br /&gt;
						_debug(self, 3, ' trying to autocreate property category page &amp;quot;' .. Classgenerator.globalConfig.propertyCategory .. '&amp;quot; with # of content being ' .. #content)&lt;br /&gt;
						local ret = frame:callParserFunction{ name = '#createpageifnotex:Category:' .. Classgenerator.globalConfig.propertyCategory, args = { content } }&lt;br /&gt;
						if #ret &amp;gt; 0 then&lt;br /&gt;
							information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				-- create the tr for the ns&lt;br /&gt;
				actable:tag('tr')&lt;br /&gt;
					:tag('th')&lt;br /&gt;
						:css('text-align', 'left')&lt;br /&gt;
						:css('width', widthTh)&lt;br /&gt;
						:wikitext('Create ' .. ((nsid == 828 and 'module docs' or (ns == 'property' and 'properties' or (ns .. (ns == 'template' and 's' or '')))) .. ':'))&lt;br /&gt;
							-- note: nsid == mw.title.new('NUL', 'Property').namespace is necessary since canonicalname for property namespace does not translate uniquely over different languages :(&lt;br /&gt;
						:done()&lt;br /&gt;
						:newline()&lt;br /&gt;
					:tag('td')&lt;br /&gt;
						:cssText('color:black; vertical-align: middle; text-align: center; width:' .. widthTd)&lt;br /&gt;
						:css('background', (coreData.autocreate[ns] and coreData.autocreate[ns] &amp;gt; os.time() - _CFG.template.autoCreationTimeDiff) and '#90ff90' or '#FF9090' )&lt;br /&gt;
						:wikitext(frame:callParserFunction{name = '#autoedit', args={form='Classgenerator', target=self:getUid(),&lt;br /&gt;
							'link text=' .. (coreData.autocreate[ns] and 'Requested on ' .. os.date('%d.%m.%Y %X', coreData.autocreate[ns]) or 'Create automatically!')  .. &lt;br /&gt;
								(#information &amp;gt; 0 and ('Call returned ' .. information) or ''),&lt;br /&gt;
							'reload', summary=&amp;quot;Requesting the autocreation of &amp;quot; .. coreData.className .. ' for pages of type ' .. ns,&lt;br /&gt;
							'query string=Classgenerator[global_autocreate_' .. ns .. ']=' .. os.time()}&lt;br /&gt;
							})&lt;br /&gt;
						:done()&lt;br /&gt;
						:newline()&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
&lt;br /&gt;
			end&lt;br /&gt;
			if Classgenerator.myTableTools.size(missing) &amp;gt; 0 then&lt;br /&gt;
				-- show the all button&lt;br /&gt;
				local querystring = ''&lt;br /&gt;
				for _, nsid in pairs(missing) do&lt;br /&gt;
					local ns = mw.ustring.lower(_namespaceName(self, nsid))&lt;br /&gt;
					querystring = querystring .. 'Classgenerator[global_autocreate_' .. ns .. ']=' .. os.time() .. '&amp;amp;'&lt;br /&gt;
				end&lt;br /&gt;
				querystring = mw.ustring.sub(querystring, 1, -2)&lt;br /&gt;
				actable:tag('tr')&lt;br /&gt;
					:tag('th')&lt;br /&gt;
						:css('text-align', 'left')&lt;br /&gt;
						:css('width', widthTh)&lt;br /&gt;
						:wikitext('Create all pages:')&lt;br /&gt;
						:done()&lt;br /&gt;
						:newline()&lt;br /&gt;
					:tag('td')&lt;br /&gt;
						:cssText('background: #FF9090; color:black; vertical-align: middle; text-align: center; width:' .. widthTd)&lt;br /&gt;
						:wikitext(frame:callParserFunction{name = '#autoedit', args={form='Classgenerator', target=self:getUid(),&lt;br /&gt;
							'link text=Create automatically!', 'reload', summary=&amp;quot;Requesting the autocreation of all missing pages&amp;quot;, 'query string=' .. querystring }&lt;br /&gt;
							})&lt;br /&gt;
						:done()&lt;br /&gt;
						:newline()&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
				pageAutoCreation:wikitext('&amp;lt;b&amp;gt;Note:&amp;lt;/b&amp;gt; Creation of module pages is impossible due to an incompatibility issue.')&lt;br /&gt;
					:newline()&lt;br /&gt;
					:node(actable)&lt;br /&gt;
					:newline()&lt;br /&gt;
			else&lt;br /&gt;
				pageAutoCreation:wikitext('All pages present!')&lt;br /&gt;
					:newline()&lt;br /&gt;
					:tag('p')&lt;br /&gt;
						:wikitext('&amp;lt;small&amp;gt;&amp;lt;b&amp;gt;Note:&amp;lt;/b&amp;gt; Creation of module pages is impossible due to an incompatibility issue.&amp;lt;/small&amp;gt;')&lt;br /&gt;
						:newline()&lt;br /&gt;
						:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			pageAutoCreation:wikitext('Page autocreation is only possible if activated in your [[Module:Classgenerator/config]]-file (see template-section) and '&lt;br /&gt;
					.. 'Extension AutoCreatePage being installed.')&lt;br /&gt;
				:newline()&lt;br /&gt;
		end&lt;br /&gt;
		if cargoTableCreateLink then&lt;br /&gt;
			pageAutoCreation:wikitext('&amp;lt;b&amp;gt;Cargo data store:&amp;lt;/b&amp;gt;To (re-)create your cargo table, follow &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[' .. coreData.page.template.recreatedata .. ' this link]&amp;lt;/span&amp;gt; and then press ok!')&lt;br /&gt;
				:newline()&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		-- build the content collapses&lt;br /&gt;
		local collapse = require('Module:Collapse').main&lt;br /&gt;
		local bg_sets = { exist = {'#cfc', '#9c9'}, nonexist = {'#fcc', '#c99'} }&lt;br /&gt;
		local bg = 1&lt;br /&gt;
		local pageContent = mw.html.create('')&lt;br /&gt;
		for _, pid in pairs(coreData.page.order) do&lt;br /&gt;
			local content&lt;br /&gt;
			local bgs = coreData.page[pid].exists and bg_sets.exist or bg_sets.nonexist&lt;br /&gt;
			if coreData.page[pid].namespace == 828 and not coreData.page[pid].isDocPage then&lt;br /&gt;
				content = frame:expandTemplate{ title = 'Code', args = {lang = 'lua', code = coreData.page[pid].content, line = '1'}}&lt;br /&gt;
			else&lt;br /&gt;
				content = '&amp;lt;pre style=&amp;quot;white-space:-moz-pre-wrap; white-space:-pre-wrap; white-space:-o-pre-wrap; white-space:pre-wrap; word-wrap:break-word;&amp;quot;&amp;gt;' .. &lt;br /&gt;
					mw.text.nowiki(frame:preprocess(coreData.page[pid].content)) .. '&amp;lt;/pre&amp;gt;'&lt;br /&gt;
			end&lt;br /&gt;
			pageContent:wikitext(collapse({ header = 'Contents of &amp;lt;b&amp;gt;[[:' .. coreData.page[pid].name .. ']]&amp;lt;/b&amp;gt; ' ..&lt;br /&gt;
							'&amp;lt;span class=&amp;quot;plainlinks&amp;quot; style=&amp;quot;font-size:75%;&amp;quot;&amp;gt;&amp;amp;#91;[' .. coreData.page[pid].editlink ..&lt;br /&gt;
							' EDIT]&amp;amp;#93;&amp;lt;/span&amp;gt;',&lt;br /&gt;
						content = content, left = true, bg = bgs[bg]&lt;br /&gt;
					}))&lt;br /&gt;
				:newline()&lt;br /&gt;
			bg = (bg == 2 and 1 or 2)&lt;br /&gt;
		end&lt;br /&gt;
		if thisUsesSmw and coreData.properties.order then&lt;br /&gt;
			-- add here the collpases of the properties&lt;br /&gt;
			local message = mw.message.new('classengine-template-property-page')&lt;br /&gt;
			pageContent:tag('p')&lt;br /&gt;
				:wikitext('&amp;lt;h3&amp;gt;All property pages&amp;lt;/h3&amp;gt;')&lt;br /&gt;
				:done()&lt;br /&gt;
			for _, property in pairs(coreData.properties.order) do&lt;br /&gt;
				local bgs = coreData.properties.data[property].exists and bg_sets.exist or bg_sets.nonexist&lt;br /&gt;
				local content = '&amp;lt;pre style=&amp;quot;white-space:-moz-pre-wrap; white-space:-pre-wrap; white-space:-o-pre-wrap; white-space:pre-wrap; word-wrap:break-word;&amp;quot;&amp;gt;' .. &lt;br /&gt;
					mw.text.nowiki(frame:preprocess(coreData.properties.data[property].content)) .. '&amp;lt;/pre&amp;gt;'&lt;br /&gt;
				pageContent:wikitext(collapse({ header = 'Contents of &amp;lt;b&amp;gt;[[:Property:' .. property .. ']]&amp;lt;/b&amp;gt; ' ..&lt;br /&gt;
								'&amp;lt;span class=&amp;quot;plainlinks&amp;quot; style=&amp;quot;font-size:75%;&amp;quot;&amp;gt;&amp;amp;#91;[' .. coreData.properties.data[property].editlink ..&lt;br /&gt;
								' EDIT]&amp;amp;#93;&amp;lt;/span&amp;gt;',&lt;br /&gt;
							content = content, left = true, bg = bgs[bg]&lt;br /&gt;
						}))&lt;br /&gt;
					:newline()&lt;br /&gt;
				bg = (bg == 2 and 1 or 2)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		local updateWarning = mw.html.create('')&lt;br /&gt;
		if coreData.now_timestamp - coreData.edit_timestamp &amp;lt; 2*60*60 then&lt;br /&gt;
			local mbox = require('Module:Message box')&lt;br /&gt;
			updateWarning:wikitext(mbox.main('ombox', { type='content', text = 'Note: You updated the class ' .. coreData.edit_time_before .. ' ago. Did you write your [[#Page contents|config file]] new? ' ..&lt;br /&gt;
						'Changes won\'t take effect unless you do!' .. ((thisUsesCargo and cargoTableCreateLink) and '&amp;lt;p&amp;gt;&amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;Also: If you changed your cargo table\'s declaration, [' .. &lt;br /&gt;
						coreData.page.template.editlink .. ' edit your template] and [[#Page autocreation|rebuild your cargo table]]!&amp;lt;/span&amp;gt;' or '')}))&lt;br /&gt;
				:newline()&lt;br /&gt;
		end&lt;br /&gt;
		local smwPropertyHint = mw.html.create('')&lt;br /&gt;
		if (FoundationClass.globalConfig.dataStore == 'both' or FoundationClass.globalConfig.dataStore == 'smw')&lt;br /&gt;
				and FoundationClass.myYesno(coreData.global_smwUseStorage)&lt;br /&gt;
				and not coreData.properties.order then&lt;br /&gt;
			local mbox = require('Module:Message box')&lt;br /&gt;
			smwPropertyHint:wikitext(mbox.main('ombox', { type='notice', text = 'Hint: If you use properties in your class, they will not display in &amp;lt;i&amp;gt;Page contents&amp;lt;/i&amp;gt;, nor be listed in &amp;lt;i&amp;gt;Page status&amp;lt;/i&amp;gt; or '&lt;br /&gt;
					.. 'autocreated in &amp;lt;i&amp;gt;Page autocreation&amp;lt;/i&amp;gt; unless you have your class and config page created!'}))&lt;br /&gt;
				:newline()&lt;br /&gt;
		end&lt;br /&gt;
		-- assemble everything&lt;br /&gt;
		local html = mw.html.create('')&lt;br /&gt;
		html:wikitext(coreData.global_description)&lt;br /&gt;
			:newline()&lt;br /&gt;
			:node(updateWarning)&lt;br /&gt;
			:node(smwPropertyHint)&lt;br /&gt;
			:node(manual)&lt;br /&gt;
			:newline()&lt;br /&gt;
			:node(datastore)&lt;br /&gt;
			:wikitext('&amp;lt;h2&amp;gt;Page status&amp;lt;/h2&amp;gt;')&lt;br /&gt;
			:newline()&lt;br /&gt;
			:wikitext(autoCreation and 'This status may be inaccurate, if you just created pages. In that case, run jobs and clear cache of this page.' or '')&lt;br /&gt;
			:node(statusTable)&lt;br /&gt;
			:newline()&lt;br /&gt;
			:node(pageAutoCreation)&lt;br /&gt;
			:wikitext('&amp;lt;h2&amp;gt;Page contents&amp;lt;/h2&amp;gt;')&lt;br /&gt;
			:newline()&lt;br /&gt;
			:node(pageContent)&lt;br /&gt;
			:newline()&lt;br /&gt;
			:done()&lt;br /&gt;
		local debugLevel = FoundationClass.globalConfig.debugLevel or _CFG.global.debugLevel&lt;br /&gt;
		if debugLevel then&lt;br /&gt;
			html:tag('pre')&lt;br /&gt;
--				:wikitext(FoundationClass.myTableTools.printTable(coreData))&lt;br /&gt;
--				:wikitext(FoundationClass.myTableTools.printTable(thisClass:smwProperty2ParameterTranslationTable()))&lt;br /&gt;
				:wikitext(ClassDebug:printLog(debugLevel))&lt;br /&gt;
				:done()&lt;br /&gt;
		end&lt;br /&gt;
		self:addOutput(html)&lt;br /&gt;
&lt;br /&gt;
		return true&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Classgenerator:myArgumentProcessing(coreData)&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator:myArgumentProcessing(args) to process coreData, from ' .. tostring(self))&lt;br /&gt;
	-- function that performs some individual transformation args --&amp;amp;amp;gt; coreData&lt;br /&gt;
	local _CFG = self.class.myConfiguration&lt;br /&gt;
	local coreData = coreData&lt;br /&gt;
	local lang = mw.language.new('en')&lt;br /&gt;
	coreData.className = lang:ucfirst(mw.text.trim(mw.ustring.gsub(self:getUid(), ':', '')))&lt;br /&gt;
	coreData.edit_timestamp = lang:formatDate('U', coreData.global_edit_timestamp)&lt;br /&gt;
	coreData.now_timestamp = lang:formatDate('U') + 60*60&lt;br /&gt;
	coreData.edit_time_before = lang:formatDuration(coreData.now_timestamp-coreData.edit_timestamp)&lt;br /&gt;
	coreData.last_edited = lang:formatDate('d.m.Y H:i:s', coreData.global_edit_timestamp)&lt;br /&gt;
	if coreData.global_gardeningCategory_chooser and mw.ustring.lower(coreData.global_gardeningCategory_chooser) == 'global' then&lt;br /&gt;
		coreData.global_gardeningCategory = 'superglobal.gardeningCategory'&lt;br /&gt;
	end&lt;br /&gt;
	if mw.ustring.find(coreData.className, ' ', 1, true) then&lt;br /&gt;
		local tmp = ''&lt;br /&gt;
		for fragment in mw.text.gsplit(coreData.className, ' ', true) do&lt;br /&gt;
			tmp = tmp .. lang:ucfirst(fragment)&lt;br /&gt;
		end&lt;br /&gt;
		coreData.className = tmp&lt;br /&gt;
	end&lt;br /&gt;
	if coreData.global_cargoTable then&lt;br /&gt;
		coreData.global_cargoTable = mw.ustring.gsub(mw.ustring.lower(coreData.global_cargoTable), ' ', '_')&lt;br /&gt;
	end&lt;br /&gt;
	if coreData.form_createInfotext and #coreData.form_createInfotext &amp;gt; 0 and mw.ustring.sub(coreData.form_createInfotext, -1) ~= ' ' then&lt;br /&gt;
		coreData.form_createInfotext = coreData.form_createInfotext .. ' '&lt;br /&gt;
	end&lt;br /&gt;
	local parameter_parameter&lt;br /&gt;
	local fieldOrder&lt;br /&gt;
	if coreData.parameter_parameter then&lt;br /&gt;
		parameters = ''&lt;br /&gt;
		fieldOrder = {}&lt;br /&gt;
		local classGenParamConfig = mw.loadData('Module:Classgenerator/parameter/config')&lt;br /&gt;
		for result in mw.text.gsplit(coreData.parameter_parameter, classGenParamConfig.template.delimiterResult, true) do&lt;br /&gt;
			local fieldname, parameter = mw.ustring.match(result, '^([^#]*)' .. classGenParamConfig.template.delimiterFormFieldName .. '(.+)$')&lt;br /&gt;
			if fieldname and mw.ustring.len(mw.text.trim(fieldname)) &amp;gt; 0 then&lt;br /&gt;
				table.insert(fieldOrder, mw.text.trim(fieldname))&lt;br /&gt;
			end&lt;br /&gt;
			if parameter and mw.ustring.len(parameter) &amp;gt; 0 then&lt;br /&gt;
				parameters = parameters .. parameter&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	coreData.parameter_parameter = parameters&lt;br /&gt;
	coreData.form_enable = FoundationClass.myYesno(coreData.form_enable)&lt;br /&gt;
	if coreData.form_enable then&lt;br /&gt;
		coreData.form_fieldOrder = fieldOrder&lt;br /&gt;
		form_buttons = { 'save' }&lt;br /&gt;
		if coreData.form_buttons and #coreData.form_buttons &amp;gt; 0 then&lt;br /&gt;
			for _, button in pairs(coreData.form_buttons) do&lt;br /&gt;
				table.insert(form_buttons, button)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		table.insert(form_buttons, 'cancel')&lt;br /&gt;
	end&lt;br /&gt;
	coreData.form_buttons = form_buttons&lt;br /&gt;
	-- here build the class config&lt;br /&gt;
	local contentClassConfig = mw.ustring.gsub(_CFG.template.configIntro, _CFG.template.placeHolderClassName, coreData.className) ..&lt;br /&gt;
		'local global = {\n' ..&lt;br /&gt;
		'\tdebugLevel = false,'&lt;br /&gt;
	if self.class.myConfiguration.template.addCommentsToConfig then&lt;br /&gt;
		contentClassConfig = contentClassConfig .. '\t-- set this to the level you wish to display at render. false if disabled. this is a class based setting. ' ..&lt;br /&gt;
			'you can set this globally at Foundationclass/globalconfig, causing all child classes to debug.'&lt;br /&gt;
	end&lt;br /&gt;
	contentClassConfig = contentClassConfig .. '\n'&lt;br /&gt;
	-- calculate the fieldlists:&lt;br /&gt;
	local fieldlists = {}&lt;br /&gt;
	for _, field in pairs(_CFG.form.fieldOrder) do&lt;br /&gt;
		local tab = mw.ustring.match(field, '^([a-z]+)_.+')&lt;br /&gt;
		if not fieldlists[tab] then&lt;br /&gt;
			fieldlists[tab] = {}&lt;br /&gt;
		end&lt;br /&gt;
		table.insert(fieldlists[tab], field)&lt;br /&gt;
	end&lt;br /&gt;
	local omissionList = {'global_autocreate_module', 'global_autocreate_template', 'global_autocreate_form', 'global_autocreate_category', 'global_autocreate_property', 'global_edit_timestamp', 'global_gardeningCategory_chooser',&lt;br /&gt;
		'form_textareaAttributes_cols', 'form_textareaAttributes_rows', 'form_textareaAttributes_autogrow', 'form_textareaAttributes_editor', 'form_createLinkInfo', &lt;br /&gt;
		'global_customization', 'form_customization', 'template_customization' }&lt;br /&gt;
	for _, attr in pairs(fieldlists.global) do&lt;br /&gt;
		if not Classgenerator.myTableTools.inTable(omissionList, attr) and self.class.myConfiguration.parameter[attr] then&lt;br /&gt;
			contentClassConfig = contentClassConfig .. _processAttribute(self, attr, '\t')&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if coreData.global_customization then&lt;br /&gt;
		for line in mw.text.gsplit(coreData.global_customization, '\n', true) do&lt;br /&gt;
			contentClassConfig = contentClassConfig .. '\t' .. line .. '\n'&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	contentClassConfig = contentClassConfig .. '}\n\nlocal form = {\n'&lt;br /&gt;
	for _, attr in pairs(fieldlists.form) do&lt;br /&gt;
		if not Classgenerator.myTableTools.inTable(omissionList, attr) and self.class.myConfiguration.parameter[attr] then&lt;br /&gt;
			contentClassConfig = contentClassConfig .. _processAttribute(self, attr, '\t')&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	contentClassConfig = contentClassConfig .. '\ttextareaAttributes = {	-- the defaults for your textarea fields\n'&lt;br /&gt;
	for _, attr in pairs({'form_textareaAttributes_cols', 'form_textareaAttributes_rows', 'form_textareaAttributes_autogrow', 'form_textareaAttributes_editor'}) do&lt;br /&gt;
		local name = mw.ustring.match(attr, '^form_textareaAttributes_(.+)$')&lt;br /&gt;
		contentClassConfig = contentClassConfig .. _processAttribute(self, attr, '\t\t', name)&lt;br /&gt;
	end&lt;br /&gt;
	contentClassConfig = contentClassConfig .. '\t},\n'&lt;br /&gt;
	contentClassConfig = contentClassConfig .. _processAttribute(self, 'form_fieldOrder', '\t')&lt;br /&gt;
	if coreData.form_customization then&lt;br /&gt;
		for line in mw.text.gsplit(coreData.form_customization, '\n', true) do&lt;br /&gt;
			contentClassConfig = contentClassConfig .. '\t' .. line .. '\n'&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	contentClassConfig = contentClassConfig .. '}\n\nlocal template = {\n'&lt;br /&gt;
	for _, attr in pairs(fieldlists.template) do&lt;br /&gt;
		if not Classgenerator.myTableTools.inTable(omissionList, attr) and self.class.myConfiguration.parameter[attr] then&lt;br /&gt;
			contentClassConfig = contentClassConfig .. _processAttribute(self, attr, '\t')&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if coreData.template_customization then&lt;br /&gt;
		for line in mw.text.gsplit(coreData.template_customization, '\n', true) do&lt;br /&gt;
			contentClassConfig = contentClassConfig .. '\t' .. mw.text.trim(line) .. '\n'&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	contentClassConfig = contentClassConfig .. '}\n\nlocal parameter = {\n' .. coreData.parameter_parameter .. '}\n\n' ..&lt;br /&gt;
		'return {\n' ..&lt;br /&gt;
		'\tform = form,\n' ..&lt;br /&gt;
		'\tglobal = global,\n' ..&lt;br /&gt;
		'\tparameter = parameter,\n' ..&lt;br /&gt;
		'\ttemplate = template,\n}\n'&lt;br /&gt;
	local classCategory = Classgenerator.globalConfig.classCategory or 'none'&lt;br /&gt;
	local formCategory = Classgenerator.globalConfig.formCategory or 'none'&lt;br /&gt;
	local gardeningCategory = Classgenerator.globalConfig.gardeningSuperCategory or 'none'&lt;br /&gt;
	local moduleCategory = Classgenerator.globalConfig.moduleCategory or 'none'&lt;br /&gt;
	local propertyCategory = Classgenerator.globalConfig.propertyCategory or 'none'&lt;br /&gt;
	local superCategory = Classgenerator.globalConfig.projectSuperCategory or 'none'&lt;br /&gt;
	local templateCategory = Classgenerator.globalConfig.templateCategory or 'none'&lt;br /&gt;
	local page = {}&lt;br /&gt;
	page.order = {'base', 'baseDoc', 'class', 'classDoc', 'config', 'configDoc', 'template', 'templateDoc'}&lt;br /&gt;
	page.base = {&lt;br /&gt;
		name = 'Module:' .. _private[self].pagename,&lt;br /&gt;
		content = mw.message.new('classengine-template-module-page'):rawParams(_private[self].pagename):plain()&lt;br /&gt;
	}&lt;br /&gt;
	page.baseDoc = {&lt;br /&gt;
		name = 'Module:' .. _private[self].pagename .. '/doc',&lt;br /&gt;
		content = mw.message.new('classengine-template-module-documentation-page'):rawParams(_private[self].pagename, moduleCategory):plain()&lt;br /&gt;
	}&lt;br /&gt;
	page.class = {&lt;br /&gt;
		name = 'Module:' .. _private[self].pagename .. '/class',&lt;br /&gt;
		content = mw.message.new('classengine-template-module-class-page'):rawParams(_private[self].pagename, coreData.className):plain()&lt;br /&gt;
	}&lt;br /&gt;
	page.classDoc = {&lt;br /&gt;
		name = 'Module:' .. _private[self].pagename .. '/class/doc',&lt;br /&gt;
		content = mw.message.new('classengine-template-module-class-documentation-page'):rawParams(_private[self].pagename, coreData.className, moduleCategory, classCategory):plain()&lt;br /&gt;
	}&lt;br /&gt;
	page.config = {&lt;br /&gt;
		name = 'Module:' .. _private[self].pagename .. '/config',&lt;br /&gt;
		content = contentClassConfig,&lt;br /&gt;
	}&lt;br /&gt;
	page.configDoc = {&lt;br /&gt;
		name = 'Module:' .. _private[self].pagename .. '/config/doc',&lt;br /&gt;
		content = mw.message.new('classengine-template-module-config-documentation-page'):rawParams(_private[self].pagename, moduleCategory, classCategory):plain()&lt;br /&gt;
	}&lt;br /&gt;
	page.template = {&lt;br /&gt;
		name = 'Template:' .. coreData.template_name,&lt;br /&gt;
		content = mw.message.new('classengine-template-template-page'):rawParams(_private[self].pagename):plain()&lt;br /&gt;
	}&lt;br /&gt;
	page.templateDoc = {&lt;br /&gt;
		name = 'Template:' .. coreData.template_name .. '/doc',&lt;br /&gt;
		content = mw.message.new('classengine-template-template-documentation-page'):rawParams(_private[self].pagename, templateCategory):plain()&lt;br /&gt;
	}&lt;br /&gt;
	if coreData.form_name and #coreData.form_name &amp;gt; 0 then&lt;br /&gt;
		table.insert(page.order, 'form')&lt;br /&gt;
		page.form = {&lt;br /&gt;
			name = 'Form:' .. coreData.form_name,&lt;br /&gt;
			content = mw.message.new('classengine-template-form-page'):rawParams(_private[self].pagename, formCategory):plain()&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
	if coreData.global_category and #coreData.global_category&amp;gt; 0 then&lt;br /&gt;
		table.insert(page.order, 'category')&lt;br /&gt;
		page.category = {&lt;br /&gt;
			name = 'Category:' .. coreData.global_category,&lt;br /&gt;
			content = mw.message.new('classengine-template-category-page'):rawParams(_private[self].pagename, superCategory):plain()&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
	if coreData.global_gardeningCategory and #coreData.global_gardeningCategory &amp;gt; 0 then&lt;br /&gt;
		table.insert(page.order, 'gardeningCategory')&lt;br /&gt;
		local pagename = coreData.global_gardeningCategory&lt;br /&gt;
		if pagename == 'superglobal.gardeningCategory' then&lt;br /&gt;
			pagename = FoundationClass.globalConfig.gardeningCategory&lt;br /&gt;
		end&lt;br /&gt;
		page.gardeningCategory = {&lt;br /&gt;
			name = 'Category:' .. pagename,&lt;br /&gt;
			content = mw.message.new('classengine-template-gardeningcategory-page'):rawParams(_private[self].pagename, gardeningCategory):plain()&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
	for _, pid in pairs(page.order) do&lt;br /&gt;
		local obj = mw.title.new(page[pid].name)&lt;br /&gt;
		page[pid].exists = obj.exists&lt;br /&gt;
		page[pid].namespace = obj.namespace&lt;br /&gt;
		page[pid].editlink = obj:fullUrl{action='edit'}&lt;br /&gt;
		if pid == 'template' then&lt;br /&gt;
			page[pid].recreatedata = obj:fullUrl{action='recreatedata'}&lt;br /&gt;
		end&lt;br /&gt;
		page[pid].isDocPage = (mw.ustring.sub(page[pid].name, -4) == '/doc')&lt;br /&gt;
		if page[pid].isDocPage then&lt;br /&gt;
			page[pid].content = page[pid].content .. '&amp;lt;h2&amp;gt;Maintenanace notes&amp;lt;/h2&amp;gt;\n' ..&lt;br /&gt;
				'This page was created by [[Module:Classgenerator]] and belongs to [[' .. self:getUid() .. ']].\n'&lt;br /&gt;
			if pid == 'configDoc' then&lt;br /&gt;
				page[pid].content = page[pid].content .. '\n{{((}}ombox| type=content | text = It is strongly advised, to not edit this page but to use [' ..&lt;br /&gt;
				'https://{{((}}SERVERNAME{{))}}{{((}}SCRIPTPATH{{))}}/Special:FormEdit/Classgenerator/' .. mw.uri.encode(self:getUid(), &amp;quot;PATH&amp;quot;) .. ' ' .. &lt;br /&gt;
					'the Classgenerator form] instead! After that, use your new configuration to replace the contents of this page.{{))}}'&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	local thisClass&lt;br /&gt;
	local thisConfig&lt;br /&gt;
	if page.class.exists and page.config.exists then&lt;br /&gt;
		thisClass = require(page.class.name)&lt;br /&gt;
		thisConfig = require(page.config.name)&lt;br /&gt;
	end&lt;br /&gt;
	if page.form and (not coreData.form_typeCreateLink or coreData.form_typeCreateLink ~= 'forminput') and coreData.form_createLinkPageName and mw.ustring.len(coreData.form_createLinkPageName) &amp;gt; 0 then&lt;br /&gt;
		local pageName = coreData.form_createLinkPageName&lt;br /&gt;
		if coreData.global_namespace and mw.ustring.len(coreData.global_namespace) &amp;gt; 0 and not mw.ustring.match(pageName, '^' .. coreData.global_namespace .. ':.+$') then&lt;br /&gt;
			pageName = coreData.global_namespace .. ':' .. pageName&lt;br /&gt;
		end&lt;br /&gt;
		local infostr = '{{((}}{info|page name=' .. pageName .. '|add title=' .. (coreData.form_labelCreate or 'create entity') .. '|edit title=' .. (coreData.form_labelEdit or 'edit entity') .. '}{{))}}'&lt;br /&gt;
		page.form.content = page.form.content .. '&amp;lt;!{{#invoke:String|rep|-|2}} this is a workaround, needed because of a SF bug: ' .. infostr ..&lt;br /&gt;
			'. see https://phabricator.wikimedia.org/T123230 for more information {{#invoke:String|rep|-|2}}&amp;gt;'&lt;br /&gt;
	end&lt;br /&gt;
	coreData.page = page&lt;br /&gt;
	local autocreate = {}&lt;br /&gt;
	autocreate.module = FoundationClass.myYesno(coreData.global_autocreate_module, tonumber(coreData.global_autocreate_module))&lt;br /&gt;
	autocreate.template = FoundationClass.myYesno(coreData.global_autocreate_template, tonumber(coreData.global_autocreate_template))&lt;br /&gt;
	autocreate.form = coreData.form_name and FoundationClass.myYesno(coreData.global_autocreate_form, tonumber(coreData.global_autocreate_form))&lt;br /&gt;
	autocreate.category = (coreData.global_category or coreData.global_gardeningCategory) and FoundationClass.myYesno(coreData.global_autocreate_category, tonumber(coreData.global_autocreate_category))&lt;br /&gt;
	if (FoundationClass.globalConfig.dataStore == 'both' or FoundationClass.globalConfig.dataStore == 'smw') and FoundationClass.myYesno(coreData.global_smwUseStorage) then&lt;br /&gt;
		local propertyNSName = _namespaceName(self, mw.title.new('NUL', 'Property').namespace)&lt;br /&gt;
		autocreate[propertyNSName] = FoundationClass.myYesno(coreData['global_autocreate_' .. propertyNSName], tonumber(coreData['global_autocreate_' .. propertyNSName]))&lt;br /&gt;
	end&lt;br /&gt;
	coreData.autocreate = autocreate&lt;br /&gt;
	local propertyData&lt;br /&gt;
	local propertyOrder&lt;br /&gt;
	if (FoundationClass.globalConfig.dataStore == 'both' or FoundationClass.globalConfig.dataStore == 'smw') and FoundationClass.myYesno(coreData.global_smwUseStorage) and thisClass and thisConfig then&lt;br /&gt;
		-- we use smw and class and config are created and accessible. we can get property information and prepare data&lt;br /&gt;
		local matrix = thisClass:smwGetProperty2ParameterTranslationTable()&lt;br /&gt;
		propertyData = {}&lt;br /&gt;
		propertyOrder = {}&lt;br /&gt;
		for property, parameter in pairs(matrix) do&lt;br /&gt;
			table.insert(propertyOrder, property)&lt;br /&gt;
			local obj = mw.title.new(property, 'Property')&lt;br /&gt;
			propertyData[property] = { &lt;br /&gt;
				editlink = obj:fullUrl{action='edit'},&lt;br /&gt;
				exists = obj.exists,&lt;br /&gt;
				parameter = parameter,&lt;br /&gt;
			}&lt;br /&gt;
			if thisConfig.parameter[parameter] then&lt;br /&gt;
				propertyData[property].description = thisConfig.parameter[parameter].description&lt;br /&gt;
				propertyData[property].type = thisConfig.parameter[parameter].property_type&lt;br /&gt;
				propertyData[property].values = thisConfig.parameter[parameter].values&lt;br /&gt;
			elseif parameter == FoundationClass.globalConfig.smwClassProperty then&lt;br /&gt;
				propertyData[property].description = 'Automatisch hinzugefügt! Wird verwendet, um Mitglieder dieser Klasse zu finden (funktioniert auch, ohne dass eine Kategorie definiert wird und auch fur subobjects)'&lt;br /&gt;
				propertyData[property].type = 'Text'&lt;br /&gt;
			elseif parameter == FoundationClass.globalConfig.uidFieldName then&lt;br /&gt;
				propertyData[property].description = 'Automatisch hinzugefügt! Wird verwendet, um individuelle Objekte innerhalb der Klasse zu identifizieren.'&lt;br /&gt;
				propertyData[property].type = 'Text'&lt;br /&gt;
			end&lt;br /&gt;
			local values = ''&lt;br /&gt;
			if propertyData[property].values then&lt;br /&gt;
				values = values .. 'The allowed values are:'&lt;br /&gt;
				for _, value in pairs(propertyData[property].values) do&lt;br /&gt;
					values = values .. '\n* [[Allows value::' .. value .. ']]'&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				values = 'No restriction given'&lt;br /&gt;
			end&lt;br /&gt;
			propertyData[property].content = mw.message.new('classengine-template-property-page'):rawParams(propertyData[property].description, propertyData[property].type, values, propertyCategory):plain()&lt;br /&gt;
		end&lt;br /&gt;
		table.sort(propertyOrder)&lt;br /&gt;
	end&lt;br /&gt;
	coreData.properties = { data = propertyData, order = propertyOrder }&lt;br /&gt;
	return coreData	-- this is your new coreData.&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Classgenerator:myPlausibilityTest(args)&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator:myPlausibilityTest(args) to test arguments, from ' .. tostring(self))&lt;br /&gt;
	-- function that performs the individual plausibility tests&lt;br /&gt;
	-- note: before you access a field args.fieldname you should check for existance&lt;br /&gt;
	-- self:addError(text)&lt;br /&gt;
	return false	-- return value will be ignored. but if you add any error, the object's initialization will fail with the error&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Classgenerator:myStashAdjustments(stash)&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator:myStashAdjustments(stash) to do some minor adjustments on data before storing, from ' .. tostring(self))&lt;br /&gt;
	-- function that alters the stash before storing the data&lt;br /&gt;
	local stash = stash&lt;br /&gt;
	return stash	-- this is your new stash. this will be stored. it has format (fieldname: value)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Classgenerator:method()&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator:method() to do something, from ' .. tostring(self))&lt;br /&gt;
	return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return Classgenerator&lt;/div&gt;</summary>
		<author><name>Anatol</name></author>
	</entry>
	<entry>
		<id>https://camnet.oetterer.eu/index.php?title=Modul:Classgenerator/class&amp;diff=1030</id>
		<title>Modul:Classgenerator/class</title>
		<link rel="alternate" type="text/html" href="https://camnet.oetterer.eu/index.php?title=Modul:Classgenerator/class&amp;diff=1030"/>
		<updated>2016-02-10T11:55:09Z</updated>

		<summary type="html">&lt;p&gt;Anatol: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local FoundationClass = require('Module:Foundationclass')&lt;br /&gt;
local ClassDebug = require('Module:Debug/class')&lt;br /&gt;
&lt;br /&gt;
-- ****************************************************************&lt;br /&gt;
-- *                         inheritance                          *&lt;br /&gt;
-- ****************************************************************&lt;br /&gt;
local Classgenerator = FoundationClass:subclass('Classgenerator')&lt;br /&gt;
-- setting class's configuration data&lt;br /&gt;
Classgenerator.static.myConfiguration = mw.loadData('Module:Classgenerator/config')&lt;br /&gt;
--   being in a static method, use self.myConfiguration&lt;br /&gt;
--   being in a private method, that knows self or in a public method, use self.class.myConfiguration&lt;br /&gt;
&lt;br /&gt;
-- ****************************************************************&lt;br /&gt;
-- *                          properties                          *&lt;br /&gt;
-- ****************************************************************&lt;br /&gt;
&lt;br /&gt;
-- **************** initialization of table for private properties&lt;br /&gt;
local _private = setmetatable({}, {__mode = 'k'})   -- weak table storing all private attributes&lt;br /&gt;
&lt;br /&gt;
-- **************** declaration of public static properties&lt;br /&gt;
-- Classgenerator.static.myPropertyModule = require('Module:extern')&lt;br /&gt;
-- Classgenerator.static.staticProperty = 'value'&lt;br /&gt;
&lt;br /&gt;
-- remember the static classes provided by Foundationclass:&lt;br /&gt;
-- Classgenerator.globalConfig&lt;br /&gt;
-- Classgenerator.myCargoUtil&lt;br /&gt;
-- Classgenerator.myTableTools&lt;br /&gt;
&lt;br /&gt;
-- **************** declaration of (global) private properties&lt;br /&gt;
-- for properties you should rather use constructor and _private[self]. this only, if you need a private class property&lt;br /&gt;
-- you should, however predeclare private methods here&lt;br /&gt;
local _debug	-- private method declared later&lt;br /&gt;
local _privateMethodAhead	-- declaration ahead, so this private method can be used in the constructor and in other private methods&lt;br /&gt;
&lt;br /&gt;
-- ***************************************************************&lt;br /&gt;
-- *                           methods                           *&lt;br /&gt;
-- ***************************************************************&lt;br /&gt;
 &lt;br /&gt;
-- **************** declaration of static methods&lt;br /&gt;
function Classgenerator:initialize(uid)&lt;br /&gt;
	local _CFG = self.class.myConfiguration&lt;br /&gt;
	FoundationClass.initialize(self, uid)&lt;br /&gt;
	local page = mw.title.getCurrentTitle().text&lt;br /&gt;
	if uid and mw.ustring.match(uid, '^' .. _CFG.global.namespace .. ':.+$') then&lt;br /&gt;
		page = mw.ustring.match(uid, '^' .. _CFG.global.namespace .. ':(.+)$')&lt;br /&gt;
	end&lt;br /&gt;
	_private[self] = {&lt;br /&gt;
		dbg = ClassDebug:new(tostring(self.class) .. ': id ' .. uid),&lt;br /&gt;
		pagename = page&lt;br /&gt;
	}&lt;br /&gt;
	_debug(self, 1, ' Classgenerator: done initializing object &amp;amp;quot;' .. uid ..'&amp;amp;quot;, from ' .. tostring(self))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- use use self.myConfiguration to access your configuration in a static method&lt;br /&gt;
function Classgenerator.static:aStaticMethod(var)&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator.static:aStaticMethod() to do something, from ' .. tostring(self))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Classgenerator.static:mySfDynamicFieldAttribute(fieldname, attribute, value)&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator.static:mySfDynamicFieldAttribute(fieldname, attribute, value), from ' .. tostring(self))&lt;br /&gt;
	_debug(self, 2, ' with parameters &amp;amp;quot;' .. fieldname .. '&amp;amp;quot;, &amp;amp;quot;' .. attribute .. '&amp;amp;quot; and a ' .. type(value) .. ' value')&lt;br /&gt;
	-- function that can process any attribute/value pair just before rendering the semantic forms field&lt;br /&gt;
	-- usually done, to generate a dynamic 'default' value&lt;br /&gt;
	-- keep in mind: you can completely disable a form field, if you return true on attribute &amp;quot;disable&amp;quot;. note however, that this causes the field to not show at all, no data will be transported/saved&lt;br /&gt;
	local pagename = mw.title.getCurrentTitle().rootText&lt;br /&gt;
	local val = value&lt;br /&gt;
	if Classgenerator.myTableTools.inTable({'template_name', 'global_entityTitle'}, fieldname) and attribute == 'default' then&lt;br /&gt;
		val = pagename&lt;br /&gt;
	end&lt;br /&gt;
	if fieldname == 'global_cargoTable' and attribute == 'default' then&lt;br /&gt;
		val = mw.ustring.lower(pagename)&lt;br /&gt;
	end&lt;br /&gt;
	if Classgenerator.globalConfig.dataStore ~= 'cargo' and Classgenerator.globalConfig.dataStore ~= 'both' then&lt;br /&gt;
		if fieldname == 'global_cargoTable' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
		if fieldname == 'global_cargoUidFieldname' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if Classgenerator.globalConfig.dataStore ~= 'smw' and Classgenerator.globalConfig.dataStore ~= 'both' then&lt;br /&gt;
		if fieldname == 'global_smwIsSubobject' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
		if fieldname == 'global_smwUseStorage' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
		if fieldname == 'global_autocreate_property' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return val	-- this value will be used as new value for field's attribute&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Classgenerator.static:sfGenerateForm()&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator.static:sfGenerateForm(), from ' .. tostring(self))&lt;br /&gt;
	local _CFG = self.myConfiguration&lt;br /&gt;
	local ClassgeneratorParameter  = require('Module:Classgenerator/parameter/class')&lt;br /&gt;
	local ClassSFfield = require('Module:SFfield/class')&lt;br /&gt;
	local tagStart = '{{{'&lt;br /&gt;
	local tagEnd = '}}}'&lt;br /&gt;
	local frame = mw.getCurrentFrame()&lt;br /&gt;
	-- create the form header&lt;br /&gt;
	local notification = mw.html.create('')&lt;br /&gt;
	if _CFG.form.notification and mw.ustring.len(_CFG.form.notification) &amp;gt; 0 then&lt;br /&gt;
		local mbox = require('Module:Message box')&lt;br /&gt;
		notification:wikitext(mbox.main('ombox', { text = _CFG.form.notification }))&lt;br /&gt;
			:newline()&lt;br /&gt;
	end&lt;br /&gt;
	local formheader = mw.html.create('')&lt;br /&gt;
	formheader:wikitext(self:sfGenerateFormInfoTag())&lt;br /&gt;
		:wikitext('&amp;lt;h2&amp;gt;' .. _CFG.global.entityTitle .. '&amp;lt;/h2&amp;gt;')&lt;br /&gt;
		:tag('p')&lt;br /&gt;
			:wikitext(_CFG.form.headerText)&lt;br /&gt;
			:done()&lt;br /&gt;
			:newline()&lt;br /&gt;
		:node(notification)&lt;br /&gt;
		:tag('div')&lt;br /&gt;
			:attr('id', 'wikiPreview')&lt;br /&gt;
			:cssText('display: none; padding-bottom: 25px; margin-bottom: 25px; border-bottom: 1px solid #AAAAAA;')&lt;br /&gt;
			:done()&lt;br /&gt;
			:newline()&lt;br /&gt;
	-- create the form buttons&lt;br /&gt;
	local formbuttons = mw.html.create('div')&lt;br /&gt;
	for _, button in pairs(_CFG.form.buttons) do&lt;br /&gt;
		formbuttons:wikitext(tagStart .. 'standard input&amp;amp;#124;' .. button .. tagEnd)&lt;br /&gt;
	end&lt;br /&gt;
	formbuttons:addClass('formbuttons')&lt;br /&gt;
		:done()&lt;br /&gt;
	-- calculate the fieldlists:&lt;br /&gt;
	local fieldlists = {}&lt;br /&gt;
	for _, field in pairs(_CFG.form.fieldOrder) do&lt;br /&gt;
		local tab = mw.ustring.match(field, '^([a-z]+)_.+')&lt;br /&gt;
		if not fieldlists[tab] then&lt;br /&gt;
			fieldlists[tab] = {}&lt;br /&gt;
		end&lt;br /&gt;
		table.insert(fieldlists[tab], field)&lt;br /&gt;
	end&lt;br /&gt;
	-- assemble everything, so start the html object&lt;br /&gt;
	local html = mw.html.create('div')&lt;br /&gt;
	html:node(formheader)&lt;br /&gt;
		:wikitext('&amp;lt;h1&amp;gt;GLOBAL-Section&amp;lt;/h1&amp;gt;')&lt;br /&gt;
		:newline()&lt;br /&gt;
		:tag('div')&lt;br /&gt;
			:wikitext('This section deals with all the class\'s global data, i.e. all data you need for your &amp;quot;template&amp;quot; part as wenn as for your form, ... ')&lt;br /&gt;
			:done()&lt;br /&gt;
			:newline()&lt;br /&gt;
		:wikitext(tagStart .. 'for template|' .. _CFG.template.name .. '|label=' .. _CFG.global.entityTitle .. tagEnd)&lt;br /&gt;
		:newline()&lt;br /&gt;
		:node(self:sfGenerateFormTable(fieldlists.global))&lt;br /&gt;
		:newline()&lt;br /&gt;
		:wikitext('&amp;lt;h1&amp;gt;FORM-Section&amp;lt;/h1&amp;gt;')&lt;br /&gt;
		:newline()&lt;br /&gt;
		:tag('div')&lt;br /&gt;
			:wikitext('This section deals with all the data, you need to create and operate a form for this class. If you don\'t want a form, disable this section. ' ..&lt;br /&gt;
					'If you need a form (e.g. as part of another form), but no form page, enable this section but leave the field for form page name emtpy.')&lt;br /&gt;
			:done()&lt;br /&gt;
			:newline()&lt;br /&gt;
		:node(self:sfGenerateFormTable(fieldlists.form))&lt;br /&gt;
		:newline()&lt;br /&gt;
		:wikitext('&amp;lt;h1&amp;gt;TEMPLATE-Section&amp;lt;/h1&amp;gt;')&lt;br /&gt;
		:newline()&lt;br /&gt;
		:tag('div')&lt;br /&gt;
			:wikitext('This section deals with all the data, you need to create and operate a template for this class. If you need tempalte specific parameters ' ..&lt;br /&gt;
				'(meaning parameteres that you only need to operate the &amp;quot;action&amp;quot;-part), put them into this section\'s custom field')&lt;br /&gt;
			:done()&lt;br /&gt;
			:newline()&lt;br /&gt;
		:node(self:sfGenerateFormTable(fieldlists.template))&lt;br /&gt;
		:newline()&lt;br /&gt;
		:wikitext('&amp;lt;h1&amp;gt;PARAMETERS-Section&amp;lt;/h1&amp;gt;')&lt;br /&gt;
		:newline()&lt;br /&gt;
		:tag('div')&lt;br /&gt;
			:wikitext('This section deals with all your parameters. You need an entry for every form input field, every template parameter, every data field you want to store, and even every notification line.')&lt;br /&gt;
			:tag('ul')&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(&amp;quot;To produce a normal parameter, add an entry, choose storage type, set '''Regular form parameter''' to yes, choose a form input type, and a template doc type.&amp;quot;)&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(&amp;quot;If you want a data field to be stored in your data storage but not defined in the form, choose a data storage type and set '''Regular form parameter''' to no. &amp;quot;)&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(&amp;quot;If you want a mutiple template to be parsed to a parameter, create a normal parameter (as described above) and choose '''Regular form parameter''' to  be ''Holds template''.&amp;quot;)&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(&amp;quot;A parameter with a form input that is not stored is created like a regular parameter but without setting any data storage type.&amp;quot;)&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(&amp;quot;Finally, you can create a message line. This is useful, if you want to convey any information to the user, that is to important for a description-tooltip. &amp;quot; ..&lt;br /&gt;
						&amp;quot;What you need to do is disable everything ('''Template doc parameter type ''', data storage) and set '''Regular form parameter''' to ''Information''. &amp;quot; ..&lt;br /&gt;
						&amp;quot;You probalby want to add the parameter to one or more ''show on select'' entries, too.&amp;quot;)&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
				:done()&lt;br /&gt;
				:newline()&lt;br /&gt;
			:done()&lt;br /&gt;
			:newline()&lt;br /&gt;
		:node(self:sfInitField('parameter_parameter'):render())&lt;br /&gt;
		:newline()&lt;br /&gt;
		:wikitext(frame:extensionTag('headertabs'))&lt;br /&gt;
		:newline()&lt;br /&gt;
		:wikitext(&amp;quot;'''(*) Pflichtfeld'''&amp;quot;)&lt;br /&gt;
		:newline()&lt;br /&gt;
		:wikitext(tagStart .. 'end template' .. tagEnd)&lt;br /&gt;
		:newline()&lt;br /&gt;
		:wikitext(ClassgeneratorParameter:sfGenerateForm())&lt;br /&gt;
		:newline()&lt;br /&gt;
		:node(formbuttons)&lt;br /&gt;
	local debugLevel = FoundationClass.globalConfig.debugLevel or self.myConfiguration.global.debugLevel&lt;br /&gt;
	if debugLevel then&lt;br /&gt;
		html:newline()&lt;br /&gt;
			:newline()&lt;br /&gt;
			:wikitext(ClassDebug:printLog(debugLevel))&lt;br /&gt;
	end&lt;br /&gt;
	return html&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- **************** declaration of private methods&lt;br /&gt;
-- use self.class.myConfiguration to access your configuration in a public or a private method that is called by a public method&lt;br /&gt;
_debug = function (self, level, text)&lt;br /&gt;
	if _private[self] and _private[self].dbg then&lt;br /&gt;
		local debugLevel = FoundationClass.globalConfig.debugLevel or self.class.myConfiguration.global.debugLevel&lt;br /&gt;
		if debugLevel and level &amp;lt;= debugLevel then&lt;br /&gt;
			_private[self].dbg:log(level, text)&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		local debugLevel = FoundationClass.globalConfig.debugLevel or self.myConfiguration.global.debugLevel&lt;br /&gt;
		if debugLevel and level &amp;lt;= debugLevel then&lt;br /&gt;
			ClassDebug:log(level, text, tostring(self) .. '.static')&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local _namespaceName = function (self, namespaceId)&lt;br /&gt;
	_debug(self, 1, 'entering private _namespaceName() to translate namespace namespaceId ' .. namespaceId .. ' into a universal name, from ' .. tostring(self))&lt;br /&gt;
	local ret, nulProperty = pcall(mw.title.new, 'NUL', 'Property')&lt;br /&gt;
	if ret and (namespaceId == nulProperty.namespace) then&lt;br /&gt;
		return 'property'	-- if you change this, check on other places, this is checked against and change that, too&lt;br /&gt;
	else&lt;br /&gt;
		return mw.site.namespaces[namespaceId].canonicalName&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local _processAttribute = function (self, attr, indent, name)&lt;br /&gt;
	_debug(self, 1, 'entering private _processAttribute() to print a line for attribute ' .. attr .. ', from ' .. tostring(self))&lt;br /&gt;
	local coreData = self:getCoreData()&lt;br /&gt;
	local attr = attr&lt;br /&gt;
	local val = coreData[attr]&lt;br /&gt;
	if type(val) == 'boolean' then&lt;br /&gt;
		val = val and 'true' or 'false'&lt;br /&gt;
	end&lt;br /&gt;
	local ret = ''&lt;br /&gt;
	local fieldname = mw.ustring.match(attr, '^[^_]+_(.+)$')&lt;br /&gt;
	ret = indent .. (name and name or fieldname) .. ' = '&lt;br /&gt;
	if not val then&lt;br /&gt;
		ret = ret .. 'nil'&lt;br /&gt;
	elseif type(val) == 'table' then&lt;br /&gt;
		ret = ret .. Classgenerator.myTableTools.printTable(val, 'inline')&lt;br /&gt;
	elseif val == 'true' or val == 'false' or mw.ustring.match(val, '^[0-9]+$') or (attr == 'global_gardeningCategory' and val == 'superglobal.gardeningCategory') then&lt;br /&gt;
		ret = ret .. val&lt;br /&gt;
	else&lt;br /&gt;
		ret = ret .. &amp;quot;'&amp;quot; .. mw.ustring.gsub(mw.ustring.gsub(mw.ustring.gsub(val, &amp;quot;\\'&amp;quot;, &amp;quot;'&amp;quot;), &amp;quot;'&amp;quot;, &amp;quot;\\'&amp;quot;), '\n', '\\n\' ..\n' .. indent .. '\t\'') .. &amp;quot;'&amp;quot;	-- the gsub catches multiline input from textareas&lt;br /&gt;
	end&lt;br /&gt;
	ret = ret .. ','&lt;br /&gt;
	if self.class.myConfiguration.template.addCommentsToConfig then&lt;br /&gt;
		ret = ret .. '\t-- ' .. self.class.myConfiguration.parameter[attr].description&lt;br /&gt;
	end&lt;br /&gt;
	ret = ret .. '\n'&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local _privateMethod = function (self)&lt;br /&gt;
	_debug(self, 1, 'entering private _privateMethod() to do something, from ' .. tostring(self))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- **************** declaration of public methods&lt;br /&gt;
-- use self.class.myConfiguration to access your configuration in a public method&lt;br /&gt;
function Classgenerator:addInfobox()&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator:addInfobox(), from ' .. tostring(self))&lt;br /&gt;
	if self:goodToGo() then&lt;br /&gt;
		local _CFG = self.class.myConfiguration&lt;br /&gt;
		local coreData = self:getCoreData()&lt;br /&gt;
		local usesSmw = FoundationClass.globalConfig.dataStore and (FoundationClass.globalConfig.dataStore == 'both' or FoundationClass.globalConfig.dataStore == 'smw') and FoundationClass.myYesno(coreData.global_smwUseStorage)&lt;br /&gt;
		local ib_args = {&lt;br /&gt;
			bodyclass = 'infobox_name',&lt;br /&gt;
			aboveclass = 'objtitle titletext',&lt;br /&gt;
			headerclass = 'headertext',&lt;br /&gt;
			labelstyle = 'width: 30%;',&lt;br /&gt;
			datastyle = 'width: 70%;',&lt;br /&gt;
			title = coreData.className,&lt;br /&gt;
			subheader = 'Class',&lt;br /&gt;
			label1 = 'Title',&lt;br /&gt;
			data1 = coreData.global_entityTitle and coreData.global_entityTitle or '',&lt;br /&gt;
			label2 = _CFG.parameter.global_edit_timestamp.label,&lt;br /&gt;
			data2 = coreData.last_edited,&lt;br /&gt;
			label3 = 'Store available',&lt;br /&gt;
			data3 = (FoundationClass.globalConfig.dataStore and mw.ustring.len(FoundationClass.globalConfig.dataStore) &amp;gt; 0) and FoundationClass.globalConfig.dataStore or '',&lt;br /&gt;
			label5 = 'Cargo table',&lt;br /&gt;
			data5 = (FoundationClass.globalConfig.dataStore and (FoundationClass.globalConfig.dataStore == 'both' or FoundationClass.globalConfig.dataStore == 'cargo')) and coreData.global_cargoTable or '',&lt;br /&gt;
			label6 = 'Smw class',&lt;br /&gt;
			data6 = usesSmw and _private[self].pagename or '',&lt;br /&gt;
			data7 = coreData.global_description,&lt;br /&gt;
			header10 = 'Pages',&lt;br /&gt;
			label12 = 'Module',&lt;br /&gt;
			data12 = _private[self].pagename and '[[Module:' .. _private[self].pagename .. ']]' or '',&lt;br /&gt;
			label13 = 'Class',&lt;br /&gt;
			data13 = _private[self].pagename and '[[Module:' .. _private[self].pagename .. '/class]]' or '',&lt;br /&gt;
			label14 = 'Config',&lt;br /&gt;
			data14 = _private[self].pagename and '[[Module:' .. _private[self].pagename .. '/config]]' or '',&lt;br /&gt;
			label17 = 'Template',&lt;br /&gt;
			data17 = coreData.template_name and '[[Template:' .. coreData.template_name .. ']]' or '',&lt;br /&gt;
			label19 = 'Form',&lt;br /&gt;
			data19 = coreData.page.form and '[[:' .. coreData.page.form.name .. ']]' or '',&lt;br /&gt;
			label21 = 'Category',&lt;br /&gt;
			data21 = coreData.page.category and '[[:' .. coreData.page.category.name .. ']]' or '',&lt;br /&gt;
			label22 = 'Gardening',&lt;br /&gt;
			data22 = coreData.page.gardeningCategory and '[[:' .. coreData.page.gardeningCategory.name .. ']]' or '',&lt;br /&gt;
		}&lt;br /&gt;
		if usesSmw and coreData.properties.order and #coreData.properties.order &amp;gt; 0 then&lt;br /&gt;
			ib_args.header30 = 'Properties'&lt;br /&gt;
			local i = 31&lt;br /&gt;
			for _, property in pairs(coreData.properties.order) do&lt;br /&gt;
				ib_args['label' .. i] = coreData.properties.data[property].type&lt;br /&gt;
				ib_args['data' .. i] = '[[Property:' .. property .. '|' .. property .. ']]'&lt;br /&gt;
				i = i + 1&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		self:addOutput(require('Module:Infobox').infobox(ib_args))&lt;br /&gt;
		return true&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Classgenerator:addPageBody()&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator:addPageBody(), from ' .. tostring(self))&lt;br /&gt;
	_debug(self, 2, ' rendering errors and warnings and adding them to output')&lt;br /&gt;
	self:addOutput(self:renderErrors())&lt;br /&gt;
	self:addOutput(self:renderWarnings())&lt;br /&gt;
	if self:goodToGo() then&lt;br /&gt;
		local frame = mw.getCurrentFrame()&lt;br /&gt;
		local lang = mw.language.new('en-gb')&lt;br /&gt;
		local _CFG = self.class.myConfiguration&lt;br /&gt;
		local coreData = self:getCoreData()&lt;br /&gt;
		-- start&lt;br /&gt;
		local widthTh = '300px'&lt;br /&gt;
		local widthTd = '200px'&lt;br /&gt;
		-- build the page status table&lt;br /&gt;
		-- first the two status table cells &amp;quot;green&amp;quot; and &amp;quot;red&amp;quot;&lt;br /&gt;
		local imgYes = '[[File:Yes check.png|13px|alt=Yes|link=]]'&lt;br /&gt;
		local imgNo = '[[File:X mark.png|13px|alt=No|link=]]'&lt;br /&gt;
		local tdYa = mw.html.create('td')&lt;br /&gt;
		tdYa:cssText('background: #90ff90; color:black; vertical-align: middle; text-align: center; width:' .. widthTd)&lt;br /&gt;
			:addClass('table-yes')&lt;br /&gt;
			:wikitext(imgYes)&lt;br /&gt;
		local tdNa = mw.html.create('td')&lt;br /&gt;
		tdNa:cssText('background: #FF9090; color:black; vertical-align: middle; text-align: center; width:' .. widthTd)&lt;br /&gt;
			:addClass('table-no')&lt;br /&gt;
			:wikitext(imgNo)&lt;br /&gt;
		local classExists = coreData.page.class.exists and coreData.page.config.exists&lt;br /&gt;
		local modulesExist = coreData.page.base.exists and classExists&lt;br /&gt;
		local thisClass&lt;br /&gt;
		local thisConfig&lt;br /&gt;
		if classExists then&lt;br /&gt;
			thisClass = require(coreData.page.class.name)&lt;br /&gt;
			thisConfig = require(coreData.page.config.name)&lt;br /&gt;
		end&lt;br /&gt;
		local thisUsesCargo = (FoundationClass.globalConfig.dataStore == 'both' or FoundationClass.globalConfig.dataStore == 'cargo') and coreData.global_cargoTable and #coreData.global_cargoTable &amp;gt; 0&lt;br /&gt;
		local thisUsesSmw = (FoundationClass.globalConfig.dataStore == 'both' or FoundationClass.globalConfig.dataStore == 'smw') and FoundationClass.myYesno(coreData.global_smwUseStorage)&lt;br /&gt;
		-- write the 2do checklist&lt;br /&gt;
		local done = true&lt;br /&gt;
		local step1&lt;br /&gt;
		local step2&lt;br /&gt;
		local step3&lt;br /&gt;
		if modulesExist then&lt;br /&gt;
			step1 = imgYes .. ' You created all your modules'&lt;br /&gt;
		else&lt;br /&gt;
			done = false&lt;br /&gt;
			step1 = imgNo .. ' You have to create your module pages. This, you have to do &amp;lt;b&amp;gt;manually&amp;lt;/b&amp;gt;. Go to [[#Page contents|section Page contents]], copy the module content and edit the corresponding module, ' ..&lt;br /&gt;
				'pasting all the copied content. Save and close. You have to do this for the following module(s): &amp;lt;ul&amp;gt; ' ..&lt;br /&gt;
				(not coreData.page.base.exists and '&amp;lt;li&amp;gt;[[#Page contents|' .. coreData.page.base.name .. ']]&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
				(not coreData.page.class.exists and '&amp;lt;li&amp;gt;[[#Page contents|' .. coreData.page.class.name .. ']]&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
				(not coreData.page.config.exists and '&amp;lt;li&amp;gt;[[#Page contents|' .. coreData.page.config.name .. ']]&amp;lt;/li&amp;gt;' or '') .. '&amp;lt;/ul&amp;gt;'&lt;br /&gt;
		end&lt;br /&gt;
		if coreData.page.baseDoc.exists and coreData.page.classDoc.exists and coreData.page.configDoc.exists and coreData.page.template.exists and coreData.page.templateDoc.exists and&lt;br /&gt;
				(not coreData.page.form or coreData.page.form.exists) and (not coreData.page.category or coreData.page.category.exists) and (not coreData.page.gardeningCategory or coreData.page.gardeningCategory.exists) then&lt;br /&gt;
			step2 = imgYes .. ' You created all auxilliary pages'&lt;br /&gt;
		else&lt;br /&gt;
			done = false&lt;br /&gt;
			step2 = imgNo .. ' You have to create auxilliary pages. This, you can do &amp;lt;b&amp;gt;automatically&amp;lt;/b&amp;gt;. Go to [[#Page autocreation|section Page autocreation]], hit the corresponding &amp;quot;Create&amp;quot;-button or ' ..&lt;br /&gt;
				'create all pages at once. Please do this for the following page(s): &amp;lt;ul&amp;gt; ' ..&lt;br /&gt;
				(not (coreData.page.baseDoc.exists or coreData.page.classDoc.exists or coreData.page.configDoc.exists) and '&amp;lt;li&amp;gt;Module documentation pages&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
				(not (coreData.page.template.exists or coreData.page.templateDoc.exists) and '&amp;lt;li&amp;gt;Template and/or template documentation page&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
				((coreData.page.form and not coreData.page.form.exists) and '&amp;lt;li&amp;gt;Form page&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
				(((coreData.page.category and not coreData.page.category.exists) or (coreData.page.gardeningCategory and not coreData.page.gardeningCategory.exists)) and '&amp;lt;li&amp;gt;Category page(s)&amp;lt;/li&amp;gt;' or '') .. '&amp;lt;/ul&amp;gt;'&lt;br /&gt;
		end&lt;br /&gt;
		local storeCargoInstruction&lt;br /&gt;
		local allPropertiesThere = true&lt;br /&gt;
		local cargoTableCreateLink = false&lt;br /&gt;
		if thisUsesCargo then&lt;br /&gt;
			-- we actually use cargo. check, if cargo table is there or throws an error? if all right, then yes, else instruction above&lt;br /&gt;
			if modulesExist and coreData.page.template.exists then&lt;br /&gt;
				cargoTableCreateLink = true&lt;br /&gt;
				attr = { limit = 1, default = '' }&lt;br /&gt;
				attr['more results text'] = ''&lt;br /&gt;
				local tableEntryId = mw.text.trim(mw.text.unstrip(FoundationClass.myCargoUtil.rawquery({tables = coreData.global_cargoTable, fields = {'_ID'}}, attr)))&lt;br /&gt;
				if mw.ustring.match(mw.text.trim(tableEntryId), '^[0-9]*$') then&lt;br /&gt;
					storeCargoInstruction = imgYes .. ' Your cargo table does exist! (Note: When you change your cargo table\'s declaration, you need to [[#Page autocreation|rebuild it]], though)'&lt;br /&gt;
				else&lt;br /&gt;
					done = false&lt;br /&gt;
					storeCargoInstruction = imgNo .. ' Please [[#Page autocreation|create your cargo table]]!'&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				done = false&lt;br /&gt;
				storeCargoInstruction = imgNo .. ' To be able to create your cargo table, you have to create the following page(s): &amp;lt;ul&amp;gt;' ..&lt;br /&gt;
					(not coreData.page.base.exists and '&amp;lt;li&amp;gt;' .. coreData.page.base.name .. '&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
					(not coreData.page.class.exists and '&amp;lt;li&amp;gt;' .. coreData.page.class.name .. '&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
					(not coreData.page.config.exists and '&amp;lt;li&amp;gt;' .. coreData.page.config.name .. '&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
					(not coreData.page.template.exists and '&amp;lt;li&amp;gt;' .. coreData.page.template.name .. '&amp;lt;/li&amp;gt;' or '') .. '&amp;lt;/ul&amp;gt;'&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if thisUsesSmw then&lt;br /&gt;
			-- we actually use smw. check, if all properties are present? if all right, then yes, else instruction above&lt;br /&gt;
			if coreData.properties and coreData.properties.data and FoundationClass.myTableTools.size(coreData.properties.data) &amp;gt; 0 then&lt;br /&gt;
				for property, propertyData in pairs(coreData.properties.data) do&lt;br /&gt;
					allPropertiesThere = allPropertiesThere and propertyData.exists&lt;br /&gt;
				end&lt;br /&gt;
				if allPropertiesThere then&lt;br /&gt;
					storeSwmInstruction = imgYes .. ' All your property pages are present and accounted for!'&lt;br /&gt;
				else&lt;br /&gt;
					done = false&lt;br /&gt;
					storeSwmInstruction = imgNo .. ' Please &amp;lt;b&amp;gt;[[#Page autocreation|autocreate]]&amp;lt;/b&amp;gt; your properties! The following are missing: &amp;lt;ul&amp;gt;'&lt;br /&gt;
					for _, property in pairs(coreData.properties.order) do&lt;br /&gt;
						local pdata = coreData.properties.data[property]&lt;br /&gt;
						if not pdata or not pdata.exists then&lt;br /&gt;
							storeSwmInstruction = storeSwmInstruction .. '&amp;lt;li&amp;gt;[[Property:' .. property .. ']]&amp;lt;/li&amp;gt;'&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
					storeSwmInstruction = storeSwmInstruction .. '&amp;lt;/ul&amp;gt;'&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				done = false&lt;br /&gt;
				storeSwmInstruction = imgNo .. ' To be able to create your smw properties, you have to create the following page(s): &amp;lt;ul&amp;gt;' ..&lt;br /&gt;
					(not coreData.page.class.exists and '&amp;lt;li&amp;gt;' .. coreData.page.class.name .. '&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
					(not coreData.page.config.exists and '&amp;lt;li&amp;gt;' .. coreData.page.config.name .. '&amp;lt;/li&amp;gt;' or '') .. '&amp;lt;/ul&amp;gt;'&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if storeCargoInstruction or storeSwmInstruction then&lt;br /&gt;
			if storeCargoInstruction and storeSwmInstruction then&lt;br /&gt;
				step3 = 'Your class used cargo AND smw store. You have to create both data stores: &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;' .. storeCargoInstruction .. '&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;' .. storeSwmInstruction .. '&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;'&lt;br /&gt;
			else&lt;br /&gt;
				step3 = storeCargoInstruction or storeSwmInstruction&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			step3 = imgYes .. ' This class does not use a data store. Nothing to be done here!'&lt;br /&gt;
		end&lt;br /&gt;
		local step4 = done and imgYes .. ' You are done. Remember, when you want to change parameters in your config, edit this page and write your [' .. coreData.page.config.editlink .. ' config file] new' or &lt;br /&gt;
			imgNo .. ' You are not finished yet, please tend to your tasks.'&lt;br /&gt;
		local manual = mw.html.create('')&lt;br /&gt;
		manual:wikitext('&amp;lt;h2&amp;gt;Your 2do checklist&amp;lt;/h2&amp;gt;')&lt;br /&gt;
			:tag('ol')&lt;br /&gt;
				:cssText('margin: 0.3em 0 0 1.6em; padding: 0')&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(step1)&lt;br /&gt;
					:done()&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(step2)&lt;br /&gt;
					:done()&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(step3)&lt;br /&gt;
					:done()&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(step4)&lt;br /&gt;
					:done()&lt;br /&gt;
				:done()&lt;br /&gt;
		-- get the data store details, if all the modules exist and we have a datastore configured&lt;br /&gt;
		local datastore = mw.html.create('')&lt;br /&gt;
		if thisClass then&lt;br /&gt;
			datastore:node(thisClass:explainDataStore())&lt;br /&gt;
				:newline()&lt;br /&gt;
		end&lt;br /&gt;
		-- build the status table&lt;br /&gt;
		local statusTrs = mw.html.create('')&lt;br /&gt;
		for _, pid in pairs(coreData.page.order) do&lt;br /&gt;
			statusTrs:tag('tr')&lt;br /&gt;
				:tag('th')&lt;br /&gt;
					:css('text-align', 'left')&lt;br /&gt;
					:css('width', widthTh)&lt;br /&gt;
					:wikitext(coreData.page[pid].name)&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
				:node(coreData.page[pid].exists and tdYa or tdNa)&lt;br /&gt;
				:newline()&lt;br /&gt;
				:done()&lt;br /&gt;
				:newline()&lt;br /&gt;
		end&lt;br /&gt;
		if thisUsesSmw and coreData.properties and coreData.properties.data and FoundationClass.myTableTools.size(coreData.properties.data) &amp;gt; 0 then&lt;br /&gt;
			statusTrs:tag('tr')&lt;br /&gt;
				:tag('th')&lt;br /&gt;
					:css('text-align', 'center')&lt;br /&gt;
					:css('width', widthTh)&lt;br /&gt;
					:attr('colspan', 2)&lt;br /&gt;
					:wikitext('Property pages for your smw store')&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
			for _, property in pairs(coreData.properties.order) do&lt;br /&gt;
				statusTrs:tag('tr')&lt;br /&gt;
					:tag('th')&lt;br /&gt;
						:css('text-align', 'left')&lt;br /&gt;
						:css('width', widthTh)&lt;br /&gt;
						:wikitext('Property:' .. property)&lt;br /&gt;
						:done()&lt;br /&gt;
						:newline()&lt;br /&gt;
					:node(coreData.properties.data[property].exists and tdYa or tdNa)&lt;br /&gt;
					:newline()&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		local statusTable = mw.html.create('table')&lt;br /&gt;
		statusTable:node(statusTrs)&lt;br /&gt;
		-- page autocreation&lt;br /&gt;
		local extAutoCreatePage = pcall(frame.callParserFunction, frame, {name = '#createpageifnotex:Module:Classgenerator', {'NUL'}})&lt;br /&gt;
		local autoCreation = _CFG.template.createPages and extAutoCreatePage&lt;br /&gt;
		local pageAutoCreation = mw.html.create('')&lt;br /&gt;
		pageAutoCreation:wikitext('&amp;lt;h2&amp;gt;Page autocreation&amp;lt;/h2&amp;gt;')&lt;br /&gt;
			:newline()&lt;br /&gt;
		if autoCreation then&lt;br /&gt;
			-- depending on parameters and existence of pages do the autocreate or print the button&lt;br /&gt;
			-- first see, which pagecomplexes (modules(docs), templates, form, category) are missing&lt;br /&gt;
			local missing = {}&lt;br /&gt;
			-- in missing we store, if a page in a given namespace is missing. Namespaces are stored by their ids (numbers)&lt;br /&gt;
			for _, pid in pairs(coreData.page.order) do&lt;br /&gt;
				-- due to extension autocreatepage messing up module pages, in namepace module we only autocreate doc pages&lt;br /&gt;
				if not coreData.page[pid].exists and not Classgenerator.myTableTools.inTable(missing, coreData.page[pid].namespace) and &lt;br /&gt;
						(coreData.page[pid].namespace ~= 828 or coreData.page[pid].isDocPage) then&lt;br /&gt;
					table.insert(missing, coreData.page[pid].namespace)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			if thisUsesSmw and not allPropertiesThere then&lt;br /&gt;
				table.insert(missing, mw.title.new('NUL', 'Property').namespace)&lt;br /&gt;
			end&lt;br /&gt;
			-- now generate the printout or call the parser function depending on global_autocreate_* status&lt;br /&gt;
			-- remember the switches 'global_autocreate_module', 'global_autocreate_template', 'global_autocreate_form', 'global_autocreate_category', and 'global_autocreate_property'&lt;br /&gt;
			local actable = mw.html.create('table')&lt;br /&gt;
			for _, nsid  in pairs(missing) do&lt;br /&gt;
				local ns = mw.ustring.lower(_namespaceName(self, nsid))&lt;br /&gt;
				local information = ''&lt;br /&gt;
				if coreData.autocreate[ns] and coreData.autocreate[ns] &amp;gt; os.time() - _CFG.template.autoCreationTimeDiff then&lt;br /&gt;
					-- ************************************* actual autocreation is done here&lt;br /&gt;
					-- we iterate over all namespaces for which pages are missing (var missing) and spring into action, if we have a numeric value supplied for that namespace coreData.autocreate[ns] that is recent enough&lt;br /&gt;
					-- now we have a namespace, we want to create pages for (var nsid) (all that is done in the recent 4 lines). what we do in the following lines:&lt;br /&gt;
					-- we iterate over all pages in coreData.page.order and spring into action, if the interation instance (pid) is in the namespace (nsid), the page is non exist and is not a module&lt;br /&gt;
					-- in that action body, we create the page with the precalcualted content&lt;br /&gt;
					-- also: for convenience, we create some global project (meta)categories, if related to the current page (project-form-category if nsid for forms, etc.) and configured in Foundationclass/globalconfig. here is an overview&lt;br /&gt;
					--	Classgenerator.globalConfig.formCategory			: MediaWiki:Classengine-content-project-form-category&lt;br /&gt;
					--	Classgenerator.globalConfig.gardeningSuperCategory	: MediaWiki:Classengine-content-project-gardening-supercategory&lt;br /&gt;
					--	Classgenerator.globalConfig.moduleCategory			: MediaWiki:Classengine-content-project-module-category&lt;br /&gt;
					--	Classgenerator.globalConfig.projectSuperCategory	: MediaWiki:Classengine-content-project-supercategory&lt;br /&gt;
					--	Classgenerator.globalConfig.propertyCategory		: MediaWiki:Classengine-content-project-property-category&lt;br /&gt;
					--	Classgenerator.globalConfig.templateCategory		: MediaWiki:Classengine-content-project-templates&lt;br /&gt;
					for _, pid in pairs(coreData.page.order) do&lt;br /&gt;
						_debug(self, 3, ' testing page &amp;quot;' .. coreData.page[pid].name .. '&amp;quot;: namespace id is ' .. coreData.page[pid].namespace ..&lt;br /&gt;
							', and page does ' ..(not coreData.page[pid].exists and 'not ' or '') .. 'exist')&lt;br /&gt;
						if coreData.page[pid].namespace == nsid and not coreData.page[pid].exists and (nsid ~= 828 or coreData.page[pid].isDocPage) then&lt;br /&gt;
							if pid == 'gardeningCategory' and Classgenerator.globalConfig.gardeningSuperCategory and #Classgenerator.globalConfig.gardeningSuperCategory &amp;gt; 0 then&lt;br /&gt;
								-- we just iterated over the gardening category page (so this class has one) but we did not create it, yet)&lt;br /&gt;
								-- blindly try to create the gardening supercategory first, in case the class's gardening category is the gardening supercategory, we dont want the class specific content&lt;br /&gt;
								local content = '{{MediaWiki:Classengine-content-project-gardening-supercategory}}'&lt;br /&gt;
								_debug(self, 3, ' trying to autocreate garderning supercategory page &amp;quot;' .. Classgenerator.globalConfig.gardeningSuperCategory .. '&amp;quot; with # of content being ' .. #content)&lt;br /&gt;
								local ret = frame:callParserFunction{ name = '#createpageifnotex:Category:' .. Classgenerator.globalConfig.gardeningSuperCategory, args = { content } }&lt;br /&gt;
								if #ret &amp;gt; 0 then&lt;br /&gt;
									information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
								end&lt;br /&gt;
							end&lt;br /&gt;
							_debug(self, 3, ' trying to autocreate page &amp;quot;' .. coreData.page[pid].name .. '&amp;quot; with # of content being ' .. #coreData.page[pid].content)&lt;br /&gt;
							local ret = frame:callParserFunction{ name = '#createpageifnotex:' .. coreData.page[pid].name, args = { frame:preprocess(coreData.page[pid].content) } }&lt;br /&gt;
							if #ret &amp;gt; 0 then&lt;br /&gt;
								information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
							end&lt;br /&gt;
							if pid == 'form' and Classgenerator.globalConfig.formCategory and #Classgenerator.globalConfig.formCategory &amp;gt; 0 then&lt;br /&gt;
								-- we just iterated over the form page (so this class has one) and created it (yay). Now blindly create the formCategory as well...&lt;br /&gt;
								local content = '{{MediaWiki:Classengine-content-project-form-category}}'&lt;br /&gt;
								_debug(self, 3, ' trying to autocreate form category page &amp;quot;' .. Classgenerator.globalConfig.formCategory .. '&amp;quot; with # of content being ' .. #content)&lt;br /&gt;
								local ret = frame:callParserFunction{ name = '#createpageifnotex:Category:' .. Classgenerator.globalConfig.formCategory, args = { content } }&lt;br /&gt;
								if #ret &amp;gt; 0 then&lt;br /&gt;
									information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
								end&lt;br /&gt;
							elseif nsid ~= 828 and Classgenerator.globalConfig.moduleCategory and #Classgenerator.globalConfig.moduleCategory &amp;gt; 0 then&lt;br /&gt;
								-- we just iterated a module doc page (so this class has one) and created it (yay). Now blindly create the moduleCategory as well...&lt;br /&gt;
								local content = '{{MediaWiki:Classengine-content-project-module-category}}'&lt;br /&gt;
								_debug(self, 3, ' trying to autocreate module category page &amp;quot;' .. Classgenerator.globalConfig.moduleCategory .. '&amp;quot; with # of content being ' .. #content)&lt;br /&gt;
								local ret = frame:callParserFunction{ name = '#createpageifnotex:Category:' .. Classgenerator.globalConfig.moduleCategory, args = { content } }&lt;br /&gt;
								if #ret &amp;gt; 0 then&lt;br /&gt;
									information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
								end&lt;br /&gt;
							elseif pid == 'category' and Classgenerator.globalConfig.projectSuperCategory and #Classgenerator.globalConfig.projectSuperCategory &amp;gt; 0 then&lt;br /&gt;
								-- we just iterated over the category page (so this class has one) and created it (yay). Now blindly create the supercategory as well...&lt;br /&gt;
								local content = '{{MediaWiki:Classengine-content-project-supercategory}}'&lt;br /&gt;
								_debug(self, 3, ' trying to autocreate super category page &amp;quot;' .. Classgenerator.globalConfig.projectSuperCategory .. '&amp;quot; with # of content being ' .. #content)&lt;br /&gt;
								local ret = frame:callParserFunction{ name = '#createpageifnotex:Category:' .. Classgenerator.globalConfig.projectSuperCategory, args = { content } }&lt;br /&gt;
								if #ret &amp;gt; 0 then&lt;br /&gt;
									information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
								end&lt;br /&gt;
							elseif nsid == 10 and Classgenerator.globalConfig.templateCategory and #Classgenerator.globalConfig.templateCategory &amp;gt; 0 then&lt;br /&gt;
								-- we just iterated over a page in template namespace (so this class has one) and created it (yay). Now blindly create the templateCategory as well...&lt;br /&gt;
								local content = '{{MediaWiki:Classengine-content-project-template-category}}'&lt;br /&gt;
								_debug(self, 3, ' trying to autocreate template category page &amp;quot;' .. Classgenerator.globalConfig.templateCategory .. '&amp;quot; with # of content being ' .. #content)&lt;br /&gt;
								local ret = frame:callParserFunction{ name = '#createpageifnotex:Category:' .. Classgenerator.globalConfig.templateCategory, args = { content } }&lt;br /&gt;
								if #ret &amp;gt; 0 then&lt;br /&gt;
									information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
								end&lt;br /&gt;
							end&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
					if thisUsesSmw and (nsid == mw.title.new('NUL', 'Property').namespace) and coreData.properties.data then&lt;br /&gt;
						-- add here autocreation of properties&lt;br /&gt;
						for property, pdata in pairs(coreData.properties.data) do&lt;br /&gt;
							if not pdata.exists then&lt;br /&gt;
								local content = pdata.content&lt;br /&gt;
								_debug(self, 3, ' trying to autocreate property page &amp;quot;' .. property .. '&amp;quot; with # of content being ' .. #content)&lt;br /&gt;
								local ret = frame:callParserFunction{ name = '#createpageifnotex:Property:' .. property, args = { frame:preprocess(pdata.content) } }&lt;br /&gt;
								if #ret &amp;gt; 0 then&lt;br /&gt;
									information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
								end&lt;br /&gt;
							end&lt;br /&gt;
						end&lt;br /&gt;
						-- we just iterated over all missing property pages (so this class has some) and created them (yay). Now blindly create the propertyCategory as well...&lt;br /&gt;
						local content = '{{MediaWiki:Classengine-content-project-property-category}}'&lt;br /&gt;
						_debug(self, 3, ' trying to autocreate property category page &amp;quot;' .. Classgenerator.globalConfig.propertyCategory .. '&amp;quot; with # of content being ' .. #content)&lt;br /&gt;
						local ret = frame:callParserFunction{ name = '#createpageifnotex:Category:' .. Classgenerator.globalConfig.propertyCategory, args = { content } }&lt;br /&gt;
						if #ret &amp;gt; 0 then&lt;br /&gt;
							information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				-- create the tr for the ns&lt;br /&gt;
				actable:tag('tr')&lt;br /&gt;
					:tag('th')&lt;br /&gt;
						:css('text-align', 'left')&lt;br /&gt;
						:css('width', widthTh)&lt;br /&gt;
						:wikitext('Create ' .. ((nsid == 828 and 'module docs' or (ns == 'property' and 'properties' or (ns .. (ns == 'template' and 's' or '')))) .. ':'))&lt;br /&gt;
							-- note: nsid == mw.title.new('NUL', 'Property').namespace is necessary since canonicalname for property namespace does not translate uniquely over different languages :(&lt;br /&gt;
						:done()&lt;br /&gt;
						:newline()&lt;br /&gt;
					:tag('td')&lt;br /&gt;
						:cssText('color:black; vertical-align: middle; text-align: center; width:' .. widthTd)&lt;br /&gt;
						:css('background', (coreData.autocreate[ns] and coreData.autocreate[ns] &amp;gt; os.time() - _CFG.template.autoCreationTimeDiff) and '#90ff90' or '#FF9090' )&lt;br /&gt;
						:wikitext(frame:callParserFunction{name = '#autoedit', args={form='Classgenerator', target=self:getUid(),&lt;br /&gt;
							'link text=' .. (coreData.autocreate[ns] and 'Requested on ' .. os.date('%d.%m.%Y %X', coreData.autocreate[ns]) or 'Create automatically!')  .. &lt;br /&gt;
								(#information &amp;gt; 0 and ('Call returned ' .. information) or ''),&lt;br /&gt;
							'reload', summary=&amp;quot;Requesting the autocreation of &amp;quot; .. coreData.className .. ' for pages of type ' .. ns,&lt;br /&gt;
							'query string=Classgenerator[global_autocreate_' .. ns .. ']=' .. os.time()}&lt;br /&gt;
							})&lt;br /&gt;
						:done()&lt;br /&gt;
						:newline()&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
&lt;br /&gt;
			end&lt;br /&gt;
			if Classgenerator.myTableTools.size(missing) &amp;gt; 0 then&lt;br /&gt;
				-- show the all button&lt;br /&gt;
				local querystring = ''&lt;br /&gt;
				for _, nsid in pairs(missing) do&lt;br /&gt;
					local ns = mw.ustring.lower(_namespaceName(self, nsid))&lt;br /&gt;
					querystring = querystring .. 'Classgenerator[global_autocreate_' .. ns .. ']=' .. os.time() .. '&amp;amp;'&lt;br /&gt;
				end&lt;br /&gt;
				querystring = mw.ustring.sub(querystring, 1, -2)&lt;br /&gt;
				actable:tag('tr')&lt;br /&gt;
					:tag('th')&lt;br /&gt;
						:css('text-align', 'left')&lt;br /&gt;
						:css('width', widthTh)&lt;br /&gt;
						:wikitext('Create all pages:')&lt;br /&gt;
						:done()&lt;br /&gt;
						:newline()&lt;br /&gt;
					:tag('td')&lt;br /&gt;
						:cssText('background: #FF9090; color:black; vertical-align: middle; text-align: center; width:' .. widthTd)&lt;br /&gt;
						:wikitext(frame:callParserFunction{name = '#autoedit', args={form='Classgenerator', target=self:getUid(),&lt;br /&gt;
							'link text=Create automatically!', 'reload', summary=&amp;quot;Requesting the autocreation of all missing pages&amp;quot;, 'query string=' .. querystring }&lt;br /&gt;
							})&lt;br /&gt;
						:done()&lt;br /&gt;
						:newline()&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
				pageAutoCreation:wikitext('&amp;lt;b&amp;gt;Note:&amp;lt;/b&amp;gt; Creation of module pages is impossible due to an incompatibility issue.')&lt;br /&gt;
					:newline()&lt;br /&gt;
					:node(actable)&lt;br /&gt;
					:newline()&lt;br /&gt;
			else&lt;br /&gt;
				pageAutoCreation:wikitext('All pages present!')&lt;br /&gt;
					:newline()&lt;br /&gt;
					:tag('p')&lt;br /&gt;
						:wikitext('&amp;lt;small&amp;gt;&amp;lt;b&amp;gt;Note:&amp;lt;/b&amp;gt; Creation of module pages is impossible due to an incompatibility issue.&amp;lt;/small&amp;gt;')&lt;br /&gt;
						:newline()&lt;br /&gt;
						:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			pageAutoCreation:wikitext('Page autocreation is only possible if activated in your [[Module:Classgenerator/config]]-file (see template-section) and '&lt;br /&gt;
					.. 'Extension AutoCreatePage being installed.')&lt;br /&gt;
				:newline()&lt;br /&gt;
		end&lt;br /&gt;
		if cargoTableCreateLink then&lt;br /&gt;
			pageAutoCreation:wikitext('&amp;lt;b&amp;gt;Cargo data store:&amp;lt;/b&amp;gt;To (re-)create your cargo table, follow &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[' .. coreData.page.template.recreatedata .. ' this link]&amp;lt;/span&amp;gt; and then press ok!')&lt;br /&gt;
				:newline()&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		-- build the content collapses&lt;br /&gt;
		local collapse = require('Module:Collapse').main&lt;br /&gt;
		local bg_sets = { exist = {'#cfc', '#9c9'}, nonexist = {'#fcc', '#c99'} }&lt;br /&gt;
		local bg = 1&lt;br /&gt;
		local pageContent = mw.html.create('')&lt;br /&gt;
		for _, pid in pairs(coreData.page.order) do&lt;br /&gt;
			local content&lt;br /&gt;
			local bgs = coreData.page[pid].exists and bg_sets.exist or bg_sets.nonexist&lt;br /&gt;
			if coreData.page[pid].namespace == 828 and not coreData.page[pid].isDocPage then&lt;br /&gt;
				content = frame:expandTemplate{ title = 'Code', args = {lang = 'lua', code = coreData.page[pid].content, line = '1'}}&lt;br /&gt;
			else&lt;br /&gt;
				content = '&amp;lt;pre style=&amp;quot;white-space:-moz-pre-wrap; white-space:-pre-wrap; white-space:-o-pre-wrap; white-space:pre-wrap; word-wrap:break-word;&amp;quot;&amp;gt;' .. &lt;br /&gt;
					mw.text.nowiki(frame:preprocess(coreData.page[pid].content)) .. '&amp;lt;/pre&amp;gt;'&lt;br /&gt;
			end&lt;br /&gt;
			pageContent:wikitext(collapse({ header = 'Contents of &amp;lt;b&amp;gt;[[:' .. coreData.page[pid].name .. ']]&amp;lt;/b&amp;gt; ' ..&lt;br /&gt;
							'&amp;lt;span class=&amp;quot;plainlinks&amp;quot; style=&amp;quot;font-size:75%;&amp;quot;&amp;gt;&amp;amp;#91;[' .. coreData.page[pid].editlink ..&lt;br /&gt;
							' EDIT]&amp;amp;#93;&amp;lt;/span&amp;gt;',&lt;br /&gt;
						content = content, left = true, bg = bgs[bg]&lt;br /&gt;
					}))&lt;br /&gt;
				:newline()&lt;br /&gt;
			bg = (bg == 2 and 1 or 2)&lt;br /&gt;
		end&lt;br /&gt;
		if thisUsesSmw and coreData.properties.order then&lt;br /&gt;
			-- add here the collpases of the properties&lt;br /&gt;
			local message = mw.message.new('classengine-template-property-page')&lt;br /&gt;
			pageContent:tag('p')&lt;br /&gt;
				:wikitext('&amp;lt;h3&amp;gt;All property pages&amp;lt;/h3&amp;gt;')&lt;br /&gt;
				:done()&lt;br /&gt;
			for _, property in pairs(coreData.properties.order) do&lt;br /&gt;
				local bgs = coreData.page[property].exists and bg_sets.exist or bg_sets.nonexist&lt;br /&gt;
				local content = '&amp;lt;pre style=&amp;quot;white-space:-moz-pre-wrap; white-space:-pre-wrap; white-space:-o-pre-wrap; white-space:pre-wrap; word-wrap:break-word;&amp;quot;&amp;gt;' .. &lt;br /&gt;
					mw.text.nowiki(frame:preprocess(coreData.properties.data[property].content)) .. '&amp;lt;/pre&amp;gt;'&lt;br /&gt;
				pageContent:wikitext(collapse({ header = 'Contents of &amp;lt;b&amp;gt;[[:Property:' .. property .. ']]&amp;lt;/b&amp;gt; ' ..&lt;br /&gt;
								'&amp;lt;span class=&amp;quot;plainlinks&amp;quot; style=&amp;quot;font-size:75%;&amp;quot;&amp;gt;&amp;amp;#91;[' .. coreData.properties.data[property].editlink ..&lt;br /&gt;
								' EDIT]&amp;amp;#93;&amp;lt;/span&amp;gt;',&lt;br /&gt;
							content = content, left = true, bg = bgs[bg]&lt;br /&gt;
						}))&lt;br /&gt;
					:newline()&lt;br /&gt;
				bg = (bg == 2 and 1 or 2)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		local updateWarning = mw.html.create('')&lt;br /&gt;
		if coreData.now_timestamp - coreData.edit_timestamp &amp;lt; 2*60*60 then&lt;br /&gt;
			local mbox = require('Module:Message box')&lt;br /&gt;
			updateWarning:wikitext(mbox.main('ombox', { type='content', text = 'Note: You updated the class ' .. coreData.edit_time_before .. ' ago. Did you write your [[#Page contents|config file]] new? ' ..&lt;br /&gt;
						'Changes won\'t take effect unless you do!' .. ((thisUsesCargo and cargoTableCreateLink) and '&amp;lt;p&amp;gt;&amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;Also: If you changed your cargo table\'s declaration, [' .. &lt;br /&gt;
						coreData.page.template.editlink .. ' edit your template] and [[#Page autocreation|rebuild your cargo table]]!&amp;lt;/span&amp;gt;' or '')}))&lt;br /&gt;
				:newline()&lt;br /&gt;
		end&lt;br /&gt;
		local smwPropertyHint = mw.html.create('')&lt;br /&gt;
		if (FoundationClass.globalConfig.dataStore == 'both' or FoundationClass.globalConfig.dataStore == 'smw')&lt;br /&gt;
				and FoundationClass.myYesno(coreData.global_smwUseStorage)&lt;br /&gt;
				and not coreData.properties.order then&lt;br /&gt;
			local mbox = require('Module:Message box')&lt;br /&gt;
			smwPropertyHint:wikitext(mbox.main('ombox', { type='notice', text = 'Hint: If you use properties in your class, they will not display in &amp;lt;i&amp;gt;Page contents&amp;lt;/i&amp;gt;, nor be listed in &amp;lt;i&amp;gt;Page status&amp;lt;/i&amp;gt; or '&lt;br /&gt;
					.. 'autocreated in &amp;lt;i&amp;gt;Page autocreation&amp;lt;/i&amp;gt; unless you have your class and config page created!'}))&lt;br /&gt;
				:newline()&lt;br /&gt;
		end&lt;br /&gt;
		-- assemble everything&lt;br /&gt;
		local html = mw.html.create('')&lt;br /&gt;
		html:wikitext(coreData.global_description)&lt;br /&gt;
			:newline()&lt;br /&gt;
			:node(updateWarning)&lt;br /&gt;
			:node(smwPropertyHint)&lt;br /&gt;
			:node(manual)&lt;br /&gt;
			:newline()&lt;br /&gt;
			:node(datastore)&lt;br /&gt;
			:wikitext('&amp;lt;h2&amp;gt;Page status&amp;lt;/h2&amp;gt;')&lt;br /&gt;
			:newline()&lt;br /&gt;
			:wikitext(autoCreation and 'This status may be inaccurate, if you just created pages. In that case, run jobs and clear cache of this page.' or '')&lt;br /&gt;
			:node(statusTable)&lt;br /&gt;
			:newline()&lt;br /&gt;
			:node(pageAutoCreation)&lt;br /&gt;
			:wikitext('&amp;lt;h2&amp;gt;Page contents&amp;lt;/h2&amp;gt;')&lt;br /&gt;
			:newline()&lt;br /&gt;
			:node(pageContent)&lt;br /&gt;
			:newline()&lt;br /&gt;
			:done()&lt;br /&gt;
		local debugLevel = FoundationClass.globalConfig.debugLevel or _CFG.global.debugLevel&lt;br /&gt;
		if debugLevel then&lt;br /&gt;
			html:tag('pre')&lt;br /&gt;
--				:wikitext(FoundationClass.myTableTools.printTable(coreData))&lt;br /&gt;
--				:wikitext(FoundationClass.myTableTools.printTable(thisClass:smwProperty2ParameterTranslationTable()))&lt;br /&gt;
				:wikitext(ClassDebug:printLog(debugLevel))&lt;br /&gt;
				:done()&lt;br /&gt;
		end&lt;br /&gt;
		self:addOutput(html)&lt;br /&gt;
&lt;br /&gt;
		return true&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Classgenerator:myArgumentProcessing(coreData)&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator:myArgumentProcessing(args) to process coreData, from ' .. tostring(self))&lt;br /&gt;
	-- function that performs some individual transformation args --&amp;amp;amp;gt; coreData&lt;br /&gt;
	local _CFG = self.class.myConfiguration&lt;br /&gt;
	local coreData = coreData&lt;br /&gt;
	local lang = mw.language.new('en')&lt;br /&gt;
	coreData.className = lang:ucfirst(mw.text.trim(mw.ustring.gsub(self:getUid(), ':', '')))&lt;br /&gt;
	coreData.edit_timestamp = lang:formatDate('U', coreData.global_edit_timestamp)&lt;br /&gt;
	coreData.now_timestamp = lang:formatDate('U') + 60*60&lt;br /&gt;
	coreData.edit_time_before = lang:formatDuration(coreData.now_timestamp-coreData.edit_timestamp)&lt;br /&gt;
	coreData.last_edited = lang:formatDate('d.m.Y H:i:s', coreData.global_edit_timestamp)&lt;br /&gt;
	if coreData.global_gardeningCategory_chooser and mw.ustring.lower(coreData.global_gardeningCategory_chooser) == 'global' then&lt;br /&gt;
		coreData.global_gardeningCategory = 'superglobal.gardeningCategory'&lt;br /&gt;
	end&lt;br /&gt;
	if mw.ustring.find(coreData.className, ' ', 1, true) then&lt;br /&gt;
		local tmp = ''&lt;br /&gt;
		for fragment in mw.text.gsplit(coreData.className, ' ', true) do&lt;br /&gt;
			tmp = tmp .. lang:ucfirst(fragment)&lt;br /&gt;
		end&lt;br /&gt;
		coreData.className = tmp&lt;br /&gt;
	end&lt;br /&gt;
	if coreData.global_cargoTable then&lt;br /&gt;
		coreData.global_cargoTable = mw.ustring.gsub(mw.ustring.lower(coreData.global_cargoTable), ' ', '_')&lt;br /&gt;
	end&lt;br /&gt;
	if coreData.form_createInfotext and #coreData.form_createInfotext &amp;gt; 0 and mw.ustring.sub(coreData.form_createInfotext, -1) ~= ' ' then&lt;br /&gt;
		coreData.form_createInfotext = coreData.form_createInfotext .. ' '&lt;br /&gt;
	end&lt;br /&gt;
	local parameter_parameter&lt;br /&gt;
	local fieldOrder&lt;br /&gt;
	if coreData.parameter_parameter then&lt;br /&gt;
		parameters = ''&lt;br /&gt;
		fieldOrder = {}&lt;br /&gt;
		local classGenParamConfig = mw.loadData('Module:Classgenerator/parameter/config')&lt;br /&gt;
		for result in mw.text.gsplit(coreData.parameter_parameter, classGenParamConfig.template.delimiterResult, true) do&lt;br /&gt;
			local fieldname, parameter = mw.ustring.match(result, '^([^#]*)' .. classGenParamConfig.template.delimiterFormFieldName .. '(.+)$')&lt;br /&gt;
			if fieldname and mw.ustring.len(mw.text.trim(fieldname)) &amp;gt; 0 then&lt;br /&gt;
				table.insert(fieldOrder, mw.text.trim(fieldname))&lt;br /&gt;
			end&lt;br /&gt;
			if parameter and mw.ustring.len(parameter) &amp;gt; 0 then&lt;br /&gt;
				parameters = parameters .. parameter&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	coreData.parameter_parameter = parameters&lt;br /&gt;
	coreData.form_enable = FoundationClass.myYesno(coreData.form_enable)&lt;br /&gt;
	if coreData.form_enable then&lt;br /&gt;
		coreData.form_fieldOrder = fieldOrder&lt;br /&gt;
		form_buttons = { 'save' }&lt;br /&gt;
		if coreData.form_buttons and #coreData.form_buttons &amp;gt; 0 then&lt;br /&gt;
			for _, button in pairs(coreData.form_buttons) do&lt;br /&gt;
				table.insert(form_buttons, button)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		table.insert(form_buttons, 'cancel')&lt;br /&gt;
	end&lt;br /&gt;
	coreData.form_buttons = form_buttons&lt;br /&gt;
	-- here build the class config&lt;br /&gt;
	local contentClassConfig = mw.ustring.gsub(_CFG.template.configIntro, _CFG.template.placeHolderClassName, coreData.className) ..&lt;br /&gt;
		'local global = {\n' ..&lt;br /&gt;
		'\tdebugLevel = false,'&lt;br /&gt;
	if self.class.myConfiguration.template.addCommentsToConfig then&lt;br /&gt;
		contentClassConfig = contentClassConfig .. '\t-- set this to the level you wish to display at render. false if disabled. this is a class based setting. ' ..&lt;br /&gt;
			'you can set this globally at Foundationclass/globalconfig, causing all child classes to debug.'&lt;br /&gt;
	end&lt;br /&gt;
	contentClassConfig = contentClassConfig .. '\n'&lt;br /&gt;
	-- calculate the fieldlists:&lt;br /&gt;
	local fieldlists = {}&lt;br /&gt;
	for _, field in pairs(_CFG.form.fieldOrder) do&lt;br /&gt;
		local tab = mw.ustring.match(field, '^([a-z]+)_.+')&lt;br /&gt;
		if not fieldlists[tab] then&lt;br /&gt;
			fieldlists[tab] = {}&lt;br /&gt;
		end&lt;br /&gt;
		table.insert(fieldlists[tab], field)&lt;br /&gt;
	end&lt;br /&gt;
	local omissionList = {'global_autocreate_module', 'global_autocreate_template', 'global_autocreate_form', 'global_autocreate_category', 'global_autocreate_property', 'global_edit_timestamp', 'global_gardeningCategory_chooser',&lt;br /&gt;
		'form_textareaAttributes_cols', 'form_textareaAttributes_rows', 'form_textareaAttributes_autogrow', 'form_textareaAttributes_editor', 'form_createLinkInfo', &lt;br /&gt;
		'global_customization', 'form_customization', 'template_customization' }&lt;br /&gt;
	for _, attr in pairs(fieldlists.global) do&lt;br /&gt;
		if not Classgenerator.myTableTools.inTable(omissionList, attr) and self.class.myConfiguration.parameter[attr] then&lt;br /&gt;
			contentClassConfig = contentClassConfig .. _processAttribute(self, attr, '\t')&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if coreData.global_customization then&lt;br /&gt;
		for line in mw.text.gsplit(coreData.global_customization, '\n', true) do&lt;br /&gt;
			contentClassConfig = contentClassConfig .. '\t' .. line .. '\n'&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	contentClassConfig = contentClassConfig .. '}\n\nlocal form = {\n'&lt;br /&gt;
	for _, attr in pairs(fieldlists.form) do&lt;br /&gt;
		if not Classgenerator.myTableTools.inTable(omissionList, attr) and self.class.myConfiguration.parameter[attr] then&lt;br /&gt;
			contentClassConfig = contentClassConfig .. _processAttribute(self, attr, '\t')&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	contentClassConfig = contentClassConfig .. '\ttextareaAttributes = {	-- the defaults for your textarea fields\n'&lt;br /&gt;
	for _, attr in pairs({'form_textareaAttributes_cols', 'form_textareaAttributes_rows', 'form_textareaAttributes_autogrow', 'form_textareaAttributes_editor'}) do&lt;br /&gt;
		local name = mw.ustring.match(attr, '^form_textareaAttributes_(.+)$')&lt;br /&gt;
		contentClassConfig = contentClassConfig .. _processAttribute(self, attr, '\t\t', name)&lt;br /&gt;
	end&lt;br /&gt;
	contentClassConfig = contentClassConfig .. '\t},\n'&lt;br /&gt;
	contentClassConfig = contentClassConfig .. _processAttribute(self, 'form_fieldOrder', '\t')&lt;br /&gt;
	if coreData.form_customization then&lt;br /&gt;
		for line in mw.text.gsplit(coreData.form_customization, '\n', true) do&lt;br /&gt;
			contentClassConfig = contentClassConfig .. '\t' .. line .. '\n'&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	contentClassConfig = contentClassConfig .. '}\n\nlocal template = {\n'&lt;br /&gt;
	for _, attr in pairs(fieldlists.template) do&lt;br /&gt;
		if not Classgenerator.myTableTools.inTable(omissionList, attr) and self.class.myConfiguration.parameter[attr] then&lt;br /&gt;
			contentClassConfig = contentClassConfig .. _processAttribute(self, attr, '\t')&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if coreData.template_customization then&lt;br /&gt;
		for line in mw.text.gsplit(coreData.template_customization, '\n', true) do&lt;br /&gt;
			contentClassConfig = contentClassConfig .. '\t' .. mw.text.trim(line) .. '\n'&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	contentClassConfig = contentClassConfig .. '}\n\nlocal parameter = {\n' .. coreData.parameter_parameter .. '}\n\n' ..&lt;br /&gt;
		'return {\n' ..&lt;br /&gt;
		'\tform = form,\n' ..&lt;br /&gt;
		'\tglobal = global,\n' ..&lt;br /&gt;
		'\tparameter = parameter,\n' ..&lt;br /&gt;
		'\ttemplate = template,\n}\n'&lt;br /&gt;
	local classCategory = Classgenerator.globalConfig.classCategory or 'none'&lt;br /&gt;
	local formCategory = Classgenerator.globalConfig.formCategory or 'none'&lt;br /&gt;
	local gardeningCategory = Classgenerator.globalConfig.gardeningSuperCategory or 'none'&lt;br /&gt;
	local moduleCategory = Classgenerator.globalConfig.moduleCategory or 'none'&lt;br /&gt;
	local propertyCategory = Classgenerator.globalConfig.propertyCategory or 'none'&lt;br /&gt;
	local superCategory = Classgenerator.globalConfig.projectSuperCategory or 'none'&lt;br /&gt;
	local templateCategory = Classgenerator.globalConfig.templateCategory or 'none'&lt;br /&gt;
	local page = {}&lt;br /&gt;
	page.order = {'base', 'baseDoc', 'class', 'classDoc', 'config', 'configDoc', 'template', 'templateDoc'}&lt;br /&gt;
	page.base = {&lt;br /&gt;
		name = 'Module:' .. _private[self].pagename,&lt;br /&gt;
		content = mw.message.new('classengine-template-module-page'):rawParams(_private[self].pagename):plain()&lt;br /&gt;
	}&lt;br /&gt;
	page.baseDoc = {&lt;br /&gt;
		name = 'Module:' .. _private[self].pagename .. '/doc',&lt;br /&gt;
		content = mw.message.new('classengine-template-module-documentation-page'):rawParams(_private[self].pagename, moduleCategory):plain()&lt;br /&gt;
	}&lt;br /&gt;
	page.class = {&lt;br /&gt;
		name = 'Module:' .. _private[self].pagename .. '/class',&lt;br /&gt;
		content = mw.message.new('classengine-template-module-class-page'):rawParams(_private[self].pagename, coreData.className):plain()&lt;br /&gt;
	}&lt;br /&gt;
	page.classDoc = {&lt;br /&gt;
		name = 'Module:' .. _private[self].pagename .. '/class/doc',&lt;br /&gt;
		content = mw.message.new('classengine-template-module-class-documentation-page'):rawParams(_private[self].pagename, coreData.className, moduleCategory, classCategory):plain()&lt;br /&gt;
	}&lt;br /&gt;
	page.config = {&lt;br /&gt;
		name = 'Module:' .. _private[self].pagename .. '/config',&lt;br /&gt;
		content = contentClassConfig,&lt;br /&gt;
	}&lt;br /&gt;
	page.configDoc = {&lt;br /&gt;
		name = 'Module:' .. _private[self].pagename .. '/config/doc',&lt;br /&gt;
		content = mw.message.new('classengine-template-module-config-documentation-page'):rawParams(_private[self].pagename, moduleCategory, classCategory):plain()&lt;br /&gt;
	}&lt;br /&gt;
	page.template = {&lt;br /&gt;
		name = 'Template:' .. coreData.template_name,&lt;br /&gt;
		content = mw.message.new('classengine-template-template-page'):rawParams(_private[self].pagename):plain()&lt;br /&gt;
	}&lt;br /&gt;
	page.templateDoc = {&lt;br /&gt;
		name = 'Template:' .. coreData.template_name .. '/doc',&lt;br /&gt;
		content = mw.message.new('classengine-template-template-documentation-page'):rawParams(_private[self].pagename, templateCategory):plain()&lt;br /&gt;
	}&lt;br /&gt;
	if coreData.form_name and #coreData.form_name &amp;gt; 0 then&lt;br /&gt;
		table.insert(page.order, 'form')&lt;br /&gt;
		page.form = {&lt;br /&gt;
			name = 'Form:' .. coreData.form_name,&lt;br /&gt;
			content = mw.message.new('classengine-template-form-page'):rawParams(_private[self].pagename, formCategory):plain()&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
	if coreData.global_category and #coreData.global_category&amp;gt; 0 then&lt;br /&gt;
		table.insert(page.order, 'category')&lt;br /&gt;
		page.category = {&lt;br /&gt;
			name = 'Category:' .. coreData.global_category,&lt;br /&gt;
			content = mw.message.new('classengine-template-category-page'):rawParams(_private[self].pagename, superCategory):plain()&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
	if coreData.global_gardeningCategory and #coreData.global_gardeningCategory &amp;gt; 0 then&lt;br /&gt;
		table.insert(page.order, 'gardeningCategory')&lt;br /&gt;
		local pagename = coreData.global_gardeningCategory&lt;br /&gt;
		if pagename == 'superglobal.gardeningCategory' then&lt;br /&gt;
			pagename = FoundationClass.globalConfig.gardeningCategory&lt;br /&gt;
		end&lt;br /&gt;
		page.gardeningCategory = {&lt;br /&gt;
			name = 'Category:' .. pagename,&lt;br /&gt;
			content = mw.message.new('classengine-template-gardeningcategory-page'):rawParams(_private[self].pagename, gardeningCategory):plain()&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
	for _, pid in pairs(page.order) do&lt;br /&gt;
		local obj = mw.title.new(page[pid].name)&lt;br /&gt;
		page[pid].exists = obj.exists&lt;br /&gt;
		page[pid].namespace = obj.namespace&lt;br /&gt;
		page[pid].editlink = obj:fullUrl{action='edit'}&lt;br /&gt;
		if pid == 'template' then&lt;br /&gt;
			page[pid].recreatedata = obj:fullUrl{action='recreatedata'}&lt;br /&gt;
		end&lt;br /&gt;
		page[pid].isDocPage = (mw.ustring.sub(page[pid].name, -4) == '/doc')&lt;br /&gt;
		if page[pid].isDocPage then&lt;br /&gt;
			page[pid].content = page[pid].content .. '&amp;lt;h2&amp;gt;Maintenanace notes&amp;lt;/h2&amp;gt;\n' ..&lt;br /&gt;
				'This page was created by [[Module:Classgenerator]] and belongs to [[' .. self:getUid() .. ']].\n'&lt;br /&gt;
			if pid == 'configDoc' then&lt;br /&gt;
				page[pid].content = page[pid].content .. '\n{{((}}ombox| type=content | text = It is strongly advised, to not edit this page but to use [' ..&lt;br /&gt;
				'https://{{((}}SERVERNAME{{))}}{{((}}SCRIPTPATH{{))}}/Special:FormEdit/Classgenerator/' .. mw.uri.encode(self:getUid(), &amp;quot;PATH&amp;quot;) .. ' ' .. &lt;br /&gt;
					'the Classgenerator form] instead! After that, use your new configuration to replace the contents of this page.{{))}}'&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	local thisClass&lt;br /&gt;
	local thisConfig&lt;br /&gt;
	if page.class.exists and page.config.exists then&lt;br /&gt;
		thisClass = require(page.class.name)&lt;br /&gt;
		thisConfig = require(page.config.name)&lt;br /&gt;
	end&lt;br /&gt;
	if page.form and (not coreData.form_typeCreateLink or coreData.form_typeCreateLink ~= 'forminput') and coreData.form_createLinkPageName and mw.ustring.len(coreData.form_createLinkPageName) &amp;gt; 0 then&lt;br /&gt;
		local pageName = coreData.form_createLinkPageName&lt;br /&gt;
		if coreData.global_namespace and mw.ustring.len(coreData.global_namespace) &amp;gt; 0 and not mw.ustring.match(pageName, '^' .. coreData.global_namespace .. ':.+$') then&lt;br /&gt;
			pageName = coreData.global_namespace .. ':' .. pageName&lt;br /&gt;
		end&lt;br /&gt;
		local infostr = '{{((}}{info|page name=' .. pageName .. '|add title=' .. (coreData.form_labelCreate or 'create entity') .. '|edit title=' .. (coreData.form_labelEdit or 'edit entity') .. '}{{))}}'&lt;br /&gt;
		page.form.content = page.form.content .. '&amp;lt;!{{#invoke:String|rep|-|2}} this is a workaround, needed because of a SF bug: ' .. infostr ..&lt;br /&gt;
			'. see https://phabricator.wikimedia.org/T123230 for more information {{#invoke:String|rep|-|2}}&amp;gt;'&lt;br /&gt;
	end&lt;br /&gt;
	coreData.page = page&lt;br /&gt;
	local autocreate = {}&lt;br /&gt;
	autocreate.module = FoundationClass.myYesno(coreData.global_autocreate_module, tonumber(coreData.global_autocreate_module))&lt;br /&gt;
	autocreate.template = FoundationClass.myYesno(coreData.global_autocreate_template, tonumber(coreData.global_autocreate_template))&lt;br /&gt;
	autocreate.form = coreData.form_name and FoundationClass.myYesno(coreData.global_autocreate_form, tonumber(coreData.global_autocreate_form))&lt;br /&gt;
	autocreate.category = (coreData.global_category or coreData.global_gardeningCategory) and FoundationClass.myYesno(coreData.global_autocreate_category, tonumber(coreData.global_autocreate_category))&lt;br /&gt;
	if (FoundationClass.globalConfig.dataStore == 'both' or FoundationClass.globalConfig.dataStore == 'smw') and FoundationClass.myYesno(coreData.global_smwUseStorage) then&lt;br /&gt;
		local propertyNSName = _namespaceName(self, mw.title.new('NUL', 'Property').namespace)&lt;br /&gt;
		autocreate[propertyNSName] = FoundationClass.myYesno(coreData['global_autocreate_' .. propertyNSName], tonumber(coreData['global_autocreate_' .. propertyNSName]))&lt;br /&gt;
	end&lt;br /&gt;
	coreData.autocreate = autocreate&lt;br /&gt;
	local propertyData&lt;br /&gt;
	local propertyOrder&lt;br /&gt;
	if (FoundationClass.globalConfig.dataStore == 'both' or FoundationClass.globalConfig.dataStore == 'smw') and FoundationClass.myYesno(coreData.global_smwUseStorage) and thisClass and thisConfig then&lt;br /&gt;
		-- we use smw and class and config are created and accessible. we can get property information and prepare data&lt;br /&gt;
		local matrix = thisClass:smwGetProperty2ParameterTranslationTable()&lt;br /&gt;
		propertyData = {}&lt;br /&gt;
		propertyOrder = {}&lt;br /&gt;
		for property, parameter in pairs(matrix) do&lt;br /&gt;
			table.insert(propertyOrder, property)&lt;br /&gt;
			local obj = mw.title.new(property, 'Property')&lt;br /&gt;
			propertyData[property] = { &lt;br /&gt;
				editlink = obj:fullUrl{action='edit'},&lt;br /&gt;
				exists = obj.exists,&lt;br /&gt;
				parameter = parameter,&lt;br /&gt;
			}&lt;br /&gt;
			if thisConfig.parameter[parameter] then&lt;br /&gt;
				propertyData[property].description = thisConfig.parameter[parameter].description&lt;br /&gt;
				propertyData[property].type = thisConfig.parameter[parameter].property_type&lt;br /&gt;
				propertyData[property].values = thisConfig.parameter[parameter].values&lt;br /&gt;
			elseif parameter == FoundationClass.globalConfig.smwClassProperty then&lt;br /&gt;
				propertyData[property].description = 'Automatisch hinzugefügt! Wird verwendet, um Mitglieder dieser Klasse zu finden (funktioniert auch, ohne dass eine Kategorie definiert wird und auch fur subobjects)'&lt;br /&gt;
				propertyData[property].type = 'Text'&lt;br /&gt;
			elseif parameter == FoundationClass.globalConfig.uidFieldName then&lt;br /&gt;
				propertyData[property].description = 'Automatisch hinzugefügt! Wird verwendet, um individuelle Objekte innerhalb der Klasse zu identifizieren.'&lt;br /&gt;
				propertyData[property].type = 'Text'&lt;br /&gt;
			end&lt;br /&gt;
			local values = ''&lt;br /&gt;
			if propertyData[property].values then&lt;br /&gt;
				values = values .. 'The allowed values are:'&lt;br /&gt;
				for _, value in pairs(propertyData[property].values) do&lt;br /&gt;
					values = values .. '\n* [[Allows value::' .. value .. ']]'&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				values = 'No restriction given'&lt;br /&gt;
			end&lt;br /&gt;
			propertyData[property].content = mw.message.new('classengine-template-property-page'):rawParams(propertyData[property].description, propertyData[property].type, values, propertyCategory):plain()&lt;br /&gt;
		end&lt;br /&gt;
		table.sort(propertyOrder)&lt;br /&gt;
	end&lt;br /&gt;
	coreData.properties = { data = propertyData, order = propertyOrder }&lt;br /&gt;
	return coreData	-- this is your new coreData.&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Classgenerator:myPlausibilityTest(args)&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator:myPlausibilityTest(args) to test arguments, from ' .. tostring(self))&lt;br /&gt;
	-- function that performs the individual plausibility tests&lt;br /&gt;
	-- note: before you access a field args.fieldname you should check for existance&lt;br /&gt;
	-- self:addError(text)&lt;br /&gt;
	return false	-- return value will be ignored. but if you add any error, the object's initialization will fail with the error&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Classgenerator:myStashAdjustments(stash)&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator:myStashAdjustments(stash) to do some minor adjustments on data before storing, from ' .. tostring(self))&lt;br /&gt;
	-- function that alters the stash before storing the data&lt;br /&gt;
	local stash = stash&lt;br /&gt;
	return stash	-- this is your new stash. this will be stored. it has format (fieldname: value)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Classgenerator:method()&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator:method() to do something, from ' .. tostring(self))&lt;br /&gt;
	return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return Classgenerator&lt;/div&gt;</summary>
		<author><name>Anatol</name></author>
	</entry>
	<entry>
		<id>https://camnet.oetterer.eu/index.php?title=Modul:Classgenerator/parameter/class&amp;diff=1027</id>
		<title>Modul:Classgenerator/parameter/class</title>
		<link rel="alternate" type="text/html" href="https://camnet.oetterer.eu/index.php?title=Modul:Classgenerator/parameter/class&amp;diff=1027"/>
		<updated>2016-02-10T11:45:03Z</updated>

		<summary type="html">&lt;p&gt;Anatol: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local FoundationClass = require('Module:Foundationclass')&lt;br /&gt;
local ClassDebug = require('Module:Debug/class')&lt;br /&gt;
&lt;br /&gt;
-- ****************************************************************&lt;br /&gt;
-- *                         inheritance                          *&lt;br /&gt;
-- ****************************************************************&lt;br /&gt;
local ClassgeneratorParameter = FoundationClass:subclass('ClassgeneratorParameter')&lt;br /&gt;
-- setting class's configuration data&lt;br /&gt;
ClassgeneratorParameter.static.myConfiguration = mw.loadData('Module:Classgenerator/parameter/config')&lt;br /&gt;
ClassgeneratorParameter.static.SFfieldConfig = mw.loadData('Module:SFfield/config')&lt;br /&gt;
--ClassgeneratorParameter.static.myConfiguration = require('Module:Classgenerator/parameter/config')&lt;br /&gt;
--local SFfieldConfig = mw.loadData('Module:SFfield/config')&lt;br /&gt;
--ClassgeneratorParameter.static.myConfiguration.parameter.input_type.values = SFfieldConfig.validInputTypes	-- cant load a table from another config in my config. therefor this&lt;br /&gt;
--ClassgeneratorParameter.static.myConfiguration.parameter.base_type.values = SFfieldConfig.validInputTypes	-- cant load a table from another config in my config. therefor this&lt;br /&gt;
--   being in a static method, use self.myConfiguration&lt;br /&gt;
--   being in a private method, that knows self or in a public method, use self.class.myConfiguration&lt;br /&gt;
&lt;br /&gt;
-- ****************************************************************&lt;br /&gt;
-- *                          properties                          *&lt;br /&gt;
-- ****************************************************************&lt;br /&gt;
&lt;br /&gt;
-- **************** initialization of table for private properties&lt;br /&gt;
local _private = setmetatable({}, {__mode = 'k'})   -- weak table storing all private attributes&lt;br /&gt;
&lt;br /&gt;
-- **************** declaration of public static properties&lt;br /&gt;
-- ClassgeneratorParameter.static.myPropertyModule = require('Module:extern')&lt;br /&gt;
-- ClassgeneratorParameter.static.staticProperty = ' '&lt;br /&gt;
&lt;br /&gt;
-- remember the static classes provided by Foundationclass:&lt;br /&gt;
-- ClassgeneratorParameter.globalConfig&lt;br /&gt;
-- ClassgeneratorParameter.myCargoUtil&lt;br /&gt;
-- ClassgeneratorParameter.myTableTools&lt;br /&gt;
&lt;br /&gt;
-- **************** declaration of (global) private properties&lt;br /&gt;
-- for properties you should rather use constructor and _private[self]. this only, if you need a private class property&lt;br /&gt;
-- you should, however predeclare private methods here&lt;br /&gt;
local _debug	-- private method declared later&lt;br /&gt;
local _privateMethodAhead	-- declaration ahead, so this private method can be used in the constructor and in other private methods&lt;br /&gt;
&lt;br /&gt;
-- ***************************************************************&lt;br /&gt;
-- *                           methods                           *&lt;br /&gt;
-- ***************************************************************&lt;br /&gt;
 &lt;br /&gt;
-- **************** declaration of static methods&lt;br /&gt;
function ClassgeneratorParameter:initialize(uid)&lt;br /&gt;
	local _CFG = self.class.myConfiguration&lt;br /&gt;
	FoundationClass.initialize(self, uid)&lt;br /&gt;
	_private[self] = {&lt;br /&gt;
		dbg = ClassDebug:new(tostring(self.class) .. ': id ' .. uid),&lt;br /&gt;
	}&lt;br /&gt;
	_debug(self, 1, ' ClassgeneratorParameter: done initializing object &amp;amp;quot;' .. uid ..'&amp;amp;quot;, from ' .. tostring(self))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- use use self.myConfiguration to access your configuration in a static method&lt;br /&gt;
function ClassgeneratorParameter.static:aStaticMethod(var)&lt;br /&gt;
	_debug(self, 1, 'entering ClassgeneratorParameter.static:aStaticMethod() to do something, from ' .. tostring(self))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function ClassgeneratorParameter.static:mySfDynamicFieldAttribute(fieldname, attribute, value)&lt;br /&gt;
	_debug(self, 1, 'entering ClassgeneratorParameter.static:mySfDynamicFieldAttribute(fieldname, attribute, value), from ' .. tostring(self))&lt;br /&gt;
	_debug(self, 2, ' with parameters &amp;amp;quot;' .. fieldname .. '&amp;amp;quot;, &amp;amp;quot;' .. attribute .. '&amp;amp;quot; and a ' .. type(value) .. ' value')&lt;br /&gt;
	-- function that can process any attribute/value pair just before rendering the semantic forms field&lt;br /&gt;
	-- usually done, to generate a dynamic 'default' value&lt;br /&gt;
	-- keep in mind: you can completely disable a form field, if you return true on attribute &amp;quot;disable&amp;quot;. note however, that this causes the field to not show at all, no data will be transported/saved&lt;br /&gt;
	local val = value&lt;br /&gt;
	if FoundationClass.globalConfig.dataStore ~= 'cargo' and FoundationClass.globalConfig.dataStore ~= 'both' then&lt;br /&gt;
		-- disable all cargo fields&lt;br /&gt;
		if fieldname == 'cargo' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
		if fieldname == 'cargo_hidden' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
		if fieldname == 'cargo_size' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
		if fieldname == 'cargo_type' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
		if fieldname == 'add_cargo_table_and_field' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
		if fieldname == 'mapping_cargo_field' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
		if fieldname == 'mapping_cargo_table' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if FoundationClass.globalConfig.dataStore ~= 'smw' and FoundationClass.globalConfig.dataStore ~= 'both' then&lt;br /&gt;
		-- disable all smw fields&lt;br /&gt;
		if fieldname == 'property' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
		if fieldname == 'property_name' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
		if fieldname == 'property_type' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
		if fieldname == 'unique_for_concept' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
		if fieldname == 'mapping_property' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
		if fieldname == 'values_from_concept' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if fieldname == 'property_name' and attribute == 'values_from_namespace' then&lt;br /&gt;
		local ret, nulProperty = pcall(mw.title.new, 'NUL', 'Property')&lt;br /&gt;
		val = ret and mw.site.namespaces[nulProperty.namespace].name or 'NUL'&lt;br /&gt;
	end&lt;br /&gt;
	if fieldname == 'property_type' and attribute == 'values' then&lt;br /&gt;
		val = FoundationClass.globalConfig.smwPropertyTypesAvailable&lt;br /&gt;
	end&lt;br /&gt;
	if fieldname == 'input_type' and attribute == 'show_on_select' then&lt;br /&gt;
		-- build input type's show on select from SFfieldConfig.validAttributesPerType, except remove values and replace all spaces in attribte names by an underscore&lt;br /&gt;
		--val = mw.clone(ClassgeneratorParameter.SFfieldConfig.validAttributesPerType)&lt;br /&gt;
		--val = ClassgeneratorParameter.myTableTools.shallowClone(ClassgeneratorParameter.SFfieldConfig.validAttributesPerType)&lt;br /&gt;
		val = {}&lt;br /&gt;
		for param, attrlist in pairs(ClassgeneratorParameter.SFfieldConfig.validAttributesPerType) do&lt;br /&gt;
			if not val[param] then&lt;br /&gt;
				val[param] = {}&lt;br /&gt;
			end&lt;br /&gt;
			for k, attr in pairs(attrlist) do&lt;br /&gt;
				if attr ~= 'values' then&lt;br /&gt;
					val[param][k] = mw.ustring.gsub(attr, ' ', '_')&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		_debug(self, 2, ' calculated this monster: &amp;lt;pre&amp;gt;' .. ClassgeneratorParameter.myTableTools.printTable(val) .. '&amp;lt;/pre&amp;gt;')&lt;br /&gt;
	end&lt;br /&gt;
	if fieldname == 'input_type' and attribute == 'values' then&lt;br /&gt;
		return ClassgeneratorParameter.SFfieldConfig.validInputTypes&lt;br /&gt;
	end&lt;br /&gt;
	if fieldname == 'base_type' and attribute == 'values' then&lt;br /&gt;
		return ClassgeneratorParameter.SFfieldConfig.validInputTypes&lt;br /&gt;
	end&lt;br /&gt;
	if fieldname == 'uploadable' and attribute == 'show_on_select' then&lt;br /&gt;
		val = {}&lt;br /&gt;
		val['true'] = {'default_filename', 'image_preview'}&lt;br /&gt;
	end&lt;br /&gt;
	_debug(self, 3, '  returning ' .. (type(val) == 'boolean' and (val and 'true' or 'false') or type(val)))&lt;br /&gt;
	return val	-- this value will be used as new value for field's attribute&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function ClassgeneratorParameter.static:sfGenerateForm(embedIn)&lt;br /&gt;
	_debug(self, 1, 'entering ClassgeneratorParameter.static:sfGenerateForm()')&lt;br /&gt;
	local _CFG = self.myConfiguration&lt;br /&gt;
	local embedIn = embedIn or 'Classgenerator[parameter_parameter]'&lt;br /&gt;
	local tagStart = '{{{'&lt;br /&gt;
	local tagEnd = '}}}'&lt;br /&gt;
	-- create the table&lt;br /&gt;
	-- start the html object&lt;br /&gt;
	html = mw.html.create('')&lt;br /&gt;
	html:wikitext(tagStart .. 'for template|' .. _CFG.template.name .. '|label=' .. _CFG.global.entityTitle ..&lt;br /&gt;
		'|embed in field=' .. embedIn .. '|multiple|add button text=' .. _CFG.form.labelCreate .. '|minimum instances=1' .. tagEnd)&lt;br /&gt;
		:node(self:sfGenerateFormTable(self.myConfiguration.form.fieldOrderGeneral))&lt;br /&gt;
		:newline()&lt;br /&gt;
		:wikitext(':')&lt;br /&gt;
		:node(self:sfGenerateFormTable(self.myConfiguration.form.fieldOrderSFgeneral, 'row_parameter'))&lt;br /&gt;
		:newline()&lt;br /&gt;
		:wikitext('::')&lt;br /&gt;
		:node(self:sfGenerateFormTable(self.myConfiguration.form.fieldOrderSFtypeDependent))&lt;br /&gt;
		:wikitext(tagStart .. 'end template' .. tagEnd)&lt;br /&gt;
		:newline()&lt;br /&gt;
	return tostring(html)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- **************** declaration of private methods&lt;br /&gt;
-- use self.class.myConfiguration to access your configuration in a public or a private method that is called by a public method&lt;br /&gt;
_debug = function (self, level, text)&lt;br /&gt;
	if _private[self] and _private[self].dbg then&lt;br /&gt;
		_private[self].dbg:log(level, text)&lt;br /&gt;
	else&lt;br /&gt;
		ClassDebug:log(level, text, tostring(self) .. '.static')&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local _processAttribute = function (self, attr, indent)&lt;br /&gt;
	_debug(self, 1, 'entering private _processAttribute() to print a line for attribute ' .. attr .. ', from ' .. tostring(self))&lt;br /&gt;
	local coreData = self:getCoreData()&lt;br /&gt;
	local ret = ''&lt;br /&gt;
	local omissionList = {'name'}&lt;br /&gt;
	local attr = attr&lt;br /&gt;
	local val = coreData[attr]&lt;br /&gt;
	if type(val) == 'boolean' then&lt;br /&gt;
		val = val and 'true' or 'false'&lt;br /&gt;
	end&lt;br /&gt;
	if val and not ClassgeneratorParameter.myTableTools.inTable(omissionList, attr) then&lt;br /&gt;
		ret = indent .. attr .. ' = '&lt;br /&gt;
		if type(val) == 'table' then&lt;br /&gt;
			ret = ret .. ClassgeneratorParameter.myTableTools.printTable(val, 'inline')&lt;br /&gt;
		elseif val == 'true' or val == 'false' or attr == 'cargo_table' or (attr == 'restricted' and (val == 'global.restrictedTo' or val == 'superglobal.restrictedTo')) or mw.ustring.match(val, '^[0-9]+$') then&lt;br /&gt;
			ret = ret .. val&lt;br /&gt;
		else&lt;br /&gt;
			local valMangled = mw.text.trim(val)&lt;br /&gt;
			valMangled = mw.ustring.gsub(mw.ustring.gsub(valMangled, &amp;quot;\\'&amp;quot;, &amp;quot;'&amp;quot;), &amp;quot;'&amp;quot;, &amp;quot;\\'&amp;quot;)&lt;br /&gt;
			valMangled = mw.ustring.gsub(valMangled, '\n', '\\n\' ..\n' .. indent .. '\t\'')&lt;br /&gt;
			ret = ret .. &amp;quot;'&amp;quot; .. valMangled .. &amp;quot;'&amp;quot;	-- the gsub catches multiline input from textareas&lt;br /&gt;
		end&lt;br /&gt;
		ret = ret .. ','&lt;br /&gt;
		if self.class.myConfiguration.template.addCommentsToConfig then&lt;br /&gt;
			ret = ret .. '\t-- ' .. self.class.myConfiguration.parameter[attr].description&lt;br /&gt;
		end&lt;br /&gt;
		ret = ret .. '\n'&lt;br /&gt;
	end&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local _privateMethod = function (self)&lt;br /&gt;
	_debug(self, 1, 'entering private _privateMethod() to do something, from ' .. tostring(self))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- **************** declaration of public methods&lt;br /&gt;
-- use self.class.myConfiguration to access your configuration in a public method&lt;br /&gt;
function ClassgeneratorParameter:addInfobox()&lt;br /&gt;
	_debug(self, 1, 'entering ClassgeneratorParameter:addInfobox(), from ' .. tostring(self))&lt;br /&gt;
	if self:goodToGo() then&lt;br /&gt;
		local _CFG = self.class.myConfiguration&lt;br /&gt;
		local coreData = self:getPrivate('coreData')&lt;br /&gt;
		local ib_args = {&lt;br /&gt;
			bodyclass = 'infobox_name',&lt;br /&gt;
			aboveclass = 'objtitle titletext',&lt;br /&gt;
			headerclass = 'headertext',&lt;br /&gt;
			labelstyle = 'width: 30%;',&lt;br /&gt;
			datastyle = 'width: 70%;',&lt;br /&gt;
			title = self:getPrivate('uid'),&lt;br /&gt;
			subheader = nil,&lt;br /&gt;
			label1 = _CFG.parameter.name.label,&lt;br /&gt;
			data1 = coreData.name and coreData.name or '',&lt;br /&gt;
			header1 = nil,&lt;br /&gt;
		}&lt;br /&gt;
		self:addOutput(require('Module:Infobox').infobox(ib_args))&lt;br /&gt;
		return true&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function ClassgeneratorParameter:addPageBody()&lt;br /&gt;
	_debug(self, 1, 'entering ClassgeneratorParameter:addPageBody(), from ' .. tostring(self))&lt;br /&gt;
	_debug(self, 2, ' rendering errors and warnings and adding them to output')&lt;br /&gt;
	local frame = mw.getCurrentFrame()&lt;br /&gt;
	self:addOutput(self:renderErrors())&lt;br /&gt;
	self:addOutput(self:renderWarnings())&lt;br /&gt;
	if self:goodToGo() then&lt;br /&gt;
		self:addOutput('No out put yet')&lt;br /&gt;
		return true&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function ClassgeneratorParameter:myArgumentProcessing(coreData)&lt;br /&gt;
	_debug(self, 1, 'entering ClassgeneratorParameter:myArgumentProcessing(args) to process coreData, from ' .. tostring(self))&lt;br /&gt;
	-- function that performs some individual transformation args --&amp;amp;amp;gt; coreData&lt;br /&gt;
	local coreData = coreData&lt;br /&gt;
	-- if dataStore == 'cargo' set sf_cargo_table and sf_cargo_field&lt;br /&gt;
	if (FoundationClass.globalConfig.dataStore == 'cargo' or FoundationClass.globalConfig.dataStore == 'both') and FoundationClass.myYesno(coreData.cargo) and FoundationClass.myYesno(coreData.add_cargo_table_and_field) then&lt;br /&gt;
		coreData.cargo_table = 'global.cargoTable'&lt;br /&gt;
		coreData.cargo_field = coreData.name&lt;br /&gt;
	end&lt;br /&gt;
	coreData.add_cargo_table_and_field = nil&lt;br /&gt;
	if FoundationClass.globalConfig.dataStore == 'smw' or FoundationClass.globalConfig.dataStore == 'both' and FoundationClass.myYesno(coreData.property) then&lt;br /&gt;
		coreData.property_name = mw.ustring.gsub(mw.ustring.gsub(coreData.property_name, ' ', '_'), mw.site.namespaces[mw.title.new('Nul', 'Property').namespace].name .. ':', '')&lt;br /&gt;
	else&lt;br /&gt;
		coreData.property_name = nil&lt;br /&gt;
		coreData.property_type = nil&lt;br /&gt;
	end&lt;br /&gt;
	if coreData.sf and mw.ustring.lower(coreData.sf) == 'holds template' then&lt;br /&gt;
		coreData.sf = 'yes'&lt;br /&gt;
		coreData.holds_template = 'true'&lt;br /&gt;
	end&lt;br /&gt;
	if coreData.show_on_select and type(coreData.show_on_select) == 'table' then&lt;br /&gt;
		local sos = {}&lt;br /&gt;
		for _, selector in pairs(coreData.show_on_select) do&lt;br /&gt;
			local value, field = mw.ustring.match(selector, '^([^= ]+)%s*=%s*(.+)$')&lt;br /&gt;
			if value and field then&lt;br /&gt;
				if not sos[value] then&lt;br /&gt;
					sos[value] = {}&lt;br /&gt;
				end&lt;br /&gt;
				table.insert(sos[value], field)&lt;br /&gt;
			elseif coreData.input_type == 'checkbox' then&lt;br /&gt;
				table.insert(sos, mw.text.trim(selector))&lt;br /&gt;
			else&lt;br /&gt;
				self:addError('Error processing value for \'\'' .. self.class.myConfiguration.parameter.show_on_select.label .. '\'\': ' .. &lt;br /&gt;
					ClassgeneratorParameter.myTableTools.printTable(coreData.show_on_select) .. ' on entry :' .. mw.text.encode(selector))&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		coreData.show_on_select = sos&lt;br /&gt;
		--coreData.show_on_select = FoundationClass.myTableTools.printTable(sos)&lt;br /&gt;
		--coreData.show_on_select = FoundationClass.myTableTools.printTable(coreData.show_on_select)&lt;br /&gt;
	end&lt;br /&gt;
	-- kill two cosmetical switches&lt;br /&gt;
	coreData.cargo = nil&lt;br /&gt;
	coreData.property = nil&lt;br /&gt;
	return coreData	-- this is your new coreData.&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function ClassgeneratorParameter:myPlausibilityTest(args)&lt;br /&gt;
	_debug(self, 1, 'entering ClassgeneratorParameter:myPlausibilityTest(args) to test arguments, from ' .. tostring(self))&lt;br /&gt;
	local _CFG = self.class.myConfiguration&lt;br /&gt;
	-- function that performs the individual plausibility tests&lt;br /&gt;
	-- note: before you access a field args.fieldname you should check for existance&lt;br /&gt;
	-- self:addError(text)&lt;br /&gt;
	if args.name and not mw.ustring.match(args.name, '^[a-zA-Z_][0-9a-zA-Z_-]*$') then&lt;br /&gt;
		self:addError('Invalid value detected for parameter &amp;lt;i&amp;gt;' .. _CFG.parameter.name.label .. ':&amp;lt;/i&amp;gt; &amp;quot;' .. mw.text.encode(tostring(args.name)) .. '&amp;quot;')&lt;br /&gt;
	end&lt;br /&gt;
	if args.cargo_size and not mw.ustring.match(args.cargo_size, '^[0-9]*$') then&lt;br /&gt;
		self:addError('Invalid value detected for parameter &amp;lt;i&amp;gt;' .. _CFG.parameter.cargo_size.label .. ':&amp;lt;/i&amp;gt; &amp;quot;' .. mw.text.encode(tostring(args.cargo_size)) .. '&amp;quot;')&lt;br /&gt;
	end&lt;br /&gt;
	if args.cols and not mw.ustring.match(args.cols, '^[0-9]*$') then&lt;br /&gt;
		self:addError('Invalid value detected for parameter &amp;lt;i&amp;gt;' .. _CFG.parameter.cols.label .. ':&amp;lt;/i&amp;gt; &amp;quot;' .. mw.text.encode(tostring(args.cols)) .. '&amp;quot;')&lt;br /&gt;
	end&lt;br /&gt;
	if args.max_values and not mw.ustring.match(args.max_values, '^[0-9]*$') then&lt;br /&gt;
		self:addError('Invalid value detected for parameter &amp;lt;i&amp;gt;' .. _CFG.parameter.max_values.label .. ':&amp;lt;/i&amp;gt; &amp;quot;' .. mw.text.encode(tostring(args.max_values)) .. '&amp;quot;')&lt;br /&gt;
	end&lt;br /&gt;
	if args.maxlength and not mw.ustring.match(args.maxlength, '^[0-9]*$') then&lt;br /&gt;
		self:addError('Invalid value detected for parameter &amp;lt;i&amp;gt;' .. _CFG.parameter.maxlength.label .. ':&amp;lt;/i&amp;gt; &amp;quot;' .. mw.text.encode(tostring(args.maxlength)) .. '&amp;quot;')&lt;br /&gt;
	end&lt;br /&gt;
	if args.rows and not mw.ustring.match(args.rows, '^[0-9]*$') then&lt;br /&gt;
		self:addError('Invalid value detected for parameter &amp;lt;i&amp;gt;' .. _CFG.parameter.rows.label .. ':&amp;lt;/i&amp;gt; &amp;quot;' .. mw.text.encode(tostring(args.rows)) .. '&amp;quot;')&lt;br /&gt;
	end&lt;br /&gt;
	if args.size and not mw.ustring.match(args.size, '^[0-9]*$') then&lt;br /&gt;
		self:addError('Invalid value detected for parameter &amp;lt;i&amp;gt;' .. _CFG.parameter.size.label .. ':&amp;lt;/i&amp;gt; &amp;quot;' .. mw.text.encode(tostring(size.cols)) .. '&amp;quot;')&lt;br /&gt;
	end&lt;br /&gt;
	return false	-- return value will be ignored. but if you add any error, the object's initialization will fail with the error&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function ClassgeneratorParameter:myStashAdjustments(stash)&lt;br /&gt;
	_debug(self, 1, 'entering ClassgeneratorParameter:myStashAdjustments(stash) to do some minor adjustments on data before storing, from ' .. tostring(self))&lt;br /&gt;
	-- function that alters the stash before storing the data&lt;br /&gt;
	local stash = stash&lt;br /&gt;
	return stash	-- this is your new stash. this will be stored. it has format (fieldname: value)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function ClassgeneratorParameter:render()&lt;br /&gt;
	_debug(self, 1, 'entering ClassgeneratorParameter:render() to render the code I pass to template class generator, from ' .. tostring(self))&lt;br /&gt;
	local str = ''&lt;br /&gt;
	if self:goodToGo() then&lt;br /&gt;
		local _CFG = self.class.myConfiguration&lt;br /&gt;
		local coreData = self:getCoreData()&lt;br /&gt;
		local indent = '\t'&lt;br /&gt;
		local sfAttributes = {}&lt;br /&gt;
		for _, val in pairs(_CFG.form.fieldOrderSFgeneral) do&lt;br /&gt;
			table.insert(sfAttributes, val)&lt;br /&gt;
		end&lt;br /&gt;
		for _, val in pairs(_CFG.form.fieldOrderSFtypeDependent) do&lt;br /&gt;
			table.insert(sfAttributes, val)&lt;br /&gt;
		end&lt;br /&gt;
		table.sort(sfAttributes)&lt;br /&gt;
		if FoundationClass.myYesno(coreData.sf, true) then&lt;br /&gt;
			str = str .. coreData.name&lt;br /&gt;
		end&lt;br /&gt;
		str = str .. _CFG.template.delimiterFormFieldName&lt;br /&gt;
		str = str .. indent .. coreData.name .. ' = {\n'&lt;br /&gt;
		for _, globalAttr in pairs(_CFG.form.fieldOrderGeneral) do&lt;br /&gt;
			if globalAttr ~= 'sf' then&lt;br /&gt;
				str = str .. _processAttribute(self, globalAttr, indent .. '\t')&lt;br /&gt;
			elseif coreData.sf ~= 'Information' then&lt;br /&gt;
				local sf = ''&lt;br /&gt;
				sf = sf .. _processAttribute(self, 'cargo_table', indent .. '\t\t')&lt;br /&gt;
				sf = sf .. _processAttribute(self, 'cargo_field', indent .. '\t\t')&lt;br /&gt;
				for _, sfAttr in pairs(sfAttributes) do&lt;br /&gt;
					sf = sf .. _processAttribute(self, sfAttr, indent .. '\t\t')&lt;br /&gt;
				end&lt;br /&gt;
				if mw.ustring.len(sf) &amp;gt; 0 then&lt;br /&gt;
					str = str .. indent .. '\t' .. 'sf = {\n' .. sf .. indent .. '\t' .. '},\n'&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		str = str .. indent .. '},\n' .. _CFG.template.delimiterResult&lt;br /&gt;
	else&lt;br /&gt;
		str = tostring(self:renderErrors())&lt;br /&gt;
	end&lt;br /&gt;
	return str&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return ClassgeneratorParameter&lt;/div&gt;</summary>
		<author><name>Anatol</name></author>
	</entry>
	<entry>
		<id>https://camnet.oetterer.eu/index.php?title=Modul:Classgenerator/parameter/class&amp;diff=1019</id>
		<title>Modul:Classgenerator/parameter/class</title>
		<link rel="alternate" type="text/html" href="https://camnet.oetterer.eu/index.php?title=Modul:Classgenerator/parameter/class&amp;diff=1019"/>
		<updated>2016-02-10T10:50:18Z</updated>

		<summary type="html">&lt;p&gt;Anatol: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local FoundationClass = require('Module:Foundationclass')&lt;br /&gt;
local ClassDebug = require('Module:Debug/class')&lt;br /&gt;
&lt;br /&gt;
-- ****************************************************************&lt;br /&gt;
-- *                         inheritance                          *&lt;br /&gt;
-- ****************************************************************&lt;br /&gt;
local ClassgeneratorParameter = FoundationClass:subclass('ClassgeneratorParameter')&lt;br /&gt;
-- setting class's configuration data&lt;br /&gt;
ClassgeneratorParameter.static.myConfiguration = mw.loadData('Module:Classgenerator/parameter/config')&lt;br /&gt;
ClassgeneratorParameter.static.SFfieldConfig = mw.loadData('Module:SFfield/config')&lt;br /&gt;
--ClassgeneratorParameter.static.myConfiguration = require('Module:Classgenerator/parameter/config')&lt;br /&gt;
--local SFfieldConfig = mw.loadData('Module:SFfield/config')&lt;br /&gt;
--ClassgeneratorParameter.static.myConfiguration.parameter.input_type.values = SFfieldConfig.validInputTypes	-- cant load a table from another config in my config. therefor this&lt;br /&gt;
--ClassgeneratorParameter.static.myConfiguration.parameter.base_type.values = SFfieldConfig.validInputTypes	-- cant load a table from another config in my config. therefor this&lt;br /&gt;
--   being in a static method, use self.myConfiguration&lt;br /&gt;
--   being in a private method, that knows self or in a public method, use self.class.myConfiguration&lt;br /&gt;
&lt;br /&gt;
-- ****************************************************************&lt;br /&gt;
-- *                          properties                          *&lt;br /&gt;
-- ****************************************************************&lt;br /&gt;
&lt;br /&gt;
-- **************** initialization of table for private properties&lt;br /&gt;
local _private = setmetatable({}, {__mode = 'k'})   -- weak table storing all private attributes&lt;br /&gt;
&lt;br /&gt;
-- **************** declaration of public static properties&lt;br /&gt;
-- ClassgeneratorParameter.static.myPropertyModule = require('Module:extern')&lt;br /&gt;
-- ClassgeneratorParameter.static.staticProperty = ' '&lt;br /&gt;
&lt;br /&gt;
-- remember the static classes provided by Foundationclass:&lt;br /&gt;
-- ClassgeneratorParameter.globalConfig&lt;br /&gt;
-- ClassgeneratorParameter.myCargoUtil&lt;br /&gt;
-- ClassgeneratorParameter.myTableTools&lt;br /&gt;
&lt;br /&gt;
-- **************** declaration of (global) private properties&lt;br /&gt;
-- for properties you should rather use constructor and _private[self]. this only, if you need a private class property&lt;br /&gt;
-- you should, however predeclare private methods here&lt;br /&gt;
local _debug	-- private method declared later&lt;br /&gt;
local _privateMethodAhead	-- declaration ahead, so this private method can be used in the constructor and in other private methods&lt;br /&gt;
&lt;br /&gt;
-- ***************************************************************&lt;br /&gt;
-- *                           methods                           *&lt;br /&gt;
-- ***************************************************************&lt;br /&gt;
 &lt;br /&gt;
-- **************** declaration of static methods&lt;br /&gt;
function ClassgeneratorParameter:initialize(uid)&lt;br /&gt;
	local _CFG = self.class.myConfiguration&lt;br /&gt;
	FoundationClass.initialize(self, uid)&lt;br /&gt;
	_private[self] = {&lt;br /&gt;
		dbg = ClassDebug:new(tostring(self.class) .. ': id ' .. uid),&lt;br /&gt;
	}&lt;br /&gt;
	_debug(self, 1, ' ClassgeneratorParameter: done initializing object &amp;amp;quot;' .. uid ..'&amp;amp;quot;, from ' .. tostring(self))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- use use self.myConfiguration to access your configuration in a static method&lt;br /&gt;
function ClassgeneratorParameter.static:aStaticMethod(var)&lt;br /&gt;
	_debug(self, 1, 'entering ClassgeneratorParameter.static:aStaticMethod() to do something, from ' .. tostring(self))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function ClassgeneratorParameter.static:mySfDynamicFieldAttribute(fieldname, attribute, value)&lt;br /&gt;
	_debug(self, 1, 'entering ClassgeneratorParameter.static:mySfDynamicFieldAttribute(fieldname, attribute, value), from ' .. tostring(self))&lt;br /&gt;
	_debug(self, 2, ' with parameters &amp;amp;quot;' .. fieldname .. '&amp;amp;quot;, &amp;amp;quot;' .. attribute .. '&amp;amp;quot; and a ' .. type(value) .. ' value')&lt;br /&gt;
	-- function that can process any attribute/value pair just before rendering the semantic forms field&lt;br /&gt;
	-- usually done, to generate a dynamic 'default' value&lt;br /&gt;
	-- keep in mind: you can completely disable a form field, if you return true on attribute &amp;quot;disable&amp;quot;. note however, that this causes the field to not show at all, no data will be transported/saved&lt;br /&gt;
	local val = value&lt;br /&gt;
	if FoundationClass.globalConfig.dataStore ~= 'cargo' and FoundationClass.globalConfig.dataStore ~= 'both' then&lt;br /&gt;
		-- disable all cargo fields&lt;br /&gt;
		if fieldname == 'cargo' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
		if fieldname == 'cargo_hidden' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
		if fieldname == 'cargo_size' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
		if fieldname == 'cargo_type' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
		if fieldname == 'add_cargo_table_and_field' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
		if fieldname == 'mapping_cargo_field' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
		if fieldname == 'mapping_cargo_table' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if FoundationClass.globalConfig.dataStore ~= 'smw' and FoundationClass.globalConfig.dataStore ~= 'both' then&lt;br /&gt;
		-- disable all smw fields&lt;br /&gt;
		if fieldname == 'property' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
		if fieldname == 'property_name' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
		if fieldname == 'property_type' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
		if fieldname == 'unique_for_concept' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
		if fieldname == 'mapping_property' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
		if fieldname == 'values_from_concept' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if fieldname == 'property_name' and attribute == 'values_from_namespace' then&lt;br /&gt;
		local ret, nulProperty = pcall(mw.title.new, 'NUL', 'Property')&lt;br /&gt;
		val = ret and mw.site.namespaces[nulProperty.namespace].name or 'NUL'&lt;br /&gt;
	end&lt;br /&gt;
	if fieldname == 'property_type' and attribute == 'values' then&lt;br /&gt;
		val = FoundationClass.globalConfig.smwPropertyTypesAvailable&lt;br /&gt;
	end&lt;br /&gt;
	if fieldname == 'input_type' and attribute == 'show_on_select' then&lt;br /&gt;
		-- build input type's show on select from SFfieldConfig.validAttributesPerType, except remove values and replace all spaces in attribte names by an underscore&lt;br /&gt;
		--val = mw.clone(ClassgeneratorParameter.SFfieldConfig.validAttributesPerType)&lt;br /&gt;
		--val = ClassgeneratorParameter.myTableTools.shallowClone(ClassgeneratorParameter.SFfieldConfig.validAttributesPerType)&lt;br /&gt;
		val = {}&lt;br /&gt;
		for param, attrlist in pairs(ClassgeneratorParameter.SFfieldConfig.validAttributesPerType) do&lt;br /&gt;
			if not val[param] then&lt;br /&gt;
				val[param] = {}&lt;br /&gt;
			end&lt;br /&gt;
			for k, attr in pairs(attrlist) do&lt;br /&gt;
				if attr ~= 'values' then&lt;br /&gt;
					val[param][k] = mw.ustring.gsub(attr, ' ', '_')&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		_debug(self, 2, ' calculated this monster: &amp;lt;pre&amp;gt;' .. ClassgeneratorParameter.myTableTools.printTable(val) .. '&amp;lt;/pre&amp;gt;')&lt;br /&gt;
	end&lt;br /&gt;
	if fieldname == 'input_type' and attribute == 'values' then&lt;br /&gt;
		return ClassgeneratorParameter.SFfieldConfig.validInputTypes&lt;br /&gt;
	end&lt;br /&gt;
	if fieldname == 'base_type' and attribute == 'values' then&lt;br /&gt;
		return ClassgeneratorParameter.SFfieldConfig.validInputTypes&lt;br /&gt;
	end&lt;br /&gt;
	if fieldname == 'uploadable' and attribute == 'show_on_select' then&lt;br /&gt;
		val = {}&lt;br /&gt;
		val['true'] = {'default_filename', 'image_preview'}&lt;br /&gt;
	end&lt;br /&gt;
	_debug(self, 3, '  returning ' .. (type(val) == 'boolean' and (val and 'true' or 'false') or type(val)))&lt;br /&gt;
	return val	-- this value will be used as new value for field's attribute&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function ClassgeneratorParameter.static:sfGenerateForm(embedIn)&lt;br /&gt;
	_debug(self, 1, 'entering ClassgeneratorParameter.static:sfGenerateForm()')&lt;br /&gt;
	local _CFG = self.myConfiguration&lt;br /&gt;
	local embedIn = embedIn or 'Classgenerator[parameter_parameter]'&lt;br /&gt;
	local tagStart = '{{{'&lt;br /&gt;
	local tagEnd = '}}}'&lt;br /&gt;
	-- create the table&lt;br /&gt;
	-- start the html object&lt;br /&gt;
	html = mw.html.create('')&lt;br /&gt;
	html:wikitext(tagStart .. 'for template|' .. _CFG.template.name .. '|label=' .. _CFG.global.entityTitle ..&lt;br /&gt;
		'|embed in field=' .. embedIn .. '|multiple|add button text=' .. _CFG.form.labelCreate .. '|minimum instances=1' .. tagEnd)&lt;br /&gt;
		:node(self:sfGenerateFormTable(self.myConfiguration.form.fieldOrderGeneral))&lt;br /&gt;
		:newline()&lt;br /&gt;
		:wikitext(':')&lt;br /&gt;
		:node(self:sfGenerateFormTable(self.myConfiguration.form.fieldOrderSFgeneral, 'row_parameter'))&lt;br /&gt;
		:newline()&lt;br /&gt;
		:wikitext('::')&lt;br /&gt;
		:node(self:sfGenerateFormTable(self.myConfiguration.form.fieldOrderSFtypeDependent))&lt;br /&gt;
		:wikitext(tagStart .. 'end template' .. tagEnd)&lt;br /&gt;
		:newline()&lt;br /&gt;
	return tostring(html)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- **************** declaration of private methods&lt;br /&gt;
-- use self.class.myConfiguration to access your configuration in a public or a private method that is called by a public method&lt;br /&gt;
_debug = function (self, level, text)&lt;br /&gt;
	if _private[self] and _private[self].dbg then&lt;br /&gt;
		_private[self].dbg:log(level, text)&lt;br /&gt;
	else&lt;br /&gt;
		ClassDebug:log(level, text, tostring(self) .. '.static')&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local _processAttribute = function (self, attr, indent)&lt;br /&gt;
	_debug(self, 1, 'entering private _processAttribute() to print a line for attribute ' .. attr .. ', from ' .. tostring(self))&lt;br /&gt;
	local coreData = self:getCoreData()&lt;br /&gt;
	local ret = ''&lt;br /&gt;
	local omissionList = {'name'}&lt;br /&gt;
	local attr = attr&lt;br /&gt;
	local val = coreData[attr]&lt;br /&gt;
	if type(val) == 'boolean' then&lt;br /&gt;
		val = val and 'true' or 'false'&lt;br /&gt;
	end&lt;br /&gt;
	if val and not ClassgeneratorParameter.myTableTools.inTable(omissionList, attr) then&lt;br /&gt;
		ret = indent .. attr .. ' = '&lt;br /&gt;
		if type(val) == 'table' then&lt;br /&gt;
			ret = ret .. ClassgeneratorParameter.myTableTools.printTable(val, 'inline')&lt;br /&gt;
		elseif val == 'true' or val == 'false' or attr == 'cargo_table' or (attr == 'restricted' and (val == 'global.restrictedTo' or val == 'superglobal.restrictedTo')) or mw.ustring.match(val, '^[0-9]+$') then&lt;br /&gt;
			ret = ret .. val&lt;br /&gt;
		else&lt;br /&gt;
			local valMangled = mw.text.trim(val)&lt;br /&gt;
			valMangled = mw.ustring.gsub(mw.ustring.gsub(valMangled, &amp;quot;\\'&amp;quot;, &amp;quot;'&amp;quot;), &amp;quot;'&amp;quot;, &amp;quot;\\'&amp;quot;)&lt;br /&gt;
			valMangled = mw.ustring.gsub(valMangled, '\n', '\\n\' ..\n' .. indent .. '\t\'')&lt;br /&gt;
			ret = ret .. &amp;quot;'&amp;quot; .. valMangled .. &amp;quot;'&amp;quot;	-- the gsub catches multiline input from textareas&lt;br /&gt;
		end&lt;br /&gt;
		ret = ret .. ','&lt;br /&gt;
		if self.class.myConfiguration.template.addCommentsToConfig then&lt;br /&gt;
			ret = ret .. '\t-- ' .. self.class.myConfiguration.parameter[attr].description&lt;br /&gt;
		end&lt;br /&gt;
		ret = ret .. '\n'&lt;br /&gt;
	end&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local _privateMethod = function (self)&lt;br /&gt;
	_debug(self, 1, 'entering private _privateMethod() to do something, from ' .. tostring(self))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- **************** declaration of public methods&lt;br /&gt;
-- use self.class.myConfiguration to access your configuration in a public method&lt;br /&gt;
function ClassgeneratorParameter:addInfobox()&lt;br /&gt;
	_debug(self, 1, 'entering ClassgeneratorParameter:addInfobox(), from ' .. tostring(self))&lt;br /&gt;
	if self:goodToGo() then&lt;br /&gt;
		local _CFG = self.class.myConfiguration&lt;br /&gt;
		local coreData = self:getPrivate('coreData')&lt;br /&gt;
		local ib_args = {&lt;br /&gt;
			bodyclass = 'infobox_name',&lt;br /&gt;
			aboveclass = 'objtitle titletext',&lt;br /&gt;
			headerclass = 'headertext',&lt;br /&gt;
			labelstyle = 'width: 30%;',&lt;br /&gt;
			datastyle = 'width: 70%;',&lt;br /&gt;
			title = self:getPrivate('uid'),&lt;br /&gt;
			subheader = nil,&lt;br /&gt;
			label1 = _CFG.parameter.name.label,&lt;br /&gt;
			data1 = coreData.name and coreData.name or '',&lt;br /&gt;
			header1 = nil,&lt;br /&gt;
		}&lt;br /&gt;
		self:addOutput(require('Module:Infobox').infobox(ib_args))&lt;br /&gt;
		return true&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function ClassgeneratorParameter:addPageBody()&lt;br /&gt;
	_debug(self, 1, 'entering ClassgeneratorParameter:addPageBody(), from ' .. tostring(self))&lt;br /&gt;
	_debug(self, 2, ' rendering errors and warnings and adding them to output')&lt;br /&gt;
	local frame = mw.getCurrentFrame()&lt;br /&gt;
	self:addOutput(self:renderErrors())&lt;br /&gt;
	self:addOutput(self:renderWarnings())&lt;br /&gt;
	if self:goodToGo() then&lt;br /&gt;
		self:addOutput('No out put yet')&lt;br /&gt;
		return true&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function ClassgeneratorParameter:myArgumentProcessing(coreData)&lt;br /&gt;
	_debug(self, 1, 'entering ClassgeneratorParameter:myArgumentProcessing(args) to process coreData, from ' .. tostring(self))&lt;br /&gt;
	-- function that performs some individual transformation args --&amp;amp;amp;gt; coreData&lt;br /&gt;
	local coreData = coreData&lt;br /&gt;
	-- if dataStore == 'cargo' set sf_cargo_table and sf_cargo_field&lt;br /&gt;
	if (FoundationClass.globalConfig.dataStore == 'cargo' or FoundationClass.globalConfig.dataStore == 'both') and FoundationClass.myYesno(coreData.cargo) and FoundationClass.myYesno(coreData.add_cargo_table_and_field) then&lt;br /&gt;
		coreData.cargo_table = 'global.cargoTable'&lt;br /&gt;
		coreData.cargo_field = coreData.name&lt;br /&gt;
	end&lt;br /&gt;
	coreData.add_cargo_table_and_field = nil&lt;br /&gt;
	if FoundationClass.globalConfig.dataStore == 'smw' or FoundationClass.globalConfig.dataStore == 'both' and FoundationClass.myYesno(coreData.property) then&lt;br /&gt;
		coreData.property_name = mw.ustring.gsub(mw.ustring.gsub(coreData.property_name, ' ', '_'), mw.site.namespaces[mw.title.new('Nul', 'Property').namespace].name .. ':', '')&lt;br /&gt;
	else&lt;br /&gt;
		coreData.property_name = nil&lt;br /&gt;
		coreData.property_type = nil&lt;br /&gt;
	end&lt;br /&gt;
	if coreData.sf and mw.ustring.lower(coreData.sf) == 'holds template' then&lt;br /&gt;
		coreData.sf = 'yes'&lt;br /&gt;
		coreData.holds_template = 'true'&lt;br /&gt;
	end&lt;br /&gt;
	if coreData.show_on_select and type(coreData.show_on_select) == 'table' then&lt;br /&gt;
		local sos = {}&lt;br /&gt;
		for _, selector in pairs(coreData.show_on_select) do&lt;br /&gt;
			local value, field = mw.ustring.match(selector, '^([^= ]+)%s*=%s*(.+)$')&lt;br /&gt;
			if value and field then&lt;br /&gt;
				if not sos[value] then&lt;br /&gt;
					sos[value] = {}&lt;br /&gt;
				end&lt;br /&gt;
				table.insert(sos[value], field)&lt;br /&gt;
			else&lt;br /&gt;
				addError('Error processing value for \'\'' .. self.class.myConfiguration.parameter.show_on_select.label .. '\'\': ' .. &lt;br /&gt;
					ClassgeneratorParameter.myTableTools.printTable(coreData.show_on_select) .. ' on entry :' .. mw.text.encode(selector))&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		coreData.show_on_select = sos&lt;br /&gt;
		--coreData.show_on_select = FoundationClass.myTableTools.printTable(sos)&lt;br /&gt;
		--coreData.show_on_select = FoundationClass.myTableTools.printTable(coreData.show_on_select)&lt;br /&gt;
	end&lt;br /&gt;
	-- kill two cosmetical switches&lt;br /&gt;
	coreData.cargo = nil&lt;br /&gt;
	coreData.property = nil&lt;br /&gt;
	return coreData	-- this is your new coreData.&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function ClassgeneratorParameter:myPlausibilityTest(args)&lt;br /&gt;
	_debug(self, 1, 'entering ClassgeneratorParameter:myPlausibilityTest(args) to test arguments, from ' .. tostring(self))&lt;br /&gt;
	local _CFG = self.class.myConfiguration&lt;br /&gt;
	-- function that performs the individual plausibility tests&lt;br /&gt;
	-- note: before you access a field args.fieldname you should check for existance&lt;br /&gt;
	-- self:addError(text)&lt;br /&gt;
	if args.name and not mw.ustring.match(args.name, '^[a-zA-Z_][0-9a-zA-Z_-]*$') then&lt;br /&gt;
		self:addError('Invalid value detected for parameter &amp;lt;i&amp;gt;' .. _CFG.parameter.name.label .. ':&amp;lt;/i&amp;gt; &amp;quot;' .. mw.text.encode(tostring(args.name)) .. '&amp;quot;')&lt;br /&gt;
	end&lt;br /&gt;
	if args.cargo_size and not mw.ustring.match(args.cargo_size, '^[0-9]*$') then&lt;br /&gt;
		self:addError('Invalid value detected for parameter &amp;lt;i&amp;gt;' .. _CFG.parameter.cargo_size.label .. ':&amp;lt;/i&amp;gt; &amp;quot;' .. mw.text.encode(tostring(args.cargo_size)) .. '&amp;quot;')&lt;br /&gt;
	end&lt;br /&gt;
	if args.cols and not mw.ustring.match(args.cols, '^[0-9]*$') then&lt;br /&gt;
		self:addError('Invalid value detected for parameter &amp;lt;i&amp;gt;' .. _CFG.parameter.cols.label .. ':&amp;lt;/i&amp;gt; &amp;quot;' .. mw.text.encode(tostring(args.cols)) .. '&amp;quot;')&lt;br /&gt;
	end&lt;br /&gt;
	if args.max_values and not mw.ustring.match(args.max_values, '^[0-9]*$') then&lt;br /&gt;
		self:addError('Invalid value detected for parameter &amp;lt;i&amp;gt;' .. _CFG.parameter.max_values.label .. ':&amp;lt;/i&amp;gt; &amp;quot;' .. mw.text.encode(tostring(args.max_values)) .. '&amp;quot;')&lt;br /&gt;
	end&lt;br /&gt;
	if args.maxlength and not mw.ustring.match(args.maxlength, '^[0-9]*$') then&lt;br /&gt;
		self:addError('Invalid value detected for parameter &amp;lt;i&amp;gt;' .. _CFG.parameter.maxlength.label .. ':&amp;lt;/i&amp;gt; &amp;quot;' .. mw.text.encode(tostring(args.maxlength)) .. '&amp;quot;')&lt;br /&gt;
	end&lt;br /&gt;
	if args.rows and not mw.ustring.match(args.rows, '^[0-9]*$') then&lt;br /&gt;
		self:addError('Invalid value detected for parameter &amp;lt;i&amp;gt;' .. _CFG.parameter.rows.label .. ':&amp;lt;/i&amp;gt; &amp;quot;' .. mw.text.encode(tostring(args.rows)) .. '&amp;quot;')&lt;br /&gt;
	end&lt;br /&gt;
	if args.size and not mw.ustring.match(args.size, '^[0-9]*$') then&lt;br /&gt;
		self:addError('Invalid value detected for parameter &amp;lt;i&amp;gt;' .. _CFG.parameter.size.label .. ':&amp;lt;/i&amp;gt; &amp;quot;' .. mw.text.encode(tostring(size.cols)) .. '&amp;quot;')&lt;br /&gt;
	end&lt;br /&gt;
	return false	-- return value will be ignored. but if you add any error, the object's initialization will fail with the error&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function ClassgeneratorParameter:myStashAdjustments(stash)&lt;br /&gt;
	_debug(self, 1, 'entering ClassgeneratorParameter:myStashAdjustments(stash) to do some minor adjustments on data before storing, from ' .. tostring(self))&lt;br /&gt;
	-- function that alters the stash before storing the data&lt;br /&gt;
	local stash = stash&lt;br /&gt;
	return stash	-- this is your new stash. this will be stored. it has format (fieldname: value)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function ClassgeneratorParameter:render()&lt;br /&gt;
	_debug(self, 1, 'entering ClassgeneratorParameter:render() to render the code I pass to template class generator, from ' .. tostring(self))&lt;br /&gt;
	local str = ''&lt;br /&gt;
	if self:goodToGo() then&lt;br /&gt;
		local _CFG = self.class.myConfiguration&lt;br /&gt;
		local coreData = self:getCoreData()&lt;br /&gt;
		local indent = '\t'&lt;br /&gt;
		local sfAttributes = {}&lt;br /&gt;
		for _, val in pairs(_CFG.form.fieldOrderSFgeneral) do&lt;br /&gt;
			table.insert(sfAttributes, val)&lt;br /&gt;
		end&lt;br /&gt;
		for _, val in pairs(_CFG.form.fieldOrderSFtypeDependent) do&lt;br /&gt;
			table.insert(sfAttributes, val)&lt;br /&gt;
		end&lt;br /&gt;
		table.sort(sfAttributes)&lt;br /&gt;
		if FoundationClass.myYesno(coreData.sf, true) then&lt;br /&gt;
			str = str .. coreData.name&lt;br /&gt;
		end&lt;br /&gt;
		str = str .. _CFG.template.delimiterFormFieldName&lt;br /&gt;
		str = str .. indent .. coreData.name .. ' = {\n'&lt;br /&gt;
		for _, globalAttr in pairs(_CFG.form.fieldOrderGeneral) do&lt;br /&gt;
			if globalAttr ~= 'sf' then&lt;br /&gt;
				str = str .. _processAttribute(self, globalAttr, indent .. '\t')&lt;br /&gt;
			elseif coreData.sf ~= 'Information' then&lt;br /&gt;
				local sf = ''&lt;br /&gt;
				sf = sf .. _processAttribute(self, 'cargo_table', indent .. '\t\t')&lt;br /&gt;
				sf = sf .. _processAttribute(self, 'cargo_field', indent .. '\t\t')&lt;br /&gt;
				for _, sfAttr in pairs(sfAttributes) do&lt;br /&gt;
					sf = sf .. _processAttribute(self, sfAttr, indent .. '\t\t')&lt;br /&gt;
				end&lt;br /&gt;
				if mw.ustring.len(sf) &amp;gt; 0 then&lt;br /&gt;
					str = str .. indent .. '\t' .. 'sf = {\n' .. sf .. indent .. '\t' .. '},\n'&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		str = str .. indent .. '},\n' .. _CFG.template.delimiterResult&lt;br /&gt;
	else&lt;br /&gt;
		str = tostring(self:renderErrors())&lt;br /&gt;
	end&lt;br /&gt;
	return str&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return ClassgeneratorParameter&lt;/div&gt;</summary>
		<author><name>Anatol</name></author>
	</entry>
	<entry>
		<id>https://camnet.oetterer.eu/index.php?title=Modul:Classgenerator/parameter/class&amp;diff=1018</id>
		<title>Modul:Classgenerator/parameter/class</title>
		<link rel="alternate" type="text/html" href="https://camnet.oetterer.eu/index.php?title=Modul:Classgenerator/parameter/class&amp;diff=1018"/>
		<updated>2016-02-10T10:47:16Z</updated>

		<summary type="html">&lt;p&gt;Anatol: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local FoundationClass = require('Module:Foundationclass')&lt;br /&gt;
local ClassDebug = require('Module:Debug/class')&lt;br /&gt;
&lt;br /&gt;
-- ****************************************************************&lt;br /&gt;
-- *                         inheritance                          *&lt;br /&gt;
-- ****************************************************************&lt;br /&gt;
local ClassgeneratorParameter = FoundationClass:subclass('ClassgeneratorParameter')&lt;br /&gt;
-- setting class's configuration data&lt;br /&gt;
ClassgeneratorParameter.static.myConfiguration = mw.loadData('Module:Classgenerator/parameter/config')&lt;br /&gt;
ClassgeneratorParameter.static.SFfieldConfig = mw.loadData('Module:SFfield/config')&lt;br /&gt;
--ClassgeneratorParameter.static.myConfiguration = require('Module:Classgenerator/parameter/config')&lt;br /&gt;
--local SFfieldConfig = mw.loadData('Module:SFfield/config')&lt;br /&gt;
--ClassgeneratorParameter.static.myConfiguration.parameter.input_type.values = SFfieldConfig.validInputTypes	-- cant load a table from another config in my config. therefor this&lt;br /&gt;
--ClassgeneratorParameter.static.myConfiguration.parameter.base_type.values = SFfieldConfig.validInputTypes	-- cant load a table from another config in my config. therefor this&lt;br /&gt;
--   being in a static method, use self.myConfiguration&lt;br /&gt;
--   being in a private method, that knows self or in a public method, use self.class.myConfiguration&lt;br /&gt;
&lt;br /&gt;
-- ****************************************************************&lt;br /&gt;
-- *                          properties                          *&lt;br /&gt;
-- ****************************************************************&lt;br /&gt;
&lt;br /&gt;
-- **************** initialization of table for private properties&lt;br /&gt;
local _private = setmetatable({}, {__mode = 'k'})   -- weak table storing all private attributes&lt;br /&gt;
&lt;br /&gt;
-- **************** declaration of public static properties&lt;br /&gt;
-- ClassgeneratorParameter.static.myPropertyModule = require('Module:extern')&lt;br /&gt;
-- ClassgeneratorParameter.static.staticProperty = ' '&lt;br /&gt;
&lt;br /&gt;
-- remember the static classes provided by Foundationclass:&lt;br /&gt;
-- ClassgeneratorParameter.globalConfig&lt;br /&gt;
-- ClassgeneratorParameter.myCargoUtil&lt;br /&gt;
-- ClassgeneratorParameter.myTableTools&lt;br /&gt;
&lt;br /&gt;
-- **************** declaration of (global) private properties&lt;br /&gt;
-- for properties you should rather use constructor and _private[self]. this only, if you need a private class property&lt;br /&gt;
-- you should, however predeclare private methods here&lt;br /&gt;
local _debug	-- private method declared later&lt;br /&gt;
local _privateMethodAhead	-- declaration ahead, so this private method can be used in the constructor and in other private methods&lt;br /&gt;
&lt;br /&gt;
-- ***************************************************************&lt;br /&gt;
-- *                           methods                           *&lt;br /&gt;
-- ***************************************************************&lt;br /&gt;
 &lt;br /&gt;
-- **************** declaration of static methods&lt;br /&gt;
function ClassgeneratorParameter:initialize(uid)&lt;br /&gt;
	local _CFG = self.class.myConfiguration&lt;br /&gt;
	FoundationClass.initialize(self, uid)&lt;br /&gt;
	_private[self] = {&lt;br /&gt;
		dbg = ClassDebug:new(tostring(self.class) .. ': id ' .. uid),&lt;br /&gt;
	}&lt;br /&gt;
	_debug(self, 1, ' ClassgeneratorParameter: done initializing object &amp;amp;quot;' .. uid ..'&amp;amp;quot;, from ' .. tostring(self))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- use use self.myConfiguration to access your configuration in a static method&lt;br /&gt;
function ClassgeneratorParameter.static:aStaticMethod(var)&lt;br /&gt;
	_debug(self, 1, 'entering ClassgeneratorParameter.static:aStaticMethod() to do something, from ' .. tostring(self))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function ClassgeneratorParameter.static:mySfDynamicFieldAttribute(fieldname, attribute, value)&lt;br /&gt;
	_debug(self, 1, 'entering ClassgeneratorParameter.static:mySfDynamicFieldAttribute(fieldname, attribute, value), from ' .. tostring(self))&lt;br /&gt;
	_debug(self, 2, ' with parameters &amp;amp;quot;' .. fieldname .. '&amp;amp;quot;, &amp;amp;quot;' .. attribute .. '&amp;amp;quot; and a ' .. type(value) .. ' value')&lt;br /&gt;
	-- function that can process any attribute/value pair just before rendering the semantic forms field&lt;br /&gt;
	-- usually done, to generate a dynamic 'default' value&lt;br /&gt;
	-- keep in mind: you can completely disable a form field, if you return true on attribute &amp;quot;disable&amp;quot;. note however, that this causes the field to not show at all, no data will be transported/saved&lt;br /&gt;
	local val = value&lt;br /&gt;
	if FoundationClass.globalConfig.dataStore ~= 'cargo' and FoundationClass.globalConfig.dataStore ~= 'both' then&lt;br /&gt;
		-- disable all cargo fields&lt;br /&gt;
		if fieldname == 'cargo' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
		if fieldname == 'cargo_hidden' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
		if fieldname == 'cargo_size' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
		if fieldname == 'cargo_type' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
		if fieldname == 'add_cargo_table_and_field' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
		if fieldname == 'mapping_cargo_field' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
		if fieldname == 'mapping_cargo_table' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if FoundationClass.globalConfig.dataStore ~= 'smw' and FoundationClass.globalConfig.dataStore ~= 'both' then&lt;br /&gt;
		-- disable all smw fields&lt;br /&gt;
		if fieldname == 'property' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
		if fieldname == 'property_name' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
		if fieldname == 'property_type' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
		if fieldname == 'unique_for_concept' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
		if fieldname == 'mapping_property' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
		if fieldname == 'values_from_concept' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if fieldname == 'property_name' and attribute == 'values_from_namespace' then&lt;br /&gt;
		local ret, nulProperty = pcall(mw.title.new, 'NUL', 'Property')&lt;br /&gt;
		val = ret and mw.site.namespaces[nulProperty.namespace].name or 'NUL'&lt;br /&gt;
	end&lt;br /&gt;
	if fieldname == 'property_type' and attribute == 'values' then&lt;br /&gt;
		val = FoundationClass.globalConfig.smwPropertyTypesAvailable&lt;br /&gt;
	end&lt;br /&gt;
	if fieldname == 'input_type' and attribute == 'show_on_select' then&lt;br /&gt;
		-- build input type's show on select from SFfieldConfig.validAttributesPerType, except remove values and replace all spaces in attribte names by an underscore&lt;br /&gt;
		--val = mw.clone(ClassgeneratorParameter.SFfieldConfig.validAttributesPerType)&lt;br /&gt;
		--val = ClassgeneratorParameter.myTableTools.shallowClone(ClassgeneratorParameter.SFfieldConfig.validAttributesPerType)&lt;br /&gt;
		val = {}&lt;br /&gt;
		for param, attrlist in pairs(ClassgeneratorParameter.SFfieldConfig.validAttributesPerType) do&lt;br /&gt;
			if not val[param] then&lt;br /&gt;
				val[param] = {}&lt;br /&gt;
			end&lt;br /&gt;
			for k, attr in pairs(attrlist) do&lt;br /&gt;
				if attr ~= 'values' then&lt;br /&gt;
					val[param][k] = mw.ustring.gsub(attr, ' ', '_')&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		_debug(self, 2, ' calculated this monster: &amp;lt;pre&amp;gt;' .. ClassgeneratorParameter.myTableTools.printTable(val) .. '&amp;lt;/pre&amp;gt;')&lt;br /&gt;
	end&lt;br /&gt;
	if fieldname == 'input_type' and attribute == 'values' then&lt;br /&gt;
		return ClassgeneratorParameter.SFfieldConfig.validInputTypes&lt;br /&gt;
	end&lt;br /&gt;
	if fieldname == 'base_type' and attribute == 'values' then&lt;br /&gt;
		return ClassgeneratorParameter.SFfieldConfig.validInputTypes&lt;br /&gt;
	end&lt;br /&gt;
	if fieldname == 'uploadable' and attribute == 'show_on_select' then&lt;br /&gt;
		val = {}&lt;br /&gt;
		val['true'] = {'default_filename', 'image_preview'}&lt;br /&gt;
	end&lt;br /&gt;
	_debug(self, 3, '  returning ' .. (type(val) == 'boolean' and (val and 'true' or 'false') or type(val)))&lt;br /&gt;
	return val	-- this value will be used as new value for field's attribute&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function ClassgeneratorParameter.static:sfGenerateForm(embedIn)&lt;br /&gt;
	_debug(self, 1, 'entering ClassgeneratorParameter.static:sfGenerateForm()')&lt;br /&gt;
	local _CFG = self.myConfiguration&lt;br /&gt;
	local embedIn = embedIn or 'Classgenerator[parameter_parameter]'&lt;br /&gt;
	local tagStart = '{{{'&lt;br /&gt;
	local tagEnd = '}}}'&lt;br /&gt;
	-- create the table&lt;br /&gt;
	-- start the html object&lt;br /&gt;
	html = mw.html.create('')&lt;br /&gt;
	html:wikitext(tagStart .. 'for template|' .. _CFG.template.name .. '|label=' .. _CFG.global.entityTitle ..&lt;br /&gt;
		'|embed in field=' .. embedIn .. '|multiple|add button text=' .. _CFG.form.labelCreate .. '|minimum instances=1' .. tagEnd)&lt;br /&gt;
		:node(self:sfGenerateFormTable(self.myConfiguration.form.fieldOrderGeneral))&lt;br /&gt;
		:newline()&lt;br /&gt;
		:wikitext(':')&lt;br /&gt;
		:node(self:sfGenerateFormTable(self.myConfiguration.form.fieldOrderSFgeneral, 'row_parameter'))&lt;br /&gt;
		:newline()&lt;br /&gt;
		:wikitext('::')&lt;br /&gt;
		:node(self:sfGenerateFormTable(self.myConfiguration.form.fieldOrderSFtypeDependent))&lt;br /&gt;
		:wikitext(tagStart .. 'end template' .. tagEnd)&lt;br /&gt;
		:newline()&lt;br /&gt;
	return tostring(html)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- **************** declaration of private methods&lt;br /&gt;
-- use self.class.myConfiguration to access your configuration in a public or a private method that is called by a public method&lt;br /&gt;
_debug = function (self, level, text)&lt;br /&gt;
	if _private[self] and _private[self].dbg then&lt;br /&gt;
		_private[self].dbg:log(level, text)&lt;br /&gt;
	else&lt;br /&gt;
		ClassDebug:log(level, text, tostring(self) .. '.static')&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local _processAttribute = function (self, attr, indent)&lt;br /&gt;
	_debug(self, 1, 'entering private _processAttribute() to print a line for attribute ' .. attr .. ', from ' .. tostring(self))&lt;br /&gt;
	local coreData = self:getCoreData()&lt;br /&gt;
	local ret = ''&lt;br /&gt;
	local omissionList = {'name'}&lt;br /&gt;
	local attr = attr&lt;br /&gt;
	local val = coreData[attr]&lt;br /&gt;
	if type(val) == 'boolean' then&lt;br /&gt;
		val = val and 'true' or 'false'&lt;br /&gt;
	end&lt;br /&gt;
	if val and not ClassgeneratorParameter.myTableTools.inTable(omissionList, attr) then&lt;br /&gt;
		ret = indent .. attr .. ' = '&lt;br /&gt;
		if type(val) == 'table' then&lt;br /&gt;
			ret = ret .. ClassgeneratorParameter.myTableTools.printTable(val, 'inline')&lt;br /&gt;
		elseif val == 'true' or val == 'false' or attr == 'cargo_table' or (attr == 'restricted' and (val == 'global.restrictedTo' or val == 'superglobal.restrictedTo')) or mw.ustring.match(val, '^[0-9]+$') then&lt;br /&gt;
			ret = ret .. val&lt;br /&gt;
		else&lt;br /&gt;
			local valMangled = mw.text.trim(val)&lt;br /&gt;
			valMangled = mw.ustring.gsub(mw.ustring.gsub(valMangled, &amp;quot;\\'&amp;quot;, &amp;quot;'&amp;quot;), &amp;quot;'&amp;quot;, &amp;quot;\\'&amp;quot;)&lt;br /&gt;
			valMangled = mw.ustring.gsub(valMangled, '\n', '\\n\' ..\n' .. indent .. '\t\'')&lt;br /&gt;
			ret = ret .. &amp;quot;'&amp;quot; .. valMangled .. &amp;quot;'&amp;quot;	-- the gsub catches multiline input from textareas&lt;br /&gt;
		end&lt;br /&gt;
		ret = ret .. ','&lt;br /&gt;
		if self.class.myConfiguration.template.addCommentsToConfig then&lt;br /&gt;
			ret = ret .. '\t-- ' .. self.class.myConfiguration.parameter[attr].description&lt;br /&gt;
		end&lt;br /&gt;
		ret = ret .. '\n'&lt;br /&gt;
	end&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local _privateMethod = function (self)&lt;br /&gt;
	_debug(self, 1, 'entering private _privateMethod() to do something, from ' .. tostring(self))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- **************** declaration of public methods&lt;br /&gt;
-- use self.class.myConfiguration to access your configuration in a public method&lt;br /&gt;
function ClassgeneratorParameter:addInfobox()&lt;br /&gt;
	_debug(self, 1, 'entering ClassgeneratorParameter:addInfobox(), from ' .. tostring(self))&lt;br /&gt;
	if self:goodToGo() then&lt;br /&gt;
		local _CFG = self.class.myConfiguration&lt;br /&gt;
		local coreData = self:getPrivate('coreData')&lt;br /&gt;
		local ib_args = {&lt;br /&gt;
			bodyclass = 'infobox_name',&lt;br /&gt;
			aboveclass = 'objtitle titletext',&lt;br /&gt;
			headerclass = 'headertext',&lt;br /&gt;
			labelstyle = 'width: 30%;',&lt;br /&gt;
			datastyle = 'width: 70%;',&lt;br /&gt;
			title = self:getPrivate('uid'),&lt;br /&gt;
			subheader = nil,&lt;br /&gt;
			label1 = _CFG.parameter.name.label,&lt;br /&gt;
			data1 = coreData.name and coreData.name or '',&lt;br /&gt;
			header1 = nil,&lt;br /&gt;
		}&lt;br /&gt;
		self:addOutput(require('Module:Infobox').infobox(ib_args))&lt;br /&gt;
		return true&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function ClassgeneratorParameter:addPageBody()&lt;br /&gt;
	_debug(self, 1, 'entering ClassgeneratorParameter:addPageBody(), from ' .. tostring(self))&lt;br /&gt;
	_debug(self, 2, ' rendering errors and warnings and adding them to output')&lt;br /&gt;
	local frame = mw.getCurrentFrame()&lt;br /&gt;
	self:addOutput(self:renderErrors())&lt;br /&gt;
	self:addOutput(self:renderWarnings())&lt;br /&gt;
	if self:goodToGo() then&lt;br /&gt;
		self:addOutput('No out put yet')&lt;br /&gt;
		return true&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function ClassgeneratorParameter:myArgumentProcessing(coreData)&lt;br /&gt;
	_debug(self, 1, 'entering ClassgeneratorParameter:myArgumentProcessing(args) to process coreData, from ' .. tostring(self))&lt;br /&gt;
	-- function that performs some individual transformation args --&amp;amp;amp;gt; coreData&lt;br /&gt;
	local coreData = coreData&lt;br /&gt;
	-- if dataStore == 'cargo' set sf_cargo_table and sf_cargo_field&lt;br /&gt;
	if (FoundationClass.globalConfig.dataStore == 'cargo' or FoundationClass.globalConfig.dataStore == 'both') and FoundationClass.myYesno(coreData.cargo) and FoundationClass.myYesno(coreData.add_cargo_table_and_field) then&lt;br /&gt;
		coreData.cargo_table = 'global.cargoTable'&lt;br /&gt;
		coreData.cargo_field = coreData.name&lt;br /&gt;
	end&lt;br /&gt;
	coreData.add_cargo_table_and_field = nil&lt;br /&gt;
	if FoundationClass.globalConfig.dataStore == 'smw' or FoundationClass.globalConfig.dataStore == 'both' and FoundationClass.myYesno(coreData.property) then&lt;br /&gt;
		coreData.property_name = mw.ustring.gsub(mw.ustring.gsub(coreData.property_name, ' ', '_'), mw.site.namespaces[mw.title.new('Nul', 'Property').namespace].name .. ':', '')&lt;br /&gt;
	else&lt;br /&gt;
		coreData.property_name = nil&lt;br /&gt;
		coreData.property_type = nil&lt;br /&gt;
	end&lt;br /&gt;
	if coreData.sf and mw.ustring.lower(coreData.sf) == 'holds template' then&lt;br /&gt;
		coreData.sf = 'yes'&lt;br /&gt;
		coreData.holds_template = 'true'&lt;br /&gt;
	end&lt;br /&gt;
	if coreData.show_on_select and type(coreData.show_on_select) == 'table' then&lt;br /&gt;
		local sos = {}&lt;br /&gt;
		for _, selector in pairs(coreData.show_on_select) do&lt;br /&gt;
			local value, field = mw.ustring.match(selector, '^([^= ]+)%s*=%s*(.+)$')&lt;br /&gt;
			if value and field then&lt;br /&gt;
				if not sos[value] then&lt;br /&gt;
					sos[value] = {}&lt;br /&gt;
				end&lt;br /&gt;
				table.insert(sos[value], field)&lt;br /&gt;
			else&lt;br /&gt;
				addError('Error processing value for \'\'' .. self.class.myConfiguration.parameter.show_on_select.label .. '\'\': ' .. &lt;br /&gt;
					ClassgeneratorParameter.myTableTools.printTable(coreData.show_on_select) .. ' on entry :' .. mw.text.encode(selector))&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		coreData.show_on_select = sos&lt;br /&gt;
		--coreData.show_on_select = FoundationClass.myTableTools.printTable(sos)&lt;br /&gt;
		--coreData.show_on_select = FoundationClass.myTableTools.printTable(coreData.show_on_select)&lt;br /&gt;
	end&lt;br /&gt;
	-- kill two cosmetical switches&lt;br /&gt;
	coreData.cargo = nil&lt;br /&gt;
	coreData.property = nil&lt;br /&gt;
	return coreData	-- this is your new coreData.&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function ClassgeneratorParameter:myPlausibilityTest(args)&lt;br /&gt;
	_debug(self, 1, 'entering ClassgeneratorParameter:myPlausibilityTest(args) to test arguments, from ' .. tostring(self))&lt;br /&gt;
	local _CFG = self.class.myConfiguration&lt;br /&gt;
	-- function that performs the individual plausibility tests&lt;br /&gt;
	-- note: before you access a field args.fieldname you should check for existance&lt;br /&gt;
	-- self:addError(text)&lt;br /&gt;
	if args.name and not mw.ustring.match(args.name, '^[a-zA-Z_][0-9a-zA-Z_-]*$') then&lt;br /&gt;
		self:addError('Invalid value detected for parameter ' .. _CFG.parameter.name.label .. ': &amp;quot;' .. mw.text.encode(tostring(args.name)) .. '&amp;quot;')&lt;br /&gt;
	end&lt;br /&gt;
	if args.cargo_size and not mw.ustring.match(args.cargo_size, '^[0-9]*$') then&lt;br /&gt;
		self:addError('Invalid value detected for parameter ' .. _CFG.parameter.cargo_size.label .. ': &amp;quot;' .. mw.text.encode(tostring(args.cargo_size)) .. '&amp;quot;')&lt;br /&gt;
	end&lt;br /&gt;
	if args.cols and not mw.ustring.match(args.cols, '^[0-9]*$') then&lt;br /&gt;
		self:addError('Invalid value detected for parameter ' .. _CFG.parameter.cols.label .. ': &amp;quot;' .. mw.text.encode(tostring(args.cols)) .. '&amp;quot;')&lt;br /&gt;
	end&lt;br /&gt;
	if args.max_values and not mw.ustring.match(args.max_values, '^[0-9]*$') then&lt;br /&gt;
		self:addError('Invalid value detected for parameter ' .. _CFG.parameter.max_values.label .. ': &amp;quot;' .. mw.text.encode(tostring(args.max_values)) .. '&amp;quot;')&lt;br /&gt;
	end&lt;br /&gt;
	if args.maxlength and not mw.ustring.match(args.maxlength, '^[0-9]*$') then&lt;br /&gt;
		self:addError('Invalid value detected for parameter ' .. _CFG.parameter.maxlength.label .. ': &amp;quot;' .. mw.text.encode(tostring(args.maxlength)) .. '&amp;quot;')&lt;br /&gt;
	end&lt;br /&gt;
	if args.rows and not mw.ustring.match(args.rows, '^[0-9]*$') then&lt;br /&gt;
		self:addError('Invalid value detected for parameter ' .. _CFG.parameter.rows.label .. ': &amp;quot;' .. mw.text.encode(tostring(args.rows)) .. '&amp;quot;')&lt;br /&gt;
	end&lt;br /&gt;
	if args.size and not mw.ustring.match(args.size, '^[0-9]*$') then&lt;br /&gt;
		self:addError('Invalid value detected for parameter ' .. _CFG.parameter.size.label .. ': &amp;quot;' .. mw.text.encode(tostring(size.cols)) .. '&amp;quot;')&lt;br /&gt;
	end&lt;br /&gt;
	return false	-- return value will be ignored. but if you add any error, the object's initialization will fail with the error&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function ClassgeneratorParameter:myStashAdjustments(stash)&lt;br /&gt;
	_debug(self, 1, 'entering ClassgeneratorParameter:myStashAdjustments(stash) to do some minor adjustments on data before storing, from ' .. tostring(self))&lt;br /&gt;
	-- function that alters the stash before storing the data&lt;br /&gt;
	local stash = stash&lt;br /&gt;
	return stash	-- this is your new stash. this will be stored. it has format (fieldname: value)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function ClassgeneratorParameter:render()&lt;br /&gt;
	_debug(self, 1, 'entering ClassgeneratorParameter:render() to render the code I pass to template class generator, from ' .. tostring(self))&lt;br /&gt;
	local str = ''&lt;br /&gt;
	if self:goodToGo() then&lt;br /&gt;
		local _CFG = self.class.myConfiguration&lt;br /&gt;
		local coreData = self:getCoreData()&lt;br /&gt;
		local indent = '\t'&lt;br /&gt;
		local sfAttributes = {}&lt;br /&gt;
		for _, val in pairs(_CFG.form.fieldOrderSFgeneral) do&lt;br /&gt;
			table.insert(sfAttributes, val)&lt;br /&gt;
		end&lt;br /&gt;
		for _, val in pairs(_CFG.form.fieldOrderSFtypeDependent) do&lt;br /&gt;
			table.insert(sfAttributes, val)&lt;br /&gt;
		end&lt;br /&gt;
		table.sort(sfAttributes)&lt;br /&gt;
		if FoundationClass.myYesno(coreData.sf, true) then&lt;br /&gt;
			str = str .. coreData.name&lt;br /&gt;
		end&lt;br /&gt;
		str = str .. _CFG.template.delimiterFormFieldName&lt;br /&gt;
		str = str .. indent .. coreData.name .. ' = {\n'&lt;br /&gt;
		for _, globalAttr in pairs(_CFG.form.fieldOrderGeneral) do&lt;br /&gt;
			if globalAttr ~= 'sf' then&lt;br /&gt;
				str = str .. _processAttribute(self, globalAttr, indent .. '\t')&lt;br /&gt;
			elseif coreData.sf ~= 'Information' then&lt;br /&gt;
				local sf = ''&lt;br /&gt;
				sf = sf .. _processAttribute(self, 'cargo_table', indent .. '\t\t')&lt;br /&gt;
				sf = sf .. _processAttribute(self, 'cargo_field', indent .. '\t\t')&lt;br /&gt;
				for _, sfAttr in pairs(sfAttributes) do&lt;br /&gt;
					sf = sf .. _processAttribute(self, sfAttr, indent .. '\t\t')&lt;br /&gt;
				end&lt;br /&gt;
				if mw.ustring.len(sf) &amp;gt; 0 then&lt;br /&gt;
					str = str .. indent .. '\t' .. 'sf = {\n' .. sf .. indent .. '\t' .. '},\n'&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		str = str .. indent .. '},\n' .. _CFG.template.delimiterResult&lt;br /&gt;
	else&lt;br /&gt;
		str = tostring(self:renderErrors())&lt;br /&gt;
	end&lt;br /&gt;
	return str&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return ClassgeneratorParameter&lt;/div&gt;</summary>
		<author><name>Anatol</name></author>
	</entry>
	<entry>
		<id>https://camnet.oetterer.eu/index.php?title=Hauptseite&amp;diff=1016</id>
		<title>Hauptseite</title>
		<link rel="alternate" type="text/html" href="https://camnet.oetterer.eu/index.php?title=Hauptseite&amp;diff=1016"/>
		<updated>2016-02-09T22:18:09Z</updated>

		<summary type="html">&lt;p&gt;Anatol: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
__NOEDITSECTION__&lt;br /&gt;
__NOGLOSSARY__&lt;br /&gt;
&amp;lt;div class=&amp;quot;left-coloumn&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h2 class=&amp;quot;mainpage&amp;quot;&amp;gt;Die letzten Geschehnisse&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;subsection&amp;quot;&amp;gt;&lt;br /&gt;
{{#ask: [[has chapter number::+]] | ?has chapter number | ?has subchapter number | ?title is | ?took place from#MEDIAWIKI | ?took place until#MEDIAWIKI | ?took mainly place in | ? | ?short description is | mainlabel=- | sort=took place from,has chapter number,has subchapter number | order=descending,descending,descending | format=template | template=Print chapter facts | sep= | limit=3 | searchlabel= | userparam=2}}&lt;br /&gt;
&lt;br /&gt;
Hier geht's zur kompletten [[Chronik]].&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;!--&amp;lt;h2 class=&amp;quot;mainpage&amp;quot;&amp;gt;FAQ&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;subsection&amp;quot;&amp;gt;&lt;br /&gt;
=== Vorteile ===&lt;br /&gt;
* '''Unsterblichkeit''' Sehen zumindest die meisten als einen Vorteil an.&lt;br /&gt;
* '''Erhöhte Schadensresistenz''' Zumindest was herkömmlichen Schlagschaden angeht.&lt;br /&gt;
* '''Regeneration''' Die Macht des Blutes heilt viel und schnell.&lt;br /&gt;
* '''Übernatürliche Fähigkeiten''' Besitzen alle Vampire, gemäß ihrer Blutlinie oder ihres Clans. Unter Kainiten heißen sie Disziplinen.&lt;br /&gt;
&lt;br /&gt;
=== Nachteile ===&lt;br /&gt;
* '''Blutdurst''' Begleitet einen Vampir sein Unleben lang. Schließlich muss er Blut trinken, um weiter zu existieren.&lt;br /&gt;
* '''Feuer''' Ist schmerzhafter und tödlicher für den Vampir als für normale Menschen.&lt;br /&gt;
* '''Sonnenlicht''' Tötet den Vampir normalerweise binnen Sekunden. Es sei denn, man besitzt sehr viel [[Seelenstärke]].&lt;br /&gt;
* &amp;quot;'''Der Pflock durchs Herz''' tötet nicht nur einen Vampir.&amp;quot;, so heiß es scherzhaft. Nun, der Pflock tötet den Vampir zwar nicht, versetzt ihn aber in eine Starre, während der er zwar noch alles wahrnimmt, sich aber nicht mehr bewegen kann.&lt;br /&gt;
&lt;br /&gt;
=== Gerüchte ===&lt;br /&gt;
==== Vampire schrecken vor Knoblauch zurück ====&lt;br /&gt;
''Falsch'', es sei denn, sie sind [[Toreador]] und haben vergessen, dass sie nicht atmen müssen.&lt;br /&gt;
&lt;br /&gt;
==== Vampire haben Angst vor Kreuzen ====&lt;br /&gt;
'''''Falsch'''''. Es sei denn, sie werden von Wesen mit wahrem Glauben getragen. Dann kann es sehr brenzlig werden.&lt;br /&gt;
&lt;br /&gt;
==== Ein Vampir hat kein Spiegelbild ====&lt;br /&gt;
'''Falsch''', zumindest für die meisten. Es sei denn, man ist [[Lasombra]].&lt;br /&gt;
&lt;br /&gt;
==== Ein Vampir kann kein fließendes Wasser überqueren ====&lt;br /&gt;
'''Falsch''', außer für ein paar obskure Sonderlinge, die scheinbar tatsächlich an so einem Manko leiden.&lt;br /&gt;
&lt;br /&gt;
==== Vampire haben ein leichenhaftes Äußeres ====&lt;br /&gt;
&lt;br /&gt;
==== Vampire müssen in ihrer Heimaterde schlafen ====&lt;br /&gt;
'''Falsch''', von den [[Tzimisce]] mal abgesehen.&lt;br /&gt;
&lt;br /&gt;
==== Vampire können sich in eine Fledermaus oder in Nebel verwandeln ====&lt;br /&gt;
'''Falsch''', nur diejenigen, die die Disziplin [[Tierhaftigkeit]] gut genug beherrschen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;--&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;right-coloumn&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;hSpacer&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h2 class=&amp;quot;mainpage&amp;quot;&amp;gt;Interessantes&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;subsection&amp;quot;&amp;gt;&lt;br /&gt;
[[Bild:Victoria_Frances.jpg|right|300px|Vampiresse]]&lt;br /&gt;
&lt;br /&gt;
Heute ist die Nacht vom 18. auf den 19. April 2000. Es ist früh morgens und der Hauptteil des Klüngels befindet sich über dem Atlantik.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bekannte Termine:&lt;br /&gt;
* '''4. bis 8. Mai 2016, Wildemann im Harz: Alle'''&amp;lt;!--'''keine''' --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear: both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2 class=&amp;quot;mainpage&amp;quot;&amp;gt;Spielercharaktere&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;subsection&amp;quot;&amp;gt;&lt;br /&gt;
{{#ask: [[Kategorie:Charakter]] [[is of category::SC]] | ?# - | ?Goes by name | mainlabel=- | sort=Goes by name | order=ascending | format=list | template=Get link from query | sep=&amp;amp;emsp;&amp;amp;bull;&amp;amp;emsp;}}&lt;br /&gt;
&amp;lt;/div&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2 class=&amp;quot;mainpage&amp;quot;&amp;gt;Nichtspielercharaktere&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;subsection&amp;quot;&amp;gt;&lt;br /&gt;
{{#ask: [[Kategorie:Charakter]] [[is of category::NSC]] | ?# - | ?Goes by name | mainlabel=- | sort=Goes by name | order=ascending | format=list | template=Get link from query | sep=&amp;amp;emsp;&amp;amp;bull;&amp;amp;emsp; | limit=100}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear: both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
{{#ask: [[title is::+]] | ?title is#-=| ?is associated to chapter=Kapitel | ?took place from#MEDIAWIKI=Datum | ?took place until#MEDIAWIKI=Datum | ?took mainly place in=Ort | ?cast is=Teilnehmer | ?short description is=Beschreibung| headers=plain| sort=took place from | order=ascending | format=timeline | timelinebands=WEEK,MONTH | timelinesize=500px}}&lt;br /&gt;
&lt;br /&gt;
{{#compound_query: [[is map object::1]] [[is of content type::Event]];?has geo coordinates=Koordinate;?title is=Name;?took place from=Datum;?has address=Adresse;?located in city=Stadt;?-Has subobject=Seite;?short description is=Beschreibung;headers=plain&lt;br /&gt;
| [[is map object::1]] [[is of content type::Marker]];?has geo coordinates=Koordinate;?bears the name=Titel;?has address=Adresse;?located in city=Stadt;?-Has subobject=Seite;?short description is=Beschreibung;headers=plain;icon=Blue_marker.png&lt;br /&gt;
| [[is map object::1]] [[is of content type::Location]];?has geo coordinates=Koordinate;?mainfunction is=Funktion;?is operated by=Verantwortlich;?has address=Adresse;?located in city=Stadt;?short description is=Beschreibung;headers=plain;icon=Green_marker.png&lt;br /&gt;
| format=googlemaps&lt;br /&gt;
| height=800&lt;br /&gt;
| markercluster=off&lt;br /&gt;
| types=normal,satellite,hybrid,physical,earth&lt;br /&gt;
| intro=&amp;lt;h2&amp;gt;Karte&amp;lt;/h2&amp;gt;&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Anatol</name></author>
	</entry>
	<entry>
		<id>https://camnet.oetterer.eu/index.php?title=Modul:Classgenerator/class&amp;diff=1012</id>
		<title>Modul:Classgenerator/class</title>
		<link rel="alternate" type="text/html" href="https://camnet.oetterer.eu/index.php?title=Modul:Classgenerator/class&amp;diff=1012"/>
		<updated>2016-02-09T21:11:05Z</updated>

		<summary type="html">&lt;p&gt;Anatol: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local FoundationClass = require('Module:Foundationclass')&lt;br /&gt;
local ClassDebug = require('Module:Debug/class')&lt;br /&gt;
&lt;br /&gt;
-- ****************************************************************&lt;br /&gt;
-- *                         inheritance                          *&lt;br /&gt;
-- ****************************************************************&lt;br /&gt;
local Classgenerator = FoundationClass:subclass('Classgenerator')&lt;br /&gt;
-- setting class's configuration data&lt;br /&gt;
Classgenerator.static.myConfiguration = mw.loadData('Module:Classgenerator/config')&lt;br /&gt;
--   being in a static method, use self.myConfiguration&lt;br /&gt;
--   being in a private method, that knows self or in a public method, use self.class.myConfiguration&lt;br /&gt;
&lt;br /&gt;
-- ****************************************************************&lt;br /&gt;
-- *                          properties                          *&lt;br /&gt;
-- ****************************************************************&lt;br /&gt;
&lt;br /&gt;
-- **************** initialization of table for private properties&lt;br /&gt;
local _private = setmetatable({}, {__mode = 'k'})   -- weak table storing all private attributes&lt;br /&gt;
&lt;br /&gt;
-- **************** declaration of public static properties&lt;br /&gt;
-- Classgenerator.static.myPropertyModule = require('Module:extern')&lt;br /&gt;
-- Classgenerator.static.staticProperty = 'value'&lt;br /&gt;
&lt;br /&gt;
-- remember the static classes provided by Foundationclass:&lt;br /&gt;
-- Classgenerator.globalConfig&lt;br /&gt;
-- Classgenerator.myCargoUtil&lt;br /&gt;
-- Classgenerator.myTableTools&lt;br /&gt;
&lt;br /&gt;
-- **************** declaration of (global) private properties&lt;br /&gt;
-- for properties you should rather use constructor and _private[self]. this only, if you need a private class property&lt;br /&gt;
-- you should, however predeclare private methods here&lt;br /&gt;
local _debug	-- private method declared later&lt;br /&gt;
local _privateMethodAhead	-- declaration ahead, so this private method can be used in the constructor and in other private methods&lt;br /&gt;
&lt;br /&gt;
-- ***************************************************************&lt;br /&gt;
-- *                           methods                           *&lt;br /&gt;
-- ***************************************************************&lt;br /&gt;
 &lt;br /&gt;
-- **************** declaration of static methods&lt;br /&gt;
function Classgenerator:initialize(uid)&lt;br /&gt;
	local _CFG = self.class.myConfiguration&lt;br /&gt;
	FoundationClass.initialize(self, uid)&lt;br /&gt;
	local page = mw.title.getCurrentTitle().text&lt;br /&gt;
	if uid and mw.ustring.match(uid, '^' .. _CFG.global.namespace .. ':.+$') then&lt;br /&gt;
		page = mw.ustring.match(uid, '^' .. _CFG.global.namespace .. ':(.+)$')&lt;br /&gt;
	end&lt;br /&gt;
	_private[self] = {&lt;br /&gt;
		dbg = ClassDebug:new(tostring(self.class) .. ': id ' .. uid),&lt;br /&gt;
		pagename = page&lt;br /&gt;
	}&lt;br /&gt;
	_debug(self, 1, ' Classgenerator: done initializing object &amp;amp;quot;' .. uid ..'&amp;amp;quot;, from ' .. tostring(self))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- use use self.myConfiguration to access your configuration in a static method&lt;br /&gt;
function Classgenerator.static:aStaticMethod(var)&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator.static:aStaticMethod() to do something, from ' .. tostring(self))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Classgenerator.static:mySfDynamicFieldAttribute(fieldname, attribute, value)&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator.static:mySfDynamicFieldAttribute(fieldname, attribute, value), from ' .. tostring(self))&lt;br /&gt;
	_debug(self, 2, ' with parameters &amp;amp;quot;' .. fieldname .. '&amp;amp;quot;, &amp;amp;quot;' .. attribute .. '&amp;amp;quot; and a ' .. type(value) .. ' value')&lt;br /&gt;
	-- function that can process any attribute/value pair just before rendering the semantic forms field&lt;br /&gt;
	-- usually done, to generate a dynamic 'default' value&lt;br /&gt;
	-- keep in mind: you can completely disable a form field, if you return true on attribute &amp;quot;disable&amp;quot;. note however, that this causes the field to not show at all, no data will be transported/saved&lt;br /&gt;
	local pagename = mw.title.getCurrentTitle().rootText&lt;br /&gt;
	local val = value&lt;br /&gt;
	if Classgenerator.myTableTools.inTable({'template_name', 'global_entityTitle'}, fieldname) and attribute == 'default' then&lt;br /&gt;
		val = pagename&lt;br /&gt;
	end&lt;br /&gt;
	if fieldname == 'global_cargoTable' and attribute == 'default' then&lt;br /&gt;
		val = mw.ustring.lower(pagename)&lt;br /&gt;
	end&lt;br /&gt;
	if Classgenerator.globalConfig.dataStore ~= 'cargo' and Classgenerator.globalConfig.dataStore ~= 'both' then&lt;br /&gt;
		if fieldname == 'global_cargoTable' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
		if fieldname == 'global_cargoUidFieldname' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if Classgenerator.globalConfig.dataStore ~= 'smw' and Classgenerator.globalConfig.dataStore ~= 'both' then&lt;br /&gt;
		if fieldname == 'global_smwIsSubobject' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
		if fieldname == 'global_smwUseStorage' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
		if fieldname == 'global_autocreate_property' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return val	-- this value will be used as new value for field's attribute&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Classgenerator.static:sfGenerateForm()&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator.static:sfGenerateForm(), from ' .. tostring(self))&lt;br /&gt;
	local _CFG = self.myConfiguration&lt;br /&gt;
	local ClassgeneratorParameter  = require('Module:Classgenerator/parameter/class')&lt;br /&gt;
	local ClassSFfield = require('Module:SFfield/class')&lt;br /&gt;
	local tagStart = '{{{'&lt;br /&gt;
	local tagEnd = '}}}'&lt;br /&gt;
	local frame = mw.getCurrentFrame()&lt;br /&gt;
	-- create the form header&lt;br /&gt;
	local notification = mw.html.create('')&lt;br /&gt;
	if _CFG.form.notification and mw.ustring.len(_CFG.form.notification) &amp;gt; 0 then&lt;br /&gt;
		local mbox = require('Module:Message box')&lt;br /&gt;
		notification:wikitext(mbox.main('ombox', { text = _CFG.form.notification }))&lt;br /&gt;
			:newline()&lt;br /&gt;
	end&lt;br /&gt;
	local formheader = mw.html.create('')&lt;br /&gt;
	formheader:wikitext(self:sfGenerateFormInfoTag())&lt;br /&gt;
		:wikitext('&amp;lt;h2&amp;gt;' .. _CFG.global.entityTitle .. '&amp;lt;/h2&amp;gt;')&lt;br /&gt;
		:tag('p')&lt;br /&gt;
			:wikitext(_CFG.form.headerText)&lt;br /&gt;
			:done()&lt;br /&gt;
			:newline()&lt;br /&gt;
		:node(notification)&lt;br /&gt;
		:tag('div')&lt;br /&gt;
			:attr('id', 'wikiPreview')&lt;br /&gt;
			:cssText('display: none; padding-bottom: 25px; margin-bottom: 25px; border-bottom: 1px solid #AAAAAA;')&lt;br /&gt;
			:done()&lt;br /&gt;
			:newline()&lt;br /&gt;
	-- create the form buttons&lt;br /&gt;
	local formbuttons = mw.html.create('div')&lt;br /&gt;
	for _, button in pairs(_CFG.form.buttons) do&lt;br /&gt;
		formbuttons:wikitext(tagStart .. 'standard input&amp;amp;#124;' .. button .. tagEnd)&lt;br /&gt;
	end&lt;br /&gt;
	formbuttons:addClass('formbuttons')&lt;br /&gt;
		:done()&lt;br /&gt;
	-- calculate the fieldlists:&lt;br /&gt;
	local fieldlists = {}&lt;br /&gt;
	for _, field in pairs(_CFG.form.fieldOrder) do&lt;br /&gt;
		local tab = mw.ustring.match(field, '^([a-z]+)_.+')&lt;br /&gt;
		if not fieldlists[tab] then&lt;br /&gt;
			fieldlists[tab] = {}&lt;br /&gt;
		end&lt;br /&gt;
		table.insert(fieldlists[tab], field)&lt;br /&gt;
	end&lt;br /&gt;
	-- assemble everything, so start the html object&lt;br /&gt;
	local html = mw.html.create('div')&lt;br /&gt;
	html:node(formheader)&lt;br /&gt;
		:wikitext('&amp;lt;h1&amp;gt;GLOBAL-Section&amp;lt;/h1&amp;gt;')&lt;br /&gt;
		:newline()&lt;br /&gt;
		:tag('div')&lt;br /&gt;
			:wikitext('This section deals with all the class\'s global data, i.e. all data you need for your &amp;quot;template&amp;quot; part as wenn as for your form, ... ')&lt;br /&gt;
			:done()&lt;br /&gt;
			:newline()&lt;br /&gt;
		:wikitext(tagStart .. 'for template|' .. _CFG.template.name .. '|label=' .. _CFG.global.entityTitle .. tagEnd)&lt;br /&gt;
		:newline()&lt;br /&gt;
		:node(self:sfGenerateFormTable(fieldlists.global))&lt;br /&gt;
		:newline()&lt;br /&gt;
		:wikitext('&amp;lt;h1&amp;gt;FORM-Section&amp;lt;/h1&amp;gt;')&lt;br /&gt;
		:newline()&lt;br /&gt;
		:tag('div')&lt;br /&gt;
			:wikitext('This section deals with all the data, you need to create and operate a form for this class. If you don\'t want a form, disable this section. ' ..&lt;br /&gt;
					'If you need a form (e.g. as part of another form), but no form page, enable this section but leave the field for form page name emtpy.')&lt;br /&gt;
			:done()&lt;br /&gt;
			:newline()&lt;br /&gt;
		:node(self:sfGenerateFormTable(fieldlists.form))&lt;br /&gt;
		:newline()&lt;br /&gt;
		:wikitext('&amp;lt;h1&amp;gt;TEMPLATE-Section&amp;lt;/h1&amp;gt;')&lt;br /&gt;
		:newline()&lt;br /&gt;
		:tag('div')&lt;br /&gt;
			:wikitext('This section deals with all the data, you need to create and operate a template for this class. If you need tempalte specific parameters ' ..&lt;br /&gt;
				'(meaning parameteres that you only need to operate the &amp;quot;action&amp;quot;-part), put them into this section\'s custom field')&lt;br /&gt;
			:done()&lt;br /&gt;
			:newline()&lt;br /&gt;
		:node(self:sfGenerateFormTable(fieldlists.template))&lt;br /&gt;
		:newline()&lt;br /&gt;
		:wikitext('&amp;lt;h1&amp;gt;PARAMETERS-Section&amp;lt;/h1&amp;gt;')&lt;br /&gt;
		:newline()&lt;br /&gt;
		:tag('div')&lt;br /&gt;
			:wikitext('This section deals with all your parameters. You need an entry for every form input field, every template parameter, every data field you want to store, and even every notification line.')&lt;br /&gt;
			:tag('ul')&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(&amp;quot;To produce a normal parameter, add an entry, choose storage type, set '''Regular form parameter''' to yes, choose a form input type, and a template doc type.&amp;quot;)&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(&amp;quot;If you want a data field to be stored in your data storage but not defined in the form, choose a data storage type and set '''Regular form parameter''' to no. &amp;quot;)&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(&amp;quot;If you want a mutiple template to be parsed to a parameter, create a normal parameter (as described above) and choose '''Regular form parameter''' to  be ''Holds template''.&amp;quot;)&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(&amp;quot;A parameter with a form input that is not stored is created like a regular parameter but without setting any data storage type.&amp;quot;)&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(&amp;quot;Finally, you can create a message line. This is useful, if you want to convey any information to the user, that is to important for a description-tooltip. &amp;quot; ..&lt;br /&gt;
						&amp;quot;What you need to do is disable everything ('''Template doc parameter type ''', data storage) and set '''Regular form parameter''' to ''Information''. &amp;quot; ..&lt;br /&gt;
						&amp;quot;You probalby want to add the parameter to one or more ''show on select'' entries, too.&amp;quot;)&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
				:done()&lt;br /&gt;
				:newline()&lt;br /&gt;
			:done()&lt;br /&gt;
			:newline()&lt;br /&gt;
		:node(self:sfInitField('parameter_parameter'):render())&lt;br /&gt;
		:newline()&lt;br /&gt;
		:wikitext(frame:extensionTag('headertabs'))&lt;br /&gt;
		:newline()&lt;br /&gt;
		:wikitext(&amp;quot;'''(*) Pflichtfeld'''&amp;quot;)&lt;br /&gt;
		:newline()&lt;br /&gt;
		:wikitext(tagStart .. 'end template' .. tagEnd)&lt;br /&gt;
		:newline()&lt;br /&gt;
		:wikitext(ClassgeneratorParameter:sfGenerateForm())&lt;br /&gt;
		:newline()&lt;br /&gt;
		:node(formbuttons)&lt;br /&gt;
	local debugLevel = FoundationClass.globalConfig.debugLevel or self.myConfiguration.global.debugLevel&lt;br /&gt;
	if debugLevel then&lt;br /&gt;
		html:newline()&lt;br /&gt;
			:newline()&lt;br /&gt;
			:wikitext(ClassDebug:printLog(debugLevel))&lt;br /&gt;
	end&lt;br /&gt;
	return html&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- **************** declaration of private methods&lt;br /&gt;
-- use self.class.myConfiguration to access your configuration in a public or a private method that is called by a public method&lt;br /&gt;
_debug = function (self, level, text)&lt;br /&gt;
	if _private[self] and _private[self].dbg then&lt;br /&gt;
		local debugLevel = FoundationClass.globalConfig.debugLevel or self.class.myConfiguration.global.debugLevel&lt;br /&gt;
		if debugLevel and level &amp;lt;= debugLevel then&lt;br /&gt;
			_private[self].dbg:log(level, text)&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		local debugLevel = FoundationClass.globalConfig.debugLevel or self.myConfiguration.global.debugLevel&lt;br /&gt;
		if debugLevel and level &amp;lt;= debugLevel then&lt;br /&gt;
			ClassDebug:log(level, text, tostring(self) .. '.static')&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local _namespaceName = function (self, namespaceId)&lt;br /&gt;
	_debug(self, 1, 'entering private _namespaceName() to translate namespace namespaceId ' .. namespaceId .. ' into a universal name, from ' .. tostring(self))&lt;br /&gt;
	local ret, nulProperty = pcall(mw.title.new, 'NUL', 'Property')&lt;br /&gt;
	if ret and (namespaceId == nulProperty.namespace) then&lt;br /&gt;
		return 'property'	-- if you change this, check on other places, this is checked against and change that, too&lt;br /&gt;
	else&lt;br /&gt;
		return mw.site.namespaces[namespaceId].canonicalName&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local _processAttribute = function (self, attr, indent, name)&lt;br /&gt;
	_debug(self, 1, 'entering private _processAttribute() to print a line for attribute ' .. attr .. ', from ' .. tostring(self))&lt;br /&gt;
	local coreData = self:getCoreData()&lt;br /&gt;
	local attr = attr&lt;br /&gt;
	local val = coreData[attr]&lt;br /&gt;
	if type(val) == 'boolean' then&lt;br /&gt;
		val = val and 'true' or 'false'&lt;br /&gt;
	end&lt;br /&gt;
	local ret = ''&lt;br /&gt;
	local fieldname = mw.ustring.match(attr, '^[^_]+_(.+)$')&lt;br /&gt;
	ret = indent .. (name and name or fieldname) .. ' = '&lt;br /&gt;
	if not val then&lt;br /&gt;
		ret = ret .. 'nil'&lt;br /&gt;
	elseif type(val) == 'table' then&lt;br /&gt;
		ret = ret .. Classgenerator.myTableTools.printTable(val, 'inline')&lt;br /&gt;
	elseif val == 'true' or val == 'false' or mw.ustring.match(val, '^[0-9]+$') or (attr == 'global_gardeningCategory' and val == 'superglobal.gardeningCategory') then&lt;br /&gt;
		ret = ret .. val&lt;br /&gt;
	else&lt;br /&gt;
		ret = ret .. &amp;quot;'&amp;quot; .. mw.ustring.gsub(mw.ustring.gsub(mw.ustring.gsub(val, &amp;quot;\\'&amp;quot;, &amp;quot;'&amp;quot;), &amp;quot;'&amp;quot;, &amp;quot;\\'&amp;quot;), '\n', '\\n\' ..\n' .. indent .. '\t\'') .. &amp;quot;'&amp;quot;	-- the gsub catches multiline input from textareas&lt;br /&gt;
	end&lt;br /&gt;
	ret = ret .. ','&lt;br /&gt;
	if self.class.myConfiguration.template.addCommentsToConfig then&lt;br /&gt;
		ret = ret .. '\t-- ' .. self.class.myConfiguration.parameter[attr].description&lt;br /&gt;
	end&lt;br /&gt;
	ret = ret .. '\n'&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local _privateMethod = function (self)&lt;br /&gt;
	_debug(self, 1, 'entering private _privateMethod() to do something, from ' .. tostring(self))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- **************** declaration of public methods&lt;br /&gt;
-- use self.class.myConfiguration to access your configuration in a public method&lt;br /&gt;
function Classgenerator:addInfobox()&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator:addInfobox(), from ' .. tostring(self))&lt;br /&gt;
	if self:goodToGo() then&lt;br /&gt;
		local _CFG = self.class.myConfiguration&lt;br /&gt;
		local coreData = self:getCoreData()&lt;br /&gt;
		local usesSmw = FoundationClass.globalConfig.dataStore and (FoundationClass.globalConfig.dataStore == 'both' or FoundationClass.globalConfig.dataStore == 'smw') and FoundationClass.myYesno(coreData.global_smwUseStorage)&lt;br /&gt;
		local ib_args = {&lt;br /&gt;
			bodyclass = 'infobox_name',&lt;br /&gt;
			aboveclass = 'objtitle titletext',&lt;br /&gt;
			headerclass = 'headertext',&lt;br /&gt;
			labelstyle = 'width: 30%;',&lt;br /&gt;
			datastyle = 'width: 70%;',&lt;br /&gt;
			title = coreData.className,&lt;br /&gt;
			subheader = 'Class',&lt;br /&gt;
			label1 = 'Title',&lt;br /&gt;
			data1 = coreData.global_entityTitle and coreData.global_entityTitle or '',&lt;br /&gt;
			label2 = _CFG.parameter.global_edit_timestamp.label,&lt;br /&gt;
			data2 = coreData.last_edited,&lt;br /&gt;
			label3 = 'Store available',&lt;br /&gt;
			data3 = (FoundationClass.globalConfig.dataStore and mw.ustring.len(FoundationClass.globalConfig.dataStore) &amp;gt; 0) and FoundationClass.globalConfig.dataStore or '',&lt;br /&gt;
			label5 = 'Cargo table',&lt;br /&gt;
			data5 = (FoundationClass.globalConfig.dataStore and (FoundationClass.globalConfig.dataStore == 'both' or FoundationClass.globalConfig.dataStore == 'cargo')) and coreData.global_cargoTable or '',&lt;br /&gt;
			label6 = 'Smw class',&lt;br /&gt;
			data6 = usesSmw and _private[self].pagename or '',&lt;br /&gt;
			data7 = coreData.global_description,&lt;br /&gt;
			header10 = 'Pages',&lt;br /&gt;
			label12 = 'Module',&lt;br /&gt;
			data12 = _private[self].pagename and '[[Module:' .. _private[self].pagename .. ']]' or '',&lt;br /&gt;
			label13 = 'Class',&lt;br /&gt;
			data13 = _private[self].pagename and '[[Module:' .. _private[self].pagename .. '/class]]' or '',&lt;br /&gt;
			label14 = 'Config',&lt;br /&gt;
			data14 = _private[self].pagename and '[[Module:' .. _private[self].pagename .. '/config]]' or '',&lt;br /&gt;
			label17 = 'Template',&lt;br /&gt;
			data17 = coreData.template_name and '[[Template:' .. coreData.template_name .. ']]' or '',&lt;br /&gt;
			label19 = 'Form',&lt;br /&gt;
			data19 = coreData.page.form and '[[:' .. coreData.page.form.name .. ']]' or '',&lt;br /&gt;
			label21 = 'Category',&lt;br /&gt;
			data21 = coreData.page.category and '[[:' .. coreData.page.category.name .. ']]' or '',&lt;br /&gt;
			label22 = 'Gardening',&lt;br /&gt;
			data22 = coreData.page.gardeningCategory and '[[:' .. coreData.page.gardeningCategory.name .. ']]' or '',&lt;br /&gt;
		}&lt;br /&gt;
		if usesSmw and coreData.properties.order and #coreData.properties.order &amp;gt; 0 then&lt;br /&gt;
			ib_args.header30 = 'Properties'&lt;br /&gt;
			local i = 31&lt;br /&gt;
			for _, property in pairs(coreData.properties.order) do&lt;br /&gt;
				ib_args['label' .. i] = coreData.properties.data[property].type&lt;br /&gt;
				ib_args['data' .. i] = '[[Property:' .. property .. '|' .. property .. ']]'&lt;br /&gt;
				i = i + 1&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		self:addOutput(require('Module:Infobox').infobox(ib_args))&lt;br /&gt;
		return true&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Classgenerator:addPageBody()&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator:addPageBody(), from ' .. tostring(self))&lt;br /&gt;
	_debug(self, 2, ' rendering errors and warnings and adding them to output')&lt;br /&gt;
	self:addOutput(self:renderErrors())&lt;br /&gt;
	self:addOutput(self:renderWarnings())&lt;br /&gt;
	if self:goodToGo() then&lt;br /&gt;
		local frame = mw.getCurrentFrame()&lt;br /&gt;
		local lang = mw.language.new('en-gb')&lt;br /&gt;
		local _CFG = self.class.myConfiguration&lt;br /&gt;
		local coreData = self:getCoreData()&lt;br /&gt;
		-- start&lt;br /&gt;
		local widthTh = '300px'&lt;br /&gt;
		local widthTd = '200px'&lt;br /&gt;
		-- build the page status table&lt;br /&gt;
		-- first the two status table cells &amp;quot;green&amp;quot; and &amp;quot;red&amp;quot;&lt;br /&gt;
		local imgYes = '[[File:Yes check.png|13px|alt=Yes|link=]]'&lt;br /&gt;
		local imgNo = '[[File:X mark.png|13px|alt=No|link=]]'&lt;br /&gt;
		local tdYa = mw.html.create('td')&lt;br /&gt;
		tdYa:cssText('background: #90ff90; color:black; vertical-align: middle; text-align: center; width:' .. widthTd)&lt;br /&gt;
			:addClass('table-yes')&lt;br /&gt;
			:wikitext(imgYes)&lt;br /&gt;
		local tdNa = mw.html.create('td')&lt;br /&gt;
		tdNa:cssText('background: #FF9090; color:black; vertical-align: middle; text-align: center; width:' .. widthTd)&lt;br /&gt;
			:addClass('table-no')&lt;br /&gt;
			:wikitext(imgNo)&lt;br /&gt;
		local classExists = coreData.page.class.exists and coreData.page.config.exists&lt;br /&gt;
		local modulesExist = coreData.page.base.exists and classExists&lt;br /&gt;
		local thisClass&lt;br /&gt;
		local thisConfig&lt;br /&gt;
		if classExists then&lt;br /&gt;
			thisClass = require(coreData.page.class.name)&lt;br /&gt;
			thisConfig = require(coreData.page.config.name)&lt;br /&gt;
		end&lt;br /&gt;
		local thisUsesCargo = (FoundationClass.globalConfig.dataStore == 'both' or FoundationClass.globalConfig.dataStore == 'cargo') and coreData.global_cargoTable and #coreData.global_cargoTable &amp;gt; 0&lt;br /&gt;
		local thisUsesSmw = (FoundationClass.globalConfig.dataStore == 'both' or FoundationClass.globalConfig.dataStore == 'smw') and FoundationClass.myYesno(coreData.global_smwUseStorage)&lt;br /&gt;
		-- write the 2do checklist&lt;br /&gt;
		local done = true&lt;br /&gt;
		local step1&lt;br /&gt;
		local step2&lt;br /&gt;
		local step3&lt;br /&gt;
		if modulesExist then&lt;br /&gt;
			step1 = imgYes .. ' You created all your modules'&lt;br /&gt;
		else&lt;br /&gt;
			done = false&lt;br /&gt;
			step1 = imgNo .. ' You have to create your module pages. This, you have to do &amp;lt;b&amp;gt;manually&amp;lt;/b&amp;gt;. Go to [[#Page contents|section Page contents]], copy the module content and edit the corresponding module, ' ..&lt;br /&gt;
				'pasting all the copied content. Save and close. You have to do this for the following module(s): &amp;lt;ul&amp;gt; ' ..&lt;br /&gt;
				(not coreData.page.base.exists and '&amp;lt;li&amp;gt;[[#Page contents|' .. coreData.page.base.name .. ']]&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
				(not coreData.page.class.exists and '&amp;lt;li&amp;gt;[[#Page contents|' .. coreData.page.class.name .. ']]&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
				(not coreData.page.config.exists and '&amp;lt;li&amp;gt;[[#Page contents|' .. coreData.page.config.name .. ']]&amp;lt;/li&amp;gt;' or '') .. '&amp;lt;/ul&amp;gt;'&lt;br /&gt;
		end&lt;br /&gt;
		if coreData.page.baseDoc.exists and coreData.page.classDoc.exists and coreData.page.configDoc.exists and coreData.page.template.exists and coreData.page.templateDoc.exists and&lt;br /&gt;
				(not coreData.page.form or coreData.page.form.exists) and (not coreData.page.category or coreData.page.category.exists) and (not coreData.page.gardeningCategory or coreData.page.gardeningCategory.exists) then&lt;br /&gt;
			step2 = imgYes .. ' You created all auxilliary pages'&lt;br /&gt;
		else&lt;br /&gt;
			done = false&lt;br /&gt;
			step2 = imgNo .. ' You have to create auxilliary pages. This, you can do &amp;lt;b&amp;gt;automatically&amp;lt;/b&amp;gt;. Go to [[#Page autocreation|section Page autocreation]], hit the corresponding &amp;quot;Create&amp;quot;-button or ' ..&lt;br /&gt;
				'create all pages at once. Please do this for the following page(s): &amp;lt;ul&amp;gt; ' ..&lt;br /&gt;
				(not (coreData.page.baseDoc.exists or coreData.page.classDoc.exists or coreData.page.configDoc.exists) and '&amp;lt;li&amp;gt;Module documentation pages&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
				(not (coreData.page.template.exists or coreData.page.templateDoc.exists) and '&amp;lt;li&amp;gt;Template and/or template documentation page&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
				((coreData.page.form and not coreData.page.form.exists) and '&amp;lt;li&amp;gt;Form page&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
				(((coreData.page.category and not coreData.page.category.exists) or (coreData.page.gardeningCategory and not coreData.page.gardeningCategory.exists)) and '&amp;lt;li&amp;gt;Category page(s)&amp;lt;/li&amp;gt;' or '') .. '&amp;lt;/ul&amp;gt;'&lt;br /&gt;
		end&lt;br /&gt;
		local storeCargoInstruction&lt;br /&gt;
		local allPropertiesThere = true&lt;br /&gt;
		local cargoTableCreateLink = false&lt;br /&gt;
		if thisUsesCargo then&lt;br /&gt;
			-- we actually use cargo. check, if cargo table is there or throws an error? if all right, then yes, else instruction above&lt;br /&gt;
			if modulesExist and coreData.page.template.exists then&lt;br /&gt;
				cargoTableCreateLink = true&lt;br /&gt;
				attr = { limit = 1, default = '' }&lt;br /&gt;
				attr['more results text'] = ''&lt;br /&gt;
				local tableEntryId = mw.text.trim(mw.text.unstrip(FoundationClass.myCargoUtil.rawquery({tables = coreData.global_cargoTable, fields = {'_ID'}}, attr)))&lt;br /&gt;
				if mw.ustring.match(mw.text.trim(tableEntryId), '^[0-9]*$') then&lt;br /&gt;
					storeCargoInstruction = imgYes .. ' Your cargo table does exist! (Note: When you change your cargo table\'s declaration, you need to [[#Page autocreation|rebuild it]], though)'&lt;br /&gt;
				else&lt;br /&gt;
					done = false&lt;br /&gt;
					storeCargoInstruction = imgNo .. ' Please [[#Page autocreation|create your cargo table]]!'&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				done = false&lt;br /&gt;
				storeCargoInstruction = imgNo .. ' To be able to create your cargo table, you have to create the following page(s): &amp;lt;ul&amp;gt;' ..&lt;br /&gt;
					(not coreData.page.base.exists and '&amp;lt;li&amp;gt;' .. coreData.page.base.name .. '&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
					(not coreData.page.class.exists and '&amp;lt;li&amp;gt;' .. coreData.page.class.name .. '&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
					(not coreData.page.config.exists and '&amp;lt;li&amp;gt;' .. coreData.page.config.name .. '&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
					(not coreData.page.template.exists and '&amp;lt;li&amp;gt;' .. coreData.page.template.name .. '&amp;lt;/li&amp;gt;' or '') .. '&amp;lt;/ul&amp;gt;'&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if thisUsesSmw then&lt;br /&gt;
			-- we actually use smw. check, if all properties are present? if all right, then yes, else instruction above&lt;br /&gt;
			if coreData.properties and coreData.properties.data and FoundationClass.myTableTools.size(coreData.properties.data) &amp;gt; 0 then&lt;br /&gt;
				for property, propertyData in pairs(coreData.properties.data) do&lt;br /&gt;
					allPropertiesThere = allPropertiesThere and propertyData.exists&lt;br /&gt;
				end&lt;br /&gt;
				if allPropertiesThere then&lt;br /&gt;
					storeSwmInstruction = imgYes .. ' All your property pages are present and accounted for!'&lt;br /&gt;
				else&lt;br /&gt;
					done = false&lt;br /&gt;
					storeSwmInstruction = imgNo .. ' Please &amp;lt;b&amp;gt;[[#Page autocreation|autocreate]]&amp;lt;/b&amp;gt; your properties! The following are missing: &amp;lt;ul&amp;gt;'&lt;br /&gt;
					for _, property in pairs(coreData.properties.order) do&lt;br /&gt;
						local pdata = coreData.properties.data[property]&lt;br /&gt;
						if not pdata or not pdata.exists then&lt;br /&gt;
							storeSwmInstruction = storeSwmInstruction .. '&amp;lt;li&amp;gt;[[Property:' .. property .. ']]&amp;lt;/li&amp;gt;'&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
					storeSwmInstruction = storeSwmInstruction .. '&amp;lt;/ul&amp;gt;'&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				done = false&lt;br /&gt;
				storeSwmInstruction = imgNo .. ' To be able to create your smw properties, you have to create the following page(s): &amp;lt;ul&amp;gt;' ..&lt;br /&gt;
					(not coreData.page.class.exists and '&amp;lt;li&amp;gt;' .. coreData.page.class.name .. '&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
					(not coreData.page.config.exists and '&amp;lt;li&amp;gt;' .. coreData.page.config.name .. '&amp;lt;/li&amp;gt;' or '') .. '&amp;lt;/ul&amp;gt;'&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if storeCargoInstruction or storeSwmInstruction then&lt;br /&gt;
			if storeCargoInstruction and storeSwmInstruction then&lt;br /&gt;
				step3 = 'Your class used cargo AND smw store. You have to create both data stores: &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;' .. storeCargoInstruction .. '&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;' .. storeSwmInstruction .. '&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;'&lt;br /&gt;
			else&lt;br /&gt;
				step3 = storeCargoInstruction or storeSwmInstruction&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			step3 = imgYes .. ' This class does not use a data store. Nothing to be done here!'&lt;br /&gt;
		end&lt;br /&gt;
		local step4 = done and imgYes .. ' You are done. Remember, when you want to change parameters in your config, edit this page and write your [' .. coreData.page.config.editlink .. ' config file] new' or &lt;br /&gt;
			imgNo .. ' You are not finished yet, please tend to your tasks.'&lt;br /&gt;
		local manual = mw.html.create('')&lt;br /&gt;
		manual:wikitext('&amp;lt;h2&amp;gt;Your 2do checklist&amp;lt;/h2&amp;gt;')&lt;br /&gt;
			:tag('ol')&lt;br /&gt;
				:cssText('margin: 0.3em 0 0 1.6em; padding: 0')&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(step1)&lt;br /&gt;
					:done()&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(step2)&lt;br /&gt;
					:done()&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(step3)&lt;br /&gt;
					:done()&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(step4)&lt;br /&gt;
					:done()&lt;br /&gt;
				:done()&lt;br /&gt;
		-- get the data store details, if all the modules exist and we have a datastore configured&lt;br /&gt;
		local datastore = mw.html.create('')&lt;br /&gt;
		if thisClass then&lt;br /&gt;
			datastore:node(thisClass:explainDataStore())&lt;br /&gt;
				:newline()&lt;br /&gt;
		end&lt;br /&gt;
		-- build the status table&lt;br /&gt;
		local statusTrs = mw.html.create('')&lt;br /&gt;
		for _, pid in pairs(coreData.page.order) do&lt;br /&gt;
			statusTrs:tag('tr')&lt;br /&gt;
				:tag('th')&lt;br /&gt;
					:css('text-align', 'left')&lt;br /&gt;
					:css('width', widthTh)&lt;br /&gt;
					:wikitext(coreData.page[pid].name)&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
				:node(coreData.page[pid].exists and tdYa or tdNa)&lt;br /&gt;
				:newline()&lt;br /&gt;
				:done()&lt;br /&gt;
				:newline()&lt;br /&gt;
		end&lt;br /&gt;
		if thisUsesSmw and coreData.properties and coreData.properties.data and FoundationClass.myTableTools.size(coreData.properties.data) &amp;gt; 0 then&lt;br /&gt;
			statusTrs:tag('tr')&lt;br /&gt;
				:tag('th')&lt;br /&gt;
					:css('text-align', 'center')&lt;br /&gt;
					:css('width', widthTh)&lt;br /&gt;
					:attr('colspan', 2)&lt;br /&gt;
					:wikitext('Property pages for your smw store')&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
			for _, property in pairs(coreData.properties.order) do&lt;br /&gt;
				statusTrs:tag('tr')&lt;br /&gt;
					:tag('th')&lt;br /&gt;
						:css('text-align', 'left')&lt;br /&gt;
						:css('width', widthTh)&lt;br /&gt;
						:wikitext('Property:' .. property)&lt;br /&gt;
						:done()&lt;br /&gt;
						:newline()&lt;br /&gt;
					:node(coreData.properties.data[property].exists and tdYa or tdNa)&lt;br /&gt;
					:newline()&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		local statusTable = mw.html.create('table')&lt;br /&gt;
		statusTable:node(statusTrs)&lt;br /&gt;
		-- page autocreation&lt;br /&gt;
		local extAutoCreatePage = pcall(frame.callParserFunction, frame, {name = '#createpageifnotex:Module:Classgenerator', {'NUL'}})&lt;br /&gt;
		local autoCreation = _CFG.template.createPages and extAutoCreatePage&lt;br /&gt;
		local pageAutoCreation = mw.html.create('')&lt;br /&gt;
		pageAutoCreation:wikitext('&amp;lt;h2&amp;gt;Page autocreation&amp;lt;/h2&amp;gt;')&lt;br /&gt;
			:newline()&lt;br /&gt;
		if autoCreation then&lt;br /&gt;
			-- depending on parameters and existence of pages do the autocreate or print the button&lt;br /&gt;
			-- first see, which pagecomplexes (modules(docs), templates, form, category) are missing&lt;br /&gt;
			local missing = {}&lt;br /&gt;
			-- in missing we store, if a page in a given namespace is missing. Namespaces are stored by their ids (numbers)&lt;br /&gt;
			for _, pid in pairs(coreData.page.order) do&lt;br /&gt;
				-- due to extension autocreatepage messing up module pages, in namepace module we only autocreate doc pages&lt;br /&gt;
				if not coreData.page[pid].exists and not Classgenerator.myTableTools.inTable(missing, coreData.page[pid].namespace) and &lt;br /&gt;
						(coreData.page[pid].namespace ~= 828 or coreData.page[pid].isDocPage) then&lt;br /&gt;
					table.insert(missing, coreData.page[pid].namespace)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			if thisUsesSmw and not allPropertiesThere then&lt;br /&gt;
				table.insert(missing, mw.title.new('NUL', 'Property').namespace)&lt;br /&gt;
			end&lt;br /&gt;
			-- now generate the printout or call the parser function depending on global_autocreate_* status&lt;br /&gt;
			-- remember the switches 'global_autocreate_module', 'global_autocreate_template', 'global_autocreate_form', 'global_autocreate_category', and 'global_autocreate_property'&lt;br /&gt;
			local actable = mw.html.create('table')&lt;br /&gt;
			for _, nsid  in pairs(missing) do&lt;br /&gt;
				local ns = mw.ustring.lower(_namespaceName(self, nsid))&lt;br /&gt;
				local information = ''&lt;br /&gt;
				if coreData.autocreate[ns] and coreData.autocreate[ns] &amp;gt; os.time() - _CFG.template.autoCreationTimeDiff then&lt;br /&gt;
					-- ************************************* actual autocreation is done here&lt;br /&gt;
					-- we iterate over all namespaces for which pages are missing (var missing) and spring into action, if we have a numeric value supplied for that namespace coreData.autocreate[ns] that is recent enough&lt;br /&gt;
					-- now we have a namespace, we want to create pages for (var nsid) (all that is done in the recent 4 lines). what we do in the following lines:&lt;br /&gt;
					-- we iterate over all pages in coreData.page.order and spring into action, if the interation instance (pid) is in the namespace (nsid), the page is non exist and is not a module&lt;br /&gt;
					-- in that action body, we create the page with the precalcualted content&lt;br /&gt;
					-- also: for convenience, we create some global project (meta)categories, if related to the current page (project-form-category if nsid for forms, etc.) and configured in Foundationclass/globalconfig. here is an overview&lt;br /&gt;
					--	Classgenerator.globalConfig.formCategory			: MediaWiki:Classengine-content-project-form-category&lt;br /&gt;
					--	Classgenerator.globalConfig.gardeningSuperCategory	: MediaWiki:Classengine-content-project-gardening-supercategory&lt;br /&gt;
					--	Classgenerator.globalConfig.moduleCategory			: MediaWiki:Classengine-content-project-module-category&lt;br /&gt;
					--	Classgenerator.globalConfig.projectSuperCategory	: MediaWiki:Classengine-content-project-supercategory&lt;br /&gt;
					--	Classgenerator.globalConfig.propertyCategory		: MediaWiki:Classengine-content-project-property-category&lt;br /&gt;
					--	Classgenerator.globalConfig.templateCategory		: MediaWiki:Classengine-content-project-templates&lt;br /&gt;
					for _, pid in pairs(coreData.page.order) do&lt;br /&gt;
						_debug(self, 3, ' testing page &amp;quot;' .. coreData.page[pid].name .. '&amp;quot;: namespace id is ' .. coreData.page[pid].namespace ..&lt;br /&gt;
							', and page does ' ..(not coreData.page[pid].exists and 'not ' or '') .. 'exist')&lt;br /&gt;
						if coreData.page[pid].namespace == nsid and not coreData.page[pid].exists and (nsid ~= 828 or coreData.page[pid].isDocPage) then&lt;br /&gt;
							if pid == 'gardeningCategory' and Classgenerator.globalConfig.gardeningSuperCategory and #Classgenerator.globalConfig.gardeningSuperCategory &amp;gt; 0 then&lt;br /&gt;
								-- we just iterated over the gardening category page (so this class has one) but we did not create it, yet)&lt;br /&gt;
								-- blindly try to create the gardening supercategory first, in case the class's gardening category is the gardening supercategory, we dont want the class specific content&lt;br /&gt;
								local content = '{{MediaWiki:Classengine-content-project-gardening-supercategory}}'&lt;br /&gt;
								_debug(self, 3, ' trying to autocreate garderning supercategory page &amp;quot;' .. Classgenerator.globalConfig.gardeningSuperCategory .. '&amp;quot; with # of content being ' .. #content)&lt;br /&gt;
								local ret = frame:callParserFunction{ name = '#createpageifnotex:Category:' .. Classgenerator.globalConfig.gardeningSuperCategory, args = { content } }&lt;br /&gt;
								if #ret &amp;gt; 0 then&lt;br /&gt;
									information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
								end&lt;br /&gt;
							end&lt;br /&gt;
							_debug(self, 3, ' trying to autocreate page &amp;quot;' .. coreData.page[pid].name .. '&amp;quot; with # of content being ' .. #coreData.page[pid].content)&lt;br /&gt;
							local ret = frame:callParserFunction{ name = '#createpageifnotex:' .. coreData.page[pid].name, args = { frame:preprocess(coreData.page[pid].content) } }&lt;br /&gt;
							if #ret &amp;gt; 0 then&lt;br /&gt;
								information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
							end&lt;br /&gt;
							if pid == 'form' and Classgenerator.globalConfig.formCategory and #Classgenerator.globalConfig.formCategory &amp;gt; 0 then&lt;br /&gt;
								-- we just iterated over the form page (so this class has one) and created it (yay). Now blindly create the formCategory as well...&lt;br /&gt;
								local content = '{{MediaWiki:Classengine-content-project-form-category}}'&lt;br /&gt;
								_debug(self, 3, ' trying to autocreate form category page &amp;quot;' .. Classgenerator.globalConfig.formCategory .. '&amp;quot; with # of content being ' .. #content)&lt;br /&gt;
								local ret = frame:callParserFunction{ name = '#createpageifnotex:Category:' .. Classgenerator.globalConfig.formCategory, args = { content } }&lt;br /&gt;
								if #ret &amp;gt; 0 then&lt;br /&gt;
									information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
								end&lt;br /&gt;
							elseif nsid ~= 828 and Classgenerator.globalConfig.moduleCategory and #Classgenerator.globalConfig.moduleCategory &amp;gt; 0 then&lt;br /&gt;
								-- we just iterated a module doc page (so this class has one) and created it (yay). Now blindly create the moduleCategory as well...&lt;br /&gt;
								local content = '{{MediaWiki:Classengine-content-project-module-category}}'&lt;br /&gt;
								_debug(self, 3, ' trying to autocreate module category page &amp;quot;' .. Classgenerator.globalConfig.moduleCategory .. '&amp;quot; with # of content being ' .. #content)&lt;br /&gt;
								local ret = frame:callParserFunction{ name = '#createpageifnotex:Category:' .. Classgenerator.globalConfig.moduleCategory, args = { content } }&lt;br /&gt;
								if #ret &amp;gt; 0 then&lt;br /&gt;
									information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
								end&lt;br /&gt;
							elseif pid == 'category' and Classgenerator.globalConfig.projectSuperCategory and #Classgenerator.globalConfig.projectSuperCategory &amp;gt; 0 then&lt;br /&gt;
								-- we just iterated over the category page (so this class has one) and created it (yay). Now blindly create the supercategory as well...&lt;br /&gt;
								local content = '{{MediaWiki:Classengine-content-project-supercategory}}'&lt;br /&gt;
								_debug(self, 3, ' trying to autocreate super category page &amp;quot;' .. Classgenerator.globalConfig.projectSuperCategory .. '&amp;quot; with # of content being ' .. #content)&lt;br /&gt;
								local ret = frame:callParserFunction{ name = '#createpageifnotex:Category:' .. Classgenerator.globalConfig.projectSuperCategory, args = { content } }&lt;br /&gt;
								if #ret &amp;gt; 0 then&lt;br /&gt;
									information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
								end&lt;br /&gt;
							elseif nsid == 10 and Classgenerator.globalConfig.templateCategory and #Classgenerator.globalConfig.templateCategory &amp;gt; 0 then&lt;br /&gt;
								-- we just iterated over a page in template namespace (so this class has one) and created it (yay). Now blindly create the templateCategory as well...&lt;br /&gt;
								local content = '{{MediaWiki:Classengine-content-project-template-category}}'&lt;br /&gt;
								_debug(self, 3, ' trying to autocreate template category page &amp;quot;' .. Classgenerator.globalConfig.templateCategory .. '&amp;quot; with # of content being ' .. #content)&lt;br /&gt;
								local ret = frame:callParserFunction{ name = '#createpageifnotex:Category:' .. Classgenerator.globalConfig.templateCategory, args = { content } }&lt;br /&gt;
								if #ret &amp;gt; 0 then&lt;br /&gt;
									information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
								end&lt;br /&gt;
							end&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
					if thisUsesSmw and (nsid == mw.title.new('NUL', 'Property').namespace) and coreData.properties.data then&lt;br /&gt;
						-- add here autocreation of properties&lt;br /&gt;
						for property, pdata in pairs(coreData.properties.data) do&lt;br /&gt;
							if not pdata.exists then&lt;br /&gt;
								local content = pdata.content&lt;br /&gt;
								_debug(self, 3, ' trying to autocreate property page &amp;quot;' .. property .. '&amp;quot; with # of content being ' .. #content)&lt;br /&gt;
								local ret = frame:callParserFunction{ name = '#createpageifnotex:Property:' .. property, args = { frame:preprocess(pdata.content) } }&lt;br /&gt;
								if #ret &amp;gt; 0 then&lt;br /&gt;
									information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
								end&lt;br /&gt;
							end&lt;br /&gt;
						end&lt;br /&gt;
						-- we just iterated over all missing property pages (so this class has some) and created them (yay). Now blindly create the propertyCategory as well...&lt;br /&gt;
						local content = '{{MediaWiki:Classengine-content-project-property-category}}'&lt;br /&gt;
						_debug(self, 3, ' trying to autocreate property category page &amp;quot;' .. Classgenerator.globalConfig.propertyCategory .. '&amp;quot; with # of content being ' .. #content)&lt;br /&gt;
						local ret = frame:callParserFunction{ name = '#createpageifnotex:Category:' .. Classgenerator.globalConfig.propertyCategory, args = { content } }&lt;br /&gt;
						if #ret &amp;gt; 0 then&lt;br /&gt;
							information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				-- create the tr for the ns&lt;br /&gt;
				actable:tag('tr')&lt;br /&gt;
					:tag('th')&lt;br /&gt;
						:css('text-align', 'left')&lt;br /&gt;
						:css('width', widthTh)&lt;br /&gt;
						:wikitext('Create ' .. ((nsid == 828 and 'module docs' or (ns == 'property' and 'properties' or (ns .. (ns == 'template' and 's' or '')))) .. ':'))&lt;br /&gt;
							-- note: nsid == mw.title.new('NUL', 'Property').namespace is necessary since canonicalname for property namespace does not translate uniquely over different languages :(&lt;br /&gt;
						:done()&lt;br /&gt;
						:newline()&lt;br /&gt;
					:tag('td')&lt;br /&gt;
						:cssText('color:black; vertical-align: middle; text-align: center; width:' .. widthTd)&lt;br /&gt;
						:css('background', (coreData.autocreate[ns] and coreData.autocreate[ns] &amp;gt; os.time() - _CFG.template.autoCreationTimeDiff) and '#90ff90' or '#FF9090' )&lt;br /&gt;
						:wikitext(frame:callParserFunction{name = '#autoedit', args={form='Classgenerator', target=self:getUid(),&lt;br /&gt;
							'link text=' .. (coreData.autocreate[ns] and 'Requested on ' .. os.date('%d.%m.%Y %X', coreData.autocreate[ns]) or 'Create automatically!')  .. &lt;br /&gt;
								(#information &amp;gt; 0 and ('Call returned ' .. information) or ''),&lt;br /&gt;
							'reload', summary=&amp;quot;Requesting the autocreation of &amp;quot; .. coreData.className .. ' for pages of type ' .. ns,&lt;br /&gt;
							'query string=Classgenerator[global_autocreate_' .. ns .. ']=' .. os.time()}&lt;br /&gt;
							})&lt;br /&gt;
						:done()&lt;br /&gt;
						:newline()&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
&lt;br /&gt;
			end&lt;br /&gt;
			if Classgenerator.myTableTools.size(missing) &amp;gt; 0 then&lt;br /&gt;
				-- show the all button&lt;br /&gt;
				local querystring = ''&lt;br /&gt;
				for _, nsid in pairs(missing) do&lt;br /&gt;
					local ns = mw.ustring.lower(_namespaceName(self, nsid))&lt;br /&gt;
					querystring = querystring .. 'Classgenerator[global_autocreate_' .. ns .. ']=' .. os.time() .. '&amp;amp;'&lt;br /&gt;
				end&lt;br /&gt;
				querystring = mw.ustring.sub(querystring, 1, -2)&lt;br /&gt;
				actable:tag('tr')&lt;br /&gt;
					:tag('th')&lt;br /&gt;
						:css('text-align', 'left')&lt;br /&gt;
						:css('width', widthTh)&lt;br /&gt;
						:wikitext('Create all pages:')&lt;br /&gt;
						:done()&lt;br /&gt;
						:newline()&lt;br /&gt;
					:tag('td')&lt;br /&gt;
						:cssText('background: #FF9090; color:black; vertical-align: middle; text-align: center; width:' .. widthTd)&lt;br /&gt;
						:wikitext(frame:callParserFunction{name = '#autoedit', args={form='Classgenerator', target=self:getUid(),&lt;br /&gt;
							'link text=Create automatically!', 'reload', summary=&amp;quot;Requesting the autocreation of all missing pages&amp;quot;, 'query string=' .. querystring }&lt;br /&gt;
							})&lt;br /&gt;
						:done()&lt;br /&gt;
						:newline()&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
				pageAutoCreation:wikitext('&amp;lt;b&amp;gt;Note:&amp;lt;/b&amp;gt; Creation of module pages is impossible due to an incompatibility issue.')&lt;br /&gt;
					:newline()&lt;br /&gt;
					:node(actable)&lt;br /&gt;
					:newline()&lt;br /&gt;
			else&lt;br /&gt;
				pageAutoCreation:wikitext('All pages present!')&lt;br /&gt;
					:newline()&lt;br /&gt;
					:tag('p')&lt;br /&gt;
						:wikitext('&amp;lt;small&amp;gt;&amp;lt;b&amp;gt;Note:&amp;lt;/b&amp;gt; Creation of module pages is impossible due to an incompatibility issue.&amp;lt;/small&amp;gt;')&lt;br /&gt;
						:newline()&lt;br /&gt;
						:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			pageAutoCreation:wikitext('Page autocreation is only possible if activated in your [[Module:Classgenerator/config]]-file (see template-section) and '&lt;br /&gt;
					.. 'Extension AutoCreatePage being installed.')&lt;br /&gt;
				:newline()&lt;br /&gt;
		end&lt;br /&gt;
		if cargoTableCreateLink then&lt;br /&gt;
			pageAutoCreation:wikitext('&amp;lt;b&amp;gt;Cargo data store:&amp;lt;/b&amp;gt;To (re-)create your cargo table, follow &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[' .. coreData.page.template.recreatedata .. ' this link]&amp;lt;/span&amp;gt; and then press ok!')&lt;br /&gt;
				:newline()&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		-- build the content collapses&lt;br /&gt;
		local collapse = require('Module:Collapse').main&lt;br /&gt;
		local bg_sets = { exist = {'#cfc', '#9c9'}, nonexist = {'#fcc', '#c99'} }&lt;br /&gt;
		local bg = 1&lt;br /&gt;
		local pageContent = mw.html.create('')&lt;br /&gt;
		for _, pid in pairs(coreData.page.order) do&lt;br /&gt;
			local content&lt;br /&gt;
			local bgs = coreData.page[pid].exists and bg_sets.exist or bg_sets.nonexist&lt;br /&gt;
			if coreData.page[pid].namespace == 828 and not coreData.page[pid].isDocPage then&lt;br /&gt;
				content = frame:expandTemplate{ title = 'Code', args = {lang = 'lua', code = coreData.page[pid].content, line = '1'}}&lt;br /&gt;
			else&lt;br /&gt;
				content = '&amp;lt;pre style=&amp;quot;white-space:-moz-pre-wrap; white-space:-pre-wrap; white-space:-o-pre-wrap; white-space:pre-wrap; word-wrap:break-word;&amp;quot;&amp;gt;' .. &lt;br /&gt;
					mw.text.nowiki(frame:preprocess(coreData.page[pid].content)) .. '&amp;lt;/pre&amp;gt;'&lt;br /&gt;
			end&lt;br /&gt;
			pageContent:wikitext(collapse({ header = 'Contents of &amp;lt;b&amp;gt;[[:' .. coreData.page[pid].name .. ']]&amp;lt;/b&amp;gt; ' ..&lt;br /&gt;
							'&amp;lt;span class=&amp;quot;plainlinks&amp;quot; style=&amp;quot;font-size:75%;&amp;quot;&amp;gt;&amp;amp;#91;[' .. coreData.page[pid].editlink ..&lt;br /&gt;
							' EDIT]&amp;amp;#93;&amp;lt;/span&amp;gt;',&lt;br /&gt;
						content = content, left = true, bg = bgs[bg]&lt;br /&gt;
					}))&lt;br /&gt;
				:newline()&lt;br /&gt;
			bg = (bg == 2 and 1 or 2)&lt;br /&gt;
		end&lt;br /&gt;
		if thisUsesSmw and coreData.properties.order then&lt;br /&gt;
			-- add here the collpases of the properties&lt;br /&gt;
			local message = mw.message.new('classengine-template-property-page')&lt;br /&gt;
			pageContent:tag('p')&lt;br /&gt;
				:wikitext('&amp;lt;h3&amp;gt;All property pages&amp;lt;/h3&amp;gt;')&lt;br /&gt;
				:done()&lt;br /&gt;
			for _, property in pairs(coreData.properties.order) do&lt;br /&gt;
				local bgs = coreData.page[pid].exists and bg_sets.exist or bg_sets.nonexist&lt;br /&gt;
				local content = '&amp;lt;pre style=&amp;quot;white-space:-moz-pre-wrap; white-space:-pre-wrap; white-space:-o-pre-wrap; white-space:pre-wrap; word-wrap:break-word;&amp;quot;&amp;gt;' .. &lt;br /&gt;
					mw.text.nowiki(frame:preprocess(coreData.properties.data[property].content)) .. '&amp;lt;/pre&amp;gt;'&lt;br /&gt;
				pageContent:wikitext(collapse({ header = 'Contents of &amp;lt;b&amp;gt;[[:Property:' .. property .. ']]&amp;lt;/b&amp;gt; ' ..&lt;br /&gt;
								'&amp;lt;span class=&amp;quot;plainlinks&amp;quot; style=&amp;quot;font-size:75%;&amp;quot;&amp;gt;&amp;amp;#91;[' .. coreData.properties.data[property].editlink ..&lt;br /&gt;
								' EDIT]&amp;amp;#93;&amp;lt;/span&amp;gt;',&lt;br /&gt;
							content = content, left = true, bg = bgs[bg]&lt;br /&gt;
						}))&lt;br /&gt;
					:newline()&lt;br /&gt;
				bg = (bg == 2 and 1 or 2)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		local updateWarning = mw.html.create('')&lt;br /&gt;
		if coreData.now_timestamp - coreData.edit_timestamp &amp;lt; 2*60*60 then&lt;br /&gt;
			local mbox = require('Module:Message box')&lt;br /&gt;
			updateWarning:wikitext(mbox.main('ombox', { type='content', text = 'Note: You updated the class ' .. coreData.edit_time_before .. ' ago. Did you write your [[#Page contents|config file]] new? ' ..&lt;br /&gt;
						'Changes won\'t take effect unless you do!' .. ((thisUsesCargo and cargoTableCreateLink) and '&amp;lt;p&amp;gt;&amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;Also: If you changed your cargo table\'s declaration, [' .. &lt;br /&gt;
						coreData.page.template.editlink .. ' edit your template] and [[#Page autocreation|rebuild your cargo table]]!&amp;lt;/span&amp;gt;' or '')}))&lt;br /&gt;
				:newline()&lt;br /&gt;
		end&lt;br /&gt;
		local smwPropertyHint = mw.html.create('')&lt;br /&gt;
		if (FoundationClass.globalConfig.dataStore == 'both' or FoundationClass.globalConfig.dataStore == 'smw')&lt;br /&gt;
				and FoundationClass.myYesno(coreData.global_smwUseStorage)&lt;br /&gt;
				and not coreData.properties.order then&lt;br /&gt;
			local mbox = require('Module:Message box')&lt;br /&gt;
			smwPropertyHint:wikitext(mbox.main('ombox', { type='notice', text = 'Hint: If you use properties in your class, they will not display in &amp;lt;i&amp;gt;Page contents&amp;lt;/i&amp;gt;, nor be listed in &amp;lt;i&amp;gt;Page status&amp;lt;/i&amp;gt; or '&lt;br /&gt;
					.. 'autocreated in &amp;lt;i&amp;gt;Page autocreation&amp;lt;/i&amp;gt; unless you have your class and config page created!'}))&lt;br /&gt;
				:newline()&lt;br /&gt;
		end&lt;br /&gt;
		-- assemble everything&lt;br /&gt;
		local html = mw.html.create('')&lt;br /&gt;
		html:wikitext(coreData.global_description)&lt;br /&gt;
			:newline()&lt;br /&gt;
			:node(updateWarning)&lt;br /&gt;
			:node(smwPropertyHint)&lt;br /&gt;
			:node(manual)&lt;br /&gt;
			:newline()&lt;br /&gt;
			:node(datastore)&lt;br /&gt;
			:wikitext('&amp;lt;h2&amp;gt;Page status&amp;lt;/h2&amp;gt;')&lt;br /&gt;
			:newline()&lt;br /&gt;
			:wikitext(autoCreation and 'This status may be inaccurate, if you just created pages. In that case, run jobs and clear cache of this page.' or '')&lt;br /&gt;
			:node(statusTable)&lt;br /&gt;
			:newline()&lt;br /&gt;
			:node(pageAutoCreation)&lt;br /&gt;
			:wikitext('&amp;lt;h2&amp;gt;Page contents&amp;lt;/h2&amp;gt;')&lt;br /&gt;
			:newline()&lt;br /&gt;
			:node(pageContent)&lt;br /&gt;
			:newline()&lt;br /&gt;
			:done()&lt;br /&gt;
		local debugLevel = FoundationClass.globalConfig.debugLevel or _CFG.global.debugLevel&lt;br /&gt;
		if debugLevel then&lt;br /&gt;
			html:tag('pre')&lt;br /&gt;
--				:wikitext(FoundationClass.myTableTools.printTable(coreData))&lt;br /&gt;
--				:wikitext(FoundationClass.myTableTools.printTable(thisClass:smwProperty2ParameterTranslationTable()))&lt;br /&gt;
				:wikitext(ClassDebug:printLog(debugLevel))&lt;br /&gt;
				:done()&lt;br /&gt;
		end&lt;br /&gt;
		self:addOutput(html)&lt;br /&gt;
&lt;br /&gt;
		return true&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Classgenerator:myArgumentProcessing(coreData)&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator:myArgumentProcessing(args) to process coreData, from ' .. tostring(self))&lt;br /&gt;
	-- function that performs some individual transformation args --&amp;amp;amp;gt; coreData&lt;br /&gt;
	local _CFG = self.class.myConfiguration&lt;br /&gt;
	local coreData = coreData&lt;br /&gt;
	local lang = mw.language.new('en')&lt;br /&gt;
	coreData.className = lang:ucfirst(mw.text.trim(mw.ustring.gsub(self:getUid(), ':', '')))&lt;br /&gt;
	coreData.edit_timestamp = lang:formatDate('U', coreData.global_edit_timestamp)&lt;br /&gt;
	coreData.now_timestamp = lang:formatDate('U') + 60*60&lt;br /&gt;
	coreData.edit_time_before = lang:formatDuration(coreData.now_timestamp-coreData.edit_timestamp)&lt;br /&gt;
	coreData.last_edited = lang:formatDate('d.m.Y H:i:s', coreData.global_edit_timestamp)&lt;br /&gt;
	if coreData.global_gardeningCategory_chooser and mw.ustring.lower(coreData.global_gardeningCategory_chooser) == 'global' then&lt;br /&gt;
		coreData.global_gardeningCategory = 'superglobal.gardeningCategory'&lt;br /&gt;
	end&lt;br /&gt;
	if mw.ustring.find(coreData.className, ' ', 1, true) then&lt;br /&gt;
		local tmp = ''&lt;br /&gt;
		for fragment in mw.text.gsplit(coreData.className, ' ', true) do&lt;br /&gt;
			tmp = tmp .. lang:ucfirst(fragment)&lt;br /&gt;
		end&lt;br /&gt;
		coreData.className = tmp&lt;br /&gt;
	end&lt;br /&gt;
	if coreData.global_cargoTable then&lt;br /&gt;
		coreData.global_cargoTable = mw.ustring.gsub(mw.ustring.lower(coreData.global_cargoTable), ' ', '_')&lt;br /&gt;
	end&lt;br /&gt;
	if coreData.form_createInfotext and #coreData.form_createInfotext &amp;gt; 0 and mw.ustring.sub(coreData.form_createInfotext, -1) ~= ' ' then&lt;br /&gt;
		coreData.form_createInfotext = coreData.form_createInfotext .. ' '&lt;br /&gt;
	end&lt;br /&gt;
	local parameter_parameter&lt;br /&gt;
	local fieldOrder&lt;br /&gt;
	if coreData.parameter_parameter then&lt;br /&gt;
		parameters = ''&lt;br /&gt;
		fieldOrder = {}&lt;br /&gt;
		local classGenParamConfig = mw.loadData('Module:Classgenerator/parameter/config')&lt;br /&gt;
		for result in mw.text.gsplit(coreData.parameter_parameter, classGenParamConfig.template.delimiterResult, true) do&lt;br /&gt;
			local fieldname, parameter = mw.ustring.match(result, '^([^#]*)' .. classGenParamConfig.template.delimiterFormFieldName .. '(.+)$')&lt;br /&gt;
			if fieldname and mw.ustring.len(mw.text.trim(fieldname)) &amp;gt; 0 then&lt;br /&gt;
				table.insert(fieldOrder, mw.text.trim(fieldname))&lt;br /&gt;
			end&lt;br /&gt;
			if parameter and mw.ustring.len(parameter) &amp;gt; 0 then&lt;br /&gt;
				parameters = parameters .. parameter&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	coreData.parameter_parameter = parameters&lt;br /&gt;
	coreData.form_enable = FoundationClass.myYesno(coreData.form_enable)&lt;br /&gt;
	if coreData.form_enable then&lt;br /&gt;
		coreData.form_fieldOrder = fieldOrder&lt;br /&gt;
		form_buttons = { 'save' }&lt;br /&gt;
		if coreData.form_buttons and #coreData.form_buttons &amp;gt; 0 then&lt;br /&gt;
			for _, button in pairs(coreData.form_buttons) do&lt;br /&gt;
				table.insert(form_buttons, button)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		table.insert(form_buttons, 'cancel')&lt;br /&gt;
	end&lt;br /&gt;
	coreData.form_buttons = form_buttons&lt;br /&gt;
	-- here build the class config&lt;br /&gt;
	local contentClassConfig = mw.ustring.gsub(_CFG.template.configIntro, _CFG.template.placeHolderClassName, coreData.className) ..&lt;br /&gt;
		'local global = {\n' ..&lt;br /&gt;
		'\tdebugLevel = false,'&lt;br /&gt;
	if self.class.myConfiguration.template.addCommentsToConfig then&lt;br /&gt;
		contentClassConfig = contentClassConfig .. '\t-- set this to the level you wish to display at render. false if disabled. this is a class based setting. ' ..&lt;br /&gt;
			'you can set this globally at Foundationclass/globalconfig, causing all child classes to debug.'&lt;br /&gt;
	end&lt;br /&gt;
	contentClassConfig = contentClassConfig .. '\n'&lt;br /&gt;
	-- calculate the fieldlists:&lt;br /&gt;
	local fieldlists = {}&lt;br /&gt;
	for _, field in pairs(_CFG.form.fieldOrder) do&lt;br /&gt;
		local tab = mw.ustring.match(field, '^([a-z]+)_.+')&lt;br /&gt;
		if not fieldlists[tab] then&lt;br /&gt;
			fieldlists[tab] = {}&lt;br /&gt;
		end&lt;br /&gt;
		table.insert(fieldlists[tab], field)&lt;br /&gt;
	end&lt;br /&gt;
	local omissionList = {'global_autocreate_module', 'global_autocreate_template', 'global_autocreate_form', 'global_autocreate_category', 'global_autocreate_property', 'global_edit_timestamp', 'global_gardeningCategory_chooser',&lt;br /&gt;
		'form_textareaAttributes_cols', 'form_textareaAttributes_rows', 'form_textareaAttributes_autogrow', 'form_textareaAttributes_editor', 'form_createLinkInfo', &lt;br /&gt;
		'global_customization', 'form_customization', 'template_customization' }&lt;br /&gt;
	for _, attr in pairs(fieldlists.global) do&lt;br /&gt;
		if not Classgenerator.myTableTools.inTable(omissionList, attr) and self.class.myConfiguration.parameter[attr] then&lt;br /&gt;
			contentClassConfig = contentClassConfig .. _processAttribute(self, attr, '\t')&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if coreData.global_customization then&lt;br /&gt;
		for line in mw.text.gsplit(coreData.global_customization, '\n', true) do&lt;br /&gt;
			contentClassConfig = contentClassConfig .. '\t' .. line .. '\n'&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	contentClassConfig = contentClassConfig .. '}\n\nlocal form = {\n'&lt;br /&gt;
	for _, attr in pairs(fieldlists.form) do&lt;br /&gt;
		if not Classgenerator.myTableTools.inTable(omissionList, attr) and self.class.myConfiguration.parameter[attr] then&lt;br /&gt;
			contentClassConfig = contentClassConfig .. _processAttribute(self, attr, '\t')&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	contentClassConfig = contentClassConfig .. '\ttextareaAttributes = {	-- the defaults for your textarea fields\n'&lt;br /&gt;
	for _, attr in pairs({'form_textareaAttributes_cols', 'form_textareaAttributes_rows', 'form_textareaAttributes_autogrow', 'form_textareaAttributes_editor'}) do&lt;br /&gt;
		local name = mw.ustring.match(attr, '^form_textareaAttributes_(.+)$')&lt;br /&gt;
		contentClassConfig = contentClassConfig .. _processAttribute(self, attr, '\t\t', name)&lt;br /&gt;
	end&lt;br /&gt;
	contentClassConfig = contentClassConfig .. '\t},\n'&lt;br /&gt;
	contentClassConfig = contentClassConfig .. _processAttribute(self, 'form_fieldOrder', '\t')&lt;br /&gt;
	if coreData.form_customization then&lt;br /&gt;
		for line in mw.text.gsplit(coreData.form_customization, '\n', true) do&lt;br /&gt;
			contentClassConfig = contentClassConfig .. '\t' .. line .. '\n'&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	contentClassConfig = contentClassConfig .. '}\n\nlocal template = {\n'&lt;br /&gt;
	for _, attr in pairs(fieldlists.template) do&lt;br /&gt;
		if not Classgenerator.myTableTools.inTable(omissionList, attr) and self.class.myConfiguration.parameter[attr] then&lt;br /&gt;
			contentClassConfig = contentClassConfig .. _processAttribute(self, attr, '\t')&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if coreData.template_customization then&lt;br /&gt;
		for line in mw.text.gsplit(coreData.template_customization, '\n', true) do&lt;br /&gt;
			contentClassConfig = contentClassConfig .. '\t' .. mw.text.trim(line) .. '\n'&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	contentClassConfig = contentClassConfig .. '}\n\nlocal parameter = {\n' .. coreData.parameter_parameter .. '}\n\n' ..&lt;br /&gt;
		'return {\n' ..&lt;br /&gt;
		'\tform = form,\n' ..&lt;br /&gt;
		'\tglobal = global,\n' ..&lt;br /&gt;
		'\tparameter = parameter,\n' ..&lt;br /&gt;
		'\ttemplate = template,\n}\n'&lt;br /&gt;
	local classCategory = Classgenerator.globalConfig.classCategory or 'none'&lt;br /&gt;
	local formCategory = Classgenerator.globalConfig.formCategory or 'none'&lt;br /&gt;
	local gardeningCategory = Classgenerator.globalConfig.gardeningSuperCategory or 'none'&lt;br /&gt;
	local moduleCategory = Classgenerator.globalConfig.moduleCategory or 'none'&lt;br /&gt;
	local propertyCategory = Classgenerator.globalConfig.propertyCategory or 'none'&lt;br /&gt;
	local superCategory = Classgenerator.globalConfig.projectSuperCategory or 'none'&lt;br /&gt;
	local templateCategory = Classgenerator.globalConfig.templateCategory or 'none'&lt;br /&gt;
	local page = {}&lt;br /&gt;
	page.order = {'base', 'baseDoc', 'class', 'classDoc', 'config', 'configDoc', 'template', 'templateDoc'}&lt;br /&gt;
	page.base = {&lt;br /&gt;
		name = 'Module:' .. _private[self].pagename,&lt;br /&gt;
		content = mw.message.new('classengine-template-module-page'):rawParams(_private[self].pagename):plain()&lt;br /&gt;
	}&lt;br /&gt;
	page.baseDoc = {&lt;br /&gt;
		name = 'Module:' .. _private[self].pagename .. '/doc',&lt;br /&gt;
		content = mw.message.new('classengine-template-module-documentation-page'):rawParams(_private[self].pagename, moduleCategory):plain()&lt;br /&gt;
	}&lt;br /&gt;
	page.class = {&lt;br /&gt;
		name = 'Module:' .. _private[self].pagename .. '/class',&lt;br /&gt;
		content = mw.message.new('classengine-template-module-class-page'):rawParams(_private[self].pagename, coreData.className):plain()&lt;br /&gt;
	}&lt;br /&gt;
	page.classDoc = {&lt;br /&gt;
		name = 'Module:' .. _private[self].pagename .. '/class/doc',&lt;br /&gt;
		content = mw.message.new('classengine-template-module-class-documentation-page'):rawParams(_private[self].pagename, coreData.className, moduleCategory, classCategory):plain()&lt;br /&gt;
	}&lt;br /&gt;
	page.config = {&lt;br /&gt;
		name = 'Module:' .. _private[self].pagename .. '/config',&lt;br /&gt;
		content = contentClassConfig,&lt;br /&gt;
	}&lt;br /&gt;
	page.configDoc = {&lt;br /&gt;
		name = 'Module:' .. _private[self].pagename .. '/config/doc',&lt;br /&gt;
		content = mw.message.new('classengine-template-module-config-documentation-page'):rawParams(_private[self].pagename, moduleCategory, classCategory):plain()&lt;br /&gt;
	}&lt;br /&gt;
	page.template = {&lt;br /&gt;
		name = 'Template:' .. coreData.template_name,&lt;br /&gt;
		content = mw.message.new('classengine-template-template-page'):rawParams(_private[self].pagename):plain()&lt;br /&gt;
	}&lt;br /&gt;
	page.templateDoc = {&lt;br /&gt;
		name = 'Template:' .. coreData.template_name .. '/doc',&lt;br /&gt;
		content = mw.message.new('classengine-template-template-documentation-page'):rawParams(_private[self].pagename, templateCategory):plain()&lt;br /&gt;
	}&lt;br /&gt;
	if coreData.form_name and #coreData.form_name &amp;gt; 0 then&lt;br /&gt;
		table.insert(page.order, 'form')&lt;br /&gt;
		page.form = {&lt;br /&gt;
			name = 'Form:' .. coreData.form_name,&lt;br /&gt;
			content = mw.message.new('classengine-template-form-page'):rawParams(_private[self].pagename, formCategory):plain()&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
	if coreData.global_category and #coreData.global_category&amp;gt; 0 then&lt;br /&gt;
		table.insert(page.order, 'category')&lt;br /&gt;
		page.category = {&lt;br /&gt;
			name = 'Category:' .. coreData.global_category,&lt;br /&gt;
			content = mw.message.new('classengine-template-category-page'):rawParams(_private[self].pagename, superCategory):plain()&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
	if coreData.global_gardeningCategory and #coreData.global_gardeningCategory &amp;gt; 0 then&lt;br /&gt;
		table.insert(page.order, 'gardeningCategory')&lt;br /&gt;
		local pagename = coreData.global_gardeningCategory&lt;br /&gt;
		if pagename == 'superglobal.gardeningCategory' then&lt;br /&gt;
			pagename = FoundationClass.globalConfig.gardeningCategory&lt;br /&gt;
		end&lt;br /&gt;
		page.gardeningCategory = {&lt;br /&gt;
			name = 'Category:' .. pagename,&lt;br /&gt;
			content = mw.message.new('classengine-template-gardeningcategory-page'):rawParams(_private[self].pagename, gardeningCategory):plain()&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
	for _, pid in pairs(page.order) do&lt;br /&gt;
		local obj = mw.title.new(page[pid].name)&lt;br /&gt;
		page[pid].exists = obj.exists&lt;br /&gt;
		page[pid].namespace = obj.namespace&lt;br /&gt;
		page[pid].editlink = obj:fullUrl{action='edit'}&lt;br /&gt;
		if pid == 'template' then&lt;br /&gt;
			page[pid].recreatedata = obj:fullUrl{action='recreatedata'}&lt;br /&gt;
		end&lt;br /&gt;
		page[pid].isDocPage = (mw.ustring.sub(page[pid].name, -4) == '/doc')&lt;br /&gt;
		if page[pid].isDocPage then&lt;br /&gt;
			page[pid].content = page[pid].content .. '&amp;lt;h2&amp;gt;Maintenanace notes&amp;lt;/h2&amp;gt;\n' ..&lt;br /&gt;
				'This page was created by [[Module:Classgenerator]] and belongs to [[' .. self:getUid() .. ']].\n'&lt;br /&gt;
			if pid == 'configDoc' then&lt;br /&gt;
				page[pid].content = page[pid].content .. '\n{{((}}ombox| type=content | text = It is strongly advised, to not edit this page but to use [' ..&lt;br /&gt;
				'https://{{((}}SERVERNAME{{))}}{{((}}SCRIPTPATH{{))}}/Special:FormEdit/Classgenerator/' .. mw.uri.encode(self:getUid(), &amp;quot;PATH&amp;quot;) .. ' ' .. &lt;br /&gt;
					'the Classgenerator form] instead! After that, use your new configuration to replace the contents of this page.{{))}}'&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	local thisClass&lt;br /&gt;
	local thisConfig&lt;br /&gt;
	if page.class.exists and page.config.exists then&lt;br /&gt;
		thisClass = require(page.class.name)&lt;br /&gt;
		thisConfig = require(page.config.name)&lt;br /&gt;
	end&lt;br /&gt;
	if page.form and (not coreData.form_typeCreateLink or coreData.form_typeCreateLink ~= 'forminput') and coreData.form_createLinkPageName and mw.ustring.len(coreData.form_createLinkPageName) &amp;gt; 0 then&lt;br /&gt;
		local pageName = coreData.form_createLinkPageName&lt;br /&gt;
		if coreData.global_namespace and mw.ustring.len(coreData.global_namespace) &amp;gt; 0 and not mw.ustring.match(pageName, '^' .. coreData.global_namespace .. ':.+$') then&lt;br /&gt;
			pageName = coreData.global_namespace .. ':' .. pageName&lt;br /&gt;
		end&lt;br /&gt;
		local infostr = '{{((}}{info|page name=' .. pageName .. '|add title=' .. (coreData.form_labelCreate or 'create entity') .. '|edit title=' .. (coreData.form_labelEdit or 'edit entity') .. '}{{))}}'&lt;br /&gt;
		page.form.content = page.form.content .. '&amp;lt;!{{#invoke:String|rep|-|2}} this is a workaround, needed because of a SF bug: ' .. infostr ..&lt;br /&gt;
			'. see https://phabricator.wikimedia.org/T123230 for more information {{#invoke:String|rep|-|2}}&amp;gt;'&lt;br /&gt;
	end&lt;br /&gt;
	coreData.page = page&lt;br /&gt;
	local autocreate = {}&lt;br /&gt;
	autocreate.module = FoundationClass.myYesno(coreData.global_autocreate_module, tonumber(coreData.global_autocreate_module))&lt;br /&gt;
	autocreate.template = FoundationClass.myYesno(coreData.global_autocreate_template, tonumber(coreData.global_autocreate_template))&lt;br /&gt;
	autocreate.form = coreData.form_name and FoundationClass.myYesno(coreData.global_autocreate_form, tonumber(coreData.global_autocreate_form))&lt;br /&gt;
	autocreate.category = (coreData.global_category or coreData.global_gardeningCategory) and FoundationClass.myYesno(coreData.global_autocreate_category, tonumber(coreData.global_autocreate_category))&lt;br /&gt;
	if (FoundationClass.globalConfig.dataStore == 'both' or FoundationClass.globalConfig.dataStore == 'smw') and FoundationClass.myYesno(coreData.global_smwUseStorage) then&lt;br /&gt;
		local propertyNSName = _namespaceName(self, mw.title.new('NUL', 'Property').namespace)&lt;br /&gt;
		autocreate[propertyNSName] = FoundationClass.myYesno(coreData['global_autocreate_' .. propertyNSName], tonumber(coreData['global_autocreate_' .. propertyNSName]))&lt;br /&gt;
	end&lt;br /&gt;
	coreData.autocreate = autocreate&lt;br /&gt;
	local propertyData&lt;br /&gt;
	local propertyOrder&lt;br /&gt;
	if (FoundationClass.globalConfig.dataStore == 'both' or FoundationClass.globalConfig.dataStore == 'smw') and FoundationClass.myYesno(coreData.global_smwUseStorage) and thisClass and thisConfig then&lt;br /&gt;
		-- we use smw and class and config are created and accessible. we can get property information and prepare data&lt;br /&gt;
		local matrix = thisClass:smwGetProperty2ParameterTranslationTable()&lt;br /&gt;
		propertyData = {}&lt;br /&gt;
		propertyOrder = {}&lt;br /&gt;
		for property, parameter in pairs(matrix) do&lt;br /&gt;
			table.insert(propertyOrder, property)&lt;br /&gt;
			local obj = mw.title.new(property, 'Property')&lt;br /&gt;
			propertyData[property] = { &lt;br /&gt;
				editlink = obj:fullUrl{action='edit'},&lt;br /&gt;
				exists = obj.exists,&lt;br /&gt;
				parameter = parameter,&lt;br /&gt;
			}&lt;br /&gt;
			if thisConfig.parameter[parameter] then&lt;br /&gt;
				propertyData[property].description = thisConfig.parameter[parameter].description&lt;br /&gt;
				propertyData[property].type = thisConfig.parameter[parameter].property_type&lt;br /&gt;
				propertyData[property].values = thisConfig.parameter[parameter].values&lt;br /&gt;
			elseif parameter == FoundationClass.globalConfig.smwClassProperty then&lt;br /&gt;
				propertyData[property].description = 'Automatisch hinzugefügt! Wird verwendet, um Mitglieder dieser Klasse zu finden (funktioniert auch, ohne dass eine Kategorie definiert wird und auch fur subobjects)'&lt;br /&gt;
				propertyData[property].type = 'Text'&lt;br /&gt;
			elseif parameter == FoundationClass.globalConfig.uidFieldName then&lt;br /&gt;
				propertyData[property].description = 'Automatisch hinzugefügt! Wird verwendet, um individuelle Objekte innerhalb der Klasse zu identifizieren.'&lt;br /&gt;
				propertyData[property].type = 'Text'&lt;br /&gt;
			end&lt;br /&gt;
			local values = ''&lt;br /&gt;
			if propertyData[property].values then&lt;br /&gt;
				values = values .. 'The allowed values are:'&lt;br /&gt;
				for _, value in pairs(propertyData[property].values) do&lt;br /&gt;
					values = values .. '\n* [[Allows value::' .. value .. ']]'&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				values = 'No restriction given'&lt;br /&gt;
			end&lt;br /&gt;
			propertyData[property].content = mw.message.new('classengine-template-property-page'):rawParams(propertyData[property].description, propertyData[property].type, values, propertyCategory):plain()&lt;br /&gt;
		end&lt;br /&gt;
		table.sort(propertyOrder)&lt;br /&gt;
	end&lt;br /&gt;
	coreData.properties = { data = propertyData, order = propertyOrder }&lt;br /&gt;
	return coreData	-- this is your new coreData.&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Classgenerator:myPlausibilityTest(args)&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator:myPlausibilityTest(args) to test arguments, from ' .. tostring(self))&lt;br /&gt;
	-- function that performs the individual plausibility tests&lt;br /&gt;
	-- note: before you access a field args.fieldname you should check for existance&lt;br /&gt;
	-- self:addError(text)&lt;br /&gt;
	return false	-- return value will be ignored. but if you add any error, the object's initialization will fail with the error&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Classgenerator:myStashAdjustments(stash)&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator:myStashAdjustments(stash) to do some minor adjustments on data before storing, from ' .. tostring(self))&lt;br /&gt;
	-- function that alters the stash before storing the data&lt;br /&gt;
	local stash = stash&lt;br /&gt;
	return stash	-- this is your new stash. this will be stored. it has format (fieldname: value)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Classgenerator:method()&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator:method() to do something, from ' .. tostring(self))&lt;br /&gt;
	return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return Classgenerator&lt;/div&gt;</summary>
		<author><name>Anatol</name></author>
	</entry>
	<entry>
		<id>https://camnet.oetterer.eu/index.php?title=Modul:Classgenerator/class&amp;diff=1011</id>
		<title>Modul:Classgenerator/class</title>
		<link rel="alternate" type="text/html" href="https://camnet.oetterer.eu/index.php?title=Modul:Classgenerator/class&amp;diff=1011"/>
		<updated>2016-02-09T21:06:13Z</updated>

		<summary type="html">&lt;p&gt;Anatol: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local FoundationClass = require('Module:Foundationclass')&lt;br /&gt;
local ClassDebug = require('Module:Debug/class')&lt;br /&gt;
&lt;br /&gt;
-- ****************************************************************&lt;br /&gt;
-- *                         inheritance                          *&lt;br /&gt;
-- ****************************************************************&lt;br /&gt;
local Classgenerator = FoundationClass:subclass('Classgenerator')&lt;br /&gt;
-- setting class's configuration data&lt;br /&gt;
Classgenerator.static.myConfiguration = mw.loadData('Module:Classgenerator/config')&lt;br /&gt;
--   being in a static method, use self.myConfiguration&lt;br /&gt;
--   being in a private method, that knows self or in a public method, use self.class.myConfiguration&lt;br /&gt;
&lt;br /&gt;
-- ****************************************************************&lt;br /&gt;
-- *                          properties                          *&lt;br /&gt;
-- ****************************************************************&lt;br /&gt;
&lt;br /&gt;
-- **************** initialization of table for private properties&lt;br /&gt;
local _private = setmetatable({}, {__mode = 'k'})   -- weak table storing all private attributes&lt;br /&gt;
&lt;br /&gt;
-- **************** declaration of public static properties&lt;br /&gt;
-- Classgenerator.static.myPropertyModule = require('Module:extern')&lt;br /&gt;
-- Classgenerator.static.staticProperty = 'value'&lt;br /&gt;
&lt;br /&gt;
-- remember the static classes provided by Foundationclass:&lt;br /&gt;
-- Classgenerator.globalConfig&lt;br /&gt;
-- Classgenerator.myCargoUtil&lt;br /&gt;
-- Classgenerator.myTableTools&lt;br /&gt;
&lt;br /&gt;
-- **************** declaration of (global) private properties&lt;br /&gt;
-- for properties you should rather use constructor and _private[self]. this only, if you need a private class property&lt;br /&gt;
-- you should, however predeclare private methods here&lt;br /&gt;
local _debug	-- private method declared later&lt;br /&gt;
local _privateMethodAhead	-- declaration ahead, so this private method can be used in the constructor and in other private methods&lt;br /&gt;
&lt;br /&gt;
-- ***************************************************************&lt;br /&gt;
-- *                           methods                           *&lt;br /&gt;
-- ***************************************************************&lt;br /&gt;
 &lt;br /&gt;
-- **************** declaration of static methods&lt;br /&gt;
function Classgenerator:initialize(uid)&lt;br /&gt;
	local _CFG = self.class.myConfiguration&lt;br /&gt;
	FoundationClass.initialize(self, uid)&lt;br /&gt;
	local page = mw.title.getCurrentTitle().text&lt;br /&gt;
	if uid and mw.ustring.match(uid, '^' .. _CFG.global.namespace .. ':.+$') then&lt;br /&gt;
		page = mw.ustring.match(uid, '^' .. _CFG.global.namespace .. ':(.+)$')&lt;br /&gt;
	end&lt;br /&gt;
	_private[self] = {&lt;br /&gt;
		dbg = ClassDebug:new(tostring(self.class) .. ': id ' .. uid),&lt;br /&gt;
		pagename = page&lt;br /&gt;
	}&lt;br /&gt;
	_debug(self, 1, ' Classgenerator: done initializing object &amp;amp;quot;' .. uid ..'&amp;amp;quot;, from ' .. tostring(self))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- use use self.myConfiguration to access your configuration in a static method&lt;br /&gt;
function Classgenerator.static:aStaticMethod(var)&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator.static:aStaticMethod() to do something, from ' .. tostring(self))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Classgenerator.static:mySfDynamicFieldAttribute(fieldname, attribute, value)&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator.static:mySfDynamicFieldAttribute(fieldname, attribute, value), from ' .. tostring(self))&lt;br /&gt;
	_debug(self, 2, ' with parameters &amp;amp;quot;' .. fieldname .. '&amp;amp;quot;, &amp;amp;quot;' .. attribute .. '&amp;amp;quot; and a ' .. type(value) .. ' value')&lt;br /&gt;
	-- function that can process any attribute/value pair just before rendering the semantic forms field&lt;br /&gt;
	-- usually done, to generate a dynamic 'default' value&lt;br /&gt;
	-- keep in mind: you can completely disable a form field, if you return true on attribute &amp;quot;disable&amp;quot;. note however, that this causes the field to not show at all, no data will be transported/saved&lt;br /&gt;
	local pagename = mw.title.getCurrentTitle().rootText&lt;br /&gt;
	local val = value&lt;br /&gt;
	if Classgenerator.myTableTools.inTable({'template_name', 'global_entityTitle'}, fieldname) and attribute == 'default' then&lt;br /&gt;
		val = pagename&lt;br /&gt;
	end&lt;br /&gt;
	if fieldname == 'global_cargoTable' and attribute == 'default' then&lt;br /&gt;
		val = mw.ustring.lower(pagename)&lt;br /&gt;
	end&lt;br /&gt;
	if Classgenerator.globalConfig.dataStore ~= 'cargo' and Classgenerator.globalConfig.dataStore ~= 'both' then&lt;br /&gt;
		if fieldname == 'global_cargoTable' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
		if fieldname == 'global_cargoUidFieldname' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if Classgenerator.globalConfig.dataStore ~= 'smw' and Classgenerator.globalConfig.dataStore ~= 'both' then&lt;br /&gt;
		if fieldname == 'global_smwIsSubobject' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
		if fieldname == 'global_smwUseStorage' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
		if fieldname == 'global_autocreate_property' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return val	-- this value will be used as new value for field's attribute&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Classgenerator.static:sfGenerateForm()&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator.static:sfGenerateForm(), from ' .. tostring(self))&lt;br /&gt;
	local _CFG = self.myConfiguration&lt;br /&gt;
	local ClassgeneratorParameter  = require('Module:Classgenerator/parameter/class')&lt;br /&gt;
	local ClassSFfield = require('Module:SFfield/class')&lt;br /&gt;
	local tagStart = '{{{'&lt;br /&gt;
	local tagEnd = '}}}'&lt;br /&gt;
	local frame = mw.getCurrentFrame()&lt;br /&gt;
	-- create the form header&lt;br /&gt;
	local notification = mw.html.create('')&lt;br /&gt;
	if _CFG.form.notification and mw.ustring.len(_CFG.form.notification) &amp;gt; 0 then&lt;br /&gt;
		local mbox = require('Module:Message box')&lt;br /&gt;
		notification:wikitext(mbox.main('ombox', { text = _CFG.form.notification }))&lt;br /&gt;
			:newline()&lt;br /&gt;
	end&lt;br /&gt;
	local formheader = mw.html.create('')&lt;br /&gt;
	formheader:wikitext(self:sfGenerateFormInfoTag())&lt;br /&gt;
		:wikitext('&amp;lt;h2&amp;gt;' .. _CFG.global.entityTitle .. '&amp;lt;/h2&amp;gt;')&lt;br /&gt;
		:tag('p')&lt;br /&gt;
			:wikitext(_CFG.form.headerText)&lt;br /&gt;
			:done()&lt;br /&gt;
			:newline()&lt;br /&gt;
		:node(notification)&lt;br /&gt;
		:tag('div')&lt;br /&gt;
			:attr('id', 'wikiPreview')&lt;br /&gt;
			:cssText('display: none; padding-bottom: 25px; margin-bottom: 25px; border-bottom: 1px solid #AAAAAA;')&lt;br /&gt;
			:done()&lt;br /&gt;
			:newline()&lt;br /&gt;
	-- create the form buttons&lt;br /&gt;
	local formbuttons = mw.html.create('div')&lt;br /&gt;
	for _, button in pairs(_CFG.form.buttons) do&lt;br /&gt;
		formbuttons:wikitext(tagStart .. 'standard input&amp;amp;#124;' .. button .. tagEnd)&lt;br /&gt;
	end&lt;br /&gt;
	formbuttons:addClass('formbuttons')&lt;br /&gt;
		:done()&lt;br /&gt;
	-- calculate the fieldlists:&lt;br /&gt;
	local fieldlists = {}&lt;br /&gt;
	for _, field in pairs(_CFG.form.fieldOrder) do&lt;br /&gt;
		local tab = mw.ustring.match(field, '^([a-z]+)_.+')&lt;br /&gt;
		if not fieldlists[tab] then&lt;br /&gt;
			fieldlists[tab] = {}&lt;br /&gt;
		end&lt;br /&gt;
		table.insert(fieldlists[tab], field)&lt;br /&gt;
	end&lt;br /&gt;
	-- assemble everything, so start the html object&lt;br /&gt;
	local html = mw.html.create('div')&lt;br /&gt;
	html:node(formheader)&lt;br /&gt;
		:wikitext('&amp;lt;h1&amp;gt;GLOBAL-Section&amp;lt;/h1&amp;gt;')&lt;br /&gt;
		:newline()&lt;br /&gt;
		:tag('div')&lt;br /&gt;
			:wikitext('This section deals with all the class\'s global data, i.e. all data you need for your &amp;quot;template&amp;quot; part as wenn as for your form, ... ')&lt;br /&gt;
			:done()&lt;br /&gt;
			:newline()&lt;br /&gt;
		:wikitext(tagStart .. 'for template|' .. _CFG.template.name .. '|label=' .. _CFG.global.entityTitle .. tagEnd)&lt;br /&gt;
		:newline()&lt;br /&gt;
		:node(self:sfGenerateFormTable(fieldlists.global))&lt;br /&gt;
		:newline()&lt;br /&gt;
		:wikitext('&amp;lt;h1&amp;gt;FORM-Section&amp;lt;/h1&amp;gt;')&lt;br /&gt;
		:newline()&lt;br /&gt;
		:tag('div')&lt;br /&gt;
			:wikitext('This section deals with all the data, you need to create and operate a form for this class. If you don\'t want a form, disable this section. ' ..&lt;br /&gt;
					'If you need a form (e.g. as part of another form), but no form page, enable this section but leave the field for form page name emtpy.')&lt;br /&gt;
			:done()&lt;br /&gt;
			:newline()&lt;br /&gt;
		:node(self:sfGenerateFormTable(fieldlists.form))&lt;br /&gt;
		:newline()&lt;br /&gt;
		:wikitext('&amp;lt;h1&amp;gt;TEMPLATE-Section&amp;lt;/h1&amp;gt;')&lt;br /&gt;
		:newline()&lt;br /&gt;
		:tag('div')&lt;br /&gt;
			:wikitext('This section deals with all the data, you need to create and operate a template for this class. If you need tempalte specific parameters ' ..&lt;br /&gt;
				'(meaning parameteres that you only need to operate the &amp;quot;action&amp;quot;-part), put them into this section\'s custom field')&lt;br /&gt;
			:done()&lt;br /&gt;
			:newline()&lt;br /&gt;
		:node(self:sfGenerateFormTable(fieldlists.template))&lt;br /&gt;
		:newline()&lt;br /&gt;
		:wikitext('&amp;lt;h1&amp;gt;PARAMETERS-Section&amp;lt;/h1&amp;gt;')&lt;br /&gt;
		:newline()&lt;br /&gt;
		:tag('div')&lt;br /&gt;
			:wikitext('This section deals with all your parameters. You need an entry for every form input field, every template parameter, every data field you want to store, and even every notification line.')&lt;br /&gt;
			:tag('ul')&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(&amp;quot;To produce a normal parameter, add an entry, choose storage type, set '''Regular form parameter''' to yes, choose a form input type, and a template doc type.&amp;quot;)&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(&amp;quot;If you want a data field to be stored in your data storage but not defined in the form, choose a data storage type and set '''Regular form parameter''' to no. &amp;quot;)&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(&amp;quot;If you want a mutiple template to be parsed to a parameter, create a normal parameter (as described above) and choose '''Regular form parameter''' to  be ''Holds template''.&amp;quot;)&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(&amp;quot;A parameter with a form input that is not stored is created like a regular parameter but without setting any data storage type.&amp;quot;)&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(&amp;quot;Finally, you can create a message line. This is useful, if you want to convey any information to the user, that is to important for a description-tooltip. &amp;quot; ..&lt;br /&gt;
						&amp;quot;What you need to do is disable everything ('''Template doc parameter type ''', data storage) and set '''Regular form parameter''' to ''Information''. &amp;quot; ..&lt;br /&gt;
						&amp;quot;You probalby want to add the parameter to one or more ''show on select'' entries, too.&amp;quot;)&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
				:done()&lt;br /&gt;
				:newline()&lt;br /&gt;
			:done()&lt;br /&gt;
			:newline()&lt;br /&gt;
		:node(self:sfInitField('parameter_parameter'):render())&lt;br /&gt;
		:newline()&lt;br /&gt;
		:wikitext(frame:extensionTag('headertabs'))&lt;br /&gt;
		:newline()&lt;br /&gt;
		:wikitext(&amp;quot;'''(*) Pflichtfeld'''&amp;quot;)&lt;br /&gt;
		:newline()&lt;br /&gt;
		:wikitext(tagStart .. 'end template' .. tagEnd)&lt;br /&gt;
		:newline()&lt;br /&gt;
		:wikitext(ClassgeneratorParameter:sfGenerateForm())&lt;br /&gt;
		:newline()&lt;br /&gt;
		:node(formbuttons)&lt;br /&gt;
	local debugLevel = FoundationClass.globalConfig.debugLevel or self.myConfiguration.global.debugLevel&lt;br /&gt;
	if debugLevel then&lt;br /&gt;
		html:newline()&lt;br /&gt;
			:newline()&lt;br /&gt;
			:wikitext(ClassDebug:printLog(debugLevel))&lt;br /&gt;
	end&lt;br /&gt;
	return html&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- **************** declaration of private methods&lt;br /&gt;
-- use self.class.myConfiguration to access your configuration in a public or a private method that is called by a public method&lt;br /&gt;
_debug = function (self, level, text)&lt;br /&gt;
	if _private[self] and _private[self].dbg then&lt;br /&gt;
		local debugLevel = FoundationClass.globalConfig.debugLevel or self.class.myConfiguration.global.debugLevel&lt;br /&gt;
		if debugLevel and level &amp;lt;= debugLevel then&lt;br /&gt;
			_private[self].dbg:log(level, text)&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		local debugLevel = FoundationClass.globalConfig.debugLevel or self.myConfiguration.global.debugLevel&lt;br /&gt;
		if debugLevel and level &amp;lt;= debugLevel then&lt;br /&gt;
			ClassDebug:log(level, text, tostring(self) .. '.static')&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local _namespaceName = function (self, namespaceId)&lt;br /&gt;
	_debug(self, 1, 'entering private _namespaceName() to translate namespace namespaceId ' .. namespaceId .. ' into a universal name, from ' .. tostring(self))&lt;br /&gt;
	local ret, nulProperty = pcall(mw.title.new, 'NUL', 'Property')&lt;br /&gt;
	if ret and (namespaceId == nulProperty.namespace) then&lt;br /&gt;
		return 'property'	-- if you change this, check on other places, this is checked against and change that, too&lt;br /&gt;
	else&lt;br /&gt;
		return mw.site.namespaces[namespaceId].canonicalName&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local _processAttribute = function (self, attr, indent, name)&lt;br /&gt;
	_debug(self, 1, 'entering private _processAttribute() to print a line for attribute ' .. attr .. ', from ' .. tostring(self))&lt;br /&gt;
	local coreData = self:getCoreData()&lt;br /&gt;
	local attr = attr&lt;br /&gt;
	local val = coreData[attr]&lt;br /&gt;
	if type(val) == 'boolean' then&lt;br /&gt;
		val = val and 'true' or 'false'&lt;br /&gt;
	end&lt;br /&gt;
	local ret = ''&lt;br /&gt;
	local fieldname = mw.ustring.match(attr, '^[^_]+_(.+)$')&lt;br /&gt;
	ret = indent .. (name and name or fieldname) .. ' = '&lt;br /&gt;
	if not val then&lt;br /&gt;
		ret = ret .. 'nil'&lt;br /&gt;
	elseif type(val) == 'table' then&lt;br /&gt;
		ret = ret .. Classgenerator.myTableTools.printTable(val, 'inline')&lt;br /&gt;
	elseif val == 'true' or val == 'false' or mw.ustring.match(val, '^[0-9]+$') or (attr == 'global_gardeningCategory' and val == 'superglobal.gardeningCategory') then&lt;br /&gt;
		ret = ret .. val&lt;br /&gt;
	else&lt;br /&gt;
		ret = ret .. &amp;quot;'&amp;quot; .. mw.ustring.gsub(mw.ustring.gsub(mw.ustring.gsub(val, &amp;quot;\\'&amp;quot;, &amp;quot;'&amp;quot;), &amp;quot;'&amp;quot;, &amp;quot;\\'&amp;quot;), '\n', '\\n\' ..\n' .. indent .. '\t\'') .. &amp;quot;'&amp;quot;	-- the gsub catches multiline input from textareas&lt;br /&gt;
	end&lt;br /&gt;
	ret = ret .. ','&lt;br /&gt;
	if self.class.myConfiguration.template.addCommentsToConfig then&lt;br /&gt;
		ret = ret .. '\t-- ' .. self.class.myConfiguration.parameter[attr].description&lt;br /&gt;
	end&lt;br /&gt;
	ret = ret .. '\n'&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local _privateMethod = function (self)&lt;br /&gt;
	_debug(self, 1, 'entering private _privateMethod() to do something, from ' .. tostring(self))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- **************** declaration of public methods&lt;br /&gt;
-- use self.class.myConfiguration to access your configuration in a public method&lt;br /&gt;
function Classgenerator:addInfobox()&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator:addInfobox(), from ' .. tostring(self))&lt;br /&gt;
	if self:goodToGo() then&lt;br /&gt;
		local _CFG = self.class.myConfiguration&lt;br /&gt;
		local coreData = self:getCoreData()&lt;br /&gt;
		local usesSmw = FoundationClass.globalConfig.dataStore and (FoundationClass.globalConfig.dataStore == 'both' or FoundationClass.globalConfig.dataStore == 'smw') and FoundationClass.myYesno(coreData.global_smwUseStorage)&lt;br /&gt;
		local ib_args = {&lt;br /&gt;
			bodyclass = 'infobox_name',&lt;br /&gt;
			aboveclass = 'objtitle titletext',&lt;br /&gt;
			headerclass = 'headertext',&lt;br /&gt;
			labelstyle = 'width: 30%;',&lt;br /&gt;
			datastyle = 'width: 70%;',&lt;br /&gt;
			title = coreData.className,&lt;br /&gt;
			subheader = 'Class',&lt;br /&gt;
			label1 = 'Title',&lt;br /&gt;
			data1 = coreData.global_entityTitle and coreData.global_entityTitle or '',&lt;br /&gt;
			label2 = _CFG.parameter.global_edit_timestamp.label,&lt;br /&gt;
			data2 = coreData.last_edited,&lt;br /&gt;
			label3 = 'Store available',&lt;br /&gt;
			data3 = (FoundationClass.globalConfig.dataStore and mw.ustring.len(FoundationClass.globalConfig.dataStore) &amp;gt; 0) and FoundationClass.globalConfig.dataStore or '',&lt;br /&gt;
			label5 = 'Cargo table',&lt;br /&gt;
			data5 = (FoundationClass.globalConfig.dataStore and (FoundationClass.globalConfig.dataStore == 'both' or FoundationClass.globalConfig.dataStore == 'cargo')) and coreData.global_cargoTable or '',&lt;br /&gt;
			label6 = 'Smw class',&lt;br /&gt;
			data6 = usesSmw and _private[self].pagename or '',&lt;br /&gt;
			data7 = coreData.global_description,&lt;br /&gt;
			header10 = 'Pages',&lt;br /&gt;
			label12 = 'Module',&lt;br /&gt;
			data12 = _private[self].pagename and '[[Module:' .. _private[self].pagename .. ']]' or '',&lt;br /&gt;
			label13 = 'Class',&lt;br /&gt;
			data13 = _private[self].pagename and '[[Module:' .. _private[self].pagename .. '/class]]' or '',&lt;br /&gt;
			label14 = 'Config',&lt;br /&gt;
			data14 = _private[self].pagename and '[[Module:' .. _private[self].pagename .. '/config]]' or '',&lt;br /&gt;
			label17 = 'Template',&lt;br /&gt;
			data17 = coreData.template_name and '[[Template:' .. coreData.template_name .. ']]' or '',&lt;br /&gt;
			label19 = 'Form',&lt;br /&gt;
			data19 = coreData.page.form and '[[:' .. coreData.page.form.name .. ']]' or '',&lt;br /&gt;
			label21 = 'Category',&lt;br /&gt;
			data21 = coreData.page.category and '[[:' .. coreData.page.category.name .. ']]' or '',&lt;br /&gt;
			label22 = 'Gardening',&lt;br /&gt;
			data22 = coreData.page.gardeningCategory and '[[:' .. coreData.page.gardeningCategory.name .. ']]' or '',&lt;br /&gt;
		}&lt;br /&gt;
		if usesSmw and coreData.properties.order and #coreData.properties.order &amp;gt; 0 then&lt;br /&gt;
			ib_args.header30 = 'Properties'&lt;br /&gt;
			local i = 31&lt;br /&gt;
			for _, property in pairs(coreData.properties.order) do&lt;br /&gt;
				ib_args['label' .. i] = coreData.properties.data[property].type&lt;br /&gt;
				ib_args['data' .. i] = '[[Property:' .. property .. '|' .. property .. ']]'&lt;br /&gt;
				i = i + 1&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		self:addOutput(require('Module:Infobox').infobox(ib_args))&lt;br /&gt;
		return true&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Classgenerator:addPageBody()&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator:addPageBody(), from ' .. tostring(self))&lt;br /&gt;
	_debug(self, 2, ' rendering errors and warnings and adding them to output')&lt;br /&gt;
	self:addOutput(self:renderErrors())&lt;br /&gt;
	self:addOutput(self:renderWarnings())&lt;br /&gt;
	if self:goodToGo() then&lt;br /&gt;
		local frame = mw.getCurrentFrame()&lt;br /&gt;
		local lang = mw.language.new('en-gb')&lt;br /&gt;
		local _CFG = self.class.myConfiguration&lt;br /&gt;
		local coreData = self:getCoreData()&lt;br /&gt;
		-- start&lt;br /&gt;
		local widthTh = '300px'&lt;br /&gt;
		local widthTd = '200px'&lt;br /&gt;
		-- build the page status table&lt;br /&gt;
		-- first the two status table cells &amp;quot;green&amp;quot; and &amp;quot;red&amp;quot;&lt;br /&gt;
		local imgYes = '[[File:Yes check.png|13px|alt=Yes|link=]]'&lt;br /&gt;
		local imgNo = '[[File:X mark.png|13px|alt=No|link=]]'&lt;br /&gt;
		local tdYa = mw.html.create('td')&lt;br /&gt;
		tdYa:cssText('background: #90ff90; color:black; vertical-align: middle; text-align: center; width:' .. widthTd)&lt;br /&gt;
			:addClass('table-yes')&lt;br /&gt;
			:wikitext(imgYes)&lt;br /&gt;
		local tdNa = mw.html.create('td')&lt;br /&gt;
		tdNa:cssText('background: #FF9090; color:black; vertical-align: middle; text-align: center; width:' .. widthTd)&lt;br /&gt;
			:addClass('table-no')&lt;br /&gt;
			:wikitext(imgNo)&lt;br /&gt;
		local classExists = coreData.page.class.exists and coreData.page.config.exists&lt;br /&gt;
		local modulesExist = coreData.page.base.exists and classExists&lt;br /&gt;
		local thisClass&lt;br /&gt;
		local thisConfig&lt;br /&gt;
		if classExists then&lt;br /&gt;
			thisClass = require(coreData.page.class.name)&lt;br /&gt;
			thisConfig = require(coreData.page.config.name)&lt;br /&gt;
		end&lt;br /&gt;
		local thisUsesCargo = (FoundationClass.globalConfig.dataStore == 'both' or FoundationClass.globalConfig.dataStore == 'cargo') and coreData.global_cargoTable and #coreData.global_cargoTable &amp;gt; 0&lt;br /&gt;
		local thisUsesSmw = (FoundationClass.globalConfig.dataStore == 'both' or FoundationClass.globalConfig.dataStore == 'smw') and FoundationClass.myYesno(coreData.global_smwUseStorage)&lt;br /&gt;
		-- write the 2do checklist&lt;br /&gt;
		local done = true&lt;br /&gt;
		local step1&lt;br /&gt;
		local step2&lt;br /&gt;
		local step3&lt;br /&gt;
		if modulesExist then&lt;br /&gt;
			step1 = imgYes .. ' You created all your modules'&lt;br /&gt;
		else&lt;br /&gt;
			done = false&lt;br /&gt;
			step1 = imgNo .. ' You have to create your module pages. This, you have to do &amp;lt;b&amp;gt;manually&amp;lt;/b&amp;gt;. Go to [[#Page contents|section Page contents]], copy the module content and edit the corresponding module, ' ..&lt;br /&gt;
				'pasting all the copied content. Save and close. You have to do this for the following module(s): &amp;lt;ul&amp;gt; ' ..&lt;br /&gt;
				(not coreData.page.base.exists and '&amp;lt;li&amp;gt;[[#Page contents|' .. coreData.page.base.name .. ']]&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
				(not coreData.page.class.exists and '&amp;lt;li&amp;gt;[[#Page contents|' .. coreData.page.class.name .. ']]&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
				(not coreData.page.config.exists and '&amp;lt;li&amp;gt;[[#Page contents|' .. coreData.page.config.name .. ']]&amp;lt;/li&amp;gt;' or '') .. '&amp;lt;/ul&amp;gt;'&lt;br /&gt;
		end&lt;br /&gt;
		if coreData.page.baseDoc.exists and coreData.page.classDoc.exists and coreData.page.configDoc.exists and coreData.page.template.exists and coreData.page.templateDoc.exists and&lt;br /&gt;
				(not coreData.page.form or coreData.page.form.exists) and (not coreData.page.category or coreData.page.category.exists) and (not coreData.page.gardeningCategory or coreData.page.gardeningCategory.exists) then&lt;br /&gt;
			step2 = imgYes .. ' You created all auxilliary pages'&lt;br /&gt;
		else&lt;br /&gt;
			done = false&lt;br /&gt;
			step2 = imgNo .. ' You have to create auxilliary pages. This, you can do &amp;lt;b&amp;gt;automatically&amp;lt;/b&amp;gt;. Go to [[#Page autocreation|section Page autocreation]], hit the corresponding &amp;quot;Create&amp;quot;-button or ' ..&lt;br /&gt;
				'create all pages at once. Please do this for the following page(s): &amp;lt;ul&amp;gt; ' ..&lt;br /&gt;
				(not (coreData.page.baseDoc.exists or coreData.page.classDoc.exists or coreData.page.configDoc.exists) and '&amp;lt;li&amp;gt;Module documentation pages&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
				(not (coreData.page.template.exists or coreData.page.templateDoc.exists) and '&amp;lt;li&amp;gt;Template and/or template documentation page&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
				((coreData.page.form and not coreData.page.form.exists) and '&amp;lt;li&amp;gt;Form page&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
				(((coreData.page.category and not coreData.page.category.exists) or (coreData.page.gardeningCategory and not coreData.page.gardeningCategory.exists)) and '&amp;lt;li&amp;gt;Category page(s)&amp;lt;/li&amp;gt;' or '') .. '&amp;lt;/ul&amp;gt;'&lt;br /&gt;
		end&lt;br /&gt;
		local storeCargoInstruction&lt;br /&gt;
		local allPropertiesThere&lt;br /&gt;
		local cargoTableCreateLink = false&lt;br /&gt;
		if thisUsesCargo then&lt;br /&gt;
			-- we actually use cargo. check, if cargo table is there or throws an error? if all right, then yes, else instruction above&lt;br /&gt;
			if modulesExist and coreData.page.template.exists then&lt;br /&gt;
				cargoTableCreateLink = true&lt;br /&gt;
				attr = { limit = 1, default = '' }&lt;br /&gt;
				attr['more results text'] = ''&lt;br /&gt;
				local tableEntryId = mw.text.trim(mw.text.unstrip(FoundationClass.myCargoUtil.rawquery({tables = coreData.global_cargoTable, fields = {'_ID'}}, attr)))&lt;br /&gt;
				if mw.ustring.match(mw.text.trim(tableEntryId), '^[0-9]*$') then&lt;br /&gt;
					storeCargoInstruction = imgYes .. ' Your cargo table does exist! (Note: When you change your cargo table\'s declaration, you need to [[#Page autocreation|rebuild it]], though)'&lt;br /&gt;
				else&lt;br /&gt;
					done = false&lt;br /&gt;
					storeCargoInstruction = imgNo .. ' Please [[#Page autocreation|create your cargo table]]!'&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				done = false&lt;br /&gt;
				storeCargoInstruction = imgNo .. ' To be able to create your cargo table, you have to create the following page(s): &amp;lt;ul&amp;gt;' ..&lt;br /&gt;
					(not coreData.page.base.exists and '&amp;lt;li&amp;gt;' .. coreData.page.base.name .. '&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
					(not coreData.page.class.exists and '&amp;lt;li&amp;gt;' .. coreData.page.class.name .. '&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
					(not coreData.page.config.exists and '&amp;lt;li&amp;gt;' .. coreData.page.config.name .. '&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
					(not coreData.page.template.exists and '&amp;lt;li&amp;gt;' .. coreData.page.template.name .. '&amp;lt;/li&amp;gt;' or '') .. '&amp;lt;/ul&amp;gt;'&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if thisUsesSmw then&lt;br /&gt;
			-- we actually use smw. check, if all properties are present? if all right, then yes, else instruction above&lt;br /&gt;
			if coreData.properties and coreData.properties.data and FoundationClass.myTableTools.size(coreData.properties.data) &amp;gt; 0 then&lt;br /&gt;
				allPropertiesThere = true&lt;br /&gt;
				for property, propertyData in pairs(coreData.properties.data) do&lt;br /&gt;
					allPropertiesThere = allPropertiesThere and propertyData.exists&lt;br /&gt;
				end&lt;br /&gt;
				if allPropertiesThere then&lt;br /&gt;
					storeSwmInstruction = imgYes .. ' All your property pages are present and accounted for!'&lt;br /&gt;
				else&lt;br /&gt;
					done = false&lt;br /&gt;
					storeSwmInstruction = imgNo .. ' Please &amp;lt;b&amp;gt;[[#Page autocreation|autocreate]]&amp;lt;/b&amp;gt; your properties! The following are missing: &amp;lt;ul&amp;gt;'&lt;br /&gt;
					for _, property in pairs(coreData.properties.order) do&lt;br /&gt;
						local pdata = coreData.properties.data[property]&lt;br /&gt;
						if not pdata or not pdata.exists then&lt;br /&gt;
							storeSwmInstruction = storeSwmInstruction .. '&amp;lt;li&amp;gt;[[Property:' .. property .. ']]&amp;lt;/li&amp;gt;'&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
					storeSwmInstruction = storeSwmInstruction .. '&amp;lt;/ul&amp;gt;'&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				done = false&lt;br /&gt;
				storeSwmInstruction = imgNo .. ' To be able to create your smw properties, you have to create the following page(s): &amp;lt;ul&amp;gt;' ..&lt;br /&gt;
					(not coreData.page.class.exists and '&amp;lt;li&amp;gt;' .. coreData.page.class.name .. '&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
					(not coreData.page.config.exists and '&amp;lt;li&amp;gt;' .. coreData.page.config.name .. '&amp;lt;/li&amp;gt;' or '') .. '&amp;lt;/ul&amp;gt;'&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if storeCargoInstruction or storeSwmInstruction then&lt;br /&gt;
			if storeCargoInstruction and storeSwmInstruction then&lt;br /&gt;
				step3 = 'Your class used cargo AND smw store. You have to create both data stores: &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;' .. storeCargoInstruction .. '&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;' .. storeSwmInstruction .. '&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;'&lt;br /&gt;
			else&lt;br /&gt;
				step3 = storeCargoInstruction or storeSwmInstruction&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			step3 = imgYes .. ' This class does not use a data store. Nothing to be done here!'&lt;br /&gt;
		end&lt;br /&gt;
		local step4 = done and imgYes .. ' You are done. Remember, when you want to change parameters in your config, edit this page and write your [' .. coreData.page.config.editlink .. ' config file] new' or &lt;br /&gt;
			imgNo .. ' You are not finished yet, please tend to your tasks.'&lt;br /&gt;
		local manual = mw.html.create('')&lt;br /&gt;
		manual:wikitext('&amp;lt;h2&amp;gt;Your 2do checklist&amp;lt;/h2&amp;gt;')&lt;br /&gt;
			:tag('ol')&lt;br /&gt;
				:cssText('margin: 0.3em 0 0 1.6em; padding: 0')&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(step1)&lt;br /&gt;
					:done()&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(step2)&lt;br /&gt;
					:done()&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(step3)&lt;br /&gt;
					:done()&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(step4)&lt;br /&gt;
					:done()&lt;br /&gt;
				:done()&lt;br /&gt;
		-- get the data store details, if all the modules exist and we have a datastore configured&lt;br /&gt;
		local datastore = mw.html.create('')&lt;br /&gt;
		if thisClass then&lt;br /&gt;
			datastore:node(thisClass:explainDataStore())&lt;br /&gt;
				:newline()&lt;br /&gt;
		end&lt;br /&gt;
		-- build the status table&lt;br /&gt;
		local statusTrs = mw.html.create('')&lt;br /&gt;
		for _, pid in pairs(coreData.page.order) do&lt;br /&gt;
			statusTrs:tag('tr')&lt;br /&gt;
				:tag('th')&lt;br /&gt;
					:css('text-align', 'left')&lt;br /&gt;
					:css('width', widthTh)&lt;br /&gt;
					:wikitext(coreData.page[pid].name)&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
				:node(coreData.page[pid].exists and tdYa or tdNa)&lt;br /&gt;
				:newline()&lt;br /&gt;
				:done()&lt;br /&gt;
				:newline()&lt;br /&gt;
		end&lt;br /&gt;
		if thisUsesSmw and coreData.properties and coreData.properties.data and FoundationClass.myTableTools.size(coreData.properties.data) &amp;gt; 0 then&lt;br /&gt;
			statusTrs:tag('tr')&lt;br /&gt;
				:tag('th')&lt;br /&gt;
					:css('text-align', 'center')&lt;br /&gt;
					:css('width', widthTh)&lt;br /&gt;
					:attr('colspan', 2)&lt;br /&gt;
					:wikitext('Property pages for your smw store')&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
			for _, property in pairs(coreData.properties.order) do&lt;br /&gt;
				statusTrs:tag('tr')&lt;br /&gt;
					:tag('th')&lt;br /&gt;
						:css('text-align', 'left')&lt;br /&gt;
						:css('width', widthTh)&lt;br /&gt;
						:wikitext('Property:' .. property)&lt;br /&gt;
						:done()&lt;br /&gt;
						:newline()&lt;br /&gt;
					:node(coreData.properties.data[property].exists and tdYa or tdNa)&lt;br /&gt;
					:newline()&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		local statusTable = mw.html.create('table')&lt;br /&gt;
		statusTable:node(statusTrs)&lt;br /&gt;
		-- page autocreation&lt;br /&gt;
		local extAutoCreatePage = pcall(frame.callParserFunction, frame, {name = '#createpageifnotex:Module:Classgenerator', {'NUL'}})&lt;br /&gt;
		local autoCreation = _CFG.template.createPages and extAutoCreatePage&lt;br /&gt;
		local pageAutoCreation = mw.html.create('')&lt;br /&gt;
		pageAutoCreation:wikitext('&amp;lt;h2&amp;gt;Page autocreation&amp;lt;/h2&amp;gt;')&lt;br /&gt;
			:newline()&lt;br /&gt;
		if autoCreation then&lt;br /&gt;
			-- depending on parameters and existence of pages do the autocreate or print the button&lt;br /&gt;
			-- first see, which pagecomplexes (modules(docs), templates, form, category) are missing&lt;br /&gt;
			local missing = {}&lt;br /&gt;
			-- in missing we store, if a page in a given namespace is missing. Namespaces are stored by their ids (numbers)&lt;br /&gt;
			for _, pid in pairs(coreData.page.order) do&lt;br /&gt;
				-- due to extension autocreatepage messing up module pages, in namepace module we only autocreate doc pages&lt;br /&gt;
				if not coreData.page[pid].exists and not Classgenerator.myTableTools.inTable(missing, coreData.page[pid].namespace) and &lt;br /&gt;
						(coreData.page[pid].namespace ~= 828 or coreData.page[pid].isDocPage) then&lt;br /&gt;
					table.insert(missing, coreData.page[pid].namespace)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			if thisUsesSmw and not allPropertiesThere then&lt;br /&gt;
				table.insert(missing, mw.title.new('NUL', 'Property').namespace)&lt;br /&gt;
			end&lt;br /&gt;
			-- now generate the printout or call the parser function depending on global_autocreate_* status&lt;br /&gt;
			-- remember the switches 'global_autocreate_module', 'global_autocreate_template', 'global_autocreate_form', 'global_autocreate_category', and 'global_autocreate_property'&lt;br /&gt;
			local actable = mw.html.create('table')&lt;br /&gt;
			for _, nsid  in pairs(missing) do&lt;br /&gt;
				local ns = mw.ustring.lower(_namespaceName(self, nsid))&lt;br /&gt;
				local information = ''&lt;br /&gt;
				if coreData.autocreate[ns] and coreData.autocreate[ns] &amp;gt; os.time() - _CFG.template.autoCreationTimeDiff then&lt;br /&gt;
					-- ************************************* actual autocreation is done here&lt;br /&gt;
					-- we iterate over all namespaces for which pages are missing (var missing) and spring into action, if we have a numeric value supplied for that namespace coreData.autocreate[ns] that is recent enough&lt;br /&gt;
					-- now we have a namespace, we want to create pages for (var nsid) (all that is done in the recent 4 lines). what we do in the following lines:&lt;br /&gt;
					-- we iterate over all pages in coreData.page.order and spring into action, if the interation instance (pid) is in the namespace (nsid), the page is non exist and is not a module&lt;br /&gt;
					-- in that action body, we create the page with the precalcualted content&lt;br /&gt;
					-- also: for convenience, we create some global project (meta)categories, if related to the current page (project-form-category if nsid for forms, etc.) and configured in Foundationclass/globalconfig. here is an overview&lt;br /&gt;
					--	Classgenerator.globalConfig.formCategory			: MediaWiki:Classengine-content-project-form-category&lt;br /&gt;
					--	Classgenerator.globalConfig.gardeningSuperCategory	: MediaWiki:Classengine-content-project-gardening-supercategory&lt;br /&gt;
					--	Classgenerator.globalConfig.moduleCategory			: MediaWiki:Classengine-content-project-module-category&lt;br /&gt;
					--	Classgenerator.globalConfig.projectSuperCategory	: MediaWiki:Classengine-content-project-supercategory&lt;br /&gt;
					--	Classgenerator.globalConfig.propertyCategory		: MediaWiki:Classengine-content-project-property-category&lt;br /&gt;
					--	Classgenerator.globalConfig.templateCategory		: MediaWiki:Classengine-content-project-templates&lt;br /&gt;
					for _, pid in pairs(coreData.page.order) do&lt;br /&gt;
						_debug(self, 3, ' testing page &amp;quot;' .. coreData.page[pid].name .. '&amp;quot;: namespace id is ' .. coreData.page[pid].namespace ..&lt;br /&gt;
							', and page does ' ..(not coreData.page[pid].exists and 'not ' or '') .. 'exist')&lt;br /&gt;
						if coreData.page[pid].namespace == nsid and not coreData.page[pid].exists and (nsid ~= 828 or coreData.page[pid].isDocPage) then&lt;br /&gt;
							if pid == 'gardeningCategory' and Classgenerator.globalConfig.gardeningSuperCategory and #Classgenerator.globalConfig.gardeningSuperCategory &amp;gt; 0 then&lt;br /&gt;
								-- we just iterated over the gardening category page (so this class has one) but we did not create it, yet)&lt;br /&gt;
								-- blindly try to create the gardening supercategory first, in case the class's gardening category is the gardening supercategory, we dont want the class specific content&lt;br /&gt;
								local content = '{{MediaWiki:Classengine-content-project-gardening-supercategory}}'&lt;br /&gt;
								_debug(self, 3, ' trying to autocreate garderning supercategory page &amp;quot;' .. Classgenerator.globalConfig.gardeningSuperCategory .. '&amp;quot; with # of content being ' .. #content)&lt;br /&gt;
								local ret = frame:callParserFunction{ name = '#createpageifnotex:Category:' .. Classgenerator.globalConfig.gardeningSuperCategory, args = { content } }&lt;br /&gt;
								if #ret &amp;gt; 0 then&lt;br /&gt;
									information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
								end&lt;br /&gt;
							end&lt;br /&gt;
							_debug(self, 3, ' trying to autocreate page &amp;quot;' .. coreData.page[pid].name .. '&amp;quot; with # of content being ' .. #coreData.page[pid].content)&lt;br /&gt;
							local ret = frame:callParserFunction{ name = '#createpageifnotex:' .. coreData.page[pid].name, args = { frame:preprocess(coreData.page[pid].content) } }&lt;br /&gt;
							if #ret &amp;gt; 0 then&lt;br /&gt;
								information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
							end&lt;br /&gt;
							if pid == 'form' and Classgenerator.globalConfig.formCategory and #Classgenerator.globalConfig.formCategory &amp;gt; 0 then&lt;br /&gt;
								-- we just iterated over the form page (so this class has one) and created it (yay). Now blindly create the formCategory as well...&lt;br /&gt;
								local content = '{{MediaWiki:Classengine-content-project-form-category}}'&lt;br /&gt;
								_debug(self, 3, ' trying to autocreate form category page &amp;quot;' .. Classgenerator.globalConfig.formCategory .. '&amp;quot; with # of content being ' .. #content)&lt;br /&gt;
								local ret = frame:callParserFunction{ name = '#createpageifnotex:Category:' .. Classgenerator.globalConfig.formCategory, args = { content } }&lt;br /&gt;
								if #ret &amp;gt; 0 then&lt;br /&gt;
									information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
								end&lt;br /&gt;
							elseif nsid ~= 828 and Classgenerator.globalConfig.moduleCategory and #Classgenerator.globalConfig.moduleCategory &amp;gt; 0 then&lt;br /&gt;
								-- we just iterated a module doc page (so this class has one) and created it (yay). Now blindly create the moduleCategory as well...&lt;br /&gt;
								local content = '{{MediaWiki:Classengine-content-project-module-category}}'&lt;br /&gt;
								_debug(self, 3, ' trying to autocreate module category page &amp;quot;' .. Classgenerator.globalConfig.moduleCategory .. '&amp;quot; with # of content being ' .. #content)&lt;br /&gt;
								local ret = frame:callParserFunction{ name = '#createpageifnotex:Category:' .. Classgenerator.globalConfig.moduleCategory, args = { content } }&lt;br /&gt;
								if #ret &amp;gt; 0 then&lt;br /&gt;
									information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
								end&lt;br /&gt;
							elseif pid == 'category' and Classgenerator.globalConfig.projectSuperCategory and #Classgenerator.globalConfig.projectSuperCategory &amp;gt; 0 then&lt;br /&gt;
								-- we just iterated over the category page (so this class has one) and created it (yay). Now blindly create the supercategory as well...&lt;br /&gt;
								local content = '{{MediaWiki:Classengine-content-project-supercategory}}'&lt;br /&gt;
								_debug(self, 3, ' trying to autocreate super category page &amp;quot;' .. Classgenerator.globalConfig.projectSuperCategory .. '&amp;quot; with # of content being ' .. #content)&lt;br /&gt;
								local ret = frame:callParserFunction{ name = '#createpageifnotex:Category:' .. Classgenerator.globalConfig.projectSuperCategory, args = { content } }&lt;br /&gt;
								if #ret &amp;gt; 0 then&lt;br /&gt;
									information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
								end&lt;br /&gt;
							elseif nsid == 10 and Classgenerator.globalConfig.templateCategory and #Classgenerator.globalConfig.templateCategory &amp;gt; 0 then&lt;br /&gt;
								-- we just iterated over a page in template namespace (so this class has one) and created it (yay). Now blindly create the templateCategory as well...&lt;br /&gt;
								local content = '{{MediaWiki:Classengine-content-project-template-category}}'&lt;br /&gt;
								_debug(self, 3, ' trying to autocreate template category page &amp;quot;' .. Classgenerator.globalConfig.templateCategory .. '&amp;quot; with # of content being ' .. #content)&lt;br /&gt;
								local ret = frame:callParserFunction{ name = '#createpageifnotex:Category:' .. Classgenerator.globalConfig.templateCategory, args = { content } }&lt;br /&gt;
								if #ret &amp;gt; 0 then&lt;br /&gt;
									information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
								end&lt;br /&gt;
							end&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
					if thisUsesSmw and (nsid == mw.title.new('NUL', 'Property').namespace) then&lt;br /&gt;
						-- add here autocreation of properties&lt;br /&gt;
						for property, pdata in pairs(coreData.properties.data) do&lt;br /&gt;
							if not pdata.exists then&lt;br /&gt;
								local content = pdata.content&lt;br /&gt;
								_debug(self, 3, ' trying to autocreate property page &amp;quot;' .. property .. '&amp;quot; with # of content being ' .. #content)&lt;br /&gt;
								local ret = frame:callParserFunction{ name = '#createpageifnotex:Property:' .. property, args = { frame:preprocess(pdata.content) } }&lt;br /&gt;
								if #ret &amp;gt; 0 then&lt;br /&gt;
									information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
								end&lt;br /&gt;
							end&lt;br /&gt;
						end&lt;br /&gt;
						-- we just iterated over all missing property pages (so this class has some) and created them (yay). Now blindly create the propertyCategory as well...&lt;br /&gt;
						local content = '{{MediaWiki:Classengine-content-project-property-category}}'&lt;br /&gt;
						_debug(self, 3, ' trying to autocreate property category page &amp;quot;' .. Classgenerator.globalConfig.propertyCategory .. '&amp;quot; with # of content being ' .. #content)&lt;br /&gt;
						local ret = frame:callParserFunction{ name = '#createpageifnotex:Category:' .. Classgenerator.globalConfig.propertyCategory, args = { content } }&lt;br /&gt;
						if #ret &amp;gt; 0 then&lt;br /&gt;
							information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				-- create the tr for the ns&lt;br /&gt;
				actable:tag('tr')&lt;br /&gt;
					:tag('th')&lt;br /&gt;
						:css('text-align', 'left')&lt;br /&gt;
						:css('width', widthTh)&lt;br /&gt;
						:wikitext('Create ' .. ((nsid == 828 and 'module docs' or (ns == 'property' and 'properties' or (ns .. (ns == 'template' and 's' or '')))) .. ':'))&lt;br /&gt;
							-- note: nsid == mw.title.new('NUL', 'Property').namespace is necessary since canonicalname for property namespace does not translate uniquely over different languages :(&lt;br /&gt;
						:done()&lt;br /&gt;
						:newline()&lt;br /&gt;
					:tag('td')&lt;br /&gt;
						:cssText('color:black; vertical-align: middle; text-align: center; width:' .. widthTd)&lt;br /&gt;
						:css('background', (coreData.autocreate[ns] and coreData.autocreate[ns] &amp;gt; os.time() - _CFG.template.autoCreationTimeDiff) and '#90ff90' or '#FF9090' )&lt;br /&gt;
						:wikitext(frame:callParserFunction{name = '#autoedit', args={form='Classgenerator', target=self:getUid(),&lt;br /&gt;
							'link text=' .. (coreData.autocreate[ns] and 'Requested on ' .. os.date('%d.%m.%Y %X', coreData.autocreate[ns]) or 'Create automatically!')  .. &lt;br /&gt;
								(#information &amp;gt; 0 and ('Call returned ' .. information) or ''),&lt;br /&gt;
							'reload', summary=&amp;quot;Requesting the autocreation of &amp;quot; .. coreData.className .. ' for pages of type ' .. ns,&lt;br /&gt;
							'query string=Classgenerator[global_autocreate_' .. ns .. ']=' .. os.time()}&lt;br /&gt;
							})&lt;br /&gt;
						:done()&lt;br /&gt;
						:newline()&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
&lt;br /&gt;
			end&lt;br /&gt;
			if Classgenerator.myTableTools.size(missing) &amp;gt; 0 then&lt;br /&gt;
				-- show the all button&lt;br /&gt;
				local querystring = ''&lt;br /&gt;
				for _, nsid in pairs(missing) do&lt;br /&gt;
					local ns = mw.ustring.lower(_namespaceName(self, nsid))&lt;br /&gt;
					querystring = querystring .. 'Classgenerator[global_autocreate_' .. ns .. ']=' .. os.time() .. '&amp;amp;'&lt;br /&gt;
				end&lt;br /&gt;
				querystring = mw.ustring.sub(querystring, 1, -2)&lt;br /&gt;
				actable:tag('tr')&lt;br /&gt;
					:tag('th')&lt;br /&gt;
						:css('text-align', 'left')&lt;br /&gt;
						:css('width', widthTh)&lt;br /&gt;
						:wikitext('Create all pages:')&lt;br /&gt;
						:done()&lt;br /&gt;
						:newline()&lt;br /&gt;
					:tag('td')&lt;br /&gt;
						:cssText('background: #FF9090; color:black; vertical-align: middle; text-align: center; width:' .. widthTd)&lt;br /&gt;
						:wikitext(frame:callParserFunction{name = '#autoedit', args={form='Classgenerator', target=self:getUid(),&lt;br /&gt;
							'link text=Create automatically!', 'reload', summary=&amp;quot;Requesting the autocreation of all missing pages&amp;quot;, 'query string=' .. querystring }&lt;br /&gt;
							})&lt;br /&gt;
						:done()&lt;br /&gt;
						:newline()&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
				pageAutoCreation:wikitext('&amp;lt;b&amp;gt;Note:&amp;lt;/b&amp;gt; Creation of module pages is impossible due to an incompatibility issue.')&lt;br /&gt;
					:newline()&lt;br /&gt;
					:node(actable)&lt;br /&gt;
					:newline()&lt;br /&gt;
			else&lt;br /&gt;
				pageAutoCreation:wikitext('All pages present!')&lt;br /&gt;
					:newline()&lt;br /&gt;
					:tag('p')&lt;br /&gt;
						:wikitext('&amp;lt;small&amp;gt;&amp;lt;b&amp;gt;Note:&amp;lt;/b&amp;gt; Creation of module pages is impossible due to an incompatibility issue.&amp;lt;/small&amp;gt;')&lt;br /&gt;
						:newline()&lt;br /&gt;
						:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			pageAutoCreation:wikitext('Page autocreation is only possible if activated in your [[Module:Classgenerator/config]]-file (see template-section) and '&lt;br /&gt;
					.. 'Extension AutoCreatePage being installed.')&lt;br /&gt;
				:newline()&lt;br /&gt;
		end&lt;br /&gt;
		if cargoTableCreateLink then&lt;br /&gt;
			pageAutoCreation:wikitext('&amp;lt;b&amp;gt;Cargo data store:&amp;lt;/b&amp;gt;To (re-)create your cargo table, follow &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[' .. coreData.page.template.recreatedata .. ' this link]&amp;lt;/span&amp;gt; and then press ok!')&lt;br /&gt;
				:newline()&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		-- build the content collapses&lt;br /&gt;
		local collapse = require('Module:Collapse').main&lt;br /&gt;
		local bg_sets = { exist = {'#cfc', '#9c9'}, nonexist = {'#fcc', '#c99'} }&lt;br /&gt;
		local bg = 1&lt;br /&gt;
		local pageContent = mw.html.create('')&lt;br /&gt;
		for _, pid in pairs(coreData.page.order) do&lt;br /&gt;
			local content&lt;br /&gt;
			local bgs = coreData.page[pid].exists and bg_sets.exist or bg_sets.nonexist&lt;br /&gt;
			if coreData.page[pid].namespace == 828 and not coreData.page[pid].isDocPage then&lt;br /&gt;
				content = frame:expandTemplate{ title = 'Code', args = {lang = 'lua', code = coreData.page[pid].content, line = '1'}}&lt;br /&gt;
			else&lt;br /&gt;
				content = '&amp;lt;pre style=&amp;quot;white-space:-moz-pre-wrap; white-space:-pre-wrap; white-space:-o-pre-wrap; white-space:pre-wrap; word-wrap:break-word;&amp;quot;&amp;gt;' .. &lt;br /&gt;
					mw.text.nowiki(frame:preprocess(coreData.page[pid].content)) .. '&amp;lt;/pre&amp;gt;'&lt;br /&gt;
			end&lt;br /&gt;
			pageContent:wikitext(collapse({ header = 'Contents of &amp;lt;b&amp;gt;[[:' .. coreData.page[pid].name .. ']]&amp;lt;/b&amp;gt; ' ..&lt;br /&gt;
							'&amp;lt;span class=&amp;quot;plainlinks&amp;quot; style=&amp;quot;font-size:75%;&amp;quot;&amp;gt;&amp;amp;#91;[' .. coreData.page[pid].editlink ..&lt;br /&gt;
							' EDIT]&amp;amp;#93;&amp;lt;/span&amp;gt;',&lt;br /&gt;
						content = content, left = true, bg = bgs[bg]&lt;br /&gt;
					}))&lt;br /&gt;
				:newline()&lt;br /&gt;
			bg = (bg == 2 and 1 or 2)&lt;br /&gt;
		end&lt;br /&gt;
		if thisUsesSmw and coreData.properties.order then&lt;br /&gt;
			-- add here the collpases of the properties&lt;br /&gt;
			local message = mw.message.new('classengine-template-property-page')&lt;br /&gt;
			pageContent:tag('p')&lt;br /&gt;
				:wikitext('&amp;lt;h3&amp;gt;All property pages&amp;lt;/h3&amp;gt;')&lt;br /&gt;
				:done()&lt;br /&gt;
			for _, property in pairs(coreData.properties.order) do&lt;br /&gt;
				local bgs = coreData.page[pid].exists and bg_sets.exist or bg_sets.nonexist&lt;br /&gt;
				local content = '&amp;lt;pre style=&amp;quot;white-space:-moz-pre-wrap; white-space:-pre-wrap; white-space:-o-pre-wrap; white-space:pre-wrap; word-wrap:break-word;&amp;quot;&amp;gt;' .. &lt;br /&gt;
					mw.text.nowiki(frame:preprocess(coreData.properties.data[property].content)) .. '&amp;lt;/pre&amp;gt;'&lt;br /&gt;
				pageContent:wikitext(collapse({ header = 'Contents of &amp;lt;b&amp;gt;[[:Property:' .. property .. ']]&amp;lt;/b&amp;gt; ' ..&lt;br /&gt;
								'&amp;lt;span class=&amp;quot;plainlinks&amp;quot; style=&amp;quot;font-size:75%;&amp;quot;&amp;gt;&amp;amp;#91;[' .. coreData.properties.data[property].editlink ..&lt;br /&gt;
								' EDIT]&amp;amp;#93;&amp;lt;/span&amp;gt;',&lt;br /&gt;
							content = content, left = true, bg = bgs[bg]&lt;br /&gt;
						}))&lt;br /&gt;
					:newline()&lt;br /&gt;
				bg = (bg == 2 and 1 or 2)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		local updateWarning = mw.html.create('')&lt;br /&gt;
		if coreData.now_timestamp - coreData.edit_timestamp &amp;lt; 2*60*60 then&lt;br /&gt;
			local mbox = require('Module:Message box')&lt;br /&gt;
			updateWarning:wikitext(mbox.main('ombox', { type='content', text = 'Note: You updated the class ' .. coreData.edit_time_before .. ' ago. Did you write your [[#Page contents|config file]] new? ' ..&lt;br /&gt;
						'Changes won\'t take effect unless you do!' .. ((thisUsesCargo and cargoTableCreateLink) and '&amp;lt;p&amp;gt;&amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;Also: If you changed your cargo table\'s declaration, [' .. &lt;br /&gt;
						coreData.page.template.editlink .. ' edit your template] and [[#Page autocreation|rebuild your cargo table]]!&amp;lt;/span&amp;gt;' or '')}))&lt;br /&gt;
				:newline()&lt;br /&gt;
		end&lt;br /&gt;
		local smwPropertyHint = mw.html.create('')&lt;br /&gt;
		if (FoundationClass.globalConfig.dataStore == 'both' or FoundationClass.globalConfig.dataStore == 'smw')&lt;br /&gt;
				and FoundationClass.myYesno(coreData.global_smwUseStorage)&lt;br /&gt;
				and not coreData.properties.order then&lt;br /&gt;
			local mbox = require('Module:Message box')&lt;br /&gt;
			smwPropertyHint:wikitext(mbox.main('ombox', { type='notice', text = 'Hint: If you use properties in your class, they will not display in &amp;lt;i&amp;gt;Page contents&amp;lt;/i&amp;gt;, nor be listed in &amp;lt;i&amp;gt;Page status&amp;lt;/i&amp;gt; or '&lt;br /&gt;
					.. 'autocreated in &amp;lt;i&amp;gt;Page autocreation&amp;lt;/i&amp;gt; unless you have your class and config page created!'}))&lt;br /&gt;
				:newline()&lt;br /&gt;
		end&lt;br /&gt;
		-- assemble everything&lt;br /&gt;
		local html = mw.html.create('')&lt;br /&gt;
		html:wikitext(coreData.global_description)&lt;br /&gt;
			:newline()&lt;br /&gt;
			:node(updateWarning)&lt;br /&gt;
			:node(smwPropertyHint)&lt;br /&gt;
			:node(manual)&lt;br /&gt;
			:newline()&lt;br /&gt;
			:node(datastore)&lt;br /&gt;
			:wikitext('&amp;lt;h2&amp;gt;Page status&amp;lt;/h2&amp;gt;')&lt;br /&gt;
			:newline()&lt;br /&gt;
			:wikitext(autoCreation and 'This status may be inaccurate, if you just created pages. In that case, run jobs and clear cache of this page.' or '')&lt;br /&gt;
			:node(statusTable)&lt;br /&gt;
			:newline()&lt;br /&gt;
			:node(pageAutoCreation)&lt;br /&gt;
			:wikitext('&amp;lt;h2&amp;gt;Page contents&amp;lt;/h2&amp;gt;')&lt;br /&gt;
			:newline()&lt;br /&gt;
			:node(pageContent)&lt;br /&gt;
			:newline()&lt;br /&gt;
			:done()&lt;br /&gt;
		local debugLevel = FoundationClass.globalConfig.debugLevel or _CFG.global.debugLevel&lt;br /&gt;
		if debugLevel then&lt;br /&gt;
			html:tag('pre')&lt;br /&gt;
--				:wikitext(FoundationClass.myTableTools.printTable(coreData))&lt;br /&gt;
--				:wikitext(FoundationClass.myTableTools.printTable(thisClass:smwProperty2ParameterTranslationTable()))&lt;br /&gt;
				:wikitext(ClassDebug:printLog(debugLevel))&lt;br /&gt;
				:done()&lt;br /&gt;
		end&lt;br /&gt;
		self:addOutput(html)&lt;br /&gt;
&lt;br /&gt;
		return true&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Classgenerator:myArgumentProcessing(coreData)&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator:myArgumentProcessing(args) to process coreData, from ' .. tostring(self))&lt;br /&gt;
	-- function that performs some individual transformation args --&amp;amp;amp;gt; coreData&lt;br /&gt;
	local _CFG = self.class.myConfiguration&lt;br /&gt;
	local coreData = coreData&lt;br /&gt;
	local lang = mw.language.new('en')&lt;br /&gt;
	coreData.className = lang:ucfirst(mw.text.trim(mw.ustring.gsub(self:getUid(), ':', '')))&lt;br /&gt;
	coreData.edit_timestamp = lang:formatDate('U', coreData.global_edit_timestamp)&lt;br /&gt;
	coreData.now_timestamp = lang:formatDate('U') + 60*60&lt;br /&gt;
	coreData.edit_time_before = lang:formatDuration(coreData.now_timestamp-coreData.edit_timestamp)&lt;br /&gt;
	coreData.last_edited = lang:formatDate('d.m.Y H:i:s', coreData.global_edit_timestamp)&lt;br /&gt;
	if coreData.global_gardeningCategory_chooser and mw.ustring.lower(coreData.global_gardeningCategory_chooser) == 'global' then&lt;br /&gt;
		coreData.global_gardeningCategory = 'superglobal.gardeningCategory'&lt;br /&gt;
	end&lt;br /&gt;
	if mw.ustring.find(coreData.className, ' ', 1, true) then&lt;br /&gt;
		local tmp = ''&lt;br /&gt;
		for fragment in mw.text.gsplit(coreData.className, ' ', true) do&lt;br /&gt;
			tmp = tmp .. lang:ucfirst(fragment)&lt;br /&gt;
		end&lt;br /&gt;
		coreData.className = tmp&lt;br /&gt;
	end&lt;br /&gt;
	if coreData.global_cargoTable then&lt;br /&gt;
		coreData.global_cargoTable = mw.ustring.gsub(mw.ustring.lower(coreData.global_cargoTable), ' ', '_')&lt;br /&gt;
	end&lt;br /&gt;
	if coreData.form_createInfotext and #coreData.form_createInfotext &amp;gt; 0 and mw.ustring.sub(coreData.form_createInfotext, -1) ~= ' ' then&lt;br /&gt;
		coreData.form_createInfotext = coreData.form_createInfotext .. ' '&lt;br /&gt;
	end&lt;br /&gt;
	local parameter_parameter&lt;br /&gt;
	local fieldOrder&lt;br /&gt;
	if coreData.parameter_parameter then&lt;br /&gt;
		parameters = ''&lt;br /&gt;
		fieldOrder = {}&lt;br /&gt;
		local classGenParamConfig = mw.loadData('Module:Classgenerator/parameter/config')&lt;br /&gt;
		for result in mw.text.gsplit(coreData.parameter_parameter, classGenParamConfig.template.delimiterResult, true) do&lt;br /&gt;
			local fieldname, parameter = mw.ustring.match(result, '^([^#]*)' .. classGenParamConfig.template.delimiterFormFieldName .. '(.+)$')&lt;br /&gt;
			if fieldname and mw.ustring.len(mw.text.trim(fieldname)) &amp;gt; 0 then&lt;br /&gt;
				table.insert(fieldOrder, mw.text.trim(fieldname))&lt;br /&gt;
			end&lt;br /&gt;
			if parameter and mw.ustring.len(parameter) &amp;gt; 0 then&lt;br /&gt;
				parameters = parameters .. parameter&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	coreData.parameter_parameter = parameters&lt;br /&gt;
	coreData.form_enable = FoundationClass.myYesno(coreData.form_enable)&lt;br /&gt;
	if coreData.form_enable then&lt;br /&gt;
		coreData.form_fieldOrder = fieldOrder&lt;br /&gt;
		form_buttons = { 'save' }&lt;br /&gt;
		if coreData.form_buttons and #coreData.form_buttons &amp;gt; 0 then&lt;br /&gt;
			for _, button in pairs(coreData.form_buttons) do&lt;br /&gt;
				table.insert(form_buttons, button)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		table.insert(form_buttons, 'cancel')&lt;br /&gt;
	end&lt;br /&gt;
	coreData.form_buttons = form_buttons&lt;br /&gt;
	-- here build the class config&lt;br /&gt;
	local contentClassConfig = mw.ustring.gsub(_CFG.template.configIntro, _CFG.template.placeHolderClassName, coreData.className) ..&lt;br /&gt;
		'local global = {\n' ..&lt;br /&gt;
		'\tdebugLevel = false,'&lt;br /&gt;
	if self.class.myConfiguration.template.addCommentsToConfig then&lt;br /&gt;
		contentClassConfig = contentClassConfig .. '\t-- set this to the level you wish to display at render. false if disabled. this is a class based setting. ' ..&lt;br /&gt;
			'you can set this globally at Foundationclass/globalconfig, causing all child classes to debug.'&lt;br /&gt;
	end&lt;br /&gt;
	contentClassConfig = contentClassConfig .. '\n'&lt;br /&gt;
	-- calculate the fieldlists:&lt;br /&gt;
	local fieldlists = {}&lt;br /&gt;
	for _, field in pairs(_CFG.form.fieldOrder) do&lt;br /&gt;
		local tab = mw.ustring.match(field, '^([a-z]+)_.+')&lt;br /&gt;
		if not fieldlists[tab] then&lt;br /&gt;
			fieldlists[tab] = {}&lt;br /&gt;
		end&lt;br /&gt;
		table.insert(fieldlists[tab], field)&lt;br /&gt;
	end&lt;br /&gt;
	local omissionList = {'global_autocreate_module', 'global_autocreate_template', 'global_autocreate_form', 'global_autocreate_category', 'global_autocreate_property', 'global_edit_timestamp', 'global_gardeningCategory_chooser',&lt;br /&gt;
		'form_textareaAttributes_cols', 'form_textareaAttributes_rows', 'form_textareaAttributes_autogrow', 'form_textareaAttributes_editor', 'form_createLinkInfo', &lt;br /&gt;
		'global_customization', 'form_customization', 'template_customization' }&lt;br /&gt;
	for _, attr in pairs(fieldlists.global) do&lt;br /&gt;
		if not Classgenerator.myTableTools.inTable(omissionList, attr) and self.class.myConfiguration.parameter[attr] then&lt;br /&gt;
			contentClassConfig = contentClassConfig .. _processAttribute(self, attr, '\t')&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if coreData.global_customization then&lt;br /&gt;
		for line in mw.text.gsplit(coreData.global_customization, '\n', true) do&lt;br /&gt;
			contentClassConfig = contentClassConfig .. '\t' .. line .. '\n'&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	contentClassConfig = contentClassConfig .. '}\n\nlocal form = {\n'&lt;br /&gt;
	for _, attr in pairs(fieldlists.form) do&lt;br /&gt;
		if not Classgenerator.myTableTools.inTable(omissionList, attr) and self.class.myConfiguration.parameter[attr] then&lt;br /&gt;
			contentClassConfig = contentClassConfig .. _processAttribute(self, attr, '\t')&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	contentClassConfig = contentClassConfig .. '\ttextareaAttributes = {	-- the defaults for your textarea fields\n'&lt;br /&gt;
	for _, attr in pairs({'form_textareaAttributes_cols', 'form_textareaAttributes_rows', 'form_textareaAttributes_autogrow', 'form_textareaAttributes_editor'}) do&lt;br /&gt;
		local name = mw.ustring.match(attr, '^form_textareaAttributes_(.+)$')&lt;br /&gt;
		contentClassConfig = contentClassConfig .. _processAttribute(self, attr, '\t\t', name)&lt;br /&gt;
	end&lt;br /&gt;
	contentClassConfig = contentClassConfig .. '\t},\n'&lt;br /&gt;
	contentClassConfig = contentClassConfig .. _processAttribute(self, 'form_fieldOrder', '\t')&lt;br /&gt;
	if coreData.form_customization then&lt;br /&gt;
		for line in mw.text.gsplit(coreData.form_customization, '\n', true) do&lt;br /&gt;
			contentClassConfig = contentClassConfig .. '\t' .. line .. '\n'&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	contentClassConfig = contentClassConfig .. '}\n\nlocal template = {\n'&lt;br /&gt;
	for _, attr in pairs(fieldlists.template) do&lt;br /&gt;
		if not Classgenerator.myTableTools.inTable(omissionList, attr) and self.class.myConfiguration.parameter[attr] then&lt;br /&gt;
			contentClassConfig = contentClassConfig .. _processAttribute(self, attr, '\t')&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if coreData.template_customization then&lt;br /&gt;
		for line in mw.text.gsplit(coreData.template_customization, '\n', true) do&lt;br /&gt;
			contentClassConfig = contentClassConfig .. '\t' .. mw.text.trim(line) .. '\n'&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	contentClassConfig = contentClassConfig .. '}\n\nlocal parameter = {\n' .. coreData.parameter_parameter .. '}\n\n' ..&lt;br /&gt;
		'return {\n' ..&lt;br /&gt;
		'\tform = form,\n' ..&lt;br /&gt;
		'\tglobal = global,\n' ..&lt;br /&gt;
		'\tparameter = parameter,\n' ..&lt;br /&gt;
		'\ttemplate = template,\n}\n'&lt;br /&gt;
	local classCategory = Classgenerator.globalConfig.classCategory or 'none'&lt;br /&gt;
	local formCategory = Classgenerator.globalConfig.formCategory or 'none'&lt;br /&gt;
	local gardeningCategory = Classgenerator.globalConfig.gardeningSuperCategory or 'none'&lt;br /&gt;
	local moduleCategory = Classgenerator.globalConfig.moduleCategory or 'none'&lt;br /&gt;
	local propertyCategory = Classgenerator.globalConfig.propertyCategory or 'none'&lt;br /&gt;
	local superCategory = Classgenerator.globalConfig.projectSuperCategory or 'none'&lt;br /&gt;
	local templateCategory = Classgenerator.globalConfig.templateCategory or 'none'&lt;br /&gt;
	local page = {}&lt;br /&gt;
	page.order = {'base', 'baseDoc', 'class', 'classDoc', 'config', 'configDoc', 'template', 'templateDoc'}&lt;br /&gt;
	page.base = {&lt;br /&gt;
		name = 'Module:' .. _private[self].pagename,&lt;br /&gt;
		content = mw.message.new('classengine-template-module-page'):rawParams(_private[self].pagename):plain()&lt;br /&gt;
	}&lt;br /&gt;
	page.baseDoc = {&lt;br /&gt;
		name = 'Module:' .. _private[self].pagename .. '/doc',&lt;br /&gt;
		content = mw.message.new('classengine-template-module-documentation-page'):rawParams(_private[self].pagename, moduleCategory):plain()&lt;br /&gt;
	}&lt;br /&gt;
	page.class = {&lt;br /&gt;
		name = 'Module:' .. _private[self].pagename .. '/class',&lt;br /&gt;
		content = mw.message.new('classengine-template-module-class-page'):rawParams(_private[self].pagename, coreData.className):plain()&lt;br /&gt;
	}&lt;br /&gt;
	page.classDoc = {&lt;br /&gt;
		name = 'Module:' .. _private[self].pagename .. '/class/doc',&lt;br /&gt;
		content = mw.message.new('classengine-template-module-class-documentation-page'):rawParams(_private[self].pagename, coreData.className, moduleCategory, classCategory):plain()&lt;br /&gt;
	}&lt;br /&gt;
	page.config = {&lt;br /&gt;
		name = 'Module:' .. _private[self].pagename .. '/config',&lt;br /&gt;
		content = contentClassConfig,&lt;br /&gt;
	}&lt;br /&gt;
	page.configDoc = {&lt;br /&gt;
		name = 'Module:' .. _private[self].pagename .. '/config/doc',&lt;br /&gt;
		content = mw.message.new('classengine-template-module-config-documentation-page'):rawParams(_private[self].pagename, moduleCategory, classCategory):plain()&lt;br /&gt;
	}&lt;br /&gt;
	page.template = {&lt;br /&gt;
		name = 'Template:' .. coreData.template_name,&lt;br /&gt;
		content = mw.message.new('classengine-template-template-page'):rawParams(_private[self].pagename):plain()&lt;br /&gt;
	}&lt;br /&gt;
	page.templateDoc = {&lt;br /&gt;
		name = 'Template:' .. coreData.template_name .. '/doc',&lt;br /&gt;
		content = mw.message.new('classengine-template-template-documentation-page'):rawParams(_private[self].pagename, templateCategory):plain()&lt;br /&gt;
	}&lt;br /&gt;
	if coreData.form_name and #coreData.form_name &amp;gt; 0 then&lt;br /&gt;
		table.insert(page.order, 'form')&lt;br /&gt;
		page.form = {&lt;br /&gt;
			name = 'Form:' .. coreData.form_name,&lt;br /&gt;
			content = mw.message.new('classengine-template-form-page'):rawParams(_private[self].pagename, formCategory):plain()&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
	if coreData.global_category and #coreData.global_category&amp;gt; 0 then&lt;br /&gt;
		table.insert(page.order, 'category')&lt;br /&gt;
		page.category = {&lt;br /&gt;
			name = 'Category:' .. coreData.global_category,&lt;br /&gt;
			content = mw.message.new('classengine-template-category-page'):rawParams(_private[self].pagename, superCategory):plain()&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
	if coreData.global_gardeningCategory and #coreData.global_gardeningCategory &amp;gt; 0 then&lt;br /&gt;
		table.insert(page.order, 'gardeningCategory')&lt;br /&gt;
		local pagename = coreData.global_gardeningCategory&lt;br /&gt;
		if pagename == 'superglobal.gardeningCategory' then&lt;br /&gt;
			pagename = FoundationClass.globalConfig.gardeningCategory&lt;br /&gt;
		end&lt;br /&gt;
		page.gardeningCategory = {&lt;br /&gt;
			name = 'Category:' .. pagename,&lt;br /&gt;
			content = mw.message.new('classengine-template-gardeningcategory-page'):rawParams(_private[self].pagename, gardeningCategory):plain()&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
	for _, pid in pairs(page.order) do&lt;br /&gt;
		local obj = mw.title.new(page[pid].name)&lt;br /&gt;
		page[pid].exists = obj.exists&lt;br /&gt;
		page[pid].namespace = obj.namespace&lt;br /&gt;
		page[pid].editlink = obj:fullUrl{action='edit'}&lt;br /&gt;
		if pid == 'template' then&lt;br /&gt;
			page[pid].recreatedata = obj:fullUrl{action='recreatedata'}&lt;br /&gt;
		end&lt;br /&gt;
		page[pid].isDocPage = (mw.ustring.sub(page[pid].name, -4) == '/doc')&lt;br /&gt;
		if page[pid].isDocPage then&lt;br /&gt;
			page[pid].content = page[pid].content .. '&amp;lt;h2&amp;gt;Maintenanace notes&amp;lt;/h2&amp;gt;\n' ..&lt;br /&gt;
				'This page was created by [[Module:Classgenerator]] and belongs to [[' .. self:getUid() .. ']].\n'&lt;br /&gt;
			if pid == 'configDoc' then&lt;br /&gt;
				page[pid].content = page[pid].content .. '\n{{((}}ombox| type=content | text = It is strongly advised, to not edit this page but to use [' ..&lt;br /&gt;
				'https://{{((}}SERVERNAME{{))}}{{((}}SCRIPTPATH{{))}}/Special:FormEdit/Classgenerator/' .. mw.uri.encode(self:getUid(), &amp;quot;PATH&amp;quot;) .. ' ' .. &lt;br /&gt;
					'the Classgenerator form] instead! After that, use your new configuration to replace the contents of this page.{{))}}'&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	local thisClass&lt;br /&gt;
	local thisConfig&lt;br /&gt;
	if page.class.exists and page.config.exists then&lt;br /&gt;
		thisClass = require(page.class.name)&lt;br /&gt;
		thisConfig = require(page.config.name)&lt;br /&gt;
	end&lt;br /&gt;
	if page.form and (not coreData.form_typeCreateLink or coreData.form_typeCreateLink ~= 'forminput') and coreData.form_createLinkPageName and mw.ustring.len(coreData.form_createLinkPageName) &amp;gt; 0 then&lt;br /&gt;
		local pageName = coreData.form_createLinkPageName&lt;br /&gt;
		if coreData.global_namespace and mw.ustring.len(coreData.global_namespace) &amp;gt; 0 and not mw.ustring.match(pageName, '^' .. coreData.global_namespace .. ':.+$') then&lt;br /&gt;
			pageName = coreData.global_namespace .. ':' .. pageName&lt;br /&gt;
		end&lt;br /&gt;
		local infostr = '{{((}}{info|page name=' .. pageName .. '|add title=' .. (coreData.form_labelCreate or 'create entity') .. '|edit title=' .. (coreData.form_labelEdit or 'edit entity') .. '}{{))}}'&lt;br /&gt;
		page.form.content = page.form.content .. '&amp;lt;!{{#invoke:String|rep|-|2}} this is a workaround, needed because of a SF bug: ' .. infostr ..&lt;br /&gt;
			'. see https://phabricator.wikimedia.org/T123230 for more information {{#invoke:String|rep|-|2}}&amp;gt;'&lt;br /&gt;
	end&lt;br /&gt;
	coreData.page = page&lt;br /&gt;
	local autocreate = {}&lt;br /&gt;
	autocreate.module = FoundationClass.myYesno(coreData.global_autocreate_module, tonumber(coreData.global_autocreate_module))&lt;br /&gt;
	autocreate.template = FoundationClass.myYesno(coreData.global_autocreate_template, tonumber(coreData.global_autocreate_template))&lt;br /&gt;
	autocreate.form = coreData.form_name and FoundationClass.myYesno(coreData.global_autocreate_form, tonumber(coreData.global_autocreate_form))&lt;br /&gt;
	autocreate.category = (coreData.global_category or coreData.global_gardeningCategory) and FoundationClass.myYesno(coreData.global_autocreate_category, tonumber(coreData.global_autocreate_category))&lt;br /&gt;
	if (FoundationClass.globalConfig.dataStore == 'both' or FoundationClass.globalConfig.dataStore == 'smw') and FoundationClass.myYesno(coreData.global_smwUseStorage) then&lt;br /&gt;
		local propertyNSName = _namespaceName(self, mw.title.new('NUL', 'Property').namespace)&lt;br /&gt;
		autocreate[propertyNSName] = FoundationClass.myYesno(coreData['global_autocreate_' .. propertyNSName], tonumber(coreData['global_autocreate_' .. propertyNSName]))&lt;br /&gt;
	end&lt;br /&gt;
	coreData.autocreate = autocreate&lt;br /&gt;
	local propertyData&lt;br /&gt;
	local propertyOrder&lt;br /&gt;
	if (FoundationClass.globalConfig.dataStore == 'both' or FoundationClass.globalConfig.dataStore == 'smw') and FoundationClass.myYesno(coreData.global_smwUseStorage) and thisClass and thisConfig then&lt;br /&gt;
		-- we use smw and class and config are created and accessible. we can get property information and prepare data&lt;br /&gt;
		local matrix = thisClass:smwGetProperty2ParameterTranslationTable()&lt;br /&gt;
		propertyData = {}&lt;br /&gt;
		propertyOrder = {}&lt;br /&gt;
		for property, parameter in pairs(matrix) do&lt;br /&gt;
			table.insert(propertyOrder, property)&lt;br /&gt;
			local obj = mw.title.new(property, 'Property')&lt;br /&gt;
			propertyData[property] = { &lt;br /&gt;
				editlink = obj:fullUrl{action='edit'},&lt;br /&gt;
				exists = obj.exists,&lt;br /&gt;
				parameter = parameter,&lt;br /&gt;
			}&lt;br /&gt;
			if thisConfig.parameter[parameter] then&lt;br /&gt;
				propertyData[property].description = thisConfig.parameter[parameter].description&lt;br /&gt;
				propertyData[property].type = thisConfig.parameter[parameter].property_type&lt;br /&gt;
				propertyData[property].values = thisConfig.parameter[parameter].values&lt;br /&gt;
			elseif parameter == FoundationClass.globalConfig.smwClassProperty then&lt;br /&gt;
				propertyData[property].description = 'Automatisch hinzugefügt! Wird verwendet, um Mitglieder dieser Klasse zu finden (funktioniert auch, ohne dass eine Kategorie definiert wird und auch fur subobjects)'&lt;br /&gt;
				propertyData[property].type = 'Text'&lt;br /&gt;
			elseif parameter == FoundationClass.globalConfig.uidFieldName then&lt;br /&gt;
				propertyData[property].description = 'Automatisch hinzugefügt! Wird verwendet, um individuelle Objekte innerhalb der Klasse zu identifizieren.'&lt;br /&gt;
				propertyData[property].type = 'Text'&lt;br /&gt;
			end&lt;br /&gt;
			local values = ''&lt;br /&gt;
			if propertyData[property].values then&lt;br /&gt;
				values = values .. 'The allowed values are:'&lt;br /&gt;
				for _, value in pairs(propertyData[property].values) do&lt;br /&gt;
					values = values .. '\n* [[Allows value::' .. value .. ']]'&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				values = 'No restriction given'&lt;br /&gt;
			end&lt;br /&gt;
			propertyData[property].content = mw.message.new('classengine-template-property-page'):rawParams(propertyData[property].description, propertyData[property].type, values, propertyCategory):plain()&lt;br /&gt;
		end&lt;br /&gt;
		table.sort(propertyOrder)&lt;br /&gt;
	end&lt;br /&gt;
	coreData.properties = { data = propertyData, order = propertyOrder }&lt;br /&gt;
	return coreData	-- this is your new coreData.&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Classgenerator:myPlausibilityTest(args)&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator:myPlausibilityTest(args) to test arguments, from ' .. tostring(self))&lt;br /&gt;
	-- function that performs the individual plausibility tests&lt;br /&gt;
	-- note: before you access a field args.fieldname you should check for existance&lt;br /&gt;
	-- self:addError(text)&lt;br /&gt;
	return false	-- return value will be ignored. but if you add any error, the object's initialization will fail with the error&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Classgenerator:myStashAdjustments(stash)&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator:myStashAdjustments(stash) to do some minor adjustments on data before storing, from ' .. tostring(self))&lt;br /&gt;
	-- function that alters the stash before storing the data&lt;br /&gt;
	local stash = stash&lt;br /&gt;
	return stash	-- this is your new stash. this will be stored. it has format (fieldname: value)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Classgenerator:method()&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator:method() to do something, from ' .. tostring(self))&lt;br /&gt;
	return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return Classgenerator&lt;/div&gt;</summary>
		<author><name>Anatol</name></author>
	</entry>
	<entry>
		<id>https://camnet.oetterer.eu/index.php?title=Modul:Classgenerator/class&amp;diff=1010</id>
		<title>Modul:Classgenerator/class</title>
		<link rel="alternate" type="text/html" href="https://camnet.oetterer.eu/index.php?title=Modul:Classgenerator/class&amp;diff=1010"/>
		<updated>2016-02-09T21:05:13Z</updated>

		<summary type="html">&lt;p&gt;Anatol: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local FoundationClass = require('Module:Foundationclass')&lt;br /&gt;
local ClassDebug = require('Module:Debug/class')&lt;br /&gt;
&lt;br /&gt;
-- ****************************************************************&lt;br /&gt;
-- *                         inheritance                          *&lt;br /&gt;
-- ****************************************************************&lt;br /&gt;
local Classgenerator = FoundationClass:subclass('Classgenerator')&lt;br /&gt;
-- setting class's configuration data&lt;br /&gt;
Classgenerator.static.myConfiguration = mw.loadData('Module:Classgenerator/config')&lt;br /&gt;
--   being in a static method, use self.myConfiguration&lt;br /&gt;
--   being in a private method, that knows self or in a public method, use self.class.myConfiguration&lt;br /&gt;
&lt;br /&gt;
-- ****************************************************************&lt;br /&gt;
-- *                          properties                          *&lt;br /&gt;
-- ****************************************************************&lt;br /&gt;
&lt;br /&gt;
-- **************** initialization of table for private properties&lt;br /&gt;
local _private = setmetatable({}, {__mode = 'k'})   -- weak table storing all private attributes&lt;br /&gt;
&lt;br /&gt;
-- **************** declaration of public static properties&lt;br /&gt;
-- Classgenerator.static.myPropertyModule = require('Module:extern')&lt;br /&gt;
-- Classgenerator.static.staticProperty = 'value'&lt;br /&gt;
&lt;br /&gt;
-- remember the static classes provided by Foundationclass:&lt;br /&gt;
-- Classgenerator.globalConfig&lt;br /&gt;
-- Classgenerator.myCargoUtil&lt;br /&gt;
-- Classgenerator.myTableTools&lt;br /&gt;
&lt;br /&gt;
-- **************** declaration of (global) private properties&lt;br /&gt;
-- for properties you should rather use constructor and _private[self]. this only, if you need a private class property&lt;br /&gt;
-- you should, however predeclare private methods here&lt;br /&gt;
local _debug	-- private method declared later&lt;br /&gt;
local _privateMethodAhead	-- declaration ahead, so this private method can be used in the constructor and in other private methods&lt;br /&gt;
&lt;br /&gt;
-- ***************************************************************&lt;br /&gt;
-- *                           methods                           *&lt;br /&gt;
-- ***************************************************************&lt;br /&gt;
 &lt;br /&gt;
-- **************** declaration of static methods&lt;br /&gt;
function Classgenerator:initialize(uid)&lt;br /&gt;
	local _CFG = self.class.myConfiguration&lt;br /&gt;
	FoundationClass.initialize(self, uid)&lt;br /&gt;
	local page = mw.title.getCurrentTitle().text&lt;br /&gt;
	if uid and mw.ustring.match(uid, '^' .. _CFG.global.namespace .. ':.+$') then&lt;br /&gt;
		page = mw.ustring.match(uid, '^' .. _CFG.global.namespace .. ':(.+)$')&lt;br /&gt;
	end&lt;br /&gt;
	_private[self] = {&lt;br /&gt;
		dbg = ClassDebug:new(tostring(self.class) .. ': id ' .. uid),&lt;br /&gt;
		pagename = page&lt;br /&gt;
	}&lt;br /&gt;
	_debug(self, 1, ' Classgenerator: done initializing object &amp;amp;quot;' .. uid ..'&amp;amp;quot;, from ' .. tostring(self))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- use use self.myConfiguration to access your configuration in a static method&lt;br /&gt;
function Classgenerator.static:aStaticMethod(var)&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator.static:aStaticMethod() to do something, from ' .. tostring(self))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Classgenerator.static:mySfDynamicFieldAttribute(fieldname, attribute, value)&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator.static:mySfDynamicFieldAttribute(fieldname, attribute, value), from ' .. tostring(self))&lt;br /&gt;
	_debug(self, 2, ' with parameters &amp;amp;quot;' .. fieldname .. '&amp;amp;quot;, &amp;amp;quot;' .. attribute .. '&amp;amp;quot; and a ' .. type(value) .. ' value')&lt;br /&gt;
	-- function that can process any attribute/value pair just before rendering the semantic forms field&lt;br /&gt;
	-- usually done, to generate a dynamic 'default' value&lt;br /&gt;
	-- keep in mind: you can completely disable a form field, if you return true on attribute &amp;quot;disable&amp;quot;. note however, that this causes the field to not show at all, no data will be transported/saved&lt;br /&gt;
	local pagename = mw.title.getCurrentTitle().rootText&lt;br /&gt;
	local val = value&lt;br /&gt;
	if Classgenerator.myTableTools.inTable({'template_name', 'global_entityTitle'}, fieldname) and attribute == 'default' then&lt;br /&gt;
		val = pagename&lt;br /&gt;
	end&lt;br /&gt;
	if fieldname == 'global_cargoTable' and attribute == 'default' then&lt;br /&gt;
		val = mw.ustring.lower(pagename)&lt;br /&gt;
	end&lt;br /&gt;
	if Classgenerator.globalConfig.dataStore ~= 'cargo' and Classgenerator.globalConfig.dataStore ~= 'both' then&lt;br /&gt;
		if fieldname == 'global_cargoTable' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
		if fieldname == 'global_cargoUidFieldname' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if Classgenerator.globalConfig.dataStore ~= 'smw' and Classgenerator.globalConfig.dataStore ~= 'both' then&lt;br /&gt;
		if fieldname == 'global_smwIsSubobject' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
		if fieldname == 'global_smwUseStorage' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
		if fieldname == 'global_autocreate_property' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return val	-- this value will be used as new value for field's attribute&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Classgenerator.static:sfGenerateForm()&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator.static:sfGenerateForm(), from ' .. tostring(self))&lt;br /&gt;
	local _CFG = self.myConfiguration&lt;br /&gt;
	local ClassgeneratorParameter  = require('Module:Classgenerator/parameter/class')&lt;br /&gt;
	local ClassSFfield = require('Module:SFfield/class')&lt;br /&gt;
	local tagStart = '{{{'&lt;br /&gt;
	local tagEnd = '}}}'&lt;br /&gt;
	local frame = mw.getCurrentFrame()&lt;br /&gt;
	-- create the form header&lt;br /&gt;
	local notification = mw.html.create('')&lt;br /&gt;
	if _CFG.form.notification and mw.ustring.len(_CFG.form.notification) &amp;gt; 0 then&lt;br /&gt;
		local mbox = require('Module:Message box')&lt;br /&gt;
		notification:wikitext(mbox.main('ombox', { text = _CFG.form.notification }))&lt;br /&gt;
			:newline()&lt;br /&gt;
	end&lt;br /&gt;
	local formheader = mw.html.create('')&lt;br /&gt;
	formheader:wikitext(self:sfGenerateFormInfoTag())&lt;br /&gt;
		:wikitext('&amp;lt;h2&amp;gt;' .. _CFG.global.entityTitle .. '&amp;lt;/h2&amp;gt;')&lt;br /&gt;
		:tag('p')&lt;br /&gt;
			:wikitext(_CFG.form.headerText)&lt;br /&gt;
			:done()&lt;br /&gt;
			:newline()&lt;br /&gt;
		:node(notification)&lt;br /&gt;
		:tag('div')&lt;br /&gt;
			:attr('id', 'wikiPreview')&lt;br /&gt;
			:cssText('display: none; padding-bottom: 25px; margin-bottom: 25px; border-bottom: 1px solid #AAAAAA;')&lt;br /&gt;
			:done()&lt;br /&gt;
			:newline()&lt;br /&gt;
	-- create the form buttons&lt;br /&gt;
	local formbuttons = mw.html.create('div')&lt;br /&gt;
	for _, button in pairs(_CFG.form.buttons) do&lt;br /&gt;
		formbuttons:wikitext(tagStart .. 'standard input&amp;amp;#124;' .. button .. tagEnd)&lt;br /&gt;
	end&lt;br /&gt;
	formbuttons:addClass('formbuttons')&lt;br /&gt;
		:done()&lt;br /&gt;
	-- calculate the fieldlists:&lt;br /&gt;
	local fieldlists = {}&lt;br /&gt;
	for _, field in pairs(_CFG.form.fieldOrder) do&lt;br /&gt;
		local tab = mw.ustring.match(field, '^([a-z]+)_.+')&lt;br /&gt;
		if not fieldlists[tab] then&lt;br /&gt;
			fieldlists[tab] = {}&lt;br /&gt;
		end&lt;br /&gt;
		table.insert(fieldlists[tab], field)&lt;br /&gt;
	end&lt;br /&gt;
	-- assemble everything, so start the html object&lt;br /&gt;
	local html = mw.html.create('div')&lt;br /&gt;
	html:node(formheader)&lt;br /&gt;
		:wikitext('&amp;lt;h1&amp;gt;GLOBAL-Section&amp;lt;/h1&amp;gt;')&lt;br /&gt;
		:newline()&lt;br /&gt;
		:tag('div')&lt;br /&gt;
			:wikitext('This section deals with all the class\'s global data, i.e. all data you need for your &amp;quot;template&amp;quot; part as wenn as for your form, ... ')&lt;br /&gt;
			:done()&lt;br /&gt;
			:newline()&lt;br /&gt;
		:wikitext(tagStart .. 'for template|' .. _CFG.template.name .. '|label=' .. _CFG.global.entityTitle .. tagEnd)&lt;br /&gt;
		:newline()&lt;br /&gt;
		:node(self:sfGenerateFormTable(fieldlists.global))&lt;br /&gt;
		:newline()&lt;br /&gt;
		:wikitext('&amp;lt;h1&amp;gt;FORM-Section&amp;lt;/h1&amp;gt;')&lt;br /&gt;
		:newline()&lt;br /&gt;
		:tag('div')&lt;br /&gt;
			:wikitext('This section deals with all the data, you need to create and operate a form for this class. If you don\'t want a form, disable this section. ' ..&lt;br /&gt;
					'If you need a form (e.g. as part of another form), but no form page, enable this section but leave the field for form page name emtpy.')&lt;br /&gt;
			:done()&lt;br /&gt;
			:newline()&lt;br /&gt;
		:node(self:sfGenerateFormTable(fieldlists.form))&lt;br /&gt;
		:newline()&lt;br /&gt;
		:wikitext('&amp;lt;h1&amp;gt;TEMPLATE-Section&amp;lt;/h1&amp;gt;')&lt;br /&gt;
		:newline()&lt;br /&gt;
		:tag('div')&lt;br /&gt;
			:wikitext('This section deals with all the data, you need to create and operate a template for this class. If you need tempalte specific parameters ' ..&lt;br /&gt;
				'(meaning parameteres that you only need to operate the &amp;quot;action&amp;quot;-part), put them into this section\'s custom field')&lt;br /&gt;
			:done()&lt;br /&gt;
			:newline()&lt;br /&gt;
		:node(self:sfGenerateFormTable(fieldlists.template))&lt;br /&gt;
		:newline()&lt;br /&gt;
		:wikitext('&amp;lt;h1&amp;gt;PARAMETERS-Section&amp;lt;/h1&amp;gt;')&lt;br /&gt;
		:newline()&lt;br /&gt;
		:tag('div')&lt;br /&gt;
			:wikitext('This section deals with all your parameters. You need an entry for every form input field, every template parameter, every data field you want to store, and even every notification line.')&lt;br /&gt;
			:tag('ul')&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(&amp;quot;To produce a normal parameter, add an entry, choose storage type, set '''Regular form parameter''' to yes, choose a form input type, and a template doc type.&amp;quot;)&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(&amp;quot;If you want a data field to be stored in your data storage but not defined in the form, choose a data storage type and set '''Regular form parameter''' to no. &amp;quot;)&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(&amp;quot;If you want a mutiple template to be parsed to a parameter, create a normal parameter (as described above) and choose '''Regular form parameter''' to  be ''Holds template''.&amp;quot;)&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(&amp;quot;A parameter with a form input that is not stored is created like a regular parameter but without setting any data storage type.&amp;quot;)&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(&amp;quot;Finally, you can create a message line. This is useful, if you want to convey any information to the user, that is to important for a description-tooltip. &amp;quot; ..&lt;br /&gt;
						&amp;quot;What you need to do is disable everything ('''Template doc parameter type ''', data storage) and set '''Regular form parameter''' to ''Information''. &amp;quot; ..&lt;br /&gt;
						&amp;quot;You probalby want to add the parameter to one or more ''show on select'' entries, too.&amp;quot;)&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
				:done()&lt;br /&gt;
				:newline()&lt;br /&gt;
			:done()&lt;br /&gt;
			:newline()&lt;br /&gt;
		:node(self:sfInitField('parameter_parameter'):render())&lt;br /&gt;
		:newline()&lt;br /&gt;
		:wikitext(frame:extensionTag('headertabs'))&lt;br /&gt;
		:newline()&lt;br /&gt;
		:wikitext(&amp;quot;'''(*) Pflichtfeld'''&amp;quot;)&lt;br /&gt;
		:newline()&lt;br /&gt;
		:wikitext(tagStart .. 'end template' .. tagEnd)&lt;br /&gt;
		:newline()&lt;br /&gt;
		:wikitext(ClassgeneratorParameter:sfGenerateForm())&lt;br /&gt;
		:newline()&lt;br /&gt;
		:node(formbuttons)&lt;br /&gt;
	local debugLevel = FoundationClass.globalConfig.debugLevel or self.myConfiguration.global.debugLevel&lt;br /&gt;
	if debugLevel then&lt;br /&gt;
		html:newline()&lt;br /&gt;
			:newline()&lt;br /&gt;
			:wikitext(ClassDebug:printLog(debugLevel))&lt;br /&gt;
	end&lt;br /&gt;
	return html&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- **************** declaration of private methods&lt;br /&gt;
-- use self.class.myConfiguration to access your configuration in a public or a private method that is called by a public method&lt;br /&gt;
_debug = function (self, level, text)&lt;br /&gt;
	if _private[self] and _private[self].dbg then&lt;br /&gt;
		local debugLevel = FoundationClass.globalConfig.debugLevel or self.class.myConfiguration.global.debugLevel&lt;br /&gt;
		if debugLevel and level &amp;lt;= debugLevel then&lt;br /&gt;
			_private[self].dbg:log(level, text)&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		local debugLevel = FoundationClass.globalConfig.debugLevel or self.myConfiguration.global.debugLevel&lt;br /&gt;
		if debugLevel and level &amp;lt;= debugLevel then&lt;br /&gt;
			ClassDebug:log(level, text, tostring(self) .. '.static')&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local _namespaceName = function (self, namespaceId)&lt;br /&gt;
	_debug(self, 1, 'entering private _namespaceName() to translate namespace namespaceId ' .. namespaceId .. ' into a universal name, from ' .. tostring(self))&lt;br /&gt;
	local ret, nulProperty = pcall(mw.title.new, 'NUL', 'Property')&lt;br /&gt;
	if ret and (namespaceId == nulProperty.namespace) then&lt;br /&gt;
		return 'property'	-- if you change this, check on other places, this is checked against and change that, too&lt;br /&gt;
	else&lt;br /&gt;
		return mw.site.namespaces[namespaceId].canonicalName&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local _processAttribute = function (self, attr, indent, name)&lt;br /&gt;
	_debug(self, 1, 'entering private _processAttribute() to print a line for attribute ' .. attr .. ', from ' .. tostring(self))&lt;br /&gt;
	local coreData = self:getCoreData()&lt;br /&gt;
	local attr = attr&lt;br /&gt;
	local val = coreData[attr]&lt;br /&gt;
	if type(val) == 'boolean' then&lt;br /&gt;
		val = val and 'true' or 'false'&lt;br /&gt;
	end&lt;br /&gt;
	local ret = ''&lt;br /&gt;
	local fieldname = mw.ustring.match(attr, '^[^_]+_(.+)$')&lt;br /&gt;
	ret = indent .. (name and name or fieldname) .. ' = '&lt;br /&gt;
	if not val then&lt;br /&gt;
		ret = ret .. 'nil'&lt;br /&gt;
	elseif type(val) == 'table' then&lt;br /&gt;
		ret = ret .. Classgenerator.myTableTools.printTable(val, 'inline')&lt;br /&gt;
	elseif val == 'true' or val == 'false' or mw.ustring.match(val, '^[0-9]+$') or (attr == 'global_gardeningCategory' and val == 'superglobal.gardeningCategory') then&lt;br /&gt;
		ret = ret .. val&lt;br /&gt;
	else&lt;br /&gt;
		ret = ret .. &amp;quot;'&amp;quot; .. mw.ustring.gsub(mw.ustring.gsub(mw.ustring.gsub(val, &amp;quot;\\'&amp;quot;, &amp;quot;'&amp;quot;), &amp;quot;'&amp;quot;, &amp;quot;\\'&amp;quot;), '\n', '\\n\' ..\n' .. indent .. '\t\'') .. &amp;quot;'&amp;quot;	-- the gsub catches multiline input from textareas&lt;br /&gt;
	end&lt;br /&gt;
	ret = ret .. ','&lt;br /&gt;
	if self.class.myConfiguration.template.addCommentsToConfig then&lt;br /&gt;
		ret = ret .. '\t-- ' .. self.class.myConfiguration.parameter[attr].description&lt;br /&gt;
	end&lt;br /&gt;
	ret = ret .. '\n'&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local _privateMethod = function (self)&lt;br /&gt;
	_debug(self, 1, 'entering private _privateMethod() to do something, from ' .. tostring(self))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- **************** declaration of public methods&lt;br /&gt;
-- use self.class.myConfiguration to access your configuration in a public method&lt;br /&gt;
function Classgenerator:addInfobox()&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator:addInfobox(), from ' .. tostring(self))&lt;br /&gt;
	if self:goodToGo() then&lt;br /&gt;
		local _CFG = self.class.myConfiguration&lt;br /&gt;
		local coreData = self:getCoreData()&lt;br /&gt;
		local usesSmw = FoundationClass.globalConfig.dataStore and (FoundationClass.globalConfig.dataStore == 'both' or FoundationClass.globalConfig.dataStore == 'smw') and FoundationClass.myYesno(coreData.global_smwUseStorage)&lt;br /&gt;
		local ib_args = {&lt;br /&gt;
			bodyclass = 'infobox_name',&lt;br /&gt;
			aboveclass = 'objtitle titletext',&lt;br /&gt;
			headerclass = 'headertext',&lt;br /&gt;
			labelstyle = 'width: 30%;',&lt;br /&gt;
			datastyle = 'width: 70%;',&lt;br /&gt;
			title = coreData.className,&lt;br /&gt;
			subheader = 'Class',&lt;br /&gt;
			label1 = 'Title',&lt;br /&gt;
			data1 = coreData.global_entityTitle and coreData.global_entityTitle or '',&lt;br /&gt;
			label2 = _CFG.parameter.global_edit_timestamp.label,&lt;br /&gt;
			data2 = coreData.last_edited,&lt;br /&gt;
			label3 = 'Store available',&lt;br /&gt;
			data3 = (FoundationClass.globalConfig.dataStore and mw.ustring.len(FoundationClass.globalConfig.dataStore) &amp;gt; 0) and FoundationClass.globalConfig.dataStore or '',&lt;br /&gt;
			label5 = 'Cargo table',&lt;br /&gt;
			data5 = (FoundationClass.globalConfig.dataStore and (FoundationClass.globalConfig.dataStore == 'both' or FoundationClass.globalConfig.dataStore == 'cargo')) and coreData.global_cargoTable or '',&lt;br /&gt;
			label6 = 'Smw class',&lt;br /&gt;
			data6 = usesSmw and _private[self].pagename or '',&lt;br /&gt;
			data7 = coreData.global_description,&lt;br /&gt;
			header10 = 'Pages',&lt;br /&gt;
			label12 = 'Module',&lt;br /&gt;
			data12 = _private[self].pagename and '[[Module:' .. _private[self].pagename .. ']]' or '',&lt;br /&gt;
			label13 = 'Class',&lt;br /&gt;
			data13 = _private[self].pagename and '[[Module:' .. _private[self].pagename .. '/class]]' or '',&lt;br /&gt;
			label14 = 'Config',&lt;br /&gt;
			data14 = _private[self].pagename and '[[Module:' .. _private[self].pagename .. '/config]]' or '',&lt;br /&gt;
			label17 = 'Template',&lt;br /&gt;
			data17 = coreData.template_name and '[[Template:' .. coreData.template_name .. ']]' or '',&lt;br /&gt;
			label19 = 'Form',&lt;br /&gt;
			data19 = coreData.page.form and '[[:' .. coreData.page.form.name .. ']]' or '',&lt;br /&gt;
			label21 = 'Category',&lt;br /&gt;
			data21 = coreData.page.category and '[[:' .. coreData.page.category.name .. ']]' or '',&lt;br /&gt;
			label22 = 'Gardening',&lt;br /&gt;
			data22 = coreData.page.gardeningCategory and '[[:' .. coreData.page.gardeningCategory.name .. ']]' or '',&lt;br /&gt;
		}&lt;br /&gt;
		if usesSmw and coreData.properties.order and #coreData.properties.order &amp;gt; 0 then&lt;br /&gt;
			ib_args.header30 = 'Properties'&lt;br /&gt;
			local i = 31&lt;br /&gt;
			for _, property in pairs(coreData.properties.order) do&lt;br /&gt;
				ib_args['label' .. i] = coreData.properties.data[property].type&lt;br /&gt;
				ib_args['data' .. i] = '[[Property:' .. property .. '|' .. property .. ']]'&lt;br /&gt;
				i = i + 1&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		self:addOutput(require('Module:Infobox').infobox(ib_args))&lt;br /&gt;
		return true&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Classgenerator:addPageBody()&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator:addPageBody(), from ' .. tostring(self))&lt;br /&gt;
	_debug(self, 2, ' rendering errors and warnings and adding them to output')&lt;br /&gt;
	self:addOutput(self:renderErrors())&lt;br /&gt;
	self:addOutput(self:renderWarnings())&lt;br /&gt;
	if self:goodToGo() then&lt;br /&gt;
		local frame = mw.getCurrentFrame()&lt;br /&gt;
		local lang = mw.language.new('en-gb')&lt;br /&gt;
		local _CFG = self.class.myConfiguration&lt;br /&gt;
		local coreData = self:getCoreData()&lt;br /&gt;
		-- start&lt;br /&gt;
		local widthTh = '300px'&lt;br /&gt;
		local widthTd = '200px'&lt;br /&gt;
		-- build the page status table&lt;br /&gt;
		-- first the two status table cells &amp;quot;green&amp;quot; and &amp;quot;red&amp;quot;&lt;br /&gt;
		local imgYes = '[[File:Yes check.png|13px|alt=Yes|link=]]'&lt;br /&gt;
		local imgNo = '[[File:X mark.png|13px|alt=No|link=]]'&lt;br /&gt;
		local tdYa = mw.html.create('td')&lt;br /&gt;
		tdYa:cssText('background: #90ff90; color:black; vertical-align: middle; text-align: center; width:' .. widthTd)&lt;br /&gt;
			:addClass('table-yes')&lt;br /&gt;
			:wikitext(imgYes)&lt;br /&gt;
		local tdNa = mw.html.create('td')&lt;br /&gt;
		tdNa:cssText('background: #FF9090; color:black; vertical-align: middle; text-align: center; width:' .. widthTd)&lt;br /&gt;
			:addClass('table-no')&lt;br /&gt;
			:wikitext(imgNo)&lt;br /&gt;
		local classExists = coreData.page.class.exists and coreData.page.config.exists&lt;br /&gt;
		local modulesExist = coreData.page.base.exists and classExists&lt;br /&gt;
		local thisClass&lt;br /&gt;
		local thisConfig&lt;br /&gt;
		if classExists then&lt;br /&gt;
			thisClass = require(coreData.page.class.name)&lt;br /&gt;
			thisConfig = require(coreData.page.config.name)&lt;br /&gt;
		end&lt;br /&gt;
		local thisUsesCargo = (FoundationClass.globalConfig.dataStore == 'both' or FoundationClass.globalConfig.dataStore == 'cargo') and coreData.global_cargoTable and #coreData.global_cargoTable &amp;gt; 0&lt;br /&gt;
		local thisUsesSmw = (FoundationClass.globalConfig.dataStore == 'both' or FoundationClass.globalConfig.dataStore == 'smw') and FoundationClass.myYesno(coreData.global_smwUseStorage)&lt;br /&gt;
		-- write the 2do checklist&lt;br /&gt;
		local done = true&lt;br /&gt;
		local step1&lt;br /&gt;
		local step2&lt;br /&gt;
		local step3&lt;br /&gt;
		if modulesExist then&lt;br /&gt;
			step1 = imgYes .. ' You created all your modules'&lt;br /&gt;
		else&lt;br /&gt;
			done = false&lt;br /&gt;
			step1 = imgNo .. ' You have to create your module pages. This, you have to do &amp;lt;b&amp;gt;manually&amp;lt;/b&amp;gt;. Go to [[#Page contents|section Page contents]], copy the module content and edit the corresponding module, ' ..&lt;br /&gt;
				'pasting all the copied content. Save and close. You have to do this for the following module(s): &amp;lt;ul&amp;gt; ' ..&lt;br /&gt;
				(not coreData.page.base.exists and '&amp;lt;li&amp;gt;[[#Page contents|' .. coreData.page.base.name .. ']]&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
				(not coreData.page.class.exists and '&amp;lt;li&amp;gt;[[#Page contents|' .. coreData.page.class.name .. ']]&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
				(not coreData.page.config.exists and '&amp;lt;li&amp;gt;[[#Page contents|' .. coreData.page.config.name .. ']]&amp;lt;/li&amp;gt;' or '') .. '&amp;lt;/ul&amp;gt;'&lt;br /&gt;
		end&lt;br /&gt;
		if coreData.page.baseDoc.exists and coreData.page.classDoc.exists and coreData.page.configDoc.exists and coreData.page.template.exists and coreData.page.templateDoc.exists and&lt;br /&gt;
				(not coreData.page.form or coreData.page.form.exists) and (not coreData.page.category or coreData.page.category.exists) and (not coreData.page.gardeningCategory or coreData.page.gardeningCategory.exists) then&lt;br /&gt;
			step2 = imgYes .. ' You created all auxilliary pages'&lt;br /&gt;
		else&lt;br /&gt;
			done = false&lt;br /&gt;
			step2 = imgNo .. ' You have to create auxilliary pages. This, you can do &amp;lt;b&amp;gt;automatically&amp;lt;/b&amp;gt;. Go to [[#Page autocreation|section Page autocreation]], hit the corresponding &amp;quot;Create&amp;quot;-button or ' ..&lt;br /&gt;
				'create all pages at once. Please do this for the following page(s): &amp;lt;ul&amp;gt; ' ..&lt;br /&gt;
				(not (coreData.page.baseDoc.exists or coreData.page.classDoc.exists or coreData.page.configDoc.exists) and '&amp;lt;li&amp;gt;Module documentation pages&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
				(not (coreData.page.template.exists or coreData.page.templateDoc.exists) and '&amp;lt;li&amp;gt;Template and/or template documentation page&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
				((coreData.page.form and not coreData.page.form.exists) and '&amp;lt;li&amp;gt;Form page&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
				(((coreData.page.category and not coreData.page.category.exists) or (coreData.page.gardeningCategory and not coreData.page.gardeningCategory.exists)) and '&amp;lt;li&amp;gt;Category page(s)&amp;lt;/li&amp;gt;' or '') .. '&amp;lt;/ul&amp;gt;'&lt;br /&gt;
		end&lt;br /&gt;
		local storeCargoInstruction&lt;br /&gt;
		local allPropertiesThere&lt;br /&gt;
		local cargoTableCreateLink = false&lt;br /&gt;
		if thisUsesCargo then&lt;br /&gt;
			-- we actually use cargo. check, if cargo table is there or throws an error? if all right, then yes, else instruction above&lt;br /&gt;
			if modulesExist and coreData.page.template.exists then&lt;br /&gt;
				cargoTableCreateLink = true&lt;br /&gt;
				attr = { limit = 1, default = '' }&lt;br /&gt;
				attr['more results text'] = ''&lt;br /&gt;
				local tableEntryId = mw.text.trim(mw.text.unstrip(FoundationClass.myCargoUtil.rawquery({tables = coreData.global_cargoTable, fields = {'_ID'}}, attr)))&lt;br /&gt;
				if mw.ustring.match(mw.text.trim(tableEntryId), '^[0-9]*$') then&lt;br /&gt;
					storeCargoInstruction = imgYes .. ' Your cargo table does exist! (Note: When you change your cargo table\'s declaration, you need to [[#Page autocreation|rebuild it]], though)'&lt;br /&gt;
				else&lt;br /&gt;
					done = false&lt;br /&gt;
					storeCargoInstruction = imgNo .. ' Please [[#Page autocreation|create your cargo table]]!'&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				done = false&lt;br /&gt;
				storeCargoInstruction = imgNo .. ' To be able to create your cargo table, you have to create the following page(s): &amp;lt;ul&amp;gt;' ..&lt;br /&gt;
					(not coreData.page.base.exists and '&amp;lt;li&amp;gt;' .. coreData.page.base.name .. '&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
					(not coreData.page.class.exists and '&amp;lt;li&amp;gt;' .. coreData.page.class.name .. '&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
					(not coreData.page.config.exists and '&amp;lt;li&amp;gt;' .. coreData.page.config.name .. '&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
					(not coreData.page.template.exists and '&amp;lt;li&amp;gt;' .. coreData.page.template.name .. '&amp;lt;/li&amp;gt;' or '') .. '&amp;lt;/ul&amp;gt;'&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if thisUsesSmw then&lt;br /&gt;
			-- we actually use smw. check, if all properties are present? if all right, then yes, else instruction above&lt;br /&gt;
			if coreData.properties and coreData.properties.data and FoundationClass.myTableTools.size(coreData.properties.data) &amp;gt; 0 then&lt;br /&gt;
				allPropertiesThere = true&lt;br /&gt;
				for property, propertyData in pairs(coreData.properties.data) do&lt;br /&gt;
					allPropertiesThere = allPropertiesThere and propertyData.exists&lt;br /&gt;
				end&lt;br /&gt;
				if allPropertiesThere then&lt;br /&gt;
					storeSwmInstruction = imgYes .. ' All your property pages are present and accounted for!'&lt;br /&gt;
				else&lt;br /&gt;
					done = false&lt;br /&gt;
					storeSwmInstruction = imgNo .. ' Please &amp;lt;b&amp;gt;[[#Page autocreation|autocreate]]&amp;lt;/b&amp;gt; your properties! The following are missing: &amp;lt;ul&amp;gt;'&lt;br /&gt;
					for _, property in pairs(coreData.properties.order) do&lt;br /&gt;
						local pdata = coreData.properties.data[property]&lt;br /&gt;
						if not pdata or not pdata.exists then&lt;br /&gt;
							storeSwmInstruction = storeSwmInstruction .. '&amp;lt;li&amp;gt;[[Property:' .. property .. ']]&amp;lt;/li&amp;gt;'&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
					storeSwmInstruction = storeSwmInstruction .. '&amp;lt;/ul&amp;gt;'&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				done = false&lt;br /&gt;
				storeSwmInstruction = imgNo .. ' To be able to create your smw properties, you have to create the following page(s): &amp;lt;ul&amp;gt;' ..&lt;br /&gt;
					(not coreData.page.class.exists and '&amp;lt;li&amp;gt;' .. coreData.page.class.name .. '&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
					(not coreData.page.config.exists and '&amp;lt;li&amp;gt;' .. coreData.page.config.name .. '&amp;lt;/li&amp;gt;' or '') .. '&amp;lt;/ul&amp;gt;'&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if storeCargoInstruction or storeSwmInstruction then&lt;br /&gt;
			if storeCargoInstruction and storeSwmInstruction then&lt;br /&gt;
				step3 = 'Your class used cargo AND smw store. You have to create both data stores: &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;' .. storeCargoInstruction .. '&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;' .. storeSwmInstruction .. '&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;'&lt;br /&gt;
			else&lt;br /&gt;
				step3 = storeCargoInstruction or storeSwmInstruction&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			step3 = imgYes .. ' This class does not use a data store. Nothing to be done here!'&lt;br /&gt;
		end&lt;br /&gt;
		local step4 = done and imgYes .. ' You are done. Remember, when you want to change parameters in your config, edit this page and write your [' .. coreData.page.config.editlink .. ' config file] new' or &lt;br /&gt;
			imgNo .. ' You are not finished yet, please tend to your tasks.'&lt;br /&gt;
		local manual = mw.html.create('')&lt;br /&gt;
		manual:wikitext('&amp;lt;h2&amp;gt;Your 2do checklist&amp;lt;/h2&amp;gt;')&lt;br /&gt;
			:tag('ol')&lt;br /&gt;
				:cssText('margin: 0.3em 0 0 1.6em; padding: 0')&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(step1)&lt;br /&gt;
					:done()&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(step2)&lt;br /&gt;
					:done()&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(step3)&lt;br /&gt;
					:done()&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(step4)&lt;br /&gt;
					:done()&lt;br /&gt;
				:done()&lt;br /&gt;
		-- get the data store details, if all the modules exist and we have a datastore configured&lt;br /&gt;
		local datastore = mw.html.create('')&lt;br /&gt;
		if thisClass then&lt;br /&gt;
			datastore:node(thisClass:explainDataStore())&lt;br /&gt;
				:newline()&lt;br /&gt;
		end&lt;br /&gt;
		-- build the status table&lt;br /&gt;
		local statusTrs = mw.html.create('')&lt;br /&gt;
		for _, pid in pairs(coreData.page.order) do&lt;br /&gt;
			statusTrs:tag('tr')&lt;br /&gt;
				:tag('th')&lt;br /&gt;
					:css('text-align', 'left')&lt;br /&gt;
					:css('width', widthTh)&lt;br /&gt;
					:wikitext(coreData.page[pid].name)&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
				:node(coreData.page[pid].exists and tdYa or tdNa)&lt;br /&gt;
				:newline()&lt;br /&gt;
				:done()&lt;br /&gt;
				:newline()&lt;br /&gt;
		end&lt;br /&gt;
		if thisUsesSmw and coreData.properties and coreData.properties.data and FoundationClass.myTableTools.size(coreData.properties.data) &amp;gt; 0 then&lt;br /&gt;
			statusTrs:tag('tr')&lt;br /&gt;
				:tag('th')&lt;br /&gt;
					:css('text-align', 'center')&lt;br /&gt;
					:css('width', widthTh)&lt;br /&gt;
					:attr('colspan', 2)&lt;br /&gt;
					:wikitext('Property pages for your smw store')&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
			for _, property in pairs(coreData.properties.order) do&lt;br /&gt;
				statusTrs:tag('tr')&lt;br /&gt;
					:tag('th')&lt;br /&gt;
						:css('text-align', 'left')&lt;br /&gt;
						:css('width', widthTh)&lt;br /&gt;
						:wikitext('Property:' .. property)&lt;br /&gt;
						:done()&lt;br /&gt;
						:newline()&lt;br /&gt;
					:node(coreData.properties.data[property].exists and tdYa or tdNa)&lt;br /&gt;
					:newline()&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		local statusTable = mw.html.create('table')&lt;br /&gt;
		statusTable:node(statusTrs)&lt;br /&gt;
		-- page autocreation&lt;br /&gt;
		local extAutoCreatePage = pcall(frame.callParserFunction, frame, {name = '#createpageifnotex:Module:Classgenerator', {'NUL'}})&lt;br /&gt;
		local autoCreation = _CFG.template.createPages and extAutoCreatePage&lt;br /&gt;
		local pageAutoCreation = mw.html.create('')&lt;br /&gt;
		pageAutoCreation:wikitext('&amp;lt;h2&amp;gt;Page autocreation&amp;lt;/h2&amp;gt;')&lt;br /&gt;
			:newline()&lt;br /&gt;
		if autoCreation then&lt;br /&gt;
			-- depending on parameters and existence of pages do the autocreate or print the button&lt;br /&gt;
			-- first see, which pagecomplexes (modules(docs), templates, form, category) are missing&lt;br /&gt;
			local missing = {}&lt;br /&gt;
			-- in missing we store, if a page in a given namespace is missing. Namespaces are stored by their ids (numbers)&lt;br /&gt;
			for _, pid in pairs(coreData.page.order) do&lt;br /&gt;
				-- due to extension autocreatepage messing up module pages, in namepace module we only autocreate doc pages&lt;br /&gt;
				if not coreData.page[pid].exists and not Classgenerator.myTableTools.inTable(missing, coreData.page[pid].namespace) and &lt;br /&gt;
						(coreData.page[pid].namespace ~= 828 or coreData.page[pid].isDocPage) then&lt;br /&gt;
					table.insert(missing, coreData.page[pid].namespace)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			if thisUsesSmw and not allPropertiesThere then&lt;br /&gt;
				table.insert(missing, mw.title.new('NUL', 'Property').namespace)&lt;br /&gt;
			end&lt;br /&gt;
			-- now generate the printout or call the parser function depending on global_autocreate_* status&lt;br /&gt;
			-- remember the switches 'global_autocreate_module', 'global_autocreate_template', 'global_autocreate_form', 'global_autocreate_category', and 'global_autocreate_property'&lt;br /&gt;
			local actable = mw.html.create('table')&lt;br /&gt;
			for _, nsid  in pairs(missing) do&lt;br /&gt;
				local ns = mw.ustring.lower(_namespaceName(self, nsid))&lt;br /&gt;
				local information = ''&lt;br /&gt;
				if coreData.autocreate[ns] and coreData.autocreate[ns] &amp;gt; os.time() - _CFG.template.autoCreationTimeDiff then&lt;br /&gt;
					-- ************************************* actual autocreation is done here&lt;br /&gt;
					-- we iterate over all namespaces for which pages are missing (var missing) and spring into action, if we have a numeric value supplied for that namespace coreData.autocreate[ns] that is recent enough&lt;br /&gt;
					-- now we have a namespace, we want to create pages for (var nsid) (all that is done in the recent 4 lines). what we do in the following lines:&lt;br /&gt;
					-- we iterate over all pages in coreData.page.order and spring into action, if the interation instance (pid) is in the namespace (nsid), the page is non exist and is not a module&lt;br /&gt;
					-- in that action body, we create the page with the precalcualted content&lt;br /&gt;
					-- also: for convenience, we create some global project (meta)categories, if related to the current page (project-form-category if nsid for forms, etc.) and configured in Foundationclass/globalconfig. here is an overview&lt;br /&gt;
					--	Classgenerator.globalConfig.formCategory			: MediaWiki:Classengine-content-project-form-category&lt;br /&gt;
					--	Classgenerator.globalConfig.gardeningSuperCategory	: MediaWiki:Classengine-content-project-gardening-supercategory&lt;br /&gt;
					--	Classgenerator.globalConfig.moduleCategory			: MediaWiki:Classengine-content-project-module-category&lt;br /&gt;
					--	Classgenerator.globalConfig.projectSuperCategory	: MediaWiki:Classengine-content-project-supercategory&lt;br /&gt;
					--	Classgenerator.globalConfig.propertyCategory		: MediaWiki:Classengine-content-project-property-category&lt;br /&gt;
					--	Classgenerator.globalConfig.templateCategory		: MediaWiki:Classengine-content-project-templates&lt;br /&gt;
					for _, pid in pairs(coreData.page.order) do&lt;br /&gt;
						_debug(self, 3, ' testing page &amp;quot;' .. coreData.page[pid].name .. '&amp;quot;: namespace id is ' .. coreData.page[pid].namespace ..&lt;br /&gt;
							', and page does ' ..(not coreData.page[pid].exists and 'not ' or '') .. 'exist')&lt;br /&gt;
						if coreData.page[pid].namespace == nsid and not coreData.page[pid].exists and (nsid ~= 828 or coreData.page[pid].isDocPage) then&lt;br /&gt;
							if pid == 'gardeningCategory' and Classgenerator.globalConfig.gardeningSuperCategory and #Classgenerator.globalConfig.gardeningSuperCategory &amp;gt; 0 then&lt;br /&gt;
								-- we just iterated over the gardening category page (so this class has one) but we did not create it, yet)&lt;br /&gt;
								-- blindly try to create the gardening supercategory first, in case the class's gardening category is the gardening supercategory, we dont want the class specific content&lt;br /&gt;
								local content = '{{MediaWiki:Classengine-content-project-gardening-supercategory}}'&lt;br /&gt;
								_debug(self, 3, ' trying to autocreate garderning supercategory page &amp;quot;' .. Classgenerator.globalConfig.gardeningSuperCategory .. '&amp;quot; with # of content being ' .. #content)&lt;br /&gt;
								local ret = frame:callParserFunction{ name = '#createpageifnotex:Category:' .. Classgenerator.globalConfig.gardeningSuperCategory, args = { content } }&lt;br /&gt;
								if #ret &amp;gt; 0 then&lt;br /&gt;
									information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
								end&lt;br /&gt;
							end&lt;br /&gt;
							_debug(self, 3, ' trying to autocreate page &amp;quot;' .. coreData.page[pid].name .. '&amp;quot; with # of content being ' .. #coreData.page[pid].content)&lt;br /&gt;
							local ret = frame:callParserFunction{ name = '#createpageifnotex:' .. coreData.page[pid].name, args = { frame:preprocess(coreData.page[pid].content) } }&lt;br /&gt;
							if #ret &amp;gt; 0 then&lt;br /&gt;
								information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
							end&lt;br /&gt;
							if pid == 'form' and Classgenerator.globalConfig.formCategory and #Classgenerator.globalConfig.formCategory &amp;gt; 0 then&lt;br /&gt;
								-- we just iterated over the form page (so this class has one) and created it (yay). Now blindly create the formCategory as well...&lt;br /&gt;
								local content = '{{MediaWiki:Classengine-content-project-form-category}}'&lt;br /&gt;
								_debug(self, 3, ' trying to autocreate form category page &amp;quot;' .. Classgenerator.globalConfig.formCategory .. '&amp;quot; with # of content being ' .. #content)&lt;br /&gt;
								local ret = frame:callParserFunction{ name = '#createpageifnotex:Category:' .. Classgenerator.globalConfig.formCategory, args = { content } }&lt;br /&gt;
								if #ret &amp;gt; 0 then&lt;br /&gt;
									information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
								end&lt;br /&gt;
							elseif nsid ~= 828 and Classgenerator.globalConfig.moduleCategory and #Classgenerator.globalConfig.moduleCategory &amp;gt; 0 then&lt;br /&gt;
								-- we just iterated a module doc page (so this class has one) and created it (yay). Now blindly create the moduleCategory as well...&lt;br /&gt;
								local content = '{{MediaWiki:Classengine-content-project-module-category}}'&lt;br /&gt;
								_debug(self, 3, ' trying to autocreate module category page &amp;quot;' .. Classgenerator.globalConfig.moduleCategory .. '&amp;quot; with # of content being ' .. #content)&lt;br /&gt;
								local ret = frame:callParserFunction{ name = '#createpageifnotex:Category:' .. Classgenerator.globalConfig.moduleCategory, args = { content } }&lt;br /&gt;
								if #ret &amp;gt; 0 then&lt;br /&gt;
									information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
								end&lt;br /&gt;
							elseif pid == 'category' and Classgenerator.globalConfig.projectSuperCategory and #Classgenerator.globalConfig.projectSuperCategory &amp;gt; 0 then&lt;br /&gt;
								-- we just iterated over the category page (so this class has one) and created it (yay). Now blindly create the supercategory as well...&lt;br /&gt;
								local content = '{{MediaWiki:Classengine-content-project-supercategory}}'&lt;br /&gt;
								_debug(self, 3, ' trying to autocreate super category page &amp;quot;' .. Classgenerator.globalConfig.projectSuperCategory .. '&amp;quot; with # of content being ' .. #content)&lt;br /&gt;
								local ret = frame:callParserFunction{ name = '#createpageifnotex:Category:' .. Classgenerator.globalConfig.projectSuperCategory, args = { content } }&lt;br /&gt;
								if #ret &amp;gt; 0 then&lt;br /&gt;
									information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
								end&lt;br /&gt;
							elseif nsid == 10 and Classgenerator.globalConfig.templateCategory and #Classgenerator.globalConfig.templateCategory &amp;gt; 0 then&lt;br /&gt;
								-- we just iterated over a page in template namespace (so this class has one) and created it (yay). Now blindly create the templateCategory as well...&lt;br /&gt;
								local content = '{{MediaWiki:Classengine-content-project-template-category}}'&lt;br /&gt;
								_debug(self, 3, ' trying to autocreate template category page &amp;quot;' .. Classgenerator.globalConfig.templateCategory .. '&amp;quot; with # of content being ' .. #content)&lt;br /&gt;
								local ret = frame:callParserFunction{ name = '#createpageifnotex:Category:' .. Classgenerator.globalConfig.templateCategory, args = { content } }&lt;br /&gt;
								if #ret &amp;gt; 0 then&lt;br /&gt;
									information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
								end&lt;br /&gt;
							end&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
					if thisUsesSmw and (nsid == mw.title.new('NUL', 'Property').namespace) then&lt;br /&gt;
						-- add here autocreation of properties&lt;br /&gt;
						for property, pdata in pairs(coreData.properties.data) do&lt;br /&gt;
							if not pdata.exists then&lt;br /&gt;
								local content = pdata.content&lt;br /&gt;
								_debug(self, 3, ' trying to autocreate property page &amp;quot;' .. property .. '&amp;quot; with # of content being ' .. #content)&lt;br /&gt;
								local ret = frame:callParserFunction{ name = '#createpageifnotex:Property:' .. property, args = { frame:preprocess(pdata.content) } }&lt;br /&gt;
								if #ret &amp;gt; 0 then&lt;br /&gt;
									information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
								end&lt;br /&gt;
							end&lt;br /&gt;
						end&lt;br /&gt;
						-- we just iterated over all missing property pages (so this class has some) and created them (yay). Now blindly create the propertyCategory as well...&lt;br /&gt;
						local content = '{{MediaWiki:Classengine-content-project-property-category}}'&lt;br /&gt;
						_debug(self, 3, ' trying to autocreate property category page &amp;quot;' .. Classgenerator.globalConfig.propertyCategory .. '&amp;quot; with # of content being ' .. #content)&lt;br /&gt;
						local ret = frame:callParserFunction{ name = '#createpageifnotex:Category:' .. Classgenerator.globalConfig.propertyCategory, args = { content } }&lt;br /&gt;
						if #ret &amp;gt; 0 then&lt;br /&gt;
							information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				-- create the tr for the ns&lt;br /&gt;
				actable:tag('tr')&lt;br /&gt;
					:tag('th')&lt;br /&gt;
						:css('text-align', 'left')&lt;br /&gt;
						:css('width', widthTh)&lt;br /&gt;
						:wikitext('Create ' .. ((nsid == 828 and 'module docs' or (ns == 'property' and 'properties' or (ns .. (ns == 'template' and 's' or '')))) .. ':'))&lt;br /&gt;
							-- note: nsid == mw.title.new('NUL', 'Property').namespace is necessary since canonicalname for property namespace does not translate uniquely over different languages :(&lt;br /&gt;
						:done()&lt;br /&gt;
						:newline()&lt;br /&gt;
					:tag('td')&lt;br /&gt;
						:cssText('color:black; vertical-align: middle; text-align: center; width:' .. widthTd)&lt;br /&gt;
						:css('background', (coreData.autocreate[ns] and coreData.autocreate[ns] &amp;gt; os.time() - _CFG.template.autoCreationTimeDiff) and '#90ff90' or '#FF9090' )&lt;br /&gt;
						:wikitext(frame:callParserFunction{name = '#autoedit', args={form='Classgenerator', target=self:getUid(),&lt;br /&gt;
							'link text=' .. (coreData.autocreate[ns] and 'Requested on ' .. os.date('%d.%m.%Y %X', coreData.autocreate[ns]) or 'Create automatically!')  .. &lt;br /&gt;
								(#information &amp;gt; 0 and ('Call returned ' .. information) or ''),&lt;br /&gt;
							'reload', summary=&amp;quot;Requesting the autocreation of &amp;quot; .. coreData.className .. ' for pages of type ' .. ns,&lt;br /&gt;
							'query string=Classgenerator[global_autocreate_' .. ns .. ']=' .. os.time()}&lt;br /&gt;
							})&lt;br /&gt;
						:done()&lt;br /&gt;
						:newline()&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
&lt;br /&gt;
			end&lt;br /&gt;
			if Classgenerator.myTableTools.size(missing) &amp;gt; 0 then&lt;br /&gt;
				-- show the all button&lt;br /&gt;
				local querystring = ''&lt;br /&gt;
				for _, nsid in pairs(missing) do&lt;br /&gt;
					local ns = mw.ustring.lower(_namespaceName(self, nsid))&lt;br /&gt;
					querystring = querystring .. 'Classgenerator[global_autocreate_' .. ns .. ']=' .. os.time() .. '&amp;amp;'&lt;br /&gt;
				end&lt;br /&gt;
				querystring = mw.ustring.sub(querystring, 1, -2)&lt;br /&gt;
				actable:tag('tr')&lt;br /&gt;
					:tag('th')&lt;br /&gt;
						:css('text-align', 'left')&lt;br /&gt;
						:css('width', widthTh)&lt;br /&gt;
						:wikitext('Create all pages:')&lt;br /&gt;
						:done()&lt;br /&gt;
						:newline()&lt;br /&gt;
					:tag('td')&lt;br /&gt;
						:cssText('background: #FF9090; color:black; vertical-align: middle; text-align: center; width:' .. widthTd)&lt;br /&gt;
						:wikitext(frame:callParserFunction{name = '#autoedit', args={form='Classgenerator', target=self:getUid(),&lt;br /&gt;
							'link text=Create automatically!', 'reload', summary=&amp;quot;Requesting the autocreation of all missing pages&amp;quot;, 'query string=' .. querystring }&lt;br /&gt;
							})&lt;br /&gt;
						:done()&lt;br /&gt;
						:newline()&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
				pageAutoCreation:wikitext('&amp;lt;b&amp;gt;Note:&amp;lt;/b&amp;gt; Creation of module pages is impossible due to an incompatibility issue.')&lt;br /&gt;
					:newline()&lt;br /&gt;
					:node(actable)&lt;br /&gt;
					:newline()&lt;br /&gt;
			else&lt;br /&gt;
				pageAutoCreation:wikitext('All pages present!')&lt;br /&gt;
					:newline()&lt;br /&gt;
					:tag('p')&lt;br /&gt;
						:wikitext('&amp;lt;small&amp;gt;&amp;lt;b&amp;gt;Note:&amp;lt;/b&amp;gt; Creation of module pages is impossible due to an incompatibility issue.&amp;lt;/small&amp;gt;')&lt;br /&gt;
						:newline()&lt;br /&gt;
						:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			pageAutoCreation:wikitext('Page autocreation is only possible if activated in your [[Module:Classgenerator/config]]-file (see template-section) and '&lt;br /&gt;
					.. 'Extension AutoCreatePage being installed.')&lt;br /&gt;
				:newline()&lt;br /&gt;
		end&lt;br /&gt;
		if cargoTableCreateLink then&lt;br /&gt;
			pageAutoCreation:wikitext('&amp;lt;b&amp;gt;Cargo data store:&amp;lt;/b&amp;gt;To (re-)create your cargo table, follow &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[' .. coreData.page.template.recreatedata .. ' this link]&amp;lt;/span&amp;gt; and then press ok!')&lt;br /&gt;
				:newline()&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		-- build the content collapses&lt;br /&gt;
		local collapse = require('Module:Collapse').main&lt;br /&gt;
		local bg_sets = { exist = {'#cfc', '#9c9'}, nonexist = {'#fcc', '#c99'} }&lt;br /&gt;
		local bg = 1&lt;br /&gt;
		local pageContent = mw.html.create('')&lt;br /&gt;
		for _, pid in pairs(coreData.page.order) do&lt;br /&gt;
			local content&lt;br /&gt;
			local bgs = coreData.page[pid].exists and bg_sets.exist or bg_sets.nonexist&lt;br /&gt;
			if coreData.page[pid].namespace == 828 and not coreData.page[pid].isDocPage then&lt;br /&gt;
				content = frame:expandTemplate{ title = 'Code', args = {lang = 'lua', code = coreData.page[pid].content, line = '1'}}&lt;br /&gt;
			else&lt;br /&gt;
				content = '&amp;lt;pre style=&amp;quot;white-space:-moz-pre-wrap; white-space:-pre-wrap; white-space:-o-pre-wrap; white-space:pre-wrap; word-wrap:break-word;&amp;quot;&amp;gt;' .. &lt;br /&gt;
					mw.text.nowiki(frame:preprocess(coreData.page[pid].content)) .. '&amp;lt;/pre&amp;gt;'&lt;br /&gt;
			end&lt;br /&gt;
			pageContent:wikitext(collapse({ header = 'Contents of &amp;lt;b&amp;gt;[[:' .. coreData.page[pid].name .. ']]&amp;lt;/b&amp;gt; ' ..&lt;br /&gt;
							'&amp;lt;span class=&amp;quot;plainlinks&amp;quot; style=&amp;quot;font-size:75%;&amp;quot;&amp;gt;&amp;amp;#91;[' .. coreData.page[pid].editlink ..&lt;br /&gt;
							' EDIT]&amp;amp;#93;&amp;lt;/span&amp;gt;',&lt;br /&gt;
						content = content, left = true, bg = bgs[bg]&lt;br /&gt;
					}))&lt;br /&gt;
				:newline()&lt;br /&gt;
			bg = (bg == 2 and 1 or 2)&lt;br /&gt;
		end&lt;br /&gt;
		if thisUsesSmw and coreData.properties.order then&lt;br /&gt;
			-- add here the collpases of the properties&lt;br /&gt;
			local message = mw.message.new('classengine-template-property-page')&lt;br /&gt;
			pageContent:tag('p')&lt;br /&gt;
				:wikitext('&amp;lt;h3&amp;gt;All property pages&amp;lt;/h3&amp;gt;')&lt;br /&gt;
				:done()&lt;br /&gt;
			for _, property in pairs(coreData.properties.order) do&lt;br /&gt;
				local bgs = coreData.page[pid].exists and bg_sets.exist or bg_sets.nonexist&lt;br /&gt;
				local content = '&amp;lt;pre style=&amp;quot;white-space:-moz-pre-wrap; white-space:-pre-wrap; white-space:-o-pre-wrap; white-space:pre-wrap; word-wrap:break-word;&amp;quot;&amp;gt;' .. &lt;br /&gt;
					mw.text.nowiki(frame:preprocess(coreData.properties.data[property].content)) .. '&amp;lt;/pre&amp;gt;'&lt;br /&gt;
				pageContent:wikitext(collapse({ header = 'Contents of &amp;lt;b&amp;gt;[[:Property:' .. property .. ']]&amp;lt;/b&amp;gt; ' ..&lt;br /&gt;
								'&amp;lt;span class=&amp;quot;plainlinks&amp;quot; style=&amp;quot;font-size:75%;&amp;quot;&amp;gt;&amp;amp;#91;[' .. coreData.properties.data[property].editlink ..&lt;br /&gt;
								' EDIT]&amp;amp;#93;&amp;lt;/span&amp;gt;',&lt;br /&gt;
							content = content, left = true, bg = bgs[bg]&lt;br /&gt;
						}))&lt;br /&gt;
					:newline()&lt;br /&gt;
				bg = (bg == 2 and 1 or 2)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		local updateWarning = mw.html.create('')&lt;br /&gt;
		if coreData.now_timestamp - coreData.edit_timestamp &amp;lt; 2*60*60 then&lt;br /&gt;
			local mbox = require('Module:Message box')&lt;br /&gt;
			updateWarning:wikitext(mbox.main('ombox', { type='content', text = 'Note: You updated the class ' .. coreData.edit_time_before .. ' ago. Did you write your [[#Page contents|config file]] new? ' ..&lt;br /&gt;
						'Changes won\'t take effect unless you do!' .. ((thisUsesCargo and cargoTableCreateLink) and '&amp;lt;p&amp;gt;&amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;Also: If you changed your cargo table\'s declaration, [' .. &lt;br /&gt;
						coreData.page.template.editlink .. ' edit your template] and [[#Page autocreation|rebuild your cargo table]]!&amp;lt;/span&amp;gt;' or '')}))&lt;br /&gt;
				:newline()&lt;br /&gt;
		end&lt;br /&gt;
		local smwPropertyHint = mw.html.create('')&lt;br /&gt;
		if (FoundationClass.globalConfig.dataStore == 'both' or FoundationClass.globalConfig.dataStore == 'smw')&lt;br /&gt;
				and FoundationClass.myYesno(coreData.global_smwUseStorage)&lt;br /&gt;
				and not coreData.properties.order then&lt;br /&gt;
			local mbox = require('Module:Message box')&lt;br /&gt;
			smwPropertyHint:wikitext(mbox.main('ombox', { type='info', text = 'Hint: If you use properties in your class, they will not display in &amp;lt;i&amp;gt;Page contents&amp;lt;/i&amp;gt;, nor be listed in &amp;lt;i&amp;gt;Page status&amp;lt;/i&amp;gt; or '&lt;br /&gt;
					.. 'autocreated in &amp;lt;i&amp;gt;Page autocreation&amp;lt;/i&amp;gt; unless you have your class and config page created!'}))&lt;br /&gt;
				:newline()&lt;br /&gt;
		end&lt;br /&gt;
		-- assemble everything&lt;br /&gt;
		local html = mw.html.create('')&lt;br /&gt;
		html:wikitext(coreData.global_description)&lt;br /&gt;
			:newline()&lt;br /&gt;
			:node(updateWarning)&lt;br /&gt;
			:node(smwPropertyHint)&lt;br /&gt;
			:node(manual)&lt;br /&gt;
			:newline()&lt;br /&gt;
			:node(datastore)&lt;br /&gt;
			:wikitext('&amp;lt;h2&amp;gt;Page status&amp;lt;/h2&amp;gt;')&lt;br /&gt;
			:newline()&lt;br /&gt;
			:wikitext(autoCreation and 'This status may be inaccurate, if you just created pages. In that case, run jobs and clear cache of this page.' or '')&lt;br /&gt;
			:node(statusTable)&lt;br /&gt;
			:newline()&lt;br /&gt;
			:node(pageAutoCreation)&lt;br /&gt;
			:wikitext('&amp;lt;h2&amp;gt;Page contents&amp;lt;/h2&amp;gt;')&lt;br /&gt;
			:newline()&lt;br /&gt;
			:node(pageContent)&lt;br /&gt;
			:newline()&lt;br /&gt;
			:done()&lt;br /&gt;
		local debugLevel = FoundationClass.globalConfig.debugLevel or _CFG.global.debugLevel&lt;br /&gt;
		if debugLevel then&lt;br /&gt;
			html:tag('pre')&lt;br /&gt;
--				:wikitext(FoundationClass.myTableTools.printTable(coreData))&lt;br /&gt;
--				:wikitext(FoundationClass.myTableTools.printTable(thisClass:smwProperty2ParameterTranslationTable()))&lt;br /&gt;
				:wikitext(ClassDebug:printLog(debugLevel))&lt;br /&gt;
				:done()&lt;br /&gt;
		end&lt;br /&gt;
		self:addOutput(html)&lt;br /&gt;
&lt;br /&gt;
		return true&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Classgenerator:myArgumentProcessing(coreData)&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator:myArgumentProcessing(args) to process coreData, from ' .. tostring(self))&lt;br /&gt;
	-- function that performs some individual transformation args --&amp;amp;amp;gt; coreData&lt;br /&gt;
	local _CFG = self.class.myConfiguration&lt;br /&gt;
	local coreData = coreData&lt;br /&gt;
	local lang = mw.language.new('en')&lt;br /&gt;
	coreData.className = lang:ucfirst(mw.text.trim(mw.ustring.gsub(self:getUid(), ':', '')))&lt;br /&gt;
	coreData.edit_timestamp = lang:formatDate('U', coreData.global_edit_timestamp)&lt;br /&gt;
	coreData.now_timestamp = lang:formatDate('U') + 60*60&lt;br /&gt;
	coreData.edit_time_before = lang:formatDuration(coreData.now_timestamp-coreData.edit_timestamp)&lt;br /&gt;
	coreData.last_edited = lang:formatDate('d.m.Y H:i:s', coreData.global_edit_timestamp)&lt;br /&gt;
	if coreData.global_gardeningCategory_chooser and mw.ustring.lower(coreData.global_gardeningCategory_chooser) == 'global' then&lt;br /&gt;
		coreData.global_gardeningCategory = 'superglobal.gardeningCategory'&lt;br /&gt;
	end&lt;br /&gt;
	if mw.ustring.find(coreData.className, ' ', 1, true) then&lt;br /&gt;
		local tmp = ''&lt;br /&gt;
		for fragment in mw.text.gsplit(coreData.className, ' ', true) do&lt;br /&gt;
			tmp = tmp .. lang:ucfirst(fragment)&lt;br /&gt;
		end&lt;br /&gt;
		coreData.className = tmp&lt;br /&gt;
	end&lt;br /&gt;
	if coreData.global_cargoTable then&lt;br /&gt;
		coreData.global_cargoTable = mw.ustring.gsub(mw.ustring.lower(coreData.global_cargoTable), ' ', '_')&lt;br /&gt;
	end&lt;br /&gt;
	if coreData.form_createInfotext and #coreData.form_createInfotext &amp;gt; 0 and mw.ustring.sub(coreData.form_createInfotext, -1) ~= ' ' then&lt;br /&gt;
		coreData.form_createInfotext = coreData.form_createInfotext .. ' '&lt;br /&gt;
	end&lt;br /&gt;
	local parameter_parameter&lt;br /&gt;
	local fieldOrder&lt;br /&gt;
	if coreData.parameter_parameter then&lt;br /&gt;
		parameters = ''&lt;br /&gt;
		fieldOrder = {}&lt;br /&gt;
		local classGenParamConfig = mw.loadData('Module:Classgenerator/parameter/config')&lt;br /&gt;
		for result in mw.text.gsplit(coreData.parameter_parameter, classGenParamConfig.template.delimiterResult, true) do&lt;br /&gt;
			local fieldname, parameter = mw.ustring.match(result, '^([^#]*)' .. classGenParamConfig.template.delimiterFormFieldName .. '(.+)$')&lt;br /&gt;
			if fieldname and mw.ustring.len(mw.text.trim(fieldname)) &amp;gt; 0 then&lt;br /&gt;
				table.insert(fieldOrder, mw.text.trim(fieldname))&lt;br /&gt;
			end&lt;br /&gt;
			if parameter and mw.ustring.len(parameter) &amp;gt; 0 then&lt;br /&gt;
				parameters = parameters .. parameter&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	coreData.parameter_parameter = parameters&lt;br /&gt;
	coreData.form_enable = FoundationClass.myYesno(coreData.form_enable)&lt;br /&gt;
	if coreData.form_enable then&lt;br /&gt;
		coreData.form_fieldOrder = fieldOrder&lt;br /&gt;
		form_buttons = { 'save' }&lt;br /&gt;
		if coreData.form_buttons and #coreData.form_buttons &amp;gt; 0 then&lt;br /&gt;
			for _, button in pairs(coreData.form_buttons) do&lt;br /&gt;
				table.insert(form_buttons, button)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		table.insert(form_buttons, 'cancel')&lt;br /&gt;
	end&lt;br /&gt;
	coreData.form_buttons = form_buttons&lt;br /&gt;
	-- here build the class config&lt;br /&gt;
	local contentClassConfig = mw.ustring.gsub(_CFG.template.configIntro, _CFG.template.placeHolderClassName, coreData.className) ..&lt;br /&gt;
		'local global = {\n' ..&lt;br /&gt;
		'\tdebugLevel = false,'&lt;br /&gt;
	if self.class.myConfiguration.template.addCommentsToConfig then&lt;br /&gt;
		contentClassConfig = contentClassConfig .. '\t-- set this to the level you wish to display at render. false if disabled. this is a class based setting. ' ..&lt;br /&gt;
			'you can set this globally at Foundationclass/globalconfig, causing all child classes to debug.'&lt;br /&gt;
	end&lt;br /&gt;
	contentClassConfig = contentClassConfig .. '\n'&lt;br /&gt;
	-- calculate the fieldlists:&lt;br /&gt;
	local fieldlists = {}&lt;br /&gt;
	for _, field in pairs(_CFG.form.fieldOrder) do&lt;br /&gt;
		local tab = mw.ustring.match(field, '^([a-z]+)_.+')&lt;br /&gt;
		if not fieldlists[tab] then&lt;br /&gt;
			fieldlists[tab] = {}&lt;br /&gt;
		end&lt;br /&gt;
		table.insert(fieldlists[tab], field)&lt;br /&gt;
	end&lt;br /&gt;
	local omissionList = {'global_autocreate_module', 'global_autocreate_template', 'global_autocreate_form', 'global_autocreate_category', 'global_autocreate_property', 'global_edit_timestamp', 'global_gardeningCategory_chooser',&lt;br /&gt;
		'form_textareaAttributes_cols', 'form_textareaAttributes_rows', 'form_textareaAttributes_autogrow', 'form_textareaAttributes_editor', 'form_createLinkInfo', &lt;br /&gt;
		'global_customization', 'form_customization', 'template_customization' }&lt;br /&gt;
	for _, attr in pairs(fieldlists.global) do&lt;br /&gt;
		if not Classgenerator.myTableTools.inTable(omissionList, attr) and self.class.myConfiguration.parameter[attr] then&lt;br /&gt;
			contentClassConfig = contentClassConfig .. _processAttribute(self, attr, '\t')&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if coreData.global_customization then&lt;br /&gt;
		for line in mw.text.gsplit(coreData.global_customization, '\n', true) do&lt;br /&gt;
			contentClassConfig = contentClassConfig .. '\t' .. line .. '\n'&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	contentClassConfig = contentClassConfig .. '}\n\nlocal form = {\n'&lt;br /&gt;
	for _, attr in pairs(fieldlists.form) do&lt;br /&gt;
		if not Classgenerator.myTableTools.inTable(omissionList, attr) and self.class.myConfiguration.parameter[attr] then&lt;br /&gt;
			contentClassConfig = contentClassConfig .. _processAttribute(self, attr, '\t')&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	contentClassConfig = contentClassConfig .. '\ttextareaAttributes = {	-- the defaults for your textarea fields\n'&lt;br /&gt;
	for _, attr in pairs({'form_textareaAttributes_cols', 'form_textareaAttributes_rows', 'form_textareaAttributes_autogrow', 'form_textareaAttributes_editor'}) do&lt;br /&gt;
		local name = mw.ustring.match(attr, '^form_textareaAttributes_(.+)$')&lt;br /&gt;
		contentClassConfig = contentClassConfig .. _processAttribute(self, attr, '\t\t', name)&lt;br /&gt;
	end&lt;br /&gt;
	contentClassConfig = contentClassConfig .. '\t},\n'&lt;br /&gt;
	contentClassConfig = contentClassConfig .. _processAttribute(self, 'form_fieldOrder', '\t')&lt;br /&gt;
	if coreData.form_customization then&lt;br /&gt;
		for line in mw.text.gsplit(coreData.form_customization, '\n', true) do&lt;br /&gt;
			contentClassConfig = contentClassConfig .. '\t' .. line .. '\n'&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	contentClassConfig = contentClassConfig .. '}\n\nlocal template = {\n'&lt;br /&gt;
	for _, attr in pairs(fieldlists.template) do&lt;br /&gt;
		if not Classgenerator.myTableTools.inTable(omissionList, attr) and self.class.myConfiguration.parameter[attr] then&lt;br /&gt;
			contentClassConfig = contentClassConfig .. _processAttribute(self, attr, '\t')&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if coreData.template_customization then&lt;br /&gt;
		for line in mw.text.gsplit(coreData.template_customization, '\n', true) do&lt;br /&gt;
			contentClassConfig = contentClassConfig .. '\t' .. mw.text.trim(line) .. '\n'&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	contentClassConfig = contentClassConfig .. '}\n\nlocal parameter = {\n' .. coreData.parameter_parameter .. '}\n\n' ..&lt;br /&gt;
		'return {\n' ..&lt;br /&gt;
		'\tform = form,\n' ..&lt;br /&gt;
		'\tglobal = global,\n' ..&lt;br /&gt;
		'\tparameter = parameter,\n' ..&lt;br /&gt;
		'\ttemplate = template,\n}\n'&lt;br /&gt;
	local classCategory = Classgenerator.globalConfig.classCategory or 'none'&lt;br /&gt;
	local formCategory = Classgenerator.globalConfig.formCategory or 'none'&lt;br /&gt;
	local gardeningCategory = Classgenerator.globalConfig.gardeningSuperCategory or 'none'&lt;br /&gt;
	local moduleCategory = Classgenerator.globalConfig.moduleCategory or 'none'&lt;br /&gt;
	local propertyCategory = Classgenerator.globalConfig.propertyCategory or 'none'&lt;br /&gt;
	local superCategory = Classgenerator.globalConfig.projectSuperCategory or 'none'&lt;br /&gt;
	local templateCategory = Classgenerator.globalConfig.templateCategory or 'none'&lt;br /&gt;
	local page = {}&lt;br /&gt;
	page.order = {'base', 'baseDoc', 'class', 'classDoc', 'config', 'configDoc', 'template', 'templateDoc'}&lt;br /&gt;
	page.base = {&lt;br /&gt;
		name = 'Module:' .. _private[self].pagename,&lt;br /&gt;
		content = mw.message.new('classengine-template-module-page'):rawParams(_private[self].pagename):plain()&lt;br /&gt;
	}&lt;br /&gt;
	page.baseDoc = {&lt;br /&gt;
		name = 'Module:' .. _private[self].pagename .. '/doc',&lt;br /&gt;
		content = mw.message.new('classengine-template-module-documentation-page'):rawParams(_private[self].pagename, moduleCategory):plain()&lt;br /&gt;
	}&lt;br /&gt;
	page.class = {&lt;br /&gt;
		name = 'Module:' .. _private[self].pagename .. '/class',&lt;br /&gt;
		content = mw.message.new('classengine-template-module-class-page'):rawParams(_private[self].pagename, coreData.className):plain()&lt;br /&gt;
	}&lt;br /&gt;
	page.classDoc = {&lt;br /&gt;
		name = 'Module:' .. _private[self].pagename .. '/class/doc',&lt;br /&gt;
		content = mw.message.new('classengine-template-module-class-documentation-page'):rawParams(_private[self].pagename, coreData.className, moduleCategory, classCategory):plain()&lt;br /&gt;
	}&lt;br /&gt;
	page.config = {&lt;br /&gt;
		name = 'Module:' .. _private[self].pagename .. '/config',&lt;br /&gt;
		content = contentClassConfig,&lt;br /&gt;
	}&lt;br /&gt;
	page.configDoc = {&lt;br /&gt;
		name = 'Module:' .. _private[self].pagename .. '/config/doc',&lt;br /&gt;
		content = mw.message.new('classengine-template-module-config-documentation-page'):rawParams(_private[self].pagename, moduleCategory, classCategory):plain()&lt;br /&gt;
	}&lt;br /&gt;
	page.template = {&lt;br /&gt;
		name = 'Template:' .. coreData.template_name,&lt;br /&gt;
		content = mw.message.new('classengine-template-template-page'):rawParams(_private[self].pagename):plain()&lt;br /&gt;
	}&lt;br /&gt;
	page.templateDoc = {&lt;br /&gt;
		name = 'Template:' .. coreData.template_name .. '/doc',&lt;br /&gt;
		content = mw.message.new('classengine-template-template-documentation-page'):rawParams(_private[self].pagename, templateCategory):plain()&lt;br /&gt;
	}&lt;br /&gt;
	if coreData.form_name and #coreData.form_name &amp;gt; 0 then&lt;br /&gt;
		table.insert(page.order, 'form')&lt;br /&gt;
		page.form = {&lt;br /&gt;
			name = 'Form:' .. coreData.form_name,&lt;br /&gt;
			content = mw.message.new('classengine-template-form-page'):rawParams(_private[self].pagename, formCategory):plain()&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
	if coreData.global_category and #coreData.global_category&amp;gt; 0 then&lt;br /&gt;
		table.insert(page.order, 'category')&lt;br /&gt;
		page.category = {&lt;br /&gt;
			name = 'Category:' .. coreData.global_category,&lt;br /&gt;
			content = mw.message.new('classengine-template-category-page'):rawParams(_private[self].pagename, superCategory):plain()&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
	if coreData.global_gardeningCategory and #coreData.global_gardeningCategory &amp;gt; 0 then&lt;br /&gt;
		table.insert(page.order, 'gardeningCategory')&lt;br /&gt;
		local pagename = coreData.global_gardeningCategory&lt;br /&gt;
		if pagename == 'superglobal.gardeningCategory' then&lt;br /&gt;
			pagename = FoundationClass.globalConfig.gardeningCategory&lt;br /&gt;
		end&lt;br /&gt;
		page.gardeningCategory = {&lt;br /&gt;
			name = 'Category:' .. pagename,&lt;br /&gt;
			content = mw.message.new('classengine-template-gardeningcategory-page'):rawParams(_private[self].pagename, gardeningCategory):plain()&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
	for _, pid in pairs(page.order) do&lt;br /&gt;
		local obj = mw.title.new(page[pid].name)&lt;br /&gt;
		page[pid].exists = obj.exists&lt;br /&gt;
		page[pid].namespace = obj.namespace&lt;br /&gt;
		page[pid].editlink = obj:fullUrl{action='edit'}&lt;br /&gt;
		if pid == 'template' then&lt;br /&gt;
			page[pid].recreatedata = obj:fullUrl{action='recreatedata'}&lt;br /&gt;
		end&lt;br /&gt;
		page[pid].isDocPage = (mw.ustring.sub(page[pid].name, -4) == '/doc')&lt;br /&gt;
		if page[pid].isDocPage then&lt;br /&gt;
			page[pid].content = page[pid].content .. '&amp;lt;h2&amp;gt;Maintenanace notes&amp;lt;/h2&amp;gt;\n' ..&lt;br /&gt;
				'This page was created by [[Module:Classgenerator]] and belongs to [[' .. self:getUid() .. ']].\n'&lt;br /&gt;
			if pid == 'configDoc' then&lt;br /&gt;
				page[pid].content = page[pid].content .. '\n{{((}}ombox| type=content | text = It is strongly advised, to not edit this page but to use [' ..&lt;br /&gt;
				'https://{{((}}SERVERNAME{{))}}{{((}}SCRIPTPATH{{))}}/Special:FormEdit/Classgenerator/' .. mw.uri.encode(self:getUid(), &amp;quot;PATH&amp;quot;) .. ' ' .. &lt;br /&gt;
					'the Classgenerator form] instead! After that, use your new configuration to replace the contents of this page.{{))}}'&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	local thisClass&lt;br /&gt;
	local thisConfig&lt;br /&gt;
	if page.class.exists and page.config.exists then&lt;br /&gt;
		thisClass = require(page.class.name)&lt;br /&gt;
		thisConfig = require(page.config.name)&lt;br /&gt;
	end&lt;br /&gt;
	if page.form and (not coreData.form_typeCreateLink or coreData.form_typeCreateLink ~= 'forminput') and coreData.form_createLinkPageName and mw.ustring.len(coreData.form_createLinkPageName) &amp;gt; 0 then&lt;br /&gt;
		local pageName = coreData.form_createLinkPageName&lt;br /&gt;
		if coreData.global_namespace and mw.ustring.len(coreData.global_namespace) &amp;gt; 0 and not mw.ustring.match(pageName, '^' .. coreData.global_namespace .. ':.+$') then&lt;br /&gt;
			pageName = coreData.global_namespace .. ':' .. pageName&lt;br /&gt;
		end&lt;br /&gt;
		local infostr = '{{((}}{info|page name=' .. pageName .. '|add title=' .. (coreData.form_labelCreate or 'create entity') .. '|edit title=' .. (coreData.form_labelEdit or 'edit entity') .. '}{{))}}'&lt;br /&gt;
		page.form.content = page.form.content .. '&amp;lt;!{{#invoke:String|rep|-|2}} this is a workaround, needed because of a SF bug: ' .. infostr ..&lt;br /&gt;
			'. see https://phabricator.wikimedia.org/T123230 for more information {{#invoke:String|rep|-|2}}&amp;gt;'&lt;br /&gt;
	end&lt;br /&gt;
	coreData.page = page&lt;br /&gt;
	local autocreate = {}&lt;br /&gt;
	autocreate.module = FoundationClass.myYesno(coreData.global_autocreate_module, tonumber(coreData.global_autocreate_module))&lt;br /&gt;
	autocreate.template = FoundationClass.myYesno(coreData.global_autocreate_template, tonumber(coreData.global_autocreate_template))&lt;br /&gt;
	autocreate.form = coreData.form_name and FoundationClass.myYesno(coreData.global_autocreate_form, tonumber(coreData.global_autocreate_form))&lt;br /&gt;
	autocreate.category = (coreData.global_category or coreData.global_gardeningCategory) and FoundationClass.myYesno(coreData.global_autocreate_category, tonumber(coreData.global_autocreate_category))&lt;br /&gt;
	if (FoundationClass.globalConfig.dataStore == 'both' or FoundationClass.globalConfig.dataStore == 'smw') and FoundationClass.myYesno(coreData.global_smwUseStorage) then&lt;br /&gt;
		local propertyNSName = _namespaceName(self, mw.title.new('NUL', 'Property').namespace)&lt;br /&gt;
		autocreate[propertyNSName] = FoundationClass.myYesno(coreData['global_autocreate_' .. propertyNSName], tonumber(coreData['global_autocreate_' .. propertyNSName]))&lt;br /&gt;
	end&lt;br /&gt;
	coreData.autocreate = autocreate&lt;br /&gt;
	local propertyData&lt;br /&gt;
	local propertyOrder&lt;br /&gt;
	if (FoundationClass.globalConfig.dataStore == 'both' or FoundationClass.globalConfig.dataStore == 'smw') and FoundationClass.myYesno(coreData.global_smwUseStorage) and thisClass and thisConfig then&lt;br /&gt;
		-- we use smw and class and config are created and accessible. we can get property information and prepare data&lt;br /&gt;
		local matrix = thisClass:smwGetProperty2ParameterTranslationTable()&lt;br /&gt;
		propertyData = {}&lt;br /&gt;
		propertyOrder = {}&lt;br /&gt;
		for property, parameter in pairs(matrix) do&lt;br /&gt;
			table.insert(propertyOrder, property)&lt;br /&gt;
			local obj = mw.title.new(property, 'Property')&lt;br /&gt;
			propertyData[property] = { &lt;br /&gt;
				editlink = obj:fullUrl{action='edit'},&lt;br /&gt;
				exists = obj.exists,&lt;br /&gt;
				parameter = parameter,&lt;br /&gt;
			}&lt;br /&gt;
			if thisConfig.parameter[parameter] then&lt;br /&gt;
				propertyData[property].description = thisConfig.parameter[parameter].description&lt;br /&gt;
				propertyData[property].type = thisConfig.parameter[parameter].property_type&lt;br /&gt;
				propertyData[property].values = thisConfig.parameter[parameter].values&lt;br /&gt;
			elseif parameter == FoundationClass.globalConfig.smwClassProperty then&lt;br /&gt;
				propertyData[property].description = 'Automatisch hinzugefügt! Wird verwendet, um Mitglieder dieser Klasse zu finden (funktioniert auch, ohne dass eine Kategorie definiert wird und auch fur subobjects)'&lt;br /&gt;
				propertyData[property].type = 'Text'&lt;br /&gt;
			elseif parameter == FoundationClass.globalConfig.uidFieldName then&lt;br /&gt;
				propertyData[property].description = 'Automatisch hinzugefügt! Wird verwendet, um individuelle Objekte innerhalb der Klasse zu identifizieren.'&lt;br /&gt;
				propertyData[property].type = 'Text'&lt;br /&gt;
			end&lt;br /&gt;
			local values = ''&lt;br /&gt;
			if propertyData[property].values then&lt;br /&gt;
				values = values .. 'The allowed values are:'&lt;br /&gt;
				for _, value in pairs(propertyData[property].values) do&lt;br /&gt;
					values = values .. '\n* [[Allows value::' .. value .. ']]'&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				values = 'No restriction given'&lt;br /&gt;
			end&lt;br /&gt;
			propertyData[property].content = mw.message.new('classengine-template-property-page'):rawParams(propertyData[property].description, propertyData[property].type, values, propertyCategory):plain()&lt;br /&gt;
		end&lt;br /&gt;
		table.sort(propertyOrder)&lt;br /&gt;
	end&lt;br /&gt;
	coreData.properties = { data = propertyData, order = propertyOrder }&lt;br /&gt;
	return coreData	-- this is your new coreData.&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Classgenerator:myPlausibilityTest(args)&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator:myPlausibilityTest(args) to test arguments, from ' .. tostring(self))&lt;br /&gt;
	-- function that performs the individual plausibility tests&lt;br /&gt;
	-- note: before you access a field args.fieldname you should check for existance&lt;br /&gt;
	-- self:addError(text)&lt;br /&gt;
	return false	-- return value will be ignored. but if you add any error, the object's initialization will fail with the error&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Classgenerator:myStashAdjustments(stash)&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator:myStashAdjustments(stash) to do some minor adjustments on data before storing, from ' .. tostring(self))&lt;br /&gt;
	-- function that alters the stash before storing the data&lt;br /&gt;
	local stash = stash&lt;br /&gt;
	return stash	-- this is your new stash. this will be stored. it has format (fieldname: value)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Classgenerator:method()&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator:method() to do something, from ' .. tostring(self))&lt;br /&gt;
	return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return Classgenerator&lt;/div&gt;</summary>
		<author><name>Anatol</name></author>
	</entry>
	<entry>
		<id>https://camnet.oetterer.eu/index.php?title=Modul:Classgenerator/class&amp;diff=1009</id>
		<title>Modul:Classgenerator/class</title>
		<link rel="alternate" type="text/html" href="https://camnet.oetterer.eu/index.php?title=Modul:Classgenerator/class&amp;diff=1009"/>
		<updated>2016-02-09T21:04:34Z</updated>

		<summary type="html">&lt;p&gt;Anatol: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local FoundationClass = require('Module:Foundationclass')&lt;br /&gt;
local ClassDebug = require('Module:Debug/class')&lt;br /&gt;
&lt;br /&gt;
-- ****************************************************************&lt;br /&gt;
-- *                         inheritance                          *&lt;br /&gt;
-- ****************************************************************&lt;br /&gt;
local Classgenerator = FoundationClass:subclass('Classgenerator')&lt;br /&gt;
-- setting class's configuration data&lt;br /&gt;
Classgenerator.static.myConfiguration = mw.loadData('Module:Classgenerator/config')&lt;br /&gt;
--   being in a static method, use self.myConfiguration&lt;br /&gt;
--   being in a private method, that knows self or in a public method, use self.class.myConfiguration&lt;br /&gt;
&lt;br /&gt;
-- ****************************************************************&lt;br /&gt;
-- *                          properties                          *&lt;br /&gt;
-- ****************************************************************&lt;br /&gt;
&lt;br /&gt;
-- **************** initialization of table for private properties&lt;br /&gt;
local _private = setmetatable({}, {__mode = 'k'})   -- weak table storing all private attributes&lt;br /&gt;
&lt;br /&gt;
-- **************** declaration of public static properties&lt;br /&gt;
-- Classgenerator.static.myPropertyModule = require('Module:extern')&lt;br /&gt;
-- Classgenerator.static.staticProperty = 'value'&lt;br /&gt;
&lt;br /&gt;
-- remember the static classes provided by Foundationclass:&lt;br /&gt;
-- Classgenerator.globalConfig&lt;br /&gt;
-- Classgenerator.myCargoUtil&lt;br /&gt;
-- Classgenerator.myTableTools&lt;br /&gt;
&lt;br /&gt;
-- **************** declaration of (global) private properties&lt;br /&gt;
-- for properties you should rather use constructor and _private[self]. this only, if you need a private class property&lt;br /&gt;
-- you should, however predeclare private methods here&lt;br /&gt;
local _debug	-- private method declared later&lt;br /&gt;
local _privateMethodAhead	-- declaration ahead, so this private method can be used in the constructor and in other private methods&lt;br /&gt;
&lt;br /&gt;
-- ***************************************************************&lt;br /&gt;
-- *                           methods                           *&lt;br /&gt;
-- ***************************************************************&lt;br /&gt;
 &lt;br /&gt;
-- **************** declaration of static methods&lt;br /&gt;
function Classgenerator:initialize(uid)&lt;br /&gt;
	local _CFG = self.class.myConfiguration&lt;br /&gt;
	FoundationClass.initialize(self, uid)&lt;br /&gt;
	local page = mw.title.getCurrentTitle().text&lt;br /&gt;
	if uid and mw.ustring.match(uid, '^' .. _CFG.global.namespace .. ':.+$') then&lt;br /&gt;
		page = mw.ustring.match(uid, '^' .. _CFG.global.namespace .. ':(.+)$')&lt;br /&gt;
	end&lt;br /&gt;
	_private[self] = {&lt;br /&gt;
		dbg = ClassDebug:new(tostring(self.class) .. ': id ' .. uid),&lt;br /&gt;
		pagename = page&lt;br /&gt;
	}&lt;br /&gt;
	_debug(self, 1, ' Classgenerator: done initializing object &amp;amp;quot;' .. uid ..'&amp;amp;quot;, from ' .. tostring(self))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- use use self.myConfiguration to access your configuration in a static method&lt;br /&gt;
function Classgenerator.static:aStaticMethod(var)&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator.static:aStaticMethod() to do something, from ' .. tostring(self))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Classgenerator.static:mySfDynamicFieldAttribute(fieldname, attribute, value)&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator.static:mySfDynamicFieldAttribute(fieldname, attribute, value), from ' .. tostring(self))&lt;br /&gt;
	_debug(self, 2, ' with parameters &amp;amp;quot;' .. fieldname .. '&amp;amp;quot;, &amp;amp;quot;' .. attribute .. '&amp;amp;quot; and a ' .. type(value) .. ' value')&lt;br /&gt;
	-- function that can process any attribute/value pair just before rendering the semantic forms field&lt;br /&gt;
	-- usually done, to generate a dynamic 'default' value&lt;br /&gt;
	-- keep in mind: you can completely disable a form field, if you return true on attribute &amp;quot;disable&amp;quot;. note however, that this causes the field to not show at all, no data will be transported/saved&lt;br /&gt;
	local pagename = mw.title.getCurrentTitle().rootText&lt;br /&gt;
	local val = value&lt;br /&gt;
	if Classgenerator.myTableTools.inTable({'template_name', 'global_entityTitle'}, fieldname) and attribute == 'default' then&lt;br /&gt;
		val = pagename&lt;br /&gt;
	end&lt;br /&gt;
	if fieldname == 'global_cargoTable' and attribute == 'default' then&lt;br /&gt;
		val = mw.ustring.lower(pagename)&lt;br /&gt;
	end&lt;br /&gt;
	if Classgenerator.globalConfig.dataStore ~= 'cargo' and Classgenerator.globalConfig.dataStore ~= 'both' then&lt;br /&gt;
		if fieldname == 'global_cargoTable' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
		if fieldname == 'global_cargoUidFieldname' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if Classgenerator.globalConfig.dataStore ~= 'smw' and Classgenerator.globalConfig.dataStore ~= 'both' then&lt;br /&gt;
		if fieldname == 'global_smwIsSubobject' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
		if fieldname == 'global_smwUseStorage' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
		if fieldname == 'global_autocreate_property' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return val	-- this value will be used as new value for field's attribute&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Classgenerator.static:sfGenerateForm()&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator.static:sfGenerateForm(), from ' .. tostring(self))&lt;br /&gt;
	local _CFG = self.myConfiguration&lt;br /&gt;
	local ClassgeneratorParameter  = require('Module:Classgenerator/parameter/class')&lt;br /&gt;
	local ClassSFfield = require('Module:SFfield/class')&lt;br /&gt;
	local tagStart = '{{{'&lt;br /&gt;
	local tagEnd = '}}}'&lt;br /&gt;
	local frame = mw.getCurrentFrame()&lt;br /&gt;
	-- create the form header&lt;br /&gt;
	local notification = mw.html.create('')&lt;br /&gt;
	if _CFG.form.notification and mw.ustring.len(_CFG.form.notification) &amp;gt; 0 then&lt;br /&gt;
		local mbox = require('Module:Message box')&lt;br /&gt;
		notification:wikitext(mbox.main('ombox', { text = _CFG.form.notification }))&lt;br /&gt;
			:newline()&lt;br /&gt;
	end&lt;br /&gt;
	local formheader = mw.html.create('')&lt;br /&gt;
	formheader:wikitext(self:sfGenerateFormInfoTag())&lt;br /&gt;
		:wikitext('&amp;lt;h2&amp;gt;' .. _CFG.global.entityTitle .. '&amp;lt;/h2&amp;gt;')&lt;br /&gt;
		:tag('p')&lt;br /&gt;
			:wikitext(_CFG.form.headerText)&lt;br /&gt;
			:done()&lt;br /&gt;
			:newline()&lt;br /&gt;
		:node(notification)&lt;br /&gt;
		:tag('div')&lt;br /&gt;
			:attr('id', 'wikiPreview')&lt;br /&gt;
			:cssText('display: none; padding-bottom: 25px; margin-bottom: 25px; border-bottom: 1px solid #AAAAAA;')&lt;br /&gt;
			:done()&lt;br /&gt;
			:newline()&lt;br /&gt;
	-- create the form buttons&lt;br /&gt;
	local formbuttons = mw.html.create('div')&lt;br /&gt;
	for _, button in pairs(_CFG.form.buttons) do&lt;br /&gt;
		formbuttons:wikitext(tagStart .. 'standard input&amp;amp;#124;' .. button .. tagEnd)&lt;br /&gt;
	end&lt;br /&gt;
	formbuttons:addClass('formbuttons')&lt;br /&gt;
		:done()&lt;br /&gt;
	-- calculate the fieldlists:&lt;br /&gt;
	local fieldlists = {}&lt;br /&gt;
	for _, field in pairs(_CFG.form.fieldOrder) do&lt;br /&gt;
		local tab = mw.ustring.match(field, '^([a-z]+)_.+')&lt;br /&gt;
		if not fieldlists[tab] then&lt;br /&gt;
			fieldlists[tab] = {}&lt;br /&gt;
		end&lt;br /&gt;
		table.insert(fieldlists[tab], field)&lt;br /&gt;
	end&lt;br /&gt;
	-- assemble everything, so start the html object&lt;br /&gt;
	local html = mw.html.create('div')&lt;br /&gt;
	html:node(formheader)&lt;br /&gt;
		:wikitext('&amp;lt;h1&amp;gt;GLOBAL-Section&amp;lt;/h1&amp;gt;')&lt;br /&gt;
		:newline()&lt;br /&gt;
		:tag('div')&lt;br /&gt;
			:wikitext('This section deals with all the class\'s global data, i.e. all data you need for your &amp;quot;template&amp;quot; part as wenn as for your form, ... ')&lt;br /&gt;
			:done()&lt;br /&gt;
			:newline()&lt;br /&gt;
		:wikitext(tagStart .. 'for template|' .. _CFG.template.name .. '|label=' .. _CFG.global.entityTitle .. tagEnd)&lt;br /&gt;
		:newline()&lt;br /&gt;
		:node(self:sfGenerateFormTable(fieldlists.global))&lt;br /&gt;
		:newline()&lt;br /&gt;
		:wikitext('&amp;lt;h1&amp;gt;FORM-Section&amp;lt;/h1&amp;gt;')&lt;br /&gt;
		:newline()&lt;br /&gt;
		:tag('div')&lt;br /&gt;
			:wikitext('This section deals with all the data, you need to create and operate a form for this class. If you don\'t want a form, disable this section. ' ..&lt;br /&gt;
					'If you need a form (e.g. as part of another form), but no form page, enable this section but leave the field for form page name emtpy.')&lt;br /&gt;
			:done()&lt;br /&gt;
			:newline()&lt;br /&gt;
		:node(self:sfGenerateFormTable(fieldlists.form))&lt;br /&gt;
		:newline()&lt;br /&gt;
		:wikitext('&amp;lt;h1&amp;gt;TEMPLATE-Section&amp;lt;/h1&amp;gt;')&lt;br /&gt;
		:newline()&lt;br /&gt;
		:tag('div')&lt;br /&gt;
			:wikitext('This section deals with all the data, you need to create and operate a template for this class. If you need tempalte specific parameters ' ..&lt;br /&gt;
				'(meaning parameteres that you only need to operate the &amp;quot;action&amp;quot;-part), put them into this section\'s custom field')&lt;br /&gt;
			:done()&lt;br /&gt;
			:newline()&lt;br /&gt;
		:node(self:sfGenerateFormTable(fieldlists.template))&lt;br /&gt;
		:newline()&lt;br /&gt;
		:wikitext('&amp;lt;h1&amp;gt;PARAMETERS-Section&amp;lt;/h1&amp;gt;')&lt;br /&gt;
		:newline()&lt;br /&gt;
		:tag('div')&lt;br /&gt;
			:wikitext('This section deals with all your parameters. You need an entry for every form input field, every template parameter, every data field you want to store, and even every notification line.')&lt;br /&gt;
			:tag('ul')&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(&amp;quot;To produce a normal parameter, add an entry, choose storage type, set '''Regular form parameter''' to yes, choose a form input type, and a template doc type.&amp;quot;)&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(&amp;quot;If you want a data field to be stored in your data storage but not defined in the form, choose a data storage type and set '''Regular form parameter''' to no. &amp;quot;)&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(&amp;quot;If you want a mutiple template to be parsed to a parameter, create a normal parameter (as described above) and choose '''Regular form parameter''' to  be ''Holds template''.&amp;quot;)&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(&amp;quot;A parameter with a form input that is not stored is created like a regular parameter but without setting any data storage type.&amp;quot;)&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(&amp;quot;Finally, you can create a message line. This is useful, if you want to convey any information to the user, that is to important for a description-tooltip. &amp;quot; ..&lt;br /&gt;
						&amp;quot;What you need to do is disable everything ('''Template doc parameter type ''', data storage) and set '''Regular form parameter''' to ''Information''. &amp;quot; ..&lt;br /&gt;
						&amp;quot;You probalby want to add the parameter to one or more ''show on select'' entries, too.&amp;quot;)&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
				:done()&lt;br /&gt;
				:newline()&lt;br /&gt;
			:done()&lt;br /&gt;
			:newline()&lt;br /&gt;
		:node(self:sfInitField('parameter_parameter'):render())&lt;br /&gt;
		:newline()&lt;br /&gt;
		:wikitext(frame:extensionTag('headertabs'))&lt;br /&gt;
		:newline()&lt;br /&gt;
		:wikitext(&amp;quot;'''(*) Pflichtfeld'''&amp;quot;)&lt;br /&gt;
		:newline()&lt;br /&gt;
		:wikitext(tagStart .. 'end template' .. tagEnd)&lt;br /&gt;
		:newline()&lt;br /&gt;
		:wikitext(ClassgeneratorParameter:sfGenerateForm())&lt;br /&gt;
		:newline()&lt;br /&gt;
		:node(formbuttons)&lt;br /&gt;
	local debugLevel = FoundationClass.globalConfig.debugLevel or self.myConfiguration.global.debugLevel&lt;br /&gt;
	if debugLevel then&lt;br /&gt;
		html:newline()&lt;br /&gt;
			:newline()&lt;br /&gt;
			:wikitext(ClassDebug:printLog(debugLevel))&lt;br /&gt;
	end&lt;br /&gt;
	return html&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- **************** declaration of private methods&lt;br /&gt;
-- use self.class.myConfiguration to access your configuration in a public or a private method that is called by a public method&lt;br /&gt;
_debug = function (self, level, text)&lt;br /&gt;
	if _private[self] and _private[self].dbg then&lt;br /&gt;
		local debugLevel = FoundationClass.globalConfig.debugLevel or self.class.myConfiguration.global.debugLevel&lt;br /&gt;
		if debugLevel and level &amp;lt;= debugLevel then&lt;br /&gt;
			_private[self].dbg:log(level, text)&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		local debugLevel = FoundationClass.globalConfig.debugLevel or self.myConfiguration.global.debugLevel&lt;br /&gt;
		if debugLevel and level &amp;lt;= debugLevel then&lt;br /&gt;
			ClassDebug:log(level, text, tostring(self) .. '.static')&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local _namespaceName = function (self, namespaceId)&lt;br /&gt;
	_debug(self, 1, 'entering private _namespaceName() to translate namespace namespaceId ' .. namespaceId .. ' into a universal name, from ' .. tostring(self))&lt;br /&gt;
	local ret, nulProperty = pcall(mw.title.new, 'NUL', 'Property')&lt;br /&gt;
	if ret and (namespaceId == nulProperty.namespace) then&lt;br /&gt;
		return 'property'	-- if you change this, check on other places, this is checked against and change that, too&lt;br /&gt;
	else&lt;br /&gt;
		return mw.site.namespaces[namespaceId].canonicalName&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local _processAttribute = function (self, attr, indent, name)&lt;br /&gt;
	_debug(self, 1, 'entering private _processAttribute() to print a line for attribute ' .. attr .. ', from ' .. tostring(self))&lt;br /&gt;
	local coreData = self:getCoreData()&lt;br /&gt;
	local attr = attr&lt;br /&gt;
	local val = coreData[attr]&lt;br /&gt;
	if type(val) == 'boolean' then&lt;br /&gt;
		val = val and 'true' or 'false'&lt;br /&gt;
	end&lt;br /&gt;
	local ret = ''&lt;br /&gt;
	local fieldname = mw.ustring.match(attr, '^[^_]+_(.+)$')&lt;br /&gt;
	ret = indent .. (name and name or fieldname) .. ' = '&lt;br /&gt;
	if not val then&lt;br /&gt;
		ret = ret .. 'nil'&lt;br /&gt;
	elseif type(val) == 'table' then&lt;br /&gt;
		ret = ret .. Classgenerator.myTableTools.printTable(val, 'inline')&lt;br /&gt;
	elseif val == 'true' or val == 'false' or mw.ustring.match(val, '^[0-9]+$') or (attr == 'global_gardeningCategory' and val == 'superglobal.gardeningCategory') then&lt;br /&gt;
		ret = ret .. val&lt;br /&gt;
	else&lt;br /&gt;
		ret = ret .. &amp;quot;'&amp;quot; .. mw.ustring.gsub(mw.ustring.gsub(mw.ustring.gsub(val, &amp;quot;\\'&amp;quot;, &amp;quot;'&amp;quot;), &amp;quot;'&amp;quot;, &amp;quot;\\'&amp;quot;), '\n', '\\n\' ..\n' .. indent .. '\t\'') .. &amp;quot;'&amp;quot;	-- the gsub catches multiline input from textareas&lt;br /&gt;
	end&lt;br /&gt;
	ret = ret .. ','&lt;br /&gt;
	if self.class.myConfiguration.template.addCommentsToConfig then&lt;br /&gt;
		ret = ret .. '\t-- ' .. self.class.myConfiguration.parameter[attr].description&lt;br /&gt;
	end&lt;br /&gt;
	ret = ret .. '\n'&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local _privateMethod = function (self)&lt;br /&gt;
	_debug(self, 1, 'entering private _privateMethod() to do something, from ' .. tostring(self))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- **************** declaration of public methods&lt;br /&gt;
-- use self.class.myConfiguration to access your configuration in a public method&lt;br /&gt;
function Classgenerator:addInfobox()&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator:addInfobox(), from ' .. tostring(self))&lt;br /&gt;
	if self:goodToGo() then&lt;br /&gt;
		local _CFG = self.class.myConfiguration&lt;br /&gt;
		local coreData = self:getCoreData()&lt;br /&gt;
		local usesSmw = FoundationClass.globalConfig.dataStore and (FoundationClass.globalConfig.dataStore == 'both' or FoundationClass.globalConfig.dataStore == 'smw') and FoundationClass.myYesno(coreData.global_smwUseStorage)&lt;br /&gt;
		local ib_args = {&lt;br /&gt;
			bodyclass = 'infobox_name',&lt;br /&gt;
			aboveclass = 'objtitle titletext',&lt;br /&gt;
			headerclass = 'headertext',&lt;br /&gt;
			labelstyle = 'width: 30%;',&lt;br /&gt;
			datastyle = 'width: 70%;',&lt;br /&gt;
			title = coreData.className,&lt;br /&gt;
			subheader = 'Class',&lt;br /&gt;
			label1 = 'Title',&lt;br /&gt;
			data1 = coreData.global_entityTitle and coreData.global_entityTitle or '',&lt;br /&gt;
			label2 = _CFG.parameter.global_edit_timestamp.label,&lt;br /&gt;
			data2 = coreData.last_edited,&lt;br /&gt;
			label3 = 'Store available',&lt;br /&gt;
			data3 = (FoundationClass.globalConfig.dataStore and mw.ustring.len(FoundationClass.globalConfig.dataStore) &amp;gt; 0) and FoundationClass.globalConfig.dataStore or '',&lt;br /&gt;
			label5 = 'Cargo table',&lt;br /&gt;
			data5 = (FoundationClass.globalConfig.dataStore and (FoundationClass.globalConfig.dataStore == 'both' or FoundationClass.globalConfig.dataStore == 'cargo')) and coreData.global_cargoTable or '',&lt;br /&gt;
			label6 = 'Smw class',&lt;br /&gt;
			data6 = usesSmw and _private[self].pagename or '',&lt;br /&gt;
			data7 = coreData.global_description,&lt;br /&gt;
			header10 = 'Pages',&lt;br /&gt;
			label12 = 'Module',&lt;br /&gt;
			data12 = _private[self].pagename and '[[Module:' .. _private[self].pagename .. ']]' or '',&lt;br /&gt;
			label13 = 'Class',&lt;br /&gt;
			data13 = _private[self].pagename and '[[Module:' .. _private[self].pagename .. '/class]]' or '',&lt;br /&gt;
			label14 = 'Config',&lt;br /&gt;
			data14 = _private[self].pagename and '[[Module:' .. _private[self].pagename .. '/config]]' or '',&lt;br /&gt;
			label17 = 'Template',&lt;br /&gt;
			data17 = coreData.template_name and '[[Template:' .. coreData.template_name .. ']]' or '',&lt;br /&gt;
			label19 = 'Form',&lt;br /&gt;
			data19 = coreData.page.form and '[[:' .. coreData.page.form.name .. ']]' or '',&lt;br /&gt;
			label21 = 'Category',&lt;br /&gt;
			data21 = coreData.page.category and '[[:' .. coreData.page.category.name .. ']]' or '',&lt;br /&gt;
			label22 = 'Gardening',&lt;br /&gt;
			data22 = coreData.page.gardeningCategory and '[[:' .. coreData.page.gardeningCategory.name .. ']]' or '',&lt;br /&gt;
		}&lt;br /&gt;
		if usesSmw and coreData.properties.order and #coreData.properties.order &amp;gt; 0 then&lt;br /&gt;
			ib_args.header30 = 'Properties'&lt;br /&gt;
			local i = 31&lt;br /&gt;
			for _, property in pairs(coreData.properties.order) do&lt;br /&gt;
				ib_args['label' .. i] = coreData.properties.data[property].type&lt;br /&gt;
				ib_args['data' .. i] = '[[Property:' .. property .. '|' .. property .. ']]'&lt;br /&gt;
				i = i + 1&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		self:addOutput(require('Module:Infobox').infobox(ib_args))&lt;br /&gt;
		return true&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Classgenerator:addPageBody()&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator:addPageBody(), from ' .. tostring(self))&lt;br /&gt;
	_debug(self, 2, ' rendering errors and warnings and adding them to output')&lt;br /&gt;
	self:addOutput(self:renderErrors())&lt;br /&gt;
	self:addOutput(self:renderWarnings())&lt;br /&gt;
	if self:goodToGo() then&lt;br /&gt;
		local frame = mw.getCurrentFrame()&lt;br /&gt;
		local lang = mw.language.new('en-gb')&lt;br /&gt;
		local _CFG = self.class.myConfiguration&lt;br /&gt;
		local coreData = self:getCoreData()&lt;br /&gt;
		-- start&lt;br /&gt;
		local widthTh = '300px'&lt;br /&gt;
		local widthTd = '200px'&lt;br /&gt;
		-- build the page status table&lt;br /&gt;
		-- first the two status table cells &amp;quot;green&amp;quot; and &amp;quot;red&amp;quot;&lt;br /&gt;
		local imgYes = '[[File:Yes check.png|13px|alt=Yes|link=]]'&lt;br /&gt;
		local imgNo = '[[File:X mark.png|13px|alt=No|link=]]'&lt;br /&gt;
		local tdYa = mw.html.create('td')&lt;br /&gt;
		tdYa:cssText('background: #90ff90; color:black; vertical-align: middle; text-align: center; width:' .. widthTd)&lt;br /&gt;
			:addClass('table-yes')&lt;br /&gt;
			:wikitext(imgYes)&lt;br /&gt;
		local tdNa = mw.html.create('td')&lt;br /&gt;
		tdNa:cssText('background: #FF9090; color:black; vertical-align: middle; text-align: center; width:' .. widthTd)&lt;br /&gt;
			:addClass('table-no')&lt;br /&gt;
			:wikitext(imgNo)&lt;br /&gt;
		local classExists = coreData.page.class.exists and coreData.page.config.exists&lt;br /&gt;
		local modulesExist = coreData.page.base.exists and classExists&lt;br /&gt;
		local thisClass&lt;br /&gt;
		local thisConfig&lt;br /&gt;
		if classExists then&lt;br /&gt;
			thisClass = require(coreData.page.class.name)&lt;br /&gt;
			thisConfig = require(coreData.page.config.name)&lt;br /&gt;
		end&lt;br /&gt;
		local thisUsesCargo = (FoundationClass.globalConfig.dataStore == 'both' or FoundationClass.globalConfig.dataStore == 'cargo') and coreData.global_cargoTable and #coreData.global_cargoTable &amp;gt; 0&lt;br /&gt;
		local thisUsesSmw = (FoundationClass.globalConfig.dataStore == 'both' or FoundationClass.globalConfig.dataStore == 'smw') and FoundationClass.myYesno(coreData.global_smwUseStorage)&lt;br /&gt;
		-- write the 2do checklist&lt;br /&gt;
		local done = true&lt;br /&gt;
		local step1&lt;br /&gt;
		local step2&lt;br /&gt;
		local step3&lt;br /&gt;
		if modulesExist then&lt;br /&gt;
			step1 = imgYes .. ' You created all your modules'&lt;br /&gt;
		else&lt;br /&gt;
			done = false&lt;br /&gt;
			step1 = imgNo .. ' You have to create your module pages. This, you have to do &amp;lt;b&amp;gt;manually&amp;lt;/b&amp;gt;. Go to [[#Page contents|section Page contents]], copy the module content and edit the corresponding module, ' ..&lt;br /&gt;
				'pasting all the copied content. Save and close. You have to do this for the following module(s): &amp;lt;ul&amp;gt; ' ..&lt;br /&gt;
				(not coreData.page.base.exists and '&amp;lt;li&amp;gt;[[#Page contents|' .. coreData.page.base.name .. ']]&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
				(not coreData.page.class.exists and '&amp;lt;li&amp;gt;[[#Page contents|' .. coreData.page.class.name .. ']]&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
				(not coreData.page.config.exists and '&amp;lt;li&amp;gt;[[#Page contents|' .. coreData.page.config.name .. ']]&amp;lt;/li&amp;gt;' or '') .. '&amp;lt;/ul&amp;gt;'&lt;br /&gt;
		end&lt;br /&gt;
		if coreData.page.baseDoc.exists and coreData.page.classDoc.exists and coreData.page.configDoc.exists and coreData.page.template.exists and coreData.page.templateDoc.exists and&lt;br /&gt;
				(not coreData.page.form or coreData.page.form.exists) and (not coreData.page.category or coreData.page.category.exists) and (not coreData.page.gardeningCategory or coreData.page.gardeningCategory.exists) then&lt;br /&gt;
			step2 = imgYes .. ' You created all auxilliary pages'&lt;br /&gt;
		else&lt;br /&gt;
			done = false&lt;br /&gt;
			step2 = imgNo .. ' You have to create auxilliary pages. This, you can do &amp;lt;b&amp;gt;automatically&amp;lt;/b&amp;gt;. Go to [[#Page autocreation|section Page autocreation]], hit the corresponding &amp;quot;Create&amp;quot;-button or ' ..&lt;br /&gt;
				'create all pages at once. Please do this for the following page(s): &amp;lt;ul&amp;gt; ' ..&lt;br /&gt;
				(not (coreData.page.baseDoc.exists or coreData.page.classDoc.exists or coreData.page.configDoc.exists) and '&amp;lt;li&amp;gt;Module documentation pages&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
				(not (coreData.page.template.exists or coreData.page.templateDoc.exists) and '&amp;lt;li&amp;gt;Template and/or template documentation page&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
				((coreData.page.form and not coreData.page.form.exists) and '&amp;lt;li&amp;gt;Form page&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
				(((coreData.page.category and not coreData.page.category.exists) or (coreData.page.gardeningCategory and not coreData.page.gardeningCategory.exists)) and '&amp;lt;li&amp;gt;Category page(s)&amp;lt;/li&amp;gt;' or '') .. '&amp;lt;/ul&amp;gt;'&lt;br /&gt;
		end&lt;br /&gt;
		local storeCargoInstruction&lt;br /&gt;
		local allPropertiesThere&lt;br /&gt;
		local cargoTableCreateLink = false&lt;br /&gt;
		if thisUsesCargo then&lt;br /&gt;
			-- we actually use cargo. check, if cargo table is there or throws an error? if all right, then yes, else instruction above&lt;br /&gt;
			if modulesExist and coreData.page.template.exists then&lt;br /&gt;
				cargoTableCreateLink = true&lt;br /&gt;
				attr = { limit = 1, default = '' }&lt;br /&gt;
				attr['more results text'] = ''&lt;br /&gt;
				local tableEntryId = mw.text.trim(mw.text.unstrip(FoundationClass.myCargoUtil.rawquery({tables = coreData.global_cargoTable, fields = {'_ID'}}, attr)))&lt;br /&gt;
				if mw.ustring.match(mw.text.trim(tableEntryId), '^[0-9]*$') then&lt;br /&gt;
					storeCargoInstruction = imgYes .. ' Your cargo table does exist! (Note: When you change your cargo table\'s declaration, you need to [[#Page autocreation|rebuild it]], though)'&lt;br /&gt;
				else&lt;br /&gt;
					done = false&lt;br /&gt;
					storeCargoInstruction = imgNo .. ' Please [[#Page autocreation|create your cargo table]]!'&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				done = false&lt;br /&gt;
				storeCargoInstruction = imgNo .. ' To be able to create your cargo table, you have to create the following page(s): &amp;lt;ul&amp;gt;' ..&lt;br /&gt;
					(not coreData.page.base.exists and '&amp;lt;li&amp;gt;' .. coreData.page.base.name .. '&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
					(not coreData.page.class.exists and '&amp;lt;li&amp;gt;' .. coreData.page.class.name .. '&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
					(not coreData.page.config.exists and '&amp;lt;li&amp;gt;' .. coreData.page.config.name .. '&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
					(not coreData.page.template.exists and '&amp;lt;li&amp;gt;' .. coreData.page.template.name .. '&amp;lt;/li&amp;gt;' or '') .. '&amp;lt;/ul&amp;gt;'&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if thisUsesSmw then&lt;br /&gt;
			-- we actually use smw. check, if all properties are present? if all right, then yes, else instruction above&lt;br /&gt;
			if coreData.properties and coreData.properties.data and FoundationClass.myTableTools.size(coreData.properties.data) &amp;gt; 0 then&lt;br /&gt;
				allPropertiesThere = true&lt;br /&gt;
				for property, propertyData in pairs(coreData.properties.data) do&lt;br /&gt;
					allPropertiesThere = allPropertiesThere and propertyData.exists&lt;br /&gt;
				end&lt;br /&gt;
				if allPropertiesThere then&lt;br /&gt;
					storeSwmInstruction = imgYes .. ' All your property pages are present and accounted for!'&lt;br /&gt;
				else&lt;br /&gt;
					done = false&lt;br /&gt;
					storeSwmInstruction = imgNo .. ' Please &amp;lt;b&amp;gt;[[#Page autocreation|autocreate]]&amp;lt;/b&amp;gt; your properties! The following are missing: &amp;lt;ul&amp;gt;'&lt;br /&gt;
					for _, property in pairs(coreData.properties.order) do&lt;br /&gt;
						local pdata = coreData.properties.data[property]&lt;br /&gt;
						if not pdata or not pdata.exists then&lt;br /&gt;
							storeSwmInstruction = storeSwmInstruction .. '&amp;lt;li&amp;gt;[[Property:' .. property .. ']]&amp;lt;/li&amp;gt;'&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
					storeSwmInstruction = storeSwmInstruction .. '&amp;lt;/ul&amp;gt;'&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				done = false&lt;br /&gt;
				storeSwmInstruction = imgNo .. ' To be able to create your smw properties, you have to create the following page(s): &amp;lt;ul&amp;gt;' ..&lt;br /&gt;
					(not coreData.page.class.exists and '&amp;lt;li&amp;gt;' .. coreData.page.class.name .. '&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
					(not coreData.page.config.exists and '&amp;lt;li&amp;gt;' .. coreData.page.config.name .. '&amp;lt;/li&amp;gt;' or '') .. '&amp;lt;/ul&amp;gt;'&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if storeCargoInstruction or storeSwmInstruction then&lt;br /&gt;
			if storeCargoInstruction and storeSwmInstruction then&lt;br /&gt;
				step3 = 'Your class used cargo AND smw store. You have to create both data stores: &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;' .. storeCargoInstruction .. '&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;' .. storeSwmInstruction .. '&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;'&lt;br /&gt;
			else&lt;br /&gt;
				step3 = storeCargoInstruction or storeSwmInstruction&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			step3 = imgYes .. ' This class does not use a data store. Nothing to be done here!'&lt;br /&gt;
		end&lt;br /&gt;
		local step4 = done and imgYes .. ' You are done. Remember, when you want to change parameters in your config, edit this page and write your [' .. coreData.page.config.editlink .. ' config file] new' or &lt;br /&gt;
			imgNo .. ' You are not finished yet, please tend to your tasks.'&lt;br /&gt;
		local manual = mw.html.create('')&lt;br /&gt;
		manual:wikitext('&amp;lt;h2&amp;gt;Your 2do checklist&amp;lt;/h2&amp;gt;')&lt;br /&gt;
			:tag('ol')&lt;br /&gt;
				:cssText('margin: 0.3em 0 0 1.6em; padding: 0')&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(step1)&lt;br /&gt;
					:done()&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(step2)&lt;br /&gt;
					:done()&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(step3)&lt;br /&gt;
					:done()&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(step4)&lt;br /&gt;
					:done()&lt;br /&gt;
				:done()&lt;br /&gt;
		-- get the data store details, if all the modules exist and we have a datastore configured&lt;br /&gt;
		local datastore = mw.html.create('')&lt;br /&gt;
		if thisClass then&lt;br /&gt;
			datastore:node(thisClass:explainDataStore())&lt;br /&gt;
				:newline()&lt;br /&gt;
		end&lt;br /&gt;
		-- build the status table&lt;br /&gt;
		local statusTrs = mw.html.create('')&lt;br /&gt;
		for _, pid in pairs(coreData.page.order) do&lt;br /&gt;
			statusTrs:tag('tr')&lt;br /&gt;
				:tag('th')&lt;br /&gt;
					:css('text-align', 'left')&lt;br /&gt;
					:css('width', widthTh)&lt;br /&gt;
					:wikitext(coreData.page[pid].name)&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
				:node(coreData.page[pid].exists and tdYa or tdNa)&lt;br /&gt;
				:newline()&lt;br /&gt;
				:done()&lt;br /&gt;
				:newline()&lt;br /&gt;
		end&lt;br /&gt;
		if thisUsesSmw and coreData.properties and coreData.properties.data and FoundationClass.myTableTools.size(coreData.properties.data) &amp;gt; 0 then&lt;br /&gt;
			statusTrs:tag('tr')&lt;br /&gt;
				:tag('th')&lt;br /&gt;
					:css('text-align', 'center')&lt;br /&gt;
					:css('width', widthTh)&lt;br /&gt;
					:attr('colspan', 2)&lt;br /&gt;
					:wikitext('Property pages for your smw store')&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
			for _, property in pairs(coreData.properties.order) do&lt;br /&gt;
				statusTrs:tag('tr')&lt;br /&gt;
					:tag('th')&lt;br /&gt;
						:css('text-align', 'left')&lt;br /&gt;
						:css('width', widthTh)&lt;br /&gt;
						:wikitext('Property:' .. property)&lt;br /&gt;
						:done()&lt;br /&gt;
						:newline()&lt;br /&gt;
					:node(coreData.properties.data[property].exists and tdYa or tdNa)&lt;br /&gt;
					:newline()&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		local statusTable = mw.html.create('table')&lt;br /&gt;
		statusTable:node(statusTrs)&lt;br /&gt;
		-- page autocreation&lt;br /&gt;
		local extAutoCreatePage = pcall(frame.callParserFunction, frame, {name = '#createpageifnotex:Module:Classgenerator', {'NUL'}})&lt;br /&gt;
		local autoCreation = _CFG.template.createPages and extAutoCreatePage&lt;br /&gt;
		local pageAutoCreation = mw.html.create('')&lt;br /&gt;
		pageAutoCreation:wikitext('&amp;lt;h2&amp;gt;Page autocreation&amp;lt;/h2&amp;gt;')&lt;br /&gt;
			:newline()&lt;br /&gt;
		if autoCreation then&lt;br /&gt;
			-- depending on parameters and existence of pages do the autocreate or print the button&lt;br /&gt;
			-- first see, which pagecomplexes (modules(docs), templates, form, category) are missing&lt;br /&gt;
			local missing = {}&lt;br /&gt;
			-- in missing we store, if a page in a given namespace is missing. Namespaces are stored by their ids (numbers)&lt;br /&gt;
			for _, pid in pairs(coreData.page.order) do&lt;br /&gt;
				-- due to extension autocreatepage messing up module pages, in namepace module we only autocreate doc pages&lt;br /&gt;
				if not coreData.page[pid].exists and not Classgenerator.myTableTools.inTable(missing, coreData.page[pid].namespace) and &lt;br /&gt;
						(coreData.page[pid].namespace ~= 828 or coreData.page[pid].isDocPage) then&lt;br /&gt;
					table.insert(missing, coreData.page[pid].namespace)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			if thisUsesSmw and not allPropertiesThere then&lt;br /&gt;
				table.insert(missing, mw.title.new('NUL', 'Property').namespace)&lt;br /&gt;
			end&lt;br /&gt;
			-- now generate the printout or call the parser function depending on global_autocreate_* status&lt;br /&gt;
			-- remember the switches 'global_autocreate_module', 'global_autocreate_template', 'global_autocreate_form', 'global_autocreate_category', and 'global_autocreate_property'&lt;br /&gt;
			local actable = mw.html.create('table')&lt;br /&gt;
			for _, nsid  in pairs(missing) do&lt;br /&gt;
				local ns = mw.ustring.lower(_namespaceName(self, nsid))&lt;br /&gt;
				local information = ''&lt;br /&gt;
				if coreData.autocreate[ns] and coreData.autocreate[ns] &amp;gt; os.time() - _CFG.template.autoCreationTimeDiff then&lt;br /&gt;
					-- ************************************* actual autocreation is done here&lt;br /&gt;
					-- we iterate over all namespaces for which pages are missing (var missing) and spring into action, if we have a numeric value supplied for that namespace coreData.autocreate[ns] that is recent enough&lt;br /&gt;
					-- now we have a namespace, we want to create pages for (var nsid) (all that is done in the recent 4 lines). what we do in the following lines:&lt;br /&gt;
					-- we iterate over all pages in coreData.page.order and spring into action, if the interation instance (pid) is in the namespace (nsid), the page is non exist and is not a module&lt;br /&gt;
					-- in that action body, we create the page with the precalcualted content&lt;br /&gt;
					-- also: for convenience, we create some global project (meta)categories, if related to the current page (project-form-category if nsid for forms, etc.) and configured in Foundationclass/globalconfig. here is an overview&lt;br /&gt;
					--	Classgenerator.globalConfig.formCategory			: MediaWiki:Classengine-content-project-form-category&lt;br /&gt;
					--	Classgenerator.globalConfig.gardeningSuperCategory	: MediaWiki:Classengine-content-project-gardening-supercategory&lt;br /&gt;
					--	Classgenerator.globalConfig.moduleCategory			: MediaWiki:Classengine-content-project-module-category&lt;br /&gt;
					--	Classgenerator.globalConfig.projectSuperCategory	: MediaWiki:Classengine-content-project-supercategory&lt;br /&gt;
					--	Classgenerator.globalConfig.propertyCategory		: MediaWiki:Classengine-content-project-property-category&lt;br /&gt;
					--	Classgenerator.globalConfig.templateCategory		: MediaWiki:Classengine-content-project-templates&lt;br /&gt;
					for _, pid in pairs(coreData.page.order) do&lt;br /&gt;
						_debug(self, 3, ' testing page &amp;quot;' .. coreData.page[pid].name .. '&amp;quot;: namespace id is ' .. coreData.page[pid].namespace ..&lt;br /&gt;
							', and page does ' ..(not coreData.page[pid].exists and 'not ' or '') .. 'exist')&lt;br /&gt;
						if coreData.page[pid].namespace == nsid and not coreData.page[pid].exists and (nsid ~= 828 or coreData.page[pid].isDocPage) then&lt;br /&gt;
							if pid == 'gardeningCategory' and Classgenerator.globalConfig.gardeningSuperCategory and #Classgenerator.globalConfig.gardeningSuperCategory &amp;gt; 0 then&lt;br /&gt;
								-- we just iterated over the gardening category page (so this class has one) but we did not create it, yet)&lt;br /&gt;
								-- blindly try to create the gardening supercategory first, in case the class's gardening category is the gardening supercategory, we dont want the class specific content&lt;br /&gt;
								local content = '{{MediaWiki:Classengine-content-project-gardening-supercategory}}'&lt;br /&gt;
								_debug(self, 3, ' trying to autocreate garderning supercategory page &amp;quot;' .. Classgenerator.globalConfig.gardeningSuperCategory .. '&amp;quot; with # of content being ' .. #content)&lt;br /&gt;
								local ret = frame:callParserFunction{ name = '#createpageifnotex:Category:' .. Classgenerator.globalConfig.gardeningSuperCategory, args = { content } }&lt;br /&gt;
								if #ret &amp;gt; 0 then&lt;br /&gt;
									information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
								end&lt;br /&gt;
							end&lt;br /&gt;
							_debug(self, 3, ' trying to autocreate page &amp;quot;' .. coreData.page[pid].name .. '&amp;quot; with # of content being ' .. #coreData.page[pid].content)&lt;br /&gt;
							local ret = frame:callParserFunction{ name = '#createpageifnotex:' .. coreData.page[pid].name, args = { frame:preprocess(coreData.page[pid].content) } }&lt;br /&gt;
							if #ret &amp;gt; 0 then&lt;br /&gt;
								information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
							end&lt;br /&gt;
							if pid == 'form' and Classgenerator.globalConfig.formCategory and #Classgenerator.globalConfig.formCategory &amp;gt; 0 then&lt;br /&gt;
								-- we just iterated over the form page (so this class has one) and created it (yay). Now blindly create the formCategory as well...&lt;br /&gt;
								local content = '{{MediaWiki:Classengine-content-project-form-category}}'&lt;br /&gt;
								_debug(self, 3, ' trying to autocreate form category page &amp;quot;' .. Classgenerator.globalConfig.formCategory .. '&amp;quot; with # of content being ' .. #content)&lt;br /&gt;
								local ret = frame:callParserFunction{ name = '#createpageifnotex:Category:' .. Classgenerator.globalConfig.formCategory, args = { content } }&lt;br /&gt;
								if #ret &amp;gt; 0 then&lt;br /&gt;
									information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
								end&lt;br /&gt;
							elseif nsid ~= 828 and Classgenerator.globalConfig.moduleCategory and #Classgenerator.globalConfig.moduleCategory &amp;gt; 0 then&lt;br /&gt;
								-- we just iterated a module doc page (so this class has one) and created it (yay). Now blindly create the moduleCategory as well...&lt;br /&gt;
								local content = '{{MediaWiki:Classengine-content-project-module-category}}'&lt;br /&gt;
								_debug(self, 3, ' trying to autocreate module category page &amp;quot;' .. Classgenerator.globalConfig.moduleCategory .. '&amp;quot; with # of content being ' .. #content)&lt;br /&gt;
								local ret = frame:callParserFunction{ name = '#createpageifnotex:Category:' .. Classgenerator.globalConfig.moduleCategory, args = { content } }&lt;br /&gt;
								if #ret &amp;gt; 0 then&lt;br /&gt;
									information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
								end&lt;br /&gt;
							elseif pid == 'category' and Classgenerator.globalConfig.projectSuperCategory and #Classgenerator.globalConfig.projectSuperCategory &amp;gt; 0 then&lt;br /&gt;
								-- we just iterated over the category page (so this class has one) and created it (yay). Now blindly create the supercategory as well...&lt;br /&gt;
								local content = '{{MediaWiki:Classengine-content-project-supercategory}}'&lt;br /&gt;
								_debug(self, 3, ' trying to autocreate super category page &amp;quot;' .. Classgenerator.globalConfig.projectSuperCategory .. '&amp;quot; with # of content being ' .. #content)&lt;br /&gt;
								local ret = frame:callParserFunction{ name = '#createpageifnotex:Category:' .. Classgenerator.globalConfig.projectSuperCategory, args = { content } }&lt;br /&gt;
								if #ret &amp;gt; 0 then&lt;br /&gt;
									information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
								end&lt;br /&gt;
							elseif nsid == 10 and Classgenerator.globalConfig.templateCategory and #Classgenerator.globalConfig.templateCategory &amp;gt; 0 then&lt;br /&gt;
								-- we just iterated over a page in template namespace (so this class has one) and created it (yay). Now blindly create the templateCategory as well...&lt;br /&gt;
								local content = '{{MediaWiki:Classengine-content-project-template-category}}'&lt;br /&gt;
								_debug(self, 3, ' trying to autocreate template category page &amp;quot;' .. Classgenerator.globalConfig.templateCategory .. '&amp;quot; with # of content being ' .. #content)&lt;br /&gt;
								local ret = frame:callParserFunction{ name = '#createpageifnotex:Category:' .. Classgenerator.globalConfig.templateCategory, args = { content } }&lt;br /&gt;
								if #ret &amp;gt; 0 then&lt;br /&gt;
									information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
								end&lt;br /&gt;
							end&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
					if thisUsesSmw and (nsid == mw.title.new('NUL', 'Property').namespace) then&lt;br /&gt;
						-- add here autocreation of properties&lt;br /&gt;
						for property, pdata in pairs(coreData.properties.data) do&lt;br /&gt;
							if not pdata.exists then&lt;br /&gt;
								local content = pdata.content&lt;br /&gt;
								_debug(self, 3, ' trying to autocreate property page &amp;quot;' .. property .. '&amp;quot; with # of content being ' .. #content)&lt;br /&gt;
								local ret = frame:callParserFunction{ name = '#createpageifnotex:Property:' .. property, args = { frame:preprocess(pdata.content) } }&lt;br /&gt;
								if #ret &amp;gt; 0 then&lt;br /&gt;
									information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
								end&lt;br /&gt;
							end&lt;br /&gt;
						end&lt;br /&gt;
						-- we just iterated over all missing property pages (so this class has some) and created them (yay). Now blindly create the propertyCategory as well...&lt;br /&gt;
						local content = '{{MediaWiki:Classengine-content-project-property-category}}'&lt;br /&gt;
						_debug(self, 3, ' trying to autocreate property category page &amp;quot;' .. Classgenerator.globalConfig.propertyCategory .. '&amp;quot; with # of content being ' .. #content)&lt;br /&gt;
						local ret = frame:callParserFunction{ name = '#createpageifnotex:Category:' .. Classgenerator.globalConfig.propertyCategory, args = { content } }&lt;br /&gt;
						if #ret &amp;gt; 0 then&lt;br /&gt;
							information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				-- create the tr for the ns&lt;br /&gt;
				actable:tag('tr')&lt;br /&gt;
					:tag('th')&lt;br /&gt;
						:css('text-align', 'left')&lt;br /&gt;
						:css('width', widthTh)&lt;br /&gt;
						:wikitext('Create ' .. ((nsid == 828 and 'module docs' or (ns == 'property' and 'properties' or (ns .. (ns == 'template' and 's' or '')))) .. ':'))&lt;br /&gt;
							-- note: nsid == mw.title.new('NUL', 'Property').namespace is necessary since canonicalname for property namespace does not translate uniquely over different languages :(&lt;br /&gt;
						:done()&lt;br /&gt;
						:newline()&lt;br /&gt;
					:tag('td')&lt;br /&gt;
						:cssText('color:black; vertical-align: middle; text-align: center; width:' .. widthTd)&lt;br /&gt;
						:css('background', (coreData.autocreate[ns] and coreData.autocreate[ns] &amp;gt; os.time() - _CFG.template.autoCreationTimeDiff) and '#90ff90' or '#FF9090' )&lt;br /&gt;
						:wikitext(frame:callParserFunction{name = '#autoedit', args={form='Classgenerator', target=self:getUid(),&lt;br /&gt;
							'link text=' .. (coreData.autocreate[ns] and 'Requested on ' .. os.date('%d.%m.%Y %X', coreData.autocreate[ns]) or 'Create automatically!')  .. &lt;br /&gt;
								(#information &amp;gt; 0 and ('Call returned ' .. information) or ''),&lt;br /&gt;
							'reload', summary=&amp;quot;Requesting the autocreation of &amp;quot; .. coreData.className .. ' for pages of type ' .. ns,&lt;br /&gt;
							'query string=Classgenerator[global_autocreate_' .. ns .. ']=' .. os.time()}&lt;br /&gt;
							})&lt;br /&gt;
						:done()&lt;br /&gt;
						:newline()&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
&lt;br /&gt;
			end&lt;br /&gt;
			if Classgenerator.myTableTools.size(missing) &amp;gt; 0 then&lt;br /&gt;
				-- show the all button&lt;br /&gt;
				local querystring = ''&lt;br /&gt;
				for _, nsid in pairs(missing) do&lt;br /&gt;
					local ns = mw.ustring.lower(_namespaceName(self, nsid))&lt;br /&gt;
					querystring = querystring .. 'Classgenerator[global_autocreate_' .. ns .. ']=' .. os.time() .. '&amp;amp;'&lt;br /&gt;
				end&lt;br /&gt;
				querystring = mw.ustring.sub(querystring, 1, -2)&lt;br /&gt;
				actable:tag('tr')&lt;br /&gt;
					:tag('th')&lt;br /&gt;
						:css('text-align', 'left')&lt;br /&gt;
						:css('width', widthTh)&lt;br /&gt;
						:wikitext('Create all pages:')&lt;br /&gt;
						:done()&lt;br /&gt;
						:newline()&lt;br /&gt;
					:tag('td')&lt;br /&gt;
						:cssText('background: #FF9090; color:black; vertical-align: middle; text-align: center; width:' .. widthTd)&lt;br /&gt;
						:wikitext(frame:callParserFunction{name = '#autoedit', args={form='Classgenerator', target=self:getUid(),&lt;br /&gt;
							'link text=Create automatically!', 'reload', summary=&amp;quot;Requesting the autocreation of all missing pages&amp;quot;, 'query string=' .. querystring }&lt;br /&gt;
							})&lt;br /&gt;
						:done()&lt;br /&gt;
						:newline()&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
				pageAutoCreation:wikitext('&amp;lt;b&amp;gt;Note:&amp;lt;/b&amp;gt; Creation of module pages is impossible due to an incompatibility issue.')&lt;br /&gt;
					:newline()&lt;br /&gt;
					:node(actable)&lt;br /&gt;
					:newline()&lt;br /&gt;
			else&lt;br /&gt;
				pageAutoCreation:wikitext('All pages present!')&lt;br /&gt;
					:newline()&lt;br /&gt;
					:tag('p')&lt;br /&gt;
						:wikitext('&amp;lt;small&amp;gt;&amp;lt;b&amp;gt;Note:&amp;lt;/b&amp;gt; Creation of module pages is impossible due to an incompatibility issue.&amp;lt;/small&amp;gt;')&lt;br /&gt;
						:newline()&lt;br /&gt;
						:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			pageAutoCreation:wikitext('Page autocreation is only possible if activated in your [[Module:Classgenerator/config]]-file (see template-section) and '&lt;br /&gt;
					.. 'Extension AutoCreatePage being installed.')&lt;br /&gt;
				:newline()&lt;br /&gt;
		end&lt;br /&gt;
		if cargoTableCreateLink then&lt;br /&gt;
			pageAutoCreation:wikitext('&amp;lt;b&amp;gt;Cargo data store:&amp;lt;/b&amp;gt;To (re-)create your cargo table, follow &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[' .. coreData.page.template.recreatedata .. ' this link]&amp;lt;/span&amp;gt; and then press ok!')&lt;br /&gt;
				:newline()&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		-- build the content collapses&lt;br /&gt;
		local collapse = require('Module:Collapse').main&lt;br /&gt;
		local bg_sets = { exist = {'#cfc', '#9c9'}, nonexist = {'#fcc', '#c99'} }&lt;br /&gt;
		local bg = 1&lt;br /&gt;
		local pageContent = mw.html.create('')&lt;br /&gt;
		for _, pid in pairs(coreData.page.order) do&lt;br /&gt;
			local content&lt;br /&gt;
			local bgs = coreData.page[pid].exists and bg_sets.exist or bg_sets.nonexist&lt;br /&gt;
			if coreData.page[pid].namespace == 828 and not coreData.page[pid].isDocPage then&lt;br /&gt;
				content = frame:expandTemplate{ title = 'Code', args = {lang = 'lua', code = coreData.page[pid].content, line = '1'}}&lt;br /&gt;
			else&lt;br /&gt;
				content = '&amp;lt;pre style=&amp;quot;white-space:-moz-pre-wrap; white-space:-pre-wrap; white-space:-o-pre-wrap; white-space:pre-wrap; word-wrap:break-word;&amp;quot;&amp;gt;' .. &lt;br /&gt;
					mw.text.nowiki(frame:preprocess(coreData.page[pid].content)) .. '&amp;lt;/pre&amp;gt;'&lt;br /&gt;
			end&lt;br /&gt;
			pageContent:wikitext(collapse({ header = 'Contents of &amp;lt;b&amp;gt;[[:' .. coreData.page[pid].name .. ']]&amp;lt;/b&amp;gt; ' ..&lt;br /&gt;
							'&amp;lt;span class=&amp;quot;plainlinks&amp;quot; style=&amp;quot;font-size:75%;&amp;quot;&amp;gt;&amp;amp;#91;[' .. coreData.page[pid].editlink ..&lt;br /&gt;
							' EDIT]&amp;amp;#93;&amp;lt;/span&amp;gt;',&lt;br /&gt;
						content = content, left = true, bg = bgs[bg]&lt;br /&gt;
					}))&lt;br /&gt;
				:newline()&lt;br /&gt;
			bg = (bg == 2 and 1 or 2)&lt;br /&gt;
		end&lt;br /&gt;
		if thisUsesSmw and coreData.properties.order then&lt;br /&gt;
			-- add here the collpases of the properties&lt;br /&gt;
			local message = mw.message.new('classengine-template-property-page')&lt;br /&gt;
			pageContent:tag('p')&lt;br /&gt;
				:wikitext('&amp;lt;h3&amp;gt;All property pages&amp;lt;/h3&amp;gt;')&lt;br /&gt;
				:done()&lt;br /&gt;
			for _, property in pairs(coreData.properties.order) do&lt;br /&gt;
				local bgs = coreData.page[pid].exists and bg_sets.exist or bg_sets.nonexist&lt;br /&gt;
				local content = '&amp;lt;pre style=&amp;quot;white-space:-moz-pre-wrap; white-space:-pre-wrap; white-space:-o-pre-wrap; white-space:pre-wrap; word-wrap:break-word;&amp;quot;&amp;gt;' .. &lt;br /&gt;
					mw.text.nowiki(frame:preprocess(coreData.properties.data[property].content)) .. '&amp;lt;/pre&amp;gt;'&lt;br /&gt;
				pageContent:wikitext(collapse({ header = 'Contents of &amp;lt;b&amp;gt;[[:Property:' .. property .. ']]&amp;lt;/b&amp;gt; ' ..&lt;br /&gt;
								'&amp;lt;span class=&amp;quot;plainlinks&amp;quot; style=&amp;quot;font-size:75%;&amp;quot;&amp;gt;&amp;amp;#91;[' .. coreData.properties.data[property].editlink ..&lt;br /&gt;
								' EDIT]&amp;amp;#93;&amp;lt;/span&amp;gt;',&lt;br /&gt;
							content = content, left = true, bg = bgs[bg]&lt;br /&gt;
						}))&lt;br /&gt;
					:newline()&lt;br /&gt;
				bg = (bg == 2 and 1 or 2)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		local updateWarning = mw.html.create('')&lt;br /&gt;
		if coreData.now_timestamp - coreData.edit_timestamp &amp;lt; 2*60*60 then&lt;br /&gt;
			local mbox = require('Module:Message box')&lt;br /&gt;
			updateWarning:wikitext(mbox.main('ombox', { type='content', text = 'Note: You updated the class ' .. coreData.edit_time_before .. ' ago. Did you write your [[#Page contents|config file]] new? ' ..&lt;br /&gt;
						'Changes won\'t take effect unless you do!' .. ((thisUsesCargo and cargoTableCreateLink) and '&amp;lt;p&amp;gt;&amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;Also: If you changed your cargo table\'s declaration, [' .. &lt;br /&gt;
						coreData.page.template.editlink .. ' edit your template] and [[#Page autocreation|rebuild your cargo table]]!&amp;lt;/span&amp;gt;' or '')}))&lt;br /&gt;
				:newline()&lt;br /&gt;
		end&lt;br /&gt;
		local smwPropertyHint = mw.html.create('')&lt;br /&gt;
		if (FoundationClass.globalConfig.dataStore == 'both' or FoundationClass.globalConfig.dataStore == 'smw')&lt;br /&gt;
				and FoundationClass.myYesno(coreData.global_smwUseStorage)&lt;br /&gt;
				and not coreData.property.order then&lt;br /&gt;
			local mbox = require('Module:Message box')&lt;br /&gt;
			smwPropertyHint:wikitext(mbox.main('ombox', { type='info', text = 'Hint: If you use properties in your class, they will not display in &amp;lt;i&amp;gt;Page contents&amp;lt;/i&amp;gt;, nor be listed in &amp;lt;i&amp;gt;Page status&amp;lt;/i&amp;gt; or '&lt;br /&gt;
					.. 'autocreated in &amp;lt;i&amp;gt;Page autocreation&amp;lt;/i&amp;gt; unless you have your class and config page created!'}))&lt;br /&gt;
				:newline()&lt;br /&gt;
		end&lt;br /&gt;
		-- assemble everything&lt;br /&gt;
		local html = mw.html.create('')&lt;br /&gt;
		html:wikitext(coreData.global_description)&lt;br /&gt;
			:newline()&lt;br /&gt;
			:node(updateWarning)&lt;br /&gt;
			:node(smwPropertyHint)&lt;br /&gt;
			:node(manual)&lt;br /&gt;
			:newline()&lt;br /&gt;
			:node(datastore)&lt;br /&gt;
			:wikitext('&amp;lt;h2&amp;gt;Page status&amp;lt;/h2&amp;gt;')&lt;br /&gt;
			:newline()&lt;br /&gt;
			:wikitext(autoCreation and 'This status may be inaccurate, if you just created pages. In that case, run jobs and clear cache of this page.' or '')&lt;br /&gt;
			:node(statusTable)&lt;br /&gt;
			:newline()&lt;br /&gt;
			:node(pageAutoCreation)&lt;br /&gt;
			:wikitext('&amp;lt;h2&amp;gt;Page contents&amp;lt;/h2&amp;gt;')&lt;br /&gt;
			:newline()&lt;br /&gt;
			:node(pageContent)&lt;br /&gt;
			:newline()&lt;br /&gt;
			:done()&lt;br /&gt;
		local debugLevel = FoundationClass.globalConfig.debugLevel or _CFG.global.debugLevel&lt;br /&gt;
		if debugLevel then&lt;br /&gt;
			html:tag('pre')&lt;br /&gt;
--				:wikitext(FoundationClass.myTableTools.printTable(coreData))&lt;br /&gt;
--				:wikitext(FoundationClass.myTableTools.printTable(thisClass:smwProperty2ParameterTranslationTable()))&lt;br /&gt;
				:wikitext(ClassDebug:printLog(debugLevel))&lt;br /&gt;
				:done()&lt;br /&gt;
		end&lt;br /&gt;
		self:addOutput(html)&lt;br /&gt;
&lt;br /&gt;
		return true&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Classgenerator:myArgumentProcessing(coreData)&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator:myArgumentProcessing(args) to process coreData, from ' .. tostring(self))&lt;br /&gt;
	-- function that performs some individual transformation args --&amp;amp;amp;gt; coreData&lt;br /&gt;
	local _CFG = self.class.myConfiguration&lt;br /&gt;
	local coreData = coreData&lt;br /&gt;
	local lang = mw.language.new('en')&lt;br /&gt;
	coreData.className = lang:ucfirst(mw.text.trim(mw.ustring.gsub(self:getUid(), ':', '')))&lt;br /&gt;
	coreData.edit_timestamp = lang:formatDate('U', coreData.global_edit_timestamp)&lt;br /&gt;
	coreData.now_timestamp = lang:formatDate('U') + 60*60&lt;br /&gt;
	coreData.edit_time_before = lang:formatDuration(coreData.now_timestamp-coreData.edit_timestamp)&lt;br /&gt;
	coreData.last_edited = lang:formatDate('d.m.Y H:i:s', coreData.global_edit_timestamp)&lt;br /&gt;
	if coreData.global_gardeningCategory_chooser and mw.ustring.lower(coreData.global_gardeningCategory_chooser) == 'global' then&lt;br /&gt;
		coreData.global_gardeningCategory = 'superglobal.gardeningCategory'&lt;br /&gt;
	end&lt;br /&gt;
	if mw.ustring.find(coreData.className, ' ', 1, true) then&lt;br /&gt;
		local tmp = ''&lt;br /&gt;
		for fragment in mw.text.gsplit(coreData.className, ' ', true) do&lt;br /&gt;
			tmp = tmp .. lang:ucfirst(fragment)&lt;br /&gt;
		end&lt;br /&gt;
		coreData.className = tmp&lt;br /&gt;
	end&lt;br /&gt;
	if coreData.global_cargoTable then&lt;br /&gt;
		coreData.global_cargoTable = mw.ustring.gsub(mw.ustring.lower(coreData.global_cargoTable), ' ', '_')&lt;br /&gt;
	end&lt;br /&gt;
	if coreData.form_createInfotext and #coreData.form_createInfotext &amp;gt; 0 and mw.ustring.sub(coreData.form_createInfotext, -1) ~= ' ' then&lt;br /&gt;
		coreData.form_createInfotext = coreData.form_createInfotext .. ' '&lt;br /&gt;
	end&lt;br /&gt;
	local parameter_parameter&lt;br /&gt;
	local fieldOrder&lt;br /&gt;
	if coreData.parameter_parameter then&lt;br /&gt;
		parameters = ''&lt;br /&gt;
		fieldOrder = {}&lt;br /&gt;
		local classGenParamConfig = mw.loadData('Module:Classgenerator/parameter/config')&lt;br /&gt;
		for result in mw.text.gsplit(coreData.parameter_parameter, classGenParamConfig.template.delimiterResult, true) do&lt;br /&gt;
			local fieldname, parameter = mw.ustring.match(result, '^([^#]*)' .. classGenParamConfig.template.delimiterFormFieldName .. '(.+)$')&lt;br /&gt;
			if fieldname and mw.ustring.len(mw.text.trim(fieldname)) &amp;gt; 0 then&lt;br /&gt;
				table.insert(fieldOrder, mw.text.trim(fieldname))&lt;br /&gt;
			end&lt;br /&gt;
			if parameter and mw.ustring.len(parameter) &amp;gt; 0 then&lt;br /&gt;
				parameters = parameters .. parameter&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	coreData.parameter_parameter = parameters&lt;br /&gt;
	coreData.form_enable = FoundationClass.myYesno(coreData.form_enable)&lt;br /&gt;
	if coreData.form_enable then&lt;br /&gt;
		coreData.form_fieldOrder = fieldOrder&lt;br /&gt;
		form_buttons = { 'save' }&lt;br /&gt;
		if coreData.form_buttons and #coreData.form_buttons &amp;gt; 0 then&lt;br /&gt;
			for _, button in pairs(coreData.form_buttons) do&lt;br /&gt;
				table.insert(form_buttons, button)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		table.insert(form_buttons, 'cancel')&lt;br /&gt;
	end&lt;br /&gt;
	coreData.form_buttons = form_buttons&lt;br /&gt;
	-- here build the class config&lt;br /&gt;
	local contentClassConfig = mw.ustring.gsub(_CFG.template.configIntro, _CFG.template.placeHolderClassName, coreData.className) ..&lt;br /&gt;
		'local global = {\n' ..&lt;br /&gt;
		'\tdebugLevel = false,'&lt;br /&gt;
	if self.class.myConfiguration.template.addCommentsToConfig then&lt;br /&gt;
		contentClassConfig = contentClassConfig .. '\t-- set this to the level you wish to display at render. false if disabled. this is a class based setting. ' ..&lt;br /&gt;
			'you can set this globally at Foundationclass/globalconfig, causing all child classes to debug.'&lt;br /&gt;
	end&lt;br /&gt;
	contentClassConfig = contentClassConfig .. '\n'&lt;br /&gt;
	-- calculate the fieldlists:&lt;br /&gt;
	local fieldlists = {}&lt;br /&gt;
	for _, field in pairs(_CFG.form.fieldOrder) do&lt;br /&gt;
		local tab = mw.ustring.match(field, '^([a-z]+)_.+')&lt;br /&gt;
		if not fieldlists[tab] then&lt;br /&gt;
			fieldlists[tab] = {}&lt;br /&gt;
		end&lt;br /&gt;
		table.insert(fieldlists[tab], field)&lt;br /&gt;
	end&lt;br /&gt;
	local omissionList = {'global_autocreate_module', 'global_autocreate_template', 'global_autocreate_form', 'global_autocreate_category', 'global_autocreate_property', 'global_edit_timestamp', 'global_gardeningCategory_chooser',&lt;br /&gt;
		'form_textareaAttributes_cols', 'form_textareaAttributes_rows', 'form_textareaAttributes_autogrow', 'form_textareaAttributes_editor', 'form_createLinkInfo', &lt;br /&gt;
		'global_customization', 'form_customization', 'template_customization' }&lt;br /&gt;
	for _, attr in pairs(fieldlists.global) do&lt;br /&gt;
		if not Classgenerator.myTableTools.inTable(omissionList, attr) and self.class.myConfiguration.parameter[attr] then&lt;br /&gt;
			contentClassConfig = contentClassConfig .. _processAttribute(self, attr, '\t')&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if coreData.global_customization then&lt;br /&gt;
		for line in mw.text.gsplit(coreData.global_customization, '\n', true) do&lt;br /&gt;
			contentClassConfig = contentClassConfig .. '\t' .. line .. '\n'&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	contentClassConfig = contentClassConfig .. '}\n\nlocal form = {\n'&lt;br /&gt;
	for _, attr in pairs(fieldlists.form) do&lt;br /&gt;
		if not Classgenerator.myTableTools.inTable(omissionList, attr) and self.class.myConfiguration.parameter[attr] then&lt;br /&gt;
			contentClassConfig = contentClassConfig .. _processAttribute(self, attr, '\t')&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	contentClassConfig = contentClassConfig .. '\ttextareaAttributes = {	-- the defaults for your textarea fields\n'&lt;br /&gt;
	for _, attr in pairs({'form_textareaAttributes_cols', 'form_textareaAttributes_rows', 'form_textareaAttributes_autogrow', 'form_textareaAttributes_editor'}) do&lt;br /&gt;
		local name = mw.ustring.match(attr, '^form_textareaAttributes_(.+)$')&lt;br /&gt;
		contentClassConfig = contentClassConfig .. _processAttribute(self, attr, '\t\t', name)&lt;br /&gt;
	end&lt;br /&gt;
	contentClassConfig = contentClassConfig .. '\t},\n'&lt;br /&gt;
	contentClassConfig = contentClassConfig .. _processAttribute(self, 'form_fieldOrder', '\t')&lt;br /&gt;
	if coreData.form_customization then&lt;br /&gt;
		for line in mw.text.gsplit(coreData.form_customization, '\n', true) do&lt;br /&gt;
			contentClassConfig = contentClassConfig .. '\t' .. line .. '\n'&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	contentClassConfig = contentClassConfig .. '}\n\nlocal template = {\n'&lt;br /&gt;
	for _, attr in pairs(fieldlists.template) do&lt;br /&gt;
		if not Classgenerator.myTableTools.inTable(omissionList, attr) and self.class.myConfiguration.parameter[attr] then&lt;br /&gt;
			contentClassConfig = contentClassConfig .. _processAttribute(self, attr, '\t')&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if coreData.template_customization then&lt;br /&gt;
		for line in mw.text.gsplit(coreData.template_customization, '\n', true) do&lt;br /&gt;
			contentClassConfig = contentClassConfig .. '\t' .. mw.text.trim(line) .. '\n'&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	contentClassConfig = contentClassConfig .. '}\n\nlocal parameter = {\n' .. coreData.parameter_parameter .. '}\n\n' ..&lt;br /&gt;
		'return {\n' ..&lt;br /&gt;
		'\tform = form,\n' ..&lt;br /&gt;
		'\tglobal = global,\n' ..&lt;br /&gt;
		'\tparameter = parameter,\n' ..&lt;br /&gt;
		'\ttemplate = template,\n}\n'&lt;br /&gt;
	local classCategory = Classgenerator.globalConfig.classCategory or 'none'&lt;br /&gt;
	local formCategory = Classgenerator.globalConfig.formCategory or 'none'&lt;br /&gt;
	local gardeningCategory = Classgenerator.globalConfig.gardeningSuperCategory or 'none'&lt;br /&gt;
	local moduleCategory = Classgenerator.globalConfig.moduleCategory or 'none'&lt;br /&gt;
	local propertyCategory = Classgenerator.globalConfig.propertyCategory or 'none'&lt;br /&gt;
	local superCategory = Classgenerator.globalConfig.projectSuperCategory or 'none'&lt;br /&gt;
	local templateCategory = Classgenerator.globalConfig.templateCategory or 'none'&lt;br /&gt;
	local page = {}&lt;br /&gt;
	page.order = {'base', 'baseDoc', 'class', 'classDoc', 'config', 'configDoc', 'template', 'templateDoc'}&lt;br /&gt;
	page.base = {&lt;br /&gt;
		name = 'Module:' .. _private[self].pagename,&lt;br /&gt;
		content = mw.message.new('classengine-template-module-page'):rawParams(_private[self].pagename):plain()&lt;br /&gt;
	}&lt;br /&gt;
	page.baseDoc = {&lt;br /&gt;
		name = 'Module:' .. _private[self].pagename .. '/doc',&lt;br /&gt;
		content = mw.message.new('classengine-template-module-documentation-page'):rawParams(_private[self].pagename, moduleCategory):plain()&lt;br /&gt;
	}&lt;br /&gt;
	page.class = {&lt;br /&gt;
		name = 'Module:' .. _private[self].pagename .. '/class',&lt;br /&gt;
		content = mw.message.new('classengine-template-module-class-page'):rawParams(_private[self].pagename, coreData.className):plain()&lt;br /&gt;
	}&lt;br /&gt;
	page.classDoc = {&lt;br /&gt;
		name = 'Module:' .. _private[self].pagename .. '/class/doc',&lt;br /&gt;
		content = mw.message.new('classengine-template-module-class-documentation-page'):rawParams(_private[self].pagename, coreData.className, moduleCategory, classCategory):plain()&lt;br /&gt;
	}&lt;br /&gt;
	page.config = {&lt;br /&gt;
		name = 'Module:' .. _private[self].pagename .. '/config',&lt;br /&gt;
		content = contentClassConfig,&lt;br /&gt;
	}&lt;br /&gt;
	page.configDoc = {&lt;br /&gt;
		name = 'Module:' .. _private[self].pagename .. '/config/doc',&lt;br /&gt;
		content = mw.message.new('classengine-template-module-config-documentation-page'):rawParams(_private[self].pagename, moduleCategory, classCategory):plain()&lt;br /&gt;
	}&lt;br /&gt;
	page.template = {&lt;br /&gt;
		name = 'Template:' .. coreData.template_name,&lt;br /&gt;
		content = mw.message.new('classengine-template-template-page'):rawParams(_private[self].pagename):plain()&lt;br /&gt;
	}&lt;br /&gt;
	page.templateDoc = {&lt;br /&gt;
		name = 'Template:' .. coreData.template_name .. '/doc',&lt;br /&gt;
		content = mw.message.new('classengine-template-template-documentation-page'):rawParams(_private[self].pagename, templateCategory):plain()&lt;br /&gt;
	}&lt;br /&gt;
	if coreData.form_name and #coreData.form_name &amp;gt; 0 then&lt;br /&gt;
		table.insert(page.order, 'form')&lt;br /&gt;
		page.form = {&lt;br /&gt;
			name = 'Form:' .. coreData.form_name,&lt;br /&gt;
			content = mw.message.new('classengine-template-form-page'):rawParams(_private[self].pagename, formCategory):plain()&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
	if coreData.global_category and #coreData.global_category&amp;gt; 0 then&lt;br /&gt;
		table.insert(page.order, 'category')&lt;br /&gt;
		page.category = {&lt;br /&gt;
			name = 'Category:' .. coreData.global_category,&lt;br /&gt;
			content = mw.message.new('classengine-template-category-page'):rawParams(_private[self].pagename, superCategory):plain()&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
	if coreData.global_gardeningCategory and #coreData.global_gardeningCategory &amp;gt; 0 then&lt;br /&gt;
		table.insert(page.order, 'gardeningCategory')&lt;br /&gt;
		local pagename = coreData.global_gardeningCategory&lt;br /&gt;
		if pagename == 'superglobal.gardeningCategory' then&lt;br /&gt;
			pagename = FoundationClass.globalConfig.gardeningCategory&lt;br /&gt;
		end&lt;br /&gt;
		page.gardeningCategory = {&lt;br /&gt;
			name = 'Category:' .. pagename,&lt;br /&gt;
			content = mw.message.new('classengine-template-gardeningcategory-page'):rawParams(_private[self].pagename, gardeningCategory):plain()&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
	for _, pid in pairs(page.order) do&lt;br /&gt;
		local obj = mw.title.new(page[pid].name)&lt;br /&gt;
		page[pid].exists = obj.exists&lt;br /&gt;
		page[pid].namespace = obj.namespace&lt;br /&gt;
		page[pid].editlink = obj:fullUrl{action='edit'}&lt;br /&gt;
		if pid == 'template' then&lt;br /&gt;
			page[pid].recreatedata = obj:fullUrl{action='recreatedata'}&lt;br /&gt;
		end&lt;br /&gt;
		page[pid].isDocPage = (mw.ustring.sub(page[pid].name, -4) == '/doc')&lt;br /&gt;
		if page[pid].isDocPage then&lt;br /&gt;
			page[pid].content = page[pid].content .. '&amp;lt;h2&amp;gt;Maintenanace notes&amp;lt;/h2&amp;gt;\n' ..&lt;br /&gt;
				'This page was created by [[Module:Classgenerator]] and belongs to [[' .. self:getUid() .. ']].\n'&lt;br /&gt;
			if pid == 'configDoc' then&lt;br /&gt;
				page[pid].content = page[pid].content .. '\n{{((}}ombox| type=content | text = It is strongly advised, to not edit this page but to use [' ..&lt;br /&gt;
				'https://{{((}}SERVERNAME{{))}}{{((}}SCRIPTPATH{{))}}/Special:FormEdit/Classgenerator/' .. mw.uri.encode(self:getUid(), &amp;quot;PATH&amp;quot;) .. ' ' .. &lt;br /&gt;
					'the Classgenerator form] instead! After that, use your new configuration to replace the contents of this page.{{))}}'&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	local thisClass&lt;br /&gt;
	local thisConfig&lt;br /&gt;
	if page.class.exists and page.config.exists then&lt;br /&gt;
		thisClass = require(page.class.name)&lt;br /&gt;
		thisConfig = require(page.config.name)&lt;br /&gt;
	end&lt;br /&gt;
	if page.form and (not coreData.form_typeCreateLink or coreData.form_typeCreateLink ~= 'forminput') and coreData.form_createLinkPageName and mw.ustring.len(coreData.form_createLinkPageName) &amp;gt; 0 then&lt;br /&gt;
		local pageName = coreData.form_createLinkPageName&lt;br /&gt;
		if coreData.global_namespace and mw.ustring.len(coreData.global_namespace) &amp;gt; 0 and not mw.ustring.match(pageName, '^' .. coreData.global_namespace .. ':.+$') then&lt;br /&gt;
			pageName = coreData.global_namespace .. ':' .. pageName&lt;br /&gt;
		end&lt;br /&gt;
		local infostr = '{{((}}{info|page name=' .. pageName .. '|add title=' .. (coreData.form_labelCreate or 'create entity') .. '|edit title=' .. (coreData.form_labelEdit or 'edit entity') .. '}{{))}}'&lt;br /&gt;
		page.form.content = page.form.content .. '&amp;lt;!{{#invoke:String|rep|-|2}} this is a workaround, needed because of a SF bug: ' .. infostr ..&lt;br /&gt;
			'. see https://phabricator.wikimedia.org/T123230 for more information {{#invoke:String|rep|-|2}}&amp;gt;'&lt;br /&gt;
	end&lt;br /&gt;
	coreData.page = page&lt;br /&gt;
	local autocreate = {}&lt;br /&gt;
	autocreate.module = FoundationClass.myYesno(coreData.global_autocreate_module, tonumber(coreData.global_autocreate_module))&lt;br /&gt;
	autocreate.template = FoundationClass.myYesno(coreData.global_autocreate_template, tonumber(coreData.global_autocreate_template))&lt;br /&gt;
	autocreate.form = coreData.form_name and FoundationClass.myYesno(coreData.global_autocreate_form, tonumber(coreData.global_autocreate_form))&lt;br /&gt;
	autocreate.category = (coreData.global_category or coreData.global_gardeningCategory) and FoundationClass.myYesno(coreData.global_autocreate_category, tonumber(coreData.global_autocreate_category))&lt;br /&gt;
	if (FoundationClass.globalConfig.dataStore == 'both' or FoundationClass.globalConfig.dataStore == 'smw') and FoundationClass.myYesno(coreData.global_smwUseStorage) then&lt;br /&gt;
		local propertyNSName = _namespaceName(self, mw.title.new('NUL', 'Property').namespace)&lt;br /&gt;
		autocreate[propertyNSName] = FoundationClass.myYesno(coreData['global_autocreate_' .. propertyNSName], tonumber(coreData['global_autocreate_' .. propertyNSName]))&lt;br /&gt;
	end&lt;br /&gt;
	coreData.autocreate = autocreate&lt;br /&gt;
	local propertyData&lt;br /&gt;
	local propertyOrder&lt;br /&gt;
	if (FoundationClass.globalConfig.dataStore == 'both' or FoundationClass.globalConfig.dataStore == 'smw') and FoundationClass.myYesno(coreData.global_smwUseStorage) and thisClass and thisConfig then&lt;br /&gt;
		-- we use smw and class and config are created and accessible. we can get property information and prepare data&lt;br /&gt;
		local matrix = thisClass:smwGetProperty2ParameterTranslationTable()&lt;br /&gt;
		propertyData = {}&lt;br /&gt;
		propertyOrder = {}&lt;br /&gt;
		for property, parameter in pairs(matrix) do&lt;br /&gt;
			table.insert(propertyOrder, property)&lt;br /&gt;
			local obj = mw.title.new(property, 'Property')&lt;br /&gt;
			propertyData[property] = { &lt;br /&gt;
				editlink = obj:fullUrl{action='edit'},&lt;br /&gt;
				exists = obj.exists,&lt;br /&gt;
				parameter = parameter,&lt;br /&gt;
			}&lt;br /&gt;
			if thisConfig.parameter[parameter] then&lt;br /&gt;
				propertyData[property].description = thisConfig.parameter[parameter].description&lt;br /&gt;
				propertyData[property].type = thisConfig.parameter[parameter].property_type&lt;br /&gt;
				propertyData[property].values = thisConfig.parameter[parameter].values&lt;br /&gt;
			elseif parameter == FoundationClass.globalConfig.smwClassProperty then&lt;br /&gt;
				propertyData[property].description = 'Automatisch hinzugefügt! Wird verwendet, um Mitglieder dieser Klasse zu finden (funktioniert auch, ohne dass eine Kategorie definiert wird und auch fur subobjects)'&lt;br /&gt;
				propertyData[property].type = 'Text'&lt;br /&gt;
			elseif parameter == FoundationClass.globalConfig.uidFieldName then&lt;br /&gt;
				propertyData[property].description = 'Automatisch hinzugefügt! Wird verwendet, um individuelle Objekte innerhalb der Klasse zu identifizieren.'&lt;br /&gt;
				propertyData[property].type = 'Text'&lt;br /&gt;
			end&lt;br /&gt;
			local values = ''&lt;br /&gt;
			if propertyData[property].values then&lt;br /&gt;
				values = values .. 'The allowed values are:'&lt;br /&gt;
				for _, value in pairs(propertyData[property].values) do&lt;br /&gt;
					values = values .. '\n* [[Allows value::' .. value .. ']]'&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				values = 'No restriction given'&lt;br /&gt;
			end&lt;br /&gt;
			propertyData[property].content = mw.message.new('classengine-template-property-page'):rawParams(propertyData[property].description, propertyData[property].type, values, propertyCategory):plain()&lt;br /&gt;
		end&lt;br /&gt;
		table.sort(propertyOrder)&lt;br /&gt;
	end&lt;br /&gt;
	coreData.properties = { data = propertyData, order = propertyOrder }&lt;br /&gt;
	return coreData	-- this is your new coreData.&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Classgenerator:myPlausibilityTest(args)&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator:myPlausibilityTest(args) to test arguments, from ' .. tostring(self))&lt;br /&gt;
	-- function that performs the individual plausibility tests&lt;br /&gt;
	-- note: before you access a field args.fieldname you should check for existance&lt;br /&gt;
	-- self:addError(text)&lt;br /&gt;
	return false	-- return value will be ignored. but if you add any error, the object's initialization will fail with the error&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Classgenerator:myStashAdjustments(stash)&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator:myStashAdjustments(stash) to do some minor adjustments on data before storing, from ' .. tostring(self))&lt;br /&gt;
	-- function that alters the stash before storing the data&lt;br /&gt;
	local stash = stash&lt;br /&gt;
	return stash	-- this is your new stash. this will be stored. it has format (fieldname: value)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Classgenerator:method()&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator:method() to do something, from ' .. tostring(self))&lt;br /&gt;
	return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return Classgenerator&lt;/div&gt;</summary>
		<author><name>Anatol</name></author>
	</entry>
	<entry>
		<id>https://camnet.oetterer.eu/index.php?title=Modul:Classgenerator/class&amp;diff=1008</id>
		<title>Modul:Classgenerator/class</title>
		<link rel="alternate" type="text/html" href="https://camnet.oetterer.eu/index.php?title=Modul:Classgenerator/class&amp;diff=1008"/>
		<updated>2016-02-09T21:03:54Z</updated>

		<summary type="html">&lt;p&gt;Anatol: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local FoundationClass = require('Module:Foundationclass')&lt;br /&gt;
local ClassDebug = require('Module:Debug/class')&lt;br /&gt;
&lt;br /&gt;
-- ****************************************************************&lt;br /&gt;
-- *                         inheritance                          *&lt;br /&gt;
-- ****************************************************************&lt;br /&gt;
local Classgenerator = FoundationClass:subclass('Classgenerator')&lt;br /&gt;
-- setting class's configuration data&lt;br /&gt;
Classgenerator.static.myConfiguration = mw.loadData('Module:Classgenerator/config')&lt;br /&gt;
--   being in a static method, use self.myConfiguration&lt;br /&gt;
--   being in a private method, that knows self or in a public method, use self.class.myConfiguration&lt;br /&gt;
&lt;br /&gt;
-- ****************************************************************&lt;br /&gt;
-- *                          properties                          *&lt;br /&gt;
-- ****************************************************************&lt;br /&gt;
&lt;br /&gt;
-- **************** initialization of table for private properties&lt;br /&gt;
local _private = setmetatable({}, {__mode = 'k'})   -- weak table storing all private attributes&lt;br /&gt;
&lt;br /&gt;
-- **************** declaration of public static properties&lt;br /&gt;
-- Classgenerator.static.myPropertyModule = require('Module:extern')&lt;br /&gt;
-- Classgenerator.static.staticProperty = 'value'&lt;br /&gt;
&lt;br /&gt;
-- remember the static classes provided by Foundationclass:&lt;br /&gt;
-- Classgenerator.globalConfig&lt;br /&gt;
-- Classgenerator.myCargoUtil&lt;br /&gt;
-- Classgenerator.myTableTools&lt;br /&gt;
&lt;br /&gt;
-- **************** declaration of (global) private properties&lt;br /&gt;
-- for properties you should rather use constructor and _private[self]. this only, if you need a private class property&lt;br /&gt;
-- you should, however predeclare private methods here&lt;br /&gt;
local _debug	-- private method declared later&lt;br /&gt;
local _privateMethodAhead	-- declaration ahead, so this private method can be used in the constructor and in other private methods&lt;br /&gt;
&lt;br /&gt;
-- ***************************************************************&lt;br /&gt;
-- *                           methods                           *&lt;br /&gt;
-- ***************************************************************&lt;br /&gt;
 &lt;br /&gt;
-- **************** declaration of static methods&lt;br /&gt;
function Classgenerator:initialize(uid)&lt;br /&gt;
	local _CFG = self.class.myConfiguration&lt;br /&gt;
	FoundationClass.initialize(self, uid)&lt;br /&gt;
	local page = mw.title.getCurrentTitle().text&lt;br /&gt;
	if uid and mw.ustring.match(uid, '^' .. _CFG.global.namespace .. ':.+$') then&lt;br /&gt;
		page = mw.ustring.match(uid, '^' .. _CFG.global.namespace .. ':(.+)$')&lt;br /&gt;
	end&lt;br /&gt;
	_private[self] = {&lt;br /&gt;
		dbg = ClassDebug:new(tostring(self.class) .. ': id ' .. uid),&lt;br /&gt;
		pagename = page&lt;br /&gt;
	}&lt;br /&gt;
	_debug(self, 1, ' Classgenerator: done initializing object &amp;amp;quot;' .. uid ..'&amp;amp;quot;, from ' .. tostring(self))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- use use self.myConfiguration to access your configuration in a static method&lt;br /&gt;
function Classgenerator.static:aStaticMethod(var)&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator.static:aStaticMethod() to do something, from ' .. tostring(self))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Classgenerator.static:mySfDynamicFieldAttribute(fieldname, attribute, value)&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator.static:mySfDynamicFieldAttribute(fieldname, attribute, value), from ' .. tostring(self))&lt;br /&gt;
	_debug(self, 2, ' with parameters &amp;amp;quot;' .. fieldname .. '&amp;amp;quot;, &amp;amp;quot;' .. attribute .. '&amp;amp;quot; and a ' .. type(value) .. ' value')&lt;br /&gt;
	-- function that can process any attribute/value pair just before rendering the semantic forms field&lt;br /&gt;
	-- usually done, to generate a dynamic 'default' value&lt;br /&gt;
	-- keep in mind: you can completely disable a form field, if you return true on attribute &amp;quot;disable&amp;quot;. note however, that this causes the field to not show at all, no data will be transported/saved&lt;br /&gt;
	local pagename = mw.title.getCurrentTitle().rootText&lt;br /&gt;
	local val = value&lt;br /&gt;
	if Classgenerator.myTableTools.inTable({'template_name', 'global_entityTitle'}, fieldname) and attribute == 'default' then&lt;br /&gt;
		val = pagename&lt;br /&gt;
	end&lt;br /&gt;
	if fieldname == 'global_cargoTable' and attribute == 'default' then&lt;br /&gt;
		val = mw.ustring.lower(pagename)&lt;br /&gt;
	end&lt;br /&gt;
	if Classgenerator.globalConfig.dataStore ~= 'cargo' and Classgenerator.globalConfig.dataStore ~= 'both' then&lt;br /&gt;
		if fieldname == 'global_cargoTable' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
		if fieldname == 'global_cargoUidFieldname' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if Classgenerator.globalConfig.dataStore ~= 'smw' and Classgenerator.globalConfig.dataStore ~= 'both' then&lt;br /&gt;
		if fieldname == 'global_smwIsSubobject' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
		if fieldname == 'global_smwUseStorage' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
		if fieldname == 'global_autocreate_property' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return val	-- this value will be used as new value for field's attribute&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Classgenerator.static:sfGenerateForm()&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator.static:sfGenerateForm(), from ' .. tostring(self))&lt;br /&gt;
	local _CFG = self.myConfiguration&lt;br /&gt;
	local ClassgeneratorParameter  = require('Module:Classgenerator/parameter/class')&lt;br /&gt;
	local ClassSFfield = require('Module:SFfield/class')&lt;br /&gt;
	local tagStart = '{{{'&lt;br /&gt;
	local tagEnd = '}}}'&lt;br /&gt;
	local frame = mw.getCurrentFrame()&lt;br /&gt;
	-- create the form header&lt;br /&gt;
	local notification = mw.html.create('')&lt;br /&gt;
	if _CFG.form.notification and mw.ustring.len(_CFG.form.notification) &amp;gt; 0 then&lt;br /&gt;
		local mbox = require('Module:Message box')&lt;br /&gt;
		notification:wikitext(mbox.main('ombox', { text = _CFG.form.notification }))&lt;br /&gt;
			:newline()&lt;br /&gt;
	end&lt;br /&gt;
	local formheader = mw.html.create('')&lt;br /&gt;
	formheader:wikitext(self:sfGenerateFormInfoTag())&lt;br /&gt;
		:wikitext('&amp;lt;h2&amp;gt;' .. _CFG.global.entityTitle .. '&amp;lt;/h2&amp;gt;')&lt;br /&gt;
		:tag('p')&lt;br /&gt;
			:wikitext(_CFG.form.headerText)&lt;br /&gt;
			:done()&lt;br /&gt;
			:newline()&lt;br /&gt;
		:node(notification)&lt;br /&gt;
		:tag('div')&lt;br /&gt;
			:attr('id', 'wikiPreview')&lt;br /&gt;
			:cssText('display: none; padding-bottom: 25px; margin-bottom: 25px; border-bottom: 1px solid #AAAAAA;')&lt;br /&gt;
			:done()&lt;br /&gt;
			:newline()&lt;br /&gt;
	-- create the form buttons&lt;br /&gt;
	local formbuttons = mw.html.create('div')&lt;br /&gt;
	for _, button in pairs(_CFG.form.buttons) do&lt;br /&gt;
		formbuttons:wikitext(tagStart .. 'standard input&amp;amp;#124;' .. button .. tagEnd)&lt;br /&gt;
	end&lt;br /&gt;
	formbuttons:addClass('formbuttons')&lt;br /&gt;
		:done()&lt;br /&gt;
	-- calculate the fieldlists:&lt;br /&gt;
	local fieldlists = {}&lt;br /&gt;
	for _, field in pairs(_CFG.form.fieldOrder) do&lt;br /&gt;
		local tab = mw.ustring.match(field, '^([a-z]+)_.+')&lt;br /&gt;
		if not fieldlists[tab] then&lt;br /&gt;
			fieldlists[tab] = {}&lt;br /&gt;
		end&lt;br /&gt;
		table.insert(fieldlists[tab], field)&lt;br /&gt;
	end&lt;br /&gt;
	-- assemble everything, so start the html object&lt;br /&gt;
	local html = mw.html.create('div')&lt;br /&gt;
	html:node(formheader)&lt;br /&gt;
		:wikitext('&amp;lt;h1&amp;gt;GLOBAL-Section&amp;lt;/h1&amp;gt;')&lt;br /&gt;
		:newline()&lt;br /&gt;
		:tag('div')&lt;br /&gt;
			:wikitext('This section deals with all the class\'s global data, i.e. all data you need for your &amp;quot;template&amp;quot; part as wenn as for your form, ... ')&lt;br /&gt;
			:done()&lt;br /&gt;
			:newline()&lt;br /&gt;
		:wikitext(tagStart .. 'for template|' .. _CFG.template.name .. '|label=' .. _CFG.global.entityTitle .. tagEnd)&lt;br /&gt;
		:newline()&lt;br /&gt;
		:node(self:sfGenerateFormTable(fieldlists.global))&lt;br /&gt;
		:newline()&lt;br /&gt;
		:wikitext('&amp;lt;h1&amp;gt;FORM-Section&amp;lt;/h1&amp;gt;')&lt;br /&gt;
		:newline()&lt;br /&gt;
		:tag('div')&lt;br /&gt;
			:wikitext('This section deals with all the data, you need to create and operate a form for this class. If you don\'t want a form, disable this section. ' ..&lt;br /&gt;
					'If you need a form (e.g. as part of another form), but no form page, enable this section but leave the field for form page name emtpy.')&lt;br /&gt;
			:done()&lt;br /&gt;
			:newline()&lt;br /&gt;
		:node(self:sfGenerateFormTable(fieldlists.form))&lt;br /&gt;
		:newline()&lt;br /&gt;
		:wikitext('&amp;lt;h1&amp;gt;TEMPLATE-Section&amp;lt;/h1&amp;gt;')&lt;br /&gt;
		:newline()&lt;br /&gt;
		:tag('div')&lt;br /&gt;
			:wikitext('This section deals with all the data, you need to create and operate a template for this class. If you need tempalte specific parameters ' ..&lt;br /&gt;
				'(meaning parameteres that you only need to operate the &amp;quot;action&amp;quot;-part), put them into this section\'s custom field')&lt;br /&gt;
			:done()&lt;br /&gt;
			:newline()&lt;br /&gt;
		:node(self:sfGenerateFormTable(fieldlists.template))&lt;br /&gt;
		:newline()&lt;br /&gt;
		:wikitext('&amp;lt;h1&amp;gt;PARAMETERS-Section&amp;lt;/h1&amp;gt;')&lt;br /&gt;
		:newline()&lt;br /&gt;
		:tag('div')&lt;br /&gt;
			:wikitext('This section deals with all your parameters. You need an entry for every form input field, every template parameter, every data field you want to store, and even every notification line.')&lt;br /&gt;
			:tag('ul')&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(&amp;quot;To produce a normal parameter, add an entry, choose storage type, set '''Regular form parameter''' to yes, choose a form input type, and a template doc type.&amp;quot;)&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(&amp;quot;If you want a data field to be stored in your data storage but not defined in the form, choose a data storage type and set '''Regular form parameter''' to no. &amp;quot;)&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(&amp;quot;If you want a mutiple template to be parsed to a parameter, create a normal parameter (as described above) and choose '''Regular form parameter''' to  be ''Holds template''.&amp;quot;)&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(&amp;quot;A parameter with a form input that is not stored is created like a regular parameter but without setting any data storage type.&amp;quot;)&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(&amp;quot;Finally, you can create a message line. This is useful, if you want to convey any information to the user, that is to important for a description-tooltip. &amp;quot; ..&lt;br /&gt;
						&amp;quot;What you need to do is disable everything ('''Template doc parameter type ''', data storage) and set '''Regular form parameter''' to ''Information''. &amp;quot; ..&lt;br /&gt;
						&amp;quot;You probalby want to add the parameter to one or more ''show on select'' entries, too.&amp;quot;)&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
				:done()&lt;br /&gt;
				:newline()&lt;br /&gt;
			:done()&lt;br /&gt;
			:newline()&lt;br /&gt;
		:node(self:sfInitField('parameter_parameter'):render())&lt;br /&gt;
		:newline()&lt;br /&gt;
		:wikitext(frame:extensionTag('headertabs'))&lt;br /&gt;
		:newline()&lt;br /&gt;
		:wikitext(&amp;quot;'''(*) Pflichtfeld'''&amp;quot;)&lt;br /&gt;
		:newline()&lt;br /&gt;
		:wikitext(tagStart .. 'end template' .. tagEnd)&lt;br /&gt;
		:newline()&lt;br /&gt;
		:wikitext(ClassgeneratorParameter:sfGenerateForm())&lt;br /&gt;
		:newline()&lt;br /&gt;
		:node(formbuttons)&lt;br /&gt;
	local debugLevel = FoundationClass.globalConfig.debugLevel or self.myConfiguration.global.debugLevel&lt;br /&gt;
	if debugLevel then&lt;br /&gt;
		html:newline()&lt;br /&gt;
			:newline()&lt;br /&gt;
			:wikitext(ClassDebug:printLog(debugLevel))&lt;br /&gt;
	end&lt;br /&gt;
	return html&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- **************** declaration of private methods&lt;br /&gt;
-- use self.class.myConfiguration to access your configuration in a public or a private method that is called by a public method&lt;br /&gt;
_debug = function (self, level, text)&lt;br /&gt;
	if _private[self] and _private[self].dbg then&lt;br /&gt;
		local debugLevel = FoundationClass.globalConfig.debugLevel or self.class.myConfiguration.global.debugLevel&lt;br /&gt;
		if debugLevel and level &amp;lt;= debugLevel then&lt;br /&gt;
			_private[self].dbg:log(level, text)&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		local debugLevel = FoundationClass.globalConfig.debugLevel or self.myConfiguration.global.debugLevel&lt;br /&gt;
		if debugLevel and level &amp;lt;= debugLevel then&lt;br /&gt;
			ClassDebug:log(level, text, tostring(self) .. '.static')&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local _namespaceName = function (self, namespaceId)&lt;br /&gt;
	_debug(self, 1, 'entering private _namespaceName() to translate namespace namespaceId ' .. namespaceId .. ' into a universal name, from ' .. tostring(self))&lt;br /&gt;
	local ret, nulProperty = pcall(mw.title.new, 'NUL', 'Property')&lt;br /&gt;
	if ret and (namespaceId == nulProperty.namespace) then&lt;br /&gt;
		return 'property'	-- if you change this, check on other places, this is checked against and change that, too&lt;br /&gt;
	else&lt;br /&gt;
		return mw.site.namespaces[namespaceId].canonicalName&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local _processAttribute = function (self, attr, indent, name)&lt;br /&gt;
	_debug(self, 1, 'entering private _processAttribute() to print a line for attribute ' .. attr .. ', from ' .. tostring(self))&lt;br /&gt;
	local coreData = self:getCoreData()&lt;br /&gt;
	local attr = attr&lt;br /&gt;
	local val = coreData[attr]&lt;br /&gt;
	if type(val) == 'boolean' then&lt;br /&gt;
		val = val and 'true' or 'false'&lt;br /&gt;
	end&lt;br /&gt;
	local ret = ''&lt;br /&gt;
	local fieldname = mw.ustring.match(attr, '^[^_]+_(.+)$')&lt;br /&gt;
	ret = indent .. (name and name or fieldname) .. ' = '&lt;br /&gt;
	if not val then&lt;br /&gt;
		ret = ret .. 'nil'&lt;br /&gt;
	elseif type(val) == 'table' then&lt;br /&gt;
		ret = ret .. Classgenerator.myTableTools.printTable(val, 'inline')&lt;br /&gt;
	elseif val == 'true' or val == 'false' or mw.ustring.match(val, '^[0-9]+$') or (attr == 'global_gardeningCategory' and val == 'superglobal.gardeningCategory') then&lt;br /&gt;
		ret = ret .. val&lt;br /&gt;
	else&lt;br /&gt;
		ret = ret .. &amp;quot;'&amp;quot; .. mw.ustring.gsub(mw.ustring.gsub(mw.ustring.gsub(val, &amp;quot;\\'&amp;quot;, &amp;quot;'&amp;quot;), &amp;quot;'&amp;quot;, &amp;quot;\\'&amp;quot;), '\n', '\\n\' ..\n' .. indent .. '\t\'') .. &amp;quot;'&amp;quot;	-- the gsub catches multiline input from textareas&lt;br /&gt;
	end&lt;br /&gt;
	ret = ret .. ','&lt;br /&gt;
	if self.class.myConfiguration.template.addCommentsToConfig then&lt;br /&gt;
		ret = ret .. '\t-- ' .. self.class.myConfiguration.parameter[attr].description&lt;br /&gt;
	end&lt;br /&gt;
	ret = ret .. '\n'&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local _privateMethod = function (self)&lt;br /&gt;
	_debug(self, 1, 'entering private _privateMethod() to do something, from ' .. tostring(self))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- **************** declaration of public methods&lt;br /&gt;
-- use self.class.myConfiguration to access your configuration in a public method&lt;br /&gt;
function Classgenerator:addInfobox()&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator:addInfobox(), from ' .. tostring(self))&lt;br /&gt;
	if self:goodToGo() then&lt;br /&gt;
		local _CFG = self.class.myConfiguration&lt;br /&gt;
		local coreData = self:getCoreData()&lt;br /&gt;
		local usesSmw = FoundationClass.globalConfig.dataStore and (FoundationClass.globalConfig.dataStore == 'both' or FoundationClass.globalConfig.dataStore == 'smw') and FoundationClass.myYesno(coreData.global_smwUseStorage)&lt;br /&gt;
		local ib_args = {&lt;br /&gt;
			bodyclass = 'infobox_name',&lt;br /&gt;
			aboveclass = 'objtitle titletext',&lt;br /&gt;
			headerclass = 'headertext',&lt;br /&gt;
			labelstyle = 'width: 30%;',&lt;br /&gt;
			datastyle = 'width: 70%;',&lt;br /&gt;
			title = coreData.className,&lt;br /&gt;
			subheader = 'Class',&lt;br /&gt;
			label1 = 'Title',&lt;br /&gt;
			data1 = coreData.global_entityTitle and coreData.global_entityTitle or '',&lt;br /&gt;
			label2 = _CFG.parameter.global_edit_timestamp.label,&lt;br /&gt;
			data2 = coreData.last_edited,&lt;br /&gt;
			label3 = 'Store available',&lt;br /&gt;
			data3 = (FoundationClass.globalConfig.dataStore and mw.ustring.len(FoundationClass.globalConfig.dataStore) &amp;gt; 0) and FoundationClass.globalConfig.dataStore or '',&lt;br /&gt;
			label5 = 'Cargo table',&lt;br /&gt;
			data5 = (FoundationClass.globalConfig.dataStore and (FoundationClass.globalConfig.dataStore == 'both' or FoundationClass.globalConfig.dataStore == 'cargo')) and coreData.global_cargoTable or '',&lt;br /&gt;
			label6 = 'Smw class',&lt;br /&gt;
			data6 = usesSmw and _private[self].pagename or '',&lt;br /&gt;
			data7 = coreData.global_description,&lt;br /&gt;
			header10 = 'Pages',&lt;br /&gt;
			label12 = 'Module',&lt;br /&gt;
			data12 = _private[self].pagename and '[[Module:' .. _private[self].pagename .. ']]' or '',&lt;br /&gt;
			label13 = 'Class',&lt;br /&gt;
			data13 = _private[self].pagename and '[[Module:' .. _private[self].pagename .. '/class]]' or '',&lt;br /&gt;
			label14 = 'Config',&lt;br /&gt;
			data14 = _private[self].pagename and '[[Module:' .. _private[self].pagename .. '/config]]' or '',&lt;br /&gt;
			label17 = 'Template',&lt;br /&gt;
			data17 = coreData.template_name and '[[Template:' .. coreData.template_name .. ']]' or '',&lt;br /&gt;
			label19 = 'Form',&lt;br /&gt;
			data19 = coreData.page.form and '[[:' .. coreData.page.form.name .. ']]' or '',&lt;br /&gt;
			label21 = 'Category',&lt;br /&gt;
			data21 = coreData.page.category and '[[:' .. coreData.page.category.name .. ']]' or '',&lt;br /&gt;
			label22 = 'Gardening',&lt;br /&gt;
			data22 = coreData.page.gardeningCategory and '[[:' .. coreData.page.gardeningCategory.name .. ']]' or '',&lt;br /&gt;
		}&lt;br /&gt;
		if usesSmw and coreData.properties.order and #coreData.properties.order &amp;gt; 0 then&lt;br /&gt;
			ib_args.header30 = 'Properties'&lt;br /&gt;
			local i = 31&lt;br /&gt;
			for _, property in pairs(coreData.properties.order) do&lt;br /&gt;
				ib_args['label' .. i] = coreData.properties.data[property].type&lt;br /&gt;
				ib_args['data' .. i] = '[[Property:' .. property .. '|' .. property .. ']]'&lt;br /&gt;
				i = i + 1&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		self:addOutput(require('Module:Infobox').infobox(ib_args))&lt;br /&gt;
		return true&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Classgenerator:addPageBody()&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator:addPageBody(), from ' .. tostring(self))&lt;br /&gt;
	_debug(self, 2, ' rendering errors and warnings and adding them to output')&lt;br /&gt;
	self:addOutput(self:renderErrors())&lt;br /&gt;
	self:addOutput(self:renderWarnings())&lt;br /&gt;
	if self:goodToGo() then&lt;br /&gt;
		local frame = mw.getCurrentFrame()&lt;br /&gt;
		local lang = mw.language.new('en-gb')&lt;br /&gt;
		local _CFG = self.class.myConfiguration&lt;br /&gt;
		local coreData = self:getCoreData()&lt;br /&gt;
		-- start&lt;br /&gt;
		local widthTh = '300px'&lt;br /&gt;
		local widthTd = '200px'&lt;br /&gt;
		-- build the page status table&lt;br /&gt;
		-- first the two status table cells &amp;quot;green&amp;quot; and &amp;quot;red&amp;quot;&lt;br /&gt;
		local imgYes = '[[File:Yes check.png|13px|alt=Yes|link=]]'&lt;br /&gt;
		local imgNo = '[[File:X mark.png|13px|alt=No|link=]]'&lt;br /&gt;
		local tdYa = mw.html.create('td')&lt;br /&gt;
		tdYa:cssText('background: #90ff90; color:black; vertical-align: middle; text-align: center; width:' .. widthTd)&lt;br /&gt;
			:addClass('table-yes')&lt;br /&gt;
			:wikitext(imgYes)&lt;br /&gt;
		local tdNa = mw.html.create('td')&lt;br /&gt;
		tdNa:cssText('background: #FF9090; color:black; vertical-align: middle; text-align: center; width:' .. widthTd)&lt;br /&gt;
			:addClass('table-no')&lt;br /&gt;
			:wikitext(imgNo)&lt;br /&gt;
		local classExists = coreData.page.class.exists and coreData.page.config.exists&lt;br /&gt;
		local modulesExist = coreData.page.base.exists and classExists&lt;br /&gt;
		local thisClass&lt;br /&gt;
		local thisConfig&lt;br /&gt;
		if classExists then&lt;br /&gt;
			thisClass = require(coreData.page.class.name)&lt;br /&gt;
			thisConfig = require(coreData.page.config.name)&lt;br /&gt;
		end&lt;br /&gt;
		local thisUsesCargo = (FoundationClass.globalConfig.dataStore == 'both' or FoundationClass.globalConfig.dataStore == 'cargo') and coreData.global_cargoTable and #coreData.global_cargoTable &amp;gt; 0&lt;br /&gt;
		local thisUsesSmw = (FoundationClass.globalConfig.dataStore == 'both' or FoundationClass.globalConfig.dataStore == 'smw') and FoundationClass.myYesno(coreData.global_smwUseStorage)&lt;br /&gt;
		-- write the 2do checklist&lt;br /&gt;
		local done = true&lt;br /&gt;
		local step1&lt;br /&gt;
		local step2&lt;br /&gt;
		local step3&lt;br /&gt;
		if modulesExist then&lt;br /&gt;
			step1 = imgYes .. ' You created all your modules'&lt;br /&gt;
		else&lt;br /&gt;
			done = false&lt;br /&gt;
			step1 = imgNo .. ' You have to create your module pages. This, you have to do &amp;lt;b&amp;gt;manually&amp;lt;/b&amp;gt;. Go to [[#Page contents|section Page contents]], copy the module content and edit the corresponding module, ' ..&lt;br /&gt;
				'pasting all the copied content. Save and close. You have to do this for the following module(s): &amp;lt;ul&amp;gt; ' ..&lt;br /&gt;
				(not coreData.page.base.exists and '&amp;lt;li&amp;gt;[[#Page contents|' .. coreData.page.base.name .. ']]&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
				(not coreData.page.class.exists and '&amp;lt;li&amp;gt;[[#Page contents|' .. coreData.page.class.name .. ']]&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
				(not coreData.page.config.exists and '&amp;lt;li&amp;gt;[[#Page contents|' .. coreData.page.config.name .. ']]&amp;lt;/li&amp;gt;' or '') .. '&amp;lt;/ul&amp;gt;'&lt;br /&gt;
		end&lt;br /&gt;
		if coreData.page.baseDoc.exists and coreData.page.classDoc.exists and coreData.page.configDoc.exists and coreData.page.template.exists and coreData.page.templateDoc.exists and&lt;br /&gt;
				(not coreData.page.form or coreData.page.form.exists) and (not coreData.page.category or coreData.page.category.exists) and (not coreData.page.gardeningCategory or coreData.page.gardeningCategory.exists) then&lt;br /&gt;
			step2 = imgYes .. ' You created all auxilliary pages'&lt;br /&gt;
		else&lt;br /&gt;
			done = false&lt;br /&gt;
			step2 = imgNo .. ' You have to create auxilliary pages. This, you can do &amp;lt;b&amp;gt;automatically&amp;lt;/b&amp;gt;. Go to [[#Page autocreation|section Page autocreation]], hit the corresponding &amp;quot;Create&amp;quot;-button or ' ..&lt;br /&gt;
				'create all pages at once. Please do this for the following page(s): &amp;lt;ul&amp;gt; ' ..&lt;br /&gt;
				(not (coreData.page.baseDoc.exists or coreData.page.classDoc.exists or coreData.page.configDoc.exists) and '&amp;lt;li&amp;gt;Module documentation pages&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
				(not (coreData.page.template.exists or coreData.page.templateDoc.exists) and '&amp;lt;li&amp;gt;Template and/or template documentation page&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
				((coreData.page.form and not coreData.page.form.exists) and '&amp;lt;li&amp;gt;Form page&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
				(((coreData.page.category and not coreData.page.category.exists) or (coreData.page.gardeningCategory and not coreData.page.gardeningCategory.exists)) and '&amp;lt;li&amp;gt;Category page(s)&amp;lt;/li&amp;gt;' or '') .. '&amp;lt;/ul&amp;gt;'&lt;br /&gt;
		end&lt;br /&gt;
		local storeCargoInstruction&lt;br /&gt;
		local allPropertiesThere&lt;br /&gt;
		local cargoTableCreateLink = false&lt;br /&gt;
		if thisUsesCargo then&lt;br /&gt;
			-- we actually use cargo. check, if cargo table is there or throws an error? if all right, then yes, else instruction above&lt;br /&gt;
			if modulesExist and coreData.page.template.exists then&lt;br /&gt;
				cargoTableCreateLink = true&lt;br /&gt;
				attr = { limit = 1, default = '' }&lt;br /&gt;
				attr['more results text'] = ''&lt;br /&gt;
				local tableEntryId = mw.text.trim(mw.text.unstrip(FoundationClass.myCargoUtil.rawquery({tables = coreData.global_cargoTable, fields = {'_ID'}}, attr)))&lt;br /&gt;
				if mw.ustring.match(mw.text.trim(tableEntryId), '^[0-9]*$') then&lt;br /&gt;
					storeCargoInstruction = imgYes .. ' Your cargo table does exist! (Note: When you change your cargo table\'s declaration, you need to [[#Page autocreation|rebuild it]], though)'&lt;br /&gt;
				else&lt;br /&gt;
					done = false&lt;br /&gt;
					storeCargoInstruction = imgNo .. ' Please [[#Page autocreation|create your cargo table]]!'&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				done = false&lt;br /&gt;
				storeCargoInstruction = imgNo .. ' To be able to create your cargo table, you have to create the following page(s): &amp;lt;ul&amp;gt;' ..&lt;br /&gt;
					(not coreData.page.base.exists and '&amp;lt;li&amp;gt;' .. coreData.page.base.name .. '&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
					(not coreData.page.class.exists and '&amp;lt;li&amp;gt;' .. coreData.page.class.name .. '&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
					(not coreData.page.config.exists and '&amp;lt;li&amp;gt;' .. coreData.page.config.name .. '&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
					(not coreData.page.template.exists and '&amp;lt;li&amp;gt;' .. coreData.page.template.name .. '&amp;lt;/li&amp;gt;' or '') .. '&amp;lt;/ul&amp;gt;'&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if thisUsesSmw then&lt;br /&gt;
			-- we actually use smw. check, if all properties are present? if all right, then yes, else instruction above&lt;br /&gt;
			if coreData.properties and coreData.properties.data and FoundationClass.myTableTools.size(coreData.properties.data) &amp;gt; 0 then&lt;br /&gt;
				allPropertiesThere = true&lt;br /&gt;
				for property, propertyData in pairs(coreData.properties.data) do&lt;br /&gt;
					allPropertiesThere = allPropertiesThere and propertyData.exists&lt;br /&gt;
				end&lt;br /&gt;
				if allPropertiesThere then&lt;br /&gt;
					storeSwmInstruction = imgYes .. ' All your property pages are present and accounted for!'&lt;br /&gt;
				else&lt;br /&gt;
					done = false&lt;br /&gt;
					storeSwmInstruction = imgNo .. ' Please &amp;lt;b&amp;gt;[[#Page autocreation|autocreate]]&amp;lt;/b&amp;gt; your properties! The following are missing: &amp;lt;ul&amp;gt;'&lt;br /&gt;
					for _, property in pairs(coreData.properties.order) do&lt;br /&gt;
						local pdata = coreData.properties.data[property]&lt;br /&gt;
						if not pdata or not pdata.exists then&lt;br /&gt;
							storeSwmInstruction = storeSwmInstruction .. '&amp;lt;li&amp;gt;[[Property:' .. property .. ']]&amp;lt;/li&amp;gt;'&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
					storeSwmInstruction = storeSwmInstruction .. '&amp;lt;/ul&amp;gt;'&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				done = false&lt;br /&gt;
				storeSwmInstruction = imgNo .. ' To be able to create your smw properties, you have to create the following page(s): &amp;lt;ul&amp;gt;' ..&lt;br /&gt;
					(not coreData.page.class.exists and '&amp;lt;li&amp;gt;' .. coreData.page.class.name .. '&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
					(not coreData.page.config.exists and '&amp;lt;li&amp;gt;' .. coreData.page.config.name .. '&amp;lt;/li&amp;gt;' or '') .. '&amp;lt;/ul&amp;gt;'&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if storeCargoInstruction or storeSwmInstruction then&lt;br /&gt;
			if storeCargoInstruction and storeSwmInstruction then&lt;br /&gt;
				step3 = 'Your class used cargo AND smw store. You have to create both data stores: &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;' .. storeCargoInstruction .. '&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;' .. storeSwmInstruction .. '&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;'&lt;br /&gt;
			else&lt;br /&gt;
				step3 = storeCargoInstruction or storeSwmInstruction&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			step3 = imgYes .. ' This class does not use a data store. Nothing to be done here!'&lt;br /&gt;
		end&lt;br /&gt;
		local step4 = done and imgYes .. ' You are done. Remember, when you want to change parameters in your config, edit this page and write your [' .. coreData.page.config.editlink .. ' config file] new' or &lt;br /&gt;
			imgNo .. ' You are not finished yet, please tend to your tasks.'&lt;br /&gt;
		local manual = mw.html.create('')&lt;br /&gt;
		manual:wikitext('&amp;lt;h2&amp;gt;Your 2do checklist&amp;lt;/h2&amp;gt;')&lt;br /&gt;
			:tag('ol')&lt;br /&gt;
				:cssText('margin: 0.3em 0 0 1.6em; padding: 0')&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(step1)&lt;br /&gt;
					:done()&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(step2)&lt;br /&gt;
					:done()&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(step3)&lt;br /&gt;
					:done()&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(step4)&lt;br /&gt;
					:done()&lt;br /&gt;
				:done()&lt;br /&gt;
		-- get the data store details, if all the modules exist and we have a datastore configured&lt;br /&gt;
		local datastore = mw.html.create('')&lt;br /&gt;
		if thisClass then&lt;br /&gt;
			datastore:node(thisClass:explainDataStore())&lt;br /&gt;
				:newline()&lt;br /&gt;
		end&lt;br /&gt;
		-- build the status table&lt;br /&gt;
		local statusTrs = mw.html.create('')&lt;br /&gt;
		for _, pid in pairs(coreData.page.order) do&lt;br /&gt;
			statusTrs:tag('tr')&lt;br /&gt;
				:tag('th')&lt;br /&gt;
					:css('text-align', 'left')&lt;br /&gt;
					:css('width', widthTh)&lt;br /&gt;
					:wikitext(coreData.page[pid].name)&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
				:node(coreData.page[pid].exists and tdYa or tdNa)&lt;br /&gt;
				:newline()&lt;br /&gt;
				:done()&lt;br /&gt;
				:newline()&lt;br /&gt;
		end&lt;br /&gt;
		if thisUsesSmw and coreData.properties and coreData.properties.data and FoundationClass.myTableTools.size(coreData.properties.data) &amp;gt; 0 then&lt;br /&gt;
			statusTrs:tag('tr')&lt;br /&gt;
				:tag('th')&lt;br /&gt;
					:css('text-align', 'center')&lt;br /&gt;
					:css('width', widthTh)&lt;br /&gt;
					:attr('colspan', 2)&lt;br /&gt;
					:wikitext('Property pages for your smw store')&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
			for _, property in pairs(coreData.properties.order) do&lt;br /&gt;
				statusTrs:tag('tr')&lt;br /&gt;
					:tag('th')&lt;br /&gt;
						:css('text-align', 'left')&lt;br /&gt;
						:css('width', widthTh)&lt;br /&gt;
						:wikitext('Property:' .. property)&lt;br /&gt;
						:done()&lt;br /&gt;
						:newline()&lt;br /&gt;
					:node(coreData.properties.data[property].exists and tdYa or tdNa)&lt;br /&gt;
					:newline()&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		local statusTable = mw.html.create('table')&lt;br /&gt;
		statusTable:node(statusTrs)&lt;br /&gt;
		-- page autocreation&lt;br /&gt;
		local extAutoCreatePage = pcall(frame.callParserFunction, frame, {name = '#createpageifnotex:Module:Classgenerator', {'NUL'}})&lt;br /&gt;
		local autoCreation = _CFG.template.createPages and extAutoCreatePage&lt;br /&gt;
		local pageAutoCreation = mw.html.create('')&lt;br /&gt;
		pageAutoCreation:wikitext('&amp;lt;h2&amp;gt;Page autocreation&amp;lt;/h2&amp;gt;')&lt;br /&gt;
			:newline()&lt;br /&gt;
		if autoCreation then&lt;br /&gt;
			-- depending on parameters and existence of pages do the autocreate or print the button&lt;br /&gt;
			-- first see, which pagecomplexes (modules(docs), templates, form, category) are missing&lt;br /&gt;
			local missing = {}&lt;br /&gt;
			-- in missing we store, if a page in a given namespace is missing. Namespaces are stored by their ids (numbers)&lt;br /&gt;
			for _, pid in pairs(coreData.page.order) do&lt;br /&gt;
				-- due to extension autocreatepage messing up module pages, in namepace module we only autocreate doc pages&lt;br /&gt;
				if not coreData.page[pid].exists and not Classgenerator.myTableTools.inTable(missing, coreData.page[pid].namespace) and &lt;br /&gt;
						(coreData.page[pid].namespace ~= 828 or coreData.page[pid].isDocPage) then&lt;br /&gt;
					table.insert(missing, coreData.page[pid].namespace)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			if thisUsesSmw and not allPropertiesThere then&lt;br /&gt;
				table.insert(missing, mw.title.new('NUL', 'Property').namespace)&lt;br /&gt;
			end&lt;br /&gt;
			-- now generate the printout or call the parser function depending on global_autocreate_* status&lt;br /&gt;
			-- remember the switches 'global_autocreate_module', 'global_autocreate_template', 'global_autocreate_form', 'global_autocreate_category', and 'global_autocreate_property'&lt;br /&gt;
			local actable = mw.html.create('table')&lt;br /&gt;
			for _, nsid  in pairs(missing) do&lt;br /&gt;
				local ns = mw.ustring.lower(_namespaceName(self, nsid))&lt;br /&gt;
				local information = ''&lt;br /&gt;
				if coreData.autocreate[ns] and coreData.autocreate[ns] &amp;gt; os.time() - _CFG.template.autoCreationTimeDiff then&lt;br /&gt;
					-- ************************************* actual autocreation is done here&lt;br /&gt;
					-- we iterate over all namespaces for which pages are missing (var missing) and spring into action, if we have a numeric value supplied for that namespace coreData.autocreate[ns] that is recent enough&lt;br /&gt;
					-- now we have a namespace, we want to create pages for (var nsid) (all that is done in the recent 4 lines). what we do in the following lines:&lt;br /&gt;
					-- we iterate over all pages in coreData.page.order and spring into action, if the interation instance (pid) is in the namespace (nsid), the page is non exist and is not a module&lt;br /&gt;
					-- in that action body, we create the page with the precalcualted content&lt;br /&gt;
					-- also: for convenience, we create some global project (meta)categories, if related to the current page (project-form-category if nsid for forms, etc.) and configured in Foundationclass/globalconfig. here is an overview&lt;br /&gt;
					--	Classgenerator.globalConfig.formCategory			: MediaWiki:Classengine-content-project-form-category&lt;br /&gt;
					--	Classgenerator.globalConfig.gardeningSuperCategory	: MediaWiki:Classengine-content-project-gardening-supercategory&lt;br /&gt;
					--	Classgenerator.globalConfig.moduleCategory			: MediaWiki:Classengine-content-project-module-category&lt;br /&gt;
					--	Classgenerator.globalConfig.projectSuperCategory	: MediaWiki:Classengine-content-project-supercategory&lt;br /&gt;
					--	Classgenerator.globalConfig.propertyCategory		: MediaWiki:Classengine-content-project-property-category&lt;br /&gt;
					--	Classgenerator.globalConfig.templateCategory		: MediaWiki:Classengine-content-project-templates&lt;br /&gt;
					for _, pid in pairs(coreData.page.order) do&lt;br /&gt;
						_debug(self, 3, ' testing page &amp;quot;' .. coreData.page[pid].name .. '&amp;quot;: namespace id is ' .. coreData.page[pid].namespace ..&lt;br /&gt;
							', and page does ' ..(not coreData.page[pid].exists and 'not ' or '') .. 'exist')&lt;br /&gt;
						if coreData.page[pid].namespace == nsid and not coreData.page[pid].exists and (nsid ~= 828 or coreData.page[pid].isDocPage) then&lt;br /&gt;
							if pid == 'gardeningCategory' and Classgenerator.globalConfig.gardeningSuperCategory and #Classgenerator.globalConfig.gardeningSuperCategory &amp;gt; 0 then&lt;br /&gt;
								-- we just iterated over the gardening category page (so this class has one) but we did not create it, yet)&lt;br /&gt;
								-- blindly try to create the gardening supercategory first, in case the class's gardening category is the gardening supercategory, we dont want the class specific content&lt;br /&gt;
								local content = '{{MediaWiki:Classengine-content-project-gardening-supercategory}}'&lt;br /&gt;
								_debug(self, 3, ' trying to autocreate garderning supercategory page &amp;quot;' .. Classgenerator.globalConfig.gardeningSuperCategory .. '&amp;quot; with # of content being ' .. #content)&lt;br /&gt;
								local ret = frame:callParserFunction{ name = '#createpageifnotex:Category:' .. Classgenerator.globalConfig.gardeningSuperCategory, args = { content } }&lt;br /&gt;
								if #ret &amp;gt; 0 then&lt;br /&gt;
									information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
								end&lt;br /&gt;
							end&lt;br /&gt;
							_debug(self, 3, ' trying to autocreate page &amp;quot;' .. coreData.page[pid].name .. '&amp;quot; with # of content being ' .. #coreData.page[pid].content)&lt;br /&gt;
							local ret = frame:callParserFunction{ name = '#createpageifnotex:' .. coreData.page[pid].name, args = { frame:preprocess(coreData.page[pid].content) } }&lt;br /&gt;
							if #ret &amp;gt; 0 then&lt;br /&gt;
								information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
							end&lt;br /&gt;
							if pid == 'form' and Classgenerator.globalConfig.formCategory and #Classgenerator.globalConfig.formCategory &amp;gt; 0 then&lt;br /&gt;
								-- we just iterated over the form page (so this class has one) and created it (yay). Now blindly create the formCategory as well...&lt;br /&gt;
								local content = '{{MediaWiki:Classengine-content-project-form-category}}'&lt;br /&gt;
								_debug(self, 3, ' trying to autocreate form category page &amp;quot;' .. Classgenerator.globalConfig.formCategory .. '&amp;quot; with # of content being ' .. #content)&lt;br /&gt;
								local ret = frame:callParserFunction{ name = '#createpageifnotex:Category:' .. Classgenerator.globalConfig.formCategory, args = { content } }&lt;br /&gt;
								if #ret &amp;gt; 0 then&lt;br /&gt;
									information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
								end&lt;br /&gt;
							elseif nsid ~= 828 and Classgenerator.globalConfig.moduleCategory and #Classgenerator.globalConfig.moduleCategory &amp;gt; 0 then&lt;br /&gt;
								-- we just iterated a module doc page (so this class has one) and created it (yay). Now blindly create the moduleCategory as well...&lt;br /&gt;
								local content = '{{MediaWiki:Classengine-content-project-module-category}}'&lt;br /&gt;
								_debug(self, 3, ' trying to autocreate module category page &amp;quot;' .. Classgenerator.globalConfig.moduleCategory .. '&amp;quot; with # of content being ' .. #content)&lt;br /&gt;
								local ret = frame:callParserFunction{ name = '#createpageifnotex:Category:' .. Classgenerator.globalConfig.moduleCategory, args = { content } }&lt;br /&gt;
								if #ret &amp;gt; 0 then&lt;br /&gt;
									information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
								end&lt;br /&gt;
							elseif pid == 'category' and Classgenerator.globalConfig.projectSuperCategory and #Classgenerator.globalConfig.projectSuperCategory &amp;gt; 0 then&lt;br /&gt;
								-- we just iterated over the category page (so this class has one) and created it (yay). Now blindly create the supercategory as well...&lt;br /&gt;
								local content = '{{MediaWiki:Classengine-content-project-supercategory}}'&lt;br /&gt;
								_debug(self, 3, ' trying to autocreate super category page &amp;quot;' .. Classgenerator.globalConfig.projectSuperCategory .. '&amp;quot; with # of content being ' .. #content)&lt;br /&gt;
								local ret = frame:callParserFunction{ name = '#createpageifnotex:Category:' .. Classgenerator.globalConfig.projectSuperCategory, args = { content } }&lt;br /&gt;
								if #ret &amp;gt; 0 then&lt;br /&gt;
									information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
								end&lt;br /&gt;
							elseif nsid == 10 and Classgenerator.globalConfig.templateCategory and #Classgenerator.globalConfig.templateCategory &amp;gt; 0 then&lt;br /&gt;
								-- we just iterated over a page in template namespace (so this class has one) and created it (yay). Now blindly create the templateCategory as well...&lt;br /&gt;
								local content = '{{MediaWiki:Classengine-content-project-template-category}}'&lt;br /&gt;
								_debug(self, 3, ' trying to autocreate template category page &amp;quot;' .. Classgenerator.globalConfig.templateCategory .. '&amp;quot; with # of content being ' .. #content)&lt;br /&gt;
								local ret = frame:callParserFunction{ name = '#createpageifnotex:Category:' .. Classgenerator.globalConfig.templateCategory, args = { content } }&lt;br /&gt;
								if #ret &amp;gt; 0 then&lt;br /&gt;
									information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
								end&lt;br /&gt;
							end&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
					if thisUsesSmw and (nsid == mw.title.new('NUL', 'Property').namespace) then&lt;br /&gt;
						-- add here autocreation of properties&lt;br /&gt;
						for property, pdata in pairs(coreData.properties.data) do&lt;br /&gt;
							if not pdata.exists then&lt;br /&gt;
								local content = pdata.content&lt;br /&gt;
								_debug(self, 3, ' trying to autocreate property page &amp;quot;' .. property .. '&amp;quot; with # of content being ' .. #content)&lt;br /&gt;
								local ret = frame:callParserFunction{ name = '#createpageifnotex:Property:' .. property, args = { frame:preprocess(pdata.content) } }&lt;br /&gt;
								if #ret &amp;gt; 0 then&lt;br /&gt;
									information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
								end&lt;br /&gt;
							end&lt;br /&gt;
						end&lt;br /&gt;
						-- we just iterated over all missing property pages (so this class has some) and created them (yay). Now blindly create the propertyCategory as well...&lt;br /&gt;
						local content = '{{MediaWiki:Classengine-content-project-property-category}}'&lt;br /&gt;
						_debug(self, 3, ' trying to autocreate property category page &amp;quot;' .. Classgenerator.globalConfig.propertyCategory .. '&amp;quot; with # of content being ' .. #content)&lt;br /&gt;
						local ret = frame:callParserFunction{ name = '#createpageifnotex:Category:' .. Classgenerator.globalConfig.propertyCategory, args = { content } }&lt;br /&gt;
						if #ret &amp;gt; 0 then&lt;br /&gt;
							information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				-- create the tr for the ns&lt;br /&gt;
				actable:tag('tr')&lt;br /&gt;
					:tag('th')&lt;br /&gt;
						:css('text-align', 'left')&lt;br /&gt;
						:css('width', widthTh)&lt;br /&gt;
						:wikitext('Create ' .. ((nsid == 828 and 'module docs' or (ns == 'property' and 'properties' or (ns .. (ns == 'template' and 's' or '')))) .. ':'))&lt;br /&gt;
							-- note: nsid == mw.title.new('NUL', 'Property').namespace is necessary since canonicalname for property namespace does not translate uniquely over different languages :(&lt;br /&gt;
						:done()&lt;br /&gt;
						:newline()&lt;br /&gt;
					:tag('td')&lt;br /&gt;
						:cssText('color:black; vertical-align: middle; text-align: center; width:' .. widthTd)&lt;br /&gt;
						:css('background', (coreData.autocreate[ns] and coreData.autocreate[ns] &amp;gt; os.time() - _CFG.template.autoCreationTimeDiff) and '#90ff90' or '#FF9090' )&lt;br /&gt;
						:wikitext(frame:callParserFunction{name = '#autoedit', args={form='Classgenerator', target=self:getUid(),&lt;br /&gt;
							'link text=' .. (coreData.autocreate[ns] and 'Requested on ' .. os.date('%d.%m.%Y %X', coreData.autocreate[ns]) or 'Create automatically!')  .. &lt;br /&gt;
								(#information &amp;gt; 0 and ('Call returned ' .. information) or ''),&lt;br /&gt;
							'reload', summary=&amp;quot;Requesting the autocreation of &amp;quot; .. coreData.className .. ' for pages of type ' .. ns,&lt;br /&gt;
							'query string=Classgenerator[global_autocreate_' .. ns .. ']=' .. os.time()}&lt;br /&gt;
							})&lt;br /&gt;
						:done()&lt;br /&gt;
						:newline()&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
&lt;br /&gt;
			end&lt;br /&gt;
			if Classgenerator.myTableTools.size(missing) &amp;gt; 0 then&lt;br /&gt;
				-- show the all button&lt;br /&gt;
				local querystring = ''&lt;br /&gt;
				for _, nsid in pairs(missing) do&lt;br /&gt;
					local ns = mw.ustring.lower(_namespaceName(self, nsid))&lt;br /&gt;
					querystring = querystring .. 'Classgenerator[global_autocreate_' .. ns .. ']=' .. os.time() .. '&amp;amp;'&lt;br /&gt;
				end&lt;br /&gt;
				querystring = mw.ustring.sub(querystring, 1, -2)&lt;br /&gt;
				actable:tag('tr')&lt;br /&gt;
					:tag('th')&lt;br /&gt;
						:css('text-align', 'left')&lt;br /&gt;
						:css('width', widthTh)&lt;br /&gt;
						:wikitext('Create all pages:')&lt;br /&gt;
						:done()&lt;br /&gt;
						:newline()&lt;br /&gt;
					:tag('td')&lt;br /&gt;
						:cssText('background: #FF9090; color:black; vertical-align: middle; text-align: center; width:' .. widthTd)&lt;br /&gt;
						:wikitext(frame:callParserFunction{name = '#autoedit', args={form='Classgenerator', target=self:getUid(),&lt;br /&gt;
							'link text=Create automatically!', 'reload', summary=&amp;quot;Requesting the autocreation of all missing pages&amp;quot;, 'query string=' .. querystring }&lt;br /&gt;
							})&lt;br /&gt;
						:done()&lt;br /&gt;
						:newline()&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
				pageAutoCreation:wikitext('&amp;lt;b&amp;gt;Note:&amp;lt;/b&amp;gt; Creation of module pages is impossible due to an incompatibility issue.')&lt;br /&gt;
					:newline()&lt;br /&gt;
					:node(actable)&lt;br /&gt;
					:newline()&lt;br /&gt;
			else&lt;br /&gt;
				pageAutoCreation:wikitext('All pages present!')&lt;br /&gt;
					:newline()&lt;br /&gt;
					:tag('p')&lt;br /&gt;
						:wikitext('&amp;lt;small&amp;gt;&amp;lt;b&amp;gt;Note:&amp;lt;/b&amp;gt; Creation of module pages is impossible due to an incompatibility issue.&amp;lt;/small&amp;gt;')&lt;br /&gt;
						:newline()&lt;br /&gt;
						:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			pageAutoCreation:wikitext('Page autocreation is only possible if activated in your [[Module:Classgenerator/config]]-file (see template-section) and '&lt;br /&gt;
					.. 'Extension AutoCreatePage being installed.')&lt;br /&gt;
				:newline()&lt;br /&gt;
		end&lt;br /&gt;
		if cargoTableCreateLink then&lt;br /&gt;
			pageAutoCreation:wikitext('&amp;lt;b&amp;gt;Cargo data store:&amp;lt;/b&amp;gt;To (re-)create your cargo table, follow &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[' .. coreData.page.template.recreatedata .. ' this link]&amp;lt;/span&amp;gt; and then press ok!')&lt;br /&gt;
				:newline()&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		-- build the content collapses&lt;br /&gt;
		local collapse = require('Module:Collapse').main&lt;br /&gt;
		local bg_sets = { exist = {'#cfc', '#9c9'}, nonexist = {'#fcc', '#c99'} }&lt;br /&gt;
		local bg = 1&lt;br /&gt;
		local pageContent = mw.html.create('')&lt;br /&gt;
		for _, pid in pairs(coreData.page.order) do&lt;br /&gt;
			local content&lt;br /&gt;
			local bgs = coreData.page[pid].exists and bg_sets.exist or bg_sets.nonexist&lt;br /&gt;
			if coreData.page[pid].namespace == 828 and not coreData.page[pid].isDocPage then&lt;br /&gt;
				content = frame:expandTemplate{ title = 'Code', args = {lang = 'lua', code = coreData.page[pid].content, line = '1'}}&lt;br /&gt;
			else&lt;br /&gt;
				content = '&amp;lt;pre style=&amp;quot;white-space:-moz-pre-wrap; white-space:-pre-wrap; white-space:-o-pre-wrap; white-space:pre-wrap; word-wrap:break-word;&amp;quot;&amp;gt;' .. &lt;br /&gt;
					mw.text.nowiki(frame:preprocess(coreData.page[pid].content)) .. '&amp;lt;/pre&amp;gt;'&lt;br /&gt;
			end&lt;br /&gt;
			pageContent:wikitext(collapse({ header = 'Contents of &amp;lt;b&amp;gt;[[:' .. coreData.page[pid].name .. ']]&amp;lt;/b&amp;gt; ' ..&lt;br /&gt;
							'&amp;lt;span class=&amp;quot;plainlinks&amp;quot; style=&amp;quot;font-size:75%;&amp;quot;&amp;gt;&amp;amp;#91;[' .. coreData.page[pid].editlink ..&lt;br /&gt;
							' EDIT]&amp;amp;#93;&amp;lt;/span&amp;gt;',&lt;br /&gt;
						content = content, left = true, bg = bgs[bg]&lt;br /&gt;
					}))&lt;br /&gt;
				:newline()&lt;br /&gt;
			bg = (bg == 2 and 1 or 2)&lt;br /&gt;
		end&lt;br /&gt;
		if thisUsesSmw and coreData.properties.order then&lt;br /&gt;
			-- add here the collpases of the properties&lt;br /&gt;
			local message = mw.message.new('classengine-template-property-page')&lt;br /&gt;
			pageContent:tag('p')&lt;br /&gt;
				:wikitext('&amp;lt;h3&amp;gt;All property pages&amp;lt;/h3&amp;gt;')&lt;br /&gt;
				:done()&lt;br /&gt;
			for _, property in pairs(coreData.properties.order) do&lt;br /&gt;
				local bgs = coreData.page[pid].exists and bg_sets.exist or bg_sets.nonexist&lt;br /&gt;
				local content = '&amp;lt;pre style=&amp;quot;white-space:-moz-pre-wrap; white-space:-pre-wrap; white-space:-o-pre-wrap; white-space:pre-wrap; word-wrap:break-word;&amp;quot;&amp;gt;' .. &lt;br /&gt;
					mw.text.nowiki(frame:preprocess(coreData.properties.data[property].content)) .. '&amp;lt;/pre&amp;gt;'&lt;br /&gt;
				pageContent:wikitext(collapse({ header = 'Contents of &amp;lt;b&amp;gt;[[:Property:' .. property .. ']]&amp;lt;/b&amp;gt; ' ..&lt;br /&gt;
								'&amp;lt;span class=&amp;quot;plainlinks&amp;quot; style=&amp;quot;font-size:75%;&amp;quot;&amp;gt;&amp;amp;#91;[' .. coreData.properties.data[property].editlink ..&lt;br /&gt;
								' EDIT]&amp;amp;#93;&amp;lt;/span&amp;gt;',&lt;br /&gt;
							content = content, left = true, bg = bgs[bg]&lt;br /&gt;
						}))&lt;br /&gt;
					:newline()&lt;br /&gt;
				bg = (bg == 2 and 1 or 2)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		local updateWarning = mw.html.create('')&lt;br /&gt;
		if coreData.now_timestamp - coreData.edit_timestamp &amp;lt; 2*60*60 then&lt;br /&gt;
			local mbox = require('Module:Message box')&lt;br /&gt;
			updateWarning:wikitext(mbox.main('ombox', { type='content', text = 'Note: You updated the class ' .. coreData.edit_time_before .. ' ago. Did you write your [[#Page contents|config file]] new? ' ..&lt;br /&gt;
						'Changes won\'t take effect unless you do!' .. ((thisUsesCargo and cargoTableCreateLink) and '&amp;lt;p&amp;gt;&amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;Also: If you changed your cargo table\'s declaration, [' .. &lt;br /&gt;
						coreData.page.template.editlink .. ' edit your template] and [[#Page autocreation|rebuild your cargo table]]!&amp;lt;/span&amp;gt;' or '')}))&lt;br /&gt;
				:newline()&lt;br /&gt;
		end&lt;br /&gt;
		local smwPropertyHint = mw.html.create('')&lt;br /&gt;
		if (FoundationClass.globalConfig.dataStore == 'both' or FoundationClass.globalConfig.dataStore == 'smw')&lt;br /&gt;
				and FoundationClass.myYesno(coreData.global_smwUseStorage)&lt;br /&gt;
				and not coreData.property.order then&lt;br /&gt;
			local mbox = require('Module:Message box')&lt;br /&gt;
			smwPropertyHint:wikitext(mbox.main('ombox', { type='info', text = 'Hint: If you use properties in your class, they will not display in &amp;lt;i&amp;gt;Page contents&amp;lt;/i&amp;gt;, nor be listed in &amp;lt;i&amp;gt;Page status&amp;lt;/i&amp;gt; or '&lt;br /&gt;
					.. 'autocreated in &amp;lt;i&amp;gt;Page autocreation&amp;lt;/i&amp;gt; unless you have your class and config page created!'}))&lt;br /&gt;
				:newline()&lt;br /&gt;
		end&lt;br /&gt;
		-- assemble everything&lt;br /&gt;
		local html = mw.html.create('')&lt;br /&gt;
		html:wikitext(coreData.global_description)&lt;br /&gt;
			:newline()&lt;br /&gt;
			:node(updateWarning)&lt;br /&gt;
			:node(manual)&lt;br /&gt;
			:newline()&lt;br /&gt;
			:node(datastore)&lt;br /&gt;
			:wikitext('&amp;lt;h2&amp;gt;Page status&amp;lt;/h2&amp;gt;')&lt;br /&gt;
			:newline()&lt;br /&gt;
			:wikitext(autoCreation and 'This status may be inaccurate, if you just created pages. In that case, run jobs and clear cache of this page.' or '')&lt;br /&gt;
			:node(statusTable)&lt;br /&gt;
			:newline()&lt;br /&gt;
			:node(pageAutoCreation)&lt;br /&gt;
			:wikitext('&amp;lt;h2&amp;gt;Page contents&amp;lt;/h2&amp;gt;')&lt;br /&gt;
			:newline()&lt;br /&gt;
			:node(pageContent)&lt;br /&gt;
			:newline()&lt;br /&gt;
			:done()&lt;br /&gt;
		local debugLevel = FoundationClass.globalConfig.debugLevel or _CFG.global.debugLevel&lt;br /&gt;
		if debugLevel then&lt;br /&gt;
			html:tag('pre')&lt;br /&gt;
--				:wikitext(FoundationClass.myTableTools.printTable(coreData))&lt;br /&gt;
--				:wikitext(FoundationClass.myTableTools.printTable(thisClass:smwProperty2ParameterTranslationTable()))&lt;br /&gt;
				:wikitext(ClassDebug:printLog(debugLevel))&lt;br /&gt;
				:done()&lt;br /&gt;
		end&lt;br /&gt;
		self:addOutput(html)&lt;br /&gt;
&lt;br /&gt;
		return true&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Classgenerator:myArgumentProcessing(coreData)&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator:myArgumentProcessing(args) to process coreData, from ' .. tostring(self))&lt;br /&gt;
	-- function that performs some individual transformation args --&amp;amp;amp;gt; coreData&lt;br /&gt;
	local _CFG = self.class.myConfiguration&lt;br /&gt;
	local coreData = coreData&lt;br /&gt;
	local lang = mw.language.new('en')&lt;br /&gt;
	coreData.className = lang:ucfirst(mw.text.trim(mw.ustring.gsub(self:getUid(), ':', '')))&lt;br /&gt;
	coreData.edit_timestamp = lang:formatDate('U', coreData.global_edit_timestamp)&lt;br /&gt;
	coreData.now_timestamp = lang:formatDate('U') + 60*60&lt;br /&gt;
	coreData.edit_time_before = lang:formatDuration(coreData.now_timestamp-coreData.edit_timestamp)&lt;br /&gt;
	coreData.last_edited = lang:formatDate('d.m.Y H:i:s', coreData.global_edit_timestamp)&lt;br /&gt;
	if coreData.global_gardeningCategory_chooser and mw.ustring.lower(coreData.global_gardeningCategory_chooser) == 'global' then&lt;br /&gt;
		coreData.global_gardeningCategory = 'superglobal.gardeningCategory'&lt;br /&gt;
	end&lt;br /&gt;
	if mw.ustring.find(coreData.className, ' ', 1, true) then&lt;br /&gt;
		local tmp = ''&lt;br /&gt;
		for fragment in mw.text.gsplit(coreData.className, ' ', true) do&lt;br /&gt;
			tmp = tmp .. lang:ucfirst(fragment)&lt;br /&gt;
		end&lt;br /&gt;
		coreData.className = tmp&lt;br /&gt;
	end&lt;br /&gt;
	if coreData.global_cargoTable then&lt;br /&gt;
		coreData.global_cargoTable = mw.ustring.gsub(mw.ustring.lower(coreData.global_cargoTable), ' ', '_')&lt;br /&gt;
	end&lt;br /&gt;
	if coreData.form_createInfotext and #coreData.form_createInfotext &amp;gt; 0 and mw.ustring.sub(coreData.form_createInfotext, -1) ~= ' ' then&lt;br /&gt;
		coreData.form_createInfotext = coreData.form_createInfotext .. ' '&lt;br /&gt;
	end&lt;br /&gt;
	local parameter_parameter&lt;br /&gt;
	local fieldOrder&lt;br /&gt;
	if coreData.parameter_parameter then&lt;br /&gt;
		parameters = ''&lt;br /&gt;
		fieldOrder = {}&lt;br /&gt;
		local classGenParamConfig = mw.loadData('Module:Classgenerator/parameter/config')&lt;br /&gt;
		for result in mw.text.gsplit(coreData.parameter_parameter, classGenParamConfig.template.delimiterResult, true) do&lt;br /&gt;
			local fieldname, parameter = mw.ustring.match(result, '^([^#]*)' .. classGenParamConfig.template.delimiterFormFieldName .. '(.+)$')&lt;br /&gt;
			if fieldname and mw.ustring.len(mw.text.trim(fieldname)) &amp;gt; 0 then&lt;br /&gt;
				table.insert(fieldOrder, mw.text.trim(fieldname))&lt;br /&gt;
			end&lt;br /&gt;
			if parameter and mw.ustring.len(parameter) &amp;gt; 0 then&lt;br /&gt;
				parameters = parameters .. parameter&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	coreData.parameter_parameter = parameters&lt;br /&gt;
	coreData.form_enable = FoundationClass.myYesno(coreData.form_enable)&lt;br /&gt;
	if coreData.form_enable then&lt;br /&gt;
		coreData.form_fieldOrder = fieldOrder&lt;br /&gt;
		form_buttons = { 'save' }&lt;br /&gt;
		if coreData.form_buttons and #coreData.form_buttons &amp;gt; 0 then&lt;br /&gt;
			for _, button in pairs(coreData.form_buttons) do&lt;br /&gt;
				table.insert(form_buttons, button)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		table.insert(form_buttons, 'cancel')&lt;br /&gt;
	end&lt;br /&gt;
	coreData.form_buttons = form_buttons&lt;br /&gt;
	-- here build the class config&lt;br /&gt;
	local contentClassConfig = mw.ustring.gsub(_CFG.template.configIntro, _CFG.template.placeHolderClassName, coreData.className) ..&lt;br /&gt;
		'local global = {\n' ..&lt;br /&gt;
		'\tdebugLevel = false,'&lt;br /&gt;
	if self.class.myConfiguration.template.addCommentsToConfig then&lt;br /&gt;
		contentClassConfig = contentClassConfig .. '\t-- set this to the level you wish to display at render. false if disabled. this is a class based setting. ' ..&lt;br /&gt;
			'you can set this globally at Foundationclass/globalconfig, causing all child classes to debug.'&lt;br /&gt;
	end&lt;br /&gt;
	contentClassConfig = contentClassConfig .. '\n'&lt;br /&gt;
	-- calculate the fieldlists:&lt;br /&gt;
	local fieldlists = {}&lt;br /&gt;
	for _, field in pairs(_CFG.form.fieldOrder) do&lt;br /&gt;
		local tab = mw.ustring.match(field, '^([a-z]+)_.+')&lt;br /&gt;
		if not fieldlists[tab] then&lt;br /&gt;
			fieldlists[tab] = {}&lt;br /&gt;
		end&lt;br /&gt;
		table.insert(fieldlists[tab], field)&lt;br /&gt;
	end&lt;br /&gt;
	local omissionList = {'global_autocreate_module', 'global_autocreate_template', 'global_autocreate_form', 'global_autocreate_category', 'global_autocreate_property', 'global_edit_timestamp', 'global_gardeningCategory_chooser',&lt;br /&gt;
		'form_textareaAttributes_cols', 'form_textareaAttributes_rows', 'form_textareaAttributes_autogrow', 'form_textareaAttributes_editor', 'form_createLinkInfo', &lt;br /&gt;
		'global_customization', 'form_customization', 'template_customization' }&lt;br /&gt;
	for _, attr in pairs(fieldlists.global) do&lt;br /&gt;
		if not Classgenerator.myTableTools.inTable(omissionList, attr) and self.class.myConfiguration.parameter[attr] then&lt;br /&gt;
			contentClassConfig = contentClassConfig .. _processAttribute(self, attr, '\t')&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if coreData.global_customization then&lt;br /&gt;
		for line in mw.text.gsplit(coreData.global_customization, '\n', true) do&lt;br /&gt;
			contentClassConfig = contentClassConfig .. '\t' .. line .. '\n'&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	contentClassConfig = contentClassConfig .. '}\n\nlocal form = {\n'&lt;br /&gt;
	for _, attr in pairs(fieldlists.form) do&lt;br /&gt;
		if not Classgenerator.myTableTools.inTable(omissionList, attr) and self.class.myConfiguration.parameter[attr] then&lt;br /&gt;
			contentClassConfig = contentClassConfig .. _processAttribute(self, attr, '\t')&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	contentClassConfig = contentClassConfig .. '\ttextareaAttributes = {	-- the defaults for your textarea fields\n'&lt;br /&gt;
	for _, attr in pairs({'form_textareaAttributes_cols', 'form_textareaAttributes_rows', 'form_textareaAttributes_autogrow', 'form_textareaAttributes_editor'}) do&lt;br /&gt;
		local name = mw.ustring.match(attr, '^form_textareaAttributes_(.+)$')&lt;br /&gt;
		contentClassConfig = contentClassConfig .. _processAttribute(self, attr, '\t\t', name)&lt;br /&gt;
	end&lt;br /&gt;
	contentClassConfig = contentClassConfig .. '\t},\n'&lt;br /&gt;
	contentClassConfig = contentClassConfig .. _processAttribute(self, 'form_fieldOrder', '\t')&lt;br /&gt;
	if coreData.form_customization then&lt;br /&gt;
		for line in mw.text.gsplit(coreData.form_customization, '\n', true) do&lt;br /&gt;
			contentClassConfig = contentClassConfig .. '\t' .. line .. '\n'&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	contentClassConfig = contentClassConfig .. '}\n\nlocal template = {\n'&lt;br /&gt;
	for _, attr in pairs(fieldlists.template) do&lt;br /&gt;
		if not Classgenerator.myTableTools.inTable(omissionList, attr) and self.class.myConfiguration.parameter[attr] then&lt;br /&gt;
			contentClassConfig = contentClassConfig .. _processAttribute(self, attr, '\t')&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if coreData.template_customization then&lt;br /&gt;
		for line in mw.text.gsplit(coreData.template_customization, '\n', true) do&lt;br /&gt;
			contentClassConfig = contentClassConfig .. '\t' .. mw.text.trim(line) .. '\n'&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	contentClassConfig = contentClassConfig .. '}\n\nlocal parameter = {\n' .. coreData.parameter_parameter .. '}\n\n' ..&lt;br /&gt;
		'return {\n' ..&lt;br /&gt;
		'\tform = form,\n' ..&lt;br /&gt;
		'\tglobal = global,\n' ..&lt;br /&gt;
		'\tparameter = parameter,\n' ..&lt;br /&gt;
		'\ttemplate = template,\n}\n'&lt;br /&gt;
	local classCategory = Classgenerator.globalConfig.classCategory or 'none'&lt;br /&gt;
	local formCategory = Classgenerator.globalConfig.formCategory or 'none'&lt;br /&gt;
	local gardeningCategory = Classgenerator.globalConfig.gardeningSuperCategory or 'none'&lt;br /&gt;
	local moduleCategory = Classgenerator.globalConfig.moduleCategory or 'none'&lt;br /&gt;
	local propertyCategory = Classgenerator.globalConfig.propertyCategory or 'none'&lt;br /&gt;
	local superCategory = Classgenerator.globalConfig.projectSuperCategory or 'none'&lt;br /&gt;
	local templateCategory = Classgenerator.globalConfig.templateCategory or 'none'&lt;br /&gt;
	local page = {}&lt;br /&gt;
	page.order = {'base', 'baseDoc', 'class', 'classDoc', 'config', 'configDoc', 'template', 'templateDoc'}&lt;br /&gt;
	page.base = {&lt;br /&gt;
		name = 'Module:' .. _private[self].pagename,&lt;br /&gt;
		content = mw.message.new('classengine-template-module-page'):rawParams(_private[self].pagename):plain()&lt;br /&gt;
	}&lt;br /&gt;
	page.baseDoc = {&lt;br /&gt;
		name = 'Module:' .. _private[self].pagename .. '/doc',&lt;br /&gt;
		content = mw.message.new('classengine-template-module-documentation-page'):rawParams(_private[self].pagename, moduleCategory):plain()&lt;br /&gt;
	}&lt;br /&gt;
	page.class = {&lt;br /&gt;
		name = 'Module:' .. _private[self].pagename .. '/class',&lt;br /&gt;
		content = mw.message.new('classengine-template-module-class-page'):rawParams(_private[self].pagename, coreData.className):plain()&lt;br /&gt;
	}&lt;br /&gt;
	page.classDoc = {&lt;br /&gt;
		name = 'Module:' .. _private[self].pagename .. '/class/doc',&lt;br /&gt;
		content = mw.message.new('classengine-template-module-class-documentation-page'):rawParams(_private[self].pagename, coreData.className, moduleCategory, classCategory):plain()&lt;br /&gt;
	}&lt;br /&gt;
	page.config = {&lt;br /&gt;
		name = 'Module:' .. _private[self].pagename .. '/config',&lt;br /&gt;
		content = contentClassConfig,&lt;br /&gt;
	}&lt;br /&gt;
	page.configDoc = {&lt;br /&gt;
		name = 'Module:' .. _private[self].pagename .. '/config/doc',&lt;br /&gt;
		content = mw.message.new('classengine-template-module-config-documentation-page'):rawParams(_private[self].pagename, moduleCategory, classCategory):plain()&lt;br /&gt;
	}&lt;br /&gt;
	page.template = {&lt;br /&gt;
		name = 'Template:' .. coreData.template_name,&lt;br /&gt;
		content = mw.message.new('classengine-template-template-page'):rawParams(_private[self].pagename):plain()&lt;br /&gt;
	}&lt;br /&gt;
	page.templateDoc = {&lt;br /&gt;
		name = 'Template:' .. coreData.template_name .. '/doc',&lt;br /&gt;
		content = mw.message.new('classengine-template-template-documentation-page'):rawParams(_private[self].pagename, templateCategory):plain()&lt;br /&gt;
	}&lt;br /&gt;
	if coreData.form_name and #coreData.form_name &amp;gt; 0 then&lt;br /&gt;
		table.insert(page.order, 'form')&lt;br /&gt;
		page.form = {&lt;br /&gt;
			name = 'Form:' .. coreData.form_name,&lt;br /&gt;
			content = mw.message.new('classengine-template-form-page'):rawParams(_private[self].pagename, formCategory):plain()&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
	if coreData.global_category and #coreData.global_category&amp;gt; 0 then&lt;br /&gt;
		table.insert(page.order, 'category')&lt;br /&gt;
		page.category = {&lt;br /&gt;
			name = 'Category:' .. coreData.global_category,&lt;br /&gt;
			content = mw.message.new('classengine-template-category-page'):rawParams(_private[self].pagename, superCategory):plain()&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
	if coreData.global_gardeningCategory and #coreData.global_gardeningCategory &amp;gt; 0 then&lt;br /&gt;
		table.insert(page.order, 'gardeningCategory')&lt;br /&gt;
		local pagename = coreData.global_gardeningCategory&lt;br /&gt;
		if pagename == 'superglobal.gardeningCategory' then&lt;br /&gt;
			pagename = FoundationClass.globalConfig.gardeningCategory&lt;br /&gt;
		end&lt;br /&gt;
		page.gardeningCategory = {&lt;br /&gt;
			name = 'Category:' .. pagename,&lt;br /&gt;
			content = mw.message.new('classengine-template-gardeningcategory-page'):rawParams(_private[self].pagename, gardeningCategory):plain()&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
	for _, pid in pairs(page.order) do&lt;br /&gt;
		local obj = mw.title.new(page[pid].name)&lt;br /&gt;
		page[pid].exists = obj.exists&lt;br /&gt;
		page[pid].namespace = obj.namespace&lt;br /&gt;
		page[pid].editlink = obj:fullUrl{action='edit'}&lt;br /&gt;
		if pid == 'template' then&lt;br /&gt;
			page[pid].recreatedata = obj:fullUrl{action='recreatedata'}&lt;br /&gt;
		end&lt;br /&gt;
		page[pid].isDocPage = (mw.ustring.sub(page[pid].name, -4) == '/doc')&lt;br /&gt;
		if page[pid].isDocPage then&lt;br /&gt;
			page[pid].content = page[pid].content .. '&amp;lt;h2&amp;gt;Maintenanace notes&amp;lt;/h2&amp;gt;\n' ..&lt;br /&gt;
				'This page was created by [[Module:Classgenerator]] and belongs to [[' .. self:getUid() .. ']].\n'&lt;br /&gt;
			if pid == 'configDoc' then&lt;br /&gt;
				page[pid].content = page[pid].content .. '\n{{((}}ombox| type=content | text = It is strongly advised, to not edit this page but to use [' ..&lt;br /&gt;
				'https://{{((}}SERVERNAME{{))}}{{((}}SCRIPTPATH{{))}}/Special:FormEdit/Classgenerator/' .. mw.uri.encode(self:getUid(), &amp;quot;PATH&amp;quot;) .. ' ' .. &lt;br /&gt;
					'the Classgenerator form] instead! After that, use your new configuration to replace the contents of this page.{{))}}'&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	local thisClass&lt;br /&gt;
	local thisConfig&lt;br /&gt;
	if page.class.exists and page.config.exists then&lt;br /&gt;
		thisClass = require(page.class.name)&lt;br /&gt;
		thisConfig = require(page.config.name)&lt;br /&gt;
	end&lt;br /&gt;
	if page.form and (not coreData.form_typeCreateLink or coreData.form_typeCreateLink ~= 'forminput') and coreData.form_createLinkPageName and mw.ustring.len(coreData.form_createLinkPageName) &amp;gt; 0 then&lt;br /&gt;
		local pageName = coreData.form_createLinkPageName&lt;br /&gt;
		if coreData.global_namespace and mw.ustring.len(coreData.global_namespace) &amp;gt; 0 and not mw.ustring.match(pageName, '^' .. coreData.global_namespace .. ':.+$') then&lt;br /&gt;
			pageName = coreData.global_namespace .. ':' .. pageName&lt;br /&gt;
		end&lt;br /&gt;
		local infostr = '{{((}}{info|page name=' .. pageName .. '|add title=' .. (coreData.form_labelCreate or 'create entity') .. '|edit title=' .. (coreData.form_labelEdit or 'edit entity') .. '}{{))}}'&lt;br /&gt;
		page.form.content = page.form.content .. '&amp;lt;!{{#invoke:String|rep|-|2}} this is a workaround, needed because of a SF bug: ' .. infostr ..&lt;br /&gt;
			'. see https://phabricator.wikimedia.org/T123230 for more information {{#invoke:String|rep|-|2}}&amp;gt;'&lt;br /&gt;
	end&lt;br /&gt;
	coreData.page = page&lt;br /&gt;
	local autocreate = {}&lt;br /&gt;
	autocreate.module = FoundationClass.myYesno(coreData.global_autocreate_module, tonumber(coreData.global_autocreate_module))&lt;br /&gt;
	autocreate.template = FoundationClass.myYesno(coreData.global_autocreate_template, tonumber(coreData.global_autocreate_template))&lt;br /&gt;
	autocreate.form = coreData.form_name and FoundationClass.myYesno(coreData.global_autocreate_form, tonumber(coreData.global_autocreate_form))&lt;br /&gt;
	autocreate.category = (coreData.global_category or coreData.global_gardeningCategory) and FoundationClass.myYesno(coreData.global_autocreate_category, tonumber(coreData.global_autocreate_category))&lt;br /&gt;
	if (FoundationClass.globalConfig.dataStore == 'both' or FoundationClass.globalConfig.dataStore == 'smw') and FoundationClass.myYesno(coreData.global_smwUseStorage) then&lt;br /&gt;
		local propertyNSName = _namespaceName(self, mw.title.new('NUL', 'Property').namespace)&lt;br /&gt;
		autocreate[propertyNSName] = FoundationClass.myYesno(coreData['global_autocreate_' .. propertyNSName], tonumber(coreData['global_autocreate_' .. propertyNSName]))&lt;br /&gt;
	end&lt;br /&gt;
	coreData.autocreate = autocreate&lt;br /&gt;
	local propertyData&lt;br /&gt;
	local propertyOrder&lt;br /&gt;
	if (FoundationClass.globalConfig.dataStore == 'both' or FoundationClass.globalConfig.dataStore == 'smw') and FoundationClass.myYesno(coreData.global_smwUseStorage) and thisClass and thisConfig then&lt;br /&gt;
		-- we use smw and class and config are created and accessible. we can get property information and prepare data&lt;br /&gt;
		local matrix = thisClass:smwGetProperty2ParameterTranslationTable()&lt;br /&gt;
		propertyData = {}&lt;br /&gt;
		propertyOrder = {}&lt;br /&gt;
		for property, parameter in pairs(matrix) do&lt;br /&gt;
			table.insert(propertyOrder, property)&lt;br /&gt;
			local obj = mw.title.new(property, 'Property')&lt;br /&gt;
			propertyData[property] = { &lt;br /&gt;
				editlink = obj:fullUrl{action='edit'},&lt;br /&gt;
				exists = obj.exists,&lt;br /&gt;
				parameter = parameter,&lt;br /&gt;
			}&lt;br /&gt;
			if thisConfig.parameter[parameter] then&lt;br /&gt;
				propertyData[property].description = thisConfig.parameter[parameter].description&lt;br /&gt;
				propertyData[property].type = thisConfig.parameter[parameter].property_type&lt;br /&gt;
				propertyData[property].values = thisConfig.parameter[parameter].values&lt;br /&gt;
			elseif parameter == FoundationClass.globalConfig.smwClassProperty then&lt;br /&gt;
				propertyData[property].description = 'Automatisch hinzugefügt! Wird verwendet, um Mitglieder dieser Klasse zu finden (funktioniert auch, ohne dass eine Kategorie definiert wird und auch fur subobjects)'&lt;br /&gt;
				propertyData[property].type = 'Text'&lt;br /&gt;
			elseif parameter == FoundationClass.globalConfig.uidFieldName then&lt;br /&gt;
				propertyData[property].description = 'Automatisch hinzugefügt! Wird verwendet, um individuelle Objekte innerhalb der Klasse zu identifizieren.'&lt;br /&gt;
				propertyData[property].type = 'Text'&lt;br /&gt;
			end&lt;br /&gt;
			local values = ''&lt;br /&gt;
			if propertyData[property].values then&lt;br /&gt;
				values = values .. 'The allowed values are:'&lt;br /&gt;
				for _, value in pairs(propertyData[property].values) do&lt;br /&gt;
					values = values .. '\n* [[Allows value::' .. value .. ']]'&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				values = 'No restriction given'&lt;br /&gt;
			end&lt;br /&gt;
			propertyData[property].content = mw.message.new('classengine-template-property-page'):rawParams(propertyData[property].description, propertyData[property].type, values, propertyCategory):plain()&lt;br /&gt;
		end&lt;br /&gt;
		table.sort(propertyOrder)&lt;br /&gt;
	end&lt;br /&gt;
	coreData.properties = { data = propertyData, order = propertyOrder }&lt;br /&gt;
	return coreData	-- this is your new coreData.&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Classgenerator:myPlausibilityTest(args)&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator:myPlausibilityTest(args) to test arguments, from ' .. tostring(self))&lt;br /&gt;
	-- function that performs the individual plausibility tests&lt;br /&gt;
	-- note: before you access a field args.fieldname you should check for existance&lt;br /&gt;
	-- self:addError(text)&lt;br /&gt;
	return false	-- return value will be ignored. but if you add any error, the object's initialization will fail with the error&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Classgenerator:myStashAdjustments(stash)&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator:myStashAdjustments(stash) to do some minor adjustments on data before storing, from ' .. tostring(self))&lt;br /&gt;
	-- function that alters the stash before storing the data&lt;br /&gt;
	local stash = stash&lt;br /&gt;
	return stash	-- this is your new stash. this will be stored. it has format (fieldname: value)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Classgenerator:method()&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator:method() to do something, from ' .. tostring(self))&lt;br /&gt;
	return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return Classgenerator&lt;/div&gt;</summary>
		<author><name>Anatol</name></author>
	</entry>
	<entry>
		<id>https://camnet.oetterer.eu/index.php?title=Modul:Classgenerator/class&amp;diff=1007</id>
		<title>Modul:Classgenerator/class</title>
		<link rel="alternate" type="text/html" href="https://camnet.oetterer.eu/index.php?title=Modul:Classgenerator/class&amp;diff=1007"/>
		<updated>2016-02-09T20:50:52Z</updated>

		<summary type="html">&lt;p&gt;Anatol: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local FoundationClass = require('Module:Foundationclass')&lt;br /&gt;
local ClassDebug = require('Module:Debug/class')&lt;br /&gt;
&lt;br /&gt;
-- ****************************************************************&lt;br /&gt;
-- *                         inheritance                          *&lt;br /&gt;
-- ****************************************************************&lt;br /&gt;
local Classgenerator = FoundationClass:subclass('Classgenerator')&lt;br /&gt;
-- setting class's configuration data&lt;br /&gt;
Classgenerator.static.myConfiguration = mw.loadData('Module:Classgenerator/config')&lt;br /&gt;
--   being in a static method, use self.myConfiguration&lt;br /&gt;
--   being in a private method, that knows self or in a public method, use self.class.myConfiguration&lt;br /&gt;
&lt;br /&gt;
-- ****************************************************************&lt;br /&gt;
-- *                          properties                          *&lt;br /&gt;
-- ****************************************************************&lt;br /&gt;
&lt;br /&gt;
-- **************** initialization of table for private properties&lt;br /&gt;
local _private = setmetatable({}, {__mode = 'k'})   -- weak table storing all private attributes&lt;br /&gt;
&lt;br /&gt;
-- **************** declaration of public static properties&lt;br /&gt;
-- Classgenerator.static.myPropertyModule = require('Module:extern')&lt;br /&gt;
-- Classgenerator.static.staticProperty = 'value'&lt;br /&gt;
&lt;br /&gt;
-- remember the static classes provided by Foundationclass:&lt;br /&gt;
-- Classgenerator.globalConfig&lt;br /&gt;
-- Classgenerator.myCargoUtil&lt;br /&gt;
-- Classgenerator.myTableTools&lt;br /&gt;
&lt;br /&gt;
-- **************** declaration of (global) private properties&lt;br /&gt;
-- for properties you should rather use constructor and _private[self]. this only, if you need a private class property&lt;br /&gt;
-- you should, however predeclare private methods here&lt;br /&gt;
local _debug	-- private method declared later&lt;br /&gt;
local _privateMethodAhead	-- declaration ahead, so this private method can be used in the constructor and in other private methods&lt;br /&gt;
&lt;br /&gt;
-- ***************************************************************&lt;br /&gt;
-- *                           methods                           *&lt;br /&gt;
-- ***************************************************************&lt;br /&gt;
 &lt;br /&gt;
-- **************** declaration of static methods&lt;br /&gt;
function Classgenerator:initialize(uid)&lt;br /&gt;
	local _CFG = self.class.myConfiguration&lt;br /&gt;
	FoundationClass.initialize(self, uid)&lt;br /&gt;
	local page = mw.title.getCurrentTitle().text&lt;br /&gt;
	if uid and mw.ustring.match(uid, '^' .. _CFG.global.namespace .. ':.+$') then&lt;br /&gt;
		page = mw.ustring.match(uid, '^' .. _CFG.global.namespace .. ':(.+)$')&lt;br /&gt;
	end&lt;br /&gt;
	_private[self] = {&lt;br /&gt;
		dbg = ClassDebug:new(tostring(self.class) .. ': id ' .. uid),&lt;br /&gt;
		pagename = page&lt;br /&gt;
	}&lt;br /&gt;
	_debug(self, 1, ' Classgenerator: done initializing object &amp;amp;quot;' .. uid ..'&amp;amp;quot;, from ' .. tostring(self))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- use use self.myConfiguration to access your configuration in a static method&lt;br /&gt;
function Classgenerator.static:aStaticMethod(var)&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator.static:aStaticMethod() to do something, from ' .. tostring(self))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Classgenerator.static:mySfDynamicFieldAttribute(fieldname, attribute, value)&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator.static:mySfDynamicFieldAttribute(fieldname, attribute, value), from ' .. tostring(self))&lt;br /&gt;
	_debug(self, 2, ' with parameters &amp;amp;quot;' .. fieldname .. '&amp;amp;quot;, &amp;amp;quot;' .. attribute .. '&amp;amp;quot; and a ' .. type(value) .. ' value')&lt;br /&gt;
	-- function that can process any attribute/value pair just before rendering the semantic forms field&lt;br /&gt;
	-- usually done, to generate a dynamic 'default' value&lt;br /&gt;
	-- keep in mind: you can completely disable a form field, if you return true on attribute &amp;quot;disable&amp;quot;. note however, that this causes the field to not show at all, no data will be transported/saved&lt;br /&gt;
	local pagename = mw.title.getCurrentTitle().rootText&lt;br /&gt;
	local val = value&lt;br /&gt;
	if Classgenerator.myTableTools.inTable({'template_name', 'global_entityTitle'}, fieldname) and attribute == 'default' then&lt;br /&gt;
		val = pagename&lt;br /&gt;
	end&lt;br /&gt;
	if fieldname == 'global_cargoTable' and attribute == 'default' then&lt;br /&gt;
		val = mw.ustring.lower(pagename)&lt;br /&gt;
	end&lt;br /&gt;
	if Classgenerator.globalConfig.dataStore ~= 'cargo' and Classgenerator.globalConfig.dataStore ~= 'both' then&lt;br /&gt;
		if fieldname == 'global_cargoTable' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
		if fieldname == 'global_cargoUidFieldname' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if Classgenerator.globalConfig.dataStore ~= 'smw' and Classgenerator.globalConfig.dataStore ~= 'both' then&lt;br /&gt;
		if fieldname == 'global_smwIsSubobject' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
		if fieldname == 'global_smwUseStorage' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
		if fieldname == 'global_autocreate_property' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return val	-- this value will be used as new value for field's attribute&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Classgenerator.static:sfGenerateForm()&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator.static:sfGenerateForm(), from ' .. tostring(self))&lt;br /&gt;
	local _CFG = self.myConfiguration&lt;br /&gt;
	local ClassgeneratorParameter  = require('Module:Classgenerator/parameter/class')&lt;br /&gt;
	local ClassSFfield = require('Module:SFfield/class')&lt;br /&gt;
	local tagStart = '{{{'&lt;br /&gt;
	local tagEnd = '}}}'&lt;br /&gt;
	local frame = mw.getCurrentFrame()&lt;br /&gt;
	-- create the form header&lt;br /&gt;
	local notification = mw.html.create('')&lt;br /&gt;
	if _CFG.form.notification and mw.ustring.len(_CFG.form.notification) &amp;gt; 0 then&lt;br /&gt;
		local mbox = require('Module:Message box')&lt;br /&gt;
		notification:wikitext(mbox.main('ombox', { text = _CFG.form.notification }))&lt;br /&gt;
			:newline()&lt;br /&gt;
	end&lt;br /&gt;
	local formheader = mw.html.create('')&lt;br /&gt;
	formheader:wikitext(self:sfGenerateFormInfoTag())&lt;br /&gt;
		:wikitext('&amp;lt;h2&amp;gt;' .. _CFG.global.entityTitle .. '&amp;lt;/h2&amp;gt;')&lt;br /&gt;
		:tag('p')&lt;br /&gt;
			:wikitext(_CFG.form.headerText)&lt;br /&gt;
			:done()&lt;br /&gt;
			:newline()&lt;br /&gt;
		:node(notification)&lt;br /&gt;
		:tag('div')&lt;br /&gt;
			:attr('id', 'wikiPreview')&lt;br /&gt;
			:cssText('display: none; padding-bottom: 25px; margin-bottom: 25px; border-bottom: 1px solid #AAAAAA;')&lt;br /&gt;
			:done()&lt;br /&gt;
			:newline()&lt;br /&gt;
	-- create the form buttons&lt;br /&gt;
	local formbuttons = mw.html.create('div')&lt;br /&gt;
	for _, button in pairs(_CFG.form.buttons) do&lt;br /&gt;
		formbuttons:wikitext(tagStart .. 'standard input&amp;amp;#124;' .. button .. tagEnd)&lt;br /&gt;
	end&lt;br /&gt;
	formbuttons:addClass('formbuttons')&lt;br /&gt;
		:done()&lt;br /&gt;
	-- calculate the fieldlists:&lt;br /&gt;
	local fieldlists = {}&lt;br /&gt;
	for _, field in pairs(_CFG.form.fieldOrder) do&lt;br /&gt;
		local tab = mw.ustring.match(field, '^([a-z]+)_.+')&lt;br /&gt;
		if not fieldlists[tab] then&lt;br /&gt;
			fieldlists[tab] = {}&lt;br /&gt;
		end&lt;br /&gt;
		table.insert(fieldlists[tab], field)&lt;br /&gt;
	end&lt;br /&gt;
	-- assemble everything, so start the html object&lt;br /&gt;
	local html = mw.html.create('div')&lt;br /&gt;
	html:node(formheader)&lt;br /&gt;
		:wikitext('&amp;lt;h1&amp;gt;GLOBAL-Section&amp;lt;/h1&amp;gt;')&lt;br /&gt;
		:newline()&lt;br /&gt;
		:tag('div')&lt;br /&gt;
			:wikitext('This section deals with all the class\'s global data, i.e. all data you need for your &amp;quot;template&amp;quot; part as wenn as for your form, ... ')&lt;br /&gt;
			:done()&lt;br /&gt;
			:newline()&lt;br /&gt;
		:wikitext(tagStart .. 'for template|' .. _CFG.template.name .. '|label=' .. _CFG.global.entityTitle .. tagEnd)&lt;br /&gt;
		:newline()&lt;br /&gt;
		:node(self:sfGenerateFormTable(fieldlists.global))&lt;br /&gt;
		:newline()&lt;br /&gt;
		:wikitext('&amp;lt;h1&amp;gt;FORM-Section&amp;lt;/h1&amp;gt;')&lt;br /&gt;
		:newline()&lt;br /&gt;
		:tag('div')&lt;br /&gt;
			:wikitext('This section deals with all the data, you need to create and operate a form for this class. If you don\'t want a form, disable this section. ' ..&lt;br /&gt;
					'If you need a form (e.g. as part of another form), but no form page, enable this section but leave the field for form page name emtpy.')&lt;br /&gt;
			:done()&lt;br /&gt;
			:newline()&lt;br /&gt;
		:node(self:sfGenerateFormTable(fieldlists.form))&lt;br /&gt;
		:newline()&lt;br /&gt;
		:wikitext('&amp;lt;h1&amp;gt;TEMPLATE-Section&amp;lt;/h1&amp;gt;')&lt;br /&gt;
		:newline()&lt;br /&gt;
		:tag('div')&lt;br /&gt;
			:wikitext('This section deals with all the data, you need to create and operate a template for this class. If you need tempalte specific parameters ' ..&lt;br /&gt;
				'(meaning parameteres that you only need to operate the &amp;quot;action&amp;quot;-part), put them into this section\'s custom field')&lt;br /&gt;
			:done()&lt;br /&gt;
			:newline()&lt;br /&gt;
		:node(self:sfGenerateFormTable(fieldlists.template))&lt;br /&gt;
		:newline()&lt;br /&gt;
		:wikitext('&amp;lt;h1&amp;gt;PARAMETERS-Section&amp;lt;/h1&amp;gt;')&lt;br /&gt;
		:newline()&lt;br /&gt;
		:tag('div')&lt;br /&gt;
			:wikitext('This section deals with all your parameters. You need an entry for every form input field, every template parameter, every data field you want to store, and even every notification line.')&lt;br /&gt;
			:tag('ul')&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(&amp;quot;To produce a normal parameter, add an entry, choose storage type, set '''Regular form parameter''' to yes, choose a form input type, and a template doc type.&amp;quot;)&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(&amp;quot;If you want a data field to be stored in your data storage but not defined in the form, choose a data storage type and set '''Regular form parameter''' to no. &amp;quot;)&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(&amp;quot;If you want a mutiple template to be parsed to a parameter, create a normal parameter (as described above) and choose '''Regular form parameter''' to  be ''Holds template''.&amp;quot;)&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(&amp;quot;A parameter with a form input that is not stored is created like a regular parameter but without setting any data storage type.&amp;quot;)&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(&amp;quot;Finally, you can create a message line. This is useful, if you want to convey any information to the user, that is to important for a description-tooltip. &amp;quot; ..&lt;br /&gt;
						&amp;quot;What you need to do is disable everything ('''Template doc parameter type ''', data storage) and set '''Regular form parameter''' to ''Information''. &amp;quot; ..&lt;br /&gt;
						&amp;quot;You probalby want to add the parameter to one or more ''show on select'' entries, too.&amp;quot;)&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
				:done()&lt;br /&gt;
				:newline()&lt;br /&gt;
			:done()&lt;br /&gt;
			:newline()&lt;br /&gt;
		:node(self:sfInitField('parameter_parameter'):render())&lt;br /&gt;
		:newline()&lt;br /&gt;
		:wikitext(frame:extensionTag('headertabs'))&lt;br /&gt;
		:newline()&lt;br /&gt;
		:wikitext(&amp;quot;'''(*) Pflichtfeld'''&amp;quot;)&lt;br /&gt;
		:newline()&lt;br /&gt;
		:wikitext(tagStart .. 'end template' .. tagEnd)&lt;br /&gt;
		:newline()&lt;br /&gt;
		:wikitext(ClassgeneratorParameter:sfGenerateForm())&lt;br /&gt;
		:newline()&lt;br /&gt;
		:node(formbuttons)&lt;br /&gt;
	local debugLevel = FoundationClass.globalConfig.debugLevel or self.myConfiguration.global.debugLevel&lt;br /&gt;
	if debugLevel then&lt;br /&gt;
		html:newline()&lt;br /&gt;
			:newline()&lt;br /&gt;
			:wikitext(ClassDebug:printLog(debugLevel))&lt;br /&gt;
	end&lt;br /&gt;
	return html&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- **************** declaration of private methods&lt;br /&gt;
-- use self.class.myConfiguration to access your configuration in a public or a private method that is called by a public method&lt;br /&gt;
_debug = function (self, level, text)&lt;br /&gt;
	if _private[self] and _private[self].dbg then&lt;br /&gt;
		local debugLevel = FoundationClass.globalConfig.debugLevel or self.class.myConfiguration.global.debugLevel&lt;br /&gt;
		if debugLevel and level &amp;lt;= debugLevel then&lt;br /&gt;
			_private[self].dbg:log(level, text)&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		local debugLevel = FoundationClass.globalConfig.debugLevel or self.myConfiguration.global.debugLevel&lt;br /&gt;
		if debugLevel and level &amp;lt;= debugLevel then&lt;br /&gt;
			ClassDebug:log(level, text, tostring(self) .. '.static')&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local _namespaceName = function (self, namespaceId)&lt;br /&gt;
	_debug(self, 1, 'entering private _namespaceName() to translate namespace namespaceId ' .. namespaceId .. ' into a universal name, from ' .. tostring(self))&lt;br /&gt;
	local ret, nulProperty = pcall(mw.title.new, 'NUL', 'Property')&lt;br /&gt;
	if ret and (namespaceId == nulProperty.namespace) then&lt;br /&gt;
		return 'property'	-- if you change this, check on other places, this is checked against and change that, too&lt;br /&gt;
	else&lt;br /&gt;
		return mw.site.namespaces[namespaceId].canonicalName&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local _processAttribute = function (self, attr, indent, name)&lt;br /&gt;
	_debug(self, 1, 'entering private _processAttribute() to print a line for attribute ' .. attr .. ', from ' .. tostring(self))&lt;br /&gt;
	local coreData = self:getCoreData()&lt;br /&gt;
	local attr = attr&lt;br /&gt;
	local val = coreData[attr]&lt;br /&gt;
	if type(val) == 'boolean' then&lt;br /&gt;
		val = val and 'true' or 'false'&lt;br /&gt;
	end&lt;br /&gt;
	local ret = ''&lt;br /&gt;
	local fieldname = mw.ustring.match(attr, '^[^_]+_(.+)$')&lt;br /&gt;
	ret = indent .. (name and name or fieldname) .. ' = '&lt;br /&gt;
	if not val then&lt;br /&gt;
		ret = ret .. 'nil'&lt;br /&gt;
	elseif type(val) == 'table' then&lt;br /&gt;
		ret = ret .. Classgenerator.myTableTools.printTable(val, 'inline')&lt;br /&gt;
	elseif val == 'true' or val == 'false' or mw.ustring.match(val, '^[0-9]+$') or (attr == 'global_gardeningCategory' and val == 'superglobal.gardeningCategory') then&lt;br /&gt;
		ret = ret .. val&lt;br /&gt;
	else&lt;br /&gt;
		ret = ret .. &amp;quot;'&amp;quot; .. mw.ustring.gsub(mw.ustring.gsub(mw.ustring.gsub(val, &amp;quot;\\'&amp;quot;, &amp;quot;'&amp;quot;), &amp;quot;'&amp;quot;, &amp;quot;\\'&amp;quot;), '\n', '\\n\' ..\n' .. indent .. '\t\'') .. &amp;quot;'&amp;quot;	-- the gsub catches multiline input from textareas&lt;br /&gt;
	end&lt;br /&gt;
	ret = ret .. ','&lt;br /&gt;
	if self.class.myConfiguration.template.addCommentsToConfig then&lt;br /&gt;
		ret = ret .. '\t-- ' .. self.class.myConfiguration.parameter[attr].description&lt;br /&gt;
	end&lt;br /&gt;
	ret = ret .. '\n'&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local _privateMethod = function (self)&lt;br /&gt;
	_debug(self, 1, 'entering private _privateMethod() to do something, from ' .. tostring(self))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- **************** declaration of public methods&lt;br /&gt;
-- use self.class.myConfiguration to access your configuration in a public method&lt;br /&gt;
function Classgenerator:addInfobox()&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator:addInfobox(), from ' .. tostring(self))&lt;br /&gt;
	if self:goodToGo() then&lt;br /&gt;
		local _CFG = self.class.myConfiguration&lt;br /&gt;
		local coreData = self:getCoreData()&lt;br /&gt;
		local usesSmw = FoundationClass.globalConfig.dataStore and (FoundationClass.globalConfig.dataStore == 'both' or FoundationClass.globalConfig.dataStore == 'smw') and FoundationClass.myYesno(coreData.global_smwUseStorage)&lt;br /&gt;
		local ib_args = {&lt;br /&gt;
			bodyclass = 'infobox_name',&lt;br /&gt;
			aboveclass = 'objtitle titletext',&lt;br /&gt;
			headerclass = 'headertext',&lt;br /&gt;
			labelstyle = 'width: 30%;',&lt;br /&gt;
			datastyle = 'width: 70%;',&lt;br /&gt;
			title = coreData.className,&lt;br /&gt;
			subheader = 'Class',&lt;br /&gt;
			label1 = 'Title',&lt;br /&gt;
			data1 = coreData.global_entityTitle and coreData.global_entityTitle or '',&lt;br /&gt;
			label2 = _CFG.parameter.global_edit_timestamp.label,&lt;br /&gt;
			data2 = coreData.last_edited,&lt;br /&gt;
			label3 = 'Store available',&lt;br /&gt;
			data3 = (FoundationClass.globalConfig.dataStore and mw.ustring.len(FoundationClass.globalConfig.dataStore) &amp;gt; 0) and FoundationClass.globalConfig.dataStore or '',&lt;br /&gt;
			label5 = 'Cargo table',&lt;br /&gt;
			data5 = (FoundationClass.globalConfig.dataStore and (FoundationClass.globalConfig.dataStore == 'both' or FoundationClass.globalConfig.dataStore == 'cargo')) and coreData.global_cargoTable or '',&lt;br /&gt;
			label6 = 'Smw class',&lt;br /&gt;
			data6 = usesSmw and _private[self].pagename or '',&lt;br /&gt;
			data7 = coreData.global_description,&lt;br /&gt;
			header10 = 'Pages',&lt;br /&gt;
			label12 = 'Module',&lt;br /&gt;
			data12 = _private[self].pagename and '[[Module:' .. _private[self].pagename .. ']]' or '',&lt;br /&gt;
			label13 = 'Class',&lt;br /&gt;
			data13 = _private[self].pagename and '[[Module:' .. _private[self].pagename .. '/class]]' or '',&lt;br /&gt;
			label14 = 'Config',&lt;br /&gt;
			data14 = _private[self].pagename and '[[Module:' .. _private[self].pagename .. '/config]]' or '',&lt;br /&gt;
			label17 = 'Template',&lt;br /&gt;
			data17 = coreData.template_name and '[[Template:' .. coreData.template_name .. ']]' or '',&lt;br /&gt;
			label19 = 'Form',&lt;br /&gt;
			data19 = coreData.page.form and '[[:' .. coreData.page.form.name .. ']]' or '',&lt;br /&gt;
			label21 = 'Category',&lt;br /&gt;
			data21 = coreData.page.category and '[[:' .. coreData.page.category.name .. ']]' or '',&lt;br /&gt;
			label22 = 'Gardening',&lt;br /&gt;
			data22 = coreData.page.gardeningCategory and '[[:' .. coreData.page.gardeningCategory.name .. ']]' or '',&lt;br /&gt;
		}&lt;br /&gt;
		if usesSmw and coreData.properties.order and #coreData.properties.order &amp;gt; 0 then&lt;br /&gt;
			ib_args.header30 = 'Properties'&lt;br /&gt;
			local i = 31&lt;br /&gt;
			for _, property in pairs(coreData.properties.order) do&lt;br /&gt;
				ib_args['label' .. i] = coreData.properties.data[property].type&lt;br /&gt;
				ib_args['data' .. i] = '[[Property:' .. property .. '|' .. property .. ']]'&lt;br /&gt;
				i = i + 1&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		self:addOutput(require('Module:Infobox').infobox(ib_args))&lt;br /&gt;
		return true&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Classgenerator:addPageBody()&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator:addPageBody(), from ' .. tostring(self))&lt;br /&gt;
	_debug(self, 2, ' rendering errors and warnings and adding them to output')&lt;br /&gt;
	self:addOutput(self:renderErrors())&lt;br /&gt;
	self:addOutput(self:renderWarnings())&lt;br /&gt;
	if self:goodToGo() then&lt;br /&gt;
		local frame = mw.getCurrentFrame()&lt;br /&gt;
		local lang = mw.language.new('en-gb')&lt;br /&gt;
		local _CFG = self.class.myConfiguration&lt;br /&gt;
		local coreData = self:getCoreData()&lt;br /&gt;
		-- start&lt;br /&gt;
		local widthTh = '300px'&lt;br /&gt;
		local widthTd = '200px'&lt;br /&gt;
		-- build the page status table&lt;br /&gt;
		-- first the two status table cells &amp;quot;green&amp;quot; and &amp;quot;red&amp;quot;&lt;br /&gt;
		local imgYes = '[[File:Yes check.png|13px|alt=Yes|link=]]'&lt;br /&gt;
		local imgNo = '[[File:X mark.png|13px|alt=No|link=]]'&lt;br /&gt;
		local tdYa = mw.html.create('td')&lt;br /&gt;
		tdYa:cssText('background: #90ff90; color:black; vertical-align: middle; text-align: center; width:' .. widthTd)&lt;br /&gt;
			:addClass('table-yes')&lt;br /&gt;
			:wikitext(imgYes)&lt;br /&gt;
		local tdNa = mw.html.create('td')&lt;br /&gt;
		tdNa:cssText('background: #FF9090; color:black; vertical-align: middle; text-align: center; width:' .. widthTd)&lt;br /&gt;
			:addClass('table-no')&lt;br /&gt;
			:wikitext(imgNo)&lt;br /&gt;
		local classExists = coreData.page.class.exists and coreData.page.config.exists&lt;br /&gt;
		local modulesExist = coreData.page.base.exists and classExists&lt;br /&gt;
		local thisClass&lt;br /&gt;
		local thisConfig&lt;br /&gt;
		if classExists then&lt;br /&gt;
			thisClass = require(coreData.page.class.name)&lt;br /&gt;
			thisConfig = require(coreData.page.config.name)&lt;br /&gt;
		end&lt;br /&gt;
		local thisUsesCargo = (FoundationClass.globalConfig.dataStore == 'both' or FoundationClass.globalConfig.dataStore == 'cargo') and coreData.global_cargoTable and #coreData.global_cargoTable &amp;gt; 0&lt;br /&gt;
		local thisUsesSmw = (FoundationClass.globalConfig.dataStore == 'both' or FoundationClass.globalConfig.dataStore == 'smw') and FoundationClass.myYesno(coreData.global_smwUseStorage)&lt;br /&gt;
		-- write the 2do checklist&lt;br /&gt;
		local done = true&lt;br /&gt;
		local step1&lt;br /&gt;
		local step2&lt;br /&gt;
		local step3&lt;br /&gt;
		if modulesExist then&lt;br /&gt;
			step1 = imgYes .. ' You created all your modules'&lt;br /&gt;
		else&lt;br /&gt;
			done = false&lt;br /&gt;
			step1 = imgNo .. ' You have to create your module pages. This, you have to do &amp;lt;b&amp;gt;manually&amp;lt;/b&amp;gt;. Go to [[#Page contents|section Page contents]], copy the module content and edit the corresponding module, ' ..&lt;br /&gt;
				'pasting all the copied content. Save and close. You have to do this for the following module(s): &amp;lt;ul&amp;gt; ' ..&lt;br /&gt;
				(not coreData.page.base.exists and '&amp;lt;li&amp;gt;[[#Page contents|' .. coreData.page.base.name .. ']]&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
				(not coreData.page.class.exists and '&amp;lt;li&amp;gt;[[#Page contents|' .. coreData.page.class.name .. ']]&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
				(not coreData.page.config.exists and '&amp;lt;li&amp;gt;[[#Page contents|' .. coreData.page.config.name .. ']]&amp;lt;/li&amp;gt;' or '') .. '&amp;lt;/ul&amp;gt;'&lt;br /&gt;
		end&lt;br /&gt;
		if coreData.page.baseDoc.exists and coreData.page.classDoc.exists and coreData.page.configDoc.exists and coreData.page.template.exists and coreData.page.templateDoc.exists and&lt;br /&gt;
				(not coreData.page.form or coreData.page.form.exists) and (not coreData.page.category or coreData.page.category.exists) and (not coreData.page.gardeningCategory or coreData.page.gardeningCategory.exists) then&lt;br /&gt;
			step2 = imgYes .. ' You created all auxilliary pages'&lt;br /&gt;
		else&lt;br /&gt;
			done = false&lt;br /&gt;
			step2 = imgNo .. ' You have to create auxilliary pages. This, you can do &amp;lt;b&amp;gt;automatically&amp;lt;/b&amp;gt;. Go to [[#Page autocreation|section Page autocreation]], hit the corresponding &amp;quot;Create&amp;quot;-button or ' ..&lt;br /&gt;
				'create all pages at once. Please do this for the following page(s): &amp;lt;ul&amp;gt; ' ..&lt;br /&gt;
				(not (coreData.page.baseDoc.exists or coreData.page.classDoc.exists or coreData.page.configDoc.exists) and '&amp;lt;li&amp;gt;Module documentation pages&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
				(not (coreData.page.template.exists or coreData.page.templateDoc.exists) and '&amp;lt;li&amp;gt;Template and/or template documentation page&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
				((coreData.page.form and not coreData.page.form.exists) and '&amp;lt;li&amp;gt;Form page&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
				(((coreData.page.category and not coreData.page.category.exists) or (coreData.page.gardeningCategory and not coreData.page.gardeningCategory.exists)) and '&amp;lt;li&amp;gt;Category page(s)&amp;lt;/li&amp;gt;' or '') .. '&amp;lt;/ul&amp;gt;'&lt;br /&gt;
		end&lt;br /&gt;
		local storeCargoInstruction&lt;br /&gt;
		local allPropertiesThere&lt;br /&gt;
		local cargoTableCreateLink = false&lt;br /&gt;
		if thisUsesCargo then&lt;br /&gt;
			-- we actually use cargo. check, if cargo table is there or throws an error? if all right, then yes, else instruction above&lt;br /&gt;
			if modulesExist and coreData.page.template.exists then&lt;br /&gt;
				cargoTableCreateLink = true&lt;br /&gt;
				attr = { limit = 1, default = '' }&lt;br /&gt;
				attr['more results text'] = ''&lt;br /&gt;
				local tableEntryId = mw.text.trim(mw.text.unstrip(FoundationClass.myCargoUtil.rawquery({tables = coreData.global_cargoTable, fields = {'_ID'}}, attr)))&lt;br /&gt;
				if mw.ustring.match(mw.text.trim(tableEntryId), '^[0-9]*$') then&lt;br /&gt;
					storeCargoInstruction = imgYes .. ' Your cargo table does exist! (Note: When you change your cargo table\'s declaration, you need to [[#Page autocreation|rebuild it]], though)'&lt;br /&gt;
				else&lt;br /&gt;
					done = false&lt;br /&gt;
					storeCargoInstruction = imgNo .. ' Please [[#Page autocreation|create your cargo table]]!'&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				done = false&lt;br /&gt;
				storeCargoInstruction = imgNo .. ' To be able to create your cargo table, you have to create the following page(s): &amp;lt;ul&amp;gt;' ..&lt;br /&gt;
					(not coreData.page.base.exists and '&amp;lt;li&amp;gt;' .. coreData.page.base.name .. '&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
					(not coreData.page.class.exists and '&amp;lt;li&amp;gt;' .. coreData.page.class.name .. '&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
					(not coreData.page.config.exists and '&amp;lt;li&amp;gt;' .. coreData.page.config.name .. '&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
					(not coreData.page.template.exists and '&amp;lt;li&amp;gt;' .. coreData.page.template.name .. '&amp;lt;/li&amp;gt;' or '') .. '&amp;lt;/ul&amp;gt;'&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if thisUsesSmw then&lt;br /&gt;
			-- we actually use smw. check, if all properties are present? if all right, then yes, else instruction above&lt;br /&gt;
			if coreData.properties and coreData.properties.data and FoundationClass.myTableTools.size(coreData.properties.data) &amp;gt; 0 then&lt;br /&gt;
				allPropertiesThere = true&lt;br /&gt;
				for property, propertyData in pairs(coreData.properties.data) do&lt;br /&gt;
					allPropertiesThere = allPropertiesThere and propertyData.exists&lt;br /&gt;
				end&lt;br /&gt;
				if allPropertiesThere then&lt;br /&gt;
					storeSwmInstruction = imgYes .. ' All your property pages are present and accounted for!'&lt;br /&gt;
				else&lt;br /&gt;
					done = false&lt;br /&gt;
					storeSwmInstruction = imgNo .. ' Please &amp;lt;b&amp;gt;[[#Page autocreation|autocreate]]&amp;lt;/b&amp;gt; your properties! The following are missing: &amp;lt;ul&amp;gt;'&lt;br /&gt;
					for _, property in pairs(coreData.properties.order) do&lt;br /&gt;
						local pdata = coreData.properties.data[property]&lt;br /&gt;
						if not pdata or not pdata.exists then&lt;br /&gt;
							storeSwmInstruction = storeSwmInstruction .. '&amp;lt;li&amp;gt;[[Property:' .. property .. ']]&amp;lt;/li&amp;gt;'&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
					storeSwmInstruction = storeSwmInstruction .. '&amp;lt;/ul&amp;gt;'&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				done = false&lt;br /&gt;
				storeSwmInstruction = imgNo .. ' To be able to create your smw properties, you have to create the following page(s): &amp;lt;ul&amp;gt;' ..&lt;br /&gt;
					(not coreData.page.class.exists and '&amp;lt;li&amp;gt;' .. coreData.page.class.name .. '&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
					(not coreData.page.config.exists and '&amp;lt;li&amp;gt;' .. coreData.page.config.name .. '&amp;lt;/li&amp;gt;' or '') .. '&amp;lt;/ul&amp;gt;'&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if storeCargoInstruction or storeSwmInstruction then&lt;br /&gt;
			if storeCargoInstruction and storeSwmInstruction then&lt;br /&gt;
				step3 = 'Your class used cargo AND smw store. You have to create both data stores: &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;' .. storeCargoInstruction .. '&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;' .. storeSwmInstruction .. '&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;'&lt;br /&gt;
			else&lt;br /&gt;
				step3 = storeCargoInstruction or storeSwmInstruction&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			step3 = imgYes .. ' This class does not use a data store. Nothing to be done here!'&lt;br /&gt;
		end&lt;br /&gt;
		local step4 = done and imgYes .. ' You are done. Remember, when you want to change parameters in your config, edit this page and write your [' .. coreData.page.config.editlink .. ' config file] new' or &lt;br /&gt;
			imgNo .. ' You are not finished yet, please tend to your tasks.'&lt;br /&gt;
		local manual = mw.html.create('')&lt;br /&gt;
		manual:wikitext('&amp;lt;h2&amp;gt;Your 2do checklist&amp;lt;/h2&amp;gt;')&lt;br /&gt;
			:tag('ol')&lt;br /&gt;
				:cssText('margin: 0.3em 0 0 1.6em; padding: 0')&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(step1)&lt;br /&gt;
					:done()&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(step2)&lt;br /&gt;
					:done()&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(step3)&lt;br /&gt;
					:done()&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(step4)&lt;br /&gt;
					:done()&lt;br /&gt;
				:done()&lt;br /&gt;
		-- get the data store details, if all the modules exist and we have a datastore configured&lt;br /&gt;
		local datastore = mw.html.create('')&lt;br /&gt;
		if thisClass then&lt;br /&gt;
			datastore:node(thisClass:explainDataStore())&lt;br /&gt;
				:newline()&lt;br /&gt;
		end&lt;br /&gt;
		-- build the status table&lt;br /&gt;
		local statusTrs = mw.html.create('')&lt;br /&gt;
		for _, pid in pairs(coreData.page.order) do&lt;br /&gt;
			statusTrs:tag('tr')&lt;br /&gt;
				:tag('th')&lt;br /&gt;
					:css('text-align', 'left')&lt;br /&gt;
					:css('width', widthTh)&lt;br /&gt;
					:wikitext(coreData.page[pid].name)&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
				:node(coreData.page[pid].exists and tdYa or tdNa)&lt;br /&gt;
				:newline()&lt;br /&gt;
				:done()&lt;br /&gt;
				:newline()&lt;br /&gt;
		end&lt;br /&gt;
		if thisUsesSmw and coreData.properties and coreData.properties.data and FoundationClass.myTableTools.size(coreData.properties.data) &amp;gt; 0 then&lt;br /&gt;
			statusTrs:tag('tr')&lt;br /&gt;
				:tag('th')&lt;br /&gt;
					:css('text-align', 'center')&lt;br /&gt;
					:css('width', widthTh)&lt;br /&gt;
					:attr('colspan', 2)&lt;br /&gt;
					:wikitext('Property pages for your smw store')&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
			for _, property in pairs(coreData.properties.order) do&lt;br /&gt;
				statusTrs:tag('tr')&lt;br /&gt;
					:tag('th')&lt;br /&gt;
						:css('text-align', 'left')&lt;br /&gt;
						:css('width', widthTh)&lt;br /&gt;
						:wikitext('Property:' .. property)&lt;br /&gt;
						:done()&lt;br /&gt;
						:newline()&lt;br /&gt;
					:node(coreData.properties.data[property].exists and tdYa or tdNa)&lt;br /&gt;
					:newline()&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		local statusTable = mw.html.create('table')&lt;br /&gt;
		statusTable:node(statusTrs)&lt;br /&gt;
		-- page autocreation&lt;br /&gt;
		local extAutoCreatePage = pcall(frame.callParserFunction, frame, {name = '#createpageifnotex:Module:Classgenerator', {'NUL'}})&lt;br /&gt;
		local autoCreation = _CFG.template.createPages and extAutoCreatePage&lt;br /&gt;
		local pageAutoCreation = mw.html.create('')&lt;br /&gt;
		pageAutoCreation:wikitext('&amp;lt;h2&amp;gt;Page autocreation&amp;lt;/h2&amp;gt;')&lt;br /&gt;
			:newline()&lt;br /&gt;
		if autoCreation then&lt;br /&gt;
			-- depending on parameters and existence of pages do the autocreate or print the button&lt;br /&gt;
			-- first see, which pagecomplexes (modules(docs), templates, form, category) are missing&lt;br /&gt;
			local missing = {}&lt;br /&gt;
			-- in missing we store, if a page in a given namespace is missing. Namespaces are stored by their ids (numbers)&lt;br /&gt;
			for _, pid in pairs(coreData.page.order) do&lt;br /&gt;
				-- due to extension autocreatepage messing up module pages, in namepace module we only autocreate doc pages&lt;br /&gt;
				if not coreData.page[pid].exists and not Classgenerator.myTableTools.inTable(missing, coreData.page[pid].namespace) and &lt;br /&gt;
						(coreData.page[pid].namespace ~= 828 or coreData.page[pid].isDocPage) then&lt;br /&gt;
					table.insert(missing, coreData.page[pid].namespace)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			if thisUsesSmw and not allPropertiesThere then&lt;br /&gt;
				table.insert(missing, mw.title.new('NUL', 'Property').namespace)&lt;br /&gt;
			end&lt;br /&gt;
			-- now generate the printout or call the parser function depending on global_autocreate_* status&lt;br /&gt;
			-- remember the switches 'global_autocreate_module', 'global_autocreate_template', 'global_autocreate_form', 'global_autocreate_category', and 'global_autocreate_property'&lt;br /&gt;
			local actable = mw.html.create('table')&lt;br /&gt;
			for _, nsid  in pairs(missing) do&lt;br /&gt;
				local ns = mw.ustring.lower(_namespaceName(self, nsid))&lt;br /&gt;
				local information = ''&lt;br /&gt;
				if coreData.autocreate[ns] and coreData.autocreate[ns] &amp;gt; os.time() - _CFG.template.autoCreationTimeDiff then&lt;br /&gt;
					-- ************************************* actual autocreation is done here&lt;br /&gt;
					-- we iterate over all namespaces for which pages are missing (var missing) and spring into action, if we have a numeric value supplied for that namespace coreData.autocreate[ns] that is recent enough&lt;br /&gt;
					-- now we have a namespace, we want to create pages for (var nsid) (all that is done in the recent 4 lines). what we do in the following lines:&lt;br /&gt;
					-- we iterate over all pages in coreData.page.order and spring into action, if the interation instance (pid) is in the namespace (nsid), the page is non exist and is not a module&lt;br /&gt;
					-- in that action body, we create the page with the precalcualted content&lt;br /&gt;
					-- also: for convenience, we create some global project (meta)categories, if related to the current page (project-form-category if nsid for forms, etc.) and configured in Foundationclass/globalconfig. here is an overview&lt;br /&gt;
					--	Classgenerator.globalConfig.formCategory			: MediaWiki:Classengine-content-project-form-category&lt;br /&gt;
					--	Classgenerator.globalConfig.gardeningSuperCategory	: MediaWiki:Classengine-content-project-gardening-supercategory&lt;br /&gt;
					--	Classgenerator.globalConfig.moduleCategory			: MediaWiki:Classengine-content-project-module-category&lt;br /&gt;
					--	Classgenerator.globalConfig.projectSuperCategory	: MediaWiki:Classengine-content-project-supercategory&lt;br /&gt;
					--	Classgenerator.globalConfig.propertyCategory		: MediaWiki:Classengine-content-project-property-category&lt;br /&gt;
					--	Classgenerator.globalConfig.templateCategory		: MediaWiki:Classengine-content-project-templates&lt;br /&gt;
					for _, pid in pairs(coreData.page.order) do&lt;br /&gt;
						_debug(self, 3, ' testing page &amp;quot;' .. coreData.page[pid].name .. '&amp;quot;: namespace id is ' .. coreData.page[pid].namespace ..&lt;br /&gt;
							', and page does ' ..(not coreData.page[pid].exists and 'not ' or '') .. 'exist')&lt;br /&gt;
						if coreData.page[pid].namespace == nsid and not coreData.page[pid].exists and (nsid ~= 828 or coreData.page[pid].isDocPage) then&lt;br /&gt;
							if pid == 'gardeningCategory' and Classgenerator.globalConfig.gardeningSuperCategory and #Classgenerator.globalConfig.gardeningSuperCategory &amp;gt; 0 then&lt;br /&gt;
								-- we just iterated over the gardening category page (so this class has one) but we did not create it, yet)&lt;br /&gt;
								-- blindly try to create the gardening supercategory first, in case the class's gardening category is the gardening supercategory, we dont want the class specific content&lt;br /&gt;
								local content = '{{MediaWiki:Classengine-content-project-gardening-supercategory}}'&lt;br /&gt;
								_debug(self, 3, ' trying to autocreate garderning supercategory page &amp;quot;' .. Classgenerator.globalConfig.gardeningSuperCategory .. '&amp;quot; with # of content being ' .. #content)&lt;br /&gt;
								local ret = frame:callParserFunction{ name = '#createpageifnotex:Category:' .. Classgenerator.globalConfig.gardeningSuperCategory, args = { content } }&lt;br /&gt;
								if #ret &amp;gt; 0 then&lt;br /&gt;
									information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
								end&lt;br /&gt;
							end&lt;br /&gt;
							_debug(self, 3, ' trying to autocreate page &amp;quot;' .. coreData.page[pid].name .. '&amp;quot; with # of content being ' .. #coreData.page[pid].content)&lt;br /&gt;
							local ret = frame:callParserFunction{ name = '#createpageifnotex:' .. coreData.page[pid].name, args = { frame:preprocess(coreData.page[pid].content) } }&lt;br /&gt;
							if #ret &amp;gt; 0 then&lt;br /&gt;
								information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
							end&lt;br /&gt;
							if pid == 'form' and Classgenerator.globalConfig.formCategory and #Classgenerator.globalConfig.formCategory &amp;gt; 0 then&lt;br /&gt;
								-- we just iterated over the form page (so this class has one) and created it (yay). Now blindly create the formCategory as well...&lt;br /&gt;
								local content = '{{MediaWiki:Classengine-content-project-form-category}}'&lt;br /&gt;
								_debug(self, 3, ' trying to autocreate form category page &amp;quot;' .. Classgenerator.globalConfig.formCategory .. '&amp;quot; with # of content being ' .. #content)&lt;br /&gt;
								local ret = frame:callParserFunction{ name = '#createpageifnotex:Category:' .. Classgenerator.globalConfig.formCategory, args = { content } }&lt;br /&gt;
								if #ret &amp;gt; 0 then&lt;br /&gt;
									information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
								end&lt;br /&gt;
							elseif nsid ~= 828 and Classgenerator.globalConfig.moduleCategory and #Classgenerator.globalConfig.moduleCategory &amp;gt; 0 then&lt;br /&gt;
								-- we just iterated a module doc page (so this class has one) and created it (yay). Now blindly create the moduleCategory as well...&lt;br /&gt;
								local content = '{{MediaWiki:Classengine-content-project-module-category}}'&lt;br /&gt;
								_debug(self, 3, ' trying to autocreate module category page &amp;quot;' .. Classgenerator.globalConfig.moduleCategory .. '&amp;quot; with # of content being ' .. #content)&lt;br /&gt;
								local ret = frame:callParserFunction{ name = '#createpageifnotex:Category:' .. Classgenerator.globalConfig.moduleCategory, args = { content } }&lt;br /&gt;
								if #ret &amp;gt; 0 then&lt;br /&gt;
									information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
								end&lt;br /&gt;
							elseif pid == 'category' and Classgenerator.globalConfig.projectSuperCategory and #Classgenerator.globalConfig.projectSuperCategory &amp;gt; 0 then&lt;br /&gt;
								-- we just iterated over the category page (so this class has one) and created it (yay). Now blindly create the supercategory as well...&lt;br /&gt;
								local content = '{{MediaWiki:Classengine-content-project-supercategory}}'&lt;br /&gt;
								_debug(self, 3, ' trying to autocreate super category page &amp;quot;' .. Classgenerator.globalConfig.projectSuperCategory .. '&amp;quot; with # of content being ' .. #content)&lt;br /&gt;
								local ret = frame:callParserFunction{ name = '#createpageifnotex:Category:' .. Classgenerator.globalConfig.projectSuperCategory, args = { content } }&lt;br /&gt;
								if #ret &amp;gt; 0 then&lt;br /&gt;
									information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
								end&lt;br /&gt;
							elseif nsid == 10 and Classgenerator.globalConfig.templateCategory and #Classgenerator.globalConfig.templateCategory &amp;gt; 0 then&lt;br /&gt;
								-- we just iterated over a page in template namespace (so this class has one) and created it (yay). Now blindly create the templateCategory as well...&lt;br /&gt;
								local content = '{{MediaWiki:Classengine-content-project-template-category}}'&lt;br /&gt;
								_debug(self, 3, ' trying to autocreate template category page &amp;quot;' .. Classgenerator.globalConfig.templateCategory .. '&amp;quot; with # of content being ' .. #content)&lt;br /&gt;
								local ret = frame:callParserFunction{ name = '#createpageifnotex:Category:' .. Classgenerator.globalConfig.templateCategory, args = { content } }&lt;br /&gt;
								if #ret &amp;gt; 0 then&lt;br /&gt;
									information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
								end&lt;br /&gt;
							end&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
					if thisUsesSmw and (nsid == mw.title.new('NUL', 'Property').namespace) then&lt;br /&gt;
						-- add here autocreation of properties&lt;br /&gt;
						for property, pdata in pairs(coreData.properties.data) do&lt;br /&gt;
							if not pdata.exists then&lt;br /&gt;
								local content = pdata.content&lt;br /&gt;
								_debug(self, 3, ' trying to autocreate property page &amp;quot;' .. property .. '&amp;quot; with # of content being ' .. #content)&lt;br /&gt;
								local ret = frame:callParserFunction{ name = '#createpageifnotex:Property:' .. property, args = { frame:preprocess(pdata.content) } }&lt;br /&gt;
								if #ret &amp;gt; 0 then&lt;br /&gt;
									information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
								end&lt;br /&gt;
							end&lt;br /&gt;
						end&lt;br /&gt;
						-- we just iterated over all missing property pages (so this class has some) and created them (yay). Now blindly create the propertyCategory as well...&lt;br /&gt;
						local content = '{{MediaWiki:Classengine-content-project-property-category}}'&lt;br /&gt;
						_debug(self, 3, ' trying to autocreate property category page &amp;quot;' .. Classgenerator.globalConfig.propertyCategory .. '&amp;quot; with # of content being ' .. #content)&lt;br /&gt;
						local ret = frame:callParserFunction{ name = '#createpageifnotex:Category:' .. Classgenerator.globalConfig.propertyCategory, args = { content } }&lt;br /&gt;
						if #ret &amp;gt; 0 then&lt;br /&gt;
							information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				-- create the tr for the ns&lt;br /&gt;
				actable:tag('tr')&lt;br /&gt;
					:tag('th')&lt;br /&gt;
						:css('text-align', 'left')&lt;br /&gt;
						:css('width', widthTh)&lt;br /&gt;
						:wikitext('Create ' .. ((nsid == 828 and 'module docs' or (ns == 'property' and 'properties' or (ns .. (ns == 'template' and 's' or '')))) .. ':'))&lt;br /&gt;
							-- note: nsid == mw.title.new('NUL', 'Property').namespace is necessary since canonicalname for property namespace does not translate uniquely over different languages :(&lt;br /&gt;
						:done()&lt;br /&gt;
						:newline()&lt;br /&gt;
					:tag('td')&lt;br /&gt;
						:cssText('color:black; vertical-align: middle; text-align: center; width:' .. widthTd)&lt;br /&gt;
						:css('background', (coreData.autocreate[ns] and coreData.autocreate[ns] &amp;gt; os.time() - _CFG.template.autoCreationTimeDiff) and '#90ff90' or '#FF9090' )&lt;br /&gt;
						:wikitext(frame:callParserFunction{name = '#autoedit', args={form='Classgenerator', target=self:getUid(),&lt;br /&gt;
							'link text=' .. (coreData.autocreate[ns] and 'Requested on ' .. os.date('%d.%m.%Y %X', coreData.autocreate[ns]) or 'Create automatically!')  .. &lt;br /&gt;
								(#information &amp;gt; 0 and ('Call returned ' .. information) or ''),&lt;br /&gt;
							'reload', summary=&amp;quot;Requesting the autocreation of &amp;quot; .. coreData.className .. ' for pages of type ' .. ns,&lt;br /&gt;
							'query string=Classgenerator[global_autocreate_' .. ns .. ']=' .. os.time()}&lt;br /&gt;
							})&lt;br /&gt;
						:done()&lt;br /&gt;
						:newline()&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
&lt;br /&gt;
			end&lt;br /&gt;
			if Classgenerator.myTableTools.size(missing) &amp;gt; 0 then&lt;br /&gt;
				-- show the all button&lt;br /&gt;
				local querystring = ''&lt;br /&gt;
				for _, nsid in pairs(missing) do&lt;br /&gt;
					local ns = mw.ustring.lower(_namespaceName(self, nsid))&lt;br /&gt;
					querystring = querystring .. 'Classgenerator[global_autocreate_' .. ns .. ']=' .. os.time() .. '&amp;amp;'&lt;br /&gt;
				end&lt;br /&gt;
				querystring = mw.ustring.sub(querystring, 1, -2)&lt;br /&gt;
				actable:tag('tr')&lt;br /&gt;
					:tag('th')&lt;br /&gt;
						:css('text-align', 'left')&lt;br /&gt;
						:css('width', widthTh)&lt;br /&gt;
						:wikitext('Create all pages:')&lt;br /&gt;
						:done()&lt;br /&gt;
						:newline()&lt;br /&gt;
					:tag('td')&lt;br /&gt;
						:cssText('background: #FF9090; color:black; vertical-align: middle; text-align: center; width:' .. widthTd)&lt;br /&gt;
						:wikitext(frame:callParserFunction{name = '#autoedit', args={form='Classgenerator', target=self:getUid(),&lt;br /&gt;
							'link text=Create automatically!', 'reload', summary=&amp;quot;Requesting the autocreation of all missing pages&amp;quot;, 'query string=' .. querystring }&lt;br /&gt;
							})&lt;br /&gt;
						:done()&lt;br /&gt;
						:newline()&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
				pageAutoCreation:wikitext('&amp;lt;b&amp;gt;Note:&amp;lt;/b&amp;gt; Creation of module pages is impossible due to an incompatibility issue.')&lt;br /&gt;
					:newline()&lt;br /&gt;
					:node(actable)&lt;br /&gt;
					:newline()&lt;br /&gt;
			else&lt;br /&gt;
				pageAutoCreation:wikitext('All pages present!')&lt;br /&gt;
					:newline()&lt;br /&gt;
					:tag('p')&lt;br /&gt;
						:wikitext('&amp;lt;small&amp;gt;&amp;lt;b&amp;gt;Note:&amp;lt;/b&amp;gt; Creation of module pages is impossible due to an incompatibility issue.&amp;lt;/small&amp;gt;')&lt;br /&gt;
						:newline()&lt;br /&gt;
						:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			pageAutoCreation:wikitext('Page autocreation is only possible if activated in your [[Module:Classgenerator/config]]-file (see template-section) and '&lt;br /&gt;
					.. 'Extension AutoCreatePage being installed.')&lt;br /&gt;
				:newline()&lt;br /&gt;
		end&lt;br /&gt;
		if cargoTableCreateLink then&lt;br /&gt;
			pageAutoCreation:wikitext('&amp;lt;b&amp;gt;Cargo data store:&amp;lt;/b&amp;gt;To (re-)create your cargo table, follow &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[' .. coreData.page.template.recreatedata .. ' this link]&amp;lt;/span&amp;gt; and then press ok!')&lt;br /&gt;
				:newline()&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		-- build the content collapses&lt;br /&gt;
		local collapse = require('Module:Collapse').main&lt;br /&gt;
		local bg_sets = { exist = {'#cfc', '#9c9'}, nonexist = {'#fcc', '#c99'} }&lt;br /&gt;
		local bg = 1&lt;br /&gt;
		local pageContent = mw.html.create('')&lt;br /&gt;
		for _, pid in pairs(coreData.page.order) do&lt;br /&gt;
			local content&lt;br /&gt;
			local bgs = coreData.page[pid].exists and bg_sets.exist or bg_sets.nonexist&lt;br /&gt;
			if coreData.page[pid].namespace == 828 and not coreData.page[pid].isDocPage then&lt;br /&gt;
				content = frame:expandTemplate{ title = 'Code', args = {lang = 'lua', code = coreData.page[pid].content, line = '1'}}&lt;br /&gt;
			else&lt;br /&gt;
				content = '&amp;lt;pre style=&amp;quot;white-space:-moz-pre-wrap; white-space:-pre-wrap; white-space:-o-pre-wrap; white-space:pre-wrap; word-wrap:break-word;&amp;quot;&amp;gt;' .. &lt;br /&gt;
					mw.text.nowiki(frame:preprocess(coreData.page[pid].content)) .. '&amp;lt;/pre&amp;gt;'&lt;br /&gt;
			end&lt;br /&gt;
			pageContent:wikitext(collapse({ header = 'Contents of &amp;lt;b&amp;gt;[[:' .. coreData.page[pid].name .. ']]&amp;lt;/b&amp;gt; ' ..&lt;br /&gt;
							'&amp;lt;span class=&amp;quot;plainlinks&amp;quot; style=&amp;quot;font-size:75%;&amp;quot;&amp;gt;&amp;amp;#91;[' .. coreData.page[pid].editlink ..&lt;br /&gt;
							' EDIT]&amp;amp;#93;&amp;lt;/span&amp;gt;',&lt;br /&gt;
						content = content, left = true, bg = bgs[bg]&lt;br /&gt;
					}))&lt;br /&gt;
				:newline()&lt;br /&gt;
			bg = (bg == 2 and 1 or 2)&lt;br /&gt;
		end&lt;br /&gt;
		if thisUsesSmw and coreData.properties.order then&lt;br /&gt;
			-- add here the collpases of the properties&lt;br /&gt;
			local message = mw.message.new('classengine-template-property-page')&lt;br /&gt;
			pageContent:tag('p')&lt;br /&gt;
				:wikitext('&amp;lt;h3&amp;gt;All property pages&amp;lt;/h3&amp;gt;')&lt;br /&gt;
				:done()&lt;br /&gt;
			for _, property in pairs(coreData.properties.order) do&lt;br /&gt;
				local bgs = coreData.page[pid].exists and bg_sets.exist or bg_sets.nonexist&lt;br /&gt;
				local content = '&amp;lt;pre style=&amp;quot;white-space:-moz-pre-wrap; white-space:-pre-wrap; white-space:-o-pre-wrap; white-space:pre-wrap; word-wrap:break-word;&amp;quot;&amp;gt;' .. &lt;br /&gt;
					mw.text.nowiki(frame:preprocess(coreData.properties.data[property].content)) .. '&amp;lt;/pre&amp;gt;'&lt;br /&gt;
				pageContent:wikitext(collapse({ header = 'Contents of &amp;lt;b&amp;gt;[[:Property:' .. property .. ']]&amp;lt;/b&amp;gt; ' ..&lt;br /&gt;
								'&amp;lt;span class=&amp;quot;plainlinks&amp;quot; style=&amp;quot;font-size:75%;&amp;quot;&amp;gt;&amp;amp;#91;[' .. coreData.properties.data[property].editlink ..&lt;br /&gt;
								' EDIT]&amp;amp;#93;&amp;lt;/span&amp;gt;',&lt;br /&gt;
							content = content, left = true, bg = bgs[bg]&lt;br /&gt;
						}))&lt;br /&gt;
					:newline()&lt;br /&gt;
				bg = (bg == 2 and 1 or 2)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		local updateWarning = mw.html.create('')&lt;br /&gt;
		if coreData.now_timestamp - coreData.edit_timestamp &amp;lt; 2*60*60 then&lt;br /&gt;
			local mbox = require('Module:Message box')&lt;br /&gt;
			updateWarning:wikitext(mbox.main('ombox', { type='content', text = 'Note: You updated the class ' .. coreData.edit_time_before .. ' ago. Did you write your [[#Page contents|config file]] new? ' ..&lt;br /&gt;
						'Changes won\'t take effect unless you do!' .. ((thisUsesCargo and cargoTableCreateLink) and '&amp;lt;p&amp;gt;&amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;Also: If you changed your cargo table\'s declaration, [' .. &lt;br /&gt;
						coreData.page.template.editlink .. ' edit your template] and [[#Page autocreation|rebuild your cargo table]]!&amp;lt;/span&amp;gt;' or '')}))&lt;br /&gt;
				:newline()&lt;br /&gt;
		end&lt;br /&gt;
		-- assemble everything&lt;br /&gt;
		local html = mw.html.create('')&lt;br /&gt;
		html:wikitext(coreData.global_description)&lt;br /&gt;
			:newline()&lt;br /&gt;
			:node(updateWarning)&lt;br /&gt;
			:node(manual)&lt;br /&gt;
			:newline()&lt;br /&gt;
			:node(datastore)&lt;br /&gt;
			:wikitext('&amp;lt;h2&amp;gt;Page status&amp;lt;/h2&amp;gt;')&lt;br /&gt;
			:newline()&lt;br /&gt;
			:wikitext(autoCreation and 'This status may be inaccurate, if you just created pages. In that case, run jobs and clear cache of this page.' or '')&lt;br /&gt;
			:node(statusTable)&lt;br /&gt;
			:newline()&lt;br /&gt;
			:node(pageAutoCreation)&lt;br /&gt;
			:wikitext('&amp;lt;h2&amp;gt;Page contents&amp;lt;/h2&amp;gt;')&lt;br /&gt;
			:newline()&lt;br /&gt;
			:node(pageContent)&lt;br /&gt;
			:newline()&lt;br /&gt;
			:done()&lt;br /&gt;
		local debugLevel = FoundationClass.globalConfig.debugLevel or _CFG.global.debugLevel&lt;br /&gt;
		if debugLevel then&lt;br /&gt;
			html:tag('pre')&lt;br /&gt;
--				:wikitext(FoundationClass.myTableTools.printTable(coreData))&lt;br /&gt;
--				:wikitext(FoundationClass.myTableTools.printTable(thisClass:smwProperty2ParameterTranslationTable()))&lt;br /&gt;
				:wikitext(ClassDebug:printLog(debugLevel))&lt;br /&gt;
				:done()&lt;br /&gt;
		end&lt;br /&gt;
		self:addOutput(html)&lt;br /&gt;
&lt;br /&gt;
		return true&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Classgenerator:myArgumentProcessing(coreData)&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator:myArgumentProcessing(args) to process coreData, from ' .. tostring(self))&lt;br /&gt;
	-- function that performs some individual transformation args --&amp;amp;amp;gt; coreData&lt;br /&gt;
	local _CFG = self.class.myConfiguration&lt;br /&gt;
	local coreData = coreData&lt;br /&gt;
	local lang = mw.language.new('en')&lt;br /&gt;
	coreData.className = lang:ucfirst(mw.text.trim(mw.ustring.gsub(self:getUid(), ':', '')))&lt;br /&gt;
	coreData.edit_timestamp = lang:formatDate('U', coreData.global_edit_timestamp)&lt;br /&gt;
	coreData.now_timestamp = lang:formatDate('U') + 60*60&lt;br /&gt;
	coreData.edit_time_before = lang:formatDuration(coreData.now_timestamp-coreData.edit_timestamp)&lt;br /&gt;
	coreData.last_edited = lang:formatDate('d.m.Y H:i:s', coreData.global_edit_timestamp)&lt;br /&gt;
	if coreData.global_gardeningCategory_chooser and mw.ustring.lower(coreData.global_gardeningCategory_chooser) == 'global' then&lt;br /&gt;
		coreData.global_gardeningCategory = 'superglobal.gardeningCategory'&lt;br /&gt;
	end&lt;br /&gt;
	if mw.ustring.find(coreData.className, ' ', 1, true) then&lt;br /&gt;
		local tmp = ''&lt;br /&gt;
		for fragment in mw.text.gsplit(coreData.className, ' ', true) do&lt;br /&gt;
			tmp = tmp .. lang:ucfirst(fragment)&lt;br /&gt;
		end&lt;br /&gt;
		coreData.className = tmp&lt;br /&gt;
	end&lt;br /&gt;
	if coreData.global_cargoTable then&lt;br /&gt;
		coreData.global_cargoTable = mw.ustring.gsub(mw.ustring.lower(coreData.global_cargoTable), ' ', '_')&lt;br /&gt;
	end&lt;br /&gt;
	if coreData.form_createInfotext and #coreData.form_createInfotext &amp;gt; 0 and mw.ustring.sub(coreData.form_createInfotext, -1) ~= ' ' then&lt;br /&gt;
		coreData.form_createInfotext = coreData.form_createInfotext .. ' '&lt;br /&gt;
	end&lt;br /&gt;
	local parameter_parameter&lt;br /&gt;
	local fieldOrder&lt;br /&gt;
	if coreData.parameter_parameter then&lt;br /&gt;
		parameters = ''&lt;br /&gt;
		fieldOrder = {}&lt;br /&gt;
		local classGenParamConfig = mw.loadData('Module:Classgenerator/parameter/config')&lt;br /&gt;
		for result in mw.text.gsplit(coreData.parameter_parameter, classGenParamConfig.template.delimiterResult, true) do&lt;br /&gt;
			local fieldname, parameter = mw.ustring.match(result, '^([^#]*)' .. classGenParamConfig.template.delimiterFormFieldName .. '(.+)$')&lt;br /&gt;
			if fieldname and mw.ustring.len(mw.text.trim(fieldname)) &amp;gt; 0 then&lt;br /&gt;
				table.insert(fieldOrder, mw.text.trim(fieldname))&lt;br /&gt;
			end&lt;br /&gt;
			if parameter and mw.ustring.len(parameter) &amp;gt; 0 then&lt;br /&gt;
				parameters = parameters .. parameter&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	coreData.parameter_parameter = parameters&lt;br /&gt;
	coreData.form_enable = FoundationClass.myYesno(coreData.form_enable)&lt;br /&gt;
	if coreData.form_enable then&lt;br /&gt;
		coreData.form_fieldOrder = fieldOrder&lt;br /&gt;
		form_buttons = { 'save' }&lt;br /&gt;
		if coreData.form_buttons and #coreData.form_buttons &amp;gt; 0 then&lt;br /&gt;
			for _, button in pairs(coreData.form_buttons) do&lt;br /&gt;
				table.insert(form_buttons, button)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		table.insert(form_buttons, 'cancel')&lt;br /&gt;
	end&lt;br /&gt;
	coreData.form_buttons = form_buttons&lt;br /&gt;
	-- here build the class config&lt;br /&gt;
	local contentClassConfig = mw.ustring.gsub(_CFG.template.configIntro, _CFG.template.placeHolderClassName, coreData.className) ..&lt;br /&gt;
		'local global = {\n' ..&lt;br /&gt;
		'\tdebugLevel = false,'&lt;br /&gt;
	if self.class.myConfiguration.template.addCommentsToConfig then&lt;br /&gt;
		contentClassConfig = contentClassConfig .. '\t-- set this to the level you wish to display at render. false if disabled. this is a class based setting. ' ..&lt;br /&gt;
			'you can set this globally at Foundationclass/globalconfig, causing all child classes to debug.'&lt;br /&gt;
	end&lt;br /&gt;
	contentClassConfig = contentClassConfig .. '\n'&lt;br /&gt;
	-- calculate the fieldlists:&lt;br /&gt;
	local fieldlists = {}&lt;br /&gt;
	for _, field in pairs(_CFG.form.fieldOrder) do&lt;br /&gt;
		local tab = mw.ustring.match(field, '^([a-z]+)_.+')&lt;br /&gt;
		if not fieldlists[tab] then&lt;br /&gt;
			fieldlists[tab] = {}&lt;br /&gt;
		end&lt;br /&gt;
		table.insert(fieldlists[tab], field)&lt;br /&gt;
	end&lt;br /&gt;
	local omissionList = {'global_autocreate_module', 'global_autocreate_template', 'global_autocreate_form', 'global_autocreate_category', 'global_autocreate_property', 'global_edit_timestamp', 'global_gardeningCategory_chooser',&lt;br /&gt;
		'form_textareaAttributes_cols', 'form_textareaAttributes_rows', 'form_textareaAttributes_autogrow', 'form_textareaAttributes_editor', 'form_createLinkInfo', &lt;br /&gt;
		'global_customization', 'form_customization', 'template_customization' }&lt;br /&gt;
	for _, attr in pairs(fieldlists.global) do&lt;br /&gt;
		if not Classgenerator.myTableTools.inTable(omissionList, attr) and self.class.myConfiguration.parameter[attr] then&lt;br /&gt;
			contentClassConfig = contentClassConfig .. _processAttribute(self, attr, '\t')&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if coreData.global_customization then&lt;br /&gt;
		for line in mw.text.gsplit(coreData.global_customization, '\n', true) do&lt;br /&gt;
			contentClassConfig = contentClassConfig .. '\t' .. line .. '\n'&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	contentClassConfig = contentClassConfig .. '}\n\nlocal form = {\n'&lt;br /&gt;
	for _, attr in pairs(fieldlists.form) do&lt;br /&gt;
		if not Classgenerator.myTableTools.inTable(omissionList, attr) and self.class.myConfiguration.parameter[attr] then&lt;br /&gt;
			contentClassConfig = contentClassConfig .. _processAttribute(self, attr, '\t')&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	contentClassConfig = contentClassConfig .. '\ttextareaAttributes = {	-- the defaults for your textarea fields\n'&lt;br /&gt;
	for _, attr in pairs({'form_textareaAttributes_cols', 'form_textareaAttributes_rows', 'form_textareaAttributes_autogrow', 'form_textareaAttributes_editor'}) do&lt;br /&gt;
		local name = mw.ustring.match(attr, '^form_textareaAttributes_(.+)$')&lt;br /&gt;
		contentClassConfig = contentClassConfig .. _processAttribute(self, attr, '\t\t', name)&lt;br /&gt;
	end&lt;br /&gt;
	contentClassConfig = contentClassConfig .. '\t},\n'&lt;br /&gt;
	contentClassConfig = contentClassConfig .. _processAttribute(self, 'form_fieldOrder', '\t')&lt;br /&gt;
	if coreData.form_customization then&lt;br /&gt;
		for line in mw.text.gsplit(coreData.form_customization, '\n', true) do&lt;br /&gt;
			contentClassConfig = contentClassConfig .. '\t' .. line .. '\n'&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	contentClassConfig = contentClassConfig .. '}\n\nlocal template = {\n'&lt;br /&gt;
	for _, attr in pairs(fieldlists.template) do&lt;br /&gt;
		if not Classgenerator.myTableTools.inTable(omissionList, attr) and self.class.myConfiguration.parameter[attr] then&lt;br /&gt;
			contentClassConfig = contentClassConfig .. _processAttribute(self, attr, '\t')&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if coreData.template_customization then&lt;br /&gt;
		for line in mw.text.gsplit(coreData.template_customization, '\n', true) do&lt;br /&gt;
			contentClassConfig = contentClassConfig .. '\t' .. mw.text.trim(line) .. '\n'&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	contentClassConfig = contentClassConfig .. '}\n\nlocal parameter = {\n' .. coreData.parameter_parameter .. '}\n\n' ..&lt;br /&gt;
		'return {\n' ..&lt;br /&gt;
		'\tform = form,\n' ..&lt;br /&gt;
		'\tglobal = global,\n' ..&lt;br /&gt;
		'\tparameter = parameter,\n' ..&lt;br /&gt;
		'\ttemplate = template,\n}\n'&lt;br /&gt;
	local classCategory = Classgenerator.globalConfig.classCategory or 'none'&lt;br /&gt;
	local formCategory = Classgenerator.globalConfig.formCategory or 'none'&lt;br /&gt;
	local gardeningCategory = Classgenerator.globalConfig.gardeningSuperCategory or 'none'&lt;br /&gt;
	local moduleCategory = Classgenerator.globalConfig.moduleCategory or 'none'&lt;br /&gt;
	local propertyCategory = Classgenerator.globalConfig.propertyCategory or 'none'&lt;br /&gt;
	local superCategory = Classgenerator.globalConfig.projectSuperCategory or 'none'&lt;br /&gt;
	local templateCategory = Classgenerator.globalConfig.templateCategory or 'none'&lt;br /&gt;
	local page = {}&lt;br /&gt;
	page.order = {'base', 'baseDoc', 'class', 'classDoc', 'config', 'configDoc', 'template', 'templateDoc'}&lt;br /&gt;
	page.base = {&lt;br /&gt;
		name = 'Module:' .. _private[self].pagename,&lt;br /&gt;
		content = mw.message.new('classengine-template-module-page'):rawParams(_private[self].pagename):plain()&lt;br /&gt;
	}&lt;br /&gt;
	page.baseDoc = {&lt;br /&gt;
		name = 'Module:' .. _private[self].pagename .. '/doc',&lt;br /&gt;
		content = mw.message.new('classengine-template-module-documentation-page'):rawParams(_private[self].pagename, moduleCategory):plain()&lt;br /&gt;
	}&lt;br /&gt;
	page.class = {&lt;br /&gt;
		name = 'Module:' .. _private[self].pagename .. '/class',&lt;br /&gt;
		content = mw.message.new('classengine-template-module-class-page'):rawParams(_private[self].pagename, coreData.className):plain()&lt;br /&gt;
	}&lt;br /&gt;
	page.classDoc = {&lt;br /&gt;
		name = 'Module:' .. _private[self].pagename .. '/class/doc',&lt;br /&gt;
		content = mw.message.new('classengine-template-module-class-documentation-page'):rawParams(_private[self].pagename, coreData.className, moduleCategory, classCategory):plain()&lt;br /&gt;
	}&lt;br /&gt;
	page.config = {&lt;br /&gt;
		name = 'Module:' .. _private[self].pagename .. '/config',&lt;br /&gt;
		content = contentClassConfig,&lt;br /&gt;
	}&lt;br /&gt;
	page.configDoc = {&lt;br /&gt;
		name = 'Module:' .. _private[self].pagename .. '/config/doc',&lt;br /&gt;
		content = mw.message.new('classengine-template-module-config-documentation-page'):rawParams(_private[self].pagename, moduleCategory, classCategory):plain()&lt;br /&gt;
	}&lt;br /&gt;
	page.template = {&lt;br /&gt;
		name = 'Template:' .. coreData.template_name,&lt;br /&gt;
		content = mw.message.new('classengine-template-template-page'):rawParams(_private[self].pagename):plain()&lt;br /&gt;
	}&lt;br /&gt;
	page.templateDoc = {&lt;br /&gt;
		name = 'Template:' .. coreData.template_name .. '/doc',&lt;br /&gt;
		content = mw.message.new('classengine-template-template-documentation-page'):rawParams(_private[self].pagename, templateCategory):plain()&lt;br /&gt;
	}&lt;br /&gt;
	if coreData.form_name and #coreData.form_name &amp;gt; 0 then&lt;br /&gt;
		table.insert(page.order, 'form')&lt;br /&gt;
		page.form = {&lt;br /&gt;
			name = 'Form:' .. coreData.form_name,&lt;br /&gt;
			content = mw.message.new('classengine-template-form-page'):rawParams(_private[self].pagename, formCategory):plain()&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
	if coreData.global_category and #coreData.global_category&amp;gt; 0 then&lt;br /&gt;
		table.insert(page.order, 'category')&lt;br /&gt;
		page.category = {&lt;br /&gt;
			name = 'Category:' .. coreData.global_category,&lt;br /&gt;
			content = mw.message.new('classengine-template-category-page'):rawParams(_private[self].pagename, superCategory):plain()&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
	if coreData.global_gardeningCategory and #coreData.global_gardeningCategory &amp;gt; 0 then&lt;br /&gt;
		table.insert(page.order, 'gardeningCategory')&lt;br /&gt;
		local pagename = coreData.global_gardeningCategory&lt;br /&gt;
		if pagename == 'superglobal.gardeningCategory' then&lt;br /&gt;
			pagename = FoundationClass.globalConfig.gardeningCategory&lt;br /&gt;
		end&lt;br /&gt;
		page.gardeningCategory = {&lt;br /&gt;
			name = 'Category:' .. pagename,&lt;br /&gt;
			content = mw.message.new('classengine-template-gardeningcategory-page'):rawParams(_private[self].pagename, gardeningCategory):plain()&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
	for _, pid in pairs(page.order) do&lt;br /&gt;
		local obj = mw.title.new(page[pid].name)&lt;br /&gt;
		page[pid].exists = obj.exists&lt;br /&gt;
		page[pid].namespace = obj.namespace&lt;br /&gt;
		page[pid].editlink = obj:fullUrl{action='edit'}&lt;br /&gt;
		if pid == 'template' then&lt;br /&gt;
			page[pid].recreatedata = obj:fullUrl{action='recreatedata'}&lt;br /&gt;
		end&lt;br /&gt;
		page[pid].isDocPage = (mw.ustring.sub(page[pid].name, -4) == '/doc')&lt;br /&gt;
		if page[pid].isDocPage then&lt;br /&gt;
			page[pid].content = page[pid].content .. '&amp;lt;h2&amp;gt;Maintenanace notes&amp;lt;/h2&amp;gt;\n' ..&lt;br /&gt;
				'This page was created by [[Module:Classgenerator]] and belongs to [[' .. self:getUid() .. ']].\n'&lt;br /&gt;
			if pid == 'configDoc' then&lt;br /&gt;
				page[pid].content = page[pid].content .. '\n{{((}}ombox| type=content | text = It is strongly advised, to not edit this page but to use [' ..&lt;br /&gt;
				'https://{{((}}SERVERNAME{{))}}{{((}}SCRIPTPATH{{))}}/Special:FormEdit/Classgenerator/' .. mw.uri.encode(self:getUid(), &amp;quot;PATH&amp;quot;) .. ' ' .. &lt;br /&gt;
					'the Classgenerator form] instead! After that, use your new configuration to replace the contents of this page.{{))}}'&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	local thisClass&lt;br /&gt;
	local thisConfig&lt;br /&gt;
	if page.class.exists and page.config.exists then&lt;br /&gt;
		thisClass = require(page.class.name)&lt;br /&gt;
		thisConfig = require(page.config.name)&lt;br /&gt;
	end&lt;br /&gt;
	if page.form and (not coreData.form_typeCreateLink or coreData.form_typeCreateLink ~= 'forminput') and coreData.form_createLinkPageName and mw.ustring.len(coreData.form_createLinkPageName) &amp;gt; 0 then&lt;br /&gt;
		local pageName = coreData.form_createLinkPageName&lt;br /&gt;
		if coreData.global_namespace and mw.ustring.len(coreData.global_namespace) &amp;gt; 0 and not mw.ustring.match(pageName, '^' .. coreData.global_namespace .. ':.+$') then&lt;br /&gt;
			pageName = coreData.global_namespace .. ':' .. pageName&lt;br /&gt;
		end&lt;br /&gt;
		local infostr = '{{((}}{info|page name=' .. pageName .. '|add title=' .. (coreData.form_labelCreate or 'create entity') .. '|edit title=' .. (coreData.form_labelEdit or 'edit entity') .. '}{{))}}'&lt;br /&gt;
		page.form.content = page.form.content .. '&amp;lt;!{{#invoke:String|rep|-|2}} this is a workaround, needed because of a SF bug: ' .. infostr ..&lt;br /&gt;
			'. see https://phabricator.wikimedia.org/T123230 for more information {{#invoke:String|rep|-|2}}&amp;gt;'&lt;br /&gt;
	end&lt;br /&gt;
	coreData.page = page&lt;br /&gt;
	local autocreate = {}&lt;br /&gt;
	autocreate.module = FoundationClass.myYesno(coreData.global_autocreate_module, tonumber(coreData.global_autocreate_module))&lt;br /&gt;
	autocreate.template = FoundationClass.myYesno(coreData.global_autocreate_template, tonumber(coreData.global_autocreate_template))&lt;br /&gt;
	autocreate.form = coreData.form_name and FoundationClass.myYesno(coreData.global_autocreate_form, tonumber(coreData.global_autocreate_form))&lt;br /&gt;
	autocreate.category = (coreData.global_category or coreData.global_gardeningCategory) and FoundationClass.myYesno(coreData.global_autocreate_category, tonumber(coreData.global_autocreate_category))&lt;br /&gt;
	if (FoundationClass.globalConfig.dataStore == 'both' or FoundationClass.globalConfig.dataStore == 'smw') and FoundationClass.myYesno(coreData.global_smwUseStorage) then&lt;br /&gt;
		local propertyNSName = _namespaceName(self, mw.title.new('NUL', 'Property').namespace)&lt;br /&gt;
		autocreate[propertyNSName] = FoundationClass.myYesno(coreData['global_autocreate_' .. propertyNSName], tonumber(coreData['global_autocreate_' .. propertyNSName]))&lt;br /&gt;
	end&lt;br /&gt;
	coreData.autocreate = autocreate&lt;br /&gt;
	local propertyData&lt;br /&gt;
	local propertyOrder&lt;br /&gt;
	if (FoundationClass.globalConfig.dataStore == 'both' or FoundationClass.globalConfig.dataStore == 'smw') and FoundationClass.myYesno(coreData.global_smwUseStorage) and thisClass and thisConfig then&lt;br /&gt;
		-- we use smw and class and config are created and accessible. we can get property information and prepare data&lt;br /&gt;
		local matrix = thisClass:smwGetProperty2ParameterTranslationTable()&lt;br /&gt;
		propertyData = {}&lt;br /&gt;
		propertyOrder = {}&lt;br /&gt;
		for property, parameter in pairs(matrix) do&lt;br /&gt;
			table.insert(propertyOrder, property)&lt;br /&gt;
			local obj = mw.title.new(property, 'Property')&lt;br /&gt;
			propertyData[property] = { &lt;br /&gt;
				editlink = obj:fullUrl{action='edit'},&lt;br /&gt;
				exists = obj.exists,&lt;br /&gt;
				parameter = parameter,&lt;br /&gt;
			}&lt;br /&gt;
			if thisConfig.parameter[parameter] then&lt;br /&gt;
				propertyData[property].description = thisConfig.parameter[parameter].description&lt;br /&gt;
				propertyData[property].type = thisConfig.parameter[parameter].property_type&lt;br /&gt;
				propertyData[property].values = thisConfig.parameter[parameter].values&lt;br /&gt;
			elseif parameter == FoundationClass.globalConfig.smwClassProperty then&lt;br /&gt;
				propertyData[property].description = 'Automatisch hinzugefügt! Wird verwendet, um Mitglieder dieser Klasse zu finden (funktioniert auch, ohne dass eine Kategorie definiert wird und auch fur subobjects)'&lt;br /&gt;
				propertyData[property].type = 'Text'&lt;br /&gt;
			elseif parameter == FoundationClass.globalConfig.uidFieldName then&lt;br /&gt;
				propertyData[property].description = 'Automatisch hinzugefügt! Wird verwendet, um individuelle Objekte innerhalb der Klasse zu identifizieren.'&lt;br /&gt;
				propertyData[property].type = 'Text'&lt;br /&gt;
			end&lt;br /&gt;
			local values = ''&lt;br /&gt;
			if propertyData[property].values then&lt;br /&gt;
				values = values .. 'The allowed values are:'&lt;br /&gt;
				for _, value in pairs(propertyData[property].values) do&lt;br /&gt;
					values = values .. '\n* [[Allows value::' .. value .. ']]'&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				values = 'No restriction given'&lt;br /&gt;
			end&lt;br /&gt;
			propertyData[property].content = mw.message.new('classengine-template-property-page'):rawParams(propertyData[property].description, propertyData[property].type, values, propertyCategory):plain()&lt;br /&gt;
		end&lt;br /&gt;
		table.sort(propertyOrder)&lt;br /&gt;
		error('here')&lt;br /&gt;
	end&lt;br /&gt;
	coreData.properties = { data = propertyData, order = propertyOrder }&lt;br /&gt;
	return coreData	-- this is your new coreData.&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Classgenerator:myPlausibilityTest(args)&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator:myPlausibilityTest(args) to test arguments, from ' .. tostring(self))&lt;br /&gt;
	-- function that performs the individual plausibility tests&lt;br /&gt;
	-- note: before you access a field args.fieldname you should check for existance&lt;br /&gt;
	-- self:addError(text)&lt;br /&gt;
	return false	-- return value will be ignored. but if you add any error, the object's initialization will fail with the error&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Classgenerator:myStashAdjustments(stash)&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator:myStashAdjustments(stash) to do some minor adjustments on data before storing, from ' .. tostring(self))&lt;br /&gt;
	-- function that alters the stash before storing the data&lt;br /&gt;
	local stash = stash&lt;br /&gt;
	return stash	-- this is your new stash. this will be stored. it has format (fieldname: value)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Classgenerator:method()&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator:method() to do something, from ' .. tostring(self))&lt;br /&gt;
	return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return Classgenerator&lt;/div&gt;</summary>
		<author><name>Anatol</name></author>
	</entry>
	<entry>
		<id>https://camnet.oetterer.eu/index.php?title=Modul:Classgenerator/class&amp;diff=1006</id>
		<title>Modul:Classgenerator/class</title>
		<link rel="alternate" type="text/html" href="https://camnet.oetterer.eu/index.php?title=Modul:Classgenerator/class&amp;diff=1006"/>
		<updated>2016-02-09T20:49:49Z</updated>

		<summary type="html">&lt;p&gt;Anatol: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local FoundationClass = require('Module:Foundationclass')&lt;br /&gt;
local ClassDebug = require('Module:Debug/class')&lt;br /&gt;
&lt;br /&gt;
-- ****************************************************************&lt;br /&gt;
-- *                         inheritance                          *&lt;br /&gt;
-- ****************************************************************&lt;br /&gt;
local Classgenerator = FoundationClass:subclass('Classgenerator')&lt;br /&gt;
-- setting class's configuration data&lt;br /&gt;
Classgenerator.static.myConfiguration = mw.loadData('Module:Classgenerator/config')&lt;br /&gt;
--   being in a static method, use self.myConfiguration&lt;br /&gt;
--   being in a private method, that knows self or in a public method, use self.class.myConfiguration&lt;br /&gt;
&lt;br /&gt;
-- ****************************************************************&lt;br /&gt;
-- *                          properties                          *&lt;br /&gt;
-- ****************************************************************&lt;br /&gt;
&lt;br /&gt;
-- **************** initialization of table for private properties&lt;br /&gt;
local _private = setmetatable({}, {__mode = 'k'})   -- weak table storing all private attributes&lt;br /&gt;
&lt;br /&gt;
-- **************** declaration of public static properties&lt;br /&gt;
-- Classgenerator.static.myPropertyModule = require('Module:extern')&lt;br /&gt;
-- Classgenerator.static.staticProperty = 'value'&lt;br /&gt;
&lt;br /&gt;
-- remember the static classes provided by Foundationclass:&lt;br /&gt;
-- Classgenerator.globalConfig&lt;br /&gt;
-- Classgenerator.myCargoUtil&lt;br /&gt;
-- Classgenerator.myTableTools&lt;br /&gt;
&lt;br /&gt;
-- **************** declaration of (global) private properties&lt;br /&gt;
-- for properties you should rather use constructor and _private[self]. this only, if you need a private class property&lt;br /&gt;
-- you should, however predeclare private methods here&lt;br /&gt;
local _debug	-- private method declared later&lt;br /&gt;
local _privateMethodAhead	-- declaration ahead, so this private method can be used in the constructor and in other private methods&lt;br /&gt;
&lt;br /&gt;
-- ***************************************************************&lt;br /&gt;
-- *                           methods                           *&lt;br /&gt;
-- ***************************************************************&lt;br /&gt;
 &lt;br /&gt;
-- **************** declaration of static methods&lt;br /&gt;
function Classgenerator:initialize(uid)&lt;br /&gt;
	local _CFG = self.class.myConfiguration&lt;br /&gt;
	FoundationClass.initialize(self, uid)&lt;br /&gt;
	local page = mw.title.getCurrentTitle().text&lt;br /&gt;
	if uid and mw.ustring.match(uid, '^' .. _CFG.global.namespace .. ':.+$') then&lt;br /&gt;
		page = mw.ustring.match(uid, '^' .. _CFG.global.namespace .. ':(.+)$')&lt;br /&gt;
	end&lt;br /&gt;
	_private[self] = {&lt;br /&gt;
		dbg = ClassDebug:new(tostring(self.class) .. ': id ' .. uid),&lt;br /&gt;
		pagename = page&lt;br /&gt;
	}&lt;br /&gt;
	_debug(self, 1, ' Classgenerator: done initializing object &amp;amp;quot;' .. uid ..'&amp;amp;quot;, from ' .. tostring(self))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- use use self.myConfiguration to access your configuration in a static method&lt;br /&gt;
function Classgenerator.static:aStaticMethod(var)&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator.static:aStaticMethod() to do something, from ' .. tostring(self))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Classgenerator.static:mySfDynamicFieldAttribute(fieldname, attribute, value)&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator.static:mySfDynamicFieldAttribute(fieldname, attribute, value), from ' .. tostring(self))&lt;br /&gt;
	_debug(self, 2, ' with parameters &amp;amp;quot;' .. fieldname .. '&amp;amp;quot;, &amp;amp;quot;' .. attribute .. '&amp;amp;quot; and a ' .. type(value) .. ' value')&lt;br /&gt;
	-- function that can process any attribute/value pair just before rendering the semantic forms field&lt;br /&gt;
	-- usually done, to generate a dynamic 'default' value&lt;br /&gt;
	-- keep in mind: you can completely disable a form field, if you return true on attribute &amp;quot;disable&amp;quot;. note however, that this causes the field to not show at all, no data will be transported/saved&lt;br /&gt;
	local pagename = mw.title.getCurrentTitle().rootText&lt;br /&gt;
	local val = value&lt;br /&gt;
	if Classgenerator.myTableTools.inTable({'template_name', 'global_entityTitle'}, fieldname) and attribute == 'default' then&lt;br /&gt;
		val = pagename&lt;br /&gt;
	end&lt;br /&gt;
	if fieldname == 'global_cargoTable' and attribute == 'default' then&lt;br /&gt;
		val = mw.ustring.lower(pagename)&lt;br /&gt;
	end&lt;br /&gt;
	if Classgenerator.globalConfig.dataStore ~= 'cargo' and Classgenerator.globalConfig.dataStore ~= 'both' then&lt;br /&gt;
		if fieldname == 'global_cargoTable' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
		if fieldname == 'global_cargoUidFieldname' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if Classgenerator.globalConfig.dataStore ~= 'smw' and Classgenerator.globalConfig.dataStore ~= 'both' then&lt;br /&gt;
		if fieldname == 'global_smwIsSubobject' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
		if fieldname == 'global_smwUseStorage' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
		if fieldname == 'global_autocreate_property' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return val	-- this value will be used as new value for field's attribute&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Classgenerator.static:sfGenerateForm()&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator.static:sfGenerateForm(), from ' .. tostring(self))&lt;br /&gt;
	local _CFG = self.myConfiguration&lt;br /&gt;
	local ClassgeneratorParameter  = require('Module:Classgenerator/parameter/class')&lt;br /&gt;
	local ClassSFfield = require('Module:SFfield/class')&lt;br /&gt;
	local tagStart = '{{{'&lt;br /&gt;
	local tagEnd = '}}}'&lt;br /&gt;
	local frame = mw.getCurrentFrame()&lt;br /&gt;
	-- create the form header&lt;br /&gt;
	local notification = mw.html.create('')&lt;br /&gt;
	if _CFG.form.notification and mw.ustring.len(_CFG.form.notification) &amp;gt; 0 then&lt;br /&gt;
		local mbox = require('Module:Message box')&lt;br /&gt;
		notification:wikitext(mbox.main('ombox', { text = _CFG.form.notification }))&lt;br /&gt;
			:newline()&lt;br /&gt;
	end&lt;br /&gt;
	local formheader = mw.html.create('')&lt;br /&gt;
	formheader:wikitext(self:sfGenerateFormInfoTag())&lt;br /&gt;
		:wikitext('&amp;lt;h2&amp;gt;' .. _CFG.global.entityTitle .. '&amp;lt;/h2&amp;gt;')&lt;br /&gt;
		:tag('p')&lt;br /&gt;
			:wikitext(_CFG.form.headerText)&lt;br /&gt;
			:done()&lt;br /&gt;
			:newline()&lt;br /&gt;
		:node(notification)&lt;br /&gt;
		:tag('div')&lt;br /&gt;
			:attr('id', 'wikiPreview')&lt;br /&gt;
			:cssText('display: none; padding-bottom: 25px; margin-bottom: 25px; border-bottom: 1px solid #AAAAAA;')&lt;br /&gt;
			:done()&lt;br /&gt;
			:newline()&lt;br /&gt;
	-- create the form buttons&lt;br /&gt;
	local formbuttons = mw.html.create('div')&lt;br /&gt;
	for _, button in pairs(_CFG.form.buttons) do&lt;br /&gt;
		formbuttons:wikitext(tagStart .. 'standard input&amp;amp;#124;' .. button .. tagEnd)&lt;br /&gt;
	end&lt;br /&gt;
	formbuttons:addClass('formbuttons')&lt;br /&gt;
		:done()&lt;br /&gt;
	-- calculate the fieldlists:&lt;br /&gt;
	local fieldlists = {}&lt;br /&gt;
	for _, field in pairs(_CFG.form.fieldOrder) do&lt;br /&gt;
		local tab = mw.ustring.match(field, '^([a-z]+)_.+')&lt;br /&gt;
		if not fieldlists[tab] then&lt;br /&gt;
			fieldlists[tab] = {}&lt;br /&gt;
		end&lt;br /&gt;
		table.insert(fieldlists[tab], field)&lt;br /&gt;
	end&lt;br /&gt;
	-- assemble everything, so start the html object&lt;br /&gt;
	local html = mw.html.create('div')&lt;br /&gt;
	html:node(formheader)&lt;br /&gt;
		:wikitext('&amp;lt;h1&amp;gt;GLOBAL-Section&amp;lt;/h1&amp;gt;')&lt;br /&gt;
		:newline()&lt;br /&gt;
		:tag('div')&lt;br /&gt;
			:wikitext('This section deals with all the class\'s global data, i.e. all data you need for your &amp;quot;template&amp;quot; part as wenn as for your form, ... ')&lt;br /&gt;
			:done()&lt;br /&gt;
			:newline()&lt;br /&gt;
		:wikitext(tagStart .. 'for template|' .. _CFG.template.name .. '|label=' .. _CFG.global.entityTitle .. tagEnd)&lt;br /&gt;
		:newline()&lt;br /&gt;
		:node(self:sfGenerateFormTable(fieldlists.global))&lt;br /&gt;
		:newline()&lt;br /&gt;
		:wikitext('&amp;lt;h1&amp;gt;FORM-Section&amp;lt;/h1&amp;gt;')&lt;br /&gt;
		:newline()&lt;br /&gt;
		:tag('div')&lt;br /&gt;
			:wikitext('This section deals with all the data, you need to create and operate a form for this class. If you don\'t want a form, disable this section. ' ..&lt;br /&gt;
					'If you need a form (e.g. as part of another form), but no form page, enable this section but leave the field for form page name emtpy.')&lt;br /&gt;
			:done()&lt;br /&gt;
			:newline()&lt;br /&gt;
		:node(self:sfGenerateFormTable(fieldlists.form))&lt;br /&gt;
		:newline()&lt;br /&gt;
		:wikitext('&amp;lt;h1&amp;gt;TEMPLATE-Section&amp;lt;/h1&amp;gt;')&lt;br /&gt;
		:newline()&lt;br /&gt;
		:tag('div')&lt;br /&gt;
			:wikitext('This section deals with all the data, you need to create and operate a template for this class. If you need tempalte specific parameters ' ..&lt;br /&gt;
				'(meaning parameteres that you only need to operate the &amp;quot;action&amp;quot;-part), put them into this section\'s custom field')&lt;br /&gt;
			:done()&lt;br /&gt;
			:newline()&lt;br /&gt;
		:node(self:sfGenerateFormTable(fieldlists.template))&lt;br /&gt;
		:newline()&lt;br /&gt;
		:wikitext('&amp;lt;h1&amp;gt;PARAMETERS-Section&amp;lt;/h1&amp;gt;')&lt;br /&gt;
		:newline()&lt;br /&gt;
		:tag('div')&lt;br /&gt;
			:wikitext('This section deals with all your parameters. You need an entry for every form input field, every template parameter, every data field you want to store, and even every notification line.')&lt;br /&gt;
			:tag('ul')&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(&amp;quot;To produce a normal parameter, add an entry, choose storage type, set '''Regular form parameter''' to yes, choose a form input type, and a template doc type.&amp;quot;)&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(&amp;quot;If you want a data field to be stored in your data storage but not defined in the form, choose a data storage type and set '''Regular form parameter''' to no. &amp;quot;)&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(&amp;quot;If you want a mutiple template to be parsed to a parameter, create a normal parameter (as described above) and choose '''Regular form parameter''' to  be ''Holds template''.&amp;quot;)&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(&amp;quot;A parameter with a form input that is not stored is created like a regular parameter but without setting any data storage type.&amp;quot;)&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(&amp;quot;Finally, you can create a message line. This is useful, if you want to convey any information to the user, that is to important for a description-tooltip. &amp;quot; ..&lt;br /&gt;
						&amp;quot;What you need to do is disable everything ('''Template doc parameter type ''', data storage) and set '''Regular form parameter''' to ''Information''. &amp;quot; ..&lt;br /&gt;
						&amp;quot;You probalby want to add the parameter to one or more ''show on select'' entries, too.&amp;quot;)&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
				:done()&lt;br /&gt;
				:newline()&lt;br /&gt;
			:done()&lt;br /&gt;
			:newline()&lt;br /&gt;
		:node(self:sfInitField('parameter_parameter'):render())&lt;br /&gt;
		:newline()&lt;br /&gt;
		:wikitext(frame:extensionTag('headertabs'))&lt;br /&gt;
		:newline()&lt;br /&gt;
		:wikitext(&amp;quot;'''(*) Pflichtfeld'''&amp;quot;)&lt;br /&gt;
		:newline()&lt;br /&gt;
		:wikitext(tagStart .. 'end template' .. tagEnd)&lt;br /&gt;
		:newline()&lt;br /&gt;
		:wikitext(ClassgeneratorParameter:sfGenerateForm())&lt;br /&gt;
		:newline()&lt;br /&gt;
		:node(formbuttons)&lt;br /&gt;
	local debugLevel = FoundationClass.globalConfig.debugLevel or self.myConfiguration.global.debugLevel&lt;br /&gt;
	if debugLevel then&lt;br /&gt;
		html:newline()&lt;br /&gt;
			:newline()&lt;br /&gt;
			:wikitext(ClassDebug:printLog(debugLevel))&lt;br /&gt;
	end&lt;br /&gt;
	return html&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- **************** declaration of private methods&lt;br /&gt;
-- use self.class.myConfiguration to access your configuration in a public or a private method that is called by a public method&lt;br /&gt;
_debug = function (self, level, text)&lt;br /&gt;
	if _private[self] and _private[self].dbg then&lt;br /&gt;
		local debugLevel = FoundationClass.globalConfig.debugLevel or self.class.myConfiguration.global.debugLevel&lt;br /&gt;
		if debugLevel and level &amp;lt;= debugLevel then&lt;br /&gt;
			_private[self].dbg:log(level, text)&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		local debugLevel = FoundationClass.globalConfig.debugLevel or self.myConfiguration.global.debugLevel&lt;br /&gt;
		if debugLevel and level &amp;lt;= debugLevel then&lt;br /&gt;
			ClassDebug:log(level, text, tostring(self) .. '.static')&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local _namespaceName = function (self, namespaceId)&lt;br /&gt;
	_debug(self, 1, 'entering private _namespaceName() to translate namespace namespaceId ' .. namespaceId .. ' into a universal name, from ' .. tostring(self))&lt;br /&gt;
	local ret, nulProperty = pcall(mw.title.new, 'NUL', 'Property')&lt;br /&gt;
	if ret and (namespaceId == nulProperty.namespace) then&lt;br /&gt;
		return 'property'	-- if you change this, check on other places, this is checked against and change that, too&lt;br /&gt;
	else&lt;br /&gt;
		return mw.site.namespaces[namespaceId].canonicalName&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local _processAttribute = function (self, attr, indent, name)&lt;br /&gt;
	_debug(self, 1, 'entering private _processAttribute() to print a line for attribute ' .. attr .. ', from ' .. tostring(self))&lt;br /&gt;
	local coreData = self:getCoreData()&lt;br /&gt;
	local attr = attr&lt;br /&gt;
	local val = coreData[attr]&lt;br /&gt;
	if type(val) == 'boolean' then&lt;br /&gt;
		val = val and 'true' or 'false'&lt;br /&gt;
	end&lt;br /&gt;
	local ret = ''&lt;br /&gt;
	local fieldname = mw.ustring.match(attr, '^[^_]+_(.+)$')&lt;br /&gt;
	ret = indent .. (name and name or fieldname) .. ' = '&lt;br /&gt;
	if not val then&lt;br /&gt;
		ret = ret .. 'nil'&lt;br /&gt;
	elseif type(val) == 'table' then&lt;br /&gt;
		ret = ret .. Classgenerator.myTableTools.printTable(val, 'inline')&lt;br /&gt;
	elseif val == 'true' or val == 'false' or mw.ustring.match(val, '^[0-9]+$') or (attr == 'global_gardeningCategory' and val == 'superglobal.gardeningCategory') then&lt;br /&gt;
		ret = ret .. val&lt;br /&gt;
	else&lt;br /&gt;
		ret = ret .. &amp;quot;'&amp;quot; .. mw.ustring.gsub(mw.ustring.gsub(mw.ustring.gsub(val, &amp;quot;\\'&amp;quot;, &amp;quot;'&amp;quot;), &amp;quot;'&amp;quot;, &amp;quot;\\'&amp;quot;), '\n', '\\n\' ..\n' .. indent .. '\t\'') .. &amp;quot;'&amp;quot;	-- the gsub catches multiline input from textareas&lt;br /&gt;
	end&lt;br /&gt;
	ret = ret .. ','&lt;br /&gt;
	if self.class.myConfiguration.template.addCommentsToConfig then&lt;br /&gt;
		ret = ret .. '\t-- ' .. self.class.myConfiguration.parameter[attr].description&lt;br /&gt;
	end&lt;br /&gt;
	ret = ret .. '\n'&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local _privateMethod = function (self)&lt;br /&gt;
	_debug(self, 1, 'entering private _privateMethod() to do something, from ' .. tostring(self))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- **************** declaration of public methods&lt;br /&gt;
-- use self.class.myConfiguration to access your configuration in a public method&lt;br /&gt;
function Classgenerator:addInfobox()&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator:addInfobox(), from ' .. tostring(self))&lt;br /&gt;
	if self:goodToGo() then&lt;br /&gt;
		local _CFG = self.class.myConfiguration&lt;br /&gt;
		local coreData = self:getCoreData()&lt;br /&gt;
		local usesSmw = FoundationClass.globalConfig.dataStore and (FoundationClass.globalConfig.dataStore == 'both' or FoundationClass.globalConfig.dataStore == 'smw') and FoundationClass.myYesno(coreData.global_smwUseStorage)&lt;br /&gt;
		local ib_args = {&lt;br /&gt;
			bodyclass = 'infobox_name',&lt;br /&gt;
			aboveclass = 'objtitle titletext',&lt;br /&gt;
			headerclass = 'headertext',&lt;br /&gt;
			labelstyle = 'width: 30%;',&lt;br /&gt;
			datastyle = 'width: 70%;',&lt;br /&gt;
			title = coreData.className,&lt;br /&gt;
			subheader = 'Class',&lt;br /&gt;
			label1 = 'Title',&lt;br /&gt;
			data1 = coreData.global_entityTitle and coreData.global_entityTitle or '',&lt;br /&gt;
			label2 = _CFG.parameter.global_edit_timestamp.label,&lt;br /&gt;
			data2 = coreData.last_edited,&lt;br /&gt;
			label3 = 'Store available',&lt;br /&gt;
			data3 = (FoundationClass.globalConfig.dataStore and mw.ustring.len(FoundationClass.globalConfig.dataStore) &amp;gt; 0) and FoundationClass.globalConfig.dataStore or '',&lt;br /&gt;
			label5 = 'Cargo table',&lt;br /&gt;
			data5 = (FoundationClass.globalConfig.dataStore and (FoundationClass.globalConfig.dataStore == 'both' or FoundationClass.globalConfig.dataStore == 'cargo')) and coreData.global_cargoTable or '',&lt;br /&gt;
			label6 = 'Smw class',&lt;br /&gt;
			data6 = usesSmw and _private[self].pagename or '',&lt;br /&gt;
			data7 = coreData.global_description,&lt;br /&gt;
			header10 = 'Pages',&lt;br /&gt;
			label12 = 'Module',&lt;br /&gt;
			data12 = _private[self].pagename and '[[Module:' .. _private[self].pagename .. ']]' or '',&lt;br /&gt;
			label13 = 'Class',&lt;br /&gt;
			data13 = _private[self].pagename and '[[Module:' .. _private[self].pagename .. '/class]]' or '',&lt;br /&gt;
			label14 = 'Config',&lt;br /&gt;
			data14 = _private[self].pagename and '[[Module:' .. _private[self].pagename .. '/config]]' or '',&lt;br /&gt;
			label17 = 'Template',&lt;br /&gt;
			data17 = coreData.template_name and '[[Template:' .. coreData.template_name .. ']]' or '',&lt;br /&gt;
			label19 = 'Form',&lt;br /&gt;
			data19 = coreData.page.form and '[[:' .. coreData.page.form.name .. ']]' or '',&lt;br /&gt;
			label21 = 'Category',&lt;br /&gt;
			data21 = coreData.page.category and '[[:' .. coreData.page.category.name .. ']]' or '',&lt;br /&gt;
			label22 = 'Gardening',&lt;br /&gt;
			data22 = coreData.page.gardeningCategory and '[[:' .. coreData.page.gardeningCategory.name .. ']]' or '',&lt;br /&gt;
		}&lt;br /&gt;
		if usesSmw and coreData.properties.order and #coreData.properties.order &amp;gt; 0 then&lt;br /&gt;
			ib_args.header30 = 'Properties'&lt;br /&gt;
			local i = 31&lt;br /&gt;
			for _, property in pairs(coreData.properties.order) do&lt;br /&gt;
				ib_args['label' .. i] = coreData.properties.data[property].type&lt;br /&gt;
				ib_args['data' .. i] = '[[Property:' .. property .. '|' .. property .. ']]'&lt;br /&gt;
				i = i + 1&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		self:addOutput(require('Module:Infobox').infobox(ib_args))&lt;br /&gt;
		return true&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Classgenerator:addPageBody()&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator:addPageBody(), from ' .. tostring(self))&lt;br /&gt;
	_debug(self, 2, ' rendering errors and warnings and adding them to output')&lt;br /&gt;
	self:addOutput(self:renderErrors())&lt;br /&gt;
	self:addOutput(self:renderWarnings())&lt;br /&gt;
	if self:goodToGo() then&lt;br /&gt;
		local frame = mw.getCurrentFrame()&lt;br /&gt;
		local lang = mw.language.new('en-gb')&lt;br /&gt;
		local _CFG = self.class.myConfiguration&lt;br /&gt;
		local coreData = self:getCoreData()&lt;br /&gt;
		-- start&lt;br /&gt;
		local widthTh = '300px'&lt;br /&gt;
		local widthTd = '200px'&lt;br /&gt;
		-- build the page status table&lt;br /&gt;
		-- first the two status table cells &amp;quot;green&amp;quot; and &amp;quot;red&amp;quot;&lt;br /&gt;
		local imgYes = '[[File:Yes check.png|13px|alt=Yes|link=]]'&lt;br /&gt;
		local imgNo = '[[File:X mark.png|13px|alt=No|link=]]'&lt;br /&gt;
		local tdYa = mw.html.create('td')&lt;br /&gt;
		tdYa:cssText('background: #90ff90; color:black; vertical-align: middle; text-align: center; width:' .. widthTd)&lt;br /&gt;
			:addClass('table-yes')&lt;br /&gt;
			:wikitext(imgYes)&lt;br /&gt;
		local tdNa = mw.html.create('td')&lt;br /&gt;
		tdNa:cssText('background: #FF9090; color:black; vertical-align: middle; text-align: center; width:' .. widthTd)&lt;br /&gt;
			:addClass('table-no')&lt;br /&gt;
			:wikitext(imgNo)&lt;br /&gt;
		local classExists = coreData.page.class.exists and coreData.page.config.exists&lt;br /&gt;
		local modulesExist = coreData.page.base.exists and classExists&lt;br /&gt;
		local thisClass&lt;br /&gt;
		local thisConfig&lt;br /&gt;
		if classExists then&lt;br /&gt;
			thisClass = require(coreData.page.class.name)&lt;br /&gt;
			thisConfig = require(coreData.page.config.name)&lt;br /&gt;
		end&lt;br /&gt;
		local thisUsesCargo = (FoundationClass.globalConfig.dataStore == 'both' or FoundationClass.globalConfig.dataStore == 'cargo') and coreData.global_cargoTable and #coreData.global_cargoTable &amp;gt; 0&lt;br /&gt;
		local thisUsesSmw = (FoundationClass.globalConfig.dataStore == 'both' or FoundationClass.globalConfig.dataStore == 'smw') and FoundationClass.myYesno(coreData.global_smwUseStorage)&lt;br /&gt;
		-- write the 2do checklist&lt;br /&gt;
		local done = true&lt;br /&gt;
		local step1&lt;br /&gt;
		local step2&lt;br /&gt;
		local step3&lt;br /&gt;
		if modulesExist then&lt;br /&gt;
			step1 = imgYes .. ' You created all your modules'&lt;br /&gt;
		else&lt;br /&gt;
			done = false&lt;br /&gt;
			step1 = imgNo .. ' You have to create your module pages. This, you have to do &amp;lt;b&amp;gt;manually&amp;lt;/b&amp;gt;. Go to [[#Page contents|section Page contents]], copy the module content and edit the corresponding module, ' ..&lt;br /&gt;
				'pasting all the copied content. Save and close. You have to do this for the following module(s): &amp;lt;ul&amp;gt; ' ..&lt;br /&gt;
				(not coreData.page.base.exists and '&amp;lt;li&amp;gt;[[#Page contents|' .. coreData.page.base.name .. ']]&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
				(not coreData.page.class.exists and '&amp;lt;li&amp;gt;[[#Page contents|' .. coreData.page.class.name .. ']]&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
				(not coreData.page.config.exists and '&amp;lt;li&amp;gt;[[#Page contents|' .. coreData.page.config.name .. ']]&amp;lt;/li&amp;gt;' or '') .. '&amp;lt;/ul&amp;gt;'&lt;br /&gt;
		end&lt;br /&gt;
		if coreData.page.baseDoc.exists and coreData.page.classDoc.exists and coreData.page.configDoc.exists and coreData.page.template.exists and coreData.page.templateDoc.exists and&lt;br /&gt;
				(not coreData.page.form or coreData.page.form.exists) and (not coreData.page.category or coreData.page.category.exists) and (not coreData.page.gardeningCategory or coreData.page.gardeningCategory.exists) then&lt;br /&gt;
			step2 = imgYes .. ' You created all auxilliary pages'&lt;br /&gt;
		else&lt;br /&gt;
			done = false&lt;br /&gt;
			step2 = imgNo .. ' You have to create auxilliary pages. This, you can do &amp;lt;b&amp;gt;automatically&amp;lt;/b&amp;gt;. Go to [[#Page autocreation|section Page autocreation]], hit the corresponding &amp;quot;Create&amp;quot;-button or ' ..&lt;br /&gt;
				'create all pages at once. Please do this for the following page(s): &amp;lt;ul&amp;gt; ' ..&lt;br /&gt;
				(not (coreData.page.baseDoc.exists or coreData.page.classDoc.exists or coreData.page.configDoc.exists) and '&amp;lt;li&amp;gt;Module documentation pages&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
				(not (coreData.page.template.exists or coreData.page.templateDoc.exists) and '&amp;lt;li&amp;gt;Template and/or template documentation page&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
				((coreData.page.form and not coreData.page.form.exists) and '&amp;lt;li&amp;gt;Form page&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
				(((coreData.page.category and not coreData.page.category.exists) or (coreData.page.gardeningCategory and not coreData.page.gardeningCategory.exists)) and '&amp;lt;li&amp;gt;Category page(s)&amp;lt;/li&amp;gt;' or '') .. '&amp;lt;/ul&amp;gt;'&lt;br /&gt;
		end&lt;br /&gt;
		local storeCargoInstruction&lt;br /&gt;
		local allPropertiesThere&lt;br /&gt;
		local cargoTableCreateLink = false&lt;br /&gt;
		if thisUsesCargo then&lt;br /&gt;
			-- we actually use cargo. check, if cargo table is there or throws an error? if all right, then yes, else instruction above&lt;br /&gt;
			if modulesExist and coreData.page.template.exists then&lt;br /&gt;
				cargoTableCreateLink = true&lt;br /&gt;
				attr = { limit = 1, default = '' }&lt;br /&gt;
				attr['more results text'] = ''&lt;br /&gt;
				local tableEntryId = mw.text.trim(mw.text.unstrip(FoundationClass.myCargoUtil.rawquery({tables = coreData.global_cargoTable, fields = {'_ID'}}, attr)))&lt;br /&gt;
				if mw.ustring.match(mw.text.trim(tableEntryId), '^[0-9]*$') then&lt;br /&gt;
					storeCargoInstruction = imgYes .. ' Your cargo table does exist! (Note: When you change your cargo table\'s declaration, you need to [[#Page autocreation|rebuild it]], though)'&lt;br /&gt;
				else&lt;br /&gt;
					done = false&lt;br /&gt;
					storeCargoInstruction = imgNo .. ' Please [[#Page autocreation|create your cargo table]]!'&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				done = false&lt;br /&gt;
				storeCargoInstruction = imgNo .. ' To be able to create your cargo table, you have to create the following page(s): &amp;lt;ul&amp;gt;' ..&lt;br /&gt;
					(not coreData.page.base.exists and '&amp;lt;li&amp;gt;' .. coreData.page.base.name .. '&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
					(not coreData.page.class.exists and '&amp;lt;li&amp;gt;' .. coreData.page.class.name .. '&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
					(not coreData.page.config.exists and '&amp;lt;li&amp;gt;' .. coreData.page.config.name .. '&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
					(not coreData.page.template.exists and '&amp;lt;li&amp;gt;' .. coreData.page.template.name .. '&amp;lt;/li&amp;gt;' or '') .. '&amp;lt;/ul&amp;gt;'&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if thisUsesSmw then&lt;br /&gt;
			-- we actually use smw. check, if all properties are present? if all right, then yes, else instruction above&lt;br /&gt;
			if coreData.properties and coreData.properties.data and FoundationClass.myTableTools.size(coreData.properties.data) &amp;gt; 0 then&lt;br /&gt;
				allPropertiesThere = true&lt;br /&gt;
				for property, propertyData in pairs(coreData.properties.data) do&lt;br /&gt;
					allPropertiesThere = allPropertiesThere and propertyData.exists&lt;br /&gt;
				end&lt;br /&gt;
				if allPropertiesThere then&lt;br /&gt;
					storeSwmInstruction = imgYes .. ' All your property pages are present and accounted for!'&lt;br /&gt;
				else&lt;br /&gt;
					done = false&lt;br /&gt;
					storeSwmInstruction = imgNo .. ' Please &amp;lt;b&amp;gt;[[#Page autocreation|autocreate]]&amp;lt;/b&amp;gt; your properties! The following are missing: &amp;lt;ul&amp;gt;'&lt;br /&gt;
					for _, property in pairs(coreData.properties.order) do&lt;br /&gt;
						local pdata = coreData.properties.data[property]&lt;br /&gt;
						if not pdata or not pdata.exists then&lt;br /&gt;
							storeSwmInstruction = storeSwmInstruction .. '&amp;lt;li&amp;gt;[[Property:' .. property .. ']]&amp;lt;/li&amp;gt;'&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
					storeSwmInstruction = storeSwmInstruction .. '&amp;lt;/ul&amp;gt;'&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				done = false&lt;br /&gt;
				storeSwmInstruction = imgNo .. ' To be able to create your smw properties, you have to create the following page(s): &amp;lt;ul&amp;gt;' ..&lt;br /&gt;
					(not coreData.page.class.exists and '&amp;lt;li&amp;gt;' .. coreData.page.class.name .. '&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
					(not coreData.page.config.exists and '&amp;lt;li&amp;gt;' .. coreData.page.config.name .. '&amp;lt;/li&amp;gt;' or '') .. '&amp;lt;/ul&amp;gt;'&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if storeCargoInstruction or storeSwmInstruction then&lt;br /&gt;
			if storeCargoInstruction and storeSwmInstruction then&lt;br /&gt;
				step3 = 'Your class used cargo AND smw store. You have to create both data stores: &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;' .. storeCargoInstruction .. '&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;' .. storeSwmInstruction .. '&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;'&lt;br /&gt;
			else&lt;br /&gt;
				step3 = storeCargoInstruction or storeSwmInstruction&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			step3 = imgYes .. ' This class does not use a data store. Nothing to be done here!'&lt;br /&gt;
		end&lt;br /&gt;
		local step4 = done and imgYes .. ' You are done. Remember, when you want to change parameters in your config, edit this page and write your [' .. coreData.page.config.editlink .. ' config file] new' or &lt;br /&gt;
			imgNo .. ' You are not finished yet, please tend to your tasks.'&lt;br /&gt;
		local manual = mw.html.create('')&lt;br /&gt;
		manual:wikitext('&amp;lt;h2&amp;gt;Your 2do checklist&amp;lt;/h2&amp;gt;')&lt;br /&gt;
			:tag('ol')&lt;br /&gt;
				:cssText('margin: 0.3em 0 0 1.6em; padding: 0')&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(step1)&lt;br /&gt;
					:done()&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(step2)&lt;br /&gt;
					:done()&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(step3)&lt;br /&gt;
					:done()&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(step4)&lt;br /&gt;
					:done()&lt;br /&gt;
				:done()&lt;br /&gt;
		-- get the data store details, if all the modules exist and we have a datastore configured&lt;br /&gt;
		local datastore = mw.html.create('')&lt;br /&gt;
		if thisClass then&lt;br /&gt;
			datastore:node(thisClass:explainDataStore())&lt;br /&gt;
				:newline()&lt;br /&gt;
		end&lt;br /&gt;
		-- build the status table&lt;br /&gt;
		local statusTrs = mw.html.create('')&lt;br /&gt;
		for _, pid in pairs(coreData.page.order) do&lt;br /&gt;
			statusTrs:tag('tr')&lt;br /&gt;
				:tag('th')&lt;br /&gt;
					:css('text-align', 'left')&lt;br /&gt;
					:css('width', widthTh)&lt;br /&gt;
					:wikitext(coreData.page[pid].name)&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
				:node(coreData.page[pid].exists and tdYa or tdNa)&lt;br /&gt;
				:newline()&lt;br /&gt;
				:done()&lt;br /&gt;
				:newline()&lt;br /&gt;
		end&lt;br /&gt;
		if thisUsesSmw and coreData.properties and coreData.properties.data and FoundationClass.myTableTools.size(coreData.properties.data) &amp;gt; 0 then&lt;br /&gt;
			statusTrs:tag('tr')&lt;br /&gt;
				:tag('th')&lt;br /&gt;
					:css('text-align', 'center')&lt;br /&gt;
					:css('width', widthTh)&lt;br /&gt;
					:attr('colspan', 2)&lt;br /&gt;
					:wikitext('Property pages for your smw store')&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
			for _, property in pairs(coreData.properties.order) do&lt;br /&gt;
				statusTrs:tag('tr')&lt;br /&gt;
					:tag('th')&lt;br /&gt;
						:css('text-align', 'left')&lt;br /&gt;
						:css('width', widthTh)&lt;br /&gt;
						:wikitext('Property:' .. property)&lt;br /&gt;
						:done()&lt;br /&gt;
						:newline()&lt;br /&gt;
					:node(coreData.properties.data[property].exists and tdYa or tdNa)&lt;br /&gt;
					:newline()&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		local statusTable = mw.html.create('table')&lt;br /&gt;
		statusTable:node(statusTrs)&lt;br /&gt;
		-- page autocreation&lt;br /&gt;
		local extAutoCreatePage = pcall(frame.callParserFunction, frame, {name = '#createpageifnotex:Module:Classgenerator', {'NUL'}})&lt;br /&gt;
		local autoCreation = _CFG.template.createPages and extAutoCreatePage&lt;br /&gt;
		local pageAutoCreation = mw.html.create('')&lt;br /&gt;
		pageAutoCreation:wikitext('&amp;lt;h2&amp;gt;Page autocreation&amp;lt;/h2&amp;gt;')&lt;br /&gt;
			:newline()&lt;br /&gt;
		if autoCreation then&lt;br /&gt;
			-- depending on parameters and existence of pages do the autocreate or print the button&lt;br /&gt;
			-- first see, which pagecomplexes (modules(docs), templates, form, category) are missing&lt;br /&gt;
			local missing = {}&lt;br /&gt;
			-- in missing we store, if a page in a given namespace is missing. Namespaces are stored by their ids (numbers)&lt;br /&gt;
			for _, pid in pairs(coreData.page.order) do&lt;br /&gt;
				-- due to extension autocreatepage messing up module pages, in namepace module we only autocreate doc pages&lt;br /&gt;
				if not coreData.page[pid].exists and not Classgenerator.myTableTools.inTable(missing, coreData.page[pid].namespace) and &lt;br /&gt;
						(coreData.page[pid].namespace ~= 828 or coreData.page[pid].isDocPage) then&lt;br /&gt;
					table.insert(missing, coreData.page[pid].namespace)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			if thisUsesSmw and not allPropertiesThere then&lt;br /&gt;
				table.insert(missing, mw.title.new('NUL', 'Property').namespace)&lt;br /&gt;
			end&lt;br /&gt;
			-- now generate the printout or call the parser function depending on global_autocreate_* status&lt;br /&gt;
			-- remember the switches 'global_autocreate_module', 'global_autocreate_template', 'global_autocreate_form', 'global_autocreate_category', and 'global_autocreate_property'&lt;br /&gt;
			local actable = mw.html.create('table')&lt;br /&gt;
			for _, nsid  in pairs(missing) do&lt;br /&gt;
				local ns = mw.ustring.lower(_namespaceName(self, nsid))&lt;br /&gt;
				local information = ''&lt;br /&gt;
				if coreData.autocreate[ns] and coreData.autocreate[ns] &amp;gt; os.time() - _CFG.template.autoCreationTimeDiff then&lt;br /&gt;
					-- ************************************* actual autocreation is done here&lt;br /&gt;
					-- we iterate over all namespaces for which pages are missing (var missing) and spring into action, if we have a numeric value supplied for that namespace coreData.autocreate[ns] that is recent enough&lt;br /&gt;
					-- now we have a namespace, we want to create pages for (var nsid) (all that is done in the recent 4 lines). what we do in the following lines:&lt;br /&gt;
					-- we iterate over all pages in coreData.page.order and spring into action, if the interation instance (pid) is in the namespace (nsid), the page is non exist and is not a module&lt;br /&gt;
					-- in that action body, we create the page with the precalcualted content&lt;br /&gt;
					-- also: for convenience, we create some global project (meta)categories, if related to the current page (project-form-category if nsid for forms, etc.) and configured in Foundationclass/globalconfig. here is an overview&lt;br /&gt;
					--	Classgenerator.globalConfig.formCategory			: MediaWiki:Classengine-content-project-form-category&lt;br /&gt;
					--	Classgenerator.globalConfig.gardeningSuperCategory	: MediaWiki:Classengine-content-project-gardening-supercategory&lt;br /&gt;
					--	Classgenerator.globalConfig.moduleCategory			: MediaWiki:Classengine-content-project-module-category&lt;br /&gt;
					--	Classgenerator.globalConfig.projectSuperCategory	: MediaWiki:Classengine-content-project-supercategory&lt;br /&gt;
					--	Classgenerator.globalConfig.propertyCategory		: MediaWiki:Classengine-content-project-property-category&lt;br /&gt;
					--	Classgenerator.globalConfig.templateCategory		: MediaWiki:Classengine-content-project-templates&lt;br /&gt;
					for _, pid in pairs(coreData.page.order) do&lt;br /&gt;
						_debug(self, 3, ' testing page &amp;quot;' .. coreData.page[pid].name .. '&amp;quot;: namespace id is ' .. coreData.page[pid].namespace ..&lt;br /&gt;
							', and page does ' ..(not coreData.page[pid].exists and 'not ' or '') .. 'exist')&lt;br /&gt;
						if coreData.page[pid].namespace == nsid and not coreData.page[pid].exists and (nsid ~= 828 or coreData.page[pid].isDocPage) then&lt;br /&gt;
							if pid == 'gardeningCategory' and Classgenerator.globalConfig.gardeningSuperCategory and #Classgenerator.globalConfig.gardeningSuperCategory &amp;gt; 0 then&lt;br /&gt;
								-- we just iterated over the gardening category page (so this class has one) but we did not create it, yet)&lt;br /&gt;
								-- blindly try to create the gardening supercategory first, in case the class's gardening category is the gardening supercategory, we dont want the class specific content&lt;br /&gt;
								local content = '{{MediaWiki:Classengine-content-project-gardening-supercategory}}'&lt;br /&gt;
								_debug(self, 3, ' trying to autocreate garderning supercategory page &amp;quot;' .. Classgenerator.globalConfig.gardeningSuperCategory .. '&amp;quot; with # of content being ' .. #content)&lt;br /&gt;
								local ret = frame:callParserFunction{ name = '#createpageifnotex:Category:' .. Classgenerator.globalConfig.gardeningSuperCategory, args = { content } }&lt;br /&gt;
								if #ret &amp;gt; 0 then&lt;br /&gt;
									information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
								end&lt;br /&gt;
							end&lt;br /&gt;
							_debug(self, 3, ' trying to autocreate page &amp;quot;' .. coreData.page[pid].name .. '&amp;quot; with # of content being ' .. #coreData.page[pid].content)&lt;br /&gt;
							local ret = frame:callParserFunction{ name = '#createpageifnotex:' .. coreData.page[pid].name, args = { frame:preprocess(coreData.page[pid].content) } }&lt;br /&gt;
							if #ret &amp;gt; 0 then&lt;br /&gt;
								information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
							end&lt;br /&gt;
							if pid == 'form' and Classgenerator.globalConfig.formCategory and #Classgenerator.globalConfig.formCategory &amp;gt; 0 then&lt;br /&gt;
								-- we just iterated over the form page (so this class has one) and created it (yay). Now blindly create the formCategory as well...&lt;br /&gt;
								local content = '{{MediaWiki:Classengine-content-project-form-category}}'&lt;br /&gt;
								_debug(self, 3, ' trying to autocreate form category page &amp;quot;' .. Classgenerator.globalConfig.formCategory .. '&amp;quot; with # of content being ' .. #content)&lt;br /&gt;
								local ret = frame:callParserFunction{ name = '#createpageifnotex:Category:' .. Classgenerator.globalConfig.formCategory, args = { content } }&lt;br /&gt;
								if #ret &amp;gt; 0 then&lt;br /&gt;
									information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
								end&lt;br /&gt;
							elseif nsid ~= 828 and Classgenerator.globalConfig.moduleCategory and #Classgenerator.globalConfig.moduleCategory &amp;gt; 0 then&lt;br /&gt;
								-- we just iterated a module doc page (so this class has one) and created it (yay). Now blindly create the moduleCategory as well...&lt;br /&gt;
								local content = '{{MediaWiki:Classengine-content-project-module-category}}'&lt;br /&gt;
								_debug(self, 3, ' trying to autocreate module category page &amp;quot;' .. Classgenerator.globalConfig.moduleCategory .. '&amp;quot; with # of content being ' .. #content)&lt;br /&gt;
								local ret = frame:callParserFunction{ name = '#createpageifnotex:Category:' .. Classgenerator.globalConfig.moduleCategory, args = { content } }&lt;br /&gt;
								if #ret &amp;gt; 0 then&lt;br /&gt;
									information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
								end&lt;br /&gt;
							elseif pid == 'category' and Classgenerator.globalConfig.projectSuperCategory and #Classgenerator.globalConfig.projectSuperCategory &amp;gt; 0 then&lt;br /&gt;
								-- we just iterated over the category page (so this class has one) and created it (yay). Now blindly create the supercategory as well...&lt;br /&gt;
								local content = '{{MediaWiki:Classengine-content-project-supercategory}}'&lt;br /&gt;
								_debug(self, 3, ' trying to autocreate super category page &amp;quot;' .. Classgenerator.globalConfig.projectSuperCategory .. '&amp;quot; with # of content being ' .. #content)&lt;br /&gt;
								local ret = frame:callParserFunction{ name = '#createpageifnotex:Category:' .. Classgenerator.globalConfig.projectSuperCategory, args = { content } }&lt;br /&gt;
								if #ret &amp;gt; 0 then&lt;br /&gt;
									information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
								end&lt;br /&gt;
							elseif nsid == 10 and Classgenerator.globalConfig.templateCategory and #Classgenerator.globalConfig.templateCategory &amp;gt; 0 then&lt;br /&gt;
								-- we just iterated over a page in template namespace (so this class has one) and created it (yay). Now blindly create the templateCategory as well...&lt;br /&gt;
								local content = '{{MediaWiki:Classengine-content-project-template-category}}'&lt;br /&gt;
								_debug(self, 3, ' trying to autocreate template category page &amp;quot;' .. Classgenerator.globalConfig.templateCategory .. '&amp;quot; with # of content being ' .. #content)&lt;br /&gt;
								local ret = frame:callParserFunction{ name = '#createpageifnotex:Category:' .. Classgenerator.globalConfig.templateCategory, args = { content } }&lt;br /&gt;
								if #ret &amp;gt; 0 then&lt;br /&gt;
									information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
								end&lt;br /&gt;
							end&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
					if thisUsesSmw and (nsid == mw.title.new('NUL', 'Property').namespace) then&lt;br /&gt;
						-- add here autocreation of properties&lt;br /&gt;
						for property, pdata in pairs(coreData.properties.data) do&lt;br /&gt;
							if not pdata.exists then&lt;br /&gt;
								local content = pdata.content&lt;br /&gt;
								_debug(self, 3, ' trying to autocreate property page &amp;quot;' .. property .. '&amp;quot; with # of content being ' .. #content)&lt;br /&gt;
								local ret = frame:callParserFunction{ name = '#createpageifnotex:Property:' .. property, args = { frame:preprocess(pdata.content) } }&lt;br /&gt;
								if #ret &amp;gt; 0 then&lt;br /&gt;
									information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
								end&lt;br /&gt;
							end&lt;br /&gt;
						end&lt;br /&gt;
						-- we just iterated over all missing property pages (so this class has some) and created them (yay). Now blindly create the propertyCategory as well...&lt;br /&gt;
						local content = '{{MediaWiki:Classengine-content-project-property-category}}'&lt;br /&gt;
						_debug(self, 3, ' trying to autocreate property category page &amp;quot;' .. Classgenerator.globalConfig.propertyCategory .. '&amp;quot; with # of content being ' .. #content)&lt;br /&gt;
						local ret = frame:callParserFunction{ name = '#createpageifnotex:Category:' .. Classgenerator.globalConfig.propertyCategory, args = { content } }&lt;br /&gt;
						if #ret &amp;gt; 0 then&lt;br /&gt;
							information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				-- create the tr for the ns&lt;br /&gt;
				actable:tag('tr')&lt;br /&gt;
					:tag('th')&lt;br /&gt;
						:css('text-align', 'left')&lt;br /&gt;
						:css('width', widthTh)&lt;br /&gt;
						:wikitext('Create ' .. ((nsid == 828 and 'module docs' or (ns == 'property' and 'properties' or (ns .. (ns == 'template' and 's' or '')))) .. ':'))&lt;br /&gt;
							-- note: nsid == mw.title.new('NUL', 'Property').namespace is necessary since canonicalname for property namespace does not translate uniquely over different languages :(&lt;br /&gt;
						:done()&lt;br /&gt;
						:newline()&lt;br /&gt;
					:tag('td')&lt;br /&gt;
						:cssText('color:black; vertical-align: middle; text-align: center; width:' .. widthTd)&lt;br /&gt;
						:css('background', (coreData.autocreate[ns] and coreData.autocreate[ns] &amp;gt; os.time() - _CFG.template.autoCreationTimeDiff) and '#90ff90' or '#FF9090' )&lt;br /&gt;
						:wikitext(frame:callParserFunction{name = '#autoedit', args={form='Classgenerator', target=self:getUid(),&lt;br /&gt;
							'link text=' .. (coreData.autocreate[ns] and 'Requested on ' .. os.date('%d.%m.%Y %X', coreData.autocreate[ns]) or 'Create automatically!')  .. &lt;br /&gt;
								(#information &amp;gt; 0 and ('Call returned ' .. information) or ''),&lt;br /&gt;
							'reload', summary=&amp;quot;Requesting the autocreation of &amp;quot; .. coreData.className .. ' for pages of type ' .. ns,&lt;br /&gt;
							'query string=Classgenerator[global_autocreate_' .. ns .. ']=' .. os.time()}&lt;br /&gt;
							})&lt;br /&gt;
						:done()&lt;br /&gt;
						:newline()&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
&lt;br /&gt;
			end&lt;br /&gt;
			if Classgenerator.myTableTools.size(missing) &amp;gt; 0 then&lt;br /&gt;
				-- show the all button&lt;br /&gt;
				local querystring = ''&lt;br /&gt;
				for _, nsid in pairs(missing) do&lt;br /&gt;
					local ns = mw.ustring.lower(_namespaceName(self, nsid))&lt;br /&gt;
					querystring = querystring .. 'Classgenerator[global_autocreate_' .. ns .. ']=' .. os.time() .. '&amp;amp;'&lt;br /&gt;
				end&lt;br /&gt;
				querystring = mw.ustring.sub(querystring, 1, -2)&lt;br /&gt;
				actable:tag('tr')&lt;br /&gt;
					:tag('th')&lt;br /&gt;
						:css('text-align', 'left')&lt;br /&gt;
						:css('width', widthTh)&lt;br /&gt;
						:wikitext('Create all pages:')&lt;br /&gt;
						:done()&lt;br /&gt;
						:newline()&lt;br /&gt;
					:tag('td')&lt;br /&gt;
						:cssText('background: #FF9090; color:black; vertical-align: middle; text-align: center; width:' .. widthTd)&lt;br /&gt;
						:wikitext(frame:callParserFunction{name = '#autoedit', args={form='Classgenerator', target=self:getUid(),&lt;br /&gt;
							'link text=Create automatically!', 'reload', summary=&amp;quot;Requesting the autocreation of all missing pages&amp;quot;, 'query string=' .. querystring }&lt;br /&gt;
							})&lt;br /&gt;
						:done()&lt;br /&gt;
						:newline()&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
				pageAutoCreation:wikitext('&amp;lt;b&amp;gt;Note:&amp;lt;/b&amp;gt; Creation of module pages is impossible due to an incompatibility issue.')&lt;br /&gt;
					:newline()&lt;br /&gt;
					:node(actable)&lt;br /&gt;
					:newline()&lt;br /&gt;
			else&lt;br /&gt;
				pageAutoCreation:wikitext('All pages present!')&lt;br /&gt;
					:newline()&lt;br /&gt;
					:tag('p')&lt;br /&gt;
						:wikitext('&amp;lt;small&amp;gt;&amp;lt;b&amp;gt;Note:&amp;lt;/b&amp;gt; Creation of module pages is impossible due to an incompatibility issue.&amp;lt;/small&amp;gt;')&lt;br /&gt;
						:newline()&lt;br /&gt;
						:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			pageAutoCreation:wikitext('Page autocreation is only possible if activated in your [[Module:Classgenerator/config]]-file (see template-section) and '&lt;br /&gt;
					.. 'Extension AutoCreatePage being installed.')&lt;br /&gt;
				:newline()&lt;br /&gt;
		end&lt;br /&gt;
		if cargoTableCreateLink then&lt;br /&gt;
			pageAutoCreation:wikitext('&amp;lt;b&amp;gt;Cargo data store:&amp;lt;/b&amp;gt;To (re-)create your cargo table, follow &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[' .. coreData.page.template.recreatedata .. ' this link]&amp;lt;/span&amp;gt; and then press ok!')&lt;br /&gt;
				:newline()&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		-- build the content collapses&lt;br /&gt;
		local collapse = require('Module:Collapse').main&lt;br /&gt;
		local bg_sets = { exist = {'#cfc', '#9c9'}, nonexist = {'#fcc', '#c99'} }&lt;br /&gt;
		local bg = 1&lt;br /&gt;
		local pageContent = mw.html.create('')&lt;br /&gt;
		for _, pid in pairs(coreData.page.order) do&lt;br /&gt;
			local content&lt;br /&gt;
			local bgs = coreData.page[pid].exists and bg_sets.exist or bg_sets.nonexist&lt;br /&gt;
			if coreData.page[pid].namespace == 828 and not coreData.page[pid].isDocPage then&lt;br /&gt;
				content = frame:expandTemplate{ title = 'Code', args = {lang = 'lua', code = coreData.page[pid].content, line = '1'}}&lt;br /&gt;
			else&lt;br /&gt;
				content = '&amp;lt;pre style=&amp;quot;white-space:-moz-pre-wrap; white-space:-pre-wrap; white-space:-o-pre-wrap; white-space:pre-wrap; word-wrap:break-word;&amp;quot;&amp;gt;' .. &lt;br /&gt;
					mw.text.nowiki(frame:preprocess(coreData.page[pid].content)) .. '&amp;lt;/pre&amp;gt;'&lt;br /&gt;
			end&lt;br /&gt;
			pageContent:wikitext(collapse({ header = 'Contents of &amp;lt;b&amp;gt;[[:' .. coreData.page[pid].name .. ']]&amp;lt;/b&amp;gt; ' ..&lt;br /&gt;
							'&amp;lt;span class=&amp;quot;plainlinks&amp;quot; style=&amp;quot;font-size:75%;&amp;quot;&amp;gt;&amp;amp;#91;[' .. coreData.page[pid].editlink ..&lt;br /&gt;
							' EDIT]&amp;amp;#93;&amp;lt;/span&amp;gt;',&lt;br /&gt;
						content = content, left = true, bg = bgs[bg]&lt;br /&gt;
					}))&lt;br /&gt;
				:newline()&lt;br /&gt;
			bg = (bg == 2 and 1 or 2)&lt;br /&gt;
		end&lt;br /&gt;
		if thisUsesSmw then&lt;br /&gt;
			-- add here the collpases of the properties&lt;br /&gt;
			local message = mw.message.new('classengine-template-property-page')&lt;br /&gt;
			pageContent:tag('p')&lt;br /&gt;
				:wikitext('&amp;lt;h3&amp;gt;All property pages&amp;lt;/h3&amp;gt;')&lt;br /&gt;
				:done()&lt;br /&gt;
			for _, property in pairs(coreData.properties.order) do&lt;br /&gt;
				local bgs = coreData.page[pid].exists and bg_sets.exist or bg_sets.nonexist&lt;br /&gt;
				local content = '&amp;lt;pre style=&amp;quot;white-space:-moz-pre-wrap; white-space:-pre-wrap; white-space:-o-pre-wrap; white-space:pre-wrap; word-wrap:break-word;&amp;quot;&amp;gt;' .. &lt;br /&gt;
					mw.text.nowiki(frame:preprocess(coreData.properties.data[property].content)) .. '&amp;lt;/pre&amp;gt;'&lt;br /&gt;
				pageContent:wikitext(collapse({ header = 'Contents of &amp;lt;b&amp;gt;[[:Property:' .. property .. ']]&amp;lt;/b&amp;gt; ' ..&lt;br /&gt;
								'&amp;lt;span class=&amp;quot;plainlinks&amp;quot; style=&amp;quot;font-size:75%;&amp;quot;&amp;gt;&amp;amp;#91;[' .. coreData.properties.data[property].editlink ..&lt;br /&gt;
								' EDIT]&amp;amp;#93;&amp;lt;/span&amp;gt;',&lt;br /&gt;
							content = content, left = true, bg = bgs[bg]&lt;br /&gt;
						}))&lt;br /&gt;
					:newline()&lt;br /&gt;
				bg = (bg == 2 and 1 or 2)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		local updateWarning = mw.html.create('')&lt;br /&gt;
		if coreData.now_timestamp - coreData.edit_timestamp &amp;lt; 2*60*60 then&lt;br /&gt;
			local mbox = require('Module:Message box')&lt;br /&gt;
			updateWarning:wikitext(mbox.main('ombox', { type='content', text = 'Note: You updated the class ' .. coreData.edit_time_before .. ' ago. Did you write your [[#Page contents|config file]] new? ' ..&lt;br /&gt;
						'Changes won\'t take effect unless you do!' .. ((thisUsesCargo and cargoTableCreateLink) and '&amp;lt;p&amp;gt;&amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;Also: If you changed your cargo table\'s declaration, [' .. &lt;br /&gt;
						coreData.page.template.editlink .. ' edit your template] and [[#Page autocreation|rebuild your cargo table]]!&amp;lt;/span&amp;gt;' or '')}))&lt;br /&gt;
				:newline()&lt;br /&gt;
		end&lt;br /&gt;
		-- assemble everything&lt;br /&gt;
		local html = mw.html.create('')&lt;br /&gt;
		html:wikitext(coreData.global_description)&lt;br /&gt;
			:newline()&lt;br /&gt;
			:node(updateWarning)&lt;br /&gt;
			:node(manual)&lt;br /&gt;
			:newline()&lt;br /&gt;
			:node(datastore)&lt;br /&gt;
			:wikitext('&amp;lt;h2&amp;gt;Page status&amp;lt;/h2&amp;gt;')&lt;br /&gt;
			:newline()&lt;br /&gt;
			:wikitext(autoCreation and 'This status may be inaccurate, if you just created pages. In that case, run jobs and clear cache of this page.' or '')&lt;br /&gt;
			:node(statusTable)&lt;br /&gt;
			:newline()&lt;br /&gt;
			:node(pageAutoCreation)&lt;br /&gt;
			:wikitext('&amp;lt;h2&amp;gt;Page contents&amp;lt;/h2&amp;gt;')&lt;br /&gt;
			:newline()&lt;br /&gt;
			:node(pageContent)&lt;br /&gt;
			:newline()&lt;br /&gt;
			:done()&lt;br /&gt;
		local debugLevel = FoundationClass.globalConfig.debugLevel or _CFG.global.debugLevel&lt;br /&gt;
		if debugLevel then&lt;br /&gt;
			html:tag('pre')&lt;br /&gt;
--				:wikitext(FoundationClass.myTableTools.printTable(coreData))&lt;br /&gt;
--				:wikitext(FoundationClass.myTableTools.printTable(thisClass:smwProperty2ParameterTranslationTable()))&lt;br /&gt;
				:wikitext(ClassDebug:printLog(debugLevel))&lt;br /&gt;
				:done()&lt;br /&gt;
		end&lt;br /&gt;
		self:addOutput(html)&lt;br /&gt;
&lt;br /&gt;
		return true&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Classgenerator:myArgumentProcessing(coreData)&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator:myArgumentProcessing(args) to process coreData, from ' .. tostring(self))&lt;br /&gt;
	-- function that performs some individual transformation args --&amp;amp;amp;gt; coreData&lt;br /&gt;
	local _CFG = self.class.myConfiguration&lt;br /&gt;
	local coreData = coreData&lt;br /&gt;
	local lang = mw.language.new('en')&lt;br /&gt;
	coreData.className = lang:ucfirst(mw.text.trim(mw.ustring.gsub(self:getUid(), ':', '')))&lt;br /&gt;
	coreData.edit_timestamp = lang:formatDate('U', coreData.global_edit_timestamp)&lt;br /&gt;
	coreData.now_timestamp = lang:formatDate('U') + 60*60&lt;br /&gt;
	coreData.edit_time_before = lang:formatDuration(coreData.now_timestamp-coreData.edit_timestamp)&lt;br /&gt;
	coreData.last_edited = lang:formatDate('d.m.Y H:i:s', coreData.global_edit_timestamp)&lt;br /&gt;
	if coreData.global_gardeningCategory_chooser and mw.ustring.lower(coreData.global_gardeningCategory_chooser) == 'global' then&lt;br /&gt;
		coreData.global_gardeningCategory = 'superglobal.gardeningCategory'&lt;br /&gt;
	end&lt;br /&gt;
	if mw.ustring.find(coreData.className, ' ', 1, true) then&lt;br /&gt;
		local tmp = ''&lt;br /&gt;
		for fragment in mw.text.gsplit(coreData.className, ' ', true) do&lt;br /&gt;
			tmp = tmp .. lang:ucfirst(fragment)&lt;br /&gt;
		end&lt;br /&gt;
		coreData.className = tmp&lt;br /&gt;
	end&lt;br /&gt;
	if coreData.global_cargoTable then&lt;br /&gt;
		coreData.global_cargoTable = mw.ustring.gsub(mw.ustring.lower(coreData.global_cargoTable), ' ', '_')&lt;br /&gt;
	end&lt;br /&gt;
	if coreData.form_createInfotext and #coreData.form_createInfotext &amp;gt; 0 and mw.ustring.sub(coreData.form_createInfotext, -1) ~= ' ' then&lt;br /&gt;
		coreData.form_createInfotext = coreData.form_createInfotext .. ' '&lt;br /&gt;
	end&lt;br /&gt;
	local parameter_parameter&lt;br /&gt;
	local fieldOrder&lt;br /&gt;
	if coreData.parameter_parameter then&lt;br /&gt;
		parameters = ''&lt;br /&gt;
		fieldOrder = {}&lt;br /&gt;
		local classGenParamConfig = mw.loadData('Module:Classgenerator/parameter/config')&lt;br /&gt;
		for result in mw.text.gsplit(coreData.parameter_parameter, classGenParamConfig.template.delimiterResult, true) do&lt;br /&gt;
			local fieldname, parameter = mw.ustring.match(result, '^([^#]*)' .. classGenParamConfig.template.delimiterFormFieldName .. '(.+)$')&lt;br /&gt;
			if fieldname and mw.ustring.len(mw.text.trim(fieldname)) &amp;gt; 0 then&lt;br /&gt;
				table.insert(fieldOrder, mw.text.trim(fieldname))&lt;br /&gt;
			end&lt;br /&gt;
			if parameter and mw.ustring.len(parameter) &amp;gt; 0 then&lt;br /&gt;
				parameters = parameters .. parameter&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	coreData.parameter_parameter = parameters&lt;br /&gt;
	coreData.form_enable = FoundationClass.myYesno(coreData.form_enable)&lt;br /&gt;
	if coreData.form_enable then&lt;br /&gt;
		coreData.form_fieldOrder = fieldOrder&lt;br /&gt;
		form_buttons = { 'save' }&lt;br /&gt;
		if coreData.form_buttons and #coreData.form_buttons &amp;gt; 0 then&lt;br /&gt;
			for _, button in pairs(coreData.form_buttons) do&lt;br /&gt;
				table.insert(form_buttons, button)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		table.insert(form_buttons, 'cancel')&lt;br /&gt;
	end&lt;br /&gt;
	coreData.form_buttons = form_buttons&lt;br /&gt;
	-- here build the class config&lt;br /&gt;
	local contentClassConfig = mw.ustring.gsub(_CFG.template.configIntro, _CFG.template.placeHolderClassName, coreData.className) ..&lt;br /&gt;
		'local global = {\n' ..&lt;br /&gt;
		'\tdebugLevel = false,'&lt;br /&gt;
	if self.class.myConfiguration.template.addCommentsToConfig then&lt;br /&gt;
		contentClassConfig = contentClassConfig .. '\t-- set this to the level you wish to display at render. false if disabled. this is a class based setting. ' ..&lt;br /&gt;
			'you can set this globally at Foundationclass/globalconfig, causing all child classes to debug.'&lt;br /&gt;
	end&lt;br /&gt;
	contentClassConfig = contentClassConfig .. '\n'&lt;br /&gt;
	-- calculate the fieldlists:&lt;br /&gt;
	local fieldlists = {}&lt;br /&gt;
	for _, field in pairs(_CFG.form.fieldOrder) do&lt;br /&gt;
		local tab = mw.ustring.match(field, '^([a-z]+)_.+')&lt;br /&gt;
		if not fieldlists[tab] then&lt;br /&gt;
			fieldlists[tab] = {}&lt;br /&gt;
		end&lt;br /&gt;
		table.insert(fieldlists[tab], field)&lt;br /&gt;
	end&lt;br /&gt;
	local omissionList = {'global_autocreate_module', 'global_autocreate_template', 'global_autocreate_form', 'global_autocreate_category', 'global_autocreate_property', 'global_edit_timestamp', 'global_gardeningCategory_chooser',&lt;br /&gt;
		'form_textareaAttributes_cols', 'form_textareaAttributes_rows', 'form_textareaAttributes_autogrow', 'form_textareaAttributes_editor', 'form_createLinkInfo', &lt;br /&gt;
		'global_customization', 'form_customization', 'template_customization' }&lt;br /&gt;
	for _, attr in pairs(fieldlists.global) do&lt;br /&gt;
		if not Classgenerator.myTableTools.inTable(omissionList, attr) and self.class.myConfiguration.parameter[attr] then&lt;br /&gt;
			contentClassConfig = contentClassConfig .. _processAttribute(self, attr, '\t')&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if coreData.global_customization then&lt;br /&gt;
		for line in mw.text.gsplit(coreData.global_customization, '\n', true) do&lt;br /&gt;
			contentClassConfig = contentClassConfig .. '\t' .. line .. '\n'&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	contentClassConfig = contentClassConfig .. '}\n\nlocal form = {\n'&lt;br /&gt;
	for _, attr in pairs(fieldlists.form) do&lt;br /&gt;
		if not Classgenerator.myTableTools.inTable(omissionList, attr) and self.class.myConfiguration.parameter[attr] then&lt;br /&gt;
			contentClassConfig = contentClassConfig .. _processAttribute(self, attr, '\t')&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	contentClassConfig = contentClassConfig .. '\ttextareaAttributes = {	-- the defaults for your textarea fields\n'&lt;br /&gt;
	for _, attr in pairs({'form_textareaAttributes_cols', 'form_textareaAttributes_rows', 'form_textareaAttributes_autogrow', 'form_textareaAttributes_editor'}) do&lt;br /&gt;
		local name = mw.ustring.match(attr, '^form_textareaAttributes_(.+)$')&lt;br /&gt;
		contentClassConfig = contentClassConfig .. _processAttribute(self, attr, '\t\t', name)&lt;br /&gt;
	end&lt;br /&gt;
	contentClassConfig = contentClassConfig .. '\t},\n'&lt;br /&gt;
	contentClassConfig = contentClassConfig .. _processAttribute(self, 'form_fieldOrder', '\t')&lt;br /&gt;
	if coreData.form_customization then&lt;br /&gt;
		for line in mw.text.gsplit(coreData.form_customization, '\n', true) do&lt;br /&gt;
			contentClassConfig = contentClassConfig .. '\t' .. line .. '\n'&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	contentClassConfig = contentClassConfig .. '}\n\nlocal template = {\n'&lt;br /&gt;
	for _, attr in pairs(fieldlists.template) do&lt;br /&gt;
		if not Classgenerator.myTableTools.inTable(omissionList, attr) and self.class.myConfiguration.parameter[attr] then&lt;br /&gt;
			contentClassConfig = contentClassConfig .. _processAttribute(self, attr, '\t')&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if coreData.template_customization then&lt;br /&gt;
		for line in mw.text.gsplit(coreData.template_customization, '\n', true) do&lt;br /&gt;
			contentClassConfig = contentClassConfig .. '\t' .. mw.text.trim(line) .. '\n'&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	contentClassConfig = contentClassConfig .. '}\n\nlocal parameter = {\n' .. coreData.parameter_parameter .. '}\n\n' ..&lt;br /&gt;
		'return {\n' ..&lt;br /&gt;
		'\tform = form,\n' ..&lt;br /&gt;
		'\tglobal = global,\n' ..&lt;br /&gt;
		'\tparameter = parameter,\n' ..&lt;br /&gt;
		'\ttemplate = template,\n}\n'&lt;br /&gt;
	local classCategory = Classgenerator.globalConfig.classCategory or 'none'&lt;br /&gt;
	local formCategory = Classgenerator.globalConfig.formCategory or 'none'&lt;br /&gt;
	local gardeningCategory = Classgenerator.globalConfig.gardeningSuperCategory or 'none'&lt;br /&gt;
	local moduleCategory = Classgenerator.globalConfig.moduleCategory or 'none'&lt;br /&gt;
	local propertyCategory = Classgenerator.globalConfig.propertyCategory or 'none'&lt;br /&gt;
	local superCategory = Classgenerator.globalConfig.projectSuperCategory or 'none'&lt;br /&gt;
	local templateCategory = Classgenerator.globalConfig.templateCategory or 'none'&lt;br /&gt;
	local page = {}&lt;br /&gt;
	page.order = {'base', 'baseDoc', 'class', 'classDoc', 'config', 'configDoc', 'template', 'templateDoc'}&lt;br /&gt;
	page.base = {&lt;br /&gt;
		name = 'Module:' .. _private[self].pagename,&lt;br /&gt;
		content = mw.message.new('classengine-template-module-page'):rawParams(_private[self].pagename):plain()&lt;br /&gt;
	}&lt;br /&gt;
	page.baseDoc = {&lt;br /&gt;
		name = 'Module:' .. _private[self].pagename .. '/doc',&lt;br /&gt;
		content = mw.message.new('classengine-template-module-documentation-page'):rawParams(_private[self].pagename, moduleCategory):plain()&lt;br /&gt;
	}&lt;br /&gt;
	page.class = {&lt;br /&gt;
		name = 'Module:' .. _private[self].pagename .. '/class',&lt;br /&gt;
		content = mw.message.new('classengine-template-module-class-page'):rawParams(_private[self].pagename, coreData.className):plain()&lt;br /&gt;
	}&lt;br /&gt;
	page.classDoc = {&lt;br /&gt;
		name = 'Module:' .. _private[self].pagename .. '/class/doc',&lt;br /&gt;
		content = mw.message.new('classengine-template-module-class-documentation-page'):rawParams(_private[self].pagename, coreData.className, moduleCategory, classCategory):plain()&lt;br /&gt;
	}&lt;br /&gt;
	page.config = {&lt;br /&gt;
		name = 'Module:' .. _private[self].pagename .. '/config',&lt;br /&gt;
		content = contentClassConfig,&lt;br /&gt;
	}&lt;br /&gt;
	page.configDoc = {&lt;br /&gt;
		name = 'Module:' .. _private[self].pagename .. '/config/doc',&lt;br /&gt;
		content = mw.message.new('classengine-template-module-config-documentation-page'):rawParams(_private[self].pagename, moduleCategory, classCategory):plain()&lt;br /&gt;
	}&lt;br /&gt;
	page.template = {&lt;br /&gt;
		name = 'Template:' .. coreData.template_name,&lt;br /&gt;
		content = mw.message.new('classengine-template-template-page'):rawParams(_private[self].pagename):plain()&lt;br /&gt;
	}&lt;br /&gt;
	page.templateDoc = {&lt;br /&gt;
		name = 'Template:' .. coreData.template_name .. '/doc',&lt;br /&gt;
		content = mw.message.new('classengine-template-template-documentation-page'):rawParams(_private[self].pagename, templateCategory):plain()&lt;br /&gt;
	}&lt;br /&gt;
	if coreData.form_name and #coreData.form_name &amp;gt; 0 then&lt;br /&gt;
		table.insert(page.order, 'form')&lt;br /&gt;
		page.form = {&lt;br /&gt;
			name = 'Form:' .. coreData.form_name,&lt;br /&gt;
			content = mw.message.new('classengine-template-form-page'):rawParams(_private[self].pagename, formCategory):plain()&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
	if coreData.global_category and #coreData.global_category&amp;gt; 0 then&lt;br /&gt;
		table.insert(page.order, 'category')&lt;br /&gt;
		page.category = {&lt;br /&gt;
			name = 'Category:' .. coreData.global_category,&lt;br /&gt;
			content = mw.message.new('classengine-template-category-page'):rawParams(_private[self].pagename, superCategory):plain()&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
	if coreData.global_gardeningCategory and #coreData.global_gardeningCategory &amp;gt; 0 then&lt;br /&gt;
		table.insert(page.order, 'gardeningCategory')&lt;br /&gt;
		local pagename = coreData.global_gardeningCategory&lt;br /&gt;
		if pagename == 'superglobal.gardeningCategory' then&lt;br /&gt;
			pagename = FoundationClass.globalConfig.gardeningCategory&lt;br /&gt;
		end&lt;br /&gt;
		page.gardeningCategory = {&lt;br /&gt;
			name = 'Category:' .. pagename,&lt;br /&gt;
			content = mw.message.new('classengine-template-gardeningcategory-page'):rawParams(_private[self].pagename, gardeningCategory):plain()&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
	for _, pid in pairs(page.order) do&lt;br /&gt;
		local obj = mw.title.new(page[pid].name)&lt;br /&gt;
		page[pid].exists = obj.exists&lt;br /&gt;
		page[pid].namespace = obj.namespace&lt;br /&gt;
		page[pid].editlink = obj:fullUrl{action='edit'}&lt;br /&gt;
		if pid == 'template' then&lt;br /&gt;
			page[pid].recreatedata = obj:fullUrl{action='recreatedata'}&lt;br /&gt;
		end&lt;br /&gt;
		page[pid].isDocPage = (mw.ustring.sub(page[pid].name, -4) == '/doc')&lt;br /&gt;
		if page[pid].isDocPage then&lt;br /&gt;
			page[pid].content = page[pid].content .. '&amp;lt;h2&amp;gt;Maintenanace notes&amp;lt;/h2&amp;gt;\n' ..&lt;br /&gt;
				'This page was created by [[Module:Classgenerator]] and belongs to [[' .. self:getUid() .. ']].\n'&lt;br /&gt;
			if pid == 'configDoc' then&lt;br /&gt;
				page[pid].content = page[pid].content .. '\n{{((}}ombox| type=content | text = It is strongly advised, to not edit this page but to use [' ..&lt;br /&gt;
				'https://{{((}}SERVERNAME{{))}}{{((}}SCRIPTPATH{{))}}/Special:FormEdit/Classgenerator/' .. mw.uri.encode(self:getUid(), &amp;quot;PATH&amp;quot;) .. ' ' .. &lt;br /&gt;
					'the Classgenerator form] instead! After that, use your new configuration to replace the contents of this page.{{))}}'&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	local thisClass&lt;br /&gt;
	local thisConfig&lt;br /&gt;
	if page.class.exists and page.config.exists then&lt;br /&gt;
		thisClass = require(page.class.name)&lt;br /&gt;
		thisConfig = require(page.config.name)&lt;br /&gt;
	end&lt;br /&gt;
	if page.form and (not coreData.form_typeCreateLink or coreData.form_typeCreateLink ~= 'forminput') and coreData.form_createLinkPageName and mw.ustring.len(coreData.form_createLinkPageName) &amp;gt; 0 then&lt;br /&gt;
		local pageName = coreData.form_createLinkPageName&lt;br /&gt;
		if coreData.global_namespace and mw.ustring.len(coreData.global_namespace) &amp;gt; 0 and not mw.ustring.match(pageName, '^' .. coreData.global_namespace .. ':.+$') then&lt;br /&gt;
			pageName = coreData.global_namespace .. ':' .. pageName&lt;br /&gt;
		end&lt;br /&gt;
		local infostr = '{{((}}{info|page name=' .. pageName .. '|add title=' .. (coreData.form_labelCreate or 'create entity') .. '|edit title=' .. (coreData.form_labelEdit or 'edit entity') .. '}{{))}}'&lt;br /&gt;
		page.form.content = page.form.content .. '&amp;lt;!{{#invoke:String|rep|-|2}} this is a workaround, needed because of a SF bug: ' .. infostr ..&lt;br /&gt;
			'. see https://phabricator.wikimedia.org/T123230 for more information {{#invoke:String|rep|-|2}}&amp;gt;'&lt;br /&gt;
	end&lt;br /&gt;
	coreData.page = page&lt;br /&gt;
	local autocreate = {}&lt;br /&gt;
	autocreate.module = FoundationClass.myYesno(coreData.global_autocreate_module, tonumber(coreData.global_autocreate_module))&lt;br /&gt;
	autocreate.template = FoundationClass.myYesno(coreData.global_autocreate_template, tonumber(coreData.global_autocreate_template))&lt;br /&gt;
	autocreate.form = coreData.form_name and FoundationClass.myYesno(coreData.global_autocreate_form, tonumber(coreData.global_autocreate_form))&lt;br /&gt;
	autocreate.category = (coreData.global_category or coreData.global_gardeningCategory) and FoundationClass.myYesno(coreData.global_autocreate_category, tonumber(coreData.global_autocreate_category))&lt;br /&gt;
	if (FoundationClass.globalConfig.dataStore == 'both' or FoundationClass.globalConfig.dataStore == 'smw') and FoundationClass.myYesno(coreData.global_smwUseStorage) then&lt;br /&gt;
		local propertyNSName = _namespaceName(self, mw.title.new('NUL', 'Property').namespace)&lt;br /&gt;
		autocreate[propertyNSName] = FoundationClass.myYesno(coreData['global_autocreate_' .. propertyNSName], tonumber(coreData['global_autocreate_' .. propertyNSName]))&lt;br /&gt;
	end&lt;br /&gt;
	coreData.autocreate = autocreate&lt;br /&gt;
	local propertyData&lt;br /&gt;
	local propertyOrder&lt;br /&gt;
	if (FoundationClass.globalConfig.dataStore == 'both' or FoundationClass.globalConfig.dataStore == 'smw') and FoundationClass.myYesno(coreData.global_smwUseStorage) and thisClass and thisConfig then&lt;br /&gt;
		-- we use smw and class and config are created and accessible. we can get property information and prepare data&lt;br /&gt;
		local matrix = thisClass:smwGetProperty2ParameterTranslationTable()&lt;br /&gt;
		propertyData = {}&lt;br /&gt;
		propertyOrder = {}&lt;br /&gt;
		for property, parameter in pairs(matrix) do&lt;br /&gt;
			table.insert(propertyOrder, property)&lt;br /&gt;
			local obj = mw.title.new(property, 'Property')&lt;br /&gt;
			propertyData[property] = { &lt;br /&gt;
				editlink = obj:fullUrl{action='edit'},&lt;br /&gt;
				exists = obj.exists,&lt;br /&gt;
				parameter = parameter,&lt;br /&gt;
			}&lt;br /&gt;
			if thisConfig.parameter[parameter] then&lt;br /&gt;
				propertyData[property].description = thisConfig.parameter[parameter].description&lt;br /&gt;
				propertyData[property].type = thisConfig.parameter[parameter].property_type&lt;br /&gt;
				propertyData[property].values = thisConfig.parameter[parameter].values&lt;br /&gt;
			elseif parameter == FoundationClass.globalConfig.smwClassProperty then&lt;br /&gt;
				propertyData[property].description = 'Automatisch hinzugefügt! Wird verwendet, um Mitglieder dieser Klasse zu finden (funktioniert auch, ohne dass eine Kategorie definiert wird und auch fur subobjects)'&lt;br /&gt;
				propertyData[property].type = 'Text'&lt;br /&gt;
			elseif parameter == FoundationClass.globalConfig.uidFieldName then&lt;br /&gt;
				propertyData[property].description = 'Automatisch hinzugefügt! Wird verwendet, um individuelle Objekte innerhalb der Klasse zu identifizieren.'&lt;br /&gt;
				propertyData[property].type = 'Text'&lt;br /&gt;
			end&lt;br /&gt;
			local values = ''&lt;br /&gt;
			if propertyData[property].values then&lt;br /&gt;
				values = values .. 'The allowed values are:'&lt;br /&gt;
				for _, value in pairs(propertyData[property].values) do&lt;br /&gt;
					values = values .. '\n* [[Allows value::' .. value .. ']]'&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				values = 'No restriction given'&lt;br /&gt;
			end&lt;br /&gt;
			propertyData[property].content = mw.message.new('classengine-template-property-page'):rawParams(propertyData[property].description, propertyData[property].type, values, propertyCategory):plain()&lt;br /&gt;
		end&lt;br /&gt;
		table.sort(propertyOrder)&lt;br /&gt;
		error('here')&lt;br /&gt;
	end&lt;br /&gt;
	coreData.properties = { data = propertyData, order = propertyOrder }&lt;br /&gt;
	return coreData	-- this is your new coreData.&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Classgenerator:myPlausibilityTest(args)&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator:myPlausibilityTest(args) to test arguments, from ' .. tostring(self))&lt;br /&gt;
	-- function that performs the individual plausibility tests&lt;br /&gt;
	-- note: before you access a field args.fieldname you should check for existance&lt;br /&gt;
	-- self:addError(text)&lt;br /&gt;
	return false	-- return value will be ignored. but if you add any error, the object's initialization will fail with the error&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Classgenerator:myStashAdjustments(stash)&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator:myStashAdjustments(stash) to do some minor adjustments on data before storing, from ' .. tostring(self))&lt;br /&gt;
	-- function that alters the stash before storing the data&lt;br /&gt;
	local stash = stash&lt;br /&gt;
	return stash	-- this is your new stash. this will be stored. it has format (fieldname: value)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Classgenerator:method()&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator:method() to do something, from ' .. tostring(self))&lt;br /&gt;
	return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return Classgenerator&lt;/div&gt;</summary>
		<author><name>Anatol</name></author>
	</entry>
	<entry>
		<id>https://camnet.oetterer.eu/index.php?title=Modul:Classgenerator/class&amp;diff=1005</id>
		<title>Modul:Classgenerator/class</title>
		<link rel="alternate" type="text/html" href="https://camnet.oetterer.eu/index.php?title=Modul:Classgenerator/class&amp;diff=1005"/>
		<updated>2016-02-09T20:47:35Z</updated>

		<summary type="html">&lt;p&gt;Anatol: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local FoundationClass = require('Module:Foundationclass')&lt;br /&gt;
local ClassDebug = require('Module:Debug/class')&lt;br /&gt;
&lt;br /&gt;
-- ****************************************************************&lt;br /&gt;
-- *                         inheritance                          *&lt;br /&gt;
-- ****************************************************************&lt;br /&gt;
local Classgenerator = FoundationClass:subclass('Classgenerator')&lt;br /&gt;
-- setting class's configuration data&lt;br /&gt;
Classgenerator.static.myConfiguration = mw.loadData('Module:Classgenerator/config')&lt;br /&gt;
--   being in a static method, use self.myConfiguration&lt;br /&gt;
--   being in a private method, that knows self or in a public method, use self.class.myConfiguration&lt;br /&gt;
&lt;br /&gt;
-- ****************************************************************&lt;br /&gt;
-- *                          properties                          *&lt;br /&gt;
-- ****************************************************************&lt;br /&gt;
&lt;br /&gt;
-- **************** initialization of table for private properties&lt;br /&gt;
local _private = setmetatable({}, {__mode = 'k'})   -- weak table storing all private attributes&lt;br /&gt;
&lt;br /&gt;
-- **************** declaration of public static properties&lt;br /&gt;
-- Classgenerator.static.myPropertyModule = require('Module:extern')&lt;br /&gt;
-- Classgenerator.static.staticProperty = 'value'&lt;br /&gt;
&lt;br /&gt;
-- remember the static classes provided by Foundationclass:&lt;br /&gt;
-- Classgenerator.globalConfig&lt;br /&gt;
-- Classgenerator.myCargoUtil&lt;br /&gt;
-- Classgenerator.myTableTools&lt;br /&gt;
&lt;br /&gt;
-- **************** declaration of (global) private properties&lt;br /&gt;
-- for properties you should rather use constructor and _private[self]. this only, if you need a private class property&lt;br /&gt;
-- you should, however predeclare private methods here&lt;br /&gt;
local _debug	-- private method declared later&lt;br /&gt;
local _privateMethodAhead	-- declaration ahead, so this private method can be used in the constructor and in other private methods&lt;br /&gt;
&lt;br /&gt;
-- ***************************************************************&lt;br /&gt;
-- *                           methods                           *&lt;br /&gt;
-- ***************************************************************&lt;br /&gt;
 &lt;br /&gt;
-- **************** declaration of static methods&lt;br /&gt;
function Classgenerator:initialize(uid)&lt;br /&gt;
	local _CFG = self.class.myConfiguration&lt;br /&gt;
	FoundationClass.initialize(self, uid)&lt;br /&gt;
	local page = mw.title.getCurrentTitle().text&lt;br /&gt;
	if uid and mw.ustring.match(uid, '^' .. _CFG.global.namespace .. ':.+$') then&lt;br /&gt;
		page = mw.ustring.match(uid, '^' .. _CFG.global.namespace .. ':(.+)$')&lt;br /&gt;
	end&lt;br /&gt;
	_private[self] = {&lt;br /&gt;
		dbg = ClassDebug:new(tostring(self.class) .. ': id ' .. uid),&lt;br /&gt;
		pagename = page&lt;br /&gt;
	}&lt;br /&gt;
	_debug(self, 1, ' Classgenerator: done initializing object &amp;amp;quot;' .. uid ..'&amp;amp;quot;, from ' .. tostring(self))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- use use self.myConfiguration to access your configuration in a static method&lt;br /&gt;
function Classgenerator.static:aStaticMethod(var)&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator.static:aStaticMethod() to do something, from ' .. tostring(self))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Classgenerator.static:mySfDynamicFieldAttribute(fieldname, attribute, value)&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator.static:mySfDynamicFieldAttribute(fieldname, attribute, value), from ' .. tostring(self))&lt;br /&gt;
	_debug(self, 2, ' with parameters &amp;amp;quot;' .. fieldname .. '&amp;amp;quot;, &amp;amp;quot;' .. attribute .. '&amp;amp;quot; and a ' .. type(value) .. ' value')&lt;br /&gt;
	-- function that can process any attribute/value pair just before rendering the semantic forms field&lt;br /&gt;
	-- usually done, to generate a dynamic 'default' value&lt;br /&gt;
	-- keep in mind: you can completely disable a form field, if you return true on attribute &amp;quot;disable&amp;quot;. note however, that this causes the field to not show at all, no data will be transported/saved&lt;br /&gt;
	local pagename = mw.title.getCurrentTitle().rootText&lt;br /&gt;
	local val = value&lt;br /&gt;
	if Classgenerator.myTableTools.inTable({'template_name', 'global_entityTitle'}, fieldname) and attribute == 'default' then&lt;br /&gt;
		val = pagename&lt;br /&gt;
	end&lt;br /&gt;
	if fieldname == 'global_cargoTable' and attribute == 'default' then&lt;br /&gt;
		val = mw.ustring.lower(pagename)&lt;br /&gt;
	end&lt;br /&gt;
	if Classgenerator.globalConfig.dataStore ~= 'cargo' and Classgenerator.globalConfig.dataStore ~= 'both' then&lt;br /&gt;
		if fieldname == 'global_cargoTable' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
		if fieldname == 'global_cargoUidFieldname' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if Classgenerator.globalConfig.dataStore ~= 'smw' and Classgenerator.globalConfig.dataStore ~= 'both' then&lt;br /&gt;
		if fieldname == 'global_smwIsSubobject' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
		if fieldname == 'global_smwUseStorage' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
		if fieldname == 'global_autocreate_property' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return val	-- this value will be used as new value for field's attribute&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Classgenerator.static:sfGenerateForm()&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator.static:sfGenerateForm(), from ' .. tostring(self))&lt;br /&gt;
	local _CFG = self.myConfiguration&lt;br /&gt;
	local ClassgeneratorParameter  = require('Module:Classgenerator/parameter/class')&lt;br /&gt;
	local ClassSFfield = require('Module:SFfield/class')&lt;br /&gt;
	local tagStart = '{{{'&lt;br /&gt;
	local tagEnd = '}}}'&lt;br /&gt;
	local frame = mw.getCurrentFrame()&lt;br /&gt;
	-- create the form header&lt;br /&gt;
	local notification = mw.html.create('')&lt;br /&gt;
	if _CFG.form.notification and mw.ustring.len(_CFG.form.notification) &amp;gt; 0 then&lt;br /&gt;
		local mbox = require('Module:Message box')&lt;br /&gt;
		notification:wikitext(mbox.main('ombox', { text = _CFG.form.notification }))&lt;br /&gt;
			:newline()&lt;br /&gt;
	end&lt;br /&gt;
	local formheader = mw.html.create('')&lt;br /&gt;
	formheader:wikitext(self:sfGenerateFormInfoTag())&lt;br /&gt;
		:wikitext('&amp;lt;h2&amp;gt;' .. _CFG.global.entityTitle .. '&amp;lt;/h2&amp;gt;')&lt;br /&gt;
		:tag('p')&lt;br /&gt;
			:wikitext(_CFG.form.headerText)&lt;br /&gt;
			:done()&lt;br /&gt;
			:newline()&lt;br /&gt;
		:node(notification)&lt;br /&gt;
		:tag('div')&lt;br /&gt;
			:attr('id', 'wikiPreview')&lt;br /&gt;
			:cssText('display: none; padding-bottom: 25px; margin-bottom: 25px; border-bottom: 1px solid #AAAAAA;')&lt;br /&gt;
			:done()&lt;br /&gt;
			:newline()&lt;br /&gt;
	-- create the form buttons&lt;br /&gt;
	local formbuttons = mw.html.create('div')&lt;br /&gt;
	for _, button in pairs(_CFG.form.buttons) do&lt;br /&gt;
		formbuttons:wikitext(tagStart .. 'standard input&amp;amp;#124;' .. button .. tagEnd)&lt;br /&gt;
	end&lt;br /&gt;
	formbuttons:addClass('formbuttons')&lt;br /&gt;
		:done()&lt;br /&gt;
	-- calculate the fieldlists:&lt;br /&gt;
	local fieldlists = {}&lt;br /&gt;
	for _, field in pairs(_CFG.form.fieldOrder) do&lt;br /&gt;
		local tab = mw.ustring.match(field, '^([a-z]+)_.+')&lt;br /&gt;
		if not fieldlists[tab] then&lt;br /&gt;
			fieldlists[tab] = {}&lt;br /&gt;
		end&lt;br /&gt;
		table.insert(fieldlists[tab], field)&lt;br /&gt;
	end&lt;br /&gt;
	-- assemble everything, so start the html object&lt;br /&gt;
	local html = mw.html.create('div')&lt;br /&gt;
	html:node(formheader)&lt;br /&gt;
		:wikitext('&amp;lt;h1&amp;gt;GLOBAL-Section&amp;lt;/h1&amp;gt;')&lt;br /&gt;
		:newline()&lt;br /&gt;
		:tag('div')&lt;br /&gt;
			:wikitext('This section deals with all the class\'s global data, i.e. all data you need for your &amp;quot;template&amp;quot; part as wenn as for your form, ... ')&lt;br /&gt;
			:done()&lt;br /&gt;
			:newline()&lt;br /&gt;
		:wikitext(tagStart .. 'for template|' .. _CFG.template.name .. '|label=' .. _CFG.global.entityTitle .. tagEnd)&lt;br /&gt;
		:newline()&lt;br /&gt;
		:node(self:sfGenerateFormTable(fieldlists.global))&lt;br /&gt;
		:newline()&lt;br /&gt;
		:wikitext('&amp;lt;h1&amp;gt;FORM-Section&amp;lt;/h1&amp;gt;')&lt;br /&gt;
		:newline()&lt;br /&gt;
		:tag('div')&lt;br /&gt;
			:wikitext('This section deals with all the data, you need to create and operate a form for this class. If you don\'t want a form, disable this section. ' ..&lt;br /&gt;
					'If you need a form (e.g. as part of another form), but no form page, enable this section but leave the field for form page name emtpy.')&lt;br /&gt;
			:done()&lt;br /&gt;
			:newline()&lt;br /&gt;
		:node(self:sfGenerateFormTable(fieldlists.form))&lt;br /&gt;
		:newline()&lt;br /&gt;
		:wikitext('&amp;lt;h1&amp;gt;TEMPLATE-Section&amp;lt;/h1&amp;gt;')&lt;br /&gt;
		:newline()&lt;br /&gt;
		:tag('div')&lt;br /&gt;
			:wikitext('This section deals with all the data, you need to create and operate a template for this class. If you need tempalte specific parameters ' ..&lt;br /&gt;
				'(meaning parameteres that you only need to operate the &amp;quot;action&amp;quot;-part), put them into this section\'s custom field')&lt;br /&gt;
			:done()&lt;br /&gt;
			:newline()&lt;br /&gt;
		:node(self:sfGenerateFormTable(fieldlists.template))&lt;br /&gt;
		:newline()&lt;br /&gt;
		:wikitext('&amp;lt;h1&amp;gt;PARAMETERS-Section&amp;lt;/h1&amp;gt;')&lt;br /&gt;
		:newline()&lt;br /&gt;
		:tag('div')&lt;br /&gt;
			:wikitext('This section deals with all your parameters. You need an entry for every form input field, every template parameter, every data field you want to store, and even every notification line.')&lt;br /&gt;
			:tag('ul')&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(&amp;quot;To produce a normal parameter, add an entry, choose storage type, set '''Regular form parameter''' to yes, choose a form input type, and a template doc type.&amp;quot;)&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(&amp;quot;If you want a data field to be stored in your data storage but not defined in the form, choose a data storage type and set '''Regular form parameter''' to no. &amp;quot;)&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(&amp;quot;If you want a mutiple template to be parsed to a parameter, create a normal parameter (as described above) and choose '''Regular form parameter''' to  be ''Holds template''.&amp;quot;)&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(&amp;quot;A parameter with a form input that is not stored is created like a regular parameter but without setting any data storage type.&amp;quot;)&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(&amp;quot;Finally, you can create a message line. This is useful, if you want to convey any information to the user, that is to important for a description-tooltip. &amp;quot; ..&lt;br /&gt;
						&amp;quot;What you need to do is disable everything ('''Template doc parameter type ''', data storage) and set '''Regular form parameter''' to ''Information''. &amp;quot; ..&lt;br /&gt;
						&amp;quot;You probalby want to add the parameter to one or more ''show on select'' entries, too.&amp;quot;)&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
				:done()&lt;br /&gt;
				:newline()&lt;br /&gt;
			:done()&lt;br /&gt;
			:newline()&lt;br /&gt;
		:node(self:sfInitField('parameter_parameter'):render())&lt;br /&gt;
		:newline()&lt;br /&gt;
		:wikitext(frame:extensionTag('headertabs'))&lt;br /&gt;
		:newline()&lt;br /&gt;
		:wikitext(&amp;quot;'''(*) Pflichtfeld'''&amp;quot;)&lt;br /&gt;
		:newline()&lt;br /&gt;
		:wikitext(tagStart .. 'end template' .. tagEnd)&lt;br /&gt;
		:newline()&lt;br /&gt;
		:wikitext(ClassgeneratorParameter:sfGenerateForm())&lt;br /&gt;
		:newline()&lt;br /&gt;
		:node(formbuttons)&lt;br /&gt;
	local debugLevel = FoundationClass.globalConfig.debugLevel or self.myConfiguration.global.debugLevel&lt;br /&gt;
	if debugLevel then&lt;br /&gt;
		html:newline()&lt;br /&gt;
			:newline()&lt;br /&gt;
			:wikitext(ClassDebug:printLog(debugLevel))&lt;br /&gt;
	end&lt;br /&gt;
	return html&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- **************** declaration of private methods&lt;br /&gt;
-- use self.class.myConfiguration to access your configuration in a public or a private method that is called by a public method&lt;br /&gt;
_debug = function (self, level, text)&lt;br /&gt;
	if _private[self] and _private[self].dbg then&lt;br /&gt;
		local debugLevel = FoundationClass.globalConfig.debugLevel or self.class.myConfiguration.global.debugLevel&lt;br /&gt;
		if debugLevel and level &amp;lt;= debugLevel then&lt;br /&gt;
			_private[self].dbg:log(level, text)&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		local debugLevel = FoundationClass.globalConfig.debugLevel or self.myConfiguration.global.debugLevel&lt;br /&gt;
		if debugLevel and level &amp;lt;= debugLevel then&lt;br /&gt;
			ClassDebug:log(level, text, tostring(self) .. '.static')&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local _namespaceName = function (self, namespaceId)&lt;br /&gt;
	_debug(self, 1, 'entering private _namespaceName() to translate namespace namespaceId ' .. namespaceId .. ' into a universal name, from ' .. tostring(self))&lt;br /&gt;
	local ret, nulProperty = pcall(mw.title.new, 'NUL', 'Property')&lt;br /&gt;
	if ret and (namespaceId == nulProperty.namespace) then&lt;br /&gt;
		return 'property'	-- if you change this, check on other places, this is checked against and change that, too&lt;br /&gt;
	else&lt;br /&gt;
		return mw.site.namespaces[namespaceId].canonicalName&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local _processAttribute = function (self, attr, indent, name)&lt;br /&gt;
	_debug(self, 1, 'entering private _processAttribute() to print a line for attribute ' .. attr .. ', from ' .. tostring(self))&lt;br /&gt;
	local coreData = self:getCoreData()&lt;br /&gt;
	local attr = attr&lt;br /&gt;
	local val = coreData[attr]&lt;br /&gt;
	if type(val) == 'boolean' then&lt;br /&gt;
		val = val and 'true' or 'false'&lt;br /&gt;
	end&lt;br /&gt;
	local ret = ''&lt;br /&gt;
	local fieldname = mw.ustring.match(attr, '^[^_]+_(.+)$')&lt;br /&gt;
	ret = indent .. (name and name or fieldname) .. ' = '&lt;br /&gt;
	if not val then&lt;br /&gt;
		ret = ret .. 'nil'&lt;br /&gt;
	elseif type(val) == 'table' then&lt;br /&gt;
		ret = ret .. Classgenerator.myTableTools.printTable(val, 'inline')&lt;br /&gt;
	elseif val == 'true' or val == 'false' or mw.ustring.match(val, '^[0-9]+$') or (attr == 'global_gardeningCategory' and val == 'superglobal.gardeningCategory') then&lt;br /&gt;
		ret = ret .. val&lt;br /&gt;
	else&lt;br /&gt;
		ret = ret .. &amp;quot;'&amp;quot; .. mw.ustring.gsub(mw.ustring.gsub(mw.ustring.gsub(val, &amp;quot;\\'&amp;quot;, &amp;quot;'&amp;quot;), &amp;quot;'&amp;quot;, &amp;quot;\\'&amp;quot;), '\n', '\\n\' ..\n' .. indent .. '\t\'') .. &amp;quot;'&amp;quot;	-- the gsub catches multiline input from textareas&lt;br /&gt;
	end&lt;br /&gt;
	ret = ret .. ','&lt;br /&gt;
	if self.class.myConfiguration.template.addCommentsToConfig then&lt;br /&gt;
		ret = ret .. '\t-- ' .. self.class.myConfiguration.parameter[attr].description&lt;br /&gt;
	end&lt;br /&gt;
	ret = ret .. '\n'&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local _privateMethod = function (self)&lt;br /&gt;
	_debug(self, 1, 'entering private _privateMethod() to do something, from ' .. tostring(self))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- **************** declaration of public methods&lt;br /&gt;
-- use self.class.myConfiguration to access your configuration in a public method&lt;br /&gt;
function Classgenerator:addInfobox()&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator:addInfobox(), from ' .. tostring(self))&lt;br /&gt;
	if self:goodToGo() then&lt;br /&gt;
		local _CFG = self.class.myConfiguration&lt;br /&gt;
		local coreData = self:getCoreData()&lt;br /&gt;
		local usesSmw = FoundationClass.globalConfig.dataStore and (FoundationClass.globalConfig.dataStore == 'both' or FoundationClass.globalConfig.dataStore == 'smw') and FoundationClass.myYesno(coreData.global_smwUseStorage)&lt;br /&gt;
		local ib_args = {&lt;br /&gt;
			bodyclass = 'infobox_name',&lt;br /&gt;
			aboveclass = 'objtitle titletext',&lt;br /&gt;
			headerclass = 'headertext',&lt;br /&gt;
			labelstyle = 'width: 30%;',&lt;br /&gt;
			datastyle = 'width: 70%;',&lt;br /&gt;
			title = coreData.className,&lt;br /&gt;
			subheader = 'Class',&lt;br /&gt;
			label1 = 'Title',&lt;br /&gt;
			data1 = coreData.global_entityTitle and coreData.global_entityTitle or '',&lt;br /&gt;
			label2 = _CFG.parameter.global_edit_timestamp.label,&lt;br /&gt;
			data2 = coreData.last_edited,&lt;br /&gt;
			label3 = 'Store available',&lt;br /&gt;
			data3 = (FoundationClass.globalConfig.dataStore and mw.ustring.len(FoundationClass.globalConfig.dataStore) &amp;gt; 0) and FoundationClass.globalConfig.dataStore or '',&lt;br /&gt;
			label5 = 'Cargo table',&lt;br /&gt;
			data5 = (FoundationClass.globalConfig.dataStore and (FoundationClass.globalConfig.dataStore == 'both' or FoundationClass.globalConfig.dataStore == 'cargo')) and coreData.global_cargoTable or '',&lt;br /&gt;
			label6 = 'Smw class',&lt;br /&gt;
			data6 = usesSmw and _private[self].pagename or '',&lt;br /&gt;
			data7 = coreData.global_description,&lt;br /&gt;
			header10 = 'Pages',&lt;br /&gt;
			label12 = 'Module',&lt;br /&gt;
			data12 = _private[self].pagename and '[[Module:' .. _private[self].pagename .. ']]' or '',&lt;br /&gt;
			label13 = 'Class',&lt;br /&gt;
			data13 = _private[self].pagename and '[[Module:' .. _private[self].pagename .. '/class]]' or '',&lt;br /&gt;
			label14 = 'Config',&lt;br /&gt;
			data14 = _private[self].pagename and '[[Module:' .. _private[self].pagename .. '/config]]' or '',&lt;br /&gt;
			label17 = 'Template',&lt;br /&gt;
			data17 = coreData.template_name and '[[Template:' .. coreData.template_name .. ']]' or '',&lt;br /&gt;
			label19 = 'Form',&lt;br /&gt;
			data19 = coreData.page.form and '[[:' .. coreData.page.form.name .. ']]' or '',&lt;br /&gt;
			label21 = 'Category',&lt;br /&gt;
			data21 = coreData.page.category and '[[:' .. coreData.page.category.name .. ']]' or '',&lt;br /&gt;
			label22 = 'Gardening',&lt;br /&gt;
			data22 = coreData.page.gardeningCategory and '[[:' .. coreData.page.gardeningCategory.name .. ']]' or '',&lt;br /&gt;
		}&lt;br /&gt;
		if usesSmw and coreData.properties.order and #coreData.properties.order &amp;gt; 0 then&lt;br /&gt;
			ib_args.header30 = 'Properties'&lt;br /&gt;
			local i = 31&lt;br /&gt;
			for _, property in pairs(coreData.properties.order) do&lt;br /&gt;
				ib_args['label' .. i] = coreData.properties.data[property].type&lt;br /&gt;
				ib_args['data' .. i] = '[[Property:' .. property .. '|' .. property .. ']]'&lt;br /&gt;
				i = i + 1&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		self:addOutput(require('Module:Infobox').infobox(ib_args))&lt;br /&gt;
		return true&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Classgenerator:addPageBody()&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator:addPageBody(), from ' .. tostring(self))&lt;br /&gt;
	_debug(self, 2, ' rendering errors and warnings and adding them to output')&lt;br /&gt;
	self:addOutput(self:renderErrors())&lt;br /&gt;
	self:addOutput(self:renderWarnings())&lt;br /&gt;
	if self:goodToGo() then&lt;br /&gt;
		local frame = mw.getCurrentFrame()&lt;br /&gt;
		local lang = mw.language.new('en-gb')&lt;br /&gt;
		local _CFG = self.class.myConfiguration&lt;br /&gt;
		local coreData = self:getCoreData()&lt;br /&gt;
		-- start&lt;br /&gt;
		local widthTh = '300px'&lt;br /&gt;
		local widthTd = '200px'&lt;br /&gt;
		-- build the page status table&lt;br /&gt;
		-- first the two status table cells &amp;quot;green&amp;quot; and &amp;quot;red&amp;quot;&lt;br /&gt;
		local imgYes = '[[File:Yes check.png|13px|alt=Yes|link=]]'&lt;br /&gt;
		local imgNo = '[[File:X mark.png|13px|alt=No|link=]]'&lt;br /&gt;
		local tdYa = mw.html.create('td')&lt;br /&gt;
		tdYa:cssText('background: #90ff90; color:black; vertical-align: middle; text-align: center; width:' .. widthTd)&lt;br /&gt;
			:addClass('table-yes')&lt;br /&gt;
			:wikitext(imgYes)&lt;br /&gt;
		local tdNa = mw.html.create('td')&lt;br /&gt;
		tdNa:cssText('background: #FF9090; color:black; vertical-align: middle; text-align: center; width:' .. widthTd)&lt;br /&gt;
			:addClass('table-no')&lt;br /&gt;
			:wikitext(imgNo)&lt;br /&gt;
		local classExists = coreData.page.class.exists and coreData.page.config.exists&lt;br /&gt;
		local modulesExist = coreData.page.base.exists and classExists&lt;br /&gt;
		local thisClass&lt;br /&gt;
		local thisConfig&lt;br /&gt;
		if classExists then&lt;br /&gt;
			thisClass = require(coreData.page.class.name)&lt;br /&gt;
			thisConfig = require(coreData.page.config.name)&lt;br /&gt;
		end&lt;br /&gt;
		local thisUsesCargo = (FoundationClass.globalConfig.dataStore == 'both' or FoundationClass.globalConfig.dataStore == 'cargo') and coreData.global_cargoTable and #coreData.global_cargoTable &amp;gt; 0&lt;br /&gt;
		local thisUsesSmw = (FoundationClass.globalConfig.dataStore == 'both' or FoundationClass.globalConfig.dataStore == 'smw') and FoundationClass.myYesno(coreData.global_smwUseStorage)&lt;br /&gt;
		-- write the 2do checklist&lt;br /&gt;
		local done = true&lt;br /&gt;
		local step1&lt;br /&gt;
		local step2&lt;br /&gt;
		local step3&lt;br /&gt;
		if modulesExist then&lt;br /&gt;
			step1 = imgYes .. ' You created all your modules'&lt;br /&gt;
		else&lt;br /&gt;
			done = false&lt;br /&gt;
			step1 = imgNo .. ' You have to create your module pages. This, you have to do &amp;lt;b&amp;gt;manually&amp;lt;/b&amp;gt;. Go to [[#Page contents|section Page contents]], copy the module content and edit the corresponding module, ' ..&lt;br /&gt;
				'pasting all the copied content. Save and close. You have to do this for the following module(s): &amp;lt;ul&amp;gt; ' ..&lt;br /&gt;
				(not coreData.page.base.exists and '&amp;lt;li&amp;gt;[[#Page contents|' .. coreData.page.base.name .. ']]&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
				(not coreData.page.class.exists and '&amp;lt;li&amp;gt;[[#Page contents|' .. coreData.page.class.name .. ']]&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
				(not coreData.page.config.exists and '&amp;lt;li&amp;gt;[[#Page contents|' .. coreData.page.config.name .. ']]&amp;lt;/li&amp;gt;' or '') .. '&amp;lt;/ul&amp;gt;'&lt;br /&gt;
		end&lt;br /&gt;
		if coreData.page.baseDoc.exists and coreData.page.classDoc.exists and coreData.page.configDoc.exists and coreData.page.template.exists and coreData.page.templateDoc.exists and&lt;br /&gt;
				(not coreData.page.form or coreData.page.form.exists) and (not coreData.page.category or coreData.page.category.exists) and (not coreData.page.gardeningCategory or coreData.page.gardeningCategory.exists) then&lt;br /&gt;
			step2 = imgYes .. ' You created all auxilliary pages'&lt;br /&gt;
		else&lt;br /&gt;
			done = false&lt;br /&gt;
			step2 = imgNo .. ' You have to create auxilliary pages. This, you can do &amp;lt;b&amp;gt;automatically&amp;lt;/b&amp;gt;. Go to [[#Page autocreation|section Page autocreation]], hit the corresponding &amp;quot;Create&amp;quot;-button or ' ..&lt;br /&gt;
				'create all pages at once. Please do this for the following page(s): &amp;lt;ul&amp;gt; ' ..&lt;br /&gt;
				(not (coreData.page.baseDoc.exists or coreData.page.classDoc.exists or coreData.page.configDoc.exists) and '&amp;lt;li&amp;gt;Module documentation pages&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
				(not (coreData.page.template.exists or coreData.page.templateDoc.exists) and '&amp;lt;li&amp;gt;Template and/or template documentation page&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
				((coreData.page.form and not coreData.page.form.exists) and '&amp;lt;li&amp;gt;Form page&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
				(((coreData.page.category and not coreData.page.category.exists) or (coreData.page.gardeningCategory and not coreData.page.gardeningCategory.exists)) and '&amp;lt;li&amp;gt;Category page(s)&amp;lt;/li&amp;gt;' or '') .. '&amp;lt;/ul&amp;gt;'&lt;br /&gt;
		end&lt;br /&gt;
		local storeCargoInstruction&lt;br /&gt;
		local allPropertiesThere&lt;br /&gt;
		local cargoTableCreateLink = false&lt;br /&gt;
		if thisUsesCargo then&lt;br /&gt;
			-- we actually use cargo. check, if cargo table is there or throws an error? if all right, then yes, else instruction above&lt;br /&gt;
			if modulesExist and coreData.page.template.exists then&lt;br /&gt;
				cargoTableCreateLink = true&lt;br /&gt;
				attr = { limit = 1, default = '' }&lt;br /&gt;
				attr['more results text'] = ''&lt;br /&gt;
				local tableEntryId = mw.text.trim(mw.text.unstrip(FoundationClass.myCargoUtil.rawquery({tables = coreData.global_cargoTable, fields = {'_ID'}}, attr)))&lt;br /&gt;
				if mw.ustring.match(mw.text.trim(tableEntryId), '^[0-9]*$') then&lt;br /&gt;
					storeCargoInstruction = imgYes .. ' Your cargo table does exist! (Note: When you change your cargo table\'s declaration, you need to [[#Page autocreation|rebuild it]], though)'&lt;br /&gt;
				else&lt;br /&gt;
					done = false&lt;br /&gt;
					storeCargoInstruction = imgNo .. ' Please [[#Page autocreation|create your cargo table]]!'&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				done = false&lt;br /&gt;
				storeCargoInstruction = imgNo .. ' To be able to create your cargo table, you have to create the following page(s): &amp;lt;ul&amp;gt;' ..&lt;br /&gt;
					(not coreData.page.base.exists and '&amp;lt;li&amp;gt;' .. coreData.page.base.name .. '&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
					(not coreData.page.class.exists and '&amp;lt;li&amp;gt;' .. coreData.page.class.name .. '&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
					(not coreData.page.config.exists and '&amp;lt;li&amp;gt;' .. coreData.page.config.name .. '&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
					(not coreData.page.template.exists and '&amp;lt;li&amp;gt;' .. coreData.page.template.name .. '&amp;lt;/li&amp;gt;' or '') .. '&amp;lt;/ul&amp;gt;'&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if thisUsesSmw then&lt;br /&gt;
			-- we actually use smw. check, if all properties are present? if all right, then yes, else instruction above&lt;br /&gt;
			if coreData.properties and coreData.properties.data and FoundationClass.myTableTools.size(coreData.properties.data) &amp;gt; 0 then&lt;br /&gt;
				allPropertiesThere = true&lt;br /&gt;
				for property, propertyData in pairs(coreData.properties.data) do&lt;br /&gt;
					allPropertiesThere = allPropertiesThere and propertyData.exists&lt;br /&gt;
				end&lt;br /&gt;
				if allPropertiesThere then&lt;br /&gt;
					storeSwmInstruction = imgYes .. ' All your property pages are present and accounted for!'&lt;br /&gt;
				else&lt;br /&gt;
					done = false&lt;br /&gt;
					storeSwmInstruction = imgNo .. ' Please &amp;lt;b&amp;gt;[[#Page autocreation|autocreate]]&amp;lt;/b&amp;gt; your properties! The following are missing: &amp;lt;ul&amp;gt;'&lt;br /&gt;
					for _, property in pairs(coreData.properties.order) do&lt;br /&gt;
						local pdata = coreData.properties.data[property]&lt;br /&gt;
						if not pdata or not pdata.exists then&lt;br /&gt;
							storeSwmInstruction = storeSwmInstruction .. '&amp;lt;li&amp;gt;[[Property:' .. property .. ']]&amp;lt;/li&amp;gt;'&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
					storeSwmInstruction = storeSwmInstruction .. '&amp;lt;/ul&amp;gt;'&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				done = false&lt;br /&gt;
				storeSwmInstruction = imgNo .. ' To be able to create your smw properties, you have to create the following page(s): &amp;lt;ul&amp;gt;' ..&lt;br /&gt;
					(not coreData.page.class.exists and '&amp;lt;li&amp;gt;' .. coreData.page.class.name .. '&amp;lt;/li&amp;gt;' or '') ..&lt;br /&gt;
					(not coreData.page.config.exists and '&amp;lt;li&amp;gt;' .. coreData.page.config.name .. '&amp;lt;/li&amp;gt;' or '') .. '&amp;lt;/ul&amp;gt;'&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if storeCargoInstruction or storeSwmInstruction then&lt;br /&gt;
			if storeCargoInstruction and storeSwmInstruction then&lt;br /&gt;
				step3 = 'Your class used cargo AND smw store. You have to create both data stores: &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;' .. storeCargoInstruction .. '&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;' .. storeSwmInstruction .. '&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;'&lt;br /&gt;
			else&lt;br /&gt;
				step3 = storeCargoInstruction or storeSwmInstruction&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			step3 = imgYes .. ' This class does not use a data store. Nothing to be done here!'&lt;br /&gt;
		end&lt;br /&gt;
		local step4 = done and imgYes .. ' You are done. Remember, when you want to change parameters in your config, edit this page and write your [' .. coreData.page.config.editlink .. ' config file] new' or &lt;br /&gt;
			imgNo .. ' You are not finished yet, please tend to your tasks.'&lt;br /&gt;
		local manual = mw.html.create('')&lt;br /&gt;
		manual:wikitext('&amp;lt;h2&amp;gt;Your 2do checklist&amp;lt;/h2&amp;gt;')&lt;br /&gt;
			:tag('ol')&lt;br /&gt;
				:cssText('margin: 0.3em 0 0 1.6em; padding: 0')&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(step1)&lt;br /&gt;
					:done()&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(step2)&lt;br /&gt;
					:done()&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(step3)&lt;br /&gt;
					:done()&lt;br /&gt;
				:tag('li')&lt;br /&gt;
					:wikitext(step4)&lt;br /&gt;
					:done()&lt;br /&gt;
				:done()&lt;br /&gt;
		-- get the data store details, if all the modules exist and we have a datastore configured&lt;br /&gt;
		local datastore = mw.html.create('')&lt;br /&gt;
		if thisClass then&lt;br /&gt;
			datastore:node(thisClass:explainDataStore())&lt;br /&gt;
				:newline()&lt;br /&gt;
		end&lt;br /&gt;
		-- build the status table&lt;br /&gt;
		local statusTrs = mw.html.create('')&lt;br /&gt;
		for _, pid in pairs(coreData.page.order) do&lt;br /&gt;
			statusTrs:tag('tr')&lt;br /&gt;
				:tag('th')&lt;br /&gt;
					:css('text-align', 'left')&lt;br /&gt;
					:css('width', widthTh)&lt;br /&gt;
					:wikitext(coreData.page[pid].name)&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
				:node(coreData.page[pid].exists and tdYa or tdNa)&lt;br /&gt;
				:newline()&lt;br /&gt;
				:done()&lt;br /&gt;
				:newline()&lt;br /&gt;
		end&lt;br /&gt;
		if thisUsesSmw and coreData.properties and coreData.properties.data and FoundationClass.myTableTools.size(coreData.properties.data) &amp;gt; 0 then&lt;br /&gt;
			statusTrs:tag('tr')&lt;br /&gt;
				:tag('th')&lt;br /&gt;
					:css('text-align', 'center')&lt;br /&gt;
					:css('width', widthTh)&lt;br /&gt;
					:attr('colspan', 2)&lt;br /&gt;
					:wikitext('Property pages for your smw store')&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
			for _, property in pairs(coreData.properties.order) do&lt;br /&gt;
				statusTrs:tag('tr')&lt;br /&gt;
					:tag('th')&lt;br /&gt;
						:css('text-align', 'left')&lt;br /&gt;
						:css('width', widthTh)&lt;br /&gt;
						:wikitext('Property:' .. property)&lt;br /&gt;
						:done()&lt;br /&gt;
						:newline()&lt;br /&gt;
					:node(coreData.properties.data[property].exists and tdYa or tdNa)&lt;br /&gt;
					:newline()&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		local statusTable = mw.html.create('table')&lt;br /&gt;
		statusTable:node(statusTrs)&lt;br /&gt;
		-- page autocreation&lt;br /&gt;
		local extAutoCreatePage = pcall(frame.callParserFunction, frame, {name = '#createpageifnotex:Module:Classgenerator', {'NUL'}})&lt;br /&gt;
		local autoCreation = _CFG.template.createPages and extAutoCreatePage&lt;br /&gt;
		local pageAutoCreation = mw.html.create('')&lt;br /&gt;
		pageAutoCreation:wikitext('&amp;lt;h2&amp;gt;Page autocreation&amp;lt;/h2&amp;gt;')&lt;br /&gt;
			:newline()&lt;br /&gt;
		if autoCreation then&lt;br /&gt;
			-- depending on parameters and existence of pages do the autocreate or print the button&lt;br /&gt;
			-- first see, which pagecomplexes (modules(docs), templates, form, category) are missing&lt;br /&gt;
			local missing = {}&lt;br /&gt;
			-- in missing we store, if a page in a given namespace is missing. Namespaces are stored by their ids (numbers)&lt;br /&gt;
			for _, pid in pairs(coreData.page.order) do&lt;br /&gt;
				-- due to extension autocreatepage messing up module pages, in namepace module we only autocreate doc pages&lt;br /&gt;
				if not coreData.page[pid].exists and not Classgenerator.myTableTools.inTable(missing, coreData.page[pid].namespace) and &lt;br /&gt;
						(coreData.page[pid].namespace ~= 828 or coreData.page[pid].isDocPage) then&lt;br /&gt;
					table.insert(missing, coreData.page[pid].namespace)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			if thisUsesSmw and not allPropertiesThere then&lt;br /&gt;
				table.insert(missing, mw.title.new('NUL', 'Property').namespace)&lt;br /&gt;
			end&lt;br /&gt;
			-- now generate the printout or call the parser function depending on global_autocreate_* status&lt;br /&gt;
			-- remember the switches 'global_autocreate_module', 'global_autocreate_template', 'global_autocreate_form', 'global_autocreate_category', and 'global_autocreate_property'&lt;br /&gt;
			local actable = mw.html.create('table')&lt;br /&gt;
			for _, nsid  in pairs(missing) do&lt;br /&gt;
				local ns = mw.ustring.lower(_namespaceName(self, nsid))&lt;br /&gt;
				local information = ''&lt;br /&gt;
				if coreData.autocreate[ns] and coreData.autocreate[ns] &amp;gt; os.time() - _CFG.template.autoCreationTimeDiff then&lt;br /&gt;
					-- ************************************* actual autocreation is done here&lt;br /&gt;
					-- we iterate over all namespaces for which pages are missing (var missing) and spring into action, if we have a numeric value supplied for that namespace coreData.autocreate[ns] that is recent enough&lt;br /&gt;
					-- now we have a namespace, we want to create pages for (var nsid) (all that is done in the recent 4 lines). what we do in the following lines:&lt;br /&gt;
					-- we iterate over all pages in coreData.page.order and spring into action, if the interation instance (pid) is in the namespace (nsid), the page is non exist and is not a module&lt;br /&gt;
					-- in that action body, we create the page with the precalcualted content&lt;br /&gt;
					-- also: for convenience, we create some global project (meta)categories, if related to the current page (project-form-category if nsid for forms, etc.) and configured in Foundationclass/globalconfig. here is an overview&lt;br /&gt;
					--	Classgenerator.globalConfig.formCategory			: MediaWiki:Classengine-content-project-form-category&lt;br /&gt;
					--	Classgenerator.globalConfig.gardeningSuperCategory	: MediaWiki:Classengine-content-project-gardening-supercategory&lt;br /&gt;
					--	Classgenerator.globalConfig.moduleCategory			: MediaWiki:Classengine-content-project-module-category&lt;br /&gt;
					--	Classgenerator.globalConfig.projectSuperCategory	: MediaWiki:Classengine-content-project-supercategory&lt;br /&gt;
					--	Classgenerator.globalConfig.propertyCategory		: MediaWiki:Classengine-content-project-property-category&lt;br /&gt;
					--	Classgenerator.globalConfig.templateCategory		: MediaWiki:Classengine-content-project-templates&lt;br /&gt;
					for _, pid in pairs(coreData.page.order) do&lt;br /&gt;
						_debug(self, 3, ' testing page &amp;quot;' .. coreData.page[pid].name .. '&amp;quot;: namespace id is ' .. coreData.page[pid].namespace ..&lt;br /&gt;
							', and page does ' ..(not coreData.page[pid].exists and 'not ' or '') .. 'exist')&lt;br /&gt;
						if coreData.page[pid].namespace == nsid and not coreData.page[pid].exists and (nsid ~= 828 or coreData.page[pid].isDocPage) then&lt;br /&gt;
							if pid == 'gardeningCategory' and Classgenerator.globalConfig.gardeningSuperCategory and #Classgenerator.globalConfig.gardeningSuperCategory &amp;gt; 0 then&lt;br /&gt;
								-- we just iterated over the gardening category page (so this class has one) but we did not create it, yet)&lt;br /&gt;
								-- blindly try to create the gardening supercategory first, in case the class's gardening category is the gardening supercategory, we dont want the class specific content&lt;br /&gt;
								local content = '{{MediaWiki:Classengine-content-project-gardening-supercategory}}'&lt;br /&gt;
								_debug(self, 3, ' trying to autocreate garderning supercategory page &amp;quot;' .. Classgenerator.globalConfig.gardeningSuperCategory .. '&amp;quot; with # of content being ' .. #content)&lt;br /&gt;
								local ret = frame:callParserFunction{ name = '#createpageifnotex:Category:' .. Classgenerator.globalConfig.gardeningSuperCategory, args = { content } }&lt;br /&gt;
								if #ret &amp;gt; 0 then&lt;br /&gt;
									information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
								end&lt;br /&gt;
							end&lt;br /&gt;
							_debug(self, 3, ' trying to autocreate page &amp;quot;' .. coreData.page[pid].name .. '&amp;quot; with # of content being ' .. #coreData.page[pid].content)&lt;br /&gt;
							local ret = frame:callParserFunction{ name = '#createpageifnotex:' .. coreData.page[pid].name, args = { frame:preprocess(coreData.page[pid].content) } }&lt;br /&gt;
							if #ret &amp;gt; 0 then&lt;br /&gt;
								information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
							end&lt;br /&gt;
							if pid == 'form' and Classgenerator.globalConfig.formCategory and #Classgenerator.globalConfig.formCategory &amp;gt; 0 then&lt;br /&gt;
								-- we just iterated over the form page (so this class has one) and created it (yay). Now blindly create the formCategory as well...&lt;br /&gt;
								local content = '{{MediaWiki:Classengine-content-project-form-category}}'&lt;br /&gt;
								_debug(self, 3, ' trying to autocreate form category page &amp;quot;' .. Classgenerator.globalConfig.formCategory .. '&amp;quot; with # of content being ' .. #content)&lt;br /&gt;
								local ret = frame:callParserFunction{ name = '#createpageifnotex:Category:' .. Classgenerator.globalConfig.formCategory, args = { content } }&lt;br /&gt;
								if #ret &amp;gt; 0 then&lt;br /&gt;
									information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
								end&lt;br /&gt;
							elseif nsid ~= 828 and Classgenerator.globalConfig.moduleCategory and #Classgenerator.globalConfig.moduleCategory &amp;gt; 0 then&lt;br /&gt;
								-- we just iterated a module doc page (so this class has one) and created it (yay). Now blindly create the moduleCategory as well...&lt;br /&gt;
								local content = '{{MediaWiki:Classengine-content-project-module-category}}'&lt;br /&gt;
								_debug(self, 3, ' trying to autocreate module category page &amp;quot;' .. Classgenerator.globalConfig.moduleCategory .. '&amp;quot; with # of content being ' .. #content)&lt;br /&gt;
								local ret = frame:callParserFunction{ name = '#createpageifnotex:Category:' .. Classgenerator.globalConfig.moduleCategory, args = { content } }&lt;br /&gt;
								if #ret &amp;gt; 0 then&lt;br /&gt;
									information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
								end&lt;br /&gt;
							elseif pid == 'category' and Classgenerator.globalConfig.projectSuperCategory and #Classgenerator.globalConfig.projectSuperCategory &amp;gt; 0 then&lt;br /&gt;
								-- we just iterated over the category page (so this class has one) and created it (yay). Now blindly create the supercategory as well...&lt;br /&gt;
								local content = '{{MediaWiki:Classengine-content-project-supercategory}}'&lt;br /&gt;
								_debug(self, 3, ' trying to autocreate super category page &amp;quot;' .. Classgenerator.globalConfig.projectSuperCategory .. '&amp;quot; with # of content being ' .. #content)&lt;br /&gt;
								local ret = frame:callParserFunction{ name = '#createpageifnotex:Category:' .. Classgenerator.globalConfig.projectSuperCategory, args = { content } }&lt;br /&gt;
								if #ret &amp;gt; 0 then&lt;br /&gt;
									information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
								end&lt;br /&gt;
							elseif nsid == 10 and Classgenerator.globalConfig.templateCategory and #Classgenerator.globalConfig.templateCategory &amp;gt; 0 then&lt;br /&gt;
								-- we just iterated over a page in template namespace (so this class has one) and created it (yay). Now blindly create the templateCategory as well...&lt;br /&gt;
								local content = '{{MediaWiki:Classengine-content-project-template-category}}'&lt;br /&gt;
								_debug(self, 3, ' trying to autocreate template category page &amp;quot;' .. Classgenerator.globalConfig.templateCategory .. '&amp;quot; with # of content being ' .. #content)&lt;br /&gt;
								local ret = frame:callParserFunction{ name = '#createpageifnotex:Category:' .. Classgenerator.globalConfig.templateCategory, args = { content } }&lt;br /&gt;
								if #ret &amp;gt; 0 then&lt;br /&gt;
									information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
								end&lt;br /&gt;
							end&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
					if thisUsesSmw and (nsid == mw.title.new('NUL', 'Property').namespace) then&lt;br /&gt;
						-- add here autocreation of properties&lt;br /&gt;
						for property, pdata in pairs(coreData.properties.data) do&lt;br /&gt;
							if not pdata.exists then&lt;br /&gt;
								local content = pdata.content&lt;br /&gt;
								_debug(self, 3, ' trying to autocreate property page &amp;quot;' .. property .. '&amp;quot; with # of content being ' .. #content)&lt;br /&gt;
								local ret = frame:callParserFunction{ name = '#createpageifnotex:Property:' .. property, args = { frame:preprocess(pdata.content) } }&lt;br /&gt;
								if #ret &amp;gt; 0 then&lt;br /&gt;
									information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
								end&lt;br /&gt;
							end&lt;br /&gt;
						end&lt;br /&gt;
						-- we just iterated over all missing property pages (so this class has some) and created them (yay). Now blindly create the propertyCategory as well...&lt;br /&gt;
						local content = '{{MediaWiki:Classengine-content-project-property-category}}'&lt;br /&gt;
						_debug(self, 3, ' trying to autocreate property category page &amp;quot;' .. Classgenerator.globalConfig.propertyCategory .. '&amp;quot; with # of content being ' .. #content)&lt;br /&gt;
						local ret = frame:callParserFunction{ name = '#createpageifnotex:Category:' .. Classgenerator.globalConfig.propertyCategory, args = { content } }&lt;br /&gt;
						if #ret &amp;gt; 0 then&lt;br /&gt;
							information = information .. '&amp;lt;br&amp;gt;' .. ret .. '\n'&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				-- create the tr for the ns&lt;br /&gt;
				actable:tag('tr')&lt;br /&gt;
					:tag('th')&lt;br /&gt;
						:css('text-align', 'left')&lt;br /&gt;
						:css('width', widthTh)&lt;br /&gt;
						:wikitext('Create ' .. ((nsid == 828 and 'module docs' or (ns == 'property' and 'properties' or (ns .. (ns == 'template' and 's' or '')))) .. ':'))&lt;br /&gt;
							-- note: nsid == mw.title.new('NUL', 'Property').namespace is necessary since canonicalname for property namespace does not translate uniquely over different languages :(&lt;br /&gt;
						:done()&lt;br /&gt;
						:newline()&lt;br /&gt;
					:tag('td')&lt;br /&gt;
						:cssText('color:black; vertical-align: middle; text-align: center; width:' .. widthTd)&lt;br /&gt;
						:css('background', (coreData.autocreate[ns] and coreData.autocreate[ns] &amp;gt; os.time() - _CFG.template.autoCreationTimeDiff) and '#90ff90' or '#FF9090' )&lt;br /&gt;
						:wikitext(frame:callParserFunction{name = '#autoedit', args={form='Classgenerator', target=self:getUid(),&lt;br /&gt;
							'link text=' .. (coreData.autocreate[ns] and 'Requested on ' .. os.date('%d.%m.%Y %X', coreData.autocreate[ns]) or 'Create automatically!')  .. &lt;br /&gt;
								(#information &amp;gt; 0 and ('Call returned ' .. information) or ''),&lt;br /&gt;
							'reload', summary=&amp;quot;Requesting the autocreation of &amp;quot; .. coreData.className .. ' for pages of type ' .. ns,&lt;br /&gt;
							'query string=Classgenerator[global_autocreate_' .. ns .. ']=' .. os.time()}&lt;br /&gt;
							})&lt;br /&gt;
						:done()&lt;br /&gt;
						:newline()&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
&lt;br /&gt;
			end&lt;br /&gt;
			if Classgenerator.myTableTools.size(missing) &amp;gt; 0 then&lt;br /&gt;
				-- show the all button&lt;br /&gt;
				local querystring = ''&lt;br /&gt;
				for _, nsid in pairs(missing) do&lt;br /&gt;
					local ns = mw.ustring.lower(_namespaceName(self, nsid))&lt;br /&gt;
					querystring = querystring .. 'Classgenerator[global_autocreate_' .. ns .. ']=' .. os.time() .. '&amp;amp;'&lt;br /&gt;
				end&lt;br /&gt;
				querystring = mw.ustring.sub(querystring, 1, -2)&lt;br /&gt;
				actable:tag('tr')&lt;br /&gt;
					:tag('th')&lt;br /&gt;
						:css('text-align', 'left')&lt;br /&gt;
						:css('width', widthTh)&lt;br /&gt;
						:wikitext('Create all pages:')&lt;br /&gt;
						:done()&lt;br /&gt;
						:newline()&lt;br /&gt;
					:tag('td')&lt;br /&gt;
						:cssText('background: #FF9090; color:black; vertical-align: middle; text-align: center; width:' .. widthTd)&lt;br /&gt;
						:wikitext(frame:callParserFunction{name = '#autoedit', args={form='Classgenerator', target=self:getUid(),&lt;br /&gt;
							'link text=Create automatically!', 'reload', summary=&amp;quot;Requesting the autocreation of all missing pages&amp;quot;, 'query string=' .. querystring }&lt;br /&gt;
							})&lt;br /&gt;
						:done()&lt;br /&gt;
						:newline()&lt;br /&gt;
					:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
				pageAutoCreation:wikitext('&amp;lt;b&amp;gt;Note:&amp;lt;/b&amp;gt; Creation of module pages is impossible due to an incompatibility issue.')&lt;br /&gt;
					:newline()&lt;br /&gt;
					:node(actable)&lt;br /&gt;
					:newline()&lt;br /&gt;
			else&lt;br /&gt;
				pageAutoCreation:wikitext('All pages present!')&lt;br /&gt;
					:newline()&lt;br /&gt;
					:tag('p')&lt;br /&gt;
						:wikitext('&amp;lt;small&amp;gt;&amp;lt;b&amp;gt;Note:&amp;lt;/b&amp;gt; Creation of module pages is impossible due to an incompatibility issue.&amp;lt;/small&amp;gt;')&lt;br /&gt;
						:newline()&lt;br /&gt;
						:done()&lt;br /&gt;
					:newline()&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			pageAutoCreation:wikitext('Page autocreation is only possible if activated in your [[Module:Classgenerator/config]]-file (see template-section) and '&lt;br /&gt;
					.. 'Extension AutoCreatePage being installed.')&lt;br /&gt;
				:newline()&lt;br /&gt;
		end&lt;br /&gt;
		if cargoTableCreateLink then&lt;br /&gt;
			pageAutoCreation:wikitext('&amp;lt;b&amp;gt;Cargo data store:&amp;lt;/b&amp;gt;To (re-)create your cargo table, follow &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[' .. coreData.page.template.recreatedata .. ' this link]&amp;lt;/span&amp;gt; and then press ok!')&lt;br /&gt;
				:newline()&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		-- build the content collapses&lt;br /&gt;
		local collapse = require('Module:Collapse').main&lt;br /&gt;
		local bg_sets = { exist = {'#cfc', '#9c9'}, nonexist = {'#fcc', '#c99'} }&lt;br /&gt;
		local bg = 1&lt;br /&gt;
		local pageContent = mw.html.create('')&lt;br /&gt;
		for _, pid in pairs(coreData.page.order) do&lt;br /&gt;
			local content&lt;br /&gt;
			local bgs = coreData.page[pid].exists and bg_sets.exist or bg_sets.nonexist&lt;br /&gt;
			if coreData.page[pid].namespace == 828 and not coreData.page[pid].isDocPage then&lt;br /&gt;
				content = frame:expandTemplate{ title = 'Code', args = {lang = 'lua', code = coreData.page[pid].content, line = '1'}}&lt;br /&gt;
			else&lt;br /&gt;
				content = '&amp;lt;pre style=&amp;quot;white-space:-moz-pre-wrap; white-space:-pre-wrap; white-space:-o-pre-wrap; white-space:pre-wrap; word-wrap:break-word;&amp;quot;&amp;gt;' .. &lt;br /&gt;
					mw.text.nowiki(frame:preprocess(coreData.page[pid].content)) .. '&amp;lt;/pre&amp;gt;'&lt;br /&gt;
			end&lt;br /&gt;
			pageContent:wikitext(collapse({ header = 'Contents of &amp;lt;b&amp;gt;[[:' .. coreData.page[pid].name .. ']]&amp;lt;/b&amp;gt; ' ..&lt;br /&gt;
							'&amp;lt;span class=&amp;quot;plainlinks&amp;quot; style=&amp;quot;font-size:75%;&amp;quot;&amp;gt;&amp;amp;#91;[' .. coreData.page[pid].editlink ..&lt;br /&gt;
							' EDIT]&amp;amp;#93;&amp;lt;/span&amp;gt;',&lt;br /&gt;
						content = content, left = true, bg = bgs[bg]&lt;br /&gt;
					}))&lt;br /&gt;
				:newline()&lt;br /&gt;
			bg = (bg == 2 and 1 or 2)&lt;br /&gt;
		end&lt;br /&gt;
		if thisUsesSmw then&lt;br /&gt;
			-- add here the collpases of the properties&lt;br /&gt;
			local message = mw.message.new('classengine-template-property-page')&lt;br /&gt;
			pageContent:tag('p')&lt;br /&gt;
				:wikitext('&amp;lt;h3&amp;gt;All property pages&amp;lt;/h3&amp;gt;')&lt;br /&gt;
				:done()&lt;br /&gt;
			for _, property in pairs(coreData.properties.order) do&lt;br /&gt;
				local bgs = coreData.page[pid].exists and bg_sets.exist or bg_sets.nonexist&lt;br /&gt;
				local content = '&amp;lt;pre style=&amp;quot;white-space:-moz-pre-wrap; white-space:-pre-wrap; white-space:-o-pre-wrap; white-space:pre-wrap; word-wrap:break-word;&amp;quot;&amp;gt;' .. &lt;br /&gt;
					mw.text.nowiki(frame:preprocess(coreData.properties.data[property].content)) .. '&amp;lt;/pre&amp;gt;'&lt;br /&gt;
				pageContent:wikitext(collapse({ header = 'Contents of &amp;lt;b&amp;gt;[[:Property:' .. property .. ']]&amp;lt;/b&amp;gt; ' ..&lt;br /&gt;
								'&amp;lt;span class=&amp;quot;plainlinks&amp;quot; style=&amp;quot;font-size:75%;&amp;quot;&amp;gt;&amp;amp;#91;[' .. coreData.properties.data[property].editlink ..&lt;br /&gt;
								' EDIT]&amp;amp;#93;&amp;lt;/span&amp;gt;',&lt;br /&gt;
							content = content, left = true, bg = bgs[bg]&lt;br /&gt;
						}))&lt;br /&gt;
					:newline()&lt;br /&gt;
				bg = (bg == 2 and 1 or 2)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		local updateWarning = mw.html.create('')&lt;br /&gt;
		if coreData.now_timestamp - coreData.edit_timestamp &amp;lt; 2*60*60 then&lt;br /&gt;
			local mbox = require('Module:Message box')&lt;br /&gt;
			updateWarning:wikitext(mbox.main('ombox', { type='content', text = 'Note: You updated the class ' .. coreData.edit_time_before .. ' ago. Did you write your [[#Page contents|config file]] new? ' ..&lt;br /&gt;
						'Changes won\'t take effect unless you do!' .. ((thisUsesCargo and cargoTableCreateLink) and '&amp;lt;p&amp;gt;&amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;Also: If you changed your cargo table\'s declaration, [' .. &lt;br /&gt;
						coreData.page.template.editlink .. ' edit your template] and [[#Page autocreation|rebuild your cargo table]]!&amp;lt;/span&amp;gt;' or '')}))&lt;br /&gt;
				:newline()&lt;br /&gt;
		end&lt;br /&gt;
		-- assemble everything&lt;br /&gt;
		local html = mw.html.create('')&lt;br /&gt;
		html:wikitext(coreData.global_description)&lt;br /&gt;
			:newline()&lt;br /&gt;
			:node(updateWarning)&lt;br /&gt;
			:node(manual)&lt;br /&gt;
			:newline()&lt;br /&gt;
			:node(datastore)&lt;br /&gt;
			:wikitext('&amp;lt;h2&amp;gt;Page status&amp;lt;/h2&amp;gt;')&lt;br /&gt;
			:newline()&lt;br /&gt;
			:wikitext(autoCreation and 'This status may be inaccurate, if you just created pages. In that case, run jobs and clear cache of this page.' or '')&lt;br /&gt;
			:node(statusTable)&lt;br /&gt;
			:newline()&lt;br /&gt;
			:node(pageAutoCreation)&lt;br /&gt;
			:wikitext('&amp;lt;h2&amp;gt;Page contents&amp;lt;/h2&amp;gt;')&lt;br /&gt;
			:newline()&lt;br /&gt;
			:node(pageContent)&lt;br /&gt;
			:newline()&lt;br /&gt;
			:done()&lt;br /&gt;
		local debugLevel = FoundationClass.globalConfig.debugLevel or _CFG.global.debugLevel&lt;br /&gt;
		if debugLevel then&lt;br /&gt;
			html:tag('pre')&lt;br /&gt;
--				:wikitext(FoundationClass.myTableTools.printTable(coreData))&lt;br /&gt;
--				:wikitext(FoundationClass.myTableTools.printTable(thisClass:smwProperty2ParameterTranslationTable()))&lt;br /&gt;
				:wikitext(ClassDebug:printLog(debugLevel))&lt;br /&gt;
				:done()&lt;br /&gt;
		end&lt;br /&gt;
		self:addOutput(html)&lt;br /&gt;
&lt;br /&gt;
		return true&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Classgenerator:myArgumentProcessing(coreData)&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator:myArgumentProcessing(args) to process coreData, from ' .. tostring(self))&lt;br /&gt;
	-- function that performs some individual transformation args --&amp;amp;amp;gt; coreData&lt;br /&gt;
	local _CFG = self.class.myConfiguration&lt;br /&gt;
	local coreData = coreData&lt;br /&gt;
	local lang = mw.language.new('en')&lt;br /&gt;
	coreData.className = lang:ucfirst(mw.text.trim(mw.ustring.gsub(self:getUid(), ':', '')))&lt;br /&gt;
	coreData.edit_timestamp = lang:formatDate('U', coreData.global_edit_timestamp)&lt;br /&gt;
	coreData.now_timestamp = lang:formatDate('U') + 60*60&lt;br /&gt;
	coreData.edit_time_before = lang:formatDuration(coreData.now_timestamp-coreData.edit_timestamp)&lt;br /&gt;
	coreData.last_edited = lang:formatDate('d.m.Y H:i:s', coreData.global_edit_timestamp)&lt;br /&gt;
	if coreData.global_gardeningCategory_chooser and mw.ustring.lower(coreData.global_gardeningCategory_chooser) == 'global' then&lt;br /&gt;
		coreData.global_gardeningCategory = 'superglobal.gardeningCategory'&lt;br /&gt;
	end&lt;br /&gt;
	if mw.ustring.find(coreData.className, ' ', 1, true) then&lt;br /&gt;
		local tmp = ''&lt;br /&gt;
		for fragment in mw.text.gsplit(coreData.className, ' ', true) do&lt;br /&gt;
			tmp = tmp .. lang:ucfirst(fragment)&lt;br /&gt;
		end&lt;br /&gt;
		coreData.className = tmp&lt;br /&gt;
	end&lt;br /&gt;
	if coreData.global_cargoTable then&lt;br /&gt;
		coreData.global_cargoTable = mw.ustring.gsub(mw.ustring.lower(coreData.global_cargoTable), ' ', '_')&lt;br /&gt;
	end&lt;br /&gt;
	if coreData.form_createInfotext and #coreData.form_createInfotext &amp;gt; 0 and mw.ustring.sub(coreData.form_createInfotext, -1) ~= ' ' then&lt;br /&gt;
		coreData.form_createInfotext = coreData.form_createInfotext .. ' '&lt;br /&gt;
	end&lt;br /&gt;
	local parameter_parameter&lt;br /&gt;
	local fieldOrder&lt;br /&gt;
	if coreData.parameter_parameter then&lt;br /&gt;
		parameters = ''&lt;br /&gt;
		fieldOrder = {}&lt;br /&gt;
		local classGenParamConfig = mw.loadData('Module:Classgenerator/parameter/config')&lt;br /&gt;
		for result in mw.text.gsplit(coreData.parameter_parameter, classGenParamConfig.template.delimiterResult, true) do&lt;br /&gt;
			local fieldname, parameter = mw.ustring.match(result, '^([^#]*)' .. classGenParamConfig.template.delimiterFormFieldName .. '(.+)$')&lt;br /&gt;
			if fieldname and mw.ustring.len(mw.text.trim(fieldname)) &amp;gt; 0 then&lt;br /&gt;
				table.insert(fieldOrder, mw.text.trim(fieldname))&lt;br /&gt;
			end&lt;br /&gt;
			if parameter and mw.ustring.len(parameter) &amp;gt; 0 then&lt;br /&gt;
				parameters = parameters .. parameter&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	coreData.parameter_parameter = parameters&lt;br /&gt;
	coreData.form_enable = FoundationClass.myYesno(coreData.form_enable)&lt;br /&gt;
	if coreData.form_enable then&lt;br /&gt;
		coreData.form_fieldOrder = fieldOrder&lt;br /&gt;
		form_buttons = { 'save' }&lt;br /&gt;
		if coreData.form_buttons and #coreData.form_buttons &amp;gt; 0 then&lt;br /&gt;
			for _, button in pairs(coreData.form_buttons) do&lt;br /&gt;
				table.insert(form_buttons, button)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		table.insert(form_buttons, 'cancel')&lt;br /&gt;
	end&lt;br /&gt;
	coreData.form_buttons = form_buttons&lt;br /&gt;
	-- here build the class config&lt;br /&gt;
	local contentClassConfig = mw.ustring.gsub(_CFG.template.configIntro, _CFG.template.placeHolderClassName, coreData.className) ..&lt;br /&gt;
		'local global = {\n' ..&lt;br /&gt;
		'\tdebugLevel = false,'&lt;br /&gt;
	if self.class.myConfiguration.template.addCommentsToConfig then&lt;br /&gt;
		contentClassConfig = contentClassConfig .. '\t-- set this to the level you wish to display at render. false if disabled. this is a class based setting. ' ..&lt;br /&gt;
			'you can set this globally at Foundationclass/globalconfig, causing all child classes to debug.'&lt;br /&gt;
	end&lt;br /&gt;
	contentClassConfig = contentClassConfig .. '\n'&lt;br /&gt;
	-- calculate the fieldlists:&lt;br /&gt;
	local fieldlists = {}&lt;br /&gt;
	for _, field in pairs(_CFG.form.fieldOrder) do&lt;br /&gt;
		local tab = mw.ustring.match(field, '^([a-z]+)_.+')&lt;br /&gt;
		if not fieldlists[tab] then&lt;br /&gt;
			fieldlists[tab] = {}&lt;br /&gt;
		end&lt;br /&gt;
		table.insert(fieldlists[tab], field)&lt;br /&gt;
	end&lt;br /&gt;
	local omissionList = {'global_autocreate_module', 'global_autocreate_template', 'global_autocreate_form', 'global_autocreate_category', 'global_autocreate_property', 'global_edit_timestamp', 'global_gardeningCategory_chooser',&lt;br /&gt;
		'form_textareaAttributes_cols', 'form_textareaAttributes_rows', 'form_textareaAttributes_autogrow', 'form_textareaAttributes_editor', 'form_createLinkInfo', &lt;br /&gt;
		'global_customization', 'form_customization', 'template_customization' }&lt;br /&gt;
	for _, attr in pairs(fieldlists.global) do&lt;br /&gt;
		if not Classgenerator.myTableTools.inTable(omissionList, attr) and self.class.myConfiguration.parameter[attr] then&lt;br /&gt;
			contentClassConfig = contentClassConfig .. _processAttribute(self, attr, '\t')&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if coreData.global_customization then&lt;br /&gt;
		for line in mw.text.gsplit(coreData.global_customization, '\n', true) do&lt;br /&gt;
			contentClassConfig = contentClassConfig .. '\t' .. line .. '\n'&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	contentClassConfig = contentClassConfig .. '}\n\nlocal form = {\n'&lt;br /&gt;
	for _, attr in pairs(fieldlists.form) do&lt;br /&gt;
		if not Classgenerator.myTableTools.inTable(omissionList, attr) and self.class.myConfiguration.parameter[attr] then&lt;br /&gt;
			contentClassConfig = contentClassConfig .. _processAttribute(self, attr, '\t')&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	contentClassConfig = contentClassConfig .. '\ttextareaAttributes = {	-- the defaults for your textarea fields\n'&lt;br /&gt;
	for _, attr in pairs({'form_textareaAttributes_cols', 'form_textareaAttributes_rows', 'form_textareaAttributes_autogrow', 'form_textareaAttributes_editor'}) do&lt;br /&gt;
		local name = mw.ustring.match(attr, '^form_textareaAttributes_(.+)$')&lt;br /&gt;
		contentClassConfig = contentClassConfig .. _processAttribute(self, attr, '\t\t', name)&lt;br /&gt;
	end&lt;br /&gt;
	contentClassConfig = contentClassConfig .. '\t},\n'&lt;br /&gt;
	contentClassConfig = contentClassConfig .. _processAttribute(self, 'form_fieldOrder', '\t')&lt;br /&gt;
	if coreData.form_customization then&lt;br /&gt;
		for line in mw.text.gsplit(coreData.form_customization, '\n', true) do&lt;br /&gt;
			contentClassConfig = contentClassConfig .. '\t' .. line .. '\n'&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	contentClassConfig = contentClassConfig .. '}\n\nlocal template = {\n'&lt;br /&gt;
	for _, attr in pairs(fieldlists.template) do&lt;br /&gt;
		if not Classgenerator.myTableTools.inTable(omissionList, attr) and self.class.myConfiguration.parameter[attr] then&lt;br /&gt;
			contentClassConfig = contentClassConfig .. _processAttribute(self, attr, '\t')&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if coreData.template_customization then&lt;br /&gt;
		for line in mw.text.gsplit(coreData.template_customization, '\n', true) do&lt;br /&gt;
			contentClassConfig = contentClassConfig .. '\t' .. mw.text.trim(line) .. '\n'&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	contentClassConfig = contentClassConfig .. '}\n\nlocal parameter = {\n' .. coreData.parameter_parameter .. '}\n\n' ..&lt;br /&gt;
		'return {\n' ..&lt;br /&gt;
		'\tform = form,\n' ..&lt;br /&gt;
		'\tglobal = global,\n' ..&lt;br /&gt;
		'\tparameter = parameter,\n' ..&lt;br /&gt;
		'\ttemplate = template,\n}\n'&lt;br /&gt;
	local classCategory = Classgenerator.globalConfig.classCategory or 'none'&lt;br /&gt;
	local formCategory = Classgenerator.globalConfig.formCategory or 'none'&lt;br /&gt;
	local gardeningCategory = Classgenerator.globalConfig.gardeningSuperCategory or 'none'&lt;br /&gt;
	local moduleCategory = Classgenerator.globalConfig.moduleCategory or 'none'&lt;br /&gt;
	local propertyCategory = Classgenerator.globalConfig.propertyCategory or 'none'&lt;br /&gt;
	local superCategory = Classgenerator.globalConfig.projectSuperCategory or 'none'&lt;br /&gt;
	local templateCategory = Classgenerator.globalConfig.templateCategory or 'none'&lt;br /&gt;
	local page = {}&lt;br /&gt;
	page.order = {'base', 'baseDoc', 'class', 'classDoc', 'config', 'configDoc', 'template', 'templateDoc'}&lt;br /&gt;
	page.base = {&lt;br /&gt;
		name = 'Module:' .. _private[self].pagename,&lt;br /&gt;
		content = mw.message.new('classengine-template-module-page'):rawParams(_private[self].pagename):plain()&lt;br /&gt;
	}&lt;br /&gt;
	page.baseDoc = {&lt;br /&gt;
		name = 'Module:' .. _private[self].pagename .. '/doc',&lt;br /&gt;
		content = mw.message.new('classengine-template-module-documentation-page'):rawParams(_private[self].pagename, moduleCategory):plain()&lt;br /&gt;
	}&lt;br /&gt;
	page.class = {&lt;br /&gt;
		name = 'Module:' .. _private[self].pagename .. '/class',&lt;br /&gt;
		content = mw.message.new('classengine-template-module-class-page'):rawParams(_private[self].pagename, coreData.className):plain()&lt;br /&gt;
	}&lt;br /&gt;
	page.classDoc = {&lt;br /&gt;
		name = 'Module:' .. _private[self].pagename .. '/class/doc',&lt;br /&gt;
		content = mw.message.new('classengine-template-module-class-documentation-page'):rawParams(_private[self].pagename, coreData.className, moduleCategory, classCategory):plain()&lt;br /&gt;
	}&lt;br /&gt;
	page.config = {&lt;br /&gt;
		name = 'Module:' .. _private[self].pagename .. '/config',&lt;br /&gt;
		content = contentClassConfig,&lt;br /&gt;
	}&lt;br /&gt;
	page.configDoc = {&lt;br /&gt;
		name = 'Module:' .. _private[self].pagename .. '/config/doc',&lt;br /&gt;
		content = mw.message.new('classengine-template-module-config-documentation-page'):rawParams(_private[self].pagename, moduleCategory, classCategory):plain()&lt;br /&gt;
	}&lt;br /&gt;
	page.template = {&lt;br /&gt;
		name = 'Template:' .. coreData.template_name,&lt;br /&gt;
		content = mw.message.new('classengine-template-template-page'):rawParams(_private[self].pagename):plain()&lt;br /&gt;
	}&lt;br /&gt;
	page.templateDoc = {&lt;br /&gt;
		name = 'Template:' .. coreData.template_name .. '/doc',&lt;br /&gt;
		content = mw.message.new('classengine-template-template-documentation-page'):rawParams(_private[self].pagename, templateCategory):plain()&lt;br /&gt;
	}&lt;br /&gt;
	if coreData.form_name and #coreData.form_name &amp;gt; 0 then&lt;br /&gt;
		table.insert(page.order, 'form')&lt;br /&gt;
		page.form = {&lt;br /&gt;
			name = 'Form:' .. coreData.form_name,&lt;br /&gt;
			content = mw.message.new('classengine-template-form-page'):rawParams(_private[self].pagename, formCategory):plain()&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
	if coreData.global_category and #coreData.global_category&amp;gt; 0 then&lt;br /&gt;
		table.insert(page.order, 'category')&lt;br /&gt;
		page.category = {&lt;br /&gt;
			name = 'Category:' .. coreData.global_category,&lt;br /&gt;
			content = mw.message.new('classengine-template-category-page'):rawParams(_private[self].pagename, superCategory):plain()&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
	if coreData.global_gardeningCategory and #coreData.global_gardeningCategory &amp;gt; 0 then&lt;br /&gt;
		table.insert(page.order, 'gardeningCategory')&lt;br /&gt;
		local pagename = coreData.global_gardeningCategory&lt;br /&gt;
		if pagename == 'superglobal.gardeningCategory' then&lt;br /&gt;
			pagename = FoundationClass.globalConfig.gardeningCategory&lt;br /&gt;
		end&lt;br /&gt;
		page.gardeningCategory = {&lt;br /&gt;
			name = 'Category:' .. pagename,&lt;br /&gt;
			content = mw.message.new('classengine-template-gardeningcategory-page'):rawParams(_private[self].pagename, gardeningCategory):plain()&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
	for _, pid in pairs(page.order) do&lt;br /&gt;
		local obj = mw.title.new(page[pid].name)&lt;br /&gt;
		page[pid].exists = obj.exists&lt;br /&gt;
		page[pid].namespace = obj.namespace&lt;br /&gt;
		page[pid].editlink = obj:fullUrl{action='edit'}&lt;br /&gt;
		if pid == 'template' then&lt;br /&gt;
			page[pid].recreatedata = obj:fullUrl{action='recreatedata'}&lt;br /&gt;
		end&lt;br /&gt;
		page[pid].isDocPage = (mw.ustring.sub(page[pid].name, -4) == '/doc')&lt;br /&gt;
		if page[pid].isDocPage then&lt;br /&gt;
			page[pid].content = page[pid].content .. '&amp;lt;h2&amp;gt;Maintenanace notes&amp;lt;/h2&amp;gt;\n' ..&lt;br /&gt;
				'This page was created by [[Module:Classgenerator]] and belongs to [[' .. self:getUid() .. ']].\n'&lt;br /&gt;
			if pid == 'configDoc' then&lt;br /&gt;
				page[pid].content = page[pid].content .. '\n{{((}}ombox| type=content | text = It is strongly advised, to not edit this page but to use [' ..&lt;br /&gt;
				'https://{{((}}SERVERNAME{{))}}{{((}}SCRIPTPATH{{))}}/Special:FormEdit/Classgenerator/' .. mw.uri.encode(self:getUid(), &amp;quot;PATH&amp;quot;) .. ' ' .. &lt;br /&gt;
					'the Classgenerator form] instead! After that, use your new configuration to replace the contents of this page.{{))}}'&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	local thisClass&lt;br /&gt;
	local thisConfig&lt;br /&gt;
	if page.class.exists and page.config.exists then&lt;br /&gt;
		thisClass = require(page.class.name)&lt;br /&gt;
		thisConfig = require(page.config.name)&lt;br /&gt;
	end&lt;br /&gt;
	if page.form and (not coreData.form_typeCreateLink or coreData.form_typeCreateLink ~= 'forminput') and coreData.form_createLinkPageName and mw.ustring.len(coreData.form_createLinkPageName) &amp;gt; 0 then&lt;br /&gt;
		local pageName = coreData.form_createLinkPageName&lt;br /&gt;
		if coreData.global_namespace and mw.ustring.len(coreData.global_namespace) &amp;gt; 0 and not mw.ustring.match(pageName, '^' .. coreData.global_namespace .. ':.+$') then&lt;br /&gt;
			pageName = coreData.global_namespace .. ':' .. pageName&lt;br /&gt;
		end&lt;br /&gt;
		local infostr = '{{((}}{info|page name=' .. pageName .. '|add title=' .. (coreData.form_labelCreate or 'create entity') .. '|edit title=' .. (coreData.form_labelEdit or 'edit entity') .. '}{{))}}'&lt;br /&gt;
		page.form.content = page.form.content .. '&amp;lt;!{{#invoke:String|rep|-|2}} this is a workaround, needed because of a SF bug: ' .. infostr ..&lt;br /&gt;
			'. see https://phabricator.wikimedia.org/T123230 for more information {{#invoke:String|rep|-|2}}&amp;gt;'&lt;br /&gt;
	end&lt;br /&gt;
	coreData.page = page&lt;br /&gt;
	local autocreate = {}&lt;br /&gt;
	autocreate.module = FoundationClass.myYesno(coreData.global_autocreate_module, tonumber(coreData.global_autocreate_module))&lt;br /&gt;
	autocreate.template = FoundationClass.myYesno(coreData.global_autocreate_template, tonumber(coreData.global_autocreate_template))&lt;br /&gt;
	autocreate.form = coreData.form_name and FoundationClass.myYesno(coreData.global_autocreate_form, tonumber(coreData.global_autocreate_form))&lt;br /&gt;
	autocreate.category = (coreData.global_category or coreData.global_gardeningCategory) and FoundationClass.myYesno(coreData.global_autocreate_category, tonumber(coreData.global_autocreate_category))&lt;br /&gt;
	if (FoundationClass.globalConfig.dataStore == 'both' or FoundationClass.globalConfig.dataStore == 'smw') and FoundationClass.myYesno(coreData.global_smwUseStorage) then&lt;br /&gt;
		local propertyNSName = _namespaceName(self, mw.title.new('NUL', 'Property').namespace)&lt;br /&gt;
		autocreate[propertyNSName] = FoundationClass.myYesno(coreData['global_autocreate_' .. propertyNSName], tonumber(coreData['global_autocreate_' .. propertyNSName]))&lt;br /&gt;
	end&lt;br /&gt;
	coreData.autocreate = autocreate&lt;br /&gt;
	local propertyData&lt;br /&gt;
	local propertyOrder&lt;br /&gt;
	if (FoundationClass.globalConfig.dataStore == 'both' or FoundationClass.globalConfig.dataStore == 'smw') and FoundationClass.myYesno(coreData.global_smwUseStorage) and thisClass and thisConfig then&lt;br /&gt;
		-- we use smw and class and config are created and accessible. we can get property information and prepare data&lt;br /&gt;
		local matrix = thisClass:smwGetProperty2ParameterTranslationTable()&lt;br /&gt;
		propertyData = {}&lt;br /&gt;
		propertyOrder = {}&lt;br /&gt;
		for property, parameter in pairs(matrix) do&lt;br /&gt;
			table.insert(propertyOrder, property)&lt;br /&gt;
			local obj = mw.title.new(property, 'Property')&lt;br /&gt;
			propertyData[property] = { &lt;br /&gt;
				editlink = obj:fullUrl{action='edit'},&lt;br /&gt;
				exists = obj.exists,&lt;br /&gt;
				parameter = parameter,&lt;br /&gt;
			}&lt;br /&gt;
			if thisConfig.parameter[parameter] then&lt;br /&gt;
				propertyData[property].description = thisConfig.parameter[parameter].description&lt;br /&gt;
				propertyData[property].type = thisConfig.parameter[parameter].property_type&lt;br /&gt;
				propertyData[property].values = thisConfig.parameter[parameter].values&lt;br /&gt;
			elseif parameter == FoundationClass.globalConfig.smwClassProperty then&lt;br /&gt;
				propertyData[property].description = 'Automatisch hinzugefügt! Wird verwendet, um Mitglieder dieser Klasse zu finden (funktioniert auch, ohne dass eine Kategorie definiert wird und auch fur subobjects)'&lt;br /&gt;
				propertyData[property].type = 'Text'&lt;br /&gt;
			elseif parameter == FoundationClass.globalConfig.uidFieldName then&lt;br /&gt;
				propertyData[property].description = 'Automatisch hinzugefügt! Wird verwendet, um individuelle Objekte innerhalb der Klasse zu identifizieren.'&lt;br /&gt;
				propertyData[property].type = 'Text'&lt;br /&gt;
			end&lt;br /&gt;
			local values = ''&lt;br /&gt;
			if propertyData[property].values then&lt;br /&gt;
				values = values .. 'The allowed values are:'&lt;br /&gt;
				for _, value in pairs(propertyData[property].values) do&lt;br /&gt;
					values = values .. '\n* [[Allows value::' .. value .. ']]'&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				values = 'No restriction given'&lt;br /&gt;
			end&lt;br /&gt;
			propertyData[property].content = mw.message.new('classengine-template-property-page'):rawParams(propertyData[property].description, propertyData[property].type, values, propertyCategory):plain()&lt;br /&gt;
		end&lt;br /&gt;
		table.sort(propertyOrder)&lt;br /&gt;
	end&lt;br /&gt;
	coreData.properties = { data = propertyData, order = propertyOrder }&lt;br /&gt;
	return coreData	-- this is your new coreData.&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Classgenerator:myPlausibilityTest(args)&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator:myPlausibilityTest(args) to test arguments, from ' .. tostring(self))&lt;br /&gt;
	-- function that performs the individual plausibility tests&lt;br /&gt;
	-- note: before you access a field args.fieldname you should check for existance&lt;br /&gt;
	-- self:addError(text)&lt;br /&gt;
	return false	-- return value will be ignored. but if you add any error, the object's initialization will fail with the error&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Classgenerator:myStashAdjustments(stash)&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator:myStashAdjustments(stash) to do some minor adjustments on data before storing, from ' .. tostring(self))&lt;br /&gt;
	-- function that alters the stash before storing the data&lt;br /&gt;
	local stash = stash&lt;br /&gt;
	return stash	-- this is your new stash. this will be stored. it has format (fieldname: value)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Classgenerator:method()&lt;br /&gt;
	_debug(self, 1, 'entering Classgenerator:method() to do something, from ' .. tostring(self))&lt;br /&gt;
	return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return Classgenerator&lt;/div&gt;</summary>
		<author><name>Anatol</name></author>
	</entry>
	<entry>
		<id>https://camnet.oetterer.eu/index.php?title=Modul:Classgenerator/parameter/config&amp;diff=1003</id>
		<title>Modul:Classgenerator/parameter/config</title>
		<link rel="alternate" type="text/html" href="https://camnet.oetterer.eu/index.php?title=Modul:Classgenerator/parameter/config&amp;diff=1003"/>
		<updated>2016-02-09T20:44:47Z</updated>

		<summary type="html">&lt;p&gt;Anatol: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local superglobal = mw.loadData( 'Module:Foundationclass/globalconfig' )&lt;br /&gt;
&lt;br /&gt;
local form = {&lt;br /&gt;
	enable = true,&lt;br /&gt;
	name = nil,	-- the name of the form&lt;br /&gt;
	teaserText = 'Please use [[Form:Classgenerator]]!',	-- this is the text displayed on the form:name page (before you see the actual form)&lt;br /&gt;
	typeCreateLink = 'none',&lt;br /&gt;
	createInfotext = nil,&lt;br /&gt;
	createInputPlaceholder = nil,&lt;br /&gt;
	createInputQueryString = nil,&lt;br /&gt;
	createLinkPageName = nil,&lt;br /&gt;
	createLinkQueryString = nil,&lt;br /&gt;
	createLinkType = nil, &lt;br /&gt;
	labelCreate = 'Add parameter',	-- label for create entityh&lt;br /&gt;
	labelEdit = 'Edit parameter',	-- label for edit entity&lt;br /&gt;
	headerText = 'This is your list of parameters. You put all data here, that you would like to handle - be it data you process normally, data you would only like to gather vai form or data you simply want to store',&lt;br /&gt;
	notification = 'The order of your parameters here will reflect the order of your form input fields.',	-- this notification will be displayed above your form&lt;br /&gt;
	sectionList = nil,&lt;br /&gt;
	allowsFreeText = nil,&lt;br /&gt;
	buttons = {'save', 'preview', 'changes', 'cancel'},	-- which buttons should appera below the form&lt;br /&gt;
	fieldSize = 80,	-- what is the default size= for the form fields&lt;br /&gt;
	textareaAttributes = {	-- the defaults for your textarea fields&lt;br /&gt;
		rows = 4,&lt;br /&gt;
		cols = 80,&lt;br /&gt;
		autogrow = true,&lt;br /&gt;
		editor = false,&lt;br /&gt;
	},&lt;br /&gt;
	fieldOrder = {	-- the order in which the form fields appear. NOTE: a parameter not in this list, will not appear in the form!!&lt;br /&gt;
		-- the order in which the form fields appear. NOTE: a parameter not in this list, will not appear in the form!!&lt;br /&gt;
		-- YOU HAVE TO FILL THIS TABLE! Put in here all parameters, that are used in the form, even if you have your own sfGenerateForm() implemented using a different table.&lt;br /&gt;
		-- Reason: This is also be used in plausibility tests&lt;br /&gt;
		-- form building and template parameter processing (except plausi test) will be performed, using the other tables further down below)&lt;br /&gt;
		'name',&lt;br /&gt;
		'cardinality',&lt;br /&gt;
		'cargo',&lt;br /&gt;
		'cargo_hidden',&lt;br /&gt;
		'cargo_size',&lt;br /&gt;
		'cargo_type',&lt;br /&gt;
		'description',&lt;br /&gt;
		'label',&lt;br /&gt;
		'property',&lt;br /&gt;
		'property_name',&lt;br /&gt;
		'property_type',&lt;br /&gt;
		'severity',&lt;br /&gt;
		'values',&lt;br /&gt;
		'sf',&lt;br /&gt;
		'td_default',&lt;br /&gt;
		'td_type',&lt;br /&gt;
		'add_cargo_table_and_field',&lt;br /&gt;
		'class',&lt;br /&gt;
		'default',&lt;br /&gt;
		'hidden',&lt;br /&gt;
		'input_type',&lt;br /&gt;
		'placeholder',&lt;br /&gt;
		'restricted',&lt;br /&gt;
		'unique',&lt;br /&gt;
		'unique_for_category',&lt;br /&gt;
		'unique_for_concept',&lt;br /&gt;
		'unique_for_namespace',&lt;br /&gt;
		'uploadable',&lt;br /&gt;
		'default_filename',&lt;br /&gt;
		'image_preview',&lt;br /&gt;
		'autogrow',&lt;br /&gt;
		'base_type',&lt;br /&gt;
		'cols',&lt;br /&gt;
		'date_format',&lt;br /&gt;
		'disable_dates',&lt;br /&gt;
		'disable_days_of_week',&lt;br /&gt;
		'disable_input_field',&lt;br /&gt;
		'editor',&lt;br /&gt;
		'enable_input_field',&lt;br /&gt;
		'existing_values_only',&lt;br /&gt;
		'first_date',&lt;br /&gt;
		'hide_reset_button',&lt;br /&gt;
		'hide_week_numbers',&lt;br /&gt;
		'highlight_dates',&lt;br /&gt;
		'highlight_days_of_week',&lt;br /&gt;
		'include_timezone',&lt;br /&gt;
		'last_date',&lt;br /&gt;
		'mapping_cargo_field',&lt;br /&gt;
		'mapping_cargo_table',&lt;br /&gt;
		'mapping_property',&lt;br /&gt;
		'mapping_template',&lt;br /&gt;
		'max_values',&lt;br /&gt;
		'maxlength',&lt;br /&gt;
		'message',&lt;br /&gt;
		'regexp',&lt;br /&gt;
		'rows',&lt;br /&gt;
		'show_reset_button',&lt;br /&gt;
		'show_on_select',&lt;br /&gt;
		'show_week_numbers',&lt;br /&gt;
		'size',&lt;br /&gt;
		'structure',&lt;br /&gt;
		'values_dependent_on',&lt;br /&gt;
		'values_from_category',&lt;br /&gt;
		'values_from_concept',&lt;br /&gt;
		'values_from_namespace',&lt;br /&gt;
		'week_start',&lt;br /&gt;
	},&lt;br /&gt;
	fieldOrderGeneral = {	-- the order in which the form fields appear. This is the first, mostly general part&lt;br /&gt;
		'name',&lt;br /&gt;
		'cardinality',&lt;br /&gt;
		'cargo',&lt;br /&gt;
		'cargo_type',&lt;br /&gt;
		'cargo_hidden',&lt;br /&gt;
		'cargo_size',&lt;br /&gt;
		'description',&lt;br /&gt;
		'label',&lt;br /&gt;
		'property',&lt;br /&gt;
		'property_name',&lt;br /&gt;
		'property_type',&lt;br /&gt;
		'severity',&lt;br /&gt;
		'sf',&lt;br /&gt;
		'td_default',&lt;br /&gt;
		'td_type',&lt;br /&gt;
		'values',&lt;br /&gt;
	},&lt;br /&gt;
	fieldOrderSFgeneral = {	-- the order in which the form fields appear. This is the second, semantic forms related part&lt;br /&gt;
		'input_type',&lt;br /&gt;
		'default',&lt;br /&gt;
		'placeholder',&lt;br /&gt;
		'add_cargo_table_and_field',&lt;br /&gt;
		'class',&lt;br /&gt;
		'hidden',&lt;br /&gt;
		'holds_template',&lt;br /&gt;
		'restricted',&lt;br /&gt;
		'unique',&lt;br /&gt;
		'unique_for_category',&lt;br /&gt;
		'unique_for_concept',&lt;br /&gt;
		'unique_for_namespace',&lt;br /&gt;
		'uploadable',&lt;br /&gt;
		'default_filename',&lt;br /&gt;
		'image_preview',&lt;br /&gt;
	},&lt;br /&gt;
	fieldOrderSFtypeDependent = {&lt;br /&gt;
		-- note: there is a bunch of attributes missing from https://www.mediawiki.org/wiki/Extension:Semantic_Forms_Inputs&lt;br /&gt;
		'autogrow',&lt;br /&gt;
		'base_type',&lt;br /&gt;
		'cols',&lt;br /&gt;
		'date_format',&lt;br /&gt;
		'disable_input_field',&lt;br /&gt;
		'disable_dates',&lt;br /&gt;
		'disable_days_of_week',&lt;br /&gt;
		'editor',&lt;br /&gt;
		'enable_input_field',&lt;br /&gt;
		'existing_values_only',&lt;br /&gt;
		'first_date',&lt;br /&gt;
		'hide_reset_button',&lt;br /&gt;
		'hide_week_numbers',&lt;br /&gt;
		'highlight_dates',&lt;br /&gt;
		'highlight_days_of_week',&lt;br /&gt;
		'include_timezone',&lt;br /&gt;
		'last_date',&lt;br /&gt;
		'mapping_cargo_field',&lt;br /&gt;
		'mapping_cargo_table',&lt;br /&gt;
		'mapping_property',&lt;br /&gt;
		'mapping_template',&lt;br /&gt;
		'max_values',&lt;br /&gt;
		'maxlength',&lt;br /&gt;
		'message',&lt;br /&gt;
		'regexp',&lt;br /&gt;
		'rows',&lt;br /&gt;
		'show_on_select',&lt;br /&gt;
		'show_reset_button',&lt;br /&gt;
		'show_week_numbers',&lt;br /&gt;
		'size',&lt;br /&gt;
		'structure',&lt;br /&gt;
		'values_dependent_on',&lt;br /&gt;
		'values_from_category',&lt;br /&gt;
		'values_from_concept',&lt;br /&gt;
		'values_from_namespace',&lt;br /&gt;
		'week_start',&lt;br /&gt;
	},&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local global = {&lt;br /&gt;
	cargoTable = nil,	-- if you use dataStore cargo, name the table here&lt;br /&gt;
	cargoUidFieldname = '',	-- this is the table-field, the object can use to identiy itself. must be unique!&lt;br /&gt;
		-- if set to nil or a string which does not point to existing parameter or points to a parameter without a cargo_type, this defaults to _pageName&lt;br /&gt;
	category = '',	-- the mediawiki category, the entity is placed into&lt;br /&gt;
	delimiter = ',',	-- see to it, that the delimiter is not a character, that will be encoded by mw.text.encode. CargoUtil.store encodes the data for security reasons&lt;br /&gt;
	description = 'This is the list of parameters for the class. All data is represented here, be it data processed normally, data only to gatherd via form or data that is simply stored.',&lt;br /&gt;
	entityTitle = 'Class parameter',	-- generic title for the entity&lt;br /&gt;
	namespace = '',	-- if you put this entity on a special namespace, name it here. NOTE: You have to be precise. This is case sensitive. But omit the colon.&lt;br /&gt;
	restrictedTo = superglobal.restrictionRole,	-- so we want the class only be created by a certain role. Since we can't limit the form to a role, we have to limit all fields to a role. This is that role.&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local template = {&lt;br /&gt;
	addCommentsToConfig = false, -- you can add explanatory comments to your autocreated config file. makes it more verbose, but increases size&lt;br /&gt;
	delimiterResult = '###~~~NEXTPARAMETER~~~###',	-- here start a new result&lt;br /&gt;
	delimiterFormFieldName = '###~~~NOWCOMESTHELUADEFINITION~~~###',	-- this seperates fieldname (if it is in form/template) from definitionstring&lt;br /&gt;
	name = 'Classgenerator/parameter',	-- the name of your template. e.g.: your template can be found on the page [[Template:nameOfYourTemplate]]&lt;br /&gt;
	templateDocumentationSeeAlso = {'Classgenerator'}	-- used in the see also-section of your template documentation&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local parameter = {&lt;br /&gt;
	-- this is your list of parameters. you put all data here, that you would like to handle&lt;br /&gt;
	--	* parameters of your form (and thus your template)&lt;br /&gt;
	--		* when you fill td_type, your parameter will be treated as a template parameter&lt;br /&gt;
	--		* when you add the parameter name to form.fieldOrder, it will be added to the form&lt;br /&gt;
	--	* and also data, that you only want to store (omit these from form.fieldOrder and leave the sf table).&lt;br /&gt;
	&lt;br /&gt;
	-- missing: values_dependent_on, values_from_external data, values_from_url, also some semantic forms inputs&lt;br /&gt;
	name = {&lt;br /&gt;
		cardinality = 'single',&lt;br /&gt;
		description = 'The name of the parameter. Use only upper and lowercase characters, numbers (not the first symbol), dash and underscore.',	-- do not use a &amp;quot; or templateDocumentation will fail!&lt;br /&gt;
		label = 'Parameter',&lt;br /&gt;
		severity = 'mandatory',&lt;br /&gt;
		sf = {&lt;br /&gt;
			input_type = 'regexp',&lt;br /&gt;
			message = 'Allowed characters are [a-zA-Z_][0-9a-zA-Z_-]+',&lt;br /&gt;
			placeholder = 'Parameter name',&lt;br /&gt;
			regexp = '/^[a-zA-Z_][0-9a-zA-Z_-]+$/',&lt;br /&gt;
			restricted = global.restrictedTo,&lt;br /&gt;
		},&lt;br /&gt;
		td_type = 'line',&lt;br /&gt;
	},&lt;br /&gt;
	cardinality = {	-- prefix _ is necessary or sf disables all but one of the radiobutton options&lt;br /&gt;
		cardinality = 'single',&lt;br /&gt;
		description = 'Is this a single or a multivalue field?',	-- do not use a &amp;quot; or templateDocumentation will fail!&lt;br /&gt;
		label = 'Cardinality',&lt;br /&gt;
		severity = 'mandatory',&lt;br /&gt;
		sf = {&lt;br /&gt;
			default = 'single',&lt;br /&gt;
			input_type = 'radiobutton',&lt;br /&gt;
			restricted = global.restrictedTo,&lt;br /&gt;
		},&lt;br /&gt;
		td_default = 'single',&lt;br /&gt;
		td_type = 'line',&lt;br /&gt;
		values = {'single', 'list'},&lt;br /&gt;
	},&lt;br /&gt;
	cargo = {&lt;br /&gt;
		cardinality = 'single',&lt;br /&gt;
		description = 'Do you want to store this parameter in a cargo field? Works only, if you have a cargo table name specified in the GLOBAL section.',	-- do not use a &amp;quot; or templateDocumentation will fail!&lt;br /&gt;
		label = 'Store in cargo',&lt;br /&gt;
		severity = 'mandatory',&lt;br /&gt;
		sf = {&lt;br /&gt;
			hidden = false,&lt;br /&gt;
			default = 'Yes',&lt;br /&gt;
			input_type = 'radiobutton',&lt;br /&gt;
			restricted = global.restrictedTo,&lt;br /&gt;
			show_on_select = { Yes = {'cargo_hidden', 'cargo_size', 'cargo_type', 'add_cargo_table_and_field', }}&lt;br /&gt;
		},&lt;br /&gt;
		td_default = 'Yes',&lt;br /&gt;
		td_type = 'boolean',&lt;br /&gt;
		values = {'Yes', 'No'},&lt;br /&gt;
	},&lt;br /&gt;
	cargo_hidden = {&lt;br /&gt;
		cardinality = 'single',&lt;br /&gt;
		description = 'If set, the field is not listed in either Special:ViewTable or Special:Drilldown, although it is still queriable.',&lt;br /&gt;
		label = 'Cargo hidden',&lt;br /&gt;
		severity = 'suggested',&lt;br /&gt;
		sf = {&lt;br /&gt;
			hidden = false,&lt;br /&gt;
			input_type = 'radiobutton',&lt;br /&gt;
			restricted = global.restrictedTo,&lt;br /&gt;
		},&lt;br /&gt;
		td_type = 'boolean',&lt;br /&gt;
		values = {'true', 'false'},&lt;br /&gt;
	},&lt;br /&gt;
	cargo_size = {&lt;br /&gt;
		cardinality = 'single',&lt;br /&gt;
		description = 'for fields of type Text, Wikitext or String, sets the size of this field, i.e. the number of characters; default is 300',	-- do not use a &amp;quot; or templateDocumentation will fail!&lt;br /&gt;
		label = 'Cargo size',&lt;br /&gt;
		severity = 'optional',&lt;br /&gt;
		sf = {&lt;br /&gt;
			input_type = 'regexp',&lt;br /&gt;
			maxlength = 4,&lt;br /&gt;
			placeholder = 'size of field',&lt;br /&gt;
			regexp = '^[0-9]*$',&lt;br /&gt;
			restricted = global.restrictedTo,&lt;br /&gt;
		},&lt;br /&gt;
		td_type = 'number',&lt;br /&gt;
	},&lt;br /&gt;
	cargo_type = {&lt;br /&gt;
		cardinality = 'single',&lt;br /&gt;
		description = 'Which type will this parameter be stored in. If you don\t whish to store this parameter, leave this empty.',	-- do not use a &amp;quot; or templateDocumentation will fail!&lt;br /&gt;
		label = 'Cargo field type &amp;lt;small&amp;gt;[https://www.mediawiki.org/wiki/Extension:Cargo/Storing_data#Declaring_a_table &amp;amp;#91;help&amp;amp;#93;]&amp;lt;/small&amp;gt;',&lt;br /&gt;
		severity = 'mandatory',&lt;br /&gt;
		sf = {&lt;br /&gt;
			default = 'Text',&lt;br /&gt;
			hidden = false,&lt;br /&gt;
			input_type = 'combobox',&lt;br /&gt;
			placeholder = 'Pick one!',&lt;br /&gt;
			restricted = global.restrictedTo,&lt;br /&gt;
		},&lt;br /&gt;
		td_type = 'line',&lt;br /&gt;
		values = {'Page', 'Text', 'Integer', 'Float', 'Date', 'Datetime', 'Boolean', 'Coordinates', 'Wikitext', 'File', 'String', 'URL', 'Email'},&lt;br /&gt;
	},&lt;br /&gt;
	description = {&lt;br /&gt;
		cardinality = 'single',&lt;br /&gt;
		description = 'A short description of this paramter. Serves mainly as a hint via tooltip to users of the form to help them fill the parameter.',&lt;br /&gt;
		label = 'Description',&lt;br /&gt;
		severity = 'mandatory',&lt;br /&gt;
		sf = {&lt;br /&gt;
			input_type = 'textarea',&lt;br /&gt;
			placeholder = 'Field description for users',&lt;br /&gt;
			restricted = global.restrictedTo,&lt;br /&gt;
		},&lt;br /&gt;
		td_type = 'string',&lt;br /&gt;
	},&lt;br /&gt;
	label = {&lt;br /&gt;
		cardinality = 'single',&lt;br /&gt;
		description = 'The label for this parameter. Use short but descriptive text (~1-3 words). This will be placed next to the input field in the form.',&lt;br /&gt;
		label = 'Label',&lt;br /&gt;
		severity = 'mandatory',&lt;br /&gt;
		sf = {&lt;br /&gt;
			input_type = 'text',&lt;br /&gt;
			placeholder = 'Labeltext',&lt;br /&gt;
			restricted = global.restrictedTo,&lt;br /&gt;
		},&lt;br /&gt;
		td_type = 'line',&lt;br /&gt;
	},&lt;br /&gt;
	property = {&lt;br /&gt;
		cardinality = 'single',&lt;br /&gt;
		description = 'Do you want to store this parameter semantically? Works only, if you have switched semantic store on in the GLOBAL section.',	-- do not use a &amp;quot; or templateDocumentation will fail!&lt;br /&gt;
		label = 'Store semantically',&lt;br /&gt;
		severity = 'mandatory',&lt;br /&gt;
		sf = {&lt;br /&gt;
			hidden = false,&lt;br /&gt;
			default = 'Yes',&lt;br /&gt;
			input_type = 'radiobutton',&lt;br /&gt;
			restricted = global.restrictedTo,&lt;br /&gt;
			show_on_select = { Yes = {'property_name', 'property_type'}}&lt;br /&gt;
		},&lt;br /&gt;
		td_default = 'Yes',&lt;br /&gt;
		td_type = 'boolean',&lt;br /&gt;
		values = {'Yes', 'No'},&lt;br /&gt;
	},&lt;br /&gt;
	property_name = {&lt;br /&gt;
		cardinality = 'single',&lt;br /&gt;
		description = 'The name of your property this date is stored in - if you are using data store smw that is. NOTE: Do not use spaces, use underscrores (_) instead.',	-- do not use a &amp;quot; or templateDocumentation will fail!&lt;br /&gt;
		label = 'Property name',&lt;br /&gt;
		severity = 'mandatory',&lt;br /&gt;
		sf = {&lt;br /&gt;
			base_type = 'combobox',&lt;br /&gt;
			input_type = 'regexp',&lt;br /&gt;
			message = 'Allowed characters are [a-zA-Z_][0-9a-zA-Z_ -]+',&lt;br /&gt;
			placeholder = 'Property name',&lt;br /&gt;
			regexp = '^[a-zA-Z_][0-9a-zA-Z_ -]*$',&lt;br /&gt;
			restricted = global.restrictedTo,&lt;br /&gt;
			values_from_namespace = 'Attribut',&lt;br /&gt;
		},&lt;br /&gt;
		td_type = 'line',&lt;br /&gt;
	},&lt;br /&gt;
	property_type = {&lt;br /&gt;
		cardinality = 'single',&lt;br /&gt;
		description = 'The type of your property this date is stored in - if you are using data store smw that is.',	-- do not use a &amp;quot; or templateDocumentation will fail!&lt;br /&gt;
		label = 'Property type &amp;lt;small&amp;gt;[https://semantic-mediawiki.org/wiki/Help:List_of_datatypes &amp;amp;#91;help&amp;amp;#93;]&amp;lt;/small&amp;gt;',&lt;br /&gt;
		severity = 'mandatory',&lt;br /&gt;
		sf = {&lt;br /&gt;
			default = 'Text',&lt;br /&gt;
			hidden = false,&lt;br /&gt;
			input_type = 'combobox',&lt;br /&gt;
			placeholder = 'Pick one!',&lt;br /&gt;
			restricted = global.restrictedTo,&lt;br /&gt;
		},&lt;br /&gt;
		td_type = 'line',&lt;br /&gt;
		values = {},&lt;br /&gt;
	},&lt;br /&gt;
	severity = {	-- prefox _ is necessary or sf disables all but one of the radiobutton options&lt;br /&gt;
		cardinality = 'single',&lt;br /&gt;
		description = 'Is this field mandatory, suggested or optional',	-- do not use a &amp;quot; or templateDocumentation will fail!&lt;br /&gt;
		label = 'Severity',&lt;br /&gt;
		severity = 'mandatory',&lt;br /&gt;
		sf = {&lt;br /&gt;
			default = 'suggested',&lt;br /&gt;
			input_type = 'radiobutton',&lt;br /&gt;
			restricted = global.restrictedTo,&lt;br /&gt;
		},&lt;br /&gt;
		td_type = 'line',&lt;br /&gt;
		values = {'mandatory', 'suggested', 'optional'},&lt;br /&gt;
	},&lt;br /&gt;
	sf = {&lt;br /&gt;
		cardinality = 'single',&lt;br /&gt;
		description = 'Should this field be present (not necessary visible, see #hidden) on the form (and therefore be available as parameter in the template)?',&lt;br /&gt;
		label = 'Regular form parameter',&lt;br /&gt;
		severity = 'mandatory',&lt;br /&gt;
		sf = {&lt;br /&gt;
			default = 'Yes',&lt;br /&gt;
			input_type = 'radiobutton',&lt;br /&gt;
			restricted = global.restrictedTo,&lt;br /&gt;
			show_on_select = {Yes = {'cardinality', 'severity', 'parameter', 'td_default', 'td_type', 'values'}, No = {'cardinality', 'severity', 'values'}},&lt;br /&gt;
		},&lt;br /&gt;
		td_type = 'boolean',&lt;br /&gt;
		values = {'Yes', 'No', 'Holds template', 'Information'},&lt;br /&gt;
	},&lt;br /&gt;
	td_default = {&lt;br /&gt;
		cardinality = 'single',&lt;br /&gt;
		description = 'Information only present on the template documentation: to what default value will this be set?',	-- do not use a &amp;quot; or templateDocumentation will fail!&lt;br /&gt;
		label = 'Template doc default',&lt;br /&gt;
		severity = 'suggested',&lt;br /&gt;
		sf = {&lt;br /&gt;
			input_type = 'text',&lt;br /&gt;
			placeholder = 'Hint: Not used in template execution',&lt;br /&gt;
			restricted = global.restrictedTo,&lt;br /&gt;
		},&lt;br /&gt;
		td_type = 'line',&lt;br /&gt;
	},&lt;br /&gt;
	td_type = {&lt;br /&gt;
		cardinality = 'single',&lt;br /&gt;
		description = 'What type should be used on the template documentation page?',	-- do not use a &amp;quot; or templateDocumentation will fail!&lt;br /&gt;
		label = 'Template doc parameter type &amp;lt;small&amp;gt;[https://www.mediawiki.org/wiki/Extension:TemplateData#Format &amp;amp;#91;help&amp;amp;#93;]&amp;lt;/small&amp;gt;',&lt;br /&gt;
		severity = 'mandatory',&lt;br /&gt;
		sf = {&lt;br /&gt;
			default = 'line',&lt;br /&gt;
			existing_values_only = true,&lt;br /&gt;
			input_type = 'combobox',&lt;br /&gt;
			placeholder = 'Pick one!',&lt;br /&gt;
			restricted = global.restrictedTo,&lt;br /&gt;
		},&lt;br /&gt;
		td_type = 'line',&lt;br /&gt;
		values = {'unknown', 'number', 'string', 'line', 'boolean', 'date', 'wiki-page-name', 'wiki-file-name', 'wiki-user-name', 'content', 'unbalanced-wikitext'},&lt;br /&gt;
	},&lt;br /&gt;
	values = {&lt;br /&gt;
		cardinality = 'list',&lt;br /&gt;
		description = 'A list of values for this parameter. Depending on SEVERITY and EXISTING VALUES ONLY, the parameter maybe is restricted to this values.',&lt;br /&gt;
		label = 'List of values',&lt;br /&gt;
		severity = 'suggested',&lt;br /&gt;
		sf = {&lt;br /&gt;
			input_type = 'tokens',&lt;br /&gt;
			placeholder = 'Predefined values',&lt;br /&gt;
			restricted = global.restrictedTo,&lt;br /&gt;
		},&lt;br /&gt;
		td_type = 'line',&lt;br /&gt;
	},&lt;br /&gt;
	-- here we start with the basic sf attributes&lt;br /&gt;
	-- note on 'cargo_field' and 'cargo_table': these fields will be calculated dynamicall in object initialization, not in form. field will be set to parameter name and table will be set to cargo table.&lt;br /&gt;
	-- add them somewhere either way for automatic processing&lt;br /&gt;
	add_cargo_table_and_field = {&lt;br /&gt;
		cardinality = 'single',&lt;br /&gt;
		description = 'Should the \'cargo table=\' and \'cargo field=\' statements be added to this? Fails, if no table is secified in GENERAL-Section!',	-- do not use a &amp;quot; or templateDocumentation will fail!&lt;br /&gt;
		label = 'Add cargo linking',&lt;br /&gt;
		severity = 'suggested',	-- should be mandatory but cannot, sinc it is part of a show_on_select that is not detected automatically&lt;br /&gt;
		sf = {&lt;br /&gt;
			hidden = false,&lt;br /&gt;
			input_type = 'radiobutton',&lt;br /&gt;
			restricted = global.restrictedTo,&lt;br /&gt;
		},&lt;br /&gt;
		td_default = 'No',&lt;br /&gt;
		td_type = 'boolean',&lt;br /&gt;
		values = {'Yes', 'No'},&lt;br /&gt;
	},&lt;br /&gt;
	cargo_field = {&lt;br /&gt;
		cardinality = 'single',&lt;br /&gt;
		description = 'This is the cargo field, sf attaches to this field. Automatically set to fieldname, if add_cargo_table_and_field is selected',	-- do not use a &amp;quot; or templateDocumentation will fail!&lt;br /&gt;
		label = 'Cargo field',&lt;br /&gt;
		severity = 'suggested',&lt;br /&gt;
	},&lt;br /&gt;
	cargo_table = {&lt;br /&gt;
		cardinality = 'single',&lt;br /&gt;
		description = 'This is the cargo table, sf attaches to this field. Automatically set to global table, if add_cargo_table_and_field is selected',	-- do not use a &amp;quot; or templateDocumentation will fail!&lt;br /&gt;
		label = 'Cargo table',&lt;br /&gt;
		severity = 'suggested',&lt;br /&gt;
	},&lt;br /&gt;
	class = {&lt;br /&gt;
		cardinality = 'single',&lt;br /&gt;
		description = 'The css class for the input field for this parameter',	-- do not use a &amp;quot; or templateDocumentation will fail!&lt;br /&gt;
		label = 'CSS class',&lt;br /&gt;
		severity = 'suggested',&lt;br /&gt;
		sf = {&lt;br /&gt;
			input_type = 'text',&lt;br /&gt;
			placeholder = 'CSS Class',&lt;br /&gt;
			restricted = global.restrictedTo,&lt;br /&gt;
		},&lt;br /&gt;
		td_type = 'line',&lt;br /&gt;
	},&lt;br /&gt;
	default = {&lt;br /&gt;
		cardinality = 'single',&lt;br /&gt;
		description = 'Default value. Preset for this input field.',	-- do not use a &amp;quot; or templateDocumentation will fail!&lt;br /&gt;
		label = 'Default',&lt;br /&gt;
		severity = 'suggested',&lt;br /&gt;
		sf = {&lt;br /&gt;
			input_type = 'text',&lt;br /&gt;
			placeholder = 'Defaults to this',&lt;br /&gt;
			restricted = global.restrictedTo,&lt;br /&gt;
		},&lt;br /&gt;
		td_type = 'line',&lt;br /&gt;
	},&lt;br /&gt;
	hidden = {&lt;br /&gt;
		cardinality = 'single',&lt;br /&gt;
		description = 'Specifies that this field will be hidden in the form: used to preserve values in edited pages.',	-- do not use a &amp;quot; or templateDocumentation will fail!&lt;br /&gt;
		label = 'Hidden',&lt;br /&gt;
		severity = 'optional',&lt;br /&gt;
		sf = {&lt;br /&gt;
			input_type = 'radiobutton',&lt;br /&gt;
			restricted = global.restrictedTo,&lt;br /&gt;
		},&lt;br /&gt;
		td_type = 'boolean',&lt;br /&gt;
		values = {'true', 'false'},&lt;br /&gt;
	},&lt;br /&gt;
	holds_template = {&lt;br /&gt;
		cardinality = 'single',&lt;br /&gt;
		description = 'Specifies that this field will hold the results of another (multiple) template!',&lt;br /&gt;
		label = 'Holds template',&lt;br /&gt;
		severity = 'optional',&lt;br /&gt;
		sf = {&lt;br /&gt;
			hidden = true,	-- value will be filled by myArgumentProcessing depending on the setting of sf&lt;br /&gt;
			input_type = 'radiobutton',&lt;br /&gt;
			restricted = global.restrictedTo,&lt;br /&gt;
		},&lt;br /&gt;
		td_type = 'boolean',&lt;br /&gt;
		values = {'true', 'false'},&lt;br /&gt;
	},&lt;br /&gt;
	input_type = {&lt;br /&gt;
		cardinality = 'single',&lt;br /&gt;
		description = 'Specifies the type of input this field will have in the form.',	-- do not use a &amp;quot; or templateDocumentation will fail!&lt;br /&gt;
		label = 'Input type',&lt;br /&gt;
		severity = 'suggested',&lt;br /&gt;
		sf = {&lt;br /&gt;
			existing_values_only = true,&lt;br /&gt;
			input_type = 'Dropdown',&lt;br /&gt;
			placeholder = 'Pick one!',&lt;br /&gt;
			restricted = superglobal.restrictedTo,&lt;br /&gt;
			show_on_select = {},&lt;br /&gt;
		},&lt;br /&gt;
		td_type = 'line',&lt;br /&gt;
		values = {},-- this will be set to SFfield/config.validInputTypes by class. can't be done here w/o a lua error&lt;br /&gt;
	},&lt;br /&gt;
	restricted = {&lt;br /&gt;
		cardinality = 'single',&lt;br /&gt;
		description = 'Specifies that this field will be editable only by this user group. Use \'DEFAULT\' if you want this to be the globally defined restriction group.',&lt;br /&gt;
		label = 'Restricted',&lt;br /&gt;
		severity = 'optional',&lt;br /&gt;
		sf = {&lt;br /&gt;
			input_type = 'combobox',&lt;br /&gt;
			placeholder = 'User group',&lt;br /&gt;
			restricted = global.restrictedTo,&lt;br /&gt;
		},&lt;br /&gt;
		td_type = 'line',&lt;br /&gt;
		values = {'global.restrictedTo'},&lt;br /&gt;
	},&lt;br /&gt;
	unique = {&lt;br /&gt;
		cardinality = 'single',&lt;br /&gt;
		description = 'Specifies that the value entered for this field must be unique, i.e. must not be the same as any value for the SMW property (if SMW is being used) or Cargo field ' ..&lt;br /&gt;
			'(if Cargo is being used) corresponding to this form field.',&lt;br /&gt;
		label = 'Unique',&lt;br /&gt;
		severity = 'optional',&lt;br /&gt;
		sf = {&lt;br /&gt;
			input_type = 'Radiobutton',&lt;br /&gt;
			restricted = global.restrictedTo,&lt;br /&gt;
		},&lt;br /&gt;
		td_type = 'boolean',&lt;br /&gt;
		values = {'true', 'false'},&lt;br /&gt;
	},&lt;br /&gt;
	unique_for_category = {&lt;br /&gt;
		cardinality = 'single',&lt;br /&gt;
		description = 'Specifies that the value entered for this field must not be the same as the name of any page in the given category.',&lt;br /&gt;
		label = 'Unique for category',&lt;br /&gt;
		severity = 'optional',&lt;br /&gt;
		sf = {&lt;br /&gt;
			input_type = 'text',&lt;br /&gt;
			placeholder = 'Category name',&lt;br /&gt;
			restricted = global.restrictedTo,&lt;br /&gt;
		},&lt;br /&gt;
		td_type = 'line',&lt;br /&gt;
	},&lt;br /&gt;
	unique_for_concept = {&lt;br /&gt;
		cardinality = 'single',&lt;br /&gt;
		description = 'Specifies that the value entered for this field must not be the same as the name of any page in the given SMW concept.',&lt;br /&gt;
		label = 'Unique for concept',&lt;br /&gt;
		severity = 'optional',&lt;br /&gt;
		sf = {&lt;br /&gt;
			hidden = false,	-- true, if no smw datastore&lt;br /&gt;
			input_type = 'text',&lt;br /&gt;
			placeholder = 'Concept name',&lt;br /&gt;
			restricted = global.restrictedTo,&lt;br /&gt;
		},&lt;br /&gt;
		td_type = 'line',&lt;br /&gt;
	},&lt;br /&gt;
	unique_for_namespace = {&lt;br /&gt;
		cardinality = 'single',&lt;br /&gt;
		description = 'Specifies that the value entered for this field must not be the same as the name of any page in the given namespace.',&lt;br /&gt;
		label = 'Unique for namespace',&lt;br /&gt;
		severity = 'optional',&lt;br /&gt;
		sf = {&lt;br /&gt;
			input_type = 'text',&lt;br /&gt;
			placeholder = 'Namespace name',&lt;br /&gt;
			restricted = global.restrictedTo,&lt;br /&gt;
		},&lt;br /&gt;
		td_type = 'boolean',&lt;br /&gt;
	},&lt;br /&gt;
	uploadable = {&lt;br /&gt;
		cardinality = 'single',&lt;br /&gt;
		description = 'Is this a text input field that refers to a file and do you want the user to be able to upload that file right here?',	-- do not use a &amp;quot; or templateDocumentation will fail!&lt;br /&gt;
		label = 'Uploadable',&lt;br /&gt;
		severity = 'optional',&lt;br /&gt;
		sf = {&lt;br /&gt;
			input_type = 'radiobutton',&lt;br /&gt;
			restricted = global.restrictedTo,&lt;br /&gt;
			show_on_select = {},&lt;br /&gt;
		},&lt;br /&gt;
		td_type = 'boolean',&lt;br /&gt;
		values = {'true', 'false'},&lt;br /&gt;
	},&lt;br /&gt;
	default_filename = {&lt;br /&gt;
		cardinality = 'single',&lt;br /&gt;
		description = 'Specifies the default filename for files uploaded with this field.',	-- do not use a &amp;quot; or templateDocumentation will fail!&lt;br /&gt;
		label = 'Default filename',&lt;br /&gt;
		severity = 'optional',&lt;br /&gt;
		sf = {&lt;br /&gt;
			input_type = 'text',&lt;br /&gt;
			placeholder = 'Your filename default',&lt;br /&gt;
			restricted = global.restrictedTo,&lt;br /&gt;
		},&lt;br /&gt;
		td_type = 'line',&lt;br /&gt;
	},&lt;br /&gt;
	image_preview = {&lt;br /&gt;
		cardinality = 'single',&lt;br /&gt;
		description = 'Specifies that a thumbnail of the uploaded image should be placed under the field in the form.',	-- do not use a &amp;quot; or templateDocumentation will fail!&lt;br /&gt;
		label = 'Image preview',&lt;br /&gt;
		severity = 'optional',&lt;br /&gt;
		sf = {&lt;br /&gt;
			default = 'true',&lt;br /&gt;
			input_type = 'radiobutton',&lt;br /&gt;
			restricted = global.restrictedTo,&lt;br /&gt;
		},&lt;br /&gt;
		td_type = 'boolean',&lt;br /&gt;
		values = {'true', 'false'},&lt;br /&gt;
	},&lt;br /&gt;
	-- here comes the type dependent attributes&lt;br /&gt;
	autogrow = {&lt;br /&gt;
		cardinality = 'single',&lt;br /&gt;
		description = 'You can set a default for the autogrow attribute of your textarea fields',	-- do not use a &amp;quot; or templateDocumentation will fail!&lt;br /&gt;
		label = 'textarea autogrow',&lt;br /&gt;
		severity = 'optional',&lt;br /&gt;
		sf = {&lt;br /&gt;
			existing_values_only = true,&lt;br /&gt;
			input_type = 'radiobutton',&lt;br /&gt;
			restricted = global.restrictedTo,&lt;br /&gt;
		},&lt;br /&gt;
		td_type = 'boolean',&lt;br /&gt;
		values = {'true', 'false'},&lt;br /&gt;
	},&lt;br /&gt;
	base_type = {&lt;br /&gt;
		cardinality = 'single',&lt;br /&gt;
		description = 'The base type for this regular expression field',	-- do not use a &amp;quot; or templateDocumentation will fail!&lt;br /&gt;
		label = 'Base type',&lt;br /&gt;
		severity = 'optional',&lt;br /&gt;
		sf = {&lt;br /&gt;
			default = 'text',&lt;br /&gt;
			input_type = 'dropdown',&lt;br /&gt;
			restricted = global.restrictedTo,&lt;br /&gt;
		},&lt;br /&gt;
		td_type = 'line',&lt;br /&gt;
		values = {},&lt;br /&gt;
	},&lt;br /&gt;
	cols = {&lt;br /&gt;
		cardinality = 'single',&lt;br /&gt;
		description = 'You can set a default for the columns attribute of your textarea fields',	-- do not use a &amp;quot; or templateDocumentation will fail!&lt;br /&gt;
		label = 'textarea cols',&lt;br /&gt;
		severity = 'optional',&lt;br /&gt;
		sf = {&lt;br /&gt;
			input_type = 'regexp',&lt;br /&gt;
			maxlength = 3,&lt;br /&gt;
			placeholder = '#of cols',&lt;br /&gt;
			regexp = '^[0-9]*$',&lt;br /&gt;
			restricted = global.restrictedTo,&lt;br /&gt;
		},&lt;br /&gt;
		td_type = 'number',&lt;br /&gt;
	},&lt;br /&gt;
	date_format = {&lt;br /&gt;
		cardinality = 'single',&lt;br /&gt;
		description = 'The date format string. It is only used for date display in the input field. See https://www.mediawiki.org/wiki/Extension:Semantic_Forms_Inputs#Parameters for more information.',&lt;br /&gt;
		label = 'date format',&lt;br /&gt;
		severity = 'suggested',&lt;br /&gt;
		sf = {&lt;br /&gt;
			default = 'dd.mm.yyyy',&lt;br /&gt;
			input_type = 'text',&lt;br /&gt;
			placeholder = 'format',&lt;br /&gt;
			restricted = global.restrictedTo,&lt;br /&gt;
		},&lt;br /&gt;
		td_type = 'line',&lt;br /&gt;
	},&lt;br /&gt;
	disable_dates = {&lt;br /&gt;
		cardinality = 'list',&lt;br /&gt;
		description = 'Comma-separated list of disabled dates/date ranges (dates in yyyy/mm/dd format, ranges in yyyy/mm/dd-yyyy/mm/dd format)',&lt;br /&gt;
		label = 'disabled dates',&lt;br /&gt;
		severity = 'suggested',&lt;br /&gt;
		sf = {&lt;br /&gt;
			input_type = 'text',&lt;br /&gt;
			placeholder = 'yyyy/mm/dd format',&lt;br /&gt;
			restricted = global.restrictedTo,&lt;br /&gt;
		},&lt;br /&gt;
		td_type = 'line',&lt;br /&gt;
	},&lt;br /&gt;
	disable_days_of_week = {&lt;br /&gt;
		cardinality = 'list',&lt;br /&gt;
		description = 'List of days that can not be selected (e.g. weekend: 6, 0)',&lt;br /&gt;
		label = 'disabled days of week',&lt;br /&gt;
		severity = 'suggested',&lt;br /&gt;
		sf = {&lt;br /&gt;
			input_type = 'checkboxes',&lt;br /&gt;
			restricted = global.restrictedTo,&lt;br /&gt;
		},&lt;br /&gt;
		td_type = 'line',&lt;br /&gt;
		values = {0, 1, 2, 3, 4, 5, 6},&lt;br /&gt;
	},&lt;br /&gt;
	disable_input_field = {&lt;br /&gt;
		cardinality = 'single',&lt;br /&gt;
		description = 'If the user shall be able to fill the input field directly or only via the menu.',	-- do not use a &amp;quot; or templateDocumentation will fail!&lt;br /&gt;
		label = 'Disable input field',&lt;br /&gt;
		severity = 'optional',&lt;br /&gt;
		sf = {&lt;br /&gt;
			default = 'false',&lt;br /&gt;
			input_type = 'radiobutton',&lt;br /&gt;
			restricted = global.restrictedTo,&lt;br /&gt;
		},&lt;br /&gt;
		td_type = 'boolean',&lt;br /&gt;
		values = {'true', 'false'},&lt;br /&gt;
	},&lt;br /&gt;
	editor = {&lt;br /&gt;
		cardinality = 'single',&lt;br /&gt;
		description = 'You can set a default for the editor attribute of your textarea fields. As of now, semantic forms only supports wikieditor (or none).',	-- do not use a &amp;quot; or templateDocumentation will fail!&lt;br /&gt;
		label = 'textarea editor',&lt;br /&gt;
		severity = 'optional',&lt;br /&gt;
		sf = {&lt;br /&gt;
			input_type = 'text with autocomplete',&lt;br /&gt;
			placeholder = '\'wikieditor\' or \'none\'',&lt;br /&gt;
			restricted = global.restrictedTo,&lt;br /&gt;
		},&lt;br /&gt;
		td_type = 'line',&lt;br /&gt;
	},&lt;br /&gt;
	enable_input_field = {&lt;br /&gt;
		cardinality = 'single',&lt;br /&gt;
		description = 'If the user shall be able to fill the input field directly or only via the menu.',	-- do not use a &amp;quot; or templateDocumentation will fail!&lt;br /&gt;
		label = 'Enable input field',&lt;br /&gt;
		severity = 'optional',&lt;br /&gt;
		sf = {&lt;br /&gt;
			default = 'true',&lt;br /&gt;
			input_type = 'radiobutton',&lt;br /&gt;
			restricted = global.restrictedTo,&lt;br /&gt;
		},&lt;br /&gt;
		td_type = 'boolean',&lt;br /&gt;
		values = {'true', 'false'},&lt;br /&gt;
	},&lt;br /&gt;
	existing_values_only = {&lt;br /&gt;
		cardinality = 'single',&lt;br /&gt;
		description = 'Set a combo box or tokens to only allow the autocomplete values, and not any arbitrary values, thus having it function even more like a dropdown.',	-- do not use a &amp;quot; or templateDocumentation will fail!&lt;br /&gt;
		label = 'Existing_values_only',&lt;br /&gt;
		severity = 'optional',&lt;br /&gt;
		sf = {&lt;br /&gt;
			default = 'false',&lt;br /&gt;
			existing_values_only = true,&lt;br /&gt;
			input_type = 'radiobutton',&lt;br /&gt;
			restricted = global.restrictedTo,&lt;br /&gt;
		},&lt;br /&gt;
		td_type = 'boolean',&lt;br /&gt;
		values = {'true', 'false'},&lt;br /&gt;
	},&lt;br /&gt;
	first_date = {&lt;br /&gt;
		cardinality = 'single',&lt;br /&gt;
		description = 'The first date that can be chosen (in yyyy/mm/dd format)',&lt;br /&gt;
		label = 'first date',&lt;br /&gt;
		severity = 'suggested',&lt;br /&gt;
		sf = {&lt;br /&gt;
			input_type = 'text',&lt;br /&gt;
			placeholder = 'yyyy/mm/dd format',&lt;br /&gt;
			restricted = global.restrictedTo,&lt;br /&gt;
		},&lt;br /&gt;
		td_type = 'line',&lt;br /&gt;
	},&lt;br /&gt;
	hide_reset_button = {&lt;br /&gt;
		cardinality = 'single',&lt;br /&gt;
		description = 'If a reset button shall be shown. This is the only way for the user to erase the input field if it is disabled for direct input.',&lt;br /&gt;
		label = 'hide reset button',&lt;br /&gt;
		severity = 'optional',&lt;br /&gt;
		sf = {&lt;br /&gt;
			input_type = 'radiobutton',&lt;br /&gt;
			restricted = global.restrictedTo,&lt;br /&gt;
		},&lt;br /&gt;
		td_type = 'boolean',&lt;br /&gt;
		values = {'true', 'false'},&lt;br /&gt;
	},&lt;br /&gt;
	hide_week_numbers = {&lt;br /&gt;
		cardinality = 'single',&lt;br /&gt;
		description = ' If week numbers shall be shown left of the week.',&lt;br /&gt;
		label = 'hide week numbers',&lt;br /&gt;
		severity = 'optional',&lt;br /&gt;
		sf = {&lt;br /&gt;
			input_type = 'radiobutton',&lt;br /&gt;
			restricted = global.restrictedTo,&lt;br /&gt;
		},&lt;br /&gt;
		td_type = 'boolean',&lt;br /&gt;
		values = {'true', 'false'},&lt;br /&gt;
	},&lt;br /&gt;
	highlight_dates = {&lt;br /&gt;
		cardinality = 'list',&lt;br /&gt;
		description = 'Comma-separated list of disabled dates/date ranges that shall appear highlighted (dates in yyyy/mm/dd format, ranges in yyyy/mm/dd-yyyy/mm/dd format)',&lt;br /&gt;
		label = 'highlighted dates',&lt;br /&gt;
		severity = 'suggested',&lt;br /&gt;
		sf = {&lt;br /&gt;
			input_type = 'text',&lt;br /&gt;
			placeholder = 'yyyy/mm/dd format',&lt;br /&gt;
			restricted = global.restrictedTo,&lt;br /&gt;
		},&lt;br /&gt;
		td_type = 'line',&lt;br /&gt;
	},&lt;br /&gt;
	highlight_days_of_week = {&lt;br /&gt;
		cardinality = 'list',&lt;br /&gt;
		description = 'List of days that shall appear highlighted (e.g. weekend: 6, 0)',&lt;br /&gt;
		label = 'highlighted days of week',&lt;br /&gt;
		severity = 'suggested',&lt;br /&gt;
		sf = {&lt;br /&gt;
			default = '6,0',&lt;br /&gt;
			input_type = 'checkboxes',&lt;br /&gt;
			restricted = global.restrictedTo,&lt;br /&gt;
		},&lt;br /&gt;
		td_type = 'line',&lt;br /&gt;
		values = {0, 1, 2, 3, 4, 5, 6},&lt;br /&gt;
	},&lt;br /&gt;
	include_timezone = {&lt;br /&gt;
		cardinality = 'single',&lt;br /&gt;
		description = 'Specifies that a time zone field should be included.',&lt;br /&gt;
		label = 'include timezone',&lt;br /&gt;
		severity = 'optional',&lt;br /&gt;
		sf = {&lt;br /&gt;
			input_type = 'radiobutton',&lt;br /&gt;
			restricted = global.restrictedTo,&lt;br /&gt;
		},&lt;br /&gt;
		td_type = 'boolean',&lt;br /&gt;
		values = {'true', 'false'},&lt;br /&gt;
	},&lt;br /&gt;
	last_date = {&lt;br /&gt;
		cardinality = 'single',&lt;br /&gt;
		description = 'The last date that can be chosen (in yyyy/mm/dd format)',&lt;br /&gt;
		label = 'last date',&lt;br /&gt;
		severity = 'suggested',&lt;br /&gt;
		sf = {&lt;br /&gt;
			input_type = 'text',&lt;br /&gt;
			placeholder = 'yyyy/mm/dd format',&lt;br /&gt;
			restricted = global.restrictedTo,&lt;br /&gt;
		},&lt;br /&gt;
		td_type = 'line',&lt;br /&gt;
	},&lt;br /&gt;
	mapping_cargo_field = {&lt;br /&gt;
		cardinality = 'single',&lt;br /&gt;
		description = 'Tries to map autocomplete values via cargo. Can only be used for fields that select pages. You have to specifiy CARGO_TABLE for this to work, as well!',&lt;br /&gt;
		label = 'Mapping cargo field',&lt;br /&gt;
		severity = 'optional',&lt;br /&gt;
		sf = {&lt;br /&gt;
			hidden = false,&lt;br /&gt;
			input_type = 'text',&lt;br /&gt;
			placeholder = 'map via cargo table',&lt;br /&gt;
			restricted = global.restrictedTo,&lt;br /&gt;
		},&lt;br /&gt;
		td_type = 'line',&lt;br /&gt;
	},&lt;br /&gt;
	mapping_cargo_table = {&lt;br /&gt;
		cardinality = 'single',&lt;br /&gt;
		description = 'Tries to map autocomplete values via cargo. Can only be used for fields that select pages. You have to specifiy CARGO_FIELD for this to work, as well!',&lt;br /&gt;
		label = 'Mapping cargo table',&lt;br /&gt;
		severity = 'optional',&lt;br /&gt;
		sf = {&lt;br /&gt;
			hidden = false,&lt;br /&gt;
			input_type = 'text',&lt;br /&gt;
			placeholder = 'map via cargo table',&lt;br /&gt;
			restricted = global.restrictedTo,&lt;br /&gt;
		},&lt;br /&gt;
		td_type = 'line',&lt;br /&gt;
	},&lt;br /&gt;
	mapping_property = {&lt;br /&gt;
		cardinality = 'single',&lt;br /&gt;
		description = 'Tries to map autocomplete values via smw. Can only be used for fields that select pages.',&lt;br /&gt;
		label = 'Mapping property',&lt;br /&gt;
		severity = 'optional',&lt;br /&gt;
		sf = {&lt;br /&gt;
			hidden = false,&lt;br /&gt;
			input_type = 'text',&lt;br /&gt;
			placeholder = 'map via property',&lt;br /&gt;
			restricted = global.restrictedTo,&lt;br /&gt;
		},&lt;br /&gt;
		td_type = 'line',&lt;br /&gt;
	},&lt;br /&gt;
	mapping_template = {&lt;br /&gt;
		cardinality = 'single',&lt;br /&gt;
		description = 'Takes in the name of a \'mapping template\' (a template that takes in a single, unnamed parameter, i.e. {{{1|}}}, and displays a \'mapped\' string as a result), ' ..&lt;br /&gt;
			'and uses that template to map every potential value, so that the values\' \'aliases\' appear on the screen, and not the values themselves. Takes only the name of the template w/o namespace.',&lt;br /&gt;
		label = 'Mapping template',&lt;br /&gt;
		severity = 'optional',&lt;br /&gt;
		sf = {&lt;br /&gt;
			input_type = 'text',&lt;br /&gt;
			placeholder = 'template name',&lt;br /&gt;
			restricted = global.restrictedTo,&lt;br /&gt;
		},&lt;br /&gt;
		td_type = 'line',&lt;br /&gt;
	},&lt;br /&gt;
	max_values = {&lt;br /&gt;
		cardinality = 'single',&lt;br /&gt;
		description = 'Used for input type tokens; specifies the maximum number of values that can be entered in a field that holds multiple values.',	-- do not use a &amp;quot; or templateDocumentation will fail!&lt;br /&gt;
		label = 'Max values',&lt;br /&gt;
		severity = 'optional',&lt;br /&gt;
		sf = {&lt;br /&gt;
			input_type = 'regexp',&lt;br /&gt;
			maxlength = 3,&lt;br /&gt;
			placeholder = 'max # of values',&lt;br /&gt;
			regexp = '^[0-9]*$',&lt;br /&gt;
			restricted = global.restrictedTo,&lt;br /&gt;
		},&lt;br /&gt;
		td_type = 'number',&lt;br /&gt;
	},&lt;br /&gt;
	maxlength = {&lt;br /&gt;
		cardinality = 'single',&lt;br /&gt;
		description = 'Used for text and textarea fields. Specifies the maximum allowed length of the input.',	-- do not use a &amp;quot; or templateDocumentation will fail!&lt;br /&gt;
		label = 'Maxlength',&lt;br /&gt;
		severity = 'optional',&lt;br /&gt;
		sf = {&lt;br /&gt;
			input_type = 'regexp',&lt;br /&gt;
			maxlength = 3,&lt;br /&gt;
			placeholder = 'Maximum length',&lt;br /&gt;
			regexp = '^[0-9]*$',&lt;br /&gt;
			restricted = global.restrictedTo,&lt;br /&gt;
		},&lt;br /&gt;
		td_type = 'number',&lt;br /&gt;
	},&lt;br /&gt;
	message = {&lt;br /&gt;
		cardinality = 'single',&lt;br /&gt;
		description = 'Used as user feedback message in case the regex did not match with the input.',	-- do not use a &amp;quot; or templateDocumentation will fail!&lt;br /&gt;
		label = 'Message',&lt;br /&gt;
		severity = 'suggested',&lt;br /&gt;
		sf = {&lt;br /&gt;
			input_type = 'text',&lt;br /&gt;
			placeholder = 'Feedback message',&lt;br /&gt;
			restricted = global.restrictedTo,&lt;br /&gt;
		},&lt;br /&gt;
		td_type = 'line',&lt;br /&gt;
	},&lt;br /&gt;
	placeholder = {&lt;br /&gt;
		cardinality = 'single',&lt;br /&gt;
		description = 'Used for the text, textarea, combobox and tokens fields. Specifies help text that is displayed in the input until the user clicks on it.',	-- do not use a &amp;quot; or templateDocumentation will fail!&lt;br /&gt;
		label = 'Placeholder',&lt;br /&gt;
		severity = 'suggested',&lt;br /&gt;
		sf = {&lt;br /&gt;
			input_type = 'text',&lt;br /&gt;
			placeholder = 'Placeholder(placeholder)',&lt;br /&gt;
			restricted = global.restrictedTo,&lt;br /&gt;
		},&lt;br /&gt;
		td_type = 'line',&lt;br /&gt;
	},&lt;br /&gt;
	regexp = {&lt;br /&gt;
		cardinality = 'single',&lt;br /&gt;
		description = 'If you set \'input type\' to regexp, this specifies your regular expression the input has to match to be valid. ' ..&lt;br /&gt;
			'This must be given including the slashes, e.g. \'/^[0-9]+/\'! Defaults to /.*/, i.e. any value.',&lt;br /&gt;
		label = 'Regexp',&lt;br /&gt;
		severity = 'mandatory',&lt;br /&gt;
		sf = {&lt;br /&gt;
			default = '/^[0-9]+$/',&lt;br /&gt;
			input_type = 'text',&lt;br /&gt;
			placeholder = 'Regular expression',&lt;br /&gt;
			restricted = global.restrictedTo,&lt;br /&gt;
		},&lt;br /&gt;
		td_type = 'line',&lt;br /&gt;
	},&lt;br /&gt;
	rows = {&lt;br /&gt;
		cardinality = 'single',&lt;br /&gt;
		description = 'You can set a default for the rows attribute of your textarea fields',	-- do not use a &amp;quot; or templateDocumentation will fail!&lt;br /&gt;
		label = 'textarea rows',&lt;br /&gt;
		severity = 'optional',&lt;br /&gt;
		sf = {&lt;br /&gt;
			input_type = 'regexp',&lt;br /&gt;
			maxlength = 2,&lt;br /&gt;
			placeholder = '#of rows',&lt;br /&gt;
			regexp = '^[0-9]*$',&lt;br /&gt;
			restricted = global.restrictedTo,&lt;br /&gt;
		},&lt;br /&gt;
		td_type = 'number',&lt;br /&gt;
	},&lt;br /&gt;
	size = {&lt;br /&gt;
		cardinality = 'single',&lt;br /&gt;
		description = 'Used for text entries, combobox, tokens and listbox. For the first three it specifies the width, in characters; for a listbox it specifies the height. If not set, will be defaulted as set in FORM-Section.',&lt;br /&gt;
		label = 'Size',&lt;br /&gt;
		severity = 'optional',&lt;br /&gt;
		sf = {&lt;br /&gt;
			input_type = 'regexp',&lt;br /&gt;
			maxlength = 3,&lt;br /&gt;
			regexp = '^[0-9]*$',&lt;br /&gt;
			placeholder = 'Maximum size',&lt;br /&gt;
			restricted = global.restrictedTo,&lt;br /&gt;
		},&lt;br /&gt;
		td_type = 'number',&lt;br /&gt;
	},&lt;br /&gt;
	show_on_select = {&lt;br /&gt;
		cardinality = 'list',&lt;br /&gt;
		description = 'Can be used for inputs of type \'checkbox\', \'checkboxes\', \'radiobutton\', \'dropdown\' and \'listbox\' to specify that one or more tags ' ..&lt;br /&gt;
			'with a certain ID should only be displayed to the user if a certain value (or values) is selected within that input. Use entries in the form \'value=field\'. ' ..&lt;br /&gt;
			'All fields will be prefixed by a globaly configured prefix string. See Module:SFfield/class for more information.',&lt;br /&gt;
		label = 'Show on select',&lt;br /&gt;
		severity = 'optional',&lt;br /&gt;
		sf = {&lt;br /&gt;
			input_type = 'tokens',&lt;br /&gt;
			placeholder = 'value &amp;amp;#61; fieldname',&lt;br /&gt;
			restricted = global.restrictedTo,&lt;br /&gt;
		},&lt;br /&gt;
		td_type = 'string',&lt;br /&gt;
	},&lt;br /&gt;
	show_reset_button = {&lt;br /&gt;
		cardinality = 'single',&lt;br /&gt;
		description = 'If a reset button shall be shown. This is the only way for the user to erase the input field if it is disabled for direct input.',&lt;br /&gt;
		label = 'show reset button',&lt;br /&gt;
		severity = 'optional',&lt;br /&gt;
		sf = {&lt;br /&gt;
			default = 'true',&lt;br /&gt;
			input_type = 'radiobutton',&lt;br /&gt;
			restricted = global.restrictedTo,&lt;br /&gt;
		},&lt;br /&gt;
		td_type = 'boolean',&lt;br /&gt;
		values = {'true', 'false'},&lt;br /&gt;
	},&lt;br /&gt;
	show_week_numbers = {&lt;br /&gt;
		cardinality = 'single',&lt;br /&gt;
		description = ' If week numbers shall be shown left of the week.',&lt;br /&gt;
		label = 'show week numbers',&lt;br /&gt;
		severity = 'optional',&lt;br /&gt;
		sf = {&lt;br /&gt;
			default = 'true',&lt;br /&gt;
			input_type = 'radiobutton',&lt;br /&gt;
			restricted = global.restrictedTo,&lt;br /&gt;
		},&lt;br /&gt;
		td_type = 'boolean',&lt;br /&gt;
		values = {'true', 'false'},&lt;br /&gt;
	},&lt;br /&gt;
	structure = {&lt;br /&gt;
		cardinality = 'single',&lt;br /&gt;
		description = 'The structure of your menu. Please use mediawiki ul notation. * for first lavel, ** for second, ... One entry per line',	-- do not use a &amp;quot; or templateDocumentation will fail!&lt;br /&gt;
		label = 'Structure',&lt;br /&gt;
		severity = 'mandatory',&lt;br /&gt;
		sf = {&lt;br /&gt;
			input_type = 'textarea',&lt;br /&gt;
			placeholder = '* first layer\n**second layer',&lt;br /&gt;
			restricted = global.restrictedTo,&lt;br /&gt;
			rows = 7,&lt;br /&gt;
		},&lt;br /&gt;
		td_type = 'string',&lt;br /&gt;
	},&lt;br /&gt;
	values_dependent_on = {&lt;br /&gt;
		cardinality = 'single',&lt;br /&gt;
		description = 'Can be used for inputs of type \'combobox\', \'text with autocomplete\', \'textarea with autocomplete\' and \'tokens\'. Specifies that the ' ..&lt;br /&gt;
			'current set of allowed values for this field are all the values taken by this same field from pages where \'field name\' is equal to the value selected for \'field name\' in the current form.',&lt;br /&gt;
		label = 'Values dependent on',&lt;br /&gt;
		severity = 'optional',&lt;br /&gt;
		sf = {&lt;br /&gt;
			input_type = 'text',&lt;br /&gt;
			placeholder = 'template name[field name]',&lt;br /&gt;
			restricted = global.restrictedTo,&lt;br /&gt;
		},&lt;br /&gt;
		td_type = 'line',&lt;br /&gt;
	},&lt;br /&gt;
	values_from_category = {&lt;br /&gt;
		cardinality = 'single',&lt;br /&gt;
		description = 'Similar to values=, but gets its values from the names of all pages belonging to a specific category.',	-- do not use a &amp;quot; or templateDocumentation will fail!&lt;br /&gt;
		label = 'Values from category',&lt;br /&gt;
		severity = 'optional',&lt;br /&gt;
		sf = {&lt;br /&gt;
			input_type = 'text',&lt;br /&gt;
			placeholder = 'Category name',&lt;br /&gt;
			restricted = global.restrictedTo,&lt;br /&gt;
		},&lt;br /&gt;
		td_type = 'line',&lt;br /&gt;
	},&lt;br /&gt;
	values_from_concept = {&lt;br /&gt;
		cardinality = 'single',&lt;br /&gt;
		description = 'Similar to values=, but gets its values from the names of all pages belonging to a specific SMW concept.',	-- do not use a &amp;quot; or templateDocumentation will fail!&lt;br /&gt;
		label = 'Values from concept',&lt;br /&gt;
		severity = 'optional',&lt;br /&gt;
		sf = {&lt;br /&gt;
			hidden = false,&lt;br /&gt;
			input_type = 'text',&lt;br /&gt;
			placeholder = 'Concept name',&lt;br /&gt;
			restricted = global.restrictedTo,&lt;br /&gt;
		},&lt;br /&gt;
		td_type = 'line',&lt;br /&gt;
	},&lt;br /&gt;
	values_from_namespace = {&lt;br /&gt;
		cardinality = 'single',&lt;br /&gt;
		description = 'Similar to values=, but gets its values from the names of all pages belonging to a specific namespace.',	-- do not use a &amp;quot; or templateDocumentation will fail!&lt;br /&gt;
		label = 'Values from namespace',&lt;br /&gt;
		severity = 'optional',&lt;br /&gt;
		sf = {&lt;br /&gt;
			input_type = 'text',&lt;br /&gt;
			placeholder = 'Namespace name',&lt;br /&gt;
			restricted = global.restrictedTo,&lt;br /&gt;
		},&lt;br /&gt;
		td_type = 'line',&lt;br /&gt;
	},&lt;br /&gt;
	week_start = {&lt;br /&gt;
		cardinality = 'single',&lt;br /&gt;
		description = 'The first day of the week (0 - Sunday, 1 - Monday, ...)',&lt;br /&gt;
		label = 'Week start',&lt;br /&gt;
		severity = 'optional',&lt;br /&gt;
		sf = {&lt;br /&gt;
			default = 1,&lt;br /&gt;
			input_type = 'radiobutton',&lt;br /&gt;
			restricted = global.restrictedTo,&lt;br /&gt;
		},&lt;br /&gt;
		td_type = 'number',&lt;br /&gt;
		values = {0, 1, 2, 3, 4, 5, 6},&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
parameter.sf.sf.show_on_select['Holds template'] = {'cardinality', 'severity', 'td_default', 'td_type', 'values'}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
return {&lt;br /&gt;
	form = form,&lt;br /&gt;
	global = global,&lt;br /&gt;
	parameter = parameter,&lt;br /&gt;
	template = template,&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Anatol</name></author>
	</entry>
	<entry>
		<id>https://camnet.oetterer.eu/index.php?title=Modul:Classgenerator/parameter/class&amp;diff=1002</id>
		<title>Modul:Classgenerator/parameter/class</title>
		<link rel="alternate" type="text/html" href="https://camnet.oetterer.eu/index.php?title=Modul:Classgenerator/parameter/class&amp;diff=1002"/>
		<updated>2016-02-09T20:43:41Z</updated>

		<summary type="html">&lt;p&gt;Anatol: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local FoundationClass = require('Module:Foundationclass')&lt;br /&gt;
local ClassDebug = require('Module:Debug/class')&lt;br /&gt;
&lt;br /&gt;
-- ****************************************************************&lt;br /&gt;
-- *                         inheritance                          *&lt;br /&gt;
-- ****************************************************************&lt;br /&gt;
local ClassgeneratorParameter = FoundationClass:subclass('ClassgeneratorParameter')&lt;br /&gt;
-- setting class's configuration data&lt;br /&gt;
ClassgeneratorParameter.static.myConfiguration = mw.loadData('Module:Classgenerator/parameter/config')&lt;br /&gt;
ClassgeneratorParameter.static.SFfieldConfig = mw.loadData('Module:SFfield/config')&lt;br /&gt;
--ClassgeneratorParameter.static.myConfiguration = require('Module:Classgenerator/parameter/config')&lt;br /&gt;
--local SFfieldConfig = mw.loadData('Module:SFfield/config')&lt;br /&gt;
--ClassgeneratorParameter.static.myConfiguration.parameter.input_type.values = SFfieldConfig.validInputTypes	-- cant load a table from another config in my config. therefor this&lt;br /&gt;
--ClassgeneratorParameter.static.myConfiguration.parameter.base_type.values = SFfieldConfig.validInputTypes	-- cant load a table from another config in my config. therefor this&lt;br /&gt;
--   being in a static method, use self.myConfiguration&lt;br /&gt;
--   being in a private method, that knows self or in a public method, use self.class.myConfiguration&lt;br /&gt;
&lt;br /&gt;
-- ****************************************************************&lt;br /&gt;
-- *                          properties                          *&lt;br /&gt;
-- ****************************************************************&lt;br /&gt;
&lt;br /&gt;
-- **************** initialization of table for private properties&lt;br /&gt;
local _private = setmetatable({}, {__mode = 'k'})   -- weak table storing all private attributes&lt;br /&gt;
&lt;br /&gt;
-- **************** declaration of public static properties&lt;br /&gt;
-- ClassgeneratorParameter.static.myPropertyModule = require('Module:extern')&lt;br /&gt;
-- ClassgeneratorParameter.static.staticProperty = ' '&lt;br /&gt;
&lt;br /&gt;
-- remember the static classes provided by Foundationclass:&lt;br /&gt;
-- ClassgeneratorParameter.globalConfig&lt;br /&gt;
-- ClassgeneratorParameter.myCargoUtil&lt;br /&gt;
-- ClassgeneratorParameter.myTableTools&lt;br /&gt;
&lt;br /&gt;
-- **************** declaration of (global) private properties&lt;br /&gt;
-- for properties you should rather use constructor and _private[self]. this only, if you need a private class property&lt;br /&gt;
-- you should, however predeclare private methods here&lt;br /&gt;
local _debug	-- private method declared later&lt;br /&gt;
local _privateMethodAhead	-- declaration ahead, so this private method can be used in the constructor and in other private methods&lt;br /&gt;
&lt;br /&gt;
-- ***************************************************************&lt;br /&gt;
-- *                           methods                           *&lt;br /&gt;
-- ***************************************************************&lt;br /&gt;
 &lt;br /&gt;
-- **************** declaration of static methods&lt;br /&gt;
function ClassgeneratorParameter:initialize(uid)&lt;br /&gt;
	local _CFG = self.class.myConfiguration&lt;br /&gt;
	FoundationClass.initialize(self, uid)&lt;br /&gt;
	_private[self] = {&lt;br /&gt;
		dbg = ClassDebug:new(tostring(self.class) .. ': id ' .. uid),&lt;br /&gt;
	}&lt;br /&gt;
	_debug(self, 1, ' ClassgeneratorParameter: done initializing object &amp;amp;quot;' .. uid ..'&amp;amp;quot;, from ' .. tostring(self))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- use use self.myConfiguration to access your configuration in a static method&lt;br /&gt;
function ClassgeneratorParameter.static:aStaticMethod(var)&lt;br /&gt;
	_debug(self, 1, 'entering ClassgeneratorParameter.static:aStaticMethod() to do something, from ' .. tostring(self))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function ClassgeneratorParameter.static:mySfDynamicFieldAttribute(fieldname, attribute, value)&lt;br /&gt;
	_debug(self, 1, 'entering ClassgeneratorParameter.static:mySfDynamicFieldAttribute(fieldname, attribute, value), from ' .. tostring(self))&lt;br /&gt;
	_debug(self, 2, ' with parameters &amp;amp;quot;' .. fieldname .. '&amp;amp;quot;, &amp;amp;quot;' .. attribute .. '&amp;amp;quot; and a ' .. type(value) .. ' value')&lt;br /&gt;
	-- function that can process any attribute/value pair just before rendering the semantic forms field&lt;br /&gt;
	-- usually done, to generate a dynamic 'default' value&lt;br /&gt;
	-- keep in mind: you can completely disable a form field, if you return true on attribute &amp;quot;disable&amp;quot;. note however, that this causes the field to not show at all, no data will be transported/saved&lt;br /&gt;
	local val = value&lt;br /&gt;
	if FoundationClass.globalConfig.dataStore ~= 'cargo' and FoundationClass.globalConfig.dataStore ~= 'both' then&lt;br /&gt;
		-- disable all cargo fields&lt;br /&gt;
		if fieldname == 'cargo' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
		if fieldname == 'cargo_hidden' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
		if fieldname == 'cargo_size' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
		if fieldname == 'cargo_type' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
		if fieldname == 'add_cargo_table_and_field' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
		if fieldname == 'mapping_cargo_field' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
		if fieldname == 'mapping_cargo_table' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if FoundationClass.globalConfig.dataStore ~= 'smw' and FoundationClass.globalConfig.dataStore ~= 'both' then&lt;br /&gt;
		-- disable all smw fields&lt;br /&gt;
		if fieldname == 'property' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
		if fieldname == 'property_name' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
		if fieldname == 'property_type' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
		if fieldname == 'unique_for_concept' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
		if fieldname == 'mapping_property' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
		if fieldname == 'values_from_concept' and attribute == 'disable' then&lt;br /&gt;
			val = true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if fieldname == 'property_name' and attribute == 'values_from_namespace' then&lt;br /&gt;
		local ret, nulProperty = pcall(mw.title.new, 'NUL', 'Property')&lt;br /&gt;
		val = ret and mw.site.namespaces[nulProperty.namespace].name or 'NUL'&lt;br /&gt;
	end&lt;br /&gt;
	if fieldname == 'property_type' and attribute == 'values' then&lt;br /&gt;
		val = FoundationClass.globalConfig.smwPropertyTypesAvailable&lt;br /&gt;
	end&lt;br /&gt;
	if fieldname == 'input_type' and attribute == 'show_on_select' then&lt;br /&gt;
		-- build input type's show on select from SFfieldConfig.validAttributesPerType, except remove values and replace all spaces in attribte names by an underscore&lt;br /&gt;
		--val = mw.clone(ClassgeneratorParameter.SFfieldConfig.validAttributesPerType)&lt;br /&gt;
		--val = ClassgeneratorParameter.myTableTools.shallowClone(ClassgeneratorParameter.SFfieldConfig.validAttributesPerType)&lt;br /&gt;
		val = {}&lt;br /&gt;
		for param, attrlist in pairs(ClassgeneratorParameter.SFfieldConfig.validAttributesPerType) do&lt;br /&gt;
			if not val[param] then&lt;br /&gt;
				val[param] = {}&lt;br /&gt;
			end&lt;br /&gt;
			for k, attr in pairs(attrlist) do&lt;br /&gt;
				if attr ~= 'values' then&lt;br /&gt;
					val[param][k] = mw.ustring.gsub(attr, ' ', '_')&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		_debug(self, 2, ' calculated this monster: &amp;lt;pre&amp;gt;' .. ClassgeneratorParameter.myTableTools.printTable(val) .. '&amp;lt;/pre&amp;gt;')&lt;br /&gt;
	end&lt;br /&gt;
	if fieldname == 'input_type' and attribute == 'values' then&lt;br /&gt;
		return ClassgeneratorParameter.SFfieldConfig.validInputTypes&lt;br /&gt;
	end&lt;br /&gt;
	if fieldname == 'base_type' and attribute == 'values' then&lt;br /&gt;
		return ClassgeneratorParameter.SFfieldConfig.validInputTypes&lt;br /&gt;
	end&lt;br /&gt;
	if fieldname == 'uploadable' and attribute == 'show_on_select' then&lt;br /&gt;
		val = {}&lt;br /&gt;
		val['true'] = {'default_filename', 'image_preview'}&lt;br /&gt;
	end&lt;br /&gt;
	_debug(self, 3, '  returning ' .. (type(val) == 'boolean' and (val and 'true' or 'false') or type(val)))&lt;br /&gt;
	return val	-- this value will be used as new value for field's attribute&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function ClassgeneratorParameter.static:sfGenerateForm(embedIn)&lt;br /&gt;
	_debug(self, 1, 'entering ClassgeneratorParameter.static:sfGenerateForm()')&lt;br /&gt;
	local _CFG = self.myConfiguration&lt;br /&gt;
	local embedIn = embedIn or 'Classgenerator[parameter_parameter]'&lt;br /&gt;
	local tagStart = '{{{'&lt;br /&gt;
	local tagEnd = '}}}'&lt;br /&gt;
	-- create the table&lt;br /&gt;
	-- start the html object&lt;br /&gt;
	html = mw.html.create('')&lt;br /&gt;
	html:wikitext(tagStart .. 'for template|' .. _CFG.template.name .. '|label=' .. _CFG.global.entityTitle ..&lt;br /&gt;
		'|embed in field=' .. embedIn .. '|multiple|add button text=' .. _CFG.form.labelCreate .. '|minimum instances=1' .. tagEnd)&lt;br /&gt;
		:node(self:sfGenerateFormTable(self.myConfiguration.form.fieldOrderGeneral))&lt;br /&gt;
		:newline()&lt;br /&gt;
		:wikitext(':')&lt;br /&gt;
		:node(self:sfGenerateFormTable(self.myConfiguration.form.fieldOrderSFgeneral, 'row_parameter'))&lt;br /&gt;
		:newline()&lt;br /&gt;
		:wikitext('::')&lt;br /&gt;
		:node(self:sfGenerateFormTable(self.myConfiguration.form.fieldOrderSFtypeDependent))&lt;br /&gt;
		:wikitext(tagStart .. 'end template' .. tagEnd)&lt;br /&gt;
		:newline()&lt;br /&gt;
	return tostring(html)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- **************** declaration of private methods&lt;br /&gt;
-- use self.class.myConfiguration to access your configuration in a public or a private method that is called by a public method&lt;br /&gt;
_debug = function (self, level, text)&lt;br /&gt;
	if _private[self] and _private[self].dbg then&lt;br /&gt;
		_private[self].dbg:log(level, text)&lt;br /&gt;
	else&lt;br /&gt;
		ClassDebug:log(level, text, tostring(self) .. '.static')&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local _processAttribute = function (self, attr, indent)&lt;br /&gt;
	_debug(self, 1, 'entering private _processAttribute() to print a line for attribute ' .. attr .. ', from ' .. tostring(self))&lt;br /&gt;
	local coreData = self:getCoreData()&lt;br /&gt;
	local ret = ''&lt;br /&gt;
	local omissionList = {'name'}&lt;br /&gt;
	local attr = attr&lt;br /&gt;
	local val = coreData[attr]&lt;br /&gt;
	if type(val) == 'boolean' then&lt;br /&gt;
		val = val and 'true' or 'false'&lt;br /&gt;
	end&lt;br /&gt;
	if val and not ClassgeneratorParameter.myTableTools.inTable(omissionList, attr) then&lt;br /&gt;
		ret = indent .. attr .. ' = '&lt;br /&gt;
		if type(val) == 'table' then&lt;br /&gt;
			ret = ret .. ClassgeneratorParameter.myTableTools.printTable(val, 'inline')&lt;br /&gt;
		elseif val == 'true' or val == 'false' or attr == 'cargo_table' or (attr == 'restricted' and (val == 'global.restrictedTo' or val == 'superglobal.restrictedTo')) or mw.ustring.match(val, '^[0-9]+$') then&lt;br /&gt;
			ret = ret .. val&lt;br /&gt;
		else&lt;br /&gt;
			local valMangled = mw.text.trim(val)&lt;br /&gt;
			valMangled = mw.ustring.gsub(mw.ustring.gsub(valMangled, &amp;quot;\\'&amp;quot;, &amp;quot;'&amp;quot;), &amp;quot;'&amp;quot;, &amp;quot;\\'&amp;quot;)&lt;br /&gt;
			valMangled = mw.ustring.gsub(valMangled, '\n', '\\n\' ..\n' .. indent .. '\t\'')&lt;br /&gt;
			ret = ret .. &amp;quot;'&amp;quot; .. valMangled .. &amp;quot;'&amp;quot;	-- the gsub catches multiline input from textareas&lt;br /&gt;
		end&lt;br /&gt;
		ret = ret .. ','&lt;br /&gt;
		if self.class.myConfiguration.template.addCommentsToConfig then&lt;br /&gt;
			ret = ret .. '\t-- ' .. self.class.myConfiguration.parameter[attr].description&lt;br /&gt;
		end&lt;br /&gt;
		ret = ret .. '\n'&lt;br /&gt;
	end&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local _privateMethod = function (self)&lt;br /&gt;
	_debug(self, 1, 'entering private _privateMethod() to do something, from ' .. tostring(self))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- **************** declaration of public methods&lt;br /&gt;
-- use self.class.myConfiguration to access your configuration in a public method&lt;br /&gt;
function ClassgeneratorParameter:addInfobox()&lt;br /&gt;
	_debug(self, 1, 'entering ClassgeneratorParameter:addInfobox(), from ' .. tostring(self))&lt;br /&gt;
	if self:goodToGo() then&lt;br /&gt;
		local _CFG = self.class.myConfiguration&lt;br /&gt;
		local coreData = self:getPrivate('coreData')&lt;br /&gt;
		local ib_args = {&lt;br /&gt;
			bodyclass = 'infobox_name',&lt;br /&gt;
			aboveclass = 'objtitle titletext',&lt;br /&gt;
			headerclass = 'headertext',&lt;br /&gt;
			labelstyle = 'width: 30%;',&lt;br /&gt;
			datastyle = 'width: 70%;',&lt;br /&gt;
			title = self:getPrivate('uid'),&lt;br /&gt;
			subheader = nil,&lt;br /&gt;
			label1 = _CFG.parameter.name.label,&lt;br /&gt;
			data1 = coreData.name and coreData.name or '',&lt;br /&gt;
			header1 = nil,&lt;br /&gt;
		}&lt;br /&gt;
		self:addOutput(require('Module:Infobox').infobox(ib_args))&lt;br /&gt;
		return true&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function ClassgeneratorParameter:addPageBody()&lt;br /&gt;
	_debug(self, 1, 'entering ClassgeneratorParameter:addPageBody(), from ' .. tostring(self))&lt;br /&gt;
	_debug(self, 2, ' rendering errors and warnings and adding them to output')&lt;br /&gt;
	local frame = mw.getCurrentFrame()&lt;br /&gt;
	self:addOutput(self:renderErrors())&lt;br /&gt;
	self:addOutput(self:renderWarnings())&lt;br /&gt;
	if self:goodToGo() then&lt;br /&gt;
		self:addOutput('No out put yet')&lt;br /&gt;
		return true&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function ClassgeneratorParameter:myArgumentProcessing(coreData)&lt;br /&gt;
	_debug(self, 1, 'entering ClassgeneratorParameter:myArgumentProcessing(args) to process coreData, from ' .. tostring(self))&lt;br /&gt;
	-- function that performs some individual transformation args --&amp;amp;amp;gt; coreData&lt;br /&gt;
	local coreData = coreData&lt;br /&gt;
	-- if dataStore == 'cargo' set sf_cargo_table and sf_cargo_field&lt;br /&gt;
	if (FoundationClass.globalConfig.dataStore == 'cargo' or FoundationClass.globalConfig.dataStore == 'both') and FoundationClass.myYesno(coreData.cargo) and FoundationClass.myYesno(coreData.add_cargo_table_and_field) then&lt;br /&gt;
		coreData.cargo_table = 'global.cargoTable'&lt;br /&gt;
		coreData.cargo_field = coreData.name&lt;br /&gt;
	end&lt;br /&gt;
	coreData.add_cargo_table_and_field = nil&lt;br /&gt;
	if FoundationClass.globalConfig.dataStore == 'smw' or FoundationClass.globalConfig.dataStore == 'both' and FoundationClass.myYesno(coreData.property) then&lt;br /&gt;
		coreData.property_name = mw.ustring.gsub(mw.ustring.gsub(coreData.property_name, ' ', '_'), mw.site.namespaces[mw.title.new('Nul', 'Property').namespace].name .. ':', '')&lt;br /&gt;
	else&lt;br /&gt;
		coreData.property_name = nil&lt;br /&gt;
		coreData.property_type = nil&lt;br /&gt;
	end&lt;br /&gt;
	if coreData.sf and mw.ustring.lower(coreData.sf) == 'holds template' then&lt;br /&gt;
		coreData.sf = 'yes'&lt;br /&gt;
		coreData.holds_template = 'true'&lt;br /&gt;
	end&lt;br /&gt;
	if coreData.show_on_select and type(coreData.show_on_select) == 'table' then&lt;br /&gt;
		local sos = {}&lt;br /&gt;
		for _, selector in pairs(coreData.show_on_select) do&lt;br /&gt;
			local value, field = mw.ustring.match(selector, '^([^= ]+)%s*=%s*(.+)$')&lt;br /&gt;
			if value and field then&lt;br /&gt;
				if not sos[value] then&lt;br /&gt;
					sos[value] = {}&lt;br /&gt;
				end&lt;br /&gt;
				table.insert(sos[value], field)&lt;br /&gt;
			else&lt;br /&gt;
				addError('Error processing value for \'\'' .. self.class.myConfiguration.parameter.show_on_select.label .. '\'\': ' .. &lt;br /&gt;
					ClassgeneratorParameter.myTableTools.printTable(coreData.show_on_select) .. ' on entry :' .. mw.text.encode(selector))&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		coreData.show_on_select = sos&lt;br /&gt;
		--coreData.show_on_select = FoundationClass.myTableTools.printTable(sos)&lt;br /&gt;
		--coreData.show_on_select = FoundationClass.myTableTools.printTable(coreData.show_on_select)&lt;br /&gt;
	end&lt;br /&gt;
	-- kill two cosmetical switches&lt;br /&gt;
	coreData.cargo = nil&lt;br /&gt;
	coreData.property = nil&lt;br /&gt;
	return coreData	-- this is your new coreData.&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function ClassgeneratorParameter:myPlausibilityTest(args)&lt;br /&gt;
	_debug(self, 1, 'entering ClassgeneratorParameter:myPlausibilityTest(args) to test arguments, from ' .. tostring(self))&lt;br /&gt;
	-- function that performs the individual plausibility tests&lt;br /&gt;
	-- note: before you access a field args.fieldname you should check for existance&lt;br /&gt;
	-- self:addError(text)&lt;br /&gt;
	if args.name and not mw.ustring.match(args.name, '^[a-zA-Z_][0-9a-zA-Z_-]*$') then&lt;br /&gt;
		self:addError('Invalid value detected for parameter ' .. _CFG.parameter.name.label .. ': &amp;quot;' .. mw.text.encode(tostring(args.name)) .. '&amp;quot;')&lt;br /&gt;
	end&lt;br /&gt;
	if args.cargo_size and not mw.ustring.match(args.cargo_size, '^[0-9]*$') then&lt;br /&gt;
		self:addError('Invalid value detected for parameter ' .. _CFG.parameter.cargo_size.label .. ': &amp;quot;' .. mw.text.encode(tostring(args.cargo_size)) .. '&amp;quot;')&lt;br /&gt;
	end&lt;br /&gt;
	if args.cols and not mw.ustring.match(args.cols, '^[0-9]*$') then&lt;br /&gt;
		self:addError('Invalid value detected for parameter ' .. _CFG.parameter.cols.label .. ': &amp;quot;' .. mw.text.encode(tostring(args.cols)) .. '&amp;quot;')&lt;br /&gt;
	end&lt;br /&gt;
	if args.max_values and not mw.ustring.match(args.max_values, '^[0-9]*$') then&lt;br /&gt;
		self:addError('Invalid value detected for parameter ' .. _CFG.parameter.max_values.label .. ': &amp;quot;' .. mw.text.encode(tostring(args.max_values)) .. '&amp;quot;')&lt;br /&gt;
	end&lt;br /&gt;
	if args.maxlength and not mw.ustring.match(args.maxlength, '^[0-9]*$') then&lt;br /&gt;
		self:addError('Invalid value detected for parameter ' .. _CFG.parameter.maxlength.label .. ': &amp;quot;' .. mw.text.encode(tostring(args.maxlength)) .. '&amp;quot;')&lt;br /&gt;
	end&lt;br /&gt;
	if args.rows and not mw.ustring.match(args.rows, '^[0-9]*$') then&lt;br /&gt;
		self:addError('Invalid value detected for parameter ' .. _CFG.parameter.rows.label .. ': &amp;quot;' .. mw.text.encode(tostring(args.rows)) .. '&amp;quot;')&lt;br /&gt;
	end&lt;br /&gt;
	if args.size and not mw.ustring.match(args.size, '^[0-9]*$') then&lt;br /&gt;
		self:addError('Invalid value detected for parameter ' .. _CFG.parameter.size.label .. ': &amp;quot;' .. mw.text.encode(tostring(size.cols)) .. '&amp;quot;')&lt;br /&gt;
	end&lt;br /&gt;
	return false	-- return value will be ignored. but if you add any error, the object's initialization will fail with the error&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function ClassgeneratorParameter:myStashAdjustments(stash)&lt;br /&gt;
	_debug(self, 1, 'entering ClassgeneratorParameter:myStashAdjustments(stash) to do some minor adjustments on data before storing, from ' .. tostring(self))&lt;br /&gt;
	-- function that alters the stash before storing the data&lt;br /&gt;
	local stash = stash&lt;br /&gt;
	return stash	-- this is your new stash. this will be stored. it has format (fieldname: value)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function ClassgeneratorParameter:render()&lt;br /&gt;
	_debug(self, 1, 'entering ClassgeneratorParameter:render() to render the code I pass to template class generator, from ' .. tostring(self))&lt;br /&gt;
	local str = ''&lt;br /&gt;
	if self:goodToGo() then&lt;br /&gt;
		local _CFG = self.class.myConfiguration&lt;br /&gt;
		local coreData = self:getCoreData()&lt;br /&gt;
		local indent = '\t'&lt;br /&gt;
		local sfAttributes = {}&lt;br /&gt;
		for _, val in pairs(_CFG.form.fieldOrderSFgeneral) do&lt;br /&gt;
			table.insert(sfAttributes, val)&lt;br /&gt;
		end&lt;br /&gt;
		for _, val in pairs(_CFG.form.fieldOrderSFtypeDependent) do&lt;br /&gt;
			table.insert(sfAttributes, val)&lt;br /&gt;
		end&lt;br /&gt;
		table.sort(sfAttributes)&lt;br /&gt;
		if FoundationClass.myYesno(coreData.sf, true) then&lt;br /&gt;
			str = str .. coreData.name&lt;br /&gt;
		end&lt;br /&gt;
		str = str .. _CFG.template.delimiterFormFieldName&lt;br /&gt;
		str = str .. indent .. coreData.name .. ' = {\n'&lt;br /&gt;
		for _, globalAttr in pairs(_CFG.form.fieldOrderGeneral) do&lt;br /&gt;
			if globalAttr ~= 'sf' then&lt;br /&gt;
				str = str .. _processAttribute(self, globalAttr, indent .. '\t')&lt;br /&gt;
			elseif coreData.sf ~= 'Information' then&lt;br /&gt;
				local sf = ''&lt;br /&gt;
				sf = sf .. _processAttribute(self, 'cargo_table', indent .. '\t\t')&lt;br /&gt;
				sf = sf .. _processAttribute(self, 'cargo_field', indent .. '\t\t')&lt;br /&gt;
				for _, sfAttr in pairs(sfAttributes) do&lt;br /&gt;
					sf = sf .. _processAttribute(self, sfAttr, indent .. '\t\t')&lt;br /&gt;
				end&lt;br /&gt;
				if mw.ustring.len(sf) &amp;gt; 0 then&lt;br /&gt;
					str = str .. indent .. '\t' .. 'sf = {\n' .. sf .. indent .. '\t' .. '},\n'&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		str = str .. indent .. '},\n' .. _CFG.template.delimiterResult&lt;br /&gt;
	else&lt;br /&gt;
		str = tostring(self:renderErrors())&lt;br /&gt;
	end&lt;br /&gt;
	return str&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return ClassgeneratorParameter&lt;/div&gt;</summary>
		<author><name>Anatol</name></author>
	</entry>
	<entry>
		<id>https://camnet.oetterer.eu/index.php?title=Modul:Foundationclass/globalconfig&amp;diff=1001</id>
		<title>Modul:Foundationclass/globalconfig</title>
		<link rel="alternate" type="text/html" href="https://camnet.oetterer.eu/index.php?title=Modul:Foundationclass/globalconfig&amp;diff=1001"/>
		<updated>2016-02-09T20:32:14Z</updated>

		<summary type="html">&lt;p&gt;Anatol: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--[==[ if you start off, please fill the entries and create the appropriate categories&lt;br /&gt;
		--  formCategory (e.g. 'Project forms')&lt;br /&gt;
		--	gardeningSuperCategory (e.g. 'Erroneous objects') (this is a global category. you can define an individual one for each class)&lt;br /&gt;
        --  moduleCategory (e.g. 'Project modules')&lt;br /&gt;
		--  projectSuperCategory (e.g. 'Project category')&lt;br /&gt;
		--	propertyCategory, if you use datastore smw (e.g. 'Project properties')&lt;br /&gt;
		--  templateCategory (e.g. 'Project templates')&lt;br /&gt;
	-- also, remember to choose your prefered storage method. atm supported are: 'cargo', 'smw',  or 'both'&lt;br /&gt;
	-- when using datastore 'smw' uncomment all smwSpecialProperties that are active in your installation (and create the properties for smwClassProperty and uidFieldName)&lt;br /&gt;
	-- HINT: When you use the classgenerator form and its autocreation feature, it creates all your categories defined here as well. to modify their content, please refer to [[Module:Classgenerator/class]]'s documentation page&lt;br /&gt;
--]==]&lt;br /&gt;
local superglobal = {&lt;br /&gt;
	cargoSpecialFields = {},	-- filled further down below&lt;br /&gt;
	cargoTypesElegibleForSize = {'text', 'string', 'wikitext', 'url'},&lt;br /&gt;
	cargoTypesElegibleForValue = {'text', 'integer', 'string', 'url'},&lt;br /&gt;
	classCategory = 'Lua class modules',	-- this is the category, all classes based on this engine are put automatically&lt;br /&gt;
	dataStore = 'smw',	-- supported types are 'cargo', 'smw', and 'both'&lt;br /&gt;
	debugLevel = false, -- set this to the level you wish to display at render. false if disabled. this is a global setting, causing all children to debug. you can set this individually at any class&lt;br /&gt;
	formCategory = 'CamNet forms',	-- the category of the form pages&lt;br /&gt;
	formTableClass = 'formtable',&lt;br /&gt;
	gardeningSuperCategory = 'Project entities with erroneous input',&lt;br /&gt;
	moduleCategory = 'CamNet modules',&lt;br /&gt;
	moduleUseRatingTemplate = true,&lt;br /&gt;
	projectSuperCategory = 'CamNet',	-- The category, all the categories are placed in.'&lt;br /&gt;
	propertyCategory = 'CamNet properties',	-- category for all the properties pages - if data store smw is used&lt;br /&gt;
	restrictionRole = 'sysop',	-- if you wish to set fields to a default restriction role, name it here&lt;br /&gt;
	selectedCheckboxSubmitValue = 'Ja',	-- (const) this is the value, a semantic forms checkbox submits when selected. used for plausibilityTest only&lt;br /&gt;
	smwClassProperty = 'is_member_of_class',	-- the name of the property, members of the class will be identified by; you have to create the property page, though&lt;br /&gt;
	smwPropertyTypesAvailable = { 'Annotation URI', 'Boolean', 'Code', 'Date', 'Email', 'Geographic coordinate', 'Number', 'Page', 'Quantity', 'Record', 'Telephone number', 'Temperature', 'Text', 'URL' },&lt;br /&gt;
		-- if you have more types of properties (due to an extension), add them here). in fact, Foundationclass does use this, but classgenerator/parameter makes a reference&lt;br /&gt;
	smwSpecialProperties = {},	-- filled further down below&lt;br /&gt;
	templateCategory = 'CamNet templates',	-- the category for the templates&lt;br /&gt;
	templateUseDocumentationSubsystem = true,&lt;br /&gt;
	uidFieldName = 'classengine_identifies_this_by',	-- the name of the property/table fields, the individual object will be identified by (in cargo and smw respectively);&lt;br /&gt;
						-- if you use smw, you have to create the property page manually&lt;br /&gt;
						-- WARNING: If you reset this after beginning operation, you have to rebuild all cargo data tables, and/or create the new property and refresh all properties&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
superglobal.cargoSpecialFields = {&lt;br /&gt;
	_ID = 'Integer, &amp;lt;small&amp;gt;holds a unique ID for this row&amp;lt;/small&amp;gt;',&lt;br /&gt;
	_pageName = 'Text, &amp;lt;small&amp;gt;holds the name of the page from which this row of values was stored&amp;lt;/small&amp;gt;',&lt;br /&gt;
	_pageTitle = 'Text, &amp;lt;small&amp;gt;similar to _pageName, but leaves out the namespace, if there is one&amp;lt;/small&amp;gt;',&lt;br /&gt;
	_pageNamespace = 'Integer, &amp;lt;small&amp;gt;holds the numerical ID of the namespace of the page from which this row of values was stored&amp;lt;/small&amp;gt;',&lt;br /&gt;
	_pageID = 'Integer, &amp;lt;small&amp;gt;holds the internal MediaWiki ID for that page&amp;lt;/small&amp;gt;',&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
superglobal.smwSpecialProperties = {&lt;br /&gt;
	-- by default, only _MDAT is active. see https://www.semantic-mediawiki.org/wiki/Help:$smwgPageSpecialProperties for documentation&lt;br /&gt;
	-- please uncomment all special properties that apply to your installation&lt;br /&gt;
	Creation_date = 'Date, &amp;lt;small&amp;gt;Erstelldatum der Seite.&amp;lt;/small&amp;gt; (Alias _CDAT)',&lt;br /&gt;
	Is_a_new_page = 'Boolean, &amp;lt;small&amp;gt;Ist die Seite neu? Gibt es nur eine einzige Revision?&amp;lt;/small&amp;gt; (Alias _NEWP)',&lt;br /&gt;
	Last_editor_is = 'Page, &amp;lt;small&amp;gt;Benutzername des letzten Bearbeiters.&amp;lt;/small&amp;gt; (Alias _LEDT)',&lt;br /&gt;
	--Media_type = 'Text, &amp;lt;small&amp;gt;Speichert den Medientyp einer hochgeladenen Datei.&amp;lt;/small&amp;gt; (Alias _MEDIA)',&lt;br /&gt;
	--MIME_type = 'Text, &amp;lt;small&amp;gt;Speichert den MIME Typ einer hochgeladenen Datei.&amp;lt;/small&amp;gt; (Alias _MIME)',&lt;br /&gt;
	Modification_date = 'Date, &amp;lt;small&amp;gt;Datum der letzten Bearbeitung der Seite.&amp;lt;/small&amp;gt; (Alias _MDAT)',&lt;br /&gt;
&lt;br /&gt;
	-- from Extension: Extra Special Properties&lt;br /&gt;
	CUSER = 'Page, &amp;lt;small&amp;gt;Erstellerbenutzer&amp;lt;/small&amp;gt;',&lt;br /&gt;
	EUSER = 'List of Pages, &amp;lt;small&amp;gt;Liste der Benutzer, die an der Seite mitgewirkt haben.&amp;lt;/small&amp;gt;',&lt;br /&gt;
	--EXIFDATA = 'Text, &amp;lt;small&amp;gt;Exif Daten einer Datei (Nur im Namensraum &amp;quot;Datei&amp;quot; gesetzt)&amp;lt;/small&amp;gt;',&lt;br /&gt;
	--PAGEID = 'Number, &amp;lt;small&amp;gt;ID der Seite&amp;lt;/small&amp;gt;',&lt;br /&gt;
	REVID = 'Number, &amp;lt;small&amp;gt;ID der aktuellen Revision&amp;lt;/small&amp;gt;',&lt;br /&gt;
	--NREV = 'Number, &amp;lt;small&amp;gt;Geschätzte Anzahl der Revisionen.&amp;lt;/small&amp;gt;',&lt;br /&gt;
	--NTREV = 'Number, &amp;lt;small&amp;gt;Geschätzte Anzahl der Revisionen der Diskussionsseite.&amp;lt;/small&amp;gt;',&lt;br /&gt;
	--SHORTURL = 'Text, &amp;lt;small&amp;gt;KurzURL der Seite (Nur bei Verwendung der Extension:ShortUrl verfügbar)&amp;lt;/small&amp;gt;',&lt;br /&gt;
	SUBP = 'List of Pages, &amp;lt;small&amp;gt;Liste der Unterseiten&amp;lt;/small&amp;gt;',&lt;br /&gt;
	--USERREG = 'Date, &amp;lt;small&amp;gt;Datum der Registrierung eines Benutzers (Nur im Namensraum &amp;quot;Benutzer&amp;quot; gesetzt)&amp;lt;/small&amp;gt;',&lt;br /&gt;
	VIEWS = 'Number, &amp;lt;small&amp;gt;Geschätzte Anzahl der Seitenaufrufe (Achtung: Aufgrund von Caching kann die tatsächliche Zahl stark abweichen).&amp;lt;/small&amp;gt;',&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
return superglobal&lt;/div&gt;</summary>
		<author><name>Anatol</name></author>
	</entry>
	<entry>
		<id>https://camnet.oetterer.eu/index.php?title=Modul:Foundationclass/globalconfig&amp;diff=1000</id>
		<title>Modul:Foundationclass/globalconfig</title>
		<link rel="alternate" type="text/html" href="https://camnet.oetterer.eu/index.php?title=Modul:Foundationclass/globalconfig&amp;diff=1000"/>
		<updated>2016-02-09T20:30:25Z</updated>

		<summary type="html">&lt;p&gt;Anatol: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--[==[ if you start off, please fill the entries and create the appropriate categories&lt;br /&gt;
		--  formCategory (e.g. 'Project forms')&lt;br /&gt;
		--	gardeningSuperCategory (e.g. 'Erroneous objects') (this is a global category. you can define an individual one for each class)&lt;br /&gt;
        --  moduleCategory (e.g. 'Project modules')&lt;br /&gt;
		--  projectSuperCategory (e.g. 'Project category')&lt;br /&gt;
		--	propertyCategory, if you use datastore smw (e.g. 'Project properties')&lt;br /&gt;
		--  templateCategory (e.g. 'Project templates')&lt;br /&gt;
	-- also, remember to choose your prefered storage method. atm supported are: 'cargo', 'smw',  or 'both'&lt;br /&gt;
	-- when using datastore 'smw' uncomment all smwSpecialProperties that are active in your installation (and create the properties for smwClassProperty and uidFieldName)&lt;br /&gt;
	-- HINT: When you use the classgenerator form and its autocreation feature, it creates all your categories defined here as well. to modify their content, please refer to [[Module:Classgenerator/class]]'s documentation page&lt;br /&gt;
--]==]&lt;br /&gt;
local superglobal = {&lt;br /&gt;
	cargoSpecialFields = {},	-- filled further down below&lt;br /&gt;
	cargoTypesElegibleForSize = {'text', 'string', 'wikitext', 'url'},&lt;br /&gt;
	cargoTypesElegibleForValue = {'text', 'integer', 'string', 'url'},&lt;br /&gt;
	classCategory = 'Lua class modules',	-- this is the category, all classes based on this engine are put automatically&lt;br /&gt;
	dataStore = 'cargo',	-- supported types are 'cargo', 'smw', and 'both'&lt;br /&gt;
	debugLevel = false, -- set this to the level you wish to display at render. false if disabled. this is a global setting, causing all children to debug. you can set this individually at any class&lt;br /&gt;
	formCategory = 'CamNet forms',	-- the category of the form pages&lt;br /&gt;
	formTableClass = 'formtable',&lt;br /&gt;
	gardeningSuperCategory = 'Project entities with erroneous input',&lt;br /&gt;
	moduleCategory = 'CamNet modules',&lt;br /&gt;
	moduleUseRatingTemplate = true,&lt;br /&gt;
	projectSuperCategory = 'CamNet',	-- The category, all the categories are placed in.'&lt;br /&gt;
	propertyCategory = 'CamNet properties',	-- category for all the properties pages - if data store smw is used&lt;br /&gt;
	restrictionRole = 'sysop',	-- if you wish to set fields to a default restriction role, name it here&lt;br /&gt;
	selectedCheckboxSubmitValue = 'Ja',	-- (const) this is the value, a semantic forms checkbox submits when selected. used for plausibilityTest only&lt;br /&gt;
	smwClassProperty = 'is_member_of_class',	-- the name of the property, members of the class will be identified by; you have to create the property page, though&lt;br /&gt;
	smwPropertyTypesAvailable = { 'Annotation URI', 'Boolean', 'Code', 'Date', 'Email', 'Geographic coordinate', 'Number', 'Page', 'Quantity', 'Record', 'Telephone number', 'Temperature', 'Text', 'URL' },&lt;br /&gt;
		-- if you have more types of properties (due to an extension), add them here). in fact, Foundationclass does use this, but classgenerator/parameter makes a reference&lt;br /&gt;
	smwSpecialProperties = {},	-- filled further down below&lt;br /&gt;
	templateCategory = 'CamNet templates',	-- the category for the templates&lt;br /&gt;
	templateUseDocumentationSubsystem = true,&lt;br /&gt;
	uidFieldName = 'classengine_identifies_this_by',	-- the name of the property/table fields, the individual object will be identified by (in cargo and smw respectively);&lt;br /&gt;
						-- if you use smw, you have to create the property page manually&lt;br /&gt;
						-- WARNING: If you reset this after beginning operation, you have to rebuild all cargo data tables, and/or create the new property and refresh all properties&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
superglobal.cargoSpecialFields = {&lt;br /&gt;
	_ID = 'Integer, &amp;lt;small&amp;gt;holds a unique ID for this row&amp;lt;/small&amp;gt;',&lt;br /&gt;
	_pageName = 'Text, &amp;lt;small&amp;gt;holds the name of the page from which this row of values was stored&amp;lt;/small&amp;gt;',&lt;br /&gt;
	_pageTitle = 'Text, &amp;lt;small&amp;gt;similar to _pageName, but leaves out the namespace, if there is one&amp;lt;/small&amp;gt;',&lt;br /&gt;
	_pageNamespace = 'Integer, &amp;lt;small&amp;gt;holds the numerical ID of the namespace of the page from which this row of values was stored&amp;lt;/small&amp;gt;',&lt;br /&gt;
	_pageID = 'Integer, &amp;lt;small&amp;gt;holds the internal MediaWiki ID for that page&amp;lt;/small&amp;gt;',&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
superglobal.smwSpecialProperties = {&lt;br /&gt;
	-- by default, only _MDAT is active. see https://www.semantic-mediawiki.org/wiki/Help:$smwgPageSpecialProperties for documentation&lt;br /&gt;
	-- please uncomment all special properties that apply to your installation&lt;br /&gt;
	Creation_date = 'Date, &amp;lt;small&amp;gt;Erstelldatum der Seite.&amp;lt;/small&amp;gt; (Alias _CDAT)',&lt;br /&gt;
	Is_a_new_page = 'Boolean, &amp;lt;small&amp;gt;Ist die Seite neu? Gibt es nur eine einzige Revision?&amp;lt;/small&amp;gt; (Alias _NEWP)',&lt;br /&gt;
	Last_editor_is = 'Page, &amp;lt;small&amp;gt;Benutzername des letzten Bearbeiters.&amp;lt;/small&amp;gt; (Alias _LEDT)',&lt;br /&gt;
	--Media_type = 'Text, &amp;lt;small&amp;gt;Speichert den Medientyp einer hochgeladenen Datei.&amp;lt;/small&amp;gt; (Alias _MEDIA)',&lt;br /&gt;
	--MIME_type = 'Text, &amp;lt;small&amp;gt;Speichert den MIME Typ einer hochgeladenen Datei.&amp;lt;/small&amp;gt; (Alias _MIME)',&lt;br /&gt;
	Modification_date = 'Date, &amp;lt;small&amp;gt;Datum der letzten Bearbeitung der Seite.&amp;lt;/small&amp;gt; (Alias _MDAT)',&lt;br /&gt;
&lt;br /&gt;
	-- from Extension: Extra Special Properties&lt;br /&gt;
	CUSER = 'Page, &amp;lt;small&amp;gt;Erstellerbenutzer&amp;lt;/small&amp;gt;',&lt;br /&gt;
	EUSER = 'List of Pages, &amp;lt;small&amp;gt;Liste der Benutzer, die an der Seite mitgewirkt haben.&amp;lt;/small&amp;gt;',&lt;br /&gt;
	--EXIFDATA = 'Text, &amp;lt;small&amp;gt;Exif Daten einer Datei (Nur im Namensraum &amp;quot;Datei&amp;quot; gesetzt)&amp;lt;/small&amp;gt;',&lt;br /&gt;
	--PAGEID = 'Number, &amp;lt;small&amp;gt;ID der Seite&amp;lt;/small&amp;gt;',&lt;br /&gt;
	REVID = 'Number, &amp;lt;small&amp;gt;ID der aktuellen Revision&amp;lt;/small&amp;gt;',&lt;br /&gt;
	--NREV = 'Number, &amp;lt;small&amp;gt;Geschätzte Anzahl der Revisionen.&amp;lt;/small&amp;gt;',&lt;br /&gt;
	--NTREV = 'Number, &amp;lt;small&amp;gt;Geschätzte Anzahl der Revisionen der Diskussionsseite.&amp;lt;/small&amp;gt;',&lt;br /&gt;
	--SHORTURL = 'Text, &amp;lt;small&amp;gt;KurzURL der Seite (Nur bei Verwendung der Extension:ShortUrl verfügbar)&amp;lt;/small&amp;gt;',&lt;br /&gt;
	SUBP = 'List of Pages, &amp;lt;small&amp;gt;Liste der Unterseiten&amp;lt;/small&amp;gt;',&lt;br /&gt;
	--USERREG = 'Date, &amp;lt;small&amp;gt;Datum der Registrierung eines Benutzers (Nur im Namensraum &amp;quot;Benutzer&amp;quot; gesetzt)&amp;lt;/small&amp;gt;',&lt;br /&gt;
	VIEWS = 'Number, &amp;lt;small&amp;gt;Geschätzte Anzahl der Seitenaufrufe (Achtung: Aufgrund von Caching kann die tatsächliche Zahl stark abweichen).&amp;lt;/small&amp;gt;',&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
return superglobal&lt;/div&gt;</summary>
		<author><name>Anatol</name></author>
	</entry>
	<entry>
		<id>https://camnet.oetterer.eu/index.php?title=Kyle&amp;diff=2270</id>
		<title>Kyle</title>
		<link rel="alternate" type="text/html" href="https://camnet.oetterer.eu/index.php?title=Kyle&amp;diff=2270"/>
		<updated>2015-05-08T18:31:06Z</updated>

		<summary type="html">&lt;p&gt;Anatol: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Character&lt;br /&gt;
| image=Kyle Amador.jpg&lt;br /&gt;
| displayname=Kyle Amador&lt;br /&gt;
| fullname=Kyle Amador&lt;br /&gt;
| category=NSC&lt;br /&gt;
| player=Tobi&lt;br /&gt;
| type=Vampir&lt;br /&gt;
| sect=Camarilla&lt;br /&gt;
| clan=Toreador&lt;br /&gt;
| antitribu=&lt;br /&gt;
| sire=&lt;br /&gt;
| generation=&lt;br /&gt;
| embraced=&lt;br /&gt;
| embraced is estimate=&lt;br /&gt;
| apparent age=30&lt;br /&gt;
| residence=New York&lt;br /&gt;
| office=&lt;br /&gt;
| haven=&lt;br /&gt;
| chapter_of_first_appearance=Der erste Rave&lt;br /&gt;
| died=&lt;br /&gt;
| died_in_chapter=&lt;br /&gt;
| background=&lt;br /&gt;
| abilities=&lt;br /&gt;
| relations=&lt;br /&gt;
| agenda=&lt;br /&gt;
| comments=&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Anatol</name></author>
	</entry>
	<entry>
		<id>https://camnet.oetterer.eu/index.php?title=Clemence&amp;diff=2282</id>
		<title>Clemence</title>
		<link rel="alternate" type="text/html" href="https://camnet.oetterer.eu/index.php?title=Clemence&amp;diff=2282"/>
		<updated>2015-05-08T18:24:28Z</updated>

		<summary type="html">&lt;p&gt;Anatol: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Character&lt;br /&gt;
| image=Clemence.jpg&lt;br /&gt;
| displayname=Kardinal Clemence Moncada&lt;br /&gt;
| fullname=Marquise et Duchesse de Villars et Vicomtesse de Melun, Erzbischof von Madrid, Kardinal Clemence Moncada&lt;br /&gt;
| category=NSC&lt;br /&gt;
| player=Axel&lt;br /&gt;
| type=Vampir&lt;br /&gt;
| sect=Sabbat&lt;br /&gt;
| clan=Lasombra&lt;br /&gt;
| antitribu=&lt;br /&gt;
| sire=Federico&lt;br /&gt;
| generation=&lt;br /&gt;
| original_generation=10&lt;br /&gt;
| embraced=&lt;br /&gt;
| embraced is estimate=&lt;br /&gt;
| apparent age=28&lt;br /&gt;
| residence=Madrid&lt;br /&gt;
| office=Kardinal&lt;br /&gt;
| haven=Iglesia de San Nicolas&lt;br /&gt;
| chapter_of_first_appearance=Dunkle Schwestern&lt;br /&gt;
| died=&lt;br /&gt;
| died_in_chapter=&lt;br /&gt;
| background=&lt;br /&gt;
| abilities=&lt;br /&gt;
* Schattenspiele&lt;br /&gt;
| relations=&lt;br /&gt;
| agenda=&lt;br /&gt;
| comments=&lt;br /&gt;
&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Anatol</name></author>
	</entry>
	<entry>
		<id>https://camnet.oetterer.eu/index.php?title=Hannah&amp;diff=2164</id>
		<title>Hannah</title>
		<link rel="alternate" type="text/html" href="https://camnet.oetterer.eu/index.php?title=Hannah&amp;diff=2164"/>
		<updated>2014-05-30T17:41:33Z</updated>

		<summary type="html">&lt;p&gt;Anatol: /* Kommentare */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Character&lt;br /&gt;
| image=Hannah.jpg&lt;br /&gt;
| displayname=Hannah&lt;br /&gt;
| fullname=&lt;br /&gt;
| category=NSC&lt;br /&gt;
| player=Axel&lt;br /&gt;
| type=Vampir&lt;br /&gt;
| sect=Camarilla&lt;br /&gt;
| clan=Tremere&lt;br /&gt;
| antitribu=&lt;br /&gt;
| sire=&lt;br /&gt;
| generation=&lt;br /&gt;
| embraced=&lt;br /&gt;
| embraced is estimate=&lt;br /&gt;
| apparent age=&lt;br /&gt;
| residence=vernichtet&lt;br /&gt;
| office=&lt;br /&gt;
| haven=&lt;br /&gt;
| chapter_of_first_appearance=Das Auge des Hazimel&lt;br /&gt;
| died=21.12.1999&lt;br /&gt;
| died_in_chapter=Mittwinterball 1999&lt;br /&gt;
| background=&lt;br /&gt;
&lt;br /&gt;
Die ehemalige Leiterin des Clanhauses in Atlanta vor dem Mittwinterball. Während des Angriffs auf Atlanta wurde das Clanhaus bezwungen und alle ansässigen Tremere getötet. Hannah verlor dabei ihr Unleben und wie sich sich später herausstellte, ihren Kopf. Die Regentin hatte die Führung des Clanshauses lange Jahre vor dem Kriegsbeginn fest in der Hand.&lt;br /&gt;
&lt;br /&gt;
Sie hegte einen Verdacht, das es eine Kraft von innen geben könnte, die an einer Umwälzung von Atlanta arbeitet. Ihr Verdacht konnte sie auf 4 Personen einschränken, von denen nicht alle auf dem Mittwinterball anwesend waren. Ihr plötzlicher Tod verhinderte jedoch eine erfolgreiche Ermittlung.&lt;br /&gt;
&lt;br /&gt;
Wir wissen aus von Brauns Tagebuchaufzeichnungen im Mechanismus, dass Hannah mit ihm in Ceoris war. Zu welchem Zeitpunkt ist allerdings unklar. &lt;br /&gt;
&lt;br /&gt;
Gemeinsam mit {{char|von Braun}}, {{char|Skalde}} und {{char|Helmar}} hat sie in der Vergangenheit Infernalisten gejagt.&lt;br /&gt;
&lt;br /&gt;
Sie hatte in Wien Kontakt mit dem [[Skalde| Skalden]], als der nach vierzig Jahren unter der Erde wieder erschien.&lt;br /&gt;
| abilities=&lt;br /&gt;
| relations=&lt;br /&gt;
Aus derselben Quelle (und Visionen) wissen wir, dass sie eine Liebesbeziehung und ein Blutsband mit von Braun hatte, dass die beiden sich aber trotzdem entfremdet haben. Siehe Agenda.&lt;br /&gt;
&lt;br /&gt;
Hannah gehörte neben dem [[ Skalde | Skalden]] und [[Helmar]] zu von Brauns Klüngel.&lt;br /&gt;
| agenda=&lt;br /&gt;
Hannah hat offenbar im Laufe der Zeit einen gewissen Machthunger entwickelt. Für eine Regentschaft war sie jedenfalls bereit, große Zugeständnisse zu machen.&lt;br /&gt;
| comments=&lt;br /&gt;
Fast all unsere Hintergrundinformationen finden sich im Kontext von {{chapter|Memento,_Petrus_I}} und {{chapter|Memento,_Petrus_II}}.&lt;br /&gt;
&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Anatol</name></author>
	</entry>
	<entry>
		<id>https://camnet.oetterer.eu/index.php?title=Datei:Location_Der_Wissenshort.jpg&amp;diff=1642</id>
		<title>Datei:Location Der Wissenshort.jpg</title>
		<link rel="alternate" type="text/html" href="https://camnet.oetterer.eu/index.php?title=Datei:Location_Der_Wissenshort.jpg&amp;diff=1642"/>
		<updated>2014-04-07T13:45:44Z</updated>

		<summary type="html">&lt;p&gt;Anatol: Category:Ortsbild&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Ortsbild]]&lt;/div&gt;</summary>
		<author><name>Anatol</name></author>
	</entry>
	<entry>
		<id>https://camnet.oetterer.eu/index.php?title=Datei:Hyatt_Regency.jpg&amp;diff=1641</id>
		<title>Datei:Hyatt Regency.jpg</title>
		<link rel="alternate" type="text/html" href="https://camnet.oetterer.eu/index.php?title=Datei:Hyatt_Regency.jpg&amp;diff=1641"/>
		<updated>2014-02-24T22:24:51Z</updated>

		<summary type="html">&lt;p&gt;Anatol: Category:Ortsbild&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Ortsbild]]&lt;/div&gt;</summary>
		<author><name>Anatol</name></author>
	</entry>
	<entry>
		<id>https://camnet.oetterer.eu/index.php?title=Datei:Barnard_Hall.png&amp;diff=1640</id>
		<title>Datei:Barnard Hall.png</title>
		<link rel="alternate" type="text/html" href="https://camnet.oetterer.eu/index.php?title=Datei:Barnard_Hall.png&amp;diff=1640"/>
		<updated>2014-02-24T21:41:18Z</updated>

		<summary type="html">&lt;p&gt;Anatol: Foto vom Eingangsbereich des Barnard College - eingeschneit.
Kategorie:Ortsbild&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Foto vom Eingangsbereich des Barnard College - eingeschneit.&lt;br /&gt;
[[Kategorie:Ortsbild]]&lt;/div&gt;</summary>
		<author><name>Anatol</name></author>
	</entry>
	<entry>
		<id>https://camnet.oetterer.eu/index.php?title=Datei:Das_Hurricane_4.jpg&amp;diff=1639</id>
		<title>Datei:Das Hurricane 4.jpg</title>
		<link rel="alternate" type="text/html" href="https://camnet.oetterer.eu/index.php?title=Datei:Das_Hurricane_4.jpg&amp;diff=1639"/>
		<updated>2014-02-18T22:09:02Z</updated>

		<summary type="html">&lt;p&gt;Anatol: Category:Ortsbild&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Ortsbild]]&lt;/div&gt;</summary>
		<author><name>Anatol</name></author>
	</entry>
	<entry>
		<id>https://camnet.oetterer.eu/index.php?title=Datei:Das_Hurricane_3.jpg&amp;diff=1638</id>
		<title>Datei:Das Hurricane 3.jpg</title>
		<link rel="alternate" type="text/html" href="https://camnet.oetterer.eu/index.php?title=Datei:Das_Hurricane_3.jpg&amp;diff=1638"/>
		<updated>2014-02-18T22:08:34Z</updated>

		<summary type="html">&lt;p&gt;Anatol: Category:Ortsbild&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Ortsbild]]&lt;/div&gt;</summary>
		<author><name>Anatol</name></author>
	</entry>
	<entry>
		<id>https://camnet.oetterer.eu/index.php?title=Datei:Das_Hurricane_2.jpg&amp;diff=1637</id>
		<title>Datei:Das Hurricane 2.jpg</title>
		<link rel="alternate" type="text/html" href="https://camnet.oetterer.eu/index.php?title=Datei:Das_Hurricane_2.jpg&amp;diff=1637"/>
		<updated>2014-02-18T22:07:35Z</updated>

		<summary type="html">&lt;p&gt;Anatol: Category:Ortsbild&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Ortsbild]]&lt;/div&gt;</summary>
		<author><name>Anatol</name></author>
	</entry>
	<entry>
		<id>https://camnet.oetterer.eu/index.php?title=Datei:Das_Hurricane_1.jpg&amp;diff=1636</id>
		<title>Datei:Das Hurricane 1.jpg</title>
		<link rel="alternate" type="text/html" href="https://camnet.oetterer.eu/index.php?title=Datei:Das_Hurricane_1.jpg&amp;diff=1636"/>
		<updated>2014-02-18T22:07:06Z</updated>

		<summary type="html">&lt;p&gt;Anatol: Category:Ortsbild&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Ortsbild]]&lt;/div&gt;</summary>
		<author><name>Anatol</name></author>
	</entry>
	<entry>
		<id>https://camnet.oetterer.eu/index.php?title=Datei:Location_Das_Hurricane.jpg&amp;diff=1635</id>
		<title>Datei:Location Das Hurricane.jpg</title>
		<link rel="alternate" type="text/html" href="https://camnet.oetterer.eu/index.php?title=Datei:Location_Das_Hurricane.jpg&amp;diff=1635"/>
		<updated>2014-02-18T22:05:47Z</updated>

		<summary type="html">&lt;p&gt;Anatol: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Ortsbild]]&lt;/div&gt;</summary>
		<author><name>Anatol</name></author>
	</entry>
	<entry>
		<id>https://camnet.oetterer.eu/index.php?title=Datei:Calebros.jpg&amp;diff=1529</id>
		<title>Datei:Calebros.jpg</title>
		<link rel="alternate" type="text/html" href="https://camnet.oetterer.eu/index.php?title=Datei:Calebros.jpg&amp;diff=1529"/>
		<updated>2014-02-13T14:00:55Z</updated>

		<summary type="html">&lt;p&gt;Anatol: Anatol lud eine neue Version von „Datei:Calebros.jpg“ hoch&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Charakterbild]]&lt;/div&gt;</summary>
		<author><name>Anatol</name></author>
	</entry>
	<entry>
		<id>https://camnet.oetterer.eu/index.php?title=Diskussion:Der_erste_Rave&amp;diff=4288</id>
		<title>Diskussion:Der erste Rave</title>
		<link rel="alternate" type="text/html" href="https://camnet.oetterer.eu/index.php?title=Diskussion:Der_erste_Rave&amp;diff=4288"/>
		<updated>2014-01-27T23:16:49Z</updated>

		<summary type="html">&lt;p&gt;Anatol: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Peter:''' Krass. Im Nachhinein fällt einem natürlich ohne Ende ein, was man am Telefon hätte fragen wollen. Klingt auf jeden Fall sehr spannend. Und: Wir müssen alle dringend reden.&lt;br /&gt;
&lt;br /&gt;
'''Neil''' Sehe ich auch so. Aus den Ereignissen ergeben sich aus meiner Sicht auch noch mindestens zwei offene Enden: 1. Umgang mit den Caitiff (insbesondere denjenigen, hinter denen Sklade her ist) 2. Wir müssen alle Tremere aus dem Jagdtrupp des Inquisitors ausfindig machen, damit die Salubri zumindest einigermaßen sicher sind.&lt;br /&gt;
&lt;br /&gt;
'''Peter:''' Darf ich auf die Liste setzen: 3. Ist es wirklich, wirklich eine gute Idee, Infernalisten zu helfen? Ich würde mich mit denen zumindest gerne einmal selbst unterhalten. 4. Ein Gespräch mit v. Braun, der mich aktuell für ein unberechenbares Risiko halten muss. (Er kann davon ausgehen, dass ich von Eurer und seiner Hilfe für die Infernalisten weiß, ich war aber auch nicht anwesend, könnte also geneigt sein, die Sache nach oben zu melden...) 5. Wir sollten dringend gewisse Informationen zum Skalden und unserem neuen Prinzen austauschen, die wir am Ort der verlorenen Dinge erlangt haben, und die die Begeisterung für unseren selbstlosen Prinzen vielleicht dämpfen könnten.&lt;br /&gt;
&lt;br /&gt;
'''Neil''' Klingt alles wichtig, wobei die ersten beiden Punkte meiner Meinung nach zeitlich immer noch die dringensten sind...&lt;br /&gt;
&lt;br /&gt;
'''Peter:''' Kommt drauf an, um wessen Sicherheit man sich am meisten sorgt. Aber gut, Du bist der Sheriff. Mal sehen. Zuallererst wäre es interessant zu erfahren, ob der Skalde alle Caitiff jagen soll oder nur solche, die sich Verbrechen gegen die Traditionen schuldig gemacht haben. Denn lässt sich für die Caitiff nicht der Vertrag von Thorns anwenden? Der zielt auf Anarchen, aber die Idee könnte hier dieselbe sein: Die Caitiff halten sich an die Traditionen und bekommen im Gegenzug zugesichert, dass sie nicht aufgrund ihrer bloßen Existenz gejagt werden. Bedeutet wahrscheinlich viel Überzeugungsarbeit beim Prinzen und viel Unterricht für die Caitiff. Aber besser, als alle aus der Stadt und damit in die Arme des Sabbath zu treiben. Und auch besser, als sie alle zu töten. In der noch etwas instabilen Lage der Stadt kann der Prinz das nicht wollen.&lt;br /&gt;
&lt;br /&gt;
Was den zweiten Punkt angeht, bin ich gerade ratlos. Es ist im Moment so schrecklich einfach, sich in New York als Vampir in den Mengen von Flüchtlingen zu verstecken. Vielleicht ist es einfacher, den Salubri eine Leibwache mitzugeben?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &amp;amp; Das Gespräch über Collins Visionen ==&lt;br /&gt;
&lt;br /&gt;
'''Liz:''' Liebe Freunde,&lt;br /&gt;
ich habe lange mit mir gehadert, ob ich mit meinen Gedanken andere behelligen soll. Und nach vielen Nächten des Grübelns bin ich zu dem Schluss gekommen, dass Freunde dazu da sind zu helfen oder eben mir zu sagen, dass ich mich da in eine Sache verrenne, die keinen Sinn hat (auch wenn ich davon überzeugt bin, dass hier etwas wichtiges dahinter steckt und nicht nur leere Worte). Collin hat neulich etwas gesagt, wieder eine Art Vision. Ich hoffe es richtig wiedergeben zu können, weil ich schon fast in der Morgenstarre war. Diese Worte gehen mir also schon seit Nächten immer wieder durch den Kopf, ich erfasse nur Teile der Bedeutung und frage mich, ob sie für uns relevant sind:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;i&amp;gt;&lt;br /&gt;
&amp;quot;Vater schätz den Frühling im Auge des Hurricane: 'Falke schlägt König - doch das Spiel geht weiter. Die Dame rochiert. Bischof und Bischof stehen zusammen. Und der Bauer kann noch zum Springer werden!' Erinnere dich! 'Trockne die Tränen seines ältesten Kindes. Dann kann die Tochter des Abts ihren Frieden finden!'&amp;quot;&lt;br /&gt;
&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Was heißt denn &amp;quot;rochiert&amp;quot;? Klingt irgendwie ungesund...&lt;br /&gt;
Ich hoffe, dass eure geistige Kompetenz größer ist als die meine, denn ich verstehe lediglich, dass es sich auch um mich handelt. Aber was ich oder andere mit Ricardo machen sollen, leuchtet mir nicht ein...&lt;br /&gt;
Ich baue auf euch.&lt;br /&gt;
 &lt;br /&gt;
Gute Nacht noch,&lt;br /&gt;
Liz&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Neil:''' &lt;br /&gt;
hier meine ersten Gedanken zu Collins Äußerungen:&lt;br /&gt;
&lt;br /&gt;
Ist Hurricane ein Verweis auf die alte oder die neue Kneipe?&lt;br /&gt;
&lt;br /&gt;
Falke schlägt König: Schach? Wie kann das Spiel weiter gehen, wenn der König geschlagen ist?&lt;br /&gt;
&lt;br /&gt;
Die Dame rochiert: Rochade ist ein Positionswechsel. Gibt es beim Football auch; da tauscht man seinen Platz auf dem Feld mit einem anderen Mitspieler. Vermutlich irgendein mächtiger Vampir, der die Seiten wechselt...&lt;br /&gt;
&lt;br /&gt;
Bischof und Bischof stehen zusammen: Sind damit tatsächlich Sabbat-Bischöfe gemeint oder eher ein Verweis auf die Schachfiguren (Läufer?)&lt;br /&gt;
&lt;br /&gt;
Bauer kann noch zum Springer werden: ?&lt;br /&gt;
&lt;br /&gt;
Tränen seines ältesten Kindes trocknen: Ricardo? Tränen trocknen hat irgendwas mit Trost zu tun.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Susan:''' &lt;br /&gt;
der Hurricane Verweis bezieht sich auf die neue Kneipe. Und der Frühling im Auge eines Hurricanes, ist der windstille Bereich (und damit auch frühlingshaft freundlich) mitten in einem tropischen Wirbelsturm (= kämpfende Sabbatanhänger). &lt;br /&gt;
&lt;br /&gt;
'''Liz:'''&lt;br /&gt;
Mir drängt sich allerdings jetzt die Frage auf, inwieweit uns die Prophezeiung (so sie denn eine ist) für die Zukunft weiterhelfen kann.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Peter:''' &lt;br /&gt;
Was Collins Prophezeiung angeht, ist meine Devise, auf Susans Interpretation zu hören. Aber vielleicht kann ich ein wenig beitragen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;i&amp;gt;Vater schätz den Frühling im Auge des Hurricane: Falke schlägt König - doch das Spiel geht weiter. Die Dame rochiert. Bischof und Bischof stehen zusammen. Und der Bauer kann noch zum Springer werden! Trockne die Tränen seines ältesten Kindes. Dann kann die Tochter des Abts ihren Frieden finden! &amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Schach diesmal. Soso. Der Vater ist mir rätselhaft. Auf wen bezieht sich das?&lt;br /&gt;
Das Auge des Hurricane kann schlicht mehrdeutig sein. Sowohl die Ruhe in New York in Relation zum Krieg ringsum als auch Eure neue Kneipe in Relation zu New York. Und schließlich passt der alte Neill Young-Song 'Like a hurricane' ganz ungemein - na, zumindest auf meine Situation.&lt;br /&gt;
&lt;br /&gt;
Once I thought I saw you&lt;br /&gt;
in a crowded hazy bar,&lt;br /&gt;
Dancing on the light&lt;br /&gt;
from star to star.&lt;br /&gt;
Far across the moonbeam&lt;br /&gt;
I know that's who you are,&lt;br /&gt;
I saw your brown eyes&lt;br /&gt;
turning once to fire.&lt;br /&gt;
&lt;br /&gt;
You are like a hurricane&lt;br /&gt;
There's calm in your eye.&lt;br /&gt;
&lt;br /&gt;
Ah well, zurück zur Prophezeiung. Die Falken seid ihr - sind wir. Dementsprechend könnte der König also für Polonia stehen. Oder für einen künftigen Gegner. Der Prinz liegt nahe, aber der Prinz ist unser Freund...&lt;br /&gt;
Bei der Dame dürfen wir davon ausgehen, dass sie weiblich ist und mächtig, denke ich. Neills Vorschlag, dass sie die Seiten wechseln wird, klingt vernünftig.&lt;br /&gt;
Bischöfe (heißen die im Englischen nicht Läufer?) könnten Sabbathbischöfe sein, also Vykos und Polonia (die jetzt sehr nahe beieinander stehen) oder Vykos und Borges, die ihre Kräfte koordinieren. Es könnte aber auch um Tremere gehen oder irgendeinen Orden.&lt;br /&gt;
Bauer und Springer sagen mir nichts, außer dass man Bauern im Schach umwandeln kann, wenn man sie auf die gegnerische Grundlinie bringt. Typischerweise wandelt man so stark wie möglich um, also in eine Dame - es sei denn, nur mit der Unterverwandlung in einen Springer lässt sich matt erzielen oder die vorteilhafte Stellung sichern.&lt;br /&gt;
Ist das Kind das älteste Kind des Bauern? Oder hat unser zweitliebster Malkavianer zwischen diesen Sätzen einen größeren Gedankensprung eingelegt?&lt;br /&gt;
&lt;br /&gt;
Wartet - Ihr wisst längst, wer das älteste Kind ist, richtig? Deshalb redet ihr alle von Ricardo. Dementsprechend ist Liz die Tochter und Ricardo der Sohn des Abts?&lt;br /&gt;
Wozu rate ich eigentlich an Prophezeiungen herum, die Ihr längst entziffert habt?&lt;br /&gt;
&lt;br /&gt;
Im Ernst, wenn Ricardo und Liz gemeint sind und vom ältesten Kind des Bauern die Rede ist, dann ist zwar Federico vom Spielfeld, wird aber als entscheidene Figur zurückkehren - oder sein Tod wird eine entscheidende Figur auf unserer Seite ins Spiel bringen. Das wäre doch mal eine Neuigkeit.&lt;br /&gt;
&lt;br /&gt;
'''Liz:''' &lt;br /&gt;
Ich denke es geht hier wirklich sehr viel um Federico. &amp;quot;Vater&amp;quot;, bei dem Wort muss ich immer noch sofort an ihn denken. Was mir wieder einmal die Tränen in die Augen treibt, aber das hat nichts mit der Sache zu tun... Je länger ich drüber nachdenke, desto sicherer bin ich, dass es mit &amp;quot;Vater&amp;quot; um Federico geht (obwohl man auch zu Gott &amp;quot;Vater&amp;quot; sagen kann).&lt;br /&gt;
&lt;br /&gt;
Ich habe leider wirklich keine Ahnung von Schach, deshalb klingt das alles chinesisch für mich. Gab es nicht eine Sabbatbischöfin, die eng mit Federico in Kontakt stand? Als wir damals bei Federicos alter Behausung waren, grr, mein Gedächtnis lässt mich im Stich, da haben wir doch einen Brief gefunden?!? Oder war das vorher?!? Oder hatte Federico uns nur davon berichtet? Argl, entschuldigt bitte meine wirren Gedanken, aber vielleicht erinnert sich ja jemand von euch? Vielleicht war sie auch keine Bischöfin sondern irgendein anderes hohes Tier, irgend so was &amp;quot;Erz&amp;quot;-iges, keine Ahnung, was es da alles an &amp;quot;Ämtern&amp;quot; gibt.&lt;br /&gt;
&lt;br /&gt;
Ich würde &amp;quot;Falke schlägt König&amp;quot; als einen vergangenen Sieg verstehen, denn der Krieg ist ja definitiv noch nicht aus &amp;quot;doch das Spiel geht weiter&amp;quot;. Dass Federico der Bauer sein könnte halte ich für unwahrscheinlich, denn er kann nicht mehr zum Springer werden... Vermutlich ist da ein deutlicher Gedankensprung drin.&lt;br /&gt;
Was mich zu einer mir unglaublich wichtigen Frage an Susan bringt: Collin hat etwas von &amp;quot;ich musste erneut mit seiner Stimme sprechen&amp;quot; gesagt. Ist da etwas, dass von ihm Besitz ergreift, wenn er eine Vision hat? Und wer ist Bethany?!?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Neil:'''&lt;br /&gt;
wir haben tatsächlich einen Schriftwechsel, in dem eine Sabbat-(Erz)Bischöfin vorkommt: nämlich eben Sasha (?) Vykos. Meiner Erinnerung nach haben wir die Briefe nach der Lösung der Ereignisse in Winston-Salem gefunden...aber da mag ich mich täuschen. Ich müsste bei Gelegenheit mal meinen Kram durchschauen, befürchte aber, dass ich die Briefe nicht eingesteckt habe.&lt;br /&gt;
 &lt;br /&gt;
Wenn König für Polonia steht, dann ist die &amp;quot;Prophezeiung&amp;quot; meiner Ansicht nach fehlerhaft, denn letztlich haben nicht wir Polonia besiegt, sondern Vykos; die hat ihn diableriert.&lt;br /&gt;
 &lt;br /&gt;
&amp;quot;Frühling&amp;quot; kann sich auch schlicht auf die derzeitige Jahreszeit beziehen.&lt;br /&gt;
 &lt;br /&gt;
Ich glaube, dass nach der Stelle mit dem Springer eine Pause kommt und das älteste Kind sich auf den Abt im Satz danach bezieht. Hatte Federico eigentlich noch mehr Kinder? Vom &amp;quot;ältesten&amp;quot; Kind zu sprechen, macht doch eigentlich nur Sinn, wenn es mehr als zwei gibt, oder?&lt;br /&gt;
&lt;br /&gt;
'''Peter:''' Ich bleibe dabei. Bei der Umwandlung eines Bauern in eine andere Figur wird der Bauer vom Feld genommen. Das könnte bedeuten, dass Federicos Opfer eine neue Figur ins Spiel bringt.&lt;br /&gt;
&lt;br /&gt;
'''Susan:'''  Und wer ist Bethany?!? Ich weiß es leider nicht. Es gibt mehrere Orte, die so heißen, aber der Name wird auch als Frauenvorname verwendet. In welchem Zusammenhang taucht der Name denn auf, Liz?&lt;br /&gt;
&lt;br /&gt;
'''Peter:''' &lt;br /&gt;
Keine Ahnung, wer Bethany ist. &lt;br /&gt;
&lt;br /&gt;
'''Liz:''' &lt;br /&gt;
Bethany muss eine Person sein. Minx kennt sie wohl auch. Sie scheint mit Collin aber auf andere Art zu kommunizieren, klang zumindest so. Vielleicht ein weiterer Malkavianer?!?&lt;br /&gt;
&lt;br /&gt;
'''Neill:'''  &lt;br /&gt;
bzgl. Bethany solltest du Minx noxhmal fragen. Nach dem, was sie mir erzählt hat, ist Bethany eine Malkavianerin, die Collin und Minx unterwegs gerettet haben.&lt;br /&gt;
&lt;br /&gt;
'''Susan:'''  &lt;br /&gt;
vielleicht war mein erster Impuls etwas schnell. Es könnte auch sein, dass mit Hurricane nicht unbedingt die neue Kneipe gemeint ist, sondern vielleicht eher Liz momentane &amp;quot;Lebens-&amp;quot; Situation. Der erste Satz endet nämlich mit einem Doppelpunkt, das könnte heißen, das dahinter beschrieben wird, was im Hurricane (im Krieg in NY)so alles passiert ist, während Liz im Auge (also in relativer Ruhe, immerhin wurde an Ricardos Position nicht gekämpft (ihr erinnert euch an die große Karte?!). Falke schlägt König steht vielleicht für Polonia, den wir geschlagen haben. Dann tauchte Vykos auf und stellte sich gegen Plonia (Dame rouchiert). &amp;quot;Bischof und Bischof stehen zusammen&amp;quot;: Borges und Polonia?! Wenn Liz bei &amp;quot;Vater&amp;quot; Federico in den Sinn kommt, wird dies wohl auch richtig sein. Vielleicht ist mit Bauer auch Ricardo gemeint, der einfach durch einen Aufstieg innerhalb des Sabbat zum Springer wird. Und es handelt sich hier um eine Art Warnung?! Wenn die Tränen des ältesten Kindes getrocknet werden, also Ricardos Tränen, dann wird er vielleicht nicht zum Springer, aber Liz (=Tochter des Abts) würde ihren Frieden finden. Ansonsten knüpfe ich hier an die Interpretationen von Peter an, der deutlich mehr Ahnung vom Schach zu haben scheint, sorry, aber bei mir reichts gerade für die Grundregeln. &lt;br /&gt;
&lt;br /&gt;
Übrigens beim Schreiben &amp;quot;ihr erinnert euch an die große Karte von Pieterzoon&amp;quot; ist mir wieder etwas eingefallen: ich habe die Karte als großes Schachspielfeld gesehen, als ich mit euch bei Pieterzoon im Besprechungszimmer stand...&lt;br /&gt;
&lt;br /&gt;
Neils Anmerkung bezüglich des ältesten Kindes ist auch zu überprüfen; wissen wir, ob Federico noch weitere Kinder hat?&lt;/div&gt;</summary>
		<author><name>Anatol</name></author>
	</entry>
	<entry>
		<id>https://camnet.oetterer.eu/index.php?title=Datei:Green_marker.png&amp;diff=1619</id>
		<title>Datei:Green marker.png</title>
		<link rel="alternate" type="text/html" href="https://camnet.oetterer.eu/index.php?title=Datei:Green_marker.png&amp;diff=1619"/>
		<updated>2013-10-30T15:49:52Z</updated>

		<summary type="html">&lt;p&gt;Anatol: Kategorie:Bild&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Bild]]&lt;/div&gt;</summary>
		<author><name>Anatol</name></author>
	</entry>
	<entry>
		<id>https://camnet.oetterer.eu/index.php?title=Datei:Blue_marker.png&amp;diff=1618</id>
		<title>Datei:Blue marker.png</title>
		<link rel="alternate" type="text/html" href="https://camnet.oetterer.eu/index.php?title=Datei:Blue_marker.png&amp;diff=1618"/>
		<updated>2013-10-30T15:49:32Z</updated>

		<summary type="html">&lt;p&gt;Anatol: Anatol lud eine neue Version von „Datei:Blue marker.png“ hoch: Kategorie:Bild&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Anatol</name></author>
	</entry>
	<entry>
		<id>https://camnet.oetterer.eu/index.php?title=Datei:Blue_marker.png&amp;diff=1617</id>
		<title>Datei:Blue marker.png</title>
		<link rel="alternate" type="text/html" href="https://camnet.oetterer.eu/index.php?title=Datei:Blue_marker.png&amp;diff=1617"/>
		<updated>2013-10-30T15:47:08Z</updated>

		<summary type="html">&lt;p&gt;Anatol: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Anatol</name></author>
	</entry>
	<entry>
		<id>https://camnet.oetterer.eu/index.php?title=Datei:Ventrued.png&amp;diff=1566</id>
		<title>Datei:Ventrued.png</title>
		<link rel="alternate" type="text/html" href="https://camnet.oetterer.eu/index.php?title=Datei:Ventrued.png&amp;diff=1566"/>
		<updated>2013-05-14T14:25:27Z</updated>

		<summary type="html">&lt;p&gt;Anatol: Category:Clanssymbol&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Clanssymbol]]&lt;/div&gt;</summary>
		<author><name>Anatol</name></author>
	</entry>
	<entry>
		<id>https://camnet.oetterer.eu/index.php?title=Datei:Ventrue.png&amp;diff=1564</id>
		<title>Datei:Ventrue.png</title>
		<link rel="alternate" type="text/html" href="https://camnet.oetterer.eu/index.php?title=Datei:Ventrue.png&amp;diff=1564"/>
		<updated>2013-05-14T13:27:51Z</updated>

		<summary type="html">&lt;p&gt;Anatol: Category:Clanssymbol&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Clanssymbol]]&lt;/div&gt;</summary>
		<author><name>Anatol</name></author>
	</entry>
	<entry>
		<id>https://camnet.oetterer.eu/index.php?title=Datei:Kappadozianer.gif&amp;diff=1562</id>
		<title>Datei:Kappadozianer.gif</title>
		<link rel="alternate" type="text/html" href="https://camnet.oetterer.eu/index.php?title=Datei:Kappadozianer.gif&amp;diff=1562"/>
		<updated>2013-05-14T13:04:19Z</updated>

		<summary type="html">&lt;p&gt;Anatol: Category:Clanssymbol&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Clanssymbol]]&lt;/div&gt;</summary>
		<author><name>Anatol</name></author>
	</entry>
</feed>