r56371 MediaWiki - Code Review archive

Repository:MediaWiki
Revision:r56370‎ | r56371 | r56372 >
Date:17:07, 15 September 2009
Author:sergeychernyshev
Status:deferred
Tags:
Comment:
Release tag for latest version (0.1.3) in new repository.
Modified paths:
  • /tags/extensions/PageObjectModel/REL_0_1_3 (added) (history)

Diff [purge]

Index: tags/extensions/PageObjectModel/REL_0_1_3/POM.php
@@ -0,0 +1,13 @@
 2+<?
 3+#
 4+# PageObjectModel is a set of classes that allow easy manipulation of MediaWiki page source.
 5+#
 6+
 7+require_once('POM/Element.php');
 8+require_once('POM/Page.php');
 9+require_once('POM/Parser.php');
 10+require_once('POM/TemplateParser.php');
 11+require_once('POM/Template.php');
 12+require_once('POM/TemplateCollection.php');
 13+require_once('POM/TextNode.php');
 14+
Property changes on: tags/extensions/PageObjectModel/REL_0_1_3/POM.php
___________________________________________________________________
Name: svn:eol-style
115 + native
Index: tags/extensions/PageObjectModel/REL_0_1_3/LICENSE
@@ -0,0 +1,165 @@
 2+ GNU LESSER GENERAL PUBLIC LICENSE
 3+ Version 3, 29 June 2007
 4+
 5+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
 6+ Everyone is permitted to copy and distribute verbatim copies
 7+ of this license document, but changing it is not allowed.
 8+
 9+
 10+ This version of the GNU Lesser General Public License incorporates
 11+the terms and conditions of version 3 of the GNU General Public
 12+License, supplemented by the additional permissions listed below.
 13+
 14+ 0. Additional Definitions.
 15+
 16+ As used herein, "this License" refers to version 3 of the GNU Lesser
 17+General Public License, and the "GNU GPL" refers to version 3 of the GNU
 18+General Public License.
 19+
 20+ "The Library" refers to a covered work governed by this License,
 21+other than an Application or a Combined Work as defined below.
 22+
 23+ An "Application" is any work that makes use of an interface provided
 24+by the Library, but which is not otherwise based on the Library.
 25+Defining a subclass of a class defined by the Library is deemed a mode
 26+of using an interface provided by the Library.
 27+
 28+ A "Combined Work" is a work produced by combining or linking an
 29+Application with the Library. The particular version of the Library
 30+with which the Combined Work was made is also called the "Linked
 31+Version".
 32+
 33+ The "Minimal Corresponding Source" for a Combined Work means the
 34+Corresponding Source for the Combined Work, excluding any source code
 35+for portions of the Combined Work that, considered in isolation, are
 36+based on the Application, and not on the Linked Version.
 37+
 38+ The "Corresponding Application Code" for a Combined Work means the
 39+object code and/or source code for the Application, including any data
 40+and utility programs needed for reproducing the Combined Work from the
 41+Application, but excluding the System Libraries of the Combined Work.
 42+
 43+ 1. Exception to Section 3 of the GNU GPL.
 44+
 45+ You may convey a covered work under sections 3 and 4 of this License
 46+without being bound by section 3 of the GNU GPL.
 47+
 48+ 2. Conveying Modified Versions.
 49+
 50+ If you modify a copy of the Library, and, in your modifications, a
 51+facility refers to a function or data to be supplied by an Application
 52+that uses the facility (other than as an argument passed when the
 53+facility is invoked), then you may convey a copy of the modified
 54+version:
 55+
 56+ a) under this License, provided that you make a good faith effort to
 57+ ensure that, in the event an Application does not supply the
 58+ function or data, the facility still operates, and performs
 59+ whatever part of its purpose remains meaningful, or
 60+
 61+ b) under the GNU GPL, with none of the additional permissions of
 62+ this License applicable to that copy.
 63+
 64+ 3. Object Code Incorporating Material from Library Header Files.
 65+
 66+ The object code form of an Application may incorporate material from
 67+a header file that is part of the Library. You may convey such object
 68+code under terms of your choice, provided that, if the incorporated
 69+material is not limited to numerical parameters, data structure
 70+layouts and accessors, or small macros, inline functions and templates
 71+(ten or fewer lines in length), you do both of the following:
 72+
 73+ a) Give prominent notice with each copy of the object code that the
 74+ Library is used in it and that the Library and its use are
 75+ covered by this License.
 76+
 77+ b) Accompany the object code with a copy of the GNU GPL and this license
 78+ document.
 79+
 80+ 4. Combined Works.
 81+
 82+ You may convey a Combined Work under terms of your choice that,
 83+taken together, effectively do not restrict modification of the
 84+portions of the Library contained in the Combined Work and reverse
 85+engineering for debugging such modifications, if you also do each of
 86+the following:
 87+
 88+ a) Give prominent notice with each copy of the Combined Work that
 89+ the Library is used in it and that the Library and its use are
 90+ covered by this License.
 91+
 92+ b) Accompany the Combined Work with a copy of the GNU GPL and this license
 93+ document.
 94+
 95+ c) For a Combined Work that displays copyright notices during
 96+ execution, include the copyright notice for the Library among
 97+ these notices, as well as a reference directing the user to the
 98+ copies of the GNU GPL and this license document.
 99+
 100+ d) Do one of the following:
 101+
 102+ 0) Convey the Minimal Corresponding Source under the terms of this
 103+ License, and the Corresponding Application Code in a form
 104+ suitable for, and under terms that permit, the user to
 105+ recombine or relink the Application with a modified version of
 106+ the Linked Version to produce a modified Combined Work, in the
 107+ manner specified by section 6 of the GNU GPL for conveying
 108+ Corresponding Source.
 109+
 110+ 1) Use a suitable shared library mechanism for linking with the
 111+ Library. A suitable mechanism is one that (a) uses at run time
 112+ a copy of the Library already present on the user's computer
 113+ system, and (b) will operate properly with a modified version
 114+ of the Library that is interface-compatible with the Linked
 115+ Version.
 116+
 117+ e) Provide Installation Information, but only if you would otherwise
 118+ be required to provide such information under section 6 of the
 119+ GNU GPL, and only to the extent that such information is
 120+ necessary to install and execute a modified version of the
 121+ Combined Work produced by recombining or relinking the
 122+ Application with a modified version of the Linked Version. (If
 123+ you use option 4d0, the Installation Information must accompany
 124+ the Minimal Corresponding Source and Corresponding Application
 125+ Code. If you use option 4d1, you must provide the Installation
 126+ Information in the manner specified by section 6 of the GNU GPL
 127+ for conveying Corresponding Source.)
 128+
 129+ 5. Combined Libraries.
 130+
 131+ You may place library facilities that are a work based on the
 132+Library side by side in a single library together with other library
 133+facilities that are not Applications and are not covered by this
 134+License, and convey such a combined library under terms of your
 135+choice, if you do both of the following:
 136+
 137+ a) Accompany the combined library with a copy of the same work based
 138+ on the Library, uncombined with any other library facilities,
 139+ conveyed under the terms of this License.
 140+
 141+ b) Give prominent notice with the combined library that part of it
 142+ is a work based on the Library, and explaining where to find the
 143+ accompanying uncombined form of the same work.
 144+
 145+ 6. Revised Versions of the GNU Lesser General Public License.
 146+
 147+ The Free Software Foundation may publish revised and/or new versions
 148+of the GNU Lesser General Public License from time to time. Such new
 149+versions will be similar in spirit to the present version, but may
 150+differ in detail to address new problems or concerns.
 151+
 152+ Each version is given a distinguishing version number. If the
 153+Library as you received it specifies that a certain numbered version
 154+of the GNU Lesser General Public License "or any later version"
 155+applies to it, you have the option of following the terms and
 156+conditions either of that published version or of any later version
 157+published by the Free Software Foundation. If the Library as you
 158+received it does not specify a version number of the GNU Lesser
 159+General Public License, you may choose any version of the GNU Lesser
 160+General Public License ever published by the Free Software Foundation.
 161+
 162+ If the Library as you received it specifies that a proxy can decide
 163+whether future versions of the GNU Lesser General Public License shall
 164+apply, that proxy's public statement of acceptance of any version is
 165+permanent authorization for you to choose that version for the
 166+Library.
