<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/css" href="http://htyp.org/skins/common/feed.css?42b"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>http://htyp.org/Special:Newpages%3Ffeed%3Datom</id>
		<title>HTYP - New pages [en]</title>
		<link rel="self" type="application/atom+xml" href="http://htyp.org/Special:Newpages%3Ffeed%3Datom"/>
		<link rel="alternate" type="text/html" href="http://htyp.org/Special:Newpages"/>
		<updated>2008-10-13T08:09:49Z</updated>
		<subtitle>From HTYP, the free directory anyone can edit</subtitle>
		<generator>MediaWiki 1.9.3</generator>

	<entry>
		<id>http://htyp.org/W3TPL/test_suite</id>
		<title>W3TPL/test suite</title>
		<link rel="alternate" type="text/html" href="http://htyp.org/W3TPL/test_suite"/>
				<updated>2008-10-10T11:24:47Z</updated>
		
		<summary type="html">&lt;p&gt;Summary: New page: ==LET== &amp;lt;xml&amp;gt;&amp;lt;hide&amp;gt; &amp;lt;let name=thing1 val=&amp;quot;stuff&amp;quot; /&amp;gt; &amp;lt;let name=thing2&amp;gt;other stuff&amp;lt;/let&amp;gt; &amp;lt;let name=thing3&amp;gt;two&amp;lt;/let&amp;gt; &amp;lt;let name=thing3 append&amp;gt; parts&amp;lt;/let&amp;gt; &amp;lt;let name=thing4 copy=thing2 /&amp;gt; &amp;lt;let ...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==LET==&lt;br /&gt;
