<?php
/**
* Parse the Google SoC 2008 data available to mentors at
* http://code.google.com/soc/2008/drupal/open.html
* in order to include it in a Drupal app
*
* @author FG Marand http://drupal.org/user/27985
* @license GPL2
*
* Usage: log to the SoC2008 site as a mentor, save the pages to <your site>/files/soc.html for the list,
* and to <your site>/files/details.html for a details page
*
* and go to <your site>/testcode/list_apps
* for the list
* <your site>/testcode/app_details
* for an app details
*
* WARNING: this is just unsafe demo code.
*/
function testcode_menu($may_cache)
{
if ($may_cache)
{
(
'title' => 'SoC 2008 - List',
'path' => 'testcode/list_apps',
'callback' => 'testcode_list_apps',
);
(
'title' => 'SoC 2008 - App details',
'path' => 'testcode/app_details',
'callback' => 'testcode_app_details',
);
}
return $items;
}
/**
* Parse the page saved from
* http://code.google.com/soc/2008/drupal/open.html
* containing the applications list
*
* Link back to the individual app pages on Google
*
* @return string
*/
function testcode_list_apps()
{
$socBase = 'http://code.google.com/soc/2008/drupal/';
$ret = '';
@$htmlDom = DOMDocument::loadHTML($unsafeFile);
$xml = simplexml_import_dom($htmlDom);
$appList = $xml->xpath('//table[@class="applist"]/tr');
foreach($appList as $row)
{
/**
* Note: trim() silently casts the SimpleXML elements to strings
*/
$class =
trim($row['class']) ==
'listrequestapp' ?
'Request' :
' ';
$link = $row->td[0]->table->tr[0]->td->a;
$l =
l(trim($link[0]),
$socBase .
$link['href']);
$ts = $row->td[0]->table->tr[1]->td;
$student =
trim($row->
td[1]);
$score =
trim($row->
td[3]);
(
'class' => $class,
'link' => $l,
'student' => $student,
'mentor' => $mentor,
'score' => $score,
);
}
/**
* Now we can format the table as wished
*/
$header =
array(t('Status'), t
('Project'), t
('Student'), t
('Mentor'), t
('Score'));
$ret =
theme('table',
$header,
$arApps);
return $ret;
}
/**
* Display an individual app details, saved from
* http://code.google.com/soc/2008/drupal/app.html?csaid=<some csaid>
*
*
* @param string $csaid Code Summer App ID
*/
function testcode_app_details()
{
$csaid = 'PxIWBwNUVgECNRINH0VSXCxfPURUFg4GUXJfbkJQEQoBBiU%3D%0A'; // sample for the security scanner mentored by chx
$ret = '';
@$htmlDom = DOMDocument::loadHTML($unsafeFile);
$xml = simplexml_import_dom($htmlDom);
$sxForm = $xml->xpath('//form[@action="app.do"]'); // this could provide access to the hidden fields, but we don't need them...
$sxApplists = $xml->xpath('//table[@class="applist"]');
$sxMeta = $sxApplists[0]->tr;
$sxDescription = $sxApplists[1]->tr;
/**
* Parse the meta
*/
foreach($sxMeta as $sxMetaRow)
{
$key =
trim($sxMetaRow->
th);
$val =
trim($sxMetaRow->
td);
{
$arMeta[$key] = $val;
}
}
// dvr($arMeta);
/**
* Parse the description
*/
$arDescription =
array();
$currentArea = '';
foreach($sxDescription as $sxDescriptionRow)
{
if (isset($sxDescriptionRow->
th)) // this is the title for a new area
{
$currentArea =
trim($sxDescriptionRow->
th);
}
else // this HAS to be a td
{
$arDescription[$currentArea] =
trim($sxDescriptionRow->
td->
div);
// Warning: this contains HTML
}
}
(
'meta' => $arMeta,
'description' => $arDescription
);
$ret =
"<pre>" .
print_r($ret,
true) .
"</pre>";
return $ret;
}