Property changes on: tags/extensions/PageObjectModel/REL_0_1_3/LICENSE
___________________________________________________________________
Name: svn:eol-style
1167 + native
Index: tags/extensions/PageObjectModel/REL_0_1_3/tests/tests.xml
@@ -0,0 +1,5 @@
 2+<phpunit>
 3+ <testsuite name="PageObjectModel">
 4+ <directory suffix=".php">tests</directory>
 5+ </testsuite>
 6+</phpunit>
Property changes on: tags/extensions/PageObjectModel/REL_0_1_3/tests/tests.xml
___________________________________________________________________
Name: svn:eol-style
17 + native
Index: tags/extensions/PageObjectModel/REL_0_1_3/tests/WrongParameterNameExceptionTest.php
@@ -0,0 +1,15 @@
 2+<?php
 3+require_once 'PHPUnit/Framework.php';
 4+require_once 'POM.php';
 5+
 6+class WrongParameterNameExceptionTest extends PHPUnit_Framework_TestCase
 7+{
 8+ public function testWrongParameterNameExceptionMustContainMessage()
 9+ {
 10+ $e = new WrongParameterNameException("Can't get parameter with no name");
 11+ $this->assertEquals(
 12+ "WrongParameterNameException: [0]: Can't get parameter with no name\n",
 13+ $e->__toString()
 14+ );
 15+ }
 16+}
Property changes on: tags/extensions/PageObjectModel/REL_0_1_3/tests/WrongParameterNameExceptionTest.php
___________________________________________________________________
Name: svn:eol-style
117 + native
Index: tags/extensions/PageObjectModel/REL_0_1_3/tests/POMTemplateParserTest.php
@@ -0,0 +1,59 @@
 2+<?php
 3+require_once 'PHPUnit/Framework.php';
 4+require_once 'POM.php';
 5+
 6+class POMTeamplateParserTest extends PHPUnit_Framework_TestCase
 7+{
 8+ public function testTemplateParserMustFindTemplatesInTextNodes()
 9+ {
 10+ $sometext = "sometext\nbefore first with spaces {{sometemplate|var1=var2}}\nbefore second {{someothertemplate}} more text at the end\n";
 11+
 12+ $page = new POMPage($sometext);
 13+ $this->assertTrue(is_a($page->children[0], 'POMTextNode'));
 14+ $this->assertEquals("sometext\nbefore first with spaces ", $page->children[0]->asString());
 15+
 16+ $this->assertTrue(is_a($page->children[1], 'POMTemplate'));
 17+ $this->assertEquals('{{sometemplate|var1=var2}}', $page->children[1]->asString());
 18+
 19+ $this->assertTrue(is_a($page->children[2], 'POMTextNode'));
 20+ $this->assertEquals("\nbefore second ", $page->children[2]->asString());
 21+
 22+ $this->assertTrue(is_a($page->children[3], 'POMTemplate'));
 23+ $this->assertEquals('{{someothertemplate}}', $page->children[3]->asString());
 24+
 25+ $this->assertTrue(is_a($page->children[4], 'POMTextNode'));
 26+ $this->assertEquals(" more text at the end\n", $page->children[4]->asString());
 27+ }
 28+
 29+ public function testTemplateParserMustPopulateTemplatesCollection()
 30+ {
 31+ $sometext = "sometext\nbefore first with spaces {{sometemplate |var1=var2}}\nbefore second {{ someothertemplate|param1 = 0}} plus another {{someothertemplate
 32+|param2 = something
 33+}} more text at the end\n";
 34+
 35+ $page = new POMPage($sometext);
 36+ $this->assertEquals(count($page->c['templates']['sometemplate']), 1);
 37+ $this->assertEquals(count($page->c['templates']['someothertemplate']), 2);
 38+ }
 39+
 40+ public function testTemplateParserMustCorrectlyParseTemplatesWithParameters()
 41+ {
 42+ $sometext = "sometext\nbefore first with spaces {{sometemplate|var1=val1 {{subtemplate|subvar1=subval2}} val1 continue|var2=val2}}\nbefore second {{someothertemplate}} more text at the end\n";
 43+
 44+ $page = new POMPage($sometext);
 45+ $this->assertTrue(is_a($page->children[0], 'POMTextNode'));
 46+ $this->assertEquals("sometext\nbefore first with spaces ", $page->children[0]->asString());
 47+
 48+ $this->assertTrue(is_a($page->children[1], 'POMTemplate'));
 49+ $this->assertEquals('{{sometemplate|var1=val1 {{subtemplate|subvar1=subval2}} val1 continue|var2=val2}}', $page->children[1]->asString());
 50+
 51+ $this->assertTrue(is_a($page->children[2], 'POMTextNode'));
 52+ $this->assertEquals("\nbefore second ", $page->children[2]->asString());
 53+
 54+ $this->assertTrue(is_a($page->children[3], 'POMTemplate'));
 55+ $this->assertEquals('{{someothertemplate}}', $page->children[3]->asString());
 56+
 57+ $this->assertTrue(is_a($page->children[4], 'POMTextNode'));
 58+ $this->assertEquals(" more text at the end\n", $page->children[4]->asString());
 59+ }
 60+}
