DrupalBin
Submit Code
About
Recent Posts
css path
1 hour 29 min
ago
Fix for Code
5 hours 29 min
ago
Fix for Code
5 hours 35 min
ago
Fix for Code
5 hours 43 min
ago
more
Tags
CCK
drupal
fapi
jquery
menu
module
Panels
php
simpletest
test
theme
views
more tags
User login
Log in using OpenID:
What is OpenID?
Username:
*
Password:
*
Create new account
Request new password
Log in using OpenID
Cancel OpenID login
Home
Fix for Demo code to parse the Google SoC 2008 applications list available to mentors
View
Download
Fix
This fix will not be saved to the database until you submit.
Summary:
Tags:
Any tags you'd like to associate with your code, delimitered by commas (example: Views, CCK, Module, etc).
Source code:
*
<?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) { $items = array(); if ($may_cache) { $items[] = array ( 'title' => 'SoC 2008 - List', 'path' => 'testcode/list_apps', 'access' => user_access('administer nodes'), 'callback' => 'testcode_list_apps', ); $items[] = array ( 'title' => 'SoC 2008 - App details', 'path' => 'testcode/app_details', 'access' => user_access('administer nodes'), '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 = ''; $unsafeFile = file_get_contents('files/soc.html'); @$htmlDom = DOMDocument::loadHTML($unsafeFile); $xml = simplexml_import_dom($htmlDom); $arApps = array(); $appList = $xml->xpath('//table[@class="applist"]/tr'); array_shift($appList); 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]); $mentor = trim(strip_tags($row->td[2]->asXml())); $score = trim($row->td[3]); $arApps[] = array ( '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 = ''; $unsafeFile = file_get_contents('files/details.html'); @$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 */ $arMeta = array(); foreach($sxMeta as $sxMetaRow) { $key = trim($sxMetaRow->th); $val = trim($sxMetaRow->td); if (!empty($key)) { $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 { assert(!empty($currentArea)); $arDescription[$currentArea] = trim($sxDescriptionRow->td->div); // Warning: this contains HTML } } $ret = array ( 'meta' => $arMeta, 'description' => $arDescription ); $ret = "<pre>" . print_r($ret, true) . "</pre>"; return $ret; }
Syntax highlighting mode:
ActionScript
ColdFusion
Diff
Drupal
Drupal 5
Drupal 6
HTML
Javascript
MySQL
PHP
Python
robots.txt
SQL
Text
Select the syntax highlighting mode to use.