&amp;lt;xml&amp;gt;&amp;lt;hide&amp;gt;&lt;br /&gt;
&amp;lt;let name=thing1 val=&amp;quot;stuff&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;let name=thing2&amp;gt;other stuff&amp;lt;/let&amp;gt;&lt;br /&gt;
&amp;lt;let name=thing3&amp;gt;two&amp;lt;/let&amp;gt;&lt;br /&gt;
&amp;lt;let name=thing3 append&amp;gt; parts&amp;lt;/let&amp;gt;&lt;br /&gt;
&amp;lt;let name=thing4 copy=thing2 /&amp;gt;&lt;br /&gt;
&amp;lt;let name=thing5 copy=thing2 /&amp;gt;&lt;br /&gt;
&amp;lt;let name=thing5 append&amp;gt; &amp;lt;/let&amp;gt;&lt;br /&gt;
&amp;lt;let name=thing5 copy=thing3 append /&amp;gt;&lt;br /&gt;
&amp;lt;let name=thing6[1] val=&amp;quot;one&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;let name=thing6 index=2 val=&amp;quot;two&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;let name=thing6[3] val=&amp;quot;three&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;let name=idx val=4 /&amp;gt;&lt;br /&gt;
&amp;lt;let name=thing6[$idx] val=&amp;quot;four&amp;quot; /&amp;gt;&amp;lt;/hide&amp;gt;&lt;br /&gt;
* Test 1 - should be &amp;quot;stuff&amp;quot;: '''&amp;lt;get name=thing1 /&amp;gt;'''&lt;br /&gt;
* Test 2 - should be &amp;quot;other stuff&amp;quot;: '''&amp;lt;get name=thing2 /&amp;gt;'''&lt;br /&gt;
* Test 3 - should be &amp;quot;two parts&amp;quot;: '''&amp;lt;get name=thing3 /&amp;gt;'''&lt;br /&gt;
* Test 4 - should be &amp;quot;other stuff&amp;quot;: '''&amp;lt;get name=thing4 /&amp;gt;'''&lt;br /&gt;
* Test 5 - should be &amp;quot;other stuff two parts&amp;quot;: '''&amp;lt;get name=thing5 /&amp;gt;'''&lt;br /&gt;
* Test 6 - should be &amp;quot;one&amp;quot;: '''&amp;lt;get name=thing6[1] /&amp;gt;'''&lt;br /&gt;
* Test 7 - should be &amp;quot;two&amp;quot;: '''&amp;lt;get name=thing6[2] /&amp;gt;'''&lt;br /&gt;
* Test 8 - should be &amp;quot;three&amp;quot;: '''&amp;lt;get name=thing6 index=3 /&amp;gt;'''&lt;br /&gt;
* Test 9 - should be &amp;quot;four&amp;quot;: '''&amp;lt;get name=thing6[4] /&amp;gt;'''&amp;lt;/xml&amp;gt;&lt;/div&gt;</summary>
		<author><name>Woozle</name></author>	</entry>

	<entry>
		<id>http://htyp.org/extract.php_for_embedding_MediaWiki_contents/examples</id>
		<title>extract.php for embedding MediaWiki contents/examples</title>
		<link rel="alternate" type="text/html" href="http://htyp.org/extract.php_for_embedding_MediaWiki_contents/examples"/>
				<updated>2008-09-29T21:18:07Z</updated>
		
		<summary type="html">&lt;p&gt;Summary: New page: ==Overview== Examples of this technique in actual use. ===outside-life.com=== ''as of 2008-09-29, with Google Analystics ID redacted'' &amp;lt;php&amp;gt; &amp;lt;?php define('kPathToMediaWiki','/hsphere/local...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Overview==&lt;br /&gt;
Examples of this technique in actual use.&lt;br /&gt;
===outside-life.com===&lt;br /&gt;
''as of 2008-09-29, with Google Analystics ID redacted''&lt;br /&gt;
&amp;lt;php&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
define('kPathToMediaWiki','/hsphere/local/home/hypertwi/outside-life.com/w/');&lt;br /&gt;
define('kEmbeddedPagePrefix','Outside Life');&lt;br /&gt;
chdir(kPathToMediaWiki);&lt;br /&gt;
set_include_path(get_include_path() . PATH_SEPARATOR . kPathToMediaWiki);&lt;br /&gt;
$pgtitle = $_REQUEST['wikipage'];&lt;br /&gt;
if ($pgtitle == '') {&lt;br /&gt;
	$pgtitle = 'Comic main page';&lt;br /&gt;
}&lt;br /&gt;
/* &amp;lt;title&amp;gt;Outside Life - a batch of comics every month&amp;lt;/title&amp;gt; */&lt;br /&gt;
&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
/*&lt;br /&gt;
 Code for displaying meta tags from wiki page&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
$action = 'raw';&lt;br /&gt;
$title = 'Comic meta tags';&lt;br /&gt;
&lt;br /&gt;
// butchered extract.php code&lt;br /&gt;
require_once( './includes/WebStart.php' );&lt;br /&gt;
require_once( &amp;quot;includes/Wiki.php&amp;quot; );&lt;br /&gt;
$mediaWiki = new MediaWiki();&lt;br /&gt;
wfProfileIn( 'main-misc-setup' );&lt;br /&gt;
OutputPage::setEncodings(); # Not really used yet&lt;br /&gt;
&lt;br /&gt;
$wgTitle = Title::newFromURL( $title );&lt;br /&gt;
if ($wgTitle == NULL) {&lt;br /&gt;
	unset( $wgTitle );&lt;br /&gt;
}&lt;br /&gt;
$wgArticle = new Article($wgTitle);&lt;br /&gt;
$wgArticle-&amp;gt;loadContent();&lt;br /&gt;
echo $wgArticle-&amp;gt;mContent;&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 End of meta tag code&lt;br /&gt;
*/&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;style&amp;gt;&lt;br /&gt;
img { border-style: none; }&lt;br /&gt;
.mw-headline {&lt;br /&gt;
	color: #666666;&lt;br /&gt;
}&lt;br /&gt;
.commentBlock {&lt;br /&gt;
	color: #555555;&lt;br /&gt;
	font: 10pt sans-serif;&lt;br /&gt;
}&lt;br /&gt;
body {&lt;br /&gt;
	color: #666677;&lt;br /&gt;
}&lt;br /&gt;
A:link, A:active, A:visited {&lt;br /&gt;
	color: #555566;&lt;br /&gt;
}&lt;br /&gt;
h1 {&lt;br /&gt;
	font: 14pt sans-serif;&lt;br /&gt;
}&lt;br /&gt;
h2 {&lt;br /&gt;
	font: 12pt sans-serif;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body bgcolor=#ffffff&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$action = 'render';&lt;br /&gt;
$title = $pgtitle;&lt;br /&gt;
include 'extract.php';&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;http://www.google-analytics.com/urchin.js&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
_uacct = &amp;quot;UA-XXXXXXX-X&amp;quot;;&lt;br /&gt;
urchinTracker();&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/php&amp;gt;&lt;/div&gt;</summary>
		<author><name>Woozle</name></author>	</entry>

	<entry>
		<id>http://htyp.org/86.29.128.221</id>
		<title>86.29.128.221</title>
		<link rel="alternate" type="text/html" href="http://htyp.org/86.29.128.221"/>
				<updated>2008-09-26T18:47:54Z</updated>
		
		<summary type="html">&lt;p&gt;Summary: New page: ==Overview== [[category:IP addresses]][[category:vandals]][[86.29.128.221]] is the [[IP address]] of a user who vandalized [[Issuepedia]] on [[issuepedia:Special:Contributions/86.29.128.22...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Overview==&lt;br /&gt;
[[category:IP addresses]][[category:vandals]][[86.29.128.221]] is the [[IP address]] of a user who vandalized [[Issuepedia]] on [[issuepedia:Special:Contributions/86.29.128.221|2008-09-23]]. Going by comments in a vandalism-bragging thread on [[Encyclopedia Dramatica]], this would appear to be their user [http://encyclopediadramatica.com/User:Hagger%3F &amp;quot;Hagger?&amp;quot;].&lt;br /&gt;
&lt;br /&gt;
See also: [[207.172.128.101]]&lt;/div&gt;</summary>
		<author><name>Woozle</name></author>	</entry>

	<entry>
		<id>http://htyp.org/chfn_%28Linux_command%29</id>
		<title>chfn (Linux command)</title>
		<link rel="alternate" type="text/html" href="http://htyp.org/chfn_%28Linux_command%29"/>
				<updated>2008-09-22T05:11:51Z</updated>
		
		<summary type="html">&lt;p&gt;Summary: New page: kkkkk '''Bold == Headline text ==  text'''&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;kkkkk&lt;br /&gt;
'''Bold&lt;br /&gt;
== Headline text ==&lt;br /&gt;
 text'''&lt;/div&gt;</summary>
		<author><name>202.79.62.11</name></author>	</entry>

	<entry>
		<id>http://htyp.org/W3TPL/tags</id>
		<title>W3TPL/tags</title>
		<link rel="alternate" type="text/html" href="http://htyp.org/W3TPL/tags"/>
				<updated>2008-09-14T16:05:58Z</updated>
		
		<summary type="html">&lt;p&gt;Summary: /* Overview */ MW parser can't do nested tags&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Overview==&lt;br /&gt;
Although the main &amp;quot;meat&amp;quot; of [[W3TPL]] is the (as-yet-unfinished) parser for text within {{xmltag|w3tpl}}{{xmltag|/w3tpl}} tags, there are a number of other tags which replicate much of the same functionality and may be suitable for simpler tasks.&lt;br /&gt;
&lt;br /&gt;
In order to get around the parser, most of these tags have ways of using internal data for their values rather than depending on the parser to get things in the right order. ''to be documented''&lt;br /&gt;
&lt;br /&gt;
One of the weaknesses of the MediaWiki parser is that it cannot deal with nested tags properly; the ending-tag of a tag-pair nested inside another tag-pair results in closure of the ''outer'' tag-pair as well, and any text past the internal closing-tag is displayed rather than being passed to the tag handler. W3TPL allows you to get around this limitation by defining ''functions'' which are parsed separately from the code-block in which they are executing.&lt;br /&gt;
&lt;br /&gt;
==Tags==&lt;br /&gt;
* '''Text block inclusion''':&lt;br /&gt;
** '''{{xmltag|hide}}''': Runs the parser on everything in between the tags, but doesn't display the result. Useful for doing a lot of &amp;quot;programmish&amp;quot; stuff, so you can format it nicely and comment it without messing up your display&lt;br /&gt;
** '''{{xmltag|echo}}''': overrides the &amp;quot;hide&amp;quot; attribute (and eventually the {{xmltag|hide}} tag), i.e. displays contents&lt;br /&gt;
** '''{{xmltag|load}}''': includes the contents of another page &amp;amp;ndash; like templates, but without creating a separate instance of the page object&lt;br /&gt;
* '''{{xmltag|let}}, {{xmltag|get}}''': much like PageVars extension, but using XML tags instead of &amp;lt;nowiki&amp;gt;{{#parser}}&amp;lt;/nowiki&amp;gt; functions&lt;br /&gt;
* '''{{xmltag|func}}''': defines a function which can be called with arguments later&lt;br /&gt;
** '''{{xmltag|arg}}''': optional method of passing arguments to a function&lt;br /&gt;
** '''{{xmltag|call}}''': call a previously defined function&lt;br /&gt;
* '''Control structures''':&lt;br /&gt;
** '''{{xmltag|if}}, {{xmltag|else}}'''&lt;br /&gt;
** '''{{xmltag|1=xploop list=&amp;quot;\demarcated\list&amp;quot; repl=string-to-replace sep=separator}}''': Same as &amp;lt;nowiki&amp;gt;{{#xploop}}&amp;lt;/nowiki&amp;gt;, but uses varname instead of $s$&lt;br /&gt;
* '''Debugging''':&lt;br /&gt;
** '''{{xmltag|dump}}''': show list of all variables (with values) and functions (with code)&lt;br /&gt;
==Common Attributes==&lt;br /&gt;
* '''name'''=: name of variable being accessed (usage depends on tag)&lt;br /&gt;
* '''hide''': if present, the contents of the tag will not be displayed except for those enclosed by {{xmltag|echo}}{{xmltag|echo}} tags. If absent, the contents of the {{xmltag|echo}}{{xmltag|echo}} tags are ignored and only the remainder of the content is shown. (At present, contents of the {{xmltag|hide}} tag itself are never displayed; this will be changed to enable the {{xmltag|echo}} tag at some point.)&lt;br /&gt;
** '''Used in''': {{xmltag|if}}/{{xmltag|else}}, {{xmltag|for}}&lt;br /&gt;
* '''parse''': parse any wikitext when reading the value of a variable&lt;/div&gt;</summary>
		<author><name>Woozle</name></author>	</entry>

	<entry>
		<id>http://htyp.org/wfGetDB</id>
		<title>wfGetDB</title>
		<link rel="alternate" type="text/html" href="http://htyp.org/wfGetDB"/>
				<updated>2008-09-14T00:00:13Z</updated>
		
		<summary type="html">&lt;p&gt;Summary: LBfactory&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:MediaWiki]][[wfGetDB]] is a [[PHP]] function in the [[MediaWiki]] code. It is defined in the [[MediaWiki/GlobalFunctions.php|GlobalFunctions.php]] file, and seems to return an object of type Database, defined in [[MediaWiki/Database.php|Database.php]].&lt;br /&gt;
&lt;br /&gt;
(It calls LBFactory, defined in [[MediaWiki/LBFactory.php|LBFactory.php]], to do this; the code is a little unclear.)&lt;/div&gt;</summary>
		<author><name>Woozle</name></author>	</entry>

	<entry>
		<id>http://htyp.org/wireless_power_transmission</id>
		<title>wireless power transmission</title>
		<link rel="alternate" type="text/html" href="http://htyp.org/wireless_power_transmission"/>
				<updated>2008-09-13T01:42:57Z</updated>
		
		<summary type="html">&lt;p&gt;Summary: New page: ==Overview== [[wireless power transmission|Wireless power transmission]] is the transmission of electrical power over long distances without the use of wires connecting the two locations. ...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Overview==&lt;br /&gt;
[[wireless power transmission|Wireless power transmission]] is the transmission of electrical power over long distances without the use of wires connecting the two locations.&lt;br /&gt;
&lt;br /&gt;
Although this technology has some purely planetbound uses, it is a key technology for [[space-based solar power]].&lt;br /&gt;
&lt;br /&gt;
{{seedling}}&lt;br /&gt;
==Links==&lt;br /&gt;
===Reference===&lt;br /&gt;
* {{wikipedia|Wireless energy transfer}}&lt;br /&gt;
===News===&lt;br /&gt;
* '''2008-09-09''' [http://www.nss.org/news/releases/pr20080909.html Space-Based Solar Power Breakthrough to Be Announced]: &amp;quot;The project demonstrated wireless power transmission between two [[Hawaii]]an islands 148 kilometers apart, more than the distance from the surface of [[Earth]] to the boundary of space.&amp;quot; This type of technology has been demonstrated before (as early as the 1980s), but presumably over far shorter distances.&lt;/div&gt;</summary>
		<author><name>Woozle</name></author>	</entry>

	<entry>
		<id>http://htyp.org/space_elevator</id>
		<title>space elevator</title>
		<link rel="alternate" type="text/html" href="http://htyp.org/space_elevator"/>
				<updated>2008-09-13T01:22:11Z</updated>
		
		<summary type="html">&lt;p&gt;Summary: links - ref - wikipedia&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Overview==&lt;br /&gt;
A [[space elevator]] is any kind of solid physical connection between a satellite in planetary orbit and the planet's surface.&lt;br /&gt;
&lt;br /&gt;
In practical application, space elevators are typically designed to be capable of lifting heavy loads between orbit and the surface of a planet, as this is the main economic justification for even considering such a difficult engineering task.&lt;br /&gt;
&lt;br /&gt;
Space elevator designs currently focus on [[Earth]]-to-[[Earth orbit]], as this is where transportation is currently most badly needed; in the more distant future, however, potential colonies on [[Luna|the Moon]] or [[Mars]] might also make use of a space elevator (and indeed these would be somewhat easier to construct, from an engineering standpoint).&lt;br /&gt;
&lt;br /&gt;
Space elevators were envisioned for many years before any known material was strong enough to bear the needed loads; the discovery of [[Buckytube]]s has at last eliminated this major hurdle.&lt;br /&gt;
===Types===&lt;br /&gt;
There are two major types of space elevator:&lt;br /&gt;
* '''[[fixed cable space elevator|fixed cable]]''': the cable stays still, and compartments on it using wheels or possibly some kind of magnetic traction&lt;br /&gt;
* '''[[moving cable space elevator|moving cable]]''': the cable moves continuously and compartments clamp on to it to move and let go when they reach a destination&lt;br /&gt;
==Links==&lt;br /&gt;
===Reference===&lt;br /&gt;
* {{wikipedia}}&lt;/div&gt;</summary>
		<author><name>Woozle</name></author>	</entry>

	<entry>
		<id>http://htyp.org/space-based_solar_power</id>
		<title>space-based solar power</title>
		<link rel="alternate" type="text/html" href="http://htyp.org/space-based_solar_power"/>
				<updated>2008-09-13T00:17:49Z</updated>
		
		<summary type="html">&lt;p&gt;Summary: links - reference - Wikipedia and NSS&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Overview==&lt;br /&gt;
[[space-based solar power|Space-based solar power]] is electrical power which is generated by collecting [[solar energy]] from an installation somewhere in [[Earth orbit]] where [[sunlight]] is both more continuous (minimal &amp;quot;nighttime&amp;quot;) and unobstructed by [[atmosphere]].&lt;br /&gt;
&lt;br /&gt;
From that location, the electrical energy must somehow be transmitted to the [[Earth]]'s surface, either via [[wireless power transmission]] or via cable (which would require the construction of a [[space elevator]]). The former is currently the most feasible option, at least for the near term.&lt;br /&gt;
&lt;br /&gt;
{{seedling}}&lt;br /&gt;
==Links==&lt;br /&gt;
===Reference===&lt;br /&gt;
* {{wikipedia|Space solar power}}&lt;br /&gt;
* [http://www.nss.org/settlement/ssp/ National Space Society]&lt;br /&gt;
** ''see also [[National Space Society]]''&lt;/div&gt;</summary>
		<author><name>Woozle</name></author>	</entry>

	<entry>
		<id>http://htyp.org/W3TPL/source</id>
		<title>W3TPL/source</title>
		<link rel="alternate" type="text/html" href="http://htyp.org/W3TPL/source"/>
				<updated>2008-09-12T01:31:27Z</updated>
		
		<summary type="html">&lt;p&gt;Summary: latest (working) code&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Preface==&lt;br /&gt;
This is just a snapshot from my editor, but it does work except for the &amp;amp;lt;for&amp;amp;gt; and &amp;amp;lt;w3tpl&amp;amp;gt; tags, which are in development. Parser interactions may make it difficult to use the existing tags for complex applications, but you can get around many issues by using the &amp;quot;copy&amp;quot; attribute and $variable indirection (to be documented).&lt;br /&gt;
==Code==&lt;br /&gt;
&amp;lt;php&amp;gt;&amp;lt;?php&lt;br /&gt;
/*&lt;br /&gt;
 HISTORY:&lt;br /&gt;
	0.01 (Wzl) Mainly proof-of-concept;&lt;br /&gt;
		parser should later be optimized for execution time by using PHP intrinsic string fx instead of PHP-code loop&lt;br /&gt;
	0.02 (Wzl) Kluge to let &amp;lt;xploop&amp;gt; pull #var value under MW &amp;lt;1.12&lt;br /&gt;
 TO DO: If page is not protected, pre should be forced FALSE and post should be forced TRUE&lt;br /&gt;
	&amp;quot;pre&amp;quot; can do weird things&lt;br /&gt;
	&amp;quot;post&amp;quot; set false allows raw HTML&lt;br /&gt;
	0.03 (Wzl) &amp;lt;func&amp;gt; and related tags seem to be working&lt;br /&gt;
	0.04 (Wzl) Some debugging; now works with v1.12 {{#tag}} function and template parameters (but not very well)&lt;br /&gt;
		names are always lowercased because sometimes the parser does it for you&lt;br /&gt;
		names are always trimmed, because sometimes the parser includes extra spaces&lt;br /&gt;
	0.05 (Wzl) Added variable indirection ($); removed now-redundant &amp;quot;namer&amp;quot; attribute from &amp;lt;let&amp;gt;&lt;br /&gt;
		can we do something similar with pre-parsing? (i.e. a character to indicate the need for it -- @(stuff to parse))&lt;br /&gt;
		&amp;lt;if&amp;gt; can now make more sense, i.e. using actual values instead of assuming variable names&lt;br /&gt;
	0.06 (Wzl) xploop now using variable indirection; removed listvar parameter&lt;br /&gt;
	0.07 (Wzl) Execution trace in &amp;lt;dump&amp;gt;&lt;br /&gt;
	0.08 (Wzl) &amp;lt;trace&amp;gt; to set trace options; &amp;quot;input&amp;quot; option in &amp;lt;call&amp;gt;&lt;br /&gt;
	0.09 (Wzl) &amp;lt;echo&amp;gt; tag; &amp;lt;call&amp;gt; does not output its contents&lt;br /&gt;
	0.10 (Wzl) Code runs ok; still writing &amp;lt;w3tpl&amp;gt; tag&lt;br /&gt;
	0.11 (Wzl) Added detection of page-protection, and &amp;quot;raw&amp;quot; attribute for &amp;lt;echo&amp;gt;&lt;br /&gt;
	0.12 (Wzl) Fixed minor incompatibilities with MW 1.10&lt;br /&gt;
 BUGS:&lt;br /&gt;
	$wgW3_func needs to be an array, so you can do &amp;lt;call...&amp;gt;&amp;lt;arg&amp;gt;&amp;lt;arg&amp;gt;&amp;lt;/call&amp;gt; and then pass the return value as an argument to another function&lt;br /&gt;
 ELEMENTS:&lt;br /&gt;
	&amp;lt;hide&amp;gt;: Runs the parser on everything in between the tags, but doesn't display the result.&lt;br /&gt;
		Useful for doing a lot of &amp;quot;programmish&amp;quot; stuff, so you can format it nicely and comment it without messing up your display&lt;br /&gt;
	&amp;lt;let&amp;gt;, &amp;lt;get&amp;gt;: much like PageVars extension, but using XML tags instead of {{#parser}} functions&lt;br /&gt;
	&amp;lt;func&amp;gt;: defines a function which can be called with arguments later&lt;br /&gt;
		&amp;lt;arg&amp;gt;: optional method of passing arguments to a function&lt;br /&gt;
	&amp;lt;call&amp;gt;: call a previously defined function&lt;br /&gt;
	&amp;lt;dump&amp;gt;: show list of all variables (with values) and functions (with code)&lt;br /&gt;
	&amp;lt;if&amp;gt;, &amp;lt;else&amp;gt;: control structure&lt;br /&gt;
	&amp;lt;xploop list=&amp;quot;\demarcated\list&amp;quot; repl=string-to-replace sep=separator&amp;gt;&amp;lt;/xploop&amp;gt;: Same as {{#xploop}}, but uses varname instead of $s$&lt;br /&gt;
	TO-DO &amp;lt;w3tpl&amp;gt;&amp;lt;/w3tpl&amp;gt;: The language itself&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
$wgExtensionCredits['other'][] = array(&lt;br /&gt;
        'name' =&amp;gt; 'W3TPL',&lt;br /&gt;
        'description' =&amp;gt; 'Woozle\'s Wacky Wiki Text Processing Language',&lt;br /&gt;
        'author' =&amp;gt; 'Woozle (Nick) Staddon',&lt;br /&gt;
	'url' =&amp;gt; 'http://htyp.org/W3TPL', &lt;br /&gt;
	'version' =&amp;gt; '0.12 2008-09-08 (in progress)'&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
define('ksFuncInit','efW3TPLInit');&lt;br /&gt;
&lt;br /&gt;
//Avoid unstubbing $wgParser on setHook() too early on modern (1.12+) MW versions, as per r35980&lt;br /&gt;
if ( defined( 'MW_SUPPORTS_PARSERFIRSTCALLINIT' ) ) {&lt;br /&gt;
        $wgHooks['ParserFirstCallInit'][] = ksFuncInit;&lt;br /&gt;
} else { // Otherwise do things the old fashioned way&lt;br /&gt;
        $wgExtensionFunctions[] = ksFuncInit;&lt;br /&gt;
}&lt;br /&gt;
$wgHooks['LanguageGetMagic'][] = 'efW3_LanguageGetMagic';&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function efW3TPLInit() {&lt;br /&gt;
        global $wgParser;&lt;br /&gt;
	global $wgExtW3TPL;&lt;br /&gt;
	global $wgW3RawOk;&lt;br /&gt;
&lt;br /&gt;
// hook in &amp;lt;tag&amp;gt;-style functions:&lt;br /&gt;
        $wgParser-&amp;gt;setHook( 'hide',	'efW3Hide' );&lt;br /&gt;
        $wgParser-&amp;gt;setHook( 'let',	'efW3Let' );&lt;br /&gt;
        $wgParser-&amp;gt;setHook( 'get',	'efW3Get' );&lt;br /&gt;
        $wgParser-&amp;gt;setHook( 'echo',	'efW3Echo' );&lt;br /&gt;
        $wgParser-&amp;gt;setHook( 'dump',	'efW3Dump' );&lt;br /&gt;
        $wgParser-&amp;gt;setHook( 'trace',	'efW3Trace' );&lt;br /&gt;
        $wgParser-&amp;gt;setHook( 'if',	'efW3If' );&lt;br /&gt;
        $wgParser-&amp;gt;setHook( 'else',	'efW3Else' );&lt;br /&gt;
        $wgParser-&amp;gt;setHook( 'for',	'efW3For' );&lt;br /&gt;
        $wgParser-&amp;gt;setHook( 'func',	'efW3Func' );&lt;br /&gt;
        $wgParser-&amp;gt;setHook( 'call',	'efW3Call' );&lt;br /&gt;
        $wgParser-&amp;gt;setHook( 'arg',	'efW3Arg' );&lt;br /&gt;
        $wgParser-&amp;gt;setHook( 'load',	'efW3Load' );&lt;br /&gt;
        $wgParser-&amp;gt;setHook( 'xploop',	'efW3Xploop' );&lt;br /&gt;
        $wgParser-&amp;gt;setHook( 'w3tpl',	'efW3TPLRender' );&lt;br /&gt;
&lt;br /&gt;
// hook in {{#parser}}-style functions:&lt;br /&gt;
/*&lt;br /&gt;
MW 1.13 is totally not happy with &amp;quot;let&amp;quot;, and I don't know why.&lt;br /&gt;
Abandoning these for now; they didn't turn out to be useful in getting past the parser.&lt;br /&gt;
	$wgExtW3TPL = new W3TPL_fx ( );&lt;br /&gt;
	$wgParser-&amp;gt;setFunctionHook ( 'w3xploop',	array ( &amp;amp;$wgExtW3TPL, 'runXploop'    ) );&lt;br /&gt;
	$wgParser-&amp;gt;setFunctionHook ( 'w3xpcount',	array ( &amp;amp;$wgExtW3TPL, 'runXpCount'  ) );&lt;br /&gt;
	$wgParser-&amp;gt;setFunctionHook ( 'let',		array ( &amp;amp;$wgExtW3TPL, 'runLet'  ) );&lt;br /&gt;
	$wgParser-&amp;gt;setFunctionHook ( 'get',		array ( &amp;amp;$wgExtW3TPL, 'runGet'  ) );&lt;br /&gt;
*/&lt;br /&gt;
        return true;&lt;br /&gt;
}&lt;br /&gt;
function efW3_LanguageGetMagic( &amp;amp;$magicWords, $langCode = &amp;quot;en&amp;quot; ) {&lt;br /&gt;
    switch ( $langCode ) {&lt;br /&gt;
        default:&lt;br /&gt;
            $magicWords['w3xploop']	= array ( 0, 'w3xploop' );&lt;br /&gt;
            $magicWords['w3xpcount']	= array ( 0, 'w3xpcount' );&lt;br /&gt;
    }&lt;br /&gt;
    return true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function TrueFalse($iVar) {&lt;br /&gt;
	return $iVar?'TRUE':'FALSE';&lt;br /&gt;
}&lt;br /&gt;
function W3VarExists($iName) {&lt;br /&gt;
	global $wgW3Vars;&lt;br /&gt;
&lt;br /&gt;
	$strName = strtolower($iName);&lt;br /&gt;
	return isset($wgW3Vars[$strName]);&lt;br /&gt;
}&lt;br /&gt;
function W3KillVar($iName) {&lt;br /&gt;
	global $wgW3Vars;&lt;br /&gt;
&lt;br /&gt;
	$strName = strtolower($iName);&lt;br /&gt;
	unset($wgW3Vars[$strName]);&lt;br /&gt;
}&lt;br /&gt;
function W3SetVar($iName, $iValue) {&lt;br /&gt;
	global $wgW3Vars, $wgW3_traceVars;&lt;br /&gt;
&lt;br /&gt;
	$strName = strtolower($iName);&lt;br /&gt;
	$wgW3Vars[$strName] = $iValue;&lt;br /&gt;
	if ($wgW3_traceVars) {&lt;br /&gt;
		W3AddTrace(' ['.ShowHTML($strName).'] &amp;lt;= ['.$iValue.']');&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
function W3GetSysData($iName) {&lt;br /&gt;
	global $wgParser,$wgTitle;&lt;br /&gt;
	global $wgW3_traceVars;&lt;br /&gt;
&lt;br /&gt;
	$strName = strtolower($iName);&lt;br /&gt;
	switch ($strName) {&lt;br /&gt;
	case 'title.id':&lt;br /&gt;
		$out = $wgTitle-&amp;gt;getArticleID();&lt;br /&gt;
		break;&lt;br /&gt;
	}&lt;br /&gt;
	if ($wgW3_traceVars) {&lt;br /&gt;
		W3AddTrace(' GETSYSDATA ['.ShowHTML($iName).']: ['.$out.']');&lt;br /&gt;
	}&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
function W3GetExpr($iName) {&lt;br /&gt;
// very simple parser which recursively checks for &amp;quot;$&amp;quot;, and returns value of var if found;&lt;br /&gt;
// otherwise returns original string.&lt;br /&gt;
	global $wgW3Vars, $wgW3_traceVars;&lt;br /&gt;
	global $wgW3Trace_indent;&lt;br /&gt;
&lt;br /&gt;
	$wgW3Trace_indent++;&lt;br /&gt;
	$strOut = $iName;&lt;br /&gt;
	if ($wgW3_traceVars) {&lt;br /&gt;
		W3AddTrace(' {GETEXPR ['.ShowHTML($iName).']');&lt;br /&gt;
	}&lt;br /&gt;
	do {&lt;br /&gt;
		$chFirst = substr($strOut,0,1);&lt;br /&gt;
		if ($chFirst == '$') {&lt;br /&gt;
			$isInd = true;&lt;br /&gt;
			$strRef = strtolower(substr($strOut,1));&lt;br /&gt;
			$strOut = W3GetVal($strRef);&lt;br /&gt;
		} elseif ($chFirst == '@') {&lt;br /&gt;
			$isInd = true;&lt;br /&gt;
			$strRef = strtolower(substr($strOut,1));&lt;br /&gt;
			$strOut = W3GetSysData($strRef);&lt;br /&gt;
		} else {&lt;br /&gt;
			$isInd = false;&lt;br /&gt;
		}&lt;br /&gt;
	} while ($isInd);&lt;br /&gt;
	if ($wgW3_traceVars) {&lt;br /&gt;
		W3AddTrace(' =&amp;gt; ['.ShowHTML($strOut).'] GETEXPR}');&lt;br /&gt;
	}&lt;br /&gt;
	$wgW3Trace_indent--;&lt;br /&gt;
	return $strOut;&lt;br /&gt;
}&lt;br /&gt;
function W3GetVal($iName) {&lt;br /&gt;
// gets value of given variable&lt;br /&gt;
// checks function arguments, if function is defined&lt;br /&gt;
	global $wgW3Vars,$wgW3_traceVars;&lt;br /&gt;
	global $wgW3Trace_indent;&lt;br /&gt;
&lt;br /&gt;
	$wgW3Trace_indent++;&lt;br /&gt;
	if ($wgW3_traceVars) {&lt;br /&gt;
		W3AddTrace('{GETVAL ['.ShowHTML($iName).']');&lt;br /&gt;
	}&lt;br /&gt;
	$strName = strtolower(W3GetExpr($iName));	// follow any indirections and get ultimate value&lt;br /&gt;
	if (isset($wgW3Vars[$strName])) {&lt;br /&gt;
		$strVal = $wgW3Vars[$strName];&lt;br /&gt;
	} else {&lt;br /&gt;
		$strVal = NULL;&lt;br /&gt;
	}&lt;br /&gt;
	if ($wgW3_traceVars) {&lt;br /&gt;
		W3AddTrace('['.ShowHTML($strName).'] =&amp;gt; ['.ShowHTML($strVal).'] GETVAL}');&lt;br /&gt;
	}&lt;br /&gt;
	$wgW3Trace_indent--;&lt;br /&gt;
	return $strVal;&lt;br /&gt;
}&lt;br /&gt;
function W3AddTrace($iLine,$iInd=0) {&lt;br /&gt;
	global $wgW3Trace, $wgW3Trace_indents, $wgW3Trace_indent;&lt;br /&gt;
&lt;br /&gt;
	$wgW3Trace[] = $iLine;&lt;br /&gt;
	$wgW3Trace_indents[] = $wgW3Trace_indent;&lt;br /&gt;
	$wgW3Trace_indent += $iInd;&lt;br /&gt;
}&lt;br /&gt;
function W3Status_RawOk() {&lt;br /&gt;
	global $wgTitle;&lt;br /&gt;
&lt;br /&gt;
	return $wgTitle-&amp;gt;isProtected ('edit');&lt;br /&gt;
}&lt;br /&gt;
function efW3Hide( $input, $args, $parser ) {&lt;br /&gt;
	$parser-&amp;gt;recursiveTagParse( $input );&lt;br /&gt;
	return NULL;&lt;br /&gt;
}&lt;br /&gt;
function efW3Let( $input, $args, $parser ) {&lt;br /&gt;
        global $wgRequest;&lt;br /&gt;
	global $wgW3Vars;&lt;br /&gt;
&lt;br /&gt;
	$strCopy = NULL;&lt;br /&gt;
&lt;br /&gt;
	$strNameRaw = $args['name'];&lt;br /&gt;
// trim whitespace and check for redirection:&lt;br /&gt;
	$strName = strtolower(W3GetExpr(trim($strNameRaw)));&lt;br /&gt;
&lt;br /&gt;
	if (isset($args['copy'])) {&lt;br /&gt;
		$strCopy = $args['copy'];&lt;br /&gt;
		$strIn = W3GetVal($strCopy);&lt;br /&gt;
	} elseif (isset($args['val'])) {&lt;br /&gt;
		$strIn = $args['val'];&lt;br /&gt;
		$strTrace = 'LET VAL=['.$strIn.']-&amp;gt;';&lt;br /&gt;
		$strIn = W3GetExpr($strIn);	// check for redirections&lt;br /&gt;
		$strTrace .= '['.$strIn.']';&lt;br /&gt;
		W3AddTrace($strTrace);&lt;br /&gt;
	} elseif (isset($args['arg'])) {&lt;br /&gt;
		$strCopy = $args['arg'];&lt;br /&gt;
		$parser-&amp;gt;disableCache();&lt;br /&gt;
		$strIn = $wgRequest-&amp;gt;getVal($strCopy, $strDefault);&lt;br /&gt;
	} elseif (isset($args['chr'])) {&lt;br /&gt;
		$strIn = chr($args['chr']);&lt;br /&gt;
	} else {&lt;br /&gt;
		$strIn = $input;&lt;br /&gt;
	}&lt;br /&gt;
	if (isset($args['pre'])) {&lt;br /&gt;
		$strIn = $parser-&amp;gt;recursiveTagParse($strIn);&lt;br /&gt;
	}&lt;br /&gt;
	$strTrace = 'LET &amp;amp;ldquo;'.$strName;&lt;br /&gt;
	if ($strName != $strNameRaw) {&lt;br /&gt;
		$strTrace .= ' ('.$strNameRaw.')';&lt;br /&gt;
	}&lt;br /&gt;
	$strTrace .= '&amp;amp;rdquo; = &amp;amp;ldquo;'.$strIn.'&amp;amp;rdquo;';&lt;br /&gt;
	if ($strCopy) {&lt;br /&gt;
		$strTrace .= ' copied from &amp;lt;u&amp;gt;'.$strCopy.'&amp;lt;/u&amp;gt;';&lt;br /&gt;
	}&lt;br /&gt;
	W3AddTrace($strTrace);&lt;br /&gt;
	if (isset($args['append'])) {&lt;br /&gt;
		$wgW3Vars[$strName] .= $strIn;&lt;br /&gt;
	} else {&lt;br /&gt;
		$wgW3Vars[$strName] = $strIn;&lt;br /&gt;
	}&lt;br /&gt;
	if (isset($args['echo'])) {&lt;br /&gt;
		return $strIn;&lt;br /&gt;
	} else {&lt;br /&gt;
		return NULL;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
function efW3Get( $input, $args, $parser ) {&lt;br /&gt;
        global $wgRequest;&lt;br /&gt;
&lt;br /&gt;
	if (isset($args['default'])) {&lt;br /&gt;
		$strDefault = $args['default'];&lt;br /&gt;
	} else {&lt;br /&gt;
		$strDefault = NULL;&lt;br /&gt;
	}&lt;br /&gt;
	if (isset($args['val'])) {&lt;br /&gt;
		$strVal = $args['val'];&lt;br /&gt;
		$strVal = W3GetExpr($strVal);	// check for redirections&lt;br /&gt;
	} elseif (isset($args['arg'])) {&lt;br /&gt;
		$parser-&amp;gt;disableCache();&lt;br /&gt;
		$strVal = $wgRequest-&amp;gt;getVal($strName, $strDefault);&lt;br /&gt;
	} else {&lt;br /&gt;
		$strName = strtolower($args['name']);&lt;br /&gt;
		$strVal = W3GetVal($strName);&lt;br /&gt;
	}&lt;br /&gt;
/* is this really necessary?&lt;br /&gt;
	if (isset($args['parsename'])) {&lt;br /&gt;
		$strName = $parser-&amp;gt;recursiveTagParse($strName);&lt;br /&gt;
	}&lt;br /&gt;
*/&lt;br /&gt;
	if (isset($args['strip'])) {&lt;br /&gt;
		$strVal = ShowHTML($strVal);&lt;br /&gt;
	} else {&lt;br /&gt;
		$doRaw = FALSE;&lt;br /&gt;
		if (isset($args['raw'])) {&lt;br /&gt;
			if (W3Status_RawOk()) {&lt;br /&gt;
				$doRaw = TRUE;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		if (!$doRaw) {&lt;br /&gt;
			$strVal = $parser-&amp;gt;recursiveTagParse($strVal);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	if (isset($args['len'])) {&lt;br /&gt;
		$strVal = substr($strVal,0,$args['len']);&lt;br /&gt;
	}&lt;br /&gt;
	return $strVal;&lt;br /&gt;
}&lt;br /&gt;
function efW3Echo( $input, $args, $parser ) {&lt;br /&gt;
	global $wgW3_ifDepth,$wgW3_funcOutput;&lt;br /&gt;
&lt;br /&gt;
	if (isset($args['chr'])) {&lt;br /&gt;
		$strIn = chr($args['chr']);&lt;br /&gt;
	} else {&lt;br /&gt;
		$strIn = $input;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if (isset($args['strip'])) {&lt;br /&gt;
		$out = ShowHTML($strIn);&lt;br /&gt;
	}&lt;br /&gt;
	$doRaw = FALSE;&lt;br /&gt;
	if (isset($args['raw'])) {&lt;br /&gt;
		if (W3Status_RawOk()) {&lt;br /&gt;
			$doRaw = TRUE;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	if ($doRaw) {&lt;br /&gt;
		$out = $strIn;&lt;br /&gt;
	} else {&lt;br /&gt;
		$out = $parser-&amp;gt;recursiveTagParse($strIn);&lt;br /&gt;
	}&lt;br /&gt;
	W3AddTrace('ECHO ['.ShowHTML($strIn).']');&lt;br /&gt;
	if ($wgW3_ifDepth) {&lt;br /&gt;
		$wgW3_funcOutput[$wgW3_ifDepth] .= $out;&lt;br /&gt;
	} else {&lt;br /&gt;
		return $out;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
function efW3Dump( $input, $args, $parser ) {&lt;br /&gt;
	global $wgW3Vars, $wgW3_funcs, $wgW3Trace;&lt;br /&gt;
	global $wgW3Trace_indents;&lt;br /&gt;
&lt;br /&gt;
	$out = '&amp;lt;ul&amp;gt;';&lt;br /&gt;
	if (is_array($wgW3Vars)) {&lt;br /&gt;
		$out .= '&amp;lt;li&amp;gt;&amp;lt;b&amp;gt;Variables&amp;lt;/b&amp;gt;:&amp;lt;ul&amp;gt;';&lt;br /&gt;
		foreach ($wgW3Vars as $name =&amp;gt; $value) {&lt;br /&gt;
			$out .= '&amp;lt;li&amp;gt; ['.$name.'] = ['.$value.']';&lt;br /&gt;
		}&lt;br /&gt;
		$out .= '&amp;lt;/ul&amp;gt;';&lt;br /&gt;
	} else {&lt;br /&gt;
		$out .= '&amp;lt;li&amp;gt;&amp;lt;i&amp;gt;No variables set&amp;lt;/i&amp;gt;';&lt;br /&gt;
	}&lt;br /&gt;
	if (is_array($wgW3_funcs)) {&lt;br /&gt;
		$out .= '&amp;lt;li&amp;gt;&amp;lt;b&amp;gt;Functions&amp;lt;/b&amp;gt;:&amp;lt;ul&amp;gt;';&lt;br /&gt;
		foreach ($wgW3_funcs as $name =&amp;gt; $obj) {&lt;br /&gt;
			$out .= '&amp;lt;li&amp;gt;'.$obj-&amp;gt;dump();&lt;br /&gt;
		}&lt;br /&gt;
		$out .= '&amp;lt;/ul&amp;gt;';&lt;br /&gt;
	} else {&lt;br /&gt;
		$out .= '&amp;lt;li&amp;gt;&amp;lt;i&amp;gt;No functions defined&amp;lt;/i&amp;gt;';&lt;br /&gt;
	}&lt;br /&gt;
	if (isset($args['trace'])) {&lt;br /&gt;
		if (is_array($wgW3Trace)) {&lt;br /&gt;
			$out .= '&amp;lt;li&amp;gt;&amp;lt;b&amp;gt;Trace&amp;lt;/b&amp;gt;:&amp;lt;ul&amp;gt;';&lt;br /&gt;
			foreach ($wgW3Trace as $idx =&amp;gt; $line) {&lt;br /&gt;
				$indLine = $wgW3Trace_indents[$idx];&lt;br /&gt;
				if ($indLine &amp;gt; $indCur) {&lt;br /&gt;
					$out .= '&amp;lt;ul&amp;gt;';&lt;br /&gt;
				} elseif ($indLine &amp;lt; $indCur) {&lt;br /&gt;
					$out .= '&amp;lt;/ul&amp;gt;';&lt;br /&gt;
				}&lt;br /&gt;
				$indCur = $indLine;&lt;br /&gt;
				$out .= '&amp;lt;li&amp;gt;&amp;lt;b&amp;gt;'.$idx.'&amp;lt;/b&amp;gt; '.$line;&lt;br /&gt;
			}&lt;br /&gt;
			$out .= '&amp;lt;/ul&amp;gt;';&lt;br /&gt;
		} else {&lt;br /&gt;
			$out .= '&amp;lt;li&amp;gt;&amp;lt;i&amp;gt;No trace events&amp;lt;/i&amp;gt;';&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	$out .= '&amp;lt;/ul&amp;gt;';&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
function efW3Trace( $input, $args, $parser ) {&lt;br /&gt;
	global $wgW3_traceVars;&lt;br /&gt;
&lt;br /&gt;
	$wgW3_traceVars = isset($args['assigns']);&lt;br /&gt;
}&lt;br /&gt;
function efW3If( $input, $args, $parser ) {&lt;br /&gt;
	global $wgW3Vars,$wgW3_ifFlag,$wgW3_ifDepth,$wgW3_funcOutput;&lt;br /&gt;
&lt;br /&gt;
	$wgW3_ifDepth++;&lt;br /&gt;
	$ifFlag = false;&lt;br /&gt;
	if (isset($args['flag'])) {&lt;br /&gt;
		$strName = $args['flag'];&lt;br /&gt;
		$strVal = W3GetVal($strName);&lt;br /&gt;
		if (is_null($strVal) || ($strVal == '')) {&lt;br /&gt;
			$ifFlag = FALSE;&lt;br /&gt;
			$dbgType = 'blank';&lt;br /&gt;
		} else if (is_numeric($strVal)) {&lt;br /&gt;
			$ifFlag = ($strVal != 0);&lt;br /&gt;
			$dbgType = 'numeric';&lt;br /&gt;
		} else {&lt;br /&gt;
			$ifFlag = TRUE;&lt;br /&gt;
			$dbgType = '';&lt;br /&gt;
		}&lt;br /&gt;
		W3AddTrace(' IF('.$wgW3_ifDepth.'): ['.$strVal.']  != 0: ['.TrueFalse($ifFlag).']:'.$dbgType);&lt;br /&gt;
	} elseif (isset($args['comp'])) {&lt;br /&gt;
		$strName = $args['comp'];&lt;br /&gt;
		$strVal1 = W3GetVal($strName);&lt;br /&gt;
		$strName = $args['with'];&lt;br /&gt;
		$strVal2 = W3GetVal($strName);&lt;br /&gt;
		if (isset($args['pre'])) {&lt;br /&gt;
			$strVal1 = $parser-&amp;gt;recursiveTagParse($strVal1);&lt;br /&gt;
			$strVal2 = $parser-&amp;gt;recursiveTagParse($strVal2);&lt;br /&gt;
//			$strVal1 = $parser-&amp;gt;replaceVariables($strVal1);&lt;br /&gt;
//			$strVal2 = $parser-&amp;gt;replaceVariables($strVal2);&lt;br /&gt;
&lt;br /&gt;
		}&lt;br /&gt;
		$ifFlag = ($strVal1 == $strVal2);&lt;br /&gt;
	}&lt;br /&gt;
	if ($ifFlag) {&lt;br /&gt;
		$out = $parser-&amp;gt;recursiveTagParse($input);&lt;br /&gt;
	} else {&lt;br /&gt;
		$out = NULL;&lt;br /&gt;
	}&lt;br /&gt;
	$wgW3_ifFlag[$wgW3_ifDepth] = $ifFlag;&lt;br /&gt;
//	W3AddTrace('SETTING IFFLAG['.$wgW3_ifDepth.']=&amp;gt;['.TrueFalse($ifFlag).']');&lt;br /&gt;
//	$out .= $wgW3_funcOutput[$wgW3_ifDepth];&lt;br /&gt;
//	$wgW3_funcOutput[$wgW3_ifDepth] = NULL;	// clear the accumulated echo output&lt;br /&gt;
	$wgW3_ifDepth--;&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
function efW3Else( $input, $args, $parser ) {&lt;br /&gt;
	global $wgW3_ifFlag, $wgW3_ifDepth, $wgW3_funcOutput;&lt;br /&gt;
&lt;br /&gt;
	$wgW3_ifDepth++;&lt;br /&gt;
	$ifFlag = $wgW3_ifFlag[$wgW3_ifDepth];&lt;br /&gt;
//	W3AddTrace('GETTING IFFLAG['.$wgW3_ifDepth.']=&amp;gt;['.TrueFalse($ifFlag).']');&lt;br /&gt;
	W3AddTrace(' ELSE('.$wgW3_ifDepth.'): ['.$ifFlag.']');&lt;br /&gt;
	if ($ifFlag) {&lt;br /&gt;
		W3AddTrace('ELSE skipped');&lt;br /&gt;
		$out = NULL;&lt;br /&gt;
	} else {&lt;br /&gt;
		W3AddTrace('ELSE executed');&lt;br /&gt;
		$out = $parser-&amp;gt;recursiveTagParse($input);&lt;br /&gt;
//		W3AddTrace('ELSE: OUT = ['.ShowHTML($out).']');&lt;br /&gt;
		W3AddTrace('ELSE: OUT = ['.$out.']('.ShowHTML($out).')');&lt;br /&gt;
	}&lt;br /&gt;
	$strSaved .= $wgW3_funcOutput[$wgW3_ifDepth];&lt;br /&gt;
	$out .= $strSaved;&lt;br /&gt;
	W3AddTrace('ELSE: ADDING ['.$strSaved.']('.ShowHTML($strSaved).')');&lt;br /&gt;
	$wgW3_funcOutput[$wgW3_ifDepth] = NULL;	// clear the accumulated echo output&lt;br /&gt;
&lt;br /&gt;
	$wgW3_ifDepth--;&lt;br /&gt;
	&lt;br /&gt;
	$wgW3_funcOutput[$wgW3_ifDepth] .= $out;&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
function efW3For( $input, $args, $parser ) {&lt;br /&gt;
	if (isset($args['table'])) {&lt;br /&gt;
		$strTbl = $args['table'];&lt;br /&gt;
		$doTbl = TRUE;&lt;br /&gt;
	}&lt;br /&gt;
	if (isset($args['where'])) {&lt;br /&gt;
		$strWhere =  W3GetVal($args['where']);&lt;br /&gt;
	}&lt;br /&gt;
	$dbr =&amp;amp; wfGetDB( DB_SLAVE );&lt;br /&gt;
// IN PROGRESS&lt;br /&gt;
}&lt;br /&gt;
function efW3Func( $input, $args, $parser ) {&lt;br /&gt;
	global $wgW3_funcs;&lt;br /&gt;
&lt;br /&gt;
	foreach ($args as $name =&amp;gt; $value) {&lt;br /&gt;
		if ($pcnt) {&lt;br /&gt;
/*&lt;br /&gt;
The parser apparently sets the argument's value to its name if no value is specified.&lt;br /&gt;
This is a sort of bug for this purpose, but maybe it makes sense in other contexts.&lt;br /&gt;
The real way to get around it is to use &amp;lt;w3tpl&amp;gt; block syntax instead of the &amp;lt;func&amp;gt; tag.&lt;br /&gt;
*/&lt;br /&gt;
			if ($value != $name) {&lt;br /&gt;
				$funcArgs[$name] = $value;&lt;br /&gt;
			} else {&lt;br /&gt;
				$funcArgs[$name] = null;&lt;br /&gt;
			}&lt;br /&gt;
		} else {&lt;br /&gt;
			$funcName = strtolower($name);&lt;br /&gt;
		}&lt;br /&gt;
		$pcnt++;&lt;br /&gt;
	}&lt;br /&gt;
	W3AddTrace('FUNC &amp;amp;ldquo;'.$funcName.'&amp;amp;rdquo;');&lt;br /&gt;
	$objFunc = new clsW3Function($parser,$funcName,$funcArgs,$input);&lt;br /&gt;
	$wgW3_funcs[$funcName] = $objFunc;&lt;br /&gt;
	return NULL;&lt;br /&gt;
}&lt;br /&gt;
function efW3Call( $input, $args, $parser ) {&lt;br /&gt;
	global $wgW3_funcs,$wgW3_func,$wgW3_ifDepth,$wgW3_funcOutput;&lt;br /&gt;
&lt;br /&gt;
	$pcnt = 0;&lt;br /&gt;
	foreach ($args as $name =&amp;gt; $value) {&lt;br /&gt;
		$strName = strtolower(trim($name));&lt;br /&gt;
		if ($pcnt) {&lt;br /&gt;
			$strVal = W3GetExpr($value);&lt;br /&gt;
			$strTrace .= $objFunc-&amp;gt;LoadArg($strVal,$strName);&lt;br /&gt;
			$strTrace .= ' ';&lt;br /&gt;
		} else {&lt;br /&gt;
			$funcName = $strName;&lt;br /&gt;
			$strTrace = 'CALL '.$funcName.'( ';&lt;br /&gt;
			$objFunc = $wgW3_funcs[$funcName];&lt;br /&gt;
			$wgW3_func = $objFunc;&lt;br /&gt;
			if (!is_object($objFunc)) {&lt;br /&gt;
				$out = 'ERROR: Function &amp;quot;'.$funcName.'&amp;quot; is undefined.';&lt;br /&gt;
				return $out;&lt;br /&gt;
			}&lt;br /&gt;
			$objFunc-&amp;gt;ResetArgs();&lt;br /&gt;
		}&lt;br /&gt;
		$pcnt++;&lt;br /&gt;
	}&lt;br /&gt;
	$strTrace .= ')';&lt;br /&gt;
	if ($input) {&lt;br /&gt;
//		$strTrace .= ' INPUT: {'.ShowHTML($input).'}';&lt;br /&gt;
		$res = $parser-&amp;gt;recursiveTagParse($input);&lt;br /&gt;
//		$strTrace .= ' PARSED: {'.ShowHTML($res).'}';&lt;br /&gt;
	}&lt;br /&gt;
	W3AddTrace($strTrace);&lt;br /&gt;
	$out = $objFunc-&amp;gt;execute();&lt;br /&gt;
// LATER: implement &amp;quot;echo&amp;quot; option to include parsed contents of function&lt;br /&gt;
	$out = $wgW3_funcOutput[$wgW3_ifDepth];&lt;br /&gt;
	$wgW3_funcOutput[$wgW3_ifDepth] = NULL;	// clear the accumulated echo output&lt;br /&gt;
	$wgW3_func = NULL;		// no active function (is this still used?)&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
function efW3Arg( $input, $args, $parser ) {&lt;br /&gt;
	global $wgW3_func;&lt;br /&gt;
&lt;br /&gt;
	if (isset($args['name'])) {&lt;br /&gt;
		$name = $args['name'];&lt;br /&gt;
	} else {&lt;br /&gt;
		$name = '';&lt;br /&gt;
	}&lt;br /&gt;
	if (isset($args['pre'])) {&lt;br /&gt;
		$value = $parser-&amp;gt;recursiveTagParse($input);&lt;br /&gt;
	} else {&lt;br /&gt;
		$value = $input;&lt;br /&gt;
	}&lt;br /&gt;
	$strTrace = ' +ARG: '.$wgW3_func-&amp;gt;LoadArg($value,$name);&lt;br /&gt;
	W3AddTrace($strTrace);&lt;br /&gt;
}&lt;br /&gt;
function efW3Load( $input, $args, $parser ) {&lt;br /&gt;
	global $wgParser,$wgTitle;&lt;br /&gt;
&lt;br /&gt;
	$strTitle = $args['page'];&lt;br /&gt;
	W3AddTrace('LOAD: page={'.$strTitle.'}');&lt;br /&gt;
	$strTitle = W3GetExpr($strTitle);&lt;br /&gt;
	$doEcho = isset($args['echo']);&lt;br /&gt;
	&lt;br /&gt;
	W3AddTrace('LOAD -&amp;gt; {'.$strTitle.'}');&lt;br /&gt;
// Some pages apparently don't create the parser; if this code needs to run on one of those pages,&lt;br /&gt;
//	then this may need to create $wgParser if it doesn't exist. For now, we assume optimistically.&lt;br /&gt;
	$objTitle = Title::newFromText($strTitle);&lt;br /&gt;
	$objArticle = new Article($objTitle);&lt;br /&gt;
&lt;br /&gt;
	$txtContent = $objArticle-&amp;gt;getContent();&lt;br /&gt;
	$out = $parser-&amp;gt;recursiveTagParse($txtContent);&lt;br /&gt;
	if ($doEcho) {	&lt;br /&gt;
		return $out;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
function efW3Xploop( $input, $args, $parser ) {&lt;br /&gt;
	global $wgW3Vars,$wgW3_ifDepth,$wgW3_funcOutput;&lt;br /&gt;
&lt;br /&gt;
	$strListRaw = $args['list'];&lt;br /&gt;
	$strList = W3GetExpr($strListRaw);&lt;br /&gt;
	$strTok = $args['repl'];&lt;br /&gt;
	$doEcho = isset($args['echo']);&lt;br /&gt;
	if (isset($args['var'])) {&lt;br /&gt;
		$strVar = strtolower($args['var']);	// THIS IS GETTING SET TO WEIRD UNIQ thing?&lt;br /&gt;
	} else {&lt;br /&gt;
		$strVar = NULL;&lt;br /&gt;
	}&lt;br /&gt;
	if (isset($args['sep'])) {&lt;br /&gt;
		$sepStr = $args['sep'];&lt;br /&gt;
	} else {&lt;br /&gt;
		$sepStr = NULL;&lt;br /&gt;
	}&lt;br /&gt;
	if ($strTok) {&lt;br /&gt;
// doing a straight token replacement&lt;br /&gt;
		$strTrace = 'XPLOOP replace ('.ShowHTML($strTok).') &amp;lt;= &amp;amp;ldquo;'.ShowHTML($strList).'&amp;amp;rdquo;';&lt;br /&gt;
	} else {&lt;br /&gt;
// setting variable value&lt;br /&gt;
		$strTrace = 'XPLOOP set ('.ShowHTML($strVar).') &amp;lt;= &amp;amp;ldquo;'.ShowHTML($strList).'&amp;amp;rdquo;';&lt;br /&gt;
	}&lt;br /&gt;
	if ($strList != $strListRaw) {&lt;br /&gt;
		$strTrace .= '&amp;lt;=&amp;amp;ldquo;'.$strListRaw.'&amp;amp;rdquo;';&lt;br /&gt;
	}&lt;br /&gt;
	W3AddTrace($strTrace);&lt;br /&gt;
	if (isset($args['parselist'])) {&lt;br /&gt;
		$strList = $parser-&amp;gt;recursiveTagParse( $strList );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$tok = substr ( $strList, 0, 1);	// token for splitting&lt;br /&gt;
	if ($tok) {&lt;br /&gt;
		$tks = substr ( $strList, 1 );	// tokenized string&lt;br /&gt;
		$list = explode ( $tok, $tks );	// split the string&lt;br /&gt;
		$out = '';&lt;br /&gt;
	} else {&lt;br /&gt;
		return NULL;&lt;br /&gt;
	}&lt;br /&gt;
	if ($strTok) {&lt;br /&gt;
// doing a straight token replacement&lt;br /&gt;
		foreach ($list as $value) {&lt;br /&gt;
			if ($out) {&lt;br /&gt;
				$out .= $sepStr;&lt;br /&gt;
			}&lt;br /&gt;
			$out .= str_replace( $strTok, $value, $input );&lt;br /&gt;
		}&lt;br /&gt;
		$out = CharacterEscapes::charUnesc( $out, array(), $parser );&lt;br /&gt;
		$out = $parser-&amp;gt;recursiveTagParse( $out );&lt;br /&gt;
	} else {&lt;br /&gt;
		foreach ($list as $value) {&lt;br /&gt;
			if ($out) {&lt;br /&gt;
				$out .= $sepStr;&lt;br /&gt;
			}&lt;br /&gt;
			$wgW3Vars[$strVar] = $value;&lt;br /&gt;
			W3AddTrace(' - XP: ['.$strVar.'] &amp;lt;- ['.$value.']');&lt;br /&gt;
			$out .= $parser-&amp;gt;recursiveTagParse( $input );&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	if ($doEcho) {&lt;br /&gt;
		return $out ;&lt;br /&gt;
	} else {&lt;br /&gt;
		$out = $wgW3_funcOutput[$wgW3_ifDepth];&lt;br /&gt;
		$wgW3_funcOutput[$wgW3_ifDepth] = NULL;	// clear accumulated echo output&lt;br /&gt;
		return $out;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function efW3TPLRender( $input, $args, $parser ) {&lt;br /&gt;
	global $w3step;&lt;br /&gt;
&lt;br /&gt;
	$out = $input;&lt;br /&gt;
	if (isset($args['step'])) {&lt;br /&gt;
		$w3step = true;	// show each line of code before it is executed&lt;br /&gt;
	}&lt;br /&gt;
	if (isset($args['pre'])) {&lt;br /&gt;
		$out = $parser-&amp;gt;recursiveTagParse( $out );&lt;br /&gt;
	}&lt;br /&gt;
	if (!isset($args['notpl'])) {&lt;br /&gt;
		$out = ActualRender($out,$args);&lt;br /&gt;
	}&lt;br /&gt;
	if (isset($args['post'])) {&lt;br /&gt;
		$out = $parser-&amp;gt;recursiveTagParse( $out );&lt;br /&gt;
	}&lt;br /&gt;
	$out = ActualRender($out);&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
/*&lt;br /&gt;
 Each of these classes is initialized by passing it the remaining text&lt;br /&gt;
 They each parse that text into an array of objects, and return any remaining text for the caller to finish parsing.&lt;br /&gt;
*/&lt;br /&gt;
abstract class clsW3Code {&lt;br /&gt;
	private $vText;&lt;br /&gt;
&lt;br /&gt;
	public function __construct($iText) {&lt;br /&gt;
		$this-&amp;gt;vText = $iText;&lt;br /&gt;
	}&lt;br /&gt;
	public function Dump() {&lt;br /&gt;
		return $vText;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
abstract class clsW3Code_sub extends clsW3Code {&lt;br /&gt;
// Code with ending delimiter, after which remaining text must be parsed by caller&lt;br /&gt;
	private $vCloser;&lt;br /&gt;
	public $strRemain;&lt;br /&gt;
&lt;br /&gt;
	public function __construct($iText,$iCloser='') {&lt;br /&gt;
		$this-&amp;gt;vText = $iText;&lt;br /&gt;
		$this-&amp;gt;vCloser = $iCloser;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
class clsW3Code_body extends clsW3Code {&lt;br /&gt;
	private $vLines;&lt;br /&gt;
&lt;br /&gt;
	public function parse() {&lt;br /&gt;
		$strToParse = $this-&amp;gt;vText;&lt;br /&gt;
	&lt;br /&gt;
		$objChunk = NULL;&lt;br /&gt;
		while ($strToParse != '') {&lt;br /&gt;
			$objLine = new clsW3Code_line($strToParse);&lt;br /&gt;
			$strToParse = $objLine-&amp;gt;strRemain;&lt;br /&gt;
			$this-&amp;gt;vLines[] = $objLine;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	public function Dump() {&lt;br /&gt;
		$out = '&amp;lt;ul&amp;gt;';&lt;br /&gt;
		foreach ($this-&amp;gt;vLines as $line) {&lt;br /&gt;
			$out .= '&amp;lt;li&amp;gt;'.$line-&amp;gt;Dump();&lt;br /&gt;
		}&lt;br /&gt;
		$out .= '&amp;lt;/ul&amp;gt;';&lt;br /&gt;
		return $out;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
class clsW3Code_line extends clsW3Code_sub {&lt;br /&gt;
	private $vTokens;&lt;br /&gt;
&lt;br /&gt;
	public function parse() {&lt;br /&gt;
		$strToParse = $this-&amp;gt;vText;&lt;br /&gt;
		$isDone = FALSE;&lt;br /&gt;
		$objChunk = NULL;&lt;br /&gt;
		for ($i = 0; ($ch=substr($strToParse,$i,1)) &amp;amp;&amp;amp; !$isDone; $i++) {&lt;br /&gt;
			$doAdd = TRUE;		// TRUE = add this character to the token buffer&lt;br /&gt;
			$isTok = FALSE;		// TRUE = a token has been completed; save it and clear buffer&lt;br /&gt;
			switch ($ch) {&lt;br /&gt;
			// whitespace&lt;br /&gt;
			case ' ':	// space&lt;br /&gt;
			case &amp;quot;\t&amp;quot;:	// tab&lt;br /&gt;
				$isTok = TRUE;&lt;br /&gt;
				$doAdd = FALSE;		// don't include unquoted whitespace&lt;br /&gt;
				break;&lt;br /&gt;
			case '&amp;quot;':&lt;br /&gt;
				$isTok = TRUE;&lt;br /&gt;
				$doAdd = FALSE;		// don't include paren in token&lt;br /&gt;
				$objChunk = new clsW3_qstring(substr($input,$i+1));&lt;br /&gt;
				$strToParse = $objChunk-&amp;gt;strRemain;&lt;br /&gt;
				break;&lt;br /&gt;
			case '(':&lt;br /&gt;
				$isTok = TRUE;		// start new token&lt;br /&gt;
				$doAdd = FALSE;		// don't include paren in token&lt;br /&gt;
				$objChunk = new clsW3Code_line(substr($input,$i+1),')');&lt;br /&gt;
				$strToParse = $objChunk-&amp;gt;strRemain;&lt;br /&gt;
				break;&lt;br /&gt;
			case '{':&lt;br /&gt;
				$isTok = TRUE;		// start new token&lt;br /&gt;
				$doAdd = FALSE;		// don't include braces in token&lt;br /&gt;
				$objChunk = new clsW3Code_body(substr($input,$i+1),'}');&lt;br /&gt;
				$strToParse = $objChunk-&amp;gt;strRemain;&lt;br /&gt;
				break;&lt;br /&gt;
			case ';':&lt;br /&gt;
				$isTok = TRUE;		// start new token&lt;br /&gt;
				$doAdd = FALSE;		// don't include braces in token&lt;br /&gt;
				$isDone = TRUE;&lt;br /&gt;
				break;&lt;br /&gt;
			case &amp;quot;\n&amp;quot;:&lt;br /&gt;
				$doAdd = false;		// don't include linebreaks in $clause&lt;br /&gt;
				break;&lt;br /&gt;
			default:&lt;br /&gt;
				$isDone = ($ch == $this-&amp;gt;vCloser);&lt;br /&gt;
			}&lt;br /&gt;
			if ($doAdd) {&lt;br /&gt;
				$token .= $ch;&lt;br /&gt;
			}&lt;br /&gt;
			if ($isTok) {	// TRUE = a token has been completed; save it and clear buffer&lt;br /&gt;
				if ($token) {&lt;br /&gt;
					$objTok = new clsW3_token($token);&lt;br /&gt;
					$this-&amp;gt;vTokens[] = $objTok;&lt;br /&gt;
				}&lt;br /&gt;
				$token = NULL;&lt;br /&gt;
			}&lt;br /&gt;
			if (is_object($objChunk)) {&lt;br /&gt;
				$this-&amp;gt;vTokens[] = $objChunk;&lt;br /&gt;
				$objChunk = NULL;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		$this-&amp;gt;strRemain = substr($strToParse,$i+1);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
class clsW3_token extends clsW3Code {&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
class clsW3_phrase extends clsW3Code {&lt;br /&gt;
	private $vList;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
/*&lt;br /&gt;
class clsW3Token_rawexp extends clsW3Token {&lt;br /&gt;
	public __construct($iText) {&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
*/&lt;br /&gt;
class clsW3_qstring extends clsW3Code {&lt;br /&gt;
	public function parse() {&lt;br /&gt;
		$isDone = FALSE;&lt;br /&gt;
		for ($i = 0; ($ch=substr($input,$i,1)) &amp;amp;&amp;amp; !$isDone; $i++) {&lt;br /&gt;
			switch ($ch) {&lt;br /&gt;
			case '\\':&lt;br /&gt;
				$inEsc = true;&lt;br /&gt;
				break;&lt;br /&gt;
			case '&amp;quot;':&lt;br /&gt;
				$isDone = !$inEsc;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function ActualRender($input) {&lt;br /&gt;
// break the code up into separate commands&lt;br /&gt;
		if ($doLine) {	// TRUE = line is complete&lt;br /&gt;
			//W3AddTrace('TPL: LINE=[&amp;lt;u&amp;gt;'.$strDbgLine.'&amp;lt;/u&amp;gt;]');&lt;br /&gt;
			$out .= $cmdObj-&amp;gt;execute($lines);&lt;br /&gt;
		}&lt;br /&gt;
// final semicolon not required:&lt;br /&gt;
	if ($line) {&lt;br /&gt;
		$out .= $cmdObj-&amp;gt;execute($line,$clause);&lt;br /&gt;
	}&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 TOKEN TYPES - for future use:&lt;br /&gt;
	() phrase&lt;br /&gt;
	{} brace phrase&lt;br /&gt;
	non-quoted expression&lt;br /&gt;
	quoted string&lt;br /&gt;
*/&lt;br /&gt;
class clsW3ParsedLine {&lt;br /&gt;
	private $tokens;&lt;br /&gt;
&lt;br /&gt;
	public function __construct($iTokens) {&lt;br /&gt;
		$this-&amp;gt;tokens = $iTokens;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
class clsW3ParsedChunk {&lt;br /&gt;
	private $lines;	// array of clsW3ParsedLines&lt;br /&gt;
&lt;br /&gt;
	public function __construct($iLines) {&lt;br /&gt;
		$this-&amp;gt;lines = $iLines;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
class clsW3Command {&lt;br /&gt;
	private $statemt;&lt;br /&gt;
	private $clause;&lt;br /&gt;
&lt;br /&gt;
	public function clsW3Command($iStatemt='', $iClause='') {&lt;br /&gt;
		$this-&amp;gt;init($iStatemt, $iClause);&lt;br /&gt;
	}&lt;br /&gt;
	public function init($iStatemt, $iClause) {&lt;br /&gt;
		$this-&amp;gt;statemt = trim($iStatemt);&lt;br /&gt;
		$this-&amp;gt;clause = $iClause;&lt;br /&gt;
	}&lt;br /&gt;
	public function execute($iStatemt, $iClause) {	// init + exec&lt;br /&gt;
		$this-&amp;gt;init($iStatemt, $iClause);&lt;br /&gt;
		return $this-&amp;gt;exec();&lt;br /&gt;
	}&lt;br /&gt;
	public function exec() {&lt;br /&gt;
		global $w3step;&lt;br /&gt;
	&lt;br /&gt;
		$strStmt = $this-&amp;gt;statemt;&lt;br /&gt;
		if ($w3step) {&lt;br /&gt;
			$out = '&amp;lt;br&amp;gt;&amp;lt;b&amp;gt;CMD&amp;lt;/b&amp;gt;: {'.$strStmt.'} &amp;lt;b&amp;gt;CLAUSE&amp;lt;/b&amp;gt;: {'.$this-&amp;gt;clause.'}';&lt;br /&gt;
		}&lt;br /&gt;
/*&lt;br /&gt;
A command is in any of these forms:&lt;br /&gt;
	variable action-operator expression;&lt;br /&gt;
	expression;&lt;br /&gt;
	keyword (expression) {clause} [keyword (expression) {clause} ... ];&lt;br /&gt;
An expression is in any of these forms:&lt;br /&gt;
	function(expression[, expression[, ...]])&lt;br /&gt;
	variable compare-operator expression&lt;br /&gt;
	variable&lt;br /&gt;
	constant&lt;br /&gt;
A constant is either a quoted string or a number&lt;br /&gt;
A variable is invoked by name&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*/&lt;br /&gt;
// parse the command:&lt;br /&gt;
		for ($i = 0; $ch=substr($strStmt,$i,1); $i++) {&lt;br /&gt;
			$isArgs = FALSE;&lt;br /&gt;
			if ($isTok) {&lt;br /&gt;
				//if (!$inQuo) {&lt;br /&gt;
				if ($cmd == '') {&lt;br /&gt;
					$cmd = $phrase;&lt;br /&gt;
					$phrase = '';&lt;br /&gt;
				}&lt;br /&gt;
			} elseif ($isArgs) {&lt;br /&gt;
				$args = $phrase;&lt;br /&gt;
				$phrase = '';&lt;br /&gt;
			} else {&lt;br /&gt;
				$phrase .= $ch;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		W3AddTrace('TPL layer 2: CMD=[&amp;lt;u&amp;gt;'.$cmd.'&amp;lt;/u&amp;gt;] ARGS=[&amp;lt;u&amp;gt;'.$args.'&amp;lt;/u&amp;gt;] leftover=[&amp;lt;u&amp;gt;'.$phrase.'&amp;lt;/u&amp;gt;]');&lt;br /&gt;
//		return $out;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function ShowHTML($iText) {&lt;br /&gt;
	$out = str_replace ( '&amp;lt;','&amp;amp;lt;',$iText );&lt;br /&gt;
	$out = str_replace ( '&amp;gt;','&amp;amp;gt;',$out);&lt;br /&gt;
	$out = str_replace ( chr(7),'&amp;lt;b&amp;gt;^G&amp;lt;/b&amp;gt;',$out);&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
class w3expr {&lt;br /&gt;
	private $text;&lt;br /&gt;
	abstract function Parse($iTask);&lt;br /&gt;
} */&lt;br /&gt;
&lt;br /&gt;
class clsW3Function {&lt;br /&gt;
	var $vParser;&lt;br /&gt;
	var $vName, $vParams, $vCode;&lt;br /&gt;
	var $vArgs, $vArgIdx;&lt;br /&gt;
&lt;br /&gt;
	public function clsW3Function($iParser, $iName, $iParams, $iCode) {&lt;br /&gt;
		$this-&amp;gt;vParser = $iParser;&lt;br /&gt;
		$this-&amp;gt;vName = $iName;&lt;br /&gt;
		$this-&amp;gt;vParams = $iParams;&lt;br /&gt;
		$this-&amp;gt;vCode = $iCode;&lt;br /&gt;
	}&lt;br /&gt;
	public function dump() {&lt;br /&gt;
		$out = '&amp;lt;b&amp;gt;'.$this-&amp;gt;vName.'&amp;lt;/b&amp;gt;(';&lt;br /&gt;
		if (is_array($this-&amp;gt;vParams)) {&lt;br /&gt;
			foreach ($this-&amp;gt;vParams as $name =&amp;gt; $value) {&lt;br /&gt;
				if ($pcnt) {&lt;br /&gt;
					$out .= ', ';&lt;br /&gt;
				}&lt;br /&gt;
				$out .= '&amp;lt;u&amp;gt;'.$name.'&amp;lt;/u&amp;gt;';&lt;br /&gt;
				if (isset($value)) {&lt;br /&gt;
					$out .= '='.$value;&lt;br /&gt;
				}&lt;br /&gt;
				$pcnt++;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		$out .= ') {';&lt;br /&gt;
		$strCode = ShowHTML($this-&amp;gt;vCode);&lt;br /&gt;
		$out .= '&amp;lt;pre&amp;gt;'.$strCode.'&amp;lt;/pre&amp;gt;}';&lt;br /&gt;
		return $out;&lt;br /&gt;
	}&lt;br /&gt;
	public function ResetArgs() {&lt;br /&gt;
		$this-&amp;gt;vArgIdx = 0;&lt;br /&gt;
		unset($this-&amp;gt;vArgs);&lt;br /&gt;
	}&lt;br /&gt;
	public function LoadArg($iValue,$iName='') {&lt;br /&gt;
		if ($iName) {&lt;br /&gt;
			$strName = strtolower($iName);&lt;br /&gt;
		} else {&lt;br /&gt;
			$strName = $this-&amp;gt;ParamName($this-&amp;gt;vArgIdx);&lt;br /&gt;
			$this-&amp;gt;vArgIdx++;&lt;br /&gt;
		}&lt;br /&gt;
		$this-&amp;gt;vArgs[$strName] = $iValue;&lt;br /&gt;
		return '[&amp;lt;u&amp;gt;'.$strName.'&amp;lt;/u&amp;gt;]=&amp;amp;ldquo;'.$iValue.'&amp;amp;rdquo;';&lt;br /&gt;
	}&lt;br /&gt;
	public function HasArg($iName) {&lt;br /&gt;
		return isset($this-&amp;gt;vArgs[$iName]);&lt;br /&gt;
	}&lt;br /&gt;
	public function ArgVal($iName) {&lt;br /&gt;
		return $this-&amp;gt;vArgs[$iName];&lt;br /&gt;
	}&lt;br /&gt;
	public function ParamName($iIndex) {&lt;br /&gt;
		$keys = array_keys($this-&amp;gt;vParams);&lt;br /&gt;
		$key = $keys[$iIndex];&lt;br /&gt;
		return $key;&lt;br /&gt;
	}&lt;br /&gt;
	public function execute() {&lt;br /&gt;
	// set variables from passed arguments&lt;br /&gt;
		if (is_array($this-&amp;gt;vArgs)) {&lt;br /&gt;
			foreach ($this-&amp;gt;vArgs as $name =&amp;gt; $value) {&lt;br /&gt;
				if (W3VarExists($name)) {&lt;br /&gt;
					$oldVars[$name] = W3GetVar($name);&lt;br /&gt;
				}&lt;br /&gt;
				W3SetVar($name, $value);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	// parse (execute) the function code&lt;br /&gt;
		$out = $this-&amp;gt;vParser-&amp;gt;recursiveTagParse( $this-&amp;gt;vCode );&lt;br /&gt;
	// restore original variables (old value if any, or remove from list)&lt;br /&gt;
		if (is_array($this-&amp;gt;vArgs)) {&lt;br /&gt;
			foreach ($this-&amp;gt;vArgs as $name =&amp;gt; $value) {&lt;br /&gt;
				if (isset($oldVars[$name])) {&lt;br /&gt;
					W3SetVar($name, $oldVars[$name]);&lt;br /&gt;
				} else {&lt;br /&gt;
					W3KillVar($name);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		return $out;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
class W3TPL_fx {&lt;br /&gt;
	function runXploop ( &amp;amp;$parser, $inStr = '', $inTplt = '$s$', $inSep = '' ) &lt;br /&gt;
	{&lt;br /&gt;
		$tok = substr ( $inStr, 0, 1);	// token for splitting&lt;br /&gt;
		if ($tok) {&lt;br /&gt;
			$tks = substr ( $inStr, 1 );	// tokenized string&lt;br /&gt;
			$list = explode ( $tok, $tks );	// split the string&lt;br /&gt;
			$sep = CharacterEscapes::charUnesc( $inSep, array(), $parser );&lt;br /&gt;
			$tplt = CharacterEscapes::charUnesc( $inTplt, array(), $parser );&lt;br /&gt;
			$out = '';&lt;br /&gt;
			foreach ($list as $value) {&lt;br /&gt;
		//		$lcnt++;&lt;br /&gt;
				if ($out) {&lt;br /&gt;
					$out .= $sep;&lt;br /&gt;
				}&lt;br /&gt;
				$out .= str_replace( '$s$', $value, $tplt );&lt;br /&gt;
			}&lt;br /&gt;
			return $parser-&amp;gt;recursiveTagParse($out);&lt;br /&gt;
	//		return array($out, 'noparse' =&amp;gt; false, 'isHTML' =&amp;gt; false);&lt;br /&gt;
		} else {&lt;br /&gt;
			return NULL;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	function runXpCount ( &amp;amp;$parser, $inStr = '' ) &lt;br /&gt;
	{&lt;br /&gt;
		$tok = substr ( $inStr, 0, 1);&lt;br /&gt;
		return substr_count($inStr, $tok);&lt;br /&gt;
	}&lt;br /&gt;
	function runLet ( &amp;amp;$parser, $iName = '', $iVal = '' ) {&lt;br /&gt;
		global $wgW3Vars;&lt;br /&gt;
&lt;br /&gt;
		$strName = strtolower($iName);&lt;br /&gt;
		$strName = W3GetVal($strName);	// check for indirection ($)&lt;br /&gt;
		$wgW3Vars[$strName] .= $iVal;&lt;br /&gt;
	}&lt;br /&gt;
	function runGet ( &amp;amp;$parser, $iName = '' ) {&lt;br /&gt;
		$strName = strtolower($iName);&lt;br /&gt;
		$strVal = W3GetVal('$'.$strName);&lt;br /&gt;
		return $parser-&amp;gt;recursiveTagParse($strVal);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
*/&amp;lt;/php&amp;gt;&lt;/div&gt;</summary>
		<author><name>Woozle</name></author>	</entry>

	<entry>
		<id>http://htyp.org/W3TPL/recipes</id>
		<title>W3TPL/recipes</title>
		<link rel="alternate" type="text/html" href="http://htyp.org/W3TPL/recipes"/>
				<updated>2008-09-12T01:29:11Z</updated>
		
		<summary type="html">&lt;p&gt;Summary: /* Wikitext */ drop-down list example; changed pre to xml&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Listing Pages in a Category==&lt;br /&gt;
This bit is for a feature-in-development. I'll probably be adding full SQL capability at some point, but I want to make sure it is secure (and can be disabled in LocalSettings) before putting it in; for now, W3 is going to have data access only by filtering tables -- which can also be data views, i.e. potentially very complex SQL but only if you have db permission to create views.&lt;br /&gt;
===SQL===&lt;br /&gt;
&amp;lt;mysql&amp;gt;CREATE OR REPLACE VIEW qryW3_Titles_Catgs AS&lt;br /&gt;
  SELECT * FROM&lt;br /&gt;
  categorylinks AS cl LEFT JOIN page AS p ON cl_from=page_id;&amp;lt;/mysql&amp;gt;&lt;br /&gt;
* Very similar to the [http://semeb.com/dpldemo/index.php?title=DPL:Installation dpl_clview] view used by DPL&lt;br /&gt;
===Wikitext===&lt;br /&gt;
&amp;lt;xml&amp;gt;&lt;br /&gt;
&amp;lt;let name=including val=&amp;quot;1&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/hide&amp;gt;&amp;lt;for table=&amp;quot;qryW3_Titles_Catgs&amp;quot; where=&amp;quot;(cl_to='Data/target') AND (page_namespace=0)&amp;quot; name=pg hide&amp;gt;&lt;br /&gt;
  &amp;lt;let name=pg_title val=&amp;quot;@row.pg.page_title&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;load page=$pg_title /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;let name=title_link&amp;gt;[[&amp;lt;/let&amp;gt;&lt;br /&gt;
  &amp;lt;let name=title_link append copy=pg_title /&amp;gt;&lt;br /&gt;
  &amp;lt;let name=title_link append&amp;gt;|&amp;lt;/let&amp;gt;&lt;br /&gt;
  &amp;lt;let name=title_link append copy=keyname /&amp;gt;&lt;br /&gt;
  &amp;lt;let name=title_link append&amp;gt;]]&amp;lt;/let&amp;gt;&lt;br /&gt;
  &amp;lt;echo&amp;gt;&lt;br /&gt;
* &amp;lt;get name=title_link /&amp;gt;: &amp;quot;&amp;lt;get name=title /&amp;gt;&amp;quot;: &amp;lt;get name=source /&amp;gt;&amp;lt;/echo&amp;gt;&lt;br /&gt;
&amp;lt;/for&amp;gt;&lt;br /&gt;
&amp;lt;/xml&amp;gt;&lt;br /&gt;
* Replace &amp;quot;Data/target&amp;quot; with the name of the category you want to list&lt;br /&gt;
* Alter the line which begins with {{xmltag|1=get name=title_link /}} (i.e. everything between the {{xmltag|echo}} tags) to display what you want; &amp;quot;title&amp;quot; and &amp;quot;source&amp;quot; are from an actual live installation ([[PsyCrit]]) and are defined within the pages in that category, so each output line gives a little information about the page (effectively a mini-&amp;quot;[[dataset report|report]]&amp;quot;)&lt;br /&gt;
* The &amp;quot;including&amp;quot; variable tells the included pages not to show their category, so that this page won't think it is also in that same category.&lt;br /&gt;
&lt;br /&gt;
To use the same data to generate a form with a drop-down list of all titles returned:&lt;br /&gt;
&amp;lt;xml&amp;gt;&amp;lt;func xmltag contents&amp;gt;&lt;br /&gt;
  &amp;lt;let name=out chr=60 /&amp;gt;&lt;br /&gt;
  &amp;lt;let name=out append copy=contents /&amp;gt;&lt;br /&gt;
  &amp;lt;let name=out append chr=62 /&amp;gt;&lt;br /&gt;
  &amp;lt;echo&amp;gt;&amp;lt;get name=out raw /&amp;gt;&amp;lt;/echo&amp;gt;&lt;br /&gt;
&amp;lt;/func&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;call xmltag contents=&amp;quot;form&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;call xmltag contents=&amp;quot;SELECT NAME=target&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;for table=&amp;quot;qryW3_Titles_Catgs&amp;quot; where=&amp;quot;(cl_to='Data/target') AND (page_namespace=0)&amp;quot; sort=&amp;quot;page_title DESC&amp;quot; name=pg hide&amp;gt;&lt;br /&gt;
  &amp;lt;let name=pg_title val=&amp;quot;@row.pg.page_title&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;load page=$pg_title /&amp;gt;&lt;br /&gt;
  &amp;lt;echo&amp;gt;&amp;lt;call xmltag contents=&amp;quot;OPTION&amp;quot; /&amp;gt;&amp;lt;get name=keyname /&amp;gt; - &amp;lt;get name=title /&amp;gt;&amp;lt;call xmltag contents=&amp;quot;/OPTION&amp;quot; /&amp;gt;&amp;lt;/echo&amp;gt;&lt;br /&gt;
&amp;lt;/for&amp;gt;&lt;br /&gt;
&amp;lt;call xmltag contents=&amp;quot;/SELECT&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;call xmltag contents=&amp;quot;/form&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/xml&amp;gt;&lt;/div&gt;</summary>
		<author><name>Woozle</name></author>	</entry>

	<entry>
		<id>http://htyp.org/W3TPL</id>
		<title>W3TPL</title>
		<link rel="alternate" type="text/html" href="http://htyp.org/W3TPL"/>
				<updated>2008-09-01T13:28:22Z</updated>
		
		<summary type="html">&lt;p&gt;Summary: /* Pages */ link to new test suite page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Overview==&lt;br /&gt;
[[category:software/incomplete]][[W3TPL]], which stands for [[User:Woozle|Woozle]]'s Wacky [[Wiki]] Text Processing Language, is a [[scripting]] language extension for [[MediaWiki]]. It is currently in development, although it does perform some useful functions as-is.&lt;br /&gt;
===Pages===&lt;br /&gt;
* [[/recipes]]: useful snippets for W3TPL&lt;br /&gt;
* [[/source]]: the source code for the extension&lt;br /&gt;
* [[/tags]]: tags defined for use within wikitext&lt;br /&gt;
* [[/test suite]]: code to verify that W3TPL is working properly&lt;/div&gt;</summary>
		<author><name>Woozle</name></author>	</entry>

	<entry>
		<id>http://htyp.org/FinanceFerret/mirror_transaction</id>
		<title>FinanceFerret/mirror transaction</title>
		<link rel="alternate" type="text/html" href="http://htyp.org/FinanceFerret/mirror_transaction"/>
				<updated>2008-08-30T18:29:08Z</updated>
		
		<summary type="html">&lt;p&gt;Summary: New page: If a transaction occurs between two [[../account|account]]s which are both being tracked (i.e. they exist as records in the &amp;quot;accounts&amp;quot; table), it should ultimately generate ''two'' transac...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;If a transaction occurs between two [[../account|account]]s which are both being tracked (i.e. they exist as records in the &amp;quot;accounts&amp;quot; table), it should ultimately generate ''two'' transaction records. For example, transferring $100 from checking account A to savings account B:&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
! Local&amp;lt;br&amp;gt;Account || Remote&amp;lt;br&amp;gt;Account || valign=bottom | Amount&lt;br /&gt;
|-&lt;br /&gt;
| A || B || align=right | -$100 || (Looking at A's transactions)&lt;br /&gt;
|-&lt;br /&gt;
| B || A || align=right | +$100 || (Looking at B's transactions)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In this example, each of these two records is the '''mirror transaction''' of the other.&lt;br /&gt;
&lt;br /&gt;
Ideally, mirror transactions should be generated automatically, but in early versions of the software they had to be entered manually; as a result of this, it will be necessary to have a function which goes through any account on request and generates mirror transactions where they may be missing.&lt;br /&gt;
&lt;br /&gt;
Since some of the mirror transactions may have already been entered manually but not properly recorded as mirror transactions (by filling in the ID_TrxMirror field), this function will need to check for possible matches and present them to a human for verification before cross-linking them (filling in the ID_TrxMirror field) &amp;amp;ndash; or else a human will need to check manually for existing mirror transactions before running this function.&lt;br /&gt;
&lt;br /&gt;
It might seem that this was a dumb way to do things: why have two records for the same transaction? When showing transactions for a given account, why not show both (a) records in which the account was the source ''and'' (b) records in which the account was the target? The problem with this was in showing these records all together: the [[recordset]] resulting from a [[SQL/UNION|UNION]] of those two datasets could not be edited within a data-bound form. This may be something to consider redesigning when we are no longer using [[Microsoft Access]] for a user interface.&lt;/div&gt;</summary>
		<author><name>Woozle</name></author>	</entry>

	<entry>
		<id>http://htyp.org/Fischer-Tropsch_process</id>
		<title>Fischer-Tropsch process</title>
		<link rel="alternate" type="text/html" href="http://htyp.org/Fischer-Tropsch_process"/>
				<updated>2008-08-22T01:37:32Z</updated>
		
		<summary type="html">&lt;p&gt;Summary: New page: ==Overview== &amp;quot;The [[Fischer-Tropsch process]] (or Fischer-Tropsch Synthesis) is a [[catalyst|catalyzed]] [[chemical reaction]] in which synthesis gas ([[syngas]]), a mixture of [[carbon mo...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Overview==&lt;br /&gt;
&amp;quot;The [[Fischer-Tropsch process]] (or Fischer-Tropsch Synthesis) is a [[catalyst|catalyzed]] [[chemical reaction]] in which synthesis gas ([[syngas]]), a mixture of [[carbon monoxide]] and [[hydrogen]], is converted into liquid [[hydrocarbon]]s of various forms.&amp;quot; {{wpref}}{{seedling}}&lt;br /&gt;
==Links==&lt;br /&gt;
===Reference===&lt;br /&gt;
* {{wikipedia}}&lt;/div&gt;</summary>
		<author><name>Woozle</name></author>	</entry>

	<entry>
		<id>http://htyp.org/energy_density</id>
		<title>energy density</title>
		<link rel="alternate" type="text/html" href="http://htyp.org/energy_density"/>
				<updated>2008-08-22T01:11:48Z</updated>
		
		<summary type="html">&lt;p&gt;Summary: moved from issuepedia&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:concepts/physics]][[category:concepts/energy]][[energy density|Energy density]] refers to the amount of [[energy]] per [[weight]] or [[volume (physics)|volume]] of a given [[fuel]] (e.g. [[gasoline]]) or energy-storage device (e.g. [[electric battery|batteries]]).&lt;br /&gt;
&lt;br /&gt;
Weight is a significant factor in [[transportation]] energy storage because the more something weighs, the more difficult it is to [[acceleration|accelerate]] (after a stop), and hence the more of the fuel gets used initially for transportation of the remaining fuel (used later in the trip). This is less important in some applications (e.g. [[freight train]]s, where the weight of the cargo hugely overwhelms the weight of the fuel), but for most transportation it is highly significant in determining a vehicle's maximum possible fuel efficiency. It is especially significant in aviation, where any increase in mass leads to a significant increase in air drag.&lt;br /&gt;
&lt;br /&gt;
Volume is also important, however, in that the storage space for the [[fuel]] should not take up more than a small fraction of the vehicle's available cargo space; a fuel with high energy-per-mass but low mass-per-volume will require a large tank for storage, which is inconvenient and can also weigh a lot and counteract the benefits of the fuel's energy-per-mass.&lt;/div&gt;</summary>
		<author><name>Woozle</name></author>	</entry>

	<entry>
		<id>http://htyp.org/207.172.128.101</id>
		<title>207.172.128.101</title>
		<link rel="alternate" type="text/html" href="http://htyp.org/207.172.128.101"/>
				<updated>2008-08-21T20:30:48Z</updated>
		
		<summary type="html">&lt;p&gt;Summary: /* Vandalism Logs */ fruwiki vandalism&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Overview==&lt;br /&gt;
[[category:vandals]][[category:IP addresses]][[207.172.128.101]] is the [[IP address]] of a user who vandalized many [[MediaWiki]] wikis during the summer of 2008. Usernames he has logged in under include &amp;quot;Dash McWayne&amp;quot;, &amp;quot;Dash McWarcraft&amp;quot;, &amp;quot;Bob Saget&amp;quot;, and a few extremely long names. Vandalism includes renaming pages to include the text &amp;quot;ENJOYING BRIAN PEPPERS DAY???&amp;quot; and similar, &amp;quot;TOURETTES GUY&amp;quot;, &amp;quot;OH BOB SAGET&amp;quot; and similar, and comments about the subject of the page or the site in general (e.g. &amp;quot;SUCKS&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
He has repeatedly vandalized most of the Hypertwin wikis, including [[HTYP]], [[Issuepedia]] (English and French), [[VbzWiki]], and [[HypertWiki]]. He has also vandalized other wikis, including [[wikipedia:User talk:207.172.128.101|English Wikipedia]] and [http://es.wikipedia.org/wiki/Usuario_Discusi%C3%B3n:207.172.128.101 Spanish Wikipedia].&lt;br /&gt;
&lt;br /&gt;
Later efforts included inserting links to a shock-porn page (hosted at wiki.on''.''nimp.org, which appears to be a French server) containing a [[JavaScript|script]] which, among other things, moves the browser window when you move the mouse, making it very difficult to navigate away from the page.&lt;br /&gt;
&lt;br /&gt;
He appears to be connecting to the Internet via the [[internet service provider|ISP]] rcn.net ([[RCN Corporation]]) from somewhere in Pennsylvania; a [[traceroute]] passes through the router '''ge0-1.eas-ubr11.atw-eas.pa.cable.rcn.net''' before it stops turning up host names.&lt;br /&gt;
&lt;br /&gt;
Going from discussions on [http://encyclopediadramatica.com/Talk:Grawp this page] ('''Warning: page is full of shock porn'''; don't try scrolling to find content, just search the page for &amp;quot;issuepedia&amp;quot; or &amp;quot;barneybot&amp;quot;), he appears to be the user [http://encyclopediadramatica.com/user:BarneyBot BarneyBot] and is apparently considered a vandal by their sysops but has not been permanently banned.&lt;br /&gt;
&lt;br /&gt;
All of the vandals commenting on that page appear to have been inspired by another vandal known as Grawp, who is known for attacks on Wikipedia.&lt;br /&gt;
&lt;br /&gt;
==Vandalism Logs==&lt;br /&gt;
''not a complete record''&lt;br /&gt;
* Appropedia: [[appropedia:Special:Contributions/Dash_McWayne|Dash McWayne]] (2008-08-22)&lt;br /&gt;
* FruWiki: [[fruwiki:Special:Contributions/Dash_McWayne|Dash_McWayne]] (2008-08-05)&lt;br /&gt;
* HTYP: [[Special:Contributions/EnyaWcMhsaD|EnyaWcMhsaD]] (2008-08-28), [[Special:Contributions/Dash_McWayne|Dash McWayne]], [[Special:Contributions/HappyHacker47|HappyHacker47]] (apparently no successful edits), [[Special:Contributions/Grawp|Grawp]] (2008-09-27)&lt;br /&gt;
* HypertWiki: [[htwiki:Special:Contributions/Hammerhead|Hammerhead]] (2008-08-27), [[htwiki:Special:Contributions/Peppers of YTMNDWarcraft|Peppers of YTMNDWarcraft]]&lt;br /&gt;
* Issuepedia: [[issuepedia:Special:Contributions/Barack Obama and John McCain are gay with each other|(vandalish name)]] (2008-09-03), [[issuepedia:Special:Contributions/Hagger|Hagger]] (2008-08-27), [[issuepedia:Special:Contributions/HappyHacker47|HappyHacker47]], [[issuepedia:Special:Contributions/I liek mountain dew|I liek mountain dew]]&lt;br /&gt;
* SquadWiki: [[squadwiki:Special:Contributions/Dash McWayne|Dash McWayne]] (2008-08-28)&lt;br /&gt;
* VbzWiki: [[vbzwiki:Special:Contributions/Bob_Saget|Bob Saget]], [[vbzwiki:Special:Contributions/WikiWarcraft|WikiWarcraft]]&lt;br /&gt;
&lt;br /&gt;
It's not clear if this is the same person as the Wikipedia user [[wikipedia:Special:Contributions/Dash_McWayne|Dash McWayne]], another vandal but with a somewhat different modus operandi.&lt;br /&gt;
&lt;br /&gt;
A vandal with a very similar modus operandi attacked from the address [[86.29.128.221]].&lt;/div&gt;</summary>
		<author><name>Woozle</name></author>	</entry>

	<entry>
		<id>http://htyp.org/recipes</id>
		<title>recipes</title>
		<link rel="alternate" type="text/html" href="http://htyp.org/recipes"/>
				<updated>2008-08-18T16:44:26Z</updated>
		
		<summary type="html">&lt;p&gt;Summary: New page: ==Overview== Links to pages containing recipes ==Food== * [http://stingerfly.blogspot.com/2006/12/holiday-recipes-batata-harra.html Batata Harra]: potatoes, garlic, coriander, lemon... ** ...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Overview==&lt;br /&gt;
Links to pages containing recipes&lt;br /&gt;
==Food==&lt;br /&gt;
* [http://stingerfly.blogspot.com/2006/12/holiday-recipes-batata-harra.html Batata Harra]: potatoes, garlic, coriander, lemon...&lt;br /&gt;
** [http://lettersfromexile.blogspot.com/ commentary with some pictures]&lt;br /&gt;
* [[Fall Fest Fusion]]: trail mix&lt;/div&gt;</summary>
		<author><name>Woozle</name></author>	</entry>

	<entry>
		<id>http://htyp.org/Microsoft_Access_97</id>
		<title>Microsoft Access 97</title>
		<link rel="alternate" type="text/html" href="http://htyp.org/Microsoft_Access_97"/>
				<updated>2008-08-17T17:18:56Z</updated>
		
		<summary type="html">&lt;p&gt;Summary: /* Bugs */ report preview right-click&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Navigation==&lt;br /&gt;
&amp;lt;section begin=navbar /&amp;gt;{{#lst:Microsoft Access|navbar}}: [[Microsoft Access 97|97]]&amp;lt;section end=navbar /&amp;gt; (8.0)&lt;br /&gt;
==Overview==&lt;br /&gt;
[[Microsoft Access 97]] (MS Access 97), also known as Microsoft Access 8.0, is a version of [[Microsoft Access]] which was available either as a standalone application or as part of the [[Microsoft Office 97 Professional Edition]] [[office suite]].&lt;br /&gt;
==Bugs==&lt;br /&gt;
* '''Scroll Wheel Juggernaut Mode''': If you accidentally move the scroll wheel while displaying a data form in single-record mode (i.e. not &amp;quot;[[continuous forms]]&amp;quot; mode), Access starts going through the records one by one until it gets to the first or last record (depending on which way you scrolled); this can take quite awhile, depending on the size of the recordset being displayed and the rendering time for each current record. It cannot be interrupted in any way, except by invoking the [[Windows Task Manager]] (ctrl-alt-delete) and killing the process for Access. Ctrl-C and Ctrl-Break have no effect.&lt;br /&gt;
* '''Lookup Lockup''': If the query used to look up a value in a table view is too complex (e.g. includes a union), the entire table view (not just the field/column in question) will become &amp;quot;read-only&amp;quot;.&lt;br /&gt;
* '''Report Preview One-Way Street''': When previewing a report (&amp;quot;print preview&amp;quot; or &amp;quot;layout preview&amp;quot; mode), the right-click menu inexplicably leaves off &amp;quot;Design View&amp;quot; as one of the options. If you want to go back into design view without saving/closing/reopening the report, you have to remember that there's a &amp;quot;Design View&amp;quot; option in the &amp;quot;View&amp;quot; menu.&lt;br /&gt;
&lt;br /&gt;
==Weaknesses==&lt;br /&gt;
* Although it is possible to have a function translate source data (stored in a recordset) into a different format and have the resulting value shown automatically on a form field, it is not possible to have a corresponding routine to accept user-entered data and translate it back into data for storage in the table. It is not possible, therefore, for the user to edit data in a form or query if it has been manipulated in certain ways, including fields in queries above a certain level of complexity as well as any data which is the result of a function.&lt;br /&gt;
** The only known way around this is to have a separate data entry field which is not bound (tied directly) to a data column, and have the update performed explicitly in code.&lt;br /&gt;
* Data from some sources (tentatively: queries of a certain complexity or higher, or possibly certain types of JOINs) cause data in continuous forms to be formatted improperly. The user has to manipulate the form in certain ways (scroll to the end, scroll back, hide and reveal the window) in order to restore the display.&lt;br /&gt;
* There are no official tools for recovering data from a corrupted database file (.mdb)&lt;br /&gt;
* There appears to be a limit on the number of tables/queries which can be open simultaneously. This number is never stated outright, but if you try to open too many forms a message pops up saying &amp;quot;can't open any more databases&amp;quot;, and some of the fields on the last form opened may be empty or display improperly.&lt;br /&gt;
===Minor Annoyances===&lt;br /&gt;
* Text formatting in stored Query objects is not preserved.&lt;br /&gt;
* There is no way to set the default view for new queries to SQL; you always have to go through several mouse-clicks to get from the default Design View to SQL View when creating a new query.&lt;br /&gt;
* You can't put comments inside query SQL, although you can edit descriptions for all object types (tables, queries, forms, etc.) and there is a display mode which will show the description next to each object.&lt;br /&gt;
&lt;br /&gt;
==Possible Bugs==&lt;br /&gt;
[[SQL/UNION|UNION]] queries seem to return only unique rows; if this behavior is not desired, some kind of unique information needs to be included in the fieldset in order to prevent rows from being merged. (This is a tentative hypothesis based on one example only.) --[[User:Woozle|Woozle]] 10:21, 23 May 2006 (EDT)&lt;br /&gt;
&lt;br /&gt;
Some types of [[SQL/JOIN|JOIN]] queries will refuse to update, claiming that validation rules are being violated -- even though the underlying tables have no validation rules set. When this error happens, Access needs to specify at least one field that is causing a problem, and how the validation rule is being violated. --[[User:Woozle|Woozle]] 07:09, 10 November 2006 (EST)&lt;/div&gt;</summary>
		<author><name>Woozle</name></author>	</entry>

	<entry>
		<id>http://htyp.org/Microsoft/software</id>
		<title>Microsoft/software</title>
		<link rel="alternate" type="text/html" href="http://htyp.org/Microsoft/software"/>
				<updated>2008-08-17T17:13:26Z</updated>
		
		<summary type="html">&lt;p&gt;Summary: /* List */ MSIE&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Navigation==&lt;br /&gt;
&amp;lt;section begin=navbar /&amp;gt;{{#lst:software|navbar}}: [[Microsoft/software|Microsoft]]&amp;lt;section end=navbar /&amp;gt;&lt;br /&gt;
==Overview==&lt;br /&gt;
This page is for information about [[Microsoft]]'s software, rather than the company itself.{{seedling}}&lt;br /&gt;
==List==&lt;br /&gt;
* [[Microsoft Internet Explorer|Internet Explorer]] (MSIE) ([[web browser]])&lt;br /&gt;
* [[Microsoft Money|Money]]&lt;br /&gt;
* [[Microsoft Office|Office]]&lt;br /&gt;
** [[Microsoft Access|Access]]&lt;br /&gt;
** [[Microsoft Excel|Excel]]&lt;br /&gt;
** [[Microsoft Outlook|Outlook]]&lt;br /&gt;
** [[Microsoft PowerPoint|PowerPoint]]&lt;br /&gt;
** [[Microsoft Word|Word]]&lt;br /&gt;
* [[Microsoft Windows|Windows]]&lt;br /&gt;
** [[Windows NT|NT]]&lt;br /&gt;
** [[Windows 95|95]]&lt;br /&gt;
** [[Windows 98|98]]&lt;br /&gt;
** [[Windows 2000|2000]]&lt;br /&gt;
** [[Windows ME|ME]] (Millennium Edition - the 9x fork for y2000)&lt;br /&gt;
** [[Windows XP|XP]]&lt;br /&gt;
** [[Windows Vista|Vista]]&lt;/div&gt;</summary>
		<author><name>Woozle</name></author>	</entry>

	<entry>
		<id>http://htyp.org/Quicken</id>
		<title>Quicken</title>
		<link rel="alternate" type="text/html" href="http://htyp.org/Quicken"/>
				<updated>2008-08-17T14:35:25Z</updated>
		
		<summary type="html">&lt;p&gt;Summary: quickie seed page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Navigation==&lt;br /&gt;
[[category:software]]{{#lst:software|navbar}}: [[personal finance software]]: [[Quicken]]&lt;br /&gt;
==Overview==&lt;br /&gt;
[[Quicken]] is a [[personal finance application]] by [[Intuit, Inc.]] {{seed}}&lt;br /&gt;
==Notes==&lt;br /&gt;
For some discussion of Quicken's flaws, see [[FinanceFerret/flaws in other software]].&lt;/div&gt;</summary>
		<author><name>Woozle</name></author>	</entry>

	<entry>
		<id>http://htyp.org/FinanceFerret</id>
		<title>FinanceFerret</title>
		<link rel="alternate" type="text/html" href="http://htyp.org/FinanceFerret"/>
				<updated>2008-08-17T13:26:15Z</updated>
		
		<summary type="html">&lt;p&gt;Summary: /* Transactions */ float -&amp;gt; DECIMAL(9,2) for currency fields; tidied formatting some more&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Overview==&lt;br /&gt;
[[category:software/incomplete]][[FinanceFerret]] is the working name for an (eventually) [[open source]] personal finance manager application currently being developed by [[User:Woozle|Woozle]].&lt;br /&gt;
===Goals===&lt;br /&gt;
* To avoid [[/flaws in other software|shortcomings in existing money manager software]]&lt;br /&gt;
* To minimize the &amp;quot;setup curve&amp;quot;, i.e. the amount of preparatory work needed before any useful amounts of data can be entered&lt;br /&gt;
* To provide all basic functionality needed for the following:&lt;br /&gt;
** Tracking and balancing one's bank accounts, credit cards, and other basic types of money accounts&lt;br /&gt;
** Tracking debts and loans involving one or more other parties of varying levels of disorganization (they might or might not send you regular statements or even reliable itemizations)&lt;br /&gt;
* To make data entry as painless as possible:&lt;br /&gt;
** Easy identification of redundantly-entered transactions -- so you can Just Start Typing instead of worrying about where you left off last time&lt;br /&gt;
** Deferred data massaging -- so you can Just Start Typing, and worry about assigning proper accounts and categories to things later; the program should keep track of incomplete data massaging so you can take care of it when you have time&lt;br /&gt;
===Naming===&lt;br /&gt;
Googling for &amp;quot;[[google:financeferret|financeferret]]&amp;quot; did not turn up any apparent trademarks. The [[domain name]] &amp;quot;financeferret.com&amp;quot; was registered in 2006, but the [http://financeferret.com web site] still shows it as &amp;quot;coming soon&amp;quot; -- possibly a [[domain squatter]]. &amp;quot;financeferret.net&amp;quot; and &amp;quot;financeferret.org&amp;quot; are available as of 2008-08-17, and I don't plan to register them (got enough just-for-the-name domains sitting around sucking $12/year out of my bank account). &lt;br /&gt;
&lt;br /&gt;
From this, I determine that the name is more or less available for this use. If the registrant of financeferret.com would like to donate it to this project, I'd be happy to accept it. --[[User:Woozle|Woozle]] 09:26, 17 August 2008 (EDT)&lt;br /&gt;
===Status===&lt;br /&gt;
The software currently exists as a [[Microsoft Access 97]] program (written in VBA); I have migrated the tables to [[MySQL]], and the basic functions are now working and usable. The rest of the application will be migrated to non-proprietary platforms as time permits, and I will be posting the source code as soon as I have any worth publishing.&lt;br /&gt;
&lt;br /&gt;
The next step may be to convert it to web-based application, as HTML could possibly overcome many of the interface design issues I'm encountering.&lt;br /&gt;
&lt;br /&gt;
Early documentation for that version is [[htwiki:HyperMoney|on HypertWiki]].&lt;br /&gt;
===Concepts===&lt;br /&gt;
* [[/mirror transaction]]&lt;br /&gt;
&lt;br /&gt;
==Tables==&lt;br /&gt;
===Transactions===&lt;br /&gt;
&amp;lt;section begin=sql /&amp;gt;&amp;lt;mysql&amp;gt;DROP TABLE IF EXISTS `Transactions`;&lt;br /&gt;
CREATE TABLE  `Transactions` (&lt;br /&gt;
  `ID` int(4) NOT NULL auto_increment,&lt;br /&gt;
  `ID_Type`      varchar(50) default NULL COMMENT &amp;quot;[Trx Types].ID&amp;quot;,&lt;br /&gt;
  `ID_Acct`      int(4)      default NULL COMMENT &amp;quot;Accounts.ID - ID of account in which this transaction originates&amp;quot;,&lt;br /&gt;
  `ID_Dest`      int(4)      default NULL COMMENT &amp;quot;Accounts.ID - ID of destination account&amp;quot;,&lt;br /&gt;
  `ID_Equity`    int(4)      default NULL COMMENT &amp;quot;Accounts.ID - ID of equity account (if any)&amp;quot;,&lt;br /&gt;
  `ID_TrxMirror` int(4)      default NULL COMMENT &amp;quot;Transactions.ID -- transaction of which this one is a mirror&amp;quot;,&lt;br /&gt;
  `ID_TrxDup`    int(4)      default NULL COMMENT &amp;quot;[Trx Entered].ID -- transaction of which this one is a duplicate.&amp;quot;&lt;br /&gt;
  `CheckNum`     varchar(50) default NULL COMMENT &amp;quot;check # or other identifying text unique to this transaction within the current account (optional)&amp;quot;,&lt;br /&gt;
  `Amount`       DECIMAL(9,2) default NULL COMMENT &amp;quot;Amount added to ID_Acct account&amp;quot;,&lt;br /&gt;
  `AmountOrig`   DECIMAL(9,2) default NULL COMMENT &amp;quot;Amount in check register, when bank disagrees&amp;quot;,&lt;br /&gt;
  `DateAction`   datetime     default NULL COMMENT &amp;quot;Date action was taken (e.g. date on the check)&amp;quot;,&lt;br /&gt;
  `DateEffective` datetime    default NULL COMMENT &amp;quot;Date as recorded by financial institution (on statement)&amp;quot;,&lt;br /&gt;
  `WhenEntered`  datetime     default NULL COMMENT &amp;quot;When this transaction was entered into the system&amp;quot;,&lt;br /&gt;
  `WhenChanged`  datetime     default NULL COMMENT &amp;quot;When this transaction was last edited&amp;quot;,&lt;br /&gt;
  `WhoEntered`   varchar(63)  default NULL COMMENT &amp;quot;[user]@machine of who entered the transaction (see log for further edits)&amp;quot;,&lt;br /&gt;
  `Accounted`    tinyint(1)   default NULL COMMENT &amp;quot;TRUE = assume transaction is accounted for by institution (use only if effective date is not available)&amp;quot;,&lt;br /&gt;
  `Voided`       tinyint(1)   default NULL COMMENT &amp;quot;transaction voided&amp;quot;,&lt;br /&gt;
  `ToVerify`     tinyint(1)   default NULL COMMENT &amp;quot;transaction needs to be verified -- created automatically&amp;quot;,&lt;br /&gt;
  `IsApprox`     tinyint(1)   default NULL COMMENT &amp;quot;exact amount of transaction is not known yet&amp;quot;,&lt;br /&gt;
  `SortEntry`    varchar(50)  default NULL COMMENT &amp;quot;transaction order as entered into checkbook register&amp;quot;,&lt;br /&gt;
  `SortInst`     varchar(50)  default NULL COMMENT &amp;quot;Order shown by financial institution (on statement)&amp;quot;,&lt;br /&gt;
  `BalanceImmed` DECIMAL(9,2) default NULL COMMENT &amp;quot;Balance as given by financial institution at time of transaction (customarily includes this transaction in the figuring, but ok if otherwise)&amp;quot;,&lt;br /&gt;
  `BalanceStated` DECIMAL(9,2) default NULL COMMENT &amp;quot;Balance after this transaction as given by financial institution on regular statement&amp;quot;,&lt;br /&gt;
  `BalanceEquity` DECIMAL(9,2) DEFAULT NULL COMMENT &amp;quot;equity balance for ID_Acct with respect to ID_Equity&amp;quot;,&lt;br /&gt;
  `UseBalanceEffective` tinyint(1) default NULL COMMENT &amp;quot;TRUE = restart balance calculations using BalanceEffective; FALSE = continue calculating using calculated balance&amp;quot;,&lt;br /&gt;
  `UseBalanceEquityEff` BOOL   default FALSE COMMENT &amp;quot;TRUE = reset BalanceEquity to 0 regardless of calculations&amp;quot;,&lt;br /&gt;
  `Descr`        varchar(255)  default NULL COMMENT &amp;quot;text describing the transaction -- similar to memo field on check&amp;quot;,&lt;br /&gt;
  `CalcBalance`  DECIMAL(9,2)  default NULL COMMENT &amp;quot;balance as calculated by FinanceFerret&amp;quot;,&lt;br /&gt;
  PRIMARY KEY  (`ID`),&lt;br /&gt;
  KEY `Acct` (`ID_Acct`)&lt;br /&gt;
) ENGINE=MyISAM;&amp;lt;/mysql&amp;gt;&lt;br /&gt;
&amp;lt;section end=sql /&amp;gt;&lt;br /&gt;
This is pretty much the Access version, with a minor tweak for multiuser support (WhoEntered).&lt;br /&gt;
* '''AmountOrig''': not sure if this is actually being used; I think it was a sort of &amp;quot;back up&amp;quot; for one of the balance numbers, but it might be superceded by the Immed/Stated balance fields. Look at the data... but I know I haven't looked at it directly in years. See if the code does anything with it.&lt;br /&gt;
* '''ToVerify''': also never used so far; it might be better just to have a separate table, since this flag will only ever be set temporarily.&lt;br /&gt;
* '''IsApprox''': this is for attempting to budget ahead -- you know your electric bill is coming in two weeks, but you don't yet know the total; this lets you enter an approximate amount to deduct from your available funds while still keeping track of the fact that you don't actually know the amount&lt;br /&gt;
* '''CalcBalance''': one tricky issue here is that the balance should only be calculated based on the ''bank's'' sorting order, but the transactions can be displayed in lots of different sortings. Should there be an index field to show the order of all transactions at the time of the last balance, to make recalculation faster? Or would it not even have that effect?&lt;br /&gt;
&lt;br /&gt;
Future changes:&lt;br /&gt;
* Change terminology from source/destination to local/remote -- local is the account whose transactions you're looking at, and remote is the other one: &lt;br /&gt;
** &amp;lt;u&amp;gt;ID_Acct&amp;lt;/u&amp;gt; -&amp;gt; ID_Local&lt;br /&gt;
** &amp;lt;u&amp;gt;ID_Dest&amp;lt;/u&amp;gt; -&amp;gt; ID_Remote&lt;br /&gt;
* ...or possibly it's not necessary to represent double-entry accounting with two actual records, if we can generate both views from the same data.&lt;br /&gt;
&lt;br /&gt;
===Trx Types===&lt;br /&gt;
Transaction types&lt;br /&gt;
&amp;lt;section begin=sql /&amp;gt;&amp;lt;mysql&amp;gt;DROP TABLE IF EXISTS `Trx Types`;&lt;br /&gt;
CREATE TABLE  `Trx Types` (&lt;br /&gt;
  `Code` varchar(50) NOT NULL            COMMENT &amp;quot;identifying abbreviation&amp;quot;,&lt;br /&gt;
  `Descr` varchar(50) default NULL       COMMENT &amp;quot;description&amp;quot;,&lt;br /&gt;
  `IsDebit` BOOL NOT NULL DEFAULT FALSE  COMMENT &amp;quot;TRUE = debits from source account; FALSE = credits to source account&amp;quot;,&lt;br /&gt;
  `IsEquity` BOOL NOT NULL DEFAULT FALSE COMMENT &amp;quot;TRUE = affects equity only; FALSE = regular transaction&amp;quot;,&lt;br /&gt;
  PRIMARY KEY  (`Code`)&lt;br /&gt;
) ENGINE=MyISAM DEFAULT;&amp;lt;/mysql&amp;gt;&lt;br /&gt;
&amp;lt;section end=sql /&amp;gt;&lt;br /&gt;
* The name of this table should be changed later because &amp;quot;Types&amp;quot; is a keyword and confuses the syntax display parser&lt;br /&gt;
* Transaction amounts are generally entered as ''positive'' numbers; the direction in which the amount is moving is determined by the transaction type.&lt;br /&gt;
&lt;br /&gt;
===Event Log===&lt;br /&gt;
Copied, with only slight changes, from [[VbzCart tables]]. This version is suitable for re-use in other projects, but perhaps should be renamed EventLog or Events because the MySQL syntax highlighter thinks &amp;quot;log&amp;quot; is a keyword.&lt;br /&gt;
&amp;lt;section begin=sql /&amp;gt;&amp;lt;mysql&amp;gt;DROP TABLE IF EXISTS `Event Log`;&lt;br /&gt;
CREATE TABLE `Event Log` (&lt;br /&gt;
    ID INT NOT NULL AUTO_INCREMENT COMMENT &amp;quot;log line identifier&amp;quot;,&lt;br /&gt;
    EvWhen DATETIME NOT NULL COMMENT &amp;quot;when the event started&amp;quot;,&lt;br /&gt;
    EvWhere varchar(255) COMMENT &amp;quot;where in the code the event happened (suitable for filtering)&amp;quot;,&lt;br /&gt;
    Params varchar(255) COMMENT &amp;quot;any relevant parameters&amp;quot;,&lt;br /&gt;
    Descr varchar(255) COMMENT &amp;quot;description of event&amp;quot;,&lt;br /&gt;
    Code INT DEFAULT NULL COMMENT &amp;quot;numeric event code unique to location (EvWhere)&amp;quot;,&lt;br /&gt;
    AppUser varchar(127) COMMENT &amp;quot;application username, for when we have a user-security system&amp;quot;,&lt;br /&gt;
    SysUser varchar(127) COMMENT &amp;quot;who logged into the operating system (username)&amp;quot;,&lt;br /&gt;
    Machine varchar(64) COMMENT &amp;quot;network name of machine from which the event was initiated, if applicable&amp;quot;,&lt;br /&gt;
    isError BOOL COMMENT &amp;quot;FALSE = this is just a message or normal event; TRUE = there is a problem to fix (error)&amp;quot;,&lt;br /&gt;
    isSevere BOOL COMMENT &amp;quot;TRUE = important enough to send email to admin immediately&amp;quot;,&lt;br /&gt;
    Notes varchar(255) DEFAULT NULL COMMENT &amp;quot;manually-entered notes&amp;quot;,&lt;br /&gt;
    PRIMARY KEY (`ID`)&lt;br /&gt;
 ) ENGINE = MYISAM;&amp;lt;/mysql&amp;gt;&lt;br /&gt;
&amp;lt;section end=sql /&amp;gt;&lt;br /&gt;
* Have to use &amp;quot;Ev&amp;quot; prefix because When and Where are keywords.&lt;/div&gt;</summary>
		<author><name>Woozle</name></author>	</entry>

	<entry>
		<id>http://htyp.org/Secure_Sockets_Layer</id>
		<title>Secure Sockets Layer</title>
		<link rel="alternate" type="text/html" href="http://htyp.org/Secure_Sockets_Layer"/>
				<updated>2008-08-15T21:33:31Z</updated>
		
		<summary type="html">&lt;p&gt;Summary: more info&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Overview==&lt;br /&gt;
[[category:computer terminology]][[Secure Sockets Layer]] (SSL) is an encryption technology used for providing secure connections over computer networks, especially the [[World Wide Web]]. In particular, it is used in the [[https]] protocol.{{seedling}}&lt;br /&gt;
===Terminology===&lt;br /&gt;
* [[Certificate Authority File]]&lt;br /&gt;
* [[Certificate Chain File]]: looks like this is a concatenation of the certificates which form a chain from your domain back to the root.&lt;br /&gt;
** It's not clear whether they need to be in order or not.&lt;br /&gt;
** It's not clear whether this terminology is [[HSphere]]-specific or in general usage.&lt;br /&gt;
** Apparently the root certificate can be included but is optional.&lt;br /&gt;
==Links==&lt;br /&gt;
===Reference===&lt;br /&gt;
* {{wikipedia}}&lt;br /&gt;
==Notes==&lt;br /&gt;
* [[openssl verify]] [http://www.mkssoftware.com/docs/man1/openssl_verify.1.asp] seems to be the tool of choice for checking certificate files stored locally.&lt;br /&gt;
* [http://lists2.ssc.com/pipermail/linux-list/2007-October/029355.html This] also has some useful information about using [[openssl]], and a little bit about the &amp;quot;chaining&amp;quot; concept.&lt;/div&gt;</summary>
		<author><name>Woozle</name></author>	</entry>

	<entry>
		<id>http://htyp.org/SSL</id>
		<title>SSL</title>
		<link rel="alternate" type="text/html" href="http://htyp.org/SSL"/>
				<updated>2008-08-15T21:28:31Z</updated>
		
		<summary type="html">&lt;p&gt;Summary: New page: [[category:disambiguation]][[category:acronyms]][[SSL]] stands for: * [[Secure Sockets Layer]], the [[encryption]] technique used for the [[https]] [[protocol]] and [[ssh]]&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:disambiguation]][[category:acronyms]][[SSL]] stands for:&lt;br /&gt;
* [[Secure Sockets Layer]], the [[encryption]] technique used for the [[https]] [[protocol]] and [[ssh]]&lt;/div&gt;</summary>
		<author><name>Woozle</name></author>	</entry>

	<entry>
		<id>http://htyp.org/design-to-cost_energy</id>
		<title>design-to-cost energy</title>
		<link rel="alternate" type="text/html" href="http://htyp.org/design-to-cost_energy"/>
				<updated>2008-08-14T23:46:36Z</updated>
		
		<summary type="html">&lt;p&gt;Summary: New page: ==Overview== There are a number of projects attempting to engineer [[alternative energy]] systems with [[design to cost|price as a design goal]], where the target prices are significantly ...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Overview==&lt;br /&gt;
There are a number of projects attempting to engineer [[alternative energy]] systems with [[design to cost|price as a design goal]], where the target prices are significantly less than those of mainstream energy sources.{{seedling}}&lt;br /&gt;
===Pages===&lt;br /&gt;
* [[dollar a gallon gasoline]]&lt;br /&gt;
* [[Penny a kW]]&lt;/div&gt;</summary>
		<author><name>Woozle</name></author>	</entry>

	<entry>
		<id>http://htyp.org/MediaWiki_1.12</id>
		<title>MediaWiki 1.12</title>
		<link rel="alternate" type="text/html" href="http://htyp.org/MediaWiki_1.12"/>
				<updated>2008-08-14T01:47:53Z</updated>
		
		<summary type="html">&lt;p&gt;Summary: /* Attempted Solutions */ one in-code solution&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Navigation==&lt;br /&gt;
&amp;lt;section begin=navbar /&amp;gt;{{#lst:MediaWiki|navbar}}: [[MediaWiki 1.12|version 1.12]]&amp;lt;section end=navbar /&amp;gt;&lt;br /&gt;
==Parser Changes==&lt;br /&gt;
The wikitext parser (Parser.php) has been substantially rewritten for this version. Although this makes it more efficient (presumably faster serving of pages), it also breaks some extensions and certain usages of other extensions.&lt;br /&gt;
&lt;br /&gt;
The basic problem seems to be the order in which things are processed. In v1.12, &amp;lt;nowiki&amp;gt;&amp;lt;tag&amp;gt;s&amp;lt;/nowiki&amp;gt; are processed first, followed by &amp;lt;nowiki&amp;gt;{{#parser_function}}s&amp;lt;/nowiki&amp;gt;; the latter are also only parsed once, whereas before there were sometimes two (or possibly more) passes.&lt;br /&gt;
&lt;br /&gt;
===Example===&lt;br /&gt;
A third-party parser function called '''xploop''' is invoked like this:&lt;br /&gt;
&amp;lt;nowiki&amp;gt;{{#xploop:\one\two\three\four|\n* This is line $s$}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
This results in the following, where the &amp;quot;\one\two\three\four&amp;quot; string is split on the first character (&amp;quot;\&amp;quot;) and the remaining text is &amp;quot;executed&amp;quot; once for each item found, with &amp;quot;$s$&amp;quot; being replaced by the value from the first string:&lt;br /&gt;
* This is line one&lt;br /&gt;
* This is line two&lt;br /&gt;
* This is line three&lt;br /&gt;
* This is line four&lt;br /&gt;
&lt;br /&gt;
This continues to work under 1.12. The problem occurred with a usage where the $s$ was being used to refer to a variable set using the PageVars extension:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{#vardefine:varone|first}}&lt;br /&gt;
{{#vardefine:vartwo|second}}&lt;br /&gt;
{{#vardefine:varthree|third}}&lt;br /&gt;
{{#vardefine:varfour|fourth}}&lt;br /&gt;
{{#vardefine:var$s$|WRONG!}}&lt;br /&gt;
{{#xploop:\one\two\three\four|\n* This is the \o#var:var$s$\c line}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
(&amp;quot;\n&amp;quot;, &amp;quot;\o&amp;quot;, and &amp;quot;\c&amp;quot; are all &amp;quot;escape&amp;quot; sequences translated by the EscapeChars extension into a newline, double open braces, and double closing braces respectively.)&lt;br /&gt;
&lt;br /&gt;
Under v1.11, the output was:&lt;br /&gt;
* This is the first line&lt;br /&gt;
* This is the second line&lt;br /&gt;
* This is the third line&lt;br /&gt;
* This is the fourth line &lt;br /&gt;
&lt;br /&gt;
Under v1.12, the output now looks like this:&lt;br /&gt;
* This is the &amp;lt;nowiki&amp;gt;{{#var:varone}}&amp;lt;/nowiki&amp;gt; line&lt;br /&gt;
* This is the &amp;lt;nowiki&amp;gt;{{#var:vartwo}}&amp;lt;/nowiki&amp;gt; line&lt;br /&gt;
* This is the &amp;lt;nowiki&amp;gt;{{#var:varthree}}&amp;lt;/nowiki&amp;gt; line&lt;br /&gt;
* This is the &amp;lt;nowiki&amp;gt;{{#var:varfour}}&amp;lt;/nowiki&amp;gt; line&lt;br /&gt;
&lt;br /&gt;
In other words, the \o and \c are being translated into braces, but the braces are not then being parsed to execute the #var parser function. Changing the \o and \c to actual braces gives this output:&lt;br /&gt;
* This is the WRONG! line&lt;br /&gt;
* This is the WRONG! line&lt;br /&gt;
* This is the WRONG! line&lt;br /&gt;
* This is the WRONG! line&lt;br /&gt;
&lt;br /&gt;
In other words, the &amp;lt;nowiki&amp;gt;{{var:var$s$}}&amp;lt;/nowiki&amp;gt; sequence is being parsed ''before'' the $s$ is replaced &amp;amp;ndash; the situation which the escape characters are intended to prevent. So the parsing behavior ''before'' calling the outer #xploop function seems unchanged; what has changed is that the ''output'' of #xploop is no longer being parsed further.&lt;br /&gt;
===Attempted Solutions===&lt;br /&gt;
So far, all solutions seem to involve making changes to extension code or creating entirely new extensions to do things properly rather than relying on the vagaries of parser processing. Also, I haven't yet found any solutions which can be used as a drop-in replacement for templates using this function (or presumably other parser functions broken by the change). Will document what I find as I map it out. --[[User:Woozle|Woozle]] 21:47, 13 August 2008 (EDT)&lt;br /&gt;
* '''return $parser-&amp;gt;recursiveTagParse($out);''' instead of '''return $out;''', where $out is the parser function's output. Perhaps this can be made conditional on the parser version, if there is a constant for that.&lt;/div&gt;</summary>
		<author><name>Woozle</name></author>	</entry>

	<entry>
		<id>http://htyp.org/OpenID</id>
		<title>OpenID</title>
		<link rel="alternate" type="text/html" href="http://htyp.org/OpenID"/>
				<updated>2008-08-13T20:57:43Z</updated>
		
		<summary type="html">&lt;p&gt;Summary: New page: ==Overview== [[OpenID]] &amp;quot;is an open, decentralized, free framework for user-centric digital identity&amp;quot;, according to their web site. In less jargon-laden terms, it allows users to use the s...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Overview==&lt;br /&gt;
[[OpenID]] &amp;quot;is an open, decentralized, free framework for user-centric digital identity&amp;quot;, according to their web site. In less jargon-laden terms, it allows users to use the same [[log-in]] (username/password) to access multiple web sites, without having to create a new account on each site. It also allows each of those accounts to be recognized as the same actual [[IRL|real-life]] user.{{seed}}&lt;br /&gt;
==Links==&lt;br /&gt;
===Reference===&lt;br /&gt;
* [http://openid.net/ official web site]&lt;br /&gt;
* {{wikipedia}}&lt;br /&gt;
===Code===&lt;br /&gt;
* [http://siege.org/projects/phpMyID/ phpMyID]: a single user OpenID server written in [[PHP]]&lt;/div&gt;</summary>
		<author><name>Woozle</name></author>	</entry>

	<entry>
		<id>http://htyp.org/lightning</id>
		<title>lightning</title>
		<link rel="alternate" type="text/html" href="http://htyp.org/lightning"/>
				<updated>2008-08-12T23:11:56Z</updated>
		
		<summary type="html">&lt;p&gt;Summary: New page: ==Overview== [[category:natural phenomena]]{{seed}} ==Links== ===Videos=== * [http://gizmodo.com/5034458/slow-motion-lightning-video-is-mindblowing-will-sell-a-thousand-slo+mo-cameras Slow...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Overview==&lt;br /&gt;
[[category:natural phenomena]]{{seed}}&lt;br /&gt;
==Links==&lt;br /&gt;
===Videos===&lt;br /&gt;
* [http://gizmodo.com/5034458/slow-motion-lightning-video-is-mindblowing-will-sell-a-thousand-slo+mo-cameras Slow Motion Lightning Video is Mindblowing, Will Sell a Thousand Slo-Mo Cameras]: the lightning clearly seeks downward for a path to ground; when it finds one, the return charge comes back up too fast for even this camera to capture.&lt;br /&gt;
** clip is apparently from the [[BBC]] documentary ''The Power of the Planet &amp;amp;ndash; Atmosphere''&lt;/div&gt;</summary>
		<author><name>Woozle</name></author>	</entry>

	<entry>
		<id>http://htyp.org/design_to_cost</id>
		<title>design to cost</title>
		<link rel="alternate" type="text/html" href="http://htyp.org/design_to_cost"/>
				<updated>2008-08-06T20:12:32Z</updated>
		
		<summary type="html">&lt;p&gt;Summary: New page: [[category:terminology]]&amp;quot;[[design to cost|Design to cost]] is a [[management]] strategy and supporting methodologies to achieve an affordable product by treating target cost as an independ...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:terminology]]&amp;quot;[[design to cost|Design to cost]] is a [[management]] strategy and supporting methodologies to achieve an affordable product by treating target cost as an independent design parameter that needs to be achieved during the development of a product.&amp;quot; [http://www.npd-solutions.com/dtc.html]&lt;br /&gt;
&lt;br /&gt;
Applications of this methodology include the [[dollar a gallon gasoline]] project.&lt;/div&gt;</summary>
		<author><name>Woozle</name></author>	</entry>

	<entry>
		<id>http://htyp.org/Georgia_Task_Force_for_the_Homeless</id>
		<title>Georgia Task Force for the Homeless</title>
		<link rel="alternate" type="text/html" href="http://htyp.org/Georgia_Task_Force_for_the_Homeless"/>
				<updated>2008-08-04T22:37:01Z</updated>
		
		<summary type="html">&lt;p&gt;Summary: New page: ==Overview== [[category:US.GA]]The [[Georgia Task Force for the Homeless]] is the [[Georgia|statewide]] initiative of the [[Metro Atlanta Task Force for the Homeless]].  {{seedling}} ===Co...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Overview==&lt;br /&gt;
[[category:US.GA]]The [[Georgia Task Force for the Homeless]] is the [[Georgia|statewide]] initiative of the [[Metro Atlanta Task Force for the Homeless]].&lt;br /&gt;
&lt;br /&gt;
{{seedling}}&lt;br /&gt;
===Contact===&lt;br /&gt;
* '''Coordinator''': Lynne Griever&lt;br /&gt;
&lt;br /&gt;
They do not appear to have a web site.&lt;/div&gt;</summary>
		<author><name>Woozle</name></author>	</entry>

	<entry>
		<id>http://htyp.org/Metro_Atlanta_Task_Force_for_the_Homeless</id>
		<title>Metro Atlanta Task Force for the Homeless</title>
		<link rel="alternate" type="text/html" href="http://htyp.org/Metro_Atlanta_Task_Force_for_the_Homeless"/>
				<updated>2008-08-04T22:35:15Z</updated>
		
		<summary type="html">&lt;p&gt;Summary: New page: ==Overview== [[category:US.GA.Atlanta]][[category:organizations]]The [[Metro Atlanta Task Force for the Homeless]], founded in 1981, is an {{instate|Atlanta|GA}}-based nonprofit [[501(c)(3...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Overview==&lt;br /&gt;
[[category:US.GA.Atlanta]][[category:organizations]]The [[Metro Atlanta Task Force for the Homeless]], founded in 1981, is an {{instate|Atlanta|GA}}-based nonprofit [[501(c)(3) organization]] which serves as a central coordinating agency for services to individuals who are homeless.&lt;br /&gt;
&lt;br /&gt;
It is a member of the [[National Coalition for the Homeless]].&lt;br /&gt;
===Initiatives===&lt;br /&gt;
* [[Georgia Task Force for the Homeless]]: statewide&lt;br /&gt;
==Links==&lt;br /&gt;
===Official===&lt;br /&gt;
* [http://www.homelesstaskforce.org/ official web site]&lt;br /&gt;
* [http://civilrightsadvocacy.blogspot.com/ Civil Rights Advocacy]: official blog&lt;/div&gt;</summary>
		<author><name>Woozle</name></author>	</entry>

	<entry>
		<id>http://htyp.org/Norway</id>
		<title>Norway</title>
		<link rel="alternate" type="text/html" href="http://htyp.org/Norway"/>
				<updated>2008-08-04T13:03:47Z</updated>
		
		<summary type="html">&lt;p&gt;Summary: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Country|Norway}}&lt;br /&gt;
{{seed}}&lt;/div&gt;</summary>
		<author><name>212.33.149.18</name></author>	</entry>

	<entry>
		<id>http://htyp.org/Dominion_Ministries%2C_Inc.</id>
		<title>Dominion Ministries, Inc.</title>
		<link rel="alternate" type="text/html" href="http://htyp.org/Dominion_Ministries%2C_Inc."/>
				<updated>2008-08-03T23:20:43Z</updated>
		
		<summary type="html">&lt;p&gt;Summary: New page: ==Overview== {{seed}} ==Notes== ('''2008-08-03''') Has [http://endangereddurham.blogspot.com/2008/08/weekend-random-collection-of-news.html apparently] filed for bankruptcy/liquidation: &amp;amp;l...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Overview==&lt;br /&gt;
{{seed}}&lt;br /&gt;
==Notes==&lt;br /&gt;
('''2008-08-03''') Has [http://endangereddurham.blogspot.com/2008/08/weekend-random-collection-of-news.html apparently] filed for bankruptcy/liquidation: &amp;amp;ldquo;Dominion Ministries, last heard from when their plans to build a Level IV treatment center for violent youth at the Dillard/Holloway corner were averted by the [[Cleveland-Holloway neighborhood]], appears to have gotten themselves in trouble with the county. The group that county mental health officials praised as the best of their providers during the contentious proceedings surrounding the land transfer is the subject of a complaint filed in Durham County Superior Court. [[The Durham Center]] alleges that Dominion owes $149,168.87 for services not rendered, and that Dominion failed to provide support services as specified in a contract that was amended at least five times over two years. Dominion's response has been to file for Chapter 11 bankruptcy (reorganization) - subsequently converted to Chapter 7 (liquidation). All the more reason to feel good that Cleveland-Holloway dodged this bullet.&amp;amp;rdquo;&lt;/div&gt;</summary>
		<author><name>Woozle</name></author>	</entry>

	<entry>
		<id>http://htyp.org/Galveston%2C_TX</id>
		<title>Galveston, TX</title>
		<link rel="alternate" type="text/html" href="http://htyp.org/Galveston%2C_TX"/>
				<updated>2008-08-03T01:26:56Z</updated>
		
		<summary type="html">&lt;p&gt;Summary: New page: ==Navigation== [[category:places]][[category:towns]]{{#lst:Texas|navbar}}: {{instate|Galveston|TX}} ==Overview== {{seed}} ==Directory== ===History=== * [http://pruned.blogspot.com/2007/05/...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Navigation==&lt;br /&gt;
[[category:places]][[category:towns]]{{#lst:Texas|navbar}}: {{instate|Galveston|TX}}&lt;br /&gt;
==Overview==&lt;br /&gt;
{{seed}}&lt;br /&gt;
==Directory==&lt;br /&gt;
===History===&lt;br /&gt;
* [http://pruned.blogspot.com/2007/05/galveston-on-stilts.html Galveston on Stilts] &amp;quot;In her amazing book ''[[Against the Tide: The Battle for America's Beaches]]'', Cornelia Dean recounts briefly what Galvestonians did to their city after the [[wikipedia:Galveston Hurricane of 1900|great hurricane of 1900]] killed nearly 6,000 people and devastated what was then considered “the center of commerce for the entire Southwest.”&amp;quot; Includes photos.&lt;/div&gt;</summary>
		<author><name>Woozle</name></author>	</entry>

	<entry>
		<id>http://htyp.org/dinosaurs</id>
		<title>dinosaurs</title>
		<link rel="alternate" type="text/html" href="http://htyp.org/dinosaurs"/>
				<updated>2008-07-31T23:35:45Z</updated>
		
		<summary type="html">&lt;p&gt;Summary: New page: ==Overview== {{seed}} ==Links== * [http://dinobase.gly.bris.ac.uk/ DinoBase]&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Overview==&lt;br /&gt;
{{seed}}&lt;br /&gt;
==Links==&lt;br /&gt;
* [http://dinobase.gly.bris.ac.uk/ DinoBase]&lt;/div&gt;</summary>
		<author><name>Woozle</name></author>	</entry>

	<entry>
		<id>http://htyp.org/MediaWiki/content_programming</id>
		<title>MediaWiki/content programming</title>
		<link rel="alternate" type="text/html" href="http://htyp.org/MediaWiki/content_programming"/>
				<updated>2008-07-31T01:29:58Z</updated>
		
		<summary type="html">&lt;p&gt;Summary: /* Information */ more magic words&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Overview==&lt;br /&gt;
[[MediaWiki]]'s built-in features already allow some simple dynamic text management and manipulation; with the addition of various extensions, much more sophisticated tasks can be accomplished, making MediaWiki into a sort of &amp;quot;swiss army knife&amp;quot; [[content manager]] application.&lt;br /&gt;
===Information===&lt;br /&gt;
How to get various bits of information about stuff&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| '''Date/Time'''&lt;br /&gt;
|-&lt;br /&gt;
| Year || MW: &amp;lt;nowiki&amp;gt;{{CURRENTYEAR}}&amp;lt;/nowiki&amp;gt; || {{CURRENTYEAR}}&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=4 | Month&lt;br /&gt;
| MW: &amp;lt;nowiki&amp;gt;{{CURRENTMONTH}}&amp;lt;/nowiki&amp;gt; (zero-padded number)                   || {{CURRENTMONTH}}&lt;br /&gt;
|-&lt;br /&gt;
| MW: &amp;lt;nowiki&amp;gt;{{CURRENTMONTHNAME}}&amp;lt;/nowiki&amp;gt; (name)                             || {{CURRENTMONTHNAME}}&lt;br /&gt;
|-&lt;br /&gt;
| MW: &amp;lt;nowiki&amp;gt;{{CURRENTMONTHNAMEGEN}}&amp;lt;/nowiki&amp;gt; (genitive form)                 || {{CURRENTMONTHNAMEGEN}}&lt;br /&gt;
|-&lt;br /&gt;
| MW: &amp;lt;nowiki&amp;gt;{{CURRENTMONTHABBREV}}&amp;lt;/nowiki&amp;gt; (abbreviation; requires MW 1.5+) || {{CURRENTMONTHABBREV}}&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=2 | Day-of-month&lt;br /&gt;
| MW: &amp;lt;nowiki&amp;gt;{{CURRENTDAY}}&amp;lt;/nowiki&amp;gt; (unpadded number) 	               || {{CURRENTDAY}}&lt;br /&gt;
|-&lt;br /&gt;
| MW: &amp;lt;nowiki&amp;gt;{{CURRENTDAY2}}&amp;lt;/nowiki&amp;gt; (zero-padded number; requires MW 1.6+) || {{CURRENTDAY2}}&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=2 | Day-of-week&lt;br /&gt;
| MW: &amp;lt;nowiki&amp;gt;{{CURRENTDOW}}&amp;lt;/nowiki&amp;gt; (unpadded number) || {{CURRENTDOW}}&lt;br /&gt;
|-&lt;br /&gt;
| MW: &amp;lt;nowiki&amp;gt;{{CURRENTDAYNAME}}&amp;lt;/nowiki&amp;gt; (name) 	 || {{CURRENTDAYNAME}}&lt;br /&gt;
|-&lt;br /&gt;
| Week       || MW: &amp;lt;nowiki&amp;gt;{{CURRENTWEEK}}&amp;lt;/nowiki&amp;gt; (number) 	                || {{CURRENTWEEK}}&lt;br /&gt;
|-&lt;br /&gt;
| Time: full || MW: &amp;lt;nowiki&amp;gt;{{CURRENTTIME}}&amp;lt;/nowiki&amp;gt; (24-hour HH:mm format) 	|| {{CURRENTTIME}}&lt;br /&gt;
|-&lt;br /&gt;
| Time: hour || MW: &amp;lt;nowiki&amp;gt;{{CURRENTHOUR}}&amp;lt;/nowiki&amp;gt; (24-hour zero-padded number) 	|| {{CURRENTHOUR}}&lt;br /&gt;
|-&lt;br /&gt;
| Timestamp  || MW: &amp;lt;nowiki&amp;gt;{{CURRENTTIMESTAMP}}&amp;lt;/nowiki&amp;gt;                           || {{CURRENTTIMESTAMP}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Site Info'''&lt;br /&gt;
|-&lt;br /&gt;
| Site's name&amp;lt;br&amp;gt;&amp;lt;small&amp;gt;($wgSitename)&amp;lt;/small&amp;gt; || MW: &amp;lt;nowiki&amp;gt;{{SITENAME}}&amp;lt;/nowiki&amp;gt; || {{SITENAME}}&lt;br /&gt;
|-&lt;br /&gt;
| MediaWiki version || MW: &amp;lt;nowiki&amp;gt;{{CURRENTVERSION}}&amp;lt;/nowiki&amp;gt;                     || {{CURRENTVERSION}}&lt;br /&gt;
|-&lt;br /&gt;
| Default language&amp;lt;br&amp;gt;&amp;lt;small&amp;gt;($wgLanguageCode)&amp;lt;/small&amp;gt; || MW: &amp;lt;nowiki&amp;gt;{{CONTENTLANGUAGE}}&amp;lt;/nowiki&amp;gt; || {{CONTENTLANGUAGE}}&lt;br /&gt;
|-&lt;br /&gt;
| # of wiki pages                  || MW: &amp;lt;nowiki&amp;gt;{{NUMBEROFPAGES}}&amp;lt;/nowiki&amp;gt;    || {{NUMBEROFPAGES}}&lt;br /&gt;
|-&lt;br /&gt;
| # of pages in main namespace     || MW: &amp;lt;nowiki&amp;gt;{{NUMBEROFARTICLES}}&amp;lt;/nowiki&amp;gt; || {{NUMBEROFARTICLES}}&lt;br /&gt;
|-&lt;br /&gt;
| # of uploaded files              || MW: &amp;lt;nowiki&amp;gt;{{NUMBEROFFILES}}&amp;lt;/nowiki&amp;gt;    || {{NUMBEROFFILES}}&lt;br /&gt;
|-&lt;br /&gt;
| # of page edits                  || MW: &amp;lt;nowiki&amp;gt;{{NUMBEROFEDITS}}&amp;lt;/nowiki&amp;gt;    || {{NUMBEROFEDITS}}&lt;br /&gt;
|-&lt;br /&gt;
| # of registered users            || MW: &amp;lt;nowiki&amp;gt;{{NUMBEROFUSERS}}&amp;lt;/nowiki&amp;gt;    || {{NUMBEROFUSERS}}&lt;br /&gt;
|-&lt;br /&gt;
| # of sysops                      || MW: &amp;lt;nowiki&amp;gt;{{NUMBEROFADMINS}}&amp;lt;/nowiki&amp;gt;   || {{NUMBEROFADMINS}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Page Title'''&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=3 | Full Title           || MW: &amp;lt;nowiki&amp;gt;{{FULLPAGENAME}}&amp;lt;/nowiki&amp;gt;                      || {{FULLPAGENAME}}&lt;br /&gt;
|-&lt;br /&gt;
|                                     MW: &amp;lt;nowiki&amp;gt;{{SUBJECTPAGENAME}}&amp;lt;/nowiki&amp;gt; - namespace+base || {{SUBJECTPAGENAME}}&lt;br /&gt;
|-&lt;br /&gt;
|                                     MW: &amp;lt;nowiki&amp;gt;{{TALKPAGENAME}}&amp;lt;/nowiki&amp;gt; - talkpage namespace+base || {{TALKPAGENAME}}&lt;br /&gt;
|-&lt;br /&gt;
| Prefix&amp;lt;br&amp;gt;&amp;lt;small&amp;gt;(namespace only)&amp;lt;/small&amp;gt;    || [[../DPL|DPL]]: %NAMESPACE%&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=4 | Suffix&amp;lt;br&amp;gt;&amp;lt;small&amp;gt;(without namespace)&amp;lt;/small&amp;gt;       || DPL: %TITLE%&lt;br /&gt;
|-&lt;br /&gt;
| MW: &amp;lt;nowiki&amp;gt;{{PAGENAME}}&amp;lt;/nowiki&amp;gt;                              || {{PAGENAME}}&lt;br /&gt;
|-&lt;br /&gt;
| MW: &amp;lt;nowiki&amp;gt;{{BASEPAGENAME}}&amp;lt;/nowiki&amp;gt; - base title, no subpage || {{BASEPAGENAME}}&lt;br /&gt;
|-&lt;br /&gt;
| MW: &amp;lt;nowiki&amp;gt;{{SUBPAGENAME}}&amp;lt;/nowiki&amp;gt; - subpage                 || {{SUBPAGENAME}}&lt;br /&gt;
|-&lt;br /&gt;
| Namespace                        || MW: &amp;lt;nowiki&amp;gt;{{NAMESPACE}}&amp;lt;/nowiki&amp;gt;    || {{NAMESPACE}}&lt;br /&gt;
|-&lt;br /&gt;
| Content namespace                || MW: &amp;lt;nowiki&amp;gt;{{SUBJECTSPACE}}&amp;lt;/nowiki&amp;gt; || {{SUBJECTSPACE}}&lt;br /&gt;
|-&lt;br /&gt;
| Talk namespace                   || MW: &amp;lt;nowiki&amp;gt;{{TALKSPACE}}&amp;lt;/nowiki&amp;gt;    || {{TALKSPACE}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Page Info'''&lt;br /&gt;
|-&lt;br /&gt;
| Usage counter (hits) || DPL:  %COUNT% (requires addpagecounter=true)&lt;br /&gt;
DPL: %COUNTFS% = a font size number based on usage counter&amp;lt;br&amp;gt;&lt;br /&gt;
DPL: %COUNTFS2% = similar to %COUNTFS%, but [[logarithm|log]]([[square root|sqrt]](counter))&lt;br /&gt;
|-&lt;br /&gt;
| Page size (bytes) || DPL: %SIZE% (requires addpagesize=true)&lt;br /&gt;
DPL: %SIZEFS% &amp;amp;ndash; font size number based on article size&lt;br /&gt;
|-&lt;br /&gt;
| Creation date || DPL: %DATE% (requires addeditdate=true and ordermethod=firstedit)&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=6 | Last edit date || DPL: %DATE% (requires addeditdate=true and ordermethod=lastedit)&lt;br /&gt;
|-&lt;br /&gt;
| MW: &amp;lt;nowiki&amp;gt;{{REVISIONDAY}}&amp;lt;/nowiki&amp;gt;: Day edit was made (unpadded number)     || {{REVISIONDAY}}&lt;br /&gt;
|-&lt;br /&gt;
| MW: &amp;lt;nowiki&amp;gt;{{REVISIONDAY2}}&amp;lt;/nowiki&amp;gt;: Day edit was made (zero-padded number) || {{REVISIONDAY2}}&lt;br /&gt;
|-&lt;br /&gt;
| MW: &amp;lt;nowiki&amp;gt;{{REVISIONMONTH}}&amp;lt;/nowiki&amp;gt;: Month edit was made (unpadded number) || {{REVISIONMONTH}}&lt;br /&gt;
|-&lt;br /&gt;
| MW: &amp;lt;nowiki&amp;gt;{{REVISIONYEAR}}&amp;lt;/nowiki&amp;gt;: Year edit was made                     || {{REVISIONYEAR}}&lt;br /&gt;
|-&lt;br /&gt;
| MW: &amp;lt;nowiki&amp;gt;{{REVISIONTIMESTAMP}}&amp;lt;/nowiki&amp;gt;: Timestamp as of time of edit      || {{REVISIONTIMESTAMP}}&lt;br /&gt;
|-&lt;br /&gt;
| Page creator || DPL: %USER% (requires adduser=true and ordermethod=firstedit)&lt;br /&gt;
|-&lt;br /&gt;
| Page last editor || DPL:  %USER% (requires adduser=true and ordermethod=lastedit)&lt;br /&gt;
|-&lt;br /&gt;
| Revision ID || MW: &amp;lt;nowiki&amp;gt;{{REVISIONID}}&amp;lt;/nowiki&amp;gt; || {{REVISIONID}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Sources==&lt;br /&gt;
* '''MW''' (built-in): [[mwsite:Help:Magic words|Help:Magic words]]&lt;br /&gt;
* '''DPL''': [http://semeb.com/dpldemo/index.php?title=DPL:Manual DPL Manual]&lt;br /&gt;
** [http://semeb.com/dpldemo/index.php?title=DPL:Manual_-_DPL_parameters:_Controlling_output_order DPL parameters: Controlling output order]&lt;/div&gt;</summary>
		<author><name>Woozle</name></author>	</entry>

	<entry>
		<id>http://htyp.org/astronomy</id>
		<title>astronomy</title>
		<link rel="alternate" type="text/html" href="http://htyp.org/astronomy"/>
				<updated>2008-07-31T00:00:27Z</updated>
		
		<summary type="html">&lt;p&gt;Summary: New page: ==Overview== {{seed}} ==Links== ===Videos=== * [[youtube:k7hsQA3wo|Planets and Stars to Scale]]: from [[Mercury]] to [[My Cephei]]&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Overview==&lt;br /&gt;
{{seed}}&lt;br /&gt;
==Links==&lt;br /&gt;
===Videos===&lt;br /&gt;
* [[youtube:k7hsQA3wo|Planets and Stars to Scale]]: from [[Mercury]] to [[My Cephei]]&lt;/div&gt;</summary>
		<author><name>Woozle</name></author>	</entry>

	<entry>
		<id>http://htyp.org/Hundred_dollars_a_kg</id>
		<title>Hundred dollars a kg</title>
		<link rel="alternate" type="text/html" href="http://htyp.org/Hundred_dollars_a_kg"/>
				<updated>2008-07-28T22:06:54Z</updated>
		
		<summary type="html">&lt;p&gt;Summary: /* Cost reduction */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;To sum up what's gone before: [[Dollar a gallon gasoline]] .. [[Penny a kWh]] electricity.&lt;br /&gt;
&lt;br /&gt;
To solve the [[energy crisis]] using [[space-based solar power]], replacement power needs to come on line at a rate of 400-500 GW/year.  That replaces about 6 million barrels of oil a day each year over the next 50 years.  To make liquid fuels at a dollar a gallon out of electricity requires that the electricity cost be around a penny a [[kilowatt-hour|kWh]].  To make penny a kWh requires lift cost to [[geosynchronous orbit|GEO]] of $100 or less&lt;br /&gt;
&lt;br /&gt;
==How much lifted to GEO==&lt;br /&gt;
&lt;br /&gt;
Four hundred [[gigawatt|GW]] of [[solar power satellite|power sat]]s at 2kg/kW requires 800,000 tons per year lifted to GEO (perhaps twice that if power sat mass can't be reduced below 4kg/kW).  At least there is economy of scale.&lt;br /&gt;
 &lt;br /&gt;
Do we have to lift that much mass?  No.  Extra terrestrial resources are a better idea, but there isn't time to develop the space industry to tap them.  The economic effects (including famines) of the developing energy crisis are so bad that the large scale production of SBSP needs to come on line by 2015 to avoid economic collapse.  Expect ET resources to be exploited by 2025 with this much activity in space.&lt;br /&gt;
&lt;br /&gt;
This works out to lifting 1-200 tons per hour.  Will physics let us get under $100/kg?  A [[moving cable space elevator]] only requires about 15 kWh to lift a kg from the surface of the earth to GEO.  This is $1.50 at the high rate of 10 cents a kWh.  Even if it cost $100 billion dollars to build, a capital cost of $10 billion a year lifting a billion kg is only ten dollars per kg.  Unfortunately we don't have the cable &amp;amp;ndash; yet.&lt;br /&gt;
&lt;br /&gt;
There are other choices but the ones further examined here are among rockets, lasers or some combination of them.&lt;br /&gt;
&lt;br /&gt;
==Rockets vs lasers==&lt;br /&gt;
&lt;br /&gt;
Rockets are good for high thrust, but the {{wpalt|Tsiolkovsky rocket equation|rocket equation}} is a hard taskmaster when you need [[delta V]] that is a multiple of the exhaust velocity.&lt;br /&gt;
&lt;br /&gt;
{{wpalt|laser propulsion|Laser ablation propulsion}} is not as well developed as rockets.  Laser thrusters can get very high exhaust velocity, leading to small mass ratios, but they don't do very good for high thrust. {{wpalt|Jordin Kare}} and others have been working for decades designing lasers to launch from the surface.&lt;br /&gt;
&lt;br /&gt;
Rockets to lift this much cargo would have to launch every hour, each rocket having a lift off mass of 6,000 tons to get 350 tons to LEO and 100 tons of that to GEO.  The projected cost to GEO is around $500/kg.   http://www.ilr.tu-berlin.de/koelle/Neptun/NEP2015.pdf&lt;br /&gt;
&lt;br /&gt;
The energy payback (for making fuel) is about 40 days&amp;lt;sup&amp;gt;'''[[/Note 1|1]]'''&amp;lt;/sup&amp;gt;.  The cost of rockets is not in the fuel, but in the high cost of aerospace hardware and the rocket equation which dictates that even for the most energetic fuels only about one part in sixty of the liftoff mass is payload delivered to GEO.&lt;br /&gt;
 &lt;br /&gt;
The needed delta V [[low Earth orbit|LEO]] to GEO is about 4.1 km/sec.  Using 10% of the LEO payload for reaction mass (35 tons) and a laser that provides a 40 km/sec exhaust velocity will produce about 4.2 km/sec delta V (the [[wikipedia:Tsiolkovsky rocket equation|Tsiolkovsky rocket equation]] again).&lt;br /&gt;
&lt;br /&gt;
The power required for 1/20th g  (.5 m/sec exp 2) is 1/2 x 350,000 kg x .5m/sec exp 2 x 40,000 m/sec = 3.5 GW&lt;br /&gt;
&lt;br /&gt;
Delta V changes require 4100 m/sec /0.5 m/sec exp 2, or 8200 sec or about 2.7 hours.  I.e., 3.5 GW of laser power would raise eight loads a day from LEO to GEO.   At 315 t each that is 2500 t/day, somewhat exceeding the 2200 t/day needed to install 400 GW per year.&lt;br /&gt;
&lt;br /&gt;
It also cuts the rocket launches from 24 to a more manageable but still excessive 7 or 8.&lt;br /&gt;
&lt;br /&gt;
A 3.5-GW space based laser built at GEO that massed 10,000 tons would cost $5 billion to lift by rockets and $35 billion for the laser.  It can be expected to more than triple the yearly throughput to GEO, saving 2/3 of 0.8 billion kg x $500/kg or $267 billion a year in transport costs.&lt;br /&gt;
&lt;br /&gt;
[[amortization|Amortize]]d at 10 percent, the additional lift from LEO to GEO would cost $4 billion/0.8 billion/kg or $5 per kg plus the lift to LEO.&lt;br /&gt;
&lt;br /&gt;
==Cost reduction==&lt;br /&gt;
&lt;br /&gt;
There is another way that cuts the liftoff mass by a factor of five compared to rockets.&lt;br /&gt;
&lt;br /&gt;
Injection to [[geosynchronous transfer orbit]] is 7.8 k/s (to LEO), 2.5 k/s (to GTO) plus 1.6k/sec to circularize at GEO, totaling 11.9 km/s. (See [[wikipedia:Delta-v_budget|Delta-v_budget]]) To get to LEO takes 796 s at 1g, 13.2 minutes.  At one g 17.5 minutes for GTO, 14 minutes at 1.25 g, plus 2.2 minutes to circularize the orbit (1.6 km/s) at GEO.  Assuming half payload and half reaction mass, 0.69 velocity ratio and 11.9 km/s delta v, then the average exhaust velocity needs to be a modest (for lasers) 17.2 km/s.&lt;br /&gt;
&lt;br /&gt;
Because the laser can be cycled close to 4 times an hour, the payload only needs to be 25 tons. Taking the midpoint (the exhaust velocity would be varied for constant thrust) the power required for 1.25 g  (12.25 m/sec exp 2) is 1/2 x 37,500 kg x 12.25 m/sec exp 2 x 17,200 m/sec = 4 GW.  In the context of building a GW of power satellite a day, this is a small piece of hardware.  The choice of building the laser in space or on the ground has not been fully examined.&lt;br /&gt;
&lt;br /&gt;
The 50-ton payload-plus-reaction-mass has to hang in space long enough to be accelerated.  This takes a modest mass ratio rocket.&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| 50 tons payload plus reaction mass for the laser || 16.5%&lt;br /&gt;
|-&lt;br /&gt;
| 50 tons rocket structure                         || 16.5%&lt;br /&gt;
|-&lt;br /&gt;
| 200 tons propellant.                             || 66%&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The rocket would lift off on two SSMEs (or similar), and if a zeroth turbofan stage was used, it would take eight 5