Property changes on: tags/extensions/PageObjectModel/REL_0_1_3/tests/POMTemplateParserTest.php
___________________________________________________________________
Name: svn:eol-style
161 + native
Index: tags/extensions/PageObjectModel/REL_0_1_3/tests/POMTemplateTest.php
@@ -0,0 +1,224 @@
 2+<?php
 3+require_once 'PHPUnit/Framework.php';
 4+require_once 'POM.php';
 5+
 6+class POMTemplateTest extends PHPUnit_Framework_TestCase
 7+{
 8+ #
 9+ # Testing template pass-through behavior
 10+ #
 11+
 12+ # TODO add more data
 13+ public static function templateStringsProvider()
 14+ {
 15+ return array(
 16+ array('{{sometemplate|var1=var2}}'),
 17+ array('{{title with spaces|var1=var2}}'),
 18+ array('{{sometemplate| field name with spaces=var2}}'),
 19+ array('{{sometemplate|var1=value with spaces}}'),
 20+ array('{{sometemplate|1234|var1=value with spaces}}'),
 21+ array('{{sometemplate|a=b|b=c|numbered}}')
 22+ );
 23+ }
 24+
 25+ /**
 26+ * @dataProvider templateStringsProvider
 27+ */
 28+ public function testTemplateMustPreserveOrderOfParameters($templatestring)
 29+ {
 30+ $template = new POMTemplate($templatestring);
 31+ $this->assertEquals($template->asString(), $templatestring);
 32+ }
 33+
 34+ # -------------------------------------------------------------------------------------------------------
 35+ #
 36+ # Testing getting parameter values
 37+ #
 38+
 39+ # TODO add more data
 40+ public static function parameterGetNameValueProvider()
 41+ {
 42+ return array(
 43+ array('{{sometemplate|var1=var2}}', 'var1', 'var2'),
 44+ array('{{title with spaces|var1=var2}}', 'var1', 'var2'),
 45+ array('{{sometemplate| field name with spaces=var2}}', 'field name with spaces', 'var2'),
 46+ array('{{sometemplate|var1=value with spaces}}', 'var1', 'value with spaces'),
 47+ array('{{sometemplate|1234|var1=value with spaces}}', 'var1', 'value with spaces'),
 48+ array('{{sometemplate|a=b|b=c|numbered}}', 'a', 'b'),
 49+ array('{{sometemplate|a=b|b=c|numbered}}', 'b', 'c'),
 50+ array('{{sometemplate|a=b|b=c|numbered}}', 1, 'numbered'),
 51+ array('{{sometemplate|var1=var2}}', 'noexistent', null)
 52+ );
 53+ }
 54+
 55+ /**
 56+ * @dataProvider parameterGetNameValueProvider
 57+ */
 58+ public function testTemplateGetParameter($templatestring, $name, $value)
 59+ {
 60+ $template = new POMTemplate($templatestring);
 61+ $this->assertEquals($value, $template->getParameter($name));
 62+ }
 63+
 64+
 65+ # -------------------------------------------------------------------------------------------------------
 66+ #
 67+ # Testing setting parameter values
 68+ #
 69+
 70+ # TODO add more data
 71+ public static function parameterChangeNameValueProvider()
 72+ {
 73+ return array(
 74+ array('{{sometemplate|a=b|b=c|numbered}}',
 75+ 1,
 76+ 'renumbered',
 77+ '{{sometemplate|a=b|b=c|renumbered}}'),
 78+ array('{{sometemplate|a=b|b=c|numbered 1|numbered 2}}',
 79+ 2,
 80+ 'renumbered 2',
 81+ '{{sometemplate|a=b|b=c|numbered 1|renumbered 2}}'),
 82+ array('{{sometemplate|a=b|b=c|numbered 1|numbered 2}}',
 83+ 3,
 84+ 'new numbered',
 85+ '{{sometemplate|a=b|b=c|numbered 1|numbered 2|new numbered}}'),
 86+ array('{{sometemplate|var1=var2}}',
 87+ 'var1',
 88+ 'var3',
 89+ '{{sometemplate|var1=var3}}'),
 90+ array('{{sometemplate|var1= var2}}',
 91+ 'var1',
 92+ 'var3',
 93+ '{{sometemplate|var1= var3}}'),
 94+ array('{{sometemplate|var1 =var2}}',
 95+ 'var1',
 96+ 'var3',
 97+ '{{sometemplate|var1 =var3}}'),
 98+ array('{{title with spaces|var1=var2}}',
 99+ 'var1',
 100+ 'var3',
 101+ '{{title with spaces|var1=var3}}'),
 102+ array('{{sometemplate| field name with spaces=var2}}',
 103+ 'field name with spaces',
 104+ 'var3',
 105+ '{{sometemplate| field name with spaces=var3}}'),
 106+ array('{{sometemplate|var1=value with spaces}}',
 107+ 'var1',
 108+ 'value with spaces 2',
 109+ '{{sometemplate|var1=value with spaces 2}}'),
 110+ array('{{sometemplate|1234|var1=value with spaces}}',
 111+ 'var1',
 112+ 'value with spaces 2',
 113+ '{{sometemplate|1234|var1=value with spaces 2}}'),
 114+ array('{{sometemplate|a=b|b=c|numbered}}',
 115+ 'a',
 116+ 'd',
 117+ '{{sometemplate|a=d|b=c|numbered}}'),
 118+ array('{{sometemplate|a=b|b=c|numbered}}',
 119+ 'x',
 120+ 'y',
 121+ '{{sometemplate|a=b|b=c|numbered|x=y}}')
 122+ );
 123+ }
 124+
 125+ /**
 126+ * @dataProvider parameterChangeNameValueProvider
 127+ */
 128+ public function testTemplateParameterChange($orig, $index, $value, $result)
 129+ {
 130+ $template = new POMTemplate($orig);
 131+ $template->setParameter($index, $value);
 132+ $this->assertEquals($result, $template->asString());
 133+ }
 134+
 135+ # TODO add more data
 136+ public static function parameterChangeSpacedNameValueProvider()
 137+ {
 138+ return array(
 139+ array('{{sometemplate|a=b|b=c|numbered}}',
 140+ ' 1',
 141+ 'renumbered',
 142+ '{{sometemplate|a=b|b=c|renumbered}}'),
 143+ array('{{sometemplate|a=b|b=c|numbered 1|numbered 2}}',
 144+ ' 2 ',
 145+ 'renumbered 2',
 146+ '{{sometemplate|a=b|b=c|numbered 1|renumbered 2}}'),
 147+ array('{{sometemplate|a=b|b=c|numbered 1|numbered 2}}',
 148+ '3 ',
 149+ 'new numbered',
 150+ '{{sometemplate|a=b|b=c|numbered 1|numbered 2|new numbered}}'),
 151+ array('{{sometemplate|var1=var2}}',
 152+ ' var1 ',
 153+ ' var3',
 154+ '{{sometemplate| var1 = var3}}'),
 155+ array('{{sometemplate|var1= var2}}',
 156+ ' var1 ',
 157+ ' var3 ',
 158+ '{{sometemplate| var1 = var3 }}'),
 159+ array('{{sometemplate|var1 =var2}}',
 160+ ' var1 ',
 161+ ' var3 ',
 162+ '{{sometemplate| var1 = var3 }}'),
 163+ array('{{title with spaces|var1=var2}}',
 164+ ' var1 ',
 165+ ' var3 ',
 166+ '{{title with spaces| var1 = var3 }}'),
 167+ array('{{sometemplate| field name with spaces=var2}}',
 168+ 'field name with spaces ',
 169+ 'var3 ',
 170+ '{{sometemplate|field name with spaces =var3 }}'),
 171+ array('{{sometemplate| var1 = value with spaces }}',
 172+ 'var1',
 173+ 'value with spaces 2',
 174+ '{{sometemplate|var1=value with spaces 2}}'),
 175+ array('{{sometemplate|1234|var1= value with spaces}}',
 176+ 'var1',
 177+ 'value with spaces 2',
 178+ '{{sometemplate|1234|var1=value with spaces 2}}'),
 179+ array('{{sometemplate|a =b | b = c|numbered}}',
 180+ 'a',
 181+ 'd',
 182+ '{{sometemplate|a=d| b = c|numbered}}'),
 183+ array('{{sometemplate| a =b|b=c|numbered}}',
 184+ 'x ',
 185+ ' y',
 186+ '{{sometemplate| a =b|b=c|numbered|x = y}}')
 187+ );
 188+ }
 189+ /**
 190+ * @dataProvider parameterChangeSpacedNameValueProvider
 191+ */
 192+ public function testTemplateParameterChangeHonoringSpacing($orig, $index, $value, $result)
 193+ {
 194+ $template = new POMTemplate($orig);
 195+ $template->setParameter($index, $value, false, false, true, true);
 196+ $this->assertEquals($result, $template->asString());
 197+ }
 198+
 199+ public function testParameterWithEmptyNameShouldBeIgnoredButPreserved()
 200+ {
 201+ $somestring = '{{tempname|name=val1|=val2}}';
 202+ $template = new POMTemplate($somestring);
 203+ $this->assertEquals($somestring, $template->asString());
 204+ }
 205+
 206+ /**
 207+ * @expectedException WrongParameterNameException
 208+ */
 209+ public function testThrowExceptionOnGettingParameterByEmptyName()
 210+ {
 211+ $somestring = '{{tempname|name=val1}}';
 212+ $template = new POMTemplate($somestring);
 213+ $res = $template->getParameter(' ');
 214+ }
 215+
 216+ /**
 217+ * @expectedException WrongParameterNameException
 218+ */
 219+ public function testThrowExceptionSettingParameterByEmptyName()
 220+ {
 221+ $somestring = '{{tempname|name=val1}}';
 222+ $template = new POMTemplate($somestring);
 223+ $res = $template->setParameter(' ', 'value');
 224+ }
 225+}
