parentID = $id; } function getParentID() { return $this->parentID; } function addChild(&$child) { $this->children[] = &$child; } function getHtml($target, $status) { $out = ''; foreach ($this->children as $child) { $out .= $child->getHtml($target, $status); } return $out; } } class KCategory extends KFeatures { var $type = 'category'; var $name = ''; var $children = array(); function KCategory($name) { $this->name = $name; } function getHtml($target, $status) { $out = ''; foreach ($this->children as $child) { $temp = $child->getHtml( $target, $status); # don't display empty categories if ($child->type == "category" && strlen($temp)) { $out .= sprintf("\t
  • %s\t
  • \n", $temp); } else { $out .= $temp; } } if (strlen($out)) { return sprintf("

    %s

    \n\t\n\n",$this->name,$out); } return ''; } } class KFeature extends KFeatures { var $resp_name = array(); var $resp_email = array(); var $summary = ''; var $status = ''; var $target = ''; var $type = 'feature'; function KFeature($status, $target) { $this->status = $status; $this->target = $target; } function getStatus() { return $this->status; } function getTarget() { return $this->target; } function setResponsible($name = null, $email = null) { $this->resp_name[] = $name; $this->resp_email[] = $email; } function getResponsible() { # Nobody responsible? if (count($this->resp_name) == 0) return ''; $out = ''; for ($i = 0; $i < count($this->resp_name); $i++) { if ($i > 0) $out .= ', '; if ($this->resp_name[$i]) { $out .= $this->resp_name[$i]; } if ($this->resp_name[$i] && $this->resp_email[$i]) $out .= " "; if ($this->resp_email[$i]) { $out .= '<'.$this->resp_email[$i].'>'; } } $out .= ''; return $out; } function setSummary($summary) { $this->summary .= $summary.' '; } function getHtml($target, $status){ if ($this->target == $target && $this->status == $status) { return sprintf("\t\t
  • %s%s
  • \n",$this->summary,$this->getResponsible()); } return ''; } } function startElement($parser, $name, $attrs) { global $tags; global $parentID; global $insummary; global $pcdata; global $curtag; switch ($name) { case 'FEATURES': $parentID = 0; $obj = new KFeatures(); $tags = array($obj); $insummary = false; $pcdata = ''; $curtag = ''; break; case 'CATEGORY': $obj = new KCategory($attrs['NAME']); $obj->setParentID($parentID); $tags[] = $obj; $currentID = count($tags) - 1; $tags[$parentID]->addChild($tags[$currentID]); $parentID = $currentID; break; case 'FEATURE': $obj = new KFeature($attrs['STATUS'], $attrs['TARGET']); $obj->setParentID($parentID); $tags[] = $obj; $currentID = count($tags) - 1; $tags[$parentID]->addChild($tags[$currentID]); $parentID = $currentID; break; case 'RESPONSIBLE': $n = count($tags) - 1; $tags[$n]->setResponsible(@$attrs['NAME'], @$attrs['EMAIL']); break; case 'SUMMARY': $insummary = true; $pcdata = ''; break; default: if (!$insummary) { break; } $curtag = strtolower($name); $att = ''; foreach ($attrs as $k => $v) { $att .= ' '.strtolower($k).'="'.$v.'"'; } $pcdata .= '<'.$curtag.$att.'>'; break; } } function endElement($parser, $name) { global $parentID; global $tags; global $curtag; global $pcdata; global $insummary; switch ($name) { case "FEATURE": $n = count($tags) - 1; $parentID = $tags[$n]->getParentID(); break; case "CATEGORY": $parentID = $tags[$parentID]->getParentID(); break; case "SUMMARY": $n = count($tags) - 1; $tags[$n]->setSummary($pcdata); $insummary = false; $pcdata = ''; break; default: if ($insummary) { $pcdata .= ''; } break; } } function characterData($parser, $data) { global $htmltag; global $tags; global $pcdata; global $curtag; global $insummary; if (!$insummary) { return; } $pcdata .= htmlspecialchars($data); } function parse( $file ) { $xml_parser = xml_parser_create(); xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, true); xml_set_element_handler($xml_parser, "startElement", "endElement"); xml_set_character_data_handler($xml_parser, "characterData"); if (!($fp = fopen($file, "r"))) { die("could not open XML input"); } while ($data = fread($fp, 4096)) { if (!xml_parse($xml_parser, $data, feof($fp))) { die(sprintf("XML error: %s at line %d", xml_error_string(xml_get_error_code($xml_parser)), xml_get_current_line_number($xml_parser))); } } xml_parser_free($xml_parser); } function printHtml($target, $status) { global $tags; if (!is_array($tags)) { die('You must parse the xml file first with parse("filename.xml");'); } print($tags[0]->getHtml($target,$status)); } ?>