#!/usr/bin/php -q getTreeFromString($data); $tree->dump(); class SDX_Parser { var $outputDir = ''; function start($data) { $this->transform($data); // make the subdirectories? $fh = fopen ('slides.xml','w'); fwrite($fh,''."\n"); fwrite($fh,"presentation}>\n"); fwrite($fh,"{$this->title}\n"); fwrite($fh,"{$this->topic}\n"); fwrite($fh,"{$this->event}\n"); fwrite($fh,"{$this->location}\n"); fwrite($fh,"{$this->date}\n"); fwrite($fh,"{$this->speaker}\n"); fwrite($fh,"{$this->company}\n"); fwrite($fh,"{$this->email}\n"); fwrite($fh,"{$this->url}\n"); foreach($this->files as $f) { fwrite($fh,"{$this->outputDir}/{$f}\n"); } fwrite($fh,''); fclose($fh); } function makeOutputDir() { if (file_exists($this->outputDir)) { return; } $parts= explode('/',$this->outputDir); $dir =''; foreach($parts as $dir) { $fulldir .= $dir; if (!file_exists($fulldir)) { mkdir($fulldir); } $fulldir .= '/'; } } var $_caseFolding = TRUE; function transform($xml) { // Don't process input when it contains no XML elements. if (strpos($xml, '<') === false) { return $xml; } // Create XML parser, set parser options. $parser = xml_parser_create(); xml_set_object($parser, $this); xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, $this->_caseFolding); // Register SAX callbacks. xml_set_element_handler($parser, '_startElement', '_endElement'); xml_set_character_data_handler($parser, '_characterData'); // Parse input. if (!xml_parse($parser, $xml, true)) { $line = xml_get_current_line_number($parser); echo sprintf( "Transformer: XML Error: %s at line %d:%d\n", xml_error_string(xml_get_error_code($parser)), $line, xml_get_current_column_number($parser) ); return ''; } // Clean up. xml_parser_free($parser); if ($this->fh) { fclose($this->fh); } } function _startElement($parser, $element, $attributes) { // Push element's name and attributes onto the stack. $this->_level++; $this->_elementStack[$this->_level] = $element; $this->_attributesStack[$this->_level] = $attributes; $this->_cdataStack[$this->_level] = ''; //echo "S:{$this->_level}:$element\n"; if (method_exists($this, $element.'Start')) { call_user_func(array(&$this,$element.'Start'),$attributes); } } function _endElement($parser, $element) { $cdata = $this->_cdataStack[$this->_level]; echo "E:{$this->_level}:$element:$cdata\n"; if (method_exists($this, $element.'End')) { $this->flushBlurb(); call_user_func(array(&$this,$element.'End'),$cdata); } $this->_level--; } function _characterData($parser, $cdata) { //echo "C:{$this->_elementStack[$this->_level]}:$cdata\n"; if (!method_exists($this, $this->_elementStack[$this->_level] .'End') && (trim($cdata) != '')) { //echo "GOT CDATA for {$this->_elementStack[$this->_level]}"; $this->blurb .= $cdata; } $this->_cdataStack[$this->_level] .= $cdata; } function bodyStart($a) { echo "--START--\n"; //echo "GOT BODY! $a"; } //function bodyEnd($a) { // echo "--END--\n"; //} var $blurb = ''; function bodyCdata($a) { //echo "ADD BLURB $a\n"; $this->blurb .= $a; } function flushBlurb() { if (trim($this->blurb) == '') { return; } //echo "FB: {$this->blurb}\n"; $this->add("{$this->blurb}",TRUE); $this->blurb = ''; } function hrStart($a) { //print_r($a); $this->flushBlurb(); $this->add(''); } function hrEnd($a) { } var $files = array(); function h1End($a) { if ($this->fh) { fclose($this->fh); } $filename= preg_replace('/[^a-z0-9]+/i','_',$a) . '.xml'; $this->files[] = $filename; $this->makeOutputDir(); $this->fh = fopen($this->outputDir.'/'.$filename,'w'); $this->add(''); $this->add(''); $this->add(''.$a.'',TRUE); $this->fontsize =0; } function h5End($a) { // compiler settings $parts = explode("\n",$a); foreach($parts as $line) { $s = strpos($line, ' '); $left = substr($line,0,$s); $right = substr($line,$s+1); if (!$this->$left) { $this->$left = ''; } else { $this->$left .= ' '; } $this->$left .= $right; } } function h6End($a) { } //comments function titleEnd($a) { } //comments var $fontsize =0; function smallStart() { $this->fontsize--; } function preEnd($a) { $this->add('',TRUE); } var $inLI = FALSE; function liStart($a) { } function liEnd($a) { $this->add(''.$a. '', TRUE); } function ulStart($a) { $this->inLI = TRUE; $this->add(''); } function ulEnd($a) { $this->inLI = FALSE; $this->add(''); } function imgStart($a){ //print_r($a); // scale the image ! $this->flushBlurb(); if ($a['STYLE']) { //print_r($a); preg_match('/width: ([0-9]+)px; height: ([0-9]+)px/i', $a['STYLE'],$ar); print_r($ar); $it = Image_Transform::factory('GD'); list($filename,$ext) = explode('.',$a['SRC']); $it->load( getenv('PWD'). '/'.$a['SRC'] ); print_r($it); $it->scaleMaxX( $ar[1]); $newfilename = $filename . '_'.$ar[1] .'.'. $ext; $it->save(getenv('PWD').'/'.$this->outputDir .'/'.$newfilename); } else { copy( getenv('PWD'). '/'.$a['SRC'], getenv('PWD').'/'.$this->outputDir .'/'.$a['SRC']); $newfilename = $a['SRC']; } $this->add(' ',TRUE); } var $slideInfo = ''; //function addressEnd($a) { // $this->slideInfo .= $a . "\n"; //} var $indent =0; function add($str, $noIndent=FALSE) { $ret = "\n"; if (!$noIndent && ($str[0] == '<') && ($str[1] != '?')) { if ($str[1] == '/') { $this->indent -=2; fwrite($this->fh,str_repeat(' ', $this->indent).$str.$ret); return; } else { fwrite($this->fh,str_repeat(' ', $this->indent).$str.$ret); $this->indent +=2; return; } } fwrite($this->fh, str_repeat(' ', $this->indent).$str.$ret); } } $sdxp = new SDX_Parser; $sdxp->start($data); ?>