Property changes on: tags/extensions/PageObjectModel/REL_0_1_3/tests/POMTemplateTest.php
___________________________________________________________________
Name: svn:eol-style
1226 + native
Index: tags/extensions/PageObjectModel/REL_0_1_3/tests/POMPageTest.php
@@ -0,0 +1,32 @@
 2+<?php
 3+require_once 'PHPUnit/Framework.php';
 4+require_once 'POM.php';
 5+
 6+class POMPageTest extends PHPUnit_Framework_TestCase
 7+{
 8+ # TODO add more data
 9+ public static function pageProvider()
 10+ {
 11+ return array(
 12+ array('{{sometemplate|var1=var2}}'),
 13+ array('{{title with spaces|var1=var2}}'),
 14+ array('{{sometemplate| field name with spaces=var2}}'),
 15+ array('{{sometemplate|var1=value with spaces}}'),
 16+ array('{{sometemplate|1234|var1=value with spaces}}'),
 17+ array('{{sometemplate|a=b|b=c|numbered}}'),
 18+ array('{{sometemplate|a={{othertemplate|x=y}}|b=c|numbered}}'),
 19+ array("sometext\nbefore first with spaces {{sometemplate |var1=var2}}\nbefore second {{ someothertemplate|param1 = 0}} plus another {{someothertemplate
 20+|param2 = something
 21+}} more text at the end\n")
 22+ );
 23+ }
 24+
 25+ /**
 26+ * @dataProvider pageProvider
 27+ */
 28+ public function testInputIsTheSameAsOutput($pagetext)
 29+ {
 30+ $page = new POMPage($pagetext);
 31+ $this->assertEquals($pagetext, $page->asString());
 32+ }
 33+}
