blob: 00c3b9219e148b61403ebf463ebd7481ab710421 [file] [log] [blame]
<?php
/*******************************************************************************
* Copyright (c) 2012 Eclipse Foundation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Wayne Beaton (Eclipse Foundation)- initial API and implementation
*******************************************************************************/
/**
* The ProjectPlanParser turns an XML-based project plan into an array.
*/
class ProjectPlanParser {
var $parser;
var $stack;
static function getPlanFromFile($file) {
if (!$file) return null;
if (!file_exists($file)) return null;
if (!$contents = file_get_contents($file)) return null;
return self::getPlanFromString($contents);
}
static function getPlanFromString($string) {
if (!$string) return null;
$parser = new self();
return $parser->parse($string);
}
function __construct() {
$this->parser = xml_parser_create_ns();
xml_set_object($this->parser, $this);
xml_set_element_handler($this->parser, "start", "end");
xml_set_character_data_handler($this->parser, "characters");
}
function parse($data) {
$this->stack = array(array());
xml_parse($this->parser, $data, true);
$top = array_pop($this->stack);
return $top['plan'][0];
}
function start($parser, $tag, $attributes) {
if (preg_match('/^HTTP:\/\/WWW\.ECLIPSE\.ORG\/PROJECT\/PLAN:(.+)$/', $tag, $matches)) {
$nested = array();
foreach($attributes as $key => $value) $nested[strtolower($key)] = $value;
array_push($this->stack, $nested);
} else {
preg_match('/^http:\/\/[^:]+:(.+)$/i', $tag, $matches);
$tag = strtolower($matches[1]);
foreach($attributes as $key => $value)
$tag .= ' ' . strtolower($key) . "=\"$value\"";
$this->characters($parser, "<$tag>");
}
}
function characters($parser, $data) {
if (!trim($data)) return;
$top = array_pop($this->stack);
$top['#text'] .= $data;
array_push($this->stack, $top);
}
function end($parser, $tag) {
if (preg_match('/^HTTP:\/\/WWW\.ECLIPSE\.ORG\/PROJECT\/PLAN:(.+)$/', $tag, $matches)) {
$tag = strtolower($matches[1]);
$nested = array_pop($this->stack);
if (isset($nested['#text']))
$nested['#text'] = preg_replace('/\s+/', ' ', trim($nested['#text']));
$top = array_pop($this->stack);
$top[$tag][] = $nested;
array_push($this->stack, $top);
} else {
preg_match('/^http:\/\/[^:]+:(.+)$/i', $tag, $matches);
$tag = strtolower($matches[1]);
$this->characters($parser, "</$tag>");
}
}
}
?>