Difference between revisions of "Extension:Selenium.php"
(Efficiency and cleanup) |
|||
Line 9: | Line 9: | ||
if (!defined('MEDIAWIKI')) die('Not an entry point.'); | if (!defined('MEDIAWIKI')) die('Not an entry point.'); | ||
− | define('SELENIUM_VERSION','0. | + | define('SELENIUM_VERSION','0.6.0, 2007-12-03 (selenium-core version 0.8.3'); |
− | $egSeleniumTag | + | $egSeleniumTag = "selenium"; |
$wgExtensionFunctions[] = 'efSetupSelenium'; | $wgExtensionFunctions[] = 'efSetupSelenium'; | ||
$wgExtensionFunctions[] = 'efSetupSpecialSelenium'; | $wgExtensionFunctions[] = 'efSetupSpecialSelenium'; | ||
Line 20: | Line 20: | ||
'author' => '[http://www.organicdesign.co.nz/User:Sven User:Sven]', | 'author' => '[http://www.organicdesign.co.nz/User:Sven User:Sven]', | ||
'description' => 'Incorporating Selenium tests into the MediaWiki environment', | 'description' => 'Incorporating Selenium tests into the MediaWiki environment', | ||
− | 'url' => 'http://www. | + | 'url' => 'http://www.organicdesign.co.nz/Extension:Selenium.php', |
'version' => SELENIUM_VERSION | 'version' => SELENIUM_VERSION | ||
); | ); | ||
Line 46: | Line 46: | ||
*/ | */ | ||
− | # Want the | + | # Want the Selenium tag to strip out <html>...</html> enclosing tags |
$text = eregi_replace('<html>.+<table', '<div class="selenium"><table', $text); | $text = eregi_replace('<html>.+<table', '<div class="selenium"><table', $text); | ||
$text = eregi_replace('</table>.+', '</table></div>', $text); | $text = eregi_replace('</table>.+', '</table></div>', $text); | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
return($text); | return($text); | ||
Line 82: | Line 74: | ||
# Properties | # Properties | ||
− | var $ | + | var $suite = array( |
− | ' | + | 'header' => '<html><head><meta content="text/html; charset=ISO-8859-1" http-equiv="content-type"><title>Selenium</title></head><body><table cellpadding="1" cellspacing="1" border="1"><tbody>', |
− | ' | + | 'footer' => '</tbody></table></body></html>' |
− | |||
); | ); | ||
Line 111: | Line 102: | ||
# Process suite or test if ?suite=article_name in query string | # Process suite or test if ?suite=article_name in query string | ||
if(array_key_exists('suite', $_REQUEST)) { | if(array_key_exists('suite', $_REQUEST)) { | ||
− | # | + | |
+ | # Render only Selenium html | ||
$wgOut->disable(); | $wgOut->disable(); | ||
wfResetOutputBuffers(); | wfResetOutputBuffers(); | ||
− | + | # $param = $_REQUEST['suite']; | |
# Grab article $param and process contents | # Grab article $param and process contents | ||
− | $ | + | $suiteTitle = Title::newFromText($_REQUEST['suite']); |
− | $article = new Article($ | + | $article = new Article($suiteTitle); |
$wikitext = $article->getContent(); | $wikitext = $article->getContent(); | ||
− | # | + | # Expanding braces of any transcluded tests |
− | $wikitext = $wgParser->preprocess($wikitext,$ | + | $wikitext = $wgParser->preprocess($wikitext,$suiteTitle,new ParserOptions()); |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
/** | /** | ||
* -------- Debugging the execute function -------- | * -------- Debugging the execute function -------- | ||
* 1) Process $wikitext into sections | * 1) Process $wikitext into sections | ||
− | * Need to catch encapsulations around | + | * Need to catch encapsulations around Selenium tags e.g. <nowiki><selenium></nowiki> |
* This match grabs is greedy finding last complete match | * This match grabs is greedy finding last complete match | ||
* $count = preg_match_all('|^={2,}\s*(.+?)\s*={2,}.*<selenium>(.+?)</selenium>|ms',$wikitext,$matches); | * $count = preg_match_all('|^={2,}\s*(.+?)\s*={2,}.*<selenium>(.+?)</selenium>|ms',$wikitext,$matches); | ||
Line 148: | Line 132: | ||
$count = preg_match_all('|^={2,}\s*(.+?)\s*={2,}(.+?</selenium>)|ms',$wikitext,$matches); | $count = preg_match_all('|^={2,}\s*(.+?)\s*={2,}(.+?</selenium>)|ms',$wikitext,$matches); | ||
− | + | ||
− | + | # $count equals 0 if articles contain no sections and corresponding tags | |
− | |||
if($count==0) { | if($count==0) { | ||
print "There were no matches"; | print "There were no matches"; | ||
Line 167: | Line 150: | ||
if($value == $_REQUEST['test']) { | if($value == $_REQUEST['test']) { | ||
$matches[2][$counter] = preg_replace('|.+?<selenium>(.+?)</selenium>|ms', "\\1", $matches[2][$counter]); | $matches[2][$counter] = preg_replace('|.+?<selenium>(.+?)</selenium>|ms', "\\1", $matches[2][$counter]); | ||
− | + | # Generating test html | |
− | |||
− | |||
print $matches[2][$counter]; | print $matches[2][$counter]; | ||
− | break; | + | break; #breaks out of foreach loop |
} | } | ||
Line 185: | Line 166: | ||
} | } | ||
− | + | ||
} else { | } else { | ||
+ | |||
# Obtain suite section headers | # Obtain suite section headers | ||
$suite_urls = array(); | $suite_urls = array(); | ||
Line 193: | Line 175: | ||
} | } | ||
− | print $this->buildSuite($suite_urls, $ | + | print $this->buildSuite($suite_urls, $_REQUEST['suite']); |
} | } | ||
Line 215: | Line 197: | ||
} | } | ||
− | function buildSuite($tests, $ | + | # Method to build a suite from an array of tests |
− | + | function buildSuite($tests, $article) { | |
− | $html = $this-> | + | |
− | $html .= "<tr><td><b>$ | + | $html = $this->suite['header']; |
+ | $html .= "<tr><td><b>$article</b></td></tr>"; | ||
foreach ($tests as $element) { | foreach ($tests as $element) { | ||
− | $html .= "<tr><td><a href=\"/wiki/index.php?title=Special:Selenium&suite=$ | + | $html .= "<tr><td><a href=\"/wiki/index.php?title=Special:Selenium&suite=$article&test=$element\">$element</a></td></tr>"; |
} | } | ||
− | $html .= $this-> | + | $html .= $this->suite['footer']; |
return $html; | return $html; | ||
} | } |
Revision as of 23:34, 27 December 2007
<?php
/** * Extension:Selenium Template:Php
Category:Extensions in progress
* Category:SeleniumCategory:Extensions created with Template:SpecialPage * - Licenced under LGPL http://www.gnu.org/copyleft/lesser.html * - Author: http://www.organicdesign.co.nz/User:Sven */
if (!defined('MEDIAWIKI')) die('Not an entry point.');
define('SELENIUM_VERSION','0.6.0, 2007-12-03 (selenium-core version 0.8.3');
$egSeleniumTag = "selenium"; $wgExtensionFunctions[] = 'efSetupSelenium'; $wgExtensionFunctions[] = 'efSetupSpecialSelenium'; $wgHooks['LanguageGetMagic'][] = 'efSeleniumLanguageGetMagic';
$wgExtensionCredits['specialpage'][] = array( 'name' => 'Special:Selenium', 'author' => 'User:Sven', 'description' => 'Incorporating Selenium tests into the MediaWiki environment', 'url' => 'http://www.organicdesign.co.nz/Extension:Selenium.php', 'version' => SELENIUM_VERSION );
require_once "$IP/includes/SpecialPage.php";
class Selenium {
- Properties
- Constructor
function __construct() { global $wgHooks,$wgParser,$egSeleniumTag;
- Add the tagHook
$wgParser->setHook($egSeleniumTag,array($this,'tagSelenium')); }
- Deploy tags to allow additional html table tags
function tagSelenium($text,$argv,&$parser) { global $wgTitle;
/** * Should be a preprocess using first stage of parser * $text = $parser->preprocess($text,$wgTitle,$parser->mOptions); */
- Want the Selenium tag to strip out ... enclosing tags
$text = eregi_replace('.+
);
- Constructor
function __construct() { SpecialPage::SpecialPage(
'Selenium', # name as seen in links etc 'sysop', # user rights required true, # listed in special:specialpages false, # function called by execute() - defaults to wfSpecial{$name} false, # file included by execute() - defaults to Special{$name}.php, only used if no function false # includable );
} /** * -------------------- Create form for Special:Selenium -------------------- * Override SpecialPage::execute() */ function execute() { global $wgOut; global $wgParser;
- Process suite or test if ?suite=article_name in query string
if(array_key_exists('suite', $_REQUEST)) {
- Render only Selenium html
$wgOut->disable(); wfResetOutputBuffers();
- $param = $_REQUEST['suite'];
- Grab article $param and process contents
$suiteTitle = Title::newFromText($_REQUEST['suite']); $article = new Article($suiteTitle); $wikitext = $article->getContent();
- Expanding braces of any transcluded tests
$wikitext = $wgParser->preprocess($wikitext,$suiteTitle,new ParserOptions());
/** * -------- Debugging the execute function -------- * 1) Process $wikitext into sections * Need to catch encapsulations around Selenium tags e.g. <selenium> * This match grabs is greedy finding last complete match * $count = preg_match_all('|^={2,}\s*(.+?)\s*={2,}.*<selenium>(.+?)</selenium>|ms',$wikitext,$matches); */ # Preparse article removing content $wikitext = preg_replace("|<nowiki><selenium>|", "selenium", $wikitext);
# Regex finding sections followed by...</selenum> tags $count = preg_match_all('|^={2,}\s*(.+?)\s*={2,}(.+?</selenium>)|ms',$wikitext,$matches);
# $count equals 0 if articles contain no sections and corresponding tags if($count==0) {
print "There were no matches";
}
- Determine whether suite or test from ?suite=article_name&test=section_num in query string
if( array_key_exists('test', $_REQUEST)) {
$_REQUEST['test'] = preg_replace("/_/", " ", $_REQUEST['test']);
if(in_array($_REQUEST['test'], $matches[1])) {
$counter = 0;
foreach($matches[1] as $value) {
if($value == $_REQUEST['test']) { $matches[2][$counter] = preg_replace('|.+?<selenium>(.+?)</selenium>|ms', "\\1", $matches[2][$counter]);
- Generating test html
print $matches[2][$counter];
break; #breaks out of foreach loop
} $counter++; } } else {
header('HTTP/1.0 404 Not Found'); $err = '<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
Not Found
The requested URL was not found on this server.
'; echo $err;
}
} else {
# Obtain suite section headers $suite_urls = array(); foreach($matches[1] as $value) { array_push($suite_urls, $value); }
print $this->buildSuite($suite_urls, $_REQUEST['suite']);
} /** * !-------- End of debugging --------- */ } else { $this->setHeaders(); $title = Title::makeTitle(NS_SPECIAL,'Selenium'); $wgOut->addWikiText(wfMsg('example-message','exampleParameter')); $wgOut->addHTML(
wfElement('form',array('action' => $title->getLocalURL('action=submit'),'method' => 'post'),null) . '<textarea name="target" cols=25 rows=10></textarea>' . wfElement('input',array('type' => 'submit')) . '</form>' );
} }
- Method to build a suite from an array of tests
function buildSuite($tests, $article) {
$html = $this->suite['header'];
$html .= "$article";
foreach ($tests as $element) {
$html .= "<a href=\"/wiki/index.php?title=Special:Selenium&suite=$article&test=$element\">$element</a>";
} $html .= $this->suite['footer']; return $html; }
}
- Called from $wgExtensionFunctions array when initialising extensions
function efSetupSpecialSelenium() {
global $wgLanguageCode,$wgMessageCache;
- Add the messages used by the specialpage
if ($wgLanguageCode == 'en') { $wgMessageCache->addMessages(array(
'selenium' => 'Example Specialpage', # The friendly page title 'exampleMessage' => "Example message: $1", ));
}
- Add the specialpage to the environment
SpecialPage::addPage(new SpecialSelenium());
}