Property changes on: tags/extensions/PageObjectModel/REL_0_1_3/tests/POMPageTest.php
___________________________________________________________________
Name: svn:eol-style
134 + native
Index: tags/extensions/PageObjectModel/REL_0_1_3/PageObjectModel.php
@@ -0,0 +1,208 @@
 2+<?php
 3+#
 4+# This will enable POM editing throught MediaWiki API
 5+#
 6+require_once ("$IP/extensions/PageObjectModel/POM.php");
 7+
 8+require_once ("$IP/includes/api/ApiBase.php");
 9+
 10+global $wgAPIModules;
 11+$wgAPIModules['pomsettplparam'] = 'ApiPOMSetTemplateParameter';
 12+$wgAPIModules['pomgettplparam'] = 'ApiPOMGetTemplateParameter';
 13+
 14+/**
 15+ * @addtogroup API
 16+ */
 17+class ApiPOMSetTemplateParameter extends ApiBase {
 18+
 19+ public function __construct($query, $moduleName) {
 20+ parent :: __construct($query, $moduleName);
 21+ }
 22+
 23+ public function execute() {
 24+ global $wgUser;
 25+
 26+ $params = $this->extractRequestParams();
 27+ if (is_null($params['page']))
 28+ $this->dieUsage('Must specify page title', 0);
 29+ if (is_null($params['tpl']))
 30+ $this->dieUsage('Must specify template name', 1);
 31+ if (is_null($params['param']))
 32+ $this->dieUsage('Must specify parameter name', 2);
 33+ if (is_null($params['value']))
 34+ $this->dieUsage('Must specify value', 3);
 35+ if (is_null($params['summary']))
 36+ $this->dieUsage('Must specify edit summary', 4);
 37+
 38+ $page = $params['page'];
 39+ $template = $params['tpl'];
 40+ $instance = $params['tplinstance'];
 41+ $parameter = $params['param'];
 42+ $value = $params['value'];
 43+ $summary = $params['summary'];
 44+
 45+
 46+ $articleTitle = Title::newFromText( $page );
 47+ if (!$articleTitle)
 48+ $this->dieUsage("Can't create title object ($page)", 5);
 49+
 50+ $errors = $articleTitle->getUserPermissionsErrors('edit', $wgUser);
 51+ if(!empty($errors))
 52+ $this->dieUsage(wfMsg($errors[0][0], $errors[0][1]), 8);
 53+
 54+ $article = new Article($articleTitle);
 55+ if (!$article->exists())
 56+ $this->dieUsage("Article doesn't exist ($page)", 6);
 57+
 58+ $pom = new POMPage($article->getContent());
 59+ if (array_key_exists($template, $pom->templates)
 60+ && array_key_exists($instance, $pom->templates[$template])
 61+ )
 62+ {
 63+ $pom->templates[$template][$instance]->setParameter($parameter, $value);
 64+ }
 65+ else
 66+ {
 67+ $this->dieUsage("This template ($template, instance #$instance) with this parameter ($parameter) doesn't exist within this page ($page)", 7);
 68+ }
 69+
 70+ $success = $article->doEdit($pom->asString(), $summary);
 71+
 72+ $result=array();
 73+ if ( $success ) {
 74+ $result['result']='Success';
 75+ } else {
 76+ $result['result']='Failure';
 77+ }
 78+
 79+ $this->getResult()->addValue(null, 'pomsettplparam', $result);
 80+ }
 81+
 82+ protected function getAllowedParams() {
 83+ return array (
 84+ 'page' => null,
 85+ 'tpl' => null,
 86+ 'tplinstance' => array (
 87+ ApiBase :: PARAM_TYPE => 'integer',
 88+ ApiBase :: PARAM_DFLT => 0,
 89+ ApiBase :: PARAM_MIN => 0
 90+ ),
 91+ 'param' => null,
 92+ 'value' => null,
 93+ 'summary' => null
 94+ );
 95+ }
 96+
 97+ protected function getParamDescription() {
 98+ return array (
 99+ 'page' => 'Title of the page to modify',
 100+ 'tpl' => 'Name of the template withing the page',
 101+ 'tplinstance' => 'Instance number of the template - by dafault firt (0) is used',
 102+ 'param' => 'Parameter name',
 103+ 'value' => 'Value to set',
 104+ 'summary' => 'Edit summary'
 105+ );
 106+ }
 107+
 108+ protected function getDescription() {
 109+ return 'Call to set template parameter value using Page Object Model (http://www.mediawiki.org/Extension:Page_Object_Model)';
 110+ }
 111+
 112+ protected function getExamples() {
 113+ return array (
 114+ 'api.php?action=pomsettplparam&page=Somepage&tpl=SomeTempate&param=templateparam&value=It+works!&summary=Editing+template+param+using+Page+Object+Model'
 115+ );
 116+ }
 117+
 118+ public function getVersion() {
 119+ return __CLASS__ . ': $Id$';
 120+ }
 121+}
 122+
 123+/**
 124+ * @addtogroup API
 125+ */
 126+class ApiPOMGetTemplateParameter extends ApiBase {
 127+
 128+ public function __construct($query, $moduleName) {
 129+ parent :: __construct($query, $moduleName);
 130+ }
 131+
 132+ public function execute() {
 133+ global $wgUser;
 134+
 135+ $params = $this->extractRequestParams();
 136+ if (is_null($params['page']))
 137+ $this->dieUsage('Must specify page title', 0);
 138+ if (is_null($params['tpl']))
 139+ $this->dieUsage('Must specify template name', 1);
 140+ if (is_null($params['param']))
 141+ $this->dieUsage('Must specify parameter name', 2);
 142+
 143+ $page = $params['page'];
 144+ $template = $params['tpl'];
 145+ $instance = $params['tplinstance'];
 146+ $parameter = $params['param'];
 147+
 148+ $articleTitle = Title::newFromText( $page );
 149+ if (!$articleTitle)
 150+ $this->dieUsage("Can't create title object ($page)", 5);
 151+
 152+ $errors = $articleTitle->getUserPermissionsErrors('read', $wgUser);
 153+ if(!empty($errors))
 154+ $this->dieUsage(wfMsg($errors[0][0], $errors[0][1]), 8);
 155+
 156+ $article = new Article($articleTitle);
 157+ if (!$article->exists())
 158+ $this->dieUsage("Article doesn't exist ($page)", 6);
 159+
 160+ $pom = new POMPage($article->getContent());
 161+ if (array_key_exists($template, $pom->templates)
 162+ && array_key_exists($instance, $pom->templates[$template])
 163+ )
 164+ {
 165+ $result['value'] = $pom->templates[$template][$instance]->getParameter($parameter);
 166+ $this->getResult()->addValue(null, 'pomgettplparam', $result);
 167+ }
 168+ else
 169+ {
 170+ $this->dieUsage("This template ($template, instance #$instance) with this parameter ($parameter) doesn't exist within this page ($page)", 7);
 171+ }
 172+ }
 173+
 174+ protected function getAllowedParams() {
 175+ return array (
 176+ 'page' => null,
 177+ 'tpl' => null,
 178+ 'tplinstance' => array (
 179+ ApiBase :: PARAM_TYPE => 'integer',
 180+ ApiBase :: PARAM_DFLT => 0,
 181+ ApiBase :: PARAM_MIN => 0
 182+ ),
 183+ 'param' => null
 184+ );
 185+ }
 186+
 187+ protected function getParamDescription() {
 188+ return array (
 189+ 'page' => 'Title of the page to query',
 190+ 'tpl' => 'Name of the template withing the page',
 191+ 'tplinstance' => 'Instance number of the template - by dafault firt (0) is used',
 192+ 'param' => 'Parameter name'
 193+ );
 194+ }
 195+
 196+ protected function getDescription() {
 197+ return 'Call to get template parameter value using Page Object Model (http://www.mediawiki.org/Extension:Page_Object_Model)';
 198+ }
 199+
 200+ protected function getExamples() {
 201+ return array (
 202+ 'api.php?action=pomgettplparam&page=Somepage&tpl=SomeTempate&param=templateparam'
 203+ );
 204+ }
 205+
 206+ public function getVersion() {
 207+ return __CLASS__ . ': $Id$';
 208+ }
 209+}
Property changes on: tags/extensions/PageObjectModel/REL_0_1_3/PageObjectModel.php
___________________________________________________________________
Name: svn:eol-style
1210 + native
Index: tags/extensions/PageObjectModel/REL_0_1_3/POM/Element.php
@@ -0,0 +1,27 @@
 2+<?php
 3+#
 4+# Element is an abstract class repersents every part distinguished within the page
 5+# All real elements must be a subclass of this class
 6+#
 7+
 8+abstract class POMElement {
 9+
 10+ public $children = array();
 11+
 12+ function asString() {
 13+ $output = '';
 14+
 15+ foreach ($this->children as $child)
 16+ {
 17+ $output.=$child->asString();
 18+ }
 19+
 20+ return $output;
 21+ }
 22+
 23+ function addChild(POMElement $el)
 24+ {
 25+ $this->children[] = $el;
 26+ }
 27+}
 28+
