diff options
author | ctrlaltca@gmail.com <> | 2011-11-19 11:33:31 +0000 |
---|---|---|
committer | ctrlaltca@gmail.com <> | 2011-11-19 11:33:31 +0000 |
commit | 98dbe6f0d2edfff3a1f5785504504b4a6e5dd4eb (patch) | |
tree | 89f19120abb170cb37bb512c8c9535eb2b451da8 /buildscripts/PhpDocumentor/phpDocumentor/Converters/PDF/default/ParserPDF.inc | |
parent | 1f09b786730956d01c48a82272617a0f8b2597f0 (diff) |
updating phpDocumentor, part 2: add new version
Diffstat (limited to 'buildscripts/PhpDocumentor/phpDocumentor/Converters/PDF/default/ParserPDF.inc')
-rwxr-xr-x | buildscripts/PhpDocumentor/phpDocumentor/Converters/PDF/default/ParserPDF.inc | 564 |
1 files changed, 564 insertions, 0 deletions
diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/PDF/default/ParserPDF.inc b/buildscripts/PhpDocumentor/phpDocumentor/Converters/PDF/default/ParserPDF.inc new file mode 100755 index 00000000..1339b65a --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/PDF/default/ParserPDF.inc @@ -0,0 +1,564 @@ +<?php +/** + * This class handles the XML-based CezPDF markup language created to allow + * templates for the PDFdefaultConverter + * + * phpDocumentor :: automatic documentation generator + * + * PHP versions 4 and 5 + * + * Copyright (c) 2002-2006 Gregory Beaver + * + * LICENSE: + * + * This library is free software; you can redistribute it + * and/or modify it under the terms of the GNU Lesser General + * Public License as published by the Free Software Foundation; + * either version 2.1 of the License, or (at your option) any + * later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * @package Converters + * @subpackage PDFdefault + * @author Greg Beaver <cellog@php.net> + * @copyright 2002-2006 Gregory Beaver + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @version CVS: $Id: ParserPDF.inc 238276 2007-06-22 14:58:30Z ashnazg $ + * @filesource + * @link http://www.phpdoc.org + * @link http://pear.php.net/PhpDocumentor + * @since 1.2 + */ +/** when <text> is found in an ezText input */ +define('PHPDOCUMENTOR_PDF_EVENT_TEXT', 600); +/** when <text> is found in an ezText input */ +define('PHPDOCUMENTOR_PDF_STATE_TEXT', 700); +/** used for parsing stuff between <text> */ +define('PHPDOCUMENTOR_PDF_EVENT_CONTENT', 601); +/** used for parsing stuff between <text> */ +define('PHPDOCUMENTOR_PDF_STATE_CONTENT', 701); +/** when <font> is found in an ezText input */ +define('PHPDOCUMENTOR_PDF_EVENT_FONT', 602); +/** when <font> is found in an ezText input */ +define('PHPDOCUMENTOR_PDF_STATE_FONT', 702); +/** when <newpage/> is found in an ezText input */ +define('PHPDOCUMENTOR_PDF_EVENT_NEWPAGE', 603); +/** when <newpage/> is found in an ezText input */ +define('PHPDOCUMENTOR_PDF_STATE_NEWPAGE', 703); +/** when <pdffunction> is found in an ezText input */ +define('PHPDOCUMENTOR_PDF_EVENT_PDFFUNCTION', 604); +/** when <pdffunction> is found in an ezText input */ +define('PHPDOCUMENTOR_PDF_STATE_PDFFUNCTION', 704); + + +/** + * @package Converters + * @subpackage PDFdefault + * @author Greg Beaver <cellog@php.net> + * @since 1.2 + */ +class PDFParser extends Parser +{ + /** + * Mapping of event constants to events handler function names + * @var array + * @access private + */ + var $eventHandlers + = array( + PHPDOCUMENTOR_PDF_EVENT_TEXT => 'handleText', + PHPDOCUMENTOR_PDF_EVENT_FONT => 'handleFont', + PHPDOCUMENTOR_PDF_EVENT_NEWPAGE => 'handleNewPage', + PARSER_EVENT_QUOTE => 'handleQuote', + PARSER_EVENT_NOEVENTS => 'defaultHandler', + PHPDOCUMENTOR_PDF_EVENT_CONTENT => 'handleContent', + PHPDOCUMENTOR_PDF_EVENT_PDFFUNCTION => 'handlePDFfunction', + ); + + /** + * Sets up the wordparser for this class + */ + function PDFParser() + { + $this->wp = new WordParser; + $this->setupStates(); + } + /** + * Parse text for PDFParser XML tags, and add the text to the PDF file + * + * @param string text to parse for PDFParser XML tags + * @param string full path to the font directory + * @param phpdocpdf + * @param boolean determines whether output is saved in a variable or + * added directly to the output + * @staticvar integer used for recursion limiting if a handler for an event is not found + * @return bool + */ + function parse ($parse_data,$fontdir,&$pdf,$debug=false) + { + static $endrecur = 0; + $this->_debug = $debug; + + // initialize variables so E_ALL error_reporting doesn't complain + $pevent = 0; + $word = 0; + $this->p_vars['event_stack'] = new EventStack; + $this->p_flags['reset_quote_data'] = true; + $this->p_vars['options'] = false; + $this->p_vars['font_dir'] = $fontdir; + $this->p_vars['text_size'] = false; + $this->p_vars['pdf'] = &$pdf; + + $this->wp->setup($parse_data); + $this->wp->setWhitespace(true); + + do + { + $lpevent = $pevent; + $pevent = $this->p_vars['event_stack']->getEvent(); + if ($lpevent != $pevent) + { + $this->p_vars['last_pevent'] = $lpevent; + } + + if ($this->p_vars['last_pevent'] != $pevent) + { + // its a new event so the word parser needs to be reconfigured + $this->configWordParser($pevent); + } + + + $this->p_vars['last_word'] = $word; + $word = $this->wp->getWord(); + + if (PHPDOCUMENTOR_DEBUG == true) + { + echo "----------------\n"; + echo "LAST: |" . $this->p_vars['last_word'] . "|\n"; +// echo "INDEX: ".$this->p_vars['curpar']."\n"; + echo "PEVENT: " . $this->getParserEventName($pevent) . "\n"; + echo "LASTPEVENT: " . $this->getParserEventName($this->p_vars['last_pevent']) . "\n"; + echo $this->wp->getPos() . " WORD: |".$word."|\n\n"; + } + if (isset($this->eventHandlers[$pevent])) + { + $handle = $this->eventHandlers[$pevent]; + $this->$handle($word, $pevent); + } else + { + debug('WARNING: possible error, no ParserPDFParser handler for event number '.$pevent); + if ($endrecur++ == 25) + { + die("FATAL ERROR, recursion limit reached"); + } + } + } while (!($word === false)); + if (false) { + $fp = fopen("C:/Documents and Settings/Owner/Desktop/pdfsource.txt", "a"); + fwrite($fp, $this->wp->data); + fclose($fp); + } + } + + /**#@+ + * Event Handlers + * @param string token + * @param integer event constant + * @access private + */ + function defaultHandler($word, $pevent) + { + if ($this->checkEventPush($word, $pevent)) return; + } + + /** + * Handles <newpage /> + * @tutorial ParserPDF.cls#tags.newpage + */ + function handleNewPage($word, $pevent) + { + $this->p_vars['event_stack']->popEvent(); + $this->p_vars['pdf']->ezNewPage($this->_debug); + } + + /** + * Handles <text></text> + * @tutorial ParserPDF.cls#tags.text + */ + function handleText($word, $pevent) + { + $e = $this->checkEventPush($word, $pevent); + $e1 = $this->checkEventPop($word, $pevent); + if ($e == PARSER_EVENT_QUOTE) return; + if ($e1) + { + $this->p_flags['textcolor'] = false; + if (($a = $this->p_vars['savecolor']) != $this->p_vars['pdf']->getColor()) + { + $this->p_vars['pdf']->setColor($a['r'],$a['g'],$a['b']); + } + } + if ($this->p_vars['last_word'] == '<text') + { + // set up flags + $this->p_flags['paramval'] = false; + $this->p_flags['textcolor'] = false; + $this->p_vars['curparam'] = false; + $this->p_vars['savecolor'] = $this->p_vars['pdf']->getColor(); + $this->p_vars['options'] = array(); + unset($this->p_vars['quote_data']); + } + if (!$this->p_flags['paramval']) + { + if ($e || $e1) return; + if ($word == '=') + { +// debug('set paramval '.$this->p_vars['curparam']); + $this->p_flags['paramval'] = true; + return; + } + $this->p_vars['curparam'] = trim($word); + } else + { + if ($this->p_vars['last_pevent'] == PARSER_EVENT_QUOTE) + { + if ($this->p_vars['curparam'] == 'size') + { + $this->p_vars['text_size'] = (int)$this->p_vars['quote_data']; + $this->p_flags['paramval'] = false; + $this->p_vars['curparam'] = false; + if (!$e && !$e1) + { + $this->p_vars['curparam'] = trim($word); + } + unset($this->p_vars['quote_data']); + } elseif ($this->p_vars['curparam'] == 'color') + { + if ($a = $this->p_vars['pdf']->validHTMLColor($this->p_vars['quote_data'])) + { + $this->p_flags['textcolor'] = true; + $this->p_vars['pdf']->setHTMLColor($a); + } + } else + { + if ($this->p_vars['quote_data'] === (string)(int)$this->p_vars['quote_data']) $this->p_vars['quote_data'] = (int)$this->p_vars['quote_data']; +// debug('added '.$this->p_vars['curparam'].' = '.$this->p_vars['quote_data']); + $this->p_vars['options'][$this->p_vars['curparam']] = $this->p_vars['quote_data']; + $this->p_flags['paramval'] = false; + $this->p_vars['curparam'] = false; + if (!$e && !$e1) + { + $this->p_vars['curparam'] = trim($word); + } + unset($this->p_vars['quote_data']); + } + } + } + } + + /** + * handles <font></font> + * @tutorial ParserPDF.cls#tags.font + */ + function handleFont($word, $pevent) + { + $e = $this->checkEventPush($word, $pevent); + $e1 = $this->checkEventPop($word, $pevent); + if ($e == PARSER_EVENT_QUOTE) return; + if ($this->p_vars['last_word'] == '<font') + { + // set up flags + $this->p_flags['paramval'] = false; + $this->p_vars['curparam'] = false; + unset($this->p_vars['quote_data']); + } + if (!$this->p_flags['paramval']) + { + if ($e || $e1) return; + if ($word == '=') + { + //debug('set paramval '.$this->p_vars['curparam']); + $this->p_flags['paramval'] = true; + return; + } + $this->p_vars['curparam'] = trim($word); + } else + { + if ($this->p_vars['last_pevent'] == PARSER_EVENT_QUOTE) + { + if ($this->p_vars['curparam'] == 'face') + { + //debug('set face to '.$this->p_vars['font_dir'] . $this->p_vars['quote_data'] . '.afm'); + $this->p_vars['pdf']->selectFont($this->p_vars['font_dir'] . $this->p_vars['quote_data'] . '.afm'); + $this->p_flags['paramval'] = false; + $this->p_vars['curparam'] = false; + unset($this->p_vars['quote_data']); + } + } + } + } + + /** + * handles <pdffunction> + * @tutorial ParserPDF.cls#tags.pdffunction + */ + function handlePDFFunction($word, $pevent) + { + $e = $this->checkEventPush($word, $pevent); + $e1 = $this->checkEventPop($word, $pevent); + if ($e == PARSER_EVENT_QUOTE) return; + if ($this->p_vars['last_word'] == '<pdffunction:') + { + // set up flags + $this->p_flags['paramval'] = $this->p_flags['curparam'] = false; + $this->p_flags['returnval'] = false; + $this->p_vars['funcname'] = trim($word); +// debug("funcname is $word"); + $this->p_vars['options'] = array(); + unset($this->p_vars['quote_data']); + if ($e1) addErrorDie(PDERROR_PDFFUNCTION_NO_FUNC); + } + if (!$this->p_flags['paramval']) + { + if ($e1) + { // call function, no parameters + $func = $this->p_vars['funcname']; + if (!$func) addErrorDie(PDERROR_PDFFUNCTION_NO_FUNC); + if (method_exists($this->p_vars['pdf'],$func)) + { + if (count($this->p_vars['options'])) + { +// fancy_debug("calling function $func",$this->p_vars['options']); + $a = call_user_func_array(array(&$this->p_vars['pdf'],$func), $this->p_vars['options']); + } else + { +// debug("calling function $func"); + $a = $this->p_vars['pdf']->$func(); + } + if ($this->p_flags['returnval']) + { +// debug("setting returnvar ".$this->p_vars['return_varname']); + $this->tempvars[$this->p_vars['return_varname']] = $a; + } + } else + { + addWarning(PDERROR_PDF_METHOD_DOESNT_EXIST,$func); + } + return; + } + if ($e) return; + if ($word == '=') + { +// debug('set paramval '.$this->p_vars['curparam']); + $this->p_flags['paramval'] = true; + return; + } + $this->p_vars['curparam'] = trim($word); + } else + { + if ($this->p_vars['last_word'] == '=') + { // check to see if we should use a tempvar from a previous return + if (substr(trim($word),0,1) == '$') + { + if (substr(trim($word),0,7) == '$this->') + { // this is a pdf var + $a = substr(trim($word),7); + $a = $this->p_vars['pdf']->$a; + // debug("set option to $word"); + $this->p_vars['options'][] = $a; + $this->p_flags['paramval'] = false; + unset($this->p_vars['quote_data']); + } else + { // this is a tempvar + if (!isset($this->tempvars[substr(trim($word),1)])) + { + addErrorDie(PDERROR_PDF_TEMPVAR_DOESNT_EXIST,$this->p_vars['funcname'],trim($word),trim($word)); + } + $a = $this->tempvars[substr(trim($word),1)]; + // debug("set option to $word"); + $this->p_vars['options'][] = $a; + $this->p_flags['paramval'] = false; + unset($this->p_vars['quote_data']); + } + } + } else + { + if ($this->p_vars['last_pevent'] == PARSER_EVENT_QUOTE) + { + if ($this->p_vars['quote_data'] === (string)(int)$this->p_vars['quote_data']) + { + $this->p_vars['quote_data'] = (int)$this->p_vars['quote_data']; + } + if ($this->p_vars['curparam'] == 'return') + { +// debug("param is return"); + $this->p_vars['return_varname'] = $this->p_vars['quote_data']; + $this->p_flags['returnval'] = true; + } else + { +// fancy_debug("set option to arg",$this->p_vars['quote_data']); + $this->p_vars['options'][] = $this->p_vars['quote_data']; + } + $this->p_flags['paramval'] = false; + unset($this->p_vars['quote_data']); + } + } + if ($e1) + { // call function, with parameters + $func = $this->p_vars['funcname']; + if (method_exists($this->p_vars['pdf'],$func)) + { + if (count($this->p_vars['options'])) + { +// fancy_debug("calling function $func",$this->p_vars['options']); + if ($func == 'ezImage') { + // set padding to 5, width to 0, resize to none + $this->p_vars['options'][] = 5; + $this->p_vars['options'][] = 0; + $this->p_vars['options'][] = 'none'; + } + $a = call_user_func_array(array(&$this->p_vars['pdf'],$func), $this->p_vars['options']); + } else + { +// debug("calling function $func"); + $a = $this->p_vars['pdf']->$func(); + } + if ($this->p_flags['returnval']) + { +// debug("setting returnvar ".$this->p_vars['return_varname']); + $this->tempvars[$this->p_vars['return_varname']] = $a; + } + } else + { + addWarning(PDERROR_PDF_METHOD_DOESNT_EXIST,$func); + } + } + } + } + + /** + * Adds content to the <text> tag + */ + function handleContent($word, $pevent) + { + if ($e = $this->checkEventPush($word, $pevent)) + { + if ($e == PHPDOCUMENTOR_PDF_EVENT_FONT) + { // flush content + if (!isset($this->p_vars['content'])) return; + $this->p_vars['pdf']->_ezText($this->p_vars['content'],$this->p_vars['text_size'],$this->p_vars['options']); + unset($this->p_vars['content']); + } + return; + } + if ($this->checkEventPop($word, $pevent)) + { + $this->wp->backupPos($word); + if (!isset($this->p_vars['content'])) return; + $this->p_vars['pdf']->_ezText($this->p_vars['content'],$this->p_vars['text_size'],$this->p_vars['options']); + unset($this->p_vars['content']); + } else + { + if (!isset($this->p_vars['content'])) $this->p_vars['content'] = ''; + if (isset($this->p_vars['quote_data'])) + { + $this->p_vars['content'] .= $this->p_vars['quote_data']; + unset($this->p_vars['quote_data']); + } + $this->p_vars['content'] .= $word; + } + } + /**#@-*/ + /** + * setup the parser tokens, and the pushEvent/popEvent arrays + * @see $tokens, $pushEvent, $popEvent + */ + + function setupStates() + { + $this->tokens[STATE_NOEVENTS] = array("<text","<font","<newpage />","<newpage/>",'<pdffunction:','"'); + $this->tokens[PHPDOCUMENTOR_PDF_STATE_TEXT] = array(">","=",'"',"</text>"); + $this->tokens[PHPDOCUMENTOR_PDF_STATE_FONT] = array("/>","=",'"'); + $this->tokens[PHPDOCUMENTOR_PDF_STATE_CONTENT] = array("<font",'<pdffunction:',"</text>"); + $this->tokens[PHPDOCUMENTOR_PDF_STATE_PDFFUNCTION] = array('"',"/>","="," "); + $this->tokens[STATE_QUOTE] = array("\\\"","\\\\","\""); + $this->tokens[STATE_ESCAPE] = false;// this tells the word parser to just cycle + + // For each event word to event mapings + $this->pushEvent[PARSER_EVENT_QUOTE] = + array( + "\\" => PARSER_EVENT_ESCAPE + ); + $this->popEvent[PARSER_EVENT_QUOTE] = array("\""); +########################## + $this->pushEvent[PARSER_EVENT_NOEVENTS] = + array( + "<text" => PHPDOCUMENTOR_PDF_EVENT_TEXT, + "<font" => PHPDOCUMENTOR_PDF_EVENT_FONT, + "<newpage />" => PHPDOCUMENTOR_PDF_EVENT_NEWPAGE, + "<newpage/>" => PHPDOCUMENTOR_PDF_EVENT_NEWPAGE, + "<pdffunction:" => PHPDOCUMENTOR_PDF_EVENT_PDFFUNCTION, + '"' => PARSER_EVENT_QUOTE, + ); +########################## + $this->pushEvent[PHPDOCUMENTOR_PDF_EVENT_TEXT] = + array( + '"' => PARSER_EVENT_QUOTE, + '>' => PHPDOCUMENTOR_PDF_EVENT_CONTENT, + ); + + $this->popEvent[PHPDOCUMENTOR_PDF_EVENT_TEXT] = array("</text>"); +########################## + $this->pushEvent[PHPDOCUMENTOR_PDF_EVENT_FONT] = + array( + '"' => PARSER_EVENT_QUOTE, + ); + + $this->popEvent[PHPDOCUMENTOR_PDF_EVENT_FONT] = array("/>"); +########################## + $this->pushEvent[PHPDOCUMENTOR_PDF_EVENT_PDFFUNCTION] = + array( + '"' => PARSER_EVENT_QUOTE, + ); + + $this->popEvent[PHPDOCUMENTOR_PDF_EVENT_PDFFUNCTION] = array("/>"); +########################## + $this->pushEvent[PHPDOCUMENTOR_PDF_EVENT_CONTENT] = + array( + "<font" => PHPDOCUMENTOR_PDF_EVENT_FONT, + "<newpage />" => PHPDOCUMENTOR_PDF_EVENT_NEWPAGE, + "<newpage/>" => PHPDOCUMENTOR_PDF_EVENT_NEWPAGE, + "<pdffunction:" => PHPDOCUMENTOR_PDF_EVENT_PDFFUNCTION, + ); + + $this->popEvent[PHPDOCUMENTOR_PDF_EVENT_CONTENT] = array("</text>"); + } + + /** + * Return the name of the parser event + * @param integer + */ + function getParserEventName ($value) + { + $lookup = array( + PARSER_EVENT_NOEVENTS => "PARSER_EVENT_NOEVENTS", + PARSER_EVENT_QUOTE => "PARSER_EVENT_QUOTE", + PHPDOCUMENTOR_PDF_EVENT_TEXT => "PHPDOCUMENTOR_PDF_EVENT_TEXT", + PHPDOCUMENTOR_PDF_EVENT_CONTENT => "PHPDOCUMENTOR_PDF_EVENT_CONTENT", + PHPDOCUMENTOR_PDF_EVENT_FONT => "PHPDOCUMENTOR_PDF_EVENT_FONT", + PHPDOCUMENTOR_PDF_EVENT_PDFFUNCTION => "PHPDOCUMENTOR_PDF_EVENT_PDFFUNCTION", + ); + if (isset($lookup[$value])) + return $lookup[$value]; + else return $value; + } +} +?>
\ No newline at end of file |