Property changes on: tags/extensions/PageObjectModel/REL_0_1_3/POM/Element.php
___________________________________________________________________
Name: svn:eol-style
129 + native
Index: tags/extensions/PageObjectModel/REL_0_1_3/POM/TextNode.php
@@ -0,0 +1,21 @@
 2+<?php
 3+#
 4+# TextNode represents simple text
 5+#
 6+
 7+class POMTextNode extends POMElement {
 8+
 9+ protected $nodeText = '';
 10+
 11+ public function POMTextNode($text)
 12+ {
 13+ $this->nodeText = $text;
 14+ $this->children = null; // forcefully ignore children
 15+ }
 16+
 17+ public function asString()
 18+ {
 19+ return $this->nodeText;
 20+ }
 21+}
 22+
Property changes on: tags/extensions/PageObjectModel/REL_0_1_3/POM/TextNode.php
___________________________________________________________________
Name: svn:eol-style
123 + native
Index: tags/extensions/PageObjectModel/REL_0_1_3/POM/Template.php
@@ -0,0 +1,163 @@
 2+<?php
 3+#
 4+# Template class repersents templates
 5+#
 6+require_once('Util.php');
 7+require_once('TemplateParameter.php');
 8+
 9+class POMTemplate extends POMElement
 10+{
 11+ protected $title_triple;
 12+
 13+ protected $parameters = array();
 14+
 15+ public function POMTemplate($text)
 16+ {
 17+ $this->children = null; // forcefully ignore children
 18+
 19+ # Remove curly braces at the beginning and at the end
 20+ $text = substr($text, 2, strlen($text) - 4);
 21+
 22+ # Split by pipe
 23+ $parts = split('\|', $text);
 24+
 25+ $this->title_triple = new POMUtilTrimTriple(array_shift($parts));
 26+
 27+ foreach ($parts as $part)
 28+ {
 29+ $this->parameters[] = POMTemplateParameter::parse($part);
 30+ }
 31+ }
 32+
 33+ public function getTitle()
 34+ {
 35+ return $this->title_triple->trimmed;
 36+ }
 37+
 38+ public function getParameter($name)
 39+ {
 40+ $trimmed_name = trim($name);
 41+ if (strlen($trimmed_name) == 0)
 42+ {
 43+ throw new WrongParameterNameException('Can\'t get parameter with no name');
 44+ }
 45+
 46+ $number = 1;
 47+ for ($i = 0; $i < count($this->parameters); $i++)
 48+ {
 49+ $parameter = $this->parameters[$i];
 50+
 51+ # checking this in runtime to make sure we cover all post-parsing updates to the list
 52+ if (is_a($parameter, 'POMTemplateNamedParameter'))
 53+ {
 54+ if ($parameter->getName() == $trimmed_name)
 55+ {
 56+ return $parameter->getValue();
 57+ }
 58+ }
 59+ else if (is_a($parameter, 'POMTemplateNumberedParameter'))
 60+ {
 61+ if ($number == $trimmed_name)
 62+ {
 63+ return $parameter->getValue();
 64+ }
 65+ $number++;
 66+ }
 67+ }
 68+
 69+ return null; # none matched
 70+ }
 71+
 72+ public function setParameter($name, $value,
 73+ $ignore_name_spacing = true,
 74+ $ignore_value_spacing = true,
 75+ $override_name_spacing = false, # when original value exists
 76+ $override_value_spacing = false # when original value exists
 77+ )
 78+ {
 79+ $trimmed_name = trim($name);
 80+ if (strlen($trimmed_name) == 0)
 81+ {
 82+ throw new WrongParameterNameException("Can't set parameter with no name");
 83+ }
 84+
 85+ if ($ignore_name_spacing)
 86+ {
 87+ $name = $trimmed_name;
 88+ }
 89+
 90+ if ($ignore_value_spacing)
 91+ {
 92+ $value = trim($value);
 93+ }
 94+
 95+ # first go through named parameters and see if name matches
 96+ for ($i = 0; $i < count($this->parameters); $i++)
 97+ {
 98+ if (is_a($this->parameters[$i], 'POMTemplateNamedParameter') &&
 99+ $this->parameters[$i]->getName() == $trimmed_name)
 100+ {
 101+ $this->parameters[$i]->update($name, $value, $override_name_spacing, $override_value_spacing);
 102+ return;
 103+ }
 104+ }
 105+
 106+ # then go through numbered parameters and see if parameter with this number exists
 107+ $number = 1;
 108+ for ($i = 0; $i < count($this->parameters); $i++)
 109+ {
 110+ if (is_a($this->parameters[$i], 'POMTemplateNumberedParameter'))
 111+ {
 112+ if ($number == $trimmed_name)
 113+ {
 114+ $this->parameters[$i]->update($value, $override_value_spacing);
 115+ return;
 116+ }
 117+ $number++;
 118+ }
 119+ }
 120+
 121+ # now, if passed name is numeric, create numbered parameter, otherwise create named parameter
 122+ # add parameter to parameters array
 123+ if (is_numeric($trimmed_name) && ((int)$trimmed_name) == $trimmed_name)
 124+ {
 125+ $this->parameters[] = new POMTemplateNumberedParameter($value);
 126+ }
 127+ else
 128+ {
 129+ $this->parameters[] = new POMTemplateNamedParameter($name, $value);
 130+ }
 131+ }
 132+
 133+ public function asString()
 134+ {
 135+ $text = '{{'.$this->title_triple->toString();
 136+
 137+ for ($i = 0; $i < count($this->parameters); $i++)
 138+ {
 139+ $text .= '|';
 140+ #echo "\n[$i]: ".var_export($this->parameters)."\n\n-----------------------------------\n";
 141+ $text .= $this->parameters[$i]->toString();
 142+ }
 143+
 144+ $text .= '}}';
 145+
 146+ return $text;
 147+ }
 148+}
 149+
 150+class WrongParameterNameException extends Exception
 151+{
 152+ // Redefine the exception so message isn't optional
 153+ public function __construct($message, $code = 0) {
 154+ // some code
 155+
 156+ // make sure everything is assigned properly
 157+ parent::__construct($message, $code);
 158+ }
 159+
 160+ // custom string representation of object
 161+ public function __toString() {
 162+ return __CLASS__ . ": [{$this->code}]: {$this->message}\n";
 163+ }
 164+}
Property changes on: tags/extensions/PageObjectModel/REL_0_1_3/POM/Template.php
___________________________________________________________________
Name: svn:eol-style
1165 + native
Index: tags/extensions/PageObjectModel/REL_0_1_3/POM/Page.php
@@ -0,0 +1,32 @@
 2+<?php
 3+#
 4+# Page class repersents Page - top level element resulting from page parsing.
 5+#
 6+
 7+class POMPage extends POMElement
 8+{
 9+ var $c = array(); # collections array - parsers can elements to it
 10+
 11+ var $templates; # shortcut to $c['templates'], set up if POMTemplateParser was used
 12+
 13+ public function POMPage($text, $parsers = array('POMTemplateParser'))
 14+ {
 15+ $this->addChild(new POMTextNode($text));
 16+
 17+ #
 18+ # Here we'll call parsers
 19+ #
 20+ foreach ($parsers as $parser)
 21+ {
 22+ # workign around no class variables in PHP pre 5.3.0
 23+ call_user_func(array($parser, 'Parse'), $this);
 24+
 25+ # let's try to add $this->templates
 26+ if ($parser == 'POMTemplateParser' && array_key_exists('templates', $this->c))
 27+ {
 28+ $this->templates = $this->c['templates'];
 29+ }
 30+ }
 31+ }
 32+}
 33+
Property changes on: tags/extensions/PageObjectModel/REL_0_1_3/POM/Page.php
___________________________________________________________________
Name: svn:eol-style
134 + native
Index: tags/extensions/PageObjectModel/REL_0_1_3/POM/Parser.php
@@ -0,0 +1,15 @@
 2+<?php
 3+#
 4+# Parser is an abstract class for various parsers that will post-process a page.
 5+# All parsers must subclass this class
 6+#
 7+
 8+abstract class POMParser
 9+{
 10+ /**
 11+ This is main method for parsers
 12+ It takes a page as argument and processes it adding elements
 13+ */
 14+ static abstract function Parse(POMPage $page);
 15+}
 16+
Property changes on: tags/extensions/PageObjectModel/REL_0_1_3/POM/Parser.php
___________________________________________________________________
Name: svn:eol-style
117 + native
Index: tags/extensions/PageObjectModel/REL_0_1_3/POM/TemplateParameter.php
@@ -0,0 +1,158 @@
 2+<?php
 3+#
 4+# Set of classes representing various types of template parameters
 5+#
 6+require_once('Util.php');
 7+
 8+abstract class POMTemplateParameter
 9+{
 10+ abstract function toString();
 11+
 12+ static function parse($text)
 13+ {
 14+
 15+ $pair = split('=', $text, 2);
 16+
 17+ # if it's a name/value pair, create POMTemplateNamedParameter, otherwise, create POMTemplateNumberedParameter
 18+ # if neither can be created, return POMTemplateInvalidParameter
 19+ if (count($pair) > 1)
 20+ {
 21+ $name = $pair[0];
 22+ $value = $pair[1];
 23+
 24+ $name_triple = new POMUtilTrimTriple($name);
 25+
 26+ if (strlen($name_triple->trimmed)<=0)
 27+ {
 28+ # ignore parameters with empty name
 29+ return new POMTemplateInvalidParameter($text);
 30+ }
 31+
 32+ return new POMTemplateNamedParameter($name, $value);
 33+ }
 34+ else
 35+ {
 36+ return new POMTemplateNumberedParameter($text);
 37+ }
 38+ }
 39+}
 40+
 41+class POMTemplateNamedParameter extends POMTemplateParameter
 42+{
 43+ private $name_triple;
 44+ private $value_triple;
 45+
 46+ function __construct($name, $value)
 47+ {
 48+ $this->name_triple = new POMUtilTrimTriple($name);
 49+ $this->value_triple = new POMUtilTrimTriple($value);
 50+ }
 51+
 52+ function update($name, $value, $override_name_spacing = false, $override_value_spacing = false)
 53+ {
 54+ $name_triple = new POMUtilTrimTriple($name);
 55+ $value_triple = new POMUtilTrimTriple($value);
 56+
 57+ if ($override_name_spacing)
 58+ {
 59+ $this->name_triple = $name_triple;
 60+ }
 61+ else
 62+ {
 63+ $this->name_triple->trimmed = $name_triple->trimmed;
 64+ }
 65+
 66+ if ($override_value_spacing)
 67+ {
 68+ $this->value_triple = $value_triple;
 69+ }
 70+ else
 71+ {
 72+ $this->value_triple->trimmed = $value_triple->trimmed;
 73+ }
 74+ }
 75+
 76+ function getName()
 77+ {
 78+ return $this->name_triple->trimmed;
 79+ }
 80+
 81+ function getValue()
 82+ {
 83+ return $this->value_triple->trimmed;
 84+ }
 85+
 86+ function getNameTriple()
 87+ {
 88+ return $this->name_triple;
 89+ }
 90+
 91+ function getValueTriple()
 92+ {
 93+ return $this->value_triple;
 94+ }
 95+
 96+ function toString()
 97+ {
 98+ return $this->name_triple->toString().'='.$this->value_triple->toString();
 99+ }
 100+}
 101+
 102+
 103+class POMTemplateNumberedParameter extends POMTemplateParameter
 104+{
 105+ private $value_triple;
 106+
 107+ function __construct($value)
 108+ {
 109+ $this->value_triple = new POMUtilTrimTriple($value);
 110+ }
 111+
 112+ function update($value, $override_value_spacing = false)
 113+ {
 114+ $value_triple = new POMUtilTrimTriple($value);
 115+
 116+ if ($override_value_spacing)
 117+ {
 118+ $this->value_triple = $value_triple;
 119+ }
 120+ else
 121+ {
 122+ $this->value_triple->trimmed = $value_triple->trimmed;
 123+ }
 124+ }
 125+
 126+ function getValue()
 127+ {
 128+ return $this->value_triple->trimmed;
 129+ }
 130+
 131+ function getValueTriple()
 132+ {
 133+ return $this->value_triple;
 134+ }
 135+
 136+ function toString()
 137+ {
 138+ return $this->value_triple->toString();
 139+ }
 140+
 141+}
 142+
 143+/**
 144+ * Represents parameters that need to be preserved, but not parsed
 145+ */
 146+class POMTemplateInvalidParameter extends POMTemplateParameter
 147+{
 148+ private $text;
 149+
 150+ function __construct($text)
 151+ {
 152+ $this->text = $text;
 153+ }
 154+
 155+ function toString()
 156+ {
 157+ return $this->text;
 158+ }
 159+}
Property changes on: tags/extensions/PageObjectModel/REL_0_1_3/POM/TemplateParameter.php
___________________________________________________________________
Name: svn:eol-style
1160 + native
Index: tags/extensions/PageObjectModel/REL_0_1_3/POM/Util.php
@@ -0,0 +1,38 @@
 2+<?php
 3+#
 4+# Set of classes representing various types of template parameters
 5+#
 6+
 7+class POMUtilTrimTriple
 8+{
 9+ public $leading_space;
 10+ public $trimmed;
 11+ public $trailing_space;
 12+
 13+ function POMUtilTrimTriple($text)
 14+ {
 15+ $this->trimmed = trim($text);
 16+ if (strlen($this->trimmed) > 0)
 17+ {
 18+ $this->leading_space = substr($text, 0, strpos($text, $this->trimmed));
 19+ if (strpos($text, $this->trimmed) + strlen($this->trimmed) < strlen($text))
 20+ {
 21+ $this->trailing_space = substr($text, strpos($text, $this->trimmed) + strlen($this->trimmed));
 22+ }
 23+ else
 24+ {
 25+ $this->trailing_space = '';
 26+ }
 27+ }
 28+ else
 29+ {
 30+ $this->leading_space = '';
 31+ $this->trailing_space = $text;
 32+ }
 33+ }
 34+
 35+ function toString()
 36+ {
 37+ return $this->leading_space.$this->trimmed.$this->trailing_space;
 38+ }
 39+}
Property changes on: tags/extensions/PageObjectModel/REL_0_1_3/POM/Util.php
___________________________________________________________________
Name: svn:eol-style
140 + native
Index: tags/extensions/PageObjectModel/REL_0_1_3/POM/TemplateCollection.php
@@ -0,0 +1,10 @@
 2+<?php
 3+#
 4+# TemplateCollection class repersents collection of templates with the same name
 5+# Template collections are used in Page::templates shortcut construct
 6+#
 7+
 8+class POMTemplateCollection {
 9+
 10+}
 11+
Property changes on: tags/extensions/PageObjectModel/REL_0_1_3/POM/TemplateCollection.php
___________________________________________________________________
Name: svn:eol-style
112 + native
Index: tags/extensions/PageObjectModel/REL_0_1_3/POM/TemplateParser.php
@@ -0,0 +1,104 @@
 2+<?php
 3+#
 4+# Template class repersents templates
 5+#
 6+
 7+define("MAX_TEMPLATE_NESTING_LEVEL", 50);
 8+
 9+class POMTemplateParser extends POMParser
 10+{
 11+ #
 12+ # This function will parse all POMTextNodes in the page and add POMTemplate nodes if templates are found
 13+ #
 14+ static function Parse(POMPage $page)
 15+ {
 16+ // this array holds shortcuts to templates
 17+ $page->c['templates'] = array();
 18+
 19+ // this array will hold updated version of the tree end will replace original one if it was updated
 20+ $newchildren = array();
 21+
 22+ // we'll set it to true if tree was updated
 23+ $replaceoldchildrenwithnew = false;
 24+
 25+ for ($n = 0; $n < sizeof($page->children); $n++)
 26+ {
 27+ if (is_a($page->children[$n], 'POMTextNode'))
 28+ {
 29+ $nodetext = $page->children[$n]->asString();
 30+
 31+ while(($firstopen = strpos($nodetext, '{{')) !== FALSE)
 32+ {
 33+ $position = $firstopen;
 34+
 35+ $balance = 1; // we just found first open, balance moved up
 36+
 37+ // by the end of this loop, $position should hold end of template
 38+ do
 39+ {
 40+ $nextopen = strpos($nodetext, '{{', $position+2);
 41+ $nextclose = strpos($nodetext, '}}', $position+2);
 42+
 43+ // we didn't find end of template but still in this loop - skipping to next chunk
 44+ if ($nextclose === FALSE)
 45+ {
 46+ $brokenchunk = TRUE;
 47+ continue 3; // get to next item in for loop
 48+ }
 49+
 50+ // next open tag is first, balance goes up
 51+ // position is updated to closest marker
 52+ if ($nextopen !== FALSE && $nextopen < $nextclose)
 53+ {
 54+ $balance += 1;
 55+ $position = $nextopen;
 56+ }
 57+ else
 58+ {
 59+ $balance -= 1;
 60+ $position = $nextclose;
 61+ }
 62+
 63+ // In case something is wrong and we recursed too deep, die.
 64+ if ($balance > MAX_TEMPLATE_NESTING_LEVEL)
 65+ {
 66+ die('[ERROR] Reached maximum template nesting level of '.MAX_TEMPLATE_NESTING_LEVEL.". Something is probably wrong with POM, please report this problem to developers.\n");
 67+ }
 68+ } while ($balance > 0); // we'll be done with the loop only when found matching chunk
 69+
 70+ // part before the template becomes text node
 71+ $newchildren[] = new POMTextNode(substr($nodetext, 0, $firstopen));
 72+
 73+ // part between opening {{ and closing }} becomes template
 74+ $template = new POMTemplate(substr($nodetext, $firstopen, $position+2-$firstopen));
 75+ $newchildren[] = $template;
 76+ $page->c['templates'][$template->getTitle()][] = $template;
 77+
 78+ // the rest of it should be processed for more templates
 79+ $nodetext = substr($nodetext, $position+2);
 80+
 81+ $replaceoldchildrenwithnew = true;
 82+ }
 83+
 84+ if (strlen($nodetext) > 0)
 85+ {
 86+ $newchildren[] = new POMTextNode($nodetext);
 87+
 88+ $replaceoldchildrenwithnew = true;
 89+ }
 90+ }
 91+ else
 92+ {
 93+ // preserve non-text nodes in the tree
 94+ $newchildren[] = $page->children[$n];
 95+ }
 96+ }
 97+
 98+ // if tree was updated, let's replace it in the page
 99+ if ($replaceoldchildrenwithnew)
 100+ {
 101+ $page->children = $newchildren;
 102+ }
 103+ }
 104+}
 105+
Property changes on: tags/extensions/PageObjectModel/REL_0_1_3/POM/TemplateParser.php
___________________________________________________________________
Name: svn:eol-style
1106 + native
Index: tags/extensions/PageObjectModel/REL_0_1_3/Makefile
@@ -0,0 +1,16 @@
 2+# Simple make file to run PHPUnit tests
 3+
 4+all: testcoverage
 5+
 6+test:
 7+ phpunit --configuration tests/tests.xml
 8+
 9+testcoverage:
 10+ phpunit --configuration tests/tests.xml --coverage-html code_coverage
 11+
 12+clean:
 13+ rm -rf code_coverage
 14+ rm PageObjectModel*.tgz
 15+
 16+tardist:
 17+ tar -c POM.php POM/ --exclude .svn| gzip >PageObjectModel.tgz
Property changes on: tags/extensions/PageObjectModel/REL_0_1_3/Makefile
___________________________________________________________________
Name: svn:eol-style
118 + native
Index: tags/extensions/PageObjectModel/REL_0_1_3/examples/POMVersion.php
@@ -0,0 +1,15 @@
 2+<?
 3+require_once('POM.php');
 4+
 5+# Get document from MediaWiki server
 6+$pom = new POMPage(join(file('http://www.mediawiki.org/w/index.php?title=Extension:Page_Object_Model&action=raw')));
 7+
 8+# Check current version
 9+$ver = $pom->templates['Extension'][0]->getParameter('version');
 10+echo "Current version: $ver\n";
 11+
 12+# Increase version number by fraction
 13+$pom->templates['Extension'][0]->setParameter('version', $ver + 0.1);
 14+
 15+# Do whatever you want with result (we'll just display it)
 16+echo "Document with increased version:\n".$pom->asString();
Property changes on: tags/extensions/PageObjectModel/REL_0_1_3/examples/POMVersion.php
___________________________________________________________________
Name: svn:eol-style
117 + native

Status & tagging log