From b59ab2490b1bb82dc1d0b58d89584182b405d0a0 Mon Sep 17 00:00:00 2001 From: xue <> Date: Mon, 19 Jun 2006 02:31:27 +0000 Subject: build script update. Fixed #82 and #165. --- buildscripts/Benchmark/Iterate.php | 167 + buildscripts/Benchmark/LICENSE | 22 + buildscripts/Benchmark/Profiler.php | 447 ++ buildscripts/Benchmark/Timer.php | 319 ++ buildscripts/Benchmark/doc/timer_example.php | 18 + .../PHPUnit2/Extensions/ExceptionTestCase.php | 122 + .../PHPUnit2/Extensions/PerformanceTestCase.php | 128 + buildscripts/PHPUnit2/Extensions/RepeatedTest.php | 138 + buildscripts/PHPUnit2/Extensions/TestDecorator.php | 174 + buildscripts/PHPUnit2/Extensions/TestSetup.php | 154 + buildscripts/PHPUnit2/Framework/Assert.php | 626 +++ .../PHPUnit2/Framework/AssertionFailedError.php | 80 + .../PHPUnit2/Framework/ComparisonFailure.php | 153 + buildscripts/PHPUnit2/Framework/Error.php | 88 + buildscripts/PHPUnit2/Framework/IncompleteTest.php | 72 + .../PHPUnit2/Framework/IncompleteTestError.php | 75 + buildscripts/PHPUnit2/Framework/Test.php | 87 + buildscripts/PHPUnit2/Framework/TestCase.php | 292 ++ buildscripts/PHPUnit2/Framework/TestFailure.php | 154 + buildscripts/PHPUnit2/Framework/TestListener.php | 135 + buildscripts/PHPUnit2/Framework/TestResult.php | 447 ++ buildscripts/PHPUnit2/Framework/TestSuite.php | 554 ++ buildscripts/PHPUnit2/Framework/Warning.php | 94 + buildscripts/PHPUnit2/Runner/BaseTestRunner.php | 283 + .../PHPUnit2/Runner/IncludePathTestCollector.php | 184 + .../PHPUnit2/Runner/StandardTestSuiteLoader.php | 129 + buildscripts/PHPUnit2/Runner/TestCollector.php | 77 + buildscripts/PHPUnit2/Runner/TestSuiteLoader.php | 85 + buildscripts/PHPUnit2/Runner/Version.php | 90 + buildscripts/PHPUnit2/TextUI/ResultPrinter.php | 356 ++ buildscripts/PHPUnit2/TextUI/TestRunner.php | 622 +++ .../PHPUnit2/Util/CodeCoverage/Renderer.php | 225 + .../PHPUnit2/Util/CodeCoverage/Renderer/HTML.php | 191 + .../PHPUnit2/Util/CodeCoverage/Renderer/Text.php | 125 + buildscripts/PHPUnit2/Util/ErrorHandler.php | 77 + buildscripts/PHPUnit2/Util/Fileloader.php | 109 + buildscripts/PHPUnit2/Util/Filter.php | 263 + buildscripts/PHPUnit2/Util/Log/PEAR.php | 220 + buildscripts/PHPUnit2/Util/Log/XML.php | 356 ++ buildscripts/PHPUnit2/Util/Printer.php | 116 + buildscripts/PHPUnit2/Util/Skeleton.php | 340 ++ .../PHPUnit2/Util/TestDox/NamePrettifier.php | 165 + .../PHPUnit2/Util/TestDox/ResultPrinter.php | 299 ++ .../PHPUnit2/Util/TestDox/ResultPrinter/HTML.php | 120 + .../PHPUnit2/Util/TestDox/ResultPrinter/Text.php | 102 + buildscripts/PHPUnit2/pear-phpunit | 41 + buildscripts/PHPUnit2/pear-phpunit.bat | 39 + buildscripts/PhpDocumentor/PHPLICENSE.txt | 69 + buildscripts/PhpDocumentor/new_phpdoc.php | 662 +++ buildscripts/PhpDocumentor/pear-phpdoc | 38 + buildscripts/PhpDocumentor/pear-phpdoc.bat | 145 + buildscripts/PhpDocumentor/phpDocumentor.ini | 118 + .../PhpDocumentor/phpDocumentor/Classes.inc | 1068 ++++ .../PhpDocumentor/phpDocumentor/Converter.inc | 5189 +++++++++++++++++++ .../Converters/CHM/default/CHMdefaultConverter.inc | 1753 +++++++ .../CHM/default/templates/default/options.ini | 507 ++ .../templates/default/templates/basicindex.tpl | 21 + .../default/templates/default/templates/blank.tpl | 13 + .../default/templates/default/templates/class.tpl | 94 + .../templates/default/templates/classleft.tpl | 8 + .../templates/default/templates/classtrees.tpl | 12 + .../default/templates/default/templates/const.tpl | 29 + .../templates/default/templates/contents.hhc.tpl | 11 + .../default/templates/default/templates/define.tpl | 33 + .../templates/default/templates/docblock.tpl | 31 + .../templates/default/templates/elementindex.tpl | 9 + .../default/templates/default/templates/errors.tpl | 21 + .../templates/default/templates/fileleft.tpl | 8 + .../templates/default/templates/filesource.tpl | 6 + .../default/templates/default/templates/footer.tpl | 8 + .../templates/default/templates/function.tpl | 44 + .../default/templates/default/templates/global.tpl | 32 + .../default/templates/default/templates/header.tpl | 22 + .../default/templates/default/templates/hhp.tpl | 17 + .../templates/default/templates/include.tpl | 26 + .../templates/default/templates/index.hhk.tpl | 8 + .../default/templates/default/templates/index.tpl | 24 + .../templates/default/templates/media/bg_left.png | Bin 0 -> 991 bytes .../default/templates/media/stylesheet.css | 129 + .../default/templates/default/templates/method.tpl | 55 + .../templates/default/templates/packages.tpl | 3 + .../default/templates/default/templates/page.tpl | 34 + .../default/templates/pkgelementindex.tpl | 14 + .../default/templates/default/templates/ric.tpl | 6 + .../templates/default/templates/tocentry.tpl | 11 + .../templates/default/templates/todolist.tpl | 14 + .../templates/default/templates/tutorial.tpl | 32 + .../templates/default/templates/tutorial_toc.tpl | 29 + .../templates/default/templates/tutorial_tree.tpl | 5 + .../default/templates/default/templates/var.tpl | 30 + .../Converters/HTML/Smarty/HTMLSmartyConverter.inc | 1779 +++++++ .../HTML/Smarty/templates/PradoSoft/options.ini | 577 +++ .../templates/PradoSoft/templates/__tags.tpl | 13 + .../PradoSoft/templates/_class_declaration.tpl | 38 + .../PradoSoft/templates/_class_description.tpl | 7 + .../templates/PradoSoft/templates/_class_list.tpl | 1 + .../PradoSoft/templates/_constant_details.tpl | 33 + .../PradoSoft/templates/_constant_summary.tpl | 22 + .../PradoSoft/templates/_constructor_details.tpl | 55 + .../PradoSoft/templates/_constructor_summary.tpl | 25 + .../PradoSoft/templates/_destructor_details.tpl | 55 + .../PradoSoft/templates/_destructor_summary.tpl | 27 + .../templates/PradoSoft/templates/_footer.tpl | 1 + .../PradoSoft/templates/_get_constant_type.tpl | 10 + .../templates/PradoSoft/templates/_header.tpl | 4 + .../PradoSoft/templates/_inherited_constants.tpl | 34 + .../PradoSoft/templates/_inherited_methods.tpl | 42 + .../PradoSoft/templates/_inheritence_tree.tpl | 3 + .../PradoSoft/templates/_method_details.tpl | 101 + .../PradoSoft/templates/_method_summary.tpl | 61 + .../templates/PradoSoft/templates/_sub_classes.tpl | 19 + .../Smarty/templates/PradoSoft/templates/_tags.tpl | 13 + .../templates/PradoSoft/templates/basicindex.tpl | 18 + .../Smarty/templates/PradoSoft/templates/blank.tpl | 5 + .../Smarty/templates/PradoSoft/templates/class.tpl | 29 + .../templates/PradoSoft/templates/classleft.tpl | 9 + .../templates/PradoSoft/templates/classtrees.tpl | 8 + .../Smarty/templates/PradoSoft/templates/const.tpl | 14 + .../templates/PradoSoft/templates/define.tpl | 32 + .../templates/PradoSoft/templates/docblock.tpl | 15 + .../templates/PradoSoft/templates/elementindex.tpl | 5 + .../templates/PradoSoft/templates/errors.tpl | 21 + .../PradoSoft/templates/examplesource.tpl | 6 + .../templates/PradoSoft/templates/fileleft.tpl | 10 + .../templates/PradoSoft/templates/filesource.tpl | 8 + .../templates/PradoSoft/templates/footer.tpl | 25 + .../templates/PradoSoft/templates/function.tpl | 48 + .../templates/PradoSoft/templates/global.tpl | 40 + .../templates/PradoSoft/templates/header.tpl | 121 + .../templates/PradoSoft/templates/include.tpl | 9 + .../Smarty/templates/PradoSoft/templates/index.tpl | 7 + .../PradoSoft/templates/media/background.png | Bin 0 -> 238 bytes .../templates/PradoSoft/templates/media/empty.png | Bin 0 -> 206 bytes .../templates/PradoSoft/templates/media/style.css | 197 + .../templates/PradoSoft/templates/method.tpl | 58 + .../templates/PradoSoft/templates/packages.tpl | 3 + .../Smarty/templates/PradoSoft/templates/page.tpl | 31 + .../PradoSoft/templates/pkgelementindex.tpl | 5 + .../Smarty/templates/PradoSoft/templates/ric.tpl | 6 + .../templates/PradoSoft/templates/todolist.tpl | 14 + .../templates/PradoSoft/templates/tutorial.tpl | 32 + .../templates/PradoSoft/templates/tutorial_toc.tpl | 29 + .../PradoSoft/templates/tutorial_tree.tpl | 5 + .../Smarty/templates/PradoSoft/templates/var.tpl | 28 + .../Converters/HTML/frames/HTMLframesConverter.inc | 1747 +++++++ .../HTML/frames/templates/default/options.ini | 577 +++ .../templates/default/templates/basicindex.tpl | 47 + .../frames/templates/default/templates/blank.tpl | 13 + .../frames/templates/default/templates/class.tpl | 402 ++ .../templates/default/templates/classtrees.tpl | 11 + .../frames/templates/default/templates/const.tpl | 18 + .../frames/templates/default/templates/define.tpl | 24 + .../templates/default/templates/docblock.tpl | 14 + .../templates/default/templates/elementindex.tpl | 12 + .../frames/templates/default/templates/errors.tpl | 21 + .../templates/default/templates/examplesource.tpl | 6 + .../templates/default/templates/filesource.tpl | 8 + .../frames/templates/default/templates/footer.tpl | 8 + .../templates/default/templates/function.tpl | 44 + .../frames/templates/default/templates/global.tpl | 26 + .../frames/templates/default/templates/header.tpl | 12 + .../frames/templates/default/templates/include.tpl | 16 + .../frames/templates/default/templates/index.tpl | 24 + .../templates/default/templates/left_frame.tpl | 149 + .../templates/default/templates/media/banner.css | 32 + .../default/templates/media/stylesheet.css | 144 + .../frames/templates/default/templates/method.tpl | 61 + .../frames/templates/default/templates/page.tpl | 211 + .../default/templates/pkgelementindex.tpl | 17 + .../frames/templates/default/templates/ric.tpl | 6 + .../templates/default/templates/todolist.tpl | 14 + .../templates/default/templates/top_frame.tpl | 43 + .../templates/default/templates/tutorial.tpl | 13 + .../templates/default/templates/tutorial_nav.tpl | 41 + .../templates/default/templates/tutorial_toc.tpl | 39 + .../templates/default/templates/tutorial_tree.tpl | 6 + .../frames/templates/default/templates/var.tpl | 44 + .../PhpDocumentor/phpDocumentor/DescHTML.inc | 241 + .../PhpDocumentor/phpDocumentor/DocBlock/Lexer.inc | 701 +++ .../PhpDocumentor/phpDocumentor/DocBlockTags.inc | 984 ++++ .../PhpDocumentor/phpDocumentor/Errors.inc | 793 +++ .../PhpDocumentor/phpDocumentor/EventStack.inc | 78 + .../phpDocumentor/HighlightParser.inc | 2354 +++++++++ .../PhpDocumentor/phpDocumentor/InlineTags.inc | 854 +++ .../phpDocumentor/IntermediateParser.inc | 1832 +++++++ buildscripts/PhpDocumentor/phpDocumentor/Io.inc | 868 ++++ .../PhpDocumentor/phpDocumentor/LinkClasses.inc | 206 + .../phpDocumentor/PackagePageElements.inc | 387 ++ .../PhpDocumentor/phpDocumentor/Parser.inc | 3185 ++++++++++++ .../PhpDocumentor/phpDocumentor/ParserData.inc | 725 +++ .../phpDocumentor/ParserDescCleanup.inc | 1456 ++++++ .../PhpDocumentor/phpDocumentor/ParserDocBlock.inc | 1165 +++++ .../PhpDocumentor/phpDocumentor/ParserElements.inc | 1910 +++++++ .../phpDocumentor/ProceduralPages.inc | 782 +++ .../PhpDocumentor/phpDocumentor/Publisher.inc | 84 + .../PhpDocumentor/phpDocumentor/Setup.inc.php | 785 +++ .../PhpDocumentor/phpDocumentor/Smarty-2.6.0/BUGS | 7 + .../phpDocumentor/Smarty-2.6.0/COPYING.lib | 458 ++ .../phpDocumentor/Smarty-2.6.0/ChangeLog | 5421 ++++++++++++++++++++ .../PhpDocumentor/phpDocumentor/Smarty-2.6.0/FAQ | 284 + .../phpDocumentor/Smarty-2.6.0/INSTALL | 29 + .../PhpDocumentor/phpDocumentor/Smarty-2.6.0/NEWS | 733 +++ .../phpDocumentor/Smarty-2.6.0/README | 80 + .../phpDocumentor/Smarty-2.6.0/RELEASE_NOTES | 423 ++ .../PhpDocumentor/phpDocumentor/Smarty-2.6.0/TODO | 12 + .../Smarty-2.6.0/libs/Config_File.class.php | 365 ++ .../Smarty-2.6.0/libs/Smarty.class.php | 2010 ++++++++ .../Smarty-2.6.0/libs/Smarty_Compiler.class.php | 2123 ++++++++ .../libs/core/core.assemble_plugin_filepath.php | 62 + .../libs/core/core.assign_smarty_interface.php | 43 + .../libs/core/core.create_dir_structure.php | 79 + .../libs/core/core.display_debug_console.php | 60 + .../libs/core/core.get_include_path.php | 44 + .../Smarty-2.6.0/libs/core/core.get_microtime.php | 23 + .../libs/core/core.get_php_resource.php | 80 + .../Smarty-2.6.0/libs/core/core.is_secure.php | 59 + .../Smarty-2.6.0/libs/core/core.is_trusted.php | 50 + .../Smarty-2.6.0/libs/core/core.load_plugins.php | 125 + .../libs/core/core.load_resource_plugin.php | 74 + .../libs/core/core.process_cached_inserts.php | 71 + .../libs/core/core.process_compiled_include.php | 32 + .../libs/core/core.read_cache_file.php | 111 + .../Smarty-2.6.0/libs/core/core.rm_auto.php | 71 + .../Smarty-2.6.0/libs/core/core.rmdir.php | 55 + .../libs/core/core.run_insert_handler.php | 71 + .../libs/core/core.smarty_include_php.php | 50 + .../libs/core/core.write_cache_file.php | 73 + .../libs/core/core.write_compiled_include.php | 59 + .../libs/core/core.write_compiled_resource.php | 37 + .../Smarty-2.6.0/libs/core/core.write_file.php | 48 + .../phpDocumentor/Smarty-2.6.0/libs/debug.tpl | 64 + .../Smarty-2.6.0/libs/plugins/block.strip.php | 35 + .../Smarty-2.6.0/libs/plugins/block.textformat.php | 83 + .../Smarty-2.6.0/libs/plugins/function.assign.php | 38 + .../libs/plugins/function.assign_debug_info.php | 39 + .../libs/plugins/function.config_load.php | 130 + .../Smarty-2.6.0/libs/plugins/function.counter.php | 88 + .../Smarty-2.6.0/libs/plugins/function.cycle.php | 119 + .../Smarty-2.6.0/libs/plugins/function.debug.php | 35 + .../Smarty-2.6.0/libs/plugins/function.eval.php | 48 + .../Smarty-2.6.0/libs/plugins/function.fetch.php | 217 + .../libs/plugins/function.html_checkboxes.php | 135 + .../libs/plugins/function.html_image.php | 143 + .../libs/plugins/function.html_options.php | 118 + .../libs/plugins/function.html_radios.php | 138 + .../libs/plugins/function.html_select_date.php | 243 + .../libs/plugins/function.html_select_time.php | 163 + .../libs/plugins/function.html_table.php | 113 + .../Smarty-2.6.0/libs/plugins/function.mailto.php | 140 + .../Smarty-2.6.0/libs/plugins/function.math.php | 82 + .../Smarty-2.6.0/libs/plugins/function.popup.php | 87 + .../libs/plugins/function.popup_init.php | 39 + .../libs/plugins/function.var_dump.php | 20 + .../libs/plugins/modifier.capitalize.php | 25 + .../Smarty-2.6.0/libs/plugins/modifier.cat.php | 33 + .../libs/plugins/modifier.count_characters.php | 31 + .../libs/plugins/modifier.count_paragraphs.php | 28 + .../libs/plugins/modifier.count_sentences.php | 28 + .../libs/plugins/modifier.count_words.php | 32 + .../libs/plugins/modifier.date_format.php | 43 + .../libs/plugins/modifier.debug_print_var.php | 57 + .../Smarty-2.6.0/libs/plugins/modifier.default.php | 31 + .../Smarty-2.6.0/libs/plugins/modifier.escape.php | 63 + .../libs/plugins/modifier.htmlentities.php | 18 + .../Smarty-2.6.0/libs/plugins/modifier.indent.php | 27 + .../Smarty-2.6.0/libs/plugins/modifier.lower.php | 25 + .../Smarty-2.6.0/libs/plugins/modifier.nl2br.php | 35 + .../libs/plugins/modifier.rawurlencode.php | 18 + .../libs/plugins/modifier.regex_replace.php | 29 + .../Smarty-2.6.0/libs/plugins/modifier.replace.php | 29 + .../Smarty-2.6.0/libs/plugins/modifier.spacify.php | 29 + .../libs/plugins/modifier.string_format.php | 28 + .../Smarty-2.6.0/libs/plugins/modifier.strip.php | 33 + .../libs/plugins/modifier.strip_tags.php | 31 + .../libs/plugins/modifier.truncate.php | 43 + .../Smarty-2.6.0/libs/plugins/modifier.upper.php | 25 + .../libs/plugins/modifier.wordwrap.php | 28 + .../libs/plugins/outputfilter.trimwhitespace.php | 75 + .../libs/plugins/shared.escape_special_chars.php | 30 + .../libs/plugins/shared.make_timestamp.php | 43 + .../Smarty-2.6.0/misc/smarty_icon.README | 6 + .../Smarty-2.6.0/misc/smarty_icon.gif | Bin 0 -> 1102 bytes .../phpDocumentor/TutorialHighlightParser.inc | 491 ++ .../PhpDocumentor/phpDocumentor/WordParser.inc | 325 ++ .../phpDocumentor/XMLpackagePageParser.inc | 554 ++ .../PhpDocumentor/phpDocumentor/clone.inc.php | 13 + .../PhpDocumentor/phpDocumentor/clone5.inc.php | 14 + .../PhpDocumentor/phpDocumentor/common.inc.php | 244 + .../PhpDocumentor/phpDocumentor/find_phpdoc.php | 32 + .../phpDocumentor/phpDocumentorTParser.inc | 2615 ++++++++++ .../phpDocumentor/phpDocumentorTWordParser.inc | 311 ++ .../PhpDocumentor/phpDocumentor/phpdoc.inc | 45 + buildscripts/PhpDocumentor/phpdoc | 52 + buildscripts/PhpDocumentor/phpdoc.php | 469 ++ buildscripts/PhpDocumentor/poweredbyphpdoc.gif | Bin 0 -> 1363 bytes buildscripts/PhpDocumentor/scripts/add_cvs.php | 153 + .../PhpDocumentor/scripts/create_examples.php | 66 + .../PhpDocumentor/scripts/create_package.xml.php | 204 + buildscripts/PhpDocumentor/scripts/makedoc.sh | 94 + .../PhpDocumentor/scripts/tokenizer_test.php | 59 + buildscripts/PhpDocumentor/user/default.ini | 98 + buildscripts/PhpDocumentor/user/demo.ini | 78 + buildscripts/PhpDocumentor/user/error.ini | 82 + buildscripts/PhpDocumentor/user/pear-makedocs.ini | 71 + buildscripts/PhpDocumentor/user/prado.ini | 79 + buildscripts/PhpDocumentor/user/testdocbook.ini | 74 + buildscripts/index/api_index.php | 3 +- buildscripts/index/search.php | 36 + buildscripts/texbuilder/quickstart.tex | 4 +- 309 files changed, 69371 insertions(+), 3 deletions(-) create mode 100644 buildscripts/Benchmark/Iterate.php create mode 100644 buildscripts/Benchmark/LICENSE create mode 100644 buildscripts/Benchmark/Profiler.php create mode 100644 buildscripts/Benchmark/Timer.php create mode 100644 buildscripts/Benchmark/doc/timer_example.php create mode 100644 buildscripts/PHPUnit2/Extensions/ExceptionTestCase.php create mode 100644 buildscripts/PHPUnit2/Extensions/PerformanceTestCase.php create mode 100644 buildscripts/PHPUnit2/Extensions/RepeatedTest.php create mode 100644 buildscripts/PHPUnit2/Extensions/TestDecorator.php create mode 100644 buildscripts/PHPUnit2/Extensions/TestSetup.php create mode 100644 buildscripts/PHPUnit2/Framework/Assert.php create mode 100644 buildscripts/PHPUnit2/Framework/AssertionFailedError.php create mode 100644 buildscripts/PHPUnit2/Framework/ComparisonFailure.php create mode 100644 buildscripts/PHPUnit2/Framework/Error.php create mode 100644 buildscripts/PHPUnit2/Framework/IncompleteTest.php create mode 100644 buildscripts/PHPUnit2/Framework/IncompleteTestError.php create mode 100644 buildscripts/PHPUnit2/Framework/Test.php create mode 100644 buildscripts/PHPUnit2/Framework/TestCase.php create mode 100644 buildscripts/PHPUnit2/Framework/TestFailure.php create mode 100644 buildscripts/PHPUnit2/Framework/TestListener.php create mode 100644 buildscripts/PHPUnit2/Framework/TestResult.php create mode 100644 buildscripts/PHPUnit2/Framework/TestSuite.php create mode 100644 buildscripts/PHPUnit2/Framework/Warning.php create mode 100644 buildscripts/PHPUnit2/Runner/BaseTestRunner.php create mode 100644 buildscripts/PHPUnit2/Runner/IncludePathTestCollector.php create mode 100644 buildscripts/PHPUnit2/Runner/StandardTestSuiteLoader.php create mode 100644 buildscripts/PHPUnit2/Runner/TestCollector.php create mode 100644 buildscripts/PHPUnit2/Runner/TestSuiteLoader.php create mode 100644 buildscripts/PHPUnit2/Runner/Version.php create mode 100644 buildscripts/PHPUnit2/TextUI/ResultPrinter.php create mode 100644 buildscripts/PHPUnit2/TextUI/TestRunner.php create mode 100644 buildscripts/PHPUnit2/Util/CodeCoverage/Renderer.php create mode 100644 buildscripts/PHPUnit2/Util/CodeCoverage/Renderer/HTML.php create mode 100644 buildscripts/PHPUnit2/Util/CodeCoverage/Renderer/Text.php create mode 100644 buildscripts/PHPUnit2/Util/ErrorHandler.php create mode 100644 buildscripts/PHPUnit2/Util/Fileloader.php create mode 100644 buildscripts/PHPUnit2/Util/Filter.php create mode 100644 buildscripts/PHPUnit2/Util/Log/PEAR.php create mode 100644 buildscripts/PHPUnit2/Util/Log/XML.php create mode 100644 buildscripts/PHPUnit2/Util/Printer.php create mode 100644 buildscripts/PHPUnit2/Util/Skeleton.php create mode 100644 buildscripts/PHPUnit2/Util/TestDox/NamePrettifier.php create mode 100644 buildscripts/PHPUnit2/Util/TestDox/ResultPrinter.php create mode 100644 buildscripts/PHPUnit2/Util/TestDox/ResultPrinter/HTML.php create mode 100644 buildscripts/PHPUnit2/Util/TestDox/ResultPrinter/Text.php create mode 100644 buildscripts/PHPUnit2/pear-phpunit create mode 100644 buildscripts/PHPUnit2/pear-phpunit.bat create mode 100644 buildscripts/PhpDocumentor/PHPLICENSE.txt create mode 100644 buildscripts/PhpDocumentor/new_phpdoc.php create mode 100644 buildscripts/PhpDocumentor/pear-phpdoc create mode 100644 buildscripts/PhpDocumentor/pear-phpdoc.bat create mode 100644 buildscripts/PhpDocumentor/phpDocumentor.ini create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Classes.inc create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converter.inc create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/CHMdefaultConverter.inc create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/options.ini create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/basicindex.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/blank.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/class.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/classleft.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/classtrees.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/const.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/contents.hhc.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/define.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/docblock.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/elementindex.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/errors.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/fileleft.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/filesource.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/footer.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/function.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/global.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/header.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/hhp.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/include.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/index.hhk.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/index.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/media/bg_left.png create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/media/stylesheet.css create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/method.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/packages.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/page.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/pkgelementindex.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/ric.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/tocentry.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/todolist.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/tutorial.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/tutorial_toc.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/tutorial_tree.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/var.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/HTMLSmartyConverter.inc create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/options.ini create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/__tags.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/_class_declaration.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/_class_description.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/_class_list.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/_constant_details.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/_constant_summary.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/_constructor_details.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/_constructor_summary.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/_destructor_details.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/_destructor_summary.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/_footer.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/_get_constant_type.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/_header.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/_inherited_constants.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/_inherited_methods.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/_inheritence_tree.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/_method_details.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/_method_summary.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/_sub_classes.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/_tags.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/basicindex.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/blank.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/class.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/classleft.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/classtrees.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/const.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/define.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/docblock.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/elementindex.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/errors.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/examplesource.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/fileleft.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/filesource.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/footer.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/function.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/global.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/header.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/include.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/index.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/media/background.png create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/media/empty.png create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/media/style.css create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/method.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/packages.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/page.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/pkgelementindex.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/ric.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/todolist.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/tutorial.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/tutorial_toc.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/tutorial_tree.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/var.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/HTMLframesConverter.inc create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/options.ini create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/basicindex.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/blank.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/class.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/classtrees.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/const.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/define.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/docblock.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/elementindex.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/errors.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/examplesource.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/filesource.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/footer.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/function.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/global.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/header.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/include.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/index.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/left_frame.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/media/banner.css create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/media/stylesheet.css create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/method.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/page.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/pkgelementindex.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/ric.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/todolist.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/top_frame.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/tutorial.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/tutorial_nav.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/tutorial_toc.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/tutorial_tree.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/var.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/DescHTML.inc create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/DocBlock/Lexer.inc create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/DocBlockTags.inc create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Errors.inc create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/EventStack.inc create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/HighlightParser.inc create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/InlineTags.inc create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/IntermediateParser.inc create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Io.inc create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/LinkClasses.inc create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/PackagePageElements.inc create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Parser.inc create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/ParserData.inc create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/ParserDescCleanup.inc create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/ParserDocBlock.inc create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/ParserElements.inc create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/ProceduralPages.inc create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Publisher.inc create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Setup.inc.php create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/BUGS create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/COPYING.lib create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/ChangeLog create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/FAQ create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/INSTALL create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/NEWS create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/README create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/RELEASE_NOTES create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/TODO create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/Config_File.class.php create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/Smarty.class.php create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/Smarty_Compiler.class.php create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/core/core.assemble_plugin_filepath.php create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/core/core.assign_smarty_interface.php create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/core/core.create_dir_structure.php create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/core/core.display_debug_console.php create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/core/core.get_include_path.php create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/core/core.get_microtime.php create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/core/core.get_php_resource.php create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/core/core.is_secure.php create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/core/core.is_trusted.php create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/core/core.load_plugins.php create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/core/core.load_resource_plugin.php create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/core/core.process_cached_inserts.php create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/core/core.process_compiled_include.php create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/core/core.read_cache_file.php create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/core/core.rm_auto.php create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/core/core.rmdir.php create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/core/core.run_insert_handler.php create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/core/core.smarty_include_php.php create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/core/core.write_cache_file.php create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/core/core.write_compiled_include.php create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/core/core.write_compiled_resource.php create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/core/core.write_file.php create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/debug.tpl create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/block.strip.php create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/block.textformat.php create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/function.assign.php create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/function.assign_debug_info.php create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/function.config_load.php create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/function.counter.php create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/function.cycle.php create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/function.debug.php create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/function.eval.php create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/function.fetch.php create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/function.html_checkboxes.php create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/function.html_image.php create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/function.html_options.php create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/function.html_radios.php create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/function.html_select_date.php create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/function.html_select_time.php create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/function.html_table.php create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/function.mailto.php create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/function.math.php create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/function.popup.php create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/function.popup_init.php create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/function.var_dump.php create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.capitalize.php create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.cat.php create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.count_characters.php create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.count_paragraphs.php create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.count_sentences.php create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.count_words.php create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.date_format.php create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.debug_print_var.php create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.default.php create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.escape.php create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.htmlentities.php create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.indent.php create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.lower.php create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.nl2br.php create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.rawurlencode.php create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.regex_replace.php create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.replace.php create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.spacify.php create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.string_format.php create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.strip.php create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.strip_tags.php create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.truncate.php create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.upper.php create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.wordwrap.php create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/outputfilter.trimwhitespace.php create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/shared.escape_special_chars.php create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/shared.make_timestamp.php create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/misc/smarty_icon.README create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/misc/smarty_icon.gif create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/TutorialHighlightParser.inc create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/WordParser.inc create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/XMLpackagePageParser.inc create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/clone.inc.php create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/clone5.inc.php create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/common.inc.php create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/find_phpdoc.php create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/phpDocumentorTParser.inc create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/phpDocumentorTWordParser.inc create mode 100644 buildscripts/PhpDocumentor/phpDocumentor/phpdoc.inc create mode 100644 buildscripts/PhpDocumentor/phpdoc create mode 100644 buildscripts/PhpDocumentor/phpdoc.php create mode 100644 buildscripts/PhpDocumentor/poweredbyphpdoc.gif create mode 100644 buildscripts/PhpDocumentor/scripts/add_cvs.php create mode 100644 buildscripts/PhpDocumentor/scripts/create_examples.php create mode 100644 buildscripts/PhpDocumentor/scripts/create_package.xml.php create mode 100644 buildscripts/PhpDocumentor/scripts/makedoc.sh create mode 100644 buildscripts/PhpDocumentor/scripts/tokenizer_test.php create mode 100644 buildscripts/PhpDocumentor/user/default.ini create mode 100644 buildscripts/PhpDocumentor/user/demo.ini create mode 100644 buildscripts/PhpDocumentor/user/error.ini create mode 100644 buildscripts/PhpDocumentor/user/pear-makedocs.ini create mode 100644 buildscripts/PhpDocumentor/user/prado.ini create mode 100644 buildscripts/PhpDocumentor/user/testdocbook.ini create mode 100644 buildscripts/index/search.php (limited to 'buildscripts') diff --git a/buildscripts/Benchmark/Iterate.php b/buildscripts/Benchmark/Iterate.php new file mode 100644 index 00000000..acf1ec08 --- /dev/null +++ b/buildscripts/Benchmark/Iterate.php @@ -0,0 +1,167 @@ +. | +// +------------------------------------------------------------------------+ +// | This source file is subject to the New BSD license, That is bundled | +// | with this package in the file LICENSE, and is available through | +// | the world-wide-web at | +// | http://www.opensource.org/licenses/bsd-license.php | +// | If you did not receive a copy of the new BSDlicense and are unable | +// | to obtain it through the world-wide-web, please send a note to | +// | license@php.net so we can mail you a copy immediately. | +// +------------------------------------------------------------------------+ +// +// $Id: Iterate.php,v 1.12 2006/02/17 16:29:44 toggg Exp $ +// + +require_once 'Benchmark/Timer.php'; + +/** + * Provides timing and profiling information. + * + * Example 1 + * + * + * '; + * } + * + * $benchmark->run(100, 'foo', 'test'); + * $result = $benchmark->get(); + * ?> + * + * + * Example 2 + * + * + * '; + * } + * } + * + * $benchmark->run(100, 'myclass::foo', 'test'); + * $result = $benchmark->get(); + * ?> + * + * + * Example 3 + * + * + * '; + * } + * } + * + * $o = new MyClass(); + * + * $benchmark->run(100, 'o->foo', 'test'); + * $result = $benchmark->get(); + * ?> + * + * + * @author Sebastian Bergmann + * @copyright Copyright © 2002-2005 Sebastian Bergmann + * @license http://www.php.net/license/3_0.txt The PHP License, Version 3.0 + * @category Benchmarking + * @package Benchmark + */ +class Benchmark_Iterate extends Benchmark_Timer { + /** + * Benchmarks a function or method. + * + * @access public + */ + function run() { + $arguments = func_get_args(); + $iterations = array_shift($arguments); + $function_name = array_shift($arguments); + + if (strstr($function_name, '::')) { + $function_name = explode('::', $function_name); + $objectmethod = $function_name[1]; + } + + if (strstr($function_name, '->')) { + $function_name = explode('->', $function_name); + $objectname = $function_name[0]; + + $object = $GLOBALS[$objectname]; + $objectmethod = $function_name[1]; + + for ($i = 1; $i <= $iterations; $i++) { + $this->setMarker('start_' . $i); + call_user_func_array(array($object, $function_name[1]), $arguments); + $this->setMarker('end_' . $i); + } + + return(0); + } + + for ($i = 1; $i <= $iterations; $i++) { + $this->setMarker('start_' . $i); + call_user_func_array($function_name, $arguments); + $this->setMarker('end_' . $i); + } + } + + /** + * Returns benchmark result. + * + * $result[x ] = execution time of iteration x + * $result['mean' ] = mean execution time + * $result['iterations'] = number of iterations + * + * @return array + * @access public + */ + function get($simple_output = false) { + $result = array(); + $total = 0; + + $iterations = count($this->markers)/2; + + for ($i = 1; $i <= $iterations; $i++) { + $time = $this->timeElapsed('start_'.$i , 'end_'.$i); + + if (extension_loaded('bcmath')) { + $total = bcadd($total, $time, 6); + } else { + $total = $total + $time; + } + + if (!$simple_output) { + $result[$i] = $time; + } + } + + if (extension_loaded('bcmath')) { + $result['mean'] = bcdiv($total, $iterations, 6); + } else { + $result['mean'] = $total / $iterations; + } + + $result['iterations'] = $iterations; + + return $result; + } +} diff --git a/buildscripts/Benchmark/LICENSE b/buildscripts/Benchmark/LICENSE new file mode 100644 index 00000000..db25e880 --- /dev/null +++ b/buildscripts/Benchmark/LICENSE @@ -0,0 +1,22 @@ +Redistribution and use in source and binary forms, with or without modification +, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, th + is list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation and/ + or other materials provided with the distribution. + +3. The name of the author may not be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WA +RRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABIL +ITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR C +ONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOW +EVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILI +TY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE U +SE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/buildscripts/Benchmark/Profiler.php b/buildscripts/Benchmark/Profiler.php new file mode 100644 index 00000000..e9108a84 --- /dev/null +++ b/buildscripts/Benchmark/Profiler.php @@ -0,0 +1,447 @@ +. | +// +----------------------------------------------------------------------+ +// | This source file is subject to the New BSD license, That is bundled | +// | with this package in the file LICENSE, and is available through | +// | the world-wide-web at | +// | http://www.opensource.org/licenses/bsd-license.php | +// | If you did not receive a copy of the new BSDlicense and are unable | +// | to obtain it through the world-wide-web, please send a note to | +// | license@php.net so we can mail you a copy immediately. | +// +----------------------------------------------------------------------+ +// +// $Id: Profiler.php,v 1.19 2006/03/01 19:26:09 anant Exp $ +// + +require_once 'PEAR.php'; + +/** + * Provides timing and profiling information. + * + * Example 1: Automatic profiling start, stop, and output. + * + * + * enterSection('myFunction'); + * //do something + * $profiler->leaveSection('myFunction'); + * return; + * } + * + * //do something + * myFunction(); + * //do more + * ?> + * + * + * Example 2: Manual profiling start, stop, and output. + * + * + * enterSection('myFunction'); + * //do something + * $profiler->leaveSection('myFunction'); + * return; + * } + * + * $profiler->start(); + * //do something + * myFunction(); + * //do more + * $profiler->stop(); + * $profiler->display(); + * ?> + * + * + * @author Matthias Englert + * @copyright Copyright © 2002-2005 Matthias Englert + * @license http://www.php.net/license/3_0.txt The PHP License, Version 3.0 + * @category Benchmarking + * @package Benchmark + * @since 1.2.0 + */ +class Benchmark_Profiler extends PEAR { + /** + * Contains the total ex. time of each section + * + * @var array + * @access private + */ + var $_sections = array(); + + /** + * Calling stack + * + * @var array + * @access private + */ + var $_stack = array(); + + /** + * Notes how often a section was entered + * + * @var array + * @access private + */ + var $_numberOfCalls = array(); + + /** + * Notes for each section how much time is spend in sub-sections + * + * @var array + * @access private + */ + var $_subSectionsTime = array(); + + /** + * Notes for each section how often it calls which section + * + * @var array + * @access private + */ + var $_calls = array(); + + /** + * Notes for each section how often it was called by which section + * + * @var array + * @access private + */ + var $_callers = array(); + + /** + * Auto-starts and stops profiler + * + * @var boolean + * @access private + */ + var $_auto = FALSE; + + /** + * Max marker name length for non-html output + * + * @var integer + * @access private + */ + var $_maxStringLength = 0; + + /** + * Constructor, starts profiling recording + * + * @access public + */ + function Benchmark_Profiler($auto = FALSE) { + $this->_auto = $auto; + + if ($this->_auto) { + $this->start(); + } + + $this->PEAR(); + } + + /** + * Destructor, stops profiling recording + * + * @access private + */ + function _Benchmark_Profiler() { + if (isset($this->_auto) && $this->_auto) { + $this->stop(); + $this->display(); + } + } + + /** + * Returns profiling informations for a given section. + * + * @param string $section + * @return array + * @access public + */ + function getSectionInformations($section = 'Global') { + if (isset($this->_sections[$section])) { + $calls = array(); + + if (isset($this->_calls[$section])) { + $calls = $this->_calls[$section]; + } + + $callers = array(); + + if (isset($this->_callers[$section])) { + $callers = $this->_callers[$section]; + } + + $informations = array(); + + $informations['time'] = $this->_sections[$section]; + if (isset($this->_sections['Global'])) { + $informations['percentage'] = number_format(100 * $this->_sections[$section] / $this->_sections['Global'], 2, '.', ''); + } else { + $informations['percentage'] = 'N/A'; + } + $informations['calls'] = $calls; + $informations['num_calls'] = $this->_numberOfCalls[$section]; + $informations['callers'] = $callers; + + if (isset($this->_subSectionsTime[$section])) { + $informations['netto_time'] = $this->_sections[$section] - $this->_subSectionsTime[$section]; + } else { + $informations['netto_time'] = $this->_sections[$section]; + } + + return $informations; + } else { + $this->raiseError("The section '$section' does not exists.\n", NULL, PEAR_ERROR_TRIGGER, E_USER_WARNING); + } + } + + /** + * Returns profiling informations for all sections. + * + * @return array + * @access public + */ + function getAllSectionsInformations() { + $informations = array(); + + foreach($this->_sections as $section => $time) { + $informations[$section] = $this->getSectionInformations($section); + } + + return $informations; + } + + /** + * Returns formatted profiling information. + * + * @param string output format (auto, plain or html), default auto + * @see display() + * @access private + */ + function _getOutput($format) { + + /* Quickly find out the maximun length: Ineffecient, but will do for now! */ + $informations = $this->getAllSectionsInformations(); + $names = array_keys($informations); + + $maxLength = 0; + foreach ($names as $name) + { + if ($maxLength < strlen($name)) { + $maxLength = strlen($name); + } + } + $this->_maxStringLength = $maxLength; + + if ($format == 'auto') { + if (function_exists('version_compare') && + version_compare(phpversion(), '4.1', 'ge')) { + $format = isset($_SERVER['SERVER_PROTOCOL']) ? 'html' : 'plain'; + } else { + global $HTTP_SERVER_VARS; + $format = isset($HTTP_SERVER_VARS['SERVER_PROTOCOL']) ? 'html' : 'plain'; + } + } + + if ($format == 'html') { + $out = ''."\n"; + $out .= + ''. + ''. + ''. + ''. + "\n"; + } else { + $dashes = $out = str_pad("\n", ($this->_maxStringLength + 75), '-', STR_PAD_LEFT); + $out .= str_pad('Section', $this->_maxStringLength + 10); + $out .= str_pad("Total Ex Time", 22); + $out .= str_pad("Netto Ex Time", 22); + $out .= str_pad("#Calls", 10); + $out .= "Percentage\n"; + $out .= $dashes; + } + + foreach($informations as $name => $values) { + $percentage = $values['percentage']; + $calls_str = ""; + + foreach($values['calls'] as $key => $val) { + if ($calls_str) { + $calls_str .= ", "; + } + + $calls_str .= "$key ($val)"; + } + + $callers_str = ""; + + foreach($values['callers'] as $key => $val) { + if ($callers_str) { + $callers_str .= ", "; + } + + $callers_str .= "$key ($val)"; + } + + if ($format == 'html') { + $out .= ""; + if (is_numeric($values['percentage'])) { + $out .= "\n"; + } else { + $out .= "\n"; + } + $out .= ""; + } else { + $out .= str_pad($name, $this->_maxStringLength + 10); + $out .= str_pad($values['time'], 22); + $out .= str_pad($values['netto_time'], 22); + $out .= str_pad($values['num_calls'], 10); + if (is_numeric($values['percentage'])) { + $out .= str_pad($values['percentage']."%\n", 8, ' ', STR_PAD_LEFT); + } else { + $out .= str_pad($values['percentage']."\n", 8, ' ', STR_PAD_LEFT); + } + } + } + + if ($format == 'html') { + return $out . '
 total ex. timenetto ex. time#calls%callscallers
$name{$values['time']}{$values['netto_time']}{$values['num_calls']}{$values['percentage']}%{$values['percentage']}$calls_str$callers_str
'; + } else { + return $out; + } + } + + /** + * Returns formatted profiling information. + * + * @param string output format (auto, plain or html), default auto + * @access public + */ + function display($format = 'auto') { + echo $this->_getOutput($format); + } + + /** + * Enters "Global" section. + * + * @see enterSection(), stop() + * @access public + */ + function start() { + $this->enterSection('Global'); + } + + /** + * Leaves "Global" section. + * + * @see leaveSection(), start() + * @access public + */ + function stop() { + $this->leaveSection('Global'); + } + + /** + * Enters code section. + * + * @param string name of the code section + * @see start(), leaveSection() + * @access public + */ + function enterSection($name) { + if (count($this->_stack)) { + if (isset($this->_callers[$name][$this->_stack[count($this->_stack) - 1]["name"]])) { + $this->_callers[$name][$this->_stack[count($this->_stack) - 1]["name"]]++; + } else { + $this->_callers[$name][$this->_stack[count($this->_stack) - 1]["name"]] = 1; + } + + if (isset($this->_calls[$this->_stack[count($this->_stack) - 1]["name"]][$name])) { + $this->_calls[$this->_stack[count($this->_stack) - 1]["name"]][$name]++; + } else { + $this->_calls[$this->_stack[count($this->_stack) - 1]["name"]][$name] = 1; + } + } else { + if ($name != 'Global') { + $this->raiseError("tried to enter section ".$name." but profiling was not started\n", NULL, PEAR_ERROR_DIE); + } + } + + if (isset($this->_numberOfCalls[$name])) { + $this->_numberOfCalls[$name]++; + } else { + $this->_numberOfCalls[$name] = 1; + } + + array_push($this->_stack, array("name" => $name, "time" => $this->_getMicrotime())); + } + + /** + * Leaves code section. + * + * @param string name of the marker to be set + * @see stop(), enterSection() + * @access public + */ + function leaveSection($name) { + $microtime = $this->_getMicrotime(); + + if (!count($this->_stack)) { + $this->raiseError("tried to leave section ".$name." but profiling was not started\n", NULL, PEAR_ERROR_DIE); + } + + $x = array_pop($this->_stack); + + if ($x["name"] != $name) { + $this->raiseError("reached end of section $name but expecting end of " . $x["name"]."\n", NULL, PEAR_ERROR_DIE); + } + + if (isset($this->_sections[$name])) { + $this->_sections[$name] += $microtime - $x["time"]; + } else { + $this->_sections[$name] = $microtime - $x["time"]; + } + + $parent = array_pop($this->_stack); + + if (isset($parent)) { + if (isset($this->_subSectionsTime[$parent['name']])) { + $this->_subSectionsTime[$parent['name']] += $microtime - $x['time']; + } else { + $this->_subSectionsTime[$parent['name']] = $microtime - $x['time']; + } + + array_push($this->_stack, $parent); + } + } + + /** + * Wrapper for microtime(). + * + * @return float + * @access private + * @since 1.3.0 + */ + function _getMicrotime() { + $microtime = explode(' ', microtime()); + return $microtime[1] . substr($microtime[0], 1); + } +} diff --git a/buildscripts/Benchmark/Timer.php b/buildscripts/Benchmark/Timer.php new file mode 100644 index 00000000..d713e6b2 --- /dev/null +++ b/buildscripts/Benchmark/Timer.php @@ -0,0 +1,319 @@ +. | +// +------------------------------------------------------------------------+ +// | This source file is subject to the New BSD license, That is bundled | +// | with this package in the file LICENSE, and is available through | +// | the world-wide-web at | +// | http://www.opensource.org/licenses/bsd-license.php | +// | If you did not receive a copy of the new BSDlicense and are unable | +// | to obtain it through the world-wide-web, please send a note to | +// | license@php.net so we can mail you a copy immediately. | +// +------------------------------------------------------------------------+ +// +// $Id: Timer.php,v 1.16 2006/03/01 13:41:39 matthias Exp $ +// + +require_once 'PEAR.php'; + +/** + * Provides timing and profiling information. + * + * Example 1: Automatic profiling start, stop, and output. + * + * + * setMarker('Marker 1'); + * ?> + * + * + * Example 2: Manual profiling start, stop, and output. + * + * + * start(); + * $timer->setMarker('Marker 1'); + * $timer->stop(); + * + * $timer->display(); // to output html formated + * // AND/OR : + * $profiling = $timer->getProfiling(); // get the profiler info as an associative array + * ?> + * + * + * @author Sebastian Bergmann + * @author Ludovico Magnocavallo + * @copyright Copyright © 2002-2005 Sebastian Bergmann + * @license http://www.php.net/license/3_0.txt The PHP License, Version 3.0 + * @category Benchmarking + * @package Benchmark + */ +class Benchmark_Timer extends PEAR { + /** + * Contains the markers. + * + * @var array + * @access private + */ + var $markers = array(); + + /** + * Auto-start and stop timer. + * + * @var boolean + * @access private + */ + var $auto = FALSE; + + /** + * Max marker name length for non-html output. + * + * @var integer + * @access private + */ + var $maxStringLength = 0; + + /** + * Constructor. + * + * @param boolean $auto + * @access public + */ + function Benchmark_Timer($auto = FALSE) { + $this->auto = $auto; + + if ($this->auto) { + $this->start(); + } + + $this->PEAR(); + } + + /** + * Destructor. + * + * @access private + */ + function _Benchmark_Timer() { + if ($this->auto) { + $this->stop(); + $this->display(); + } + } + + /** + * Set "Start" marker. + * + * @see setMarker(), stop() + * @access public + */ + function start() { + $this->setMarker('Start'); + } + + /** + * Set "Stop" marker. + * + * @see setMarker(), start() + * @access public + */ + function stop() { + $this->setMarker('Stop'); + } + + /** + * Set marker. + * + * @param string $name Name of the marker to be set. + * @see start(), stop() + * @access public + */ + function setMarker($name) { + $this->markers[$name] = $this->_getMicrotime(); + } + + /** + * Returns the time elapsed betweens two markers. + * + * @param string $start start marker, defaults to "Start" + * @param string $end end marker, defaults to "Stop" + * @return double $time_elapsed time elapsed between $start and $end + * @access public + */ + function timeElapsed($start = 'Start', $end = 'Stop') { + if ($end == 'Stop' && !isset($this->markers['Stop'])) { + $this->markers['Stop'] = $this->_getMicrotime(); + } + + if (extension_loaded('bcmath')) { + return bcsub($this->markers[$end], $this->markers[$start], 6); + } else { + return $this->markers[$end] - $this->markers[$start]; + } + } + + /** + * Returns profiling information. + * + * $profiling[x]['name'] = name of marker x + * $profiling[x]['time'] = time index of marker x + * $profiling[x]['diff'] = execution time from marker x-1 to this marker x + * $profiling[x]['total'] = total execution time up to marker x + * + * @return array + * @access public + */ + function getProfiling() { + $i = $total = 0; + $result = array(); + $temp = reset($this->markers); + $this->maxStringLength = 0; + + foreach ($this->markers as $marker => $time) { + if (extension_loaded('bcmath')) { + $diff = bcsub($time, $temp, 6); + $total = bcadd($total, $diff, 6); + } else { + $diff = $time - $temp; + $total = $total + $diff; + } + + $result[$i]['name'] = $marker; + $result[$i]['time'] = $time; + $result[$i]['diff'] = $diff; + $result[$i]['total'] = $total; + + $this->maxStringLength = (strlen($marker) > $this->maxStringLength ? strlen($marker) + 1 : $this->maxStringLength); + + $temp = $time; + $i++; + } + + $result[0]['diff'] = '-'; + $result[0]['total'] = '-'; + $this->maxStringLength = (strlen('total') > $this->maxStringLength ? strlen('total') : $this->maxStringLength); + $this->maxStringLength += 2; + + return $result; + } + + /** + * Return formatted profiling information. + * + * @param boolean $showTotal Optionnaly includes total in output, default no + * @param string $format output format (auto, plain or html), default auto + * @return string + * @see getProfiling() + * @access public + */ + function getOutput($showTotal = FALSE, $format = 'auto') { + if ($format == 'auto') { + if (function_exists('version_compare') && + version_compare(phpversion(), '4.1', 'ge')) + { + $format = isset($_SERVER['SERVER_PROTOCOL']) ? 'html' : 'plain'; + } else { + global $HTTP_SERVER_VARS; + $format = isset($HTTP_SERVER_VARS['SERVER_PROTOCOL']) ? 'html' : 'plain'; + } + } + + $total = $this->TimeElapsed(); + $result = $this->getProfiling(); + $dashes = ''; + + if ($format == 'html') { + $out = ''."\n"; + $out .= ''. + ($showTotal ? + '' + : '')."\n"; + } else { + $dashes = $out = str_pad("\n", + $this->maxStringLength + ($showTotal ? 70 : 45), '-', STR_PAD_LEFT); + $out .= str_pad('marker', $this->maxStringLength) . + str_pad("time index", 22) . + str_pad("ex time", 16) . + str_pad("perct ", 8) . + ($showTotal ? ' '.str_pad("elapsed", 16)."perct" : '')."\n" . + $dashes; + } + + foreach ($result as $k => $v) { + $perc = (($v['diff'] * 100) / $total); + $tperc = (($v['total'] * 100) / $total); + + if ($format == 'html') { + $out .= "". + ($showTotal ? + "" : ''). + "\n"; + } else { + $out .= str_pad($v['name'], $this->maxStringLength, ' ') . + str_pad($v['time'], 22) . + str_pad($v['diff'], 14) . + str_pad(number_format($perc, 2, '.', '')."%",8, ' ', STR_PAD_LEFT) . + ($showTotal ? ' '. + str_pad($v['total'], 14) . + str_pad(number_format($tperc, 2, '.', '')."%", + 8, ' ', STR_PAD_LEFT) : ''). + "\n"; + } + + $out .= $dashes; + } + + if ($format == 'html') { + $out .= "".($showTotal ? "" : "")."\n"; + $out .= "
 time indexex time%elapsed%
" . $v['name'] . + "" . $v['time'] . + "" . $v['diff'] . + "" . number_format($perc, 2, '.', '') . + "%" . $v['total'] . + "" . + number_format($tperc, 2, '.', '') . + "%
total-${total}100.00%--
\n"; + } else { + $out .= str_pad('total', $this->maxStringLength); + $out .= str_pad('-', 22); + $out .= str_pad($total, 15); + $out .= "100.00%\n"; + $out .= $dashes; + } + + return $out; + } + + /** + * Prints the information returned by getOutput(). + * + * @param boolean $showTotal Optionnaly includes total in output, default no + * @param string $format output format (auto, plain or html), default auto + * @see getOutput() + * @access public + */ + function display($showTotal = FALSE, $format = 'auto') { + print $this->getOutput($showTotal, $format); + } + + /** + * Wrapper for microtime(). + * + * @return float + * @access private + * @since 1.3.0 + */ + function _getMicrotime() { + $microtime = explode(' ', microtime()); + return $microtime[1] . substr($microtime[0], 1); + } +} diff --git a/buildscripts/Benchmark/doc/timer_example.php b/buildscripts/Benchmark/doc/timer_example.php new file mode 100644 index 00000000..93dd05c6 --- /dev/null +++ b/buildscripts/Benchmark/doc/timer_example.php @@ -0,0 +1,18 @@ +start(); +wait(10); +$timer->setMarker('Mark1'); +echo "Elapsed time between Start and Mark1: " . + $timer->timeElapsed('Start', 'Mark1') . "\n"; +wait(50); +$timer->stop(); +$timer->display(); diff --git a/buildscripts/PHPUnit2/Extensions/ExceptionTestCase.php b/buildscripts/PHPUnit2/Extensions/ExceptionTestCase.php new file mode 100644 index 00000000..80afd1b5 --- /dev/null +++ b/buildscripts/PHPUnit2/Extensions/ExceptionTestCase.php @@ -0,0 +1,122 @@ +. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Sebastian Bergmann nor the names of his + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Testing + * @package PHPUnit2 + * @author Sebastian Bergmann + * @copyright 2002-2006 Sebastian Bergmann + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version CVS: $Id: ExceptionTestCase.php,v 1.15.2.6 2006/02/20 07:42:59 sebastian Exp $ + * @link http://pear.php.net/package/PHPUnit2 + * @since File available since Release 2.0.0 + */ + +require_once 'PHPUnit2/Framework/TestCase.php'; + +/** + * A TestCase that expects a specified Exception to be thrown. + * + * @category Testing + * @package PHPUnit2 + * @author Sebastian Bergmann + * @copyright 2002-2006 Sebastian Bergmann + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version Release: @package_version@ + * @link http://pear.php.net/package/PHPUnit2 + * @since Class available since Release 2.0.0 + */ +class PHPUnit2_Extensions_ExceptionTestCase extends PHPUnit2_Framework_TestCase { + /** + * The name of the expected Exception. + * + * @var mixed + * @access private + */ + private $expectedException = NULL; + + /** + * @return string + * @access public + * @since Method available since Release 2.2.0 + */ + public function getExpectedException() { + return $this->expectedException; + } + + /** + * @param mixed $exceptionName + * @access public + * @since Method available since Release 2.2.0 + */ + public function setExpectedException($exceptionName) { + if ((is_string($exceptionName) && class_exists($exceptionName)) || $exceptionName === NULL) { + $this->expectedException = $exceptionName; + } + } + + /** + * @access protected + */ + protected function runTest() { + try { + parent::runTest(); + } + + catch (Exception $e) { + if ($this->expectedException !== NULL && + $e instanceof $this->expectedException) { + return; + } else { + throw $e; + } + } + + if ($this->expectedException !== NULL) { + $this->fail('Expected exception ' . $this->expectedException); + } + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/buildscripts/PHPUnit2/Extensions/PerformanceTestCase.php b/buildscripts/PHPUnit2/Extensions/PerformanceTestCase.php new file mode 100644 index 00000000..38b249a6 --- /dev/null +++ b/buildscripts/PHPUnit2/Extensions/PerformanceTestCase.php @@ -0,0 +1,128 @@ +. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Sebastian Bergmann nor the names of his + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Testing + * @package PHPUnit2 + * @author Sebastian Bergmann + * @copyright 2002-2006 Sebastian Bergmann + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version CVS: $Id: PerformanceTestCase.php,v 1.15.2.5 2005/12/17 16:04:56 sebastian Exp $ + * @link http://pear.php.net/package/PHPUnit2 + * @since File available since Release 2.1.0 + */ + +require_once 'PHPUnit2/Framework/TestCase.php'; + +require_once 'Benchmark/Timer.php'; + +/** + * A TestCase that expects a TestCase to be executed + * meeting a given time limit. + * + * @category Testing + * @package PHPUnit2 + * @author Sebastian Bergmann + * @copyright 2002-2006 Sebastian Bergmann + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version Release: @package_version@ + * @link http://pear.php.net/package/PHPUnit2 + * @since Class available since Release 2.1.0 + */ +class PHPUnit2_Extensions_PerformanceTestCase extends PHPUnit2_Framework_TestCase { + /** + * @var integer + * @access private + */ + private $maxRunningTime = 0; + + /** + * @access protected + */ + protected function runTest() { + $timer = new Benchmark_Timer; + + $timer->start(); + parent::runTest(); + $timer->stop(); + + if ($this->maxRunningTime != 0 && + $timer->timeElapsed() > $this->maxRunningTime) { + $this->fail( + sprintf( + 'expected running time: <= %s but was: %s', + + $this->maxRunningTime, + $timer->timeElapsed() + ) + ); + } + } + + /** + * @param integer $maxRunningTime + * @throws Exception + * @access public + * @since Method available since Release 2.3.0 + */ + public function setMaxRunningTime($maxRunningTime) { + if (is_integer($maxRunningTime) && + $maxRunningTime >= 0) { + $this->maxRunningTime = $maxRunningTime; + } else { + throw new Exception; + } + } + + /** + * @return integer + * @access public + * @since Method available since Release 2.3.0 + */ + public function getMaxRunningTime() { + return $this->maxRunningTime; + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/buildscripts/PHPUnit2/Extensions/RepeatedTest.php b/buildscripts/PHPUnit2/Extensions/RepeatedTest.php new file mode 100644 index 00000000..c23b0915 --- /dev/null +++ b/buildscripts/PHPUnit2/Extensions/RepeatedTest.php @@ -0,0 +1,138 @@ +. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Sebastian Bergmann nor the names of his + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Testing + * @package PHPUnit2 + * @author Sebastian Bergmann + * @copyright 2002-2006 Sebastian Bergmann + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version CVS: $Id: RepeatedTest.php,v 1.15.2.4 2005/12/17 16:04:56 sebastian Exp $ + * @link http://pear.php.net/package/PHPUnit2 + * @since File available since Release 2.0.0 + */ + +require_once 'PHPUnit2/Extensions/TestDecorator.php'; + +/** + * A Decorator that runs a test repeatedly. + * + * @category Testing + * @package PHPUnit2 + * @author Sebastian Bergmann + * @copyright 2002-2006 Sebastian Bergmann + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version Release: @package_version@ + * @link http://pear.php.net/package/PHPUnit2 + * @since Class available since Release 2.0.0 + */ +class PHPUnit2_Extensions_RepeatedTest extends PHPUnit2_Extensions_TestDecorator { + /** + * @var integer + * @access private + */ + private $timesRepeat = 1; + + /** + * Constructor. + * + * @param PHPUnit2_Framework_Test $test + * @param integer $timesRepeat + * @throws Exception + * @access public + */ + public function __construct(PHPUnit2_Framework_Test $test, $timesRepeat = 1) { + parent::__construct($test); + + if (is_integer($timesRepeat) && + $timesRepeat >= 0) { + $this->timesRepeat = $timesRepeat; + } else { + throw new Exception( + 'Argument 2 must be a positive integer.' + ); + } + } + + /** + * Counts the number of test cases that + * will be run by this test. + * + * @return integer + * @access public + */ + public function countTestCases() { + return $this->timesRepeat * $this->test->countTestCases(); + } + + /** + * Runs the decorated test and collects the + * result in a TestResult. + * + * @param PHPUnit2_Framework_TestResult $result + * @return PHPUnit2_Framework_TestResult + * @throws Exception + * @access public + */ + public function run($result = NULL) { + if ($result === NULL) { + $result = $this->createResult(); + } + + // XXX: Workaround for missing ability to declare type-hinted parameters as optional. + else if (!($result instanceof PHPUnit2_Framework_TestResult)) { + throw new Exception( + 'Argument 1 must be an instance of PHPUnit2_Framework_TestResult.' + ); + } + + for ($i = 0; $i < $this->timesRepeat && !$result->shouldStop(); $i++) { + $this->test->run($result); + } + + return $result; + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/buildscripts/PHPUnit2/Extensions/TestDecorator.php b/buildscripts/PHPUnit2/Extensions/TestDecorator.php new file mode 100644 index 00000000..3557eeca --- /dev/null +++ b/buildscripts/PHPUnit2/Extensions/TestDecorator.php @@ -0,0 +1,174 @@ +. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Sebastian Bergmann nor the names of his + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Testing + * @package PHPUnit2 + * @author Sebastian Bergmann + * @copyright 2002-2006 Sebastian Bergmann + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version CVS: $Id: TestDecorator.php,v 1.14.2.4 2005/12/17 16:04:56 sebastian Exp $ + * @link http://pear.php.net/package/PHPUnit2 + * @since File available since Release 2.0.0 + */ + +require_once 'PHPUnit2/Framework/Assert.php'; +require_once 'PHPUnit2/Framework/Test.php'; +require_once 'PHPUnit2/Framework/TestResult.php'; + +/** + * A Decorator for Tests. + * + * Use TestDecorator as the base class for defining new + * test decorators. Test decorator subclasses can be introduced + * to add behaviour before or after a test is run. + * + * @category Testing + * @package PHPUnit2 + * @author Sebastian Bergmann + * @copyright 2002-2006 Sebastian Bergmann + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version Release: @package_version@ + * @link http://pear.php.net/package/PHPUnit2 + * @since Class available since Release 2.0.0 + */ +class PHPUnit2_Extensions_TestDecorator extends PHPUnit2_Framework_Assert implements PHPUnit2_Framework_Test { + /** + * The Test to be decorated. + * + * @var object + * @access protected + */ + protected $test = NULL; + + /** + * Constructor. + * + * @param PHPUnit2_Framework_Test $test + * @access public + */ + public function __construct(PHPUnit2_Framework_Test $test) { + $this->test = $test; + } + + /** + * Returns a string representation of the test. + * + * @return string + * @access public + */ + public function toString() { + return $this->test->toString(); + } + + /** + * Runs the test and collects the + * result in a TestResult. + * + * @param PHPUnit2_Framework_TestResult $result + * @access public + */ + public function basicRun(PHPUnit2_Framework_TestResult $result) { + $this->test->run($result); + } + + /** + * Counts the number of test cases that + * will be run by this test. + * + * @return integer + * @access public + */ + public function countTestCases() { + return $this->test->countTestCases(); + } + + /** + * Creates a default TestResult object. + * + * @return PHPUnit2_Framework_TestResult + * @access protected + */ + protected function createResult() { + return new PHPUnit2_Framework_TestResult; + } + + /** + * Returns the test to be run. + * + * @return PHPUnit2_Framework_Test + * @access public + */ + public function getTest() { + return $this->test; + } + + /** + * Runs the decorated test and collects the + * result in a TestResult. + * + * @param PHPUnit2_Framework_TestResult $result + * @return PHPUnit2_Framework_TestResult + * @throws Exception + * @access public + */ + public function run($result = NULL) { + if ($result === NULL) { + $result = $this->createResult(); + } + + // XXX: Workaround for missing ability to declare type-hinted parameters as optional. + else if (!($result instanceof PHPUnit2_Framework_TestResult)) { + throw new Exception( + 'Argument 1 must be an instance of PHPUnit2_Framework_TestResult.' + ); + } + + $this->basicRun($result); + + return $result; + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/buildscripts/PHPUnit2/Extensions/TestSetup.php b/buildscripts/PHPUnit2/Extensions/TestSetup.php new file mode 100644 index 00000000..4d28f931 --- /dev/null +++ b/buildscripts/PHPUnit2/Extensions/TestSetup.php @@ -0,0 +1,154 @@ +. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Sebastian Bergmann nor the names of his + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Testing + * @package PHPUnit2 + * @author Sebastian Bergmann + * @copyright 2002-2006 Sebastian Bergmann + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version CVS: $Id: TestSetup.php,v 1.13.2.6 2005/12/17 16:04:56 sebastian Exp $ + * @link http://pear.php.net/package/PHPUnit2 + * @since File available since Release 2.0.0 + */ + +require_once 'PHPUnit2/Framework/TestSuite.php'; +require_once 'PHPUnit2/Extensions/TestDecorator.php'; + +/** + * A Decorator to set up and tear down additional fixture state. + * Subclass TestSetup and insert it into your tests when you want + * to set up additional state once before the tests are run. + * + * @category Testing + * @package PHPUnit2 + * @author Sebastian Bergmann + * @copyright 2002-2006 Sebastian Bergmann + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version Release: @package_version@ + * @link http://pear.php.net/package/PHPUnit2 + * @since Class available since Release 2.0.0 + */ +class PHPUnit2_Extensions_TestSetup extends PHPUnit2_Extensions_TestDecorator { + /** + * Runs the decorated test and collects the + * result in a TestResult. + * + * @param PHPUnit2_Framework_TestResult $result + * @return PHPUnit2_Framework_TestResult + * @throws Exception + * @access public + */ + public function run($result = NULL) { + if ($result === NULL) { + $result = $this->createResult(); + } + + // XXX: Workaround for missing ability to declare type-hinted parameters as optional. + else if (!($result instanceof PHPUnit2_Framework_TestResult)) { + throw new Exception( + 'Argument 1 must be an instance of PHPUnit2_Framework_TestResult.' + ); + } + + $this->setUp(); + $this->copyFixtureToTest(); + $this->basicRun($result); + $this->tearDown(); + + return $result; + } + + /** + * Copies the fixture set up by setUp() to the test. + * + * @access private + * @since Method available since Release 2.3.0 + */ + private function copyFixtureToTest() { + $object = new ReflectionClass($this); + + foreach ($object->getProperties() as $property) { + $name = $property->getName(); + + if ($name != 'test') { + $this->doCopyFixtureToTest($this->test, $name, $this->$name); + } + } + } + + /** + * @access private + * @since Method available since Release 2.3.0 + */ + private function doCopyFixtureToTest($object, $name, &$value) { + if ($object instanceof PHPUnit2_Framework_TestSuite) { + foreach ($object->tests() as $test) { + $this->doCopyFixtureToTest($test, $name, $value); + } + } else { + $object->$name =& $value; + } + } + + /** + * Sets up the fixture. Override to set up additional fixture + * state. + * + * @access protected + */ + protected function setUp() { + } + + /** + * Tears down the fixture. Override to tear down the additional + * fixture state. + * + * @access protected + */ + protected function tearDown() { + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/buildscripts/PHPUnit2/Framework/Assert.php b/buildscripts/PHPUnit2/Framework/Assert.php new file mode 100644 index 00000000..3465afea --- /dev/null +++ b/buildscripts/PHPUnit2/Framework/Assert.php @@ -0,0 +1,626 @@ +. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Sebastian Bergmann nor the names of his + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Testing + * @package PHPUnit2 + * @author Sebastian Bergmann + * @copyright 2002-2006 Sebastian Bergmann + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version CVS: $Id: Assert.php,v 1.45.2.4 2005/12/17 16:04:56 sebastian Exp $ + * @link http://pear.php.net/package/PHPUnit2 + * @since File available since Release 2.0.0 + */ + +require_once 'PHPUnit2/Framework/AssertionFailedError.php'; +require_once 'PHPUnit2/Framework/ComparisonFailure.php'; + +/** + * A set of assert methods. + * + * @category Testing + * @package PHPUnit2 + * @author Sebastian Bergmann + * @copyright 2002-2006 Sebastian Bergmann + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version Release: @package_version@ + * @link http://pear.php.net/package/PHPUnit2 + * @since Class available since Release 2.0.0 + * @static + */ +class PHPUnit2_Framework_Assert { + /** + * @var boolean + * @access private + * @static + */ + private static $looselyTyped = FALSE; + + /** + * Protect constructor since it is a static only class. + * + * @access protected + */ + protected function __construct() { + } + + /** + * Asserts that a haystack contains a needle. + * + * @param mixed $needle + * @param mixed $haystack + * @param string $message + * @access public + * @static + * @since Method available since Release 2.1.0 + */ + public static function assertContains($needle, $haystack, $message = '') { + self::doAssertContains($needle, $haystack, TRUE, $message); + } + + /** + * Asserts that a haystack does not contain a needle. + * + * @param mixed $needle + * @param mixed $haystack + * @param string $message + * @access public + * @static + * @since Method available since Release 2.1.0 + */ + public static function assertNotContains($needle, $haystack, $message = '') { + self::doAssertContains($needle, $haystack, FALSE, $message); + } + + /** + * @param mixed $needle + * @param mixed $haystack + * @param boolean $condition + * @param string $message + * @throws Exception + * @access private + * @static + * @since Method available since Release 2.2.0 + */ + private static function doAssertContains($needle, $haystack, $condition, $message) { + $found = FALSE; + + if (is_array($haystack) || + (is_object($haystack) && $haystack instanceof Iterator)) { + foreach ($haystack as $straw) { + if ($straw === $needle) { + $found = TRUE; + break; + } + } + } + + else if (is_string($needle) && is_string($haystack)) { + if (strpos($haystack, $needle) !== FALSE) { + $found = TRUE; + } + } + + else { + throw new Exception; + } + + if ($condition && !$found) { + self::fail( + sprintf( + '%s%s"%s" does not contain "%s"', + + $message, + ($message != '') ? ' ' : '', + self::objectToString($haystack), + self::objectToString($needle) + ) + ); + } + + else if (!$condition && $found) { + self::fail( + sprintf( + '%s%s"%s" contains "%s"', + + $message, + ($message != '') ? ' ' : '', + self::objectToString($haystack), + self::objectToString($needle) + ) + ); + } + } + + /** + * Asserts that two variables are equal. + * + * @param mixed $expected + * @param mixed $actual + * @param string $message + * @param mixed $delta + * @access public + * @static + */ + public static function assertEquals($expected, $actual, $message = '', $delta = 0) { + self::doAssertEquals($expected, $actual, $delta, TRUE, $message); + } + + /** + * Asserts that two variables are not equal. + * + * @param mixed $expected + * @param mixed $actual + * @param string $message + * @param mixed $delta + * @access public + * @static + * @since Method available since Release 2.3.0 + */ + public static function assertNotEquals($expected, $actual, $message = '', $delta = 0) { + self::doAssertEquals($expected, $actual, $delta, FALSE, $message); + } + + /** + * @param mixed $expected + * @param mixed $actual + * @param mixed $delta + * @param boolean $condition + * @param string $message + * @access private + * @static + * @since Method available since Release 2.3.0 + */ + private static function doAssertEquals($expected, $actual, $delta, $condition, $message) { + $equal = FALSE; + + if (is_array($expected)) { + if (is_array($actual)) { + self::sortArrayRecursively($actual); + self::sortArrayRecursively($expected); + + if (self::$looselyTyped) { + $actual = self::convertToString($actual); + $expected = self::convertToString($expected); + } + + $equal = (serialize($expected) == serialize($actual)); + } + } + + else if (is_float($expected) && is_float($actual) && is_float($delta)) { + $equal = (abs($expected - $actual) <= $delta); + } + + else { + $equal = (serialize($expected) == serialize($actual)); + } + + if ($condition && !$equal) { + self::failNotSame( + $expected, + $actual, + $message + ); + } + + else if (!$condition && $equal) { + self::failSame( + $expected, + $actual, + $message + ); + } + } + + /** + * Asserts that a condition is true. + * + * @param boolean $condition + * @param string $message + * @throws Exception + * @access public + * @static + */ + public static function assertTrue($condition, $message = '') { + if (is_bool($condition)) { + if (!$condition) { + self::fail($message); + } + } else { + throw new Exception; + } + } + + /** + * Asserts that a condition is false. + * + * @param boolean $condition + * @param string $message + * @throws Exception + * @access public + * @static + */ + public static function assertFalse($condition, $message = '') { + if (is_bool($condition)) { + self::assertTrue(!$condition, $message); + } else { + throw new Exception; + } + } + + /** + * Asserts that a variable is not NULL. + * + * @param mixed $actual + * @param string $message + * @access public + * @static + */ + public static function assertNotNull($actual, $message = '') { + if (is_null($actual)) { + self::fail(self::format('NOT NULL', 'NULL', $message)); + } + } + + /** + * Asserts that a variable is NULL. + * + * @param mixed $actual + * @param string $message + * @access public + * @static + */ + public static function assertNull($actual, $message = '') { + if (!is_null($actual)) { + self::fail(self::format('NULL', 'NOT NULL', $message)); + } + } + + /** + * Asserts that two variables have the same type and value. + * Used on objects, it asserts that two variables reference + * the same object. + * + * @param mixed $expected + * @param mixed $actual + * @param string $message + * @access public + * @static + */ + public static function assertSame($expected, $actual, $message = '') { + if ($expected !== $actual) { + self::failNotSame($expected, $actual, $message); + } + } + + /** + * Asserts that two variables do not have the same type and value. + * Used on objects, it asserts that two variables do not reference + * the same object. + * + * @param mixed $expected + * @param mixed $actual + * @param string $message + * @access public + * @static + */ + public static function assertNotSame($expected, $actual, $message = '') { + if ($expected === $actual) { + self::failSame($expected, $actual, $message); + } + } + + /** + * Asserts that a variable is of a given type. + * + * @param string $expected + * @param mixed $actual + * @param string $message + * @access public + * @static + */ + public static function assertType($expected, $actual, $message = '') { + self::doAssertType($expected, $actual, TRUE, $message); + } + + /** + * Asserts that a variable is not of a given type. + * + * @param string $expected + * @param mixed $actual + * @param string $message + * @access public + * @static + * @since Method available since Release 2.2.0 + */ + public static function assertNotType($expected, $actual, $message = '') { + self::doAssertType($expected, $actual, FALSE, $message); + } + + /** + * @param string $expected + * @param mixed $actual + * @param boolean $condition + * @param string $message + * @access private + * @static + * @since Method available since Release 2.2.0 + */ + private static function doAssertType($expected, $actual, $condition, $message) { + if (!is_string($expected)) { + throw new Exception; + } + + if (is_object($actual)) { + $result = $actual instanceof $expected; + } else { + $result = (gettype($actual) == $expected); + } + + if ($condition && !$result) { + self::failNotSame( + $expected, + $actual, + $message + ); + } + + else if (!$condition && $result) { + self::failSame( + $expected, + $actual, + $message + ); + } + } + + /** + * Asserts that a string matches a given regular expression. + * + * @param string $pattern + * @param string $string + * @param string $message + * @access public + * @static + */ + public static function assertRegExp($pattern, $string, $message = '') { + self::doAssertRegExp($pattern, $string, TRUE, $message); + } + + /** + * Asserts that a string does not match a given regular expression. + * + * @param string $pattern + * @param string $string + * @param string $message + * @access public + * @static + * @since Method available since Release 2.1.0 + */ + public static function assertNotRegExp($pattern, $string, $message = '') { + self::doAssertRegExp($pattern, $string, FALSE, $message); + } + + /** + * @param mixed $pattern + * @param mixed $string + * @param boolean $condition + * @param string $message + * @access private + * @static + * @since Method available since Release 2.2.0 + */ + private static function doAssertRegExp($pattern, $string, $condition, $message) { + if (!is_string($pattern) || !is_string($string)) { + throw new Exception; + } + + $result = preg_match($pattern, $string); + + if ($condition && !$result) { + self::fail( + sprintf( + '%s%s"%s" does not match pattern "%s"', + + $message, + ($message != '') ? ' ' : '', + $string, + $pattern + ) + ); + } + + else if (!$condition && $result) { + self::fail( + sprintf( + '%s%s"%s" matches pattern "%s"', + + $message, + ($message != '') ? ' ' : '', + $string, + $pattern + ) + ); + } + } + + /** + * Fails a test with the given message. + * + * @param string $message + * @throws PHPUnit2_Framework_AssertionFailedError + * @access public + * @static + */ + public static function fail($message = '') { + throw new PHPUnit2_Framework_AssertionFailedError($message); + } + + /** + * @param string $message + * @throws PHPUnit2_Framework_AssertionFailedError + * @access private + * @static + */ + private static function failSame($message) { + self::fail( + sprintf( + '%s%sexpected not same', + + $message, + ($message != '') ? ' ' : '' + ) + ); + } + + /** + * @param mixed $expected + * @param mixed $actual + * @param string $message + * @throws PHPUnit2_Framework_AssertionFailedError + * @access private + * @static + */ + private static function failNotSame($expected, $actual, $message) { + if (is_string($expected) && is_string($actual)) { + throw new PHPUnit2_Framework_ComparisonFailure($expected, $actual, $message); + } + + self::fail( + sprintf( + '%s%sexpected same: <%s> was not: <%s>', + + $message, + ($message != '') ? ' ' : '', + self::objectToString($expected), + self::objectToString($actual) + ) + ); + } + + /** + * @param mixed $expected + * @param mixed $actual + * @param string $message + * @access public + * @static + */ + public static function format($expected, $actual, $message) { + return sprintf( + '%s%sexpected: <%s> but was: <%s>', + + $message, + ($message != '') ? ' ' : '', + self::objectToString($expected), + self::objectToString($actual) + ); + } + + /** + * @param boolean $looselyTyped + * @access public + * @static + */ + public static function setLooselyTyped($looselyTyped) { + if (is_bool($looselyTyped)) { + self::$looselyTyped = $looselyTyped; + } + } + + /** + * Converts a value to a string. + * + * @param mixed $value + * @access private + * @static + */ + private static function convertToString($value) { + foreach ($value as $k => $v) { + if (is_array($v)) { + $value[$k] = self::convertToString($value[$k]); + } else if (is_object($v)) { + $value[$k] = self::objectToString($value[$k]); + } else { + settype($value[$k], 'string'); + } + } + + return $value; + } + + /** + * @param mixed $object + * @return string + * @access private + * @static + */ + private static function objectToString($object) { + if (is_array($object) || is_object($object)) { + $object = serialize($object); + } + + return $object; + } + + /** + * Sorts an array recursively by its keys. + * + * @param array $array + * @access private + * @static + * @author Adam Maccabee Trachtenberg + */ + private static function sortArrayRecursively(&$array) { + ksort($array); + + foreach($array as $k => $v) { + if (is_array($v)) { + self::sortArrayRecursively($array[$k]); + } + } + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/buildscripts/PHPUnit2/Framework/AssertionFailedError.php b/buildscripts/PHPUnit2/Framework/AssertionFailedError.php new file mode 100644 index 00000000..d3db50ed --- /dev/null +++ b/buildscripts/PHPUnit2/Framework/AssertionFailedError.php @@ -0,0 +1,80 @@ +. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Sebastian Bergmann nor the names of his + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Testing + * @package PHPUnit2 + * @author Sebastian Bergmann + * @copyright 2002-2006 Sebastian Bergmann + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version CVS: $Id: AssertionFailedError.php,v 1.9.2.2 2005/12/17 16:04:56 sebastian Exp $ + * @link http://pear.php.net/package/PHPUnit2 + * @since File available since Release 2.0.0 + */ + +/** + * Thrown when an assertion failed. + * + * @category Testing + * @package PHPUnit2 + * @author Sebastian Bergmann + * @copyright 2002-2006 Sebastian Bergmann + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version Release: @package_version@ + * @link http://pear.php.net/package/PHPUnit2 + * @since Class available since Release 2.0.0 + */ +class PHPUnit2_Framework_AssertionFailedError extends Exception { + /** + * Wrapper for getMessage() which is declared as final. + * + * @return string + * @access public + */ + public function toString() { + return $this->getMessage(); + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/buildscripts/PHPUnit2/Framework/ComparisonFailure.php b/buildscripts/PHPUnit2/Framework/ComparisonFailure.php new file mode 100644 index 00000000..cc8e26e6 --- /dev/null +++ b/buildscripts/PHPUnit2/Framework/ComparisonFailure.php @@ -0,0 +1,153 @@ +. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Sebastian Bergmann nor the names of his + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Testing + * @package PHPUnit2 + * @author Sebastian Bergmann + * @copyright 2002-2006 Sebastian Bergmann + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version CVS: $Id: ComparisonFailure.php,v 1.13.2.3 2005/12/17 16:04:56 sebastian Exp $ + * @link http://pear.php.net/package/PHPUnit2 + * @since File available since Release 2.0.0 + */ + +require_once 'PHPUnit2/Framework/Assert.php'; +require_once 'PHPUnit2/Framework/AssertionFailedError.php'; + +/** + * Thrown when an assertion for string equality failed. + * + * @category Testing + * @package PHPUnit2 + * @author Sebastian Bergmann + * @copyright 2002-2006 Sebastian Bergmann + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version Release: @package_version@ + * @link http://pear.php.net/package/PHPUnit2 + * @since Class available since Release 2.0.0 + */ +class PHPUnit2_Framework_ComparisonFailure extends PHPUnit2_Framework_AssertionFailedError { + /** + * @var string + * @access private + */ + private $expected = ''; + + /** + * @var string + * @access private + */ + private $actual = ''; + + /** + * Constructs a comparison failure. + * + * @param string $expected + * @param string $actual + * @param string $message + * @access public + */ + public function __construct($expected, $actual, $message = '') { + parent::__construct($message); + + $this->expected = ($expected === NULL) ? 'NULL' : $expected; + $this->actual = ($actual === NULL) ? 'NULL' : $actual; + } + + /** + * Returns "..." in place of common prefix and "..." in + * place of common suffix between expected and actual. + * + * @return string + * @access public + */ + public function toString() { + $end = min(strlen($this->expected), strlen($this->actual)); + $i = 0; + $j = strlen($this->expected) - 1; + $k = strlen($this->actual) - 1; + + for (; $i < $end; $i++) { + if ($this->expected[$i] != $this->actual[$i]) { + break; + } + } + + for (; $k >= $i && $j >= $i; $k--,$j--) { + if ($this->expected[$j] != $this->actual[$k]) { + break; + } + } + + if ($j < $i && $k < $i) { + $expected = $this->expected; + $actual = $this->actual; + } else { + $expected = substr($this->expected, $i, ($j + 1 - $i)); + $actual = substr($this->actual, $i, ($k + 1 - $i));; + + if ($i <= $end && $i > 0) { + $expected = '...' . $expected; + $actual = '...' . $actual; + } + + if ($j < strlen($this->expected) - 1) { + $expected .= '...'; + } + + if ($k < strlen($this->actual) - 1) { + $actual .= '...'; + } + } + + return PHPUnit2_Framework_Assert::format( + $expected, + $actual, + parent::getMessage() + ); + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/buildscripts/PHPUnit2/Framework/Error.php b/buildscripts/PHPUnit2/Framework/Error.php new file mode 100644 index 00000000..a4bd4fd2 --- /dev/null +++ b/buildscripts/PHPUnit2/Framework/Error.php @@ -0,0 +1,88 @@ +. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Sebastian Bergmann nor the names of his + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Testing + * @package PHPUnit2 + * @author Sebastian Bergmann + * @copyright 2002-2006 Sebastian Bergmann + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version CVS: $Id: Error.php,v 1.4.2.2 2005/12/17 16:04:56 sebastian Exp $ + * @link http://pear.php.net/package/PHPUnit2 + * @since File available since Release 2.2.0 + */ + +/** + * Wrapper for PHP errors. + * + * @category Testing + * @package PHPUnit2 + * @author Sebastian Bergmann + * @copyright 2002-2006 Sebastian Bergmann + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version Release: @package_version@ + * @link http://pear.php.net/package/PHPUnit2 + * @since Class available since Release 2.2.0 + */ +class PHPUnit2_Framework_Error extends Exception { + /** + * Constructor. + * + * @param string $message + * @param integer $code + * @param string $file + * @param integer $line + * @param array $trace + * @access public + */ + public function __construct($message, $code, $file, $line, $trace) { + parent::__construct($message, $code); + + $this->file = $file; + $this->line = $line; + $this->trace = $trace; + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/buildscripts/PHPUnit2/Framework/IncompleteTest.php b/buildscripts/PHPUnit2/Framework/IncompleteTest.php new file mode 100644 index 00000000..325e6411 --- /dev/null +++ b/buildscripts/PHPUnit2/Framework/IncompleteTest.php @@ -0,0 +1,72 @@ +. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Sebastian Bergmann nor the names of his + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Testing + * @package PHPUnit2 + * @author Sebastian Bergmann + * @copyright 2002-2006 Sebastian Bergmann + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version CVS: $Id: IncompleteTest.php,v 1.6.2.2 2005/12/17 16:04:56 sebastian Exp $ + * @link http://pear.php.net/package/PHPUnit2 + * @since File available since Release 2.0.0 + */ + +/** + * A marker interface for marking any exception/error as result of an unit + * test as incomplete implementation or currently not implemented. + * + * @category Testing + * @package PHPUnit2 + * @author Sebastian Bergmann + * @copyright 2002-2006 Sebastian Bergmann + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version Release: @package_version@ + * @link http://pear.php.net/package/PHPUnit2 + * @since Interface available since Release 2.0.0 + */ +interface PHPUnit2_Framework_IncompleteTest { +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/buildscripts/PHPUnit2/Framework/IncompleteTestError.php b/buildscripts/PHPUnit2/Framework/IncompleteTestError.php new file mode 100644 index 00000000..6c2a0660 --- /dev/null +++ b/buildscripts/PHPUnit2/Framework/IncompleteTestError.php @@ -0,0 +1,75 @@ +. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Sebastian Bergmann nor the names of his + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Testing + * @package PHPUnit2 + * @author Sebastian Bergmann + * @copyright 2002-2006 Sebastian Bergmann + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version CVS: $Id: IncompleteTestError.php,v 1.5.2.3 2005/12/17 16:04:56 sebastian Exp $ + * @link http://pear.php.net/package/PHPUnit2 + * @since File available since Release 2.0.0 + */ + +require_once 'PHPUnit2/Framework/AssertionFailedError.php'; +require_once 'PHPUnit2/Framework/IncompleteTest.php'; + +/** + * Extension to PHPUnit2_Framework_AssertionFailedError to mark the special + * case of an incomplete test. + * + * @category Testing + * @package PHPUnit2 + * @author Sebastian Bergmann + * @copyright 2002-2006 Sebastian Bergmann + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version Release: @package_version@ + * @link http://pear.php.net/package/PHPUnit2 + * @since Class available since Release 2.0.0 + */ +class PHPUnit2_Framework_IncompleteTestError extends PHPUnit2_Framework_AssertionFailedError implements PHPUnit2_Framework_IncompleteTest { +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/buildscripts/PHPUnit2/Framework/Test.php b/buildscripts/PHPUnit2/Framework/Test.php new file mode 100644 index 00000000..1d198f1a --- /dev/null +++ b/buildscripts/PHPUnit2/Framework/Test.php @@ -0,0 +1,87 @@ +. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Sebastian Bergmann nor the names of his + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Testing + * @package PHPUnit2 + * @author Sebastian Bergmann + * @copyright 2002-2006 Sebastian Bergmann + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version CVS: $Id: Test.php,v 1.12.2.3 2005/12/17 16:04:56 sebastian Exp $ + * @link http://pear.php.net/package/PHPUnit2 + * @since File available since Release 2.0.0 + */ + +/** + * A Test can be run and collect its results. + * + * @category Testing + * @package PHPUnit2 + * @author Sebastian Bergmann + * @copyright 2002-2006 Sebastian Bergmann + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version Release: @package_version@ + * @link http://pear.php.net/package/PHPUnit2 + * @since Interface available since Release 2.0.0 + */ +interface PHPUnit2_Framework_Test { + /** + * Counts the number of test cases that will be run by this test. + * + * @return integer + * @access public + */ + public function countTestCases(); + + /** + * Runs a test and collects its result in a TestResult instance. + * + * @param PHPUnit2_Framework_TestResult $result + * @return PHPUnit2_Framework_TestResult + * @access public + */ + public function run($result = NULL); +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/buildscripts/PHPUnit2/Framework/TestCase.php b/buildscripts/PHPUnit2/Framework/TestCase.php new file mode 100644 index 00000000..80f56932 --- /dev/null +++ b/buildscripts/PHPUnit2/Framework/TestCase.php @@ -0,0 +1,292 @@ +. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Sebastian Bergmann nor the names of his + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Testing + * @package PHPUnit2 + * @author Sebastian Bergmann + * @copyright 2002-2006 Sebastian Bergmann + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version CVS: $Id: TestCase.php,v 1.32.2.5 2005/12/17 16:04:56 sebastian Exp $ + * @link http://pear.php.net/package/PHPUnit2 + * @since File available since Release 2.0.0 + */ + +require_once 'PHPUnit2/Framework/Assert.php'; +require_once 'PHPUnit2/Framework/Error.php'; +require_once 'PHPUnit2/Framework/Test.php'; +require_once 'PHPUnit2/Framework/TestResult.php'; + +/** + * A TestCase defines the fixture to run multiple tests. + * + * To define a TestCase + * + * 1) Implement a subclass of PHPUnit2_Framework_TestCase. + * 2) Define instance variables that store the state of the fixture. + * 3) Initialize the fixture state by overriding setUp(). + * 4) Clean-up after a test by overriding tearDown(). + * + * Each test runs in its own fixture so there can be no side effects + * among test runs. + * + * Here is an example: + * + * + * value1 = 2; + * $this->value2 = 3; + * } + * } + * ?> + * + * + * For each test implement a method which interacts with the fixture. + * Verify the expected results with assertions specified by calling + * assert with a boolean. + * + * + * assertTrue($this->value1 + $this->value2 == 5); + * } + * ?> + * + * + * @category Testing + * @package PHPUnit2 + * @author Sebastian Bergmann + * @copyright 2002-2006 Sebastian Bergmann + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version Release: @package_version@ + * @link http://pear.php.net/package/PHPUnit2 + * @since Class available since Release 2.0.0 + * @abstract + */ +abstract class PHPUnit2_Framework_TestCase extends PHPUnit2_Framework_Assert implements PHPUnit2_Framework_Test { + /** + * The name of the test case. + * + * @var string + * @access private + */ + private $name = NULL; + + /** + * Constructs a test case with the given name. + * + * @param string + * @access public + */ + public function __construct($name = NULL) { + if ($name !== NULL) { + $this->setName($name); + } + } + + /** + * Returns a string representation of the test case. + * + * @return string + * @access public + */ + public function toString() { + $class = new ReflectionClass($this); + + return sprintf( + '%s(%s)', + + $this->getName(), + $class->name + ); + } + + /** + * Counts the number of test cases executed by run(TestResult result). + * + * @return integer + * @access public + */ + public function countTestCases() { + return 1; + } + + /** + * Gets the name of a TestCase. + * + * @return string + * @access public + */ + public function getName() { + return $this->name; + } + + /** + * Runs the test case and collects the results in a TestResult object. + * If no TestResult object is passed a new one will be created. + * + * @param PHPUnit2_Framework_TestResult $result + * @return PHPUnit2_Framework_TestResult + * @throws Exception + * @access public + */ + public function run($result = NULL) { + if ($result === NULL) { + $result = $this->createResult(); + } + + // XXX: Workaround for missing ability to declare type-hinted parameters as optional. + else if (!($result instanceof PHPUnit2_Framework_TestResult)) { + throw new Exception( + 'Argument 1 must be an instance of PHPUnit2_Framework_TestResult.' + ); + } + + $result->run($this); + + return $result; + } + + /** + * Runs the bare test sequence. + * + * @access public + */ + public function runBare() { + $catchedException = NULL; + + $this->setUp(); + + try { + $this->runTest(); + } + + catch (Exception $e) { + $catchedException = $e; + } + + $this->tearDown(); + + // Workaround for missing "finally". + if ($catchedException !== NULL) { + throw $catchedException; + } + } + + /** + * Override to run the test and assert its state. + * + * @throws PHPUnit2_Framework_Error + * @access protected + */ + protected function runTest() { + if ($this->name === NULL) { + throw new PHPUnit2_Framework_Error( + 'PHPUnit2_Framework_TestCase::$name must not be NULL.' + ); + } + + try { + $class = new ReflectionClass($this); + $method = $class->getMethod($this->name); + } + + catch (ReflectionException $e) { + $this->fail($e->getMessage()); + } + + $method->invoke($this); + } + + /** + * Sets the name of a TestCase. + * + * @param string + * @access public + */ + public function setName($name) { + $this->name = $name; + } + + /** + * Creates a default TestResult object. + * + * @return PHPUnit2_Framework_TestResult + * @access protected + */ + protected function createResult() { + return new PHPUnit2_Framework_TestResult; + } + + /** + * Sets up the fixture, for example, open a network connection. + * This method is called before a test is executed. + * + * @access protected + */ + protected function setUp() { + } + + /** + * Tears down the fixture, for example, close a network connection. + * This method is called after a test is executed. + * + * @access protected + */ + protected function tearDown() { + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/buildscripts/PHPUnit2/Framework/TestFailure.php b/buildscripts/PHPUnit2/Framework/TestFailure.php new file mode 100644 index 00000000..4957e4e6 --- /dev/null +++ b/buildscripts/PHPUnit2/Framework/TestFailure.php @@ -0,0 +1,154 @@ +. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Sebastian Bergmann nor the names of his + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Testing + * @package PHPUnit2 + * @author Sebastian Bergmann + * @copyright 2002-2006 Sebastian Bergmann + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version CVS: $Id: TestFailure.php,v 1.10.2.3 2005/12/17 16:04:56 sebastian Exp $ + * @link http://pear.php.net/package/PHPUnit2 + * @since File available since Release 2.0.0 + */ + +require_once 'PHPUnit2/Framework/AssertionFailedError.php'; +require_once 'PHPUnit2/Framework/Test.php'; + +/** + * A TestFailure collects a failed test together with the caught exception. + * + * @category Testing + * @package PHPUnit2 + * @author Sebastian Bergmann + * @copyright 2002-2006 Sebastian Bergmann + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version Release: @package_version@ + * @link http://pear.php.net/package/PHPUnit2 + * @since Class available since Release 2.0.0 + */ +class PHPUnit2_Framework_TestFailure { + /** + * @var PHPUnit2_Framework_Test + * @access protected + */ + protected $failedTest; + + /** + * @var Exception + * @access protected + */ + protected $thrownException; + + /** + * Constructs a TestFailure with the given test and exception. + * + * @param PHPUnit2_Framework_Test $failedTest + * @param Exception $thrownException + * @access public + */ + public function __construct(PHPUnit2_Framework_Test $failedTest, Exception $thrownException) { + $this->failedTest = $failedTest; + $this->thrownException = $thrownException; + } + + /** + * Returns a short description of the failure. + * + * @return string + * @access public + */ + public function toString() { + return sprintf( + '%s: %s', + + $this->failedTest, + $this->thrownException->getMessage() + ); + } + + /** + * Gets the failed test. + * + * @return Test + * @access public + */ + public function failedTest() { + return $this->failedTest; + } + + /** + * Gets the thrown exception. + * + * @return Exception + * @access public + */ + public function thrownException() { + return $this->thrownException; + } + + /** + * Returns the exception's message. + * + * @return string + * @access public + */ + public function exceptionMessage() { + return $this->thrownException()->getMessage(); + } + + /** + * Returns TRUE if the thrown exception + * is of type AssertionFailedError. + * + * @return boolean + * @access public + */ + public function isFailure() { + return ($this->thrownException() instanceof PHPUnit2_Framework_AssertionFailedError); + } +} + + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/buildscripts/PHPUnit2/Framework/TestListener.php b/buildscripts/PHPUnit2/Framework/TestListener.php new file mode 100644 index 00000000..79f11ffb --- /dev/null +++ b/buildscripts/PHPUnit2/Framework/TestListener.php @@ -0,0 +1,135 @@ +. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Sebastian Bergmann nor the names of his + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Testing + * @package PHPUnit2 + * @author Sebastian Bergmann + * @copyright 2002-2006 Sebastian Bergmann + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version CVS: $Id: TestListener.php,v 1.11.2.3 2005/12/17 16:04:56 sebastian Exp $ + * @link http://pear.php.net/package/PHPUnit2 + * @since File available since Release 2.0.0 + */ + +require_once 'PHPUnit2/Framework/AssertionFailedError.php'; +require_once 'PHPUnit2/Framework/TestSuite.php'; + +/** + * A Listener for test progress. + * + * @category Testing + * @package PHPUnit2 + * @author Sebastian Bergmann + * @copyright 2002-2006 Sebastian Bergmann + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version Release: @package_version@ + * @link http://pear.php.net/package/PHPUnit2 + * @since Interface available since Release 2.0.0 + */ +interface PHPUnit2_Framework_TestListener { + /** + * An error occurred. + * + * @param PHPUnit2_Framework_Test $test + * @param Exception $e + * @access public + */ + public function addError(PHPUnit2_Framework_Test $test, Exception $e); + + /** + * A failure occurred. + * + * @param PHPUnit2_Framework_Test $test + * @param PHPUnit2_Framework_AssertionFailedError $e + * @access public + */ + public function addFailure(PHPUnit2_Framework_Test $test, PHPUnit2_Framework_AssertionFailedError $e); + + /** + * Incomplete test. + * + * @param PHPUnit2_Framework_Test $test + * @param Exception $e + * @access public + */ + public function addIncompleteTest(PHPUnit2_Framework_Test $test, Exception $e); + + /** + * A test suite started. + * + * @param PHPUnit2_Framework_TestSuite $suite + * @access public + * @since Method available since Release 2.2.0 + */ + public function startTestSuite(PHPUnit2_Framework_TestSuite $suite); + + /** + * A test suite ended. + * + * @param PHPUnit2_Framework_TestSuite $suite + * @access public + * @since Method available since Release 2.2.0 + */ + public function endTestSuite(PHPUnit2_Framework_TestSuite $suite); + + /** + * A test started. + * + * @param PHPUnit2_Framework_Test $test + * @access public + */ + public function startTest(PHPUnit2_Framework_Test $test); + + /** + * A test ended. + * + * @param PHPUnit2_Framework_Test $test + * @access public + */ + public function endTest(PHPUnit2_Framework_Test $test); +} + + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/buildscripts/PHPUnit2/Framework/TestResult.php b/buildscripts/PHPUnit2/Framework/TestResult.php new file mode 100644 index 00000000..17adb529 --- /dev/null +++ b/buildscripts/PHPUnit2/Framework/TestResult.php @@ -0,0 +1,447 @@ +. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Sebastian Bergmann nor the names of his + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Testing + * @package PHPUnit2 + * @author Sebastian Bergmann + * @copyright 2002-2006 Sebastian Bergmann + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version CVS: $Id: TestResult.php,v 1.32.2.7 2006/02/25 09:44:23 sebastian Exp $ + * @link http://pear.php.net/package/PHPUnit2 + * @since File available since Release 2.0.0 + */ + +require_once 'PHPUnit2/Framework/AssertionFailedError.php'; +require_once 'PHPUnit2/Framework/IncompleteTest.php'; +require_once 'PHPUnit2/Framework/TestFailure.php'; +require_once 'PHPUnit2/Framework/TestListener.php'; +require_once 'PHPUnit2/Util/ErrorHandler.php'; +require_once 'PHPUnit2/Util/Filter.php'; + +/** + * A TestResult collects the results of executing a test case. + * + * @category Testing + * @package PHPUnit2 + * @author Sebastian Bergmann + * @copyright 2002-2006 Sebastian Bergmann + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version Release: @package_version@ + * @link http://pear.php.net/package/PHPUnit2 + * @since Class available since Release 2.0.0 + */ +class PHPUnit2_Framework_TestResult { + /** + * @var array + * @access protected + */ + protected $errors = array(); + + /** + * @var array + * @access protected + */ + protected $failures = array(); + + /** + * @var array + * @access protected + */ + protected $notImplemented = array(); + + /** + * @var array + * @access protected + */ + protected $listeners = array(); + + /** + * @var integer + * @access protected + */ + protected $runTests = 0; + + /** + * Code Coverage information provided by Xdebug. + * + * @var array + * @access protected + */ + protected $codeCoverageInformation = array(); + + /** + * @var boolean + * @access protected + */ + protected $collectCodeCoverageInformation = FALSE; + + /** + * @var boolean + * @access private + */ + private $stop = FALSE; + + /** + * Registers a TestListener. + * + * @param PHPUnit2_Framework_TestListener + * @access public + */ + public function addListener(PHPUnit2_Framework_TestListener $listener) { + $this->listeners[] = $listener; + } + + /** + * Unregisters a TestListener. + * + * @param PHPUnit2_Framework_TestListener $listener + * @access public + */ + public function removeListener(PHPUnit2_Framework_TestListener $listener) { + for ($i = 0; $i < sizeof($this->listeners); $i++) { + if ($this->listeners[$i] === $listener) { + unset($this->listeners[$i]); + } + } + } + + /** + * Adds an error to the list of errors. + * The passed in exception caused the error. + * + * @param PHPUnit2_Framework_Test $test + * @param Exception $e + * @access public + */ + public function addError(PHPUnit2_Framework_Test $test, Exception $e) { + if ($e instanceof PHPUnit2_Framework_IncompleteTest) { + $this->notImplemented[] = new PHPUnit2_Framework_TestFailure($test, $e); + + foreach ($this->listeners as $listener) { + $listener->addIncompleteTest($test, $e); + } + } else { + $this->errors[] = new PHPUnit2_Framework_TestFailure($test, $e); + + foreach ($this->listeners as $listener) { + $listener->addError($test, $e); + } + } + } + + /** + * Adds a failure to the list of failures. + * The passed in exception caused the failure. + * + * @param PHPUnit2_Framework_Test $test + * @param PHPUnit2_Framework_AssertionFailedError $e + * @access public + */ + public function addFailure(PHPUnit2_Framework_Test $test, PHPUnit2_Framework_AssertionFailedError $e) { + if ($e instanceof PHPUnit2_Framework_IncompleteTest) { + $this->notImplemented[] = new PHPUnit2_Framework_TestFailure($test, $e); + + foreach ($this->listeners as $listener) { + $listener->addIncompleteTest($test, $e); + } + } else { + $this->failures[] = new PHPUnit2_Framework_TestFailure($test, $e); + + foreach ($this->listeners as $listener) { + $listener->addFailure($test, $e); + } + } + } + + /** + * Informs the result that a testsuite will be started. + * + * @param PHPUnit2_Framework_TestSuite $suite + * @access public + * @since Method available since Release 2.2.0 + */ + public function startTestSuite(PHPUnit2_Framework_TestSuite $suite) { + foreach ($this->listeners as $listener) { + $listener->startTestSuite($suite); + } + } + + /** + * Informs the result that a testsuite was completed. + * + * @param PHPUnit2_Framework_TestSuite $suite + * @access public + * @since Method available since Release 2.2.0 + */ + public function endTestSuite(PHPUnit2_Framework_TestSuite $suite) { + foreach ($this->listeners as $listener) { + $listener->endTestSuite($suite); + } + } + + /** + * Informs the result that a test will be started. + * + * @param PHPUnit2_Framework_Test $test + * @access public + */ + public function startTest(PHPUnit2_Framework_Test $test) { + $this->runTests += $test->countTestCases(); + + foreach ($this->listeners as $listener) { + $listener->startTest($test); + } + } + + /** + * Informs the result that a test was completed. + * + * @param PHPUnit2_Framework_Test + * @access public + */ + public function endTest(PHPUnit2_Framework_Test $test) { + foreach ($this->listeners as $listener) { + $listener->endTest($test); + } + } + + /** + * Returns TRUE if no incomplete test occured. + * + * @return boolean + * @access public + */ + public function allCompletlyImplemented() { + return $this->notImplementedCount() == 0; + } + + /** + * Gets the number of incomplete tests. + * + * @return integer + * @access public + */ + public function notImplementedCount() { + return sizeof($this->notImplemented); + } + + /** + * Returns an Enumeration for the incomplete tests. + * + * @return array + * @access public + */ + public function notImplemented() { + return $this->notImplemented; + } + + /** + * Gets the number of detected errors. + * + * @return integer + * @access public + */ + public function errorCount() { + return sizeof($this->errors); + } + + /** + * Returns an Enumeration for the errors. + * + * @return array + * @access public + */ + public function errors() { + return $this->errors; + } + + /** + * Gets the number of detected failures. + * + * @return integer + * @access public + */ + public function failureCount() { + return sizeof($this->failures); + } + + /** + * Returns an Enumeration for the failures. + * + * @return array + * @access public + */ + public function failures() { + return $this->failures; + } + + /** + * Enables or disables the collection of Code Coverage information. + * + * @param boolean $flag + * @throws Exception + * @access public + * @since Method available since Release 2.3.0 + */ + public function collectCodeCoverageInformation($flag) { + if (is_bool($flag)) { + $this->collectCodeCoverageInformation = $flag; + } else { + throw new Exception; + } + } + + /** + * Returns Code Coverage data per test case. + * + * Format of the result array: + * + * + * array( + * "testCase" => array( + * "/tested/code.php" => array( + * linenumber => flag + * ) + * ) + * ) + * + * + * flag < 0: Line is executable but was not executed. + * flag > 0: Line was executed. + * + * @return array + * @access public + */ + public function getCodeCoverageInformation() { + return $this->codeCoverageInformation; + } + + /** + * Runs a TestCase. + * + * @param PHPUnit2_Framework_Test $test + * @access public + */ + public function run(PHPUnit2_Framework_Test $test) { + $this->startTest($test); + + set_error_handler('PHPUnit2_Util_ErrorHandler', E_USER_ERROR); + + $useXdebug = (extension_loaded('xdebug') && $this->collectCodeCoverageInformation); + + if ($useXdebug) { + xdebug_start_code_coverage(XDEBUG_CC_UNUSED); + } + + $globalsBackup = $GLOBALS; + + try { + $test->runBare(); + } + + catch (PHPUnit2_Framework_AssertionFailedError $e) { + $this->addFailure($test, $e); + } + + catch (Exception $e) { + $this->addError($test, $e); + } + + $GLOBALS = $globalsBackup; + + if ($useXdebug) { + $this->codeCoverageInformation[$test->getName()] = PHPUnit2_Util_Filter::getFilteredCodeCoverage( + xdebug_get_code_coverage() + ); + + xdebug_stop_code_coverage(); + } + + restore_error_handler(); + + $this->endTest($test); + } + + /** + * Gets the number of run tests. + * + * @return integer + * @access public + */ + public function runCount() { + return $this->runTests; + } + + /** + * Checks whether the test run should stop. + * + * @return boolean + * @access public + */ + public function shouldStop() { + return $this->stop; + } + + /** + * Marks that the test run should stop. + * + * @access public + */ + public function stop() { + $this->stop = TRUE; + } + + /** + * Returns whether the entire test was successful or not. + * + * @return boolean + * @access public + */ + public function wasSuccessful() { + return empty($this->errors) && empty($this->failures); + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/buildscripts/PHPUnit2/Framework/TestSuite.php b/buildscripts/PHPUnit2/Framework/TestSuite.php new file mode 100644 index 00000000..3d5d670e --- /dev/null +++ b/buildscripts/PHPUnit2/Framework/TestSuite.php @@ -0,0 +1,554 @@ +. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Sebastian Bergmann nor the names of his + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Testing + * @package PHPUnit2 + * @author Sebastian Bergmann + * @copyright 2002-2006 Sebastian Bergmann + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version CVS: $Id: TestSuite.php,v 1.26.2.11 2005/12/17 16:04:56 sebastian Exp $ + * @link http://pear.php.net/package/PHPUnit2 + * @since File available since Release 2.0.0 + */ + +require_once 'PHPUnit2/Framework/Test.php'; +require_once 'PHPUnit2/Framework/TestCase.php'; +require_once 'PHPUnit2/Framework/TestResult.php'; +require_once 'PHPUnit2/Runner/BaseTestRunner.php'; +require_once 'PHPUnit2/Util/Fileloader.php'; + +/** + * A TestSuite is a composite of Tests. It runs a collection of test cases. + * + * Here is an example using the dynamic test definition. + * + * + * addTest(new MathTest('testPass')); + * ?> + * + * + * Alternatively, a TestSuite can extract the tests to be run automatically. + * To do so you pass a ReflectionClass instance for your + * PHPUnit2_Framework_TestCase class to the PHPUnit2_Framework_TestSuite + * constructor. + * + * + * + * + * + * This constructor creates a suite with all the methods starting with + * "test" that take no arguments. + * + * @category Testing + * @package PHPUnit2 + * @author Sebastian Bergmann + * @copyright 2002-2006 Sebastian Bergmann + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version Release: @package_version@ + * @link http://pear.php.net/package/PHPUnit2 + * @since Class available since Release 2.0.0 + */ +class PHPUnit2_Framework_TestSuite implements PHPUnit2_Framework_Test { + /** + * The name of the test suite. + * + * @var string + * @access private + */ + private $name = ''; + + /** + * The tests in the test suite. + * + * @var array + * @access private + */ + private $tests = array(); + + /** + * Constructs a new TestSuite: + * + * - PHPUnit2_Framework_TestSuite() constructs an empty TestSuite. + * + * - PHPUnit2_Framework_TestSuite(ReflectionClass) constructs a + * TestSuite from the given class. + * + * - PHPUnit2_Framework_TestSuite(ReflectionClass, String) + * constructs a TestSuite from the given class with the given + * name. + * + * - PHPUnit2_Framework_TestSuite(String) either constructs a + * TestSuite from the given class (if the passed string is the + * name of an existing class) or constructs an empty TestSuite + * with the given name. + * + * @param mixed $theClass + * @param string $name + * @throws Exception + * @access public + */ + public function __construct($theClass = '', $name = '') { + $argumentsValid = FALSE; + + if (is_object($theClass) && + $theClass instanceof ReflectionClass) { + $argumentsValid = TRUE; + } + + else if (is_string($theClass) && $theClass !== '' && class_exists($theClass)) { + $argumentsValid = TRUE; + + if ($name == '') { + $name = $theClass; + } + + $theClass = new ReflectionClass($theClass); + } + + else if (is_string($theClass)) { + $this->setName($theClass); + return; + } + + if (!$argumentsValid) { + throw new Exception; + } + + if ($name != '') { + $this->setName($name); + } else { + $this->setName($theClass->getName()); + } + + $constructor = $theClass->getConstructor(); + + if ($constructor === NULL || + !$constructor->isPublic()) { + $this->addTest( + self::warning( + sprintf( + 'Class %s has no public constructor', + + $theClass->getName() + ) + ) + ); + + return; + } + + $methods = $theClass->getMethods(); + $names = array(); + + foreach ($methods as $method) { + $this->addTestMethod($method, $names, $theClass); + } + + if (empty($this->tests)) { + $this->addTest( + self::warning( + sprintf( + 'No tests found in %s', + + $theClass->getName() + ) + ) + ); + } + } + + /** + * Returns a string representation of the test suite. + * + * @return string + * @access public + */ + public function toString() { + return $this->getName(); + } + + /** + * Adds a test to the suite. + * + * @param PHPUnit2_Framework_Test $test + * @access public + */ + public function addTest(PHPUnit2_Framework_Test $test) { + $this->tests[] = $test; + } + + /** + * Adds the tests from the given class to the suite. + * + * @param mixed $testClass + * @access public + */ + public function addTestSuite($testClass) { + if (is_string($testClass) && + class_exists($testClass)) { + $testClass = new ReflectionClass($testClass); + } + + if (is_object($testClass) && + $testClass instanceof ReflectionClass) { + $this->addTest(new PHPUnit2_Framework_TestSuite($testClass)); + } + } + + /** + * Wraps both addTest() and addTestSuite + * as well as the separate import statements for the user's convenience. + * + * If the named file cannot be read or there are no new tests that can be + * added, a PHPUnit2_Framework_Warning will be created instead, + * leaving the current test run untouched. + * + * @param string $filename + * @throws Exception + * @access public + * @since Method available since Release 2.3.0 + * @author Stefano F. Rausch + */ + public function addTestFile($filename) { + if (!is_string($filename) || !file_exists($filename)) { + throw new Exception; + } + + $declaredClasses = get_declared_classes(); + + PHPUnit2_Util_Fileloader::checkAndLoad($filename); + + $newClasses = array_values( + array_diff(get_declared_classes(), $declaredClasses) + ); + + $testsFound = 0; + + foreach ($newClasses as $class) { + if (preg_match('"Tests?$"', $class)) { + try { + $suiteMethod = new ReflectionMethod( + $class, PHPUnit2_Runner_BaseTestRunner::SUITE_METHODNAME + ); + + $this->addTest($suiteMethod->invoke(NULL)); + } catch (ReflectionException $e) { + $this->addTestSuite(new ReflectionClass($class)); + } + + $testsFound++; + } + } + + if ($testsFound == 0) { + $this->addTest( + new PHPUnit2_Framework_Warning('No tests found in file ' . $filename) + ); + } + } + + /** + * Wrapper for addTestFile() that adds multiple test files. + * + * @param Array $filenames + * @throws Exception + * @access public + * @since Method available since Release 2.3.0 + */ + public function addTestFiles($filenames) { + foreach ($filenames as $filename) { + $this->addTestFile($filename); + } + } + + /** + * Counts the number of test cases that will be run by this test. + * + * @return integer + * @access public + */ + public function countTestCases() { + $count = 0; + + foreach ($this->tests as $test) { + $count += $test->countTestCases(); + } + + return $count; + } + + /** + * @param ReflectionClass $theClass + * @param string $name + * @return PHPUnit2_Framework_Test + * @access public + * @static + */ + public static function createTest(ReflectionClass $theClass, $name) { + if (!$theClass->isInstantiable()) { + return self::warning( + sprintf( + 'Cannot instantiate test case %s.', + $theClass->getName() + ) + ); + } + + $constructor = $theClass->getConstructor(); + + if ($constructor !== NULL) { + $parameters = $constructor->getParameters(); + + if (sizeof($parameters) == 0) { + $test = $theClass->newInstance(); + + if ($test instanceof PHPUnit2_Framework_TestCase) { + $test->setName($name); + } + } + + else if (sizeof($parameters) == 1 && + $parameters[0]->getClass() === NULL) { + $test = $theClass->newInstance($name); + } + + else { + return self::warning( + sprintf( + 'Constructor of class %s is not TestCase($name) or TestCase().', + $theClass->getName() + ) + ); + } + } + + return $test; + } + + /** + * Creates a default TestResult object. + * + * @return PHPUnit2_Framework_TestResult + * @access protected + */ + protected function createResult() { + return new PHPUnit2_Framework_TestResult; + } + + /** + * Returns the name of the suite. + * + * @return string + * @access public + */ + public function getName() { + return $this->name; + } + + /** + * Runs the tests and collects their result in a TestResult. + * + * @param PHPUnit2_Framework_TestResult $result + * @return PHPUnit2_Framework_TestResult + * @throws Exception + * @access public + */ + public function run($result = NULL) { + if ($result === NULL) { + $result = $this->createResult(); + } + + // XXX: Workaround for missing ability to declare type-hinted parameters as optional. + else if (!($result instanceof PHPUnit2_Framework_TestResult)) { + throw new Exception( + 'Argument 1 must be an instance of PHPUnit2_Framework_TestResult.' + ); + } + + $result->startTestSuite($this); + + foreach ($this->tests as $test) { + if ($result->shouldStop()) { + break; + } + + $this->runTest($test, $result); + } + + $result->endTestSuite($this); + + return $result; + } + + /** + * Runs a test. + * + * @param PHPUnit2_Framework_Test $test + * @param PHPUnit2_Framework_TestResult $testResult + * @access public + */ + public function runTest(PHPUnit2_Framework_Test $test, PHPUnit2_Framework_TestResult $result) { + $test->run($result); + } + + /** + * Sets the name of the suite. + * + * @param string + * @access public + */ + public function setName($name) { + $this->name = $name; + } + + /** + * Returns the test at the given index. + * + * @param integer + * @return PHPUnit2_Framework_Test + * @access public + */ + public function testAt($index) { + if (isset($this->tests[$index])) { + return $this->tests[$index]; + } else { + return FALSE; + } + } + + /** + * Returns the number of tests in this suite. + * + * @return integer + * @access public + */ + public function testCount() { + return sizeof($this->tests); + } + + /** + * Returns the tests as an enumeration. + * + * @return array + * @access public + */ + public function tests() { + return $this->tests; + } + + /** + * @param ReflectionMethod $method + * @param array $names + * @param ReflectionClass $theClass + * @access private + */ + private function addTestMethod(ReflectionMethod $method, &$names, ReflectionClass $theClass) { + $name = $method->getName(); + + if (in_array($name, $names)) { + return; + } + + if ($this->isPublicTestMethod($method)) { + $names[] = $name; + + $this->addTest( + self::createTest( + $theClass, + $name + ) + ); + } + + else if ($this->isTestMethod($method)) { + $this->addTest( + self::warning( + sprintf( + 'Test method is not public: %s', + + $name + ) + ) + ); + } + } + + /** + * @param ReflectionMethod $method + * @return boolean + * @access private + */ + private function isPublicTestMethod(ReflectionMethod $method) { + return ($this->isTestMethod($method) && + $method->isPublic()); + } + + /** + * @param ReflectionMethod $method + * @return boolean + * @access private + */ + private function isTestMethod(ReflectionMethod $method) { + return (substr($method->name, 0, 4) == 'test'); + } + + /** + * @param string $message + * @return PHPUnit2_Framework_Warning + * @access private + */ + private static function warning($message) { + require_once 'PHPUnit2/Framework/Warning.php'; + return new PHPUnit2_Framework_Warning($message); + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/buildscripts/PHPUnit2/Framework/Warning.php b/buildscripts/PHPUnit2/Framework/Warning.php new file mode 100644 index 00000000..0ae885a4 --- /dev/null +++ b/buildscripts/PHPUnit2/Framework/Warning.php @@ -0,0 +1,94 @@ +. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Sebastian Bergmann nor the names of his + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Testing + * @package PHPUnit2 + * @author Sebastian Bergmann + * @copyright 2002-2006 Sebastian Bergmann + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version CVS: $Id: Warning.php,v 1.11.2.3 2005/12/17 16:04:56 sebastian Exp $ + * @link http://pear.php.net/package/PHPUnit2 + * @since File available since Release 2.0.0 + */ + +require_once 'PHPUnit2/Framework/TestCase.php'; + +/** + * A warning. + * + * @category Testing + * @package PHPUnit2 + * @author Sebastian Bergmann + * @copyright 2002-2006 Sebastian Bergmann + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version Release: @package_version@ + * @link http://pear.php.net/package/PHPUnit2 + * @since Class available since Release 2.0.0 + */ +class PHPUnit2_Framework_Warning extends PHPUnit2_Framework_TestCase { + /** + * @var string + * @access private + */ + private $message = ''; + + /** + * @param string $message + * @access public + */ + public function __construct($message = '') { + $this->message = $message; + parent::__construct('Warning'); + } + + /** + * @access protected + */ + protected function runTest() { + $this->fail($this->message); + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/buildscripts/PHPUnit2/Runner/BaseTestRunner.php b/buildscripts/PHPUnit2/Runner/BaseTestRunner.php new file mode 100644 index 00000000..b9517e5a --- /dev/null +++ b/buildscripts/PHPUnit2/Runner/BaseTestRunner.php @@ -0,0 +1,283 @@ +. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Sebastian Bergmann nor the names of his + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Testing + * @package PHPUnit2 + * @author Sebastian Bergmann + * @copyright 2002-2006 Sebastian Bergmann + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version CVS: $Id: BaseTestRunner.php,v 1.18.2.3 2005/12/17 16:04:56 sebastian Exp $ + * @link http://pear.php.net/package/PHPUnit2 + * @since File available since Release 2.0.0 + */ + +require_once 'PHPUnit2/Framework/AssertionFailedError.php'; +require_once 'PHPUnit2/Framework/TestListener.php'; +require_once 'PHPUnit2/Runner/StandardTestSuiteLoader.php'; + +/** + * Base class for all test runners. + * + * @category Testing + * @package PHPUnit2 + * @author Sebastian Bergmann + * @copyright 2002-2006 Sebastian Bergmann + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version Release: @package_version@ + * @link http://pear.php.net/package/PHPUnit2 + * @since Class available since Release 2.0.0 + * @abstract + */ +abstract class PHPUnit2_Runner_BaseTestRunner implements PHPUnit2_Framework_TestListener { + const STATUS_ERROR = 1; + const STATUS_FAILURE = 2; + const STATUS_INCOMPLETE = 3; + const SUITE_METHODNAME = 'suite'; + + /** + * An error occurred. + * + * @param PHPUnit2_Framework_Test $test + * @param Exception $e + * @access public + */ + public function addError(PHPUnit2_Framework_Test $test, Exception $e) { + $this->testFailed(self::STATUS_ERROR, $test, $e); + } + + /** + * A failure occurred. + * + * @param PHPUnit2_Framework_Test $test + * @param PHPUnit2_Framework_AssertionFailedError $e + * @access public + */ + public function addFailure(PHPUnit2_Framework_Test $test, PHPUnit2_Framework_AssertionFailedError $e) { + $this->testFailed(self::STATUS_FAILURE, $test, $e); + } + + /** + * Incomplete test. + * + * @param PHPUnit2_Framework_Test $test + * @param Exception $e + * @access public + */ + public function addIncompleteTest(PHPUnit2_Framework_Test $test, Exception $e) { + $this->testFailed(self::STATUS_INCOMPLETE, $test, $e); + } + + /** + * A testsuite started. + * + * @param PHPUnit2_Framework_TestSuite $suite + * @access public + * @since Method available since Release 2.2.0 + */ + public function startTestSuite(PHPUnit2_Framework_TestSuite $suite) { + } + + /** + * A testsuite ended. + * + * @param PHPUnit2_Framework_TestSuite $suite + * @access public + * @since Method available since Release 2.2.0 + */ + public function endTestSuite(PHPUnit2_Framework_TestSuite $suite) { + } + + /** + * A test started. + * + * @param PHPUnit2_Framework_Test $test + * @access public + */ + public function startTest(PHPUnit2_Framework_Test $test) { + $this->testStarted($test->getName()); + } + + /** + * A test ended. + * + * @param PHPUnit2_Framework_Test $test + * @access public + */ + public function endTest(PHPUnit2_Framework_Test $test) { + $this->testEnded($test->getName()); + } + + /** + * Returns the loader to be used. + * + * @return PHPUnit2_Runner_TestSuiteLoader + * @access public + */ + public function getLoader() { + return new PHPUnit2_Runner_StandardTestSuiteLoader; + } + + /** + * Returns the Test corresponding to the given suite. + * This is a template method, subclasses override + * the runFailed() and clearStatus() methods. + * + * @param string $suiteClassName + * @param string $suiteClassFile + * @return PHPUnit2_Framework_Test + * @access public + */ + public function getTest($suiteClassName, $suiteClassFile = '') { + if ($suiteClassFile == $suiteClassName . '.php') { + $suiteClassFile = ''; + } + + try { + $testClass = $this->loadSuiteClass($suiteClassName, $suiteClassFile); + } + + catch (Exception $e) { + $this->runFailed($e->getMessage()); + return NULL; + } + + try { + $suiteMethod = $testClass->getMethod(self::SUITE_METHODNAME); + + if (!$suiteMethod->isStatic()) { + $this->runFailed( + 'suite() method must be static.' + ); + + return NULL; + } + + try { + $test = $suiteMethod->invoke(NULL); + } + + catch (ReflectionException $e) { + $this->runFailed( + sprintf( + "Failed to invoke suite() method.\n%s", + + $e->getMessage() + ) + ); + + return NULL; + } + } + + catch (ReflectionException $e) { + $test = new PHPUnit2_Framework_TestSuite($testClass); + } + + $this->clearStatus(); + + return $test; + } + + /** + * Override to define how to handle a failed loading of + * a test suite. + * + * @param string $message + * @access protected + * @abstract + */ + protected abstract function runFailed($message); + + /** + * Returns the loaded ReflectionClass for a suite name. + * + * @param string $suiteClassName + * @param string $suiteClassFile + * @return ReflectionClass + * @access protected + */ + protected function loadSuiteClass($suiteClassName, $suiteClassFile = '') { + return $this->getLoader()->load($suiteClassName, $suiteClassFile); + } + + /** + * Clears the status message. + * + * @access protected + */ + protected function clearStatus() { + } + + /** + * A test started. + * + * @param string $testName + * @access public + * @abstract + */ + public abstract function testStarted($testName); + + /** + * A test ended. + * + * @param string $testName + * @access public + * @abstract + */ + public abstract function testEnded($testName); + + /** + * A test failed. + * + * @param integer $status + * @param PHPUnit2_Framework_Test $test + * @param PHPUnit2_Framework_AssertionFailedError $e + * @access public + * @abstract + */ + public abstract function testFailed($status, PHPUnit2_Framework_Test $test, PHPUnit2_Framework_AssertionFailedError $e); +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/buildscripts/PHPUnit2/Runner/IncludePathTestCollector.php b/buildscripts/PHPUnit2/Runner/IncludePathTestCollector.php new file mode 100644 index 00000000..116b20ed --- /dev/null +++ b/buildscripts/PHPUnit2/Runner/IncludePathTestCollector.php @@ -0,0 +1,184 @@ +. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Sebastian Bergmann nor the names of his + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Testing + * @package PHPUnit2 + * @author Sebastian Bergmann + * @copyright 2002-2006 Sebastian Bergmann + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version CVS: $Id: IncludePathTestCollector.php,v 1.13.2.5 2005/12/17 16:04:56 sebastian Exp $ + * @link http://pear.php.net/package/PHPUnit2 + * @since File available since Release 2.1.0 + */ + +if (!class_exists('AppendIterator')) { + class AppendIterator implements Iterator { + private $iterators; + + public function __construct() { + $this->iterators = new ArrayIterator(); + } + + public function __call($func, $params) { + return call_user_func_array(array($this->getInnerIterator(), $func), $params); + } + + public function append(Iterator $it) { + $this->iterators->append($it); + } + + public function getInnerIterator() { + return $this->iterators->current(); + } + + public function rewind() { + $this->iterators->rewind(); + + if ($this->iterators->valid()) { + $this->getInnerIterator()->rewind(); + } + } + + public function valid() { + return $this->iterators->valid() && $this->getInnerIterator()->valid(); + } + + public function current() { + return $this->iterators->valid() ? $this->getInnerIterator()->current() : NULL; + } + + public function key() { + return $this->iterators->valid() ? $this->getInnerIterator()->key() : NULL; + } + + public function next() { + if (!$this->iterators->valid()) return; + $this->getInnerIterator()->next(); + + if ($this->getInnerIterator()->valid()) return; + $this->iterators->next(); + + while ($this->iterators->valid()) { + $this->getInnerIterator()->rewind(); + + if ($this->getInnerIterator()->valid()) return; + $this->iterators->next(); + } + } + } +} + +require_once 'PHPUnit2/Runner/TestCollector.php'; + +require_once 'PEAR/Config.php'; + +/** + * An implementation of a TestCollector that consults the + * include path set in the php.ini. + * + * @category Testing + * @package PHPUnit2 + * @author Sebastian Bergmann + * @copyright 2002-2006 Sebastian Bergmann + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version Release: @package_version@ + * @link http://pear.php.net/package/PHPUnit2 + * @since Class available since Release 2.1.0 + */ + +class PHPUnit2_Runner_IncludePathTestCollector implements PHPUnit2_Runner_TestCollector { + /** + * @return array + * @access public + */ + public function collectTests() { + $config = new PEAR_Config; + $iterator = new AppendIterator; + $result = array(); + + if (substr(PHP_OS, 0, 3) == 'WIN') { + $delimiter = ';'; + } else { + $delimiter = ':'; + } + + $paths = explode($delimiter, ini_get('include_path')); + $paths[] = $config->get('test_dir'); + + foreach ($paths as $path) { + $iterator->append( + new RecursiveIteratorIterator( + new RecursiveDirectoryIterator($path) + ) + ); + } + + foreach ($iterator as $path => $file) { + if ($this->isTestClass($file)) { + if (substr(PHP_OS, 0, 3) == 'WIN') { + $path = str_replace('/', '\\', $path); + } + + $result[] = $path; + } + } + + return $result; + } + + /** + * Considers a file to contain a test class when it contains the + * pattern "Test" in its name and its name ends with ".php". + * + * @param string $classFileName + * @return boolean + * @access protected + */ + protected function isTestClass($classFileName) { + return (strpos($classFileName, 'Test') !== FALSE && substr($classFileName, -4) == '.php') ? TRUE : FALSE; + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/buildscripts/PHPUnit2/Runner/StandardTestSuiteLoader.php b/buildscripts/PHPUnit2/Runner/StandardTestSuiteLoader.php new file mode 100644 index 00000000..b0c359a0 --- /dev/null +++ b/buildscripts/PHPUnit2/Runner/StandardTestSuiteLoader.php @@ -0,0 +1,129 @@ +. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Sebastian Bergmann nor the names of his + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Testing + * @package PHPUnit2 + * @author Sebastian Bergmann + * @copyright 2002-2006 Sebastian Bergmann + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version CVS: $Id: StandardTestSuiteLoader.php,v 1.19.2.8 2005/12/17 16:04:56 sebastian Exp $ + * @link http://pear.php.net/package/PHPUnit2 + * @since File available since Release 2.0.0 + */ + +require_once 'PHPUnit2/Runner/TestSuiteLoader.php'; +require_once 'PHPUnit2/Util/Fileloader.php'; + +require_once 'PEAR/Config.php'; + +/** + * The standard test suite loader. + * + * @category Testing + * @package PHPUnit2 + * @author Sebastian Bergmann + * @copyright 2002-2006 Sebastian Bergmann + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version Release: @package_version@ + * @link http://pear.php.net/package/PHPUnit2 + * @since Class available since Release 2.0.0 + */ +class PHPUnit2_Runner_StandardTestSuiteLoader implements PHPUnit2_Runner_TestSuiteLoader { + /** + * @param string $suiteClassName + * @param string $suiteClassFile + * @return ReflectionClass + * @throws Exception + * @access public + */ + public function load($suiteClassName, $suiteClassFile = '') { + $suiteClassName = str_replace('.php', '', $suiteClassName); + $suiteClassFile = !empty($suiteClassFile) ? $suiteClassFile : str_replace('_', '/', $suiteClassName) . '.php'; + + if (!class_exists($suiteClassName)) { + if(!file_exists($suiteClassFile)) { + $config = new PEAR_Config; + + $includePaths = explode(PATH_SEPARATOR, get_include_path()); + $includePaths[] = $config->get('test_dir'); + + foreach ($includePaths as $includePath) { + $file = $includePath . DIRECTORY_SEPARATOR . $suiteClassFile; + + if (file_exists($file)) { + $suiteClassFile = $file; + break; + } + } + } + + PHPUnit2_Util_Fileloader::checkAndLoad($suiteClassFile); + } + + if (class_exists($suiteClassName)) { + return new ReflectionClass($suiteClassName); + } else { + throw new Exception( + sprintf( + 'Class %s could not be found in %s.', + + $suiteClassName, + $suiteClassFile + ) + ); + } + } + + /** + * @param ReflectionClass $aClass + * @return ReflectionClass + * @access public + */ + public function reload(ReflectionClass $aClass) { + return $aClass; + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/buildscripts/PHPUnit2/Runner/TestCollector.php b/buildscripts/PHPUnit2/Runner/TestCollector.php new file mode 100644 index 00000000..38a9ce81 --- /dev/null +++ b/buildscripts/PHPUnit2/Runner/TestCollector.php @@ -0,0 +1,77 @@ +. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Sebastian Bergmann nor the names of his + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Testing + * @package PHPUnit2 + * @author Sebastian Bergmann + * @copyright 2002-2006 Sebastian Bergmann + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version CVS: $Id: TestCollector.php,v 1.7.2.2 2005/12/17 16:04:56 sebastian Exp $ + * @link http://pear.php.net/package/PHPUnit2 + * @since File available since Release 2.0.0 + */ + +/** + * Collects Test class names to be presented + * by the TestSelector. + * + * @category Testing + * @package PHPUnit2 + * @author Sebastian Bergmann + * @copyright 2002-2006 Sebastian Bergmann + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version Release: @package_version@ + * @link http://pear.php.net/package/PHPUnit2 + * @since Interface available since Release 2.0.0 + */ +interface PHPUnit2_Runner_TestCollector { + /** + * @return array + * @access public + */ + public function collectTests(); +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/buildscripts/PHPUnit2/Runner/TestSuiteLoader.php b/buildscripts/PHPUnit2/Runner/TestSuiteLoader.php new file mode 100644 index 00000000..711a03d2 --- /dev/null +++ b/buildscripts/PHPUnit2/Runner/TestSuiteLoader.php @@ -0,0 +1,85 @@ +. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Sebastian Bergmann nor the names of his + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Testing + * @package PHPUnit2 + * @author Sebastian Bergmann + * @copyright 2002-2006 Sebastian Bergmann + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version CVS: $Id: TestSuiteLoader.php,v 1.11.2.2 2005/12/17 16:04:56 sebastian Exp $ + * @link http://pear.php.net/package/PHPUnit2 + * @since File available since Release 2.0.0 + */ + +/** + * An interface to define how a test suite should be loaded. + * + * @category Testing + * @package PHPUnit2 + * @author Sebastian Bergmann + * @copyright 2002-2006 Sebastian Bergmann + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version Release: @package_version@ + * @link http://pear.php.net/package/PHPUnit2 + * @since Interface available since Release 2.0.0 + */ +interface PHPUnit2_Runner_TestSuiteLoader { + /** + * @param string $suiteClassName + * @param string $suiteClassFile + * @return ReflectionClass + * @access public + */ + public function load($suiteClassName, $suiteClassFile = ''); + + /** + * @param ReflectionClass $aClass + * @return ReflectionClass + * @access public + */ + public function reload(ReflectionClass $aClass); +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/buildscripts/PHPUnit2/Runner/Version.php b/buildscripts/PHPUnit2/Runner/Version.php new file mode 100644 index 00000000..5a0f7785 --- /dev/null +++ b/buildscripts/PHPUnit2/Runner/Version.php @@ -0,0 +1,90 @@ +. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Sebastian Bergmann nor the names of his + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Testing + * @package PHPUnit2 + * @author Sebastian Bergmann + * @copyright 2002-2006 Sebastian Bergmann + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version CVS: $Id: Version.php,v 1.7.2.2 2005/12/17 16:04:56 sebastian Exp $ + * @link http://pear.php.net/package/PHPUnit2 + * @since File available since Release 2.0.0 + */ + +/** + * This class defines the current version of PHPUnit. + * + * @category Testing + * @package PHPUnit2 + * @author Sebastian Bergmann + * @copyright 2002-2006 Sebastian Bergmann + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version Release: @package_version@ + * @link http://pear.php.net/package/PHPUnit2 + * @since Class available since Release 2.0.0 + */ +class PHPUnit2_Runner_Version { + /** + * Returns the current version of PHPUnit. + * + * @return string + * @access public + * @static + */ + public static function id() { + return '@package_version@'; + } + + /** + * @return string + * @access public + * @static + */ + public static function getVersionString() { + return 'PHPUnit @package_version@ by Sebastian Bergmann.'; + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/buildscripts/PHPUnit2/TextUI/ResultPrinter.php b/buildscripts/PHPUnit2/TextUI/ResultPrinter.php new file mode 100644 index 00000000..32d3e667 --- /dev/null +++ b/buildscripts/PHPUnit2/TextUI/ResultPrinter.php @@ -0,0 +1,356 @@ +. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Sebastian Bergmann nor the names of his + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Testing + * @package PHPUnit2 + * @author Sebastian Bergmann + * @copyright 2002-2006 Sebastian Bergmann + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version CVS: $Id: ResultPrinter.php,v 1.20.2.5 2005/12/17 16:04:57 sebastian Exp $ + * @link http://pear.php.net/package/PHPUnit2 + * @since File available since Release 2.0.0 + */ + +require_once 'PHPUnit2/Framework/TestListener.php'; +require_once 'PHPUnit2/Framework/TestFailure.php'; +require_once 'PHPUnit2/Util/Filter.php'; +require_once 'PHPUnit2/Util/Printer.php'; + +/** + * Prints the result of a TextUI TestRunner run. + * + * @category Testing + * @package PHPUnit2 + * @author Sebastian Bergmann + * @copyright 2002-2006 Sebastian Bergmann + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version Release: @package_version@ + * @link http://pear.php.net/package/PHPUnit2 + * @since Class available since Release 2.0.0 + */ +class PHPUnit2_TextUI_ResultPrinter extends PHPUnit2_Util_Printer implements PHPUnit2_Framework_TestListener { + /** + * @var integer + * @access private + */ + private $column = 0; + + /** + * @var boolean + * @access private + */ + private $lastTestFailed = FALSE; + + /** + * @param PHPUnit2_Framework_TestResult $result + * @param float $runTime + * @access public + */ + public function printResult(PHPUnit2_Framework_TestResult $result, $timeElapsed) { + $this->printHeader($timeElapsed); + $this->printErrors($result); + $this->printFailures($result); + $this->printIncompletes($result); + $this->printFooter($result); + } + + /** + * @param array $defects + * @param integer $count + * @param string $type + * @access protected + */ + protected function printDefects($defects, $count, $type) { + if ($count == 0) { + return; + } + + $this->write( + sprintf( + "There %s %d %s%s:\n", + + ($count == 1) ? 'was' : 'were', + $count, + $type, + ($count == 1) ? '' : 's' + ) + ); + + $i = 1; + + foreach ($defects as $defect) { + $this->printDefect($defect, $i++); + } + } + + /** + * @param PHPUnit2_Framework_TestFailure $defect + * @param integer $count + * @access protected + */ + protected function printDefect(PHPUnit2_Framework_TestFailure $defect, $count) { + $this->printDefectHeader($defect, $count); + $this->printDefectTrace($defect); + } + + /** + * @param PHPUnit2_Framework_TestFailure $defect + * @param integer $count + * @access protected + */ + protected function printDefectHeader(PHPUnit2_Framework_TestFailure $defect, $count) { + $this->write( + sprintf( + "%d) %s\n", + + $count, + $defect->failedTest()->toString() + ) + ); + } + + /** + * @param PHPUnit2_Framework_TestFailure $defect + * @access protected + */ + protected function printDefectTrace(PHPUnit2_Framework_TestFailure $defect) { + $e = $defect->thrownException(); + $message = method_exists($e, 'toString') ? $e->toString() : $e->getMessage(); + + $this->write($message . "\n"); + + $this->write( + PHPUnit2_Util_Filter::getFilteredStacktrace( + $defect->thrownException() + ) + ); + } + + /** + * @param PHPUnit2_Framework_TestResult $result + * @access protected + */ + protected function printErrors(PHPUnit2_Framework_TestResult $result) { + $this->printDefects($result->errors(), $result->errorCount(), 'error'); + } + + /** + * @param PHPUnit2_Framework_TestResult $result + * @access protected + */ + protected function printFailures(PHPUnit2_Framework_TestResult $result) { + $this->printDefects($result->failures(), $result->failureCount(), 'failure'); + } + + /** + * @param PHPUnit2_Framework_TestResult $result + * @access protected + */ + protected function printIncompletes(PHPUnit2_Framework_TestResult $result) { + $this->printDefects($result->notImplemented(), $result->notImplementedCount(), 'incomplete test case'); + } + + /** + * @param float $timeElapsed + * @access protected + */ + protected function printHeader($timeElapsed) { + $this->write( + sprintf( + "\n\nTime: %s\n", + + $timeElapsed + ) + ); + } + + /** + * @param PHPUnit2_Framework_TestResult $result + * @access protected + */ + protected function printFooter(PHPUnit2_Framework_TestResult $result) { + if ($result->allCompletlyImplemented() && + $result->wasSuccessful()) { + $this->write( + sprintf( + "\nOK (%d test%s)\n", + + $result->runCount(), + ($result->runCount() == 1) ? '' : 's' + ) + ); + } + + else if (!$result->allCompletlyImplemented() && + $result->wasSuccessful()) { + $this->write( + sprintf( + "\nOK, but incomplete test cases!!!\nTests run: %d, Incomplete Tests: %d.\n", + + $result->runCount(), + $result->notImplementedCount() + ) + ); + } + + else { + $this->write( + sprintf( + "\nFAILURES!!!\nTests run: %d, Failures: %d, Errors: %d, Incomplete Tests: %d.\n", + + $result->runCount(), + $result->failureCount(), + $result->errorCount(), + $result->notImplementedCount() + ) + ); + } + } + + /** + * @access public + */ + public function printWaitPrompt() { + $this->write("\n to continue\n"); + } + + /** + * An error occurred. + * + * @param PHPUnit2_Framework_Test $test + * @param Exception $e + * @access public + */ + public function addError(PHPUnit2_Framework_Test $test, Exception $e) { + $this->write('E'); + $this->nextColumn(); + + $this->lastTestFailed = TRUE; + } + + /** + * A failure occurred. + * + * @param PHPUnit2_Framework_Test $test + * @param PHPUnit2_Framework_AssertionFailedError $e + * @access public + */ + public function addFailure(PHPUnit2_Framework_Test $test, PHPUnit2_Framework_AssertionFailedError $e) { + $this->write('F'); + $this->nextColumn(); + + $this->lastTestFailed = TRUE; + } + + /** + * Incomplete test. + * + * @param PHPUnit2_Framework_Test $test + * @param Exception $e + * @access public + */ + public function addIncompleteTest(PHPUnit2_Framework_Test $test, Exception $e) { + $this->write('I'); + $this->nextColumn(); + + $this->lastTestFailed = TRUE; + } + + /** + * A testsuite started. + * + * @param PHPUnit2_Framework_TestSuite $suite + * @access public + * @since Method available since Release 2.2.0 + */ + public function startTestSuite(PHPUnit2_Framework_TestSuite $suite) { + } + + /** + * A testsuite ended. + * + * @param PHPUnit2_Framework_TestSuite $suite + * @access public + * @since Method available since Release 2.2.0 + */ + public function endTestSuite(PHPUnit2_Framework_TestSuite $suite) { + } + + /** + * A test started. + * + * @param PHPUnit2_Framework_Test $test + * @access public + */ + public function startTest(PHPUnit2_Framework_Test $test) { + } + + /** + * A test ended. + * + * @param PHPUnit2_Framework_Test $test + * @access public + */ + public function endTest(PHPUnit2_Framework_Test $test) { + if (!$this->lastTestFailed) { + $this->write('.'); + $this->nextColumn(); + } + + $this->lastTestFailed = FALSE; + } + + /** + * @access protected + */ + protected function nextColumn() { + if ($this->column++ >= 40) { + $this->column = 0; + $this->write("\n"); + } + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/buildscripts/PHPUnit2/TextUI/TestRunner.php b/buildscripts/PHPUnit2/TextUI/TestRunner.php new file mode 100644 index 00000000..63639a24 --- /dev/null +++ b/buildscripts/PHPUnit2/TextUI/TestRunner.php @@ -0,0 +1,622 @@ +. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Sebastian Bergmann nor the names of his + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Testing + * @package PHPUnit2 + * @author Sebastian Bergmann + * @copyright 2002-2006 Sebastian Bergmann + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version CVS: $Id: TestRunner.php,v 1.64.2.5 2005/12/17 16:04:58 sebastian Exp $ + * @link http://pear.php.net/package/PHPUnit2 + * @since File available since Release 2.0.0 + */ + +if (!defined('PHPUnit2_MAIN_METHOD')) { + define('PHPUnit2_MAIN_METHOD', 'PHPUnit2_TextUI_TestRunner::main'); +} + +require_once 'PHPUnit2/Framework/TestSuite.php'; +require_once 'PHPUnit2/Runner/Version.php'; +require_once 'PHPUnit2/Runner/BaseTestRunner.php'; +require_once 'PHPUnit2/TextUI/ResultPrinter.php'; +require_once 'PHPUnit2/Util/Fileloader.php'; + +require_once 'Console/Getopt.php'; +require_once 'Benchmark/Timer.php'; + +/** + * A TestRunner for the Command Line Interface (CLI) + * PHP SAPI Module. + * + * @category Testing + * @package PHPUnit2 + * @author Sebastian Bergmann + * @copyright 2002-2006 Sebastian Bergmann + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version Release: @package_version@ + * @link http://pear.php.net/package/PHPUnit2 + * @since Class available since Release 2.0.0 + */ +class PHPUnit2_TextUI_TestRunner extends PHPUnit2_Runner_BaseTestRunner { + const SUCCESS_EXIT = 0; + const FAILURE_EXIT = 1; + const EXCEPTION_EXIT = 2; + + /** + * @var PHPUnit2_Runner_TestSuiteLoader + * @access private + */ + private $loader = NULL; + + /** + * @var PHPUnit2_TextUI_ResultPrinter + * @access private + */ + private $printer = NULL; + + /** + * @var boolean + * @access private + * @static + */ + private static $versionStringPrinted = FALSE; + + /** + * @access public + * @static + */ + public static function main() { + $aTestRunner = new PHPUnit2_TextUI_TestRunner; + + try { + $result = $aTestRunner->start($_SERVER['argv']); + + if (!$result->wasSuccessful()) { + exit(self::FAILURE_EXIT); + } + + exit(self::SUCCESS_EXIT); + } + + catch (Exception $e) { + self::printVersionString(); + print $e->getMessage(); + exit(self::EXCEPTION_EXIT); + } + } + + /** + * @param array $arguments + * @throws Exception + * @access protected + */ + protected function start($arguments) { + $coverageDataFile = FALSE; + $coverageHTMLFile = FALSE; + $coverageTextFile = FALSE; + $testdoxHTMLFile = FALSE; + $testdoxTextFile = FALSE; + $xmlLogfile = FALSE; + $wait = FALSE; + + $possibleOptions = array( + 'help', + 'loader=', + 'log-xml=', + 'skeleton', + 'testdox-html=', + 'testdox-text=', + 'version', + 'wait' + ); + + if (extension_loaded('xdebug')) { + $possibleOptions[] = 'coverage-data='; + $possibleOptions[] = 'coverage-html='; + $possibleOptions[] = 'coverage-text='; + } + + $options = Console_Getopt::getopt( + $arguments, + '', + $possibleOptions + ); + + if (PEAR::isError($options)) { + $this->showError($options->getMessage()); + } + + $test = isset($options[1][0]) ? $options[1][0] : FALSE; + $testFile = isset($options[1][1]) ? $options[1][1] : $test . '.php'; + + foreach ($options[0] as $option) { + switch ($option[0]) { + case '--coverage-data': { + $coverageDataFile = $option[1]; + } + break; + + case '--coverage-html': { + $coverageHTMLFile = $option[1]; + } + break; + + case '--coverage-text': { + $coverageTextFile = $option[1]; + } + break; + + case '--help': { + $this->showHelp(); + exit(self::SUCCESS_EXIT); + } + break; + + case '--testdox-html': { + $testdoxHTMLFile = $option[1]; + } + break; + + case '--testdox-text': { + $testdoxTextFile = $option[1]; + } + break; + + case '--loader': { + if (!class_exists($option[1])) { + PHPUnit2_Util_Fileloader::checkAndLoad( + str_replace('_', '/', $option[1]) . '.php' + ); + } + + if (class_exists($option[1])) { + $class = new ReflectionClass($option[1]); + + if ($class->implementsInterface('PHPUnit2_Runner_TestSuiteLoader') && + $class->isInstantiable()) { + $this->loader = $class->newInstance(); + } + } + + if ($this->loader === NULL) { + $this->showError( + sprintf( + 'Could not use "%s" as loader.', + + $option[1] + ) + ); + } + } + break; + + case '--log-xml': { + $xmlLogfile = $option[1]; + } + break; + + case '--skeleton': { + if ($test !== FALSE) { + self::printVersionString(); + + try { + require_once 'PHPUnit2/Util/Skeleton.php'; + + $skeleton = new PHPUnit2_Util_Skeleton($test, $testFile); + $skeleton->write(); + } + + catch (Exception $e) { + print $e->getMessage() . "\n"; + + printf( + "Could not write test class skeleton for %s to %s.\n", + $test, + $test . 'Test.php' + ); + + exit(self::FAILURE_EXIT); + } + + printf( + "Wrote test class skeleton for %s to %s.\n", + $test, + $test . 'Test.php' + ); + + exit(self::SUCCESS_EXIT); + } + } + break; + + case '--version': { + self::printVersionString(); + exit(self::SUCCESS_EXIT); + } + break; + + case '--wait': { + $wait = TRUE; + } + break; + } + } + + if ($test === FALSE) { + $this->showHelp(); + + exit(self::SUCCESS_EXIT); + } + + try { + return $this->doRun( + $this->getTest($test, $testFile), + $coverageDataFile, + $coverageHTMLFile, + $coverageTextFile, + $testdoxHTMLFile, + $testdoxTextFile, + $xmlLogfile, + $wait + ); + } + + catch (Exception $e) { + throw new Exception( + 'Could not create and run test suite: ' . $e->getMessage() + ); + } + } + + /** + * @param mixed $test + * @param mixed $coverageDataFile + * @param mixed $testdoxHTMLFile + * @param mixed $testdoxTextFile + * @param mixed $xmlLogfile + * @param boolean $wait + * @access public + * @static + */ + public static function run($test, $coverageDataFile = FALSE, $coverageHTMLFile = FALSE, $coverageTextFile = FALSE, $testdoxHTMLFile = FALSE, $testdoxTextFile = FALSE, $xmlLogfile = FALSE, $wait = FALSE) { + if ($test instanceof ReflectionClass) { + $test = new PHPUnit2_Framework_TestSuite($test); + } + + if ($test instanceof PHPUnit2_Framework_Test) { + $aTestRunner = new PHPUnit2_TextUI_TestRunner; + + return $aTestRunner->doRun( + $test, + $coverageDataFile, + $coverageHTMLFile, + $coverageTextFile, + $testdoxHTMLFile, + $testdoxTextFile, + $xmlLogfile, + $wait + ); + } + } + + /** + * Runs a single test and waits until the user types RETURN. + * + * @param PHPUnit2_Framework_Test $suite + * @access public + * @static + */ + public static function runAndWait(PHPUnit2_Framework_Test $suite) { + $aTestRunner = new PHPUnit2_TextUI_TestRunner; + + $aTestRunner->doRun( + $suite, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + TRUE + ); + } + + /** + * @return PHPUnit2_Framework_TestResult + * @access protected + */ + protected function createTestResult() { + return new PHPUnit2_Framework_TestResult; + } + + /** + * @param PHPUnit2_Framework_Test $suite + * @param mixed $coverageDataFile + * @param mixed $coverageHTMLFile + * @param mixed $coverageTextFile + * @param mixed $testdoxHTMLFile + * @param mixed $testdoxTextFile + * @param mixed $xmlLogfile + * @param boolean $wait + * @return PHPUnit2_Framework_TestResult + * @access public + */ + public function doRun(PHPUnit2_Framework_Test $suite, $coverageDataFile = FALSE, $coverageHTMLFile = FALSE, $coverageTextFile = FALSE, $testdoxHTMLFile = FALSE, $testdoxTextFile = FALSE, $xmlLogfile = FALSE, $wait = FALSE) { + $result = $this->createTestResult(); + $timer = new Benchmark_Timer; + + if ($this->printer === NULL) { + $this->printer = new PHPUnit2_TextUI_ResultPrinter; + } + + $this->printer->write( + PHPUnit2_Runner_Version::getVersionString() . "\n\n" + ); + + $result->addListener($this->printer); + + if ($testdoxHTMLFile !== FALSE || $testdoxTextFile !== FALSE) { + require_once 'PHPUnit2/Util/TestDox/ResultPrinter.php'; + + if ($testdoxHTMLFile !== FALSE) { + $result->addListener( + PHPUnit2_Util_TestDox_ResultPrinter::factory( + 'HTML', + $testdoxHTMLFile + ) + ); + } + + if ($testdoxTextFile !== FALSE) { + $result->addListener( + PHPUnit2_Util_TestDox_ResultPrinter::factory( + 'Text', + $testdoxTextFile + ) + ); + } + } + + if ($xmlLogfile !== FALSE) { + require_once 'PHPUnit2/Util/Log/XML.php'; + + $result->addListener( + new PHPUnit2_Util_Log_XML($xmlLogfile) + ); + } + + if ($coverageDataFile !== FALSE || + $coverageHTMLFile !== FALSE || + $coverageTextFile !== FALSE) { + $result->collectCodeCoverageInformation(TRUE); + } + + $timer->start(); + $suite->run($result); + $timer->stop(); + $timeElapsed = $timer->timeElapsed(); + + $this->pause($wait); + + $this->printer->printResult($result, $timeElapsed); + + $this->handleCodeCoverageInformation( + $result, + $coverageDataFile, + $coverageHTMLFile, + $coverageTextFile + ); + + return $result; + } + + /** + * Returns the loader to be used. + * + * @return PHPUnit2_Runner_TestSuiteLoader + * @access public + * @since Method available since Release 2.2.0 + */ + public function getLoader() { + if ($this->loader === NULL) { + $this->loader = new PHPUnit2_Runner_StandardTestSuiteLoader; + } + + return $this->loader; + } + + /** + * @param PHPUnit2_Framework_TestResult $result + * @param mixed $coverageDataFile + * @param mixed $coverageHTMLFile + * @param mixed $coverageTextFile + * @access protected + * @since Method available since Release 2.1.0 + */ + protected function handleCodeCoverageInformation(PHPUnit2_Framework_TestResult $result, $coverageDataFile, $coverageHTMLFile, $coverageTextFile) { + if ($coverageDataFile !== FALSE && + $fp = fopen($coverageDataFile, 'w')) { + fputs($fp, serialize($result->getCodeCoverageInformation())); + fclose($fp); + } + + if ($coverageHTMLFile !== FALSE || $coverageTextFile !== FALSE) { + require_once 'PHPUnit2/Util/CodeCoverage/Renderer.php'; + + if ($coverageHTMLFile !== FALSE) { + $renderer = PHPUnit2_Util_CodeCoverage_Renderer::factory( + 'HTML', + $result->getCodeCoverageInformation() + ); + + $renderer->renderToFile($coverageHTMLFile); + } + + if ($coverageTextFile !== FALSE) { + $renderer = PHPUnit2_Util_CodeCoverage_Renderer::factory( + 'Text', + $result->getCodeCoverageInformation() + ); + + $renderer->renderToFile($coverageTextFile); + } + } + } + + /** + * @access public + */ + public function showError($message) { + self::printVersionString(); + print $message . "\n"; + + exit(self::FAILURE_EXIT); + } + + /** + * @access public + */ + public function showHelp() { + self::printVersionString(); + print "Usage: phpunit [switches] UnitTest [UnitTest.php]\n"; + + if (extension_loaded('xdebug')) { + print " --coverage-data Write Code Coverage data in raw format to file.\n" . + " --coverage-html Write Code Coverage data in HTML format to file.\n" . + " --coverage-text Write Code Coverage data in text format to file.\n\n"; + } + + print " --testdox-html Write agile documentation in HTML format to file.\n" . + " --testdox-text Write agile documentation in Text format to file.\n" . + " --log-xml Log test progress in XML format to file.\n\n"; + + print " --loader TestSuiteLoader implementation to use.\n\n" . + " --skeleton Generate skeleton UnitTest class for Unit in Unit.php.\n\n" . + " --wait Waits for a keystroke after each test.\n\n" . + " --help Prints this usage information.\n" . + " --version Prints the version and exits.\n"; + } + + /** + * @param boolean $wait + * @access protected + */ + protected function pause($wait) { + if (!$wait) { + return; + } + + $this->printer->printWaitPrompt(); + + fgets(STDIN); + } + + /** + * @param PHPUnit2_TextUI_ResultPrinter $resultPrinter + * @access public + */ + public function setPrinter(PHPUnit2_TextUI_ResultPrinter $resultPrinter) { + $this->printer = $resultPrinter; + } + + /** + * A test started. + * + * @param string $testName + * @access public + */ + public function testStarted($testName) { + } + + /** + * A test ended. + * + * @param string $testName + * @access public + */ + public function testEnded($testName) { + } + + /** + * A test failed. + * + * @param integer $status + * @param PHPUnit2_Framework_Test $test + * @param PHPUnit2_Framework_AssertionFailedError $e + * @access public + */ + public function testFailed($status, PHPUnit2_Framework_Test $test, PHPUnit2_Framework_AssertionFailedError $e) { + } + + /** + * Override to define how to handle a failed loading of + * a test suite. + * + * @param string $message + * @access protected + */ + protected function runFailed($message) { + self::printVersionString(); + print $message; + exit(self::FAILURE_EXIT); + } + + /** + * @access private + * @since Method available since Release 2.2.0 + */ + private static function printVersionString() { + if (!self::$versionStringPrinted) { + print PHPUnit2_Runner_Version::getVersionString() . "\n\n"; + self::$versionStringPrinted = TRUE; + } + } +} + +if (PHPUnit2_MAIN_METHOD == 'PHPUnit2_TextUI_TestRunner::main') { + PHPUnit2_TextUI_TestRunner::main(); +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/buildscripts/PHPUnit2/Util/CodeCoverage/Renderer.php b/buildscripts/PHPUnit2/Util/CodeCoverage/Renderer.php new file mode 100644 index 00000000..cbcdda51 --- /dev/null +++ b/buildscripts/PHPUnit2/Util/CodeCoverage/Renderer.php @@ -0,0 +1,225 @@ +. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Sebastian Bergmann nor the names of his + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Testing + * @package PHPUnit2 + * @author Sebastian Bergmann + * @copyright 2002-2006 Sebastian Bergmann + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version CVS: $Id: Renderer.php,v 1.8.2.7 2006/02/25 17:02:23 sebastian Exp $ + * @link http://pear.php.net/package/PHPUnit2 + * @since File available since Release 2.3.0 + */ + +/** + * Abstract base class for Code Coverage renderers. + * + * @category Testing + * @package PHPUnit2 + * @author Sebastian Bergmann + * @copyright 2002-2006 Sebastian Bergmann + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version Release: @package_version@ + * @link http://pear.php.net/package/PHPUnit2 + * @since Class available since Release 2.1.0 + * @abstract + */ +abstract class PHPUnit2_Util_CodeCoverage_Renderer { + /** + * @var array + * @access protected + */ + protected $codeCoverageInformation; + + /** + * Constructor. + * + * @param array $codeCoverageInformation + * @access protected + */ + protected function __construct($codeCoverageInformation) { + $this->codeCoverageInformation = $codeCoverageInformation; + } + + /** + * Abstract Factory. + * + * @param string $rendererName + * @param array $codeCoverageInformation + * @throws Exception + * @access public + */ + public function factory($rendererName, $codeCoverageInformation) { + require_once 'PHPUnit2/Util/CodeCoverage/Renderer/' . $rendererName . '.php'; + + $class = 'PHPUnit2_Util_CodeCoverage_Renderer_' . $rendererName; + return new $class($codeCoverageInformation); + } + + /** + * Visualizes the result array of + * PHPUnit2_Framework_TestResult::getCodeCoverageInformation(). + * + * @return string + * @access public + * @final + */ + public final function render() { + $buffer = $this->header(); + + foreach ($this->getSummary() as $sourceFile => $executedLines) { + if (file_exists($sourceFile)) { + $buffer .= $this->startSourceFile($sourceFile); + $buffer .= $this->renderSourceFile(file($sourceFile), $executedLines); + $buffer .= $this->endSourceFile($sourceFile); + } + } + + return $buffer . $this->footer(); + } + + /** + * Visualizes the result array of + * PHPUnit2_Framework_TestResult::getCodeCoverageInformation() + * and writes it to a file. + * + * @param string $filename + * @access public + * @since Method available since Release 2.2.0 + */ + public function renderToFile($filename) { + if ($fp = fopen($filename, 'w')) { + fputs( + $fp, + $this->render() + ); + + fclose($fp); + } + } + + /** + * Returns summarized Code Coverage data. + * + * Format of the result array: + * + * + * array( + * "/tested/code.php" => array( + * linenumber => flag + * ) + * ) + * + * + * flag > 0: line was executed. + * flag < 0: line is executable but was not executed. + * + * @return array + * @access protected + * @since Method available since Release 2.2.0 + */ + protected function getSummary() { + $summary = array(); + + foreach ($this->codeCoverageInformation as $testCaseName => $sourceFiles) { + foreach ($sourceFiles as $sourceFile => $executedLines) { + foreach ($executedLines as $lineNumber => $flag) { + if (!isset($summary[$sourceFile][$lineNumber])) { + $summary[$sourceFile][$lineNumber] = $flag; + } + + else if ($flag > 0) { + $summary[$sourceFile][$lineNumber] = $flag; + } + } + } + } + + return $summary; + } + + /** + * @return string + * @access protected + * @since Method available since Release 2.1.1 + */ + protected function header() { + } + + /** + * @return string + * @access protected + * @since Method available since Release 2.1.1 + */ + protected function footer() { + } + + /** + * @param string $sourceFile + * @return string + * @access protected + */ + protected function startSourceFile($sourceFile) { + } + + /** + * @param string $sourceFile + * @return string + * @access protected + */ + protected function endSourceFile($sourceFile) { + } + + /** + * @param array $codeLines + * @param array $executedLines + * @return string + * @access protected + * @abstract + */ + abstract protected function renderSourceFile($codeLines, $executedLines); +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/buildscripts/PHPUnit2/Util/CodeCoverage/Renderer/HTML.php b/buildscripts/PHPUnit2/Util/CodeCoverage/Renderer/HTML.php new file mode 100644 index 00000000..66fc4d13 --- /dev/null +++ b/buildscripts/PHPUnit2/Util/CodeCoverage/Renderer/HTML.php @@ -0,0 +1,191 @@ +. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Sebastian Bergmann nor the names of his + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Testing + * @package PHPUnit2 + * @author Sebastian Bergmann + * @copyright 2002-2006 Sebastian Bergmann + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version CVS: $Id: HTML.php,v 1.7.2.3 2005/12/17 16:04:58 sebastian Exp $ + * @link http://pear.php.net/package/PHPUnit2 + * @since File available since Release 2.3.0 + */ + +require_once 'PHPUnit2/Util/CodeCoverage/Renderer.php'; + +/** + * Renders Code Coverage information in HTML format. + * + * Formatting of the generated HTML can be achieved through + * CSS (codecoverage.css). + * + * Example + * + * + * td.ccLineNumber, td.ccCoveredLine, td.ccUncoveredLine, td.ccNotExecutableLine { + * font-family: monospace; + * white-space: pre; + * } + * + * td.ccLineNumber, td.ccCoveredLine { + * background-color: #aaaaaa; + * } + * + * td.ccNotExecutableLine { + * color: #aaaaaa; + * } + * + * + * @category Testing + * @package PHPUnit2 + * @author Sebastian Bergmann + * @copyright 2002-2006 Sebastian Bergmann + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version Release: @package_version@ + * @link http://pear.php.net/package/PHPUnit2 + * @since Class available since Release 2.1.0 + */ +class PHPUnit2_Util_CodeCoverage_Renderer_HTML extends PHPUnit2_Util_CodeCoverage_Renderer { + const pageHeader = +' + + + + + + +'; + + const pageFooter = +' + +'; + + const sourceFileHeader = +' +'; + + const sourceFileFooter = +'
+'; + + const codeLine = +' %s%s +'; + + /** + * @return string + * @access protected + * @since Method available since Release 2.1.1 + */ + protected function header() { + return self::pageHeader; + } + + /** + * @return string + * @access protected + * @since Method available since Release 2.1.1 + */ + protected function footer() { + return self::pageFooter; + } + + /** + * @param string $sourceFile + * @return string + * @access protected + */ + protected function startSourceFile($sourceFile) { + return self::sourceFileHeader; + } + + /** + * @param string $sourceFile + * @return string + * @access protected + */ + protected function endSourceFile($sourceFile) { + return self::sourceFileFooter; + } + + /** + * @param array $codeLines + * @param array $executedLines + * @return string + * @access protected + */ + protected function renderSourceFile($codeLines, $executedLines) { + $buffer = ''; + $line = 1; + + foreach ($codeLines as $codeLine) { + $lineStyle = 'ccNotExecutableLine'; + + if (isset($executedLines[$line])) { + if ($executedLines[$line] > 0) { + $lineStyle = 'ccCoveredLine'; + } else { + $lineStyle = 'ccUncoveredLine'; + } + } + + $buffer .= sprintf( + self::codeLine, + + $line, + $lineStyle, + htmlspecialchars(rtrim($codeLine)) + ); + + $line++; + } + + return $buffer; + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/buildscripts/PHPUnit2/Util/CodeCoverage/Renderer/Text.php b/buildscripts/PHPUnit2/Util/CodeCoverage/Renderer/Text.php new file mode 100644 index 00000000..6b083692 --- /dev/null +++ b/buildscripts/PHPUnit2/Util/CodeCoverage/Renderer/Text.php @@ -0,0 +1,125 @@ +. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Sebastian Bergmann nor the names of his + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Testing + * @package PHPUnit2 + * @author Sebastian Bergmann + * @copyright 2002-2006 Sebastian Bergmann + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version CVS: $Id: Text.php,v 1.6.2.3 2005/12/17 16:04:58 sebastian Exp $ + * @link http://pear.php.net/package/PHPUnit2 + * @since File available since Release 2.3.0 + */ + +require_once 'PHPUnit2/Util/CodeCoverage/Renderer.php'; + +/** + * Renders Code Coverage information in text format. + * + * @category Testing + * @package PHPUnit2 + * @author Sebastian Bergmann + * @copyright 2002-2006 Sebastian Bergmann + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version Release: @package_version@ + * @link http://pear.php.net/package/PHPUnit2 + * @since Class available since Release 2.1.0 + */ +class PHPUnit2_Util_CodeCoverage_Renderer_Text extends PHPUnit2_Util_CodeCoverage_Renderer { + /** + * @param string $sourceFile + * @return string + * @access protected + */ + protected function startSourceFile($sourceFile) { + return ' ' . $sourceFile . "\n\n"; + } + + /** + * @param string $sourceFile + * @return string + * @access protected + */ + protected function endSourceFile($sourceFile) { + return "\n"; + } + + /** + * @param array $codeLines + * @param array $executedLines + * @return string + * @access protected + */ + protected function renderSourceFile($codeLines, $executedLines) { + $buffer = ''; + $line = 1; + + foreach ($codeLines as $codeLine) { + $flag = '-'; + + if (isset($executedLines[$line])) { + if ($executedLines[$line] > 0) { + $flag = '+'; + } else { + $flag = '#'; + } + } + + $buffer .= sprintf( + ' %4u|%s| %s', + + $line, + $flag, + $codeLine + ); + + $line++; + } + + return $buffer; + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/buildscripts/PHPUnit2/Util/ErrorHandler.php b/buildscripts/PHPUnit2/Util/ErrorHandler.php new file mode 100644 index 00000000..ee724ffe --- /dev/null +++ b/buildscripts/PHPUnit2/Util/ErrorHandler.php @@ -0,0 +1,77 @@ +. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Sebastian Bergmann nor the names of his + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Testing + * @package PHPUnit2 + * @author Sebastian Bergmann + * @copyright 2002-2006 Sebastian Bergmann + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version CVS: $Id: ErrorHandler.php,v 1.1.2.2 2005/12/17 16:04:58 sebastian Exp $ + * @link http://pear.php.net/package/PHPUnit2 + * @since File available since Release 2.3.0 + */ + +/** + * @param integer $errno + * @param string $errstr + * @param string $errfile + * @param integer $errline + * @throws PHPUnit2_Framework_Error + * @since Function available since Release 2.3.0 + */ +function PHPUnit2_Util_ErrorHandler($errno, $errstr, $errfile, $errline) { + $trace = debug_backtrace(); + array_shift($trace); + + throw new PHPUnit2_Framework_Error( + $errstr, + $errno, + $errfile, + $errline, + $trace + ); +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/buildscripts/PHPUnit2/Util/Fileloader.php b/buildscripts/PHPUnit2/Util/Fileloader.php new file mode 100644 index 00000000..bdcd49ed --- /dev/null +++ b/buildscripts/PHPUnit2/Util/Fileloader.php @@ -0,0 +1,109 @@ +. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Sebastian Bergmann nor the names of his + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Testing + * @package PHPUnit2 + * @author Sebastian Bergmann + * @copyright 2002-2006 Sebastian Bergmann + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version CVS: $Id: Fileloader.php,v 1.1.2.6 2005/12/19 05:43:56 sebastian Exp $ + * @link http://pear.php.net/package/PHPUnit2 + * @since File available since Release 2.3.0 + */ + +/** + * + * + * @category Testing + * @package PHPUnit2 + * @author Sebastian Bergmann + * @copyright 2002-2006 Sebastian Bergmann + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version Release: @package_version@ + * @link http://pear.php.net/package/PHPUnit2 + * @since Class available since Release 2.3.0 + */ +class PHPUnit2_Util_Fileloader { + /** + * Checks if a PHP sourcefile is readable and contains no syntax errors. + * If that is the case, the sourcefile is loaded through include_once(). + * + * @param string $filename + * @throws Exception + * @access public + * @static + */ + public static function checkAndLoad($filename) { + if (!is_readable($filename)) { + $filename = './' . $filename; + } + + if (!is_readable($filename)) { + throw new Exception( + sprintf( + '%s could not be found or is not readable.', + + str_replace('./', '', $filename) + ) + ); + } + + $output = shell_exec('php -l ' . escapeshellarg($filename)); + + if (strpos($output, 'No syntax errors detected in') === FALSE) { + throw new Exception( + sprintf( + 'Syntax error in %s.', + + str_replace('./', '', $filename) + ) + ); + } + + include_once $filename; + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/buildscripts/PHPUnit2/Util/Filter.php b/buildscripts/PHPUnit2/Util/Filter.php new file mode 100644 index 00000000..70d055fd --- /dev/null +++ b/buildscripts/PHPUnit2/Util/Filter.php @@ -0,0 +1,263 @@ +. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Sebastian Bergmann nor the names of his + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Testing + * @package PHPUnit2 + * @author Sebastian Bergmann + * @copyright 2002-2006 Sebastian Bergmann + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version CVS: $Id: Filter.php,v 1.32.2.5 2005/12/17 16:04:58 sebastian Exp $ + * @link http://pear.php.net/package/PHPUnit2 + * @since File available since Release 2.0.0 + */ + +/** + * Utility class for code filtering. + * + * @category Testing + * @package PHPUnit2 + * @author Sebastian Bergmann + * @copyright 2002-2006 Sebastian Bergmann + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version Release: @package_version@ + * @link http://pear.php.net/package/PHPUnit2 + * @since Class available since Release 2.0.0 + */ +class PHPUnit2_Util_Filter { + /** + * Source files that are to be filtered. + * + * @var array + * @access protected + * @static + */ + protected static $filteredFiles = array( + 'PHPUnit2/Extensions/ExceptionTestCase.php', + 'PHPUnit2/Extensions/PerformanceTestCase.php', + 'PHPUnit2/Extensions/RepeatedTest.php', + 'PHPUnit2/Extensions/TestDecorator.php', + 'PHPUnit2/Extensions/TestSetup.php', + 'PHPUnit2/Framework/Assert.php', + 'PHPUnit2/Framework/AssertionFailedError.php', + 'PHPUnit2/Framework/ComparisonFailure.php', + 'PHPUnit2/Framework/Error.php', + 'PHPUnit2/Framework/IncompleteTest.php', + 'PHPUnit2/Framework/IncompleteTestError.php', + 'PHPUnit2/Framework/Test.php', + 'PHPUnit2/Framework/TestCase.php', + 'PHPUnit2/Framework/TestFailure.php', + 'PHPUnit2/Framework/TestListener.php', + 'PHPUnit2/Framework/TestResult.php', + 'PHPUnit2/Framework/TestSuite.php', + 'PHPUnit2/Framework/Warning.php', + 'PHPUnit2/Runner/BaseTestRunner.php', + 'PHPUnit2/Runner/IncludePathTestCollector.php', + 'PHPUnit2/Runner/StandardTestSuiteLoader.php', + 'PHPUnit2/Runner/TestCollector.php', + 'PHPUnit2/Runner/TestSuiteLoader.php', + 'PHPUnit2/Runner/Version.php', + 'PHPUnit2/TextUI/ResultPrinter.php', + 'PHPUnit2/TextUI/TestRunner.php', + 'PHPUnit2/Util/CodeCoverage/Renderer/HTML.php', + 'PHPUnit2/Util/CodeCoverage/Renderer/Text.php', + 'PHPUnit2/Util/CodeCoverage/Renderer.php', + 'PHPUnit2/Util/Log/PEAR.php', + 'PHPUnit2/Util/Log/XML.php', + 'PHPUnit2/Util/TestDox/ResultPrinter/HTML.php', + 'PHPUnit2/Util/TestDox/ResultPrinter/Text.php', + 'PHPUnit2/Util/TestDox/NamePrettifier.php', + 'PHPUnit2/Util/TestDox/ResultPrinter.php', + 'PHPUnit2/Util/ErrorHandler.php', + 'PHPUnit2/Util/Fileloader.php', + 'PHPUnit2/Util/Filter.php', + 'PHPUnit2/Util/Printer.php', + 'PHPUnit2/Util/Skeleton.php', + 'Benchmark/Timer.php', + 'Console/Getopt.php', + 'Log/composite.php', + 'Log/console.php', + 'Log/display.php', + 'Log/error.php', + 'Log/file.php', + 'Log/mail.php', + 'Log/mcal.php', + 'Log/null.php', + 'Log/observer.php', + 'Log/sql.php', + 'Log/sqlite.php', + 'Log/syslog.php', + 'Log/win.php', + 'Log.php', + 'PEAR/Config.php', + 'PEAR.php' + ); + + /** + * Adds a new file to be filtered. + * + * @param string + * @access public + * @static + * @since Method available since Release 2.1.0 + */ + public static function addFileToFilter($filename) { + $filename = self::getCanonicalFilename($filename); + + if (!self::isFiltered($filename)) { + self::$filteredFiles[] = $filename; + } + } + + /** + * Removes a file from the filter. + * + * @param string + * @access public + * @static + * @since Method available since Release 2.1.0 + */ + public static function removeFileFromFilter($filename) { + $filename = self::getCanonicalFilename($filename); + $keys = array_keys(self::$filteredFiles); + + for ($i = 0; $i < sizeof($keys); $i++) { + if (self::$filteredFiles[$keys[$i]] == $filename) { + unset(self::$filteredFiles[$keys[$i]]); + break; + } + } + } + + /** + * Filters source lines from PHPUnit classes. + * + * @param array + * @return array + * @access public + * @static + */ + public static function getFilteredCodeCoverage($codeCoverageInformation) { + $files = array_keys($codeCoverageInformation); + + foreach ($files as $file) { + if (self::isFiltered($file)) { + unset($codeCoverageInformation[$file]); + } + } + + return $codeCoverageInformation; + } + + /** + * Filters stack frames from PHPUnit classes. + * + * @param Exception $e + * @return string + * @access public + * @static + */ + public static function getFilteredStacktrace(Exception $e) { + $filteredStacktrace = ''; + $stacktrace = $e->getTrace(); + + foreach ($stacktrace as $frame) { + $filtered = FALSE; + + if (isset($frame['file']) && !self::isFiltered($frame['file'])) { + $filteredStacktrace .= sprintf( + "%s:%s\n", + + $frame['file'], + isset($frame['line']) ? $frame['line'] : '?' + ); + } + } + + return $filteredStacktrace; + } + + /** + * Canonicalizes a source file name. + * + * @param string $filename + * @return string + * @access protected + * @static + */ + protected static function getCanonicalFilename($filename) { + foreach (array('PHPUnit2', 'Benchmark', 'Console', 'PEAR') as $package) { + $pos = strpos($filename, $package); + + if ($pos !== FALSE) { + $filename = substr($filename, $pos); + break; + } + } + + return str_replace( + '\\', + '/', + $filename + ); + } + + /** + * @param string $filename + * @return boolean + * @access protected + * @static + * @since Method available since Release 2.1.3 + */ + protected static function isFiltered($filename) { + if (substr($filename, -7) == 'phpunit' || + in_array(self::getCanonicalFilename($filename), self::$filteredFiles)) { + return TRUE; + } + + return FALSE; + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/buildscripts/PHPUnit2/Util/Log/PEAR.php b/buildscripts/PHPUnit2/Util/Log/PEAR.php new file mode 100644 index 00000000..368c4f54 --- /dev/null +++ b/buildscripts/PHPUnit2/Util/Log/PEAR.php @@ -0,0 +1,220 @@ +. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Sebastian Bergmann nor the names of his + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Testing + * @package PHPUnit2 + * @author Sebastian Bergmann + * @copyright 2002-2006 Sebastian Bergmann + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version CVS: $Id: PEAR.php,v 1.2.2.3 2005/12/17 16:04:58 sebastian Exp $ + * @link http://pear.php.net/package/PHPUnit2 + * @since File available since Release 2.3.0 + */ + +require_once 'PHPUnit2/Framework/TestListener.php'; + +@include_once 'Log.php'; + +/** + * A TestListener that logs to a PEAR_Log sink. + * + * @category Testing + * @package PHPUnit2 + * @author Sebastian Bergmann + * @copyright 2002-2006 Sebastian Bergmann + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version Release: @package_version@ + * @link http://pear.php.net/package/PHPUnit2 + * @since Class available since Release 2.1.0 + */ +class PHPUnit2_Util_Log_PEAR implements PHPUnit2_Framework_TestListener { + /** + * Log. + * + * @var Log + * @access private + */ + private $log; + + /** + * @param string $type The type of concrete Log subclass to use. + * Currently, valid values are 'console', + * 'syslog', 'sql', 'file', and 'mcal'. + * @param string $name The name of the actually log file, table, or + * other specific store to use. Defaults to an + * empty string, with which the subclass will + * attempt to do something intelligent. + * @param string $ident The identity reported to the log system. + * @param array $conf A hash containing any additional configuration + * information that a subclass might need. + * @param int $maxLevel Maximum priority level at which to log. + * @access public + */ + public function __construct($type, $name = '', $ident = '', $conf = array(), $maxLevel = PEAR_LOG_DEBUG) { + $this->log = Log::factory($type, $name, $ident, $conf, $maxLevel); + } + + /** + * An error occurred. + * + * @param PHPUnit2_Framework_Test $test + * @param Exception $e + * @access public + */ + public function addError(PHPUnit2_Framework_Test $test, Exception $e) { + $this->log->crit( + sprintf( + 'Test "%s" failed: %s', + + $test->getName(), + $e->getMessage() + ) + ); + } + + /** + * A failure occurred. + * + * @param PHPUnit2_Framework_Test $test + * @param PHPUnit2_Framework_AssertionFailedError $e + * @access public + */ + public function addFailure(PHPUnit2_Framework_Test $test, PHPUnit2_Framework_AssertionFailedError $e) { + $this->log->err( + sprintf( + 'Test "%s" failed: %s', + + $test->getName(), + $e->getMessage() + ) + ); + } + + /** + * Incomplete test. + * + * @param PHPUnit2_Framework_Test $test + * @param Exception $e + * @access public + */ + public function addIncompleteTest(PHPUnit2_Framework_Test $test, Exception $e) { + $this->log->info( + sprintf( + 'Test "%s" incomplete: %s', + + $test->getName(), + $e->getMessage() + ) + ); + } + + /** + * A test suite started. + * + * @param PHPUnit2_Framework_TestSuite $suite + * @access public + * @since Method available since Release 2.2.0 + */ + public function startTestSuite(PHPUnit2_Framework_TestSuite $suite) { + $this->log->info( + sprintf( + 'TestSuite "%s" started.', + + $suite->getName() + ) + ); + } + + /** + * A test suite ended. + * + * @param PHPUnit2_Framework_TestSuite $suite + * @access public + * @since Method available since Release 2.2.0 + */ + public function endTestSuite(PHPUnit2_Framework_TestSuite $suite) { + $this->log->info( + sprintf( + 'TestSuite "%s" ended.', + + $suite->getName() + ) + ); + } + + /** + * A test started. + * + * @param PHPUnit2_Framework_Test $test + * @access public + */ + public function startTest(PHPUnit2_Framework_Test $test) { + $this->log->info( + sprintf( + 'Test "%s" started.', + + $test->getName() + ) + ); + } + + /** + * A test ended. + * + * @param PHPUnit2_Framework_Test $test + * @access public + */ + public function endTest(PHPUnit2_Framework_Test $test) { + $this->log->info( + sprintf( + 'Test "%s" ended.', + + $test->getName() + ) + ); + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/buildscripts/PHPUnit2/Util/Log/XML.php b/buildscripts/PHPUnit2/Util/Log/XML.php new file mode 100644 index 00000000..ce528753 --- /dev/null +++ b/buildscripts/PHPUnit2/Util/Log/XML.php @@ -0,0 +1,356 @@ +. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Sebastian Bergmann nor the names of his + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Testing + * @package PHPUnit2 + * @author Sebastian Bergmann + * @copyright 2002-2006 Sebastian Bergmann + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version CVS: $Id: XML.php,v 1.2.2.3 2005/12/17 16:04:58 sebastian Exp $ + * @link http://pear.php.net/package/PHPUnit2 + * @since File available since Release 2.3.0 + */ + +require_once 'PHPUnit2/Framework/TestListener.php'; +require_once 'PHPUnit2/Util/Filter.php'; +require_once 'PHPUnit2/Util/Printer.php'; + +require_once 'Benchmark/Timer.php'; + +/** + * A TestListener that generates an XML-based logfile + * of the test execution. + * + * @category Testing + * @package PHPUnit2 + * @author Sebastian Bergmann + * @copyright 2002-2006 Sebastian Bergmann + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version Release: @package_version@ + * @link http://pear.php.net/package/PHPUnit2 + * @since Class available since Release 2.1.0 + */ +class PHPUnit2_Util_Log_XML extends PHPUnit2_Util_Printer implements PHPUnit2_Framework_TestListener { + /** + * @var DOMDocument + * @access private + */ + private $document; + + /** + * @var DOMElement + * @access private + */ + private $root; + + /** + * @var boolean + * @access private + */ + private $writeDocument = TRUE; + + /** + * @var DOMElement[] + * @access private + */ + private $testSuites = array(); + + /** + * @var integer[] + * @access private + */ + private $testSuiteTests = array(0); + + /** + * @var integer[] + * @access private + */ + private $testSuiteErrors = array(0); + + /** + * @var integer[] + * @access private + */ + private $testSuiteFailures = array(0); + + /** + * @var integer[] + * @access private + */ + private $testSuiteTimes = array(0); + + /** + * @var integer + * @access private + */ + private $testSuiteLevel = 0; + + /** + * @var DOMElement + * @access private + */ + private $currentTestCase = NULL; + + /** + * @var Benchmark_Timer + * @access private + */ + private $timer; + + /** + * Constructor. + * + * @param mixed $out + * @access public + */ + public function __construct($out = NULL) { + $this->document = new DOMDocument('1.0', 'UTF-8'); + $this->document->formatOutput = TRUE; + + $this->root = $this->document->createElement('testsuites'); + $this->document->appendChild($this->root); + + $this->timer = new Benchmark_Timer; + + parent::__construct($out); + } + + /** + * Destructor. + * + * @access public + */ + public function __destruct() { + if ($this->writeDocument === TRUE) { + $this->write($this->getXML()); + } + + parent::__destruct(); + } + + /** + * An error occurred. + * + * @param PHPUnit2_Framework_Test $test + * @param Exception $e + * @access public + */ + public function addError(PHPUnit2_Framework_Test $test, Exception $e) { + $error = $this->document->createElement('error', PHPUnit2_Util_Filter::getFilteredStacktrace($e)); + $error->setAttribute('message', $e->getMessage()); + $error->setAttribute('type', get_class($e)); + + $this->currentTestCase->appendChild($error); + + $this->testSuiteErrors[$this->testSuiteLevel]++; + } + + /** + * A failure occurred. + * + * @param PHPUnit2_Framework_Test $test + * @param PHPUnit2_Framework_AssertionFailedError $e + * @access public + */ + public function addFailure(PHPUnit2_Framework_Test $test, PHPUnit2_Framework_AssertionFailedError $e) { + $failure = $this->document->createElement('failure', PHPUnit2_Util_Filter::getFilteredStacktrace($e)); + $failure->setAttribute('message', $e->getMessage()); + $failure->setAttribute('type', get_class($e)); + + $this->currentTestCase->appendChild($failure); + + $this->testSuiteFailures[$this->testSuiteLevel]++; + } + + /** + * Incomplete test. + * + * @param PHPUnit2_Framework_Test $test + * @param Exception $e + * @access public + */ + public function addIncompleteTest(PHPUnit2_Framework_Test $test, Exception $e) { + $error = $this->document->createElement('error', PHPUnit2_Util_Filter::getFilteredStacktrace($e)); + $error->setAttribute('message', 'Incomplete Test'); + $error->setAttribute('type', get_class($e)); + + $this->currentTestCase->appendChild($error); + + $this->testSuiteErrors[$this->testSuiteLevel]++; + } + + /** + * A testsuite started. + * + * @param PHPUnit2_Framework_TestSuite $suite + * @access public + * @since Method available since Release 2.2.0 + */ + public function startTestSuite(PHPUnit2_Framework_TestSuite $suite) { + $testSuite = $this->document->createElement('testsuite'); + $testSuite->setAttribute('name', $suite->getName()); + + try { + $class = new ReflectionClass($suite->getName()); + $docComment = $class->getDocComment(); + + if (preg_match('/@category[\s]+([\.\w]+)/', $docComment, $matches)) { + $testSuite->setAttribute('category', $matches[1]); + } + + if (preg_match('/@package[\s]+([\.\w]+)/', $docComment, $matches)) { + $testSuite->setAttribute('package', $matches[1]); + } + + if (preg_match('/@subpackage[\s]+([\.\w]+)/', $docComment, $matches)) { + $testSuite->setAttribute('subpackage', $matches[1]); + } + } + + catch (ReflectionException $e) { + } + + if ($this->testSuiteLevel > 0) { + $this->testSuites[$this->testSuiteLevel]->appendChild($testSuite); + } else { + $this->root->appendChild($testSuite); + } + + $this->testSuiteLevel++; + $this->testSuites[$this->testSuiteLevel] = $testSuite; + $this->testSuiteTests[$this->testSuiteLevel] = 0; + $this->testSuiteErrors[$this->testSuiteLevel] = 0; + $this->testSuiteFailures[$this->testSuiteLevel] = 0; + $this->testSuiteTimes[$this->testSuiteLevel] = 0; + } + + /** + * A testsuite ended. + * + * @param PHPUnit2_Framework_TestSuite $suite + * @access public + * @since Method available since Release 2.2.0 + */ + public function endTestSuite(PHPUnit2_Framework_TestSuite $suite) { + $this->testSuites[$this->testSuiteLevel]->setAttribute('tests', $this->testSuiteTests[$this->testSuiteLevel]); + $this->testSuites[$this->testSuiteLevel]->setAttribute('failures', $this->testSuiteFailures[$this->testSuiteLevel]); + $this->testSuites[$this->testSuiteLevel]->setAttribute('errors', $this->testSuiteErrors[$this->testSuiteLevel]); + $this->testSuites[$this->testSuiteLevel]->setAttribute('time', $this->testSuiteTimes[$this->testSuiteLevel]); + + if ($this->testSuiteLevel > 1) { + $this->testSuiteTests[$this->testSuiteLevel - 1] += $this->testSuiteTests[$this->testSuiteLevel]; + $this->testSuiteErrors[$this->testSuiteLevel - 1] += $this->testSuiteErrors[$this->testSuiteLevel]; + $this->testSuiteFailures[$this->testSuiteLevel - 1] += $this->testSuiteFailures[$this->testSuiteLevel]; + $this->testSuiteTimes[$this->testSuiteLevel - 1] += $this->testSuiteTimes[$this->testSuiteLevel]; + } + + $this->testSuiteLevel--; + } + + /** + * A test started. + * + * @param PHPUnit2_Framework_Test $test + * @access public + */ + public function startTest(PHPUnit2_Framework_Test $test) { + $testCase = $this->document->createElement('testcase'); + $testCase->setAttribute('name', $test->getName()); + $testCase->setAttribute('class', get_class($test)); + + $this->testSuites[$this->testSuiteLevel]->appendChild($testCase); + $this->currentTestCase = $testCase; + + $this->testSuiteTests[$this->testSuiteLevel]++; + + $this->timer->start(); + } + + /** + * A test ended. + * + * @param PHPUnit2_Framework_Test $test + * @access public + */ + public function endTest(PHPUnit2_Framework_Test $test) { + $this->timer->stop(); + $time = $this->timer->timeElapsed(); + + $this->currentTestCase->setAttribute('time', $time); + $this->testSuiteTimes[$this->testSuiteLevel] += $time; + + $this->currentTestCase = NULL; + } + + /** + * Returns the XML as a string. + * + * @return string + * @access public + * @since Method available since Release 2.2.0 + */ + public function getXML() { + return $this->document->saveXML(); + } + + /** + * Enables or disables the writing of the document + * in __destruct(). + * + * This is a "hack" needed for the integration of + * PHPUnit with Phing. + * + * @return string + * @access public + * @since Method available since Release 2.2.0 + */ + public function setWriteDocument($flag) { + if (is_bool($flag)) { + $this->writeDocument = $flag; + } + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/buildscripts/PHPUnit2/Util/Printer.php b/buildscripts/PHPUnit2/Util/Printer.php new file mode 100644 index 00000000..13dc46a9 --- /dev/null +++ b/buildscripts/PHPUnit2/Util/Printer.php @@ -0,0 +1,116 @@ +. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Sebastian Bergmann nor the names of his + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Testing + * @package PHPUnit2 + * @author Sebastian Bergmann + * @copyright 2002-2006 Sebastian Bergmann + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version CVS: $Id: Printer.php,v 1.10.2.3 2005/12/17 16:04:58 sebastian Exp $ + * @link http://pear.php.net/package/PHPUnit2 + * @since File available since Release 2.0.0 + */ + +/** + * Utility class that can print to STDOUT or write to a file. + * + * @category Testing + * @package PHPUnit2 + * @author Sebastian Bergmann + * @copyright 2002-2006 Sebastian Bergmann + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version Release: @package_version@ + * @link http://pear.php.net/package/PHPUnit2 + * @since Class available since Release 2.0.0 + * @abstract + */ +abstract class PHPUnit2_Util_Printer { + /** + * @var resource + * @access private + */ + private $out = NULL; + + /** + * Constructor. + * + * @param mixed $out + * @access public + */ + public function __construct($out = NULL) { + if ($out !== NULL) { + if (is_string($out)) { + $this->out = fopen($out, 'w'); + } else { + $this->out = $out; + } + } + } + + /** + * Destructor. + * + * @access public + */ + public function __destruct() { + if ($this->out !== NULL) { + fclose($this->out); + } + } + + /** + * @param string $buffer + * @access public + */ + public function write($buffer) { + if ($this->out !== NULL) { + fputs($this->out, $buffer); + } else { + print $buffer; + } + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/buildscripts/PHPUnit2/Util/Skeleton.php b/buildscripts/PHPUnit2/Util/Skeleton.php new file mode 100644 index 00000000..39717557 --- /dev/null +++ b/buildscripts/PHPUnit2/Util/Skeleton.php @@ -0,0 +1,340 @@ +. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Sebastian Bergmann nor the names of his + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Testing + * @package PHPUnit2 + * @author Sebastian Bergmann + * @copyright 2002-2006 Sebastian Bergmann + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version CVS: $Id: Skeleton.php,v 1.24.2.3 2005/12/17 16:04:58 sebastian Exp $ + * @link http://pear.php.net/package/PHPUnit2 + * @since File available since Release 2.1.0 + */ + +/** + * Class for creating a PHPUnit2_Framework_TestCase skeleton file. + * + * This class will take a classname as a parameter on construction and will + * create a PHP file that contains the skeleton of a PHPUnit2_Framework_TestCase + * subclass. + * + * + * write(); + * ?> + * + * + * @category Testing + * @package PHPUnit2 + * @author Sebastian Bergmann + * @copyright 2002-2006 Sebastian Bergmann + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version Release: @package_version@ + * @link http://pear.php.net/package/PHPUnit2 + * @since Class available since Release 2.1.0 + */ +class PHPUnit2_Util_Skeleton { + protected $templateClassHeader = +' +'; + + protected $templateMethod = +' + /** + * @todo Implement test{methodName}(). + */ + public function test{methodName}() { + // Remove the following line when you implement this test. + throw new PHPUnit2_Framework_IncompleteTestError; + } +'; + + /** + * @var string + * @access protected + */ + protected $className; + + /** + * @var string + * @access protected + */ + protected $classSourceFile; + + /** + * Constructor. + * + * @param string $className + * @param string $classSourceFile + * @throws Exception + * @access public + */ + public function __construct($className, $classSourceFile = '') { + if ($classSourceFile == '') { + $classSourceFile = $className . '.php'; + } + + if (file_exists($classSourceFile)) { + $this->classSourceFile = $classSourceFile; + } else { + throw new Exception( + sprintf( + 'Could not open %s.', + + $classSourceFile + ) + ); + } + + @include_once $this->classSourceFile; + + if (class_exists($className)) { + $this->className = $className; + } else { + throw new Exception( + sprintf( + 'Could not find class "%s" in %s.', + + $className, + $classSourceFile + ) + ); + } + } + + /** + * Generates the test class' source. + * + * @return string + * @access public + */ + public function generate() { + $testClassSource = $this->testClassHeader($this->className, $this->classSourceFile); + + $class = new ReflectionClass($this->className); + + foreach ($class->getMethods() as $method) { + if (!$method->isConstructor() && + !$method->isAbstract() && + $method->isUserDefined() && + $method->isPublic() && + $method->getDeclaringClass()->getName() == $this->className) { + $testClassSource .= $this->testMethod($method->getName()); + } + } + + $testClassSource .= $this->testClassFooter($this->className); + + return $testClassSource; + } + + /** + * Generates the test class and writes it to a source file. + * + * @param string $file + * @access public + */ + public function write($file = '') { + if ($file == '') { + $file = $this->className . 'Test.php'; + } + + if ($fp = @fopen($file, 'w')) { + @fputs($fp, $this->generate()); + @fclose($fp); + } + } + + /** + * Sets the templates for class header, class footer, and method. + * + * @param string $classHeader + * @param string $classFooter + * @param string $method + * @access public + * @since Method available since Release 2.2.0 + */ + public function setTemplates($classHeader, $classFooter, $method) { + if (is_file($classHeader)) { + $this->templateClassHeader = file_get_contents($classHeader); + } else { + $this->templateClassHeader = $classHeader; + } + + if (is_file($classFooter)) { + $this->templateClassFooter = file_get_contents($classFooter); + } else { + $this->templateClassFooter = $classFooter; + } + + if (is_file($method)) { + $this->templateMethod = file_get_contents($method); + } else { + $this->templateMethod = $method; + } + } + + /** + * @param string $className + * @param string $classSourceFile + * @access protected + */ + protected function testClassHeader($className, $classSourceFile) { + return str_replace( + array( + '{className}', + '{classFile}', + '{date}', + '{time}' + ), + array( + $className, + $classSourceFile, + date('Y-m-d'), + date('H:i:s') + ), + $this->templateClassHeader + ); + } + + /** + * @param string $className + * @access protected + */ + protected function testClassFooter($className) { + return str_replace( + array( + '{className}' + ), + array( + $className + ), + $this->templateClassFooter + ); + } + + /** + * @param string $methodName + * @access protected + */ + protected function testMethod($methodName) { + return str_replace( + array( + '{methodName}' + ), + array( + ucfirst($methodName) + ), + $this->templateMethod + ); + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/buildscripts/PHPUnit2/Util/TestDox/NamePrettifier.php b/buildscripts/PHPUnit2/Util/TestDox/NamePrettifier.php new file mode 100644 index 00000000..1d686dc8 --- /dev/null +++ b/buildscripts/PHPUnit2/Util/TestDox/NamePrettifier.php @@ -0,0 +1,165 @@ +. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Sebastian Bergmann nor the names of his + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Testing + * @package PHPUnit2 + * @author Sebastian Bergmann + * @copyright 2002-2006 Sebastian Bergmann + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version CVS: $Id: NamePrettifier.php,v 1.2.2.2 2005/12/17 16:04:58 sebastian Exp $ + * @link http://pear.php.net/package/PHPUnit2 + * @since File available since Release 2.3.0 + */ + +/** + * Prettifies class and method names for use in TestDox documentation. + * + * @category Testing + * @package PHPUnit2 + * @author Sebastian Bergmann + * @copyright 2002-2006 Sebastian Bergmann + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version Release: @package_version@ + * @link http://pear.php.net/package/PHPUnit2 + * @since Class available since Release 2.1.0 + */ +class PHPUnit2_Util_TestDox_NamePrettifier { + /** + * @var string + * @access protected + */ + protected $prefix = 'Test'; + + /** + * @var string + * @access protected + */ + protected $suffix = 'Test'; + + /** + * Tests if a method is a test method. + * + * @param string $testMethodName + * @return boolean + * @access public + */ + public function isATestMethod($testMethodName) { + if (substr($testMethodName, 0, 4) == 'test') { + return TRUE; + } + + return FALSE; + } + + /** + * Prettifies the name of a test class. + * + * @param string $testClassName + * @return string + * @access public + */ + public function prettifyTestClass($testClassName) { + $title = $testClassName; + + if ($this->suffix !== NULL && + $this->suffix == substr($testClassName, -1 * strlen($this->suffix))) { + $title = substr($title, 0, strripos($title, $this->suffix)); + } + + if ($this->prefix !== NULL && + $this->prefix == substr($testClassName, 0, strlen($this->prefix))) { + $title = substr($title, strlen($this->prefix)); + } + + return $title; + } + + /** + * Prettifies the name of a test method. + * + * @param string $testMethodName + * @return string + * @access public + */ + public function prettifyTestMethod($testMethodName) { + $buffer = ''; + + $testMethodName = preg_replace('#\d+$#', '', $testMethodName); + + for ($i = 4; $i < strlen($testMethodName); $i++) { + if ($i > 4 && + ord($testMethodName[$i]) >= 65 && + ord($testMethodName[$i]) <= 90) { + $buffer .= ' ' . strtolower($testMethodName[$i]); + } else { + $buffer .= $testMethodName[$i]; + } + } + + return $buffer; + } + + /** + * Sets the prefix of test names. + * + * @param string $prefix + * @access public + */ + public function setPrefix($prefix) { + $this->prefix = $prefix; + } + + /** + * Sets the suffix of test names. + * + * @param string $prefix + * @access public + */ + public function setSuffix($suffix) { + $this->suffix = $suffix; + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/buildscripts/PHPUnit2/Util/TestDox/ResultPrinter.php b/buildscripts/PHPUnit2/Util/TestDox/ResultPrinter.php new file mode 100644 index 00000000..274c7309 --- /dev/null +++ b/buildscripts/PHPUnit2/Util/TestDox/ResultPrinter.php @@ -0,0 +1,299 @@ +. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Sebastian Bergmann nor the names of his + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Testing + * @package PHPUnit2 + * @author Sebastian Bergmann + * @copyright 2002-2006 Sebastian Bergmann + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version CVS: $Id: ResultPrinter.php,v 1.2.2.6 2005/12/17 16:04:58 sebastian Exp $ + * @link http://pear.php.net/package/PHPUnit2 + * @since File available since Release 2.3.0 + */ + +require_once 'PHPUnit2/Framework/TestListener.php'; +require_once 'PHPUnit2/Util/TestDox/NamePrettifier.php'; +require_once 'PHPUnit2/Util/Printer.php'; + +/** + * Base class for printers of TestDox documentation. + * + * @category Testing + * @package PHPUnit2 + * @author Sebastian Bergmann + * @copyright 2002-2006 Sebastian Bergmann + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version Release: @package_version@ + * @link http://pear.php.net/package/PHPUnit2 + * @since Class available since Release 2.1.0 + * @abstract + */ +abstract class PHPUnit2_Util_TestDox_ResultPrinter extends PHPUnit2_Util_Printer implements PHPUnit2_Framework_TestListener { + /** + * @var PHPUnit2_Util_TestDox_NamePrettifier + * @access protected + */ + protected $prettifier; + + /** + * @var string + * @access protected + */ + protected $testClass = ''; + + /** + * @var boolean + * @access protected + */ + protected $testFailed = FALSE; + + /** + * @var array + * @access protected + */ + protected $tests = array(); + + /** + * Constructor. + * + * @param resource $out + * @access public + */ + public function __construct($out = NULL) { + parent::__construct($out); + + $this->prettifier = new PHPUnit2_Util_TestDox_NamePrettifier; + $this->startRun(); + } + + /** + * Destructor. + * + * @access public + */ + public function __destruct() { + $this->doEndClass(); + $this->endRun(); + + parent::__destruct(); + } + + /** + * Abstract Factory. + * + * @param string $type + * @param resource $out + * @throws Exception + * @access public + * @static + */ + public static function factory($type, $out = NULL) { + require_once 'PHPUnit2/Util/TestDox/ResultPrinter/' . $type . '.php'; + + $class = 'PHPUnit2_Util_TestDox_ResultPrinter_' . $type; + return new $class($out); + } + + /** + * An error occurred. + * + * @param PHPUnit2_Framework_Test $test + * @param Exception $e + * @access public + */ + public function addError(PHPUnit2_Framework_Test $test, Exception $e) { + $this->testFailed = TRUE; + } + + /** + * A failure occurred. + * + * @param PHPUnit2_Framework_Test $test + * @param PHPUnit2_Framework_AssertionFailedError $e + * @access public + */ + public function addFailure(PHPUnit2_Framework_Test $test, PHPUnit2_Framework_AssertionFailedError $e) { + $this->testFailed = TRUE; + } + + /** + * Incomplete test. + * + * @param PHPUnit2_Framework_Test $test + * @param Exception $e + * @access public + */ + public function addIncompleteTest(PHPUnit2_Framework_Test $test, Exception $e) { + $this->testFailed = TRUE; + } + + /** + * A testsuite started. + * + * @param PHPUnit2_Framework_TestSuite $suite + * @access public + * @since Method available since Release 2.2.0 + */ + public function startTestSuite(PHPUnit2_Framework_TestSuite $suite) { + } + + /** + * A testsuite ended. + * + * @param PHPUnit2_Framework_TestSuite $suite + * @access public + * @since Method available since Release 2.2.0 + */ + public function endTestSuite(PHPUnit2_Framework_TestSuite $suite) { + } + + /** + * A test started. + * + * @param PHPUnit2_Framework_Test $test + * @access public + */ + public function startTest(PHPUnit2_Framework_Test $test) { + $class = get_class($test); + + if ($this->testClass != $class) { + if ($this->testClass != '') { + $this->doEndClass(); + } + + $this->startClass($this->prettifier->prettifyTestClass($class)); + + $this->testClass = $class; + $this->tests = array(); + } + + $this->testFailed = FALSE; + } + + /** + * A test ended. + * + * @param PHPUnit2_Framework_Test $test + * @access public + */ + public function endTest(PHPUnit2_Framework_Test $test) { + $prettifiedName = $this->prettifier->prettifyTestMethod($test->getName()); + + if (!isset($this->tests[$prettifiedName])) { + if (!$this->testFailed) { + $this->tests[$prettifiedName]['success'] = 1; + $this->tests[$prettifiedName]['failure'] = 0; + } else { + $this->tests[$prettifiedName]['success'] = 0; + $this->tests[$prettifiedName]['failure'] = 1; + } + } else { + if (!$this->testFailed) { + $this->tests[$prettifiedName]['success']++; + } else { + $this->tests[$prettifiedName]['failure']++; + } + } + } + + /** + * @access private + * @since Method available since Release 2.3.0 + */ + private function doEndClass() { + foreach ($this->tests as $name => $data) { + if ($data['failure'] == 0) { + $this->onTest($name); + } + } + + $this->endClass($this->prettifier->prettifyTestClass($this->testClass)); + } + + /** + * Handler for 'start run' event. + * + * @access protected + */ + protected function startRun() { + } + + /** + * Handler for 'start class' event. + * + * @param string $name + * @access protected + * @abstract + */ + abstract protected function startClass($name); + + /** + * Handler for 'on test' event. + * + * @param string $name + * @access protected + * @abstract + */ + abstract protected function onTest($name); + + /** + * Handler for 'end class' event. + * + * @param string $name + * @access protected + * @abstract + */ + abstract protected function endClass($name); + + /** + * Handler for 'end run' event. + * + * @access protected + */ + protected function endRun() { + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/buildscripts/PHPUnit2/Util/TestDox/ResultPrinter/HTML.php b/buildscripts/PHPUnit2/Util/TestDox/ResultPrinter/HTML.php new file mode 100644 index 00000000..505ec60d --- /dev/null +++ b/buildscripts/PHPUnit2/Util/TestDox/ResultPrinter/HTML.php @@ -0,0 +1,120 @@ +. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Sebastian Bergmann nor the names of his + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Testing + * @package PHPUnit2 + * @author Sebastian Bergmann + * @copyright 2002-2006 Sebastian Bergmann + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version CVS: $Id: HTML.php,v 1.2.2.3 2005/12/17 16:04:58 sebastian Exp $ + * @link http://pear.php.net/package/PHPUnit2 + * @since File available since Release 2.3.0 + */ + +require_once 'PHPUnit2/Util/TestDox/ResultPrinter.php'; + +/** + * Prints TestDox documentation in HTML format. + * + * @category Testing + * @package PHPUnit2 + * @author Sebastian Bergmann + * @copyright 2002-2006 Sebastian Bergmann + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version Release: @package_version@ + * @link http://pear.php.net/package/PHPUnit2 + * @since Class available since Release 2.1.0 + */ +class PHPUnit2_Util_TestDox_ResultPrinter_HTML extends PHPUnit2_Util_TestDox_ResultPrinter { + /** + * Handler for 'start run' event. + * + * @access protected + */ + protected function startRun() { + $this->write(''); + } + + /** + * Handler for 'start class' event. + * + * @param string $name + * @access protected + */ + protected function startClass($name) { + $this->write('

' . $name . '

    '); + } + + /** + * Handler for 'on test' event. + * + * @param string $name + * @access protected + */ + protected function onTest($name) { + $this->write('
  • ' . $name . '
  • '); + } + + /** + * Handler for 'end class' event. + * + * @param string $name + * @access protected + */ + protected function endClass($name) { + $this->write('
'); + } + + /** + * Handler for 'end run' event. + * + * @access protected + */ + protected function endRun() { + $this->write(''); + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/buildscripts/PHPUnit2/Util/TestDox/ResultPrinter/Text.php b/buildscripts/PHPUnit2/Util/TestDox/ResultPrinter/Text.php new file mode 100644 index 00000000..cd12e525 --- /dev/null +++ b/buildscripts/PHPUnit2/Util/TestDox/ResultPrinter/Text.php @@ -0,0 +1,102 @@ +. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Sebastian Bergmann nor the names of his + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category Testing + * @package PHPUnit2 + * @author Sebastian Bergmann + * @copyright 2002-2006 Sebastian Bergmann + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version CVS: $Id: Text.php,v 1.2.2.3 2005/12/17 16:04:58 sebastian Exp $ + * @link http://pear.php.net/package/PHPUnit2 + * @since File available since Release 2.3.0 + */ + +require_once 'PHPUnit2/Util/TestDox/ResultPrinter.php'; + +/** + * Prints TestDox documentation in text format. + * + * @category Testing + * @package PHPUnit2 + * @author Sebastian Bergmann + * @copyright 2002-2006 Sebastian Bergmann + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version Release: @package_version@ + * @link http://pear.php.net/package/PHPUnit2 + * @since Class available since Release 2.1.0 + */ +class PHPUnit2_Util_TestDox_ResultPrinter_Text extends PHPUnit2_Util_TestDox_ResultPrinter { + /** + * Handler for 'start class' event. + * + * @param string $name + * @access protected + */ + protected function startClass($name) { + $this->write($name . "\n"); + } + + /** + * Handler for 'on test' event. + * + * @param string $name + * @access protected + */ + protected function onTest($name) { + $this->write(' - ' . $name . "\n"); + } + + /** + * Handler for 'end class' event. + * + * @param string $name + * @access protected + */ + protected function endClass($name) { + $this->write("\n"); + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> diff --git a/buildscripts/PHPUnit2/pear-phpunit b/buildscripts/PHPUnit2/pear-phpunit new file mode 100644 index 00000000..25e8944d --- /dev/null +++ b/buildscripts/PHPUnit2/pear-phpunit @@ -0,0 +1,41 @@ +#!@php_bin@ +. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Sebastian Bergmann nor the names of his + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * $Id: pear-phpunit,v 1.2.8.2 2005/12/17 16:04:56 sebastian Exp $ + */ + +require 'PHPUnit2/TextUI/TestRunner.php'; +?> diff --git a/buildscripts/PHPUnit2/pear-phpunit.bat b/buildscripts/PHPUnit2/pear-phpunit.bat new file mode 100644 index 00000000..d7aadb5c --- /dev/null +++ b/buildscripts/PHPUnit2/pear-phpunit.bat @@ -0,0 +1,39 @@ +@echo off +REM PHP Version 5 +REM +REM Copyright (c) 2002-2006, Sebastian Bergmann . +REM All rights reserved. +REM +REM Redistribution and use in source and binary forms, with or without +REM modification, are permitted provided that the following conditions +REM are met: +REM +REM * Redistributions of source code must retain the above copyright +REM notice, this list of conditions and the following disclaimer. +REM +REM * Redistributions in binary form must reproduce the above copyright +REM notice, this list of conditions and the following disclaimer in +REM the documentation and/or other materials provided with the +REM distribution. +REM +REM * Neither the name of Sebastian Bergmann nor the names of his +REM contributors may be used to endorse or promote products derived +REM from this software without specific prior written permission. +REM +REM THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +REM "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +REM LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +REM FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +REM COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +REM INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +REM BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +REM LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +REM CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC +REM LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +REM ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +REM POSSIBILITY OF SUCH DAMAGE. +REM +REM $Id: pear-phpunit.bat,v 1.3.2.2 2005/12/17 16:04:56 sebastian Exp $ +REM + +"@php_bin@" "@php_dir@/PHPUnit2/TextUI/TestRunner.php" %* diff --git a/buildscripts/PhpDocumentor/PHPLICENSE.txt b/buildscripts/PhpDocumentor/PHPLICENSE.txt new file mode 100644 index 00000000..c88b3873 --- /dev/null +++ b/buildscripts/PhpDocumentor/PHPLICENSE.txt @@ -0,0 +1,69 @@ +-------------------------------------------------------------------- + The PHP License, version 3.0 +Copyright (c) 1999 - 2002 The PHP Group. All rights reserved. +-------------------------------------------------------------------- + +Redistribution and use in source and binary forms, with or without +modification, is permitted provided that the following conditions +are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + 3. The name "PHP" must not be used to endorse or promote products + derived from this software without prior written permission. For + written permission, please contact group@php.net. + + 4. Products derived from this software may not be called "PHP", nor + may "PHP" appear in their name, without prior written permission + from group@php.net. You may indicate that your software works in + conjunction with PHP by saying "Foo for PHP" instead of calling + it "PHP Foo" or "phpfoo" + + 5. The PHP Group may publish revised and/or new versions of the + license from time to time. Each version will be given a + distinguishing version number. + Once covered code has been published under a particular version + of the license, you may always continue to use it under the terms + of that version. You may also choose to use such covered code + under the terms of any subsequent version of the license + published by the PHP Group. No one other than the PHP Group has + the right to modify the terms applicable to covered code created + under this License. + + 6. Redistributions of any form whatsoever must retain the following + acknowledgment: + "This product includes PHP, freely available from + ". + +THIS SOFTWARE IS PROVIDED BY THE PHP DEVELOPMENT TEAM ``AS IS'' AND +ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE PHP +DEVELOPMENT TEAM OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. + +-------------------------------------------------------------------- + +This software consists of voluntary contributions made by many +individuals on behalf of the PHP Group. + +The PHP Group can be contacted via Email at group@php.net. + +For more information on the PHP Group and the PHP project, +please see . + +This product includes the Zend Engine, freely available at +. + diff --git a/buildscripts/PhpDocumentor/new_phpdoc.php b/buildscripts/PhpDocumentor/new_phpdoc.php new file mode 100644 index 00000000..e4adea90 --- /dev/null +++ b/buildscripts/PhpDocumentor/new_phpdoc.php @@ -0,0 +1,662 @@ + + +// Joshua Eichorn +// Gregory Beaver +// +// phpDocumentor, a program for creating javadoc style documentation from php code +// Copyright (C) 2000-2002 Joshua Eichorn +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program 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 General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// +// Copyleft 2001 Juan Pablo Morales + +if (!function_exists('version_compare')) +{ + print "phpDocumentor requires PHP version 4.1.0 or greater to function"; + exit; +} + +// set up include path so we can find all files, no matter what +$GLOBALS['_phpDocumentor_install_dir'] = dirname(realpath(__FILE__)); +// add my directory to the include path, and make it first, should fix any errors +if (substr(PHP_OS, 0, 3) == 'WIN') +ini_set('include_path',$GLOBALS['_phpDocumentor_install_dir'].';'.ini_get('include_path')); +else +ini_set('include_path',$GLOBALS['_phpDocumentor_install_dir'].':'.ini_get('include_path')); + +/** +* common file information +*/ +include_once("phpDocumentor/common.inc.php"); + +// find the .ini directory by parsing phpDocumentor.ini and extracting _phpDocumentor_options[userdir] +$ini = phpDocumentor_parse_ini_file($_phpDocumentor_install_dir . PATH_DELIMITER . 'phpDocumentor.ini', true); +if (isset($ini['_phpDocumentor_options']['userdir'])) + $configdir = $ini['_phpDocumentor_options']['userdir']; +else + $configdir = $_phpDocumentor_install_dir . '/user'; + +// allow the user to change this at runtime +if (!empty($_REQUEST['altuserdir'])) $configdir = $_REQUEST['altuserdir']; +?> + + + + Form to submit to phpDocumentor v<?php print PHPDOCUMENTOR_VER; ?> + + + + path = $path; + $options = array(); + if ($text) $options['text'] = $text; + if ($link) $options['link'] = $link; + if ($icon) $options['icon'] = $icon; + HTML_TreeNode::HTML_TreeNode($options,$events); + } + } + + function getDir($path,&$node) + { + global $pd; + if (!$dir = opendir($path)) return; + + $node = new HTML_TreeNode(array('text' => basename(realpath($path)), 'link' => "", 'icon' => 'folder.gif')); + while (($file = readdir($dir)) !== false) + { + if ($file != '.' && $file != '..') + { + if (is_dir("$path$pd$file") && !is_link("$path$pd$file")) + { + $entry[] = "$path$pd$file"; + } + } + } + closedir($dir); + for($i = 0; $i < count($entry); $i++) + { + $node->addItem(new HTML_TreeNode(array('text'=>basename(realpath($entry[$i])), 'link' => "javascript:setHelp('".addslashes(realpath($entry[$i]))."');", 'icon' => 'folder.gif'))); + } + } + + function recurseDir($path, &$node) { + global $pd; + if (!$dir = opendir($path)) { + return false; + } + $anode = new HTML_TreeNode(array('text' => basename($path), 'link' => "javascript:setHelpVal('".$path."');", 'icon' => 'folder.gif')); + $result = addslashes(realpath(stripslashes($path).$pd."..")); + if (!$node) $anode->addItem(new DirNode('..',"javascript:setHelp('".$result."');",'folder.gif'),'..'); + while (($file = readdir($dir)) !== false) { + if ($file != '.' && $file != '..') { + if (is_dir("$path$pd$file")) { + recurseDir("$path$pd$file",$anode); + } + } + } + rewinddir($dir);// + while (false){//($file = readdir($dir)) !== false) { + if ($file != '.' && $file != '..') { + if (is_file("$path$pd$file")) { + $anode->addItem(new DirNode($file,"javascript:setHelpVal('$path$pd$file');",'branchtop.gif',"$path$pd$file")); + } + } + } + if (!$node) $node = $anode; + else + $node->addItem($anode); + closedir($dir); + } + + function switchDirTree($path, &$node) + { + global $pd; + + // initialize recursion simulation values + // array format: path => &parent in $node itemlist + $parent = array(); + $parent_indexes = array(); + $parenti = 1; + + $node = new DirNode(basename($path),"javascript:setHelpVal('".$path."');",'folder.gif',$path); + $result = addslashes(realpath($path.$pd."..")); + $node->addItem(new DirNode('..',"javascript:setHelp('".$result."');",'folder.gif','..')); + $rnode = &$node; + $parent[realpath($path)] = false; + $recur = 0; + do + { + if ($recur++ > 120) return; + if (!$dir = @opendir($path)) { + // no child files or directories +// echo "$path no child files or directories return to "; + $rnode = &$parent[realpath($path)]; + $path = $rnode->path; + if (isset($parent_indexes[realpath($path)])) $parenti = $parent_indexes[realpath($path)]; +// echo "$path parenti $parenti
"; + } +// fancy_debug($path,$parent_indexes); +// vdump_par($parent); + if (!isset($parent_indexes[realpath($path)])) + { + $file = readdir($dir); + while ($file !== false) { + if ($file != '.' && $file != '..') { + if (@is_dir(realpath("$path$pd$file"))) { + if (!isset($parent_indexes[realpath($path)])) $parent_indexes[realpath($path)] = true; + $parent[realpath("$path$pd$file")] = &$rnode; +// echo "
adding new ".addslashes(realpath($path.$pd.$file))." to $path
"; + $rnode->addItem(new DirNode(addslashes(realpath("$path$pd$file")),"javascript:setHelpVal('".addslashes(realpath($path.$pd.$file))."');",'folder.gif',addslashes(realpath($path.$pd.$file)))); + } + } + $file = readdir($dir); + } + } + // go down the tree if possible + if (isset($parent_indexes[realpath($path)])) + { + if ($parenti + 1 > (count($rnode->items))) + { + // no more children, go back up to parent +// echo "$path no more children, go back up to parent "; + $rnode = &$parent[realpath($path)]; + $path = $rnode->path; + if (isset($parent_indexes[realpath($path)])) $parenti = $parent_indexes[realpath($path)]; +// echo $path." parenti $parenti
"; + } else + { + // go to next child +// echo "$path go to next child "; + $parent_indexes[realpath($path)] = $parenti+1; +// debug("set parent ".$rnode->items[$parenti]->path." = ".$rnode->path.'
'); + $parent[realpath($rnode->items[$parenti]->path)] = &$rnode; + $rnode = &$rnode->items[$parenti]; + $path = $rnode->path; +// echo "$path
"; + $parenti = 0; + } + } else + { + // no children, go back up the tree to the next child +// echo "$path no children, go back up to parent "; + $rnode = &$parent[realpath($path)]; + $path = $rnode->path; + if (isset($parent_indexes[realpath($path)])) $parenti = $parent_indexes[realpath($path)]; +// echo "$path parenti $parenti
"; + } + @closedir($dir); + } while ($path && (($parenti < (count($rnode->items))) || ($parent[realpath($path)] !== false))); + } + + function vdump_par($tree) + { + foreach($tree as $key => $val) + { + if ($val === false) + debug($key.' -> false
'); + else + debug($key.' -> ' .$val->path.'
'); + } + debug('
'); + } + + $menu = new HTML_TreeMenu(); + $filename = ''; + if (isset($_GET) && isset($_GET['fileName'])) $filename = $_GET['fileName']; + $filename = realpath($filename); + $pd = (substr(PHP_OS, 0, 3) == 'WIN') ? '\\' : '/'; + $test = ($pd == '/') ? '/' : 'C:\\'; + if (empty($filename) || ($filename == $test)) + { + $filename = ($pd == '/') ? '/' : 'C:\\'; + $node = false; + getDir($filename,$node); + } else + { + flush(); +// if ($pd != '/') $pd = $pd.$pd; + $anode = false; + switchDirTree($filename,$anode); +// recurseDir($filename,$anode); + $node = new HTML_TreeNode(array('text' => "Click to view $filename",'link' => "",'icon' => 'branchtop.gif')); + $node->addItem($anode); + }; + $menu->addItem($node); + $DHTMLmenu = &new HTML_TreeMenu_DHTML($menu, array('images' => 'HTML_TreeMenu-1.1.2/images')); + ?> + + + "; + echo "

Parsing Files ...

"; + flush(); + echo "
\n";
+    /** phpdoc.inc */
+    include("phpDocumentor/phpdoc.inc");
+    echo "
\n"; + echo "

Operation Completed!!

"; + } else + { + ?> + +

+ phpDocumentor v Web Interface +

+ phpDocumentor written by Joshua Eichorn
+ Web Interface written by Juan Pablo Morales and enhanced by Greg Beaver
+ + + + + + +
+ Help + + use this to find directories and files which can be used below +
+ + +
+ +printMenu(); +?> +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Use a pre-created config file for form values. + + Normally, phpDocumentor uses the form values from this form to set up parsing. In version 1.2, + phpDocumentor allows you to "save" form values in configuration files so that you can replicate + common complicated documentation tasks with only one time. Just choose a config file below or create a + new one and refresh this page to choose it.
change config directory:changed to "'.$_REQUEST['altuserdir'].'"'; ?> + Choose a config:
+
+ Target + + Target is the directory where + the output produced by phpDocumentor will reside
+
+ + Add the directory in the help box +
+ Files to parse + + This is a group of comma-separated names of php files + or tutorials that will be processed by phpDocumentor.
+
+ + Add the file in the help box +
+ Directory to parse + + This is a group of comma-separated directories where php files + or tutorials are found that will be processed by phpDocumentor. + phpDocumentor automatically parses subdirectories
+
+ + Add the directory in the help box +
+ Files to ignore + + A list of files (full path or filename), and patterns + to ignore. Patterns may use wildcards * and ?. To + ignore all subdirectories named "test" for example, + using "test/" To ignore all files and directories + with test in their name use "*test*" +
+ + Add the directory in the help box +
+ Generated Documentation Title + + Choose a title for the generated documentation
+
+
+ Default Package Name + + Choose a name for the default package
+
+
+ Custom Tags + + Custom Tags is a comma-separated list of tags + you want phpDocumentor to include as valid tags + in this parse. An example would be "value, size" + to allow @value and @size tags. +
+
+ Packages to parse + + The parameter packages is a group of comma + separated names of abstract packages that will + be processed by phpDocumentor. All package names must be + separated by commas.
+
+
+ Output Information + +
+ Outputformat + may be HTML, XML, PDF, or CHM (case-sensitive) in version 1.2. There is only one Converter + for both CHM and PDF, default. There are 2 HTML Converters, + frames and Smarty. frames templates may be any of:

+ default, l0l33t, phpdoc.de, phphtmllib, phpedit, DOM/default, DOM/l0l33t, or DOM/phpdoc.de. + Smarty templates may be any of:

+ default or PHP.
+
+There is only 1 template for all other Converters, default +
Output type:Converter name:template name
+
+ + Add the converter in the help box
+ + Use ONLY the converter in the help box +
+ Parse @access private + + The parameter Parse @access private tells phpDocumentor + whether to parse elements with an "@access private" tag in their docblock
+ Parse private
+
+ JavaDoc-compliant Description parsing. + + Normally, phpDocumentor uses several rules to determine the short description. This switch + asks phpDocumentor to simply search for the first period (.) and use it to delineate the short + description. In addition, the short description will not be separated from the long description
+ JavaDoc-compliant Description
+
+ +
+
+
+
+

+ Joshua Eichorn jeichorn@phpdoc.org
+ Juan Pablo Morales ju-moral@uniandes.edu.co
+ Gregory Beaver cellog@users.sourceforge.net +

+

+ If you have any problems with phpDocumentor, please visit the website: phpdocu.sourceforge.net and + submit a bug +

+ + +
+Last modified: $Date: 2005/10/17 18:15:16 $
+Revision: $Revision: 1.1 $
+
+ + + + + diff --git a/buildscripts/PhpDocumentor/pear-phpdoc b/buildscripts/PhpDocumentor/pear-phpdoc new file mode 100644 index 00000000..258af7c8 --- /dev/null +++ b/buildscripts/PhpDocumentor/pear-phpdoc @@ -0,0 +1,38 @@ +#!@PHP-BIN@ + diff --git a/buildscripts/PhpDocumentor/pear-phpdoc.bat b/buildscripts/PhpDocumentor/pear-phpdoc.bat new file mode 100644 index 00000000..04e3bcc3 --- /dev/null +++ b/buildscripts/PhpDocumentor/pear-phpdoc.bat @@ -0,0 +1,145 @@ +@ECHO OFF +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: +:: Batch file to start phpDocumentor with PHP's CLI +:: +:: This SW was contributed by BlueShoes www.blueshoes.org "The PHP Framework" +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +::---------------------------------------------------------------------------------- +:: Please set following to PHP's CLI +:: NOTE: In PHP 4.2.x the PHP-CLI used to be named php-cli.exe. +:: PHP 4.3.x names it php.exe but stores it in a subdir called /cli/php.exe +:: E.g. for PHP 4.2 C:\phpdev\php-4.2-Win32\php-cli.exe +:: for PHP 4.3 C:\phpdev\php-4.3-Win32\cli\php.exe + + SET phpCli=@PHP-BIN@ + + + +::--------------------------------------------------------------------------------- +::--------------------------------------------------------------------------------- +:: Do not modify below this line!! (Unless you know what your doing :) +::--------------------------------------------------------------------------------- +::--------------------------------------------------------------------------------- + +:: Only show this intro when no options are passed +IF '%1'=='' ( + ECHO ****************************************************************************** + ECHO * PhpDocument Command-Line Starter + ECHO * + ECHO * phpDocumentor is a JavaDoc-like automatic documentation generator for PHP + ECHO * written in PHP. It is the most versatile tool for documenting PHP. + ECHO * + ECHO * This batch-file will try to run the phpDocumentor using the command-line + ECHO * version of PHP4. NOTE: It will not run with the PHP ISAPI module! + ECHO * Please update the path in this batch-file to your PHP-CLI. + ECHO * + ECHO * Tip: o Grab a copy of one of the ini-files in the user/ dir of the + ECHO * phpDocumentor and modify the settings there. + ECHO * o To see the command line options type phpdoc -h + ECHO * + ECHO * @version 1.3 2003-06-28 + ECHO * @author Sam Blum sam@blueshoes.org + ECHO * @Copyright Free Software released under the GNU/GPL license + ECHO * + ECHO * This SW was contributed by BlueShoes www.blueshoes.org "The PHP Framework" + ECHO ****************************************************************************** +) + +:: Check existence of php.exe +IF EXIST "%phpCli%" ( + SET doNothing= +) ELSE GOTO :NoPhpCli + +:: If called using options, just call phpdoc and end after without pausing. +:: This will allow use where pausing is not wanted. +IF '%1'=='' ( + SET doNothing= +) ELSE ( + "%phpCli%" "@BIN-DIR@\phpdoc" %* + GOTO :EOF +) + + +SET iniFile= + +ECHO ------------------------------------------------------------------------------ +ECHO Select Ini-File [default is phpDocumentor.ini] +ECHO ------------------------------------------------------------------------------ +ECHO # 0: phpDocumentor.ini +SET count=0 +FOR /R "@DATA-DIR@\PhpDocumentor\user" %%I IN (*.ini) DO ( + SET /a count+=1 + CALL :exec ECHO # %%count%%: %%~nI%%~xI +) + +:LOOP_1 +:: SET /P prompts for input and sets the variable +:: to whatever the user types +SET iniNr= +SET /P iniNr=Type a number and press Enter[0]: + +:: Use default +IF '%iniNr%'=='' ( + SET iniNr=0 +) + +:: Check for default selection +SET iniFile=phpDocumentor.ini +IF %iniNr%==0 ( + CALL :exec GOTO :run + GOTO :PAUSE_END +) + +:: Check selected +SET count=0 +SET found= +FOR /R "@DATA-DIR@\PhpDocumentor\user" %%I IN (*.ini) DO ( + SET /a count+=1 + SET iniFile=%%~nI%%~xI + CALL :exec IF '%%iniNr%%'=='%%count%%' GOTO :run +) + +:: Check if selected # was found +IF '%found%'=='' ( + ECHO Invalid input [%iniNr%]... try again + ECHO. + GOTO :LOOP_1 +) + +:: +:: php.exe not found error +GOTO :PAUSE_END +:NoPhpCli +ECHO ** ERROR ***************************************************************** +ECHO * Sorry, can't find the php.exe file. +ECHO * You must edit this file to point to your php.exe (CLI version!) +ECHO * [Currently set to %phpCli%] +ECHO * +ECHO * NOTE: In PHP 4.2.x the PHP-CLI used to be named php-cli.exe. +ECHO * PHP 4.3.x renamed it php.exe but stores it in a subdir +ECHO * called /cli/php.exe +ECHO * E.g. for PHP 4.2 C:\phpdev\php-4.2-Win32\php-cli.exe +ECHO * for PHP 4.3 C:\phpdev\php-4.3-Win32\cli\php.exe +ECHO ************************************************************************** + +:: +:: Stupid MS-batch: Can't evaluate environment variable inside a FOR loop!!! :(( +GOTO :PAUSE_END +:exec +%* +GOTO :EOF + +:: +:: Start the phpDocumentor +GOTO :PAUSE_END +:run +SET found=1 +ECHO Starting: "%phpCli%" "@BIN-DIR@\phpdoc" -c "%iniFile%" +ECHO. +"%phpCli%" "@BIN-DIR@\phpdoc" -c "%iniFile%" +GOTO :EOF + +:PAUSE_END +PAUSE \ No newline at end of file diff --git a/buildscripts/PhpDocumentor/phpDocumentor.ini b/buildscripts/PhpDocumentor/phpDocumentor.ini new file mode 100644 index 00000000..bbb01631 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor.ini @@ -0,0 +1,118 @@ +;; phpDocumentor.ini +;; +;; contains all the runtime values that are configurable. +;; This is moved from phpdoc.inc, to remove the necessity to edit the php code and +;; simplify debugging +[DEBUG] +;; If you want to see the internals of the parser in action, set this to true +PHPDOCUMENTOR_DEBUG = false +;; set to true if you want to eliminate extra whitespace in doc comments (slows things down quite a bit) +PHPDOCUMENTOR_KILL_WHITESPACE = false + +[_phpDocumentor_options] +;; this is the value that will be displayed as the root directory +Program_Root = +;; uncomment this to set the path phpDocumentor looks in to find user files +;userdir = user/ + +;; Use useconfig if you want to be able to run phpdoc with no command-line options (!!) +;; change the value of useconfig to an .ini file that is in users/ (like greg.ini) +;[_phpDocumentor_setting] +;useconfig = default + +[_phpDocumentor_phpfile_exts] +php +php3 +php4 +phtml +inc + +;; deprecated in 1.2 +;; this list is informational only - the following tags will be parsed as +;; having meaning, everything else will be treated as text by the output +;; converter, meaning in the HTML converter, all other tags will be htmlentitied +;[_phpDocumentor_html_allowed] +;ul +;ol +;li +;p +;strong +;pre +;a +;code +;br +;var +;samp +;kbd + +[_phpDocumentor_tags_allowed] +abstract +access +author +category +copyright +;; for Zend IDE support - minimal at best +desc +deprec +deprecated +example +exception +filesource +final +global +ignore +internal +license +link +magic +name +package +param +parameter +return +;; alias for @return +returns +see +since +source +static +staticvar +subpackage +throws +todo +TODO +tutorial +uses +var +version +;; compat tags, things wont parse right in incorrectly documented code without them +;; hopefully better error handling in handleDockeyword allows these to go away +;; this is a dumb tag included for pear compatability see bug# 558028 +extends +private +public + +[_phpDocumentor_inline_doc_tags_allowed] +example +inheritdoc +internal +link +source +tutorial + +[_phpDocumentor_inline_tutorial_tags_allowed] +category +example +id +link +toc +tutorial + +;; custom files to include in RIC +;; these MUST be in upper-case +[_phpDocumentor_RIC_files] +README +INSTALL +CHANGELOG +FAQ +NEWS diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Classes.inc b/buildscripts/PhpDocumentor/phpDocumentor/Classes.inc new file mode 100644 index 00000000..d4f29745 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Classes.inc @@ -0,0 +1,1068 @@ + + * @since 1.0rc1 + * @version $Id: Classes.inc,v 1.1 2005/10/17 18:36:55 jeichorn Exp $ + */ +/** + * Intermediate class parsing structure. + * + * The {@link phpDocumentor_IntermediateParser} class uses this class and its + * cousin, {@link ProceduralPages} to organize all parsed source code elements. + * Data is fed to each immediately after it is parsed, and at conversion time, + * everything is organized. + * + * The Classes class is responsible for all inheritance, including resolving + * name conflicts between classes, determining which classes extend other + * classes, and is responsible for all inheritance of documentation. + * {@internal + * This structure parses classes, vars and methods by file, and then iterates + * over the class tree to set up inheritance. The {@link Inherit()} + * method is the meat of the class, and processes the class trees from root to + * branch, ensuring that parsing order is unimportant.}} + * @package phpDocumentor + * @author Greg Beaver + * @since 1.0rc1 + * @version $Id: Classes.inc,v 1.1 2005/10/17 18:36:55 jeichorn Exp $ + */ +class Classes +{ + /**#@+ + * @access private + */ + /** + * file being parsed, used in every add function to match up elements with + * the file that contains them + * + * This variable is used during parsing to associate class elements added + * to the data structures that contain them with the file they reside in + * @see addClass(), addMethod(), addVar(), nextFile() + * @var string + */ + var $curfile; + /** + * class being parsed, used to match up methods and vars with their parent + * class + * + * This variable is used during parsing to associate class elements added + * to the data structures that contain them with the file they reside in + * @see addMethod(), addVar() + * @var string + */ + var $curclass; + + /** + * Used when a definite match is made between a parent class and a child + * class + * + * This variable is used in post-parsing. + * + * Format: array(parent => array(parentfile => array(child => childfile))) + * @var array + */ + var $definitechild; + /** + * array of parsed classes organized by the name of the file that contains + * the class. + * + * Format: + * array(filename => array(classname => {@link parserClass})) + * @var array + */ + var $classesbyfile = array(); + /** + * array of file names organized by classes that are in the file. + * + * This structure is designed to handle name conflicts. Two files can + * contain classes with the same name, and this array will record both + * filenames to help control linking and inheritance errors + * + * Format:
+     * array(classname => array(name of file containing classname,
+     *                          name of file 2 containing classname...)
+ * @var array + */ + var $classesbynamefile = array(); + /** + * array of parsed methods organized by the file that contains them. + * + * Format:
+     * array(filename => array(classname => array({@link parserMethod} 1, 
+     *                                            {@link parserMethod} 2,...))
+ * @var array + */ + var $methodsbyfile = array(); + /** + * array of parsed vars organized by the file that contains them. + * + * Format: + * array(filename => array(classname => array({@link parserVar} 1, {@link parserVar} 2,...)) + * @var array + */ + var $varsbyfile = array(); + /** + * array of parsed class constants organized by the file that contains them. + * + * Format: + * array(filename => array(classname => array({@link parserConst} 1, {@link parserConst} 2,...)) + * @var array + */ + var $constsbyfile = array(); + /** + * keeps track of extend declarations by file, used to find inheritance + * + * Format: + * array(filename => array(classname => parentclassname)) + * @var array + */ + var $extendsbyfile = array(); + /** + * Keeps track of child classes by file. + * Since phpDocumentor can document collections of files that contain name + * conflicts (PHP would give a fatal error), it + * is impossible to assume a class that declares "extends foo" necessarily + * extends the class foo in file X. It could be an + * extended class of class foo in file Y. Because of this, phpDocumentor + * relies on packaging to resolve the name conflict + * This array keeps track of the packages of a child class + * + * Format: + * array(parentclassname => array(filename => array(childclassname => + * array(packagename, packagename))) + * @var array + */ + var $classchildrenbyfile = array(); + /** + * Keeps track of class packages found in a file. + * This is used in {@link getParentClass()} to determine the number of + * packages in a file, in order to resolve inheritance issues + * Format: array(filename => array(packagename1, packagename2,...)) + * @var array + */ + var $classpackagebyfile = array(); + /** + * a tree of class inheritance by name. + * + * format:
+     * array(childname => parentname,
+     *       childname1 => parentname1,
+     *       rootname => 0, ...
+     *      )
+ * @var array + * @see Converter::generateSortedClassTreeFromClass() + */ + var $classparents = array(); + /** + * Keeps track of package and subpackage for each class name, organized + * by package + * + * Format:
+     * array(classname => array(path => array(package,subpackage),
+     *                          path2 => array(package,subpackage),...))
+ * @var array + */ + var $classpathpackages = array(); + /** + * used to delete duplicates in the same package to avoid documentation errors + * + * Specifically used in {@link Converter::checkKillClass()} + */ + var $killclass = array(); + /** + * array of methods by package and class + * + * format:
+     * array(packagename =>
+     *         array(classname =>
+     *               array(methodname1 => {@link parserMethod} class,
+     *                     methodname2 => {@link parserMethod} class,...)
+     *                      )
+     *              )
+     *      )
+ * @var array + * @see Converter + */ + var $methods = array(); + + /** + * array of class variables by package and class + * + * format:
+     * array(packagename =>
+     *         array(classname =>
+     *                array(variablename1 => {@link parserVar} class,
+     *                      variablename2 => {@link parserVar} class,...
+     *                     )
+     *              )
+     *      )
+ * @var array + * @see Converter + */ + var $vars = array(); + + /** + * array of class variables by package and class + * + * format:
+     * array(packagename =>
+     *         array(classname =>
+     *                array(constname1 => {@link parserConst} class,
+     *                      constname2 => {@link parserConst} class,...
+     *                     )
+     *              )
+     *      )
+ * @var array + * @see Converter + */ + var $consts = array(); + /** + * Reverse class_packages_by_file, used to prevent duplicates + * @var array Format: array(packagename => 1) + */ + var $revcpbf = array(); + /** + * All classes with no parents (no extends clause) are tracked in this array + * by the file that contains them. + * + * Format:
+     * array(classname => array(name of file1 that contains root classname,
+     *                          name of file2 that contains root classname,...))
+ * @var array + */ + var $roots = array(); + + /** + * array of all files that contain classes with the same name + * @var array Format: (classname => array(path1, path2,...)) + */ + var $potentialclassconflicts = array(); + + /** + * array of all inter-package name conflicts of classes + * + * This array allows documentation of PHP namespace conflicts that would + * occur should a user try to include these files in the same file + * @var array Format: (classname => array(path1, path2,...)) + */ + var $classconflicts = array(); + /**#@-*/ + /** + * While parsing, add a class to the list of parsed classes + * + * sets up the {@link $classesbyfile, $classesbynamefile, $extendsbyfile}, + * {@link $classchildrenbyfile, $roots} arrays, and sets {@link $curclass} + * @param parserClass &$element element is a {@link parserClass} + * @uses addPackageToFile() marks the current class's package as being + * present in a file + */ + function addClass(&$element) + { + $this->curclass = $element->getName(); + $element->curfile = $this->curfile; + if (isset($this->classesbyfile[$this->curfile][$this->curclass])) + { + addWarning(PDERROR_ELEMENT_IGNORED,'class',$this->curclass,$this->curfile); + $this->curclass = false; + return; + } + $this->classesbyfile[$this->curfile][$this->curclass] = $element; + $this->classesbynamefile[$this->curclass][] = $this->curfile; + $this->extendsbyfile[$this->curfile][$this->curclass] = $element->getExtends(); + $this->classchildrenbyfile[$element->getExtends()][$this->curfile][$this->curclass][] = $element->docblock->package; + if ($element->docblock->getExplicitPackage()) + $this->addPackageToFile($element->docblock->package); + if (!$element->getExtends()) + { + $this->roots[$this->curclass][] = $this->curfile; + } + } + + /** + * While parsing, add a method to the list of parsed methods + * + * sets up the {@link $methodsbyfile} array using {@link $curfile} and + * {@link $curclass} + * @param parserMethod &$element element is a {@link parserMethod} + */ + function addMethod(&$element) + { + if (!$this->curclass) return; + $this->methodsbyfile[$this->curfile][$this->curclass][] = $element; + } + + /** + * While parsing, add a variable to the list of parsed variables + * + * sets up the {@link $varsbyfile} array using {@link $curfile} and {@link $curclass} + * @param parserVar &$element element is a {@link parserVar} + */ + function addVar(&$element) + { + if (!$this->curclass) return; + $this->varsbyfile[$this->curfile][$this->curclass][] = $element; + } + + /** + * While parsing, add a variable to the list of parsed variables + * + * sets up the {@link $constsbyfile} array using {@link $curfile} and {@link $curclass} + * @param parserConst &$element element is a {@link parserConst} + */ + function addConst(&$element) + { + if (!$this->curclass) return; + $this->constsbyfile[$this->curfile][$this->curclass][] = $element; + } + + /** + * Prepare to parse a new file + * + * sets {@link $curfile} to $file and {@link $curclass} to false (no class being parsed) + * @param string $file file currently being parsed + */ + function nextFile($file) + { + $this->curfile = $file; + $this->curclass = false; + } + + /** + * Mark a package as being used in a class + * + * {@source} + * @param string $package package name + */ + function addPackageToFile($package) + { + if (!isset($this->revcpbf[$this->curfile][$package])) + $this->classpackagebyfile[$this->curfile][] = $package; + $this->revcpbf[$this->curfile][$package] = 1; + } + + /** + * Find the parent class of $class, and set up structures to note this fact + * + * Modifies the {@link parserClass} element in {@link $classesbyfile} to use + * the parent's package, and inherit methods/vars + * @param string $class child class to find parent class + * @param string $file file child class is located in + * @uses $definitechild if a match is made between a parent class and parameter + * $class in file $file, then definitechild is set here + * @uses getParentClass() to find the parent class + */ + function setClassParent($class,$file) + { + if (is_array($par = $this->getParentClass($class,$file))) + { +// phpDocumentor_out("$file class $class extends ".$par[1]." file ".$par[0]."\n"); + $this->classesbyfile[$file][$class]->setParent($par[1],$par[0],$this); + $this->definitechild[$par[1]][$par[0]][$class] = $file; + } else + { + $this->classesbyfile[$file][$class]->setParentNoClass($par); + } + } + + /** + * Main processing engine for setting up class inheritance. + * + * This function uses {@link $roots} to traverse the inheritance tree via + * {@link processChild()} and returns the data structures + * phpDocumentor_IntermediateParser needs to convert parsed data + * to output using {@link phpDocumentor_IntermediateParser::Convert()} + * @param phpDocumentor_IntermediateParser + * @uses processChild() set up inheritance + */ + function Inherit(&$render) + { + phpDocumentor_out("\nProcessing Class Inheritance\n\n"); + flush(); + phpDocumentor_out("\nProcessing Root Trees\n\n"); + flush(); + foreach($this->roots as $class => $files) + { + for ($i=0; $iprocessChild($render,$class,$files[$i]); + } + } + if (0) + foreach($this->classesbyfile as $i => $j) + { + foreach($j as $k => $m) + { + var_dump($i,$k); + if ($i == 'iConverter') + { + var_dump($j); + } + } + } + phpDocumentor_out("\nProcessing leftover classes (classes that extend root classes not found in the same package)\n"); + flush(); + foreach($this->classesbyfile as $i => $j) + { + foreach($j as $k => $m) + { + $this->processChild($render,$k,$i,true); + } + } + phpDocumentor_out("done processing leftover classes\n"); + flush(); + $this->setupClassConflicts(); + } + + /** + * Transfers actual conflicts from {@link $potentialClassconflicts} to + * {@link $classconflicts} + * @access private + * @uses $potentialclassconflicts transfers values to {@link $classconflicts} + */ + function setupClassConflicts() + { + foreach($this->potentialclassconflicts as $class => $paths) + { + if (count($paths) - 1) + { //conflict + $package = array(); + foreach($paths as $path) + { + // create a list of conflicting classes in each package + if (isset($this->classpathpackages[$class][$path])) + $package[$this->classpathpackages[$class][$path][0]][] = $path; + } + foreach($package as $pathpackages) + { + // if at least 2 functions exist in the same package, delete all but the first one and add warnings + if (count($pathpackages) - 1) + { + for($i=1; $i < count($pathpackages); $i++) + { + if (isset($this->classesbyfile[$pathpackages[$i]])) + { + addWarning(PDERROR_ELEMENT_IGNORED,'class',$class,$pathpackages[$i]); + $this->killClass($class,$pathpackages[$i]); + $oth = array_flip($paths); + unset($paths[$oth[$pathpackages[$i]]]); + } + } + } + } + $this->classconflicts[$class] = $paths; + } + } + } + + /** + * If a package contains two classes with the same name, this function finds + * that conflict + * + * Returns the {@link $classconflicts} entry for class $class, minus its own path + * @return mixed returns false if no conflicts, or an array of paths containing conflicts + */ + function getConflicts($class) + { + if (!isset($this->classconflicts[$class])) return false; + $a = array(); + foreach($this->classconflicts[$class] as $conflict) + { + $a[$this->classesbyfile[$conflict][$class]->docblock->package] = $this->classesbyfile[$conflict][$class]; + } + return $a; + } + + /** + * sets up {@link $killclass} for use by Converter::checkKillClass() + * @access private + */ + function killClass($class,$path) + { + $this->killclass[$class][$path] = true; + } + + /** + * This function recursively climbs up the class tree, setting inherited + * information like package and adds the elements to phpDocumentor_IntermediateParser. + * + * Using structures defined in {@link Classes}, the function first sets package information, + * and then seeks out child classes. + * It uses 3 tests to determine whether a class is a child class. + *
    + *
  1. child class is in the same file as the parent class and extends parent class
  2. + *
  3. child class is in a different file and specifies the parent's @package in its docblock
  4. + *
  5. child class is in a different file and is in a different @package, with one possible parent class
  6. + *
+ * @param phpDocumentor_IntermediateParser &$render + * @param string $class class to process + * @param string $file name of file $class is located in + * @param boolean $furb flag used privately to control informational output while parsing + * (used when processing leftover classes in {@link Inherit()} + * @global string default package, usually "default" + */ + function processChild(&$render,$class,$file,$furb = false) + { + global $phpDocumentor_DefaultPackageName; + if (isset($this->classesbyfile[$file][$class]->processed)) return; + $this->potentialclassconflicts[$class][] = $file; + if ($furb) phpDocumentor_out("Processing $class in file $file\n"); + flush(); + $this->classesbyfile[$file][$class]->processed = true; + $db = $this->classesbyfile[$file][$class]; + $render->addUses($db,$file); + if (!$render->parsePrivate) + { + // if this class has an @access private, and parse private is disabled, remove it + if ($db->docblock->hasaccess) + { + $aaa = $db->docblock->getKeyword('access'); + if (is_object($aaa) && $aaa->getString() == 'private') + { + if (isset($this->varsbyfile[$file]) && isset($this->varsbyfile[$file][$class])) + { + unset($this->varsbyfile[$file][$class]); + } + if (isset($this->methodsbyfile[$file]) && isset($this->methodsbyfile[$file][$class])) + { + unset($this->methodsbyfile[$file][$class]); + } + if (isset($this->constsbyfile[$file]) && isset($this->constsbyfile[$file][$class])) + { + unset($this->constsbyfile[$file][$class]); + } + $this->classesbyfile[$file][$class]->ignore = true; + // if this is a root class, remove it from the roots array + if (isset($this->roots[$class])) + foreach($this->roots[$class] as $i => $files) + { + // find the file kkey and unset + if ($files == $file) unset($this->roots[$class][$i]); + } + // if this is a child, remove it from the list of child classes of its parent + if ($db->getExtends()) unset($this->classchildrenbyfile[$db->getExtends()][$file]); + return; + } + } + } + if ($render->packageoutput) + { + if (!in_array($db->docblock->package,$render->packageoutput)) + { + if (isset($this->varsbyfile[$file]) && isset($this->varsbyfile[$file][$class])) + { + unset($this->varsbyfile[$file][$class]); + } + if (isset($this->methodsbyfile[$file]) && isset($this->methodsbyfile[$file][$class])) + { + unset($this->methodsbyfile[$file][$class]); + } + if (isset($this->constsbyfile[$file]) && isset($this->constsbyfile[$file][$class])) + { + unset($this->constsbyfile[$file][$class]); + } + $this->classesbyfile[$file][$class]->ignore = true; + if (isset($this->roots[$class])) + foreach($this->roots[$class] as $i => $files) + { + if ($files == $file) unset($this->roots[$class][$i]); + } + if ($db->getExtends()) unset($this->classchildrenbyfile[$db->getExtends()][$file]); + return; + } + } + $this->setClassParent($class,$file); + $db = $this->classesbyfile[$file][$class]; + if ($furb && !is_array($db->parent)) + { +// debug("furb adding $class $file to roots"); + $this->roots[$class][] = $file; + } + // fix for 591396 + if (!$db->docblock->getExplicitPackage()) + { + $a = $render->proceduralpages->pagepackages[$file]; + if ($a[0] != $phpDocumentor_DefaultPackageName) + { + // inherit page package + $this->classesbyfile[$file][$class]->docblock->package = $a[0]; + } + } + if ($this->classesbyfile[$file][$class]->docblock->package == $render->proceduralpages->pagepackages[$file][0]) + { + if ($this->classesbyfile[$file][$class]->docblock->subpackage == '') + $this->classesbyfile[$file][$class]->docblock->subpackage = $render->proceduralpages->pagepackages[$file][1]; + } + $db = $this->classesbyfile[$file][$class]; + $render->addPackageParent($db); + $render->addPageIfNecessary($file, $db); + if ($access = $db->docblock->getKeyword('access')) + { + if (!is_string($access) && is_object($access)) $access = $access->getString(); + if (!is_string($access)) $access = 'public'; + if (($access == 'private') && (!$render->parsePrivate)) + { + if (isset($this->varsbyfile[$file]) && isset($this->varsbyfile[$file][$class])) + foreach($this->varsbyfile[$file][$class] as $i => $vr) + { + $vr->docblock->addKeyword('access','private'); + $this->varsbyfile[$file][$class][$i] = $vr; + } + if (isset($this->methodsbyfile[$file]) && isset($this->methodsbyfile[$file][$class])) + foreach($this->methodsbyfile[$file][$class] as $i => $vr) + { + $vr->docblock->addKeyword('access','private'); + $this->methodsbyfile[$file][$class][$i] = $vr; + } + if (isset($this->constsbyfile[$file]) && isset($this->constsbyfile[$file][$class])) + foreach($this->constsbyfile[$file][$class] as $i => $vr) + { + $vr->docblock->addKeyword('access','private'); + $this->constsbyfile[$file][$class][$i] = $vr; + } + } + } + $this->classpathpackages[$class][$file] = array($db->docblock->package,$db->docblock->subpackage); + if ($db->docblock->getExplicitPackage()) + $render->proceduralpages->addClassPackageToFile($file,$db->docblock->package,$db->docblock->subpackage); + $render->addElementToPage($db,$file); + if (isset($this->varsbyfile[$file]) && isset($this->varsbyfile[$file][$class])) + foreach($this->varsbyfile[$file][$class] as $i => $vr) + { + $vr->docblock->package = $db->docblock->package; + $vr->docblock->subpackage = $db->docblock->subpackage; + $render->addElementToPage($vr,$file); + $render->addUses($vr,$file); + $this->varsbyfile[$file][$class][$i] = $vr; + $this->vars[$db->docblock->package][$class][$vr->getName()] = $vr; + } + if (isset($this->methodsbyfile[$file]) && isset($this->methodsbyfile[$file][$class])) + foreach($this->methodsbyfile[$file][$class] as $i => $vr) + { + $vr->docblock->package = $db->docblock->package; + $vr->docblock->subpackage = $db->docblock->subpackage; + $render->addElementToPage($vr,$file); + $render->addUses($vr,$file); + $this->methodsbyfile[$file][$class][$i] = $vr; + $this->methods[$db->docblock->package][$class][$vr->getName()] = $vr; + } + if (isset($this->constsbyfile[$file]) && isset($this->constsbyfile[$file][$class])) + foreach($this->constsbyfile[$file][$class] as $i => $vr) + { + $vr->docblock->package = $db->docblock->package; + $vr->docblock->subpackage = $db->docblock->subpackage; + $render->addElementToPage($vr,$file); + $render->addUses($vr,$file); + $this->constsbyfile[$file][$class][$i] = $vr; + $this->methods[$db->docblock->package][$class][$vr->getName()] = $vr; + } + $this->classpackages[$class][] = array($db->docblock->package,$db->docblock->subpackage); + if (is_array($db->parent)) + $this->classparents[$db->docblock->package][$class] = $db->parent[1]; + else + $this->classparents[$db->docblock->package][$class] = $db->getExtends(); + if (is_array($db->parent)) + { + $z = $this->getClass($db->parent[1],$db->parent[0]); + $this->classchildren[$z->docblock->package][$db->parent[1]][] = $db; + } + if (isset($this->classchildrenbyfile[$class])) + { + foreach($this->classchildrenbyfile[$class] as $childfile => $other) + { + // test 1, inherits in same file (must be same package) + if ($childfile == $file) + { + foreach($other as $child => $packages) + { +// debug("parent $class same file $child"); + $this->processChild($render,$child,$childfile); + $x = $this->getClass($child,$childfile); + if ($x->docblock->package != $GLOBALS['phpDocumentor_DefaultPackageName']) + { + // child package need root for class trees + if ($x->docblock->package != $db->docblock->package) + { +// debug("adding $child in $childfile 1"); + $this->roots[$child][] = $childfile; + } + } + } + } else + { + // test 2, different file, same package + foreach($other as $child => $packages) + { + for($j=0; $jclassesbyfile[$file][$class]->docblock->package == $packages[$j]) + { + $this->processChild($render,$child,$childfile); +// debug("$childfile diff file $child, parent $class, same package ".$packages[$j]); + } else + { + // test 3, different file, different package, only 1 parent is possible + if (isset($this->classesbynamefile[$child])) + { + // 1 possible parent + if (count($this->classesbynamefile[$class]) == 1) + { +// debug("$childfile diff file $child, diff package, 1 possible parent root $class"); + $this->processChild($render,$child,$childfile); + $x = $this->getClass($child,$childfile); + if ($x->docblock->package != $GLOBALS['phpDocumentor_DefaultPackageName']) + { + // child package need root for class trees + if ($x->docblock->package != $db->docblock->package) + { +// debug("adding roots $child in $childfile 2"); + $this->roots[$child][] = $childfile; + } + } + } + } + } + } + } + } + } + } + } + + /** + * Get the parserClass representation of a class from its name and file + * @return parserClass + * @param string $class classname + * @param string $file file classname is located in + */ + function &getClass($class, $file) + { +// debug("getClass called with class $class file $file"); + return $this->classesbyfile[$file][$class]; + } + + /** + * Used by {@link parserData::getClasses()} to retrieve classes defined in file $path + * + * retrieves the array entry from {@link $classesbyfile} for $path + * @param string $path full path to filename + * @return mixed returns false if no classes defined in the file, otherwise returns an array of {@link parserClass}es + */ + function getClassesInPath($path) + { + if (!isset($this->classesbyfile[$path])) return false; + return $this->classesbyfile[$path]; + } + + /** + * called by {@link parserClass::hasMethods()}. Should not be directly called + * @access private + * @param string $file + * @param string $class + */ + function hasMethods($file,$class) + { + return isset($this->methodsbyfile[$file][$class]); + } + + /** + * called by {@link parserClass::hasConsts()}. Should not be directly called + * @access private + * @param string $file + * @param string $class + */ + function hasConsts($file,$class) + { + return isset($this->constsbyfile[$file][$class]); + } + + /** + * called by {@link parserClass::hasVars()}. Should not be directly called + * @access private + * @param string $file + * @param string $class + */ + function hasVars($file, $class) + { + return isset($this->varsbyfile[$file][$class]); + } + + /** + * called by {@link parserClass::hasMethod()}. Should not be directly called + * @param string $file + * @param string $class + * @param string $name method name + * @access private + */ + function hasMethod($class, $file, $name) + { + if (!$this->hasMethods($file, $class)) return false; + for($i=0; $imethodsbyfile[$file][$class]); $i++) + { + if ($this->methodsbyfile[$file][$class][$i]->getName() == $name) return true; + } + return false; + } + + /** + * called by {@link parserClass::hasVar()}. Should not be directly called + * @param string $file + * @param string $class + * @param string $name var name + * @access private + */ + function hasVar($class, $file, $name) + { + if (!$this->hasVars($file, $class)) return false; + for($i=0; $ivarsbyfile[$file][$class]); $i++) + { + if ($this->varsbyfile[$file][$class][$i]->getName() == $name) return true; + } + return false; + } + + /** + * called by {@link parserClass::hasConst()}. Should not be directly called + * @param string $file + * @param string $class + * @param string $name var name + * @access private + */ + function hasConst($class, $file, $name) + { + if (!$this->hasConsts($file, $class)) return false; + for($i=0; $iconstsbyfile[$file][$class]); $i++) + { + if ($this->constsbyfile[$file][$class][$i]->getName() == $name) return true; + } + return false; + } + + /** + * called by {@link parserClass::getMethods()}. Should not be directly called + * @access private + * @param string $class + * @param string $file + */ + function &getMethods($class, $file) + { + if (!isset($this->methodsbyfile[$file][$class])) return false; + return $this->methodsbyfile[$file][$class]; + } + + /** + * called by {@link parserClass::getVars()}. Should not be directly called + * @access private + * @param string $class + * @param string $file + */ + function &getVars($class, $file) + { + if (!isset($this->varsbyfile[$file][$class])) return false; + return $this->varsbyfile[$file][$class]; + } + + /** + * called by {@link parserClass::getConsts()}. Should not be directly called + * @access private + * @param string $class + * @param string $file + */ + function &getConsts($class, $file) + { + if (!isset($this->constsbyfile[$file][$class])) return false; + return $this->constsbyfile[$file][$class]; + } + + /** + * called by {@link parserClass::getMethod()}. Should not be directly called + * @param string $class + * @param string $file + * @param string $name method name + * @access private + */ + function getMethod($class, $file, $name) + { + if (!$this->hasMethod($class, $file, $name)) return false; + for($i=0; $imethodsbyfile[$file][$class]); $i++) + { + if ($this->methodsbyfile[$file][$class][$i]->getName() == $name) return $this->methodsbyfile[$file][$class][$i]; + } + } + + /** + * called by {@link parserClass::getVar()}. Should not be directly called + * @param string $class + * @param string $file + * @param string $name var name + * @access private + */ + function getVar($class, $file, $name) + { + if (!$this->hasVar($class, $file, $name)) return false; + for($i=0; $ivarsbyfile[$file][$class]); $i++) + { + if ($this->varsbyfile[$file][$class][$i]->getName() == $name) return $this->varsbyfile[$file][$class][$i]; + } + } + + /** + * called by {@link parserClass::getConst()}. Should not be directly called + * @param string $class + * @param string $file + * @param string $name var name + * @access private + */ + function getConst($class, $file, $name) + { + if (!$this->hasConst($class, $file, $name)) return false; + for($i=0; $iconstsbyfile[$file][$class]); $i++) + { + if ($this->constsbyfile[$file][$class][$i]->getName() == $name) return $this->constsbyfile[$file][$class][$i]; + } + } + + /** + * Search for a class in a package + * @return mixed returns false if no class in $package, otherwise returns a {@link parserClass} + * @param string $class classname + * @param string $package package classname is in + */ + function &getClassByPackage($class,$package) + { + if (!isset($this->classesbynamefile[$class])) + { +// addWarning(PDERROR_CLASS_NOT_IN_PACKAGE,$class,$package); // removed, too many warnings, not very useful + return false; + } + for($i=0; $i < count($this->classesbynamefile[$class]); $i++) + { + $cls = $this->classesbyfile[$this->classesbynamefile[$class][$i]][$class]; + $pkg = $cls->getPackage(); + if ($pkg == $package) + return $cls; + } +// addWarning(PDERROR_CLASS_NOT_IN_PACKAGE,$class,$package); + return false; + } + + /** + * Find the parent class of a class in file $file + * uses 3 tests to find the parent classname: + *
    + *
  1. only one class with the parent classname
  2. + *
  3. more than one class, but only one in the same file as the child
  4. + *
  5. only one parent class in the same package as the child
  6. + *
+ * @return mixed false if no parent class, a string if no parent class found by that name, + * and an array(file parentclass is in,parentclassname) + */ + function getParentClass($class,$file) + { + if (!isset($this->classesbyfile[$file][$class])) + { + return false; + } + $element = $this->classesbyfile[$file][$class]; + if (!($ex = $element->getExtends())) return false; + // first check to see if there is one and only one class with the parent class's name + if (isset($this->classesbynamefile[$ex])) + { + if (count($this->classesbynamefile[$ex]) == 1) + { + if ($this->classesbyfile[$this->classesbynamefile[$ex][0]][$ex]->ignore) return $ex; + return array($this->classesbynamefile[$ex][0],$ex); + } else + { + // next check to see if there is a parent class in the same file + if (isset($this->classesbyfile[$file][$ex])) + { + if ($this->classesbyfile[$file][$ex]->ignore) return $ex; + return array($file,$ex); + } + // next check to see if there is only one package used in the file, try to resolve it that way + if (isset($this->classpackagebyfile[$file])) + { + if (count($this->classpackagebyfile[$file]) == 1) + { + for($i=0;$iclassesbynamefile[$ex]);$i++) + { + if ($this->classesbyfile[$this->classesbynamefile[$ex][$i]][$ex]->getPackage() == $this->classpackagebyfile[$file][0]) + { + if ($this->classesbyfile[$this->classesbynamefile[$ex][$i]][$ex]->ignore) return $ex; + return array($this->classesbynamefile[$ex][$i],$ex); + } + } + } + } + // name conflict + addWarning(PDERROR_INHERITANCE_CONFLICT, $class, $file, $ex); + return $ex; + } + } else + { + addWarning(PDERROR_PARENT_NOT_FOUND, $class, $ex); + return $ex; + } + } + + /** + * Get a list of all root classes indexed by package. Used to generate + * class trees by {@link Converter} + * @return array array(package => array(rootclassname, rootclassname,...),...) + */ + function getRoots() + { + $roots = array(); + foreach($this->roots as $class => $files) + { + if (count($files)) + { + foreach($files as $i => $boofou) + { + $x = $this->getClass($class,$files[$i]); + $roots[$x->getPackage()][] = $class; + } + } + } + foreach($roots as $package => $root) + { + usort($roots[$package],"strnatcasecmp"); + } + return $roots; + } + + /** + * Get all classes confirmed in parsing to be descended class $parclass in file $file + * @return mixed either false if no children, or array of format + * array(childname => childfile,childname2 => childfile2,...) + * @param string $parclass name of parent class + * @param string $file file parent class is found in + * @see parserClass::getChildClassList() + * @uses $definitechild + */ + function getDefiniteChildren($parclass,$file) + { + if (isset($this->definitechild[$parclass][$file])) return $this->definitechild[$parclass][$file]; + return false; + } +} +?> diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converter.inc b/buildscripts/PhpDocumentor/phpDocumentor/Converter.inc new file mode 100644 index 00000000..5b499d65 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converter.inc @@ -0,0 +1,5189 @@ + + * @since 1.0rc1 + * @version $Id: Converter.inc,v 1.5 2005/11/28 07:27:59 cellog Exp $ + */ +/** + * Smarty template files + */ +include_once("phpDocumentor/Smarty-2.6.0/libs/Smarty.class.php"); +/** + * Base class for all output converters. + * + * The Converter marks the final stage in phpDocumentor. phpDocumentor works + * in this order: + * + *
Parsing => Intermediate Parsing organization => Conversion to output
+ * + * A Converter takes output from the {@link phpDocumentor_IntermediateParser} and + * converts it to output. With version 1.2, phpDocumentor includes a variety + * of output converters: + *
    + *
  • {@link HTMLframesConverter}
  • + *
  • {@link HTMLSmartyConverter}
  • + *
  • {@link PDFdefaultConverter}
  • + *
  • {@link CHMdefaultConverter}
  • + *
  • {@link CSVdia2codeConverter}
  • + *
  • {@link XMLDocBookConverter}
  • + *
+ * {@internal + * The converter takes output directly from {@link phpDocumentor_IntermediateParser} + * and using {@link walk()} or {@link walk_everything} (depending on the value of + * {@link $sort_absolutely_everything}) it "walks" over an array of phpDocumentor elements.}} + * + * @package Converters + * @abstract + * @author Greg Beaver + * @since 1.0rc1 + * @version $Id: Converter.inc,v 1.5 2005/11/28 07:27:59 cellog Exp $ + */ +class Converter +{ + /** + * output format of this converter + * + * in Child converters, this will match the first part of the -o command-line + * as in -o HTML:frames:default "HTML" + * @tutorial phpDocumentor.howto.pkg#using.command-line.output + * @var string + */ + var $outputformat = 'Generic'; + /** + * package name currently being converted + * @var string + */ + var $package = 'default'; + /** + * subpackage name currently being converted + * @var string + */ + var $subpackage = ''; + /** + * set to a classname if currently parsing a class, false if not + * @var string|false + */ + var $class = false; + /**#@+ + * @access private + */ + /** + * the workhorse of linking. + * + * This array is an array of link objects of format: + * [package][subpackage][eltype][elname] = descendant of {@link abstractLink} + * eltype can be page|function|define|class|method|var + * if eltype is method or var, the array format is: + * [package][subpackage][eltype][class][elname] + * @var array + * @see functionLink, pageLink, classLink, defineLink, methodLink, varLink, globalLink + */ + var $links = array(); + + /** + * the workhorse of linking, with allowance for support of multiple + * elements in different files. + * + * This array is an array of link objects of format: + * [package][subpackage][eltype][file][elname] = descendant of {@link abstractLink} + * eltype can be function|define|class|method|var + * if eltype is method or var, the array format is: + * [package][subpackage][eltype][file][class][elname] + * @var array + * @see functionLink, pageLink, classLink, defineLink, methodLink, varLink, globalLink + */ + var $linkswithfile = array(); + /**#@-*/ + /** + * set to value of -po commandline + * @tutorial phpDocumentor.howto.pkg#using.command-line.packageoutput + * @var mixed + */ + var $package_output; + + /** + * name of current page being converted + * @var string + */ + var $page; + + /** + * path of current page being converted + * @var string + */ + var $path; + + /** + * template for the procedural page currently being processed + * @var Smarty + */ + var $page_data; + + /** + * template for the class currently being processed + * @var Smarty + */ + var $class_data; + + /** + * current procedural page being processed + * @var parserPage + */ + var $curpage; + /** + * alphabetical index of all elements sorted by package, subpackage, page, + * and class. + * @var array Format: array(package => array(subpackage => array('page'|'class' => array(path|classname => array(element, element,...))))) + * @uses $sort_absolutely_everything if true, then $package_elements is used, + * otherwise, the {@link ParserData::$classelements} and + * {@link ParserData::$pageelements} variables are used + */ + var $package_elements = array(); + /** + * alphabetical index of all elements + * + * @var array Format: array(first letter of element name => array({@link parserElement} or {@link parserPage},...)) + * @see formatIndex(), HTMLframesConverter::formatIndex() + */ + var $elements = array(); + /** + * alphabetized index of procedural pages by package + * + * @see $leftindex + * @var array Format: array(package => array(subpackage => array({@link pageLink} 1,{@link pageLink} 2,...) + */ + var $page_elements = array(); + /** + * alphabetized index of defines by package + * + * @see $leftindex + * @var array Format: array(package => array(subpackage => array({@link defineLink} 1,{@link defineLink} 2,...) + */ + var $define_elements = array(); + /** + * alphabetized index of classes by package + * + * @see $leftindex + * @var array Format: array(package => array(subpackage => array({@link classLink} 1,{@link classLink} 2,...) + */ + var $class_elements = array(); + /** + * alphabetized index of global variables by package + * + * @see $leftindex + * @var array Format: array(package => array(subpackage => array({@link globalLink} 1,{@link globalLink} 2,...) + */ + var $global_elements = array(); + /** + * alphabetized index of functions by package + * + * @see $leftindex + * @var array Format: array(package => array(subpackage => array({@link functionLink} 1,{@link functionLink} 2,...) + */ + var $function_elements = array(); + /** + * alphabetical index of all elements, indexed by package/subpackage + * + * @var array Format: array(first letter of element name => array({@link parserElement} or {@link parserPage},...)) + * @see formatPkgIndex(), HTMLframesConverter::formatPkgIndex() + */ + var $pkg_elements = array(); + + /** + * alphabetical index of all elements on a page by package/subpackage + * + * The page itself has a link under ###main + * @var array Format: array(package => array(subpackage => array(path => array({@link abstractLink} descendant 1, ...))) + * @see formatLeftIndex() + */ + var $page_contents = array(); + + /** + * This determines whether the {@link $page_contents} array should be sorted by element type as well as alphabetically by name + * @see sortPageContentsByElementType() + * @var boolean + */ + var $sort_page_contents_by_type = false; + /** + * This is used if the content must be passed in the order it should be read, i.e. by package, procedural then classes + * + * This fixes bug 637921, and is used by {@link PDFdefaultConverter} + */ + var $sort_absolutely_everything = false; + /** + * alphabetical index of all methods and vars in a class by package/subpackage + * + * The class itself has a link under ###main + * @var array + * Format:
+     * array(package =>
+     *       array(subpackage =>
+     *             array(path =>
+     *                   array(class =>
+     *                         array({@link abstractLink} descendant 1, ...
+     *                        )
+     *                  )
+     *            )
+     *      )
+ * @see formatLeftIndex() + */ + var $class_contents = array(); + /** + * controls processing of elements marked private with @access private + * + * defaults to false. Set with command-line --parseprivate or -pp + * @var bool + */ + var $parseprivate; + /** + * controls display of progress information while parsing. + * + * defaults to false. Set to true for cron jobs or other situations where no visual output is necessary + * @var bool + */ + var $quietmode; + + /** + * directory that output is sent to. -t command-line sets this. + * @tutorial phpDocumentor.howto.pkg#using.command-line.target + */ + var $targetDir = ''; + + /** + * Directory that the template is in, relative to phpDocumentor root directory + * @var string + */ + var $templateDir = ''; + + /** + * Directory that the smarty templates are in + * @var string + */ + var $smarty_dir = ''; + + /** + * Name of the template, from last part of -o + * @tutorial phpDocumentor.howto.pkg#using.command-line.output + * @var string + */ + var $templateName = ''; + + /** + * full path of the current file being converted + */ + var $curfile; + + /** + * All class information, organized by path, and by package + * @var Classes + */ + var $classes; + + /** + * Hierarchy of packages + * + * Every package that contains classes may have parent or child classes + * in other packages. In other words, this code is legal: + * + * + * /** + * * @package one + * * / + * class one {} + * + * /** + * * @package two + * * / + * class two extends one {} + * + * + * In this case, package one is a parent of package two + * @var array + * @see phpDocumentor_IntermediateParser::$package_parents + */ + var $package_parents; + + /** + * Packages associated with categories + * + * Used by the XML:DocBook/peardoc2 converter, and available to others, to + * group many packages into categories + * @see phpDocumentor_IntermediateParser::$packagecategories + * @var array + */ + var $packagecategories; + + /** + * All packages encountered in parsing + * @var array + * @see phpDocumentor_IntermediateParser::$all_packages + */ + var $all_packages; + + /** + * A list of files that have had source code generated + * @var array + */ + var $sourcePaths = array(); + + /** + * Controls which of the one-element-only indexes are generated. + * + * Generation of these indexes for large packages is time-consuming. This is an optimization feature. An + * example of how to use this is in {@link HTMLframesConverter::$leftindex}, and in {@link HTMLframesConverter::formatLeftIndex()}. + * These indexes are intended for use as navigational aids through documentation, but can be used for anything by converters. + * @see $class_elements, $page_elements, $function_elements, $define_elements, $global_elements + * @see formatLeftIndex() + * @var array + */ + var $leftindex = array('classes' => true, 'pages' => true, 'functions' => true, 'defines' => true, 'globals' => true); + + /** @access private */ + var $killclass = false; + /** + * @var string + * @see phpDocumentor_IntermediateParser::$title + */ + var $title = 'Generated Documentation'; + + /** + * Options for each template, parsed from the options.ini file in the template base directory + * @tutorial phpDocumentor/tutorials.pkg#conversion.ppage + * @var array + */ + var $template_options; + + /** + * Tutorials and Extended Documentation parsed from a tutorials/package[/subpackage] directory + * @tutorial tutorials.pkg + * @access private + */ + var $tutorials = array(); + + /** + * tree-format structure of tutorials and their child tutorials, if any + * @var array + * @access private + */ + var $tutorial_tree = false; + + /** + * list of tutorials that have already been processed. Used by @link _setupTutorialTree() + * @var array + * @access private + */ + var $processed_tutorials; + + /** + * List of all @todo tags and a link to the element with the @todo + * + * Format: array(package => array(link to element, array(todo {@link parserTag},...)),...) + * @tutorial tags.todo.pkg + * @var array + */ + var $todoList = array(); + + /** + * Initialize Converter data structures + * @param array {@link $all_packages} value + * @param array {@link $package_parents} value + * @param Classes {@link $classes} value + * @param ProceduralPages {@link $proceduralpages} value + * @param array {@link $package_output} value + * @param boolean {@link $parseprivate} value + * @param boolean {@link $quietmode} value + * @param string {@link $targetDir} value + * @param string {@link $templateDir} value + * @param string (@link $title} value + */ + function Converter(&$allp, &$packp, &$classes, &$procpages, $po, $pp, $qm, $targetDir, $template, $title) + { + $this->all_packages = $allp; + $this->package_parents = $packp; + $this->package = $GLOBALS['phpDocumentor_DefaultPackageName']; + $this->proceduralpages = &$procpages; + $this->package_output = $po; + if (is_array($po)) + { + $a = $po[0]; + $this->all_packages = array_flip($po); + $this->all_packages[$a] = 1; + } + $this->parseprivate = $pp; + $this->quietmode = $qm; + $this->classes = &$classes; + $this->roots = $classes->getRoots(); + $this->title = $title; + $this->setTemplateDir($template); + $this->setTargetdir($targetDir); + } + + /** + * Called by IntermediateParser after creation + * @access private + */ + function setTutorials($tutorials) + { + $this->tutorials = $tutorials; + } + + /** + * @param pkg|cls|proc the tutorial type to search for + * @param tutorial name + * @param string package name + * @param string subpackage name, if any + * @return false|parserTutorial if the tutorial exists, return it + */ + function hasTutorial($type, $name, $package, $subpackage = '') + { + if (isset($this->tutorials[$package][$subpackage][$type][$name . '.' . $type])) + return $this->tutorials[$package][$subpackage][$type][$name . '.' . $type]; + return false; + } + + /** + * Called by {@link walk()} while converting, when the last class element + * has been parsed. + * + * A Converter can use this method in any way it pleases. HTMLframesConverter + * uses it to complete the template for the class and to output its + * documentation + * @see HTMLframesConverter::endClass() + * @abstract + */ + function endClass() + { + } + + /** + * Called by {@link walk()} while converting, when the last procedural page + * element has been parsed. + * + * A Converter can use this method in any way it pleases. HTMLframesConverter + * uses it to complete the template for the procedural page and to output its + * documentation + * @see HTMLframesConverter::endClass() + * @abstract + */ + function endPage() + { + } + + /** + * Called by {@link walk()} while converting. + * + * This method is intended to be the place that {@link $pkg_elements} is + * formatted for output. + * @see HTMLframesConverter::formatPkgIndex() + * @abstract + */ + function formatPkgIndex() + { + } + + /** + * Called by {@link walk()} while converting. + * + * This method is intended to be the place that {@link $elements} is + * formatted for output. + * @see HTMLframesConverter::formatIndex() + * @abstract + */ + function formatIndex() + { + } + + /** + * Called by {@link walk()} while converting. + * + * This method is intended to be the place that any of + * {@link $class_elements, $function_elements, $page_elements}, + * {@link $define_elements}, and {@link $global_elements} is formatted for + * output, depending on the value of {@link $leftindex} + * @see HTMLframesConverter::formatLeftIndex() + * @abstract + */ + function formatLeftIndex() + { + } + + /** + * Called by {@link parserSourceInlineTag::stringConvert()} to allow + * converters to format the source code the way they'd like. + * + * default returns it unchanged (html with xhtml tags) + * @param string output from highlight_string() - use this function to + * reformat the returned data for Converter-specific output + * @return string + * @deprecated in favor of tokenizer-based highlighting. This will be + * removed for 2.0 + */ + function unmangle($sourcecode) + { + return $sourcecode; + } + + /** + * Initialize highlight caching + */ + function startHighlight() + { + $this->_highlightCache = array(false, false); + $this->_appendHighlight = ''; + } + + function getHighlightState() + { + return $this->_highlightCache; + } + + function _setHighlightCache($type, $token) + { + $test = ($this->_highlightCache[0] === $type && $this->_highlightCache[1] == $token); + if (!$test) { + $this->_appendHighlight = $this->flushHighlightCache(); + } else { + $this->_appendHighlight = ''; + } + $this->_highlightCache = array($type, $token); + return $test; + } + + /** + * Return the close text for the current token + * @return string + */ + function flushHighlightCache() + { + $hc = $this->_highlightCache; + $this->_highlightCache = array(false, false); + if ($hc[0]) { + if (!isset($this->template_options[$hc[0]]['/'.$hc[1]])) { + return ''; + } + return $this->template_options[$hc[0]]['/'.$hc[1]]; + } + return ''; + } + + /** + * Used to allow converters to format the source code the way they'd like. + * + * default returns it unchanged. Mainly used by the {@link HighlightParser} + * {@internal + * The method takes information from options.ini, the template options + * file, specifically the [highlightSourceTokens] and [highlightSource] + * sections, and uses them to enclose tokens. + * + * {@source}}} + * @param integer token value from {@link PHP_MANUAL#tokenizer tokenizer constants} + * @param string contents of token + * @param boolean whether the contents are preformatted or need modification + * @return string + */ + function highlightSource($token, $word, $preformatted = false) + { + if ($token !== false) + { + if (!$preformatted) $word = $this->postProcess($word); + if (isset($this->template_options['highlightSourceTokens'][token_name($token)])) + { + if ($this->_setHighlightCache('highlightSourceTokens', token_name($token))) { + return $word; + } + $e = $this->_appendHighlight; + return $e . $this->template_options['highlightSourceTokens'][token_name($token)] . $word; + } else + { + $this->_setHighlightCache(false, false); + $e = $this->_appendHighlight; + return $e . $word; + } + } else + { + if (isset($this->template_options['highlightSource'][$word])) + { + $newword = ($preformatted ? $word : $this->postProcess($word)); + if ($this->_setHighlightCache('highlightSource', $word)) { + return $newword; + } + $e = $this->_appendHighlight; + return $e . $this->template_options['highlightSource'][$word] . $newword; + } else + { + $this->_setHighlightCache(false, false); + $e = $this->_appendHighlight; + return $e . ($preformatted ? $word : $this->postProcess($word)); + } + } + } + + /** + * Used to allow converters to format the source code of DocBlocks the way + * they'd like. + * + * default returns it unchanged. Mainly used by the {@link HighlightParser} + * {@internal + * The method takes information from options.ini, the template options + * file, specifically the [highlightDocBlockSourceTokens] section, and uses + * it to enclose tokens. + * + * {@source}}} + * @param string name of docblock token type + * @param string contents of token + * @param boolean whether the contents are preformatted or need modification + * @return string + */ + function highlightDocBlockSource($token, $word, $preformatted = false) + { + if (empty($word)) { + $this->_setHighlightCache(false, false); + $e = $this->_appendHighlight; + return $e . $word; + } + if (isset($this->template_options['highlightDocBlockSourceTokens'][$token])) + { + if (!$preformatted) $word = $this->postProcess($word); + if ($this->_setHighlightCache('highlightDocBlockSourceTokens', $token)) { + return $word; + } + $e = $this->_appendHighlight; + return $e . $this->template_options['highlightDocBlockSourceTokens'][$token] . $word; + } else { + $this->_setHighlightCache(false, false); + $e = $this->_appendHighlight; + return $e . ($preformatted ? $word : $this->postProcess($word)); + } + } + + /** + * Used to allow converters to format the source code of DocBlocks the way + * they'd like. + * + * default returns it unchanged. Mainly used by the {@link HighlightParser} + * {@internal + * The method takes information from options.ini, the template options + * file, specifically the [highlightDocBlockSourceTokens] section, and uses + * it to enclose tokens. + * + * {@source}}} + * @param string name of docblock token type + * @param string contents of token + * @param boolean whether the contents are preformatted or need modification + * @return string + */ + function highlightTutorialSource($token, $word, $preformatted = false) + { + if (empty($word)) { + $this->_setHighlightCache(false, false); + $e = $this->_appendHighlight; + return $e . $word; + } + if (isset($this->template_options['highlightTutorialSourceTokens'][$token])) + { + if (!$preformatted) $word = $this->postProcess($word); + if ($this->_setHighlightCache('highlightTutorialSourceTokens', $token)) { + return $word; + } + $e = $this->_appendHighlight; + return $e . $this->template_options['highlightTutorialSourceTokens'][$token] . $word; + } else { + $this->_setHighlightCache(false, false); + $e = $this->_appendHighlight; + return $e . ($preformatted ? $word : $this->postProcess($word)); + } + } + + /** + * Called by {@link parserReturnTag::Convert()} to allow converters to + * change type names to desired formatting + * + * Used by {@link XMLDocBookConverter::type_adjust()} to change true and + * false to the peardoc2 values + * @param string + * @return string + */ + function type_adjust($typename) + { + return $typename; + } + + /** + * Used to convert the {@}example} inline tag in a docblock. + * + * By default, this just wraps ProgramExample + * @see XMLDocBookpeardoc2Converter::exampleProgramExample + * @param string + * @param boolean true if this is to highlight a tutorial + * @return string + */ + function exampleProgramExample($example, $tutorial = false, $inlinesourceparse = null/*false*/, + $class = null/*false*/, $linenum = null/*false*/, $filesourcepath = null/*false*/) + { + return $this->ProgramExample($example, $tutorial, $inlinesourceparse, $class, $linenum, $filesourcepath); + } + + /** + * Used to convert the <> tag in a docblock + * @param string + * @param boolean true if this is to highlight a tutorial + * @return string + */ + function ProgramExample($example, $tutorial = false, $inlinesourceparse = null/*false*/, + $class = null/*false*/, $linenum = null/*false*/, $filesourcepath = null/*false*/) + { + if (tokenizer_ext) + { + $e = $example; + if (!is_array($example)) + { + $obj = new phpDocumentorTWordParser; + $obj->setup($example); + $e = $obj->getFileSource(); + if (!isset($e[0]) || !is_array($e[0][0]) || $e[0][0][0] != T_OPEN_TAG) + { + $example = "setup($example); + $e = $obj->getFileSource(); + unset($e[0]); + $e = array_values($e); + } + unset($obj); + } + $saveclass = $this->class; + $parser = new phpDocumentor_HighlightParser; + if (!isset($inlinesourceparse)) + { + $example = $parser->parse($e, $this, true); // force php mode + } else + { + if (isset($filesourcepath)) + { + $example = $parser->parse($e, $this, $inlinesourceparse, $class, $linenum, $filesourcepath); + } elseif (isset($linenum)) + { + $example = $parser->parse($e, $this, $inlinesourceparse, $class, $linenum); + } elseif (isset($class)) + { + $example = $parser->parse($e, $this, $inlinesourceparse, $class); + } else + { + $example = $parser->parse($e, $this, $inlinesourceparse); + } + } + $this->class = $saveclass; + } else + { + $example = $this->postProcess($example); + } + + if ($tutorial) + { + return $example; + } + + if (!isset($this->template_options['desctranslate'])) return $example; + if (!isset($this->template_options['desctranslate']['code'])) return $example; + $example = $this->template_options['desctranslate']['code'] . $example; + if (!isset($this->template_options['desctranslate']['/code'])) return $example; + return $example . $this->template_options['desctranslate']['/code']; + } + + /** + * @param string + */ + function TutorialExample($example) + { + $parse = new phpDocumentor_TutorialHighlightParser; + return $parse->parse($example, $this); + } + + /** + * Used to convert the contents of <
  • > in a docblock + * @param string + * @return string + */ + function ListItem($item) + { + if (!isset($this->template_options['desctranslate'])) return $item; + if (!isset($this->template_options['desctranslate']['li'])) return $item; + $item = $this->template_options['desctranslate']['li'] . $item; + if (!isset($this->template_options['desctranslate']['/li'])) return $item; + return $item . $this->template_options['desctranslate']['/li']; + } + + /** + * Used to convert the contents of <
      > or <
        > in a docblock + * @param string + * @return string + */ + function EncloseList($list,$ordered) + { + $listname = ($ordered ? 'ol' : 'ul'); + if (!isset($this->template_options['desctranslate'])) return $list; + if (!isset($this->template_options['desctranslate'][$listname])) return $list; + $list = $this->template_options['desctranslate'][$listname] . $list; + if (!isset($this->template_options['desctranslate']['/'.$listname])) return $list; + return $list . $this->template_options['desctranslate']['/'.$listname]; + } + + /** + * Used to convert the contents of <
        > in a docblock
        +     * @param string
        +     * @return string
        +     */
        +    function PreserveWhiteSpace($string)
        +    {
        +        if (!isset($this->template_options['desctranslate'])) return $string;
        +        if (!isset($this->template_options['desctranslate']['pre'])) return $string;
        +        $string = $this->template_options['desctranslate']['pre'] . $string;
        +        if (!isset($this->template_options['desctranslate']['/pre'])) return $string;
        +        return $string . $this->template_options['desctranslate']['/pre'];
        +    }
        +
        +    /**
        +     * Used to enclose a paragraph in a docblock
        +     * @param string
        +     * @return string
        +     */
        +    function EncloseParagraph($para)
        +    {
        +        if (!isset($this->template_options['desctranslate'])) return $para;
        +        if (!isset($this->template_options['desctranslate']['p'])) return $para;
        +        $para = $this->template_options['desctranslate']['p'] . $para;
        +        if (!isset($this->template_options['desctranslate']['/p'])) return $para;
        +        return $para . $this->template_options['desctranslate']['/p'];
        +    }
        +
        +    /**
        +     * Used to convert the contents of <> in a docblock
        +     * @param string
        +     * @return string
        +     */
        +    function Bolden($para)
        +    {
        +        if (!isset($this->template_options['desctranslate'])) return $para;
        +        if (!isset($this->template_options['desctranslate']['b'])) return $para;
        +        $para = $this->template_options['desctranslate']['b'] . $para;
        +        if (!isset($this->template_options['desctranslate']['/b'])) return $para;
        +        return $para . $this->template_options['desctranslate']['/b'];
        +    }
        +
        +    /**
        +     * Used to convert the contents of <> in a docblock
        +     * @param string
        +     * @return string
        +     */
        +    function Italicize($para)
        +    {
        +        if (!isset($this->template_options['desctranslate'])) return $para;
        +        if (!isset($this->template_options['desctranslate']['i'])) return $para;
        +        $para = $this->template_options['desctranslate']['i'] . $para;
        +        if (!isset($this->template_options['desctranslate']['/i'])) return $para;
        +        return $para . $this->template_options['desctranslate']['/i'];
        +    }
        +
        +    /**
        +     * Used to convert the contents of <> in a docblock
        +     * @param string
        +     * @return string
        +     */
        +    function Varize($para)
        +    {
        +        if (!isset($this->template_options['desctranslate'])) return $para;
        +        if (!isset($this->template_options['desctranslate']['var'])) return $para;
        +        $para = $this->template_options['desctranslate']['var'] . $para;
        +        if (!isset($this->template_options['desctranslate']['/var'])) return $para;
        +        return $para . $this->template_options['desctranslate']['/var'];
        +    }
        +
        +    /**
        +     * Used to convert the contents of <> in a docblock
        +     * @param string
        +     * @return string
        +     */
        +    function Kbdize($para)
        +    {
        +        if (!isset($this->template_options['desctranslate'])) return $para;
        +        if (!isset($this->template_options['desctranslate']['kbd'])) return $para;
        +        $para = $this->template_options['desctranslate']['kbd'] . $para;
        +        if (!isset($this->template_options['desctranslate']['/kbd'])) return $para;
        +        return $para . $this->template_options['desctranslate']['/kbd'];
        +    }
        +
        +    /**
        +     * Used to convert the contents of <> in a docblock
        +     * @param string
        +     * @return string
        +     */
        +    function Sampize($para)
        +    {
        +        if (!isset($this->template_options['desctranslate'])) return $para;
        +        if (!isset($this->template_options['desctranslate']['samp'])) return $para;
        +        $para = $this->template_options['desctranslate']['samp'] . $para;
        +        if (!isset($this->template_options['desctranslate']['/samp'])) return $para;
        +        return $para . $this->template_options['desctranslate']['/samp'];
        +    }
        +
        +    /**
        +     * Used to convert <
        > in a docblock + * @param string + * @return string + */ + function Br($para) + { + if (!isset($this->template_options['desctranslate'])) return $para; + if (!isset($this->template_options['desctranslate']['br'])) return $para; + $para = $this->template_options['desctranslate']['br'] . $para; + return $para; + } + + /** + * This version does nothing + * + * Perform necessary post-processing of string data. For example, the HTML + * Converters should escape < and > to become < and > + * @return string + */ + function postProcess($text) + { + return $text; + } + + /** + * Creates a table of contents for a {@}toc} inline tag in a tutorial + * + * This function should return a formatted table of contents. By default, it + * does nothing, it is up to the converter to format the TOC + * @abstract + * @return string table of contents formatted for use in the current output format + * @param array format: array(array('tagname' => section, 'link' => returnsee link, 'id' => anchor name, 'title' => from title tag),...) + */ + function formatTutorialTOC($toc) + { + return ''; + } + + /** + * Write out the formatted source code for a php file + * + * This function provides the primary functionality for the + * {@tutorial tags.filesource.pkg} tag. + * @param string full path to the file + * @param string fully highlighted/linked source code of the file + * @abstract + */ + function writeSource($filepath, $source) + { + debug($source); + return; + } + + /** + * Write out the formatted source code for an example php file + * + * This function provides the primary functionality for the + * {@tutorial tags.example.pkg} tag. + * @param string example title + * @param string example filename (no path) + * @param string fully highlighted/linked source code of the file + * @abstract + */ + function writeExample($title, $path, $source) + { + return; + } + + /** Translate the path info into a unique file name for the highlighted + * source code. + * @param string $pathinfo + * @return string + */ + function getFileSourceName($path) + { + global $_phpDocumentor_options; + $pathinfo = $this->proceduralpages->getPathInfo($path, $this); + $pathinfo['source_loc'] = str_replace($_phpDocumentor_options['Program_Root'].'/','',$pathinfo['source_loc']); + $pathinfo['source_loc'] = str_replace('/','_',$pathinfo['source_loc']); + return "fsource_{$pathinfo['package']}_{$pathinfo['subpackage']}_{$pathinfo['source_loc']}"; + } + + /** Return the fixed path to the source-code file folder. + * @param string $base Path is relative to this folder + * @return string + */ + function getFileSourcePath($base) + { + if (substr($base, -1) != PATH_DELIMITER) { + $base .= PATH_DELIMITER; + } + return $base . '__filesource'; + } + + /** Return the path to the current + * @param string $pathinfo + * @return string + */ + function getCurrentPageURL() + { + return '{$srcdir}' . PATH_DELIMITER . $this->page_dir; + } + + /** + * @return string an output-format dependent link to phpxref-style highlighted + * source code + * @abstract + */ + function getSourceLink($path) + { + return ''; + } + + /** + * @return string Link to the current page being parsed. + * Should return {@link $curname} and a converter-specific extension. + * @abstract + */ + function getCurrentPageLink() + { + } + + /** + * Return a line of highlighted source code with formatted line number + * + * If the $path is a full path, then an anchor to the line number will be + * added as well + * @param integer line number + * @param string highlighted source code line + * @param false|string full path to @filesource file this line is a part of, + * if this is a single line from a complete file. + * @return string formatted source code line with line number + */ + function sourceLine($linenumber, $line, $path = false) + { + if ($path) + { + return $this->getSourceAnchor($path, $linenumber) . + $this->Br(sprintf('%-6u',$linenumber).str_replace("\n",'',$line)); + } else + { + return $this->Br(sprintf('%-6u',$linenumber).str_replace("\n",'',$line)); + } + } + + /** + * Determine whether an element's file has generated source code, used for + * linking to line numbers of source. + * + * Wrapper for {@link $sourcePaths} in this version + * @param string full path to the source code file + * @return boolean + */ + function hasSourceCode($path) + { + return isset($this->sourcePaths[$path]); + } + + /** + * Mark a file as having had source code highlighted + * @param string full path of source file + */ + function setSourcePaths($path) + { + $this->sourcePaths[$path] = true; + } + + /** + * Used to translate an XML DocBook entity like ” from a tutorial by + * reading the options.ini file for the template. + * @param string entity name + */ + function TranslateEntity($name) + { + if (!isset($this->template_options['ppage'])) + { + if (!$this->template_options['preservedocbooktags']) + return ''; + else + return '&'.$name.';'; + } + if (isset($this->template_options['ppage']['&'.$name.';'])) + { + return $this->template_options['ppage']['&'.$name.';']; + } else + { + if (!$this->template_options['preservedocbooktags']) + return ''; + else + return '&'.$name.';'; + } + } + + /** + * Used to translate an XML DocBook tag from a tutorial by reading the + * options.ini file for the template. + * @param string tag name + * @param string any attributes Format: array(name => value) + * @param string the tag contents, if any + * @param string the tag contents, if any, unpost-processed + * @return string + */ + function TranslateTag($name,$attr,$cdata,$unconvertedcdata) + { + if (!isset($this->template_options['ppage'])) + { + if (!$this->template_options['preservedocbooktags']) + return $cdata; + else + return '<'.$name.$this->AttrToString($name,$attr,true).'>'.$cdata.''."\n"; + } + // make sure this template transforms the tag into something + if (isset($this->template_options['ppage'][$name])) + { + // test for global attribute transforms like $attr$role = class, changing + // all role="*" attributes to class="*" in html, for example + foreach($attr as $att => $val) + { + if (isset($this->template_options['$attr$'.$att])) + { + $new = ''; + if (!isset($this->template_options['$attr$'.$att]['close'])) + { + $new .= '<'.$this->template_options['$attr$'.$att]['open']; + if (isset($this->template_options['$attr$'.$att]['cdata!'])) + { + if (isset($this->template_options['$attr$'.$att]['separateall'])) + $new .= $this->template_options['$attr$'.$att]['separator']; + else + $new .= ' '; + $new .= $this->template_options['$attr$'.$att]['$'.$att]; + $new .= $this->template_options['$attr$'.$att]['separator']; + if ($this->template_options['$attr$'.$att]['quotevalues']) $val = '"'.$val.'"'; + $new .= $val.'>'; + } else + { + $new .= '>'.$val; + } + $new .= 'template_options['$attr$'.$att]['open'].'>'; + } else + { + $new .= $this->template_options['$attr$'.$att]['open'] . $val . $this->template_options['$attr$'.$att]['close']; + } + unset($attr[$att]); + $cdata = $new . $cdata; + } + } + + if (!isset($this->template_options['ppage']['/'.$name])) + {// if the close tag isn't specified, we put opening and closing tags around it, with translated attributes + if (isset($this->template_options['ppage'][$name.'/'])) + $cdata = '<'.$this->template_options['ppage'][$name].$this->AttrToString($name,$attr).'/>' . $cdata; + else + $cdata = '<'.$this->template_options['ppage'][$name].$this->AttrToString($name,$attr).'>' . $cdata . + 'template_options['ppage'][$name].'>'; + } else + { // if close tag is specified, use the open and close as literal + if ($name == 'programlisting' && isset($attr['role']) && + ($attr['role'] == 'php' || $attr['role'] == 'tutorial' || $attr['role'] == 'html')) + { // highlight PHP source +// var_dump($unconvertedcdata, $cdata);exit; + if ($attr['role'] == 'php') { + $cdata = $this->ProgramExample($unconvertedcdata, true); + } elseif ($attr['role'] == 'tutorial') { + $cdata = $this->TutorialExample($unconvertedcdata); + } elseif ($attr['role'] == 'html') { + $cdata = $unconvertedcdata; + } + } else + {// normal case below + $cdata = $this->template_options['ppage'][$name].$this->AttrToString($name,$attr). $cdata .$this->template_options['ppage']['/'.$name]; + } + } + return $cdata; + } else + { + if ($this->template_options['preservedocbooktags']) + { + return '<'.$name.$this->AttrToString($name,$attr,true).'>' . $cdata . + ''."\n"; + } else + { + return $cdata; + } + } + } + + /** + * Convert the attribute of a Tutorial docbook tag's attribute list + * to a string based on the template options.ini + * @param string tag name + * @param attribute array + * @param boolean if true, returns attrname="value"... + * @return string + */ + function AttrToString($tag,$attr,$unmodified = false) + { + $ret = ''; + if ($unmodified) + { + $ret = ' '; + foreach($attr as $n => $v) + { + $ret .= $n.' = "'.$v.'"'; + } + return $ret; + } + // no_attr tells us to ignore all attributes + if (isset($this->template_options['no_attr'])) return $ret; + // tagname! tells us to ignore all attributes for this tag + if (isset($this->template_options['ppage'][$tag.'!'])) return $ret; + if (count($attr)) $ret = ' '; + // pass 1, check to see if any attributes add together + $same = array(); + foreach($attr as $n => $v) + { + if (isset($this->template_options['ppage'][$tag.'->'.$n])) + { + $same[$this->template_options['ppage'][$tag.'->'.$n]][] = $n; + } + } + foreach($attr as $n => $v) + { + if (isset($this->template_options['ppage'][$tag.'->'.$n])) + { + if (count($same[$this->template_options['ppage'][$tag.'->'.$n]]) == 1) + { // only 1 attribute translated for this one + // this is useful for equivalent value names + if (isset($this->template_options['ppage'][$tag.'->'.$n.'+'.$v])) $v = $this->template_options['ppage'][$tag.'->'.$n.'+'.$v]; + } else + { // more than 1 attribute combines to make the new attribute + $teststrtemp = array(); + foreach($same[$this->template_options['ppage'][$tag.'->'.$n]] as $oldattr) + { + $teststrtemp[] = $oldattr.'+'.$attr[$oldattr]; + } + $teststrs = array(); + $num = count($same[$this->template_options['ppage'][$tag.'->'.$n]]); + for($i=0;$i<$num;$i++) + { + $started = false; + $a = ''; + for($j=$i;!$started || $j != $i;$j = ($j + $i) % $num) + { + if (!empty($a)) $a .= '|'; + $a .= $teststrtemp[$j]; + } + $teststrs[$i] = $a; + } + $done = false; + foreach($teststrs as $test) + { + if ($done) break; + if (isset($this->template_options['ppage'][$tag.'->'.$test])) + { + $done = true; + $v = $this->template_options['ppage'][$tag.'->'.$test]; + } + } + } + $ret .= $this->template_options['ppage'][$tag.'->'.$n].' = "'.$v.'"'; + } else + { + if (!isset($this->template_options['ppage'][$tag.'!'.$n])) + { + if (isset($this->template_options['ppage']['$attr$'.$n])) + $ret .= $this->template_options['ppage']['$attr$'.$n].' = "'.$v.'"'; + else + $ret .= $n.' = "'.$v.'"'; + } + } + } + return $ret; + } + + /** + * Convert the title of a Tutorial docbook tag section + * to a string based on the template options.ini + * @param string tag name + * @param array + * @param string title text + * @param string + * @return string + */ + function ConvertTitle($tag,$attr,$title,$cdata) + { + if (!isset($this->template_options[$tag.'_title'])) return array($attr,$title.$cdata); + if (isset($this->template_options[$tag.'_title']['tag_attr'])) + { + $attr[$this->template_options[$tag.'_title']['tag_attr']] = urlencode($cdata); + $cdata = ''; + } elseif(isset($this->template_options[$tag.'_title']['cdata_start'])) + { + $cdata = $this->template_options[$tag.'_title']['open'] . $title . + $this->template_options[$tag.'_title']['close'] . $cdata; + } else $cdata = $title.$cdata; + return array($attr,$cdata); + } + + /** + * Return a converter-specific id to distinguish tutorials and their + * sections + * + * Used by {@}id} + * @return string + */ + function getTutorialId($package,$subpackage,$tutorial,$id) + { + return $package.$subpackage.$tutorial.$id; + } + + /** + * Create the {@link $elements, $pkg_elements} and {@link $links} arrays + * @access private + * @todo version 2.0 - faulty package_output logic should be removed + * + * in this version, if the parent file isn't in the package, all + * the procedural elements are simply shunted to another package! + */ + function _createPkgElements(&$pages) + { + if (empty($this->elements)) + { + $this->elements = array(); + $this->pkg_elements = array(); + $this->links = array(); + phpDocumentor_out('Building indexes...'); + flush(); + foreach($pages as $j => $flub) + { + $this->package = $pages[$j]->parent->package; + $this->subpackage = $pages[$j]->parent->subpackage; + $this->class = false; + $this->curfile = $pages[$j]->parent->getFile(); + $this->curname = $this->getPageName($pages[$j]->parent); + $this->curpath = $pages[$j]->parent->getPath(); + $use = true; + if ($this->package_output) + { + if (in_array($this->package,$this->package_output)) + { + $this->addElement($pages[$j]->parent,$pages[$j]); + } else + { + if (count($pages[$j]->classelements)) + { + list(,$pages[$j]->parent->package) = each($this->package_output); + reset($this->package_output); + $pages[$j]->parent->subpackage = ''; + $this->addElement($pages[$j]->parent,$pages[$j]); + } else + { + unset($pages[$j]); + continue; + } + } + } else + { + $this->addElement($pages[$j]->parent,$pages[$j]); + } + if ($use) + for($i=0; $ielements); $i++) + { + $pages[$j]->elements[$i]->docblock->package = $this->package; + $pages[$j]->elements[$i]->docblock->subpackage = $this->subpackage; + $this->proceduralpages->replaceElement($pages[$j]->elements[$i]); + $this->addElement($pages[$j]->elements[$i]); + } + for($i=0; $iclasselements); $i++) + { + if ($this->class) + { + if ($pages[$j]->classelements[$i]->type == 'class') + { + if ($this->checkKillClass($pages[$j]->classelements[$i]->getName(),$pages[$j]->classelements[$i]->getPath())) continue; + $this->package = $pages[$j]->classelements[$i]->docblock->package; + if ($this->package_output) if (!in_array($this->package,$this->package_output)) continue; + $this->subpackage = $pages[$j]->classelements[$i]->docblock->subpackage; + $this->class = $pages[$j]->classelements[$i]->name; + } else + { + if ($this->killclass) continue; + // force all contained elements to have parent package/subpackage + $pages[$j]->classelements[$i]->docblock->package = $this->package; + $pages[$j]->classelements[$i]->docblock->subpackage = $this->subpackage; + } + } + if ($pages[$j]->classelements[$i]->type == 'class') + { + if ($this->checkKillClass($pages[$j]->classelements[$i]->getName(),$pages[$j]->classelements[$i]->getPath())) continue; + $this->package = $pages[$j]->classelements[$i]->docblock->package; + if ($this->package_output) if (!in_array($this->package,$this->package_output)) continue; + $this->subpackage = $pages[$j]->classelements[$i]->docblock->subpackage; + $this->class = $pages[$j]->classelements[$i]->name; + } + if (!$this->killclass) $this->addElement($pages[$j]->classelements[$i]); + } + } + phpDocumentor_out("done\n"); + flush(); + } + $this->sortIndexes(); + $this->sortTodos(); + if ($this->sort_page_contents_by_type) $this->sortPageContentsByElementType($pages); + } + + /** + * Process the {@link $tutorials} array + * + * Using the tutorialname.ext.ini files, this method sets up tutorial + * hierarchy. There is some minimal error checking to make sure that no + * tutorial links to itself, even two levels deep as in tute->next->tute. + * + * If all tests pass, it creates the hierarchy + * @uses generateTutorialOrder() + * @uses _setupTutorialTree() + * @access private + */ + function _processTutorials() + { + $parents = $all = array(); + foreach($this->tutorials as $package => $els) + { + if ($this->package_output) + { + if (!in_array($package,$this->package_output)) + { + unset($this->tutorials[$package]); + continue; + } + } + if (!isset($this->pkg_elements[$package])) + { + unset($this->tutorials[$package]); + continue; + } + foreach($els as $subpackage => $els2) + { + foreach($els2 as $type => $tutorials) + { + foreach($tutorials as $tutorial) + { + if ($tutorial->ini) + { + if (isset($tutorial->ini['Linked Tutorials'])) + { + foreach($tutorial->ini['Linked Tutorials'] as $child) + { + $sub = (empty($tutorial->subpackage) ? '' : $tutorial->subpackage . '/'); + $kid = $tutorial->package . '/' . $sub . $child . '.' . $tutorial->tutorial_type; + // parent includes self as a linked tutorial? + $kidlink = $this->getTutorialLink($kid,false,false,array($tutorial->package)); + if (is_object($kidlink) && $this->returnSee($kidlink) == $tutorial->getLink($this)) + { // bad! + addErrorDie(PDERROR_TUTORIAL_IS_OWN_CHILD,$tutorial->name,$tutorial->name.'.ini'); + } + } + $parents[] = $tutorial; + } + } + $all[$package][$subpackage][$type][] = $tutorial; + } + } + } + } + // loop error-checking, use this to eliminate possibility of accidentally linking to a parent as a child + $testlinks = array(); + foreach($parents as $parent) + { + $testlinks[$parent->name]['links'][] = $parent->getLink($this); + $testlinks[$parent->name]['name'][$parent->getLink($this)] = $parent->name; + } + // generate the order of tutorials, and link them together + foreach($parents as $parent) + { + foreach($parent->ini['Linked Tutorials'] as $child) + { + $sub = (empty($parent->subpackage) ? '' : $parent->subpackage . '/'); + $kid = $parent->package . '/' . $sub . $child . '.' . $parent->tutorial_type; + // child tutorials must be in the same package AND subpackage + // AND have the same extension as the parent, makes things clearer for both ends + if (in_array($this->returnSee($this->getTutorialLink($kid,false,false,array($parent->package))),$testlinks[$parent->name]['links'])) + addErrorDie(PDERROR_TUTORIAL_IS_OWN_GRANDPA,$testlinks[$parent->name][$this->returnSee($this->getTutorialLink($kid,false,false,array($parent->package)))],$kid->name,$testlinks[$parent->name][$this->returnSee($this->getTutorialLink($kid,false,false,array($parent->package)))],$kid->name.'.ini'); + if ($this->returnSee($this->getTutorialLink($kid,false,false,array($parent->package))) == $kid) + { + addWarning(PDERROR_CHILD_TUTORIAL_NOT_FOUND, $child . '.' . $parent->tutorial_type, $parent->name .'.ini',$parent->package, $parent->subpackage); + } + } + } + $new = $tree = $roots = array(); + // build a list of all 'root' tutorials (tutorials without parents). + foreach($parents as $i => $parent) + { + if (! $parent->isChildOf($parents)) { + $roots[] = $parent; + } + } + $parents = $roots; + // add the parents and all child tutorials in order to the list of tutorials to process + foreach($parents as $parent) + { + $this->generateTutorialOrder($parent,$all,$new); + } + if (count($all)) + { + // add the leftover tutorials + foreach($all as $package => $els) + { + foreach($els as $subpackage => $els2) + { + foreach($els2 as $type => $tutorials) + { + foreach($tutorials as $tutorial) + { + $new[$package][$subpackage][$type][] = $tutorial; + } + } + } + } + } + // remove the old, unprocessed tutorials, and set it up with the next code + $this->tutorials = array(); + // reset integrity of the tutorial list + $prev = false; + uksort($new, 'tutorialcmp'); +// debug($this->vardump_tree($new));exit; + foreach($new as $package => $els) + { + foreach($els as $subpackage => $els2) + { + foreach($els2 as $type => $tutorials) + { + foreach($tutorials as $tutorial) + { + if ($prev) + { + $this->tutorials[$prevpackage][$prevsubpackage][$prevtype][$prevname]->setNext($tutorial,$this); + $tutorial->setPrev($prev,$this); + } + $this->tutorials[$package][$subpackage][$type][$tutorial->name] = $tutorial; + $prev = $tutorial->getLink($this,true); + $prevpackage = $package; + $prevsubpackage = $subpackage; + $prevtype = $type; + $prevname = $tutorial->name; + } + } + } + } + $this->tutorial_tree = $this->_setupTutorialTree(); + return $new; + } + + /** + * called by {@link phpDocumentor_IntermediateParser::Convert()} to traverse + * the array of pages and their elements, converting them to the output format + * + * The walk() method should be flexible enough such that it never needs + * modification. walk() sets up all of the indexes, and sorts everything in + * logical alphabetical order. It then passes each element individually to + * {@link Convert()}, which then passes to the Convert*() methods. A child + * Converter need not override any of these unless special functionality must + * be added. see {@tutorial Converters/template.vars.cls} for details. + * {@internal + * walk() first creates all of the indexes {@link $elements, $pkg_elements} + * and the left indexes specified by {@link $leftindexes}, + * and then sorts them by calling {@link sortIndexes()}. + * + * Next, it converts all README/CHANGELOG/INSTALL-style files, using + * {@link Convert_RIC}. + * + * After this, it + * passes all package-level docs to Convert(). Then, it calls the index + * sorting functions {@link formatPkgIndex(), formatIndex()} and + * {@link formatLeftIndex()}. + * + * Finally, it converts each procedural page in alphabetical order. This + * stage passes elements from the physical file to Convert() in alphabetical + * order. First, procedural page elements {@link parserDefine, parserInclude} + * {@link parserGlobal}, and {@link parserFunction} are passed to Convert(). + * + * Then, class elements are passed in this order: {@link parserClass}, then + * all of the {@link parserVar}s in the class and all of the + * {@link parserMethod}s in the class. Classes are in alphabetical order, + * and both vars and methods are in alphabetical order. + * + * Finally, {@link ConvertErrorLog()} is called and the data walk is complete.}} + * @param array Format: array(fullpath => {@link parserData} structure with full {@link parserData::$elements} + * and {@link parserData::$class_elements}. + * @param array Format: array({@link parserPackagePage} 1, {@link parserPackagePage} 2,...) + * @uses Converter::_createPkgElements() sets up {@link $elements} and + * {@link $pkg_elements} array, as well as {@link $links} + */ + function walk(&$pages,&$package_pages) + { + if (empty($pages)) + { + die("ERROR: nothing parsed"); + } + $this->_createPkgElements($pages); + if (count($this->ric)) + { + phpDocumentor_out("Converting README/INSTALL/CHANGELOG contents...\n"); + flush(); + foreach($this->ric as $name => $contents) + { + phpDocumentor_out("$name..."); + flush(); + $this->Convert_RIC($name,$contents); + } + phpDocumentor_out("\ndone\n"); + flush(); + } + foreach($package_pages as $i => $perp) + { + if ($this->package_output) + { + if (!in_array($package_pages[$i]->package,$this->package_output)) continue; + } + phpDocumentor_out('Converting package page for package '.$package_pages[$i]->package.'... '); + flush(); + $this->package = $package_pages[$i]->package; + $this->subpackage = ''; + $this->class = false; + $this->Convert($package_pages[$i]); + phpDocumentor_out("done\n"); + flush(); + } + phpDocumentor_out("Converting tutorials/extended docs\n"); + flush(); + // get tutorials into the order they will display, and set next/prev links + $new = $this->_processTutorials(); + foreach($this->tutorials as $package => $els) + { + foreach($els as $subpackage => $els2) + { + foreach($els2 as $type => $tutorials) + { + foreach($tutorials as $tutorial) + { + switch ($type) + { + case 'pkg' : + $a = ''; + if ($tutorial->ini) + $a .= 'Top-level '; + if (!empty($tutorial->subpackage)) + $a .= 'Sub-'; + $ptext = "Converting ${a}Package-level tutorial ".$tutorial->name.'...'; + break; + case 'cls' : + $a = ''; + if ($tutorial->ini) + $a .= 'Top-level '; + $ptext = "Converting ${a}Class-level tutorial " . $tutorial->name ." and associating..."; + $link = Converter::getClassLink(str_replace('.cls','',$tutorial->name), $tutorial->package); + if (is_object($link)) + { + if ($this->sort_absolutely_everything) + { + $addend = 'unsuccessful '; + if (isset($this->package_elements[$tutorial->package][$tutorial->subpackage]['class'][$link->name])) + { + $this->package_elements[$tutorial->package][$tutorial->subpackage]['class'][$link->name][0]->addTutorial($tutorial,$this); + $addend = 'success '; + } + } else + { + $addend = 'unsuccessful '; + if (!isset($this->classes->killclass[str_replace('.cls','',$tutorial->name)]) && !isset($this->classes->killclass[str_replace('.cls','',$tutorial->name)][$tutorial->path])) + { + foreach($pages as $j => $inf) + { + foreach($inf->classelements as $i => $class) + { + if ($class->type == 'class' && $class->name == str_replace('.cls','',$tutorial->name) && $class->path == $link->path) + { + $pages[$j]->classelements[$i]->addTutorial($tutorial,$this); + $addend = 'success '; + } + } + } + } + } + $ptext .= $addend; + } else $ptext .= "unsuccessful "; + break; + case 'proc' : + $a = ''; + if ($tutorial->ini) + $a .= 'Top-level '; + $ptext = "Converting ${a}Procedural-level tutorial ".$tutorial->name." and associating..."; + $link = Converter::getPageLink(str_replace('.proc','',$tutorial->name), $tutorial->package); + if (is_object($link)) + { + $addend = 'unsuccessful '; + if ($this->sort_absolutely_everything) + { + if (isset($this->package_elements[$tutorial->package][$tutorial->subpackage]['page'][$link->path])) + { + $this->package_elements[$tutorial->package][$tutorial->subpackage]['page'][$link->path][0]->addTutorial($tutorial,$this); + $addend = "success "; + } + } else + { + foreach($pages as $j => $info) + { + if ($j == $link->path) + { + $pages[$j]->addTutorial($tutorial,$this); + $addend = "success "; + } + } + } + $ptext .= $addend; + } else $ptext .= "unsuccessful "; + break; + } + phpDocumentor_out($ptext); + flush(); + $this->package = $tutorial->package; + $this->subpackage = $tutorial->subpackage; + $this->Convert($tutorial); + phpDocumentor_out("done\n"); + flush(); + } + } + } + } + phpDocumentor_out("Formatting Package Indexes..."); + flush(); + $this->formatPkgIndex(); + phpDocumentor_out("done\n"); + flush(); + phpDocumentor_out("Formatting Index..."); + flush(); + $this->formatIndex(); + phpDocumentor_out("done\n\n"); + flush(); + phpDocumentor_out("Formatting Left Quick Index..."); + flush(); + $this->formatLeftIndex(); + phpDocumentor_out("done\n\n"); + flush(); + if ($this->sort_absolutely_everything) return $this->walk_everything(); + foreach($pages as $j => $flub) + { + phpDocumentor_out('Converting '.$pages[$j]->parent->getPath()); + flush(); + $this->package = $pages[$j]->parent->package; + $this->subpackage = $pages[$j]->parent->subpackage; + $this->class = false; + $this->curfile = $pages[$j]->parent->getFile(); + $this->curname = $this->getPageName($pages[$j]->parent); + $this->curpath = $pages[$j]->parent->getPath(); + $use = true; + if ($this->package_output) + { + if (in_array($this->package,$this->package_output)) + { + $this->Convert($pages[$j]); + } else + { + $use = false; + } + } else + { + $this->Convert($pages[$j]); + } + phpDocumentor_out(" Procedural Page Elements..."); + flush(); + if ($use) + for($i=0; $ielements); $i++) + { + $a = $pages[$j]->elements[$i]->docblock->getKeyword('access'); + if (is_object($a)) $a = $a->getString(); + if (!$this->parseprivate && ($a == 'private')) + continue; +// phpDocumentor_out(" ".$pages[$j]->elements[$i]->name."\n"); + $pages[$j]->elements[$i]->docblock->package = $this->package; + $pages[$j]->elements[$i]->docblock->subpackage = $this->subpackage; + $this->Convert($pages[$j]->elements[$i]); + } + phpDocumentor_out(" Classes..."); + $this->class = false; + flush(); + for($i=0; $iclasselements); $i++) + { + if ($this->class) + { + if ($pages[$j]->classelements[$i]->type == 'class') + { + if (!$this->killclass) $this->endClass(); + $this->killclass = false; + if ($this->checkKillClass($pages[$j]->classelements[$i]->getName(),$pages[$j]->classelements[$i]->getPath())) continue; + $this->package = $pages[$j]->classelements[$i]->docblock->package; + if ($this->package_output) if (!in_array($this->package,$this->package_output)) continue; + $this->subpackage = $pages[$j]->classelements[$i]->docblock->subpackage; + $this->class = $pages[$j]->classelements[$i]->name; + } else + { + $a = $pages[$j]->classelements[$i]->docblock->getKeyword('access'); + if (is_object($a)) $a = $a->getString(); + if (!$this->parseprivate && ($a == 'private')) + continue; + if ($this->killclass) continue; + // force all contained elements to have parent package/subpackage + $pages[$j]->classelements[$i]->docblock->package = $this->package; + $pages[$j]->classelements[$i]->docblock->subpackage = $this->subpackage; + } + } + if ($pages[$j]->classelements[$i]->type == 'class') + { + $this->killclass = false; + if ($this->checkKillClass($pages[$j]->classelements[$i]->getName(),$pages[$j]->classelements[$i]->getPath())) continue; + $this->package = $pages[$j]->classelements[$i]->docblock->package; + if ($this->package_output) if (!in_array($this->package,$this->package_output)) continue; + $this->subpackage = $pages[$j]->classelements[$i]->docblock->subpackage; + $this->class = $pages[$j]->classelements[$i]->name; + } + if ($this->killclass) continue; +// phpDocumentor_out(" ".$pages[$j]->classelements[$i]->name."\n"); + $this->Convert($pages[$j]->classelements[$i]); + } + if (count($pages[$j]->classelements) && !$this->killclass) $this->endClass(); + phpDocumentor_out(" done\n"); + flush(); + $this->endPage(); + } + phpDocumentor_out("\nConverting @todo List..."); + flush(); + if (count($this->todoList)) + { + $this->ConvertTodoList(); + } + phpDocumentor_out("done\n"); + flush(); + phpDocumentor_out("\nConverting Error Log..."); + flush(); + $this->ConvertErrorLog(); + phpDocumentor_out("done\n"); + flush(); + } + + + /** + * Get a tree structure representing the hierarchy of tutorials + * + * Returns an array in format: + *
        +     * array('tutorial' => {@link parserTutorial},
        +     *       'kids' => array( // child tutorials
        +     *                   array('tutorial' => child {@link parserTutorial},
        +     *                         'kids' => array(...)
        +     *                        )
        +     *                      )
        +     *      )
        +     * 
        + * @param parserTutorial|array + * @tutorial tutorials.pkg + * @return array + */ + function getTutorialTree($tutorial) + { + if (is_object($tutorial)) + { + $path = $tutorial->package . '/' . $tutorial->subpackage . '/' . $tutorial->name; + if (isset($this->tutorial_tree[$path])) + $tutorial = $this->tutorial_tree[$path]; + else + return false; + } + $tree = array(); + if (isset($tutorial['tutorial'])) + { + $tree['tutorial'] = $tutorial['tutorial']; + if (isset($tutorial['child'])) + { + foreach($tutorial['child'] as $a => $b) + { + $btut = $b['tutorial']; + $res['tutorial'] = $this->tutorials[$btut->package][$btut->subpackage][$btut->tutorial_type][$btut->name]; + if (isset($b['child'])) + { + $tempres = Converter::getTutorialTree($b); + $res['kids'] = $tempres['kids']; + } + $tree['kids'][] = $res; + } + } + } + return $tree; + } + + /** + * Remove tutorials one by one from $all, and transfer them into $new in the + * order they should be parsed + * @param parserTutorial + * @param array + * @param array + * @access private + */ + function generateTutorialOrder($parent,&$all,&$new) + { + // remove from the list of tutorials to process + foreach($all[$parent->package][$parent->subpackage][$parent->tutorial_type] as $ind => $t) + { + if ($t->name == $parent->name) { + unset($all[$parent->package][$parent->subpackage][$parent->tutorial_type][$ind]); + } + } + // add to the new ordered list of tutorials + $x = &$new[$parent->package][$parent->subpackage][$parent->tutorial_type]; + if (!is_object($x[count($x) - 1]) || $x[count($x) - 1]->name != $parent->name) + { // only add if the parent isn't also a child + $new[$parent->package][$parent->subpackage][$parent->tutorial_type][] = $parent; + // add a new branch to the tree + } + // process all child tutorials, and insert them in order +// debug("processing parent ".$parent->name); + if ($parent->ini) + { + foreach($parent->ini['Linked Tutorials'] as $child) + { + $sub = (empty($parent->subpackage) ? '' : $parent->subpackage . '/'); + $kid = $parent->package . '/' . $sub . $child . '.' . $parent->tutorial_type; + $_klink = $this->getTutorialLink($kid,false,false,array($parent->package)); + if (is_object($_klink)) { + $klink = $this->returnSee($_klink); + } else { + $klink = false; + } + // remove the child from the list of remaining tutorials + foreach($all[$parent->package][$parent->subpackage][$parent->tutorial_type] as $ind => $tute) + { + if ($klink && $tute->getLink($this) == $klink) + { + // set up parent, next and prev links + $tute->setParent($parent, $this); + // remove the child from the list of tutorials to process + foreach($all[$parent->package][$parent->subpackage][$parent->tutorial_type] as $ind => $t) + { + if ($t->name == $tute->name) + unset($all[$parent->package][$parent->subpackage][$parent->tutorial_type][$ind]); + } + // add to the new ordered list of tutorials + $new[$parent->package][$parent->subpackage][$parent->tutorial_type][] = $tute; + if ($tute->ini) + { + // add all the child's child tutorials to the list + $this->generateTutorialOrder($tute,$all,$new); + } + } + } + } + } + return; + } + + /** Returns the path to this tutorial as a string + * @param parserTutorial $pkg + * @param parserTutorial $subpkg + * @param parserTutorial $namepkg + * @return string */ + function _tutorial_path($pkg, $subpkg = 0, $namepkg = 0) + { + if (! $subpkg) + $subpkg = $pkg; + if (! $namepkg) + $namepkg = $pkg; + return $pkg->package.'/'.$subpkg->subpackage.'/'.$namepkg->name; + } + + + /** + * Creates a tree structure of tutorials + * + * Format: + *
        +     * array('package/subpackage/tutorial1.ext' =>
        +     *          array('tutorial' => {@link parserTutorial},
        +     *                'child'    =>
        +     *                    array('package/subpackage/child1tutorial.ext' => ...,
        +     *                          'package/subpackage/child2tutorial.ext' => ...,
        +     *                          ...
        +     *                         )
        +     *       'package/subpackage/tutorial2.ext' => ...,
        +     *       ...
        +     *       )
        +     * 
        + * @return array the tutorial tree + * @access private + */ + function _setupTutorialTree($parent = false) + { + if (! isset($this->processed_tutorials)) + $this->processed_tutorials = array(); + $tree = array(); + if (!$parent) + { + foreach($this->tutorials as $package => $s) + { + foreach($s as $subpackage => $t) + { + foreach($t as $type => $n) + { + foreach($n as $name => $tutorial) + { + if (!$tutorial->parent) + { + $child_path = $this->_tutorial_path($tutorial,$tutorial,$tutorial); + if (! isset($this->processed_tutorials[$child_path])) + { + $this->processed_tutorials[$child_path] = $tutorial; + //debug("parent ".$tutorial->name); + $ret = $this->_setupTutorialTree($tutorial); + if (!count($tree)) + $tree = $ret; + else + $tree = array_merge($tree,$ret); + } + } + } + } + } + } + return $tree; + } + $parent_path = $this->_tutorial_path($parent); + $tree[$parent_path]['tutorial'] = $parent; + // process all child tutorials, and insert them in order + if ($parent->ini) + { + foreach($parent->ini['Linked Tutorials'] as $child) + { + if (isset($this->tutorials[$parent->package][$parent->subpackage][$parent->tutorial_type][$child . '.' . $parent->tutorial_type])) + // remove the child from the list of remaining tutorials + $tute = $this->tutorials[$parent->package][$parent->subpackage][$parent->tutorial_type][$child . '.' . $parent->tutorial_type]; + else + $tute = false; + + if ($tute) + { + $child_path = $this->_tutorial_path($parent,$parent,$tute); + if (! isset($this->processed_tutorials[$child_path])) + { + $this->processed_tutorials[$child_path] = $tute; + if ($tute->name == $child . '.' . $parent->tutorial_type) + { +// echo "Adding [$child_path] to [$parent_path]
        "; + $tree[$parent_path]['child'][$this->_tutorial_path($parent,$parent,$tute)]['tutorial'] = $tute; + if ($tute->ini) + { + // add all the child's child tutorials to the list + if (!isset($tree[$parent_path]['child'])) + $tree[$parent_path]['child'] = $this->_setupTutorialTree($tute); + else + $tree[$parent_path]['child'] = array_merge($tree[$parent_path]['child'],$this->_setupTutorialTree($tute)); + } + } + } + } + } + } + return $tree; + } + + /** + * Debugging function for dumping {@link $tutorial_tree} + * @return string + */ + function vardump_tree($tree,$indent='') + { + if (phpDocumentor_get_class($tree) == 'parsertutorial') return $tree->name.' extends '.($tree->parent? $tree->parent->name : 'nothing'); + $a = ''; + foreach($tree as $ind => $stuff) + { + $x = $this->vardump_tree($stuff,"$indent "); + $a .= $indent.'['.$ind." => \n ".$indent.$x."]\n"; + } + return substr($a,0,strlen($a) - 1); + } + + /** + * @access private + */ + function sort_package_elements($a,$b) + { + if (($a->type == $b->type) && (isset($a->isConstructor) && $a->isConstructor)) return -1; + if (($a->type == $b->type) && (isset($b->isConstructor) && $b->isConstructor)) return 1; + if ($a->type == $b->type) return strnatcasecmp($a->name,$b->name); + if ($a->type == 'class') return -1; + if ($b->type == 'class') return 1; + if ($a->type == 'const') return -1; + if ($b->type == 'const') return 1; + if ($a->type == 'var') return -1; + if ($b->type == 'var') return 1; + if ($a->type == 'page') return -1; + if ($b->type == 'page') return 1; + if ($a->type == 'include') return -1; + if ($b->type == 'include') return 1; + if ($a->type == 'define') return -1; + if ($b->type == 'define') return 1; + if ($a->type == 'global') return -1; + if ($b->type == 'global') return 1; + if ($a->type == 'function') return -1; + if ($b->type == 'function') return 1; + } + + /** + * @access private + */ + function defpackagesort($a,$b) + { + if ($a == $GLOBALS['phpDocumentor_DefaultPackageName']) return -1; + if ($b == $GLOBALS['phpDocumentor_DefaultPackageName']) return 0; + return strnatcasecmp($a,$b); + } + + /** + * @access private + */ + function Pc_sort($a,$b) + { + return strnatcasecmp(key($a),key($b)); + } + + /** + * walk over elements by package rather than page + * + * This method is designed for converters like the PDF converter that need + * everything passed in alphabetical order by package/subpackage and by + * procedural and then class information + * @see PDFdefaultConverter + * @see walk() + */ + function walk_everything() + { + global $hooser; + $hooser = false; + uksort($this->package_elements,array($this,'defpackagesort')); + foreach($this->package_elements as $package => $r) + { + if ($this->package_output) + { + if (!in_array($this->package,$this->package_output)) + { + unset($this->package_elements[$package]); + continue; + } + } + uksort($this->package_elements[$package],'strnatcasecmp'); + } + foreach($this->package_elements as $package => $r) + { + foreach($this->package_elements[$package] as $subpackage => $r) + { + if (isset($r['page'])) + { + uksort($r['page'],'strnatcasecmp'); + foreach($r['page'] as $page => $oo) + { + usort($this->package_elements[$package][$subpackage]['page'][$page],array($this,'sort_package_elements')); + } + } + if (isset($r['class'])) + { + uksort($r['class'],'strnatcasecmp'); + foreach($r['class'] as $page => $oo) + { + usort($r['class'][$page],array($this,'sort_package_elements')); + } + } + $this->package_elements[$package][$subpackage] = $r; + } + } + foreach($this->package_elements as $package => $s) + { + $notyet = false; + foreach($s as $subpackage => $r) + { + $this->package = $package; + $this->subpackage = $subpackage; + if (isset($r['page'])) + { + $this->class = false; + foreach($r['page'] as $page => $elements) + { + if (is_array($elements)) + { + foreach($elements as $element) + { + if ($element->type == 'page') + { + phpDocumentor_out('Converting '.$element->parent->getPath()); + flush(); + $this->curfile = $element->parent->getFile(); + $this->curname = $this->getPageName($element->parent); + $this->curpath = $element->parent->getPath(); + $notyet = true; + } else + { + // force all contained elements to have parent package/subpackage + $element->docblock->package = $this->package; + $element->docblock->subpackage = $this->subpackage; + $a = $element->docblock->getKeyword('access'); + if (is_object($a)) $a = $a->getString(); + if (!$this->parseprivate && ($a == 'private')) + continue; + } + if ($notyet) + { + phpDocumentor_out(" Procedural Page Elements..."); + flush(); + $notyet = false; + } + $this->Convert($element); + } + } + $this->endPage(); + phpDocumentor_out("done\n"); + flush(); + } + } + $start_classes = true; + if (isset($r['class'])) + { + foreach($r['class'] as $class => $elements) + { + foreach($elements as $element) + { + if ($element->type == 'class') + { + if (!$start_classes) + { + if (count($elements) && !$this->killclass) $this->endClass(); + phpDocumentor_out("done\n"); + flush(); + } + $start_classes = false; + $this->class = $element->getName(); + $this->killclass = false; + if ($this->checkKillClass($element->getName(),$element->getPath())) continue; + if (!$this->killclass) + { + phpDocumentor_out('Converting '.$this->class."..."); + flush(); + $notyet = true; + } + } else + { + if ($notyet) + { + phpDocumentor_out("Variables/methods/Class constants...\n"); + flush(); + $notyet = false; + } + $a = $element->docblock->getKeyword('access'); + if (is_object($a)) $a = $a->getString(); + if (!$this->parseprivate && ($a == 'private')) + continue; + if ($this->killclass) continue; + // force all contained elements to have parent package/subpackage + $element->docblock->package = $this->package; + $element->docblock->subpackage = $this->subpackage; + } + if ($this->killclass) continue; + $this->Convert($element); + } + } + if (count($elements) && !$this->killclass) $this->endClass(); + phpDocumentor_out("done\n"); + flush(); + } // if isset($r['class']) + } // foreach($s + } // foreach($this->package_elements) + phpDocumentor_out("\nConverting @todo List..."); + flush(); + if (count($this->todoList)) + { + $this->ConvertTodoList(); + } + phpDocumentor_out("done\n"); + flush(); + phpDocumentor_out("\nConverting Error Log..."); + flush(); + $this->ConvertErrorLog(); + phpDocumentor_out("done\n"); + flush(); + } + + /** + * Convert the phpDocumentor parsing/conversion error log + * @abstract + */ + function ConvertErrorLog() + { + } + + /** + * Convert the list of all @todo tags + * @abstract + */ + function ConvertTodoList() + { + } + + /** + * Sorts the @todo list - do not override or modify this function + * @access private + * @uses _sortTodos passed to {@link usort()} to sort the todo list + */ + function sortTodos() + { + phpDocumentor_out("\nSorting @todo list..."); + flush(); + foreach($this->todoList as $package => $r) + usort($this->todoList[$package],array($this, '_sortTodos')); + phpDocumentor_out("done\n"); + } + + /** @access private */ + function _sortTodos($a, $b) + { + return strnatcasecmp($a[0]->name, $b[0]->name); + } + + /** + * Sorts all indexes - do not override or modify this function + * @uses $leftindex based on the value of leftindex, sorts link arrays + * @uses $class_elements sorts with {@link compareLink} + * @uses $page_elements sorts with {@link compareLink} + * @uses $define_elements sorts with {@link compareLink} + * @uses $global_elements sorts with {@link compareLink} + * @uses $function_elements sorts with {@link compareLink} + * @uses $elements sorts with {@link elementCmp} + * @uses $pkg_elements sorts with {@link elementCmp} after sorting by + * package/subpackage alphabetically + * @access private + */ + function sortIndexes() + { + phpDocumentor_out("\nSorting Indexes..."); + flush(); + uksort($this->elements,'strnatcasecmp'); + if ($this->leftindex['classes']) + { + foreach($this->class_elements as $package => $o1) + { + foreach($o1 as $subpackage => $links) + { + usort($this->class_elements[$package][$subpackage],array($this,'compareLink')); + } + } + } + if ($this->leftindex['pages']) + { + foreach($this->page_elements as $package => $o1) + { + uksort($this->page_elements[$package],'strnatcasecmp'); + foreach($o1 as $subpackage => $links) + { + usort($this->page_elements[$package][$subpackage],array($this,'compareLink')); + } + } + } + if ($this->leftindex['defines']) + { + foreach($this->define_elements as $package => $o1) + { + uksort($this->define_elements[$package],'strnatcasecmp'); + foreach($o1 as $subpackage => $links) + { + usort($this->define_elements[$package][$subpackage],array($this,'compareLink')); + } + } + } + if ($this->leftindex['globals']) + { + foreach($this->global_elements as $package => $o1) + { + uksort($this->global_elements[$package],'strnatcasecmp'); + foreach($o1 as $subpackage => $links) + { + usort($this->global_elements[$package][$subpackage],array($this,'compareLink')); + } + } + } + if ($this->leftindex['functions']) + { + foreach($this->function_elements as $package => $o1) + { + uksort($this->function_elements[$package],'strnatcasecmp'); + foreach($o1 as $subpackage => $links) + { + usort($this->function_elements[$package][$subpackage],array($this,'compareLink')); + } + } + } + foreach($this->elements as $letter => $nothuing) + { + uasort($this->elements[$letter],array($this,"elementCmp")); + } + foreach($this->pkg_elements as $package => $els) + { + uksort($this->pkg_elements[$package],'strnatcasecmp'); + foreach($this->pkg_elements[$package] as $subpackage => $els) + { + if (empty($els)) continue; + uksort($this->pkg_elements[$package][$subpackage],'strnatcasecmp'); + foreach($els as $letter => $yuh) + { + usort($this->pkg_elements[$package][$subpackage][$letter],array($this,"elementCmp")); + } + } + } + phpDocumentor_out("done\n"); + flush(); + } + + /** + * sorts {@link $page_contents} by element type as well as alphabetically + * @see $sort_page_contents_by_element_type + */ + function sortPageContentsByElementType(&$pages) + { + foreach($this->page_contents as $package => $els) + { + foreach($this->page_contents[$package] as $subpackage => $els) + { + if (empty($els)) continue; + foreach($this->page_contents[$package][$subpackage] as $path => $stuff) + { + if (!count($pages[$path]->elements)) continue; + usort($pages[$path]->elements,array($this,'eltypecmp')); + usort($this->page_contents[$package][$subpackage][$path],array($this,'eltypecmp')); + if (isset($this->page_contents[$package][$subpackage][$path][0])) + $this->page_contents[$package][$subpackage][$path]['###main'] = $this->page_contents[$package][$subpackage][$path][0]; + unset($this->page_contents[$package][$subpackage][$path][0]); + } + } + } + } + + /** + * @access private + * @see Converter::sortIndexes() + */ + function compareLink($a, $b) + { + return strnatcasecmp($a->name,$b->name); + } + + /** + * @access private + * @see Converter::sortPageContentsByElementType() + */ + function eltypecmp($a, $b) + { + if ($a->type == 'page') return -1; + if ($b->type == 'page') return 1; + return strnatcasecmp($a->type.$a->name,$b->type.$b->name); + } + + /** + * does a nat case sort on the specified second level value of the array + * + * @param mixed $a + * @param mixed $b + * @return int + * @access private + */ + function elementCmp ($a, $b) + { + return strnatcasecmp($a->getName(), $b->getName()); + } + + /** + * Used to stop conversion of @ignored or private @access classes + * @uses $killclass sets killclass based on the value of {@link Classes::$killclass} + * and {@link $package_output} + * @access private + */ + function checkKillClass($class, $path) + { + $this->killclass = false; + if (isset($this->classes->killclass[$class]) && isset($this->classes->killclass[$class][$path])) $this->killclass = true; + if ($this->package_output) + { + $a = $this->classes->getClass($class, $path); + if (!in_array($a->docblock->package,$this->package_output)) $this->killclass = true; + } + if (PHPDOCUMENTOR_DEBUG && $this->killclass) debug("$class $path killed"); + return $this->killclass; + } + + /** + * @param abstractLink descendant of abstractLink + * @param array|parserTag list of @todos|@todo tag + * @access private + */ + function addTodoLink($link, $todos) + { + $this->todoList[$link->package][] = array($link, $todos); + } + + /** + * Adds all elements to the {@link $elements, $pkg_elements, $links}, + * {@link $linkswithfile} and left indexes - Do not modify or override + * @access private + * @param parserBase any documentable element descendant of parserBase + * except parserTutorial + * @param false|parserPage only used to add a {@link parserPage} if the + * $element passed is a parserPage + * @staticvar string path of current page, used for {@link $page_contents} setup + */ + function addElement(&$element,$pageel=false) + { + static $curpath = ''; + if ($this->package_output) + { + if (!in_array($this->package, $this->package_output)) return; + } + if ($pageel && phpDocumentor_get_class($pageel) == 'parserdata') + { + if (isset($pageel->docblock) && phpDocumentor_get_class($pageel->docblock) == 'parserdocblock') + { + $a = $pageel->docblock->getKeyword('todo'); + if ($a) + { + $this->addTodoLink($this->addLink($element),$a); + } + } + } + if (isset($element->docblock)) + { + $a = $element->docblock->getKeyword('access'); + if (is_object($a)) $a = $a->getString(); + if (!$this->parseprivate && ($a == 'private')) + return; + $a = $element->docblock->getKeyword('todo'); + if ($a) + { + $this->addTodoLink($this->addLink($element),$a); + } + } + $i = 0; + switch($element->type) + { + case 'page' : + if ($this->sort_absolutely_everything) + { + $this->package_elements[$element->package][$element->subpackage]['page'][$element->getPath()][] = $pageel; + } + $link = $this->addLink($element); + $curpath = $element->getPath(); + if ($this->leftindex['pages']) + $this->page_elements[$element->package][$element->subpackage][] = $link; + $this->page_contents[$element->package][$element->subpackage][$curpath]['###main'] = $link; + break; + case 'class' : + if ($this->sort_absolutely_everything) + { + $this->package_elements[$element->docblock->package][$element->docblock->subpackage]['class'][$this->class][] = $element; + } + $link = $this->addLink($element); + if ($this->leftindex['classes']) + $this->class_elements[$element->docblock->package][$element->docblock->subpackage][] = $link; + $this->class_contents[$element->docblock->package][$element->docblock->subpackage][$this->class]['###main'] = $link; + break; + case 'include' : + if ($this->sort_absolutely_everything) + { + $this->package_elements[$element->docblock->package][$element->docblock->subpackage]['page'][$curpath][] = $element; + } + $link = $this->addLink($element); + break; + case 'define' : + if ($this->sort_absolutely_everything) + { + $this->package_elements[$element->docblock->package][$element->docblock->subpackage]['page'][$curpath][] = $element; + } + $link = $this->addLink($element); + if ($this->leftindex['defines']) + $this->define_elements[$element->docblock->package][$element->docblock->subpackage][] = $link; + $this->page_contents[$element->docblock->package][$element->docblock->subpackage][$curpath][] = $link; + break; + case 'global' : + if ($this->sort_absolutely_everything) + { + $this->package_elements[$element->docblock->package][$element->docblock->subpackage]['page'][$curpath][] = $element; + } + $link = $this->addLink($element); + $i++; + if ($this->leftindex['globals']) + $this->global_elements[$element->docblock->package][$element->docblock->subpackage][] = $link; + $this->page_contents[$element->docblock->package][$element->docblock->subpackage][$curpath][] = $link; + break; + case 'var' : + if ($this->sort_absolutely_everything) + { + $this->package_elements[$element->docblock->package][$element->docblock->subpackage]['class'][$this->class][] = $element; + } + $link = $this->addLink($element); + $i++; + $this->class_contents[$element->docblock->package][$element->docblock->subpackage][$this->class][] = $link; + break; + case 'const' : + if ($this->sort_absolutely_everything) + { + $this->package_elements[$element->docblock->package][$element->docblock->subpackage]['class'][$this->class][] = $element; + } + $link = $this->addLink($element); + $i++; + $this->class_contents[$element->docblock->package][$element->docblock->subpackage][$this->class][] = $link; + break; + case 'method' : + if ($this->sort_absolutely_everything) + { + $this->package_elements[$element->docblock->package][$element->docblock->subpackage]['class'][$this->class][] = $element; + } + $link = $this->addLink($element); + $this->class_contents[$element->docblock->package][$element->docblock->subpackage][$this->class][] = $link; + break; + case 'function' : + if ($this->sort_absolutely_everything) + { + $this->package_elements[$element->docblock->package][$element->docblock->subpackage]['page'][$curpath][] = $element; + } + $link = $this->addLink($element); + if ($this->leftindex['functions']) + $this->function_elements[$element->docblock->package][$element->docblock->subpackage][] = $link; + $this->page_contents[$element->docblock->package][$element->docblock->subpackage][$curpath][] = $link; + break; + default : + break; + } + if ($element->getType() != 'include') + { + if ($element->getType() == 'var' || $element->getType() == 'method'|| $element->getType() == 'const') + { + $this->links[$this->package][$this->subpackage][$element->getType()][$element->class][$element->getName()] = $link; + $this->linkswithfile[$this->package][$this->subpackage][$element->getType()][$element->getPath()][$element->class][$element->getName()] = $link; + } else + { + if ($element->type == 'page') + { + $this->links[$this->package][$this->subpackage][$element->getType()][$element->getFile()] = $link; + $this->linkswithfile[$this->package][$this->subpackage][$element->getType()][$element->getPath()][$element->getFile()] = $link; + } else + { + $this->links[$this->package][$this->subpackage][$element->getType()][$element->getName()] = $link; + $this->linkswithfile[$this->package][$this->subpackage][$element->getType()][$element->getPath()][$element->getName()] = $link; + } + } + } + if ($element->type == 'page') + { + $this->elements[substr(strtolower($element->getFile()),$i,1)][] = $element; + $this->pkg_elements[$this->package][$this->subpackage][substr(strtolower($element->getFile()),$i,1)][] = $element; + } else + { + $this->elements[substr(strtolower($element->getName()),$i,1)][] = $element; + $this->pkg_elements[$this->package][$this->subpackage][substr(strtolower($element->getName()),$i,1)][] = $element; + } + } + + /** + * returns an abstract link to element. Do not modify or override + * + * This method should only be called in process of Conversion, unless + * $element is a parserPage, or $page is set to true, and $element is + * not a parserPage + * @return abstractLink abstractLink descendant + * @access private + * @param parserElement element to add a new link (descended from + * {@link abstractLink})to the {@link $links} array + * @param string classname for elements that are class-based (this may be + * deprecated in the future, as the classname + * should be contained within the element. if $element is a + * page, this parameter is a package name + * @param string subpackage name for page elements + */ + function addLink(&$element,$page = false) + { + if ($page) + { + // create a fake parserPage to extract the fileAlias for this link + $fakepage = new parserPage; + $fakepage->setPath($element->getPath()); + $fakepage->setFile(basename($element->getPath())); + $this->curname = $this->getPageName($fakepage); + } + switch($element->type) + { + case 'function': + $x = new functionLink; + $x->addLink($element->getPath(), $this->curname, $element->name, $element->docblock->package, $element->docblock->subpackage, $element->docblock->category); + return $x; + break; + case 'define': + $x = new defineLink; + $x->addLink($element->getPath(), $this->curname, $element->name, $element->docblock->package, $element->docblock->subpackage, $element->docblock->category); + return $x; + break; + case 'global': + $x = new globalLink; + $x->addLink($element->getPath(), $this->curname, $element->name, $element->docblock->package, $element->docblock->subpackage, $element->docblock->category); + return $x; + break; + case 'class': + $x = new classLink; + $x->addLink($element->getPath(), $this->curname, $element->name, $element->docblock->package, $element->docblock->subpackage, $element->docblock->category); + return $x; + break; + case 'method': + $x = new methodLink; + $x->addLink($this->class, $element->getPath(), $this->curname, $element->name, $element->docblock->package, $element->docblock->subpackage, $element->docblock->category); + return $x; + break; + case 'var': + $x = new varLink; + $x->addLink($this->class, $element->getPath(), $this->curname, $element->name, $element->docblock->package, $element->docblock->subpackage, $element->docblock->category); + return $x; + break; + case 'const': + $x = new constLink; + $x->addLink($this->class, $element->getPath(), $this->curname, $element->name, $element->docblock->package, $element->docblock->subpackage, $element->docblock->category); + return $x; + break; + case 'page': + $x = new pageLink; + $x->addLink($element->getPath(),$this->getPageName($element),$element->file,$element->package, $element->subpackage, $element->category); + return $x; + break; + } + } + + /** + * Return a tree of all classes that extend this class + * + * The data structure returned is designed for a non-recursive algorithm, + * and is somewhat complex. + * In most cases, the array returned is: + * + *
        +     * array('#root' =>
        +     *         array('link' => {@link classLink} to $class,
        +     *               'parent' => false,
        +     *               'children' => array(array('class' => 'childclass1',
        +     *                                         'package' => 'child1package'),
        +     *                                    array('class' => 'childclass2',
        +     *                                         'package' => 'child2package'),...
        +     *                                  )
        +     *               ),
        +     *       'child1package#childclass1' =>
        +     *         array('link' => {@link classLink} to childclass1,
        +     *               'parent' => '#root',
        +     *               'children' => array(array('class' => 'kidclass',
        +     *                                         'package' => 'kidpackage'),...
        +     *                                  )
        +     *              ),
        +     *       'kidpackage#kidclass' =>
        +     *         array('link' => {@link classLink} to kidclass,
        +     *               'parent' => 'child1package#childclass1',
        +     *               'children' => array() // no children
        +     *              ),
        +     *      ....
        +     *      )
        +     *
        + * + * To describe this format using language, every class in the tree has an + * entry in the first level of the array. The index for all child + * classes that extend the root class is childpackage#childclassname. + * Each entry in the array has 3 elements: link, parent, and children. + *
          + *
        • link - a {@link classLink} to the current class
        • + *
        • parent - a {@link classLink} to the class's parent, or false (except for one special case described below)
        • + *
        • children - an array of arrays, each entry has a 'class' and 'package' index to the child class, + * used to find the entry in the big array
        • + *
        + * + * special cases are when the #root class has a parent in another package, + * or when the #root class extends a class not found + * by phpDocumentor. In the first case, parent will be a + * classLink to the parent class. In the second, parent will be the + * extends clause, as in: + * + * class X extends Y + * { + * ... + * } + * + * in this case, the #root entry will be array('link' => classLink to X, 'parent' => 'Y', children => array(...)) + * + * The fastest way to design a method to process the array returned + * is to copy HTMLframesConverter::getRootTree() into + * your converter and to modify the html to whatever output format you are going to use + * @see HTMLframesConverter::getRootTree() + * @param string class name + * @param string + * @param string + * @return array Format: see docs + */ + function getSortedClassTreeFromClass($class,$package,$subpackage) + { + $my_tree = array(); + $root = $this->classes->getClassByPackage($class,$package); + if (!$root) return false; + $class_children = $this->classes->getDefiniteChildren($class,$root->curfile); + if (!$class_children) + { + // special case: parent class is found, but is not part of this package, class has no children + if (is_array($root->parent)) + { + $x = $root->getParent($this); + if ($x->docblock->package != $package) + { + $v = Converter::getClassLink($root->getName(),$package,$root->getPath()); + return array('#root' => array('link' => $v,'parent' => Converter::getClassLink($x->getName(),$x->docblock->package,$x->getPath()), 'children' => array())); + } + } else + { // class has normal situation, no children + if (is_string($root->getParent($this))) + return array('#root' => array('link' => Converter::getClassLink($root->getName(),$package,$root->getPath()), 'parent' => $root->getExtends(),'children' => array())); + else + return array('#root' => array('link' => Converter::getClassLink($root->getName(),$package,$root->getPath()), 'parent' => false, 'children' => array())); + } + } + // special case: parent class is found, but is not part of this package, class has children + if (is_array($root->parent)) + { + $x = $root->getParent($this); + if ($x->docblock->package != $package) + { + $v = Converter::getClassLink($root->getName(),$package,$root->getPath()); + $my_tree = array('#root' => array('link' => $v, 'parent' => Converter::getClassLink($x->getName(),$x->docblock->package,$x->getPath()), 'children' => array())); + } else + { + } + } else + $my_tree = array('#root' => array('link' => Converter::getClassLink($root->getName(),$package,$root->getPath()), 'parent' => false, 'children' => array())); + // location of tree walker + $cur = '#root'; + $lastcur = array(array(false,0)); + $childpos = 0; + if (isset($class_children)) + { + do + { + if (!$class_children) + { + list($cur, $childpos) = array_pop($lastcur); + if (isset($my_tree[$cur]['children'][$childpos + 1])) + { + array_push($lastcur, array($cur, $childpos + 1)); + $par = $cur; + $cur = $my_tree[$cur]['children'][$childpos + 1]; + $x = $this->classes->getClassByPackage($cur['class'],$cur['package']); + $childpos = 0; + $cur = $cur['package'] . '#' . $cur['class']; + $my_tree[$cur]['link'] = Converter::getClassLink($x->getName(),$x->docblock->package,$x->getPath()); + $my_tree[$cur]['parent'] = $par; + $my_tree[$cur]['children'] = array(); + $class_children = $this->classes->getDefiniteChildren($x->getName(), $x->curfile); + continue; + } else + { + $class_children = false; + continue; + } + } + foreach($class_children as $chileclass => $chilefile) + { + $ch = $this->classes->getClass($chileclass,$chilefile); + $my_tree[$cur]['children'][] = array('class' => $ch->getName(), 'package' => $ch->docblock->package); + } + usort($my_tree[$cur]['children'],'rootcmp'); + if (isset($my_tree[$cur]['children'][$childpos])) + { + array_push($lastcur, array($cur, $childpos)); + $par = $cur; + $cur = $my_tree[$cur]['children'][$childpos]; + $x = $this->classes->getClassByPackage($cur['class'],$cur['package']); + $cur = $cur['package'] . '#' . $cur['class']; + $my_tree[$cur]['link'] = Converter::getClassLink($x->getName(),$x->docblock->package,$x->getPath()); + $my_tree[$cur]['parent'] = $par; + $my_tree[$cur]['children'] = array(); + $childpos = 0; + $class_children = $this->classes->getDefiniteChildren($x->getName(), $x->curfile); + } else + { + list($cur, $childpos) = array_pop($lastcur); + } + } while ($cur); + } + return $my_tree; + } + + /** + * do not override + * @return bool true if a link to this class exists in package $package and subpackage $subpackage + * @param string $expr class name + * @param string $package package to search in + * @param string $subpackage subpackage to search in + * @access private + */ + function isLinkedClass($expr,$package,$subpackage,$file=false) + { + if ($file) + return isset($this->linkswithfile[$package][$subpackage]['class'][$file][$expr]); + return isset($this->links[$package][$subpackage]['class'][$expr]); + } + + /** + * do not override + * @return bool true if a link to this function exists in package $package and subpackage $subpackage + * @param string $expr function name + * @param string $package package to search in + * @param string $subpackage subpackage to search in + * @access private + */ + function isLinkedFunction($expr,$package,$subpackage,$file=false) + { + if ($file) + return isset($this->linkswithfile[$package][$subpackage]['function'][$file][$expr]); + return isset($this->links[$package][$subpackage]['function'][$expr]); + } + + /** + * do not override + * @return bool true if a link to this define exists in package $package and subpackage $subpackage + * @param string $expr define name + * @param string $package package to search in + * @param string $subpackage subpackage to search in + * @access private + */ + function isLinkedDefine($expr,$package,$subpackage,$file=false) + { + if ($file) + return isset($this->linkswithfile[$package][$subpackage]['define'][$file][$expr]); + return isset($this->links[$package][$subpackage]['define'][$expr]); + } + + /** + * do not override + * @return bool true if a link to this define exists in package $package and subpackage $subpackage + * @param string $expr define name + * @param string $package package to search in + * @param string $subpackage subpackage to search in + * @access private + */ + function isLinkedGlobal($expr,$package,$subpackage,$file=false) + { + if ($file) + return isset($this->linkswithfile[$package][$subpackage]['global'][$file][$expr]); + return isset($this->links[$package][$subpackage]['global'][$expr]); + } + + /** + * do not override + * @return bool true if a link to this procedural page exists in package $package and subpackage $subpackage + * @param string $expr procedural page name + * @param string $package package to search in + * @param string $subpackage subpackage to search in + * @access private + */ + function isLinkedPage($expr,$package,$subpackage,$path=false) + { + if ($path) + return isset($this->linkswithfile[$package][$subpackage]['page'][$path][$expr]); + return isset($this->links[$package][$subpackage]['page'][$expr]); + } + + /** + * do not override + * @return bool true if a link to this method exists in package $package, subpackage $subpackage and class $class + * @param string $expr method name + * @param string $class class name + * @param string $package package to search in + * @param string $subpackage subpackage to search in + * @access private + */ + function isLinkedMethod($expr,$package,$subpackage,$class,$file=false) + { + if ($file) + return isset($this->linkswithfile[$package][$subpackage]['method'][$file][$class][$expr]); + return isset($this->links[$package][$subpackage]['method'][$class][$expr]); + } + + /** + * do not override + * @return bool true if a link to this method exists in package $package, subpackage $subpackage and class $class + * @param string $expr var name + * @param string $class class name + * @param string $package package to search in + * @param string $subpackage subpackage to search in + * @access private + */ + function isLinkedVar($expr,$package,$subpackage,$class,$file=false) + { + if ($file) + return isset($this->linkswithfile[$package][$subpackage]['var'][$file][$class][$expr]); + return isset($this->links[$package][$subpackage]['var'][$class][$expr]); + } + + /** + * do not override + * @return bool true if a link to this method exists in package $package, subpackage $subpackage and class $class + * @param string $expr constant name + * @param string $class class name + * @param string $package package to search in + * @param string $subpackage subpackage to search in + * @access private + */ + function isLinkedConst($expr,$package,$subpackage,$class,$file=false) + { + if ($file) + return isset($this->linkswithfile[$package][$subpackage]['const'][$file][$class][$expr]); + return isset($this->links[$package][$subpackage]['const'][$class][$expr]); + } + + /** + * return false or a {@link classLink} to $expr + * @param string $expr class name + * @param string $package package name + * @return mixed returns a {@link classLink} or false if the element is not found in package $package + * @see classLink + */ + function getClassLink($expr,$package,$file=false, $text = false) + { + if (!isset($this->links[$package])) return false; + foreach($this->links[$package] as $subpackage => $notused) + { + if ($this->isLinkedClass($expr,$package,$subpackage,$file)) + { + if ($file) + { + return $this->linkswithfile[$package][$subpackage]['class'][$file][$expr]; + } + return $this->links[$package][$subpackage]['class'][$expr]; + } + } + return false; + } + + /** + * return false or a {@link functionLink} to $expr + * @param string $expr function name + * @param string $package package name + * @return mixed returns a {@link functionLink} or false if the element is not found in package $package + * @see functionLink + */ + function getFunctionLink($expr,$package,$file=false, $text = false) + { + if (!isset($this->links[$package])) return false; + foreach($this->links[$package] as $subpackage => $notused) + { + if ($this->isLinkedFunction($expr,$package,$subpackage,$file)) + { + if ($file) + { + return $this->linkswithfile[$package][$subpackage]['function'][$file][$expr]; + } + return $this->links[$package][$subpackage]['function'][$expr]; + } + } + return false; + } + + /** + * return false or a {@link defineLink} to $expr + * @param string $expr constant name + * @param string $package package name + * @return mixed returns a {@link defineLink} or false if the element is not found in package $package + * @see defineLink + */ + function getDefineLink($expr,$package,$file=false, $text = false) + { + if (!isset($this->links[$package])) return false; + foreach($this->links[$package] as $subpackage => $notused) + { + if ($this->isLinkedDefine($expr,$package,$subpackage,$file)) + { + if ($file) + { + return $this->linkswithfile[$package][$subpackage]['define'][$file][$expr]; + } + return $this->links[$package][$subpackage]['define'][$expr]; + } + } + return false; + } + + /** + * return false or a {@link globalLink} to $expr + * @param string $expr global variable name (with leading $) + * @param string $package package name + * @return mixed returns a {@link defineLink} or false if the element is not found in package $package + * @see defineLink + */ + function getGlobalLink($expr,$package,$file=false, $text = false) + { + if (!isset($this->links[$package])) return false; + foreach($this->links[$package] as $subpackage => $notused) + { + if ($this->isLinkedGlobal($expr,$package,$subpackage,$file)) + { + if ($file) + { + return $this->linkswithfile[$package][$subpackage]['global'][$file][$expr]; + } + return $this->links[$package][$subpackage]['global'][$expr]; + } + } + return false; + } + + /** + * return false or a {@link pageLink} to $expr + * @param string $expr procedural page name + * @param string $package package name + * @return mixed returns a {@link pageLink} or false if the element is not found in package $package + * @see pageLink + */ + function getPageLink($expr,$package,$path = false, $text = false, $packages = false) + { + if (!isset($this->links[$package])) return false; + foreach($this->links[$package] as $subpackage => $notused) + { + if ($this->isLinkedPage($expr,$package,$subpackage,$path)) + { + if ($path) + { + return $this->linkswithfile[$package][$subpackage]['page'][$path][$expr]; + } + return $this->links[$package][$subpackage]['page'][$expr]; + } + } + return false; + } + + /** + * return false or a {@link methodLink} to $expr in $class + * @param string $expr method name + * @param string $class class name + * @param string $package package name + * @return mixed returns a {@link methodLink} or false if the element is not found in package $package, class $class + * @see methodLink + */ + function getMethodLink($expr,$class,$package,$file=false, $text = false) + { + $expr = trim($expr); + $class = trim($class); + if (!isset($this->links[$package])) return false; + foreach($this->links[$package] as $subpackage => $notused) + { + if ($this->isLinkedMethod($expr,$package,$subpackage,$class,$file)) + { + if ($file) + { + return $this->linkswithfile[$package][$subpackage]['method'][$file][$class][$expr]; + } + return $this->links[$package][$subpackage]['method'][$class][$expr]; + } + } + return false; + } + + /** + * return false or a {@link varLink} to $expr in $class + * @param string $expr var name + * @param string $class class name + * @param string $package package name + * @return mixed returns a {@link varLink} or false if the element is not found in package $package, class $class + * @see varLink + */ + function getVarLink($expr,$class,$package,$file=false, $text = false) + { + $expr = trim($expr); + $class = trim($class); + if (!isset($this->links[$package])) return false; + foreach($this->links[$package] as $subpackage => $notused) + { + if ($this->isLinkedVar($expr,$package,$subpackage,$class,$file)) + { + if ($file) + { + return $this->linkswithfile[$package][$subpackage]['var'][$file][$class][$expr]; + } + return $this->links[$package][$subpackage]['var'][$class][$expr]; + } + } + return false; + } + + /** + * return false or a {@link constLink} to $expr in $class + * @param string $expr constant name + * @param string $class class name + * @param string $package package name + * @return mixed returns a {@link varLink} or false if the element is not found in package $package, class $class + * @see constLink + */ + function getConstLink($expr,$class,$package,$file=false, $text = false) + { + $expr = trim($expr); + $class = trim($class); + if (!isset($this->links[$package])) return false; + foreach($this->links[$package] as $subpackage => $notused) + { + if ($this->isLinkedConst($expr,$package,$subpackage,$class,$file)) + { + if ($file) + { + return $this->linkswithfile[$package][$subpackage]['const'][$file][$class][$expr]; + } + return $this->links[$package][$subpackage]['const'][$class][$expr]; + } + } + return false; + } + + /** + * The meat of the @tutorial tag and inline {@}tutorial} tag + * + * Take a string and return an abstract link to the tutorial it represents. + * Since tutorial naming literally works like the underlying filesystem, the + * way to reference the tutorial is similar. Tutorials are located in a + * subdirectory of any directory parsed, which is named 'tutorials/' (we + * try to make things simple when we can :). They are further organized by + * package and subpackage as: + * + * tutorials/package/subpackage + * + * and the files are named *.cls, *.pkg, or *.proc, and so a link to a tutorial + * named file.cls can be referenced (depending on context) as any of: + * + * + * * @tutorial package/subpackage/file.cls + * * @tutorial package/file.cls + * * @tutorial file.cls + * + * + * The first case will only be needed if file.cls exists in both the current + * package, in anotherpackage/file.cls and in anotherpackage/subpackage/file.cls + * and you wish to reference the one in anotherpackage/subpackage. + * The second case is only needed if you wish to reference file.cls in another + * package and it is unique in that package. the third will link to the first + * file.cls it finds using this search method: + * + *
          + *
        1. current package/subpackage
        2. + *
        3. all other subpackages of current package
        4. + *
        5. parent package, if this package has classes that extend classes in + * another package
        6. + *
        7. all other packages
        8. + *
        + * @return tutorialLink|string returns either a link, or the original text, if not found + * @param string the original expression + * @param string package to look in first + * @param string subpackage to look in first + * @param array array of package names to search in if not found in parent packages. + * This is used to limit the search, phpDocumentor automatically searches + * all packages + * @since 1.2 + */ + function getTutorialLink($expr, $package = false, $subpackage = false, $packages = false) + { + // is $expr a comma-delimited list? + if (strpos($expr,',')) + { + $a = explode(',',$expr); + $b = array(); + for($i=0;$ipackage; + if (!$subpackage) $subpackage = $this->subpackage; + if (!isset($this->all_packages[$package])) return $expr; + elseif (isset($packages[$package])) unset($packages[$package]); + $ext = pathinfo($expr, PATHINFO_EXTENSION); + if (isset($this->tutorials[$package][$subpackage][$ext][$expr])) + { + $a = $this->tutorials[$package][$subpackage][$ext][$expr]; + $link = new tutorialLink; + $link->addLink($subsection,$a->path,$a->name,$a->package,$a->subpackage,$a->getTitle($this,$subsection)); + return $link; + } + do + { + if (!is_array($packages)) + { + $packages = $this->all_packages; + if (isset($packages[$package])) unset($packages[$package]); + } + if (isset($this->tutorials[$package])) + { + if (isset($this->tutorials[$package][$subpackage][$ext][$expr])) + { + $a = $this->tutorials[$package][$subpackage][$ext][$expr]; + $link = new tutorialLink; + $link->addLink($subsection,$a->path,$a->name,$a->package,$a->subpackage,$a->getTitle($this)); + return $link; + } else + { + foreach($this->tutorials[$package] as $subpackage => $stuff) + { + if (isset($stuff[$ext][$expr])) + { + $a = $stuff[$ext][$expr]; + $link = new tutorialLink; + $link->addLink($subsection,$a->path,$a->name,$a->package,$a->subpackage,$a->getTitle($this)); + return $link; + } + } + } + } + // try other packages + // look in parent package first, if found + if (isset($this->package_parents[$package])) + { + $p1 = $package; + $package = $this->package_parents[$package]; + } else + { + // no parent package, so start with the first one that's left + list($package,) = @each($packages); + } + if ($package) + { + if (isset($packages[$package])) unset($packages[$package]); + } + } while (count($packages) || $package); + addWarning(PDERROR_TUTORIAL_NOT_FOUND,$expr); + return $expr; + } + + /** + * The meat of the @see tag and inline {@}link} tag + * + * $expr is a string with many allowable formats: + *
          + *
        1. proceduralpagename.ext
        2. + *
        3. constant_name
        4. + *
        5. classname::function()
        6. + *
        7. classname::constantname
        8. (new 1.2.4) + *
        9. classname::$variablename
        10. + *
        11. classname
        12. + *
        13. function functionname()
        14. + *
        15. global $globalvarname
        16. + *
        17. packagename#expr where expr is any of the above
        18. + *
        + * + * New in version 1.1, you can explicitly specify a package to link to that + * is different from the current package. Use the # operator + * to specify a new package, as in tests#bug-540368.php (which should appear + * as a link like: "{@link tests#bug-540368.php}"). This + * example links to the procedural page bug-540368.php in package + * tests. Also, the "function" operator is now used to specifically + * link to a function instead of a method in the current class. + * + * + * class myclass + * { + * // from inside the class definition, use "function conflict()" to refer to procedural function "conflict()" + * function conflict() + * { + * } + * } + * + * function conflict() + * { + * } + * + * + * If classname:: is not present, and the see tag is in a documentation + * block within a class, then the function uses the classname to + * search for $expr as a function or variable within classname, or any of its parent classes. + * given an $expr without '$', '::' or '()' getLink first searches for + * classes, procedural pages, constants, global variables, and then searches for + * methods and variables within the default class, and finally for any function + * + * @param string $expr expression to search for a link + * @param string $package package to start searching in + * @param array $packages list of all packages to search in + * @return mixed getLink returns a descendant of {@link abstractLink} if it finds a link, otherwise it returns a string + * @see getPageLink(), getDefineLink(), getVarLink(), getFunctionLink(), getClassLink() + * @see pageLink, functionLink, defineLink, classLink, methodLink, varLink + */ + function &getLink($expr, $package = false, $packages = false) + { + // is $expr a comma-delimited list? + if (strpos($expr,',')) + { + $a = explode(',',$expr); + $b = array(); + for($i=0;$i_getLink($expr, $package, $packages); + return $a; + } + + /** + * @access private + */ + function &_getLink($expr, $package = false, $packages = false) + { + if (!$package) $package = $this->package; + // + if (!isset($this->all_packages[$package])) return $expr; + elseif (isset($packages[$package])) unset($packages[$package]); + $links = &$this->links; + $class = $this->class; + if (strpos($expr,'function ') === 0) + { // asking for a function, not a method + if ($test = Converter::getFunctionLink(str_replace('function ','',str_replace('()','',$expr)), $package)) return $test; + else return $expr; + } + if (strpos($expr,'global ') === 0) + { // asking for a global variable + if ($test = Converter::getGlobalLink(str_replace('global ','',$expr), $package)) return $test; + else return $expr; + } + if (strpos($expr,'object ') === 0) + { // asking for a class + if ($test = Converter::getClassLink(str_replace('object ','',$expr), $package)) return $test; + else return $expr; + } + if (strpos($expr,'constant ') === 0) + { // asking for a class + if ($test = Converter::getDefineLink(str_replace('constant ','',$expr), $package)) return $test; + else return $expr; + } + // are we in a class? + if ($class) + { + // is $expr simply a word? see if it is the class + if (trim($expr) == $class) + { + if ($test = Converter::getClassLink(trim(str_replace('object ','',$expr)),$package)) return $test; + } + // if not, check to see if it is a method or variable of this class tree + if (!strpos($expr,'::')) + { + // if get is neither get() nor $get, assume get is a function, add () to make get() + if (strpos($expr,'$') !== 0 && !strpos($expr,'()')) //$get = $get.'()'; + { + if ($a = $this->getLinkMethod($expr,$class,$package)) return $a; + if ($a = $this->getLinkConst($expr,$class,$package)) return $a; + if ($a = $this->getLinkVar('$'.$expr,$class,$package)) return $a; + } + if (strpos($expr,'()')) if ($a = $this->getLinkMethod($expr,$class,$package)) return $a; + if (is_numeric(strpos($expr,'$'))) if ($a = $this->getLinkVar($expr,$class,$package)) return $a; + } + } + if ($test = Converter::getClassLink(trim(str_replace('object ','',$expr)),$package)) return $test; + if ($test = Converter::getPageLink(trim($expr),$package)) return $test; + if ($test = Converter::getDefineLink(trim($expr),$package)) return $test; + if ($test = Converter::getGlobalLink(trim($expr),$package)) return $test; +// if (strpos($expr,'.')) + // package specified + + if (!is_array($packages)) + { + $packages = $this->all_packages; + } + do + { + if (isset($packages[$package])) unset($packages[$package]); + if ($test = Converter::getClassLink(str_replace('object ','',$expr),$package)) return $test; + if ($test = Converter::getPageLink($expr,$package)) return $test; + if ($test = Converter::getDefineLink($expr,$package)) return $test; + if ($test = Converter::getGlobalLink($expr,$package)) return $test; + // is $expr in class::method() or class::$variable format? + if (strpos($expr,'function ') === 0) + { // asking for a function, not a method + if ($test = Converter::getFunctionLink(str_replace('function','',str_replace('()','',$expr)), $package)) return $test; + else return $expr; + } + $test = $this->_getDoubleColon($expr, $package, $packages, $class, $links); + if (!is_string($test)) return $test; + if (strpos($test, 'parent::') === 0) return $test; + // $expr does not have :: + if (is_numeric(@strpos('$',$expr))) + { + // default to current class, whose name is contained in $this->render->parent + if ($test = Converter::getVarLink($expr, $class, $package)) return $test; + } + // $expr is a function? (non-method) + if (@strpos($expr,'()')) + { + // otherwise, see if it is a method + if ($class) + { + if ($test = Converter::getMethodLink(str_replace('()','',$expr), $class, $package)) return $test; + } + // extract the function name, use it to retrieve the file that the function is in + // $page = $this->func_page[str_replace('function ','',str_replace('()','',$expr))]; + // return the link + if ($test = Converter::getFunctionLink(str_replace('function ','',str_replace('()','',$expr)), $package)) return $test; + } + // $expr is just a word. First, test to see if it is a function of the current package + if ($test = Converter::getFunctionLink(str_replace('function ','',str_replace('()','',$expr)), $package)) return $test; + // try other packages + // look in parent package first, if found + if (isset($this->package_parents[$package]) && in_array($this->package_parents[$package], $packages)) + { + $p1 = $package; + $package = $this->package_parents[$package]; + if ($package) + { + if (isset($packages[$package])) unset($packages[$package]); + } + continue; + } + // no parent package, so start with the first one that's left + $package = @array_shift(@array_keys($packages)); + if ($package && isset($packages[$package])) + { + unset($packages[$package]); + } + } while (count($packages) || $package); + $funcs = get_defined_functions(); + // feature 564991, link to php manual + if (in_array(str_replace(array('(',')'),array('',''),$expr),$funcs['internal'])) + { + return 'http://www.php.net/'.str_replace(array('(',')'),array('',''),$expr); + } + // no links found + return $expr; + } + + /** + * Split up getLink to make it easier to debug + * @access private + */ + function _getDoubleColon(&$expr, &$package, &$packages, $class, $links) + { + if (@strpos($expr,'::')) + { + $class_method = explode('::',$expr); + if ($class_method[0] == 'parent') + { + // can only have parent in the same package as the class! subtle bug + $package = $this->package; + $packages = array(); + $cl = $this->classes->getClassByPackage($class,$package); + if (!$cl) + { // this is possible if an example file has parent::method() + return $expr; + } + $par = $cl->getParent($this); + $phpparent = false; + if (is_object($par)) + { + $package = $par->docblock->package; + $phpparent = $par->getName(); + } else + { + addWarning(PDERROR_CLASS_PARENT_NOT_FOUND,$class,$package,$class_method[1]); + return $expr; + } + if ($phpparent) $class_method[0] = $phpparent; + } + if (strpos($class_method[1],'()')) + { + // strip everything but the function name, return a link + if ($test = Converter::getMethodLink(str_replace('()','',$class_method[1]), $class_method[0], $package)) return $test; + } + if ($test = Converter::getVarLink($class_method[1], $class_method[0], $package)) return $test; + if ($test = Converter::getConstLink($class_method[1], $class_method[0], $package)) return $test; + } + return $expr; + } + + /** + * cycle through parent classes to retrieve a link to a method + * do not use or override, used by getLink + * @access private + */ + function &getLinkMethod($expr, $class, $package) + { + $links = &$this->links; + do + { + // is $expr in class::method() or class::$variable format? + if (@strpos($expr,'::')) + { + $class_method = explode('::',$expr); + if ($class_method[0] == 'parent') + { + $cl = $this->classes->getClassByPackage($class,$package); + $par = $cl->getParent($this); + $phpparent = false; + if (is_object($par)) + { + $package = $par->docblock->package; + $phpparent = $par->getName(); + } else addWarning(PDERROR_CLASSPARENT_NOTFOUND,$class,$package,$class_method[1]); + if ($phpparent) $class_method[0] = $phpparent; + } else + { + $cl = $this->classes->getClassByPackage($class,$package); + } + if (strpos($class_method[1],'()')) + { + // strip everything but the function name, return a link + if ($test = Converter::getMethodLink(str_replace('function ','',str_replace('()','',$class_method[1])), $class_method[0], $package)) return $test; + } + } + if ($test = Converter::getMethodLink(str_replace('()','',$expr), $class, $package)) return $test; + $cl = $this->classes->getClassByPackage($class,$package); + if ($cl) + { + $par = $cl->getParent($this); + if (is_object($par)) + { + $package = $par->docblock->package; + $class = $par->getName(); + } else $class = $par; + } else $class = false; + } while ($class); + // no links found + return false; + } + + /** + * cycle through parent classes to retrieve a link to a var + * do not use or override, used by getLink + * @access private + */ + function &getLinkVar($expr, $class, $package) + { + $links = &$this->links; + do + { + // is $expr in class::method() or class::$variable format? + if (@strpos($expr,'::')) + { + $class_method = explode('::',$expr); + if ($class_method[0] == 'parent') + { + $cl = $this->classes->getClassByPackage($class,$package); + $phpparent = false; + $par = $cl->getParent($this); + if (is_object($par)) + { + $package = $par->docblock->package; + $phpparent = $par->getName(); + } else addWarning(PDERROR_CLASSPARENT_NOTFOUND,$class,$package,$class_method[1]); + if ($phpparent) $class_method[0] = $phpparent; + } else + { + $cl = $this->classes->getClassByPackage($class,$package); + } + if ($test = Converter::getVarLink($class_method[1], $class_method[0], $package)) return $test; + if ($test = Converter::getVarLink('$'.$class_method[1], $class_method[0], $package)) return $test; + } + if ($test = Converter::getVarLink($expr, $class, $package)) return $test; + if ($test = Converter::getVarLink('$'.$expr, $class, $package)) return $test; + $cl = $this->classes->getClassByPackage($class,$package); + if ($cl) + { + $par = $cl->getParent($this); + if (is_object($par)) + { + $package = $par->docblock->package; + $class = $par->getName(); + } else $class = $par; + } else $class = false; + } while ($class); + // no links found + $class = false; + return $class; + } + + /** + * cycle through parent classes to retrieve a link to a class constant + * do not use or override, used by getLink + * @access private + * @since 1.2.4 + */ + function &getLinkConst($expr, $class, $package) + { + $links = &$this->links; + do + { + // is $expr in class::method() or class::$variable format? + if (@strpos($expr,'::')) + { + $class_method = explode('::',$expr); + if ($class_method[0] == 'parent') + { + $cl = $this->classes->getClassByPackage($class,$package); + $phpparent = false; + $par = $cl->getParent($this); + if (is_object($par)) + { + $package = $par->docblock->package; + $phpparent = $par->getName(); + } else addWarning(PDERROR_CLASSPARENT_NOTFOUND,$class,$package,$class_method[1]); + if ($phpparent) $class_method[0] = $phpparent; + } else + { + $cl = $this->classes->getClassByPackage($class,$package); + } + if ($test = Converter::getConstLink($class_method[1], $class_method[0], $package)) return $test; + } + if ($test = Converter::getConstLink($expr, $class, $package)) return $test; + $cl = $this->classes->getClassByPackage($class,$package); + if ($cl) + { + $par = $cl->getParent($this); + if (is_object($par)) + { + $package = $par->docblock->package; + $class = $par->getName(); + } else $class = $par; + } else $class = false; + } while ($class); + // no links found + return false; + } + + /** + * take URL $link and text $text and return a link in the format needed for the Converter + * @param string URL + * @param string text to display + * @return string link to $link + * @abstract + */ + function returnLink($link,$text) + { + } + + /** + * take {@link abstractLink} descendant and text $eltext and return a link + * in the format needed for the Converter + * @param abstractLink + * @param string + * @return string link to $element + * @abstract + */ + function returnSee(&$link, $eltext = false) + { + } + + /** + * take {@link abstractLink} descendant and text $eltext and return a + * unique ID in the format needed for the Converter + * @param abstractLink + * @return string unique identifier of $element + * @abstract + */ + function getId(&$link) + { + } + + /** + * Convert README/INSTALL/CHANGELOG file contents to output format + * @param README|INSTALL|CHANGELOG + * @param string contents of the file + * @abstract + */ + function Convert_RIC($name, $contents) + { + } + + /** + * Convert all elements to output format + * + * This will call ConvertXxx where Xxx is {@link ucfirst}($element->type). + * It is expected that a child converter defines a handler for every + * element type, even if that handler does nothing. phpDocumentor will + * terminate with an error if a handler doesn't exist. + * {@internal + * Since 1.2.0 beta 3, this function has been moved from child converters + * to the parent, because it doesn't really make sense to put it in the + * child converter, and we can add error handling. + * + * {@source}}} + * @throws {@link PDERROR_NO_CONVERT_HANDLER} + * @param mixed {@link parserElement} descendant or {@link parserPackagePage} or {@link parserData} + */ + function Convert(&$element) + { + $handler = 'convert'.ucfirst($element->type); + if (method_exists($this,$handler)) + { + $this->$handler($element); + } else + { + addErrorDie(PDERROR_NO_CONVERTER_HANDLER,$element->type,$handler,phpDocumentor_get_class($this)); + } + } + /**#@+ + * Conversion Handlers + * + * All of the convert* handlers set up template variables for the Smarty + * template.{@internal In addition, the {@link newSmarty()} method is + * called to retrieve the global Smarty template}} + */ + /** + * Default Tutorial Handler + * + * Sets up the tutorial template, and its prev/next/parent links + * {@internal + * Retrieves the title using {@link parserTutorial::getTitle()} and uses the + * {@link parserTutorial::prev, parserTutorial::next, parserTutorial::parent} + * links to set up those links.}} + * @param parserTutorial + */ + function &convertTutorial(&$element) + { + $this->package = $element->package; + $this->subpackage = $element->subpackage; + $x = $element->Convert($this); + $template = &$this->newSmarty(); + $template->assign('contents',$x); + $template->assign('title',$element->getTitle($this)); + $template->assign('nav',$element->parent || $element->prev || $element->next); + if ($element->parent) + { + $template->assign('up',$this->getId($element->parent)); + $template->assign('uptitle',$element->parent->title); + } + if ($element->prev) + { + $template->assign('prev',$this->getId($element->prev)); + $template->assign('prevtitle',$element->prev->title); + } + if ($element->next) + { + $template->assign('next',$this->getId($element->next)); + $template->assign('nexttitle',$element->next->title); + } + return $template; + } + /** + * Default Class Handler + * + * Sets up the class template. + * {@internal special methods + * {@link generateChildClassList(), generateFormattedClassTree()}, + * {@link getFormattedConflicts, getFormattedInheritedMethods}, + * and {@link getFormattedInheritedVars} are called to complete vital + * template setup.}} + */ + function convertClass(&$element) + { + $this->class = $element->getName(); + $this->class_data = &$this->newSmarty(); + $this->class_data->assign("class_name",$element->getName()); + $this->class_data->assign("vars",array()); + $this->class_data->assign("methods",array()); + $this->class_data->assign("consts",array()); + $this->class_data->assign("is_interface", $element->isInterface()); + $this->class_data->assign("implements", $this->getFormattedImplements($element)); + $this->class_data->assign("package",$element->docblock->package); + $this->class_data->assign("line_number",$element->getLineNumber()); + $this->class_data->assign("source_location",$element->getSourceLocation($this)); + $this->class_data->assign("page_link",$this->getCurrentPageLink()); + $docblock = $this->prepareDocBlock($element, false); + $this->class_data->assign("sdesc",$docblock['sdesc']); + $this->class_data->assign("desc",$docblock['desc']); + $this->class_data->assign("access", $docblock['access']); + $this->class_data->assign("abstract", $docblock['abstract']); + $this->class_data->assign("tags",$docblock['tags']); + $this->class_data->assign("api_tags",$docblock['api_tags']); + $this->class_data->assign("info_tags",$docblock['info_tags']); + $this->class_data->assign("utags",$docblock['utags']); + if ($this->hasSourceCode($element->getPath())) { + $this->class_data->assign("class_slink",$this->getSourceAnchor($element->getPath(),$element->getLineNumber(),$element->getLineNumber(),true)); + } + + else + $this->class_data->assign("class_slink",false); + $this->class_data->assign("children", $this->generateChildClassList($element)); + $this->class_data->assign("class_tree", $this->generateFormattedClassTree($element)); + $this->class_data->assign("conflicts", $this->getFormattedConflicts($element,"classes")); + $inherited_methods = $this->getFormattedInheritedMethods($element); + if (!empty($inherited_methods)) + { + $this->class_data->assign("imethods",$inherited_methods); + } else + { + $this->class_data->assign("imethods",false); + } + $inherited_vars = $this->getFormattedInheritedVars($element); + if (!empty($inherited_vars)) + { + $this->class_data->assign("ivars",$inherited_vars); + } else + { + $this->class_data->assign("ivars",false); + } + $inherited_consts = $this->getFormattedInheritedConsts($element); + if (!empty($inherited_consts)) + { + $this->class_data->assign("iconsts",$inherited_consts); + } else + { + $this->class_data->assign("iconsts",false); + } + } + + + /** + * Converts method for template output + * + * This function must be called by a child converter with any extra + * template variables needed in the parameter $addition + * @param parserMethod + */ + function convertMethod(&$element, $additions = array()) + { + $fname = $element->getName(); + $docblock = $this->prepareDocBlock($element); + $returntype = 'void'; + if ($element->isConstructor) $returntype = $element->class; + if ($element->docblock->return) + { + $a = $element->docblock->return->Convert($this); + $returntype = $element->docblock->return->converted_returnType; + } + $params = $param_i = array(); + if (count($element->docblock->params)) + foreach($element->docblock->params as $param => $val) + { + $a = $val->Convert($this); + $params[] = $param_i[$param] = array("var" => $param,"datatype" => $val->converted_returnType,"data" => $a); + } + + if ($element->docblock->hasaccess) + $acc = $element->docblock->tags['access'][0]->value; + else + $acc = 'public'; + + + if ($this->hasSourceCode($element->getPath())) + $additions["slink"] = $this->getSourceAnchor($element->getPath(),$element->getLineNumber(),$element->getLineNumber(),true); + $this->class_data->append('methods',array_merge( + array('sdesc' => $docblock['sdesc'], + 'desc' => $docblock['desc'], + 'access' => $docblock['access'], + 'abstract' => $docblock['abstract'], + 'tags' => $docblock['tags'], + 'api_tags' => $docblock['api_tags'], + 'info_tags' => $docblock['info_tags'], + 'utags' => $docblock['utags'], + 'constructor' => $element->isConstructor, + 'access' => $acc, + 'function_name' => $fname, + 'function_return' => $returntype, + 'function_call' => $element->getFunctionCall(), + 'ifunction_call' => $element->getIntricateFunctionCall($this, $param_i), + 'descmethod' => $this->getFormattedDescMethods($element), + 'method_overrides' => $this->getFormattedOverrides($element), + 'line_number' => $element->getLineNumber(), + 'id' => $this->getId($element), + 'params' => $params), + $additions)); + } + + /** + * Converts class variables for template output. + * + * This function must be called by a child converter with any extra + * template variables needed in the parameter $addition + * @param parserVar + */ + function convertVar(&$element, $additions = array()) + { + $docblock = $this->prepareDocBlock($element); + $b = 'mixed'; + + if ($element->docblock->hasaccess) + $acc = $element->docblock->tags['access'][0]->value; + else + $acc = 'public'; + + if ($element->docblock->var) + { + $b = $element->docblock->var->converted_returnType; + } + if ($this->hasSourceCode($element->getPath())) + $additions["slink"] = $this->getSourceAnchor($element->getPath(),$element->getLineNumber(),$element->getLineNumber(),true); + $this->class_data->append('vars',array_merge( + array('sdesc' => $docblock['sdesc'], + 'desc' => $docblock['desc'], + 'abstract' => $docblock['abstract'], + 'utags' => $docblock['utags'], + 'tags' => $docblock['tags'], + 'api_tags' => $docblock['api_tags'], + 'info_tags' => $docblock['info_tags'], + 'var_name' => $element->getName(), + 'var_default' => $this->postProcess($element->getValue()), + 'var_type' => $b, + 'access' => $acc, + 'line_number' => $element->getLineNumber(), + 'descvar' => $this->getFormattedDescVars($element), + 'var_overrides' => $this->getFormattedOverrides($element), + 'id' => $this->getId($element)), + $additions)); + } + + /** + * Converts class constants for template output. + * + * This function must be called by a child converter with any extra + * template variables needed in the parameter $addition + * @param parserConst + */ + function convertConst(&$element, $additions = array()) + { + $docblock = $this->prepareDocBlock($element); + + if ($element->docblock->hasaccess) + $acc = $element->docblock->tags['access'][0]->value; + else + $acc = 'public'; + + if ($this->hasSourceCode($element->getPath())) + $additions["slink"] = $this->getSourceAnchor($element->getPath(),$element->getLineNumber(),$element->getLineNumber(),true); + $this->class_data->append('consts',array_merge( + array('sdesc' => $docblock['sdesc'], + 'desc' => $docblock['desc'], + 'access' => $docblock['access'], + 'abstract' => $docblock['abstract'], + 'utags' => $docblock['utags'], + 'tags' => $docblock['tags'], + 'api_tags' => $docblock['api_tags'], + 'info_tags' => $docblock['info_tags'], + 'const_name' => $element->getName(), + 'const_value' => $this->postProcess($element->getValue()), + 'access' => $acc, + 'line_number' => $element->getLineNumber(), + 'id' => $this->getId($element)), + $additions)); + } + + /** + * Default Page Handler + * + * {@internal In addition to setting up the smarty template with {@link newSmarty()}, + * this class uses {@link getSourceLocation()} and {@link getClassesOnPage()} + * to set template variables. Also used is {@link getPageName()}, to get + * a Converter-specific name for the page.}} + * @param parserPage + */ + function convertPage(&$element) + { + $this->page_data = &$this->newSmarty(true); + $this->page = $this->getPageName($element->parent); + $this->path = $element->parent->getPath(); + $this->curpage = &$element->parent; + $this->page_data->assign("source_location",$element->parent->getSourceLocation($this)); + $this->page_data->assign("functions",array()); + $this->page_data->assign("includes",array()); + $this->page_data->assign("defines",array()); + $this->page_data->assign("globals",array()); + $this->page_data->assign("classes",$this->getClassesOnPage($element)); + $this->page_data->assign("name", $element->parent->getFile()); + if ($t = $element->getTutorial()) + { + $this->page_data->assign("tutorial",$this->returnSee($t)); + } else + { + $this->page_data->assign("tutorial",false); + } + if ($element->docblock) + { + $docblock = $this->prepareDocBlock($element, false); + $this->page_data->assign("sdesc",$docblock['sdesc']); + $this->page_data->assign("desc",$docblock['desc']); + $this->page_data->assign("tags",$docblock['tags']); + $this->page_data->assign("api_tags",$docblock['api_tags']); + $this->page_data->assign("info_tags",$docblock['info_tags']); + $this->page_data->assign("utags",$docblock['utags']); + } + } + + /** + * Converts global variables for template output + * + * This function must be called by a child converter with any extra + * template variables needed in the parameter $addition + * {@internal + * In addition to using {@link prepareDocBlock()}, this method also + * uses utility functions {@link getGlobalValue(), getFormattedConflicts()}}} + * @param parserGlobal + * @uses postProcess() on global_value template value, makes it displayable + * @param array any additional template variables should be in this array + */ + function convertGlobal(&$element, $addition = array()) + { + $docblock = $this->prepareDocBlock($element); + $value = $this->getGlobalValue($element->getValue()); + if ($this->hasSourceCode($element->getPath())) + $addition["slink"] = $this->getSourceAnchor($element->getPath(),$element->getLineNumber(),$element->getLineNumber(),true); + $this->page_data->append('globals',array_merge( + array('sdesc' => $docblock['sdesc'], + 'desc' => $docblock['desc'], + 'tags' => $docblock['tags'], + 'api_tags' => $docblock['api_tags'], + 'info_tags' => $docblock['info_tags'], + 'utags' => $docblock['utags'], + 'global_name' => $element->getName(), + 'global_type' => $element->getDataType($this), + 'global_value' => $this->postProcess($value), + 'line_number' => $element->getLineNumber(), + 'global_conflicts' => $this->getFormattedConflicts($element,"global variables"), + 'id' => $this->getId($element)), + $addition)); + } + + /** + * Converts defines for template output + * + * This function must be called by a child converter with any extra + * template variables needed in the parameter $addition + * {@internal + * In addition to using {@link prepareDocBlock()}, this method also + * uses utility functions {@link getGlobalValue(), getFormattedConflicts()}}} + * @param parserDefine + * @uses postProcess() on define_value template value, makes it displayable + * @param array any additional template variables should be in this array + */ + function convertDefine(&$element, $addition = array()) + { + $docblock = $this->prepareDocBlock($element); + if ($this->hasSourceCode($element->getPath())) + $addition["slink"] = $this->getSourceAnchor($element->getPath(),$element->getLineNumber(),$element->getLineNumber(),true); + $this->page_data->append('defines',array_merge( + array('sdesc' => $docblock['sdesc'], + 'desc' => $docblock['desc'], + 'tags' => $docblock['tags'], + 'api_tags' => $docblock['api_tags'], + 'info_tags' => $docblock['info_tags'], + 'utags' => $docblock['utags'], + 'define_name' => $element->getName(), + 'line_number' => $element->getLineNumber(), + 'define_value' => $this->postProcess($element->getValue()), + 'define_conflicts' => $this->getFormattedConflicts($element,"defines"), + 'id' => $this->getId($element)), + $addition)); + } + + + /** + * Converts includes for template output + * + * This function must be called by a child converter with any extra + * template variables needed in the parameter $addition + * @see prepareDocBlock() + * @param parserInclude + */ + function convertInclude(&$element, $addition = array()) + { + $docblock = $this->prepareDocBlock($element); + $per = $this->getIncludeValue($element->getValue(), $element->getPath()); + + if ($this->hasSourceCode($element->getPath())) + $addition["slink"] = $this->getSourceAnchor($element->getPath(),$element->getLineNumber(),$element->getLineNumber(),true); + $this->page_data->append('includes',array_merge( + array('sdesc' => $docblock['sdesc'], + 'desc' => $docblock['desc'], + 'tags' => $docblock['tags'], + 'api_tags' => $docblock['api_tags'], + 'info_tags' => $docblock['info_tags'], + 'utags' => $docblock['utags'], + 'include_name' => $element->getName(), + 'line_number' => $element->getLineNumber(), + 'include_value' => $per), + $addition)); + } + + /** + * Converts function for template output + * + * This function must be called by a child converter with any extra + * template variables needed in the parameter $addition + * @see prepareDocBlock() + * @param parserFunction + */ + function convertFunction(&$element, $addition = array()) + { + $docblock = $this->prepareDocBlock($element); + $fname = $element->getName(); + $params = $param_i = array(); + if (count($element->docblock->params)) + foreach($element->docblock->params as $param => $val) + { + $a = $val->Convert($this); + $params[] = $param_i[$param] = array("var" => $param,"datatype" => $val->converted_returnType,"data" => $a); + } + $returntype = 'void'; + if ($element->docblock->return) + { + $a = $element->docblock->return->Convert($this); + $returntype = $element->docblock->return->converted_returnType; + } + + if ($this->hasSourceCode($element->getPath())) + $addition["slink"] = $this->getSourceAnchor($element->getPath(),$element->getLineNumber(),$element->getLineNumber(),true); + $this->page_data->append('functions',array_merge( + array('sdesc' => $docblock['sdesc'], + 'desc' => $docblock['desc'], + 'tags' => $docblock['tags'], + 'api_tags' => $docblock['api_tags'], + 'info_tags' => $docblock['info_tags'], + 'utags' => $docblock['utags'], + 'function_name' => $fname, + 'function_return' => $returntype, + 'function_conflicts' => $this->getFormattedConflicts($element,"functions"), + 'ifunction_call' => $element->getIntricateFunctionCall($this, $param_i), + 'function_call' => $element->getFunctionCall(), + 'line_number' => $element->getLineNumber(), + 'id' => $this->getId($element), + 'params' => $params), + $addition)); + } + /**#@-*/ + + /** + * convert the element's DocBlock for output + * + * This function converts all tags and descriptions for output + * @param mixed any descendant of {@link parserElement}, or {@link parserData} + * @param array used to translate tagnames into other tags + * @param boolean set to false for pages and classes, the only elements allowed to specify @package + * @return array + * + * Format: + *
        +     * array('sdesc' => DocBlock summary
        +     *       'desc' => DocBlock detailed description
        +     *       'tags' => array('keyword' => tagname, 'data' => tag description)
        +     *                 known tags
        +     *       'api_tags' => array('keyword' => tagname, 'data' => tag description)
        +     *                 known api documentation tags
        +     *       'info_tags' => array('keyword' => tagname, 'data' => tag description)
        +     *                 known informational tags
        +     *     [ 'utags' => array('keyword' => tagname, 'data' => tag description
        +     *                 unknown tags ]
        +     *     [ 'vartype' => type from @var/@return tag ]
        +     *     [ 'var_descrip' => description from @var/@return tag ]
        +     *      )
        +     * 
        + */ + function prepareDocBlock(&$element, $names = array(),$nopackage = true) + { + $tagses = $element->docblock->listTags(); + $tags = $ret = $api_tags = $info_tags = array(); + $api_tags_arr = array("abstract", "access", "deprecated", "example", "filesource", + "global", "internal", "name", "return", "see", "static", + "staticvar", "uses", "var"); + if (!$nopackage) + { + $tags[] = array('keyword' => 'package','data' => $element->docblock->package); + if (!empty($element->docblock->subpackage)) $tags[] = array('keyword' => 'subpackage','data' => $element->docblock->subpackage); + } + if ($element->docblock->var) + { + $a = $element->docblock->var->Convert($this); + $ret['vartype'] = $element->docblock->var->converted_returnType; + if (!empty($a)) + { + $tags[] = array('keyword' => 'var', 'data' => $a); + $ret["var_descrip"] = $a; + } + } + if ($element->docblock->return) + { + $a = $element->docblock->return->Convert($this); + $ret['vartype'] = $element->docblock->return->converted_returnType; + if (!empty($a)) + { + $tags[] = $api_tags[] = array('keyword' => 'return', 'data' => $a); + $ret["var_descrip"] = $a; + } + } + if ($element->docblock->funcglobals) + foreach($element->docblock->funcglobals as $global => $val) + { + if ($a = $this->getGlobalLink($global,$element->docblock->package)) + { + $global = $a; + } + $b = Converter::getLink($val[0]); + if (is_object($b) && phpDocumentor_get_class($b) == 'classlink') + { + $val[0] = $this->returnSee($b); + } + $tags[] = $api_tags[] = array('keyword' => 'global','data' => $val[0].' '.$global.': '.$val[1]->Convert($this)); + } + if ($element->docblock->statics) + foreach($element->docblock->statics as $static => $val) + { + $a = $val->Convert($this); + $tags[] = $api_tags[] = array('keyword' => 'staticvar','data' => $val->converted_returnType.' '.$static.': '.$a); + } + foreach($tagses as $tag) + { + if (isset($names[$tag->keyword])) $tag->keyword = $names[$tag->keyword]; + if ($tag->keyword) + $tags[] = array("keyword" => $tag->keyword,"data" => $tag->Convert($this)); + if (in_array($tag->keyword, $api_tags_arr)) + $api_tags[] = array("keyword" => $tag->keyword,"data" => $tag->Convert($this)); + else + $info_tags[] = array("keyword" => $tag->keyword,"data" => $tag->Convert($this)); + } + $utags = array(); + foreach($element->docblock->unknown_tags as $keyword => $tag) + { + foreach($tag as $t) + $utags[] = array('keyword' => $keyword, 'data' => $t->Convert($this)); + } + $ret['abstract'] = FALSE; + $ret['access'] = 'public'; + foreach($tags as $tag) + { + if ($tag['keyword'] == 'access') + $ret['access'] = $tag['data']; + if ($tag['keyword'] == 'abstract') + $ret['abstract'] = TRUE; + } + $ret['sdesc'] = $element->docblock->getSDesc($this); + $ret['desc'] = $element->docblock->getDesc($this); + $ret['tags'] = $tags; + $ret['api_tags'] = $api_tags; + $ret['info_tags'] = $info_tags; + $ret['utags'] = $utags; + return $ret; + } + + /** + * gets a list of all classes declared on a procedural page represented by + * $element, a {@link parserData} class + * @param parserData &$element + * @return array links to each classes documentation + * + * Format: + *
        +     * array('name' => class name,
        +     *       'sdesc' => summary of the class
        +     *       'link' => link to the class's documentation)
        +     * 
        + */ + function getClassesOnPage(&$element) + { + global $_phpDocumentor_setting; + $a = $element->getClasses($this); + $classes = array(); + foreach($a as $package => $clas) + { + if (isset($_phpDocumentor_setting['packageoutput'])) + { + $packages = explode(',',$_phpDocumentor_setting['packageoutput']); + if (!in_array($package, $packages)) continue; + } + for($i=0; $iparseprivate || ! ($clas[$i]->docblock && $clas[$i]->docblock->hasaccess && $clas[$i]->docblock->tags['access'][0]->value == 'private')) + { + $sdesc = ''; + $r = array(); + $sdesc = $clas[$i]->docblock->getSDesc($this); + if ($clas[$i]->docblock->hasaccess) + $r['access'] = $clas[$i]->docblock->tags['access'][0]->value; + else + $r['access'] = 'public'; + if (isset ($clas[$i]->docblock->tags['abstract'])) + $r['abstract'] = TRUE; + else + $r['abstract'] = FALSE; + $r['name'] = $clas[$i]->getName(); + $r['sdesc'] = $sdesc; + $r['link'] = $this->getClassLink($clas[$i]->getName(),$package,$clas[$i]->getPath()); + $classes[] = $r; + } + } + } + return $classes; + } + + /** + * returns an array containing the class inheritance tree from the root + * object to the class. + * + * This method must be overridden, or phpDocumentor will halt with a fatal + * error + * @return string Converter-specific class tree for an individual class + * @param parserClass class variable + * @abstract + */ + + function generateFormattedClassTree($class) + { + addErrorDie(PDERROR_CONVERTER_OVR_GFCT,phpDocumentor_get_class($this)); + } + + /** + * returns an array containing the class inheritance tree from the root + * object to the class. + * + * This method must be overridden, or phpDocumentor will halt with a fatal + * error + * @return string Converter-specific class tree for an individual class + * @param parserClass class variable + * @abstract + */ + + function getFormattedImplements($el) + { + $ret = array(); + foreach ($el->getImplements() as $interface) + { + $ret[] = $this->returnSee($this->getLink($interface)); + } + return $ret; + } + + /** + * @param mixed {@link parserClass, parserFunction, parserDefine} or + * {@link parserGlobal} + * @param string type to display. either 'class','function','define' + * or 'global variable' + * @return array links to conflicting elements, or empty array + * @uses parserClass::getConflicts() + * @uses parserFunction::getConflicts() + * @uses parserDefine::getConflicts() + * @uses parserGlobal::getConflicts() + */ + function getFormattedConflicts(&$element,$type) + { + $conflicts = $element->getConflicts($this); + $r = array(); + if (!$conflicts) return false; + foreach($conflicts as $package => $class) + { + $r[] = $class->getLink($this,$class->docblock->package); + } + if (!empty($r)) $r = array('conflicttype' => $type, 'conflicts' => $r); + return $r; + } + + /** + * Get a list of methods in child classes that override this method + * @return array empty array or array(array('link'=>link to method, + * 'sdesc'=>short description of the method),...) + * @uses parserMethod::getOverridingMethods() + * @param parserMethod + */ + function getFormattedDescMethods(&$element) + { + $meths = $element->getOverridingMethods($this); + $r = array(); + for($i=0; $igetLink($this); + $ms['sdesc'] = $meths[$i]->docblock->getSDesc($this); + $r[] = $ms; + } + return $r; + } + + /** + * Get a list of vars in child classes that override this var + * @return array empty array or array('link'=>link to var, + * 'sdesc'=>short description of the method + * @uses parserVar::getOverridingVars() + * @param parserVar + */ + function getFormattedDescVars(&$element) + { + $vars = $element->getOverridingVars($this); + $r = array(); + for($i=0; $igetLink($this); + $vs['sdesc'] = $vars[$i]->docblock->getSDesc($this); + $r[] = $vs; + } + return $r; + } + + /** + * Get the method this method overrides, if any + * @return array|false array('link'=>link to overridden method, + * 'sdesc'=>short description + * @see parserMethod::getOverrides() + * @param parserMethod + */ + function getFormattedOverrides(&$element) + { + $ovr = $element->getOverrides($this); + if (!$ovr) return false; + $sdesc = $ovr->docblock->getSDesc($this); + return array('link' => $ovr->getLink($this),'sdesc' => $sdesc); + } + + /** + * returns a list of child classes + * + * @param parserClass class variable + * @uses parserClass::getChildClassList() + */ + + function generateChildClassList($class) + { + $kids = $class->getChildClassList($this); + $list = array(); + if (count($kids)) + { + for($i=0; $igetLink($this); + $lt['sdesc'] = $kids[$i]->docblock->getSDesc($this); + + if ($kids[$i]->docblock->hasaccess) + $lt['access'] = $kids[$i]->docblock->tags['access'][0]->value; + else + $lt['access'] = 'public'; + + $lt['abstract'] = isset ($kids[$i]->docblock->tags['abstract'][0]); + + $list[] = $lt; + } + } else return false; + return $list; + } + + /** + * Return template-enabled list of inherited variables + * + * uses parserVar helper function getInheritedVars and generates a + * template-enabled list using getClassLink() + * @param parserVar $child class method + * @see getClassLink(), parserVar::getInheritedVars() + * @return array Format: + *
        +     * array(
        +     *   array('parent_class' => link to parent class's documentation,
        +     *         'ivars' =>
        +     *            array(
        +     *              array('name' => inherited variable name,
        +     *                    'link' => link to inherited variable's documentation,
        +     *                    'default' => default value of inherited variable,
        +     *                    'sdesc' => summary of inherited variable),
        +     *              ...),
        +     *   ...)
        +     * 
        + */ + + function getFormattedInheritedVars($child) + { + $package = $child->docblock->package; + $subpackage = $child->docblock->subpackage; + $ivars = $child->getInheritedVars($this); + $results = array(); + if (!count($ivars)) return $results; + foreach($ivars as $parent => $vars) + { + $file = $vars['file']; + $vars = $vars['vars']; + $par = $this->classes->getClass($parent,$file); + $package = $par->docblock->package; + usort($vars,array($this,"sortVar")); + $result['parent_class'] = $this->getClassLink($parent,$package); + foreach($vars as $var) + { + $info = array(); + + if ($var->docblock->hasaccess) + $info['access'] = $var->docblock->tags['access'][0]->value; + else + $info['access'] = 'public'; + + $info['abstract'] = isset ($var->docblock->tags['abstract'][0]); + + $info['name'] = $var->getName(); + $info['link'] = $var->getLink($this); + $info['default'] = $this->postProcess($var->getValue()); + if ($var->docblock) + $info['sdesc'] = $var->docblock->getSDesc($this); + $result["ivars"][] = $info; + } + $results[] = $result; + $result = array(); + } + return $results; + } + + /** + * Return template-enabled list of inherited methods + * + * uses parserMethod helper function getInheritedMethods and generates a + * template-enabled list using getClassLink() + * @param parserMethod $child class method + * @see getClassLink(), parserMethod::getInheritedMethods() + * @return array Format: + *
        +     * array(
        +     *   array('parent_class' => link to parent class's documentation,
        +     *         'ivars' =>
        +     *            array(
        +     *              array('name' => inherited variable name,
        +     *                    'link' => link to inherited variable's documentation,
        +     *                    'function_call' => {@link parserMethod::getIntricateFunctionCall()}
        +     *                                       returned array,
        +     *                    'sdesc' => summary of inherited variable),
        +     *              ...),
        +     *   ...)
        +     * 
        + */ + + function getFormattedInheritedMethods($child) + { + $package = $child->docblock->package; + $subpackage = $child->docblock->subpackage; + $imethods = $child->getInheritedMethods($this); + $results = array(); + if (!count($imethods)) return $results; + foreach($imethods as $parent => $methods) + { + $file = $methods['file']; + $methods = $methods['methods']; + $par = $this->classes->getClass($parent,$file); + $package = $par->docblock->package; + usort($methods,array($this,"sortMethod")); + $result['parent_class'] = $this->getClassLink($parent,$package); + foreach($methods as $method) + { + $info = array(); + + if ($method->docblock->hasaccess) + $info['access'] = $method->docblock->tags['access'][0]->value; + else + $info['access'] = 'public'; + + $info['abstract'] = isset ($method->docblock->tags['abstract'][0]); + + if ($method->isConstructor) $info['constructor'] = 1; + $info['link'] = $method->getLink($this); + $info['name'] = $method->getName(); + if ($method->docblock) + $info['sdesc'] = $method->docblock->getSDesc($this); + $params = array(); + if (count($method->docblock->params)) + foreach($method->docblock->params as $param => $val) + { + $a = $val->Convert($this); + $params[$param] = array("var" => $param,"datatype" => $val->converted_returnType,"data" => $a); + } + + $info['function_call'] = $method->getIntricateFunctionCall($this,$params); + $result["imethods"][] = $info; + } + $results[] = $result; + $result = array(); + } + return $results; + } + + /** + * Return template-enabled list of inherited class constants + * + * uses parserConst helper function getInheritedConsts and generates a + * template-enabled list using getClassLink() + * @param parserConst $child class constant + * @see getClassLink(), parserMethod::getInheritedConsts() + * @return array Format: + *
        +     * array(
        +     *   array('parent_class' => link to parent class's documentation,
        +     *         'ivars' =>
        +     *            array(
        +     *              array('name' => inherited constant name,
        +     *                    'link' => link to inherited constant's documentation,
        +     *                    'value' => constant value,
        +     *                    'sdesc' => summary of inherited constant),
        +     *              ...),
        +     *   ...)
        +     * 
        + */ + + function getFormattedInheritedConsts($child) + { + $package = $child->docblock->package; + $subpackage = $child->docblock->subpackage; + $ivars = $child->getInheritedConsts($this); + $results = array(); + if (!count($ivars)) return $results; + foreach($ivars as $parent => $vars) + { + $file = $vars['file']; + $vars = $vars['consts']; + $par = $this->classes->getClass($parent,$file); + $package = $par->docblock->package; + usort($vars,array($this,"sortVar")); + $result['parent_class'] = $this->getClassLink($parent,$package); + foreach($vars as $var) + { + $info = array(); + + if ($var->docblock->hasaccess) + $info['access'] = $var->docblock->tags['access'][0]->value; + else + $info['access'] = 'public'; + + $info['name'] = $var->getName(); + $info['link'] = $var->getLink($this); + $info['value'] = $this->postProcess($var->getValue()); + if ($var->docblock) + $info['sdesc'] = $var->docblock->getSDesc($this); + $result["iconsts"][] = $info; + } + $results[] = $result; + $result = array(); + } + return $results; + } + + /** + * Return a Smarty template object to operate with + * + * This returns a Smarty template with pre-initialized variables for use. + * If the method "SmartyInit()" exists, it is called. + * @return Smarty + */ + function &newSmarty() + { + $templ = new Smarty; + $templ->use_sub_dirs = false; + $templ->template_dir = realpath($this->smarty_dir . PATH_DELIMITER . 'templates'); + $templ->compile_dir = realpath($this->smarty_dir . PATH_DELIMITER . 'templates_c'); + $templ->config_dir = realpath($this->smarty_dir . PATH_DELIMITER . 'configs'); + $templ->assign("date",date("r",time())); + $templ->assign("maintitle",$this->title); + $templ->assign("package",$this->package); + $templ->assign("phpdocversion",PHPDOCUMENTOR_VER); + $templ->assign("phpdocwebsite",PHPDOCUMENTOR_WEBSITE); + $templ->assign("subpackage",$this->subpackage); + if (method_exists($this,'SmartyInit')) return $this->SmartyInit($templ); + return $templ; + } + + /** + * do all necessary output + * @see Converter + * @abstract + */ + function Output($title) + { + phpDocumentor_out("WARNING: Generic Converter::Output was used, no output will be generated"); + } + + /** + * Set the template directory with a different template base directory + * @tutorial phpDocumentor.howto.pkg#using.command-line.templatebase + * @param string template base directory + * @param string template name + */ + function setTemplateBase($base, $dir) + { + // remove trailing /'s from the base path, if any + $base = str_replace('\\','/',$base); + while ($base{strlen($base) - 1} == '/') $base = substr($base,0,strlen($base) - 1); + $this->templateName = substr($dir,0,strlen($dir) - 1); + $this->templateDir = $base . "/Converters/" . $this->outputformat . "/" . $this->name . "/templates/" . $dir; + if (!is_dir($this->templateDir)) + { + addErrorDie(PDERROR_TEMPLATEDIR_DOESNT_EXIST, $this->templateDir); + } + + $this->smarty_dir = $this->templateDir; + if (file_exists($this->templateDir . PATH_DELIMITER . 'options.ini')) + { + // retrieve template options, allow array creation + $this->template_options = phpDocumentor_parse_ini_file($this->templateDir . PATH_DELIMITER . 'options.ini',true); + } + } + + /** + * sets the template directory based on the {@link $outputformat} and {@link $name} + * Also sets {@link $templateName} to the $dir parameter + * @param string subdirectory + */ + function setTemplateDir($dir) + { + if ('@DATA-DIR@' != '@'.'DATA-DIR@') { + $templateBase = str_replace('\\', '/', '@DATA-DIR@/PhpDocumentor/phpDocumentor'); + } else { + $templateBase = str_replace('\\','/',$GLOBALS['_phpDocumentor_install_dir']) . '/phpDocumentor'; + } + $this->setTemplateBase($templateBase, $dir); + } + + /** + * Get the absolute path to the converter's base directory + * @return string + */ + function getConverterDir() + { + if (/*@donotremove*/0) { + return str_replace('\\', '/', "@DATA-DIR@/PhpDocumentor/phpDocumentor/Converters/") . $this->outputformat . "/" . $this->name; + } else { + return str_replace('\\','/',$GLOBALS['_phpDocumentor_install_dir']) ."/phpDocumentor/Converters/" . $this->outputformat . "/" . $this->name; + } + } + + /** + * Parse a global variable's default value for class initialization. + * + * If a global variable's default value is "new class" as in: + * + * $globalvar = new Parser + * + * This method will document it not as "new Parser" but instead as + * "new {@link Parser}". For examples, see {@link phpdoc.inc}. + * Many global variables are classes, and phpDocumentor links to their + * documentation + * @return string default global variable value with link to class if + * it's "new Class" + * @param string default value of a global variable. + */ + function getGlobalValue($value) + { + if (strpos($value,'new') === 0) + { + preg_match('/new([^(]*)(.*)/',$value,$newval); + if (isset($newval[1])) + { + $a = Converter::getLink(trim($newval[1])); + if (!isset($newval[2])) $newval[2] = ''; + if ($a && phpDocumentor_get_class($a) == 'classlink') $value = 'new '.$this->returnSee($a).$newval[2]; + } + } + return $value; + } + + /** + * Parse an include's file to see if it is a file documented in this project + * + * Although not very smart yet, this method will try to look for the + * included file file.ext: + * + * + * include ("file.ext"); + * + * + * If it finds it, it will return a link to the file's documentation. As of + * 1.2.0rc1, phpDocumentor is smarty enough to find these cases: + *
          + *
        • absolute path to file
        • + *
        • ./file.ext or ../file.ext
        • + *
        • relpath/to/file.ext if relpath is a subdirectory of the base parse + * directory
        • + *
        + * For examples, see {@link Setup.inc.php} includes. + * Every include auto-links to the documentation for the file that is included + * @return string included file with link to docs for file, if found + * @param string file included by include statement. + * @param string path of file that has the include statement + */ + function getIncludeValue($value, $ipath) + { + preg_match('/"([^"\']*\.[^"\']*)"/',$value,$match); + if (!isset($match[1])) + preg_match('/\'([^"\']*\.[^"\']*)\'/',$value,$match); + if (isset($match[1])) + { + $fancy_per = $this->proceduralpages->pathMatchesParsedFile($match[1],$ipath); + if ($fancy_per) + { + $link = $this->addLink($fancy_per); + if (is_object($link) && phpDocumentor_get_class($link) == 'pagelink' && + isset($this->all_packages[$link->package])) + { + $value = $this->returnSee($link,$value); + } + } else + { + $per = Converter::getLink($match[1]); + if (is_object($per) && phpDocumentor_get_class($per) == 'pagelink') + $value = $this->returnSee($per); + } + } + return $value; + } + + /** + * Recursively creates all subdirectories that don't exist in the $dir path + * @param string $dir + */ + function createParentDir($dir) + { + if (empty($dir)) return; + $tmp = explode(SMART_PATH_DELIMITER,$dir); + array_pop($tmp); + $parent = implode(SMART_PATH_DELIMITER,$tmp); + if ($parent != '' && !file_exists($parent)) + { + $test = @mkdir($parent,0775); + if (!$test) + { + $this->createParentDir($parent); + $test = @mkdir($parent,0775); + phpDocumentor_out("Creating Parent Directory $parent\n"); + } else + { + phpDocumentor_out("Creating Parent Directory $parent\n"); + } + } + } + + /** + * Sets the output directory for generated documentation + * @param string $dir the output directory + */ + function setTargetDir($dir) + { + if (strlen($dir) > 0) + { + $this->targetDir = $dir; + // if directory does exist create it, this should have more error checking in the future + if (!file_exists($dir)) + { + $tmp = str_replace(array("/","\\"),SMART_PATH_DELIMITER,$dir); + if (substr($tmp,-1) == SMART_PATH_DELIMITER) + { + $tmp = substr($tmp,0,(strlen($tmp)-1)); + } + $this->createParentDir($tmp); + phpDocumentor_out("Creating Directory $dir\n"); + mkdir($dir,0775); + } + else if (!is_dir($dir)) + { + echo "Output path: '$dir' is not a directory\n"; + die(); + } + } else { + echo "a target directory must be specified\n try phpdoc -h\n"; + die(); + } + } + + /** + * Writes a file to target dir + * @param string + * @param string + * @param boolean true if the data is binary and not text + */ + function writeFile($file,$data,$binary = false) + { + if (!file_exists($this->targetDir)) + { + mkdir($this->targetDir,0775); + } + $string = ''; + if ($binary) $string = 'binary file '; + phpDocumentor_out(" Writing $string".$this->targetDir . PATH_DELIMITER . $file . "\n"); + flush(); + $write = 'w'; + if ($binary) $write = 'wb'; + $fp = fopen($this->targetDir . PATH_DELIMITER . $file,$write); + set_file_buffer( $fp, 0 ); + fwrite($fp,$data,strlen($data)); + fclose($fp); + } + + /** + * Copies a file from the template directory to the target directory + * thanks to Robert Hoffmann for this fix + * @param string + */ + function copyFile($file, $subdir = '') + { + if (!file_exists($this->targetDir)) + { + mkdir($this->targetDir,0775); + } + copy($this->templateDir . $subdir . PATH_DELIMITER . $file, $this->targetDir . PATH_DELIMITER . $file); + } + + /** + * Return parserStringWithInlineTags::Convert() cache state + * @see parserStringWithInlineTags::Convert() + * @abstract + */ + function getState() + { + return true; + } + + /** + * Compare parserStringWithInlineTags::Convert() cache state to $state + * @param mixed + * @see parserStringWithInlineTags::Convert() + * @abstract + */ + function checkState($state) + { + return true; + } + +} + +/** + * @access private + * @see Converter::getSortedClassTreeFromClass() + */ +function rootcmp($a, $b) +{ + return strnatcasecmp($a['class'],$b['class']); +} + +/** + * @access private + * @global string used to make the first tutorials converted the default package tutorials + */ +function tutorialcmp($a, $b) +{ + global $phpDocumentor_DefaultPackageName; + if ($a == $phpDocumentor_DefaultPackageName) return -1; + if ($b == $phpDocumentor_DefaultPackageName) return 1; + return strnatcasecmp($a, $b); +} + +/** + * smart htmlentities, doesn't entity the allowed tags list + * Since version 1.1, this function uses htmlspecialchars instead of + * htmlentities, for international support + * This function has been replaced by functionality in {@link ParserDescCleanup.inc} + * @param string $s + * @return string browser-displayable page + * @deprecated As of v1.2, No longer needed, as valid tags are parsed out of the source, + * and everything else is {@link Converter::postProcess()} handled + */ +function adv_htmlentities($s) +{ + return; + global $phpDocumentor___html,$_phpDocumentor_html_allowed; + $result = htmlspecialchars($s); + $entities = array_flip(get_html_translation_table(HTML_SPECIALCHARS)); + $result = strtr($result,$phpDocumentor___html); + $matches = array(); + preg_match_all('/(<img.*>)/U',$result,$matches); + for($i=0;$igetName(); + return '_'.$element->parent->getName(); + } +} +?> diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/CHMdefaultConverter.inc b/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/CHMdefaultConverter.inc new file mode 100644 index 00000000..ac38031b --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/CHMdefaultConverter.inc @@ -0,0 +1,1753 @@ + + * @since 1.0rc1 + * @version $Id: CHMdefaultConverter.inc,v 1.1 2005/10/17 18:36:57 jeichorn Exp $ + */ +/** + * Generates files that MS HTML Help Worshop can use to create a MS Windows + * compiled help file (CHM) + * + * The free MS HTML Help compiler takes the project file (phpdoc.hhp) and reads + * the table of contents file specified in the project (which is always contents.hhc + * in phpDocumentor). When the converter reaches stable state, it will also + * output an index file index.hhk. The free download for MS HTML Help Workshop + * is available below + * @link http://www.microsoft.com/downloads/release.asp?releaseid=33071 MS HTML Help Workshop download + * @package Converters + * @subpackage CHMdefault + * @author Greg Beaver + * @since 1.0rc1 + * @version $Revision: 1.1 $ + */ +class CHMdefaultConverter extends Converter +{ + /** + * CHMdefaultConverter wants elements sorted by type as well as alphabetically + * @see Converter::$sort_page_contents_by_type + * @var boolean + */ + var $sort_page_contents_by_type = true; + /** @var string */ + var $outputformat = 'CHM'; + /** @var string */ + var $name = 'default'; + /** + * indexes of elements by package that need to be generated + * @var array + */ + var $leftindex = array('classes' => true, 'pages' => true, 'functions' => true, 'defines' => false, 'globals' => false); + + /** + * output directory for the current procedural page being processed + * @var string + */ + var $page_dir; + + /** + * target directory passed on the command-line. + * {@link $targetDir} is malleable, always adding package/ and package/subpackage/ subdirectories onto it. + * @var string + */ + var $base_dir; + + /** + * output directory for the current class being processed + * @var string + */ + var $class_dir; + + /** + * array of converted package page names. + * Used to link to the package page in the left index + * @var array Format: array(package => 1) + */ + var $package_pages = array(); + + /** + * controls formatting of parser informative output + * + * Converter prints: + * "Converting /path/to/file.php... Procedural Page Elements... Classes..." + * Since CHMdefaultConverter outputs files while converting, it needs to send a \n to start a new line. However, if there + * is more than one class, output is messy, with multiple \n's just between class file output. This variable prevents that + * and is purely cosmetic + * @var boolean + */ + var $juststarted = false; + + /** + * contains all of the template procedural page element loop data needed for the current template + * @var array + */ + var $current; + + /** + * contains all of the template class element loop data needed for the current template + * @var array + */ + var $currentclass; + var $wrote = false; + var $ric_set = array(); + /** + * Table of Contents entry for index.hhk + * @var array + */ + var $KLinks = array(); + + /** + * sets {@link $base_dir} to $targetDir + * @see Converter() + */ + function CHMdefaultConverter(&$allp, &$packp, &$classes, &$procpages, $po, $pp, $qm, $targetDir, $templateDir, $title) + { + Converter::Converter($allp, $packp, $classes, $procpages,$po, $pp, $qm, $targetDir, $templateDir, $title); + $this->base_dir = $targetDir; + } + + /** + * @deprecated in favor of PHP 4.3.0+ tokenizer-based source highlighting + */ + function unmangle($sourcecode) + { + $sourcecode = str_replace('','
        ',$sourcecode);
        +        $sourcecode = str_replace('','
        ',$sourcecode); + $sourcecode = str_replace('
        ',"\n",$sourcecode); + $sourcecode = str_replace(' ',' ',$sourcecode); + $sourcecode = str_replace('<','<',$sourcecode); + $sourcecode = str_replace('>','>',$sourcecode); + $sourcecode = str_replace('&','&',$sourcecode); + return $sourcecode; + } + + /** + * @param string full path to the source file + * @param string fully highlighted source code + */ + function writeSource($path, $value) + { + $templ = &$this->newSmarty(); + $pathinfo = $this->proceduralpages->getPathInfo($path, $this); + $templ->assign('source',$value); + $templ->assign('package',$pathinfo['package']); + $templ->assign('subpackage',$pathinfo['subpackage']); + $templ->assign('name',$pathinfo['name']); + $templ->assign('source_loc',$pathinfo['source_loc']); + $templ->assign('docs',$pathinfo['docs']); + $templ->assign("subdir",'../'); + $templ->register_outputfilter('CHMdefault_outputfilter'); + $this->setTargetDir($this->getFileSourcePath($this->base_dir)); + $this->addSourceTOC($pathinfo['name'],$this->getFileSourceName($path),$pathinfo['package'],$pathinfo['subpackage'], true); + phpDocumentor_out("\n"); + $this->setSourcePaths($path); + $this->writefile($this->getFileSourceName($path).'.html',$templ->fetch('filesource.tpl')); + } + + function writeExample($title, $path, $source) + { + $templ = &$this->newSmarty(); + $templ->assign('source',$source); + if (empty($title)) + { + $title = 'example'; + addWarning(PDERROR_EMPTY_EXAMPLE_TITLE, $path, $title); + } + $templ->assign('title',$title); + $templ->assign('file',$path); + $templ->assign("subdir",'../'); + $templ->register_outputfilter('CHMdefault_outputfilter'); + $pathinfo = $this->proceduralpages->getPathInfo($path, $this); + $this->setTargetDir($this->base_dir . PATH_DELIMITER . '__examplesource'); + $this->addSourceTOC($title,'exsource_'.$path,$pathinfo['package'],$pathinfo['subpackage'], false); + phpDocumentor_out("\n"); + $this->writefile('exsource_'.$path.'.html',$templ->fetch('examplesource.tpl')); + } + + function getExampleLink($path, $title) + { + return $this->returnLink('{$subdir}__examplesource' . PATH_DELIMITER . 'exsource_'.$path.'.html',$title); + } + + function getSourceLink($path) + { + // fix 1171583 + $x = str_replace(PATH_DELIMITER, '', $this->getFileSourcePath('{$subdir}')) . + PATH_DELIMITER; + return $this->returnLink($x . + $this->getFileSourceName($path).'.html','Source Code for this file'); + } + + /** + * Used to convert the <> tag in a docblock + * @param string + * @param boolean + * @return string + */ + function ProgramExample($example, $tutorial = false, $inlinesourceparse = null/*false*/, + $class = null/*false*/, $linenum = null/*false*/, $filesourcepath = null/*false*/) + { + return $this->PreserveWhiteSpace(parent::ProgramExample($example, $tutorial, $inlinesourceparse, $class, $linenum, $filesourcepath)); + } + + /** + * @param string + */ + function TutorialExample($example) + { + $trans = $this->template_options['desctranslate']; + $this->template_options['desctranslate'] = array(); + $example = '
          ' . parent::TutorialExample($example) + .'
        '; + $this->template_options['desctranslate'] = $trans; + if (!isset($this->template_options['desctranslate'])) return $example; + if (!isset($this->template_options['desctranslate']['code'])) return $example; + $example = $this->template_options['desctranslate']['code'] . $example; + if (!isset($this->template_options['desctranslate']['/code'])) return $example; + return $example . $this->template_options['desctranslate']['/code']; + } + + /** + * Retrieve a Converter-specific anchor to a segment of a source code file + * parsed via a {@tutorial tags.filesource.pkg} tag. + * @param string full path to source file + * @param string name of anchor + * @param string link text, if this is a link + * @param boolean returns either a link or a destination based on this + * parameter + * @return string link to an anchor, or the anchor + */ + function getSourceAnchor($sourcefile,$anchor,$text = '',$link = false) + { + if ($link) { + $x = str_replace(PATH_DELIMITER, '', $this->getFileSourcePath('{$subdir}')) . + PATH_DELIMITER; + return $this->returnLink($x . + $this->getFileSourceName($sourcefile).'.html#a'.$anchor, $text); + } else + return ''; + } + + function getCurrentPageLink() + { + return $this->curname . '.html'; + } + + /** + * Uses htmlspecialchars() on the input + */ + function postProcess($text) + { + return htmlspecialchars($text); + } + + /** + * Use the template tutorial_toc.tpl to generate a table of contents for HTML + * @return string table of contents formatted for use in the current output format + * @param array format: array(array('tagname' => section, 'link' => returnsee link, 'id' => anchor name, 'title' => from title tag),...) + */ + function formatTutorialTOC($toc) + { + $template = &$this->newSmarty(); + $template->assign('toc',$toc); + return $template->fetch('tutorial_toc.tpl'); + } + + function &SmartyInit(&$templ) + { + if (!isset($this->package_index)) + foreach($this->all_packages as $key => $val) + { + if (isset($this->pkg_elements[$key])) + { + if (!isset($start)) $start = $key; + $this->package_index[] = array('link' => "li_$key.html", 'title' => $key); + } + } + $templ->assign("packageindex",$this->package_index); + $templ->assign("subdir",''); + return $templ; + } + + + /** + * Writes out the template file of {@link $class_data} and unsets the template to save memory + * @see registerCurrentClass() + * @see parent::endClass() + */ + function endClass() + { + $a = '../'; + if (!empty($this->subpackage)) $a .= '../'; + if ($this->juststarted) + { + $this->juststarted = false; + phpDocumentor_out("\n"); + flush(); + } + $this->setTargetDir($this->base_dir . PATH_DELIMITER . $this->class_dir); + $this->class_data->assign("subdir",$a); + $this->class_data->register_outputfilter('CHMdefault_outputfilter'); + $this->addTOC($this->class,$this->class,$this->package,$this->subpackage, true); + $this->writefile($this->class . '.html',$this->class_data->fetch('class.tpl')); + unset($this->class_data); + } + + /** + * Writes out the template file of {@link $page_data} and unsets the template to save memory + * @see registerCurrent() + * @see parent::endPage() + */ + function endPage() + { + $this->package = $this->curpage->package; + $this->subpackage = $this->curpage->subpackage; + $a = '../'; + if (!empty($this->subpackage)) $a .= '../'; + $this->setTargetDir($this->base_dir . PATH_DELIMITER . $this->page_dir); + $this->page_data->assign("package",$this->package); + $this->page_data->assign("subdir",$a); + $this->page_data->register_outputfilter('CHMdefault_outputfilter'); + $this->addTOC($this->curpage->file,$this->page,$this->package,$this->subpackage); + $this->writefile($this->page . '.html',$this->page_data->fetch('page.tpl')); + unset($this->page_data); + } + + /** + * @param string + * @param string + * @return string <a href="'.$link.'">'.$text.''.$text.''; + } + + /** + * CHMdefaultConverter chooses to format both package indexes and the complete index here + * + * This function formats output for the elementindex.html and pkgelementindex.html template files. It then + * writes them to the target directory + * @see generateElementIndex(), generatePkgElementIndex() + */ + function formatPkgIndex() + { + list($package_indexes,$packages,$mletters) = $this->generatePkgElementIndexes(); + for($i=0;$inewSmarty(); + $this->package = $package_indexes[$i]['package']; + $this->subpackage = ''; + $template->assign("index",$package_indexes[$i]['pindex']); + $template->assign("package",$package_indexes[$i]['package']); + $template->assign("letters",$mletters[$package_indexes[$i]['package']]); + $template->assign("title","Package ".$package_indexes[$i]['package']." Element Index"); + $template->assign("subdir",'../'); + $template->register_outputfilter('CHMdefault_outputfilter'); + $this->setTargetDir($this->base_dir . PATH_DELIMITER . $package_indexes[$i]['package']); + $this->addTOC($package_indexes[$i]['package']." Alphabetical Index",'elementindex_'.$package_indexes[$i]['package'],$package_indexes[$i]['package'],''); + $this->writefile('elementindex_'.$package_indexes[$i]['package'].'.html',$template->fetch('pkgelementindex.tpl')); + } + phpDocumentor_out("\n"); + flush(); + } + + /** + * CHMdefaultConverter uses this function to format template index.html and packages.html + * + * This function generates the package list from {@link $all_packages}, eliminating any + * packages that don't have any entries in their package index (no files at all, due to @ignore + * or other factors). Then it uses the default package name as the first package index to display. + * It sets the right pane to be either a blank file with instructions on making package-level docs, + * or the package-level docs for the default package. + * @global string Used to set the starting package to display + */ + function formatIndex() + { + global $phpDocumentor_DefaultPackageName; + list($elindex,$mletters) = $this->generateElementIndex(); + $template = &$this->newSmarty(); + $template->assign("index",$elindex); + $template->assign("letters",$mletters); + $template->assign("title","Element Index"); + $template->assign("date",date("r",time())); + $template->register_outputfilter('CHMdefault_outputfilter'); + phpDocumentor_out("\n"); + flush(); + $this->setTargetDir($this->base_dir); + $this->addTOC("Alphabetical Index Of All Elements",'elementindex',"Index",''); + $this->writefile('elementindex.html',$template->fetch('elementindex.tpl')); + usort($this->package_index,"CHMdefault_pindexcmp"); + $index = &$this->newSmarty(); + foreach($this->all_packages as $key => $val) + { + if (isset($this->pkg_elements[$key])) + { + if (!isset($start)) $start = $key; + if (!isset($this->package_pages[$key])) $this->writeNewPPage($key); + } + } + $this->setTargetDir($this->base_dir); + // Created index.html + if (isset($this->pkg_elements[$phpDocumentor_DefaultPackageName])) $start = $phpDocumentor_DefaultPackageName; + $this->package = $start; + $this->subpackage = ''; + $setalready = false; + if (isset($this->tutorials[$start]['']['pkg'])) + { + foreach($this->tutorials[$start]['']['pkg'] as $tute) + { + if ($tute->name == $start . '.pkg') + { + $setalready = true; + $this->addTOC("Start page",$start.'/tutorial_'.$tute->name,"Index",''); + } + } + } + if (!$setalready) + { + if (isset($this->package_pages[$start])) + { + $this->addTOC("Start page",'package_'.$start,"Index",''); + } + else + { + $index->assign("blank","blank"); + $blank = &$this->newSmarty(); + $blank->assign('package',$phpDocumentor_DefaultPackageName); + $this->addTOC("Start page",'blank',"Index",''); + $this->writefile("blank.html",$blank->fetch('blank.tpl')); + Converter::writefile('index.html',$blank->fetch('tutorial.tpl')); + } + } + phpDocumentor_out("\n"); + flush(); + + unset($index); + } + + function writeNewPPage($key) + { + return; + $template = &$this->newSmarty(); + $this->package = $key; + $this->subpackage = ''; + $template->assign("date",date("r",time())); + $template->assign("title",$this->title); + $template->assign("package",$key); + $template->register_outputfilter('CHMdefault_outputfilter'); + phpDocumentor_out("\n"); + flush(); + $this->setTargetDir($this->base_dir); + + $this->addTOC("$key Index","li_$key",$key,''); + $this->writefile("li_$key.html",$template->fetch('index.tpl')); + unset($template); + } + + /** + * Generate indexes for li_package.html and classtree output files + * + * This function generates the li_package.html files from the template file left.html. It does this by + * iterating through each of the $page_elements, $class_elements and $function_elements arrays to retrieve + * the pre-sorted {@link abstractLink} descendants needed for index generation. Conversion of these links to + * text is done by {@link returnSee()}. The {@link $local} parameter is set to false to ensure that paths are correct. + * + * Then it uses {@link generateFormattedClassTrees()} to create class trees from the template file classtrees.html. Output + * filename is classtrees_packagename.html. This function also unsets {@link $elements} and {@link $pkg_elements} to free + * up the considerable memory these two class vars use + * @see $page_elements, $class_elements, $function_elements + */ + function formatLeftIndex() + { + phpDocumentor_out("\n"); + flush(); + $this->setTargetDir($this->base_dir); + if (0)//!isset($this->left)) + { + debug("Nothing parsed, check the command-line"); + die(); + } + foreach($this->all_packages as $package => $rest) + { + if (!isset($this->pkg_elements[$package])) continue; + + // Create class tree page + $template = &$this->newSmarty(); + $template->assign("classtrees",$this->generateFormattedClassTrees($package)); + $template->assign("package",$package); + $template->assign("date",date("r",time())); + $template->register_outputfilter('CHMdefault_outputfilter'); + $this->addTOC("$package Class Trees","classtrees_$package",$package,''); + $this->writefile("classtrees_$package.html",$template->fetch('classtrees.tpl')); + phpDocumentor_out("\n"); + flush(); + } + // free up considerable memory + unset($this->elements); + unset($this->pkg_elements); + } + + /** + * This function takes an {@link abstractLink} descendant and returns an html link + * + * @param abstractLink a descendant of abstractlink should be passed, and never text + * @param string text to display in the link + * @param boolean this parameter is not used, and is deprecated + * @param boolean determines whether the returned text is enclosed in an tag + */ + function returnSee(&$element, $eltext = false, $with_a = true) + { + if (!$element) return false; + if (!$with_a) return $this->getId($element, false); + if (!$eltext) + { + $eltext = ''; + switch($element->type) + { + case 'tutorial' : + $eltext = strip_tags($element->title); + break; + case 'method' : + case 'var' : + case 'const' : + $eltext .= $element->class.'::'; + case 'page' : + case 'define' : + case 'class' : + case 'function' : + case 'global' : + default : + $eltext .= $element->name; + if ($element->type == 'function' || $element->type == 'method') $eltext .= '()'; + break; + } + } + return ''.$eltext.''; + } + + function getId($element, $fullpath = true) + { + if (phpDocumentor_get_class($element) == 'parserdata') + { + $element = $this->addLink($element->parent); + $elp = $element->parent; + } elseif (is_a($element, 'parserbase')) + { + $elp = $element; + $element = $this->addLink($element); + } + $c = ''; + if (!empty($element->subpackage)) + { + $c = '/'.$element->subpackage; + } + $b = '{$subdir}'; + switch ($element->type) + { + case 'page' : + if ($fullpath) + return $b.$element->package.$c.'/'.$element->fileAlias.'.html'; + return 'top'; + break; + case 'define' : + case 'global' : + case 'function' : + if ($fullpath) + return $b.$element->package.$c.'/'.$element->fileAlias.'.html#'.$element->type.$element->name; + return $element->type.$element->name; + break; + case 'class' : + if ($fullpath) + return $b.$element->package.$c.'/'.$element->name.'.html'; + return 'top'; + break; + case 'method' : + case 'var' : + case 'const' : + if ($fullpath) + return $b.$element->package.$c.'/'.$element->class.'.html#'.$element->type.$element->name; + return $element->type.$element->name; + break; + case 'tutorial' : + $d = ''; + if ($element->section) + { + $d = '#'.$element->section; + } + return $b.$element->package.$c.'/tutorial_'.$element->name.'.html'.$d; + } + } + + function ConvertTodoList() + { + $todolist = array(); + foreach($this->todoList as $package => $alltodos) + { + foreach($alltodos as $todos) + { + $converted = array(); + $converted['link'] = $this->returnSee($todos[0]); + if (!is_array($todos[1])) + { + $converted['todos'][] = $todos[1]->Convert($this); + } else + { + foreach($todos[1] as $todo) + { + $converted['todos'][] = $todo->Convert($this); + } + } + $todolist[$package][] = $converted; + } + } + $templ = &$this->newSmarty(); + $templ->assign('todos',$todolist); + $templ->register_outputfilter('CHMdefault_outputfilter'); + $this->setTargetDir($this->base_dir); + $this->addTOC('Todo List','todolist','Index','',false,true); + $this->addKLink('Todo List', 'todolist', '', 'Development'); + $this->writefile('todolist.html',$templ->fetch('todolist.tpl')); + } + + /** + * Convert README/INSTALL/CHANGELOG file contents to output format + * @param README|INSTALL|CHANGELOG + * @param string contents of the file + */ + function Convert_RIC($name, $contents) + { + $template = &$this->newSmarty(); + $template->assign('contents',$contents); + $template->assign('name',$name); + $this->setTargetDir($this->base_dir); + $this->addTOC($name,'ric_'.$name,'Index','',false,true); + $this->addKLink($name, 'ric_'.$name, '', 'Development'); + $this->writefile('ric_'.$name . '.html',$template->fetch('ric.tpl')); + $this->ric_set[$name] = true; + } + + /** + * Create errors.html template file output + * + * This method takes all parsing errors and warnings and spits them out ordered by file and line number. + * @global ErrorTracker We'll be using it's output facility + */ + function ConvertErrorLog() + { + global $phpDocumentor_errors; + $allfiles = array(); + $files = array(); + $warnings = $phpDocumentor_errors->returnWarnings(); + $errors = $phpDocumentor_errors->returnErrors(); + $template = &$this->newSmarty(); + foreach($warnings as $warning) + { + $file = '##none'; + $linenum = 'Warning'; + if ($warning->file) + { + $file = $warning->file; + $allfiles[$file] = 1; + $linenum .= ' on line '.$warning->linenum; + } + $files[$file]['warnings'][] = array('name' => $linenum, 'listing' => $warning->data); + } + foreach($errors as $error) + { + $file = '##none'; + $linenum = 'Error'; + if ($error->file) + { + $file = $error->file; + $allfiles[$file] = 1; + $linenum .= ' on line '.$error->linenum; + } + $files[$file]['errors'][] = array('name' => $linenum, 'listing' => $error->data); + } + $i=1; + $af = array(); + foreach($allfiles as $file => $num) + { + $af[$i++] = $file; + } + $allfiles = $af; + usort($allfiles,'strnatcasecmp'); + $allfiles[0] = "Post-parsing"; + foreach($allfiles as $i => $a) + { + $allfiles[$i] = array('file' => $a); + } + $out = array(); + foreach($files as $file => $data) + { + if ($file == '##none') $file = 'Post-parsing'; + $out[$file] = $data; + } + $template->assign("files",$allfiles); + $template->assign("all",$out); + $template->assign("title","phpDocumentor Parser Errors and Warnings"); + $this->setTargetDir($this->base_dir); + $this->writefile("errors.html",$template->fetch('errors.tpl')); + unset($template); + phpDocumentor_out("\n\nTo view errors and warnings, look at ".$this->base_dir. PATH_DELIMITER . "errors.html\n"); + flush(); + } + + function getCData($value) + { + return '
        '.htmlentities($value).'
        '; + } + + function getTutorialId($package,$subpackage,$tutorial,$id) + { + return $id; + } + + /** + * Converts package page and sets its package as used in {@link $package_pages} + * @param parserPackagePage + */ + function convertPackagepage(&$element) + { + phpDocumentor_out("\n"); + flush(); + $this->package = $element->package; + $this->subpackage = ''; + $contents = $element->Convert($this); + $this->package_pages[$element->package] = str_replace('{$subdir}','../',$contents); + phpDocumentor_out("\n"); + flush(); + $this->setTargetDir($this->base_dir . PATH_DELIMITER . $element->package); + $this->addTOC($element->package." Tutorial",'package_'.$element->package,$element->package,''); + $this->writeFile('package_'.$element->package.'.html',str_replace('{$subdir}','../',$contents)); + $this->setTargetDir($this->base_dir); + Converter::writefile('index.html',str_replace('{$subdir}','',$contents)); + $this->addKLink($element->package." Tutorial", 'package_'.$element->package, '', 'Tutorials'); + } + + /** + * @param parserTutorial + */ + function convertTutorial(&$element) + { + phpDocumentor_out("\n"); + flush(); + $template = &parent::convertTutorial($element); + $a = '../'; + if ($element->subpackage) $a .= '../'; + $template->assign('subdir',$a); + $template->register_outputfilter('CHMdefault_outputfilter'); + $contents = $template->fetch('tutorial.tpl'); + if ($element->package == $GLOBALS['phpDocumentor_DefaultPackageName'] && empty($element->subpackage) && ($element->name == $element->package . '.pkg')) + { + $template->assign('subdir',''); + $this->setTargetDir($this->base_dir); + Converter::writefile('index.html',$template->fetch('tutorial.tpl')); + } + $a = ''; + if ($element->subpackage) $a = PATH_DELIMITER . $element->subpackage; + phpDocumentor_out("\n"); + flush(); + $this->setTargetDir($this->base_dir . PATH_DELIMITER . $element->package . $a); + $this->addTOC($a = strip_tags($element->getTitle($this)), 'tutorial_'.$element->name, + $element->package, $element->subpackage, false, true); + $this->writeFile('tutorial_'.$element->name.'.html',$contents); + $this->addKLink($element->getTitle($this), $element->package . $a . PATH_DELIMITER . 'tutorial_'.$element->name, + '', 'Tutorials'); + } + + /** + * Converts class for template output + * @see prepareDocBlock(), generateChildClassList(), generateFormattedClassTree(), getFormattedConflicts() + * @see getFormattedInheritedMethods(), getFormattedInheritedVars() + * @param parserClass + */ + function convertClass(&$element) + { + parent::convertClass($element); + $this->class_dir = $element->docblock->package; + if (!empty($element->docblock->subpackage)) $this->class_dir .= PATH_DELIMITER . $element->docblock->subpackage; + $a = '../'; + if ($element->docblock->subpackage != '') $a = "../$a"; + + $this->class_data->assign('subdir',$a); + $this->class_data->assign("title","Docs For Class " . $element->getName()); + $this->class_data->assign("page",$element->getName() . '.html'); + $this->addKLink($element->name, $this->class_dir . PATH_DELIMITER . $this->class, '', 'Classes'); + } + + + /** + * Converts class variables for template output + * @see prepareDocBlock(), getFormattedConflicts() + * @param parserDefine + */ + function convertVar(&$element) + { + parent::convertVar($element, array('var_dest' => $this->getId($element,false))); + $this->setTargetDir($this->base_dir . PATH_DELIMITER . $this->class_dir); + $this->addKLink($element->name, $this->class_dir . PATH_DELIMITER .$this->class, $this->getId($element,false), $element->class.' Properties'); + } + + /** + * Converts class constants for template output + * @see prepareDocBlock(), getFormattedConflicts() + * @param parserDefine + */ + function convertConst(&$element) + { + parent::convertConst($element, array('const_dest' => $this->getId($element,false))); + $this->setTargetDir($this->base_dir . PATH_DELIMITER . $this->class_dir); + $this->addKLink($element->name, $this->class_dir . PATH_DELIMITER .$this->class, $this->getId($element,false), $element->class.' Constants'); + } + + /** + * Converts class methods for template output + * @see prepareDocBlock(), getFormattedConflicts() + * @param parserDefine + */ + function convertMethod(&$element) + { + parent::convertMethod($element, array('method_dest' => $this->getId($element,false))); + $this->setTargetDir($this->base_dir . PATH_DELIMITER . $this->class_dir); + $this->addKLink($element->name, $this->class_dir . PATH_DELIMITER .$this->class, $this->getId($element,false), $element->class.' Methods'); + } + + /** + * Converts function for template output + * @see prepareDocBlock(), parserFunction::getFunctionCall(), getFormattedConflicts() + * @param parserFunction + */ + function convertFunction(&$element) + { + $funcloc = $this->getId($this->addLink($element)); + parent::convertFunction($element,array('function_dest' => $this->getId($element,false))); + $this->setTargetDir($this->base_dir . PATH_DELIMITER . $this->page_dir); + $this->addKLink($element->name, $this->page_dir . PATH_DELIMITER . $this->page, $this->getId($element,false), 'Functions'); + } + + /** + * Converts include elements for template output + * @see prepareDocBlock() + * @param parserInclude + */ + function convertInclude(&$element) + { + parent::convertInclude($element, array('include_file' => '_'.strtr($element->getValue(),array('"' => '', "'" => '','.' => '_')))); + $this->setTargetDir($this->base_dir . PATH_DELIMITER . $this->page_dir); + $this->addKLink(str_replace('"', '', $element->getValue()), $this->page_dir . PATH_DELIMITER . $this->page, '', ucfirst($element->name)); + } + + /** + * Converts defines for template output + * @see prepareDocBlock(), getFormattedConflicts() + * @param parserDefine + */ + function convertDefine(&$element) + { + parent::convertDefine($element, array('define_link' => $this->getId($element,false))); + $this->setTargetDir($this->base_dir . PATH_DELIMITER . $this->page_dir); + $this->addKLink($element->name, $this->page_dir . PATH_DELIMITER . $this->page, $this->getId($element,false), 'Constants'); + } + + /** + * Converts global variables for template output + * @param parserGlobal + */ + function convertGlobal(&$element) + { + parent::convertGlobal($element, array('global_link' => $this->getId($element,false))); + $this->setTargetDir($this->base_dir . PATH_DELIMITER . $this->page_dir); + $this->addKLink($element->name, $this->page_dir . PATH_DELIMITER . $this->page, $this->getId($element,false), 'Global Variables'); + } + + /** + * converts procedural pages for template output + * @see prepareDocBlock(), getClassesOnPage() + * @param parserData + */ + function convertPage(&$element) + { + parent::convertPage($element); + $this->juststarted = true; + $this->page_dir = $element->parent->package; + if (!empty($element->parent->subpackage)) $this->page_dir .= PATH_DELIMITER . $element->parent->subpackage; + // registering stuff on the template + $this->page_data->assign("page",$this->getPageName($element) . '.html'); + $this->page_data->assign("title","Docs for page ".$element->parent->getFile()); + $this->setTargetDir($this->base_dir . PATH_DELIMITER . $this->page_dir); + $this->addKLink($element->parent->file, $this->page_dir . PATH_DELIMITER . $this->page, '', 'Files'); + } + + function getPageName(&$element) + { + if (phpDocumentor_get_class($element) == 'parserpage') return '_'.$element->getName(); + return '_'.$element->parent->getName(); + } + + /** + * returns an array containing the class inheritance tree from the root object to the class + * + * @param parserClass class variable + * @return array Format: array(root,child,child,child,...,$class) + * @uses parserClass::getParentClassTree() + */ + + function generateFormattedClassTree($class) + { + $tree = $class->getParentClassTree($this); + $out = ''; + if (count($tree) - 1) + { + $result = array($class->getName()); + $parent = $tree[$class->getName()]; + $distance[] = ''; + while ($parent) + { + $x = $parent; + if (is_object($parent)) + { + $subpackage = $parent->docblock->subpackage; + $package = $parent->docblock->package; + $x = $parent; + $x = $parent->getLink($this); + if (!$x) $x = $parent->getName(); + } + $result[] = + $x; + $distance[] = + "\n%s|\n" . + "%s--"; + if (is_object($parent)) + $parent = $tree[$parent->getName()]; + elseif (isset($tree[$parent])) + $parent = $tree[$parent]; + } + $nbsp = ' '; + for($i=count($result) - 1;$i>=0;$i--) + { + $my_nbsp = ''; + for($j=0;$jarray_reverse($result),'distance'=>array_reverse($distance)); + } else + { + return array('classes'=>$class->getName(),'distance'=>array('')); + } + } + + /** @access private */ + function sortVar($a, $b) + { + return strnatcasecmp($a->getName(),$b->getName()); + } + + /** @access private */ + function sortMethod($a, $b) + { + if ($a->isConstructor) return -1; + if ($b->isConstructor) return 1; + return strnatcasecmp($a->getName(),$b->getName()); + } + + /** + * returns a template-enabled array of class trees + * + * @param string $package package to generate a class tree for + * @see $roots, HTMLConverter::getRootTree() + */ + function generateFormattedClassTrees($package) + { + if (!isset($this->roots[$package])) return array(); + $roots = $trees = array(); + $roots = $this->roots[$package]; + for($i=0;$i $roots[$i],'class_tree' => "
          \n".$this->getRootTree($this->getSortedClassTreeFromClass($roots[$i],$package,''),$package)."
        \n"); + } + return $trees; + } + + /** + * return formatted class tree for the Class Trees page + * + * @param array $tree output from {@link getSortedClassTreeFromClass()} + * @see Classes::$definitechild, generateFormattedClassTrees() + * @return string + */ + function getRootTree($tree,$package) + { + if (!$tree) return ''; + $my_tree = ''; + $cur = '#root'; + $lastcur = array(false); + $kids = array(); + $dopar = false; + if ($tree[$cur]['parent']) + { + $dopar = true; + if (!is_object($tree[$cur]['parent'])) + { +// debug("parent ".$tree[$cur]['parent']." not found"); + $my_tree .= '
      • ' . $tree[$cur]['parent'] .'
          '; + } + else + { +// debug("parent ".$this->returnSee($tree[$cur]['parent'])." in other package"); + $my_tree .= '
        • ' . $this->returnSee($tree[$cur]['parent']); + if ($tree[$cur]['parent']->package != $package) $my_tree .= ' (Different package)
            '; + } + } + do + { +// fancy_debug($cur,$lastcur,$kids); + if (count($tree[$cur]['children'])) + { +// debug("$cur has children"); + if (!isset($kids[$cur])) + { +// debug("set $cur kids"); + $kids[$cur] = 1; + $my_tree .= '
          • '.$this->returnSee($tree[$cur]['link']); + $my_tree .= '
              '."\n"; + } + array_push($lastcur,$cur); + list(,$cur) = each($tree[$cur]['children']); +// var_dump('listed',$cur); + if ($cur) + { + $cur = $cur['package'] . '#' . $cur['class']; +// debug("set cur to child $cur"); +// $my_tree .= '
            • '.$this->returnSee($tree[$cur]['link']); + continue; + } else + { +// debug("end of children for $cur"); + $cur = array_pop($lastcur); + $cur = array_pop($lastcur); + $my_tree .= '
          • '."\n"; + if ($dopar && ($cur == '#root' || !$cur)) $my_tree .= '
        • '; + } + } else + { +// debug("$cur has no children"); + $my_tree .= '
        • '.$this->returnSee($tree[$cur]['link'])."
        • "; + if ($dopar && $cur == '#root') $my_tree .= '
      • '; + $cur = array_pop($lastcur); + } + } while ($cur); + return $my_tree; + } + /** + * Generate indexing information for given element + * + * @param parserElement descendant of parserElement + * @see generateElementIndex() + * @return array + */ + function getIndexInformation($elt) + { + $Result['type'] = $elt->type; + $Result['file_name'] = $elt->file; + $Result['path'] = $elt->getPath(); + + if (isset($elt->docblock)) + { + $Result['description'] = $elt->docblock->getSDesc($this); + + if ($elt->docblock->hasaccess) + $Result['access'] = $elt->docblock->tags['access'][0]->value; + else + $Result['access'] = 'public'; + + $Result['abstract'] = isset ($elt->docblock->tags['abstract'][0]); + } + else + $Result['description'] = ''; + + $aa = $Result['description']; + if (!empty($aa)) $aa = "
            $aa"; + + switch($elt->type) + { + case 'class': + $Result['name'] = $elt->getName(); + $Result['title'] = 'Class'; + $Result['link'] = $this->getClassLink($elt->getName(), + $elt->docblock->package, + $elt->getPath(), + $elt->getName()); + $Result['listing'] = 'in file '.$elt->file.', class '.$Result['link']."$aa"; + break; + case 'define': + $Result['name'] = $elt->getName(); + $Result['title'] = 'Constant'; + $Result['link'] = $this->getDefineLink($elt->getName(), + $elt->docblock->package, + $elt->getPath(), + $elt->getName()); + $Result['listing'] = 'in file '.$elt->file.', constant '.$Result['link']."$aa"; + break; + case 'global': + $Result['name'] = $elt->getName(); + $Result['title'] = 'Global'; + $Result['link'] = $this->getGlobalLink($elt->getName(), + $elt->docblock->package, + $elt->getPath(), + $elt->getName()); + $Result['listing'] = 'in file '.$elt->file.', global variable '.$Result['link']."$aa"; + break; + case 'function': + $Result['name'] = $elt->getName(); + $Result['title'] = 'Function'; + $Result['link'] = $this->getFunctionLink($elt->getName(), + $elt->docblock->package, + $elt->getPath(), + $elt->getName().'()'); + $Result['listing'] = 'in file '.$elt->file.', function '.$Result['link']."$aa"; + break; + case 'method': + $Result['name'] = $elt->getName(); + $Result['title'] = 'Method'; + $Result['link'] = $this->getMethodLink($elt->getName(), + $elt->class, + $elt->docblock->package, + $elt->getPath(), + $elt->class.'::'.$elt->getName().'()' + ); + if ($elt->isConstructor) $Result['constructor'] = 1; + $Result['listing'] = 'in file '.$elt->file.', method '.$Result['link']."$aa"; + break; + case 'var': + $Result['name'] = $elt->getName(); + $Result['title'] = 'Variable'; + $Result['link'] = $this->getVarLink($elt->getName(), + $elt->class, + $elt->docblock->package, + $elt->getPath(), + $elt->class.'::'.$elt->getName()); + $Result['listing'] = 'in file '.$elt->file.', variable '.$Result['link']."$aa"; + break; + case 'const': + $Result['name'] = $elt->getName(); + $Result['title'] = 'Variable'; + $Result['link'] = $this->getConstLink($elt->getName(), + $elt->class, + $elt->docblock->package, + $elt->getPath(), + $elt->class.'::'.$elt->getName()); + $Result['listing'] = 'in file '.$elt->file.', class constant '.$Result['link']."$aa"; + break; + case 'page': + $Result['name'] = $elt->getFile(); + $Result['title'] = 'Page'; + $Result['link'] = $this->getPageLink($elt->getFile(), + $elt->package, + $elt->getPath(), + $elt->getFile()); + $Result['listing'] = 'procedural page '.$Result['link']; + break; + case 'include': + $Result['name'] = $elt->getName(); + $Result['title'] = 'Include'; + $Result['link'] = $elt->getValue(); + $Result['listing'] = 'include '.$Result['name']; + break; + } + + return $Result; + } + /** + * Generate alphabetical index of all elements + * + * @see $elements, walk() + */ + function generateElementIndex() + { + $elementindex = array(); + $letters = array(); + $used = array(); + foreach($this->elements as $letter => $nutoh) + { + foreach($this->elements[$letter] as $i => $yuh) + { + if ($this->elements[$letter][$i]->type != 'include') + { + if (!isset($used[$letter])) + { + $letters[]['letter'] = $letter; + $elindex['letter'] = $letter; + $used[$letter] = 1; + } + + $elindex['index'][] = $this->getIndexInformation($this->elements[$letter][$i]); + } + } + if (isset($elindex['index'])) + { + $elementindex[] = $elindex; + } else + { + unset($letters[count($letters) - 1]); + } + $elindex = array(); + } + return array($elementindex,$letters); + } + + function setTemplateDir($dir) + { + Converter::setTemplateDir($dir); + $this->smarty_dir = $this->templateDir; + } + + function copyMediaRecursively($media,$targetdir,$subdir = '') + { + if (!is_array($media)) { + return; + } + foreach($media as $dir => $files) + { + if ($dir === '/') + { + $this->copyMediaRecursively($files,$targetdir); + } else + { + if (!is_numeric($dir)) + { + // create the subdir + phpDocumentor_out("creating $targetdir/$dir\n"); + Converter::setTargetDir($targetdir . PATH_DELIMITER . $dir); + if (!empty($subdir)) $subdir .= PATH_DELIMITER; + $this->copyMediaRecursively($files,"$targetdir/$dir",$subdir . $dir); + } else + { + // copy the file + phpDocumentor_out("copying $targetdir/".$files['file']."\n"); + $this->copyFile($files['file'],$subdir); + } + } + } + } + + /** + * calls the converter setTargetDir, and then copies any template images and the stylesheet if they haven't been copied + * @see Converter::setTargetDir() + */ + function setTargetDir($dir) + { + Converter::setTargetDir($dir); + if ($this->wrote) return; + $this->wrote = true; + $template_images = array(); + $stylesheets = array(); + $tdir = $dir; + $dir = $this->templateDir; + $this->templateDir = $this->templateDir.'templates/'; + $info = new Io; + $this->copyMediaRecursively($info->getDirTree($this->templateDir.'media',$this->templateDir),$tdir); + } + + /** + * Generate alphabetical index of all elements by package and subpackage + * + * @param string $package name of a package + * @see $pkg_elements, walk(), generatePkgElementIndexes() + */ + function generatePkgElementIndex($package) + { +// var_dump($this->pkg_elements[$package]); + $elementindex = array(); + $letters = array(); + $letterind = array(); + $used = array(); + $subp = ''; + foreach($this->pkg_elements[$package] as $subpackage => $els) + { + if (empty($els)) continue; + if (!empty($subpackage)) $subp = " (subpackage: $subpackage)"; else $subp = ''; + foreach($els as $letter => $yuh) + { + foreach($els[$letter] as $i => $yuh) + { + if ($els[$letter][$i]->type != 'include') + { + if (!isset($used[$letter])) + { + $letters[]['letter'] = $letter; + $letterind[$letter] = count($letters) - 1; + $used[$letter] = 1; + } + $elindex[$letter]['letter'] = $letter; + + $elindex[$letter]['index'][] = $this->getIndexInformation($els[$letter][$i]); + } + } + } + } + ksort($elindex); + usort($letters,'CHMdefault_lettersort'); + if (isset($elindex)) + { + while(list($letter,$tempel) = each($elindex)) + { + if (!isset($tempel)) + { + unset($letters[$letterind[$tempel['letter']]]); + } else + $elementindex[] = $tempel; + } + } else $letters = array(); + return array($elementindex,$letters); + } + + /** + * + * @see generatePkgElementIndex() + */ + function generatePkgElementIndexes() + { + $packages = array(); + $package_names = array(); + $pkg = array(); + $letters = array(); + foreach($this->pkg_elements as $package => $trash) + { + $pkgs['package'] = $package; + $pkg['package'] = $package; + list($pkg['pindex'],$letters[$package]) = $this->generatePkgElementIndex($package); + if (count($pkg['pindex'])) + { + $packages[] = $pkg; + $package_names[] = $pkgs; + } + unset($pkgs); + unset($pkg); + } + foreach($packages as $i => $package) + { + $pnames = array(); + for($j=0;$jreturnSee($a, $text, $with_a); + } + + /** + * @param string name of function + * @param string package name + * @param string full path to look in (used in index generation) + * @param boolean deprecated + * @param boolean return just the URL, or enclose it in an html a tag + * @return mixed false if not found, or an html a link to the function's documentation + * @see parent::getFunctionLink() + */ + function getFunctionLink($expr,$package, $file = false,$text = false) + { + $a = Converter::getFunctionLink($expr,$package,$file); + if (!$a) return false; + return $this->returnSee($a, $text); + } + + /** + * @param string name of define + * @param string package name + * @param string full path to look in (used in index generation) + * @param boolean deprecated + * @param boolean return just the URL, or enclose it in an html a tag + * @return mixed false if not found, or an html a link to the define's documentation + * @see parent::getDefineLink() + */ + function getDefineLink($expr,$package, $file = false,$text = false) + { + $a = Converter::getDefineLink($expr,$package,$file); + if (!$a) return false; + return $this->returnSee($a, $text); + } + + /** + * @param string name of global variable + * @param string package name + * @param string full path to look in (used in index generation) + * @param boolean deprecated + * @param boolean return just the URL, or enclose it in an html a tag + * @return mixed false if not found, or an html a link to the global variable's documentation + * @see parent::getGlobalLink() + */ + function getGlobalLink($expr,$package, $file = false,$text = false) + { + $a = Converter::getGlobalLink($expr,$package,$file); + if (!$a) return false; + return $this->returnSee($a, $text); + } + + /** + * @param string name of procedural page + * @param string package name + * @param string full path to look in (used in index generation) + * @param boolean deprecated + * @param boolean return just the URL, or enclose it in an html a tag + * @return mixed false if not found, or an html a link to the procedural page's documentation + * @see parent::getPageLink() + */ + function getPageLink($expr,$package, $path = false,$text = false) + { + $a = Converter::getPageLink($expr,$package,$path); + if (!$a) return false; + return $this->returnSee($a, $text); + } + + /** + * @param string name of method + * @param string class containing method + * @param string package name + * @param string full path to look in (used in index generation) + * @param boolean deprecated + * @param boolean return just the URL, or enclose it in an html a tag + * @return mixed false if not found, or an html a link to the method's documentation + * @see parent::getMethodLink() + */ + function getMethodLink($expr,$class,$package, $file = false,$text = false) + { + $a = Converter::getMethodLink($expr,$class,$package,$file); + if (!$a) return false; + return $this->returnSee($a, $text); + } + + /** + * @param string name of var + * @param string class containing var + * @param string package name + * @param string full path to look in (used in index generation) + * @param boolean deprecated + * @param boolean return just the URL, or enclose it in an html a tag + * @return mixed false if not found, or an html a link to the var's documentation + * @see parent::getVarLink() + */ + function getVarLink($expr,$class,$package, $file = false,$text = false) + { + $a = Converter::getVarLink($expr,$class,$package,$file); + if (!$a) return false; + return $this->returnSee($a, $text); + } + + /** + * @param string name of class constant + * @param string class containing class constant + * @param string package name + * @param string full path to look in (used in index generation) + * @param boolean deprecated + * @param boolean return just the URL, or enclose it in an html a tag + * @return mixed false if not found, or an html a link to the var's documentation + * @see parent::getVarLink() + */ + function getConstLink($expr,$class,$package, $file = false,$text = false) + { + $a = Converter::getConstLink($expr,$class,$package,$file); + if (!$a) return false; + return $this->returnSee($a, $text); + } + + /** + * does a nat case sort on the specified second level value of the array + * + * @param mixed $a + * @param mixed $b + * @return int + */ + function rcNatCmp ($a, $b) + { + $aa = strtoupper($a[$this->rcnatcmpkey]); + $bb = strtoupper($b[$this->rcnatcmpkey]); + + return strnatcasecmp($aa, $bb); + } + + /** + * does a nat case sort on the specified second level value of the array. + * this one puts constructors first + * + * @param mixed $a + * @param mixed $b + * @return int + */ + function rcNatCmp1 ($a, $b) + { + $aa = strtoupper($a[$this->rcnatcmpkey]); + $bb = strtoupper($b[$this->rcnatcmpkey]); + + if (strpos($aa,'CONSTRUCTOR') === 0) + { + return -1; + } + if (strpos($bb,'CONSTRUCTOR') === 0) + { + return 1; + } + if (strpos($aa,strtoupper($this->class)) === 0) + { + return -1; + } + if (strpos($bb,strtoupper($this->class)) === 0) + { + return -1; + } + return strnatcasecmp($aa, $bb); + } + + /** + * Write a file to disk, and add it to the {@link $hhp_files} list of files + * to include in the generated CHM + * + * {@source} + */ + function writefile($file,$contents) + { + $this->addHHP($this->targetDir . PATH_DELIMITER . $file); + Converter::writefile($file,$contents); + } + + /** + * @uses $hhp_files creates the array by adding parameter $file + */ + function addHHP($file) + { + $file = str_replace($this->base_dir . PATH_DELIMITER, '', $file); + $file = str_replace('\\',PATH_DELIMITER,$file); + $file = str_replace('//',PATH_DELIMITER,$file); + $file = str_replace(PATH_DELIMITER,'\\',$file); + $this->hhp_files[]['name'] = $file; + } + + function generateTOC() + { + $comppack = ''; + $templ = &$this->newSmarty(); + foreach($this->TOC as $package => $TOC1) + { + $comp_subs = ''; + $comp_subs1 = false; + foreach($TOC1 as $subpackage => $types) + { + $comp_types = ''; + foreach($types as $type => $files) + { + $comp = ''; + $templ1 = &$this->newSmarty(); + $templ1->assign('entry', array()); + foreach($files as $file) + { + // use book icon for classes + if ($type == 'Classes') { + $templ1->append('entry', array('paramname' => $file[0],'outputfile' => $file[1],'isclass' => 1)); + } else { + $templ1->append('entry', array('paramname' => $file[0],'outputfile' => $file[1])); + } + } + $templ = &$this->newSmarty(); + $templ->assign('tocsubentries',$templ1->fetch('tocentry.tpl')); + $templ->assign('entry', array(array('paramname' => $type))); + $comp_types .= $templ->fetch('tocentry.tpl'); + } + if (!empty($subpackage)) + { + $templ = &$this->newSmarty(); + $templ->assign('tocsubentries',$comp_types); + $templ->assign('entry', array(array('paramname' => $subpackage))); + $comp_subs .= $templ->fetch('tocentry.tpl'); + } else + { + $comp_subs1 = $comp_types; + } + } + if ($comp_subs1) + $templ->assign('tocsubentries',$comp_subs1); + if (!empty($comp_subs)) + $templ->assign('entry', array(array('paramname' => $package, 'tocsubentries' => $comp_subs))); + else + $templ->assign('entry', array(array('paramname' => $package))); + $comppack .= $templ->fetch('tocentry.tpl'); + } + return $comppack; + } + + function addSourceTOC($name, $file, $package, $subpackage, $source = false) + { + $file = str_replace($this->base_dir . PATH_DELIMITER, '', $this->targetDir) + . PATH_DELIMITER . $file . '.html'; + $file = str_replace('\\',PATH_DELIMITER,$file); + $file = str_replace('//',PATH_DELIMITER,$file); + $file = str_replace(PATH_DELIMITER,'\\',$file); + $sub = $source ? 'Source Code' : 'Examples'; + $this->TOC[$package][$subpackage][$sub][] = array($name, $file); + } + + function addTOC($name,$file,$package,$subpackage,$class = false,$tutorial = false) + { + $file = str_replace($this->base_dir . PATH_DELIMITER, '', $this->targetDir) + . PATH_DELIMITER . $file . '.html'; + $file = str_replace('\\',PATH_DELIMITER,$file); + $file = str_replace('//',PATH_DELIMITER,$file); + $file = str_replace(PATH_DELIMITER,'\\',$file); + $file = str_replace($this->base_dir . '\\', '', $file); + $sub = $class ? 'Classes' : 'Files'; + if ($tutorial) $sub = 'Manual'; + $this->TOC[$package][$subpackage][$sub][] = array($name,$file); + } + + /** + * Add an item to the index.hhk file + * @param string $name index entry name + * @param string $file filename containing index + * @param string $bookmark html anchor of location in file, if any + * @param string $group group this entry with a string + * @uses $KLinks tracks the index + * @author Andrew Eddie + */ + function addKLink($name, $file, $bookmark='', $group='') + { + $file = $file . '.html'; + $file = str_replace('\\',PATH_DELIMITER,$file); + $file = str_replace('//',PATH_DELIMITER,$file); + $file = str_replace(PATH_DELIMITER,'\\',$file); +// debug("added $name, $file, $bookmark, $group "); + $link = $file; + $link .= $bookmark ? "#$bookmark" :''; + if ($group) { + $this->KLinks[$group]['grouplink'] = $file; + $this->KLinks[$group][] = array($name,$link); + } + $this->KLinks[] = array($name,$link); + } + + /** + * Get the table of contents for index.hhk + * @return string contents of tocentry.tpl generated from $KLinks + * @author Andrew Eddie + */ + function generateKLinks() + { + $templ = &$this->newSmarty(); + $templ->assign('entry', array()); + foreach($this->KLinks as $group=>$link) + { + if (isset($link['grouplink'])) { + $templg = &$this->newSmarty(); + $templg->assign('entry', array()); + foreach($link as $k=>$sublink) + { + if ($k != 'grouplink') { + $templg->append('entry', array('paramname' => $sublink[0],'outputfile' => $sublink[1])); + } + } + $templ->append('entry', array('paramname' => $group, 'outputfile' => $link['grouplink'], 'tocsubentries' => $templg->fetch('tocentry.tpl') )); + } else { + $templ->append('entry', array('paramname' => $link[0],'outputfile' => $link[1])); + } + } + return $templ->fetch('tocentry.tpl'); + } + + /** + * Create the phpdoc.hhp, contents.hhc files needed by MS HTML Help Compiler + * to create a CHM file + * + * The output function generates the table of contents (contents.hhc) + * and file list (phpdoc.hhp) files used to create a .CHM by the + * free MS HTML Help compiler. + * {@internal + * Using {@link $hhp_files}, a list of all separate .html files + * is created in CHM format, and written to phpdoc.hhp. This list was + * generated by {@link writefile}. + * + * Next, a call to the table of contents: + * + * {@source 12 2} + * + * finishes things off}} + * @todo use to directly call html help compiler hhc.exe + * @link http://www.microsoft.com/downloads/release.asp?releaseid=33071 + * @uses generateTOC() assigns to the toc template variable + */ + function Output() + { + $templ = &$this->newSmarty(); + $templ->assign('files',$this->hhp_files); + $this->setTargetDir($this->base_dir); + Converter::writefile('phpdoc.hhp',$templ->fetch('hhp.tpl')); + $templ = &$this->newSmarty(); + $templ->assign('toc',$this->generateTOC()); + Converter::writefile('contents.hhc',$templ->fetch('contents.hhc.tpl')); + $templ->assign('klinks',$this->generateKLinks()); + Converter::writefile('index.hhk',$templ->fetch('index.hhk.tpl')); + phpDocumentor_out("NOTE: to create the documentation.chm file, you must now run Microsoft Help Workshop on phpdoc.hhp\n"); + phpDocumentor_out("To get the free Microsoft Help Workshop, browse to: http://go.microsoft.com/fwlink/?LinkId=14188\n"); + flush(); + } +} + +/** + * @access private + * @global string name of the package to set as the first package + */ +function CHMdefault_pindexcmp($a, $b) +{ + global $phpDocumentor_DefaultPackageName; + if ($a['title'] == $phpDocumentor_DefaultPackageName) return -1; + if ($b['title'] == $phpDocumentor_DefaultPackageName) return 1; + return strnatcasecmp($a['title'],$b['title']); +} + +/** @access private */ +function CHMdefault_lettersort($a, $b) +{ + return strnatcasecmp($a['letter'],$b['letter']); +} + +/** @access private */ +function CHMdefault_outputfilter($src, &$smarty) +{ + return str_replace('{$subdir}',$smarty->_tpl_vars['subdir'],$src); +} +?> diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/options.ini b/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/options.ini new file mode 100644 index 00000000..56474470 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/options.ini @@ -0,0 +1,507 @@ +preservedocbooktags = false + +;; used to highlight the {@source} inline tag, @filesource tag, and @example tag +[highlightSourceTokens] +;; format: +;; T_CONSTANTNAME = open +;; /T_CONSTANTNAME = close +T_ABSTRACT = +/T_ABSTRACT = +T_CLONE = +/T_CLONE = +T_HALT_COMPILER = +/T_HALT_COMPILER = +T_PUBLIC = +/T_PUBLIC = +T_PRIVATE = +/T_PRIVATE = +T_PROTECTED = +/T_PROTECTED = +T_FINAL = +/T_FINAL = +T_IMPLEMENTS = +/T_IMPLEMENTS = +T_CLASS = +/T_CLASS = +T_INTERFACE = +/T_INTERFACE = +T_INCLUDE = +/T_INCLUDE = +T_INCLUDE_ONCE = +/T_INCLUDE_ONCE = +T_REQUIRE_ONCE = +/T_REQUIRE_ONCE = +T_FUNCTION = +/T_FUNCTION = +T_VARIABLE = +/T_VARIABLE = +T_CONSTANT_ENCAPSED_STRING = +/T_CONSTANT_ENCAPSED_STRING = +T_COMMENT = +/T_COMMENT = +T_OBJECT_OPERATOR = +/T_OBJECT_OPERATOR = +T_RETURN = +/T_RETURN = +T_STATIC = +/T_STATIC = +T_SWITCH = +/T_SWITCH = +T_IF = +/T_IF = +T_FOREACH = +/T_FOREACH = +T_FOR = +/T_FOR = +T_VAR = +/T_VAR = +T_EXTENDS = +/T_EXTENDS = +T_RETURN = +/T_RETURN = +T_GLOBAL = +/T_GLOBAL = +T_DOUBLE_COLON = +/T_DOUBLE_COLON = +T_OBJECT_OPERATOR = +/T_OBJECT_OPERATOR = +T_OPEN_TAG = +/T_OPEN_TAG = +T_CLOSE_TAG = +/T_CLOSE_TAG = + +[highlightSource] +;; this is for highlighting things that aren't tokens like "&" +;; format: +;; word = open +;; /word = close +@ = +/@ = +& = +/& = +[ = +/[ = +] = +/] = +! = +/! = +";" = +/; = +( = +/( = +) = +/) = +, = +/, = +{ = +/{ = +} = +/} = +""" = +/" = + +[highlightDocBlockSourceTokens] +;; this is for docblock tokens, using by phpDocumentor_HighlightParser +;; tagphptype is for "string" in @param string description, for example +docblock = +/docblock = +tagphptype = +/tagphptype = +tagvarname = +/tagvarname = +coretag = +/coretag = +tag = +/tag = +inlinetag = +/inlinetag = +internal = +/internal = +closetemplate = +/closetemplate = +docblocktemplate = +/docblocktemplate = + +[highlightTutorialSourceTokens] +;; this is for XML DocBook-based tutorials, highlighted by phpDocumentor_TutorialHighlightParser +;; +opentag = +/opentag = +;; +closetag = +/closetag = +;; +attribute = +/attribute = +;; +attributevalue = +/attributevalue = +;; &entity; +entity = +/entity = +;; +comment = +/comment = +;; {@inline tag} +itag = +/itag = + +;; used for translation of html in DocBlocks +[desctranslate] +ul =
          +/ul =
        +ol =
          +/ol =
        +li =
      • +/li =
      • +code =
        +/code = 
        +var = +/var = +samp = +/samp = +kbd = +/kbd = +pre =
        +/pre = 
        +p =

        +/p =

        +b = +/b = +i = +/i = +br =
        + +[ppage] +;; this is the DocBook package page translation section. All DocBook tags +;; that have a corresponding html tag must be listed here +;; +;; examples: +;; 1) +;; tagname = newtagname +;; +;; This is the simplest case, where all attributes will be added into the +;; starting tag and the ending tag will be html/xml style +;; becomes and +;; becomes +;; +;; +;; 2) +;; tagname = newtagname +;; tagname->attr = newattrname +;; +;; in this case, everything will be like the first case, except tags like: +;; will become +;; +;; +;; 3) +;; tagname = newtagname +;; tagname->attr = newattrname +;; tagname->attr+value = newvalue +;; +;; in this case, the value is also translated to another. This can be useful +;; for instances such as focus="middle" changing to align="center" or something +;; of that nature. +;; will become +;; +;; +;; 4) +;; tagname = newtagname +;; tagname->attr1 = newattrname +;; tagname->attr2 = newattrname +;; tagname->attr1+value|attr2+value = newvalue +;; +;; in this case, two attributes combine to make one new attribute, and the combined +;; value is translated into a new value +;; will become +;; +;; +;; 5) +;; tagname = newtagname +;; tagname!attr = dummy +;; +;; here, the attribute will be ignored. dummy is not used and may be any value +;; will become +;; +;; +;; 6) +;; tagname = newtagname +;; tagname! = dummy +;; +;; here, all attributes will be ignored. dummy is not used and may be any value +;; will become +;; +;; +;; 7) +;; tagname = newtagname +;; tagname/ = 1 +;; +;; here, the tag will be translated as a single tag with no closing tag, and all +;; attributes +;; {text text} will become +;; +;; +;; 8) +;; tagname = +;; /tagname = closetagtext +;; +;; in this case, the text will be inserted exactly as entered for +;; and closetagtext for +;; will become +;; closetagtext +;; +;; 9) +;; $attr$my_attribute = newattrname +;; +;; tagname = newtagname +;; +;; in this case, all occurences of my_attribute in any tag will be changed to +;; newattrname. This is useful for changing things like role="php" to +;; class="php," for example. Note that the text "$attr$" MUST be on the line +;; start for phpDocumentor to recognize it. +;; +;; 10) +;; &entity; = translation text +;; " = " +;; " = """ +;; < = < +;; +;; Use this to control translation of entities to their appropriate values + +  =   +" = " +” = ” +“ = “ +& = & +< = < +> = > +© = © + +$attr$role = class + +abbrev = abbr + +blockquote = blockquote + +arg = span +arg->choice = class + +author = by +/author = +author! = 0 + +authorblurb = blockquote + +authorgroup = Authors:
        +/authorgroup = +authorgroup! = 0 + +caution =
        Caution
        +/caution =
        +caution! = 0 + +command = +/command = + +cmdsynopsis =
        +/cmdsynopsis =
        + +copyright = +/copyright =
        + +emphasis = strong + +example =
        +/example =
        +example! = 0 + +function = +/function = () + +formalpara = p + +graphic = img +graphic->fileref = src +graphic/ = + +important = u + +informalequation = blockquote + +informalexample = pre + +inlineequation = em + +itemizedlist = ul + +listitem = li + +literal = code + +literallayout = pre + +option = " " +/option = + +orderedlist = ol + +para = p + +programlisting =
        +/programlisting = 
        +programlisting! = 0 + +refentry = div + +refnamediv =
        +/refnamediv =
        +refnamediv! = 0 + +refname = h1 + +refpurpose =

        +/refpurpose =

        + +refsynopsisdiv =
        +/refsynopsisdiv =
        +refsynopsisdiv! = 0 + +refsect1 = span + +refsect2 = +/refsect2 =
        + +refsect3 = +/refsect3 =
        + +releaseinfo = ( +/releaseinfo = )
        + +simpara = +/simpara =
        +simpara! = 0 + +subscript = sub + +superscript = super + +table = table + +table->colsep = rules +table->rowsep = rules +table->colsep+1|rowsep+1 = all +table->colsep+1|rowsep+0 = cols +table->colsep+0|rowsep+1 = rows + +table->frame = frame +table->frame+all = border +table->frame+none = void +table->frame+sides = vsides +table->frame+top = above +table->frame+topbot = hsides + +thead = thead + +tfoot = tfoot + +tbody = tbody + +colspec = col + +tgroup = colgroup +tgroup/ = 1 +tgroup->cols = span + +row = tr + +entry = td +entry->morerows = colspan +entry->morerows+1 = 2 +entry->morerows+2 = 3 +entry->morerows+3 = 4 +entry->morerows+4 = 5 +entry->morerows+5 = 6 +entry->morerows+6 = 7 +entry->morerows+7 = 8 +entry->morerows+8 = 9 +entry->morerows+9 = 10 +entry->morerows+10 = 11 +;; add more if you need more colspans + +warning =
        +/warning =
        +warning! = 0 + +;; now begins the attributes that should be tags in cdata +[$attr$id] +open = a +;close = /a +cdata! = true +quotevalues = true +separator = "=" +;separateall = true +$id = name + +;; now begins the sections that deal with +[refsynopsisdiv_title] +;tag_attr = true +;attr_name = title +cdata_start = true +;cdata_end = true +open = <h1 class="title" align="center"> +close = </h1> + +[refsect1_title] +;tag_attr = true +;attr_name = title +cdata_start = true +;cdata_end = true +open = <h2 class="title" align="center"> +close = </h1> + +[refsect2_title] +;tag_attr = true +;attr_name = title +cdata_start = true +;cdata_end = true +open = <h2 class="title" align="center"> +close = </h2> + +[refsect3_title] +;tag_attr = true +;attr_name = title +cdata_start = true +;cdata_end = true +open = <h3 class="title" align="center"> +close = </h3> + +[para_title] +;tag_attr = true +;attr_name = title +cdata_start = true +;cdata_end = true +open = <strong class="title" align="center"> +close = </strong> + +[formalpara_title] +;tag_attr = true +;attr_name = title +cdata_start = true +;cdata_end = true +open = <strong class="title" align="center"> +close = </strong> + +[example_title] +;tag_attr = true +;attr_name = title +;cdata_start = true +cdata_end = true +open = </td></tr><tr><td><strong> +close = </strong> + +[table_title] +;tag_attr = true +;attr_name = true +cdata_start = true +open = <caption> +close = </caption> diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/basicindex.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/basicindex.tpl new file mode 100644 index 00000000..a040830b --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/basicindex.tpl @@ -0,0 +1,21 @@ +{section name=letter loop=$letters} + <a href="{$indexname}.html#{$letters[letter].letter}">{$letters[letter].letter}</a> +{/section} +<table> +{section name=index loop=$index} +<tr><td colspan = "2"><a name="{$index[index].letter}">  </a> +<a href="#top">top</a><br> +<TABLE CELLPADDING='3' CELLSPACING='0' WIDTH='100%' CLASS="border"> + <TR CLASS='TableHeadingColor'> + <TD> + <FONT SIZE='+2'><B>{$index[index].letter}</B></FONT> + </TD> + </TR> +</TABLE> +</td></tr> + {section name=contents loop=$index[index].index} + <tr><td><b>{$index[index].index[contents].name}</b></td><td width="100%" align="left" valign="top">{$index[index].index[contents].listing}</td></tr> + {/section} +{/section} +</table> + diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/blank.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/blank.tpl new file mode 100644 index 00000000..1fbaca2f --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/blank.tpl @@ -0,0 +1,13 @@ +<html> +<head> + <title>{$maintitle} + + + + +

        {$maintitle}

        +Welcome to {$package}!
        +
        +This documentation was generated by phpDocumentor v{$phpdocversion}
        + + \ No newline at end of file diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/class.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/class.tpl new file mode 100644 index 00000000..1ed17562 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/class.tpl @@ -0,0 +1,94 @@ +{include file="header.tpl" eltype="class" hasel=true contents=$classcontents} + +

        + {if $is_interface}Interface{else}Class{/if} {$class_name} +
        +

        +[line {if $class_slink}{$class_slink}{else}{$line_number}{/if}]
        +
        +{section name=tree loop=$class_tree.classes}{$class_tree.classes[tree]}{$class_tree.distance[tree]}{/section}
        +
        +{if $tutorial} +
        Class Tutorial: {$tutorial}
        +{/if} +{if $children} +Classes extended from {$class_name}: + {section name=kids loop=$children} +
        +
        {$children[kids].link}
        +
        {$children[kids].sdesc}
        +
        + {/section}

        +{/if} +{if $conflicts.conflict_type}

        Conflicts with classes:
        + {section name=me loop=$conflicts.conflicts} + {$conflicts.conflicts[me]}
        + {/section} +

        +{/if} +Location: {$source_location} +


        +{include file="docblock.tpl" type="class" sdesc=$sdesc desc=$desc} +
        +{include file="var.tpl" show="summary"} +
        +{include file="const.tpl" show="summary"} +
        + + +

        Inherited Class Constant Summary

        + +{section name=iconsts loop=$iconsts} +

        Inherited From Class {$iconsts[iconsts].parent_class}

        +
          + {section name=iconsts2 loop=$iconsts[iconsts].iconsts} + +
        • {$iconsts[iconsts].iconsts[iconsts2].link} = {$iconsts[iconsts].iconsts[iconsts2].value} +
          + {$iconsts[iconsts].iconsts[iconsts2].sdesc} + {/section} +
        • +
        +{/section} +
        + + +

        Inherited Class Variable Summary

        + +{section name=ivars loop=$ivars} +

        Inherited From Class {$ivars[ivars].parent_class}

        +
          + {section name=ivars2 loop=$ivars[ivars].ivars} + +
        • {$ivars[ivars].ivars[ivars2].link} = {$ivars[ivars].ivars[ivars2].default} +
          + {$ivars[ivars].ivars[ivars2].sdesc} + {/section} +
        • +
        +{/section} + +
        +{include file="method.tpl" show="summary"} + + +

        Inherited Method Summary

        + +{section name=imethods loop=$imethods} +

        Inherited From Class {$imethods[imethods].parent_class}

        +
          + {section name=im2 loop=$imethods[imethods].imethods} + +
        • {$imethods[imethods].imethods[im2].link}
          + {$imethods[imethods].imethods[im2].sdesc} + {/section} +
        +{/section} +
        +{include file="method.tpl"} +
        +{include file="var.tpl"} +
        +{include file="const.tpl"} +
        +{include file="footer.tpl"} diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/classleft.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/classleft.tpl new file mode 100644 index 00000000..15bf6b7e --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/classleft.tpl @@ -0,0 +1,8 @@ +{foreach key=subpackage item=files from=$classleftindex} + {if $subpackage != ""}{$subpackage}
        {/if} + {section name=files loop=$files} + {if $files[files].link != ''}{/if} + {$files[files].title} + {if $files[files].link != ''}{/if}
        + {/section} +{/foreach} diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/classtrees.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/classtrees.tpl new file mode 100644 index 00000000..28c648be --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/classtrees.tpl @@ -0,0 +1,12 @@ +{capture name="title"}Class Trees for Package {$package}{/capture} +{include file="header.tpl" title=$smarty.capture.title} + + +

        + {$smarty.capture.title} +

        +{section name=classtrees loop=$classtrees} +Root class {$classtrees[classtrees].class} +{$classtrees[classtrees].class_tree} +{/section} +{include file="footer.tpl"} \ No newline at end of file diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/const.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/const.tpl new file mode 100644 index 00000000..207491a5 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/const.tpl @@ -0,0 +1,29 @@ +{if $show=="summary"} + + +

        Class Constant Summary

        + +
          + {section name=consts loop=$consts} + +
        • {$consts[consts].const_name} = {$consts[consts].const_value|replace:"\n":"
          \n"|replace:" ":" "|replace:"\t":"   "}
          +
          + {$consts[consts].sdesc} + {/section} +
        +{else} + + + + +

        Class Constant Detail

        + +
          +{section name=consts loop=$consts} + +
        • {$consts[consts].const_name} = {$consts[consts].const_value|replace:"\n":"
          \n"|replace:" ":" "|replace:"\t":"   "}
          [line {if $consts[consts].slink}{$consts[consts].slink}{else}{$consts[consts].line_number}{/if}]
        • +{include file="docblock.tpl" sdesc=$consts[consts].sdesc desc=$consts[consts].desc tags=$consts[consts].tags} +
          +{/section} +
        +{/if} \ No newline at end of file diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/contents.hhc.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/contents.hhc.tpl new file mode 100644 index 00000000..cf7ee7cb --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/contents.hhc.tpl @@ -0,0 +1,11 @@ + + + + + + + + + +{$toc} + diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/define.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/define.tpl new file mode 100644 index 00000000..3917cc70 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/define.tpl @@ -0,0 +1,33 @@ +{if $summary} + + +

        Constant Summary

        + +
          + {section name=def loop=$defines} +
        • {$defines[def].define_name} = {$defines[def].define_value} +
          {$defines[def].sdesc} + {/section} +
        +{else} + + + +

        Constant Detail

        + +
          + {section name=def loop=$defines} + +
        • {$defines[def].define_name} = {$defines[def].define_value} [line {if $defines[def].slink}{$defines[def].slink}{else}{$defines[def].line_number}{/if}]
          + {if $defines[def].define_conflicts.conflict_type} +

          Conflicts with defines: + {section name=me loop=$defines[def].define_conflicts.conflicts} + {$defines[def].define_conflicts.conflicts[me]}
          + {/section} +

          + {/if} +

          + {include file="docblock.tpl" sdesc=$defines[def].sdesc desc=$defines[def].desc tags=$defines[def].tags} + {/section} +
        +{/if} \ No newline at end of file diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/docblock.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/docblock.tpl new file mode 100644 index 00000000..0de18b67 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/docblock.tpl @@ -0,0 +1,31 @@ + +{if $function} + {if $params} +

        Parameters

        + {section name=params loop=$params} +

        {$params[params].var}

        +

        {$params[params].data}

        + {/section} + {/if} +{/if} +{section name=tags loop=$tags} +{if $tags[tags].keyword == 'return'} +

        Returns

        +

        {$tags[tags].data}

        +{/if} +{/section} +{if $sdesc || $desc} +

        Remarks

        +{/if} +{if $sdesc} +

        {$sdesc}

        +{/if} +{if $desc} +

        {$desc}

        +{/if} +{section name=tags loop=$tags} +{if $tags[tags].keyword != 'return'} +

        {$tags[tags].keyword}

        +

        {$tags[tags].data}

        +{/if} +{/section} \ No newline at end of file diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/elementindex.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/elementindex.tpl new file mode 100644 index 00000000..8e25db5c --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/elementindex.tpl @@ -0,0 +1,9 @@ +{include file="header.tpl" noleftindex=true} + +

        Index of All Elements

        +Indexes by package:
        +{section name=p loop=$packageindex} +{$packageindex[p].title}
        +{/section}
        +{include file="basicindex.tpl" indexname="elementindex"} +{include file="footer.tpl"} diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/errors.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/errors.tpl new file mode 100644 index 00000000..1576a822 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/errors.tpl @@ -0,0 +1,21 @@ +{include file="header.tpl" noleftindex=true} +{section name=files loop=$files} +{$files[files].file}
        +{/section} +{foreach key=file item=issues from=$all} + +

        {$file}

        +{if count($issues.warnings)} +

        Warnings:


        +{section name=warnings loop=$issues.warnings} +{$issues.warnings[warnings].name} - {$issues.warnings[warnings].listing}
        +{/section} +{/if} +{if count($issues.errors)} +

        Errors:


        +{section name=errors loop=$issues.errors} +{$issues.errors[errors].name} - {$issues.errors[errors].listing}
        +{/section} +{/if} +{/foreach} +{include file="footer.tpl"} diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/fileleft.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/fileleft.tpl new file mode 100644 index 00000000..c85acbe0 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/fileleft.tpl @@ -0,0 +1,8 @@ +{foreach key=subpackage item=files from=$fileleftindex} + {if $subpackage != ""}subpackage {$subpackage}
        {/if} + {section name=files loop=$files} + {if $files[files].link != ''}{/if} + {$files[files].title} + {if $files[files].link != ''}{/if}
        + {/section} +{/foreach} diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/filesource.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/filesource.tpl new file mode 100644 index 00000000..a0d7119e --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/filesource.tpl @@ -0,0 +1,6 @@ +{capture name="tutle"}File Source for {$name}{/capture} +{include file="header.tpl" title=$smarty.capture.tutle} +

        Source for file {$name}

        +

        Documentation is available at {$docs}

        +{$source} +{include file="footer.tpl"} \ No newline at end of file diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/footer.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/footer.tpl new file mode 100644 index 00000000..a015ceea --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/footer.tpl @@ -0,0 +1,8 @@ +{if !$index} +
        +
        + Documentation generated on {$date} by phpDocumentor {$phpdocversion} +
        +{/if} + + diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/function.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/function.tpl new file mode 100644 index 00000000..ea314935 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/function.tpl @@ -0,0 +1,44 @@ +{if $summary} + + +

        Function Summary

        + + +{else} + + + +

        Function Detail

        + +
          +{section name=func loop=$functions} + + +
        • {$functions[func].function_return} {$functions[func].function_name}() [line {if $functions[func].slink}{$functions[func].slink}{else}{$functions[func].line_number}{/if}]
          +

          +Usage: {if $functions[func].ifunction_call.returnsref}&{/if}{$functions[func].function_name}( +{if count($functions[func].ifunction_call.params)} +{section name=params loop=$functions[func].ifunction_call.params} +{if $smarty.section.params.iteration != 1}, {/if}{if $functions[func].ifunction_call.params[params].default != ''}[{/if}{$functions[func].ifunction_call.params[params].type} {$functions[func].ifunction_call.params[params].name}{if $functions[func].ifunction_call.params[params].default != ''} = {$functions[func].ifunction_call.params[params].default|escape:"html"}]{/if} +{/section} +{/if}) +

          +{if $functions[func].function_conflicts.conflict_type} +

          Conflicts with functions: +{section name=me loop=$functions[func].function_conflicts.conflicts} +{$functions[func].function_conflicts.conflicts[me]}
          +{/section} +

          +{/if} +{include file="docblock.tpl" sdesc=$functions[func].sdesc desc=$functions[func].desc tags=$functions[func].tags params=$functions[func].params function=true} +
          +

          [ Top ]

          +{/section} +
        +{/if} \ No newline at end of file diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/global.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/global.tpl new file mode 100644 index 00000000..c1b74a1c --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/global.tpl @@ -0,0 +1,32 @@ +{if $summary} + + +

        Global Variable Summary

        + + + +{else} + + + +

        Global Variable Detail

        + +
          + {section name=glob loop=$globals} + +
        • {$globals[glob].global_type} {$globals[glob].global_name} = {$globals[glob].global_value} [line {if $globals[glob].slink}{$globals[glob].slink}{else}{$globals[glob].line_number}{/if}]
          + {if $globals[glob].global_conflicts.conflict_type} +

          Conflicts with globals: + {section name=me loop=$globals[glob].global_conflicts.conflicts} + {$globals[glob].global_conflicts.conflicts[me]}
          + {/section} + {/if}

          + {include file="docblock.tpl" sdesc=$globals[glob].sdesc desc=$globals[glob].desc tags=$globals[glob].tags} + {/section} +

        +{/if} \ No newline at end of file diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/header.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/header.tpl new file mode 100644 index 00000000..bdf6173e --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/header.tpl @@ -0,0 +1,22 @@ + + + + + + + {$title} + +{if $bgleft} + +{/if} + + + \ No newline at end of file diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/hhp.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/hhp.tpl new file mode 100644 index 00000000..a68f02b1 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/hhp.tpl @@ -0,0 +1,17 @@ +[OPTIONS] +Compatibility=1.1 or later +Compiled file=documentation.chm +Contents file=contents.hhc +Default topic=index.html +Display compile progress=No +Index file=Index.hhk +Language=0x409 English (United States) + + +[FILES] +{section name=files loop=$files} +{$files[files].name} +{/section} + +[INFOTYPES] + diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/include.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/include.tpl new file mode 100644 index 00000000..1ab7440b --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/include.tpl @@ -0,0 +1,26 @@ +{if $summary} + + +

        Include Statements Summary

        + + +{else} + + + +

        Include Statements Detail

        + +
          + {section name=includes loop=$includes} + +
        • {$includes[includes].include_name} file: = {$includes[includes].include_value} [line {if $includes[includes].slink}{$includes[includes].slink}{else}{$includes[includes].line_number}{/if}]
          +

          + {include file="docblock.tpl" sdesc=$includes[includes].sdesc desc=$includes[includes].desc tags=$includes[includes].tags} + {/section} +
        +{/if} \ No newline at end of file diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/index.hhk.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/index.hhk.tpl new file mode 100644 index 00000000..8b31a11d --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/index.hhk.tpl @@ -0,0 +1,8 @@ + + + + + + +{$klinks} + diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/index.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/index.tpl new file mode 100644 index 00000000..f73fb8a3 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/index.tpl @@ -0,0 +1,24 @@ + + + + + + {$title} + + +{if $package_count > 1} + + +{/if} + +{if $package_count > 1} + +{/if} + + + <H2>Frame Alert</H2> + <P>This document is designed to be viewed using the frames feature. + If you see this message, you are using a non-frame-capable web client.</P> + + + diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/media/bg_left.png b/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/media/bg_left.png new file mode 100644 index 00000000..19fdf05d Binary files /dev/null and b/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/media/bg_left.png differ diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/media/stylesheet.css b/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/media/stylesheet.css new file mode 100644 index 00000000..2c08f94f --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/media/stylesheet.css @@ -0,0 +1,129 @@ +BODY, DIV, SPAN, PRE, CODE, TD, TH { + line-height: 140%; + font-size: 10pt; + font-family: verdana,arial,sans-serif; +} + +H1 { + font-size: 12pt; +} + +H4 { + font-size: 10pt; + font-weight: bold; +} + +P.label { + margin-bottom: 5px; +} +P.dt { + margin-top: 0px; + margin-bottom: 0px; +} +P.indent { + margin-top: 0px; + margin-left: 20px; + margin-bottom: 0px; +} +P.method { + background-color: #f0f0f0; + padding: 2px; + border: 1px #cccccc solid; +} + +A { + text-decoration: none; +} + +A:link{ + color: #336699; +} + +A:visited { + color: #003366; +} + +A:active, A:hover { + color: #6699CC; +} + +A:hover{ + text-decoration: underline; +} + +SPAN.type { + color: #336699; + font-size: xx-small; + font-weight: normal; + } + +PRE { + background-color: #EEEEEE; + padding: 10px; + border-width: 1px; + border-color: #336699; + border-style: solid; +} + +HR { + color: #336699; + background-color: #336699; + border-width: 0px; + height: 1px; + filter: Alpha (opacity=100,finishopacity=0,style=1); +} + +DIV.sdesc { + font-weight: bold; + background-color: #EEEEEE; + padding: 10px; + border-width: 1px; + border-color: #336699; + border-style: solid; +} + +DIV.desc { + font-family: monospace; + background-color: #EEEEEE; + padding: 10px; + border-width: 1px; + border-color: #336699; + border-style: solid; +} + +SPAN.code { + font-family: monospace; +} + +CODE.varsummarydefault{ + padding: 1px; + border-width: 1px; + border-style: dashed; + border-color: #336699; +} + +UL.tute { + margin: 0px; + padding: 0px; + padding-left: 5px; + } + +LI.tute { + line-height: 140%; + font-size: 10pt; + text-indent: -15px; + padding-bottom: 2px; + padding-left: 14px; +} + +.small{ + font-size: 9pt; +} + + +.tute-tag { color: #009999 } +.tute-attribute-name { color: #0000FF } +.tute-attribute-value { color: #0099FF } +.tute-entity { font-weight: bold; } +.tute-comment { font-style: italic } +.tute-inline-tag { color: #636311; font-weight: bold } diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/method.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/method.tpl new file mode 100644 index 00000000..9309962b --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/method.tpl @@ -0,0 +1,55 @@ +{if $show == 'summary'} + + +

        Method Summary

        + + + +{else} + + + +

        Method Detail

        + +
          +{section name=methods loop=$methods} + + +

          {$class_name}::{$methods[methods].function_name}

          + +

          +{if $methods[methods].ifunction_call.returnsref}&{/if}{$methods[methods].function_name}( +{if count($methods[methods].ifunction_call.params)} +{section name=params loop=$methods[methods].ifunction_call.params} +{if $smarty.section.params.iteration != 1}, {/if} +{if $methods[methods].ifunction_call.params[params].default != ''}[{/if}{$methods[methods].ifunction_call.params[params].type} +{$methods[methods].ifunction_call.params[params].name}{if $methods[methods].ifunction_call.params[params].default != ''} = {$methods[methods].ifunction_call.params[params].default}]{/if} +{/section} +{/if} ); +

          + +{if $methods[methods].descmethod} +

          Overridden in child classes as:
          + {section name=dm loop=$methods[methods].descmethod} +

          +
          {$methods[methods].descmethod[dm].link}
          +
          {$methods[methods].descmethod[dm].sdesc}
          +
          + {/section}

          +{/if} +{if $methods[methods].method_overrides} +

          Overrides {$methods[methods].method_overrides.link} ({$methods[methods].method_overrides.sdesc|default:"parent method not documented"})

          +{/if} + +{include file="docblock.tpl" sdesc=$methods[methods].sdesc desc=$methods[methods].desc tags=$methods[methods].tags params=$methods[methods].params function=true} +

          [ Top ]

          +
          +{/section} +
        +{/if} \ No newline at end of file diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/packages.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/packages.tpl new file mode 100644 index 00000000..b48b6719 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/packages.tpl @@ -0,0 +1,3 @@ +{section name=packages loop=$packages} +{$packages[packages].title} +{/section} \ No newline at end of file diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/page.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/page.tpl new file mode 100644 index 00000000..dc93b0a1 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/page.tpl @@ -0,0 +1,34 @@ +{include file="header.tpl" eltype="Procedural file"} +

        File: {$source_location}
        +

        +{if $tutorial} +
        Main Tutorial: {$tutorial}
        +{/if} +{include file="docblock.tpl" desc=$desc sdesc=$sdesc tags=$tags} +Classes in this file: +
        +{section name=classes loop=$classes} +
        {$classes[classes].link}
        +
        {$classes[classes].sdesc}
        +{/section} +
        +
        +{include file="include.tpl" summary=true} +
        +{include file="global.tpl" summary=true} +
        +{include file="define.tpl" summary=true} +
        +{include file="function.tpl" summary=true} +
        +{include file="include.tpl"} +
        +{include file="global.tpl"} +
        +{include file="define.tpl"} +
        +{include file="function.tpl"} +
        +{include file="footer.tpl"} + + \ No newline at end of file diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/pkgelementindex.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/pkgelementindex.tpl new file mode 100644 index 00000000..68897450 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/pkgelementindex.tpl @@ -0,0 +1,14 @@ +{include file="header.tpl"} + +

        Element index for package {$package}

        +{if count($packageindex) > 1} +Indexes by package:
        +{/if} +{section name=p loop=$packageindex} +{if $packageindex[p].title != $package} +{$packageindex[p].title}
        +{/if} +{/section}
        +Index of all elements
        +{include file="basicindex.tpl" indexname=elementindex_$package} +{include file="footer.tpl"} diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/ric.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/ric.tpl new file mode 100644 index 00000000..c4cb83f9 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/ric.tpl @@ -0,0 +1,6 @@ +{include file="header.tpl"} +

        {$name}

        +
        +{$contents|htmlentities}
        +
        +{include file="footer.tpl"} \ No newline at end of file diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/tocentry.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/tocentry.tpl new file mode 100644 index 00000000..87f68ebb --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/tocentry.tpl @@ -0,0 +1,11 @@ +
          +{section name=entry loop=$entry} +
        • + +{if $entry[entry].isclass} +{/if}{if $entry[entry].outputfile} +{/if} + {if $entry[entry].tocsubentries}{$entry[entry].tocsubentries}{/if} +{/section} + {$tocsubentries} +
        diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/todolist.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/todolist.tpl new file mode 100644 index 00000000..5ab0bca2 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/todolist.tpl @@ -0,0 +1,14 @@ +{include file="header.tpl" title="Todo List"} +

        Todo List

        +{foreach from=$todos key=todopackage item=todo} +

        {$todopackage}

        +{section name=todo loop=$todo} +

        {$todo[todo].link}

        +
          +{section name=t loop=$todo[todo].todos} +
        • {$todo[todo].todos[t]}
        • +{/section} +
        +{/section} +{/foreach} +{include file="footer.tpl"} \ No newline at end of file diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/tutorial.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/tutorial.tpl new file mode 100644 index 00000000..22c71c3b --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/tutorial.tpl @@ -0,0 +1,32 @@ +{include file="header.tpl" title=$title} +{if $nav} + + + + + + +
        {if $prev}{/if}Prev{if $prev}{/if}{if $next}{/if}Next{if $next}{/if}
        +{/if} +{$contents} +{if $nav} + + + + + + + + + + + + +
        {if $prev}{/if} +Prev{if $prev}{/if}{if $up}Up{else} {/if}{if $next}{/if}Next{if $next}{/if}
        {if $prevtitle}{$prevtitle}{/if}{if $uptitle}{$uptitle}{/if}{if $nexttitle}{$nexttitle}{/if}
        +{/if} +{include file="footer.tpl"} \ No newline at end of file diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/tutorial_toc.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/tutorial_toc.tpl new file mode 100644 index 00000000..1db34438 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/tutorial_toc.tpl @@ -0,0 +1,29 @@ +{if count($toc)} +

        Table of Contents

        +
          +{section name=toc loop=$toc} +{if $toc[toc].tagname == 'refsect1'} +{assign var="context" value="refsect1"} +{$toc[toc].link}
          +{/if} +{if $toc[toc].tagname == 'refsect2'} +{assign var="context" value="refsect2"} +   {$toc[toc].link}
          +{/if} +{if $toc[toc].tagname == 'refsect3'} +{assign var="context" value="refsect3"} +      {$toc[toc].link}
          +{/if} +{if $toc[toc].tagname == 'table'} +{if $context == 'refsect2'}   {/if} +{if $context == 'refsect3'}   {/if} +Table: {$toc[toc].link} +{/if} +{if $toc[toc].tagname == 'example'} +{if $context == 'refsect2'}   {/if} +{if $context == 'refsect3'}   {/if} +Table: {$toc[toc].link} +{/if} +{/section} +
        +{/if} \ No newline at end of file diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/tutorial_tree.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/tutorial_tree.tpl new file mode 100644 index 00000000..6997545a --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/tutorial_tree.tpl @@ -0,0 +1,5 @@ + + diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/var.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/var.tpl new file mode 100644 index 00000000..d6f04b53 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/CHM/default/templates/default/templates/var.tpl @@ -0,0 +1,30 @@ +{if $show=="summary"} + + +

        Class Variable Summary

        + +
          + {section name=vars loop=$vars} + +
        • {$vars[vars].var_name} = {$vars[vars].var_default|replace:"\n":"
          \n"|replace:" ":" "|replace:"\t":"   "}
          +
          + {$vars[vars].sdesc} + {/section} +
        +{else} + + + + +

        Variable Detail

        + +
          +{section name=vars loop=$vars} + +
        • {$vars[vars].var_name} = {$vars[vars].var_default|replace:"\n":"
          \n"|replace:" ":" "|replace:"\t":"   "}
          [line {if $vars[vars].slink}{$vars[vars].slink}{else}{$vars[vars].line_number}{/if}]
        • +
        • Data type: {$vars[vars].var_type}{if $vars[vars].var_overrides}Overrides: {$vars[vars].var_overrides}
          {/if}
        • +{include file="docblock.tpl" sdesc=$vars[vars].sdesc desc=$vars[vars].desc tags=$vars[vars].tags} +
          +{/section} +
        +{/if} \ No newline at end of file diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/HTMLSmartyConverter.inc b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/HTMLSmartyConverter.inc new file mode 100644 index 00000000..09f5af73 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/HTMLSmartyConverter.inc @@ -0,0 +1,1779 @@ + + * @since 1.0rc1 + * @version $Revision: 1.1 $ + */ +/** + * HTML output converter. + * This Converter takes output from the {@link Parser} and converts it to HTML-ready output for use with {@link Smarty}. + * + * @package Converters + * @subpackage HTMLSmarty + * @see parserDocBlock, parserInclude, parserPage, parserClass, parserDefine, parserFunction, parserMethod, parserVar + * @author Greg Beaver + * @since 1.0rc1 + * @version $Revision: 1.1 $ + */ +class HTMLSmartyConverter extends Converter +{ + /** + * Smarty Converter wants elements sorted by type as well as alphabetically + * @see Converter::$sort_page_contents_by_type + * @var boolean + */ + var $sort_page_contents_by_type = true; + /** @var string */ + var $outputformat = 'HTML'; + /** @var string */ + var $name = 'Smarty'; + /** + * indexes of elements by package that need to be generated + * @var array + */ + var $leftindex = array('classes' => true, 'pages' => true, 'functions' => true, 'defines' => false, 'globals' => false); + + /** + * output directory for the current procedural page being processed + * @var string + */ + var $page_dir; + + /** + * target directory passed on the command-line. + * {@link $targetDir} is malleable, always adding package/ and package/subpackage/ subdirectories onto it. + * @var string + */ + var $base_dir; + + /** + * output directory for the current class being processed + * @var string + */ + var $class_dir; + + /** + * array of converted package page names. + * Used to link to the package page in the left index + * @var array Format: array(package => 1) + */ + var $package_pages = array(); + + /** + * controls formatting of parser informative output + * + * Converter prints: + * "Converting /path/to/file.php... Procedural Page Elements... Classes..." + * Since HTMLdefaultConverter outputs files while converting, it needs to send a \n to start a new line. However, if there + * is more than one class, output is messy, with multiple \n's just between class file output. This variable prevents that + * and is purely cosmetic + * @var boolean + */ + var $juststarted = false; + + /** + * contains all of the template procedural page element loop data needed for the current template + * @var array + */ + var $current; + + /** + * contains all of the template class element loop data needed for the current template + * @var array + */ + var $currentclass; + var $wrote = false; + var $ric_set = array(); + + /** + * sets {@link $base_dir} to $targetDir + * @see Converter() + */ + + /**#@+ + * @access private + */ + var $_classleft_cache = false; + var $_classcontents_cache = false; + var $_pagecontents_cache = false; + var $_pageleft_cache = false; + var $_done_package_index = false; + var $_ric_done = false; + var $_wrote_tdir = false; + var $ric_contents = array(); + /**#@-*/ + + function HTMLSmartyConverter(&$allp, &$packp, &$classes, &$procpages, $po, $pp, $qm, $targetDir, $templateDir, $title) + { + Converter::Converter($allp, $packp, $classes, $procpages,$po, $pp, $qm, $targetDir, $templateDir, $title); + $this->base_dir = $targetDir; + } + + function writeSource($path, $value) + { + $templ = &$this->newSmarty(); + $pathinfo = $this->proceduralpages->getPathInfo($path, $this); + $templ->assign('source',$value); + $templ->assign('package',$pathinfo['package']); + $templ->assign('subpackage',$pathinfo['subpackage']); + $templ->assign('name',$pathinfo['name']); + $templ->assign('source_loc',$pathinfo['source_loc']); + $templ->assign('docs',$pathinfo['docs']); + $templ->assign("subdir",'../'); + $templ->register_outputfilter('HTMLSmarty_outputfilter'); + $this->setTargetDir($this->getFileSourcePath($this->base_dir)); + phpDocumentor_out("\n"); + $this->setSourcePaths($path); + $this->writefile($this->getFileSourceName($path).'.html',$templ->fetch('filesource.tpl')); + } + + function writeExample($title, $path, $source) + { + $templ = &$this->newSmarty(); + $templ->assign('source',$source); + if (empty($title)) + { + $title = 'example'; + addWarning(PDERROR_EMPTY_EXAMPLE_TITLE, $path, $title); + } + $templ->assign('title',$title); + $templ->assign('file',$path); + $templ->assign("subdir",'../'); + $templ->register_outputfilter('HTMLSmarty_outputfilter'); + $this->setTargetDir($this->base_dir . PATH_DELIMITER . '__examplesource'); + phpDocumentor_out("\n"); + $this->writefile('exsource_'.$path.'.html',$templ->fetch('examplesource.tpl')); + } + + function getExampleLink($path, $title) + { + return $this->returnLink('{$subdir}__examplesource' . PATH_DELIMITER . 'exsource_'.$path.'.html',$title); + } + + function getSourceLink($path) + { + return $this->returnLink($this->getFileSourcePath('{$subdir}') . + PATH_DELIMITER . $this->getFileSourceName($path).'.html','Source Code for this file'); + } + + /** + * Return a line of highlighted source code with formatted line number + * + * If the $path is a full path, then an anchor to the line number will be + * added as well + * @param integer line number + * @param string highlighted source code line + * @param false|string full path to @filesource file this line is a part of, + * if this is a single line from a complete file. + * @return string formatted source code line with line number + */ + function sourceLine($linenumber, $line, $path = false) + { + $extra = ''; + if (strlen(str_replace("\n", '', $line)) == 0) { + $extra = ' '; + } + if ($path) + { + return '
      • ' . $this->getSourceAnchor($path, $linenumber) . + str_replace("\n",'',$line) . $extra . + "
      • \n"; + } else + { + return '
      • ' . str_replace("\n",'',$line) . "$extra
      • \n"; + } + } + + /** + * Used to convert the <> tag in a docblock + * @param string + * @param boolean + * @return string + */ + function ProgramExample($example, $tutorial = false, $inlinesourceparse = null/*false*/, + $class = null/*false*/, $linenum = null/*false*/, $filesourcepath = null/*false*/) + { + $trans = $this->template_options['desctranslate']; + $this->template_options['desctranslate'] = array(); + $example = '
          ' . parent::ProgramExample($example, $tutorial, $inlinesourceparse, $class, $linenum, $filesourcepath) + .'
        '; + $this->template_options['desctranslate'] = $trans; + if (!isset($this->template_options['desctranslate'])) return $example; + if (!isset($this->template_options['desctranslate']['code'])) return $example; + $example = $this->template_options['desctranslate']['code'] . $example; + if (!isset($this->template_options['desctranslate']['/code'])) return $example; + return $example . $this->template_options['desctranslate']['/code']; + } + + /** + * @param string + */ + function TutorialExample($example) + { + $trans = $this->template_options['desctranslate']; + $this->template_options['desctranslate'] = array(); + $example = '
          ' . parent::TutorialExample($example) + .'
        '; + $this->template_options['desctranslate'] = $trans; + if (!isset($this->template_options['desctranslate'])) return $example; + if (!isset($this->template_options['desctranslate']['code'])) return $example; + $example = $this->template_options['desctranslate']['code'] . $example; + if (!isset($this->template_options['desctranslate']['/code'])) return $example; + return $example . $this->template_options['desctranslate']['/code']; + } + + /** + * Retrieve a Converter-specific anchor to a segment of a source code file + * parsed via a {@tutorial tags.filesource.pkg} tag. + * @param string full path to source file + * @param string name of anchor + * @param string link text, if this is a link + * @param boolean returns either a link or a destination based on this + * parameter + * @return string link to an anchor, or the anchor + */ + function getSourceAnchor($sourcefile,$anchor,$text = '',$link = false) + { + if ($link) + return $this->returnLink($this->getFileSourcePath('{$subdir}') . + PATH_DELIMITER . $this->getFileSourceName($sourcefile).'.html#a'.$anchor, $text); + else + return ''; + } + + function getCurrentPageLink() + { + return $this->curname . '.html'; + } + + function unmangle($sourcecode) + { + $sourcecode = str_replace(' ',' ',$sourcecode); + $sourcecode = str_replace('&','&',$sourcecode); + $sourcecode = str_replace('
        ',"
        ",$sourcecode); + $sourcecode = str_replace('','
        ',$sourcecode);
        +        $sourcecode = str_replace('','
        ',$sourcecode); + $sourcecode = str_replace('<','<',$sourcecode); + $sourcecode = str_replace('>','>',$sourcecode); + return $sourcecode; + } + + /** + * Uses htmlspecialchars() on the input + */ + function postProcess($text) + { + return htmlspecialchars($text); + } + + /** + * Use the template tutorial_toc.tpl to generate a table of contents for HTML + * @return string table of contents formatted for use in the current output format + * @param array format: array(array('tagname' => section, 'link' => returnsee link, 'id' => anchor name, 'title' => from title tag),...) + */ + function formatTutorialTOC($toc) + { + $template = &$this->newSmarty(); + $template->assign('toc',$toc); + return $template->fetch('tutorial_toc.tpl'); + } + + function &SmartyInit(&$templ) + { + $this->makeLeft(); + $templ->assign("ric",$this->ric_set); + $templ->assign("packageindex",$this->package_index); + $templ->assign('hastodos',count($this->todoList)); + $templ->assign('todolink','todolist.html'); + $templ->assign("subdir",''); + return $templ; + } + + /** + * Writes out the template file of {@link $class_data} and unsets the template to save memory + * @see registerCurrentClass() + * @see parent::endClass() + */ + function endClass() + { + $a = '../'; + if (!empty($this->subpackage)) $a .= '../'; + if ($this->juststarted) + { + $this->juststarted = false; + phpDocumentor_out("\n"); + flush(); + } + $this->setTargetDir($this->base_dir . PATH_DELIMITER . $this->class_dir); + $this->class_data->assign("compiledclassindex",$this->getClassLeft()); + $this->class_data->assign("compiledfileindex",$this->getPageLeft()); + $this->class_data->assign("tutorials",$this->getTutorialList()); + $this->class_data->assign("contents",$this->getClassContents()); + $this->class_data->assign("packageindex",$this->package_index); + $this->class_data->assign("package",$this->package); + $this->class_data->assign("subdir",$a); + $this->class_data->register_outputfilter('HTMLSmarty_outputfilter'); + $this->writefile($this->class . '.html',$this->class_data->fetch('class.tpl')); + unset($this->class_data); + } + + function getTutorialList() + { + static $cache = false; + if ($cache) + { + if (isset($cache[$this->package])) return $cache[$this->package]; + } + $package = $this->package; + if (!isset($this->tutorials[$package])) return false; + foreach($this->tutorials[$package] as $subpackage => $blah) + { + $subpackages[] = $subpackage; + } + $tutes = array(); + foreach($subpackages as $subpackage) + { + if (isset($this->tutorial_tree) && is_array($this->tutorial_tree)) + foreach($this->tutorial_tree as $root => $tr) + { + if ($tr['tutorial']->package == $package && $tr['tutorial']->subpackage == $subpackage) + $tutes[$tr['tutorial']->tutorial_type][] = $this->getTutorialTree($tr['tutorial']); + } + } + $cache[$this->package] = $tutes; + return $tutes; + } + + function getTutorialTree($tutorial,$k = false) + { + $ret = ''; + if (is_object($tutorial)) $tree = parent::getTutorialTree($tutorial); else $tree = $tutorial; + if (!$tree) + { + $template = &$this->newSmarty(); + $template->assign('subtree',false); + $template->assign('name',str_replace('.','',$tutorial->name)); + $template->assign('parent',false); + $template->assign('haskids',false); + $template->assign('kids',''); + $link = new tutorialLink; + $t = $tutorial; + $link->addLink('',$t->path,$t->name,$t->package,$t->subpackage,$t->getTitle($this)); + $main = array('link' => $this->getId($link), 'title' => $link->title); + $template->assign('main',$main); + return $template->fetch('tutorial_tree.tpl'); + } + if (isset($tree['kids'])) + { + foreach($tree['kids'] as $subtree) + { + $ret .= $this->getTutorialTree($subtree, true); + } + } + $template = &$this->newSmarty(); + $template->assign('subtree',$k); + $template->assign('name',str_replace('.','',$tree['tutorial']->name)); + $template->assign('parent',($k ? str_replace('.','',$tree['tutorial']->parent->name) : false)); + $template->assign('haskids',strlen($ret)); + $template->assign('kids',$ret); + $link = new tutorialLink; + $t = $tree['tutorial']; + $link->addLink('',$t->path,$t->name,$t->package,$t->subpackage,$t->getTitle($this)); + $main = array('link' => $this->getId($link), 'title' => $link->title); + $template->assign('main',$main); + return $template->fetch('tutorial_tree.tpl'); + } + + function getClassLeft() + { + if ($this->_classleft_cache) + { + if (isset($this->_classleft_cache[$this->package][$this->subpackage])) return $this->_classleft_cache[$this->package][$this->subpackage]; + } + $arr = array(); + if (isset($this->left['#class'][$this->package])) + foreach($this->left['#class'][$this->package] as $subpackage => $pages) + { + $arr[$subpackage] = $pages; + } + $templ = &$this->newSmarty(); + $templ->assign('classleftindex',$arr); + $arr = $templ->fetch('classleft.tpl'); + $this->_classleft_cache[$this->package][$this->subpackage] = $arr; + return $arr; + } + + function getClassContents() + { + if ($this->_classcontents_cache) + { + if (isset($this->_classcontents_cache[$this->package][$this->subpackage][$this->class])) return $this->_classcontents_cache[$this->package][$this->subpackage][$this->class]; + } + $arr = array(); + foreach($this->class_contents[$this->package][$this->subpackage][$this->class] as $i => $link) + { + if (is_object($link)) + $arr[$link->type][] = $this->returnSee($link,$link->name); + } + $this->_classcontents_cache[$this->package][$this->subpackage][$this->class] = $arr; + return $arr; + } + + function getPageContents() + { + if (!isset($this->path)) $this->path = '#####'; + if ($this->_pagecontents_cache) + { + if (isset($this->_pagecontents_cache[$this->package][$this->subpackage][$this->path])) return $this->_pagecontents_cache[$this->package][$this->subpackage][$this->path]; + } + $arr = array(); + foreach($this->page_contents[$this->curpage->package][$this->curpage->subpackage] as $i => $link) + { + if (is_object($link)) + $arr[$link->type][$i] = $this->returnSee($link); + } + $this->_pagecontents_cache[$this->package][$this->subpackage][$this->path] = $arr; + return $arr; + } + + function getPageLeft() + { + if ($this->_pageleft_cache) + { + if (isset($this->_pageleft_cache[$this->package][$this->subpackage])) return $this->_pageleft_cache[$this->package][$this->subpackage]; + } + $arr = array(); + if (isset($this->left[$this->package])) + foreach($this->left[$this->package] as $subpackage => $pages) + { + $arr[$subpackage] = $pages; + } + $templ = &$this->newSmarty(); + $templ->assign('fileleftindex',$arr); + $arr = $templ->fetch('fileleft.tpl'); + $this->_pageleft_cache[$this->package][$this->subpackage] = $arr; + return $arr; + } + + /** + * Writes out the template file of {@link $page_data} and unsets the template to save memory + * @see registerCurrent() + * @see parent::endPage() + */ + function endPage() + { + $this->package = $this->curpage->package; + $this->subpackage = $this->curpage->subpackage; + $a = '../'; + if (!empty($this->subpackage)) $a .= '../'; + $this->setTargetDir($this->base_dir . PATH_DELIMITER . $this->page_dir); + $this->page_data->assign("contents",$this->getPageContents()); + $this->page_data->assign("compiledfileindex",$this->getPageLeft()); + $this->page_data->assign("compiledclassindex",$this->getClassLeft()); + $this->page_data->assign("tutorials",$this->getTutorialList()); + $this->page_data->assign("packageindex",$this->package_index); + $this->page_data->assign("package",$this->package); + $this->page_data->assign("subdir",$a); + $this->page_data->register_outputfilter('HTMLSmarty_outputfilter'); + $this->writefile($this->page . '.html',$this->page_data->fetch('page.tpl')); + unset($this->page_data); + } + + /** + * @param string + * @param string + * @return string <a href="'.$link.'">'.$text.''.$text.''; + } + + function makeLeft() + { + if ($this->_done_package_index) return; + $this->_done_package_index = true; + if (!isset($this->package_index)) + foreach($this->all_packages as $key => $val) + { + if (isset($this->pkg_elements[$key])) + { + if (!isset($start)) $start = $key; + $this->package_index[] = array('link' => "li_$key.html", 'title' => $key); + } + } + foreach($this->page_elements as $package => $o1) + { + foreach($o1 as $subpackage => $links) + { + for($i=0;$ileft[$package][$subpackage][] = + array("link" => $this->getId($links[$i]), "title" => $links[$i]->name); + } + } + } + foreach($this->class_elements as $package => $o1) + { + foreach($o1 as $subpackage => $links) + { + for($i=0;$ileft['#class'][$package][$subpackage][] = + array("link" => $this->getId($links[$i]), "title" => $links[$i]->name); + } + } + } + } + + /** + * HTMLdefaultConverter chooses to format both package indexes and the complete index here + * + * This function formats output for the elementindex.html and pkgelementindex.html template files. It then + * writes them to the target directory + * @see generateElementIndex(), generatePkgElementIndex() + */ + function formatPkgIndex() + { + list($package_indexes,$packages,$mletters) = $this->generatePkgElementIndexes(); + for($i=0;$inewSmarty(); + $this->package = $package_indexes[$i]['package']; + $this->subpackage = ''; + $template->assign("compiledclassindex",$this->getClassLeft()); + $template->assign("compiledfileindex",$this->getPageLeft()); + $template->assign("tutorials",$this->getTutorialList()); + $template->assign("index",$package_indexes[$i]['pindex']); + $template->assign("package",$package_indexes[$i]['package']); + $template->assign("letters",$mletters[$package_indexes[$i]['package']]); + $template->assign("title","Package ".$package_indexes[$i]['package']." Element Index"); + $template->assign("date",date("r",time())); + $template->register_outputfilter('HTMLSmarty_outputfilter'); + $this->setTargetDir($this->base_dir); + $this->writefile('elementindex_'.$package_indexes[$i]['package'].'.html',$template->fetch('pkgelementindex.tpl')); + } + phpDocumentor_out("\n"); + flush(); + } + + /** + * HTMLdefaultConverter uses this function to format template index.html and packages.html + * + * This function generates the package list from {@link $all_packages}, eliminating any + * packages that don't have any entries in their package index (no files at all, due to @ignore + * or other factors). Then it uses the default package name as the first package index to display. + * It sets the right pane to be either a blank file with instructions on making package-level docs, + * or the package-level docs for the default package. + * @global string Used to set the starting package to display + */ + function formatIndex() + { + global $phpDocumentor_DefaultPackageName; + if (!isset($this->package_index)) + { + debug("\nERROR: Nothing parsed, check the command-line"); + die(); + } + list($elindex,$mletters) = $this->generateElementIndex(); + $template = &$this->newSmarty(); + $template->assign("index",$elindex); + $template->assign("letters",$mletters); + $template->assign("title","Element Index"); + $template->assign("date",date("r",time())); + phpDocumentor_out("\n"); + flush(); + $this->setTargetDir($this->base_dir); + $template->register_outputfilter('HTMLSmarty_outputfilter'); + $this->writefile('elementindex.html',$template->fetch('elementindex.tpl')); + usort($this->package_index,"HTMLSmarty_pindexcmp"); + $index = &$this->newSmarty(); + foreach($this->all_packages as $key => $val) + { + if (isset($this->pkg_elements[$key])) + { + if (!isset($start)) $start = $key; + if (!isset($this->package_pages[$key])) $this->writeNewPPage($key); + } + } + // Created index.html + $start = $phpDocumentor_DefaultPackageName; + if (!isset($this->pkg_elements[$key])) + { + // if there are no elements, use a random package as the default + $start = array_shift(array_keys($this->pkg_elements)); + } + $this->package = $start; + $this->subpackage = ''; + $index->assign("compiledclassindex",$this->getClassLeft()); + $index->assign("compiledfileindex",$this->getPageLeft()); + $index->assign('hastodos',count($this->todoList)); + $index->assign('todolink','todolist.html'); + $index->assign("tutorials",$this->getTutorialList()); + $index->assign("date",date("r",time())); + $index->assign("package",$this->package); + $index->assign("title",$this->title); + $index->assign("start","li_$start.html"); + if (isset($this->package_pages[$start])) + { + $index->assign("contents",$this->package_pages[$start]); + } + $index->register_outputfilter('HTMLSmarty_outputfilter'); + phpDocumentor_out("\n"); + flush(); + $this->setTargetDir($this->base_dir); + $this->writefile("index.html",$index->fetch('index.tpl')); + unset($index); + + } + + function writeNewPPage($key) + { + $template = &$this->newSmarty(); + $this->package = $key; + $this->subpackage = ''; + $template->assign("compiledclassindex",$this->getClassLeft()); + $template->assign("compiledfileindex",$this->getPageLeft()); + $template->assign("tutorials",$this->getTutorialList()); + $template->assign("date",date("r",time())); + $template->assign("title",$this->title); + $template->assign("package",$key); + $template->register_outputfilter('HTMLSmarty_outputfilter'); + phpDocumentor_out("\n"); + flush(); + $this->setTargetDir($this->base_dir); + $this->writefile("li_$key.html",$template->fetch('index.tpl')); + unset($template); + } + + /** + * Generate indexes for li_package.html and classtree output files + * + * This function generates the li_package.html files from the template file left.html. It does this by + * iterating through each of the $page_elements, $class_elements and $function_elements arrays to retrieve + * the pre-sorted {@link abstractLink} descendants needed for index generation. Conversion of these links to + * text is done by {@link returnSee()}. + * + * Then it uses {@link generateFormattedClassTrees()} to create class trees from the template file classtrees.html. Output + * filename is classtrees_packagename.html. This function also unsets {@link $elements} and {@link $pkg_elements} to free + * up the considerable memory these two class vars use + * @see $page_elements, $class_elements, $function_elements + */ + function formatLeftIndex() + { + phpDocumentor_out("\n"); + flush(); + $this->setTargetDir($this->base_dir); + if (!isset($this->left)) + { + debug("Nothing parsed, check the command-line"); + die(); + } + foreach($this->all_packages as $package => $rest) + { + if (!isset($this->pkg_elements[$package])) continue; + // Create class tree page + $template = &$this->newSmarty(); + $template->assign("compiledclassindex",$this->getClassLeft()); + $template->assign("compiledfileindex",$this->getPageLeft()); + $template->assign("classtrees",$this->generateFormattedClassTrees($package)); + $template->assign("package",$package); + $template->assign("date",date("r",time())); + $template->assign("title","Class Trees for Package $package"); + $template->register_outputfilter('HTMLSmarty_outputfilter'); + $this->writefile("classtrees_$package.html",$template->fetch('classtrees.tpl')); + phpDocumentor_out("\n"); + flush(); + } + $this->writeRIC(); + // free up considerable memory + unset($this->elements); + unset($this->pkg_elements); + } + + + /** + * This function takes an {@link abstractLink} descendant and returns an html link + * + * @param abstractLink a descendant of abstractlink should be passed, and never text + * @param string text to display in the link + * @param boolean this parameter is not used, and is deprecated + * @param boolean determines whether the returned text is enclosed in an <a> tag + */ + function returnSee(&$element, $eltext = false, $with_a = true) + { + if (!is_object($element) || !$element) return false; + if (!$with_a) return $this->getId($element, false); + if (!$eltext) + { + $eltext = ''; + switch($element->type) + { + case 'tutorial' : + $eltext = strip_tags($element->title); + break; + case 'method' : + case 'var' : + case 'const' : + $eltext .= $element->class.'::'; + case 'page' : + case 'define' : + case 'class' : + case 'function' : + case 'global' : + default : + $eltext .= $element->name; + if ($element->type == 'function' || $element->type == 'method') $eltext .= '()'; + break; + } + } + return ''.$eltext.''; + } + + function getId($element, $fullpath = true) + { + if (phpDocumentor_get_class($element) == 'parserdata') + { + $element = $this->addLink($element->parent); + $elp = $element->parent; + } elseif (is_a($element, 'parserbase')) + { + $elp = $element; + $element = $this->addLink($element); + } + $c = ''; + if (!empty($element->subpackage)) + { + $c = '/'.$element->subpackage; + } + $b = '{$subdir}'; + switch ($element->type) + { + case 'page' : + if ($fullpath) + return $b.$element->package.$c.'/'.$element->fileAlias.'.html'; + return 'top'; + break; + case 'define' : + case 'global' : + case 'function' : + if ($fullpath) + return $b.$element->package.$c.'/'.$element->fileAlias.'.html#'.$element->type.$element->name; + return $element->type.$element->name; + break; + case 'class' : + if ($fullpath) + return $b.$element->package.$c.'/'.$element->name.'.html'; + return 'top'; + break; + case 'method' : + case 'var' : + case 'const' : + if ($fullpath) + return $b.$element->package.$c.'/'.$element->class.'.html#'.$element->type.$element->name; + return $element->type.$element->name; + break; + case 'tutorial' : + $d = ''; + if ($element->section) + { + $d = '#'.$element->section; + } + return $b.$element->package.$c.'/tutorial_'.$element->name.'.html'.$d; + } + } + + /** + * Convert README/INSTALL/CHANGELOG file contents to output format + * @param README|INSTALL|CHANGELOG + * @param string contents of the file + */ + function Convert_RIC($name, $contents) + { + $this->ric_contents[$name] = $contents; + $this->ric_set[] = array('file' => 'ric_'.$name . '.html','name' => $name); + } + + function writeRIC() + { + if ($this->_ric_done) return; + $this->_ric_done = true; + foreach($this->ric_contents as $name => $contents) + { + $template = &$this->newSmarty(); + $template->assign('contents',$contents); + $template->assign('name',$name); + $template->assign('title',$name); + $this->setTargetDir($this->base_dir); + $this->writefile('ric_'.$name . '.html',$template->fetch('ric.tpl')); + } + } + + function ConvertTodoList() + { + $todolist = array(); + foreach($this->todoList as $package => $alltodos) + { + foreach($alltodos as $todos) + { + $converted = array(); + $converted['link'] = $this->returnSee($todos[0]); + if (!is_array($todos[1])) + { + $converted['todos'][] = $todos[1]->Convert($this); + } else + { + foreach($todos[1] as $todo) + { + $converted['todos'][] = $todo->Convert($this); + } + } + $todolist[$package][] = $converted; + } + } + $templ = &$this->newSmarty(); + $templ->assign('todos',$todolist); + $templ->register_outputfilter('HTMLSmarty_outputfilter'); + $this->setTargetDir($this->base_dir); + $this->writefile('todolist.html',$templ->fetch('todolist.tpl')); + } + + /** + * Create errors.html template file output + * + * This method takes all parsing errors and warnings and spits them out ordered by file and line number. + * @global ErrorTracker We'll be using it's output facility + */ + function ConvertErrorLog() + { + global $phpDocumentor_errors; + $allfiles = array(); + $files = array(); + $warnings = $phpDocumentor_errors->returnWarnings(); + $errors = $phpDocumentor_errors->returnErrors(); + $template = &$this->newSmarty(); + foreach($warnings as $warning) + { + $file = '##none'; + $linenum = 'Warning'; + if ($warning->file) + { + $file = $warning->file; + $allfiles[$file] = 1; + $linenum .= ' on line '.$warning->linenum; + } + $files[$file]['warnings'][] = array('name' => $linenum, 'listing' => $warning->data); + } + foreach($errors as $error) + { + $file = '##none'; + $linenum = 'Error'; + if ($error->file) + { + $file = $error->file; + $allfiles[$file] = 1; + $linenum .= ' on line '.$error->linenum; + } + $files[$file]['errors'][] = array('name' => $linenum, 'listing' => $error->data); + } + $i=1; + $af = array(); + foreach($allfiles as $file => $num) + { + $af[$i++] = $file; + } + $allfiles = $af; + usort($allfiles,'strnatcasecmp'); + $allfiles[0] = "Post-parsing"; + foreach($allfiles as $i => $a) + { + $allfiles[$i] = array('file' => $a); + } + $out = array(); + foreach($files as $file => $data) + { + if ($file == '##none') $file = 'Post-parsing'; + $out[$file] = $data; + } + $template->assign("files",$allfiles); + $template->assign("all",$out); + $template->assign("title","phpDocumentor Parser Errors and Warnings"); + $template->register_outputfilter('HTMLSmarty_outputfilter'); + $this->setTargetDir($this->base_dir); + $this->writefile("errors.html",$template->fetch('errors.tpl')); + unset($template); + phpDocumentor_out("\n\nTo view errors and warnings, look at ".$this->base_dir. PATH_DELIMITER . "errors.html\n"); + flush(); + } + + function getCData($value) + { + return '
        '.htmlentities($value).'
        '; + } + + function getTutorialId($package,$subpackage,$tutorial,$id) + { + return $id; + } + + /** + * Converts package page and sets its package as used in {@link $package_pages} + * @param parserPackagePage + */ + function convertPackagepage(&$element) + { + phpDocumentor_out("\n"); + flush(); + $template = &$this->newSmarty(); + $this->package = $element->package; + $this->subpackage = ''; + $template->assign("compiledclassindex",$this->getClassLeft()); + $template->assign("compiledfileindex",$this->getPageLeft()); + $template->assign("tutorials",$this->getTutorialList()); + $template->assign("date",date("r",time())); + $template->assign("title",$this->title); + $template->assign("package",$element->package); + $x = $element->Convert($this); + $x = substr($x,strpos($x,'assign("contents",trim(substr($x,strpos($x,'>') + 1))); + $this->package_pages[$element->package] = trim(substr($x,strpos($x,'>') + 1)); + $template->register_outputfilter('HTMLSmarty_outputfilter'); + phpDocumentor_out("\n"); + flush(); + $this->setTargetDir($this->base_dir); + $this->writefile("li_".$element->package.".html",$template->fetch('index.tpl')); + unset($template); + } + + /** + * @param parserTutorial + */ + function convertTutorial(&$element) + { + phpDocumentor_out("\n"); + flush(); + $template = &parent::convertTutorial($element); + $this->package = $element->package; + $this->subpackage = $element->subpackage; + $template->assign("compiledclassindex",$this->getClassLeft()); + $template->assign("compiledfileindex",$this->getPageLeft()); + $template->assign("tutorials",$this->getTutorialList()); + $template->assign("title",strip_tags($element->getTitle($this))); + $contents = $element->Convert($this); + if ($element->name == $this->package . '.pkg') + { + $this->package_pages[$element->package] = $contents; + } + $a = '../'; + if (!empty($element->subpackage)) $a .= $a; + $template->assign("subdir",$a); + $a = ''; + if ($element->subpackage) $a = PATH_DELIMITER . $element->subpackage; + $template->register_outputfilter('HTMLSmarty_outputfilter'); + $this->setTargetDir($this->base_dir . PATH_DELIMITER . $element->package . $a); + $this->writeFile('tutorial_'.$element->name.'.html',$template->fetch('tutorial.tpl')); + if ($element->name == $element->package . '.pkg') + { + phpDocumentor_out("\n"); + flush(); + // package-level docs + $this->setTargetDir($this->base_dir); + $template->assign("subdir",''); + $this->writeFile('li_'.$element->package.'.html',$template->fetch('tutorial.tpl')); + } + unset($template); + } + + /** + * Converts class for template output + * @see prepareDocBlock(), generateChildClassList(), generateFormattedClassTree(), getFormattedConflicts() + * @see getFormattedInheritedMethods(), getFormattedInheritedVars() + * @param parserClass + */ + function convertClass(&$element) + { + parent::convertClass($element); + $this->class_dir = $element->docblock->package; + if (!empty($element->docblock->subpackage)) $this->class_dir .= PATH_DELIMITER . $element->docblock->subpackage; + $a = '../classtrees_'; + if ($element->docblock->subpackage != '') $a = "../$a"; + + $this->class_data->assign('subdir',$a); + $this->class_data->assign("title","Docs For Class " . $element->getName()); + $this->class_data->assign("page",$element->getName() . '.html'); + } + + /** + * Converts class variables for template output + * @see prepareDocBlock(), getFormattedConflicts() + * @param parserDefine + */ + function convertVar(&$element) + { + parent::convertVar($element, array('var_dest' => $this->getId($element,false))); + } + + /** + * Converts class variables for template output + * @see prepareDocBlock(), getFormattedConflicts() + * @param parserDefine + */ + function convertConst(&$element) + { + parent::convertConst($element, array('const_dest' => $this->getId($element,false))); + } + + /** + * Converts class methods for template output + * @see prepareDocBlock(), getFormattedConflicts() + * @param parserDefine + */ + function convertMethod(&$element) + { + parent::convertMethod($element, array('method_dest' => $this->getId($element,false))); + } + + /** + * Converts function for template output + * @see prepareDocBlock(), parserFunction::getFunctionCall(), getFormattedConflicts() + * @param parserFunction + */ + function convertFunction(&$element) + { + $funcloc = $this->getId($this->addLink($element)); + parent::convertFunction($element,array('function_dest' => $this->getId($element,false))); + } + + /** + * Converts include elements for template output + * @see prepareDocBlock() + * @param parserInclude + */ + function convertInclude(&$element) + { + parent::convertInclude($element, array('include_file' => '_'.strtr($element->getValue(),array('"' => '', "'" => '','.' => '_')))); + } + + /** + * Converts defines for template output + * @see prepareDocBlock(), getFormattedConflicts() + * @param parserDefine + */ + function convertDefine(&$element) + { + parent::convertDefine($element, array('define_link' => $this->getId($element,false))); + } + + /** + * Converts global variables for template output + * @param parserGlobal + * @see prepareDocBlock(), getFormattedConflicts() + */ + function convertGlobal(&$element) + { + parent::convertGlobal($element, array('global_link' => $this->getId($element,false))); + } + + /** + * converts procedural pages for template output + * @see prepareDocBlock(), getClassesOnPage() + * @param parserData + */ + function convertPage(&$element) + { + parent::convertPage($element); + $this->juststarted = true; + $this->page_dir = $element->parent->package; + if (!empty($element->parent->subpackage)) $this->page_dir .= PATH_DELIMITER . $element->parent->subpackage; + // registering stuff on the template + $a = '../'; + if (!empty($element->docblock->subpackage)) $a = $a . $a; + $this->page_data->assign('subdir',$a); + $this->page_data->assign("page",$this->getPageName($element) . '.html'); + $this->page_data->assign("title","Docs for page ".$element->parent->getFile()); + } + + function getPageName(&$element) + { + if (phpDocumentor_get_class($element) == 'parserpage') return '_'.$element->getName(); + return '_'.$element->parent->getName(); + } + + /** + * returns an array containing the class inheritance tree from the root object to the class + * + * @param parserClass class variable + * @return array Format: array(root,child,child,child,...,$class) + * @uses parserClass::getParentClassTree() + */ + + function generateFormattedClassTree($class) + { + $tree = $class->getParentClassTree($this); + $out = ''; + if (count($tree) - 1) + { + $result = array($class->getName()); + $parent = $tree[$class->getName()]; + $distance[] = ''; + while ($parent) + { + $x = $parent; + if (is_object($parent)) + { + $subpackage = $parent->docblock->subpackage; + $package = $parent->docblock->package; + $x = $parent; + $x = $parent->getLink($this); + if (!$x) $x = $parent->getName(); + } + $result[] = + $x; + $distance[] = + "\n%s|\n" . + "%s--"; + if (is_object($parent)) + $parent = $tree[$parent->getName()]; + elseif (isset($tree[$parent])) + $parent = $tree[$parent]; + } + $nbsp = ' '; + for($i=count($result) - 1;$i>=0;$i--) + { + $my_nbsp = ''; + for($j=0;$jarray_reverse($result),'distance'=>array_reverse($distance)); + } else + { + return array('classes'=>$class->getName(),'distance'=>array('')); + } + } + + /** @access private */ + function sortVar($a, $b) + { + return strnatcasecmp($a->getName(),$b->getName()); + } + + /** @access private */ + function sortMethod($a, $b) + { + if ($a->isConstructor) return -1; + if ($b->isConstructor) return 1; + return strnatcasecmp($a->getName(),$b->getName()); + } + + /** + * returns a template-enabled array of class trees + * + * @param string $package package to generate a class tree for + * @see $roots, HTMLConverter::getRootTree() + */ + function generateFormattedClassTrees($package) + { + if (!isset($this->roots[$package])) return array(); + $roots = $trees = array(); + $roots = $this->roots[$package]; + for($i=0;$i $roots[$i],'class_tree' => "
          \n".$this->getRootTree($this->getSortedClassTreeFromClass($roots[$i],$package,''),$package)."
        \n"); + } + return $trees; + } + + /** + * return formatted class tree for the Class Trees page + * + * @param array $tree output from {@link getSortedClassTreeFromClass()} + * @see Classes::$definitechild, generateFormattedClassTrees() + * @return string + */ + function getRootTree($tree,$package) + { + if (!$tree) return ''; + $my_tree = ''; + $cur = '#root'; + $lastcur = array(false); + $kids = array(); + $dopar = false; + if ($tree[$cur]['parent']) + { + $dopar = true; + if (!is_object($tree[$cur]['parent'])) + { +// debug("parent ".$tree[$cur]['parent']." not found"); + $my_tree .= '
      • ' . $tree[$cur]['parent'] .'
          '; + } + else + { +// debug("parent ".$this->returnSee($tree[$cur]['parent'])." in other package"); + $my_tree .= '
        • ' . $this->returnSee($tree[$cur]['parent']); + if ($tree[$cur]['parent']->package != $package) $my_tree .= ' (Different package)
            '; + } + } + do + { +// fancy_debug($cur,$lastcur,$kids); + if (count($tree[$cur]['children'])) + { +// debug("$cur has children"); + if (!isset($kids[$cur])) + { +// debug("set $cur kids"); + $kids[$cur] = 1; + $my_tree .= '
          • '.$this->returnSee($tree[$cur]['link']); + $my_tree .= '
              '."\n"; + } + array_push($lastcur,$cur); + list(,$cur) = each($tree[$cur]['children']); +// var_dump('listed',$cur); + if ($cur) + { + $cur = $cur['package'] . '#' . $cur['class']; +// debug("set cur to child $cur"); +// $my_tree .= '
            • '.$this->returnSee($tree[$cur]['link']); + continue; + } else + { +// debug("end of children for $cur"); + $cur = array_pop($lastcur); + $cur = array_pop($lastcur); + $my_tree .= '
          • '."\n"; + if ($dopar && ($cur == '#root' || !$cur)) $my_tree .= '
        • '; + } + } else + { +// debug("$cur has no children"); + $my_tree .= '
        • '.$this->returnSee($tree[$cur]['link'])."
        • "; + if ($dopar && $cur == '#root') $my_tree .= '
      • '; + $cur = array_pop($lastcur); + } + } while ($cur); + return $my_tree; + } + /** + * Generate indexing information for given element + * + * @param parserElement descendant of parserElement + * @see generateElementIndex() + * @return array + */ + function getIndexInformation($elt) + { + $Result['type'] = $elt->type; + $Result['file_name'] = $elt->file; + $Result['path'] = $elt->getPath(); + + if (isset($elt->docblock)) + { + $Result['description'] = $elt->docblock->getSDesc($this); + + if ($elt->docblock->hasaccess) + $Result['access'] = $elt->docblock->tags['access'][0]->value; + else + $Result['access'] = 'public'; + + $Result['abstract'] = isset ($elt->docblock->tags['abstract'][0]); + } + else + $Result['description'] = ''; + + $aa = $Result['description']; + if (!empty($aa)) $aa = "
            $aa"; + + switch($elt->type) + { + case 'class': + $Result['name'] = $elt->getName(); + $Result['title'] = 'Class'; + $Result['link'] = $this->getClassLink($elt->getName(), + $elt->docblock->package, + $elt->getPath(), + $elt->getName()); + $Result['listing'] = 'in file '.$elt->file.', class '.$Result['link']."$aa"; + break; + case 'define': + $Result['name'] = $elt->getName(); + $Result['title'] = 'Constant'; + $Result['link'] = $this->getDefineLink($elt->getName(), + $elt->docblock->package, + $elt->getPath(), + $elt->getName()); + $Result['listing'] = 'in file '.$elt->file.', constant '.$Result['link']."$aa"; + break; + case 'global': + $Result['name'] = $elt->getName(); + $Result['title'] = 'Global'; + $Result['link'] = $this->getGlobalLink($elt->getName(), + $elt->docblock->package, + $elt->getPath(), + $elt->getName()); + $Result['listing'] = 'in file '.$elt->file.', global variable '.$Result['link']."$aa"; + break; + case 'function': + $Result['name'] = $elt->getName(); + $Result['title'] = 'Function'; + $Result['link'] = $this->getFunctionLink($elt->getName(), + $elt->docblock->package, + $elt->getPath(), + $elt->getName().'()'); + $Result['listing'] = 'in file '.$elt->file.', function '.$Result['link']."$aa"; + break; + case 'method': + $Result['name'] = $elt->getName(); + $Result['title'] = 'Method'; + $Result['link'] = $this->getMethodLink($elt->getName(), + $elt->class, + $elt->docblock->package, + $elt->getPath(), + $elt->class.'::'.$elt->getName().'()' + ); + if ($elt->isConstructor) $Result['constructor'] = 1; + $Result['listing'] = 'in file '.$elt->file.', method '.$Result['link']."$aa"; + break; + case 'var': + $Result['name'] = $elt->getName(); + $Result['title'] = 'Variable'; + $Result['link'] = $this->getVarLink($elt->getName(), + $elt->class, + $elt->docblock->package, + $elt->getPath(), + $elt->class.'::'.$elt->getName()); + $Result['listing'] = 'in file '.$elt->file.', variable '.$Result['link']."$aa"; + break; + case 'const': + $Result['name'] = $elt->getName(); + $Result['title'] = 'Variable'; + $Result['link'] = $this->getConstLink($elt->getName(), + $elt->class, + $elt->docblock->package, + $elt->getPath(), + $elt->class.'::'.$elt->getName()); + $Result['listing'] = 'in file '.$elt->file.', class constant '.$Result['link']."$aa"; + break; + case 'page': + $Result['name'] = $elt->getFile(); + $Result['title'] = 'Page'; + $Result['link'] = $this->getPageLink($elt->getFile(), + $elt->package, + $elt->getPath(), + $elt->getFile()); + $Result['listing'] = 'procedural page '.$Result['link']; + break; + case 'include': + $Result['name'] = $elt->getName(); + $Result['title'] = 'Include'; + $Result['link'] = $elt->getValue(); + $Result['listing'] = 'include '.$Result['name']; + break; + } + + return $Result; + } + /** + * Generate alphabetical index of all elements + * + * @see $elements, walk() + */ + function generateElementIndex() + { + $elementindex = array(); + $letters = array(); + $used = array(); + foreach($this->elements as $letter => $nutoh) + { + foreach($this->elements[$letter] as $i => $yuh) + { + if ($this->elements[$letter][$i]->type != 'include') + { + if (!isset($used[$letter])) + { + $letters[]['letter'] = $letter; + $elindex['letter'] = $letter; + $used[$letter] = 1; + } + + $elindex['index'][] = $this->getIndexInformation($this->elements[$letter][$i]); + } + } + if (isset($elindex['index'])) + { + $elementindex[] = $elindex; + } else + { + unset($letters[count($letters) - 1]); + } + $elindex = array(); + } + return array($elementindex,$letters); + } + + function copyMediaRecursively($media,$targetdir,$subdir = '') + { + if (!is_array($media)) { + return; + } + foreach($media as $dir => $files) + { + if ($dir === '/') + { + $this->copyMediaRecursively($files,$targetdir); + } else + { + if (!is_numeric($dir)) + { + // create the subdir + phpDocumentor_out("creating $targetdir/$dir\n"); + Converter::setTargetDir($targetdir . PATH_DELIMITER . $dir); + if (!empty($subdir)) $subdir .= PATH_DELIMITER; + $this->copyMediaRecursively($files,"$targetdir/$dir",$subdir . $dir); + } else + { + // copy the file + phpDocumentor_out("copying $targetdir/".$files['file']."\n"); + $this->copyFile($files['file'],$subdir); + } + } + } + } + + /** + * calls the converter setTargetDir, and then copies any template images and the stylesheet if they haven't been copied + * @see Converter::setTargetDir() + */ + function setTargetDir($dir) + { + Converter::setTargetDir($dir); + if ($this->_wrote_tdir) return; + $this->_wrote_tdir = true; + $template_images = array(); + $stylesheets = array(); + $tdir = $dir; + $dir = $this->templateDir; + $this->templateDir = $this->templateDir.'templates/'; + $info = new Io; + $this->copyMediaRecursively($info->getDirTree($this->templateDir.'media',$this->templateDir),$tdir); + } + + /** + * Generate alphabetical index of all elements by package and subpackage + * + * @param string $package name of a package + * @see $pkg_elements, walk(), generatePkgElementIndexes() + */ + function generatePkgElementIndex($package) + { + $elementindex = array(); + $letters = array(); + $letterind = array(); + $used = array(); + $subp = ''; + foreach($this->pkg_elements[$package] as $subpackage => $els) + { + if (empty($els)) continue; + if (!empty($subpackage)) $subp = " (subpackage: $subpackage)"; else $subp = ''; + foreach($els as $letter => $yuh) + { + foreach($els[$letter] as $i => $yuh) + { + if ($els[$letter][$i]->type != 'include') + { + if (!isset($used[$letter])) + { + $letters[]['letter'] = $letter; + $letterind[$letter] = count($letters) - 1; + $used[$letter] = 1; + } + $elindex[$letter]['letter'] = $letter; + + $elindex[$letter]['index'][] = $this->getIndexInformation($els[$letter][$i]); + } + } + } + } + ksort($elindex); + usort($letters,'HTMLSmarty_lettersort'); + if (isset($elindex)) + { + while(list($letter,$tempel) = each($elindex)) + { + if (!isset($tempel)) + { + unset($letters[$letterind[$tempel['letter']]]); + } else + $elementindex[] = $tempel; + } + } else $letters = array(); + return array($elementindex,$letters); + } + + /** + * + * @see generatePkgElementIndex() + */ + function generatePkgElementIndexes() + { + $packages = array(); + $package_names = array(); + $pkg = array(); + $letters = array(); + foreach($this->pkg_elements as $package => $trash) + { + $pkgs['package'] = $package; + $pkg['package'] = $package; + list($pkg['pindex'],$letters[$package]) = $this->generatePkgElementIndex($package); + if (count($pkg['pindex'])) + { + $packages[] = $pkg; + $package_names[] = $pkgs; + } + unset($pkgs); + unset($pkg); + } + foreach($packages as $i => $package) + { + $pnames = array(); + for($j=0;$jreturnSee($a, $text, $with_a); + } + + /** + * @param string name of function + * @param string package name + * @param string full path to look in (used in index generation) + * @param boolean deprecated + * @param boolean return just the URL, or enclose it in an html a tag + * @return mixed false if not found, or an html a link to the function's documentation + * @see parent::getFunctionLink() + */ + function getFunctionLink($expr,$package, $file = false,$text = false) + { + $a = Converter::getFunctionLink($expr,$package,$file); + if (!$a) return false; + return $this->returnSee($a, $text); + } + + /** + * @param string name of define + * @param string package name + * @param string full path to look in (used in index generation) + * @param boolean deprecated + * @param boolean return just the URL, or enclose it in an html a tag + * @return mixed false if not found, or an html a link to the define's documentation + * @see parent::getDefineLink() + */ + function getDefineLink($expr,$package, $file = false,$text = false) + { + $a = Converter::getDefineLink($expr,$package,$file); + if (!$a) return false; + return $this->returnSee($a, $text); + } + + /** + * @param string name of global variable + * @param string package name + * @param string full path to look in (used in index generation) + * @param boolean deprecated + * @param boolean return just the URL, or enclose it in an html a tag + * @return mixed false if not found, or an html a link to the global variable's documentation + * @see parent::getGlobalLink() + */ + function getGlobalLink($expr,$package, $file = false,$text = false) + { + $a = Converter::getGlobalLink($expr,$package,$file); + if (!$a) return false; + return $this->returnSee($a, $text); + } + + /** + * @param string name of procedural page + * @param string package name + * @param string full path to look in (used in index generation) + * @param boolean deprecated + * @param boolean return just the URL, or enclose it in an html a tag + * @return mixed false if not found, or an html a link to the procedural page's documentation + * @see parent::getPageLink() + */ + function getPageLink($expr,$package, $path = false,$text = false) + { + $a = Converter::getPageLink($expr,$package,$path); + if (!$a) return false; + return $this->returnSee($a, $text); + } + + /** + * @param string name of method + * @param string class containing method + * @param string package name + * @param string full path to look in (used in index generation) + * @param boolean deprecated + * @param boolean return just the URL, or enclose it in an html a tag + * @return mixed false if not found, or an html a link to the method's documentation + * @see parent::getMethodLink() + */ + function getMethodLink($expr,$class,$package, $file = false,$text = false) + { + $a = Converter::getMethodLink($expr,$class,$package,$file); + if (!$a) return false; + return $this->returnSee($a, $text); + } + + /** + * @param string name of var + * @param string class containing var + * @param string package name + * @param string full path to look in (used in index generation) + * @param boolean deprecated + * @param boolean return just the URL, or enclose it in an html a tag + * @return mixed false if not found, or an html a link to the var's documentation + * @see parent::getVarLink() + */ + function getVarLink($expr,$class,$package, $file = false,$text = false) + { + $a = Converter::getVarLink($expr,$class,$package,$file); + if (!$a) return false; + return $this->returnSee($a, $text); + } + + /** + * @param string name of class constant + * @param string class containing class constant + * @param string package name + * @param string full path to look in (used in index generation) + * @param boolean deprecated + * @param boolean return just the URL, or enclose it in an html a tag + * @return mixed false if not found, or an html a link to the var's documentation + * @see parent::getVarLink() + */ + function getConstLink($expr,$class,$package, $file = false,$text = false) + { + $a = Converter::getConstLink($expr,$class,$package,$file); + if (!$a) return false; + return $this->returnSee($a, $text); + } + + /** + * does a nat case sort on the specified second level value of the array + * + * @param mixed $a + * @param mixed $b + * @return int + */ + function rcNatCmp ($a, $b) + { + $aa = strtoupper($a[$this->rcnatcmpkey]); + $bb = strtoupper($b[$this->rcnatcmpkey]); + + return strnatcasecmp($aa, $bb); + } + + /** + * does a nat case sort on the specified second level value of the array. + * this one puts constructors first + * + * @param mixed $a + * @param mixed $b + * @return int + */ + function rcNatCmp1 ($a, $b) + { + $aa = strtoupper($a[$this->rcnatcmpkey]); + $bb = strtoupper($b[$this->rcnatcmpkey]); + + if (strpos($aa,'CONSTRUCTOR') === 0) + { + return -1; + } + if (strpos($bb,'CONSTRUCTOR') === 0) + { + return 1; + } + if (strpos($aa,strtoupper($this->class)) === 0) + { + return -1; + } + if (strpos($bb,strtoupper($this->class)) === 0) + { + return -1; + } + return strnatcasecmp($aa, $bb); + } + + /** + * This function is not used by HTMLdefaultConverter, but is required by Converter + */ + function Output() + { + } +} + +/** + * @access private + * @global string name of the package to set as the first package + */ +function HTMLSmarty_pindexcmp($a, $b) +{ + global $phpDocumentor_DefaultPackageName; + if ($a['title'] == $phpDocumentor_DefaultPackageName) return -1; + if ($b['title'] == $phpDocumentor_DefaultPackageName) return 1; + return strnatcasecmp($a['title'],$b['title']); +} + +/** @access private */ +function HTMLSmarty_lettersort($a, $b) +{ + return strnatcasecmp($a['letter'],$b['letter']); +} + +/** @access private */ +function HTMLSmarty_outputfilter($src, &$smarty) +{ + return str_replace('{$subdir}',$smarty->_tpl_vars['subdir'],$src); +} +?> diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/options.ini b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/options.ini new file mode 100644 index 00000000..4566db60 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/options.ini @@ -0,0 +1,577 @@ +preservedocbooktags = false + +;; used to highlight the {@source} inline tag, @filesource tag, and @example tag +[highlightSourceTokens] +;; format: +;; T_CONSTANTNAME = open +;; /T_CONSTANTNAME = close + +T_INCLUDE = +/T_INCLUDE = +T_INCLUDE_ONCE = +/T_INCLUDE_ONCE = +T_REQUIRE_ONCE = +/T_REQUIRE_ONCE = +T_REQUIRE_ONCE = +/T_REQUIRE_ONCE = + +T_CONSTANT_ENCAPSED_STRING = +/T_CONSTANT_ENCAPSED_STRING = +T_STRING_VARNAME = +/T_STRING_VARNAME = + +T_STRING = +/T_STRING = + +T_DNUMBER = +/T_DNUMBER = +T_LNUMBER = +/T_LNUMBER = + +T_VARIABLE = +/T_VARIABLE = + +T_COMMENT = +/T_COMMENT = +T_ML_COMMENT = +/T_ML_COMMENT = + +T_OBJECT_OPERATOR = +/T_OBJECT_OPERATOR = + +T_ABSTRACT = +/T_ABSTRACT = +T_CLONE = +/T_CLONE = +T_HALT_COMPILER = +/T_HALT_COMPILER = +T_ARRAY = +/T_ARRAY = +T_AS = +/T_AS = +T_BREAK = +/T_BREAK = +T_CLASS = +/T_CLASS = +T_CASE = +/T_CASE = +T_CONST = +/T_CONST = +T_CONTINUE = +/T_CONTINUE = +T_DECLARE = +/T_DECLARE = +T_DEFAULT = +/T_DEFAULT = +T_ELSE = +/T_ELSE = +T_ELSEIF = +/T_ELSEIF = +T_EMPTY = +/T_EMPTY = +T_ENDDECLARE = +/T_ENDDECLARE = +T_ENDFOR = +/T_ENDFOR = +T_ENDSWITCH = +/T_ENDSWITCH = +T_ENDFOREACH = +/T_ENDFOREACH = +T_ENDIF = +/T_ENDIF = +T_ENDWHILE = +/T_ENDWHILE = +T_EXIT = +/T_EXIT = +T_EXTENDS = +/T_EXTENDS = +T_FINAL = +/T_FINAL = +T_FOR = +/T_FOR = +T_FOREACH = +/T_FOREACH = +T_FUNCTION = +/T_FUNCTION = +T_GLOBAL = +/T_GLOBAL = +T_IF = +/T_IF = +T_IMPLEMENTS = +/T_IMPLEMENTS = +T_INTERFACE = +/T_INTERFACE = +T_LOGICAL_AND = +/T_LOGICAL_AND = +T_LOGICAL_OR = +/T_LOGICAL_OR = +T_LOGICAL_XOR = +/T_LOGICAL_XOR = +T_NEW = +/T_NEW = +T_PRIVATE = +/T_PRIVATE = +T_PROTECTED = +/T_PROTECTED = +T_PUBLIC = +/T_PUBLIC = +T_RETURN = +/T_RETURN = +T_STATIC = +/T_STATIC = +T_SWITCH = +/T_SWITCH = +T_VAR = +/T_VAR = +T_WHILE = +/T_WHILE = + +T_DOUBLE_COLON = +/T_DOUBLE_COLON = + +T_OPEN_TAG = +/T_OPEN_TAG = +T_OPEN_TAG_WITH_ECHO = +/T_OPEN_TAG_WITH_ECHO = +T_CLOSE_TAG = +/T_CLOSE_TAG = + + +[highlightSource] +;; this is for highlighting things that aren't tokens like "&" +;; format: +;; word = open +;; /word = close +@ = +/@ = +& = +/& = +[ = +/[ = +] = +/] = +! = +/! = +";" = +/; = +( = +/( = +) = +/) = +, = +/, = +{ = +/{ = +} = +/} = +""" = +/" = + +[highlightDocBlockSourceTokens] +;; this is for docblock tokens, using by phpDocumentor_HighlightParser +;; tagphptype is for "string" in @param string description, for example +docblock = +/docblock = +tagphptype = +/tagphptype = +tagvarname = +/tagvarname = +coretag = +/coretag = +tag = +/tag = +inlinetag = +/inlinetag = +internal = +/internal = +closetemplate = +/closetemplate = +docblocktemplate = +/docblocktemplate = + +[highlightTutorialSourceTokens] +;; this is for XML DocBook-based tutorials, highlighted by phpDocumentor_TutorialHighlightParser +;; +opentag = +/opentag = +;; +closetag = +/closetag = +;; +attribute = +/attribute = +;; +attributevalue = +/attributevalue = +;; &entity; +entity = +/entity = +;; +comment = +/comment = +;; {@inline tag} +itag = +/itag = + +;; used for translation of html in DocBlocks +[desctranslate] +ul =
          +/ul =
        +ol =
          +/ol =
        +li =
      • +/li =
      • +code =
        +/code = 
        +var = +/var = +samp = +/samp = +kbd = +/kbd = +pre =
        +/pre = 
        +p =

        +/p =

        +b = +/b = +i = +/i = +br =
        + +[ppage] +;; this is the DocBook package page translation section. All DocBook tags +;; that have a corresponding html tag must be listed here. Entities should +;; also be listed here +;; +;; examples: +;; 1) +;; tagname = newtagname +;; +;; This is the simplest case, where all attributes will be added into the +;; starting tag and the ending tag will be html/xml style +;; becomes and +;; becomes +;; +;; +;; 2) +;; tagname = newtagname +;; tagname->attr = newattrname +;; +;; in this case, everything will be like the first case, except tags like: +;; will become +;; +;; +;; 3) +;; tagname = newtagname +;; tagname->attr = newattrname +;; tagname->attr+value = newvalue +;; +;; in this case, the value is also translated to another. This can be useful +;; for instances such as focus="middle" changing to align="center" or something +;; of that nature. +;; will become +;; +;; +;; 4) +;; tagname = newtagname +;; tagname->attr1 = newattrname +;; tagname->attr2 = newattrname +;; tagname->attr1+value|attr2+value = newvalue +;; +;; in this case, two attributes combine to make one new attribute, and the combined +;; value is translated into a new value +;; will become +;; +;; +;; 5) +;; tagname = newtagname +;; tagname!attr = dummy +;; +;; here, the attribute will be ignored. dummy is not used and may be any value +;; will become +;; +;; +;; 6) +;; tagname = newtagname +;; tagname! = dummy +;; +;; here, all attributes will be ignored. dummy is not used and may be any value +;; will become +;; +;; +;; 7) +;; tagname = newtagname +;; tagname/ = 1 +;; +;; here, the tag will be translated as a single tag with no closing tag, and all +;; attributes +;; {text text} will become +;; +;; +;; 8) +;; tagname = +;; /tagname = closetagtext +;; +;; in this case, the text will be inserted exactly as entered for +;; and closetagtext for +;; will become +;; closetagtext +;; +;; 9) +;; $attr$my_attribute = newattrname +;; +;; tagname = newtagname +;; +;; in this case, all occurences of my_attribute in any tag will be changed to +;; newattrname. This is useful for changing things like role="php" to +;; class="php," for example. Note that the text "$attr$" MUST be on the line +;; start for phpDocumentor to recognize it. +;; +;; 10) +;; &entity; = translation text +;; " = " +;; " = """ +;; < = < +;; +;; Use this to control translation of entities to their appropriate values + +  =   +" = " +” = ” +“ = “ +& = & +< = < +> = > +© = © + +$attr$role = class + +abbrev = abbr + +blockquote = blockquote + +arg = span +arg->choice = class + +author = +/author = +author! = 0 + +authorblurb =
        +/authorblurb =
        + +authorgroup =

        Authors

        +/authorgroup =
        +authorgroup! = 0 + +caution = +/caution = +caution! = 0 + +cmdsynopsis =
        +/cmdsynopsis =
        + +command = +/command = + +copyright =
        +/copyright =
        + +emphasis = strong + +example =
        +/example = 
        +example! = 0 + +function = +/function = () + +formalpara = p + +graphic = img +graphic->fileref = src +graphic/ = + +important = strong + +informalequation = blockquote + +informalexample = div + +inlineequation = em + +itemizedlist = ul + +listitem = li + +literal = code + +literallayout = span + +option = " " +/option = + +orderedlist = ol + +para = p + +programlisting =
        +/programlisting = 
        +programlisting! = 0 + +refentry = div + +refnamediv =
        +/refnamediv =
        +refnamediv! = 0 + +refname =

        +/refname =

        + +refpurpose =

        +/refpurpose =

        + +refsynopsisdiv =
        +/refsynopsisdiv =
        +refsynopsisdiv! = 0 + +refsect1 = span + +refsect2 = +/refsect2 =
        + +refsect3 = +/refsect3 =
        + +releaseinfo =
        ( +/releaseinfo = )
        + +simpara = +/simpara =
        +simpara! = 0 + +subscript = sub + +superscript = super + +table = table + +table->colsep = rules +table->rowsep = rules +table->colsep+1|rowsep+1 = all +table->colsep+1|rowsep+0 = cols +table->colsep+0|rowsep+1 = rows + +table->frame = frame +table->frame+all = border +table->frame+none = void +table->frame+sides = vsides +table->frame+top = above +table->frame+topbot = hsides + +thead = thead + +tfoot = tfoot + +tbody = tbody + +colspec = col + +tgroup = colgroup +tgroup/ = 1 +tgroup->cols = span + +row = tr + +entry = td +entry->morerows = colspan +entry->morerows+1 = 2 +entry->morerows+2 = 3 +entry->morerows+3 = 4 +entry->morerows+4 = 5 +entry->morerows+5 = 6 +entry->morerows+6 = 7 +entry->morerows+7 = 8 +entry->morerows+8 = 9 +entry->morerows+9 = 10 +entry->morerows+10 = 11 +;; add more if you need more colspans + +warning = +/warning = +warning! = 0 + +;; now begins the attributes that should be tags in cdata +[$attr$id] +open = a +;close = /a +cdata! = true +quotevalues = true +separator = "=" +;separateall = true +$id = name + +;; now begins the sections that deal with +[refsynopsisdiv_title] +;tag_attr = true +;attr_name = title +cdata_start = true +;cdata_end = true +open = <h1 class="title"> +close = </h1> + +[refsect1_title] +;tag_attr = true +;attr_name = title +cdata_start = true +;cdata_end = true +open = <h2 class="title"> +close = </h2> + +[refsect2_title] +;tag_attr = true +;attr_name = title +cdata_start = true +;cdata_end = true +open = <h3 class="title"> +close = </h3> + +[refsect3_title] +;tag_attr = true +;attr_name = title +cdata_start = true +;cdata_end = true +open = <h4 class="title"> +close = </h4> + +[para_title] +;tag_attr = true +;attr_name = title +cdata_start = true +;cdata_end = true +open = <div class="title"> +close = </div> + +[formalpara_title] +;tag_attr = true +;attr_name = title +cdata_start = true +;cdata_end = true +open = <div class="title"> +close = </div> + +[example_title] +;tag_attr = true +;attr_name = title +;cdata_start = true +cdata_end = true +open = </td></tr><tr><td><strong> +close = </strong> + +[table_title] +;tag_attr = true +;attr_name = true +cdata_start = true +open = <caption> +close = </caption> diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/__tags.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/__tags.tpl new file mode 100644 index 00000000..221830c4 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/__tags.tpl @@ -0,0 +1,13 @@ +<div class="tag-list"> + {section name=tag loop=$tags} + {if $tags[tag].keyword != "abstract" && + $tags[tag].keyword != "access" && + $tags[tag].keyword != "static" && + $tags[tag].keyword != "version" + } + + <strong>{$tags[tag].keyword|capitalize}:</strong> + {$tags[tag].data}<br /> + {/if} + {/section} +</div> diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/_class_declaration.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/_class_declaration.tpl new file mode 100644 index 00000000..d7fe2f82 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/_class_declaration.tpl @@ -0,0 +1,38 @@ +<hr size="1" noshade="noshade"/> +<div class="class-declaration"> + {if count($tags) > 0} + {section name=tag loop=$tags} + {if $tags[tag].keyword == "abstract"} + abstract + {/if} + {/section} + {/if} + + {if $is_interface} + interface + {else} + class + {/if} + + <strong>{$class_name}</strong> + + {if count($class_tree) > 1} + {section name=tree loop=$class_tree.classes} + {if $smarty.section.tree.last} + extends {$class_tree.classes[$smarty.section.tree.index_prev]} + {/if} + {/section} + {/if} + + {if $implements} + <br/> + implements + {foreach item="interface" from=$implements} + {if !$smarty.foreach.interface.first} + , {$interface} + {else} + {$interface} + {/if} + {/foreach} + {/if} +</div> \ No newline at end of file diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/_class_description.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/_class_description.tpl new file mode 100644 index 00000000..12025c1c --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/_class_description.tpl @@ -0,0 +1,7 @@ +<div class="class-description"> + <p>{$sdesc}</p> + + {if $desc != ""}{$desc}{/if} +</div> + +{include file="_tags.tpl" tags=$tags} diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/_class_list.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/_class_list.tpl new file mode 100644 index 00000000..d6a1d398 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/_class_list.tpl @@ -0,0 +1 @@ +{eval var=$compiledclassindex} \ No newline at end of file diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/_constant_details.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/_constant_details.tpl new file mode 100644 index 00000000..bca71e17 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/_constant_details.tpl @@ -0,0 +1,33 @@ +{if $consts} + <hr size="1" noshade="noshade"/> + <a name="constant-details"></a> + <table class="constant-details" cellspacing="1"> + <tr> + <th>Constant Details</th> + </tr> + {section name=const loop=$consts} + <tr> + <td> + <a name="{$consts[const].const_dest}"></a> + + <h3>{$consts[const].const_name}</h3> + + <p>{$consts[const].sdesc}</p> + + {if $consts[const].desc} + {$consts[const].desc} + {/if} + + <div class="tag-list"> + <h4 class="tag">Type:</h4> + <div class="tag-data">{include file="_get_constant_type.tpl" const=$consts[const].const_value}</div> + <h4 class="tag">Value:</h4> + <div class="tag-data">{$consts[const].const_value}</div> + </div> + {include file="_tags.tpl" tags=$consts[const].tags} + <p/> + </td> + </tr> + {/section} + </table> +{/if} \ No newline at end of file diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/_constant_summary.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/_constant_summary.tpl new file mode 100644 index 00000000..8049c4b0 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/_constant_summary.tpl @@ -0,0 +1,22 @@ +{if $consts || $iconsts} + <hr size="1" noshade="noshade"/> + <a name="constant-summary"></a> + <table class="constant-summary" cellspacing="1"> + <tr> + <th colspan="3">Constant Summary</th> + </tr> + {section name=const loop=$consts} + <tr> + <td class="type" nowrap="nowrap">{strip}{include file="_get_constant_type.tpl" const=$consts[const].const_value}{/strip}</td> + <td class="name"><a href="{$consts[const].id}">{$consts[const].const_name}</a></td> + <td class="description" width="100%"> + {$consts[const].sdesc} + + {if $consts[const].desc} + {$consts[const].desc} + {/if} + </td> + </tr> + {/section} + </table> +{/if} \ No newline at end of file diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/_constructor_details.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/_constructor_details.tpl new file mode 100644 index 00000000..ec4fd0a2 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/_constructor_details.tpl @@ -0,0 +1,55 @@ +{if $methods} + {section name=method loop=$methods} + {if $methods[method].function_name == "__construct"} + <hr size="1" noshade="noshade"/> + <a name="sec-method"></a> + <table class="method-details" cellspacing="1"> + <tr> + <th colspan="3">Constructor Details</th> + </tr> + <tr> + <td class="method-data"> + <a name="{$methods[method].method_dest}"></a> + + <h2>{$methods[method].function_name}</h2> + + <table class="method-detail" cellspacing="0"> + <tr> + <td nowrap="nowrap">{strip} + {if $methods[method].access == "protected"} + protected  + {/if} + + {if $methods[method].access == "public"} + public  + {/if} + + {if $methods[method].abstract == "1"} + abstract  + {/if} + + {if $methods[method].static == "1"} + static  + {/if} + + <strong>{$methods[method].function_name}</strong> + {/strip}</td> + <td nowrap="nowrap">{strip} + {$methods[method].ifunction_call.params} + {/strip}</td> + </tr> + </table> + + <p>{$methods[method].sdesc}</p> + + {if $methods[method].desc} + {$methods[method].desc} + {/if} + + {include file="_tags.tpl" tags=$methods[method].tags} + </td> + </tr> + </table> + {/if} + {/section} +{/if} diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/_constructor_summary.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/_constructor_summary.tpl new file mode 100644 index 00000000..8819f63e --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/_constructor_summary.tpl @@ -0,0 +1,25 @@ +{if $methods} + {section name=method loop=$methods} + {if $methods[method].function_name == "__construct"} + <hr size="1" noshade="noshade"/> + <a name="constructor-summary"></a> + <table class="method-summary" cellspacing="1"> + <tr> + <th colspan="2">Constructor Summary</th> + </tr> + <tr> + <td class="type" nowrap="nowrap" width="1%">{$methods[method].access}</td> + <td> + <div class="declaration"> + <a href="{$methods[method].id}">{$methods[method].function_name}</a> + {$methods[method].ifunction_call.params} + </div> + <div class="description"> + {$methods[method].sdesc} + </div> + </td> + </tr> + </table> + {/if} + {/section} +{/if} diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/_destructor_details.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/_destructor_details.tpl new file mode 100644 index 00000000..3cb5534a --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/_destructor_details.tpl @@ -0,0 +1,55 @@ +{if $methods} + {section name=method loop=$methods} + {if $methods[method].function_name == "__destruct"} + <hr size="1" noshade="noshade"/> + <a name="sec-method"></a> + <table class="method-details" cellspacing="1"> + <tr> + <th colspan="3">Destructor Details</th> + </tr> + <tr> + <td class="method-data"> + <a name="{$methods[method].method_dest}"></a> + + <h2>{$methods[method].function_name}</h2> + + <table class="method-detail" cellspacing="0"> + <tr> + <td nowrap="nowrap">{strip} + {if $methods[method].access == "protected"} + protected  + {/if} + + {if $methods[method].access == "public"} + public  + {/if} + + {if $methods[method].abstract == "1"} + abstract  + {/if} + + {if $methods[method].static == "1"} + static  + {/if} + + <strong>{$methods[method].function_name}</strong> + {/strip}</td> + <td nowrap="nowrap">{strip} + {build_argument_list args=$methods[method].ifunction_call.params style="vertical"} + {/strip}</td> + </tr> + </table> + + <p>{$methods[method].sdesc}</p> + + {if $methods[method].desc} + {$methods[method].desc} + {/if} + + {include file="_tags.tpl" tags=$methods[method].tags} + </td> + </tr> + </table> + {/if} + {/section} +{/if} \ No newline at end of file diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/_destructor_summary.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/_destructor_summary.tpl new file mode 100644 index 00000000..53e8f1d2 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/_destructor_summary.tpl @@ -0,0 +1,27 @@ +{if $methods} + {section name=method loop=$methods} + {if $methods[method].function_name == "__destruct"} + <hr size="1" noshade="noshade"/> + <a name="desructor-summary"></a> + <table class="method-summary" cellspacing="1"> + <tr> + <th colspan="2">Destructor Summary</th> + </tr> + <tr> + <td class="type" nowrap="nowrap" width="1%">{strip} + {$methods[method].access} + {/strip}</td> + <td> + <div class="declaration">{strip} + <a href="{$methods[method].id}">{$methods[method].function_name}</a> + {$methods[method].ifunction_call.params} + {/strip}</div> + <div class="description"> + {$methods[method].sdesc} + </div> + </td> + </tr> + </table> + {/if} + {/section} +{/if} diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/_footer.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/_footer.tpl new file mode 100644 index 00000000..0c2eddc2 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/_footer.tpl @@ -0,0 +1 @@ +</div> diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/_get_constant_type.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/_get_constant_type.tpl new file mode 100644 index 00000000..48301da4 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/_get_constant_type.tpl @@ -0,0 +1,10 @@ +{if is_numeric(strtolower(trim($const)))} + int +{elseif strtolower(trim($const)) == "true" || + strtolower(trim($const)) == "false"} + bool +{elseif strtolower(trim($const)) == "null"} + null +{else} + string +{/if} \ No newline at end of file diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/_header.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/_header.tpl new file mode 100644 index 00000000..f92571a4 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/_header.tpl @@ -0,0 +1,4 @@ +<div id="bar" nowrap="nowrap"> + {include file="_class_list.tpl"} +</div> +<div id="content1"> diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/_inherited_constants.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/_inherited_constants.tpl new file mode 100644 index 00000000..66c37633 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/_inherited_constants.tpl @@ -0,0 +1,34 @@ +{if $iconsts} + {section name=iconst loop=$iconsts} + <table class="inherited-constants" cellspacing="1"> + <tr> + <th>Constants Inherited From {$iconsts[iconst].parent_class}</th> + </tr> + <tr> + <td> + {assign var="_consts" value=""} + + {section name=_const loop=$iconsts[iconst].iconsts} + {if $_consts != ""}, + {* append var="_consts" value=", "*} + {/if} + <a href="{$href}">{$iconsts[iconst].iconsts[_const].name}</a>{if !$smarty.section.name.last},{/if} + {* + {extract_attribute attribute="href" + element=$iconsts[iconst].iconsts[_const].link + var="href" append="no"} + + {append var="_consts" value="<a href=\""} + {append var="_consts" value=$href} + {append var="_consts" value="\">"} + {append var="_consts" value=$iconsts[iconst].iconsts[_const].name} + {append var="_consts" value="</a>"} + *} +{/section} + + {*$_consts*} + </td> + </tr> + </table> + {/section} +{/if} diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/_inherited_methods.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/_inherited_methods.tpl new file mode 100644 index 00000000..55aafb17 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/_inherited_methods.tpl @@ -0,0 +1,42 @@ +{if $imethods} + {section name=imethod loop=$imethods} + {if count($imethods[imethod].imethods) > 1 || + ($imethods[imethod].imethods[0].name != "__construct" && + $imethods[imethod].imethods[0].name != "__destruct" && + $imethods[imethod].imethods[0].abstract != "1")} + <table class="inherited-methods" cellspacing="1"> + <tr> + <th>Methods Inherited From {$imethods[imethod].parent_class}</th> + </tr> + <tr> + <td> + {* assign var="_methods" value="" *} + + {section name=_method loop=$imethods[imethod].imethods} + {if $imethods[imethod].imethods[_method].name != "__construct" && + $imethods[imethod].imethods[_method].abstract != "1"} + {* + {if $_methods != ""} + {append var="_methods" value=", "} + {/if} + + {extract_attribute attribute="href" + element=$imethods[imethod].imethods[_method].link + var="href" append="no"} + + {append var="_methods" value="<a href=\""} + {append var="_methods" value=$href} + {append var="_methods" value="\">"} + {append var="_methods" value=$imethods[imethod].imethods[_method].name} + {append var="_methods" value="</a>"} + *} + {$imethods[imethod].imethods[_method].link}{if !$smarty.section._method.last},{/if} + {/if} + {/section} + + </td> + </tr> + </table> + {/if} + {/section} +{/if} diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/_inheritence_tree.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/_inheritence_tree.tpl new file mode 100644 index 00000000..471c7972 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/_inheritence_tree.tpl @@ -0,0 +1,3 @@ +<div class="inheritence-tree"> + <pre>{section name=tree loop=$class_tree.classes}{if $smarty.section.tree.last}<strong>{$class_tree.classes[tree]}</strong>{else}{$class_tree.classes[tree]}{/if}{$class_tree.distance[tree]}{/section}</pre> +</div> \ No newline at end of file diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/_method_details.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/_method_details.tpl new file mode 100644 index 00000000..b5ddfb10 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/_method_details.tpl @@ -0,0 +1,101 @@ +{if $methods && (count($methods) > 1 || + ($methods[0].function_name != "__construct" && + $methods[0].function_name != "__destruct"))} + + <hr size="1" noshade="noshade"/> + <a name="method-details"></a> + <table class="method-details" cellspacing="1"> + <tr> + <th>Method Details</th> + </tr> + {section name=method loop=$methods} + {if $methods[method].function_name != "__construct" && + $methods[method].function_name != "__destruct"} + + <tr> + <td class="method-data"> + + <a name="{$methods[method].method_dest}"></a> + + <h2>{$methods[method].function_name}</h2> + + <table class="method-detail" cellspacing="0"> + <tr> + <td nowrap="nowrap">{strip} + {if $methods[method].access == "protected"} + protected  + {/if} + + {if $methods[method].access == "public"} + public  + {/if} + + {if $methods[method].abstract == 1} + abstract  + {/if} + + {if $methods[method].static == 1} + static  + {/if} + + {$methods[method].function_return}  + + + <strong>{$methods[method].function_name}</strong> + {/strip}</td> + <td width="100%">{strip} + ( + {if $methods[method].ifunction_call.params} + {foreach item=param name="method" from=$methods[method].ifunction_call.params} + {$param.type} {$param.name} {if !$smarty.foreach.method.last}, {/if} + {/foreach} + + {/if} + ) + {/strip}</td> + </tr> + </table> + + <p>{$methods[method].sdesc}</p> + + {if $methods[method].desc} + {$methods[method].desc} + {/if} + {* $methods[method]|print_r *} + <div class="tag-list"><table class="method-summary" cellspacing="1"> + {if $methods[method].ifunction_call.params} + <tr><th colspan="3" class="small">Input</th></tr> + {foreach item=param name="method" from=$methods[method].ifunction_call.params} + <tr><td valign="top">{$param.type}</td><td valign="top"><strong>{$param.name}</strong><td valign="top">{$param.description}</td></tr> + {/foreach} + {/if} + {if $methods[method].tags} + <tr><th colspan="3" class="small">Output</th></tr> + + {foreach item=param name="method" from=$methods[method].tags} + {if $param.keyword == "return"} + <tr><td valign="top"> + {$methods[method].function_return} + </td><td valign="top" colspan="2">{$param.data}</td></tr> + {/if} + {/foreach} + {/if} + {if $methods[method].tags} + <tr><th colspan="3" class="small">Exception</th></tr> + + {foreach item=param name="method" from=$methods[method].tags} + {if $param.keyword == "throws"} + <tr><td valign="top">{$param.keyword}</td><td valign="top" colspan="2">{$param.data}</td></tr> + {/if} + {/foreach} + {/if} + </table></div> + + {* include file="_tags.tpl" tags=$methods[method].tags *} + <p/> + </td> + </tr> + {/if} + {/section} + </table> +{/if} diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/_method_summary.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/_method_summary.tpl new file mode 100644 index 00000000..8fefd671 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/_method_summary.tpl @@ -0,0 +1,61 @@ +{if $methods || $imethods} + <hr size="1" noshade="noshade"/> + <a name="method-summary"></a> + <table class="method-summary" cellspacing="1"> + <tr> + <th colspan="2">Method Summary</th> + </tr> + {section name=method loop=$methods} + {if $methods[method].function_name != "__construct" && + $methods[method].function_name != "__destruct"} + {* + {if trim(substr($methods[method].function_call, 0, 1)) == "&"} + {assign var="ref" value="true"} + {assign var="css" value=" class=\"reference\""} + {else} + {assign var="ref" value="false"} + {assign var="css" value=""} + {/if} + *} + <tr> + <td class="type" nowrap="nowrap" width="1%"> + {if $methods[method].access == "protected"} + protected  + {/if} + + {if $methods[method].abstract == 1} + abstract  + {/if} + + {if $methods[method].static == 1} + static  + {/if} + + {$methods[method].function_return} +{* + {if $ref == "true"} +  & + {/if} +*} + </td> + <td> + <div class="declaration"> + <a href="{$methods[method].id}">{$methods[method].function_name}</a> + ({strip} + {if $methods[method].ifunction_call.params} + {foreach item=param name="method" from=$methods[method].ifunction_call.params} + {$param.type} {$param.name}{if !$smarty.foreach.method.last}, {/if} + {/foreach} + + {/if} + {/strip}) + </div> + <div class="description"> + {$methods[method].sdesc} + </div> + </td> + </tr> + {/if} + {/section} + </table> +{/if} diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/_sub_classes.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/_sub_classes.tpl new file mode 100644 index 00000000..e605b314 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/_sub_classes.tpl @@ -0,0 +1,19 @@ +{if $children} + <div class="sub-classes"> + {if $is_interface} + <h4>Direct Known Sub-interfaces:</h4> + {else} + <h4>Direct Known Sub-classes:</h4> + {/if} + + <div><small> + {section name=child loop=$children} + {if !$smarty.section.child.first} + , {$children[child].link} + {else} + {$children[child].link} + {/if} + {/section} + </small></div> + </div> +{/if} diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/_tags.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/_tags.tpl new file mode 100644 index 00000000..221830c4 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/_tags.tpl @@ -0,0 +1,13 @@ +<div class="tag-list"> + {section name=tag loop=$tags} + {if $tags[tag].keyword != "abstract" && + $tags[tag].keyword != "access" && + $tags[tag].keyword != "static" && + $tags[tag].keyword != "version" + } + + <strong>{$tags[tag].keyword|capitalize}:</strong> + {$tags[tag].data}<br /> + {/if} + {/section} +</div> diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/basicindex.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/basicindex.tpl new file mode 100644 index 00000000..37e94343 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/basicindex.tpl @@ -0,0 +1,18 @@ +{section name=letter loop=$letters} + [ <a href="{$indexname}.html#{$letters[letter].letter}">{$letters[letter].letter}</a> ] +{/section} + +{section name=index loop=$index} + <hr /> + <a name="{$index[index].letter}"></a> + <div> + <h2>{$index[index].letter}</h2> + <dl> + {section name=contents loop=$index[index].index} + <dt><b>{$index[index].index[contents].name}</b></dt> + <dd>{$index[index].index[contents].listing}</dd> + {/section} + </dl> + </div> + <a href="{$indexname}.html#top">top</a><br> +{/section} diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/blank.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/blank.tpl new file mode 100644 index 00000000..b503c142 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/blank.tpl @@ -0,0 +1,5 @@ +<div align="center"><h1>{$maintitle}</h1></div> +<b>Welcome to {$package}!</b><br /> +<br /> +This documentation was generated by <a href="{$phpdocwebsite}">phpDocumentor v{$phpdocversion}</a><br /> + diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/class.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/class.tpl new file mode 100644 index 00000000..e791bbba --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/class.tpl @@ -0,0 +1,29 @@ +{include file="header.tpl" eltype="class" hasel=true contents=$classcontents} + +<h1>{if $is_interface}Interface{else}Class{/if} {$class_name}</h1> + +{*inheritence tree*} +<div class="inheritence-tree"> + <pre>{section name=tree loop=$class_tree.classes}{if $smarty.section.tree.last}<strong>{$class_tree.classes[tree]}</strong>{else}{$class_tree.classes[tree]}{/if}{$class_tree.distance[tree]}{/section}</pre> +</div> + +{include file="_sub_classes.tpl"} +{include file="_class_description.tpl"} +{include file="_inherited_constants.tpl"} + +{include file="_constructor_summary.tpl"} +{* include file="_destructor_summary.tpl" *} + +{include file="_method_summary.tpl"} + +{include file="_inherited_methods.tpl"} +{include file="_constant_summary.tpl"} +{include file="_constructor_details.tpl"} + +{* include file="_destructor_details.tpl" *} + +{include file="_method_details.tpl"} + +{include file="_constant_details.tpl"} + +{include file="footer.tpl"} diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/classleft.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/classleft.tpl new file mode 100644 index 00000000..c07fc33a --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/classleft.tpl @@ -0,0 +1,9 @@ +{foreach key=subpackage item=files from=$classleftindex} + <div class="package"> + {if $subpackage != ""}{$subpackage}<br />{/if} + {section name=files loop=$files} + {if $subpackage != ""}  {/if} + {if $files[files].link != ''}<a href="{$files[files].link}">{/if}{$files[files].title}{if $files[files].link != ''}</a>{/if}<br /> + {/section} + </div> +{/foreach} diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/classtrees.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/classtrees.tpl new file mode 100644 index 00000000..4020e3a8 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/classtrees.tpl @@ -0,0 +1,8 @@ +{include file="header.tpl" noleftindex=true} +<h1>{$title}</h1> +{section name=classtrees loop=$classtrees} +<hr /> +<div class="classtree">Root class {$classtrees[classtrees].class}</div><br> +{$classtrees[classtrees].class_tree} +{/section} +{include file="footer.tpl"} diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/const.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/const.tpl new file mode 100644 index 00000000..88856c4b --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/const.tpl @@ -0,0 +1,14 @@ +{section name=consts loop=$consts} +{if $show == 'summary'} + var {$consts[consts].const_name}, {$consts[consts].sdesc}<br> +{else} + <a name="{$consts[consts].const_dest}"></a> + <p></p> + <h4>{$consts[consts].const_name} = <span class="value">{$consts[consts].const_value|replace:"\n":"<br>\n"|replace:" ":" "|replace:"\t":"   "}</span></h4> + <p>[line {if $consts[consts].slink}{$consts[consts].slink}{else}{$consts[consts].line_number}{/if}]</p> + {include file="docblock.tpl" sdesc=$consts[consts].sdesc desc=$consts[consts].desc tags=$consts[consts].tags} + + <br /> + <div class="top">[ <a href="#top">Top</a> ]</div><br /> +{/if} +{/section} diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/define.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/define.tpl new file mode 100644 index 00000000..04ce5b48 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/define.tpl @@ -0,0 +1,32 @@ +{if count($defines) > 0} +{section name=def loop=$defines} +{if $show == 'summary'} +define constant <a href="{$defines[def].id}">{$defines[def].define_name}</a> = {$defines[def].define_value}, {$defines[def].sdesc}<br> +{else} + <hr /> + <a name="{$defines[def].define_link}"></a> + <h3>{$defines[def].define_name} <span class="smalllinenumber">[line {if $defines[def].slink}{$defines[def].slink}{else}{$defines[def].line_number}{/if}]</span></h3> + <div class="tags"> + <table width="90%" border="0" cellspacing="0" cellpadding="1"><tr><td class="code_border"> + <table width="100%" border="0" cellspacing="0" cellpadding="2"><tr><td class="code"> + <code>{$defines[def].define_name} = {$defines[def].define_value}</code> + </td></tr></table> + </td></tr></table> + + {include file="docblock.tpl" sdesc=$defines[def].sdesc desc=$defines[def].desc tags=$defines[def].tags} + <br /> + {if $defines[def].define_conflicts.conflict_type} + <p><b>Conflicts with defines:</b> + {section name=me loop=$defines[def].define_conflicts.conflicts} + {$defines[def].define_conflicts.conflicts[me]}<br /> + {/section} + </p> + {/if} +{* original {if $defines[def].define_conflicts != "" + <b>Conflicts:</b> {$defines[def].define_conflicts<br /><br /> + {/if *} + </div> + <div class="top">[ <a href="#top">Top</a> ]</div><br /><br /> +{/if} +{/section} +{/if} \ No newline at end of file diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/docblock.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/docblock.tpl new file mode 100644 index 00000000..09a603f8 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/docblock.tpl @@ -0,0 +1,15 @@ +{if $sdesc != ''}{$sdesc|default:''}<br /><br />{/if} +{if $desc != ''}{$desc|default:''}<br />{/if} +{if count($tags) > 0} +<br /><br /> +<h4>Tags:</h4> +<div class="tags"> +<table border="0" cellspacing="0" cellpadding="0"> +{section name=tag loop=$tags} + <tr> + <td><b>{$tags[tag].keyword}:</b>  </td><td>{$tags[tag].data}</td> + </tr> +{/section} +</table> +</div> +{/if} \ No newline at end of file diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/elementindex.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/elementindex.tpl new file mode 100644 index 00000000..175a5136 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/elementindex.tpl @@ -0,0 +1,5 @@ +{include file="header.tpl" noleftindex=true} +<a name="top"></a> +<h1>Index of all elements</h1> +{include file="basicindex.tpl" indexname="elementindex"} +{include file="footer.tpl"} diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/errors.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/errors.tpl new file mode 100644 index 00000000..1576a822 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/errors.tpl @@ -0,0 +1,21 @@ +{include file="header.tpl" noleftindex=true} +{section name=files loop=$files} +<a href="#{$files[files].file}">{$files[files].file}</a><br> +{/section} +{foreach key=file item=issues from=$all} +<a name="{$file}"></a> +<h1>{$file}</h1> +{if count($issues.warnings)} +<h2>Warnings:</h2><br> +{section name=warnings loop=$issues.warnings} +<b>{$issues.warnings[warnings].name}</b> - {$issues.warnings[warnings].listing}<br> +{/section} +{/if} +{if count($issues.errors)} +<h2>Errors:</h2><br> +{section name=errors loop=$issues.errors} +<b>{$issues.errors[errors].name}</b> - {$issues.errors[errors].listing}<br> +{/section} +{/if} +{/foreach} +{include file="footer.tpl"} diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/examplesource.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/examplesource.tpl new file mode 100644 index 00000000..fb85654b --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/examplesource.tpl @@ -0,0 +1,6 @@ +{include file="header.tpl" title=$title} +<h1 align="center">{$title}</h1> +<div class="php"> +{$source} +</div> +{include file="footer.tpl"} \ No newline at end of file diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/fileleft.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/fileleft.tpl new file mode 100644 index 00000000..50f108d7 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/fileleft.tpl @@ -0,0 +1,10 @@ +{foreach key=subpackage item=files from=$fileleftindex} + {if $subpackage != ""}subpackage <b>{$subpackage}</b><br>{/if} + <div class="package"> + {section name=files loop=$files} + {if $files[files].link != ''}<a href="{$files[files].link}">{/if} + {$files[files].title} + {if $files[files].link != ''}</a>{/if}<br> + {/section} + </div><br /> +{/foreach} diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/filesource.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/filesource.tpl new file mode 100644 index 00000000..b23076a0 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/filesource.tpl @@ -0,0 +1,8 @@ +{capture name="tutle"}File Source for {$name}{/capture} +{include file="header.tpl" title=$smarty.capture.tutle} +<h1 align="center">Source for file {$name}</h1> +<p>Documentation is available at {$docs}</p> +<div class="php"> +{$source} +</div> +{include file="footer.tpl"} \ No newline at end of file diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/footer.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/footer.tpl new file mode 100644 index 00000000..0bb7a7dd --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/footer.tpl @@ -0,0 +1,25 @@ + <!-- content end --></td></tr></table> + </td> + </tr> +</table> + +</div><!-- main --> + +<div id="footer"> + <a href="/tos/">Terms of Service</a> | + <a href="/support/">Contact Us</a> + <br/> + Copyright © 2006 by Prado Software Group.<br/> + <a title="Powered by PRADO" href="http://www.pradosoft.com/"><img src="http://www.pradosoft.com/images/powered.gif" style="border-width:0px;" alt="Powered by PRADO" /></a> +</div> + +</div><!-- page --> +<script src="http://www.google-analytics.com/urchin.js" type="text/javascript"> +</script> +<script type="text/javascript"> +_uacct = "UA-186303-3"; +urchinTracker(); +</script> + +</body> +</html> \ No newline at end of file diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/function.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/function.tpl new file mode 100644 index 00000000..098aeb17 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/function.tpl @@ -0,0 +1,48 @@ +{section name=func loop=$functions} +{if $show == 'summary'} +function {$functions[func].id}, {$functions[func].sdesc}<br /> +{else} + <hr /> + <a name="{$functions[func].function_dest}"></a> + <h3>{$functions[func].function_name} <span class="smalllinenumber">[line {if $functions[func].slink}{$functions[func].slink}{else}{$functions[func].line_number}{/if}]</span></h3> + <div class="function"> + <table width="90%" border="0" cellspacing="0" cellpadding="1"><tr><td class="code_border"> + <table width="100%" border="0" cellspacing="0" cellpadding="2"><tr><td class="code"> + <code>{$functions[func].function_return} {if $functions[func].ifunction_call.returnsref}&{/if}{$functions[func].function_name}( +{if count($functions[func].ifunction_call.params)} +{section name=params loop=$functions[func].ifunction_call.params} +{if $smarty.section.params.iteration != 1}, {/if}{if $functions[func].ifunction_call.params[params].default != ''}[{/if}{$functions[func].ifunction_call.params[params].type} {$functions[func].ifunction_call.params[params].name}{if $functions[func].ifunction_call.params[params].default != ''} = {$functions[func].ifunction_call.params[params].default|escape:"html"}]{/if} +{/section} +{/if})</code> + </td></tr></table> + </td></tr></table><br /> + + {include file="docblock.tpl" sdesc=$functions[func].sdesc desc=$functions[func].desc tags=$functions[func].tags} + <br /><br /> + {if $functions[func].function_conflicts.conflict_type} + <p><b>Conflicts with functions:</b> + {section name=me loop=$functions[func].function_conflicts.conflicts} + {$functions[func].function_conflicts.conflicts[me]}<br /> + {/section} + </p> + {/if} +{* original {if $functions[func].function_conflicts != "" + <b>Conflicts:</b> {$functions[func].function_conflicts<br /><br /> + {/if *} + + {if count($functions[func].params) > 0} + <h4>Parameters</h4> + <table border="0" cellspacing="0" cellpadding="0"> + {section name=params loop=$functions[func].params} + <tr> + <td class="type">{$functions[func].params[params].datatype}  </td> + <td><b>{$functions[func].params[params].var}</b>  </td> + <td>{$functions[func].params[params].data}</td> + </tr> + {/section} + </table> + {/if} + <div class="top">[ <a href="#top">Top</a> ]</div><br /><br /> + </div> +{/if} +{/section} diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/global.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/global.tpl new file mode 100644 index 00000000..1053f748 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/global.tpl @@ -0,0 +1,40 @@ +{if count($globals) > 0} +{section name=glob loop=$globals} +{if $show == 'summary'} +global variable <a href="{$globals[glob].id}">{$globals[glob].global_name}</a> = {$globals[glob].global_value}, {$globals[glob].sdesc}<br> +{else} + <hr /> + <a name="{$globals[glob].global_link}"></a> + <h4><i>{$globals[glob].global_type}</i> {$globals[glob].global_name} <span class="smalllinenumber">[line {if $globals[glob].slink}{$globals[glob].slink}{else}{$globals[glob].line_number}{/if}]</span></h4> + <div class="tags"> + {if $globals[glob].sdesc != ""} + {include file="docblock.tpl" sdesc=$globals[glob].sdesc desc=$globals[glob].desc tags=$globals[glob].tags} + {/if} + + <table border="0" cellspacing="0" cellpadding="0"> + <tr> + <td><b>Default value:</b>  </td> + <td>{$globals[glob].global_value|replace:" ":" "|replace:"\n":"<br />\n"|replace:"\t":"   "}</td> + </tr> + {if $globals[glob].global_conflicts.conflict_type} + <tr> + <td><b>Conflicts with globals:</b>  </td> + <td> + {section name=me loop=$globals[glob].global_conflicts.conflicts} + {$globals[glob].global_conflicts.conflicts[me]}<br /> + {/section} + </td> + </tr> + {/if} +{* original {if $globals[glob].global_conflicts != "" + <tr> + <td><b>Conflicts:</b>  </td> + <td>{$globals[glob].global_conflicts</td> + </tr> + {/if *} + </table> + </div><br /><br /> + <div class="top">[ <a href="#top">Top</a> ]</div><br /><br /> +{/if} +{/section} +{/if} \ No newline at end of file diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/header.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/header.tpl new file mode 100644 index 00000000..b35b0f57 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/header.tpl @@ -0,0 +1,121 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" > + +<head> +<title>PRADO API Manual: {$title} + + + + + + + + + + + + + + + + + +
        + + + +
        + + + + + + +
        +{if count($ric) >= 1} +
        + {section name=ric loop=$ric} +

        {$ric[ric].name}

        + {/section} +
        +{/if} + Packages:
        + {section name=packagelist loop=$packageindex} + {$packageindex[packagelist].title}
        + {/section} +

        +{if $tutorials} + Tutorials/Manuals:
        + {if $tutorials.pkg} + Package-level: + {section name=ext loop=$tutorials.pkg} + {$tutorials.pkg[ext]} + {/section} + {/if} + {if $tutorials.cls} + Class-level: + {section name=ext loop=$tutorials.cls} + {$tutorials.cls[ext]} + {/section} + {/if} + {if $tutorials.proc} + Procedural-level: + {section name=ext loop=$tutorials.proc} + {$tutorials.proc[ext]} + {/section} + {/if} +{/if} + {if !$noleftindex}{assign var="noleftindex" value=false}{/if} + {if !$noleftindex} +{* +{if $compiledfileindex} + Files:
        + {eval var=$compiledfileindex} + {/if} +*} + {if $compiledclassindex} + Classes:
        + {eval var=$compiledclassindex} + {/if} + {/if} +
        + + +
        +
        + Keyword + +
        +
        +{* +{if !$hasel}{assign var="hasel" value=false}{/if} +{if $hasel} +

        {$eltype|capitalize}: {$class_name}

        +Source Location: {$source_location}

        +{/if} +*} diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/include.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/include.tpl new file mode 100644 index 00000000..cff067db --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/include.tpl @@ -0,0 +1,9 @@ +{if count($includes) > 0} +

        Includes:

        +
        +{section name=includes loop=$includes} +{$includes[includes].include_name}({$includes[includes].include_value}) [line {if $includes[includes].slink}{$includes[includes].slink}{else}{$includes[includes].line_number}{/if}]
        +{include file="docblock.tpl" sdesc=$includes[includes].sdesc desc=$includes[includes].desc tags=$includes[includes].tags} +{/section} +
        +{/if} \ No newline at end of file diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/index.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/index.tpl new file mode 100644 index 00000000..60c74b47 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/index.tpl @@ -0,0 +1,7 @@ +{include file="header.tpl"} +{if $contents} +{$contents} +{else} +{include file="blank.tpl"} +{/if} +{include file="footer.tpl"} diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/media/background.png b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/media/background.png new file mode 100644 index 00000000..d6f36f60 Binary files /dev/null and b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/media/background.png differ diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/media/empty.png b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/media/empty.png new file mode 100644 index 00000000..a9f29bb1 Binary files /dev/null and b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/media/empty.png differ diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/media/style.css b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/media/style.css new file mode 100644 index 00000000..9419ca62 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/media/style.css @@ -0,0 +1,197 @@ +.php { + padding: 1em; +} +/* This will not be executed by IE, so now we have a fix! */ +*[class="php-src"], *[class="php"], *[class="listing"] { + line-height: 0px; +} + +body +{ + color: #000000; + background-color: #ffffff; + background-image: url("background.png"); + background-repeat: repeat-y; + font-family: tahoma, verdana, arial, sans-serif; + font-size: 10pt; + margin: 0; + padding: 0; +} + +a +{ + color: #000099; + background-color: transparent; + text-decoration: none; +} + +a:hover +{ + text-decoration: underline; +} + +a.menu +{ + color: #ffffff; + background-color: transparent; +} + +td +{ + font-size: 10pt; +} + +td.header_top +{ + color: #ffffff; + background-color: #9999cc; + font-size: 16pt; + font-weight: bold; + text-align: right; + padding: 10px; +} + +td.header_line +{ + color: #ffffff; + background-color: #333366; +} + +td.header_menu +{ + color: #ffffff; + background-color: #666699; + font-size: 8pt; + text-align: right; + padding: 2px; + padding-right: 5px; +} + +td.menu +{ + padding: 2px; + padding-left: 5px; +} + +td.code_border +{ + color: #000000; + background-color: #c0c0c0; +} + +td.code +{ + color: #000000; + background-color: #f0f0f0; +} + +td.type +{ + font-style: italic; +} + +div.credit +{ + font-size: 8pt; + text-align: center; +} + +div.package +{ + padding-left: 5px; +} + +div.tags +{ + padding-left: 15px; +} + +div.function +{ + padding-left: 15px; +} + +div.top +{ + font-size: 8pt; +} + +div.warning +{ + color: #ff0000; + background-color: transparent; +} + +div.description +{ + padding-left: 15px; +} + +hr +{ + height: 1px; + border-style: solid; + border-color: #c0c0c0; + margin-top: 10px; + margin-bottom: 10px; +} + +span.smalllinenumber +{ + font-size: 8pt; +} + +ul { + margin-left: 0px; + padding-left: 8px; +} +/* Syntax highlighting */ + +.src-code { background-color: #f5f5f5; border: 1px solid #ccc9a4; padding: 0px; margin : 0px} +/*.src-code pre { }*/ + +.src-comm { color: green; } +.src-id { } +.src-inc { color: #0000FF; } +.src-key { color: #0000FF; } +.src-num { color: #CC0000; } +.src-str { color: #66cccc; } +.src-sym { font-weight: bold; } +.src-var { } + +.src-php { font-weight: bold; } + +.src-doc { color: #009999 } +.src-doc-close-template { color: #0000FF } +.src-doc-coretag { color: #0099FF; font-weight: bold } +.src-doc-inlinetag { color: #0099FF } +.src-doc-internal { color: #6699cc } +.src-doc-tag { color: #0080CC } +.src-doc-template { color: #0000FF } +.src-doc-type { font-style: italic } +.src-doc-var { font-style: italic } + +.tute-tag { color: #009999 } +.tute-attribute-name { color: #0000FF } +.tute-attribute-value { color: #0099FF } +.tute-entity { font-weight: bold; } +.tute-comment { font-style: italic } +.tute-inline-tag { color: #636311; font-weight: bold } + +/* tutorial */ + +.authors { } +.author { font-style: italic; font-weight: bold } +.author-blurb { margin: .5em 0em .5em 2em; font-size: 85%; font-weight: normal; font-style: normal } +.example { border: 1px dashed #999999; background-color: #EEEEEE; padding: .5em; } +.listing { border: 1px dashed #999999; background-color: #EEEEEE; padding: .5em; white-space: nowrap; } +.release-info { font-size: 85%; font-style: italic; margin: 1em 0em } +.ref-title-box { } +.ref-title { } +.ref-purpose { font-style: italic; color: #666666 } +.ref-synopsis { } +.title { font-weight: bold; margin: 1em 0em 0em 0em; padding: .25em; border: 2px solid #999999; background-color: #9999CC } +.cmd-synopsis { margin: 1em 0em } +.cmd-title { font-weight: bold } +.toc { margin-left: 2em; padding-left: 0em } + diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/method.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/method.tpl new file mode 100644 index 00000000..07cb76e5 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/method.tpl @@ -0,0 +1,58 @@ +{section name=methods loop=$methods} +{if $show == 'summary'} +method {$methods[methods].function_call}, {$methods[methods].sdesc}
        +{else} +
        + +

        {if $methods[methods].ifunction_call.constructor}constructor {elseif $methods[methods].ifunction_call.destructor}destructor {else}method {/if}{$methods[methods].function_name} [line {if $methods[methods].slink}{$methods[methods].slink}{else}{$methods[methods].line_number}{/if}]

        +
        +
        +
        + {$methods[methods].function_return} {if $methods[methods].ifunction_call.returnsref}&{/if}{$methods[methods].function_name}( +{if count($methods[methods].ifunction_call.params)} +{section name=params loop=$methods[methods].ifunction_call.params} +{if $smarty.section.params.iteration != 1}, {/if} +{if $methods[methods].ifunction_call.params[params].default != ''}[{/if}{$methods[methods].ifunction_call.params[params].type} +{$methods[methods].ifunction_call.params[params].name}{if $methods[methods].ifunction_call.params[params].default != ''} = {$methods[methods].ifunction_call.params[params].default}]{/if} +{/section} +{/if}) +
        +

        + + {include file="docblock.tpl" sdesc=$methods[methods].sdesc desc=$methods[methods].desc tags=$methods[methods].tags}

        + +{if $methods[methods].descmethod} +

        Overridden in child classes as:
        + {section name=dm loop=$methods[methods].descmethod} +

        +
        {$methods[methods].descmethod[dm].link}
        +
        {$methods[methods].descmethod[dm].sdesc}
        +
        + {/section}

        +{/if} +{* original {if $methods[methods].descmethod != "" + {$methods[methods].descmethod

        + {/if *} +{if $methods[methods].method_overrides}Overrides {$methods[methods].method_overrides.link} ({$methods[methods].method_overrides.sdesc|default:"parent method not documented"})

        {/if} +{* original {if $methods[methods].method_overrides != "" + {$methods[methods].method_overrides

        + {/if *} + + {if count($methods[methods].params) > 0} +

        Parameters:

        +
        + + {section name=params loop=$methods[methods].params} + + + + + + {/section} +
        {$methods[methods].params[params].datatype}  {$methods[methods].params[params].var}  {$methods[methods].params[params].data}
        +

        + {/if} +
        [ Top ]
        +
        +{/if} +{/section} diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/packages.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/packages.tpl new file mode 100644 index 00000000..b48b6719 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/packages.tpl @@ -0,0 +1,3 @@ +{section name=packages loop=$packages} +{$packages[packages].title} +{/section} \ No newline at end of file diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/page.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/page.tpl new file mode 100644 index 00000000..6dd8683d --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/page.tpl @@ -0,0 +1,31 @@ +{include file="header.tpl" eltype="Procedural file" class_name=$name hasel=true contents=$pagecontents} + +
        +
        + +{if $classes} +
        +{if $tutorial} +Main Tutorial: {$tutorial} +{/if} +

        Classes:

        +{section name=classes loop=$classes} +
        {$classes[classes].link}
        +
        {$classes[classes].sdesc}
        +{/section} +


        +{/if} + +

        Page Details:

        +{include file="docblock.tpl" type="page"} +

        +{include file="include.tpl"} +

        +{include file="global.tpl"} +

        +{include file="define.tpl"} +
        +{include file="function.tpl"} + +{include file="footer.tpl"} + diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/pkgelementindex.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/pkgelementindex.tpl new file mode 100644 index 00000000..753ad7cf --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/pkgelementindex.tpl @@ -0,0 +1,5 @@ +{include file="header.tpl"} + +

        Element index for package {$package}

        +{include file="basicindex.tpl" indexname=elementindex_$package} +{include file="footer.tpl"} diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/ric.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/ric.tpl new file mode 100644 index 00000000..c4cb83f9 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/ric.tpl @@ -0,0 +1,6 @@ +{include file="header.tpl"} +

        {$name}

        +
        +{$contents|htmlentities}
        +
        +{include file="footer.tpl"} \ No newline at end of file diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/todolist.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/todolist.tpl new file mode 100644 index 00000000..5ab0bca2 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/todolist.tpl @@ -0,0 +1,14 @@ +{include file="header.tpl" title="Todo List"} +

        Todo List

        +{foreach from=$todos key=todopackage item=todo} +

        {$todopackage}

        +{section name=todo loop=$todo} +

        {$todo[todo].link}

        +
          +{section name=t loop=$todo[todo].todos} +
        • {$todo[todo].todos[t]}
        • +{/section} +
        +{/section} +{/foreach} +{include file="footer.tpl"} \ No newline at end of file diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/tutorial.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/tutorial.tpl new file mode 100644 index 00000000..22c71c3b --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/tutorial.tpl @@ -0,0 +1,32 @@ +{include file="header.tpl" title=$title} +{if $nav} + + + + + + +
        {if $prev}{/if}Prev{if $prev}{/if}{if $next}{/if}Next{if $next}{/if}
        +{/if} +{$contents} +{if $nav} + + + + + + + + + + + + +
        {if $prev}{/if} +Prev{if $prev}{/if}{if $up}Up{else} {/if}{if $next}{/if}Next{if $next}{/if}
        {if $prevtitle}{$prevtitle}{/if}{if $uptitle}{$uptitle}{/if}{if $nexttitle}{$nexttitle}{/if}
        +{/if} +{include file="footer.tpl"} \ No newline at end of file diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/tutorial_toc.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/tutorial_toc.tpl new file mode 100644 index 00000000..1db34438 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/tutorial_toc.tpl @@ -0,0 +1,29 @@ +{if count($toc)} +

        Table of Contents

        +
          +{section name=toc loop=$toc} +{if $toc[toc].tagname == 'refsect1'} +{assign var="context" value="refsect1"} +{$toc[toc].link}
          +{/if} +{if $toc[toc].tagname == 'refsect2'} +{assign var="context" value="refsect2"} +   {$toc[toc].link}
          +{/if} +{if $toc[toc].tagname == 'refsect3'} +{assign var="context" value="refsect3"} +      {$toc[toc].link}
          +{/if} +{if $toc[toc].tagname == 'table'} +{if $context == 'refsect2'}   {/if} +{if $context == 'refsect3'}   {/if} +Table: {$toc[toc].link} +{/if} +{if $toc[toc].tagname == 'example'} +{if $context == 'refsect2'}   {/if} +{if $context == 'refsect3'}   {/if} +Table: {$toc[toc].link} +{/if} +{/section} +
        +{/if} \ No newline at end of file diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/tutorial_tree.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/tutorial_tree.tpl new file mode 100644 index 00000000..faf7bcef --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/tutorial_tree.tpl @@ -0,0 +1,5 @@ + + diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/var.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/var.tpl new file mode 100644 index 00000000..c76929fe --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/Smarty/templates/PradoSoft/templates/var.tpl @@ -0,0 +1,28 @@ +{section name=vars loop=$vars} +{if $show == 'summary'} + var {$vars[vars].var_name}, {$vars[vars].sdesc}
        +{else} + +

        +

        {$vars[vars].var_name} = {$vars[vars].var_default|replace:"\n":"
        \n"|replace:" ":" "|replace:"\t":"   "}

        +

        [line {if $vars[vars].slink}{$vars[vars].slink}{else}{$vars[vars].line_number}{/if}]

        + {include file="docblock.tpl" sdesc=$vars[vars].sdesc desc=$vars[vars].desc tags=$vars[vars].tags} + +
        +
        + + + + + + {if $vars[vars].var_overrides != ""} + + + + + {/if} +
        Type:  {$vars[vars].var_type}
        Overrides:  {$vars[vars].var_overrides}
        +


        +
        [ Top ]

        +{/if} +{/section} diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/HTMLframesConverter.inc b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/HTMLframesConverter.inc new file mode 100644 index 00000000..d1b8751c --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/HTMLframesConverter.inc @@ -0,0 +1,1747 @@ + + * @since 1.0rc1 + * @version $Id: HTMLframesConverter.inc,v 1.1 2005/10/17 18:37:03 jeichorn Exp $ + */ +/** + * HTML output converter. + * This Converter takes output from the {@link Parser} and converts it to HTML-ready output for use with {@link Smarty}. + * + * @package Converters + * @subpackage HTMLframes + * @see parserDocBlock, parserInclude, parserPage, parserClass, parserDefine, parserFunction, parserMethod, parserVar + * @author Greg Beaver + * @since 1.2 + * @version $Id: HTMLframesConverter.inc,v 1.1 2005/10/17 18:37:03 jeichorn Exp $ + */ +class HTMLframesConverter extends Converter +{ + /** + * Smarty Converter wants elements sorted by type as well as alphabetically + * @see Converter::$sort_page_contents_by_type + * @var boolean + */ + var $sort_page_contents_by_type = true; + /** @var string */ + var $outputformat = 'HTML'; + /** @var string */ + var $name = 'frames'; + /** + * indexes of elements by package that need to be generated + * @var array + */ + var $leftindex = array('classes' => true, 'pages' => true, 'functions' => true, 'defines' => false, 'globals' => false); + + /** + * output directory for the current procedural page being processed + * @var string + */ + var $page_dir; + + /** + * target directory passed on the command-line. + * {@link $targetDir} is malleable, always adding package/ and package/subpackage/ subdirectories onto it. + * @var string + */ + var $base_dir; + + /** + * output directory for the current class being processed + * @var string + */ + var $class_dir; + + /** + * array of converted package page names. + * Used to link to the package page in the left index + * @var array Format: array(package => 1) + */ + var $package_pages = array(); + + /** + * controls formatting of parser informative output + * + * Converter prints: + * "Converting /path/to/file.php... Procedural Page Elements... Classes..." + * Since HTMLdefaultConverter outputs files while converting, it needs to send a \n to start a new line. However, if there + * is more than one class, output is messy, with multiple \n's just between class file output. This variable prevents that + * and is purely cosmetic + * @var boolean + */ + var $juststarted = false; + + /** + * contains all of the template procedural page element loop data needed for the current template + * @var array + */ + var $current; + + /** + * contains all of the template class element loop data needed for the current template + * @var array + */ + var $currentclass; + var $wrote = false; + var $ric_set = array(); + + /** + * sets {@link $base_dir} to $targetDir + * @see Converter() + */ + function HTMLframesConverter(&$allp, &$packp, &$classes, &$procpages, $po, $pp, $qm, $targetDir, $templateDir, $title) + { + Converter::Converter($allp, $packp, $classes, $procpages,$po, $pp, $qm, $targetDir, $templateDir, $title); + $this->base_dir = $targetDir; + } + + /** + * @deprecated in favor of PHP 4.3.0+ tokenizer-based source highlighting + */ + function unmangle($sourcecode) + { + $sourcecode = str_replace('','
        ',$sourcecode);
        +        $sourcecode = str_replace('','
        ',$sourcecode); + $sourcecode = str_replace('
        ',"\n",$sourcecode); + $sourcecode = str_replace(' ',' ',$sourcecode); + $sourcecode = str_replace('<','<',$sourcecode); + $sourcecode = str_replace('>','>',$sourcecode); + $sourcecode = str_replace('&','&',$sourcecode); + return $sourcecode; + } + + /** + * @param string full path to the source file + * @param string fully highlighted source code + */ + function writeSource($path, $value) + { + $templ = &$this->newSmarty(); + $pathinfo = $this->proceduralpages->getPathInfo($path, $this); + $templ->assign('source',$value); + $templ->assign('package',$pathinfo['package']); + $templ->assign('subpackage',$pathinfo['subpackage']); + $templ->assign('name',$pathinfo['name']); + $templ->assign('source_loc',$pathinfo['source_loc']); + $templ->assign('docs',$pathinfo['docs']); + $templ->assign("subdir",'../'); + $templ->register_outputfilter('HTMLframes_outputfilter'); + $this->setTargetDir($this->getFileSourcePath($this->base_dir)); + phpDocumentor_out("\n"); + $this->setSourcePaths($path); + $this->writefile($this->getFileSourceName($path).'.html',$templ->fetch('filesource.tpl')); + } + + function writeExample($title, $path, $source) + { + $templ = &$this->newSmarty(); + $templ->assign('source',$source); + if (empty($title)) + { + $title = 'example'; + addWarning(PDERROR_EMPTY_EXAMPLE_TITLE, $path, $title); + } + $templ->assign('title',$title); + $templ->assign('file',$path); + $templ->assign("subdir",'../'); + $templ->register_outputfilter('HTMLframes_outputfilter'); + $this->setTargetDir($this->base_dir . PATH_DELIMITER . '__examplesource'); + phpDocumentor_out("\n"); + $this->writefile('exsource_'.$path.'.html',$templ->fetch('examplesource.tpl')); + } + + function getExampleLink($path, $title) + { + return $this->returnLink('{$subdir}__examplesource' . PATH_DELIMITER . 'exsource_'.$path.'.html',$title); + } + + function getSourceLink($path) + { + return $this->returnLink($this->getFileSourcePath('{$subdir}') . + PATH_DELIMITER . $this->getFileSourceName($path).'.html','Source Code for this file'); + } + + /** + * Return a line of highlighted source code with formatted line number + * + * If the $path is a full path, then an anchor to the line number will be + * added as well + * @param integer line number + * @param string highlighted source code line + * @param false|string full path to @filesource file this line is a part of, + * if this is a single line from a complete file. + * @return string formatted source code line with line number + */ + function sourceLine($linenumber, $line, $path = false) + { + $extra = ''; + if (strlen(str_replace("\n", '', $line)) == 0) { + $extra = ' '; + } + if ($path) + { + return '
      • ' . $this->getSourceAnchor($path, $linenumber) . + str_replace("\n",'',$line) . $extra . + "
      • \n"; + } else + { + return '
      • ' . str_replace("\n",'',$line) . "$extra
      • \n"; + } + } + + /** + * Used to convert the <> tag in a docblock + * @param string + * @param boolean + * @return string + */ + function ProgramExample($example, $tutorial = false, $inlinesourceparse = null/*false*/, + $class = null/*false*/, $linenum = null/*false*/, $filesourcepath = null/*false*/) + { + return '
          ' . parent::ProgramExample($example, $tutorial, $inlinesourceparse, $class, $linenum, $filesourcepath) + .'
        '; + } + + /** + * @param string + */ + function TutorialExample($example) + { + $trans = $this->template_options['desctranslate']; + $this->template_options['desctranslate'] = array(); + $example = '
          ' . parent::TutorialExample($example) + .'
        '; + $this->template_options['desctranslate'] = $trans; + if (!isset($this->template_options['desctranslate'])) return $example; + if (!isset($this->template_options['desctranslate']['code'])) return $example; + $example = $this->template_options['desctranslate']['code'] . $example; + if (!isset($this->template_options['desctranslate']['/code'])) return $example; + return $example . $this->template_options['desctranslate']['/code']; + } + + /** + * Retrieve a Converter-specific anchor to a segment of a source code file + * parsed via a {@tutorial tags.filesource.pkg} tag. + * @param string full path to source file + * @param string name of anchor + * @param string link text, if this is a link + * @param boolean returns either a link or a destination based on this + * parameter + * @return string link to an anchor, or the anchor + */ + function getSourceAnchor($sourcefile,$anchor,$text = '',$link = false) + { + if ($link) + return $this->returnLink($this->getFileSourcePath('{$subdir}') . + PATH_DELIMITER . $this->getFileSourceName($sourcefile).'.html#a'.$anchor, $text); + else + return ''; + } + + function getCurrentPageLink() + { + return $this->curname . '.html'; + } + + /** + * Uses htmlspecialchars() on the input + */ + function postProcess($text) + { + return htmlspecialchars($text); + } + + /** + * Use the template tutorial_toc.tpl to generate a table of contents for HTML + * @return string table of contents formatted for use in the current output format + * @param array format: array(array('tagname' => section, 'link' => returnsee link, 'id' => anchor name, 'title' => from title tag),...) + */ + function formatTutorialTOC($toc) + { + $template = &$this->newSmarty(); + $template->assign('toc',$toc); + return $template->fetch('tutorial_toc.tpl'); + } + + function &SmartyInit(&$templ) + { + if (!isset($this->package_index)) + foreach($this->all_packages as $key => $val) + { + if (isset($this->pkg_elements[$key])) + { + if (!isset($start)) $start = $key; + $this->package_index[] = array('link' => "li_$key.html", 'title' => $key); + } + } + $templ->assign("packageindex",$this->package_index); + $templ->assign("subdir",''); + return $templ; + } + + /** + * Writes out the template file of {@link $class_data} and unsets the template to save memory + * @see registerCurrentClass() + * @see parent::endClass() + */ + function endClass() + { + $a = '../'; + if (!empty($this->subpackage)) $a .= '../'; + if ($this->juststarted) + { + $this->juststarted = false; + phpDocumentor_out("\n"); + flush(); + } + $this->setTargetDir($this->base_dir . PATH_DELIMITER . $this->class_dir); + $this->class_data->assign("subdir",$a); + $this->class_data->register_outputfilter('HTMLframes_outputfilter'); + $this->writefile($this->class . '.html',$this->class_data->fetch('class.tpl')); + unset($this->class_data); + } + + /** + * Writes out the template file of {@link $page_data} and unsets the template to save memory + * @see registerCurrent() + * @see parent::endPage() + */ + function endPage() + { + $this->package = $this->curpage->package; + $this->subpackage = $this->curpage->subpackage; + $a = '../'; + if (!empty($this->subpackage)) $a .= '../'; + $this->setTargetDir($this->base_dir . PATH_DELIMITER . $this->page_dir); + $this->page_data->assign("package",$this->package); + $this->page_data->assign("subdir",$a); + $this->page_data->register_outputfilter('HTMLframes_outputfilter'); + $this->writefile($this->page . '.html',$this->page_data->fetch('page.tpl')); + unset($this->page_data); + } + + /** + * @param string + * @param string + * @return string <a href="'.$link.'">'.$text.''.$text.''; + } + + function makeLeft() + { + foreach($this->page_elements as $package => $o1) + { + foreach($o1 as $subpackage => $links) + { + for($i=0;$i $this->getId($links[$i]), "title" => $links[$i]->name); + } + } + } + foreach($this->class_elements as $package => $o1) + { + foreach($o1 as $subpackage => $links) + { + for($i=0;$iclasses->getClassByPackage($links[$i]->name, $links[$i]->package); + if ($class && isset($class->docblock) && $class->docblock->hasaccess) + $left[$package][$subpackage]['classes'][] = + array("link" => $this->getId($links[$i]), + "title" => $links[$i]->name, + "access" => $class->docblock->tags['access'][0]->value, + "abstract" => isset ($class->docblock->tags['abstract'][0])); + else + $left[$package][$subpackage]['classes'][] = + array("link" => $this->getId($links[$i]), + "title" => $links[$i]->name, + "access" => 'public', + "abstract" => isset ($class->docblock->tags['abstract'][0])); + } + } + } + foreach($this->function_elements as $package => $o1) + { + foreach($o1 as $subpackage => $links) + { + for($i=0;$i $this->getId($links[$i]), "title" => $links[$i]->name); + } + } + } + $ret = array(); + foreach($left as $package => $r) + { + $pd = 'blank'; + if (isset($this->package_pages[$package])) $pd = $package.'/package_'.$package.'.html'; + if (!isset($r[''])) + { + $pt = false; + $ptnoa = false; + $ptt = $package; + if ($t = $this->hasTutorial('pkg',$package,$package,'')) + { + $pt = $t->getLink($this); + $ptnoa = $this->getId($t->getLink($this,true)); + $ptt = $t->getTitle($this); + } + $tutes = array(); + foreach($this->tutorial_tree as $root => $tr) + { + if ($tr['tutorial']->package == $package && $tr['tutorial']->subpackage == $subpackage) + $tutes[$tr['tutorial']->tutorial_type][] = $this->getTutorialTree($tr['tutorial']); + } + if (isset($this->childless_tutorials[$package][$subpackage])) + { + foreach($this->childless_tutorials[$package][$subpackage] as $ext => $other) + { + foreach($other as $tutorial) + { + $tutes[$tutorial->tutorial_type][] = $this->getTutorialTree($tutorial); + } + } + } + $ret[$package][] = + array( + 'package' => $package, + 'subpackage' => '', + 'packagedoc' => $pd, + 'packagetutorial' => $pt, + 'packagetutorialnoa' => $ptnoa, + 'packagetutorialtitle' => $ptt, + 'files' => array(), + 'functions' => array(), + 'classes' => array(), + 'tutorials' => $tutes, + ); + } + foreach($r as $subpackage => $info) + { + $my = array(); + $my['package'] = $package; + if (isset($this->package_pages[$package])) + $my['packagedoc'] = $pd; + else + $my['packagedoc'] = 'blank'; + $my['subpackage'] = $subpackage; + if (empty($subpackage)) + { + if ($t = $this->hasTutorial('pkg',$package,$package,$subpackage)) + { + $my['packagetutorial'] = $t->getLink($this); + $my['packagetutorialnoa'] = $this->getId($t->getLink($this,true)); + $my['packagetutorialtitle'] = $t->getTitle($this); + } else + { + $my['packagetutorial'] = 'No Package-Level Tutorial'; + $my['packagetutorialnoa'] = 'blank.html'; + $my['packagetutorialtitle'] = $package; + } + } else + { + if ($t = $this->hasTutorial('pkg',$subpackage,$package,$subpackage)) + { + $my['subpackagetutorial'] = $this->returnSee($this->getTutorialLink($t)); + $my['subpackagetutorialnoa'] = $this->getId($t->getLink($this,true)); + $my['subpackagetutorialtitle'] = $t->getTitle($this); + } else + { + $my['subpackagetutorial'] = false; + $my['subpackagetutorialnoa'] = false; + $my['subpackagetutorialtitle'] = $subpackage; + } + } + $tutes = array(); + foreach($this->tutorial_tree as $root => $tr) + { + if ($tr['tutorial']->package == $package && $tr['tutorial']->subpackage == $subpackage) + { + $tutes[$tr['tutorial']->tutorial_type][] = $this->getTutorialTree($tr['tutorial']); + } + } + $my['tutorials'] = $tutes; + $my['files'] = $my['classes'] = $my['functions'] = array(); + if (isset($info['files'])) + $my['files'] = $info['files']; + if (isset($info['classes'])) + $my['classes'] = $info['classes']; + if (isset($info['functions'])) + $my['functions'] = $info['functions']; + $ret[$package][] = $my; + } + } + return $ret; + } + + function getTutorialTree($tutorial,$k = false) + { + $ret = ''; + if (is_object($tutorial)) $tree = parent::getTutorialTree($tutorial); else $tree = $tutorial; +// debug($this->vardump_tree($tree));exit; + if (!$tree) + { + $template = &$this->newSmarty(); + $template->assign('subtree',false); + $template->assign('name',str_replace('.','',$tutorial->name)); + $template->assign('parent',false); + $template->assign('haskids',false); + $template->assign('kids',''); + $link = new tutorialLink; + $t = $tutorial; + $link->addLink('',$t->path,$t->name,$t->package,$t->subpackage,$t->getTitle($this)); + $main = array('link' => $this->getId($link), 'title' => $link->title); + $template->assign('main',$main); + return $template->fetch('tutorial_tree.tpl'); + } + if (isset($tree['kids'])) + { + foreach($tree['kids'] as $subtree) + { + $ret .= $this->getTutorialTree($subtree, true); + } + } + $template = &$this->newSmarty(); + $template->assign('subtree',$k); + $template->assign('name',str_replace('.','',$tree['tutorial']->name)); + $template->assign('parent',($k ? str_replace('.','',$tree['tutorial']->parent->name) : false)); + $template->assign('haskids',strlen($ret)); + $template->assign('kids',$ret); + $link = new tutorialLink; + $t = $tree['tutorial']; + $link->addLink('',$t->path,$t->name,$t->package,$t->subpackage,$t->getTitle($this)); + $main = array('link' => $this->getId($link), 'title' => $link->title); + $template->assign('main',$main); + $ret = $template->fetch('tutorial_tree.tpl'); + return $ret; + } + + /** + * HTMLdefaultConverter chooses to format both package indexes and the complete index here + * + * This function formats output for the elementindex.html and pkgelementindex.html template files. It then + * writes them to the target directory + * @see generateElementIndex(), generatePkgElementIndex() + */ + function formatPkgIndex() + { + list($package_indexes,$packages,$mletters) = $this->generatePkgElementIndexes(); + for($i=0;$inewSmarty(); + $this->package = $package_indexes[$i]['package']; + $this->subpackage = ''; + $template->assign("index",$package_indexes[$i]['pindex']); + $template->assign("package",$package_indexes[$i]['package']); + $template->assign("letters",$mletters[$package_indexes[$i]['package']]); + $template->register_outputfilter('HTMLframes_outputfilter'); + $this->setTargetDir($this->base_dir); + $this->writefile('elementindex_'.$package_indexes[$i]['package'].'.html',$template->fetch('pkgelementindex.tpl')); + } + phpDocumentor_out("\n"); + flush(); + } + + /** + * HTMLdefaultConverter uses this function to format template index.html and packages.html + * + * This function generates the package list from {@link $all_packages}, eliminating any + * packages that don't have any entries in their package index (no files at all, due to @ignore + * or other factors). Then it uses the default package name as the first package index to display. + * It sets the right pane to be either a blank file with instructions on making package-level docs, + * or the package-level docs for the default package. + * @global string Used to set the starting package to display + */ + function formatIndex() + { + global $phpDocumentor_DefaultPackageName; + list($elindex,$mletters) = $this->generateElementIndex(); + $template = &$this->newSmarty(); + $template->assign("index",$elindex); + $template->assign("letters",$mletters); + $template->register_outputfilter('HTMLframes_outputfilter'); + phpDocumentor_out("\n"); + flush(); + $this->setTargetDir($this->base_dir); + $this->writefile('elementindex.html',$template->fetch('elementindex.tpl')); + usort($this->package_index,"HTMLframes_pindexcmp"); + $index = &$this->newSmarty(); + foreach($this->all_packages as $key => $val) + { + if (isset($this->pkg_elements[$key])) + { + if (!isset($start)) $start = $key; + if (!isset($this->package_pages[$key])) $this->writeNewPPage($key); + } + } + // Created index.html + if (isset($this->pkg_elements[$phpDocumentor_DefaultPackageName])) $start = $phpDocumentor_DefaultPackageName; + $this->package = $start; + $this->subpackage = ''; + $index->assign("package_count",count($this->pkg_elements)); + if (count($this->ric_set)) + $index->assign("package_count",2); + $index->assign("date",date("r",time())); + $index->assign("title",$this->title); + $index->assign("start","li_$start.html"); + $index->register_outputfilter('HTMLframes_outputfilter'); + if (isset($this->tutorials[$start]['']['pkg'][$start . '.pkg'])) + { + $index->assign("blank",$start.'/tutorial_'.$start.'.pkg'); + } elseif (isset($this->package_pages[$start])) + { + $index->assign("blank",$start.'/package_'.$start); + } + else + { + $index->assign("blank","blank"); + $blank = &$this->newSmarty(); + $blank->assign('package',$phpDocumentor_DefaultPackageName); + $this->setTargetDir($this->base_dir); + $this->writefile("blank.html",$blank->fetch('blank.tpl')); + } + phpDocumentor_out("\n"); + flush(); + $this->setTargetDir($this->base_dir); + $this->writefile("index.html",$index->fetch('index.tpl')); + + // Create package index + $package = &$this->newSmarty(); + $package->assign('ric',array()); + if (isset($this->ric_set)) + { + foreach($this->ric_set as $name => $u) + { + $package->append('ric',array('file' => 'ric_'.$name.'.html','name' => $name)); + } + } + $package->assign("packages",$this->package_index); + $package->register_outputfilter('HTMLframes_outputfilter'); + $this->writefile("packages.html",$package->fetch('top_frame.tpl')); + unset($index); + } + + function writeNewPPage($key) + { + return; + $template = &$this->newSmarty(); + $this->package = $key; + $this->subpackage = ''; + $template->assign("date",date("r",time())); + $template->assign("title",$this->title); + $template->assign("package",$key); + $template->register_outputfilter('HTMLframes_outputfilter'); + phpDocumentor_out("\n"); + flush(); + $this->setTargetDir($this->base_dir); + + $this->writefile("li_$key.html",$template->fetch('index.tpl')); + unset($template); + } + + /** + * Generate indexes for li_package.html and classtree output files + * + * This function generates the li_package.html files from the template file left.html. It does this by + * iterating through each of the $page_elements, $class_elements and $function_elements arrays to retrieve + * the pre-sorted {@link abstractLink} descendants needed for index generation. Conversion of these links to + * text is done by {@link returnSee()}. The {@link $local} parameter is set to false to ensure that paths are correct. + * + * Then it uses {@link generateFormattedClassTrees()} to create class trees from the template file classtrees.html. Output + * filename is classtrees_packagename.html. This function also unsets {@link $elements} and {@link $pkg_elements} to free + * up the considerable memory these two class vars use + * @see $page_elements, $class_elements, $function_elements + */ + function formatLeftIndex() + { + phpDocumentor_out("\n"); + flush(); + $this->setTargetDir($this->base_dir); + if (0)//!isset($this->left)) + { + debug("Nothing parsed, check the command-line"); + die(); + } + $x = $this->makeLeft(); + foreach($this->all_packages as $package => $rest) + { + if (!isset($this->pkg_elements[$package])) continue; + $template = &$this->newSmarty(); + $template->assign("info",$x[$package]); + $template->assign('package',$package); + $template->assign("hastutorials",isset($this->tutorials[$package])); + $template->assign('hastodos',count($this->todoList)); + $template->assign('todolink','todolist.html'); + $template->assign("classtreepage","classtrees_$package"); + $template->assign("elementindex","elementindex_$package"); + $template->register_outputfilter('HTMLframes_outputfilter'); + if (isset($this->package_pages[$package])) + { + $template->assign("packagedoc",$package.'/package_' . $package . '.html'); + } else + { + $template->assign("packagedoc",false); + } + $this->writefile("li_$package.html",$template->fetch('left_frame.tpl')); + + // Create class tree page + $template = &$this->newSmarty(); + $template->assign("classtrees",$this->generateFormattedClassTrees($package)); + $template->assign("package",$package); + $template->register_outputfilter('HTMLframes_outputfilter'); + $this->writefile("classtrees_$package.html",$template->fetch('classtrees.tpl')); + phpDocumentor_out("\n"); + flush(); + } + // free up considerable memory + unset($this->elements); + unset($this->pkg_elements); + } + + /** + * This function takes an {@link abstractLink} descendant and returns an html link + * + * @param abstractLink a descendant of abstractlink should be passed, and never text + * @param string text to display in the link + * @param boolean this parameter is not used, and is deprecated + * @param boolean determines whether the returned text is enclosed in an tag + */ + function returnSee(&$element, $eltext = false, $with_a = true) + { + if (!is_object($element) || !$element) return false; + if (!$with_a) return $this->getId($element, false); + if (!$eltext) + { + $eltext = ''; + switch($element->type) + { + case 'tutorial' : + $eltext = strip_tags($element->title); + break; + case 'method' : + case 'var' : + case 'const' : + $eltext .= $element->class.'::'; + case 'page' : + case 'define' : + case 'class' : + case 'function' : + case 'global' : + default : + $eltext .= $element->name; + if ($element->type == 'function' || $element->type == 'method') $eltext .= '()'; + break; + } + } + return ''.$eltext.''; + } + + function getId($element, $fullpath = true) + { + if (phpDocumentor_get_class($element) == 'parserdata') + { + $element = $this->addLink($element->parent); + $elp = $element->parent; + } elseif (is_a($element, 'parserbase')) + { + $elp = $element; + $element = $this->addLink($element); + } + $c = ''; + if (!empty($element->subpackage)) + { + $c = '/'.$element->subpackage; + } + $b = '{$subdir}'; + switch ($element->type) + { + case 'page' : + if ($fullpath) + return $b.$element->package.$c.'/'.$element->fileAlias.'.html'; + return 'top'; + break; + case 'define' : + case 'global' : + case 'function' : + if ($fullpath) + return $b.$element->package.$c.'/'.$element->fileAlias.'.html#'.$element->type.$element->name; + return $element->type.$element->name; + break; + case 'class' : + if ($fullpath) + return $b.$element->package.$c.'/'.$element->name.'.html'; + return 'top'; + break; + case 'method' : + case 'var' : + case 'const' : + if ($fullpath) + return $b.$element->package.$c.'/'.$element->class.'.html#'.$element->type.$element->name; + return $element->type.$element->name; + break; + case 'tutorial' : + $d = ''; + if ($element->section) + { + $d = '#'.$element->section; + } + return $b.$element->package.$c.'/tutorial_'.$element->name.'.html'.$d; + } + } + + /** + * Convert README/INSTALL/CHANGELOG file contents to output format + * @param README|INSTALL|CHANGELOG + * @param string contents of the file + */ + function Convert_RIC($name, $contents) + { + $template = &$this->newSmarty(); + $template->assign('contents',$contents); + $template->assign('name',$name); + $this->setTargetDir($this->base_dir); + $this->writefile('ric_'.$name . '.html',$template->fetch('ric.tpl')); + $this->ric_set[$name] = true; + } + + function ConvertTodoList() + { + $todolist = array(); + foreach($this->todoList as $package => $alltodos) + { + foreach($alltodos as $todos) + { + $converted = array(); + $converted['link'] = $this->returnSee($todos[0]); + if (!is_array($todos[1])) + { + $converted['todos'][] = $todos[1]->Convert($this); + } else + { + foreach($todos[1] as $todo) + { + $converted['todos'][] = $todo->Convert($this); + } + } + $todolist[$package][] = $converted; + } + } + $templ = &$this->newSmarty(); + $templ->assign('todos',$todolist); + $templ->register_outputfilter('HTMLframes_outputfilter'); + $this->setTargetDir($this->base_dir); + $this->writefile('todolist.html',$templ->fetch('todolist.tpl')); + } + + /** + * Create errors.html template file output + * + * This method takes all parsing errors and warnings and spits them out ordered by file and line number. + * @global ErrorTracker We'll be using it's output facility + */ + function ConvertErrorLog() + { + global $phpDocumentor_errors; + $allfiles = array(); + $files = array(); + $warnings = $phpDocumentor_errors->returnWarnings(); + $errors = $phpDocumentor_errors->returnErrors(); + $template = &$this->newSmarty(); + foreach($warnings as $warning) + { + $file = '##none'; + $linenum = 'Warning'; + if ($warning->file) + { + $file = $warning->file; + $allfiles[$file] = 1; + $linenum .= ' on line '.$warning->linenum; + } + $files[$file]['warnings'][] = array('name' => $linenum, 'listing' => $warning->data); + } + foreach($errors as $error) + { + $file = '##none'; + $linenum = 'Error'; + if ($error->file) + { + $file = $error->file; + $allfiles[$file] = 1; + $linenum .= ' on line '.$error->linenum; + } + $files[$file]['errors'][] = array('name' => $linenum, 'listing' => $error->data); + } + $i=1; + $af = array(); + foreach($allfiles as $file => $num) + { + $af[$i++] = $file; + } + $allfiles = $af; + usort($allfiles,'strnatcasecmp'); + $allfiles[0] = "Post-parsing"; + foreach($allfiles as $i => $a) + { + $allfiles[$i] = array('file' => $a); + } + $out = array(); + foreach($files as $file => $data) + { + if ($file == '##none') $file = 'Post-parsing'; + $out[$file] = $data; + } + $template->assign("files",$allfiles); + $template->assign("all",$out); + $template->assign("title","phpDocumentor Parser Errors and Warnings"); + $this->setTargetDir($this->base_dir); + $this->writefile("errors.html",$template->fetch('errors.tpl')); + unset($template); + phpDocumentor_out("\n\nTo view errors and warnings, look at ".$this->base_dir. PATH_DELIMITER . "errors.html\n"); + flush(); + } + + function getTutorialId($package,$subpackage,$tutorial,$id) + { + return $id; + } + + function getCData($value) + { + return '
        '.htmlentities($value).'
        '; + } + + /** + * Converts package page and sets its package as used in {@link $package_pages} + * @param parserPackagePage + */ + function convertPackagepage(&$element) + { + phpDocumentor_out("\n"); + flush(); + $this->package = $element->package; + $this->subpackage = ''; + $contents = $element->Convert($this); + $this->package_pages[$element->package] = str_replace('{$subdir}','../',$contents); + phpDocumentor_out("\n"); + flush(); + $this->setTargetDir($this->base_dir . PATH_DELIMITER . $element->package); + $this->writeFile('package_'.$element->package.'.html',str_replace('{$subdir}','../',$contents)); + } + + /** + * @param parserTutorial + */ + function convertTutorial(&$element) + { + phpDocumentor_out("\n"); + flush(); + $template = &parent::convertTutorial($element); + $a = '../'; + if ($element->subpackage) $a .= '../'; + $template->assign('subdir',$a); + $template->register_outputfilter('HTMLframes_outputfilter'); + $contents = $template->fetch('tutorial.tpl'); + $a = ''; + if ($element->subpackage) $a = PATH_DELIMITER . $element->subpackage; + phpDocumentor_out("\n"); + flush(); + $this->setTargetDir($this->base_dir . PATH_DELIMITER . $element->package . $a); + $this->writeFile('tutorial_'.$element->name.'.html',$contents); + } + + /** + * Converts class for template output + * @see prepareDocBlock(), generateChildClassList(), generateFormattedClassTree(), getFormattedConflicts() + * @see getFormattedInheritedMethods(), getFormattedInheritedVars() + * @param parserClass + */ + function convertClass(&$element) + { + parent::convertClass($element); + $this->class_dir = $element->docblock->package; + if (!empty($element->docblock->subpackage)) $this->class_dir .= PATH_DELIMITER . $element->docblock->subpackage; + $a = '../'; + if ($element->docblock->subpackage != '') $a = "../$a"; + + $this->class_data->assign('subdir',$a); + $this->class_data->assign("title","Docs For Class " . $element->getName()); + $this->class_data->assign("page",$element->getName() . '.html'); + } + + /** + * Converts class variables for template output + * @see prepareDocBlock(), getFormattedConflicts() + * @param parserDefine + */ + function convertVar(&$element) + { + parent::convertVar($element, array('var_dest' => $this->getId($element,false))); + } + + /** + * Converts class variables for template output + * @see prepareDocBlock(), getFormattedConflicts() + * @param parserDefine + */ + function convertConst(&$element) + { + parent::convertConst($element, array('const_dest' => $this->getId($element,false))); + } + + /** + * Converts class methods for template output + * @see prepareDocBlock(), getFormattedConflicts() + * @param parserDefine + */ + function convertMethod(&$element) + { + parent::convertMethod($element, array('method_dest' => $this->getId($element,false))); + } + + /** + * Converts function for template output + * @see prepareDocBlock(), parserFunction::getFunctionCall(), getFormattedConflicts() + * @param parserFunction + */ + function convertFunction(&$element) + { + $funcloc = $this->getId($this->addLink($element)); + parent::convertFunction($element,array('function_dest' => $this->getId($element,false))); + } + + /** + * Converts include elements for template output + * @see prepareDocBlock() + * @param parserInclude + */ + function convertInclude(&$element) + { + parent::convertInclude($element, array('include_file' => '_'.strtr($element->getValue(),array('"' => '', "'" => '','.' => '_')))); + } + + /** + * Converts defines for template output + * @see prepareDocBlock(), getFormattedConflicts() + * @param parserDefine + */ + function convertDefine(&$element) + { + parent::convertDefine($element, array('define_link' => $this->getId($element,false))); + } + + /** + * Converts global variables for template output + * @param parserGlobal + */ + function convertGlobal(&$element) + { + parent::convertGlobal($element, array('global_link' => $this->getId($element,false))); + } + + /** + * converts procedural pages for template output + * @see prepareDocBlock(), getClassesOnPage() + * @param parserData + */ + function convertPage(&$element) + { + parent::convertPage($element); + $this->juststarted = true; + $this->page_dir = $element->parent->package; + if (!empty($element->parent->subpackage)) $this->page_dir .= PATH_DELIMITER . $element->parent->subpackage; + // registering stuff on the template + $this->page_data->assign("page",$this->getPageName($element) . '.html'); + $this->page_data->assign("title","Docs for page ".$element->parent->getFile()); + } + + function getPageName(&$element) + { + if (phpDocumentor_get_class($element) == 'parserpage') return '_'.$element->getName(); + return '_'.$element->parent->getName(); + } + + /** + * returns an array containing the class inheritance tree from the root object to the class + * + * @param parserClass class variable + * @return array Format: array(root,child,child,child,...,$class) + * @uses parserClass::getParentClassTree() + */ + + function generateFormattedClassTree($class) + { + $tree = $class->getParentClassTree($this); + $out = ''; + if (count($tree) - 1) + { + $result = array($class->getName()); + $parent = $tree[$class->getName()]; + $distance[] = ''; + while ($parent) + { + $x = $parent; + if (is_object($parent)) + { + $subpackage = $parent->docblock->subpackage; + $package = $parent->docblock->package; + $x = $parent; + $x = $parent->getLink($this); + if (!$x) $x = $parent->getName(); + } + $result[] = + $x; + $distance[] = + "\n%s|\n" . + "%s--"; + if (is_object($parent)) + $parent = $tree[$parent->getName()]; + elseif (isset($tree[$parent])) + $parent = $tree[$parent]; + } + $nbsp = ' '; + for($i=count($result) - 1;$i>=0;$i--) + { + $my_nbsp = ''; + for($j=0;$jarray_reverse($result),'distance'=>array_reverse($distance)); + } else + { + return array('classes'=>$class->getName(),'distance'=>array('')); + } + } + + /** @access private */ + function sortVar($a, $b) + { + return strnatcasecmp($a->getName(),$b->getName()); + } + + /** @access private */ + function sortMethod($a, $b) + { + if ($a->isConstructor) return -1; + if ($b->isConstructor) return 1; + return strnatcasecmp($a->getName(),$b->getName()); + } + + /** + * returns a template-enabled array of class trees + * + * @param string $package package to generate a class tree for + * @see $roots, HTMLConverter::getRootTree() + */ + function generateFormattedClassTrees($package) + { + if (!isset($this->roots[$package])) return array(); + $roots = $trees = array(); + $roots = $this->roots[$package]; + for($i=0;$i $roots[$i],'class_tree' => "
          \n".$this->getRootTree($this->getSortedClassTreeFromClass($roots[$i],$package,''),$package)."
        \n"); + } + return $trees; + } + + /** + * return formatted class tree for the Class Trees page + * + * @param array $tree output from {@link getSortedClassTreeFromClass()} + * @see Classes::$definitechild, generateFormattedClassTrees() + * @return string + */ + function getRootTree($tree,$package) + { + if (!$tree) return ''; + $my_tree = ''; + $cur = '#root'; + $lastcur = array(false); + $kids = array(); + $dopar = false; + if ($tree[$cur]['parent']) + { + $dopar = true; + if (!is_object($tree[$cur]['parent'])) + { +// debug("parent ".$tree[$cur]['parent']." not found"); + $my_tree .= '
      • ' . $tree[$cur]['parent'] .'
          '; + } + else + { +// debug("parent ".$this->returnSee($tree[$cur]['parent'])." in other package"); + $my_tree .= '
        • ' . $this->returnSee($tree[$cur]['parent']); + if ($tree[$cur]['parent']->package != $package) $my_tree .= ' (Different package)
            '; + } + } + do + { +// fancy_debug($cur,$lastcur,$kids); + if (count($tree[$cur]['children'])) + { +// debug("$cur has children"); + if (!isset($kids[$cur])) + { +// debug("set $cur kids"); + $kids[$cur] = 1; + $my_tree .= '
          • '.$this->returnSee($tree[$cur]['link']); + $my_tree .= '
              '."\n"; + } + array_push($lastcur,$cur); + list(,$cur) = each($tree[$cur]['children']); +// var_dump('listed',$cur); + if ($cur) + { + $cur = $cur['package'] . '#' . $cur['class']; +// debug("set cur to child $cur"); +// $my_tree .= '
            • '.$this->returnSee($tree[$cur]['link']); + continue; + } else + { +// debug("end of children for $cur"); + $cur = array_pop($lastcur); + $cur = array_pop($lastcur); + $my_tree .= '
          • '."\n"; + if ($dopar && ($cur == '#root' || !$cur)) $my_tree .= '
        • '; + } + } else + { +// debug("$cur has no children"); + $my_tree .= '
        • '.$this->returnSee($tree[$cur]['link'])."
        • "; + if ($dopar && $cur == '#root') $my_tree .= '
      • '; + $cur = array_pop($lastcur); + } + } while ($cur); + return $my_tree; + } + /** + * Generate indexing information for given element + * + * @param parserElement descendant of parserElement + * @see generateElementIndex() + * @return array + */ + function getIndexInformation($elt) + { + $Result['type'] = $elt->type; + $Result['file_name'] = $elt->file; + $Result['path'] = $elt->getPath(); + + if (isset($elt->docblock)) + { + $Result['description'] = $elt->docblock->getSDesc($this); + + if ($elt->docblock->hasaccess) + $Result['access'] = $elt->docblock->tags['access'][0]->value; + else + $Result['access'] = 'public'; + + $Result['abstract'] = isset ($elt->docblock->tags['abstract'][0]); + } + else + $Result['description'] = ''; + + $aa = $Result['description']; + if (!empty($aa)) $aa = "
            $aa"; + + switch($elt->type) + { + case 'class': + $Result['name'] = $elt->getName(); + $Result['title'] = 'Class'; + $Result['link'] = $this->getClassLink($elt->getName(), + $elt->docblock->package, + $elt->getPath(), + $elt->getName()); + $Result['listing'] = 'in file '.$elt->file.', class '.$Result['link']."$aa"; + break; + case 'define': + $Result['name'] = $elt->getName(); + $Result['title'] = 'Constant'; + $Result['link'] = $this->getDefineLink($elt->getName(), + $elt->docblock->package, + $elt->getPath(), + $elt->getName()); + $Result['listing'] = 'in file '.$elt->file.', constant '.$Result['link']."$aa"; + break; + case 'global': + $Result['name'] = $elt->getName(); + $Result['title'] = 'Global'; + $Result['link'] = $this->getGlobalLink($elt->getName(), + $elt->docblock->package, + $elt->getPath(), + $elt->getName()); + $Result['listing'] = 'in file '.$elt->file.', global variable '.$Result['link']."$aa"; + break; + case 'function': + $Result['name'] = $elt->getName(); + $Result['title'] = 'Function'; + $Result['link'] = $this->getFunctionLink($elt->getName(), + $elt->docblock->package, + $elt->getPath(), + $elt->getName().'()'); + $Result['listing'] = 'in file '.$elt->file.', function '.$Result['link']."$aa"; + break; + case 'method': + $Result['name'] = $elt->getName(); + $Result['title'] = 'Method'; + $Result['link'] = $this->getMethodLink($elt->getName(), + $elt->class, + $elt->docblock->package, + $elt->getPath(), + $elt->class.'::'.$elt->getName().'()' + ); + if ($elt->isConstructor) $Result['constructor'] = 1; + $Result['listing'] = 'in file '.$elt->file.', method '.$Result['link']."$aa"; + break; + case 'var': + $Result['name'] = $elt->getName(); + $Result['title'] = 'Variable'; + $Result['link'] = $this->getVarLink($elt->getName(), + $elt->class, + $elt->docblock->package, + $elt->getPath(), + $elt->class.'::'.$elt->getName()); + $Result['listing'] = 'in file '.$elt->file.', variable '.$Result['link']."$aa"; + break; + case 'const': + $Result['name'] = $elt->getName(); + $Result['title'] = 'Class Constant'; + $Result['link'] = $this->getConstLink($elt->getName(), + $elt->class, + $elt->docblock->package, + $elt->getPath(), + $elt->class.'::'.$elt->getName()); + $Result['listing'] = 'in file '.$elt->file.', class constant '.$Result['link']."$aa"; + break; + case 'page': + $Result['name'] = $elt->getFile(); + $Result['title'] = 'Page'; + $Result['link'] = $this->getPageLink($elt->getFile(), + $elt->package, + $elt->getPath(), + $elt->getFile()); + $Result['listing'] = 'procedural page '.$Result['link']; + break; + case 'include': + $Result['name'] = $elt->getName(); + $Result['title'] = 'Include'; + $Result['link'] = $elt->getValue(); + $Result['listing'] = 'include '.$Result['name']; + break; + } + + return $Result; + } + /** + * Generate alphabetical index of all elements + * + * @see $elements, walk() + */ + function generateElementIndex() + { + $elementindex = array(); + $letters = array(); + $used = array(); + foreach($this->elements as $letter => $nutoh) + { + foreach($this->elements[$letter] as $i => $yuh) + { + if ($this->elements[$letter][$i]->type != 'include') + { + if (!isset($used[$letter])) + { + $letters[]['letter'] = $letter; + $elindex['letter'] = $letter; + $used[$letter] = 1; + } + + $elindex['index'][] = $this->getIndexInformation($this->elements[$letter][$i]); + } + } + if (isset($elindex['index'])) + { + $elementindex[] = $elindex; + } else + { + unset($letters[count($letters) - 1]); + } + $elindex = array(); + } + return array($elementindex,$letters); + } + + function copyMediaRecursively($media,$targetdir,$subdir = '') + { + if (!is_array($media)) { + return; + } + foreach($media as $dir => $files) + { + if ($dir === '/') + { + $this->copyMediaRecursively($files,$targetdir); + } else + { + if (!is_numeric($dir)) + { + // create the subdir + phpDocumentor_out("creating $targetdir/$dir\n"); + Converter::setTargetDir($targetdir . PATH_DELIMITER . $dir); + if (!empty($subdir)) $subdir .= PATH_DELIMITER; + $this->copyMediaRecursively($files,"$targetdir/$dir",$subdir . $dir); + } else + { + // copy the file + phpDocumentor_out("copying $targetdir/".$files['file']."\n"); + $this->copyFile($files['file'],$subdir); + } + } + } + } + + /** + * calls the converter setTargetDir, and then copies any template images and the stylesheet if they haven't been copied + * @see Converter::setTargetDir() + */ + function setTargetDir($dir) + { + Converter::setTargetDir($dir); + if ($this->wrote) return; + $this->wrote = true; + $template_images = array(); + $stylesheets = array(); + $tdir = $dir; + $dir = $this->templateDir; + $this->templateDir = $this->templateDir.'templates/'; + $info = new Io; + $this->copyMediaRecursively($info->getDirTree($this->templateDir.'media',$this->templateDir),$tdir); + } + + /** + * Generate alphabetical index of all elements by package and subpackage + * + * @param string $package name of a package + * @see $pkg_elements, walk(), generatePkgElementIndexes() + */ + function generatePkgElementIndex($package) + { +// var_dump($this->pkg_elements[$package]); + $elementindex = array(); + $letters = array(); + $letterind = array(); + $used = array(); + $subp = ''; + foreach($this->pkg_elements[$package] as $subpackage => $els) + { + if (empty($els)) continue; + if (!empty($subpackage)) $subp = " (subpackage: $subpackage)"; else $subp = ''; + foreach($els as $letter => $yuh) + { + foreach($els[$letter] as $i => $yuh) + { + if ($els[$letter][$i]->type != 'include') + { + if (!isset($used[$letter])) + { + $letters[]['letter'] = $letter; + $letterind[$letter] = count($letters) - 1; + $used[$letter] = 1; + } + $elindex[$letter]['letter'] = $letter; + + $elindex[$letter]['index'][] = $this->getIndexInformation($els[$letter][$i]); + } + } + } + } + ksort($elindex); + usort($letters,'HTMLframes_lettersort'); + if (isset($elindex)) + { + while(list($letter,$tempel) = each($elindex)) + { + if (!isset($tempel)) + { + unset($letters[$letterind[$tempel['letter']]]); + } else + $elementindex[] = $tempel; + } + } else $letters = array(); + return array($elementindex,$letters); + } + + /** + * + * @see generatePkgElementIndex() + */ + function generatePkgElementIndexes() + { + $packages = array(); + $package_names = array(); + $pkg = array(); + $letters = array(); + foreach($this->pkg_elements as $package => $trash) + { + $pkgs['package'] = $package; + $pkg['package'] = $package; + list($pkg['pindex'],$letters[$package]) = $this->generatePkgElementIndex($package); + if (count($pkg['pindex'])) + { + $packages[] = $pkg; + $package_names[] = $pkgs; + } + unset($pkgs); + unset($pkg); + } + foreach($packages as $i => $package) + { + $pnames = array(); + for($j=0;$jreturnSee($a, $text, $with_a); + } + + /** + * @param string name of function + * @param string package name + * @param string full path to look in (used in index generation) + * @param boolean deprecated + * @param boolean return just the URL, or enclose it in an html a tag + * @return mixed false if not found, or an html a link to the function's documentation + * @see parent::getFunctionLink() + */ + function getFunctionLink($expr,$package, $file = false,$text = false) + { + $a = Converter::getFunctionLink($expr,$package,$file); + if (!$a) return false; + return $this->returnSee($a, $text); + } + + /** + * @param string name of define + * @param string package name + * @param string full path to look in (used in index generation) + * @param boolean deprecated + * @param boolean return just the URL, or enclose it in an html a tag + * @return mixed false if not found, or an html a link to the define's documentation + * @see parent::getDefineLink() + */ + function getDefineLink($expr,$package, $file = false,$text = false) + { + $a = Converter::getDefineLink($expr,$package,$file); + if (!$a) return false; + return $this->returnSee($a, $text); + } + + /** + * @param string name of global variable + * @param string package name + * @param string full path to look in (used in index generation) + * @param boolean deprecated + * @param boolean return just the URL, or enclose it in an html a tag + * @return mixed false if not found, or an html a link to the global variable's documentation + * @see parent::getGlobalLink() + */ + function getGlobalLink($expr,$package, $file = false,$text = false) + { + $a = Converter::getGlobalLink($expr,$package,$file); + if (!$a) return false; + return $this->returnSee($a, $text); + } + + /** + * @param string name of procedural page + * @param string package name + * @param string full path to look in (used in index generation) + * @param boolean deprecated + * @param boolean return just the URL, or enclose it in an html a tag + * @return mixed false if not found, or an html a link to the procedural page's documentation + * @see parent::getPageLink() + */ + function getPageLink($expr,$package, $path = false,$text = false) + { + $a = Converter::getPageLink($expr,$package,$path); + if (!$a) return false; + return $this->returnSee($a, $text); + } + + /** + * @param string name of method + * @param string class containing method + * @param string package name + * @param string full path to look in (used in index generation) + * @param boolean deprecated + * @param boolean return just the URL, or enclose it in an html a tag + * @return mixed false if not found, or an html a link to the method's documentation + * @see parent::getMethodLink() + */ + function getMethodLink($expr,$class,$package, $file = false,$text = false) + { + $a = Converter::getMethodLink($expr,$class,$package,$file); + if (!$a) return false; + return $this->returnSee($a, $text); + } + + /** + * @param string name of var + * @param string class containing var + * @param string package name + * @param string full path to look in (used in index generation) + * @param boolean deprecated + * @param boolean return just the URL, or enclose it in an html a tag + * @return mixed false if not found, or an html a link to the var's documentation + * @see parent::getVarLink() + */ + function getVarLink($expr,$class,$package, $file = false,$text = false) + { + $a = Converter::getVarLink($expr,$class,$package,$file); + if (!$a) return false; + return $this->returnSee($a, $text); + } + + /** + * @param string name of class constant + * @param string class containing class constant + * @param string package name + * @param string full path to look in (used in index generation) + * @param boolean deprecated + * @param boolean return just the URL, or enclose it in an html a tag + * @return mixed false if not found, or an html a link to the var's documentation + * @see parent::getVarLink() + */ + function getConstLink($expr,$class,$package, $file = false,$text = false) + { + $a = Converter::getConstLink($expr,$class,$package,$file); + if (!$a) return false; + return $this->returnSee($a, $text); + } + + /** + * does a nat case sort on the specified second level value of the array + * + * @param mixed $a + * @param mixed $b + * @return int + */ + function rcNatCmp ($a, $b) + { + $aa = strtoupper($a[$this->rcnatcmpkey]); + $bb = strtoupper($b[$this->rcnatcmpkey]); + + return strnatcasecmp($aa, $bb); + } + + /** + * does a nat case sort on the specified second level value of the array. + * this one puts constructors first + * + * @param mixed $a + * @param mixed $b + * @return int + */ + function rcNatCmp1 ($a, $b) + { + $aa = strtoupper($a[$this->rcnatcmpkey]); + $bb = strtoupper($b[$this->rcnatcmpkey]); + + if (strpos($aa,'CONSTRUCTOR') === 0) + { + return -1; + } + if (strpos($bb,'CONSTRUCTOR') === 0) + { + return 1; + } + if (strpos($aa,strtoupper($this->class)) === 0) + { + return -1; + } + if (strpos($bb,strtoupper($this->class)) === 0) + { + return -1; + } + return strnatcasecmp($aa, $bb); + } + + /** + * This function is not used by HTMLdefaultConverter, but is required by Converter + */ + function Output() + { + } +} + +/** + * @access private + * @global string name of the package to set as the first package + */ +function HTMLframes_pindexcmp($a, $b) +{ + global $phpDocumentor_DefaultPackageName; + if ($a['title'] == $phpDocumentor_DefaultPackageName) return -1; + if ($b['title'] == $phpDocumentor_DefaultPackageName) return 1; + return strnatcasecmp($a['title'],$b['title']); +} + +/** @access private */ +function HTMLframes_lettersort($a, $b) +{ + return strnatcasecmp($a['letter'],$b['letter']); +} + +/** @access private */ +function HTMLframes_outputfilter($src, &$smarty) +{ + return str_replace('{$subdir}',$smarty->_tpl_vars['subdir'],$src); +} +?> diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/options.ini b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/options.ini new file mode 100644 index 00000000..73164a39 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/options.ini @@ -0,0 +1,577 @@ +preservedocbooktags = false + +;; used to highlight the {@source} inline tag, @filesource tag, and @example tag +[highlightSourceTokens] +;; format: +;; T_CONSTANTNAME = open +;; /T_CONSTANTNAME = close + +T_INCLUDE = +/T_INCLUDE = +T_INCLUDE_ONCE = +/T_INCLUDE_ONCE = +T_REQUIRE_ONCE = +/T_REQUIRE_ONCE = +T_REQUIRE_ONCE = +/T_REQUIRE_ONCE = + +T_CONSTANT_ENCAPSED_STRING = +/T_CONSTANT_ENCAPSED_STRING = +T_STRING_VARNAME = +/T_STRING_VARNAME = + +T_STRING = +/T_STRING = + +T_DNUMBER = +/T_DNUMBER = +T_LNUMBER = +/T_LNUMBER = + +T_VARIABLE = +/T_VARIABLE = + +T_COMMENT = +/T_COMMENT = +T_ML_COMMENT = +/T_ML_COMMENT = + +T_OBJECT_OPERATOR = +/T_OBJECT_OPERATOR = + +T_ABSTRACT = +/T_ABSTRACT = +T_CLONE = +/T_CLONE = +T_HALT_COMPILER = +/T_HALT_COMPILER = +T_ARRAY = +/T_ARRAY = +T_AS = +/T_AS = +T_BREAK = +/T_BREAK = +T_CLASS = +/T_CLASS = +T_CASE = +/T_CASE = +T_CONST = +/T_CONST = +T_CONTINUE = +/T_CONTINUE = +T_DECLARE = +/T_DECLARE = +T_DEFAULT = +/T_DEFAULT = +T_ELSE = +/T_ELSE = +T_ELSEIF = +/T_ELSEIF = +T_EMPTY = +/T_EMPTY = +T_ENDDECLARE = +/T_ENDDECLARE = +T_ENDFOR = +/T_ENDFOR = +T_ENDSWITCH = +/T_ENDSWITCH = +T_ENDFOREACH = +/T_ENDFOREACH = +T_ENDIF = +/T_ENDIF = +T_ENDWHILE = +/T_ENDWHILE = +T_EXIT = +/T_EXIT = +T_EXTENDS = +/T_EXTENDS = +T_FINAL = +/T_FINAL = +T_FOR = +/T_FOR = +T_FOREACH = +/T_FOREACH = +T_FUNCTION = +/T_FUNCTION = +T_GLOBAL = +/T_GLOBAL = +T_IF = +/T_IF = +T_IMPLEMENTS = +/T_IMPLEMENTS = +T_INTERFACE = +/T_INTERFACE = +T_LOGICAL_AND = +/T_LOGICAL_AND = +T_LOGICAL_OR = +/T_LOGICAL_OR = +T_LOGICAL_XOR = +/T_LOGICAL_XOR = +T_NEW = +/T_NEW = +T_PRIVATE = +/T_PRIVATE = +T_PROTECTED = +/T_PROTECTED = +T_PUBLIC = +/T_PUBLIC = +T_RETURN = +/T_RETURN = +T_STATIC = +/T_STATIC = +T_SWITCH = +/T_SWITCH = +T_VAR = +/T_VAR = +T_WHILE = +/T_WHILE = + +T_DOUBLE_COLON = +/T_DOUBLE_COLON = + +T_OPEN_TAG = +/T_OPEN_TAG = +T_OPEN_TAG_WITH_ECHO = +/T_OPEN_TAG_WITH_ECHO = +T_CLOSE_TAG = +/T_CLOSE_TAG = + + +[highlightSource] +;; this is for highlighting things that aren't tokens like "&" +;; format: +;; word = open +;; /word = close +@ = +/@ = +& = +/& = +[ = +/[ = +] = +/] = +! = +/! = +";" = +/; = +( = +/( = +) = +/) = +, = +/, = +{ = +/{ = +} = +/} = +""" = +/" = + +[highlightDocBlockSourceTokens] +;; this is for docblock tokens, using by phpDocumentor_HighlightParser +;; tagphptype is for "string" in @param string description, for example +docblock = +/docblock = +tagphptype = +/tagphptype = +tagvarname = +/tagvarname = +coretag = +/coretag = +tag = +/tag = +inlinetag = +/inlinetag = +internal = +/internal = +closetemplate = +/closetemplate = +docblocktemplate = +/docblocktemplate = + +[highlightTutorialSourceTokens] +;; this is for XML DocBook-based tutorials, highlighted by phpDocumentor_TutorialHighlightParser +;; +opentag = +/opentag = +;; +closetag = +/closetag = +;; +attribute = +/attribute = +;; +attributevalue = +/attributevalue = +;; &entity; +entity = +/entity = +;; +comment = +/comment = +;; {@inline tag} +itag = +/itag = + +;; used for translation of html in DocBlocks +[desctranslate] +ul =
          +/ul =
        +ol =
          +/ol =
        +li =
      • +/li =
      • +code =
        +/code = 
        +var = +/var = +samp = +/samp = +kbd = +/kbd = +pre =
        +/pre = 
        +p =

        +/p =

        +b = +/b = +i = +/i = +br =
        + +[ppage] +;; this is the DocBook package page translation section. All DocBook tags +;; that have a corresponding html tag must be listed here. Entities should +;; also be listed here +;; +;; examples: +;; 1) +;; tagname = newtagname +;; +;; This is the simplest case, where all attributes will be added into the +;; starting tag and the ending tag will be html/xml style +;; becomes and +;; becomes +;; +;; +;; 2) +;; tagname = newtagname +;; tagname->attr = newattrname +;; +;; in this case, everything will be like the first case, except tags like: +;; will become +;; +;; +;; 3) +;; tagname = newtagname +;; tagname->attr = newattrname +;; tagname->attr+value = newvalue +;; +;; in this case, the value is also translated to another. This can be useful +;; for instances such as focus="middle" changing to align="center" or something +;; of that nature. +;; will become +;; +;; +;; 4) +;; tagname = newtagname +;; tagname->attr1 = newattrname +;; tagname->attr2 = newattrname +;; tagname->attr1+value|attr2+value = newvalue +;; +;; in this case, two attributes combine to make one new attribute, and the combined +;; value is translated into a new value +;; will become +;; +;; +;; 5) +;; tagname = newtagname +;; tagname!attr = dummy +;; +;; here, the attribute will be ignored. dummy is not used and may be any value +;; will become +;; +;; +;; 6) +;; tagname = newtagname +;; tagname! = dummy +;; +;; here, all attributes will be ignored. dummy is not used and may be any value +;; will become +;; +;; +;; 7) +;; tagname = newtagname +;; tagname/ = 1 +;; +;; here, the tag will be translated as a single tag with no closing tag, and all +;; attributes +;; {text text} will become +;; +;; +;; 8) +;; tagname = +;; /tagname = closetagtext +;; +;; in this case, the text will be inserted exactly as entered for +;; and closetagtext for +;; will become +;; closetagtext +;; +;; 9) +;; $attr$my_attribute = newattrname +;; +;; tagname = newtagname +;; +;; in this case, all occurences of my_attribute in any tag will be changed to +;; newattrname. This is useful for changing things like role="php" to +;; class="php," for example. Note that the text "$attr$" MUST be on the line +;; start for phpDocumentor to recognize it. +;; +;; 10) +;; &entity; = translation text +;; " = " +;; " = """ +;; < = < +;; +;; Use this to control translation of entities to their appropriate values + +  =   +" = " +” = ” +“ = “ +& = & +< = < +> = > +© = © + + +$attr$role = class + +abbrev = abbr + +blockquote = blockquote + +arg = span +arg->choice = class + +author = +/author = +author! = 0 + +authorblurb =
        +/authorblurb =
        + +authorgroup =

        Authors

        +/authorgroup =
        +authorgroup! = 0 + +caution = +/caution = +caution! = 0 + +cmdsynopsis =
        +/cmdsynopsis =
        + +command = +/command = + +copyright =
        +/copyright =
        + +emphasis = em + +example =
        +/example = 
        +example! = 0 + +function = +/function = () + +formalpara = p + +graphic = img +graphic->fileref = src +graphic/ = + +important = strong + +informalequation = blockquote + +informalexample = div + +inlineequation = em + +itemizedlist = ul + +listitem = li + +literal = code + +literallayout = span + +option = " " +/option = + +orderedlist = ol + +para = p + +programlisting =
        +/programlisting = 
        +programlisting! = 0 + +refentry = div + +refnamediv =
        +/refnamediv =
        +refnamediv! = 0 + +refname =

        +/refname =

        + +refpurpose =

        +/refpurpose =

        + +refsynopsisdiv =
        +/refsynopsisdiv =
        +refsynopsisdiv! = 0 + +refsect1 = span + +refsect2 = span + +refsect3 = +/refsect3 =
        + +releaseinfo =
        ( +/releaseinfo = )
        + +simpara = +/simpara =
        +simpara! = 0 + +subscript = sub + +superscript = super + +table = table + +table->colsep = rules +table->rowsep = rules +table->colsep+1|rowsep+1 =all +table->colsep+1|rowsep+0 =cols +table->colsep+0|rowsep+1 =rows + +table->frame =frame +table->frame+all =border +table->frame+none =void +table->frame+sides =vsides +table->frame+top =above +table->frame+topbot =hsides + +thead = thead + +tfoot = tfoot + +tbody = tbody + +colspec = col + +tgroup = colgroup +tgroup/ = 1 +tgroup->cols = span + +row = tr + +entry = td +entry->morerows = colspan +entry->morerows+1 =2 +entry->morerows+2 =3 +entry->morerows+3 =4 +entry->morerows+4 =5 +entry->morerows+5 =6 +entry->morerows+6 =7 +entry->morerows+7 =8 +entry->morerows+8 =9 +entry->morerows+9 =10 +entry->morerows+10 =11 +;; add more if you need more colspans + +warning = +/warning = +warning! = 0 + +;; now begins the attributes that should be tags in cdata +[$attr$id] +open = a +;close = /a +cdata! = true +quotevalues = true +separator = "=" +;separateall = true +$id = name + +;; now begins the sections that deal with +[refsynopsisdiv_title] +;tag_attr = true +;attr_name = title +cdata_start = true +;cdata_end = true +open = <h1 class="title"> +close = </h1> + +[refsect1_title] +;tag_attr = true +;attr_name = title +cdata_start = true +;cdata_end = true +open = <h2 class="title"> +close = </h2> + +[refsect2_title] +;tag_attr = true +;attr_name = title +cdata_start = true +;cdata_end = true +open = <h3 class="title"> +close = </h3> + +[refsect3_title] +;tag_attr = true +;attr_name = title +cdata_start = true +;cdata_end = true +open = <h4 class="title"> +close = </h4> + +[para_title] +;tag_attr = true +;attr_name = title +cdata_start = true +;cdata_end = true +open = <div class="title"> +close = </div> + +[formalpara_title] +;tag_attr = true +;attr_name = title +cdata_start = true +;cdata_end = true +open = <div class="title"> +close = </div> + +[example_title] +;tag_attr = true +;attr_name = title +;cdata_start = true +cdata_end = true +open = </td></tr><tr><td><strong> +close = </strong> + +[table_title] +;tag_attr = true +;attr_name = true +cdata_start = true +open = <caption> +close = </caption> diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/basicindex.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/basicindex.tpl new file mode 100644 index 00000000..711e1d2e --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/basicindex.tpl @@ -0,0 +1,47 @@ +<div class="index-letter-menu"> +{section name=letter loop=$letters} + <a class="index-letter" href="{$indexname}.html#{$letters[letter].letter}">{$letters[letter].letter}</a> +{/section} +</div> + +{section name=index loop=$index} + <a name="{$index[index].letter}"></a> + <div class="index-letter-section"> + <div style="float: left" class="index-letter-title">{$index[index].letter}</div> + <div style="float: right"><a href="#top">top</a></div> + <div style="clear: both"></div> + </div> + <dl> + {section name=contents loop=$index[index].index} + <dt class="field"> + {if ($index[index].index[contents].title == "Variable")} + <span class="var-title">{$index[index].index[contents].name}</span> + {elseif ($index[index].index[contents].title == "Global")} + <span class="var-title">{$index[index].index[contents].name}</span> + {elseif ($index[index].index[contents].title == "Method")} + <span class="method-title">{$index[index].index[contents].name}</span> + {elseif ($index[index].index[contents].title == "Function")} + <span class="method-title">{$index[index].index[contents].name}</span> + {elseif ($index[index].index[contents].title == "Constant")} + <span class="const-title">{$index[index].index[contents].name}</span> + {elseif ($index[index].index[contents].title == "Page") || ($index[index].index[contents].title == "Include")} + <span class="include-title">{$index[index].index[contents].name}</span> + {else} + {$index[index].index[contents].name} + {/if} + </dt> + <dd class="index-item-body"> + <div class="index-item-details">{$index[index].index[contents].link} in {$index[index].index[contents].file_name}</div> + {if $index[index].index[contents].description} + <div class="index-item-description">{$index[index].index[contents].description}</div> + {/if} + </dd> + {/section} + </dl> +{/section} + +<div class="index-letter-menu"> +{section name=letter loop=$letters} + <a class="index-letter" href="{$indexname}.html#{$letters[letter].letter}">{$letters[letter].letter}</a> +{/section} +</div> diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/blank.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/blank.tpl new file mode 100644 index 00000000..1fbaca2f --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/blank.tpl @@ -0,0 +1,13 @@ +<html> +<head> + <title>{$maintitle} + + + + +

        {$maintitle}

        +Welcome to {$package}!
        +
        +This documentation was generated by phpDocumentor v{$phpdocversion}
        + + \ No newline at end of file diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/class.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/class.tpl new file mode 100644 index 00000000..cc1c080b --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/class.tpl @@ -0,0 +1,402 @@ +{include file="header.tpl" top3=true} + +

        {if $is_interface}Interface{else}Class{/if} {$class_name}

        + + +
        +
        Description
        + +
        + {if $implements} +

        + Implements interfaces: +

          + {foreach item="int" from=$implements}
        • {$int}
        • {/foreach} +
        +

        + {/if} + {include file="docblock.tpl" type="class" sdesc=$sdesc desc=$desc} +

        + Located in {$source_location} (line {if $class_slink}{$class_slink}{else}{$line_number}{/if}) +

        + + {if $tutorial} +
        +
        Tutorial: {$tutorial}
        + {/if} + +
        {section name=tree loop=$class_tree.classes}{$class_tree.classes[tree]}{$class_tree.distance[tree]}{/section}
        + + {if $conflicts.conflict_type} +
        +
        Conflicts with classes:
        + {section name=me loop=$conflicts.conflicts} + {$conflicts.conflicts[me]}
        + {/section} +
        + {/if} +
        +
        + +{if $children} + +
        +
        Direct descendents
        + +
        + + + + + + {section name=kids loop=$children} + + + + + {/section} +
        ClassDescription
        {$children[kids].link} + {if $children[kids].sdesc} + {$children[kids].sdesc} + {else} + {$children[kids].desc} + {/if} +
        +
        +
        +{/if} + +{if $consts} + +
        +
        Class Constant Summary
        + +
        +
        + {section name=consts loop=$consts} +
        +  + {$consts[consts].const_name} = {$consts[consts].const_value} + +
        + {/section} +
        +
        +
        +{/if} + +{if $vars} + +
        +
        Variable Summary
        + +
        +
        + {section name=vars loop=$vars} +
        + {$vars[vars].var_type} + {$vars[vars].var_name} +
        + {/section} +
        +
        +
        +{/if} + +{if $methods} + +
        +
        Method Summary
        + +
        +
        + {section name=methods loop=$methods} +
        + {if $methods[methods].function_return} + {$methods[methods].function_return} + {/if} + {if $methods[methods].ifunction_call.returnsref}&{/if}{$methods[methods].function_name} + {if count($methods[methods].ifunction_call.params)} + ({section name=params loop=$methods[methods].ifunction_call.params}{if $smarty.section.params.iteration != 1}, {/if}{if $methods[methods].ifunction_call.params[params].default}[{/if}{$methods[methods].ifunction_call.params[params].type} {$methods[methods].ifunction_call.params[params].name}{if $methods[methods].ifunction_call.params[params].default} = {$methods[methods].ifunction_call.params[params].default}]{/if}{/section}) + {else} + () + {/if} +
        + {/section} +
        +
        +
        +{/if} + +{if $vars || $ivars} + +
        +
        Variables
        + +
        + {include file="var.tpl"} + {if $ivars} +

        Inherited Variables

        + + {section name=ivars loop=$ivars} +

        Inherited from {$ivars[ivars].parent_class}

        +
        + {section name=ivars2 loop=$ivars[ivars].ivars} + + {$ivars[ivars].ivars[ivars2].link}{if $ivars[ivars].ivars[ivars2].ivar_sdesc}: {$ivars[ivars].ivars[ivars2].ivar_sdesc}{/if}
        +
        + {/section} +
        + {/section} + {/if} +
        +
        +{/if} + +{if $methods || $imethods} + +
        +
        Methods
        + +
        + {include file="method.tpl"} + {if $imethods} +

        Inherited Methods

        + + {section name=imethods loop=$imethods} + +

        Inherited From {$imethods[imethods].parent_class}

        +
        + {section name=im2 loop=$imethods[imethods].imethods} + {$imethods[imethods].imethods[im2].link}{if $imethods[imethods].imethods[im2].ifunction_sdesc}: {$imethods[imethods].imethods[im2].ifunction_sdesc}{/if}
        + {/section} +
        + {/section} + {/if} +
        +
        +{/if} + +{if $consts || $iconsts} + +
        +
        Class Constants
        + +
        + {include file="const.tpl"} + {if $iconsts} +

        Inherited Constants

        + + {section name=iconsts loop=$iconsts} +

        Inherited from {$iconsts[iconsts].parent_class}

        +
        + {section name=iconsts2 loop=$iconsts[iconsts].iconsts} + + + {$iconsts[iconsts].iconsts[iconsts2].link}{if $iconsts[iconsts].iconsts[iconsts2].iconst_sdesc}: {$iconsts[iconsts].iconsts[iconsts2].iconst_sdesc}{/if}
        +
        + {/section} +
        + {/section} + {/if} +
        +
        +{/if} + +{include file="footer.tpl" top3=true} diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/classtrees.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/classtrees.tpl new file mode 100644 index 00000000..5188e8cf --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/classtrees.tpl @@ -0,0 +1,11 @@ +{include file="header.tpl" top1=true} + + +

        + {$smarty.capture.title} +

        +{section name=classtrees loop=$classtrees} +

        Root class {$classtrees[classtrees].class}

        +{$classtrees[classtrees].class_tree} +{/section} +{include file="footer.tpl"} \ No newline at end of file diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/const.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/const.tpl new file mode 100644 index 00000000..4157488f --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/const.tpl @@ -0,0 +1,18 @@ +{section name=consts loop=$consts} + +
        + +
        + + + {$consts[consts].const_name} + = {$consts[consts].const_value|replace:"\n":"
        "}
        + (line {if $consts[consts].slink}{$consts[consts].slink}{else}{$consts[consts].line_number}{/if}) +
        +
        + + {include file="docblock.tpl" sdesc=$consts[consts].sdesc desc=$consts[consts].desc tags=$consts[consts].tags} + +
        +{/section} + diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/define.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/define.tpl new file mode 100644 index 00000000..ab76faa2 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/define.tpl @@ -0,0 +1,24 @@ +{section name=def loop=$defines} + +
        + +
        + + {$defines[def].define_name} = {$defines[def].define_value|replace:"\n":"
        "} + (line {if $defines[def].slink}{$defines[def].slink}{else}{$defines[def].line_number}{/if}) +
        +
        + + {include file="docblock.tpl" sdesc=$defines[def].sdesc desc=$defines[def].desc tags=$defines[def].tags} + + {if $globals[glob].global_conflicts.conflict_type} +
        +
        Conflicts with constants:
        + {section name=me loop=$defines[def].define_conflicts.conflicts} + {$defines[def].define_conflicts.conflicts[me]}
        + {/section} +
        + {/if} + +
        +{/section} \ No newline at end of file diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/docblock.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/docblock.tpl new file mode 100644 index 00000000..8a87c9b7 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/docblock.tpl @@ -0,0 +1,14 @@ + +{if $sdesc} +

        {$sdesc}

        +{/if} +{if $desc} +

        {$desc}

        +{/if} +{if $tags} +
          + {section name=tags loop=$tags} +
        • {$tags[tags].keyword}: {$tags[tags].data}
        • + {/section} +
        +{/if} diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/elementindex.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/elementindex.tpl new file mode 100644 index 00000000..6e651db1 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/elementindex.tpl @@ -0,0 +1,12 @@ +{include file="header.tpl" noleftindex=true} + +

        Full index

        +

        Package indexes

        + +
        +{include file="basicindex.tpl" indexname="elementindex"} +{include file="footer.tpl"} diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/errors.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/errors.tpl new file mode 100644 index 00000000..1576a822 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/errors.tpl @@ -0,0 +1,21 @@ +{include file="header.tpl" noleftindex=true} +{section name=files loop=$files} +{$files[files].file}
        +{/section} +{foreach key=file item=issues from=$all} + +

        {$file}

        +{if count($issues.warnings)} +

        Warnings:


        +{section name=warnings loop=$issues.warnings} +{$issues.warnings[warnings].name} - {$issues.warnings[warnings].listing}
        +{/section} +{/if} +{if count($issues.errors)} +

        Errors:


        +{section name=errors loop=$issues.errors} +{$issues.errors[errors].name} - {$issues.errors[errors].listing}
        +{/section} +{/if} +{/foreach} +{include file="footer.tpl"} diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/examplesource.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/examplesource.tpl new file mode 100644 index 00000000..c813280b --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/examplesource.tpl @@ -0,0 +1,6 @@ +{include file="header.tpl" title=$title} +

        {$title}

        +
        +{$source} +
        +{include file="footer.tpl"} \ No newline at end of file diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/filesource.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/filesource.tpl new file mode 100644 index 00000000..4fd821a2 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/filesource.tpl @@ -0,0 +1,8 @@ +{capture name="tutle"}File Source for {$name}{/capture} +{include file="header.tpl" title=$smarty.capture.tutle} +

        Source for file {$name}

        +

        Documentation is available at {$docs}

        +
        +{$source} +
        +{include file="footer.tpl"} \ No newline at end of file diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/footer.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/footer.tpl new file mode 100644 index 00000000..424ebbe2 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/footer.tpl @@ -0,0 +1,8 @@ +{if !$index} +

        + Documentation generated on {$date} by phpDocumentor {$phpdocversion} +

        +{/if} + {if $top3}{/if} + + diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/function.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/function.tpl new file mode 100644 index 00000000..2750a97e --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/function.tpl @@ -0,0 +1,44 @@ +{section name=func loop=$functions} + +
        + +
        + {$functions[func].function_name} (line {if $functions[func].slink}{$functions[func].slink}{else}{$functions[func].line_number}{/if}) +
        + + {include file="docblock.tpl" sdesc=$functions[func].sdesc desc=$functions[func].desc tags=$functions[func].tags params=$functions[func].params function=false} + +
        + {$functions[func].function_return} + + {if $functions[func].ifunction_call.returnsref}&{/if}{$functions[func].function_name} + + {if count($functions[func].ifunction_call.params)} + ({section name=params loop=$functions[func].ifunction_call.params}{if $smarty.section.params.iteration != 1}, {/if}{if $functions[func].ifunction_call.params[params].hasdefault}[{/if}{$functions[func].ifunction_call.params[params].type} {$functions[func].ifunction_call.params[params].name}{if $functions[func].ifunction_call.params[params].hasdefault} = {$functions[func].ifunction_call.params[params].default|escape:"html"}]{/if}{/section}) + {else} + () + {/if} +
        + + {if $functions[func].params} +
          + {section name=params loop=$functions[func].params} +
        • + {$functions[func].params[params].datatype} + {$functions[func].params[params].var}{if $functions[func].params[params].data}: {$functions[func].params[params].data}{/if} +
        • + {/section} +
        + {/if} + + {if $functions[func].function_conflicts.conflict_type} +
        +
        Conflicts with functions:
        + {section name=me loop=$functions[func].function_conflicts.conflicts} + {$functions[func].function_conflicts.conflicts[me]}
        + {/section} +
        + {/if} + +
        +{/section} diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/global.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/global.tpl new file mode 100644 index 00000000..3c89ddfc --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/global.tpl @@ -0,0 +1,26 @@ +{section name=glob loop=$globals} + +
        + +
        + + {$globals[glob].global_type} + {$globals[glob].global_name} + {if $vars[vars].var_default} = {$globals[glob].global_value|replace:"\n":"
        "}
        {/if} + (line {if $globals[glob].slink}{$globals[glob].slink}{else}{$globals[glob].line_number}{/if}) +
        +
        + + {include file="docblock.tpl" sdesc=$globals[glob].sdesc desc=$globals[glob].desc tags=$globals[glob].tags} + + {if $globals[glob].global_conflicts.conflict_type} +
        +
        Conflicts with global variables:
        + {section name=me loop=$globals[glob].global_conflicts.conflicts} + {$globals[glob].global_conflicts.conflicts[me]}
        + {/section} +
        + {/if} + +
        +{/section} \ No newline at end of file diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/header.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/header.tpl new file mode 100644 index 00000000..d5e26dfa --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/header.tpl @@ -0,0 +1,12 @@ + + + + + + {$title} + + + + + {if $top3}
        {/if} + diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/include.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/include.tpl new file mode 100644 index 00000000..bd408aff --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/include.tpl @@ -0,0 +1,16 @@ +{section name=includes loop=$includes} + +
        + +
        + + {$includes[includes].include_name} + ({$includes[includes].include_value}) + (line {if $includes[includes].slink}{$includes[includes].slink}{else}{$includes[includes].line_number}{/if}) + +
        + + {include file="docblock.tpl" sdesc=$includes[includes].sdesc desc=$includes[includes].desc tags=$includes[includes].tags} + +
        +{/section} \ No newline at end of file diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/index.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/index.tpl new file mode 100644 index 00000000..477d2b17 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/index.tpl @@ -0,0 +1,24 @@ + + + + + + {$title} + + + + + + + + + + + <H2>Frame Alert</H2> + <P>This document is designed to be viewed using the frames feature. + If you see this message, you are using a non-frame-capable web client.</P> + + + diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/left_frame.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/left_frame.tpl new file mode 100644 index 00000000..4232d845 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/left_frame.tpl @@ -0,0 +1,149 @@ +{include file="header.tpl" top2=true} +
        {$package}
        +
        + +
        + +
        Description
        +
        + Class trees
        + Index of elements
        + {if $hastodos} + Todo List
        + {/if} +
        + + {section name=p loop=$info} + + {if $info[p].subpackage == ""} + + {if $info[p].tutorials} +
        Tutorials/Manuals
        +
        + {if $info[p].tutorials.pkg} +
        +
        Package-level
        +
        + {section name=ext loop=$info[p].tutorials.pkg} + {$info[p].tutorials.pkg[ext]} + {/section} +
        +
        + {/if} + + {if $info[p].tutorials.cls} +
        +
        Class-level
        +
        + {section name=ext loop=$info[p].tutorials.cls} + {$info[p].tutorials.cls[ext]} + {/section} +
        +
        + {/if} + + {if $info[p].tutorials.proc} +
        +
        Function-level
        +
        + {section name=ext loop=$info[p].tutorials.proc} + {$info[p].tutorials.proc[ext]} + {/section} +
        +
        + {/if} +
        + {/if} + {if $info[p].classes} +
        Classes
        + {section name=class loop=$info[p].classes} +
        {$info[p].classes[class].title}
        + {/section} + {/if} + {if $info[p].functions} +
        Functions
        + {section name=f loop=$info[p].functions} +
        {$info[p].functions[f].title}
        + {/section} + {/if} + {if $info[p].files} +
        Files
        + {section name=nonclass loop=$info[p].files} +
        {$info[p].files[nonclass].title}
        + {/section} + {/if} + + {else} + {if $info[p].tutorials} +
        Tutorials/Manuals
        +
        + {if $info[p].tutorials.pkg} +
        +
        Package-level
        +
        + {section name=ext loop=$info[p].tutorials.pkg} + {$info[p].tutorials.pkg[ext]} + {/section} +
        +
        + {/if} + + {if $info[p].tutorials.cls} +
        +
        Class-level
        +
        + {section name=ext loop=$info[p].tutorials.cls} + {$info[p].tutorials.cls[ext]} + {/section} +
        +
        + {/if} + + {if $info[p].tutorials.proc} +
        +
        Function-level
        +
        + {section name=ext loop=$info[p].tutorials.proc} + {$info[p].tutorials.proc[ext]} + {/section} +
        +
        + {/if} +
        + {/if} + +
        {$info[p].subpackage}
        +
        +
        + {if $info[p].subpackagetutorial} + + {/if} + {if $info[p].classes} +
        Classes
        + {section name=class loop=$info[p].classes} +
        {$info[p].classes[class].title}
        + {/section} + {/if} + {if $info[p].functions} +
        Functions
        + {section name=f loop=$info[p].functions} +
        {$info[p].functions[f].title}
        + {/section} + {/if} + {if $info[p].files} +
        Files
        + {section name=nonclass loop=$info[p].files} +
        {$info[p].files[nonclass].title}
        + {/section} + {/if} +
        +
        + + {/if} + + {/section} +
        +
        +

        phpDocumentor v {$phpdocversion}

        + + diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/media/banner.css b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/media/banner.css new file mode 100644 index 00000000..e67227b7 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/media/banner.css @@ -0,0 +1,32 @@ +body +{ + background-color: #CCCCFF; + margin: 0px; + padding: 0px; +} + +/* Banner (top bar) classes */ + +.banner { } + +.banner-menu +{ + clear: both; + padding: .5em; + border-top: 2px solid #6666AA; +} + +.banner-title +{ + text-align: right; + font-size: 20pt; + font-weight: bold; + margin: .2em; +} + +.package-selector +{ + background-color: #AAAADD; + border: 1px solid black; + color: yellow; +} diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/media/stylesheet.css b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/media/stylesheet.css new file mode 100644 index 00000000..88f471f2 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/media/stylesheet.css @@ -0,0 +1,144 @@ +a { color: #336699; text-decoration: none; } +a:hover { color: #6699CC; text-decoration: underline; } +a:active { color: #6699CC; text-decoration: underline; } + +body { background : #FFFFFF; } +body, table { font-family: Georgia, Times New Roman, Times, serif; font-size: 10pt } +p, li { line-height: 140% } +a img { border: 0px; } +dd { margin-left: 0px; padding-left: 1em; } + +/* Page layout/boxes */ + +.info-box {} +.info-box-title { margin: 1em 0em 0em 0em; padding: .25em; font-weight: normal; font-size: 14pt; border: 2px solid #999999; background-color: #CCCCFF } +.info-box-body { border: 1px solid #999999; padding: .5em; } +.nav-bar { font-size: 8pt; white-space: nowrap; text-align: right; padding: .2em; margin: 0em 0em 1em 0em; } + +.oddrow { background-color: #F8F8F8; border: 1px solid #AAAAAA; padding: .5em; margin-bottom: 1em} +.evenrow { border: 1px solid #AAAAAA; padding: .5em; margin-bottom: 1em} + +.page-body { max-width: 800px; margin: auto; } +.tree dl { margin: 0px } + +/* Index formatting classes */ + +.index-item-body { margin-top: .5em; margin-bottom: .5em} +.index-item-description { margin-top: .25em } +.index-item-details { font-weight: normal; font-style: italic; font-size: 8pt } +.index-letter-section { background-color: #EEEEEE; border: 1px dotted #999999; padding: .5em; margin-bottom: 1em} +.index-letter-title { font-size: 12pt; font-weight: bold } +.index-letter-menu { text-align: center; margin: 1em } +.index-letter { font-size: 12pt } + +/* Docbook classes */ + +.description {} +.short-description { font-weight: bold; color: #666666; } +.tags { padding-left: 0em; margin-left: 3em; color: #666666; list-style-type: square; } +.parameters { padding-left: 0em; margin-left: 3em; font-style: italic; list-style-type: square; } +.redefinitions { font-size: 8pt; padding-left: 0em; margin-left: 2em; } +.package { } +.package-title { font-weight: bold; font-size: 14pt; border-bottom: 1px solid black } +.package-details { font-size: 85%; } +.sub-package { font-weight: bold; font-size: 120% } +.tutorial { border-width: thin; border-color: #0066ff } +.tutorial-nav-box { width: 100%; border: 1px solid #999999; background-color: #F8F8F8; } +.nav-button-disabled { color: #999999; } +.nav-button:active, +.nav-button:focus, +.nav-button:hover { background-color: #DDDDDD; outline: 1px solid #999999; text-decoration: none } +.folder-title { font-style: italic } + +/* Generic formatting */ + +.field { font-weight: bold; } +.detail { font-size: 8pt; } +.notes { font-style: italic; font-size: 8pt; } +.separator { background-color: #999999; height: 2px; } +.warning { color: #FF6600; } +.disabled { font-style: italic; color: #999999; } + +/* Code elements */ + +.line-number { } + +.class-table { width: 100%; } +.class-table-header { border-bottom: 1px dotted #666666; text-align: left} +.class-name { color: #000000; font-weight: bold; } + +.method-summary { padding-left: 1em; font-size: 8pt } +.method-header { } +.method-definition { margin-bottom: .3em } +.method-title { font-weight: bold; } +.method-name { font-weight: bold; } +.method-signature { font-size: 85%; color: #666666; margin: .5em 0em } +.method-result { font-style: italic; } + +.var-summary { padding-left: 1em; font-size: 8pt; } +.var-header { } +.var-title { margin-bottom: .3em } +.var-type { font-style: italic; } +.var-name { font-weight: bold; } +.var-default {} +.var-description { font-weight: normal; color: #000000; } + +.include-title { } +.include-type { font-style: italic; } +.include-name { font-weight: bold; } + +.const-title { } +.const-name { font-weight: bold; } + +/* Syntax highlighting */ + +.src-code { border: 1px solid #336699; padding: 1em; background-color: #EEEEEE; } +*[class="src-code"] { line-height : 0.5em } + +.src-comm { color: green; } +.src-id { } +.src-inc { color: #0000FF; } +.src-key { color: #0000FF; } +.src-num { color: #CC0000; } +.src-str { color: #66cccc; } +.src-sym { font-weight: bold; } +.src-var { } + +.src-php { font-weight: bold; } + +.src-doc { color: #009999 } +.src-doc-close-template { color: #0000FF } +.src-doc-coretag { color: #0099FF; font-weight: bold } +.src-doc-inlinetag { color: #0099FF } +.src-doc-internal { color: #6699cc } +.src-doc-tag { color: #0080CC } +.src-doc-template { color: #0000FF } +.src-doc-type { font-style: italic } +.src-doc-var { font-style: italic } + +.tute-tag { color: #009999 } +.tute-attribute-name { color: #0000FF } +.tute-attribute-value { color: #0099FF } +.tute-entity { font-weight: bold; } +.tute-comment { font-style: italic } +.tute-inline-tag { color: #636311; font-weight: bold } + +/* tutorial */ + +.authors { } +.author { font-style: italic; font-weight: bold } +.author-blurb { margin: .5em 0em .5em 2em; font-size: 85%; font-weight: normal; font-style: normal } +.example { border: 1px dashed #999999; background-color: #EEEEEE; padding: .5em; } +*[class="example"] { line-height : 0.5em } +.listing { border: 1px dashed #999999; background-color: #EEEEEE; padding: .5em; white-space: nowrap; } +*[class="listing"] { line-height : 0.5em } +.release-info { font-size: 85%; font-style: italic; margin: 1em 0em } +.ref-title-box { } +.ref-title { } +.ref-purpose { font-style: italic; color: #666666 } +.ref-synopsis { } +.title { font-weight: bold; margin: 1em 0em 0em 0em; padding: .25em; border: 2px solid #999999; background-color: #CCCCFF } +.cmd-synopsis { margin: 1em 0em } +.cmd-title { font-weight: bold } +.toc { margin-left: 2em; padding-left: 0em } + diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/method.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/method.tpl new file mode 100644 index 00000000..3138a925 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/method.tpl @@ -0,0 +1,61 @@ + +{section name=methods loop=$methods} + +
        + +
        + {if $methods[methods].ifunction_call.constructor}Constructor {elseif $methods[methods].ifunction_call.destructor}Destructor {/if}{$methods[methods].function_name} (line {if $methods[methods].slink}{$methods[methods].slink}{else}{$methods[methods].line_number}{/if}) +
        + + {include file="docblock.tpl" sdesc=$methods[methods].sdesc desc=$methods[methods].desc tags=$methods[methods].tags params=$methods[methods].params function=false} + +
        + {$methods[methods].function_return} + + {if $methods[methods].ifunction_call.returnsref}&{/if}{$methods[methods].function_name} + + {if count($methods[methods].ifunction_call.params)} + ({section name=params loop=$methods[methods].ifunction_call.params}{if $smarty.section.params.iteration != 1}, {/if}{if $methods[methods].ifunction_call.params[params].default}[{/if}{$methods[methods].ifunction_call.params[params].type} {$methods[methods].ifunction_call.params[params].name}{if $methods[methods].ifunction_call.params[params].default} = {$methods[methods].ifunction_call.params[params].default}]{/if}{/section}) + {else} + () + {/if} +
        + + {if $methods[methods].params} +
          + {section name=params loop=$methods[methods].params} +
        • + {$methods[methods].params[params].datatype} + {$methods[methods].params[params].var}{if $methods[methods].params[params].data}: {$methods[methods].params[params].data}{/if} +
        • + {/section} +
        + {/if} + + {if $methods[methods].method_overrides} +
        +
        Redefinition of:
        +
        +
        {$methods[methods].method_overrides.link}
        + {if $methods[methods].method_overrides.sdesc} +
        {$methods[methods].method_overrides.sdesc}
        + {/if} +
        + {/if} + + {if $methods[methods].descmethod} +
        +
        Redefined in descendants as:
        +
          + {section name=dm loop=$methods[methods].descmethod} +
        • + {$methods[methods].descmethod[dm].link} + {if $methods[methods].descmethod[dm].sdesc} + : {$methods[methods].descmethod[dm].sdesc} + {/if} +
        • + {/section} +
        + {/if} +
        +{/section} diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/page.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/page.tpl new file mode 100644 index 00000000..e5e1913c --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/page.tpl @@ -0,0 +1,211 @@ +{include file="header.tpl" top3=true} + +

        {$source_location}

        + + +
        +
        Description
        + +
        + {include file="docblock.tpl" desc=$desc sdesc=$sdesc tags=$tags} + + {if $tutorial} +
        +
        Tutorial: {$tutorial}
        + {/if} +
        +
        + +{if $classes} + +
        +
        Classes
        + +
        + + + + + + {section name=classes loop=$classes} + + + + + {/section} +
        ClassDescription
        + {$classes[classes].link} + + {if $classes[classes].sdesc} + {$classes[classes].sdesc} + {else} + {$classes[classes].desc} + {/if} +
        +
        +
        +{/if} + +{if $includes} + +
        +
        Includes
        + +
        + {include file="include.tpl"} +
        +
        +{/if} + +{if $defines} + +
        +
        Constants
        + +
        + {include file="define.tpl"} +
        +
        +{/if} + +{if $globals} + +
        +
        Variables
        + +
        + {include file="global.tpl"} +
        +
        +{/if} + +{if $functions} + +
        +
        Functions
        + +
        + {include file="function.tpl"} +
        +
        +{/if} + +{include file="footer.tpl" top3=true} diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/pkgelementindex.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/pkgelementindex.tpl new file mode 100644 index 00000000..542af8ed --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/pkgelementindex.tpl @@ -0,0 +1,17 @@ +{include file="header.tpl"} + +

        [{$package}] element index

        +{if count($packageindex) > 1} +

        Package indexes

        +
          + {section name=p loop=$packageindex} + {if $packageindex[p].title != $package} +
        • {$packageindex[p].title}
        • + {/if} + {/section} +
        +{/if} +All elements +
        +{include file="basicindex.tpl" indexname=elementindex_$package} +{include file="footer.tpl"} diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/ric.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/ric.tpl new file mode 100644 index 00000000..c4cb83f9 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/ric.tpl @@ -0,0 +1,6 @@ +{include file="header.tpl"} +

        {$name}

        +
        +{$contents|htmlentities}
        +
        +{include file="footer.tpl"} \ No newline at end of file diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/todolist.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/todolist.tpl new file mode 100644 index 00000000..5ab0bca2 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/todolist.tpl @@ -0,0 +1,14 @@ +{include file="header.tpl" title="Todo List"} +

        Todo List

        +{foreach from=$todos key=todopackage item=todo} +

        {$todopackage}

        +{section name=todo loop=$todo} +

        {$todo[todo].link}

        +
          +{section name=t loop=$todo[todo].todos} +
        • {$todo[todo].todos[t]}
        • +{/section} +
        +{/section} +{/foreach} +{include file="footer.tpl"} \ No newline at end of file diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/top_frame.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/top_frame.tpl new file mode 100644 index 00000000..31f559cb --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/top_frame.tpl @@ -0,0 +1,43 @@ + + + + + + {$title} + + + + + + + + \ No newline at end of file diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/tutorial.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/tutorial.tpl new file mode 100644 index 00000000..deb1ee04 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/tutorial.tpl @@ -0,0 +1,13 @@ +{include file="header.tpl" title=$title top3=true} + +{if $nav} + {include file="tutorial_nav.tpl" prev=$prev next=$next up=$up prevtitle=$prevtitle nexttitle=$nexttitle uptitle=$uptitle} +{/if} + +{$contents} + +{if $nav} + {include file="tutorial_nav.tpl" prev=$prev next=$next up=$up prevtitle=$prevtitle nexttitle=$nexttitle uptitle=$uptitle} +{/if} + +{include file="footer.tpl" top3=true} \ No newline at end of file diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/tutorial_nav.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/tutorial_nav.tpl new file mode 100644 index 00000000..9b42fec8 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/tutorial_nav.tpl @@ -0,0 +1,41 @@ + + + + + + + + + + + +
        + {if $prev} + Previous + {else} + Previous + {/if} + + {if $up} + Up + {/if} + + {if $next} + Next + {else} + Next + {/if} +
        + {if $prevtitle} + {$prevtitle} + {/if} + + {if $uptitle} + {$uptitle} + {/if} + + {if $nexttitle} + {$nexttitle} + {/if} +
        + \ No newline at end of file diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/tutorial_toc.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/tutorial_toc.tpl new file mode 100644 index 00000000..314ebd81 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/tutorial_toc.tpl @@ -0,0 +1,39 @@ +{if count($toc)} +

        Table of Contents

        +
          + {assign var="lastcontext" value='refsect1'} + {section name=toc loop=$toc} + + {if $toc[toc].tagname != $lastcontext} + {if $lastcontext == 'refsect1'} +
            +
          • {$toc[toc].link}
          • + {else} + {if $lastcontext == 'refsect2'} + {if $toc[toc].tagname == 'refsect1'} +
          +
        • {$toc[toc].link}
        • + {/if} + {if $toc[toc].tagname == 'refsect3'} +
            +
          • {$toc[toc].link}
          • + {/if} + {else} +
          +
        • {$toc[toc].link}
        • + {/if} + {/if} + {assign var="lastcontext" value=$toc[toc].tagname} + {else} +
        • {$toc[toc].link}
        • + {/if} + {/section} + {if $lastcontext == 'refsect2'} +
        + {/if} + {if $lastcontext == 'refsect3'} + + + {/if} + +{/if} diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/tutorial_tree.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/tutorial_tree.tpl new file mode 100644 index 00000000..d5a18355 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/tutorial_tree.tpl @@ -0,0 +1,6 @@ + +{if $haskids} +
        + {$kids} +
        +{/if} diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/var.tpl b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/var.tpl new file mode 100644 index 00000000..59c4d8cd --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/default/templates/var.tpl @@ -0,0 +1,44 @@ +{section name=vars loop=$vars} + +
        + +
        + + {$vars[vars].var_type} + {$vars[vars].var_name} + {if $vars[vars].var_default} = {$vars[vars].var_default|replace:"\n":"
        "}
        {/if} + (line {if $vars[vars].slink}{$vars[vars].slink}{else}{$vars[vars].line_number}{/if}) +
        +
        + + {include file="docblock.tpl" sdesc=$vars[vars].sdesc desc=$vars[vars].desc tags=$vars[vars].tags} + + {if $vars[vars].var_overrides} +
        +
        Redefinition of:
        +
        +
        {$vars[vars].var_overrides.link}
        + {if $vars[vars].var_overrides.sdesc} +
        {$vars[vars].var_overrides.sdesc}
        + {/if} +
        + {/if} + + {if $vars[vars].descvar} +
        +
        Redefined in descendants as:
        +
          + {section name=vm loop=$vars[vars].descvar} +
        • + {$vars[vars].descvar[vm].link} + {if $vars[vars].descvar[vm].sdesc} + : {$vars[vars].descvar[vm].sdesc} + {/if} +
        • + {/section} +
        + {/if} + +
        +{/section} + diff --git a/buildscripts/PhpDocumentor/phpDocumentor/DescHTML.inc b/buildscripts/PhpDocumentor/phpDocumentor/DescHTML.inc new file mode 100644 index 00000000..f4fa31d3 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/DescHTML.inc @@ -0,0 +1,241 @@ +> in a description + * @package phpDocumentor + * @subpackage DescHTML + */ +class parserCode extends parserStringWithInlineTags +{ + /** + * @param Converter + * @uses Converter::ProgramExample() + */ + function Convert(&$c) + { + if (!isset($this->value[0])) return ''; + if (is_string($this->value[0]) && $this->value[0]{0} == "\n") + { + $this->value[0] = substr($this->value[0],1); + } + $linktags = array(); + foreach($this->value as $val) { + if (phpDocumentor_get_class($val) == 'parserlinkinlinetag' || + phpDocumentor_get_class($val) == 'parsertutorialinlinetag') { + $linktags[] = array($c->postProcess($val->Convert($c, false, false)), $val); + } + } + $a = $c->ProgramExample(rtrim(ltrim(parent::Convert($c, false, false), "\n\r"))); + foreach ($linktags as $tag) { + $a = str_replace($tag[0], $tag[1]->Convert($c, false, false), $a); + } + return $a; +// else return $c->PreserveWhiteSpace($this->getString(false)); + } +} + +/** + * Used for <
        > in a description
        + * @package phpDocumentor
        + * @subpackage DescHTML
        + */
        +class parserPre extends parserStringWithInlineTags
        +{
        +    /**
        +     * @param Converter
        +     * @uses Converter::PreserveWhiteSpace()
        +     */
        +    function Convert(&$c)
        +    {
        +        return $c->PreserveWhiteSpace(rtrim(ltrim(parent::Convert($c, false, false), "\n\r")));
        +    }
        +}
        +
        +/**
        + * Used for <> in a description
        + * @package phpDocumentor
        + * @subpackage DescHTML
        + */
        +class parserB extends parserStringWithInlineTags
        +{
        +    /**
        +     * @param Converter
        +     * @uses Converter::Bolden()
        +     */
        +    function Convert(&$c)
        +    {
        +        return $c->Bolden(parent::Convert($c));
        +    }
        +}
        +
        +/**
        + * Used for <> in a description
        + * @package phpDocumentor
        + * @subpackage DescHTML
        + */
        +class parserI extends parserStringWithInlineTags
        +{
        +    /**
        +     * @param Converter
        +     * @uses Converter::Italicize()
        +     */
        +    function Convert(&$c)
        +    {
        +        return $c->Italicize(parent::Convert($c));
        +    }
        +}
        +
        +/**
        + * Used for <> in a description
        + * @package phpDocumentor
        + * @subpackage DescHTML
        + */
        +class parserDescVar extends parserStringWithInlineTags
        +{
        +    /**
        +     * @param Converter
        +     * @uses Converter::Varize()
        +     */
        +    function Convert(&$c)
        +    {
        +        return $c->Varize(parent::Convert($c));
        +    }
        +}
        +
        +/**
        + * Used for <> in a description
        + * @package phpDocumentor
        + * @subpackage DescHTML
        + */
        +class parserSamp extends parserStringWithInlineTags
        +{
        +    /**
        +     * @param Converter
        +     * @uses Converter::Sampize()
        +     */
        +    function Convert(&$c)
        +    {
        +        return $c->Sampize(parent::Convert($c));
        +    }
        +}
        +
        +/**
        + * Used for <> in a description
        + * @package phpDocumentor
        + * @subpackage DescHTML
        + */
        +class parserKbd extends parserStringWithInlineTags
        +{
        +    /**
        +     * @param Converter
        +     * @uses Converter::Kbdize()
        +     */
        +    function Convert(&$c)
        +    {
        +        return $c->Kbdize(parent::Convert($c));
        +    }
        +}
        +
        +/**
        + * Used for <
        > in a description + * @package phpDocumentor + * @subpackage DescHTML + */ +class parserBr extends parserStringWithInlineTags +{ + /** + * @param Converter + * @uses Converter::Br() + */ + function Convert(&$c) + { + return $c->Br($this->getString()); + } +} + +/** + * Used for lists <
          > and <
            > + * @package phpDocumentor + * @subpackage DescHTML + */ +class parserList extends parserStringWithInlineTags +{ + /** @var boolean */ + var $numbered; + /** @var integer */ + var $items = 0; + /** + * @param integer + */ + function parserList($numbered) + { + $this->numbered = $numbered; + } + + /** @param parserStringWithInlineTags */ + function addItem($item) + { + $this->value[$this->items++] = $item; + } + + /** @param parserList */ + function addList($list) + { + $this->value[$this->items++] = $list; + } + + /** + * @uses Converter::ListItem() enclose each item of the list + * @uses Converter::EncloseList() enclose the list + * @param Converter + */ + function Convert(&$c) + { + $list = ''; + foreach($this->value as $item) + { + $list .= $c->ListItem(trim($item->Convert($c))); + } + return $c->EncloseList($list,$this->numbered); + } +} + +?> diff --git a/buildscripts/PhpDocumentor/phpDocumentor/DocBlock/Lexer.inc b/buildscripts/PhpDocumentor/phpDocumentor/DocBlock/Lexer.inc new file mode 100644 index 00000000..edfc896c --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/DocBlock/Lexer.inc @@ -0,0 +1,701 @@ +tokens = array( + PHPDOC_DOCBLOCK_TOKEN_NEWLINE => 'PHPDOC_DOCBLOCK_TOKEN_NEWLINE', + PHPDOC_DOCBLOCK_TOKEN_DESC => 'PHPDOC_DOCBLOCK_TOKEN_DESC', + PHPDOC_DOCBLOCK_TOKEN_ESCTAGOPEN => 'PHPDOC_DOCBLOCK_TOKEN_ESCTAGOPEN', + PHPDOC_DOCBLOCK_TOKEN_ESCTAGCLOSE => 'PHPDOC_DOCBLOCK_TOKEN_ESCTAGCLOSE', + PHPDOC_DOCBLOCK_TOKEN_TAG => 'PHPDOC_DOCBLOCK_TOKEN_TAG', + PHPDOC_DOCBLOCK_TOKEN_INLINETAG => 'PHPDOC_DOCBLOCK_TOKEN_INLINETAG', + PHPDOC_DOCBLOCK_TOKEN_INLINETAGCLOSE => 'PHPDOC_DOCBLOCK_TOKEN_INLINETAGCLOSE', + PHPDOC_DOCBLOCK_TOKEN_INTERNAL => 'PHPDOC_DOCBLOCK_TOKEN_INTERNAL', + PHPDOC_DOCBLOCK_TOKEN_INTERNALCLOSE => 'PHPDOC_DOCBLOCK_TOKEN_INTERNALCLOSE', + ); + if (in_array($token, array_keys($this->tokens))) { + return $this->tokens[$token]; + } + return 'UNKNOWN'; + } + + function lex($comment) + { + $comment = str_replace(array("\r\n", "\r"), array("\n", "\n"), $comment); + $comment = explode("\n", $comment); + $this->tokens = array(); + $state = PHPDOC_LEXER_DESC; + $this->states = array(PHPDOC_LEXER_DESC); + $tid = 0; + $token = ''; + $esctag = false; + $this->exception = false; + list($lastline,) = each(array_reverse($comment, true)); + foreach ($comment as $this->linenum => $line) { + if ($this->exception) { + $this->tokens = array(); + return false; + } + $linestart = true; + $this->processedline = trim($line); + if ($this->processedline == '*/') { + break; + } + if (!$this->processedline) { + continue; + } + if (substr($this->processedline, 0, 3) == '/**') { + $this->processedline = substr($this->processedline, 3); + if (!$this->processedline) { + continue; + } + if (trim($this->processedline) == '*/') { + $this->endSimpleList(); + break; + } + } else { + $this->processedline = substr($this->processedline, 1); + } + while (true) { + switch ($state) { + case PHPDOC_LEXER_INTERNALTAG : + $internalendpos = strpos($this->processedline, '}}'); + case PHPDOC_LEXER_TAGS : + $trimline = trim($this->processedline); + if (strlen($trimline) && $trimline{0} == '@') { + if (preg_match('/^(@[^\s]+)\s/', $trimline, $matches) || + preg_match('/^(@[^\s]+)$/', $trimline, $matches)) { + $this->tokens[] = array(PHPDOC_DOCBLOCK_TOKEN_TAG, + $matches[1]); + $this->processedline = substr($trimline, strpos($trimline, $matches[1]) + + strlen($matches[1])); + if (!$this->processedline) { + break 2; + } + continue 2; // to while(true) + } + } elseif (preg_match('/^@/', $trimline, $matches)) { + // throw exception for invalid tag + return $this->throwException('Invalid tag encountered in line number ' . + $this->linenum . ': "' . $line . '"', 'tag'); + } else { + $tagpos = strpos($this->processedline, '<'); + $inlinetagpos = strpos($this->processedline, '{@'); + if (isset($internalendpos) && $internalendpos !== false) { + do { + if ($tagpos !== false && $internalendpos > $tagpos) { + break; + } + if ($inlinetagpos !== false && $internalendpos > $inlinetagpos) { + break; + } + // }} is the next important token + $this->appendDesc(substr($this->processedline, 0, + $internalendpos)); + $this->tokens[] = array(PHPDOC_DOCBLOCK_TOKEN_INTERNALCLOSE, '}}'); + $this->processedline = substr($this->processedline, $internalendpos + + 2); + array_shift($this->states); + $state = PHPDOC_LEXER_TAGS; + continue 3; // to while(true); + } while (false); + } + if ($tagpos !== false && $inlinetagpos !== false) { + if ($tagpos > $inlinetagpos) { + $tagpos = false; + } else { + $inlinetagpos = false; + } + } + if ($tagpos !== false) { + continue $this->searchForHTMLTag($tagpos, + $state, $esctag, $linestart, $trimline); + } + if ($inlinetagpos !== false) { + $state = $this->searchForInlineTag($inlinetagpos, $comment); + $linestart = false; + continue 2; // to while (true) + } + if (strpos($this->processedline, '*/')) { + $this->tokens[] = array(PHPDOC_DOCBLOCK_TOKEN_DESC, + substr($this->processedline, + 0, strpos($this->processedline, '*/'))); + return $this->tokens; + } + $this->tokens[] = array(PHPDOC_DOCBLOCK_TOKEN_DESC, $this->processedline); + } + break; + case PHPDOC_LEXER_INTERNAL : + $internalendpos = strpos($this->processedline, '}}'); + case PHPDOC_LEXER_SIMPLELIST : + if ($linestart && $state == PHPDOC_LEXER_SIMPLELIST) { + if (!$this->processSimpleList()) { + while (count($this->simplelist) && !$this->processSimpleList()); + } + if (!count($this->simplelist)) { + array_shift($this->states); + $state = array_shift($this->states); + array_unshift($this->states, $state); + } + } + case PHPDOC_LEXER_DESC : + if (strpos($this->processedline, '*/')) { + $this->processedline = substr($this->processedline, + 0, strpos($this->processedline, '*/')); + } + if (!$this->processedline) { + if ($this->linenum != $lastline) { + $this->tokens[] = array(PHPDOC_DOCBLOCK_TOKEN_NEWLINE, "\n"); + } + continue 3; // to foreach + } + $trimline = trim($this->processedline); + if ($linestart && $state != PHPDOC_LEXER_TAGS && $trimline{0} == '@') { + if ($state == PHPDOC_LEXER_INTERNAL) { + // throw exception + return $this->throwException('Cannot start tags in {@internal}} ' . + ' in line number ' . + $this->linenum . ': "' . $line . '"', 'tag'); + } + $this->states = array(PHPDOC_LEXER_TAGS); + $state = PHPDOC_LEXER_TAGS; + continue 2; // to while(true) + + } + if ($state != PHPDOC_LEXER_SIMPLELIST && $linestart && strlen($trimline) > 3 && + ($trimline{0} == '-' || $trimline{0} == '*' || + $trimline{0} == '#' || $trimline{0} == 'o' || + $trimline{0} == '1')) { + if ($this->searchForSimplelist($trimline)) { + $state = PHPDOC_LEXER_SIMPLELIST; + $linestart = false; + continue 2; // to while(true) + } + } + $tagpos = strpos($this->processedline, '<'); + $inlinetagpos = strpos($this->processedline, '{@'); + if (isset($internalendpos) && $internalendpos !== false) { + do { + if ($tagpos !== false && $internalendpos > $tagpos) { + break; + } + if ($inlinetagpos !== false && $internalendpos > $inlinetagpos) { + break; + } + // }} is the next important token + $this->appendDesc(substr($this->processedline, 0, $internalendpos)); + $this->tokens[] = array(PHPDOC_DOCBLOCK_TOKEN_INTERNALCLOSE, '}}'); + $this->processedline = substr($this->processedline, $internalendpos + + 2); + array_shift($this->states); + $state = PHPDOC_LEXER_DESC; + continue 3; // to while(true); + } while (false); + } + if ($tagpos !== false && $inlinetagpos !== false) { + if ($tagpos > $inlinetagpos) { + $tagpos = false; + } else { + $inlinetagpos = false; + } + } + if ($tagpos !== false) { + continue $this->searchForHTMLTag($tagpos, $state, + $esctag, $linestart, $trimline); + } + if ($inlinetagpos !== false) { + $state = $this->searchForInlineTag($inlinetagpos, $comment); + $linestart = false; + continue 2; // to while (true) + } + $this->appendDesc($this->processedline); + break; + case PHPDOC_LEXER_ESCTAG : + if (!$this->processedline) { + if ($this->linenum != $lastline) { + $this->tokens[] = array(PHPDOC_DOCBLOCK_TOKEN_NEWLINE, "\n"); + } + continue 3; // to foreach + } + $endpos = strpos($this->processedline, $esctag); + $inlinetagpos = strpos($this->processedline, '{@'); + if ($endpos !== false && $inlinetagpos !== false) { + if ($endpos > $inlinetagpos) { + $endpos = false; + } else { + $inlinetagpos = false; + } + } + if ($endpos !== false) { + if (strlen(substr($this->processedline, 0, $endpos))) { + $this->appendDesc(substr($this->processedline, 0, $endpos)); + } + $this->tokens[] = array(PHPDOC_DOCBLOCK_TOKEN_ESCTAGCLOSE, $esctag); + $this->processedline = substr($this->processedline, $endpos + + strlen($esctag)); + $state = $this->states[0]; + if (count($this->states) > 1) { + array_shift($this->states); + } + if (!$this->processedline) { + break 2; + } + } + if ($inlinetagpos !== false) { + array_unshift($this->states, PHPDOC_LEXER_ESCTAG); + $state = $this->searchForInlineTag($inlinetagpos, $comment); + $linestart = false; + continue 2; // to while (true) + } + $this->appendDesc($this->processedline); + break; + case PHPDOC_LEXER_INLINETAG : + if (!$this->processedline) { + if ($this->linenum != $lastline) { + $this->tokens[] = array(PHPDOC_DOCBLOCK_TOKEN_NEWLINE, "\n"); + } + continue 3; // to foreach + } + $endpos = strpos($this->processedline, '}'); + if ($endpos !== false) { + if (strlen(substr($this->processedline, 0, $endpos))) { + $this->appendDesc(substr($this->processedline, 0, $endpos)); + } + $this->tokens[] = array(PHPDOC_DOCBLOCK_TOKEN_INLINETAGCLOSE, '}'); + $this->processedline = substr($this->processedline, $endpos + 1); // strlen('}') + $state = $this->states[0]; + if (count($this->states) > 1) { + array_shift($this->states); + } + if (!$this->processedline) { + break 2; + } + if ($state != PHPDOC_LEXER_INLINETAG && strlen($this->processedline)) { + $linestart = false; + continue 2; // to while (true) + } + } + $this->appendDesc($this->processedline); + break; + } + break; + } + if ($this->linenum != $lastline) { + $this->tokens[] = array(PHPDOC_DOCBLOCK_TOKEN_NEWLINE, "\n"); + } + } + return $this->tokens; + } + + function searchForSimplelist($trimline) + { + $whitespace = strpos($this->processedline, $trimline); + switch ($trimline{0}) { + case '-' : + case '*' : + case '+' : + case 'o' : + if (strlen($trimline) < 3 || $trimline{1} != ' ') { + return false; + } + // unordered lists + $this->simplelist[] = 'u' . $trimline{0}; + $this->whitespace[] = $whitespace; + $this->tokens[] = array(PHPDOC_DOCBLOCK_TOKEN_SIMPLELISTSTART, ''); + $this->tokens[] = array(PHPDOC_DOCBLOCK_TOKEN_UNORDEREDBULLET, $trimline{0}); + $this->processedline = substr($this->processedline, strpos($this->processedline, + $trimline{0}) + 2); + array_unshift($this->states, PHPDOC_LEXER_SIMPLELIST); + return true; + break; + case '#' : + if (strlen($trimline) < 3) { + return false; + } + // ordered lists + $this->simplelist[] = '#1'; + $this->whitespace[] = $whitespace; + $this->tokens[] = array(PHPDOC_DOCBLOCK_TOKEN_SIMPLELISTSTART, ''); + $this->tokens[] = array(PHPDOC_DOCBLOCK_TOKEN_ORDEREDBULLET, '#'); + $this->processedline = substr($this->processedline, strpos($this->processedline, + '#') + 2); + array_unshift($this->states, PHPDOC_LEXER_SIMPLELIST); + return true; + case '1' : + if (strlen($trimline) < 4) { + return false; + } + if ($trimline{1} == ' ') { + $this->simplelist[] = 'O1'; + } elseif ($trimline{1} == '.' && $trimline{2} == ' ') { + $this->simplelist[] = 'o1'; + } else { + return false; + } + $this->whitespace[] = $whitespace; + $this->tokens[] = array(PHPDOC_DOCBLOCK_TOKEN_SIMPLELISTSTART, ''); + if ($trimline{1} == '.') { + $this->tokens[] = array(PHPDOC_DOCBLOCK_TOKEN_ORDEREDBULLET, '1.'); + $this->processedline = substr($this->processedline, strpos($this->processedline, + '1.') + 3); + } else { + $this->tokens[] = array(PHPDOC_DOCBLOCK_TOKEN_ORDEREDBULLET, '1'); + $this->processedline = substr($this->processedline, strpos($this->processedline, + '1') + 2); + } + array_unshift($this->states, PHPDOC_LEXER_SIMPLELIST); + return true; + } + return false; + } + + /** + * @todo process multi-line elements via whitespace + * @todo process nested simple lists + */ + function processSimpleList() + { + $trimline = trim($this->processedline); + $index = count($this->simplelist) - 1; + $whitespace = strpos($this->processedline, $trimline); + if ($whitespace < $this->whitespace[$index]) { + while (count($this->whitespace[$index]) && $whitespace < $this->whitespace[$index]) { + // the end of the current simplelist + $this->tokens = array(PHPDOC_DOCBLOCK_TOKEN_SIMPLELISTEND, ''); + array_pop($this->simplelist); + $index--; + } + if ($index == -1) { + return false; // all simple lists concluded + } + } + if ($whitespace > $this->whitespace[$index]) { + // could be a multi-line element or a new list + if (!$this->searchForSimplelist($trimline)) { + // trim off the simple list whitespace if this is multi-line + $this->processedline = substr($this->processedline, $this->whitespace[$index] + 2); + } + return true; + } + // implied: whitespace matches exactly so this is either another + // bullet point or the end of the simple list + switch ($this->simplelist[$index]{0}) { + case 'u' : + if (strlen($trimline) < 3 || $trimline{0} != $this->simplelist[$index]{1} || + $trimline{1} != ' ') { + $this->tokens[] = array(PHPDOC_DOCBLOCK_TOKEN_SIMPLELISTEND, ''); + array_pop($this->simplelist); + return false; + } + $this->tokens[] = array(PHPDOC_DOCBLOCK_TOKEN_UNORDEREDBULLET, $trimline{0}); + $this->processedline = substr($this->processedline, strpos($this->processedline, + $trimline{0}) + 2); + break; + case 'o' : + if (strlen($trimline) < 4 || ($trimline{0} != + ($this->simplelist[$index]{1} + 1) . '') || + $trimline{1} != '.' || $trimline{2} != ' ') { + $this->tokens[] = array(PHPDOC_DOCBLOCK_TOKEN_SIMPLELISTEND, ''); + array_pop($this->simplelist); + return false; + } + $this->simplelist[$index] = $this->simplelist[$index]{0} . + ($this->simplelist[$index]{1} + 1); + $this->tokens[] = array(PHPDOC_DOCBLOCK_TOKEN_ORDEREDBULLET, + $this->simplelist[$index]{1} . '.'); + $this->processedline = substr($this->processedline, strpos($this->processedline, + $trimline{0} . '.') + 3); + break; + case 'O' : + if (strlen($trimline) < 3 || $trimline{0} != ($this->simplelist[$index]{1} + 1) . '' || + $trimline{1} != ' ') { + $this->tokens[] = array(PHPDOC_DOCBLOCK_TOKEN_SIMPLELISTEND, ''); + array_pop($this->simplelist); + return false; + } + $this->simplelist[$index] = $this->simplelist[$index]{0} . + ($this->simplelist[$index]{1} + 1); + $this->tokens[] = array(PHPDOC_DOCBLOCK_TOKEN_ORDEREDBULLET, + $this->simplelist[$index]{1}); + $this->processedline = substr($this->processedline, strpos($this->processedline, + $this->simplelist[$index]{1}) + 2); + break; + case '#' : + if (strlen($trimline) < 3 || $trimline{0} != '#' || + $trimline{1} != ' ') { + $this->tokens[] = array(PHPDOC_DOCBLOCK_TOKEN_SIMPLELISTEND, ''); + array_pop($this->simplelist); + return false; + } + $this->simplelist[$index] = $this->simplelist[$index]{0} . + ($this->simplelist[$index]{1} + 1); + $this->tokens[] = array(PHPDOC_DOCBLOCK_TOKEN_ORDEREDBULLET, + $this->simplelist[$index]{1}); + $this->processedline = substr($this->processedline, strpos($this->processedline, + '#') + 2); + break; + } + return true; + } + + function searchForHTMLTag($tagpos, &$state, &$esctag, &$linestart, + &$trimline) + { + if (preg_match('/^<(<\/?[a-zA-Z]+ ?\/?>)>/', substr($this->processedline, $tagpos), + $matches)) { + if ($tagpos) { + $this->appendDesc(substr($this->processedline, 0, $tagpos)); + } + $this->appendDesc($matches[1]); + $this->processedline = substr($this->processedline, $tagpos + + strlen($matches[1]) + + 2); + return 2; + } elseif (!count($matches) && + preg_match('/^<(<\/?[a-zA-Z]+ ?\/?>)>/', substr($this->processedline, $tagpos + 1), + $matches)) { + if ($tagpos) { + $this->appendDesc(substr($this->processedline, 0, $tagpos)); + } + $this->appendDesc('<' . $matches[1]); + $this->processedline = substr($this->processedline, $tagpos + + strlen($matches[1]) + + 3); + return 2; + } elseif (preg_match('#^(br>|br/>|br />)#', + substr($this->processedline, $tagpos + 1), $matches)) { + if ($tagpos) { + $this->appendDesc(substr($this->processedline, 0, $tagpos)); + } + $this->tokens[] = array(PHPDOC_DOCBLOCK_TOKEN_HTMLTAG, 'br'); + $this->tokens[] = array(PHPDOC_DOCBLOCK_TOKEN_HTMLTAGCLOSE, 'br'); + $this->processedline = substr($this->processedline, $tagpos + + strlen($matches[1]) + + 1); + return 2; + } elseif (preg_match('/^(b>|i>|li>|ol>|ul>|p>|pre>|var>)/', + substr($this->processedline, $tagpos + 1), $matches)) { + if ($tagpos) { + $this->appendDesc(substr($this->processedline, 0, $tagpos)); + } + $matches = substr($matches[1], 0, strlen($matches[1]) - 1); + array_push($this->tagStack, $matches); + $this->tokens[] = array(PHPDOC_DOCBLOCK_TOKEN_HTMLTAG, $matches); + $this->processedline = substr($this->processedline, $tagpos + + strlen($matches) + + 2); + return 2; + } elseif (preg_match('#^(/b>|/i>|/li>|/ol>|/ul>|/p>|/pre>|/var>)#', + substr($this->processedline, $tagpos + 1), $matches)) { + if ($tagpos) { + $this->appendDesc(substr($this->processedline, 0, $tagpos)); + } + $matches = substr($matches[1], 1, strlen($matches[1]) - 2); + $test = array_pop($this->tagStack); + if ($matches != $test) { + // throw exception + $this->throwException('Invalid closing html tag encountered in line number ' . + $this->linenum . ': "", expecting ""', 'htmltag'); + return 3; + } + $this->tokens[] = array(PHPDOC_DOCBLOCK_TOKEN_HTMLTAGCLOSE, $matches); + $this->processedline = substr($this->processedline, $tagpos + + strlen($matches) + + 3); + return 2; + } elseif (preg_match('/^(code>|pre>|kbd>|samp>)/', + substr($this->processedline, $tagpos + 1), $matches)) { + $esctag = 'appendDesc(substr($this->processedline, 0, $tagpos)); + } + switch ($matches[0]) { + case 'code>' : + $this->tokens[] = array(PHPDOC_DOCBLOCK_TOKEN_ESCTAGOPEN, + ''); + break; + case 'pre>' : + $this->tokens[] = array(PHPDOC_DOCBLOCK_TOKEN_ESCTAGOPEN, + '
            ');
            +                break;
            +                case 'kbd>' :
            +                    $this->tokens[] = array(PHPDOC_DOCBLOCK_TOKEN_ESCTAGOPEN,
            +                        '');
            +                break;
            +                case 'samp>' :
            +                    $this->tokens[] = array(PHPDOC_DOCBLOCK_TOKEN_ESCTAGOPEN,
            +                        '');
            +                break;
            +            }
            +            $this->processedline = $line = substr($this->processedline, $tagpos
            +                + strlen($matches[0])
            +                + 1);
            +            $state = PHPDOC_LEXER_ESCTAG;
            +            if (!$this->processedline) {
            +                return 3; // to foreach
            +            }
            +            if (strpos($this->processedline, $esctag) !== false) {
            +                if (!strpos($this->processedline, $esctag)) {
            +                    $linestart = false;
            +                    return 2; // to while (true)
            +                }
            +                if (strpos($this->processedline, $esctag)) {
            +                    $this->appendDesc(substr($this->processedline, 0,
            +                        strpos($this->processedline, $esctag)));
            +                }
            +                $this->processedline = $trimline =
            +                    substr($this->processedline, strpos($this->processedline, $esctag));
            +                $linestart = false;
            +                return 2; // to while(true)
            +            }
            +        }
            +    }
            +
            +    function searchForInlineTag($inlinetagpos, $comment)
            +    {
            +        if ($inlinetagpos) {
            +            $this->appendDesc(substr($this->processedline, 0, $inlinetagpos));
            +        }
            +        if ($inlinetagpos === strpos($this->processedline, '{@internal')) {
            +            $state = array_shift($this->states);
            +            array_unshift($this->states, $state);
            +            if ($state == PHPDOC_LEXER_INTERNAL || $state == PHPDOC_LEXER_INTERNALTAG) {
            +                // throw exception
            +                return $this->throwException('cannot nest {@internal}} in line number ' .
            +                    $this->linenum . ': "' . $line . '"', 'internaltag');
            +            }
            +            $basestate = array_pop($this->states);
            +            array_push($this->states, $basestate);
            +            if ($basestate == PHPDOC_LEXER_DESC) {
            +                $newstate = PHPDOC_LEXER_INTERNAL;
            +            } else {
            +                $newstate = PHPDOC_LEXER_INTERNALTAG;
            +            }
            +            array_unshift($this->states, $newstate);
            +            $this->tokens[] = array(PHPDOC_DOCBLOCK_TOKEN_INTERNAL, '{@internal');
            +            $this->processedline = substr($this->processedline, $inlinetagpos + strlen('{@internal'));
            +            return $newstate;
            +        }
            +        if (!preg_match('/^({@[^}\s]+)\s/', substr($this->processedline, $inlinetagpos), $matches)) {
            +            if (!preg_match('/^({@[^}\s]+)}/', substr($this->processedline, $inlinetagpos), $matches)) {
            +                if ($this->hasEndchar($comment, '}')) {
            +                    $matches = array(substr($this->processedline, $inlinetagpos),
            +                        substr($this->processedline, $inlinetagpos));
            +                } else {
            +                    // throw exception if this does not match
            +                    $this->throwException('Unclosed inline tag encountered on line number ' .
            +                        $this->linenum . ': "' . $line . '"', 'tag');
            +                    return PHPDOC_LEXER_DESC;
            +                }
            +            } else {
            +                // throw exception if this does not match
            +                $this->throwException('Invalid inline tag encountered in line number ' .
            +                    $this->linenum . ': "' . $line . '"', 'tag');
            +                return PHPDOC_LEXER_DESC;
            +            }
            +        }
            +        $this->tokens[] = array(PHPDOC_DOCBLOCK_TOKEN_INLINETAG, $matches[1]);
            +        $this->processedline = substr($this->processedline, $inlinetagpos + strlen($matches[1]));
            +        return PHPDOC_LEXER_INLINETAG;
            +    }
            +
            +    function appendDesc($desc)
            +    {
            +        if (!strlen($desc)) {
            +            return;
            +        }
            +        if (count($this->tokens)) {
            +            $last = array_pop($this->tokens);
            +            if ($last[0] == PHPDOC_DOCBLOCK_TOKEN_DESC) {
            +                $last[1] .= $desc;
            +                $this->tokens[] = $last;
            +            } else {
            +                $this->tokens[] = $last;
            +                $this->tokens[] = array(PHPDOC_DOCBLOCK_TOKEN_DESC, $desc);
            +            }
            +        } else {
            +            $this->tokens[] = array(PHPDOC_DOCBLOCK_TOKEN_DESC, $desc);
            +        }
            +    }
            +
            +    function hasEndChar($comment, $char)
            +    {
            +        $linenum = $this->linenum;
            +        foreach ($comment as $num => $line) {
            +            if ($linenum !== false && $num <= $linenum) {
            +                continue;
            +            }
            +            $linenum = false;
            +            $processedline = trim($line);
            +            if ($processedline == '*/') {
            +                break;
            +            }
            +            if (!$processedline) {
            +                continue;
            +            }
            +            if (substr($processedline, 0, 3) == '/**') {
            +                $processedline = substr($processedline, 3);
            +                if (!$processedline) {
            +                    continue;
            +                }
            +                if (trim($processedline) == '*/') {
            +                    break;
            +                }
            +            } else {
            +                $processedline = substr($processedline, 1);
            +            }
            +            if (strpos($processedline, $char) !== false) {
            +                return true;
            +            }
            +        }
            +        return false;
            +    }
            +
            +    function endSimpleList()
            +    {
            +        if (count($this->tagStack)) {
            +            $this->tokens = array();
            +            return $this->throwException('Error: unclosed html tags: "' .
            +                implode(', ', $this->tagStack) . '"', 'simplelist');
            +        }
            +        while (count($this->simplelist)) {
            +            $this->tokens[] = array(PHPDOC_DOCBLOCK_TOKEN_SIMPLELISTEND, '');
            +        }
            +    }
            +
            +    function throwException($message, $type)
            +    {
            +        $this->error = array($message, $this->linenum, $type);
            +        $this->exception = true;
            +    }
            +}
            +?>
            \ No newline at end of file
            diff --git a/buildscripts/PhpDocumentor/phpDocumentor/DocBlockTags.inc b/buildscripts/PhpDocumentor/phpDocumentor/DocBlockTags.inc
            new file mode 100644
            index 00000000..fa465deb
            --- /dev/null
            +++ b/buildscripts/PhpDocumentor/phpDocumentor/DocBlockTags.inc
            @@ -0,0 +1,984 @@
            +
            + * @since 1.0rc1
            + * @version $Id: DocBlockTags.inc,v 1.1 2005/10/17 18:36:55 jeichorn Exp $
            + */
            +class parserTag extends parserStringWithInlineTags
            +{
            +    /**
            +     * Type is used by many functions to skip the hassle of if phpDocumentor_get_class($blah) == 'parserBlah'
            +     * always '_tag'
            +     * @var string
            +     */
            +    var $type = '_tag';
            +    /**
            +     * tag name (see, access, etc.)
            +     * @var string
            +     */
            +    var $keyword = '';
            +    
            +    /**
            +     * Set up the tag
            +     *
            +     * {@source}
            +     * @param string $keyword tag name
            +     * @param parserStringWithInlineTags $value
            +     * @param boolean whether to parse the $value for html tags
            +     */
            +    function parserTag($keyword, $value, $noparse = false)
            +    {
            +        $this->keyword = $keyword;
            +        if (!$noparse)
            +        {
            +            $parser = new parserDescParser;
            +            $parser->subscribe('*',$this);
            +            $parser->parse($value->value,true,'parserstringwithinlinetags');
            +        } else $this->value = $value;
            +    }
            +    
            +    /**
            +     * @param Converter
            +     * @see Converter
            +     */
            +    function Convert(&$converter)
            +    {
            +        if (is_array($this->value))
            +        {
            +            if (count($this->value) == 1)
            +            {
            +                list(,$val) = each($this->value);
            +                reset($this->value);
            +                return $val->Convert($converter);
            +            }
            +            $result = '';
            +            foreach($this->value as $val)
            +            {
            +                // this is only true if we processed the description in
            +                // the constructor
            +                if (phpDocumentor_get_class($val) == 'parserstringwithinlinetags')
            +                $result .= $converter->EncloseParagraph($val->Convert($converter));
            +                else
            +                $result .= $val->Convert($converter);
            +            }
            +            return $result;
            +        } else
            +        {
            +            return $this->value->Convert($converter);
            +        }
            +    }
            +    
            +    /**
            +     * Gets a count of the number of paragraphs in this
            +     * tag's description.
            +     *
            +     * Useful in determining whether to enclose the
            +     * tag in a paragraph or not.
            +     * @access private
            +     * @return integer
            +     */
            +    function _valueParagraphCount()
            +    {
            +    }
            +    
            +    /**
            +     * Called by the {@link parserDescParser} when processing a description.
            +     * @param integer not used
            +     * @param array array of {@link parserStringWithInlineTags} representing
            +     *              paragraphs in the tag description
            +     * @see parserTag::parserTag()
            +     */
            +    function HandleEvent($a,$desc)
            +    {
            +        $this->value = $desc;
            +    }
            +    
            +    /**
            +     * @return string returns the text minus any inline tags
            +     * @see parserStringWithInlineTags::getString()
            +     */
            +    function getString()
            +    {
            +        if (is_array($this->value))
            +        {
            +            $result = '';
            +            foreach($this->value as $val)
            +            {
            +                $result .= $val->getString();
            +            }
            +            return $result;
            +        } else return $this->value->getString();
            +    }
            +}
            +
            +/**
            + * This class represents the @name tag
            + * @tutorial tags.name.pkg
            + * @package phpDocumentor
            + * @subpackage DocBlockTags
            + */
            +class parserNameTag extends parserTag
            +{
            +    /**
            +     * tag name
            +     * @var string
            +     */
            +    var $keyword = 'name';
            +    
            +    /**
            +     * @param string not used
            +     * @param string name
            +     */
            +    function parserNameTag($name, $value)
            +    {
            +        $this->value = $value;
            +    }
            +    
            +    /**
            +     * @see parserStringWithInlineTags::Convert()
            +     * @param Converter
            +     * @return string converted value of the tag
            +     */
            +    function Convert(&$c)
            +    {
            +        return $this->value;
            +    }
            +}
            +
            +/**
            + * This class represents the @access tag
            + * @tutorial tags.access.pkg
            + * @package phpDocumentor
            + * @subpackage DocBlockTags
            + */
            +class parserAccessTag extends parserTag
            +{
            +    /**
            +     * tag name
            +     * @var string
            +     */
            +    var $keyword = 'access';
            +    
            +    /**
            +     * set to true if the returned tag has a value type of private, protected
            +     * or public, false otherwise
            +     * @var boolean
            +     */
            +    var $isvalid = false;
            +    
            +    /**
            +     * checks $value to make sure it is private, protected or public, otherwise
            +     * it's not a valid @access tag
            +     * @see $isvalid
            +     * @param parserStringWithInlineTags $value
            +     */
            +    function parserAccessTag($value)
            +    {
            +        if (!is_string($value))
            +        {
            +            if (is_object($value))
            +            {
            +                if (method_exists($value,'getstring'))
            +                {
            +                    $value = $value->getString();
            +                }
            +            }
            +        }
            +        switch(trim($value))
            +        {
            +            case 'private' :
            +            case 'public' :
            +            case 'protected' :
            +                $this->value = $value;
            +                $this->isvalid = true;
            +            break;
            +            default :
            +            addError(PDERROR_ACCESS_WRONG_PARAM,$value);
            +                $this->value = 'public';
            +            break;
            +        }
            +    }
            +    
            +    /**
            +     * @see parserStringWithInlineTags::Convert()
            +     * @param Converter
            +     * @return string converted value of the tag
            +     */
            +    function Convert(&$converter)
            +    {
            +        return $this->value;
            +    }
            +    
            +    /**
            +     * No inline tags are possible, returns 'public', 'protected' or 'private'
            +     * @return string returns the text minus any inline tags
            +     */
            +    function getString()
            +    {
            +        return $this->value;
            +    }
            +}
            +
            +/**
            + * represents "@return"
            + * @tutorial tags.return.pkg
            + * @package phpDocumentor
            + * @subpackage DocBlockTags
            + * @author Greg Beaver 
            + * @since 1.0rc1
            + * @version $Id: DocBlockTags.inc,v 1.1 2005/10/17 18:36:55 jeichorn Exp $
            + */
            +class parserReturnTag extends parserTag
            +{
            +    /**
            +     * always 'return'
            +     * @var string
            +     */
            +    var $keyword = 'return';
            +    /**
            +     * the type a function returns
            +     */
            +    var $returnType = 'void';
            +    
            +    /**
            +     * contains a link to the documentation for a class passed as a type in @return, @var or @param
            +     *
            +     * Example:
            +     *
            +     * 
            +     * class myclass
            +     * {
            +     * ...
            +     * }
            +     * /** @return myclass blahblahblah
            +     * ...
            +     * 
            +     *
            +     * In this case, $converted_returnType will contain a link to myclass instead of the string 'myclass'
            +     * @var mixed either the same as $returnType or a link to the docs for a class
            +     * @see $returnType
            +     */
            +    var $converted_returnType = false;
            +    
            +    /**
            +     * @param string
            +     * @param parserStringWithInlineTags
            +     */
            +    function parserReturnTag($returnType, $value)
            +    {
            +        $this->returnType = $returnType;
            +        parent::parserTag('return',$value);
            +    }
            +    
            +    /**
            +     * sets up $converted_returnType
            +     * @see parserStringWithInlineTags::Convert(), $converted_returnType
            +     * @param Converter
            +     * @return string converted value of the tag
            +     */
            +    function Convert(&$converter)
            +    {
            +        $my_types = '';
            +        if (strpos($this->returnType,'|'))
            +        {
            +            $types = explode('|',$this->returnType);
            +            foreach($types as $returntype)
            +            {
            +                $a = $converter->getLink($returntype);
            +                if (is_object($a) && phpDocumentor_get_class($a) == 'classlink')
            +                {
            +                    if (!empty($my_types)) $my_types .= '|';
            +                    $my_types .= $converter->returnSee($a,$converter->type_adjust($returntype));
            +                } else
            +                {
            +                    if (!empty($my_types)) $my_types .= '|';
            +                    $my_types .= $converter->type_adjust($returntype);
            +                }
            +            }
            +            $this->converted_returnType = $my_types;
            +        } else
            +        {
            +            $a = $converter->getLink($this->returnType);
            +            if (is_object($a) && phpDocumentor_get_class($a) == 'classlink')
            +            {
            +                $this->converted_returnType = $converter->returnSee($a,$converter->type_adjust($this->returnType));
            +            } else
            +            {
            +                $this->converted_returnType = $converter->type_adjust($this->returnType);
            +            }
            +        }
            +        return parserTag::Convert($converter);
            +    }
            +}
            +
            +/**
            + * represents "@var"
            + * @tutorial tags.var.pkg
            + * @package phpDocumentor
            + * @subpackage DocBlockTags
            + * @author Greg Beaver 
            + * @since 1.0rc1
            + * @version $Id: DocBlockTags.inc,v 1.1 2005/10/17 18:36:55 jeichorn Exp $
            + */
            +class parserVarTag extends parserReturnTag
            +{
            +    /**
            +     * always 'var'
            +     * @var string
            +     */
            +    var $keyword = 'var';
            +    /**
            +     * the type a var has
            +     * @var string
            +     */
            +    var $returnType = 'mixed';
            +}
            +
            +/**
            + * Represents "@param"
            + * @tutorial tags.param.pkg
            + * @package phpDocumentor
            + * @subpackage DocBlockTags
            + */
            +class parserParamTag extends parserVarTag
            +{
            +    /**
            +     * always 'param'
            +     * @var string
            +     */
            +    var $keyword = 'param';
            +}
            +
            +/**
            + * Represents "@staticvar"
            + * @tutorial tags.staticvar.pkg
            + * @package phpDocumentor
            + * @subpackage DocBlockTags
            + */
            +class parserStaticvarTag extends parserParamTag
            +{
            +    /**
            +     * always 'staticvar'
            +     * @var string
            +     */
            +    var $keyword = 'staticvar';
            +}
            +
            +/**
            + * represents "@link"
            + * @tutorial tags.link.pkg
            + * @package phpDocumentor
            + * @subpackage DocBlockTags
            + * @author Greg Beaver 
            + * @since 1.0rc1
            + * @version $Id: DocBlockTags.inc,v 1.1 2005/10/17 18:36:55 jeichorn Exp $
            + */
            +class parserLinkTag extends parserTag
            +{
            +    /**
            +     * always 'link'
            +     * @var string
            +     */
            +    var $keyword = 'link';
            +    
            +    /**
            +     * URL to link to
            +     * @param string $link
            +     */
            +    function parserLinkTag($link)
            +    {
            +        $start = $val = $link->getString();
            +        if (strpos($val,' '))
            +        {
            +            $start = array_shift($val = explode(' ',$val));
            +            $val = join($val, ' ');
            +        }
            +        $a = new parserLinkInlineTag($start,$val);
            +        $b = new parserStringWithInlineTags;
            +        $b->add($a);
            +        $this->value = $b;
            +    }
            +}
            +
            +/**
            + * represents "@see"
            + * @tutorial tags.see.pkg
            + * @package phpDocumentor
            + * @subpackage DocBlockTags
            + * @author Greg Beaver 
            + * @since 1.0rc1
            + * @version $Id: DocBlockTags.inc,v 1.1 2005/10/17 18:36:55 jeichorn Exp $
            + */
            +class parserSeeTag extends parserLinkTag
            +{
            +    /**
            +     * always 'see'
            +     * @var string
            +     */
            +    var $keyword = 'see';
            +    
            +    /**
            +     * @param string element to link to
            +     */
            +    function parserSeeTag($name)
            +    {
            +        parserTag::parserTag($this->keyword,$name,true);
            +    }
            +
            +    /**
            +     * @param Converter
            +     * @see parserStringWithInlineTags::Convert()
            +     */
            +    function Convert(&$converter)
            +    {
            +        if ($this->value->hasInlineTag())
            +        {
            +            addErrorDie(PDERROR_INLINETAG_IN_SEE);
            +        }
            +        $a = $converter->getLink(trim($this->value->Convert($converter)));
            +        if (is_string($a))
            +        {
            +            // feature 564991
            +            if (strpos($a,'://'))
            +            {
            +                // php function
            +                return $converter->returnLink($a,str_replace('PHP_MANUAL#','',$this->value->Convert($converter)));
            +            }
            +            return $a;
            +        }
            +        if (is_object($a)) return $converter->returnSee($a);
            +        // getLink parsed a comma-delimited list of linked thingies, add the commas back in
            +        if (is_array($a))
            +        {
            +            $b = '';
            +            foreach($a as $i => $bub)
            +            {
            +                if (!empty($b)) $b .= ', ';
            +                if (is_string($a[$i])) $b .= $a[$i];
            +                if (is_object($a[$i])) $b .= $converter->returnSee($a[$i]);
            +            }
            +            return $b;
            +        }
            +        return false;
            +    }
            +}
            +
            +/**
            + * represents "@license"
            + *
            + * Link to a license, instead of including lines and lines of license information
            + * in every file
            + * @tutorial tags.license.pkg
            + * @package phpDocumentor
            + * @subpackage DocBlockTags
            + */
            +class parserLicenseTag extends parserLinkTag
            +{
            +    /**
            +     * always 'license'
            +     * @var string
            +     */
            +    var $keyword = 'license';
            +    
            +    /**
            +     * URL to link to
            +     * @param string $link
            +     */
            +    function parserLicenseTag($name, $link)
            +    {
            +        $a = explode(' ',$link->getString());
            +        $url = array_shift($a);
            +        $license = join($a,' ');
            +        if (empty($license)) $license = $url;
            +        $a = new parserLinkInlineTag($url, $license);
            +        $b = new parserStringWithInlineTags;
            +        $b->add($a);
            +        $this->value = $b;
            +    }
            +}
            +
            +/**
            + * represents "@uses"
            + *
            + * This is exactly like @see except that the element used has a @useby link to this element added to its docblock
            + * @package phpDocumentor
            + * @subpackage DocBlockTags
            + * @tutorial tags.uses.pkg
            + * @since 1.2
            + */
            +class parserUsesTag extends parserSeeTag
            +{
            +    /**
            +     * Always "uses"
            +     * @var string
            +     */
            +    var $keyword = 'uses';
            +    /** @access private */
            +    var $_description;
            +    
            +    /**
            +     * @param string element to link to
            +     * @param parserStringWithInlineTags description of how the element is used
            +     */
            +    function parserUsesTag($seeel, $description)
            +    {
            +        parent::parserSeeTag($seeel);
            +        $this->_description = $description;
            +    }
            +    
            +    /**
            +     * Return a link to documentation for other element, and description of how
            +     * it is used
            +     *
            +     * Works exactly like {@link parent::Convert()} except that it also includes
            +     * a description of how the element used is used.
            +     * @return string
            +     * @param Converter
            +     */
            +    function Convert(&$c)
            +    {
            +        $val = $this->value;
            +        $see = parent::Convert($c);
            +        $this->value = $this->_description;
            +		  $desc_val = parserTag::Convert($c);
            +        if (!empty($desc_val)) {
            +           $see .= ' - '.$desc_val;
            +        }
            +        $this->value = $val;
            +        return $see;
            +    }
            +    
            +    /**
            +     * Get the text of the link to the element that is being used
            +     * @return string
            +     * @access private
            +     */
            +    function getSeeElement()
            +    {
            +        return $this->value->getString();
            +    }
            +    
            +    /**
            +     * Get the description of how the element used is being used.
            +     * @return parserStringWithInlineTags
            +     */
            +    function getDescription()
            +    {
            +        return $this->_description;
            +    }
            +}
            +
            +/**
            + * This is a virtual tag, it is created by @uses to cross-reference the used element
            + *
            + * This is exactly like @uses.
            + * @package phpDocumentor
            + * @subpackage DocBlockTags
            + * @since 1.2
            + */
            +class parserUsedByTag extends parserUsesTag
            +{
            +    /**
            +     * Always "usedby"
            +     * @var string
            +     */
            +    var $keyword = 'usedby';
            +    /** @access private */
            +    var $_link;
            +    
            +    /**
            +     * @param abstractLink link of element that uses this element
            +     * @param string description of how the element is used
            +     */
            +    function parserUsedByTag($link, $description)
            +    {
            +        $this->value = $description;
            +        $this->_link = $link;
            +    }
            +    
            +    /**
            +     * @return string
            +     * @param Converter
            +     */
            +    function Convert(&$c)
            +    {
            +        $see = $c->returnSee($this->_link);
            +		  $desc_val = parserTag::Convert($c);
            +        if (!empty($desc_val)) {
            +           $see .= ' - '.$desc_val;
            +        }
            +        return $see;
            +    }
            +}
            +
            +/**
            + * represents "@tutorial"
            + *
            + * This is exactly like @see except that it only links to tutorials
            + * @tutorial phpDocumentor/tutorials.pkg
            + * @tutorial tags.tutorial.pkg
            + * @package phpDocumentor
            + * @subpackage DocBlockTags
            + * @since 1.2
            + */
            +class parserTutorialTag extends parserSeeTag
            +{
            +    /**
            +     * Always "tutorial"
            +     * @var string
            +     */
            +    var $keyword = 'tutorial';
            +    /**
            +     * @param Converter
            +     * @see parserStringWithInlineTags::Convert()
            +     */
            +    function Convert(&$converter)
            +    {
            +        $a = $converter->getTutorialLink(trim($this->value->Convert($converter)));
            +        if (is_string($a))
            +        {
            +            return $a;
            +        }
            +        if (is_object($a)) return $converter->returnSee($a);
            +        // getLink parsed a comma-delimited list of linked thingies, add the commas back in
            +        if (is_array($a))
            +        {
            +            $b = '';
            +            foreach($a as $i => $bub)
            +            {
            +                if (!empty($b)) $b .= ', ';
            +                if (is_string($a[$i])) $b .= $a[$i];
            +                if (is_object($a[$i])) $b .= $converter->returnSee($a[$i]);
            +            }
            +            return $b;
            +        }
            +        return false;
            +    }
            +}
            +
            +/**
            + * represents "@filesource"
            + * 
            + * Use this to create a link to a highlighted phpxref-style source file listing
            + * @package phpDocumentor
            + * @subpackage DocBlockTags
            + * @tutorial tags.filesource.pkg
            + */
            +class parserFileSourceTag extends parserTag
            +{
            +    /**
            +     * Always "filesource"
            +     * @var string
            +     */
            +    var $keyword = 'filesource';
            +    /** @var array */
            +    var $source;
            +    /** @var string */
            +    var $path;
            +    /**
            +     * Flag variable, controls double writes of file for each converter
            +     * @access private
            +     * @var array
            +     */
            +    var $_converted = array();
            +    /**
            +     * Set {@link $source} to $value, and set up path
            +     * @param string
            +     * @param array output from {@link phpDocumentorTWordParser::getFileSource()}
            +     */
            +    function parserFileSourceTag($filepath, $value)
            +    {
            +        parent::parserTag($this->keyword, '');
            +        $this->path = $filepath;
            +        $this->source = $value;
            +    }
            +
            +    /**
            +     * Return a link to the highlighted source and generate the source
            +     * @uses ConvertSource() generate source code and write it out
            +     * @return string output from {@link getSourceLink()}
            +     * @param Converter
            +     */
            +    function Convert(&$c)
            +    {
            +        if (!isset($this->_converted[$c->name]))
            +        {
            +            $this->ConvertSource($c);
            +            $this->_converted[$c->name] = true;
            +        }
            +        return $this->getSourceLink($c);
            +    }
            +
            +    /**
            +     * @param Converter
            +     * @uses phpDocumentor_HighlightParser highlights source code
            +     * @uses writeSource()
            +     */
            +    function ConvertSource(&$c)
            +    {
            +        $this->writeSource($c, $c->ProgramExample($this->source, true, false, false, false, $this->path));
            +        return;
            +        $parser = new phpDocumentor_HighlightParser;
            +        $return = '';
            +        $return = $parser->parse($this->source,$c, false, false, false, $this->path);
            +        $this->writeSource($c, $return);
            +    }
            +
            +    /**
            +     * @param Converter
            +     * @param string highlighted source code
            +     * @uses Converter::writeSource() export highlighted file source
            +     */
            +    function writeSource(&$c, $source)
            +    {
            +        $c->writeSource($this->path, $source);
            +    }
            +
            +    /**
            +     * @uses Converter::getSourceLink()
            +     * @param Converter
            +     * @return output from getSourceLink()
            +     */
            +    function getSourceLink(&$c)
            +    {
            +        return $c->getSourceLink($this->path);
            +    }
            +}
            +
            +/**
            + * represents "@example"
            + * 
            + * The example tag 
            + * @package phpDocumentor
            + * @subpackage DocBlockTags
            + * @tutorial tags.example.pkg
            + */
            +class parserExampleTag extends parserFileSourceTag
            +{
            +    /**
            +     * always "example"
            +     * @var string
            +     */
            +    var $keyword = 'example';
            +    /**
            +     * Reads and parses the example file indicated
            +     *
            +     * The example tag takes one parameter: the full path to a php file that
            +     * should be parsed and included as an example.
            +     * @uses phpDocumentorTWordParser::getFileSource() uses to parse an example
            +     *       and retrieve all tokens by line number
            +     * @param parserStringWithInlineTags
            +     * @param string path of file containing this @example tag
            +     */
            +    function parserExampleTag($value, $current_path)
            +    {
            +        global $_phpDocumentor_setting;
            +        parent::parserTag('example', $value);
            +        $path = false;
            +        // code thanks to Sam Blum, modified by Greg Beaver
            +        $tagValue = $value->getString();
            +        $path = $isAbsPath = $pathOnly = $fileName = $fileExt = $original_path  = $title = FALSE;
            +        do
            +        {
            +            // make sure the format is stuff.ext description
            +            if (!preg_match('`(.*)\.(\w*)\s(.*)`', $tagValue, $match))
            +            {
            +                // or format is stuff.ext
            +                if (!preg_match('`(.*)\.(\w*)\s*$`', $tagValue, $match))
            +                {
            +                    // Murphy: Some funny path was given
            +                    $original_path = $tagValue; // used for error output
            +                    break; // try-block
            +                }
            +            }
            +            if (strlen($match[1]) === 0)
            +            {
            +                // Murphy: Some funny path was given
            +                $original_path = $tagValue; // used for error output
            +                break; // try-block
            +            }
            +            $fileExt = $match[2];
            +            $title = 'example';
            +            if (isset($match[3]))
            +            {
            +                $title = trim($match[3]);
            +            }
            +            $pathTmp = str_replace('\\', '/', $match[1]); // Replace windows '\' the path.
            +
            +            // Is there a path and a file or is it just a file?
            +            if (strpos($pathTmp,'/') === false)
            +            {
            +                // No path part
            +                $pathOnly = '';
            +                $fileName = $pathTmp .'.'. $fileExt;
            +            } else
            +            {
            +                $splitPos = strrpos($pathTmp,'/'); // split the path on the last directory, find the filename
            +                $pathOnly = substr($match[1], 0, $splitPos+1);
            +                $fileName = substr($match[1], $splitPos+1) .'.'. $fileExt;
            +                // Is the path absolute? (i.e. does it start like an absolute path?)
            +                if (('/' === $pathTmp[0]) || preg_match('`^\w*:`i', $pathTmp))
            +                { // works for both windows 'C:' and URLs like 'http://'
            +                    $isAbsPath = true; // Yes
            +                }
            +            }
            +
            +            $original_path = $pathOnly . $fileName;
            +
            +            // Now look for the file starting with abs. path.
            +            if ($isAbsPath)
            +            {
            +                $tmp = realpath($original_path); // remove any weirdities like /../file.ext
            +                if ($tmp && is_file($tmp))
            +                {
            +                    $path = $tmp;
            +                }
            +                // Alway break if abs. path was detected; even if file was not found.
            +                break; // try-block
            +            }
            +
            +            // Search for the example file some standard places 
            +            // 1) Look if the ini-var examplesdir is set and look there ...
            +            if (isset($_phpDocumentor_setting['examplesdir']))
            +            {
            +                $tmp = realpath($_phpDocumentor_setting['examplesdir'] . PATH_DELIMITER  . $original_path);
            +                if ($tmp && is_file($tmp))
            +                {
            +                    $path = $tmp; // Yo! found it :)
            +                    break; // try-block
            +                }
            +            }
            +
            +            // 2) Then try to look for an 'example/'-dir below the *currently* parsed file ...
            +            if (!empty($current_path))
            +            {
            +                $tmp = realpath(dirname($current_path) . PATH_DELIMITER . 'examples' . PATH_DELIMITER . $fileName);
            +                if ($tmp && is_file($tmp))
            +                {
            +                    $path = $tmp; // Yo! found it :)
            +                    break; // try-block
            +                }
            +            }
            +
            +            // 3) Then try to look for the example file below the subdir PHPDOCUMENTOR_BASE/examples/ ...
            +            if (is_dir(PHPDOCUMENTOR_BASE . PATH_DELIMITER . 'examples'))
            +            {
            +                $tmp = realpath(PHPDOCUMENTOR_BASE . PATH_DELIMITER . 'examples' . PATH_DELIMITER . $original_path);
            +                if ($tmp && is_file($tmp))
            +                {
            +                    $path = $tmp; // Yo! found it :)
            +                    break; // try-block
            +                }
            +            }
            +
            +            $tmp = realpath(PHPDOCUMENTOR_BASE . PATH_DELIMITER . $original_path);
            +            if ($tmp && is_file($tmp))
            +            {
            +                $path = $tmp; // Yo! found it :)
            +                break; // try-block
            +            }
            +            // If we reach this point, nothing was found and $path is false.
            +        } while (false);
            +
            +        if (!$path)
            +        {
            +            addWarning(PDERROR_EXAMPLE_NOT_FOUND, $original_path);
            +            $this->_title = 'example not found';
            +            $this->path = false;
            +        } else
            +        {
            +            $this->_title = ($title) ? $title : 'example';
            +            // make a unique html-filename but avoid it to get too long.
            +            $uniqueFileName = str_replace(array(':', DIRECTORY_SEPARATOR,'/'), array('_', '_', '_'), $path);
            +            $uniqueFileName = substr($uniqueFileName,-50) . '_' . md5($path);
            +            $this->path = $uniqueFileName;
            +            
            +            $f = @fopen($path,'r');
            +            if ($f)
            +            {
            +                $example = fread($f,filesize($path));
            +                if (tokenizer_ext)
            +                {
            +                    $obj = new phpDocumentorTWordParser;
            +                    $obj->setup($example);
            +                    $this->source = $obj->getFileSource();
            +                    unset($obj);
            +                } else
            +                {
            +                    $this->source = $example;
            +                }
            +            }
            +        }
            +    }
            +    
            +    /**
            +     * @param Converter
            +     * @uses phpDocumentor_HighlightParser highlights source code
            +     * @uses writeSource()
            +     */
            +    function ConvertSource(&$c)
            +    {
            +        $this->writeSource($c, $c->ProgramExample($this->source, true));
            +        return;
            +        $parser = new phpDocumentor_HighlightParser;
            +        $return = '';
            +        $return = $parser->parse($this->source,$c);
            +        $this->writeSource($c, $return);
            +    }
            +
            +    /**
            +     * @param Converter $c
            +     * @param string parsed example source
            +     * @uses Converter::writeExample() writes final example out
            +     * @access private
            +     */
            +    function writeSource(&$c, $source)
            +    {
            +        if ($this->path)
            +        $c->writeExample($this->_title, $this->path, $source);
            +    }
            +
            +    /**
            +     * Retrieve a converter-specific link to the example
            +     *
            +     * @param Converter
            +     * @uses Converter::getExampleLink() retrieve the link to the example
            +     */
            +    function getSourceLink(&$c)
            +    {
            +        if (!$this->path) return $this->_title;
            +        return $c->getExampleLink($this->path, $this->_title);
            +    }
            +}
            +
            +?>
            diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Errors.inc b/buildscripts/PhpDocumentor/phpDocumentor/Errors.inc
            new file mode 100644
            index 00000000..99bada26
            --- /dev/null
            +++ b/buildscripts/PhpDocumentor/phpDocumentor/Errors.inc
            @@ -0,0 +1,793 @@
            +
            + * @version $Id: Errors.inc,v 1.1 2005/10/17 18:36:55 jeichorn Exp $
            + */
            +/**
            + * warning triggered when inheritance could be from more than one class
            + */
            +define("PDERROR_MULTIPLE_PARENT",1);
            +/**
            + * warning triggered when parent class doesn't exist
            + */
            +define("PDERROR_PARENT_NOT_FOUND",2);
            +/**
            + * warning triggered when an {@inline tag} is not terminated (no } before the * / ending the comment)
            + */
            +define("PDERROR_UNTERMINATED_INLINE_TAG",3);
            +/**
            + * warning triggered when inheritance could be from more than one class
            + */
            +define("PDERROR_CLASS_EXISTS",4);
            +/**
            + * warning triggered when inheritance could be from more than one class
            + */
            +define("PDERROR_INHERITANCE_CONFLICT",5);
            +/**
            + * warning triggered when a converter is passed to {@link phpDocumentor_IntermediateParser::addConverter()} that is not a class
            + */
            +define("PDERROR_CONVERTER_NOT_FOUND",6);
            +/**
            + * warning triggered when a converter is passed to {@link phpDocumentor_IntermediateParser::addConverter()} that is not a class
            + */
            +define("PDERROR_NO_CONVERTERS",7);
            +/**
            + * warning triggered when the arguments to @access are neither public nor private
            + */
            +define("PDERROR_ACCESS_WRONG_PARAM",8);
            +/**
            + * warning triggered when there are multiple @access tags in a docblock
            + */
            +define("PDERROR_MULTIPLE_ACCESS_TAGS",9);
            +/**
            + * warning triggered when there are multiple @return tags in a docblock
            + */
            +define("PDERROR_MULTIPLE_RETURN_TAGS",10);
            +/**
            + * warning triggered when there are multiple @var tags in a docblock
            + */
            +define("PDERROR_MULTIPLE_VAR_TAGS",11);
            +/**
            + * warning triggered when there are multiple @package tags in a docblock
            + */
            +define("PDERROR_MULTIPLE_PACKAGE_TAGS",12);
            +/**
            + * warning triggered when there are multiple @subpackage tags in a docblock
            + */
            +define("PDERROR_MULTIPLE_SUBPACKAGE_TAGS",13);
            +/**
            + * warning triggered when the package or subpackage name is illegal
            + */
            +define("PDERROR_ILLEGAL_PACKAGENAME",14);
            +/**
            + * warning triggered when there a @package tag is used in a function, define, method, var or include
            + */
            +define("PDERROR_OVERRIDDEN_PACKAGE_TAGS",15);
            +/**
            + * warning triggered when there a @subpackage tag is used in a function, define, method, var or include
            + */
            +define("PDERROR_OVERRIDDEN_SUBPACKAGE_TAGS",16);
            +/**
            + * warning triggered when classes in the same package have the same name
            + */
            +define("PDERROR_CLASS_CONFLICT",17);
            +/**
            + * warning triggered when classes in the same package have the same name
            + */
            +define("PDERROR_UNKNOWN_TAG",18);
            +/**
            + * warning triggered when there are multiple @name tags in a docblock
            + */
            +define("PDERROR_MULTIPLE_NAME_TAGS",19);
            +/**
            + * warning triggered when there are multiple @name tags in a docblock
            + */
            +define("PDERROR_PACKAGEOUTPUT_DELETES_PARENT_FILE",20);
            +/**
            + * warning triggered when there are multiple @name tags in a docblock
            + */
            +define("PDERROR_GLOBAL_NOT_FOUND",21);
            +/**
            + * warning triggered when there are multiple @name tags in a docblock
            + */
            +define("PDERROR_MULTIPLE_GLOBAL_TAGS",22);
            +/**
            + * warning triggered when there are multiple @name tags in a docblock
            + */
            +define("PDERROR_MALFORMED_GLOBAL_TAG",23);
            +/**
            + * warning triggered when an @ignore tag is used in a DocBlock preceding a method, variable, include, or global variable
            + */
            +define("PDERROR_IGNORE_TAG_IGNORED",24);
            +/**
            + * warning triggered when a duplicate element is encountered that will be ignored by the documentor
            + */
            +define("PDERROR_ELEMENT_IGNORED",25);
            +/**
            + * warning triggered when an entire page is ignored because of @access private
            + */
            +define("PDERROR_PARSEPRIVATE",26);
            +/**
            + * warning triggered when an entire page is ignored because of @access private
            + */
            +define("PDERROR_UNKNOWN_COMMANDLINE",27);
            +/**
            + * warning triggered when an entire page is ignored because of @access private
            + */
            +define("PDERROR_NEED_WHITESPACE",28);
            +/**
            + * warning triggered when an entire page is ignored because of @access private
            + */
            +define("PDERROR_CLASS_PARENT_NOT_FOUND",29);
            +/**
            + * warning triggered when a getClassByPackage is called and can't find the class
            + */
            +define("PDERROR_CLASS_NOT_IN_PACKAGE",30);
            +/**
            + * warning triggered when a { @source } inline tag is used in a docblock not preceding a function
            + */
            +define("PDERROR_SOURCE_TAG_FUNCTION_NOT_FOUND",31);
            +/**
            + * warning triggered when a docblock template is never turned off with /**#@-* / (no space)
            + */
            +define("PDERROR_DB_TEMPLATE_UNTERMINATED",32);
            +/**
            + * warning triggered when a docblock has an unmatched <ol> or <ul>
            + */
            +define("PDERROR_UNMATCHED_LIST_TAG",33);
            +/**
            + * warning triggered when another tag is nested in <b> - not allowed in phpDocumentor
            + */
            +define("PDERROR_CANT_NEST_IN_B",34);
            +/**
            + * warning triggered when a docbook tag is not properly matched
            + */
            +define("PDERROR_UNMATCHED_TUTORIAL_TAG",35);
            +/**
            + * warning triggered when an inline tag is found inside an xml tag name in a package page
            + */
            +define("PDERROR_CANT_HAVE_INLINE_IN_TAGNAME",36);
            +/**
            + * warning triggered when a tutorial is referenced via @tutorial/{ @tutorial} and is not found
            + */
            +define("PDERROR_TUTORIAL_NOT_FOUND",37);
            +/**
            + * warning triggered when a tutorial lists itself as a child tutorial
            + */
            +define("PDERROR_TUTORIAL_IS_OWN_CHILD",38);
            +/**
            + * warning triggered when a tutorial's child lists the parent tutorial as a child tutorial
            + */
            +define("PDERROR_TUTORIAL_IS_OWN_GRANDPA",39);
            +/**
            + * warning triggered when a tutorial's child in the .ini file doesn't exist in the
            + * package and subpackage of the parent
            + */
            +define("PDERROR_CHILD_TUTORIAL_NOT_FOUND",40);
            +/**
            + * warning triggered when a  tag is used in the PDF
            + * Converter and no funcname is present ()
            + */
            +define("PDERROR_PDFFUNCTION_NO_FUNC",41);
            +/**
            + * warning triggered when a  tag is used in the PDF
            + * Converter and funcname is not a {@link Cezpdf} method
            + */
            +define("PDERROR_PDF_METHOD_DOESNT_EXIST",42);
            +/**
            + * warning triggered when a  tag is used in the PDF
            + * Converter and "tempvar" is not set from the return of a previous pdffunction tag
            + */
            +define("PDERROR_PDF_TEMPVAR_DOESNT_EXIST",43);
            +/**
            + * warning triggered when a subsection's title is asked for, but the subsection is not found
            + */
            +define("PDERROR_TUTORIAL_SUBSECTION_NOT_FOUND",44);
            +/**
            + * warning triggered when a subsection's title is asked for, but the subsection is not found
            + */
            +define("PDERROR_UNTERMINATED_ATTRIB",45);
            +/**
            + * warning triggered when no @package tag is used in a page-level or class-level DocBlock
            + */
            +define("PDERROR_NO_PACKAGE_TAG",46);
            +/**
            + * warning triggered when no @access private tag is used in a global variable/method/var
            + * with _ as first char in name and --pear was specified
            + */
            +define("PDERROR_PRIVATE_ASSUMED",47);
            +/**
            + * warning triggered when an example's path from @example /path/to/example.php
            + * is not found
            + */
            +define("PDERROR_EXAMPLE_NOT_FOUND",48);
            +/**
            + * warning triggered when an example's path from @example /path/to/example.php
            + * is not found
            + */
            +define("PDERROR_NO_CONVERTER_HANDLER",49);
            +/**
            + * warning triggered when an example's path from @example /path/to/example.php
            + * is not found
            + */
            +define("PDERROR_INLINETAG_IN_SEE",50);
            +/**
            + * warning triggered when an id attribute in a tutorial docbook tag is not
            + * an {@}id} inline tag
            + */
            +define("PDERROR_ID_MUST_BE_INLINE",51);
            +/**
            + * warning triggered when an {@}internal}} tag is not closed
            + */
            +define("PDERROR_INTERNAL_NOT_CLOSED",52);
            +/**
            + * warning triggered when an {@}source} tag is found in a short description
            + */
            +define("PDERROR_SOURCE_TAG_IGNORED",53);
            +/**
            + * warning triggered when a child converter doesn't override getFormattedClassTrees()
            + */
            +define("PDERROR_CONVERTER_OVR_GFCT",54);
            +/**
            + * warning triggered when a package is already associated with a category, and
            + * a new association is found
            + */
            +define("PDERROR_PACKAGECAT_SET",55);
            +/**
            + * warning triggered when text in a docblock list is not contained in
            + * an <
          • > opening tag + */ +define("PDERROR_TEXT_OUTSIDE_LI",56); +/** + * warning triggered when a DocBlock html tag is unclosed + */ +define("PDERROR_UNCLOSED_TAG",57); +/** + * warning triggered by @filesource, if PHP < 4.3.0 + */ +define("PDERROR_TAG_NOT_HANDLED",58); +/** + * warning triggered by sourcecode="on", if PHP < 4.3.0 + */ +define("PDERROR_SOURCECODE_IGNORED",59); +/** + * warning triggered by an empty tag + */ +define("PDERROR_MALFORMED_TAG",60); +/** + * warning triggered by more than 1 @category tag + */ +define("PDERROR_MULTIPLE_CATEGORY_TAGS",61); +/** + * warning triggered by {@}inheritdoc} in a non-inheritable situation + */ +define("PDERROR_INHERITDOC_DONT_WORK_HERE",62); +/** + * warning triggered by @example path/to/example with no title + */ +define("PDERROR_EMPTY_EXAMPLE_TITLE",63); +/** + * warning triggered by non-existent template directory + */ +define("PDERROR_TEMPLATEDIR_DOESNT_EXIST",64); +/** + * warning triggered by an unterminated entity in a tutorial + */ +define("PDERROR_UNTERMINATED_ENTITY",65); +/** + * warning triggered by an unterminated entity in a tutorial + */ +define("PDERROR_BEAUTIFYING_FAILED",66); +/** + * warning triggered by a function with no name + * + *
            + * function ($params)
            + * {
            + * }
            + * 
            + * triggers this error + */ +define("PDERROR_FUNCTION_HAS_NONAME",67); +/** + * warning triggered by a page-level docblock preceding a source element + * + * + * + */ +define("PDERROR_DOCBLOCK_CONFLICT", 68); +/** + * warning triggered when a file does not contain a page-level docblock + */ +define("PDERROR_NO_PAGE_LEVELDOCBLOCK", 69); +/** + * warning triggered when the first docblock in a file with a @package tag + * precedes a class. In this case, the class gets the docblock. + */ +define("PDERROR_DOCBLOCK_GOES_CLASS", 70); +/** + * warning triggered in tutorial parsing if there is a missing {@id} inline tag + */ +define("PDERROR_NO_DOCBOOK_ID", 71); +/** + * warning triggered if someone brilliant tries "class X extends X {" + */ +define("PDERROR_CANNOT_EXTEND_SELF", 72); + +/** + * Error messages for phpDocumentor parser warnings + * @global array $GLOBALS['phpDocumentor_warning_descrip'] + * @name $phpDocumentor_warning_descrip + */ +$GLOBALS['phpDocumentor_warning_descrip'] = + array( + PDERROR_MULTIPLE_PARENT => 'Class %s has multiple possible parents, package inheritance aborted', + PDERROR_PARENT_NOT_FOUND => 'Class %s parent %s not found', + PDERROR_INHERITANCE_CONFLICT => 'Class %s in file %s has multiple possible parents named %s. Cannot resolve name conflict,'."\n".' try ignoring a file that contains the conflicting parent class', + PDERROR_UNKNOWN_TAG => 'Unknown tag "@%s" used', + PDERROR_IGNORE_TAG_IGNORED => '@ignore tag used for %s element "%s" will be ignored', + PDERROR_ELEMENT_IGNORED => "\n".'duplicate %s element "%s" in file %s will be ignored.'."\n".'Use an @ignore tag on the original if you want this case to be documented.', + PDERROR_PARSEPRIVATE => "entire page %s ignored because of @access private.\nChoose -pp to enable parsing of private elements", + PDERROR_CLASS_PARENT_NOT_FOUND => "class %s in package %s parent not found in @see parent::%s", + PDERROR_CLASS_NOT_IN_PACKAGE => "class %s was not found in package %s", + PDERROR_DB_TEMPLATE_UNTERMINATED => "docblock template never terminated with /**#@-*/", + PDERROR_PDF_METHOD_DOESNT_EXIST => ' called, but pdf method "%s" doesn\'t exist', + PDERROR_TUTORIAL_NOT_FOUND => "tutorial \"%s\" not found, does it exist?", + PDERROR_CHILD_TUTORIAL_NOT_FOUND => 'child tutorial "%s" listed in %s not found in parent package "%s" subpackage "%s"', + PDERROR_TUTORIAL_SUBSECTION_NOT_FOUND => 'tutorial %s subsection "%s" doesn\'t exist, but its title was asked for', + PDERROR_NO_PACKAGE_TAG => 'no @package tag was used in a DocBlock for %s %s', + PDERROR_PRIVATE_ASSUMED => '%s "%s" is assumed to be @access private because its name starts with _, but has no @access tag', + PDERROR_EXAMPLE_NOT_FOUND => 'example file "%s" does not exist', + PDERROR_SOURCE_TAG_IGNORED => '{@source} can only be used in the long description, not in the short description: "%s"', + PDERROR_PACKAGECAT_SET => 'package %s is already in category %s, will now replace with category %s', + PDERROR_SOURCECODE_IGNORED => 'sourcecode command-line option is ignored for PHP versions < 4.3.0', + PDERROR_INHERITDOC_DONT_WORK_HERE => '{@inheritdoc} can only be used in the docblock of a child class', + PDERROR_EMPTY_EXAMPLE_TITLE => 'Example file found at "%s" has no title, using "%s"', + PDERROR_DOCBLOCK_CONFLICT => 'Page-level DocBlock precedes "%s %s", use another DocBlock to document the source element', + PDERROR_NO_PAGE_LEVELDOCBLOCK => 'File "%s" has no page-level DocBlock, use @package in the first DocBlock to create one', + PDERROR_DOCBLOCK_GOES_CLASS => 'DocBlock would be page-level, but precedes class "%s", use another DocBlock to document the file', + PDERROR_NO_DOCBOOK_ID => 'Tutorial section %s "%s" has no id="{@id subsection}" tag ({@id} for refentry)', + PDERROR_BEAUTIFYING_FAILED => 'Beautifying failed: %s', + ); + + + +//******************************************************** + + + +/** + * Error messages for phpDocumentor parser errors + * @global array $GLOBALS['phpDocumentor_error_descrip'] + * @name $phpDocumentor_error_descrip + */ +$GLOBALS['phpDocumentor_error_descrip'] = + array( + PDERROR_UNTERMINATED_INLINE_TAG => 'Inline tag {@%s} in tag %s is unterminated, "%s"', + PDERROR_CLASS_EXISTS => 'Class %s already exists in package "%s"', + PDERROR_CONVERTER_NOT_FOUND => 'Converter %s specified by --output command-line option is not a class', + PDERROR_NO_CONVERTERS => 'No Converters have been specified by --output command-line option', + PDERROR_ACCESS_WRONG_PARAM => '@access was passed neither "public" nor "private." Was passed: "%s"', + PDERROR_MULTIPLE_ACCESS_TAGS => 'DocBlock has multiple @access tags, illegal. ignoring additional tag "@access %s"', + PDERROR_MULTIPLE_RETURN_TAGS => 'DocBlock has multiple @return tags, illegal. ignoring additional tag "@return %s %s"', + PDERROR_MULTIPLE_VAR_TAGS => 'DocBlock has multiple @var tags, illegal. ignoring additional tag "@var %s %s"', + PDERROR_MULTIPLE_PACKAGE_TAGS => 'DocBlock has multiple @package tags, illegal. ignoring additional tag "@package %s"', + PDERROR_MULTIPLE_SUBPACKAGE_TAGS => 'DocBlock has multiple @subpackage tags, illegal. ignoring additional tag "@subpackage %s"', + PDERROR_ILLEGAL_PACKAGENAME => '@%s tag has illegal %s name "%s"', + PDERROR_OVERRIDDEN_PACKAGE_TAGS => '%s %s\'s DocBlock has @package tag, illegal. ignoring tag "@package %s"', + PDERROR_OVERRIDDEN_SUBPACKAGE_TAGS => '"%s" %s\'s DocBlock has @subpackage tags, illegal. ignoring tag "@subpackage %s"', + PDERROR_CLASS_CONFLICT => 'class "%s" has multiple declarations in package %s, in file %s and file %s, documentation will have output errors!', + PDERROR_MULTIPLE_NAME_TAGS => 'DocBlock has multiple @name tags, illegal. ignoring additional tag "@name %s"', + PDERROR_PACKAGEOUTPUT_DELETES_PARENT_FILE => '-po (packageoutput) option deletes parent file "%s" containing class "%s."'."\n".' Try using --defaultpackagename (-dn) %s to include the parent file in the same package as the class', + PDERROR_GLOBAL_NOT_FOUND => 'global variable %s specified in @global tag was never found', + PDERROR_MULTIPLE_GLOBAL_TAGS => '@global define tag already used for global variable "%s", ignoring @global %s', + PDERROR_MALFORMED_GLOBAL_TAG => 'incorrect @global syntax. Should be @global vartype $varname or @global vartype description', + PDERROR_UNKNOWN_COMMANDLINE => 'Unknown command-line option "%s" encountered, use phpdoc -h for help', + PDERROR_NEED_WHITESPACE => 'phpDocumentor programmer error - wordparser whitespace set to false in handleDocBlock, notify developers. You should never see this error', + PDERROR_SOURCE_TAG_FUNCTION_NOT_FOUND => '{@source} tag used in a docblock that isn\'t preceding a function', + PDERROR_UNMATCHED_LIST_TAG => 'unmatched ol or ul tag in DocBlock, parsing will be incorrect', + PDERROR_CANT_NEST_IN_B => 'Can\'t nest a code, pre, ul, or ol tag in a b tag in phpDocumentor DocBlock (%s tag nested)', + PDERROR_UNMATCHED_TUTORIAL_TAG => 'While parsing extended documentation, "%s" tag was matched with "%s" endtag, missing endtag'."\ntag contents:\"%s\"", + PDERROR_CANT_HAVE_INLINE_IN_TAGNAME => 'Can\'t have an inline tag inside a package page XML tag!', + PDERROR_TUTORIAL_IS_OWN_CHILD => 'Tutorial %s lists itself as its own child in %s, illegal', + PDERROR_TUTORIAL_IS_OWN_GRANDPA => 'Tutorial %s\'s child %s lists %s as its child in %s, illegal', + PDERROR_PDFFUNCTION_NO_FUNC => 'Invalid pdffunction syntax: "", should be ""', + PDERROR_PDF_TEMPVAR_DOESNT_EXIST => ' called but temporary variable "%s" doesn\'t exist', + PDERROR_UNTERMINATED_ATTRIB => 'Tutorial tag %s attribute %s is unterminated, current value "%s"', + PDERROR_NO_CONVERTER_HANDLER => 'Handler for element of type "%s" called, but %s is not a method of %s', + PDERROR_INLINETAG_IN_SEE => 'Inline tags are not allowed in a @see tag', + PDERROR_ID_MUST_BE_INLINE => '<%s id="%s"> must be <%s id="{@id %s}">', + PDERROR_INTERNAL_NOT_CLOSED => '{@internal was never terminated with }}', + PDERROR_CONVERTER_OVR_GFCT => 'Converter "%s" must override getFormattedClassTrees() but doesn\'t', + PDERROR_TEXT_OUTSIDE_LI => 'Text cannot be outside of li tag in a DocBlock list, parsing will be incorrect', + PDERROR_UNCLOSED_TAG => 'Unclosed %s tag in DocBlock, parsing will be incorrect', + PDERROR_TAG_NOT_HANDLED => '"%s" tag is not available in PHP versions less than 4.3.0, tag ignored', + PDERROR_MALFORMED_TAG => '"%s" tag was used without any parameters, illegal', + PDERROR_MULTIPLE_CATEGORY_TAGS => 'package has multiple @category tags, ignoring "@category %s"', + PDERROR_TEMPLATEDIR_DOESNT_EXIST => 'template directory "%s" does not exist', + PDERROR_UNTERMINATED_ENTITY => 'entity &%s is unterminated', + PDERROR_FUNCTION_HAS_NONAME => 'function has no name (PHP error - test your file before parsing!)', + PDERROR_CANNOT_EXTEND_SELF => 'class %s cannot extend itself - TEST YOUR CODE BEFORE PARSING', + ); + +/** + * encapsulates warning information + * @package phpDocumentor + * @subpackage Errors + */ +class RecordWarning +{ + /** + * name of global variable that descriptors for this warning/error is kept + * @var string + */ + var $type = 'phpDocumentor_warning_descrip'; + /** + * file this error occurred in + * @var string + */ + var $file = false; + /** + * line number of the file this error occurred in + * @var integer + */ + var $linenum; + /** + * error string + * @var string + */ + var $data; + /** + * error number + * @see Errors.inc + * @var string + */ + var $num; + /** + * @param string $file filename this error occurred in ({@link $file}) + * @param integer $linenum line number this error occurred on ({@link $linenum}) + * @param integer $num Error number defined in {@link Errors.inc} + * @param string $data... variable number of strings, up to 4, to sprintf based on the error number + */ + function RecordWarning($file,$linenum,$num) + { + $this->file = $file; + $this->linenum = $linenum; + $a = array('','','',''); + if (func_num_args()>3) + { + for($i=3;$inum = $num; + $this->data = sprintf($GLOBALS[$this->type][$this->num],$a[0],$a[1],$a[2],$a[3]); + $this->output(); + } + + /** + * prints the warning + */ + function output($string = false) + { + if ($string) + { + if ($this->file) + return "WARNING in $this->file on line $this->linenum: $this->data\n"; + else + return "WARNING: $this->data\n"; + } + if ($this->file) + phpDocumentor_out("WARNING in $this->file on line $this->linenum: $this->data\n"); + else + phpDocumentor_out("WARNING: $this->data\n"); + flush(); + } +} + +/** + * encapsulates error information + * @package phpDocumentor + * @subpackage Errors + */ +class RecordError extends RecordWarning +{ + /** + * name of global variable that descriptors for this warning/error is kept + * @var string + */ + var $type = 'phpDocumentor_error_descrip'; + + /** + * prints the error + */ + function output($string = false) + { + if ($string) + { + if ($this->file) + return "\n\tERROR in $this->file on line $this->linenum: $this->data\n"; + else + return "\n\tERROR: $this->data\n"; + } + if ($this->file) + phpDocumentor_out("\n\tERROR in $this->file on line $this->linenum: $this->data\n"); + else + phpDocumentor_out("\n\tERROR: $this->data\n"); + flush(); + } +} + +/** + * contains all the errors/warnings + * @see $errors, $warnings + * @package phpDocumentor + * @subpackage Errors + */ +class ErrorTracker +{ + /** + * array of {@link RecordError}s + * @var array + */ + var $errors = array(); + /** + * array of {@link RecordWarning}s + * @var array + */ + var $warnings = array(); + /** + * @var string + */ + var $curfile = ''; + /** + * @var integer + */ + var $linenum = 0; + + /** + * index in {@link $errors} of last error triggered + * @var integer|false + */ + var $lasterror = false; + + /** + * index in {@link $warnings} of last warning triggered + * @var integer|false + */ + var $lastwarning = false; + + /** + * This function subscribes to two events in the Parser in order to keep track of line number information and file name. + * @param integer $num parser-passed event (see {@link PHPDOCUMENTOR_EVENT_NEWLINENUM, PHPDOCUMENTOR_EVENT_NEWFILE}) + * @param mixed $data either a line number if $num is PHPDOCUMENTOR_EVENT_NEWLINENUM or a file name if $num is PHPDOCUMENTOR_EVENT_NEWFILE + */ + function handleEvent($num,$data) + { + switch($num) + { + case PHPDOCUMENTOR_EVENT_NEWLINENUM : + $this->linenum = $data; + break; + case PHPDOCUMENTOR_EVENT_NEWFILE : + $this->linenum = 0; + $this->curfile = $data; + break; + // debugging + case 1000000635 : + phpDocumentor_out($this->curfile.' has '.$this->linenum.' lines'."\n"); + flush(); + break; + } + } + + /** + * add a new warning to the {@link $warnings} array + * @param integer $num error number from {@link Errors.inc} + * @param string $data... up to 4 string parameters to sprintf() into the error string for error number $num + */ + function addWarning($num) + { + $a = array('','','',''); + if (func_num_args()>1) + { + for($i=1;$iwarnings[] = new RecordWarning($this->curfile,$this->linenum,$num,$a[0],$a[1],$a[2],$a[3]); + $this->lastwarning = count($this->warnings) - 1; + } + + /** + * add a new error to the {@link $errors} array + * @param integer $num error number from {@link Errors.inc} + * @param string $data... up to 4 string parameters to sprintf() into the error string for error number $num + */ + function addError($num) + { + $a = array('','','',''); + if (func_num_args()>1) + { + for($i=1;$ierrors[] = new RecordError($this->curfile,$this->linenum,$num,$a[0],$a[1],$a[2],$a[3]); + $this->lasterror = count($this->errors) - 1; + } + + /** + * add a new error to the {@link $errors} array and returns the error string + * @param integer $num error number from {@link Errors.inc} + * @param string $data... up to 4 string parameters to sprintf() into the error string for error number $num + */ + function addErrorReturn($num) + { + $a = array('','','',''); + if (func_num_args()>1) + { + for($i=1;$ierrors[] = new RecordError($this->curfile,$this->linenum,$num,$a[0],$a[1],$a[2],$a[3],false); + $this->lasterror = count($this->errors) - 1; + } + + /** + * Get sorted array of all warnings in parsing/conversion + * @return array + */ + function &returnWarnings() + { + usort($this->warnings,array($this,"errorsort")); + return $this->warnings; + } + + /** + * Get sorted array of all non-fatal errors in parsing/conversion + * @return array + */ + function &returnErrors() + { + usort($this->errors,array($this,"errorsort")); + return $this->errors; + } + + /** + * @access private + * @param RecordError|RecordWarning + * @param RecordError|RecordWarning + */ + function errorsort($a, $b) + { + if (!$a->file) return -1; + if (!$b->file) return 1; + if ($a->file == $b->file) + { + if ($a->linenum == $b->linenum) return 0; + if ($a->linenum < $b->linenum) return -1; + return 1; + } + return strnatcasecmp($a->file,$b->file); + } + + /** + * Get the error message of the last error + * @return string + */ + function returnLastError() + { + return $this->errors[$this->lasterror]->output(true); + } + + /** + * Get the warning message of the last warning + * @return string + */ + function returnLastWarning() + { + return $this->warnings[$this->lastwarning]->output(true); + } +} + +/** + * @global ErrorTracker $GLOBALS['phpDocumentor_errors'] + * @name $phpDocumentor_errors + */ +$GLOBALS['phpDocumentor_errors'] = new ErrorTracker; + +/** + * @param integer $num error number from {@link Errors.inc} + * @param string $data... up to 4 string parameters to sprintf() into the error string for error number $num + * @see ErrorTracker::addError() + */ +function addError($num) +{ + global $phpDocumentor_errors; + $a = array('','','',''); + if (func_num_args()>1) + { + for($i=1;$iaddError($num,$a[0],$a[1],$a[2],$a[3]); +} + +/** + * like {@link addError()} but exits parsing + * @param integer $num error number from {@link Errors.inc} + * @param string $data... up to 4 string parameters to sprintf() into the error string for error number $num + * @global ErrorTracker repository for all errors generated by phpDocumentor + * @see ErrorTracker::addError() + */ +function addErrorDie($num) +{ + global $phpDocumentor_errors; + $a = array('','','',''); + if (func_num_args()>1) + { + for($i=1;$iaddErrorReturn($num,$a[0],$a[1],$a[2],$a[3]); + die($phpDocumentor_errors->returnLastError()); +} + +/** + * @param integer $num warning number from {@link Errors.inc} + * @param string $data... up to 4 string parameters to sprintf() into the error string for error number $num + * @global ErrorTracker repository for all errors generated by phpDocumentor + * @see ErrorTracker::addWarning() + */ +function addWarning($num) +{ + global $phpDocumentor_errors; + $a = array('','','',''); + if (func_num_args()>1) + { + for($i=1;$iaddWarning($num,$a[0],$a[1],$a[2],$a[3]); +} +?> diff --git a/buildscripts/PhpDocumentor/phpDocumentor/EventStack.inc b/buildscripts/PhpDocumentor/phpDocumentor/EventStack.inc new file mode 100644 index 00000000..5e2690e8 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/EventStack.inc @@ -0,0 +1,78 @@ + + * @version $Id: EventStack.inc,v 1.1 2005/10/17 18:36:55 jeichorn Exp $ + * @package phpDocumentor + */ +/** + * An event Stack + * + * @author Joshua Eichorn + * @version $Id: EventStack.inc,v 1.1 2005/10/17 18:36:55 jeichorn Exp $ + * @package phpDocumentor + */ +class EventStack +{ + /** + * The stack + * @var array + */ + var $stack = array(PARSER_EVENT_NOEVENTS); + + /** + * The number of events in the stack + * @var integer + */ + var $num = 0; + + /** + * Push an event onto the stack + * + * @param int $event All events must be constants + */ + function pushEvent($event) + { + $this->num = array_push($this->stack,$event) - 1; + } + + /** + * Pop an event from the stack + * + * @return int An event + */ + function popEvent() + { + $this->num--; + return array_pop($this->stack); + } + + /** + * Get the current event + * + * @return int An event + */ + function getEvent() + { + return $this->stack[$this->num]; + } +} diff --git a/buildscripts/PhpDocumentor/phpDocumentor/HighlightParser.inc b/buildscripts/PhpDocumentor/phpDocumentor/HighlightParser.inc new file mode 100644 index 00000000..f2a26ee9 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/HighlightParser.inc @@ -0,0 +1,2354 @@ +_parser = &$parser; + $this->data = &$input; + $this->_all = $input; + $this->_sourceline = 0; + $this->pos = 0; + $this->linenum = 0; + } + + /** + * debugging function + * @access private + */ + function printState() + { + $linenum = $this->linenum; + $pos = $this->pos; + if (!isset($this->_all[$this->linenum][$this->pos])) + { + $linenum++; + $pos = 0; + } + $details = ''; + $token = $this->_all[$linenum][$pos]; + if (is_array($token)) + { + $details = token_name($token[0]); + $token = htmlspecialchars($token[1]); + } else $token = htmlspecialchars($token); + debug('Next Token '.$this->linenum.'-'.$this->pos.':'.$details); + var_dump($token); + } + + /** + * Retrieve the position of the next token that will be parsed + * in the internal token array + * @return array format: array(line number, position) + */ + function nextToken() + { + $linenum = $this->linenum; + $pos = $this->pos; + if (!isset($this->_all[$this->linenum][$this->pos])) + { + $linenum++; + $pos = 0; + } + if (!isset($this->_all[$linenum][$pos])) return false; + return array($linenum, $pos); + } + + /** + * Retrieve the next token + * @return array|string either array(PHP token constant, token) or string + * non-specific separator + */ + function getWord() + { + if (!isset($this->_all[$this->linenum][$this->pos])) + { + $this->linenum++; + $this->pos = 0; + if (!isset($this->_all[$this->linenum])) return false; + $this->_parser->newLineNum(); + return $this->getWord(); + } + $word = $this->_all[$this->linenum][$this->pos++]; + return str_replace("\t",' ',$word); + } + + /** + * back the word parser to the previous token as defined by $last_token + * @param array|string token, or output from {@link nextToken()} + * @param boolean if true, backupPos interprets $last_token to be the + * position in the internal token array of the last token + */ + function backupPos($last_token, $is_pos = false) + { + if ($is_pos) + { + $this->linenum = $last_token[0]; + $this->pos = $last_token[1]; + return; + } + if ($last_token === false) return; +//fancy_debug('before',$this->linenum,$this->pos,token_name($this->_all[$this->linenum][$this->pos][0]),htmlentities($this->_all[$this->linenum][$this->pos][1]),$this->_all[$this->linenum]); + do + { + $this->pos--; + if ($this->pos < 0) + { + $this->linenum--; + if ($this->linenum < 0) { + var_dump($last_token); + break; + } + $this->pos = count($this->_all[$this->linenum]) - 1; + } + } while (!$this->tokenEquals($last_token,str_replace("\t", ' ', $this->_all[$this->linenum][$this->pos]))); + //fancy_debug('after',$this->linenum,$this->pos,token_name($this->_all[$this->linenum][$this->pos][0]),htmlentities($this->_all[$this->linenum][$this->pos][1])); + } +} + +/** + * Highlights source code using {@link parse()} + * @package phpDocumentor + * @subpackage Parsers + */ +class phpDocumentor_HighlightParser extends phpDocumentorTParser +{ + /**#@+ @access private */ + /** + * Highlighted source is built up in this string + * @var string + */ + var $_output; + /** + * contents of the current source code line as it is parsed + * @var string + */ + var $_line; + /** + * Used to retrieve highlighted tokens + * @var Converter a descendant of Converter + */ + var $_converter; + /** + * Path to file being highlighted, if this is from a @filesource tag + * @var false|string full path + */ + var $_filesourcepath; + /** + * @var array + */ + var $eventHandlers = array( + PARSER_EVENT_ARRAY => 'defaultHandler', + PARSER_EVENT_CLASS => 'handleClass', + PARSER_EVENT_COMMENT => 'handleComment', + PARSER_EVENT_DOCBLOCK_TEMPLATE => 'handleDocBlockTemplate', + PARSER_EVENT_END_DOCBLOCK_TEMPLATE => 'handleEndDocBlockTemplate', + PARSER_EVENT_LOGICBLOCK => 'handleLogicBlock', + PARSER_EVENT_METHOD_LOGICBLOCK => 'handleMethodLogicBlock', + PARSER_EVENT_NOEVENTS => 'defaultHandler', + PARSER_EVENT_OUTPHP => 'defaultHandler', + PARSER_EVENT_CLASS_MEMBER => 'handleClassMember', + PARSER_EVENT_DEFINE => 'defaultHandler', + PARSER_EVENT_DEFINE_PARAMS => 'defaultHandler', + PARSER_EVENT_DEFINE_PARAMS_PARENTHESIS => 'defaultHandler', + PARSER_EVENT_INCLUDE_PARAMS_PARENTHESIS => 'defaultHandler', + PARSER_EVENT_DOCBLOCK => 'handleDocBlock', + PARSER_EVENT_TAGS => 'handleTags', + PARSER_EVENT_DESC => 'handleDesc', + PARSER_EVENT_DOCKEYWORD => 'handleTag', + PARSER_EVENT_DOCKEYWORD_EMAIL => 'handleDockeywordEmail', + PARSER_EVENT_EOFQUOTE => 'handleQuote', + PARSER_EVENT_FUNCTION => 'handleFunction', + PARSER_EVENT_METHOD => 'handleMethod', + PARSER_EVENT_FUNCTION_PARAMS => 'handleFunctionParams', + PARSER_EVENT_FUNC_GLOBAL => 'handleFuncGlobal', + PARSER_EVENT_INLINE_DOCKEYWORD => 'handleInlineDockeyword', + PARSER_EVENT_INCLUDE => 'defaultHandler', + PARSER_EVENT_INCLUDE_PARAMS => 'defaultHandler', + PARSER_EVENT_QUOTE => 'handleQuote', + PARSER_EVENT_QUOTE_VAR => 'handleQuoteVar', + PARSER_EVENT_PHPCODE => 'handlePhpCode', + PARSER_EVENT_SINGLEQUOTE => 'handleSingleQuote', + PARSER_EVENT_STATIC_VAR => 'defaultHandler', + PARSER_EVENT_STATIC_VAR_VALUE => 'defaultHandler', + PARSER_EVENT_VAR => 'handleVar', + ); + + /** + * event handlers for @tags + * @tutorial tags.pkg + */ + var $tagHandlers = array( + '*' => 'defaultTagHandler', + 'abstract' => 'coreTagHandler', + 'access' => 'coreTagHandler', + 'author' => 'coreTagHandler', + 'category' => 'coreTagHandler', + 'copyright' => 'coreTagHandler', + 'deprecated' => 'coreTagHandler', + 'example' => 'coreTagHandler', + 'filesource' => 'coreTagHandler', + 'final' => 'coreTagHandler', + 'global' => 'globalTagHandler', + 'ignore' => 'coreTagHandler', + 'license' => 'coreTagHandler', + 'link' => 'coreTagHandler', + 'name' => 'coreTagHandler', + 'package' => 'coreTagHandler', + 'param' => 'paramTagHandler', + 'parameter' => 'paramTagHandler', + 'see' => 'coreTagHandler', + 'since' => 'coreTagHandler', + 'subpackage' => 'coreTagHandler', + 'internal' => 'coreTagHandler', + 'return' => 'returnTagHandler', + 'static' => 'coreTagHandler', + 'staticvar' => 'staticvarTagHandler', + 'throws' => 'coreTagHandler', + 'todo' => 'coreTagHandler', + 'tutorial' => 'coreTagHandler', + 'uses' => 'coreTagHandler', + 'var' => 'varTagHandler', + 'version' => 'coreTagHandler', + ); + /**#@-*/ + + /** + * @uses Converter::SourceLine() encloses {@link $_line} in a + * converter-specific format + */ + function newLineNum() + { + if ($this->_pf_no_output_yet) return; + $this->_flush_save(); + $this->_line .= $this->_converter->flushHighlightCache(); + $this->_output .= $this->_converter->SourceLine($this->_wp->linenum, $this->_line, $this->_path); + $this->_line = ''; + } + + /** + * Start the parsing at a certain line number + */ + function setLineNum($num) + { + $this->_wp->linenum = $num; + } + + /** + * Parse a new file + * + * The parse() method is a do...while() loop that retrieves tokens one by + * one from the {@link $_event_stack}, and uses the token event array set up + * by the class constructor to call event handlers. + * + * The event handlers each process the tokens passed to them, and use the + * {@link _addoutput()} method to append the processed tokens to the + * {@link $_line} variable. The word parser calls {@link newLineNum()} + * every time a line is reached. + * + * In addition, the event handlers use special linking functions + * {@link _link()} and its cousins (_classlink(), etc.) to create in-code + * hyperlinks to the documentation for source code elements that are in the + * source code. + * + * @uses setupStates() initialize parser state variables + * @uses configWordParser() pass $parse_data to prepare retrieval of tokens + * @param array $parse_data + * @param Converter $converter + * @param boolean $inlinesourceparse whether this data is from an + * inline {@}source} tag + * @param string|false if a string, it is the name of the class whose + * method we are parsing containing a {@}source} tag + * @param false|integer starting line number from {@}source linenum} + * @param false|string full path to file with @filesource tag, if this + * is a @filesource parse + * @staticvar integer used for recursion limiting if a handler for + * an event is not found + * @return bool + */ + function parse (&$parse_data, &$converter, $inlinesourceparse = false, $class = false, $linenum = false, $filesourcepath = false) + { + if (!tokenizer_ext) + { + if (is_array($parse_data)) + { + $parse_data = join($parse_data,''); + } + $parse_data = explode("\n", $parse_data); + $this->_output = ''; + foreach($parse_data as $linenum => $line) + { + if ($linenum > 0) + { + $this->_output .= $converter->SourceLine($linenum, $line, $filesourcepath); + } + } + return $converter->PreserveWhiteSpace($this->_output); + } + static $endrecur = 0; + $this->_converter = &$converter; + $converter->startHighlight(); + $this->_path = $filesourcepath; + $this->setupStates($inlinesourceparse, $class); + + $this->configWordParser($parse_data); + if ($linenum !== false) $this->setLineNum($linenum); + // initialize variables so E_ALL error_reporting doesn't complain + $pevent = 0; + $word = 0; + + do + { + $lpevent = $pevent; + $pevent = $this->_event_stack->getEvent(); + if ($lpevent != $pevent) + { + $this->_last_pevent = $lpevent; + } + + if ($pevent == PARSER_EVENT_CLASS_MEMBER) + { + $this->_wp->setWhitespace(true); + } else + { + $this->_wp->setWhitespace(false); + } + + if (!is_array($word)) $lw = $word; + if (is_array($word) && $word[0] != T_WHITESPACE) $lw = $word; + $dbg_linenum = $this->_wp->linenum; + $dbg_pos = $this->_wp->getPos(); + $word = $this->_wp->getWord(); + if (is_array($word) && $word[0] == T_WHITESPACE && $pevent != PARSER_EVENT_CLASS_MEMBER) + { +// debug("added ".$this->_wp->linenum.'-'.$this->_wp->pos); + $this->_addoutput($word); + continue; + } else $this->_pv_last_word = $lw; + if ($pevent != PARSER_EVENT_DOCBLOCK) + { + $this->_pv_last_next_word = $this->_pv_next_word; + $this->_pv_next_word = $this->_wp->nextToken(); + } + // in wordparser, have to keep track of lines +// $this->publishEvent(PHPDOCUMENTOR_EVENT_NEWLINENUM, $this->_wp->linenum); + if (0)//PHPDOCUMENTOR_DEBUG == true) + { + echo "LAST: "; + if (is_array($this->_pv_last_word)) + { + echo token_name($this->_pv_last_word[0]). ' => |'.htmlspecialchars($this->_pv_last_word[1]); + } else echo "|" . $this->_pv_last_word; + echo "|\n"; + echo "PEVENT: " . $this->getParserEventName($pevent) . "\n"; + echo "LASTPEVENT: " . $this->getParserEventName($this->_last_pevent) . "\n"; +// echo "LINE: ".$this->_line."\n"; +// echo "OUTPUT: ".$this->_output."\n"; + echo $dbg_linenum.'-'.$dbg_pos . ": "; + if (is_array($word)) + { + echo token_name($word[0]).' => |'.htmlspecialchars($word[1]); + } else echo '|'.htmlspecialchars($word); + echo "|\n"; + $this->_wp->printState(); + echo "NEXT TOKEN: "; + $tok1 = $this->_pv_next_word; + $tok = $this->_wp->_all[$tok1[0]][$tok1[1]]; + if (is_array($tok)) + { + echo token_name($tok[0]). ' => '.$tok1[0].'-'.$tok1[1].'|'.htmlspecialchars($tok[1]); + } else echo "|" . $tok; + echo "|\n"; + echo "-------------------\n\n\n"; + flush(); + } + if (isset($this->eventHandlers[$pevent])) + { + $handle = $this->eventHandlers[$pevent]; + $this->$handle($word, $pevent); + } else + { + debug('WARNING: possible error, no handler for event number '.$pevent); + if ($endrecur++ == 25) + { + die("FATAL ERROR, recursion limit reached"); + } + } + } while (!($word === false)); + if (strlen($this->_line)) $this->newLineNum(); + return $this->_output; + } + + /**#@+ + * Event Handlers + * + * All Event Handlers use {@link checkEventPush()} and + * {@link checkEventPop()} to set up the event stack and parser state. + * @access private + * @param string|array token value + * @param integer parser event from {@link Parser.inc} + */ + /** + * Most tokens only need highlighting, and this method handles them + */ + function defaultHandler($word, $pevent) + { + $this->_addoutput($word); + if ($this->checkEventPush($word, $pevent)) return; + $this->checkEventPop($word, $pevent); + } + + /** + * Handles global declarations in a function, like: + * + * + * function foobar() + * { + * global $_phpDocumentor_setting; + * } + * + * @uses _globallink() instead of _addoutput(), to link to global variables + * if they are used in a function + */ + function handleFuncGlobal($word, $pevent) + { + if ($this->checkEventPush($word, $pevent)) return; + $this->_globallink($word); + $this->checkEventPop($word, $pevent); + } + + /** + * Handles strings in quotation marks and heredoc + * + * Special handling is needed for strings that contain variables like: + * + * $a = "$test string" + * + * The tokenizer parses out tokens '"',array(T_VARIABLE,'$test'),' string', + * and '"'. Since it is possible to have $this->classvar in a string, + * we save a variable name just in case the next token is -> to allow linking + * to class members. Otherwise, the string is simply highlighted. + * + * constant strings (with no $variables in them) are passed as a single + * entity, and so will be saved in the last token parsed. This means the + * event handler must tell the word parser to re-retrieve the current token + * so that the correct event handler can process it. + */ + function handleQuote($word, $pevent) + { + if ($this->_pf_inmethod && is_array($word) && $word[0] == T_VARIABLE) $this->_pv_lastvar = $word; + if ($this->checkEventPush($word, $pevent)) + { + $this->_addoutput($word); + return; + } + if ($this->_pf_quote_active && + (($this->_pv_last_word == '"' && $this->_last_pevent != PARSER_EVENT_QUOTE) || + (is_array($this->_pv_last_word) && $this->_pv_last_word[0] == T_END_HEREDOC && + $this->_last_pevent != PARSER_EVENT_EOFQUOTE))) + { + $this->_pf_quote_active = false; + $this->_wp->backupPos($word); + $this->_event_stack->popEvent(); + return; + } + if (!$this->_pf_quote_active && + (($this->_pv_last_word == '"' && $this->_last_pevent != PARSER_EVENT_QUOTE) || + (is_array($this->_pv_last_word) && $this->_pv_last_word[0] == T_END_HEREDOC && + $this->_last_pevent != PARSER_EVENT_EOFQUOTE))) + { + if (is_array($word) && $word[0] == T_VARIABLE) $this->_pv_lastvar = $word; + $this->_pf_quote_active = true; + $this->_save_highlight_state = $this->_converter->getHighlightState(); + $this->_converter->startHighlight(); + $this->_addoutput($word); + $this->checkEventPop($word, $pevent); + return; + } elseif (is_array($this->_pv_last_word) && $this->_pv_last_word[0] == T_CONSTANT_ENCAPSED_STRING) + { +// $this->_pv_quote_data = $this->_pv_last_word[1]; + $this->_event_stack->popEvent(); + $this->_wp->backupPos($word); + return; + } + if ($this->checkEventPop($word, $pevent)) + { + $this->_pf_quote_active = false; + } + $this->_addoutput($word); + } + + /** + * Handles {$variable} within a "quote" + * + * This is a simple handler, for a very complex + * array of legal syntax. It is legal to nest control structures + * inside the {}, and other weird stuff. + */ + function handleQuoteVar($word, $pevent) + { + if ($this->checkEventPop($word, $pevent)) + { + $this->_pf_quote_active = true; + $this->_addoutput($word); + return; + } + if ($this->_pf_inmethod && is_array($word) && $word[0] == T_VARIABLE) $this->_pv_lastvar = $word; + if ($this->checkEventPush($word, $pevent)) + { + $this->_pf_quote_active = false; + if (is_string($word) && ($word == '{' || $word == '"' || $word == "'")) + { + $this->_pf_quote_active = true; + $this->_pv_lastvar = false; + } + } + $this->_addoutput($word); + } + + /** + * Handles define() statements + * + * The only thing this handler cares about is retrieving the name of the + * define variable, and the end of the define statement, so after the name + * is found, it simply makes sure parentheses are matched as in this case: + * + * + * define("test",array("hello",6 => 4, 5 => array('there'))); + * + * + * This handler and the DEFINE_PARAMS_PARENTHESIS handler (which is just + * {@link defaultHandler()} in this version, as nothing fancy is needed) + * work together to ensure proper parenthesis matching. + * + * If the define variable is documented, a link will be created to its + * documentation using the Converter passed. + */ + function handleDefine($word, $pevent) + { + static $token_save; + if (!isset($token_save)) $token_save = array(); + $e = $this->checkEventPush( $word, $pevent); + if ($e && $e != PARSER_EVENT_DEFINE_PARAMS_PARENTHESIS) return; + + if(!isset($this->_pv_define_params_data)) $this->_pv_define_params_data = ''; + + if ($this->checkEventPop($word,$pevent)) + { + unset($token_save); + $this->_addoutput($word); + } + if ($this->_pf_definename_isset) + { + $this->_addoutput($word); + } else + { + if ($word != ",") + { + $token_save[] = $word; + if (is_array($word)) $word = $word[1]; + $this->_pv_define_params_data .= $word; + } else + { + if (substr($this->_pv_define_params_data,0,1) == + substr($this->_pv_define_params_data,strlen($this->_pv_define_params_data) - 1) && + in_array(substr($this->_pv_define_params_data,0,1),array('"',"'"))) + { // remove leading and ending quotation marks if there are only two + $a = substr($this->_pv_define_params_data,0,1); + $b = substr($this->_pv_define_params_data,1,strlen($this->_pv_define_params_data) - 2); + if (strpos($b,$a) === false) + { + $this->_pv_define_params_data = $b; + } + } + $this->_pf_definename_isset = true; + $link = $this->_converter->getLink($this->_pv_define_params_data); + foreach ($token_save as $token) + { + if (is_object($link)) + { + if (is_array($token)) $token = $token[1]; + $this->_addoutput($this->_converter->returnSee($link, $token)); + } else + { + $this->_addoutput($save, $token); + } + } + $this->_pv_define_params_data = ''; + } + } + } + + /** + * Handles normal global code. Special consideration is taken for DocBlocks + * as they need to retrieve the whole DocBlock before doing any output, so + * the parser flag {@link $_pf_no_output_yet} is set to tell + * {@link _addoutput()} not to spit anything out yet. + * @uses _link() make any global code that is a documentable element link + * to the php manual or its documentation + */ + function handlePhpCode($word, $pevent) + { + $test = $this->checkEventPush($word, $pevent); + if ($test == PARSER_EVENT_DOCBLOCK || $test == PARSER_EVENT_COMMENT) + { + $this->_pf_no_output_yet = true; + $this->_pv_saveline = $this->_wp->linenum + 1; + return; + } + if (is_array($word) && $word[0] == T_DOUBLE_COLON) $this->_pf_colon_colon = true; + if (!$this->_pf_colon_colon && is_array($word) && $word[0] == T_STRING) $this->_pv_last_string = $word; + $this->_link($word); + $this->checkEventPop($word, $pevent); + } + + /** + * Handle the function declaration header + * + * This handler only sees the "function name" portion of the function + * declaration. Handling of the function parameters is by + * {@link handleFunctionParams()}, and the function body is handled by + * {@link handleLogicBlock()} + */ + function handleFunction($word, $pevent) + { + if ($this->checkEventPush($word, $pevent)) + { + $this->_addoutput($word); + return; + } + if ($this->checkEventPop($word, $pevent)) return; + $this->_link($word); + } + + /** + * Handle the method declaration header + * + * This handler only sees the "function name" portion of the method + * declaration. Handling of the method parameters is by + * {@link handleFunctionParams()}, and the method body is handled by + * {@link handleMethodLogicBlock()} + */ + function handleMethod($word, $pevent) + { + if ($this->checkEventPush($word, $pevent)) + { + $this->_addoutput($word); + return; + } + if ($this->checkEventPop($word, $pevent)) { + if ($word == ';') { + $this->_addoutput($word); + } + return; + } + $this->_methodlink($word); + } + + /** + * Handler for the stuff between ( and ) in a function declaration + * + * + * function handles($only,$these,$parameters){...} + * + */ + function handleFunctionParams($word, $pevent) + { + if ($this->checkEventPush($word, $pevent)) + { + $this->_addoutput($word); + return; + } + $this->_addoutput($word); + $this->checkEventPop($word, $pevent); + } + + /** + * Handler for function body. + * + * The function body is checked for php functions, documented constants, + * functions, and indirectly for global statements. It hyperlinks to the + * documentation for detected elements is created. Everything else is + * highlighted normally. + */ + function handleLogicBlock($word, $pevent) + { + if ($this->checkEventPush($word, $pevent)) + { + $this->_addoutput($word); + return; + } + if (is_array($word) && $word[0] == T_DOUBLE_COLON) $this->_pf_colon_colon = true; + if (!$this->_pf_colon_colon && is_array($word) && $word[0] == T_STRING) $this->_pv_last_string = $word; + $this->_link($word); + if ($this->checkEventPop($word,$pevent)) + { + $e = $this->_event_stack->popEvent(); + $this->_event_stack->pushEvent($e); + if ($e == PARSER_EVENT_FUNCTION) + { + $this->_wp->backupPos($word); + } + } + } + + /** + * Handler for method body. + * + * Like functions, the method body is checked for php functions, documented + * constants, functions, and indirectly for global statements. It also + * checks for "$this->XXXX" where XXXX is a class variable or method, and + * links to the documentation for detected elements is created. Everything + * else is highlighted normally. + */ + function handleMethodLogicBlock($word, $pevent) + { + if (isset($this->_pv_prev_var_type)) + { +// debug('prevtype is set'); + if (!is_array($word)) unset($this->_pv_prev_var_type); + else + { + if ($word[0] != T_WHITESPACE && $word[0] != T_STRING && $word[0] != T_OBJECT_OPERATOR) + { +// fancy_debug('unset',$word); + unset($this->_pv_prev_var_type); + } + } + } + $this->_pf_inmethod = true; + if ($e = $this->checkEventPush($word, $pevent)) + { + $this->_addoutput($word); + if ($e == PARSER_EVENT_CLASS_MEMBER) { + $this->_pf_no_output_yet = true; + } + return; + } + if (is_array($word) && $word[0] == T_DOUBLE_COLON) $this->_pf_colon_colon = true; + if (!$this->_pf_colon_colon && is_array($word) && $word[0] == T_STRING) $this->_pv_last_string = $word; + if (is_array($word) && $word[0] == T_VARIABLE) $this->_pv_lastvar = $word; + $this->_link($word); + if ($this->checkEventPop($word,$pevent)) + { + $this->_pf_inmethod = false; + $e = $this->_event_stack->popEvent(); + $this->_event_stack->pushEvent($e); + if ($e == PARSER_EVENT_METHOD) + { + $this->_wp->backupPos($word); + } + } + } + + /** + * Handles $obj->classmember in a method body + * + * This handler is responsible for linking to the documentation of a + * class member when it is used directly in a method body. + * + * There are two methods of determining whether to link: + * - $this->member + * - $this->member->submember + * + * The first case is handled by the $_pv_lastvar variable, and the + * second case is handled by the $_pv_prev_var_type variable. $_pv_lastvar + * is always set to the value of the last T_VARIABLE token, if and only if + * no text has occurred between the variable and a T_OBJECT_OPERATOR token + * "->". handleClassMember will only link if the last variable encountered + * was $this. + * + * When $this->variable is encountered, the variable is looked up to see + * if it can be found, and if so, the contents of its @var tag are processed + * to see if the member variable is defined to have 1 and only 1 class. + * If so, the $_pv_prev_var_type variable is set to this classname. When + * submember is processed, the HighlightParser checks to see if + * $_pv_prev_var_type::submember() or $_pv_prev_var_type::$submember exists, + * and if it does, it is linked to. + */ + function handleClassMember($word, $pevent) + { + if (!isset($this->_pv_lastvar) && !isset($this->_pv_prev_var_type)) + { +// fancy_debug('returned from',$word,$this->_pv_prev_var_type); + $this->_pf_no_output_yet = false; + $this->_event_stack->popEvent(); + return $this->defaultHandler($word, $pevent); + } + if (isset($this->_pv_cm_name)) + { + $this->_pf_obj_op = false; + $name = $this->_pv_cm_name; + unset($this->_pv_cm_name); +// debug('unset pvcmname'); + $this->_event_stack->popEvent(); + // control variable for _pv_prev_var_type + $setnow = false; + if ((isset($this->_pv_lastvar) && $this->_pv_lastvar[1] == '$this') + || isset($this->_pv_prev_var_type)) + { + if (is_array($word) && $word[0] == T_WHITESPACE) + { + // preserve value of _pv_prev_var_type + $setnow = true; + $save = $this->_wp->nextToken(); + $temp = $this->_wp->getWord(); + $this->_wp->backupPos($save, true); + } + if ((is_string($word) && $word == '(') || + (isset($temp) && is_string($temp) && $temp == '(')) + { // it's a function + $this->_pf_no_output_yet = false; + $this->_methodlink($name); + unset($this->_pv_prev_var_type); + } else + { // it's a variable +// fancy_debug('name is ',$name); + $this->_pf_no_output_yet = false; + $this->_varlink($name, true); + $templink = $this->_converter->getLink('object '.$this->_pv_class); + $class = false; + if (is_object($templink)) { + $class = $this->_converter->classes->getClass($templink->name, $templink->path); + } + if ($class) + { + $varname = $name; + if (is_array($varname)) $varname = $name[1]; + if ($varname{0} != '$') $varname = '$'.$varname; + $var = $class->getVar($this->_converter, $varname); + + if (is_object($var) && $var->docblock->var) + $type = $var->docblock->var->returnType; + if (isset($type)) + { + if (strpos($type, 'object') === false) + $type = 'object '.$type; + $type = $this->_converter->getLink($type); + if (phpDocumentor_get_class($type) == 'classlink') + { // the variable's type is a class, save it for future -> +// fancy_debug('set prev_var_type!',$type->name); + $setnow = true; + $this->_pv_prev_var_type = $type->name; + } else unset($this->_pv_prev_var_type); + } else unset($this->_pv_prev_var_type); + } else unset($this->_pv_prev_var_type); + } + } else { + $this->_pf_no_output_yet = false; + // this does NewLinenum if necessary + $this->_wp->backupPos($word); + $this->_wp->getWord(); + $this->_addoutput($name); + } + if (!$setnow) + { +// debug('unset prevtype, no setnow'); + unset($this->_pv_prev_var_type); + } + unset($this->_pv_lastvar); + $this->_pf_no_output_yet = false; + // this does NewLinenum if necessary + $this->_wp->backupPos($word); + $this->_wp->getWord(); + if ($word[0] == T_OBJECT_OPERATOR) + $this->_wp->backupPos($word); + else + $this->_addoutput($word); + return; + } + if (!$this->_pf_obj_op && is_array($this->_pv_last_word) && $this->_pv_last_word[0] == T_OBJECT_OPERATOR) + { + if ((isset($this->_pv_lastvar) && $this->_pv_lastvar[1] == '$this') || isset($this->_pv_prev_var_type)) + { + $this->_pf_obj_op = true; + } else + { + $this->_pf_no_output_yet = false; + // this does NewLinenum if necessary + $this->_wp->backupPos($word); + $this->_wp->getWord(); + $this->_addoutput($word); + $this->_event_stack->popEvent(); + } + } + if (is_array($word) && $word == T_WHITESPACE) + { + $this->_pf_no_output_yet = false; + // this does NewLinenum if necessary + $this->_wp->backupPos($word); + $this->_wp->getWord(); + $this->_addoutput($word); + return; + } + if ($this->_pf_obj_op) + { + if (!(is_array($word) && ($word[0] == T_STRING || $word[0] == T_WHITESPACE))) + { + unset($this->_pv_lastvar); +// debug('unset lastvar'); + $this->_event_stack->popEvent(); + $this->_pf_no_output_yet = false; + // this does NewLinenum if necessary + $this->_wp->backupPos($word); + $this->_wp->getWord(); + $this->_addoutput($word); + return; + } + if ($word[0] == T_STRING) + { +// fancy_debug('set pvcmname to',$word); + $this->_pv_cm_name = $word; + } else { + $this->_pf_no_output_yet = false; + // this does NewLinenum if necessary + $this->_wp->backupPos($word); + $this->_wp->getWord(); + $this->_addoutput($word); + } + } + } + + /** + * Handles comments + * + * Comments are almost always single-line tokens, and so will be + * in the last word. This handler checks to see if the current token + * is in fact a comment, and if it isn't, it backs up and returns control + * to the parent event handler with that word. + */ + function handleComment($word, $pevent) + { + $w = $this->_pv_last_word; + // don't perform this check if this is a normal comment. Docblocks + // have the _pf_no_output_yet variable set to true + if ($this->_pf_no_output_yet && + is_array($w) && (in_array($w[0], array(T_COMMENT, T_DOC_COMMENT)) && strpos($w[1],'/**') === 0)) { + $this->_event_stack->popEvent(); + $this->_event_stack->pushEvent(PARSER_EVENT_DOCBLOCK); + return $this->handleDocBlock($word, PARSER_EVENT_DOCBLOCK); + } + if ($this->_pf_no_output_yet) { + $flag = 1; + $this->_pf_no_output_yet = false; + $this->_addoutput($this->_pv_last_word); + } + if (!is_array($word) || !in_array($word[0], array(T_COMMENT, T_DOC_COMMENT)) || + (in_array($word[0], array(T_COMMENT, T_DOC_COMMENT)) && strpos($word[1],'/**') === 0)) + { + $this->_event_stack->popEvent(); + if (strpos($this->_pv_last_word[1], "\n") !== false) + { +// $this->_wp->linenum++; +// $this->newLineNum(); + } + $this->_wp->backupPos($this->_pv_last_word); + $this->_wp->getWord(); +// var_dump($this->_wp->nextToken()); + return; + } elseif (isset($flag)) { + $this->newLineNum(); + } + $this->_addoutput($word); + $this->checkEventPop($word, $pevent); + if (strpos($word[1], '*/') === strlen($word[1]) - 2) { + $this->_event_stack->popEvent(); + } + } + + /** + * Handle class declarations + * + * Handles the initial declaration line: + * + * class X + * + * or + * + * class X extends Y implements I + * + * @uses _classlink() to link to documentation for X and for Y class in + * "class X extends Y" + */ + function handleClass($word, $pevent) + { + $this->_pf_in_class = true; + $a = $this->checkEventPush( $word, $pevent); + + if (!isset($this->_pv_class) && is_array($word) && $word[0] == T_STRING) + { + $this->_pv_class = $this->_converter->class = $word[1]; + $this->_classlink($word); + return; + } + + if (is_array($word) && in_array($word[0], array(T_PRIVATE, T_PROTECTED, T_PUBLIC))) { + $starttok = $this->_wp->nextToken(); + $test = array(T_WHITESPACE); + while ($test && $test[0] == T_WHITESPACE) { + $tok = $this->_wp->nextToken(); + $test = $this->_wp->getWord(); + } // while + + if (is_array($test) && $test[0] == T_VARIABLE) { + $this->_wp->backupPos($tok, true); + return; + } + $this->_wp->backupPos($starttok, true); + } + + if (@in_array($this->_pv_last_word[0], array(T_PRIVATE, T_PROTECTED, T_PUBLIC))) { + if (is_array($word) && $word[0] == T_VARIABLE) { + $this->_wp->backupPos($this->_pv_last_word); + $this->_event_stack->pushEvent(PARSER_EVENT_VAR); + return; + } + } + + if ($this->_pf_extends_found && is_array($word) && $word[0] == T_STRING) + { + $this->_classlink($word); + return; + } + if (is_array($word) && $word[0] == T_EXTENDS) $this->_pf_extends_found = true; + if ($a == PARSER_EVENT_DOCBLOCK) + { + $this->_pf_no_output_yet = true; + $this->_pv_saveline = $this->_wp->linenum + 1; + return; + } + $this->_addoutput($word); + if ($this->checkEventPop($word,$pevent)) + { + $this->_pf_in_class = false; + unset($this->_pv_class); + } + } + + /** + * Handles class variable declaration + * + * + * class X + * { + * var $Y; + * } + * + * @uses _varlink() make a link to $Y documentation in class variable + * declaration "var $Y;" + */ + function handleVar($word, $pevent) + { + if ($this->checkEventPush($word, $pevent)) + { + $this->_addoutput($word); + return; + } + if (is_array($word) && $word[0] == T_VARIABLE) + { + return $this->_varlink($word); + } + $this->_addoutput($word); + $this->checkEventPop($word, $pevent); + } + + /** + * This handler is responsible for highlighting DocBlocks + * + * handleDocBlock determines whether the docblock is normal or a template, + * and gathers all the lines of the docblock together before doing any + * processing + * + * As it is not possible to distinguish any comment token from a docblock + * token, this handler is also called for comments, and will pass control + * to {@link handleComment()} if the comment is not a DocBlock + * @uses commonDocBlock() once all lines of the DocBlock have been retrieved + */ + function handleDocBlock($word, $pevent) + { + if (!($this->_pf_docblock || $this->_pf_docblock_template)) + { + if (strpos($this->_pv_last_word[1],'/**') !== 0) + { // not a docblock + $this->_wp->backupPos($this->_pv_last_word); + $this->_event_stack->popEvent(); + $this->_event_stack->pushEvent(PARSER_EVENT_COMMENT); + $this->_pf_no_output_yet = false; + return; + } else + { + $this->_pf_no_output_yet = true; + $this->_pv_db_lines = array(); + } + } + $last_word = $this->_pv_last_word[1]; + $dtype = '_pv_docblock'; + if ($last_word == '/**#@-*/') + { // stop using docblock template + $this->_pf_no_output_yet = false; + $this->_addDocBlockoutput('closetemplate', $last_word); + if ($this->_pv_next_word !== false) { + $this->_wp->backupPos($this->_pv_next_word,true); + } + $this->_event_stack->popEvent(); + return; + } + if (!($this->_pf_docblock || $this->_pf_docblock_template)) + { + $this->_pv_db_lines = array(); + if (strpos($last_word,'/**#@+') === 0) + { // docblock template definition + $this->_pf_docblock_template = true; + } else + { + $this->_pf_docblock = true; + } + $this->_pv_db_lines[] = $last_word; + if (strpos($last_word,'*/') !== false) + { + $this->commonDocBlock(); + return; + } + $this->_pv_db_lines[] = $word[1]; + if (strpos($word[1],'*/') !== false) + { + $this->commonDocBlock(); + } + } else + { + $this->_pv_db_lines[] = $word[1]; + } + if (($this->_pf_docblock || $this->_pf_docblock_template) && (strpos($word[1],'*/') !== false)) + { + $this->commonDocBlock(); + } + } + /**#@-*/ + /** + * This continuation of handleDocBlock splits DocBlock comments up into + * phpDocumentor tokens. It highlights DocBlock templates in a different + * manner from regular DocBlocks, recognizes inline tags, regular tags, + * and distinguishes between standard core tags and other tags, and + * recognizes parameters to tags like @var. + * + * the type in "@var type description" will be highlighted as a php type, + * and the var in "@param type $var description" will be highlighted as a + * php variable. + * @uses handleDesc() highlight inline tags in the description + * @uses handleTags() highlight all tags + * @access private + */ + function commonDocBlock() + { + $this->_event_stack->popEvent(); + $lines = $this->_pv_db_lines; + $go = count($this->_pv_db_lines); + for($i=0;$i<$go;$i++) + { + if (substr(trim($lines[$i]),0,2) == '*/' || substr(trim($lines[$i]),0,1) != '*' && substr(trim($lines[$i]),0,3) != '/**') + { + $lines[$i] = array($lines[$i],false); + } elseif (substr(trim($lines[$i]),0,3) == '/**') + { + $linesi = array(); + $linesi[1] = substr(trim($lines[$i]),3); // remove leading "/**" + if (empty($linesi[1])) + $linesi[0] = $lines[$i]; + else + $linesi[0] = substr($lines[$i],0,strpos($lines[$i],$linesi[1])); + $lines[$i] = $linesi; + } else + { + $linesi = array(); + $linesi[1] = substr(trim($lines[$i]),1); // remove leading "* " + if (empty($linesi[1])) + $linesi[0] = $lines[$i]; + else + $linesi[0] = substr($lines[$i],0,strpos($lines[$i],$linesi[1])); + $lines[$i] = $linesi; + } + } + for($i = 0;$i_pf_no_output_yet = false; + $save = $this->_wp->linenum; + $this->_wp->linenum = $this->_pv_saveline; + $this->handleDesc($desc); + $this->handleTags($tags); + $this->_pv_db_lines = array(); + $this->_wp->linenum = $save; + if (strpos($this->_pv_last_word[1],'*/') !== false) + { + $this->_wp->backupPos($this->_pv_next_word,true); + } + $this->_pf_docblock = $this->_pf_docblock_template = false; + } + + /** + * Handle the description area of a DocBlock + * + * This method simply finds inline tags and highlights them + * separately from the rest of the description. + * @uses getInlineTags() + * @access private + */ + function handleDesc($desc) + { + $dbtype = 'docblock'; + $dbtype .= ($this->_pf_docblock ? '' : 'template'); + foreach($desc as $line) + { + $this->getInlineTags($line[0].$line[1]); + if (strpos($line[0],'*/') === false) + { + $this->newLineNum(); + $this->_wp->linenum++; + } + } + if ($this->_pf_internal) + { + $this->_pf_internal = false; + } + } + + /** + * Handle phpDocumentor tags in a DocBlock + * + * This method uses the {@link $tagHandlers} array to determine which + * method will handle tags found in the docblock, and passes the data to + * the individual handlers one by one + * @access private + */ + function handleTags($tags) + { + $newtags = array(); + $curtag = array(); + for($i=0;$i < count($tags);$i++) + { + $tagsi = trim($tags[$i][1]); + if (substr($tagsi,0,1) == '@' && substr($tagsi,0,2) != '@ ') + { // start a new tag + $tags[$i][1] = array(substr($tags[$i][1],0,strpos($tags[$i][1],$tagsi)),$tagsi); + if (!empty($curtag)) + { + $newtags[] = $curtag; + $curtag = array(); + } + $curtag[] = $tags[$i]; + } else $curtag[] = $tags[$i]; + } + if (!empty($curtag)) $newtags[] = $curtag; + foreach($newtags as $tag) + { + foreach($tag as $i => $t) + { + if ($t[1] === false) continue; + if (is_array($t[1])) + { + $tag[$i][1][1] = explode(" ",str_replace("\t",' ',$t[1][1])); + $x = $tag[$i][1][1]; + } + } + $tagname = substr(array_shift($x),1); + $restoftag = $tag; + if (isset($this->tagHandlers[$tagname])) + $handle = $this->tagHandlers[$tagname]; + else + $handle = $this->tagHandlers['*']; + $this->$handle($tagname,$restoftag); + } + } + + /** + * This handler recognizes all {@}inline} tags + * + * Normal inline tags are simply highlighted. the {@}internal}} inline + * tag {@tutorial tags.inlineinternal.pkg} is highlighted differently + * to distinguish it from other inline tags. + * @access private + */ + function getInlineTags($value, $endinternal = false) + { + if (!$value) return; + if ($this->_pf_internal && !$endinternal) + { + if (strpos($value,'}}') !== false) + { + $x = strrpos($value,'}}'); + // add the rest of internal + $this->getInlineTags(substr($value,0,$x + 3), true); + // strip internal from value + $value = substr($value,strrpos($value,'}}') + 1); + // turn off internal + $this->_pf_internal = false; + } + } + if (!$value) return; + $dbtype = 'docblock'; + $dbtype .= ($this->_pf_docblock ? '' : 'template'); + $save = $value; + $value = explode('{@',$value); + $newval = array(); + // everything before the first {@ is normal text + $this->_addDocBlockoutput($dbtype, $value[0]); + for($i=1;$i_addDocBlockoutput($dbtype, '{@}'.substr($value[$i],1)); + } else + { + $save = $value[$i]; + $value[$i] = str_replace("\t"," ",$value[$i]); + $value[$i] = explode(" ",$value[$i]); + $word = array_shift($value[$i]); + $val = join(' ',$value[$i]); + if ($word == 'internal') + { + $this->_pf_internal = true; + $this->_addDocBlockoutput($dbtype, '{@internal '); + $value[$i] = substr($save,strlen('internal') + 1); + // strip internal and cycle as if it were normal text. + $this->_addDocBlockoutput($dbtype, $value[$i]); + continue; + } + if (in_array(str_replace('}','',$word),$this->allowableInlineTags)) + { + if (strpos($word,'}')) + { + $word = str_replace('}','',$word); + $val = '} '.$val; + } + $val = explode('}',$val); + if (count($val) == 1) + { +// addError(PDERROR_UNTERMINATED_INLINE_TAG,$word,'',$save); + } + $rest = $val; + $val = array_shift($rest); + if ($endinternal) + $rest = join('}',$rest); + else + $rest = join(' ',$rest); + if (isset($this->inlineTagHandlers[$word])) + $handle = $this->inlineTagHandlers[$word]; + else + $handle = $this->inlineTagHandlers['*']; + $this->$handle($word,$val); + $this->_addDocBlockoutput($dbtype, $rest); + } else + { + $val = $word.' '.$val; + $this->_addDocBlockoutput($dbtype, '{@'.$val); + } + } + } + } + + + /** + * Handles all inline tags + * @access private + */ + function handleDefaultInlineTag($name, $value) + { + $this->_addDocBlockoutput('inlinetag','{@'.$name.' '.$value.'}'); + } + + /**#@+ + * phpDocumentor DocBlock tag handlers + * @access private + * @param string tag name + * @param array array of lines contained in the tag description + */ + /** + * Handle normal tags + * + * This handler adds to outpu all comment information before the tag begins + * as in " * " before "@todo" in " * @todo" + * + * Then, it highlights the tag as a regular or coretag based on $coretag. + * Finally, it uses getInlineTags to highlight the description + * @uses getInlineTags() highlight a tag description + * @param boolean whether this tag is a core tag or not + */ + function defaultTagHandler($name, $value, $coretag = false) + { + $dbtype = 'docblock'; + $dbtype .= ($this->_pf_docblock ? '' : 'template'); + foreach($value as $line) + { + $this->_addDocBlockoutput($dbtype, $line[0]); + if ($line[1] === false) + { + if (trim($line[0]) != '*/') + { + $this->newLineNum(); + $this->_wp->linenum++; + } + continue; + } + $this->_addDocBlockoutput($dbtype, $line[1][0]); + $stored = ''; + if (is_array($line[1][1])) + { + foreach($line[1][1] as $i => $tpart) + { + if ($tpart == '@'.$name && $i == 0) + { + $tagname = 'tag'; + if ($coretag) $tagname = 'coretag'; + $this->_addDocBlockoutput($tagname,'@'.$name); + continue; + } + $stored .= ' '.$tpart; + } + } else $stored = $line[1]; + $this->getInlineTags($stored); + if (strpos($stored,'*/') === false) + { + $this->newLineNum(); + $this->_wp->linenum++; + } + } + } + + /** + * @see defaultTagHandler() + */ + function coreTagHandler($name, $value) + { + return $this->defaultTagHandler($name, $value, true); + } + + /** + * Handles @global + * + * This handler works like {@link defaultTagHandler()} except it highlights + * the type and variable (if present) in "@global type $variable" or + * "@global type description" + */ + function globalTagHandler($name, $value) + { + $this->paramTagHandler($name, $value); + } + + /** + * Handles @param + * + * This handler works like {@link defaultTagHandler()} except it highlights + * the type and variable (if present) in "@param type $variable description" + * or "@param type description" + * @param boolean private parameter, checks for $var or not + */ + function paramTagHandler($name, $value, $checkforvar = true) + { + $dbtype = 'docblock'; + $dbtype .= ($this->_pf_docblock ? '' : 'template'); + $ret = $this->retrieveType($value,0,$checkforvar); + foreach($value as $num => $line) + { + $this->_addDocBlockoutput($dbtype, $line[0]); + if ($line[1] === false) + { + if (trim($line[0]) != '*/') + { + $this->newLineNum(); + $this->_wp->linenum++; + } + continue; + } + $this->_addDocBlockoutput($dbtype, $line[1][0]); + $stored = ''; + $typeloc = 1; + $varloc = 2; + if (is_array($line[1][1])) + { + $this->_addDocBlockoutput('coretag','@'.$name.' '); + foreach($ret[0] as $text) + { + if (is_string($text)) $this->_addDocBlockoutput($dbtype,$text); + if (is_array($text)) + { + if ($text[0] != 'desc') $this->_addDocBlockoutput($text[0],$text[1]); + else $stored .= $text[1]; + } + } + } else + { + if (isset($ret[$num])) + { + foreach($ret[$num] as $text) + { + if (is_string($text)) $this->_addDocBlockoutput($dbtype,$text); + if (is_array($text)) + { + if ($text[0] != 'desc') $this->_addDocBlockoutput($text[0],$text[1]); + else $stored .= $text[1]; + } + } + } else $stored = $line[1]; + } + $this->getInlineTags($stored); + if (strpos($stored,'*/') === false) + { + $this->newLineNum(); + $this->_wp->linenum++; + } + } + } + + /** + * @see paramTagHandler() + */ + function staticvarTagHandler($name, $value) + { + return $this->paramTagHandler($name, $value); + } + + /** + * @see paramTagHandler() + */ + function varTagHandler($name, $value) + { + return $this->paramTagHandler($name, $value); + } + + /** + * Handles @return + * + * This handler works like {@link defaultTagHandler()} except it highlights + * the type in "@return type description" + */ + function returnTagHandler($name, $value) + { + $this->paramTagHandler($name, $value, false); + } + /**#@-*/ + + /** + * Retrieve the type portion of a @tag type description + * + * Tags like @param, @return and @var all have a PHP type portion in their + * description. Since the type may contain the expression "object blah" + * where blah is a classname, it makes parsing out the type field complex. + * + * Even more complicated is the case where a tag variable can contain + * multiple types, such as object blah|object blah2|false, and so this + * method handles these cases. + * @param array array of words that were separated by spaces + * @param 0|1 0 = find the type, 1 = find the var, if present + * @param boolean flag to determine whether to check for the end of a + * type is defined by a $varname + * @return array Format: array(state (0 [find type], 1 [var], 2 [done]), + * + * @access private + */ + function retrieveType($value, $state = 0, $checkforvar = false) + { + $index = 0; + $result = array(); + do + { + if (!isset($value[$index][1])) return $result; + $val = $value[$index][1]; + if (empty($val)) return $result; + if ($index == 0) + { + $val = $val[1]; + array_shift($val); + } else + { + $val = explode(' ',$val); + } + $ret = $this->_retrieveType($val, $state, $checkforvar); + $state = $ret[0]; + $result[$index++] = $ret[1]; + } while ((!$checkforvar && $state < 1) || ($state < 2 && $checkforvar)); + return $result; + } + + function _retrieveType($value, $state, $checkforvar) + { + $result = array(); + $result[] = $this->_removeWhiteSpace($value, 0); + if ($state == 0) + { + if (!count($value)) return array(2,$result); + $types = ''; + $index = 0; + if (trim($value[0]) == 'object') + { + $result[] = array('tagphptype', $value[0].' '); + $types .= array_shift($value).' '; + $result[] = $this->_removeWhiteSpace($value, 0); + if (!count($value)) + { // was just passed "object" + return array(2,$result); + } + if ($value[0]{0} == '$' || substr($value[0],0,2) == '&$') + { // was just passed "object" and the next thing is a variable name + if ($checkforvar) + { + $result[] = array('tagvarname' , $value[0].' '); + array_shift($value); + } + $result[] = array('desc', join(' ', $value)); + return array(2,$result); + } + } + $done = false; + $loop = -1; + do + { // this loop checks for type|type|type and for + // type|object classname|type|object classname2 + if (strpos($value[0], '|')) + { + $temptypes = explode('|', $value[0]); + while(count($temptypes)) + { + $type = array_shift($temptypes); + $result[] = array('tagphptype',$type); + if (count($temptypes)) $result[] = '|'; + } + if (trim($type) == 'object') + { + $result[] = array('tagphptype', $types . ' '); + $result[] = $this->_removeWhiteSpace($value,0); + } else $done = true; + array_shift($value); + if (count($value) && strlen($value[0]) && isset ($value[0]) && ($value[0]{0} == '$' || substr($value[0],0,2) == '&$')) + { // was just passed "object" and the next thing is a variable name + $result[] = array('tagvarname' , $value[0].' '); + array_shift($value); + $result[] = array('desc', join(' ', $value)); + return array(2,$result); + } + } else + { + $result[] = array('tagphptype', $value[0].' '); + array_shift($value); + $done = true; + } + $loop++; + } while (!$done && count($value)); + if ($loop) $result[] = ' '; + // still searching for type + if (!$done && !count($value)) return array(0,$result); + // still searching for var + if ($done && !count($value)) return array(1,$result); + } + $result[] = $this->_removeWhiteSpace($value,0); + $state = 1; + if ($checkforvar) + { + if (count($value)) + { + $state = 2; + if (substr($value[0],0,1) == '$' || substr($value[0],0,2) == '&$') + { + $result[] = array('tagvarname' , $value[0].' '); + array_shift($value); + } + } else $state = 1; + } + $result[] = array('desc', join(' ',$value)); + return array($state,$result); + } + + + /** + * @param array array of string + * @param integer index to seek non-whitespace to + * @access private + * @return string whitespace + */ + function _removeWhiteSpace(&$value, $index) + { + $result = ''; + if (count($value) > $index && empty($value[$index])) + { + $found = false; + for($i=$index; $i_pf_colon_colon) + { + $this->_pf_colon_colon = false; + $combo = $this->_pv_last_string[1].'::'.$word[1].'()'; +// debug('testing '.$combo); + $link = $this->_converter->getLink($combo); + if (is_object($link)) + { + $this->_addoutput($this->_converter->returnSee($link, $word[1]), true); + return; + } + $this->_addoutput($word); + return; + } + $link = $this->_converter->getLink($word[1].'()'); + if (is_object($link)) + { + $this->_addoutput($this->_converter->returnSee($link, $word[1]), true); + return; + } elseif (is_string($link) && strpos($link,'ttp://')) + { + $this->_addoutput($this->_converter->returnLink($link, $word[1]), true); + return; + } else + { + $link = $this->_converter->getLink($word[1]); + if (is_object($link)) $word[1] = $this->_converter->returnSee($link, $word[1]); + $this->_addoutput($word, true); + return; + } + } + $this->_addoutput($word); + } + + /** + * Works like {@link _link()} except it only links to global variables + */ + function _globallink($word) + { + if (!is_array($word)) return $this->_addoutput($word); + if ($word[0] != T_VARIABLE) return $this->_addoutput($word); + if (is_array($word) && $word[0] == T_VARIABLE) + { + $link = $this->_converter->getLink('global '.$word[1]); + if (is_object($link)) + { + $this->_addoutput($this->_converter->returnSee($link, $word[1]), true); + return; + } + } + $this->_addoutput($word); + } + + /** + * Works like {@link _link()} except it only links to classes + */ + function _classlink($word) + { +// debug("checking class ".$word[1]); + if (is_array($word) && $word[0] == T_STRING) + { + $link = $this->_converter->getLink($word[1]); + if (is_object($link)) + { + $this->_addoutput($this->_converter->returnSee($link, $word[1]), true); + return; + } + } + $this->_addoutput($word); + } + + /** + * Works like {@link _link()} except it only links to methods + */ + function _methodlink($word) + { + if (is_array($word) && $word[0] == T_STRING) + { +// debug("checking method ".$this->_pv_class.'::'.$word[1].'()'); + if (isset($this->_pv_prev_var_type)) + { + $link = $this->_converter->getLink($this->_pv_prev_var_type.'::'.$word[1].'()'); + } else + $link = $this->_converter->getLink($this->_pv_class.'::'.$word[1].'()'); + if (is_object($link)) + { + $this->_addoutput($this->_converter->returnSee($link, $word[1]), true); + return; + } + if (isset($this->_pv_prev_var_type)) + { + $this->_addoutput($word); + return; + } +// debug("checking method ".$word[1].'()'); + $link = $this->_converter->getLink($word[1].'()'); + if (is_object($link)) + { + $this->_addoutput($this->_converter->returnSee($link, $word[1]), true); + return; + } + } + $this->_addoutput($word); + } + + /** + * Works like {@link _link()} except it only links to class variables + */ + function _varlink($word, $justastring=false) + { + if ($justastring) + { + $word[0] = T_VARIABLE; + } + if (is_array($word) && $word[0] == T_VARIABLE) + { + $x = ($justastring ? '$' : ''); +// debug("checking var ".$this->_pv_class.'::'.$x.$word[1]); + if (isset($this->_pv_prev_var_type)) + { +// debug("checking var ".$this->_pv_prev_var_type.'::'.$x.$word[1]); + $link = $this->_converter->getLink($this->_pv_prev_var_type.'::'.$x.$word[1]); + } + else + $link = $this->_converter->getLink($this->_pv_class.'::'.$x.$word[1]); + if (is_object($link)) + { + $this->_addoutput($this->_converter->returnSee($link, $word[1]), true); + return; + } +// debug("checking var ".$x.$word[1]); + if (isset($this->_pv_prev_var_type)) + { + $this->_addoutput($word); + return; + } + $link = $this->_converter->getLink($x.$word[1]); + if (is_object($link)) + { + $this->_addoutput($this->_converter->returnSee($link, $word[1]), true); + return; + } + } + $this->_addoutput($word); + } + /**#@-*/ + + /**#@+ + * Output Methods + * @access private + */ + /** + * This method adds output to {@link $_line} + * + * If a string with variables like "$test this" is present, then special + * handling is used to allow processing of the variable in context. + * @see _flush_save() + */ + function _addoutput($word, $preformatted = false) + { + if ($this->_pf_no_output_yet) return; + if ($this->_pf_quote_active) + { + if (is_array($word)) $this->_save .= $this->_converter->highlightSource($word[0], $word[1]); + else + $this->_save .= $this->_converter->highlightSource(false, $word, true); + } else + { + $this->_flush_save(); + if (is_string($word) && trim($word) == '') + { + $this->_line .= $word; + return; + } + if (is_array($word) && trim($word[1]) == '') + { + $this->_line .= $word[1]; + return; + } + if (is_array($word)) + { + $this->_line .= $this->_converter->highlightSource($word[0], $word[1], $preformatted); + } else + { + $this->_line .= $this->_converter->highlightSource(false, $word, $preformatted); + } + } + } + + /** + * Like {@link _output()}, but for DocBlock highlighting + */ + function _addDocBlockoutput($dbtype, $word, $preformatted = false) + { + if ($this->_pf_internal) + { + $this->_line .= $this->_converter->highlightDocBlockSource('internal', $word, $preformatted); + } else + { + $this->_line .= $this->_converter->highlightDocBlockSource($dbtype, $word, $preformatted); + } + } + + /** + * Flush a saved string variable highlighting + * + * {@source} + */ + function _flush_save() + { + if (!empty($this->_save)) + { + $this->_save .= $this->_converter->flushHighlightCache(); + // clear the existing cache, reset it to the old value + $this->_converter->_setHighlightCache($this->_save_highlight_state[0], $this->_save_highlight_state[1]); + $this->_line .= $this->_converter->highlightSource(T_CONSTANT_ENCAPSED_STRING, $this->_save, true); + $this->_save = ''; + } + } + /**#@-*/ + + /** + * Give the word parser necessary data to begin a new parse + * @param array all tokens separated by line number + */ + function configWordParser(&$data) + { + $this->_wp->setup($data, $this); + $this->_wp->setWhitespace(true); + } + + /** + * Initialize all parser state variables + * @param boolean true if we are highlighting an inline {@}source} tag's + * output + * @param false|string name of class we are going to start from + * @uses $_wp sets to a new {@link phpDocumentor_HighlightWordParser} + */ + function setupStates($inlinesourceparse, $class) + { + $this->_output = ''; + $this->_line = ''; + unset($this->_wp); + $this->_wp = new phpDocumentor_HighlightWordParser; + $this->_event_stack = new EventStack; + if ($inlinesourceparse) + { + $this->_event_stack->pushEvent(PARSER_EVENT_PHPCODE); + if ($class) + { + $this->_event_stack->pushEvent(PARSER_EVENT_CLASS); + $this->_pv_class = $class; + } + } else $this->_pv_class = null; + $this->_pv_define = null; + $this->_pv_define_name = null; + $this->_pv_define_value = null; + $this->_pv_define_params_data = null; + $this->_pv_dtype = null; + $this->_pv_docblock = null; + $this->_pv_dtemplate = null; + $this->_pv_func = null; + $this->_pv_global_name = null; + $this->_pv_global_val = null; + $this->_pv_globals = null; + $this->_pv_global_count = null; + $this->_pv_include_params_data = null; + $this->_pv_include_name = null; + $this->_pv_include_value = null; + $this->_pv_linenum = null; + $this->_pv_periodline = null; + $this->_pv_paren_count = 0; + $this->_pv_statics = null; + $this->_pv_static_count = null; + $this->_pv_static_val = null; + $this->_pv_quote_data = null; + $this->_pv_function_data = null; + $this->_pv_var = null; + $this->_pv_varname = null; + $this->_pf_definename_isset = false; + $this->_pf_extends_found = false; + $this->_pf_includename_isset = false; + $this->_pf_get_source = false; + $this->_pf_getting_source = false; + $this->_pf_in_class = false; + $this->_pf_in_define = false; + $this->_pf_in_global = false; + $this->_pf_in_include = false; + $this->_pf_in_var = false; + $this->_pf_funcparam_val = false; + $this->_pf_quote_active = false; + $this->_pf_reset_quote_data = true; + $this->_pf_useperiod = false; + $this->_pf_var_equals = false; + $this->_pf_obj_op = false; + $this->_pf_docblock = false; + $this->_pf_docblock_template = false; + $this->_pf_colon_colon = false; + $this->_pv_last_string = false; + $this->_pf_inmethod = false; + $this->_pf_no_output_yet = false; + $this->_pv_saveline = 0; + $this->_pv_next_word = false; + $this->_save = ''; + } + + /** + * Initialize the {@link $tokenpushEvent, $wordpushEvent} arrays + */ + function phpDocumentor_HighlightParser() + { + if (!defined('T_INTERFACE')) { + define('T_INTERFACE', -1); + } + $this->allowableTags = $GLOBALS['_phpDocumentor_tags_allowed']; + $this->allowableInlineTags = $GLOBALS['_phpDocumentor_inline_doc_tags_allowed']; + $this->inlineTagHandlers = array('*' => 'handleDefaultInlineTag'); +/**************************************************************/ + + $this->tokenpushEvent[PARSER_EVENT_NOEVENTS] = + array( + T_OPEN_TAG => PARSER_EVENT_PHPCODE, + ); + +/**************************************************************/ + + $this->tokenpushEvent[PARSER_EVENT_PHPCODE] = + array( + T_FUNCTION => PARSER_EVENT_FUNCTION, + T_CLASS => PARSER_EVENT_CLASS, + T_INTERFACE => PARSER_EVENT_CLASS, + T_INCLUDE_ONCE => PARSER_EVENT_INCLUDE, + T_INCLUDE => PARSER_EVENT_INCLUDE, + T_START_HEREDOC => PARSER_EVENT_EOFQUOTE, + T_REQUIRE => PARSER_EVENT_INCLUDE, + T_REQUIRE_ONCE => PARSER_EVENT_INCLUDE, + T_COMMENT => PARSER_EVENT_COMMENT, + T_DOC_COMMENT => PARSER_EVENT_DOCBLOCK, + ); + $this->wordpushEvent[PARSER_EVENT_PHPCODE] = + array( + "define" => PARSER_EVENT_DEFINE, + ); +/**************************************************************/ + + $this->wordpushEvent[PARSER_EVENT_FUNCTION] = + array( + '{' => PARSER_EVENT_LOGICBLOCK, + '(' => PARSER_EVENT_FUNCTION_PARAMS, + ); + $this->tokenpushEvent[PARSER_EVENT_FUNCTION] = + array( + T_COMMENT => PARSER_EVENT_COMMENT, + T_DOC_COMMENT => PARSER_EVENT_DOCBLOCK, + ); + + $this->wordpopEvent[PARSER_EVENT_FUNCTION] = array("}"); +/**************************************************************/ + + $this->tokenpopEvent[PARSER_EVENT_EOFQUOTE] = array(T_END_HEREDOC); +/**************************************************************/ + + $this->tokenpushEvent[PARSER_EVENT_FUNCTION_PARAMS] = + array( + T_CONSTANT_ENCAPSED_STRING => PARSER_EVENT_QUOTE, + T_ARRAY => PARSER_EVENT_ARRAY, + T_COMMENT => PARSER_EVENT_COMMENT, + T_DOC_COMMENT => PARSER_EVENT_DOCBLOCK, + ); + $this->wordpushEvent[PARSER_EVENT_FUNCTION_PARAMS] = + array( + '"' => PARSER_EVENT_QUOTE, + "'" => PARSER_EVENT_QUOTE, + ); + $this->wordpopEvent[PARSER_EVENT_FUNCTION_PARAMS] = array(")"); +/**************************************************************/ + + $this->wordpushEvent[PARSER_EVENT_LOGICBLOCK] = + array( + "{" => PARSER_EVENT_LOGICBLOCK, + '"' => PARSER_EVENT_QUOTE, + ); + $this->tokenpushEvent[PARSER_EVENT_LOGICBLOCK] = + array( + T_GLOBAL => PARSER_EVENT_FUNC_GLOBAL, + T_STATIC => PARSER_EVENT_STATIC_VAR, + T_START_HEREDOC => PARSER_EVENT_EOFQUOTE, + T_CURLY_OPEN => PARSER_EVENT_LOGICBLOCK, + T_DOLLAR_OPEN_CURLY_BRACES => PARSER_EVENT_LOGICBLOCK, + ); + + $this->wordpopEvent[PARSER_EVENT_LOGICBLOCK] = array("}"); + $this->tokenpopEvent[PARSER_EVENT_LOGICBLOCK] = array(T_CURLY_OPEN); + +/**************************************************************/ + + $this->tokenpushEvent[PARSER_EVENT_ARRAY] = + array( + T_COMMENT => PARSER_EVENT_COMMENT, + T_DOC_COMMENT => PARSER_EVENT_DOCBLOCK, + ); + $this->wordpopEvent[PARSER_EVENT_ARRAY] = array(")"); +/**************************************************************/ + + $this->tokenpushEvent[PARSER_EVENT_FUNC_GLOBAL] = + array( + T_COMMENT => PARSER_EVENT_COMMENT, + T_DOC_COMMENT => PARSER_EVENT_DOCBLOCK, + ); + + $this->wordpopEvent[PARSER_EVENT_FUNC_GLOBAL] = array(";"); +/**************************************************************/ + + $this->tokenpushEvent[PARSER_EVENT_STATIC_VAR] = + array( + T_CONSTANT_ENCAPSED_STRING => PARSER_EVENT_QUOTE, + T_COMMENT => PARSER_EVENT_COMMENT, + T_DOC_COMMENT => PARSER_EVENT_DOCBLOCK, + ); + $this->wordpushEvent[PARSER_EVENT_STATIC_VAR] = + array( + "=" => PARSER_EVENT_STATIC_VAR_VALUE, + ); + $this->wordpopEvent[PARSER_EVENT_STATIC_VAR] = array(";"); +/**************************************************************/ + + $this->tokenpushEvent[PARSER_EVENT_STATIC_VAR_VALUE] = + array( + T_CONSTANT_ENCAPSED_STRING => PARSER_EVENT_QUOTE, + T_COMMENT => PARSER_EVENT_COMMENT, + T_DOC_COMMENT => PARSER_EVENT_DOCBLOCK, + T_ARRAY => PARSER_EVENT_ARRAY, + ); + $this->wordpushEvent[PARSER_EVENT_STATIC_VAR_VALUE] = + array( + '"' => PARSER_EVENT_QUOTE, + "'" => PARSER_EVENT_QUOTE, + ); + $this->wordpopEvent[PARSER_EVENT_STATIC_VAR_VALUE] = array(";",","); +/**************************************************************/ + $this->tokenpushEvent[PARSER_EVENT_QUOTE] = + array( + T_OBJECT_OPERATOR => PARSER_EVENT_CLASS_MEMBER, + T_CURLY_OPEN => PARSER_EVENT_QUOTE_VAR, + ); + + $this->wordpopEvent[PARSER_EVENT_QUOTE] = array('"'); +/**************************************************************/ + $this->tokenpushEvent[PARSER_EVENT_QUOTE_VAR] = + array( + T_OBJECT_OPERATOR => PARSER_EVENT_CLASS_MEMBER, + T_CURLY_OPEN => PARSER_EVENT_QUOTE_VAR, + ); + + $this->wordpushEvent[PARSER_EVENT_QUOTE_VAR] = + array( + "{" => PARSER_EVENT_QUOTE_VAR, + '"' => PARSER_EVENT_QUOTE_VAR, + "'" => PARSER_EVENT_QUOTE_VAR, + ); + $this->wordpopEvent[PARSER_EVENT_QUOTE_VAR] = array('}'); +/**************************************************************/ + + $this->tokenpushEvent[PARSER_EVENT_DEFINE] = + array( + T_COMMENT => PARSER_EVENT_COMMENT, + T_DOC_COMMENT => PARSER_EVENT_DOCBLOCK, + T_CONSTANT_ENCAPSED_STRING => PARSER_EVENT_QUOTE, + ); + $this->wordpushEvent[PARSER_EVENT_DEFINE] = + array( + "(" => PARSER_EVENT_DEFINE_PARAMS, + ); + $this->wordpopEvent[PARSER_EVENT_DEFINE] = array(";"); +/**************************************************************/ + + $this->tokenpushEvent[PARSER_EVENT_DEFINE_PARAMS] = + array( + T_COMMENT => PARSER_EVENT_COMMENT, + T_DOC_COMMENT => PARSER_EVENT_DOCBLOCK, + ); + $this->wordpushEvent[PARSER_EVENT_DEFINE_PARAMS] = + array( + "(" => PARSER_EVENT_DEFINE_PARAMS_PARENTHESIS, + '"' => PARSER_EVENT_QUOTE, + "'" => PARSER_EVENT_QUOTE, + ); + $this->wordpopEvent[PARSER_EVENT_DEFINE_PARAMS] = array(")"); +/**************************************************************/ + + $this->tokenpushEvent[PARSER_EVENT_DEFINE_PARAMS_PARENTHESIS] = + array( + T_COMMENT => PARSER_EVENT_COMMENT, + T_DOC_COMMENT => PARSER_EVENT_DOCBLOCK, + ); + $this->wordpushEvent[PARSER_EVENT_DEFINE_PARAMS_PARENTHESIS] = + array( + "(" => PARSER_EVENT_DEFINE_PARAMS_PARENTHESIS, + '"' => PARSER_EVENT_QUOTE, + "'" => PARSER_EVENT_QUOTE, + ); + $this->wordpopEvent[PARSER_EVENT_DEFINE_PARAMS_PARENTHESIS] = array(")"); +/**************************************************************/ + + $this->tokenpushEvent[PARSER_EVENT_VAR] = + array( + T_COMMENT => PARSER_EVENT_COMMENT, + T_DOC_COMMENT => PARSER_EVENT_DOCBLOCK, + T_ARRAY => PARSER_EVENT_ARRAY, + ); + $this->wordpopEvent[PARSER_EVENT_VAR] = array(";"); +/**************************************************************/ + + $this->tokenpushEvent[PARSER_EVENT_CLASS] = + array( + T_FUNCTION => PARSER_EVENT_METHOD, + T_VAR => PARSER_EVENT_VAR, + T_COMMENT => PARSER_EVENT_DOCBLOCK, + T_DOC_COMMENT => PARSER_EVENT_DOCBLOCK, + T_CLOSE_TAG => PARSER_EVENT_OUTPHP, + ); + $this->wordpopEvent[PARSER_EVENT_CLASS] = array("}"); + +/**************************************************************/ + + $this->wordpushEvent[PARSER_EVENT_METHOD] = + array( + '{' => PARSER_EVENT_METHOD_LOGICBLOCK, + '(' => PARSER_EVENT_FUNCTION_PARAMS, + ); + $this->tokenpushEvent[PARSER_EVENT_METHOD] = + array( + T_COMMENT => PARSER_EVENT_COMMENT, + T_DOC_COMMENT => PARSER_EVENT_DOCBLOCK, + ); + + $this->wordpopEvent[PARSER_EVENT_METHOD] = array("}", ";"); +/**************************************************************/ + + $this->wordpushEvent[PARSER_EVENT_METHOD_LOGICBLOCK] = + array( + "{" => PARSER_EVENT_METHOD_LOGICBLOCK, + '"' => PARSER_EVENT_QUOTE, + ); + $this->tokenpushEvent[PARSER_EVENT_METHOD_LOGICBLOCK] = + array( + T_OBJECT_OPERATOR => PARSER_EVENT_CLASS_MEMBER, + T_GLOBAL => PARSER_EVENT_FUNC_GLOBAL, + T_STATIC => PARSER_EVENT_STATIC_VAR, + T_CURLY_OPEN => PARSER_EVENT_LOGICBLOCK, + T_DOLLAR_OPEN_CURLY_BRACES => PARSER_EVENT_LOGICBLOCK, + ); + + $this->wordpopEvent[PARSER_EVENT_METHOD_LOGICBLOCK] = array("}"); + $this->tokenpopEvent[PARSER_EVENT_METHOD_LOGICBLOCK] = array(T_CURLY_OPEN); +/**************************************************************/ + + $this->tokenpushEvent[PARSER_EVENT_INCLUDE] = + array( + T_COMMENT => PARSER_EVENT_COMMENT, + T_DOC_COMMENT => PARSER_EVENT_DOCBLOCK, + ); + $this->wordpushEvent[PARSER_EVENT_INCLUDE] = + array( + "(" => PARSER_EVENT_INCLUDE_PARAMS, + ); + $this->wordpopEvent[PARSER_EVENT_INCLUDE] = array(";"); +/**************************************************************/ + + $this->tokenpushEvent[PARSER_EVENT_INCLUDE_PARAMS] = + array( + T_COMMENT => PARSER_EVENT_COMMENT, + T_DOC_COMMENT => PARSER_EVENT_DOCBLOCK, + ); + $this->wordpushEvent[PARSER_EVENT_INCLUDE_PARAMS] = + array( + "(" => PARSER_EVENT_INCLUDE_PARAMS_PARENTHESIS, + ); + $this->wordpopEvent[PARSER_EVENT_INCLUDE_PARAMS] = array(")"); +/**************************************************************/ + + $this->tokenpushEvent[PARSER_EVENT_INCLUDE_PARAMS_PARENTHESIS] = + array( + T_COMMENT => PARSER_EVENT_COMMENT, + T_DOC_COMMENT => PARSER_EVENT_DOCBLOCK, + ); + $this->wordpushEvent[PARSER_EVENT_INCLUDE_PARAMS_PARENTHESIS] = + array( + "(" => PARSER_EVENT_INCLUDE_PARAMS_PARENTHESIS, + ); + $this->wordpopEvent[PARSER_EVENT_INCLUDE_PARAMS_PARENTHESIS] = array(")"); + } +} +?> diff --git a/buildscripts/PhpDocumentor/phpDocumentor/InlineTags.inc b/buildscripts/PhpDocumentor/phpDocumentor/InlineTags.inc new file mode 100644 index 00000000..1bea7734 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/InlineTags.inc @@ -0,0 +1,854 @@ + + * @since 1.0rc1 + * @version $Revision: 1.1 $ + * @tutorial inlinetags.pkg + */ +class parserInlineTag extends parserBase +{ + /** + * Element type + * + * Type is used by many functions to skip the hassle of + * + * + * if phpDocumentor_get_class($blah) == 'parserBlah' + * + * always "inlinetag" + * @var string + */ + var $type = 'inlinetag'; + /** + * the name of the inline tag (like link) + * @var string + */ + var $inlinetype = ''; + + /** + * @param string $type tag type (example: link) + * @param string $value tag value (example: what to link to) + */ + function parserInlineTag($type,$value) + { + $this->inlinetype = $type; + $this->value = trim($value); + } + + /** + * @return integer length of the tag + */ + function Strlen() + { + // fix 1203451 + if (is_array($this->value)) + { + return array_reduce(create_function('$a,$b', 'return $a + strlen($b);')) + + count($this->value); + } + return strlen($this->value); + } + + /** + * @return string always '', used by {@link Parser::handleDocBlock()} to + * calculate the short description of a DocBlock + * @see parserStringWithInlineTags::getString() + * @see parserStringWithInlineTags::trimmedStrlen() + */ + function getString() + { + return ''; + } +} + +/** + * represents inline links + * @tutorial tags.inlinelink.pkg + * @package phpDocumentor + * @subpackage InlineTags + * @author Greg Beaver + * @since 1.0rc1 + */ +class parserLinkInlineTag extends parserInlineTag +{ + /** + * text to display in the link, can be different from the link for standard + * links like websites + * @var string + */ + var $linktext = ''; + + /** + * @param string $link stored in $value, see {@link parserBase::$value} + * @param string $text see {@link $linktext} + */ + function parserLinkInlineTag($link,$text) + { + if (strpos($link, ',')) + { + $link = explode(',',$link); + parserInlineTag::parserInlineTag('link',''); + $this->value = $link; + } else + { + parserInlineTag::parserInlineTag('link',$link); + } + $this->linktext = trim($text); + } + + /** + * @param Converter converter used to change the abstract link into text for + * display + * @return false|string returns the converted link or false if not converted + * successfully + */ + function Convert(&$c) + { + if (is_array($this->value)) + { + $ret = ''; + foreach($this->value as $text) + { + if (!empty($ret)) + { + $ret .= ', '; + } + $ret .= $this->ConvertPart($c, trim($text)); + } + return $ret; + } else + { + return $this->ConvertPart($c, $this->value); + } + } + + function ConvertPart(&$c, $value) + { + if (strpos($value,'://') || (strpos($value,'mailto:') === 0)) + { + if (strpos($value, ' ')) + { + $value = explode(' ', $value); + $link = array_shift($value); + $text = join(' ', $value); + } else + { + $link = $value; + $text = $this->linktext; + } + return $c->returnLink($link,htmlspecialchars($text)); + } else + { + $savevalue = $value; + $descrip = false; + if (strpos(trim($value),' ')) + { + $v = preg_split('/\s/',trim($value)); + if (in_array(strtolower($v[0]), array('object', 'function'))) + { + if (!isset($v[1]) || + (isset($v[1]) && strlen($v[1]) + && !in_array($v[1]{0}, array('$','&')) + && $v[1] != '###commanana####')) + { + $vsave = $v[0]; + array_shift($v); + $v[0] = $vsave . ' ' . $v[0]; + } + } + $value = $c->getLink($v[0]); + array_shift($v); + $descrip = join($v,' '); + $descrip = str_replace('###commanana####', ',', $descrip); + } else + { + $value = $c->getLink($value); + } + if (is_string($value)) + { + // feature 564991 + if (strpos($value,'://')) + { + // php function + return $c->returnLink($value,str_replace('PHP_MANUAL#','',$value)); + } + return $value; + } + if (!$descrip) $descrip = $c->type_adjust($savevalue); + if (is_object($value)) return $c->returnSee($value, $descrip); +/* // getLink parsed a comma-delimited list of linked thingies, add the commas back in + if (is_array($value)) + { + $a = ''; + foreach($value as $i => $bub) + { + if (!empty($a)) $a .= ', '; + if (is_string($value[$i])) + { + // feature 564991 + if (strpos($value[$i],'://')) + { + // php function + $a .= $c->returnLink($value[$i],str_replace('PHP_MANUAL#','',$vals[$i])); + } else + $a .= $value[$i]; + } + if (is_object($value[$i])) $a .= $c->returnSee($value[$i],$descrip[$i]); + } + return $a; + } */ + return $savevalue; + } + } +} + +/** + * Represents inline links to external tutorial documentation + * @tutorial tags.inlinetutorial.pkg + * @package phpDocumentor + * @subpackage InlineTags + */ +class parserTutorialInlineTag extends parserLinkInlineTag +{ + /** + * @param string $link stored in $value, see {@link parserBase::$value} + * @param string $text see {@link $linktext} + */ + function parserTutorialInlineTag($link,$text) + { + parserInlineTag::parserInlineTag('tutorial',$link); + $this->linktext = trim($text); + } + + /** + * @param Converter converter used to change the abstract link into text for display + * @return mixed returns the converted link or false if not converted successfully + */ + function Convert(&$c) + { + $descrip = false; + if (strpos($this->value,',') === false) + { + if (strpos(trim($this->value),' ')) + { + $v = split(' ',trim($this->value)); + $value = $c->getTutorialLink($v[0]); + array_shift($v); + $descrip = join($v,' '); + } else $value = $c->getTutorialLink($this->value); + } else + { + $vals = split(',',$this->value); + $descrip = array(); + foreach($vals as $val) + { + $val = trim($val); + if (strpos($val,' ')) + { + $v = split(' ',$val); + $value[] = $c->getTutorialLink($v[0]); + array_shift($v); + $descrip[] = join($v,' '); + } else + { + $value[] = $c->getTutorialLink($val); + $descrip[] = false; + } + } + } + if (is_string($value)) + { + return $value; + } + if (is_object($value)) return $c->returnSee($value,$descrip); + // getLink parsed a comma-delimited list of linked thingies, add the commas back in + if (is_array($value)) + { + $a = ''; + foreach($value as $i => $bub) + { + if (!empty($a)) $a .= ', '; + if (is_string($value[$i])) + { + $a .= $value[$i]; + } + if (is_object($value[$i])) $a .= $c->returnSee($value[$i],$descrip[$i]); + } + return $a; + } + return false; + } +} + +/** + * represents inline source tag, used for function/method source + * @tutorial tags.inlinesource.pkg + * @package phpDocumentor + * @subpackage InlineTags + */ +class parserSourceInlineTag extends parserInlineTag +{ + /** + * always 'source' + * @var string + */ + var $inlinetype = 'source'; + /** + * First line of source code to display + * @var integer + * @see $end + */ + var $start = 1; + /** + * Last line to display + * @var '*'|integer If '*' then the whole source will be used, otherwise + * the {@link $start} to $end line numbers will be displayed + */ + var $end = '*'; + /** + * tokenized source organized by line numbers for php 4.3.0+, the old + * {@}source} tag used a string + * @var string|array + */ + var $source = false; + /**#@+ @access private */ + /** @var string|false */ + var $_class; + /**#@-*/ + /** + * @param string format "start [end]" where start and end are line numbers + * with the end line number optional + */ + function parserSourceInlineTag($value) + { + parserInlineTag::parserInlineTag('source',''); + preg_match('/^([0-9]*)\W([0-9]*)$/',trim($value), $match); + if (!count($match)) + { + preg_match('/^([0-9]*)$/',trim($value),$match); + if (count($match)) + { + $this->start = (int) $match[1]; + } + } else + { + $this->start = (int) $match[1]; + $this->end = (int) $match[2]; + } + } + + /** + * only used to determine blank lines. {@}source} will not be blank, + * probably + */ + function Strlen() + { + return 1; + } + + function getString() + { + return '{@source}'; + } + + /** + * @param string|array source code + * @param boolean in php 4.3.0, if this is a method this will be true + * @param string class name if this is a method + */ + function setSource($source, $class = false) + { + if (is_array($source)) + { + $this->_class = $class; + $this->source = $source; + } else + { + $source = strstr($source,'function'); + $pos = strrpos($source,'}'); + $this->source = substr($source,0,$pos + 1); + } + } + + /** + * @uses stringConvert() in PHP 4.2.3-, this method is used to convert + * @uses arrayConvert() in PHP 4.3.0+, this method is used to convert + * @param Converter + */ + function Convert(&$c) + { + if (is_string($this->source)) return $this->stringConvert($c); + return $this->arrayConvert($c); + } + + /** + * @param Converter + * @uses phpDocumentor_HighlightParser Parses the tokenized source + */ + function arrayConvert(&$c) + { + $source = $this->source; + if ($this->end != '*') + { + $source = array_slice($this->source,0,$this->end + $this->start - 1); + } + $start = $this->start - 1; + if ($start < 0) $start = 0; + return $c->ProgramExample($source, true, true, $this->_class, $start); + } + + /** + * @param Converter + * @uses Converter::unmangle() remove the extraneous stuff from + * {@link highlight_string()} + * @deprecated in favor of PHP 4.3.0+ {@link arrayConvert()} + */ + function stringConvert(&$c) + { + $source = highlight_string('source.' ?>', true); + $source = ''.substr($source,strlen(' +<?php ') - 1); + $source = str_replace('} ?>','}',$source); + if ($this->start || ($this->end != '*')) + { + $source = explode('
            ',$source); + $start = $this->start; + if ($this->end != '*') + { + $source = array_slice($source,$start - 1,$this->end - $start + 1); + } else + { + $source = array_slice($source,$start - 1); + } + $source = implode($source,'
            '); + if ($start > 0) $source = "$source"; + if ($this->end != '*') $source = "$source"; + } + $source = $c->unmangle($source,$this->source); + return $source; + } +} + +/** + * Represents the example inline tag, used to display an example file + * inside a docblock or tutorial + * @tutorial tags.inlineexample.pkg + * @package phpDocumentor + * @subpackage InlineTags + */ +class parserExampleInlineTag extends parserSourceInlineTag +{ + /** + * @param string format "filepath[ start [end]]" where start and end are line numbers + * with the end line number optional + * @param string full path to the current file, used to check relative + * directory locations + * @param boolean if true, then this is in a tutorial + */ + function parserExampleInlineTag($value, $current_path, $isTutorial = false) + { + global $_phpDocumentor_setting; + parserInlineTag::parserInlineTag('example',''); + $path = false; + $tagValue = trim($value); + $path = $isAbsPath = $pathOnly = $fileName = $fileExt = $original_path = $title = FALSE; + do + { + // make sure the format is stuff.ext startline[ endline] + if (!preg_match('`(.*)\.(\w*)\s(.*)`', $tagValue, $match)) + { + // or format is stuff.ext + if (!preg_match('`(.*)\.(\w*)\s*$`', $tagValue, $match)) + { + // Murphy: Some funny path was given + $original_path = $tagValue; // used for error output + break; // try-block + } + } + if (strlen($match[1]) === 0) + { + // Murphy: Some funny path was given + $original_path = $tagValue; // used for error output + break; // try-block + } + $fileExt = $match[2]; + if (isset($match[3])) + { + $lines = explode(' ', trim($match[3])); + $this->start = (int) $lines[0]; + if (isset($lines[1])) { + $this->end = (int) $lines[1]; + } + } + $pathTmp = str_replace('\\', '/', $match[1]); // Replace windows '\' the path. + + // Is there a path and a file or is it just a file? + if (strpos($pathTmp,'/') === false) + { + // No path part + $pathOnly = ''; + $fileName = $pathTmp .'.'. $fileExt; + } else + { + $splitPos = strrpos($pathTmp,'/'); // split the path on the last directory, find the filename + $pathOnly = substr($match[1], 0, $splitPos+1); + $fileName = substr($match[1], $splitPos+1) .'.'. $fileExt; + // Is the path absolute? (i.e. does it start like an absolute path?) + if (('/' === $pathTmp[0]) || preg_match('`^\w*:`i', $pathTmp)) + { // works for both windows 'C:' and URLs like 'http://' + $isAbsPath = true; // Yes + } + } + + $original_path = $pathOnly . $fileName; + + // Now look for the file starting with abs. path. + if ($isAbsPath) + { + $tmp = realpath($original_path); // remove any weirdities like /../file.ext + if ($tmp && is_file($tmp)) + { + $path = $tmp; + } + // Alway break if abs. path was detected; even if file was not found. + break; // try-block + } + + // Search for the example file some standard places + // 1) Look if the ini-var examplesdir is set and look there ... + if (isset($_phpDocumentor_setting['examplesdir'])) + { + $tmp = realpath($_phpDocumentor_setting['examplesdir'] . PATH_DELIMITER . $original_path); + if ($tmp && is_file($tmp)) + { + $path = $tmp; // Yo! found it :) + break; // try-block + } + } + + // 2) Then try to look for an 'example/'-dir below the *currently* parsed file ... + if (!empty($current_path)) + { + $tmp = realpath(dirname($current_path) . PATH_DELIMITER . 'examples' . PATH_DELIMITER . $fileName); + if ($tmp && is_file($tmp)) + { + $path = $tmp; // Yo! found it :) + break; // try-block + } + } + + // 3) Then try to look for the example file below the subdir PHPDOCUMENTOR_BASE/examples/ ... + if (is_dir(PHPDOCUMENTOR_BASE . PATH_DELIMITER . 'examples')) + { + $tmp = realpath(PHPDOCUMENTOR_BASE . PATH_DELIMITER . 'examples' . PATH_DELIMITER . $original_path); + if ($tmp && is_file($tmp)) + { + $path = $tmp; // Yo! found it :) + break; // try-block + } + } + + $tmp = realpath(PHPDOCUMENTOR_BASE . PATH_DELIMITER . $original_path); + if ($tmp && is_file($tmp)) + { + $path = $tmp; // Yo! found it :) + break; // try-block + } + // If we reach this point, nothing was found and $path is false. + } while (false); + + if (!$path) + { + addWarning(PDERROR_EXAMPLE_NOT_FOUND, $original_path); + $this->path = false; + } else + { + $f = @fopen($path,'r'); + if ($f) + { + $example = fread($f,filesize($path)); + if (tokenizer_ext && !$isTutorial) + { + $obj = new phpDocumentorTWordParser; + $obj->setup($example); + $this->setSource($obj->getFileSource()); + unset($obj); + } else + { + $this->setSource($example); + } + } + } + } + + /** + * @param string|array source code + * @param boolean in php 4.3.0, if this is a method this will be true + * @param string class name if this is a method + */ + function setSource($source, $class = false) + { + $this->_class = $class; + $this->source = $source; + } + + /** + * @param Converter + * @uses phpDocumentor_HighlightParser Parses the tokenized source + */ + function arrayConvert(&$c) + { + $source = $this->source; + if ($this->end != '*') + { + $source = array_slice($this->source,0,$this->end + $this->start - 1); + } + $start = $this->start - 1; + if ($start < 0) $start = 0; + return $c->exampleProgramExample($source, true, true, $this->_class, $start); + } + + /** + * Return the source for the example file, enclosed in + * a tag to use in a tutorial + * @return string + */ + function getProgramListing() + { + $source = explode("\n", $this->source); + $start = $this->start; + if ($this->end != '*') + { + $source = array_slice($source,$start - 1,$this->end - $start + 1); + } else + { + $source = array_slice($source,$start - 1); + } + $source = join("\n", $source); + return + " + \n"; + } +} + +/** + * Represents the inheritdoc inline tag, used by classes/methods/vars to inherit + * documentation from the parent class if possible + * @tutorial tags.inlineinheritdoc.pkg + * @package phpDocumentor + * @subpackage InlineTags + */ +class parserInheritdocInlineTag extends parserInlineTag +{ + /** + * always 'inheritdoc' + * @var string + */ + var $inlinetype = 'inheritdoc'; + + /** + * Does nothing, overrides parent constructor + */ + function parserInheritdocInlineTag() + { + } + + function Convert() + { + addWarning(PDERROR_INHERITDOC_DONT_WORK_HERE); + return ''; + } +} + +/** + * Represents the inline {@}id} tag for tutorials + * @tutorial tags.inlineid.pkg + * @package phpDocumentor + * @subpackage InlineTags + */ +class parserIdInlineTag extends parserInlineTag +{ + /** + * always 'id' + * @var string + */ + var $inlinetype = 'id'; + /** + * package of the {@}id} + * @var string + */ + var $package = 'default'; + /** + * category of the {@}id} + * @var string + */ + var $category = 'default'; + /** + * subpackage of the {@}id} + * @var string + */ + var $subpackage = ''; + /** + * full name of the tutorial + * @var string + */ + var $tutorial; + /** + * section/subsection name + * @var string + */ + var $id; + + /** + * @param string package name + * @param string subpackage name + * @param string tutorial name + * @param string section/subsection name + * @param string category name + */ + function parserIdInlineTag($category,$package,$subpackage,$tutorial,$id = false) + { + $this->package = $package; + $this->subpackage = $subpackage; + $this->tutorial = $tutorial; + $this->id = $id; + $this->category = $category; + } + + /** + * @param Converter + * @uses Converter::getTutorialId() retrieve converter-specific ID + */ + function Convert(&$c) + { + if (!$this->id) return ''; + return $c->getTutorialId($this->package,$this->subpackage,$this->tutorial,$this->id,$this->category); + } +} + +/** + * Represents {@}toc} for table of contents generation in tutorials + * @tutorial tags.inlinetoc.pkg + * @package phpDocumentor + * @subpackage InlineTags + */ +class parserTocInlineTag extends parserInlineTag +{ + /** + * always 'toc' + * @var string + */ + var $inlinetype = 'toc'; + /** + * @var array format: + *
            +     * array(array('tagname' => section,
            +     *             'link' => returnsee link,
            +     *             'id' => anchor name,
            +     *             'title' => from title tag),...)
            +     * 
            + * @access private + */ + var $_toc = false; + /** + * full path to tutorial, used in conversion + * @var string + * @access private + */ + var $_path = false; + + function parserTocInlineTag() + { + parent::parserInlineTag('toc',''); + } + + /** + * @param array format: + *
            +     * array(array('tag' => {@link parserXMLDocBookTag},
            +     *             'id' => {@link parserIdInlineTag},
            +     *             'title' => {@link parserXMLDocBookTag title}),...)
            +     * 
            + */ + function setTOC($toc) + { + $this->toc = $toc; + } + + /** + * @param string + */ + function setPath($path) + { + $this->_path = $path; + } + + /** + * @uses Converter::formatTutorialTOC() passes an array of format: + * + *
            +     * array(
            +     *    'tagname' => string name of tag,
            +     *    'link' => {@link tutorialLink} to the tutorial,
            +     *    'id' => converter specific tutorial ID from {@link Converter::getTutorialId()}
            +     *    'title' => title of the tutorial)
            +     * 
            + * + * and returns the results as the table of contents + * @uses Converter::getTutorialId() retrieve the tutorial ID for + * @param Converter + */ + function Convert(&$c) + { + $newtoc = array(); + foreach($this->toc as $i => $toc) + { + if (isset($toc['title'])) + $toc['tag']->setTitle($toc['title']); + else + $toc['tag']->setTitle(new parserStringWithInlineTags); + $newtoc[$i]['tagname'] = $toc['tag']->name; + $l = new tutorialLink; + if (!isset($toc['title'])) $title = 'section '.$toc['id']->id; + else + $title = $toc['title']->Convert($c); + $l->addLink($toc['id']->id,$this->_path,basename($this->_path),$toc['id']->package, $toc['id']->subpackage, strip_tags($title)); + $newtoc[$i]['link'] = $c->returnSee($l); + $newtoc[$i]['id'] = $c->getTutorialId($toc['id']->package, $toc['id']->subpackage, basename($this->_path), $toc['id']->id, $toc['id']->category); + $newtoc[$i]['title'] = $title; + } + return $c->formatTutorialTOC($newtoc); + } +} +?> diff --git a/buildscripts/PhpDocumentor/phpDocumentor/IntermediateParser.inc b/buildscripts/PhpDocumentor/phpDocumentor/IntermediateParser.inc new file mode 100644 index 00000000..92a54ea0 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/IntermediateParser.inc @@ -0,0 +1,1832 @@ + parentpackagename + * @see Converter::getLink() + */ + var $package_parents = array(); + + /** + * Used to determine the category for tutorials. + * + * WARNING: If more than one category exists, the last category + * encountered will overwrite the previous and will raise a big warning + * @var array Format: packagename => categoryname + */ + var $packagecategories = array(); + + /** + * list of all packages encountered while documenting. Used in automatic + * linking. + * + * Converter::getLink() first checks if an ambiguous link is found in the + * current package. If not, it then checks in parent packages, and if still + * not found, uses this array to check in the rest of the packages before + * giving up + * @var array Format: array(packagename => 1, packagename => 1,...) + * @see Converter::getLink() + */ + var $all_packages = array(); + + /** + * array of packages to parser and output documentation for, if not all + * packages should be documented + * + * Format:
            + * array(package1,package2,...)
            + * or false if not set + * + * Use this option to limit output similar to ignoring files. If you have + * some temporary files that you don't want to specify by name but don't + * want included in output, set a package name for all the elements in your + * project, and set packageoutput to that name. the default package will be + * ignored. Parsing speed does not improve. If you want to ignore files + * for speed reasons, use the ignore command-line option + * @tutorial phpDocumentor.howto.pkg#using.command-line.packageoutput + * @see Io + * @var false|array + */ + var $packageoutput = false; + + /** + * the functions which handle output from the {@link Parser} + * @see handleEvent(), handleDocBlock(), handlePage(), handleClass() + * @see handleDefine(), handleFunction(), handleMethod(), handleVar() + * @see handlePackagePage(), handleInclude(), handleTutorial() + */ + var $event_handlers = array( + 'docblock' => 'handleDocBlock', + 'page' => 'handlePage', + 'class' => 'handleClass', + 'define' => 'handleDefine', + 'function' => 'handleFunction', + 'method' => 'handleMethod', + 'var' => 'handleVar', + 'const' => 'handleConst', + 'packagepage' => 'handlePackagePage', + 'include' => 'handleInclude', + 'global' => 'handleGlobal', + 'tutorial' => 'handleTutorial', + ); + + /** + * $data contains parsed structures for the current page being parsed + * + * In version 1.1+, $data is only used to store the current page information. + * All handling of documented elements is handled by the + * {@link ProceduralPages} and {@link Classes} classes. + * @var parserData + */ + var $data; + + /** + * set in {@link Setup.inc.php} to the value of the quitemode commandline + * option. + * + * If this option is true, informative output while parsing will not be + * displayed (documentation is unaffected) + * @var boolean + * @tutorial phpDocumentor.howto.pkg#using.command-line.quiet + */ + var $quietMode = false; + + /** + * used to keep track of inheritance at the smartest level possible for a + * dumb computer + * @var Classes + */ + var $classes = false; + + /** + * used to keep track of all elements in a procedural page. Handles name + * conflicts with elegance + * @since 1.1 + * @var ProceduralPages + */ + var $proceduralpages = false; + + /** + * an array of template names indexed by converter name + * + * For example, if the default HTMLframesConverter is using the DOM/l0l33t + * template, the array will be + * $converters['frames'] = 'DOM/l0l33t' + * @var array Format: array(Convertername1 => templatename) + * @see Converter + */ + var $converters = false; + /** + * @var string Title of generated documentation, passed to Converters + */ + var $title = ''; + + var $uses = array(); + + var $db_template; + + /** + * Stores parsed CHANGELOG/INSTALL/README files + * @var array Format: array(CHANGELOG => contents, + * INSTALL => contents, + * README => contents) + */ + var $ric = array(); + + /** + * Flag used to determine whether the last docblock + * was a page-level docblock. + * @var boolean + * @access private + */ + var $_lastDocBlockWasPageLevel = false; + + /** + * Flag used to determine whether the Page-level + * DocBlock was declared in old or new style + * @var boolean + * @access private + */ + var $_oldPageLevel = false; + + /** + * sets up basic data structures + * @param string Title of generated documentation, passed to Converters + * @see $title, $data, $classes, $proceduralpages + */ + function phpDocumentor_IntermediateParser($title='Generated Documentation') + { + $this->title = $title; + $this->data = new parserData; + $this->classes = new Classes; + $this->proceduralpages = new ProceduralPages; + } + + /** + * Retrieve the relative path. If the path contains "pear/" it will + * be used as the base, otherwise the Program_Root string will be used. + * @global array uses 'Program_Root' option to replace it with '' for + * retrieving the source location of a file + * @param string path to file + * @return string + * @see $sourceLocation + * @access private + */ + function _getSourceLocation($sl, $sourceloc) + { + global $_phpDocumentor_options; + if (empty($sl)) return false; + $sl = str_replace('\\','/',$sl); + if (strpos($sl,'pear/')) + { + $sl = substr($sl,strpos($sl,'pear/') + 5); + if (dirname($sl) == '.') + { + return 'PEAR'; + } + return dirname($sl); + } else + { + if (strpos(str_replace($_phpDocumentor_options['Program_Root'] . PATH_DELIMITER,'',$sourceloc),PATH_DELIMITER) === false) + return ''; + return dirname(str_replace($_phpDocumentor_options['Program_Root'] . PATH_DELIMITER,'',$sourceloc)); + } + } + + /** + * Guess the package/subpackage based on subdirectory if the --pear option + * + * A file in pear/dir/file.php will be in package "dir." A file in + * pear/dir/subdir/file.php will be in package "dir," subpackage "subdir." + * @param string full path of file + * @param template-ready source location Program_Root/dir/file.php + * @global array uses the 'pear' option to determine whether to guess based + * on subdirectory + * @tutorial phpDocumentor.howto.pkg#using.command-line.pear + */ + function _guessPackage($path, $sourceloc) + { + global $_phpDocumentor_setting; + if ($_phpDocumentor_setting['pear']) + { + $subpath = explode(PATH_DELIMITER, $this->_getSourceLocation($path, $sourceloc)); + if (!empty($subpath[0])) + { // can only have package and subpackage in this version + $package = $subpath[0]; + $subpackage = ''; + if (isset($subpath[1])) $subpackage = $subpath[1]; + return array($package,$subpackage); + } else return array($this->package, $this->subpackage); + } else return array($this->package, $this->subpackage); + } + + /** + * handles post-parsing of include/require/include_once/include_once + * + * This function sets {@link $data}->clean to false to tell the + * phpDocumentor_IntermediateParser that a page-level DocBlock can't be + * found after this point on this page. It then sets the package + * to be the same as the page, and adds itself to the + * {@link ProceduralPages} class + * @param integer $event Event number from {@link Parser.inc} + * @param parserInclude $data + */ + function handleInclude($event,$data) + { + if ($this->_lastDocBlockWasPageLevel) + { + addWarning(PDERROR_DOCBLOCK_CONFLICT, $data->getName(), $data->getFile()); + if (!$this->_oldPageLevel) + { + unset($this->last); + } + } + $this->_lastDocBlockWasPageLevel = + $this->data->clean = false; + // page was @ignored + if ($this->private_page) + { + unset($this->last); + return; + } + if (empty($this->last)) + { + if (isset($this->db_template)) + // use the docblock template + $this->last = phpDocumentor_clone($this->db_template); + else + // we don't have a docblock, create an empty one to get rid of errors + $this->last = new parserDocblock(); + } +// $this->last->setLineNumber($data->getLineNumber()); + if ($this->last->getKeyword('ignore')) + { + $this->last = false; + return; +// addWarning(PDERROR_IGNORE_TAG_IGNORED,'include',$data->getName().'('.$data->getValue().')'); + } + + $this->last->overridePackage($this->category,$this->package,$this->subpackage,$data->getName(),'include'); + $data->setDocBlock($this->last); + $this->proceduralpages->addInclude($data); + $this->last = false; + } + + /** + * handles post-parsing of global variables + * + * This function sets {@link $data}->clean to false to tell the + * phpDocumentor_IntermediateParser that a page-level DocBlock can't be + * found after this point on this page. It then sets the package + * to be the same as the page, and adds itself to the + * {@link ProceduralPages} class + * @param integer $event Event number from {@link Parser.inc} + * @param parserGlobal $data + */ + function handleGlobal($event,$data) + { + if ($this->_lastDocBlockWasPageLevel) + { + addWarning(PDERROR_DOCBLOCK_CONFLICT, 'global variable', $data->getName()); + if (!$this->_oldPageLevel) + { + unset($this->last); + } + } + $this->_lastDocBlockWasPageLevel = + $this->data->clean = false; + if ($this->private_page) + { + unset($this->last); + return; + } + if (empty($this->last)) + { + if (isset($this->db_template)) + // use the docblock template + $this->last = phpDocumentor_clone($this->db_template); + else + // we don't have a docblock, create an empty one to get rid of errors + $this->last = new parserDocblock(); + } +// $this->last->setLineNumber($data->getLineNumber()); + if ($this->last->getKeyword('ignore')) + { + addWarning(PDERROR_IGNORE_TAG_IGNORED,'global variable - just don\'t document the',$data->getName()); + $this->last = false; + return; + } + $this->last->overridePackage($this->category,$this->package,$this->subpackage,$data->getName(),'global'); + $data->setDocBlock($this->last); + if ($data->docblock->getKeyword('name')) + { + $a = $data->docblock->getKeyword('name'); + if (is_object($a)) $a = $a->value; + $data->setName($a); + } + $this->proceduralpages->addGlobal($data); + $this->last = false; + } + + /** + * handles post-parsing of Package-level documentation pages. + * + * sets the {@link $package_pages}[$data->package] to $data + * @param integer $event Event number from {@link Parser.inc} + * @param parserPackagePage $data + */ + function handlePackagePage($event,$data) + { + $this->package_pages[$data->package] = &$data; + $this->last = false; + } + + /** + * handle post-parsing of Tutorials. + * + * This adds the parsed tutorial to the tutorial tree + * @uses $tutorials sets the value of tutorials to parameter $data + * @param integer $event Event Number + * @param parserTutorial $data + * @since 1.2 + */ + function handleTutorial($event,$data) + { + if (isset($this->packagecategories[$data->package])) + { + $data->category = $this->packagecategories[$data->package]; + } else + { + $data->category = $GLOBALS['phpDocumentor_DefaultCategoryName']; + } + $this->tutorials[$data->package][$data->subpackage][$data->tutorial_type][$data->name] = $data; + } + + /** + * handles post-parsing of class vars + * + * This function sets up a @var tag if none is found, and aligns $data's + * $path var and packages to match the parent object + * @param integer $event Event number from {@link Parser.inc} + * @param parserVar $data + */ + function handleVar($event,$data) + { + global $_phpDocumentor_setting; + if ($this->private_class) + { + unset($this->last); + return; + } + if (empty($this->last)) + { + if (isset($this->db_template)) + { + // use the docblock template + $this->last = phpDocumentor_clone($this->db_template); + } else { + // we don't have a docblock, create an empty one to get rid of errors + $this->last = new parserDocblock(); + } + } +// $this->last->setLineNumber($data->getLineNumber()); + $this->last->overridePackage($this->category,$this->package,$this->subpackage,$data->getName(),'var'); + $this->last->updateModifiers($data->getModifiers()); + + if ($this->last->getKeyword('ignore')) + { + $this->last = false; + return; +// addWarning(PDERROR_IGNORE_TAG_IGNORED,'var',$this->cur_class.'::'.$data->getName()); + } + if (!$this->last->var) + { + $this->last->addVar('mixed',new parserStringWithInlineTags); + } + + if ($_phpDocumentor_setting['pear']) + { + if (strpos($data->getName(), '_') == 1 && !$this->last->getKeyword('access')) + { + addWarning(PDERROR_PRIVATE_ASSUMED,'class variable',$data->class.'::'.$data->getName()); + $this->last->addKeyword('access','private'); + $data->setDocBlock($this->last); + } + } + $data->setDocBlock($this->last); + $data->path = $this->data->parent->path; + $this->classes->addVar($data); + $this->last = false; + } + + /** + * handles post-parsing of class constants + * + * This function aligns $data's + * $path var and packages to match the parent object + * @param integer $event Event number from {@link Parser.inc} + * @param parserVar $data + */ + function handleConst($event,$data) + { + global $_phpDocumentor_setting; + if ($this->private_class) + { + unset($this->last); + return; + } + if (empty($this->last)) + { + if (isset($this->db_template)) + // use the docblock template + $this->last = phpDocumentor_clone($this->db_template); + else + // we don't have a docblock, create an empty one to get rid of errors + $this->last = new parserDocblock(); + } +// $this->last->setLineNumber($data->getLineNumber()); + $this->last->overridePackage($this->category,$this->package,$this->subpackage,$data->getName(),'const'); + + if ($this->last->getKeyword('ignore')) + { + $this->last = false; + return; +// addWarning(PDERROR_IGNORE_TAG_IGNORED,'var',$this->cur_class.'::'.$data->getName()); + } + $data->setDocBlock($this->last); + $data->path = $this->data->parent->path; + $this->classes->addConst($data); + $this->last = false; + } + + /** + * handles post-parsing of class methods + * + * This function first aligns $data's path and package to match the parent + * object, and also aligns the docblock's @param, @global, and @staticvar + * tags with the information parsed from the method source code. It also + * checks to see if the method is a constructor and sets the $isConstructor + * flag. If source code has been parsed by a {@}source} tag, the source is + * added to its docblock + * + * Finally, it adds the method to the {@link Classes} class. + * @param integer $event Event number from {@link Parser.inc} + * @param parserMethod $data + */ + function handleMethod($event,$data) + { + global $_phpDocumentor_setting; + if ($this->private_class) + { + unset($this->last); + return; + } + + if (empty($this->last)) + { + if (isset($this->db_template)) + // use the docblock template + $this->last = phpDocumentor_clone($this->db_template); + else + // we don't have a docblock, create an empty one to get rid of errors + $this->last = new parserDocblock(); + } +// $this->last->setLineNumber($data->getLineNumber()); + if ($this->last->getKeyword('ignore')) + { + $this->last = false; + return; +// addWarning(PDERROR_IGNORE_TAG_IGNORED,'method',$this->cur_class.'::'.$data->getName()); + } + $this->last->overridePackage($this->category,$this->package,$this->subpackage,$data->getName(),'method'); + if ($data->hasSource()) + { + $this->last->setSource($data->getSource(), $data->getClass()); + } + foreach($data->listParams() as $param) + { + $update_params[] = $param[0]; + } + foreach($data->listGlobals() as $param) + { + $update_globals[] = $param[1]; + } + foreach($data->listStatics() as $param) + { + $update_statics[] = $param[0]; + } + if (isset($update_params)) + $this->last->updateParams($update_params); + if (isset($update_globals)) + $this->last->updateGlobals($update_globals); + if (isset($update_statics)) + $this->last->updateStatics($update_statics); + $this->last->updateModifiers($data->getModifiers()); + unset($update_params); + unset($update_globals); + unset($update_statics); + + if ($data->getName() == $this->cur_class) $data->setConstructor(); + if ($data->getName() == '__construct') { + $data->setConstructor(); + } + if ($data->getName() == '__destruct') { + $data->setDestructor(); + } + + if ($_phpDocumentor_setting['pear']) + { + if (strpos($data->getName(), '_') === 0 && substr($data->getName(), 1) == $data->class) + { // is destructor + $data->setDestructor(); + } elseif (strpos($data->getName(), '_') === 0 && !$this->last->getKeyword('access')) + { + if (strpos($data->getName(), '__') !== 0) { + addWarning(PDERROR_PRIVATE_ASSUMED,'method',$data->class.'::'.$data->getName().'()'); + $this->last->addKeyword('access','private'); + $data->setDocBlock($this->last); + } + } + } + $data->setDocBlock($this->last); + $data->path = $this->data->parent->path; + $this->classes->addMethod($data); + $this->last = false; + } + + /** + * handles post-parsing of functions + * + * This function sets {@link $data}->clean to false to tell the + * phpDocumentor_IntermediateParser that a page-level DocBlock can't be + * found after this point on this page. It then sets the package to be the + * same as the page, aligns the docblock's @param, @global, and @staticvar + * tags with the information parsed from the function source code. + * + * If source code has been parsed by a {@}source} tag, the source is added + * to its docblock, and then the parserFunction adds itself to the + * {@link ProceduralPages} class + * @param integer $event Event number from {@link Parser.inc} + * @param parserFunction $data + */ + function handleFunction($event,$data) + { + if ($this->_lastDocBlockWasPageLevel) + { + addWarning(PDERROR_DOCBLOCK_CONFLICT, 'function', $data->getName()); + if (!$this->_oldPageLevel) + { + unset($this->last); + } + } + $this->_lastDocBlockWasPageLevel = + $this->data->clean = false; + if ($this->private_page) + { + unset($this->last); + return; + } + + if (empty($this->last)) + { + if (isset($this->db_template)) + // use the docblock template + $this->last = phpDocumentor_clone($this->db_template); + else + // we don't have a docblock, create an empty one to get rid of errors + $this->last = new parserDocblock(); + } +// $this->last->setLineNumber($data->getLineNumber()); + if ($this->last->getKeyword('ignore')) + { + unset($this->last); + return; + } + $this->last->overridePackage($this->category,$this->package,$this->subpackage,$data->getName(),'function'); + + foreach($data->listParams() as $param) + { + $update_params[] = $param[0]; + } + foreach($data->listGlobals() as $param) + { + $update_globals[] = $param[1]; + } + foreach($data->listStatics() as $param) + { + $update_statics[] = $param[0]; + } + if (isset($update_params)) + $this->last->updateParams($update_params); + if (isset($update_globals)) + $this->last->updateGlobals($update_globals); + if (isset($update_statics)) + $this->last->updateStatics($update_statics); + unset($update_params); + unset($update_globals); + unset($update_statics); + + if ($data->hasSource()) + { + $this->last->setSource($data->getSource()); + } + if (count($this->last->params) == 1 && !count($data->listParams())) + { + // if the function has no parameters, and 1 @param, add it to the list as optional, default value is description from @param + $pars = $this->last->listParams(); + $data->addParam($pars[0]['var'],$pars[0]['data']->getString()); + } + $data->setDocBlock($this->last); + $this->proceduralpages->addFunction($data); + $this->last = false; + } + + /** + * handles post-parsing of defines + * + * This function sets {@link $data}->clean to false to tell the + * phpDocumentor_IntermediateParser that a page-level DocBlock can't be + * found after this point on this page. It then sets the package to be the + * same as the page and adds itself to the {@link ProceduralPages} class + * @param integer $event Event number from {@link Parser.inc} + * @param parserDefine $data + */ + function handleDefine($event,$data) + { + if ($this->_lastDocBlockWasPageLevel) + { + addWarning(PDERROR_DOCBLOCK_CONFLICT, 'define', $data->getName()); + if (!$this->_oldPageLevel) + { + unset($this->last); + } + } + $this->_lastDocBlockWasPageLevel = + $this->data->clean = false; + if ($this->private_page) + { + unset($this->last); + return; + } + if (empty($this->last)) + { + if (isset($this->db_template)) + // use the docblock template + $this->last = phpDocumentor_clone($this->db_template); + else + // we don't have a docblock, create an empty one to get rid of errors + $this->last = new parserDocblock(); + } +// $this->last->setLineNumber($data->getLineNumber()); + if ($this->last->getKeyword('ignore')) + { + unset($this->last); + return; + } + + $this->last->overridePackage($this->category,$this->package,$this->subpackage,$data->getName(),'define'); + $data->setDocBlock($this->last); + $this->proceduralpages->addDefine($data); + $this->last = false; + } + + /** + * handles post-parsing of classes + * + * This function sets {@link $data}->clean to false to tell the + * phpDocumentor_IntermediateParser that a page-level DocBlock can't be + * found after this point on this page. It sets {@link $cur_class} to its + * name, and if an @ignore tag is found in the DocBlock, it sets + * {@link $private_class} to true, to prevent post-parsing of any of the + * class's vars or methods. Then it checks for the existence of a package + * page for the class's package + * @param integer $event Event number from {@link Parser.inc} + * @param parserClass $data + */ + function handleClass($event,$data) + { + global $_phpDocumentor_setting; + if ($this->_lastDocBlockWasPageLevel) + { + if (!$this->_oldPageLevel) + { + addWarning(PDERROR_DOCBLOCK_GOES_CLASS, $data->getName()); + $doc = new parserDocBlock; + $doc->category = $this->category; + $doc->package = $this->package; + $doc->subpackage = $this->subpackage; + if ($_phpDocumentor_setting['sourcecode']) { + $doc->canSource(); + $doc->addFileSource($this->data->parent->path, $this->data->parent->source); + } + $this->data->setDocBlock($doc); + unset($doc); + $this->last->cantSource(); + } + } + $this->_lastDocBlockWasPageLevel = + $this->data->clean = false; + if (empty($this->last)) + { + if (isset($this->db_template)) + // use the docblock template + $this->last = phpDocumentor_clone($this->db_template); + else + // we don't have a docblock, create an empty one to get rid of errors + $this->last = new parserDocblock(); + list($this->last->package, $this->last->subpackage) = $this->_guessPackage($this->data->parent->path, $this->data->parent->getSourceLocation('dummy')); + addWarning(PDERROR_NO_PACKAGE_TAG,'class',$data->getName(),$this->last->package); + } else + { + if (!$this->last->getExplicitPackage()) + { + list($this->last->package, $this->last->subpackage) = $this->_guessPackage($this->data->parent->path, $this->data->parent->getSourceLocation('dummy')); + addWarning(PDERROR_NO_PACKAGE_TAG,'class',$data->getName(),$this->last->package); + } else + { + if (isset($this->packagecategories[$this->package]) + && $this->packagecategories[$this->package] != $this->category) + addWarning(PDERROR_PACKAGECAT_SET,$this->package, + $this->packagecategories[$this->package], + $this->category); + $this->packagecategories[$this->package] = $this->category; + } + } + $this->last->updateModifiers($data->getModifiers()); +// $this->last->setLineNumber($data->getLineNumber()); + $data->setDocBlock($this->last); + $this->cur_class = $name = $data->getName(); + if ($this->last->getKeyword('ignore')) + { + $this->private_class = true; + unset($this->last); + return; + } + $data->path = $this->data->parent->path; + $this->classes->addClass($data); + $this->private_class = false; + if ($this->last->package) + { + $this->parsePackagePage($this->last->package, $this->data->parent->getPath()); + } + $this->last = false; + } + + /** + * handles post-parsing of procedural pages + * + * this event is called at the start of a new page, before the Parser knows + * whether the page will contain any procedural pages or not + * @param integer $event Event number from {@link Parser.inc} + * @param parserPage $data + */ + function handlePage($event,$data) + { + $type = 'page'; + $this->private_page = false; + $this->data = new parserData; + $data->category = $this->category = $GLOBALS['phpDocumentor_DefaultCategoryName']; + $this->package = $GLOBALS['phpDocumentor_DefaultPackageName']; + $this->subpackage = ''; + $this->proceduralpages->addPage($data); + $this->data->setParent($data); + $this->pages[$data->getPath()] = $this->data; + $this->classes->nextFile($data->getPath()); + $this->packageoutput = $data->getPackageOutput(); + } + + /** + * handles post-parsing of DocBlocks + * + * This function sets {@link $last} to the DocBlock represented by $data, to + * allow the next documentable element passed to + * phpDocumentor_IntermediateParser to link the DocBlock into its $docblock + * property. This function also checks for two special cases of DocBlocks: + *
              + *
            1. First DocBlock in the file contains a @package tag
            2. + *
            3. First DocBlock in the file is immediately followed by another + * DocBlock
            4. + *
            + * In both cases, the function extracts this tag and uses it as the + * page-level package. If the @package tag is in the DocBlock of an + * element (function, global variable, whatever) that isn't a page-level + * DocBlock, a warning will be raised to notify the author that a @package + * tag belongs in a page-level DocBlock. + * + * New in version 1.2.2, if the first DocBlock in a file contains + * a @package tag, it is a page-level DocBlock. + * + * If the DocBlock is page-level, it is processed with + * {@link _processPageLevelDocBlock} + * + * Finally, the function replaces the old parserPage in + * {@link parserData::$data}->parent with the new one containing information + * from the DocBlock by calling {@link addPage()}, and checks for + * package-level docs. + * @param integer $event Event number from {@link Parser.inc} + * @param parserDocBlock $data + */ + function handleDocBlock($event,$data) + { + $type = 'docblock'; + $data->postProcess(); + // Zend desc support + if ($tdesc = $data->getKeyword('desc')) + { + $data->setShortDesc($tdesc); + unset($data->tags['desc']); + } + $this->_lastDocBlockWasPageLevel = false; + // 1st docblock in file, check for @package + if ($this->data->isClean() && !isset($this->last)) + { + if ($data->getExplicitPackage()) + { + // new with 1.2.2: + // if the first docblock in a file + // contains a @package tag, then it is + // a page-level docblock + $this->_processPageLevelDocBlock($data); + $this->_lastDocBlockWasPageLevel = true; + $this->all_packages[$data->package] = 1; + $this->last = $data; + return; + } + $doc = new parserDocBlock; + $doc->category = $this->category; + $doc->package = $this->package; + $doc->subpackage = $this->subpackage; + $this->data->setDocBlock($doc); + $this->proceduralpages->addPagePackage($this->data->parent->getPath(),$this->package,$this->subpackage); + unset($doc); + } + // 2nd docblock in a row, and it's at the top of the file, page-level docblock + if ($this->lasttype == "docblock" && $this->data->isClean()) + { + $this->_processPageLevelDocBlock($this->last); + $this->_oldPageLevel = true; + $this->_lastDocBlockWasPageLevel = false; + } + $this->all_packages[$data->package] = 1; + $this->last = $data; + } + + /** + * Process a Page-level DocBlock + * + * First, it checks for an @ignore tag, + * and if found, calls {@link ProceduralPages::ignorePage()}. An @ignore + * tag in a page-level DocBlock will ignore all functions, defines, global + * variables, and includes. It will not ignore classes! The function next + * checks for an @access private, and if --parseprivate is off, performs the + * same actions as @ignore, raising a warning for the unsuspecting user. + * Next, it checks for the @name tag, which is used to rename the page. + * This is also a PEAR compatibility issue, and may not be very useful in + * the long run. Documentation is best when it refers to real entities in + * the package, and not to aliases. + * @access private + */ + function _processPageLevelDocBlock($data) + { + global $_phpDocumentor_setting; + // can only have 1 package-level docblock, others are ignored + if (!$this->data->isClean()) + { + return; + } + $this->data->clean = false; + $this->data->explicitDocBlock(); + $data->canSource(); + if ($_phpDocumentor_setting['sourcecode']) + { + $data->addFileSource($this->data->parent->path, $this->data->parent->source); + } + if (!$data->getExplicitPackage()) + { + list($data->package,$data->subpackage) = $this->_guessPackage($this->data->parent->getPath(), $this->data->parent->getSourceLocation('dummy')); + addWarning(PDERROR_NO_PACKAGE_TAG,'file',$this->data->parent->getPath(),$this->last->package); + } + if (isset($this->packagecategories[$this->package]) + && $this->packagecategories[$this->package] != $this->category) + addWarning(PDERROR_PACKAGECAT_SET,$this->package, + $this->packagecategories[$this->package], + $data->category); + $this->packagecategories[$this->package] = $data->category; + $this->category = $this->data->parent->category = $data->category; + $this->packagecategories[$this->package] = $this->category; + $this->subpackage = $this->data->parent->subpackage = $data->subpackage; + if ($data->getKeyword('ignore')) + { + $this->proceduralpages->ignorePage($this->data->parent); + $this->private_page = true; + unset($this->last); + $this->privatepages[$this->data->parent->getPath()] = $this->data; + unset($this->pages[$this->data->parent->getPath()]); + return; + } + $this->data->setDocBlock($data); + $this->package = $this->data->parent->package = $data->package; + $this->subpackage = $this->data->parent->subpackage = $data->subpackage; + $this->proceduralpages->addPagePackage($this->data->parent->getPath(),$this->package,$this->subpackage); + if ($access = $data->getKeyword('access')) + { + if (is_object($access) && ($access->getString() == 'private') && (!$this->parsePrivate)) + { + addWarning(PDERROR_PARSEPRIVATE, $this->data->parent->getPath()); + $this->proceduralpages->ignorePage($this->data->parent); + $this->private_page = true; + unset($this->last); + $this->privatepages[$this->data->parent->getPath()] = $this->data; + unset($this->pages[$this->data->parent->getPath()]); + return; + } + } + if ($data->getKeyword('name')) + { + $a = $data->getKeyword('name'); + if (is_object($a)) $a = $a->value; + $this->data->parent->setFile($a); + $this->proceduralpages->setName($a); + } + $this->addPage($this->data->parent, $this->data->parent->getPath()); + if ($this->package) + { + $this->parsePackagePage($this->package, $this->data->parent->getPath()); + } + } + + /** + * Backward-compatibility only, use the new tutorials for more power + * @tutorial tutorials.pkg + * @param string package name of package file to parse + * @param string directory of file that contains package name + */ + function parsePackagePage($package, $path) + { + if (!isset($this->package_pages[$package])) + { + if (file_exists(dirname($path) . SMART_PATH_DELIMITER . $package . '.html')) + { + if ($this->quietMode === false) + { + phpDocumentor_out("Reading package-level file ".$package . '.html'); + flush(); + } + $fp = fopen(dirname($path) . SMART_PATH_DELIMITER . $package . '.html',"r"); + $ret = fread($fp,filesize(dirname($path) . SMART_PATH_DELIMITER . $package . '.html')); + fclose($fp); + unset($fp); + if ($this->quietMode === false) + { + phpDocumentor_out(" -- Parsing File\n"); + flush(); + } + $pageParser = new ppageParser; + $tempp = $this->package; + $lp = $this->last; + $pageParser->subscribe('*',$this); + $pageParser->parse($ret,false,$package); + $this->package = $tempp; + $this->last = $lp; + unset($tempp); + unset($pageParser); + } + } + } + + /** + * called via {@link Parser::parse()} and Parser's inherited method + * {@link Publisher::publishEvent()} + * + * $event is one of the PHPDOC constants from Parser.inc. If it is not + * PHPDOCUMENTOR_EVENT_NEWSTATE, then a function name is retrieved from the + * {@link $event_handlers} array and called to handle the $data + * @param integer $event event number from {@link Parser.inc} + * @param mixed $data if $event is {@link PHPDOCUMENTOR_EVENT_NEWSTATE}, $data is a {@link PHP_DOC_EVENT_END_PAGE} or {@link STATE_END_CLASS}, + * otherwise $data is either a {@link parserDocBlock}, {@link parserPage} or descendant of {@link parserElement} + * @global array we use 'sourcecode' to determine whether to highlight the source + * of the current file if it has no file-level docblock + */ + function HandleEvent($event,$data) + { + global $_phpDocumentor_setting; + global $phpDocumentor_DefaultPackageName, $phpDocumentor_DefaultCategoryName; + if (empty($this->packagecategories)) + $this->packagecategories[$phpDocumentor_DefaultPackageName] = $phpDocumentor_DefaultCategoryName; + if ($event == PHPDOCUMENTOR_EVENT_NEWSTATE) + { + if ($data == STATE_END_CLASS) + { + } elseif ($data == PHPDOCUMENTOR_EVENT_END_PAGE) + { + if (!$this->private_page) + { + $this->all_packages[$this->package] = 1; + if (!$this->data->hasExplicitDocBlock()) + { + $doc = $this->data->docblock; + if (!$this->data->docblock) + { + $doc = new parserDocBlock; + } + if ($_phpDocumentor_setting['sourcecode']) + { + $doc->canSource(); + $doc->addFileSource($this->data->parent->path, $this->data->parent->source); + } + list($doc->package,$doc->subpackage) = $this->_guessPackage($this->data->parent->getPath(), $this->data->parent->getSourceLocation('dummy')); + addWarning(PDERROR_NO_PAGE_LEVELDOCBLOCK,$this->data->parent->getPath()); + $this->data->setDocBlock($doc); + $this->proceduralpages->addPage($this->data->parent,$doc->package,$doc->subpackage); + } + $this->pages[$this->data->parent->getPath()] = $this->data; + } + $this->private_page = false; + $this->private_class = false; + if (isset($this->db_template)) + { + addWarning(PDERROR_DB_TEMPLATE_UNTERMINATED); + } + unset($this->db_template); + unset($this->last); + } elseif ($data == PHPDOCUMENTOR_EVENT_END_DOCBLOCK_TEMPLATE) + { + unset($this->db_template); + } + //echo $this->state_lookup[$data] . "\n"; + //echo $data."\n"; + } + else + { + if ($event == PHPDOCUMENTOR_EVENT_README_INSTALL_CHANGELOG) + { + $this->ric[$data[0]] = $data[1]; + return; + } + if ($event == PHPDOCUMENTOR_EVENT_DOCBLOCK_TEMPLATE) + { + $data->postProcess(); + $this->db_template = $data; + $this->_lastDocBlockWasPageLevel = false; + // 2nd docblock in a row, and it's at the top of the file, page-level docblock + if ($this->type == "docblock" && $this->data->isClean()) + { + // can only have 1 package-level docblock, others are ignored + $this->data->clean = false; + if ($this->last->getKeyword('ignore')) + { + $this->proceduralpages->ignorePage($this->data->parent); + $this->private_page = true; + unset($this->last); + $this->privatepages[$this->data->parent->getPath()] = $this->data; + unset($this->pages[$this->data->parent->getPath()]); + return; + } + $this->data->setDocBlock($this->last); + $this->package = $this->data->parent->package = $this->last->package; + $this->subpackage = $this->data->parent->subpackage = $this->last->subpackage; + $this->proceduralpages->addPagePackage($this->data->parent->getPath(),$this->package,$this->subpackage); + if ($access = $this->last->getKeyword('access')) + { + if (is_object($access) && ($access->getString() == 'private') && (!$this->parsePrivate)) + { + addWarning(PDERROR_PARSEPRIVATE, $this->data->parent->getPath()); + $this->proceduralpages->ignorePage($this->data->parent); + $this->private_page = true; + unset($this->last); + $this->privatepages[$this->data->parent->getPath()] = $this->data; + unset($this->pages[$this->data->parent->getPath()]); + return; + } + } + if ($this->last->getKeyword('name')) + { + $a = $this->last->getKeyword('name'); + if (is_object($a)) $a = $a->value; + $this->data->parent->setFile($a); + $this->proceduralpages->setName($a); + } + $this->addPage($this->data->parent, $this->data->parent->getPath()); + if ($this->package) + { + $this->parsePackagePage($this->package, $this->data->parent->getPath()); + } + } + unset($this->last); + } else + { + $this->lasttype = $this->type; + $type = $data->getType(); +// fancy_debug($type,$data); + if (($type != 'page') && ($type != 'docblock') && ($type != 'packagepage') && ($type != 'tutorial')) + { + $data->setFile($this->data->parent->getFile()); + } + $this->type = $type; + //echo $type . "\n"; + + if (isset($this->event_handlers[$type])) + { + $handle = $this->event_handlers[$type]; + $this->$handle($event,$data); + } + } + } + } + + /** + * Replaces the {@link parserPage} represented by $this->pages[$path] with + * $page + * + * Called by {@link addPageIfNecessary(), handleDocBlock()} and + * {@link ProceduralPages::setupPages()}, this method first checks to see if + * the page has been added. If not, it assumes that the page has either + * been @ignored or set with @access private with --parseprivate off, and + * returns {@link addPrivatePage()}. Otherwise, it sets the pages[$path] to + * be the parserPage $page and sets the package and subpackage to that of + * $page + * @see $pages + * @param parserPage + * @param string full path to the file + */ + function addPage($page, $path) + { + if (!isset($this->pages[$path])) return $this->addPrivatePage($page, $path); + $this->pages[$path]->setParent($page); + if ($page->package != $GLOBALS['phpDocumentor_DefaultPackageName']) + { + if (!$this->pages[$path]->docblock) + { + $docblock = new parserDocBlock; + $docblock->package = $page->package; + $docblock->subpackage = $page->subpackage; + $this->pages[$path]->docblock = $docblock; + } else + { + $this->pages[$path]->docblock->package = $page->package; + $this->pages[$path]->docblock->subpackage = $page->subpackage; + } + } + } + + /** + * add a new {@link parserPage} to the $pages array if none is found + * + * This method is used when a page has been @ignored or marked with @access + * private, and a public class is in the page (a class with no @access + * private in its DocBlock). The method first creates a new page in the + * {@link $pages} array and then copies path information, and calls + * {@link addPage()} to set up packages + * @param string full path of page + */ + function addPageIfNecessary($path, &$class) + { + global $_phpDocumentor_setting; + if (!$this->parsePrivate) + { + if (!isset($this->pages[$path])) + { + $this->pages[$path] = new parserData; + $this->pages[$path]->docblock = new parserDocBlock; + $this->pages[$path]->docblock->package = $this->privatepages[$path]->docblock->package; + $this->pages[$path]->docblock->subpackage = $this->privatepages[$path]->docblock->subpackage; + $par = $this->privatepages[$path]->parent; + $this->pages[$path]->setParent($par); + $this->proceduralpages->addPage($par); + } + } + if (isset($_phpDocumentor_setting['packageoutput'])) + $packages = explode(',',$_phpDocumentor_setting['packageoutput']); + if (isset($_phpDocumentor_setting['packageoutput']) && + $this->pages[$path]->parent->package != $class->docblock->package && + !in_array($this->pages[$path]->parent->package,$packages)) + { + $this->pages[$path]->parent->package = $class->docblock->package; + $this->addPage($this->pages[$path]->parent, $path); + $this->proceduralpages->addPage($this->pages[$path]->parent); + } + } + + /** + * Adds a {@link parserPage} element to the {@link parserData} element in + * $this->privatepages[$path] + * + * Performs a similar function to addPage, but adds to the + * {@link $privatePages} array + * @param parserPage $page + * @param string $path full path to the page + * @see addPage() + */ + function addPrivatePage($page, $path) + { + $this->privatepages[$path]->setParent($page); + if ($page->package != $GLOBALS['phpDocumentor_DefaultPackageName']) + { + if (!$this->privatepages[$path]->docblock) + { + $docblock = new parserDocBlock; + $docblock->package = $page->package; + $docblock->subpackage = $page->subpackage; + $this->privatepages[$path]->docblock = $docblock; + } else + { + $this->privatepages[$path]->docblock->package = $page->package; + $this->privatepages[$path]->docblock->subpackage = $page->subpackage; + } + } + } + + /** + * adds a processed descendant of {@link parserElement} to the {@link $pages} + * array or {@link $privatepages} array + * + * This function expects the page to exist in either $pages or $privatepages. It calls the + * {@link parserData::addElement()} method to add $element to the page. + * @param parserElement $element this will actually be a descendant of parserElement + * @param string $path + */ + function addElementToPage($element, $path) + { + if (isset($this->privatepages[$path])) + { + if (isset($this->pages[$path])) + { + if ($element->type == 'class' || $element->type == 'method' + || $element->type == 'var' || $element->type == 'const') + { + $this->pages[$path]->addElement($element); + } else + $this->privatepages[$path]->addElement($element); + } else + $this->privatepages[$path]->addElement($element); + } else + { + if (isset($this->pages[$path])) + { + $this->pages[$path]->addElement($element); + } + } + } + + /** + * Add all the @uses tags from $element to the $uses array so that @usedby + * virtual tags can be added + * @uses parserUsesTag::getSeeElement() used to initialize {@link $uses} + * @uses parserUsesTag::getDescription() used to initialize {@link $uses} + * @param parserElement descendant of parserElement + * @param string full path to the file + */ + function addUses($element, $path) + { + if ($element->type == 'page') + { + $element = $this->pages[$element->path]; + } + if (!$this->parsePrivate && $element->docblock->hasaccess) + { + $a = $element->docblock->getKeyword('access'); + if (is_object($a) && $a->getString() == 'private') return; + } + if (isset($this->privatepages[$path])) + { + if (isset($this->pages[$path])) + { +// if ($element->type == 'function' || $element->type == 'method') + { + $uses = $element->docblock->getKeyword('uses'); + if ($uses) + { + if (!is_array($uses)) $uses = array($uses); + foreach($uses as $use) + { + if (!is_object($use)) continue; + $el = $use->getSeeElement(); + $description = $use->getDescription(); + $this->uses[$el][] = array($element, $description); + } + } + } + } + } else + { + if (isset($this->pages[$path])) + { +// if ($element->type == 'function' || $element->type == 'method') + { + $uses = $element->docblock->getKeyword('uses'); + if ($uses) + { + if (!is_array($uses)) $uses = array($uses); + foreach($uses as $use) + { + if (!is_object($use)) continue; + $el = $use->getSeeElement(); + $description = $use->getDescription(); + $this->uses[$el][] = array($element, $description); + } + } + } + } + } + } + + /** + * Add a {@link parserUsedByTag} link to every element referred to by @uses + * @param Converter temporary converter used to retrieve abstract links + * @uses phpDocumentor_IntermediateParser::addUses() indirectly, as + * addUses() sets up $uses, which is iterated over here + * @uses $pages sets up all @usedby tags from here + * @access private + */ + function _setupUsesList(&$converter) + { + ob_start(); + $converter->_createPkgElements($this->pages); + ob_end_clean(); + foreach($this->uses as $link => $elements) + { + foreach($elements as $element) + { + if ($element[0]->type == 'method' || $element[0]->type == 'var' || + $element[0]->type == 'const') + { + $converter->class = $element[0]->getClass(); + } + if ($element[0]->type == 'class') + { + $converter->class = $element[0]->getName(); + } + $reallink = $converter->getLink($link,$element[0]->docblock->package); + if (is_object($reallink)) + { + // add a used by tag to the docblock of the destination + switch(phpDocumentor_get_class($reallink)) + { + case 'pagelink' : + case 'functionlink' : + case 'definelink' : + case 'globallink' : + if (isset($this->pages[$reallink->path])) + { + for ($i=0;$ipages[$reallink->path]->elements);$i++) + { + if ($this->pages[$reallink->path]->elements[$i]->type == str_replace('link','',phpDocumentor_get_class($reallink)) && $this->pages[$reallink->path]->elements[$i]->getName() == $reallink->name) + { + $this->pages[$reallink->path]->elements[$i]->docblock->addUsedBy($element[0]->getLink($converter,false,true), $element[1]); +// debug('added @usedby to '.str_replace('link','',phpDocumentor_get_class($reallink)).' '.$reallink->name); + } + } + } + break; + case 'classlink' : + case 'methodlink' : + case 'varlink' : + case 'constlink' : + if (isset($this->pages[$reallink->path])) + { + for ($i=0;$ipages[$reallink->path]->classelements);$i++) + { + if ($this->pages[$reallink->path]->classelements[$i]->type == str_replace('link','',phpDocumentor_get_class($reallink)) && $this->pages[$reallink->path]->classelements[$i]->getName() == $reallink->name) + { + $this->pages[$reallink->path]->classelements[$i]->docblock->addUsedBy($element[0]->getLink($converter,false,true), $element[1]); +// debug('added @usedby to '.str_replace('link','',phpDocumentor_get_class($reallink)).' '.$reallink->name); + } + } + } + break; + } + } + } + } + } + + /** + * Interface to the Converter + * + * This function simply passes {@link $pages} and {@link package_pages} to + * the walk() method, and then calls the Output() method. Note that + * Output() is not required to do anything, and in fact doesn't in + * HTMLframesConverter. + * @uses Converter::walk() passes {@link $pages} and {@link $package_pages} + * @uses Converter::Output() + */ + function Convert($title, $converter) + { + $converter->walk($this->pages, $this->package_pages); + $converter->Output($title); + } + + /** + * Clean up classes + * + * {@source} + * @access private + * @uses Classes::Inherit() passes $this + */ + function fixClasses() + { + $this->classes->Inherit($this); + } + + /** + * Clean up Procedural Pages + * {@source} + * @access private + * @uses ProceduralPages::setupPages() passes $this + */ + function fixProcPages() + { + $this->proceduralpages->setupPages($this); + } + + /** + * If the parent class of $class is in a different package, adds it to the + * {@link $package_parents} array + * @param parserClass &$class + */ + function addPackageParent(&$class) + { + if (!is_array($class->parent)) return; + $par = $this->classes->getClass($class->parent[1], $class->parent[0]); + if ($class->docblock->package == $par->docblock->package) return; + $this->package_parents[$class->docblock->package] = $par->docblock->package; + if (!isset($this->package_parents[$par->docblock->package]) || !$this->package_parents[$par->docblock->package]) $this->package_parents[$par->docblock->package] = false; + } + + /** + * Add a converter name to use to the list of converters + * + * Sets up the {@link $converters} array. + * {@internal + * First, the Converter's file is included, and then, if successful, + * the converter classname is tested for existance. If all is good, + * then the templates are added to the list of converters/templates to use}} + * @param string $output output format (HTML, PDF, XML). Must be all caps + * @param string $name Converter name (frames, for example, is the name of + * HTMLframesConverter) + * @param string $template template to use, should be a relative path to the + * templates dir (like DOM/default) + */ + function addConverter($output,$name,$template) + { + if (strpos($name,PATH_DELIMITER)) + { + $parent = explode(PATH_DELIMITER,$name); + $parent = $parent[0]; + if ('@VER@' != '@'.'VER@') { + $filename = 'PhpDocumentor/phpDocumentor/Converters' . + PATH_DELIMITER . $output . PATH_DELIMITER . $parent . PATH_DELIMITER . $output . $parent . "Converter" . ".inc"; + if (Io::isIncludeable($filename)) + { + include_once($filename); + } + } else { + $filename = str_replace('\\','/',$GLOBALS['_phpDocumentor_install_dir']) . '/phpDocumentor/Converters' . + PATH_DELIMITER . $output . PATH_DELIMITER . $parent . PATH_DELIMITER . $output . $parent . "Converter" . ".inc"; + if (file_exists($filename) && is_readable($filename)) + { + include_once($filename); + } + } + if (!class_exists($output . $parent . 'Converter')) + { + addError(PDERROR_CONVERTER_NOT_FOUND,"parent Converter ".$output . $parent . "Converter of child Converter ".$output . str_replace(PATH_DELIMITER,'',$name) . "Converter"); + } + } + $filename = str_replace('\\', '/', $GLOBALS['_phpDocumentor_install_dir']) . '/phpDocumentor/Converters' . + PATH_DELIMITER . $output . PATH_DELIMITER . $name . PATH_DELIMITER . $output . + str_replace(PATH_DELIMITER, '', $name) . "Converter" . ".inc"; + if (file_exists($filename) && is_readable($filename)) + { + include_once($filename); + } + if (class_exists($output . str_replace(PATH_DELIMITER,'',$name) . 'Converter')) + { + $this->converters[$output][$output . str_replace(PATH_DELIMITER,'',$name) . "Converter"][] = $template; + } else + { + addError(PDERROR_CONVERTER_NOT_FOUND,$output . str_replace(PATH_DELIMITER,'',$name) . "Converter"); + } + } + + /** + * does a natural case sort on two {@link parserElement} descendants + * + * @param mixed $a + * @param mixed $b + * @return int + * @see generateElementIndex() + */ + function elementCmp ($a, $b) + { + return strnatcasecmp($a->getName(), $b->getName()); + } + + /** + * does a natural case sort on two class elements (either + * {@link parserClass, parserMethod} or {@link parserVar} + * + * @param mixed $a + * @param mixed $b + * @return int + * @see generateElementIndex() + */ + function ClasselementCmp ($a, $b) + { + if (phpDocumentor_get_class($a) == 'parserclass') $atest = $a->name; else $atest = $a->class; + if (phpDocumentor_get_class($b) == 'parserclass') $btest = $b->name; else $btest = $b->class; + + if(($c = strnatcasecmp($atest, $btest)) != 0) return $c; + if (phpDocumentor_get_class($a) != 'parserclass') $atest .= $a->name; + if (phpDocumentor_get_class($b) != 'parserclass') $btest .= $b->name; + if (phpDocumentor_get_class($a) == 'parsermethod' && phpDocumentor_get_class($b) == 'parsermethod') + { + if ($a->isConstructor) return -1; + if ($b->isConstructor) return 1; + if ($a->isDestructor) return -1; + if ($b->isDestructor) return 1; + } + return strnatcasecmp($atest,$btest); + } + + /** + * call this method once parsing has completed. + * + * This method calls the private methods fixClasses and fixProcPages, both + * of which adjust inheritance and package information based on complicated + * post-parsing rules described in {@link ProceduralPages::setupPages()} + * and {@link Classes::Inherit()}. Then, it sorts elements of the $pages + * array and calls Convert for each Converter in the $converters array + * @see $converters + * @see $pages + * @see Convert() + */ + function Output ($title = "Generated Documentation") + { + $GLOBALS['phpDocumentor_errors']->curfile = false; + $this->fixClasses(); + $this->fixProcPages(); +// var_dump($this->uses); +// exit; + phpDocumentor_out("\nSorting page elements..."); + flush(); + uasort($this->pages,'pagesort'); + foreach($this->pages as $i => $page) + { + usort($this->pages[$i]->elements,array($this,'elementCmp')); + usort($this->pages[$i]->classelements,array($this,'ClasselementCmp')); + } + phpDocumentor_out("done\n"); + flush(); + $complicatedout = false; + if (is_array($this->converters)) + { + if (count($this->converters) > 1) + { + $complicatedout = true; + } + phpDocumentor_out("Formatting @uses list..."); + flush(); + $a = new __dummyConverter($this->all_packages, $this->package_parents, $this->classes, $this->proceduralpages, $this->packageoutput, $this->parsePrivate, $this->quietMode, $this->targetDir , '', $this->title); + $this->_setupUsesList($a); + unset($a); + phpDocumentor_out("done\n\n"); + flush(); + foreach($this->converters as $converter => $blah) + { + if (is_array($blah)) + { + if (count($blah) > 1) + { + $complicatedout = true; + } + foreach($blah as $converter => $templates) + { + foreach($templates as $template) + { + $extraout = ''; + if ($complicatedout) + { + $extraout = SMART_PATH_DELIMITER . $converter; + } + if (count($templates) > 1) + { + $extraout .= SMART_PATH_DELIMITER . str_replace(PATH_DELIMITER, SMART_PATH_DELIMITER, substr($template,0,strlen($template) - 1)); + } + $a = new $converter($this->all_packages, $this->package_parents, $this->classes, $this->proceduralpages, $this->packageoutput, $this->parsePrivate, $this->quietMode, $this->targetDir . $extraout, $template, $this->title); + if (isset($this->templateBase)) + { + $a->setTemplateBase($this->templateBase, $template); + } + $a->ric = $this->ric; + $a->packagecategories = $this->packagecategories; + if (isset($this->tutorials)) $a->setTutorials($this->tutorials); + $this->Convert($title, $a); + unset($a); + } + } + } + } + } else + { + addErrorDie(PDERROR_NO_CONVERTERS); + } + } + + /** + * Sets the output directory + * + * @param string $dir the output directory + */ + function setTargetDir($dir) + { + $this->targetDir = $dir; + } + + /** + * Sets the template base directory + * + * @param string $dir the template base directory + * @tutorial phpDocumentor.howto.pkg#using.command-line.templatebase + */ + function setTemplateBase($dir) + { + $this->templateBase = $dir; + } + + /** + * set parsing information output mode (quiet or verbose) + * + * If set to false, no parsing information (parsing /php/file/thisfile.php, + * Converting etc.) will be displayed. + * Useful for cron jobs + * @param bool $quietMode + */ + function setQuietMode($quietMode) + { + $this->quietMode = $quietMode; + } + + /** + * set display of elements marked with @access private + * + * If set to true, elements will be displayed + * @param bool $parse + */ + function setParsePrivate($parse) + { + $this->parsePrivate = $parse; + } +} + +/** @access private */ +function pagesort($a, $b) +{ + return strnatcasecmp($a->parent->file,$b->parent->file); +} +?> diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Io.inc b/buildscripts/PhpDocumentor/phpDocumentor/Io.inc new file mode 100644 index 00000000..0425096d --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Io.inc @@ -0,0 +1,868 @@ + + * @version $Id: Io.inc,v 1.5 2005/11/20 21:20:22 cellog Exp $ + * @package phpDocumentor + */ +/** + * Class to handle file and user io opperations + * + * @author Joshua Eichorn + * @version $Id: Io.inc,v 1.5 2005/11/20 21:20:22 cellog Exp $ + * @package phpDocumentor + */ +class Io +{ + + /** + * Holds all the options that are avaible to the cmd line interface + * and to the different web interfaces + */ + var $phpDocOptions; + /** + * Format: array(array(regexp-ready string to search for whole path, + * regexp-ready string to search for basename of ignore strings),...) + * @var false|array + */ + var $ignore = false; + + /** + * creates an array $this->phpDocOptions and sets program options in it. + * Array is in the format of: + *
            +     * [filename][tag][] = "f";
            +     * [filename][tag][] = "-file";
            +     * [filename][desc] "name of file to parse"
            +     * 
            + */ + function Io() + { + $this->phpDocOptions['filename']['tag'] = array( "-f", "--filename"); + $this->phpDocOptions['filename']['desc'] = "name of file(s) to parse ',' file1,file2. Can contain complete path and * ? wildcards"; + $this->phpDocOptions['filename']['type'] = "path"; + + $this->phpDocOptions['directory']['tag'] = array( "-d", "--directory"); + $this->phpDocOptions['directory']['desc'] = "name of a directory(s) to parse directory1,directory2"; + $this->phpDocOptions['directory']['type'] = "path"; + + $this->phpDocOptions['examplesdir']['tag'] = array( "-ed", "--examplesdir"); + $this->phpDocOptions['examplesdir']['desc'] = "full path of the directory to look for example files from @example tags"; + $this->phpDocOptions['examplesdir']['type'] = "path"; + + $this->phpDocOptions['templatebase']['tag'] = array( "-tb", "--templatebase"); + $this->phpDocOptions['templatebase']['desc'] = "base location of all templates for this parse."; + $this->phpDocOptions['templatebase']['type'] = "path"; + + $this->phpDocOptions['target']['tag'] = array("-t", "--target"); + $this->phpDocOptions['target']['desc'] = "path where to save the generated files"; + $this->phpDocOptions['target']['type'] = "path"; + + $this->phpDocOptions['ignore']['tag'] = array("-i", "--ignore"); + $this->phpDocOptions['ignore']['desc'] = "file(s) that will be ignored, multiple separated by ','. Wildcards * and ? are ok"; + $this->phpDocOptions['ignore']['type'] = "path"; + + $this->phpDocOptions['ignoretags']['tag'] = array("-it", "--ignore-tags"); + $this->phpDocOptions['ignoretags']['desc'] = "tags to ignore for this parse. @package, @subpackage, @access and @ignore may not be ignored."; + $this->phpDocOptions['ignoretags']['type'] = "value"; + + $this->phpDocOptions['hidden']['tag'] = array("-dh", "--hidden"); + $this->phpDocOptions['hidden']['desc'] = "set equal to on (-dh on) to descend into hidden directories (directories starting with '.'), default is off"; + $this->phpDocOptions['hidden']['type'] = "value"; + + $this->phpDocOptions['quiet']['tag'] = array("-q", "--quiet"); + $this->phpDocOptions['quiet']['desc'] = "do not display parsing/conversion messages. Useful for cron jobs on/off default off"; + $this->phpDocOptions['quiet']['type'] = "value"; + + $this->phpDocOptions['title']['tag'] = array("-ti","--title"); + $this->phpDocOptions['title']['desc'] = "title of generated documentation, default is 'Generated Documentation'"; + $this->phpDocOptions['title']['type'] = "value"; + + $this->phpDocOptions['help']['tag'] = array("-h", "--help"); + $this->phpDocOptions['help']['desc'] = " show this help message"; + + $this->phpDocOptions['useconfig']['tag'] = array("-c","--useconfig"); + $this->phpDocOptions['useconfig']['desc'] = "Use a Config file in the users/ subdirectory for all command-line options"; + $this->phpDocOptions['useconfig']['type'] = "value"; + + $this->phpDocOptions['parseprivate']['tag'] = array("-pp","--parseprivate"); + $this->phpDocOptions['parseprivate']['desc'] = "parse @internal and elements marked private with @access. Use on/off, default off"; + $this->phpDocOptions['parseprivate']['type'] = "value"; + + $this->phpDocOptions['packageoutput']['tag'] = array("-po","--packageoutput"); + $this->phpDocOptions['packageoutput']['desc'] = "output documentation only for selected packages. Use a comma-delimited list"; + $this->phpDocOptions['packageoutput']['type'] = "value"; + + $this->phpDocOptions['defaultpackagename']['tag'] = array("-dn","--defaultpackagename"); + $this->phpDocOptions['defaultpackagename']['desc'] = "name to use for the default package. If not specified, uses 'default'"; + $this->phpDocOptions['defaultpackagename']['type'] = "value"; + + $this->phpDocOptions['defaultcategoryname']['tag'] = array("-dc","--defaultcategoryname"); + $this->phpDocOptions['defaultcategoryname']['desc'] = "name to use for the default category. If not specified, uses 'default'"; + $this->phpDocOptions['defaultcategoryname']['type'] = "value"; + + $this->phpDocOptions['output']['tag'] = array("-o","--output"); + $this->phpDocOptions['output']['desc'] = "output information to use separated by ','. Format: output:converter:templatedir like \"HTML:frames:phpedit\""; + $this->phpDocOptions['output']['type'] = "value"; + + $this->phpDocOptions['converterparams']['tag'] = array("-cp","--converterparams"); + $this->phpDocOptions['converterparams']['desc'] = "dynamic parameters for a converter, separate values with commas"; + $this->phpDocOptions['converterparams']['type'] = "value"; + + $this->phpDocOptions['customtags']['tag'] = array("-ct","--customtags"); + $this->phpDocOptions['customtags']['desc'] = "custom tags, will be recognized and put in tags[] instead of unknowntags[]"; + $this->phpDocOptions['customtags']['type'] = "value"; + + $this->phpDocOptions['sourcecode']['tag'] = array("-s","--sourcecode"); + $this->phpDocOptions['sourcecode']['desc'] = "generate highlighted sourcecode for every parsed file (PHP 4.3.0+ only) on/off default off"; + $this->phpDocOptions['sourcecode']['type'] = "value"; + + $this->phpDocOptions['javadocdesc']['tag'] = array("-j","--javadocdesc"); + $this->phpDocOptions['javadocdesc']['desc'] = "JavaDoc-compliant description parsing. Use on/off, default off (more flexibility)"; + $this->phpDocOptions['javadocdesc']['type'] = "value"; + + $this->phpDocOptions['pear']['tag'] = array("-p","--pear"); + $this->phpDocOptions['pear']['desc'] = "Parse a PEAR-style repository (package is directory, _members are @access private) on/off default off"; + $this->phpDocOptions['pear']['type'] = "value"; + + $this->phpDocOptions['readmeinstallchangelog']['tag'] = array("-ric","--readmeinstallchangelog"); + $this->phpDocOptions['readmeinstallchangelog']['desc'] = "Specify custom filenames to parse like README, INSTALL or CHANGELOG files"; + $this->phpDocOptions['readmeinstallchangelog']['type'] = "value"; + + $this->phpDocOptions['general']['message'] ="You can have multiple directories and multiple files, as well as a combination of both options"; + } + + + /** + * create the help message for display on the command-line + * @return string a string containing a help message + */ + function displayHelpMsg() + { + unset($ret); + $ret = "\n"; + foreach($this->phpDocOptions as $data) + { + unset($tag); + $tag = ""; + if (isset($data['tag'])) + { + if (is_array($data['tag'])) { + foreach($data['tag'] as $param) { + $tag .= "$param "; + } + } + $taglen = 34; + $outputwidth = 79; + $tagspace = str_repeat(" ",$taglen); + $tmp = " ".trim($tag).$tagspace; + $tmp = substr($tmp,0,$taglen); + $d = wordwrap(ltrim($data['desc']),($outputwidth-$taglen)); + $dt = explode("\n",$d); + $dt[0] = $tmp .$dt[0]; + for($i=1;$idisplayHelpMsg(); + die(); + } + $setting[$valnext] = $cmd; + foreach( $this->phpDocOptions as $name => $data ) + { + if (!empty($data['tag'])) + { + if (in_array($cmd,$data['tag'])) + { + $valnext = $name; + break; + } + else + { + $valnext = "junk"; + } + } + } + if ($valnext == 'junk' && (strpos(trim($cmd),'-') === 0)) + { + addErrorDie(PDERROR_UNKNOWN_COMMANDLINE,$cmd); + } + } + } else + { + echo "Please use php-cli.exe in windows, or set register_argc_argv On"; + die; + } + /* $setting will always have at least 2 elements + [hidden] => off + [template] => templates/default + */ + if (count($setting) < 3) { + echo $this->displayhelpMsg(); + die(); + } + return $setting; + } + + + /** + * @return array list of files in a directory + * @param string $directory full path to the directory you want the list of + * @param off|on whether to list files that begin with . like .bash_history + */ + function dirList($directory,$hidden = "off") + { + $directory = realpath($directory); + $ret = false; + if (@is_dir($directory)) + { + $ret = array(); + $d = @dir($directory); // thanks to Jason E Sweat (jsweat@users.sourceforge.net) for fix + while($d && ($entry=$d->read()) !== false) { + if (strcmp($entry,".") != 0 && strcmp($entry,"..") != 0) { + if ($hidden == "off") + { + if (substr($entry,0,1) == ".") + { + $getentry = false; + } else { + $getentry = true; + } + + } else { + $getentry = true; + } + + if ($getentry == true) + { + if (is_file($directory . PATH_DELIMITER . $entry)) { + $ret[] = $directory . PATH_DELIMITER . $entry; + } + if (is_dir($directory . PATH_DELIMITER . $entry)) { + $tmp = $this->dirList($directory . PATH_DELIMITER . $entry, $hidden); + if (is_array($tmp)) { + foreach($tmp as $ent) { + $ret[] = $ent; + } + } + } + } + } + } + if ($d) $d->close(); + } else { + die("directory: '$directory' not found\n"); + } + return $ret; + } + + /** + * Retrieve common directory (case-insensitive in windows) + * + * takes the list of files, and returns the subdirectory they share in common, + * so in this list: + * + * + * array( + * "/dir1/dir2/subdir/dir3/filename.ext", + * "/dir1/dir2/subdir/dir4/filename.ext", + * "/dir1/dir2/mydir/dir5/filename.ext"); + * + * + * getBase will return "/dir1/dir2" + * @param array array of strings + */ + function getBase($filelist) + { + $masterPath = false; + foreach($filelist as $path) + { + if (!$masterPath) + { + $masterPath = str_replace('\\','/',dirname($path)); + } else + { + if (dirname($path) != $masterPath) + { + $mp = split(PATH_DELIMITER,$masterPath); + $np = split(PATH_DELIMITER,str_replace('\\','/',dirname($path))); + if (count($np) < count($mp)) + { + $masterPath = join($np, PATH_DELIMITER); + } else + { + $test = false; + $found = false; + for($i=0;$i < count($mp) && $i < count($np);$i++) + { + if (PHPDOCUMENTOR_WINDOWS) + { + if (strtolower($mp[$i]) != strtolower($np[$i])) $found = $i; + } else + { + if ($mp[$i] != $np[$i]) $found = $i; + } + } + if ($found !== false) + { + $mp = array_slice($mp,0,$found); + $masterPath = join($mp,PATH_DELIMITER); + } + } + } + } + } + return $masterPath; + } + + /** + * Retrieve tutorial subdirectories and their contents from the list of + * files to parse + * @param array array of paths (strings) + * @return array array(filelist - tutorials, tutorials) + */ + function getTutorials($filelist) + { + $list = $tutorials = array(); + foreach($filelist as $file) + { + if (strpos($file,'tutorials/') !== false) + { + $tutedir = explode('/',substr($file,strpos($file,'tutorials/'))); + array_shift($tutedir); + if (count($tutedir) <= 3) + { + $res = array(); + // kludge - will need to fix for 2.0 + $res['category'] = $GLOBALS['phpDocumentor_DefaultCategoryName']; + $res['package'] = array_shift($tutedir); + $res['subpackage'] = ''; + if (count($tutedir) > 1) + $res['subpackage'] = array_shift($tutedir); + $f = array_shift($tutedir); + $res['tutename'] = $f; + $f = explode('.',$f); + $res['tutetype'] = array_pop($f); + if ($res['tutetype'] == 'ini') continue; + $res['path'] = $file; + if (@file_exists($file . '.ini')) + { + $res['ini'] = phpDocumentor_parse_ini_file($file . '.ini', true); + } else + { + $res['ini'] = false; + } + $tutorials[] = $res; + } + } else $list[] = $file; + } + return array($list,$tutorials); + } + + /** + * @param string base directory from {@link getBase()} + * @param array file list from {@link dirList()} + * @return array array(filelist - README/INSTALL/CHANGELOG, + * README/INSTALL/CHANGELOG) + */ + function getReadmeInstallChangelog($base,$filelist) + { + $list = $ric = array(); + $names = $GLOBALS['_phpDocumentor_RIC_files']; + foreach($filelist as $file) + { + if ((dirname($file) == $base) && in_array(strtoupper(basename($file)), $names)) + { // be sure to change $this->checkIgnore() if any other files are added here!! + $ric[] = $file; + } else + { + $list[] = $file; + } + } + return array($list,$ric); + } + + function getDirTree($dir, $base_dir, $ignore = array(), $hidden="off") + { + $allfiles = $this->dirList($dir,$hidden); + $struc = array(); + foreach($allfiles as $file) + { + if ($this->checkIgnore(basename($file),dirname($file),$ignore)) continue; + $path = substr(dirname($file),strlen(str_replace('\\','/',realpath($base_dir)))+1); + if (!$path) $path = '/'; + $parts = pathinfo($file); + if (!isset($parts['extension'])) + { + $parts['extension'] = ''; + } + $struc[$path][] = array( + 'file' => $parts['basename'], + 'ext' => $parts['extension'], + 'path' => $file); + } + uksort($struc,'strnatcasecmp'); + foreach($struc as $key => $ind) + { + usort($ind,'Ioinc_sortfiles'); + $struc[$key] = $ind; + $save = $key; + if ($key != '/') + { + $key = explode('/',$key); + while (count($key)) + { + array_pop($key); + if (isset($struc[join('/',$key)])) + { + $struc[join('/',$key)][substr($save,strlen(join('/',$key)) + 1)] = $ind; + unset($struc[$save]); + } + } + } + } + foreach($struc as $key => $ind) + { + if ($key != '/') + { + if (count(explode('/',$key)) == 1) + { + $struc['/'][$key] = $struc[$key]; + unset($struc[$key]); + } + } + } + $tempstruc = $struc; + unset($tempstruc['/']); + $leftover_dirs = array_keys($tempstruc); + $splitdirs = array(); + foreach($leftover_dirs as $dir) + { + $splitdirs[] = explode('/',$dir); + } + $leftover_dirs = array(); + + foreach($splitdirs as $dir) + { + $save = join($dir,'/'); + $struc['/'] = setup_dirs($struc['/'], $dir, $tempstruc[$save]); + unset($struc[$save]); + } + @uksort($struc['/'],'Ioinc_mystrucsort'); + return $struc; + } + + /** + * Reads a file and returns it as a string + * Does basic error checking + * + * file extensions are set in {@link phpdoc.inc} + * + * @global array PHP File extensions, used to validate that $path is a PHP File + * @global array PHP File extensions in a CVS repository, used to validate that $path is a PHP File + * @param string $path + */ + function readPhpFile($path, $quietMode = false) + { + global $_phpDocumentor_cvsphpfile_exts, $_phpDocumentor_phpfile_exts; + // tiberiusblue addition + $cvsExt = $_phpDocumentor_cvsphpfile_exts; + $ext = $_phpDocumentor_phpfile_exts; + if (file_exists($path)) + { + if (is_file($path)) + { + // check extension + $tmp = explode(".",$path); + // tiberiusblue addition + $tmp2 = $tmp; + if (in_array(array_pop($tmp),$ext)) + { + phpDocumentor_out(" -- Parsing file\n"); + flush(); + $fp = fopen($path,"r"); + $ret = fread($fp,filesize($path)); + fclose($fp); + return $ret; + } elseif (in_array(array_pop($tmp2),$cvsExt)) + { + phpDocumentor_out(" CVS file [EXPERIMENTAL]\n"); + flush(); + $fp = fopen($path,"r"); + $ret = fread($fp,filesize($path)); + fclose($fp); + $ret = strstr($ret," + * @param string $file just the file name of the file or directory, + * in the case of directories this is the last dir + * @param string $path the full path + * @param array $ignore + * @return bool true if $path should be ignored, false if it should not + */ + function checkIgnore($file,$path,$ignore,$ignore_no_ext = true) + { + global $_phpDocumentor_RIC_files; + $path = realpath($path); + if (!count($ignore)) return false; + if ($ignore_no_ext && + !in_array(strtoupper($file), $_phpDocumentor_RIC_files)) + { + if (!is_numeric(strpos($file,'.'))) return true; + } + if (!isset($this->ignore) || !$this->ignore) + { + $this->_setupIgnore($ignore); + if (!$this->ignore) + { + return false; + } + } + if (is_array($this->ignore)) + { + foreach($this->ignore as $match) + { + // match is an array if the ignore parameter was a /path/to/pattern + if (is_array($match)) + { + // check to see if the path matches with a path delimiter appended + preg_match('/^' . strtoupper($match[0]).'$/', strtoupper($path) . PATH_DELIMITER,$find); + if (!count($find)) + { + // check to see if it matches without an appended path delimiter + preg_match('/^' . strtoupper($match[0]).'$/', strtoupper($path), $find); + } + if (count($find)) + { + // check to see if the file matches the file portion of the regex string + preg_match('/^' . strtoupper($match[1]).'$/', strtoupper($file), $find); + if (count($find)) + { + return true; + } + } + // check to see if the full path matches the regex + preg_match('/^' . strtoupper($match[0]).'$/', + strtoupper($path . DIRECTORY_SEPARATOR . $file), $find); + if (count($find)) + { + return true; + } + } else + { + // ignore parameter was just a pattern with no path delimiters + // check it against the path + preg_match('/^' . strtoupper($match).'$/', strtoupper($path), $find); + if (count($find)) + { + return true; + } + // check it against the file only + preg_match('/^' . strtoupper($match).'$/', strtoupper($file), $find); + if (count($find)) + { + return true; + } + } + } + } + return false; + } + + /** + * Construct the {@link $ignore} array + * @author Greg Beaver + * @param array strings of files/paths/wildcards to ignore + * @access protected + */ + function _setupIgnore($ignore) + { + $ig = array(); + if (is_array($ignore)) + { + for($i=0; $igetRegExpableSearchString($ignore[$i]); + } else + { + if (basename($ignore[$i]) . PATH_DELIMITER == $ignore[$i]) + $ig[] = $this->getRegExpableSearchString($ignore[$i]); + else + $ig[] = array($this->getRegExpableSearchString($ignore[$i]),$this->getRegExpableSearchString(basename($ignore[$i]))); + } + } + } + if (count($ig)) $this->ignore = $ig; + } else $this->ignore = false; + } + + /** + * Converts $s into a string that can be used with preg_match + * @param string $s string with wildcards ? and * + * @author Greg Beaver + * @return string converts * to .*, ? to ., etc. + */ + function getRegExpableSearchString($s) + { + $y = '\/'; + if (DIRECTORY_SEPARATOR == '\\') + { + $y = '\\\\'; + } + $s = str_replace('/', DIRECTORY_SEPARATOR, $s); + $x = strtr($s, array('?' => '.','*' => '.*','.' => '\\.','\\' => '\\\\','/' => '\\/', + '[' => '\\[',']' => '\\]','-' => '\\-')); + if (strpos($s, DIRECTORY_SEPARATOR) !== false && + strrpos($s, DIRECTORY_SEPARATOR) === strlen($s) - 1) + { + $x = "(?:.*$y$x?.*|$x.*)"; + } + return $x; + } + + /** + * Removes files from the $dir array that do not match the search string in + * $match + * @param array $dir array of filenames (full path) + * @param string $match search string with wildcards + * @author Greg Beaver + * @return string|array listing of every file in a directory that matches + * the search string + */ + function removeNonMatches($dir, $match) + { + $match = $this->getRegExpableSearchString($match); + $nodir = false; + if (!is_array($dir)) + { + $dir = array($dir); + $nodir = true; + } + foreach($dir as $i => $file) + { + preg_match('/^'.$match.'$/',basename($file),$find); + if (!count($find)) unset($dir[$i]); + } + if ($nodir) return $dir[0]; + return $dir; + } + + /** + * Take a filename with wildcards and return all files that match the + * wildcards + * @param string $file a full path from the -f command-line parameter, with + * potential * and ? wildcards. + * @return mixed if $file contains wildcards, returns an array of matching + * files, otherwise returns false + * @author Greg Beaver + */ + function getAllFiles($file) + { + $path = realpath(dirname($file)); + $file = basename($file); + // any wildcards? + if (is_numeric(strpos($file,'?')) || is_numeric(strpos($file,'*'))) + { + $files = $this->dirList($path); + $a = $this->removeNonMatches($files,$file); + return $a; + } + return false; + } +} + +/**#@+ + * Sorting functions for the file list + * @param string + * @param string + */ +function Ioinc_sortfiles($a, $b) +{ + return strnatcasecmp($a['file'],$b['file']); +} + +function Ioinc_mystrucsort($a, $b) +{ + if (is_numeric($a) && is_string($b)) return 1; + if (is_numeric($b) && is_string($a)) return -1; + if (is_numeric($a) && is_numeric($b)) + { + if ($a > $b) return 1; + if ($a < $b) return -1; + if ($a == $b) return 0; + } + return strnatcasecmp($a,$b); +} +/**#@-*/ + +/** + * Recursively add all the subdirectories of $contents to $dir without erasing anything in + * $dir + * @param array + * @param array + * @return array processed $dir + */ +function set_dir($dir,$contents) +{ + while(list($one,$two) = each($contents)) + { + if (isset($dir[$one])) + { + $dir[$one] = set_dir($dir[$one],$contents[$one]); + } else $dir[$one] = $two; + } + return $dir; +} + +/** + * Recursively move contents of $struc into associative array + * + * The contents of $struc have many indexes like 'dir/subdir/subdir2'. + * This function converts them to + * array('dir' => array('subdir' => array('subdir2'))) + * @param array struc is array('dir' => array of files in dir,'dir/subdir' => array of files in dir/subdir,...) + * @param array array form of 'dir/subdir/subdir2' array('dir','subdir','subdir2') + * @return array same as struc but with array('dir' => array(file1,file2,'subdir' => array(file1,...))) + */ +function setup_dirs($struc,$dir,$contents) +{ + if (!count($dir)) + { + foreach($contents as $dir => $files) + { + if (is_string($dir)) + { + if (strpos($dir,'/')) + { + $test = true; + $a = $contents[$dir]; + unset($contents[$dir]); + $b = explode('/',$dir); + $c = array_shift($b); + if (isset($contents[$c])) + { + $contents[$c] = set_dir($contents[$c],setup_dirs(array(),$b,$a)); + } else $contents[$c] = setup_dirs(array(),$b,$a); + } + } + } + return $contents; + } + $me = array_shift($dir); + if (!isset($struc[$me])) $struc[$me] = array(); + $struc[$me] = setup_dirs($struc[$me],$dir,$contents); + return $struc; +} + +if (!function_exists('get_include_path')) { +function get_include_path() +{ + return ini_get('include_path'); +} +} +?> diff --git a/buildscripts/PhpDocumentor/phpDocumentor/LinkClasses.inc b/buildscripts/PhpDocumentor/phpDocumentor/LinkClasses.inc new file mode 100644 index 00000000..d122f0d4 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/LinkClasses.inc @@ -0,0 +1,206 @@ +path = $path; + $this->fileAlias = $fileAlias; + $this->name = $name; + $this->category = $category; + $this->package = $package; + $this->subpackage = $subpackage; + } +} + +/** + * procedural page link + * @package phpDocumentor + * @subpackage Links + */ +class pageLink extends abstractLink +{ + /** @var string */ + var $type = 'page'; +} + +/** + * function link + * @package phpDocumentor + * @subpackage Links + */ +class functionLink extends abstractLink +{ + /** @var string */ + var $type = 'function'; +} + +/** + * define link + * @package phpDocumentor + * @subpackage Links + */ +class defineLink extends abstractLink +{ + /** @var string */ + var $type = 'define'; +} + +/** + * global variable link + * @package phpDocumentor + * @subpackage Links + */ +class globalLink extends abstractLink +{ + /** @var string */ + var $type = 'global'; +} + +/** + * class link + * @package phpDocumentor + * @subpackage Links + */ +class classLink extends abstractLink +{ + /** @var string */ + var $type = 'class'; +} + +/** + * method link + * @package phpDocumentor + * @subpackage Links + */ +class methodLink extends abstractLink +{ + /** @var string */ + var $type = 'method'; + /** @var string */ + var $class = ''; + + /** + * @param string class name + * @param string full path to file containing element + * @param string page name, as configured by {@link Parser::parse} + * @param string element name + * @param string package element is in + * @param string subpackage element is in + */ + function addLink($class, $path ,$fileAlias,$name,$package,$subpackage, $category = false) + { + $this->class = $class; + abstractLink::addLink($path, $fileAlias,$name,$package,$subpackage, $category); + } +} + +/** + * class variable link + * @package phpDocumentor + * @subpackage Links + */ +class varLink extends methodLink +{ + /** @var string */ + var $type = 'var'; +} + +/** + * class constant link + * @package phpDocumentor + * @subpackage Links + */ +class constLink extends methodLink +{ + /** @var string */ + var $type = 'const'; +} + +/** + * tutorial link + * @package phpDocumentor + * @subpackage Links + */ +class tutorialLink extends abstractLink +{ + /**#@+ @var string */ + var $type = 'tutorial'; + var $section = ''; + var $title = false; + /**#@-*/ + + /** + * @param string section/subsection name + * @param string full path to file containing element + * @param string page name, as configured by {@link Parser::parse} + * @param string element name + * @param string package element is in + * @param string subpackage element is in + * @param string title of tutorial + */ + function addLink($section,$path,$name,$package,$subpackage,$title = false, $category = false) + { + $this->section = $section; + $this->title = $title; + parent::addLink($path,'',$name,$package,$subpackage, $category); + } +} +?> \ No newline at end of file diff --git a/buildscripts/PhpDocumentor/phpDocumentor/PackagePageElements.inc b/buildscripts/PhpDocumentor/phpDocumentor/PackagePageElements.inc new file mode 100644 index 00000000..1b71b6b7 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/PackagePageElements.inc @@ -0,0 +1,387 @@ +, + * contains every other tag and all text. + * @tutorial tutorials.pkg + * @package phpDocumentor + * @subpackage Tutorial + */ +/** + * Represents sections. + * + * These sections are interpreted as plain text + * @package phpDocumentor + * @subpackage Tutorial + */ +class parserCData extends parserStringWithInlineTags +{ + /** + * @uses Converter::getCData() convert contents to text + * @param Converter + */ + function Convert(&$c, $postprocess = true) + { + $val = $this->value; + if ($postprocess) + foreach($this->value as $key => $value) + { + if (is_string($value)) $this->value[$key] = $c->getCData($value); + } + $this->cache = false; + $x = parent::Convert($c, false); + $this->value = $val; + return $x; + } +} +/** + * a standard XML DocBook Tag + * + * This class is designed to represent all DocBook tags. It is intelligent + * enough to understand the tag, and also the <refname> tag for + * as title for <refentry> + * @since 1.2 + * @package phpDocumentor + * @subpackage Tutorial + */ +class parserXMLDocBookTag extends parserStringWithInlineTags +{ + /** + * Attributes from the XML tag + * + * Format: array(attrname => attrvalue, attrname => attrvalue,...) + * @var array + */ + var $attributes = array(); + /** + * Name of the tag + * @var string + */ + var $name; + /**#@+ @access private */ + /** @var parserCData */ + var $_cdata; + /** @var parserTag */ + var $_title; + /** @var parserIdLineTag */ + var $_id; + /** + * Set to <refpurpose> in <refsynopsisdiv> + * @var parserTag + */ + var $_description; + /**#@-*/ + /** + * @param string tag name + */ + function parserXMLDocBookTag($name) + { + $this->name = $name; + } + + /** + * @param Converter + * @param boolean + * @uses Converter::TranslateTag() Calls this to enclose the contents of the + * DocBook tag based on the values in template options.ini file + */ + function Convert(&$c, $postprocess = true) + { + $value = parent::Convert($c, $postprocess); + $simvalue = parent::Convert($c, false); + foreach($this->attributes as $a => $v) + { + $this->attributes[$a] = (is_string($v) ? $v : $v->Convert($c, $postprocess)); + } + if (isset($this->_title)) + { + list($this->attributes,$value) = $c->ConvertTitle($this->name, $this->attributes, $this->_title->Convert($c, $postprocess), $value); + } + return $c->TranslateTag($this->name,$this->attributes,$value,$simvalue); + } + + /** + * Begin a new CData section + * @see addCData() + */ + function startCData() + { + $this->_cdata = new parserCData; + } + + /** + * Adds {@link $_cdata} to {@link $value} + */ + function endCData() + { + $this->value[] = $this->_cdata; + unset($this->_cdata); + } + + /** + * Retrieve either the table of contents index, or the location that + * the TOC will go + * @see setTOC() + * @param false|integer either an index of the {@}toc} tag in $this->value + * or false, if the next index value of $this->value + * is needed + */ + function getTOC($state = false) + { + if ($state !== false) return $this->value[$state]; + return count($this->value); + } + + /** + * @param integer index of the TOC in $this->value + * @param parserTocInlineTag + */ + function setTOC($state, $val) + { + $this->value[$state] = $val; + } + + /** + * add a word to CData + * @param string + */ + function addCData($word) + { + $this->_cdata->add($word); + } + + /** + * Add an xml tag attribute name="value" pair + * + * if the attribute is id, value must be a {@link parserIdInlineTag} + * @param string attribute name + * @param string|parserIdInlineTag value of attribute + */ + function addAttribute($name,$value) + { + $this->attributes[$name] = $value; + if ($name == 'id') + { + // fix 1153593 + if (is_string($value)) + { + addWarning(PDERROR_ID_MUST_BE_INLINE,$this->name,$value,$this->name,$value); + } else { + $this->setId($value); + } + } + } + + /** + * Set the title of a DocBook tag section. + * + * For most DocBook tags, the title is represented with a <title> + * tag pair. The top-level tag is a little different. Instead + * of using , phpDocumentor uses the contents of the + * tag in the tag + * @param parserXMLDocBookTag the title element + */ + function setTitle($title) + { + $this->_title = $title; + } + + /** + * If the id attribute is present, this method will set its id + * @param parserIdInlineTag + */ + function setId($id) + { + $this->_id = $id; + } + + /** + * Return converter-specific formatting of ID. + * + * Passes $c to {@link parserIdInlineTag::Convert()} + * @param Converter + * @return string + */ + function getId(&$c) + { + if ($this->_id) return trim($this->_id->Convert($c)); + } + + /** + * Determine whether the docbook element has a title + * @return boolean + */ + function hasTitle() + { + return isset($this->_title); + } + + /** + * Retrieve Converter-specific formatting of the title of this element + * @return string + * @param Converter + */ + function getTitle(&$c) + { + if ($this->name == 'refentry') + { + foreach($this->value as $tag) + { + if (is_object($tag) && $tag->name == 'refnamediv') + { + return $tag->getTitle($c); + } + } + } + if ($this->name == 'refnamediv') + { + foreach($this->value as $tag) + { + if (is_object($tag) && $tag->name == 'refname') + { + $t = new parserStringWithInlineTags; + foreach($tag->value as $val) $t->add($val); + $this->_title = $t; + } + if (is_object($tag) && $tag->name == 'refpurpose') + { + $t = new parserStringWithInlineTags; + foreach($tag->value as $val) $t->add($val); + $this->_description = $t; + } + } + } + if (isset($this->_title)) + return $this->_title->Convert($c); + if (is_object($this->value[0])) return $this->value[0]->getTitle($c); + if (isset($this->value[1])) + if (is_object($this->value[1])) return $this->value[1]->getTitle($c); + return ''; + } + + /** + * Retrieve the contents of a subsection + * + * This method uses the $_id members of nested docbook tags to retrieve + * the section defined by $subsection + * @param Converter + * @param string converter-specific subsection + */ + function getSubsection(&$c,$subsection) + { + if (!is_object($this->_id)) { + return false; + } + $search = phpDocumentor_clone($this->_id); + if (is_string($this->_id)) return false; + if (phpDocumentor_get_class($search) != 'parseridinlinetag') return false; + $search->id = $subsection; + foreach($this->value as $el) + { + if (phpDocumentor_get_class($el) == 'parserxmldocbooktag') + { + if ($el->getId($c) == $search->Convert($c)) + { + return $el; + } elseif ($a = $el->getSubsection($c,$subsection)) + { + return $a; + } + } + } + return false; + } + + /** + * Add contents to this tag. + * + * There are four kinds of data in a DocBook tutorial: + * 1. tags - normal tags like + * 2. entities - normal entities like ” + * 3. - character data that should not be interpreted, + * like contents + * 4. text - normal non-markup text + * + * All four kinds of data are added here + * @param parserEntity|parserCData|parserXMLDocBookTag|string nested tag, + * entity, or text + */ + function add($el) + { + if (is_string($el)) return parent::add($el); + if (phpDocumentor_get_class($el) == 'parserxmldocbooktag') + { + if ($el->name == 'title') + { + $this->setTitle($el); + } else return parent::add($el); + } else return parent::add($el); + } +} + +/** + * a standard entity like ” + * + * This class is designed to represent all DocBook entities. + * @since 1.2 + * @package phpDocumentor + * @subpackage Tutorial + */ +class parserEntity +{ + /** + * @param string entity name + */ + function parserEntity($name) + { + $this->value = $name; + } + + /** + * @uses Converter::TranslateEntity() convert contents to text + * @param Converter + * @return string + */ + function Convert(&$c, $postprocess = true) + { + if ($postprocess) + return $c->TranslateEntity($this->value); + else + { + $trans_tbl = get_html_translation_table (HTML_ENTITIES); + $trans_tbl = array_flip ($trans_tbl); + $ret = strtr ('&'.$this->value.';', $trans_tbl); + return $ret; + } + } +} +?> \ No newline at end of file diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Parser.inc b/buildscripts/PhpDocumentor/phpDocumentor/Parser.inc new file mode 100644 index 00000000..55e67685 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Parser.inc @@ -0,0 +1,3185 @@ + is encountered in parsing an @author tag*/ +define("PARSER_EVENT_DOCKEYWORD_EMAIL" , 114); +/** currently parsing an email in brackets in an @author tag of a DocBlock */ +define("STATE_DOCKEYWORD_EMAIL" , 214); + +/** used when an array definition is encountered in parsing */ +define("PARSER_EVENT_ARRAY" , 115); +/** currently parsing an array */ +define("STATE_ARRAY" , 215); + +/** used when a var statement is encountered in parsing a class definition */ +define("PARSER_EVENT_VAR" , 116); +/** currently parsing a Class variable */ +define("STATE_VAR" , 216); + +/** used when a function definition is encountered in parsing */ +define("PARSER_EVENT_FUNCTION" , 117); +/** currently parsing a Function or Method */ +define("STATE_FUNCTION" , 217); + +/** used when a ? > (with no space) is encountered in parsing */ +define("PARSER_EVENT_OUTPHP" , 118); +/** currently out of php code */ +define("STATE_OUTPHP" , 218); + +/** used when an inline {@tag} is encountered in parsing a DocBlock */ +define("PARSER_EVENT_INLINE_DOCKEYWORD" , 119); +/** currently parsing an inline tag like { @link} in a DocBlock */ +define("STATE_INLINE_DOCKEYWORD" , 219); + +/** used when a define statement's opening parenthesis is encountered in parsing */ +define("PARSER_EVENT_DEFINE_PARAMS_PARENTHESIS" , 120); +/** currently parsing an inner parenthetical statement of a define( ) */ +define("STATE_DEFINE_PARAMS_PARENTHESIS" , 220); + +define("PARSER_EVENT_END_STATEMENT", 121); + +/** used when a <<< is encountered in parsing */ +define("PARSER_EVENT_EOFQUOTE" , 122); +/** currently parsing a string defined using Perl <<< */ +define("STATE_EOFQUOTE" , 222); + +/** used when an include/require/include_once/include_once statement is encountered in parsing */ +define("PARSER_EVENT_INCLUDE" , 123); +/** currently parsing an include/require/include_once/include_once */ +define("STATE_INCLUDE" , 223); + +/** used when an opening parenthesis of an include/require/include_once/include_once statement is encountered in parsing */ +define("PARSER_EVENT_INCLUDE_PARAMS" , 124); +/** currently parsing the stuff in ( ) of a define statement */ +define("STATE_INCLUDE_PARAMS" , 224); + +/** used when an inner ( ) is encountered while parsing an include/require/include_once/include_once statement */ +define("PARSER_EVENT_INCLUDE_PARAMS_PARENTHESIS" , 125); +/** currently parsing an inner parenthetical statement of an include/includeonce/require/requireonce( ) */ +define("STATE_INCLUDE_PARAMS_PARENTHESIS" , 225); + +/** used when parsing the desc part of a docblock */ +define("PARSER_EVENT_DESC" , 126); +/** currently parsing the desc part of a docblock */ +define("STATE_DESC" , 226); + +/** used when parsing the @tag block of a docblock */ +define("PARSER_EVENT_TAGS" , 127); +/** currently parsing the @tag block of a docblock */ +define("STATE_TAGS" , 227); + +/** used when parsing a global variable declaration */ +define("PARSER_EVENT_DEFINE_GLOBAL" , 128); +/** currently parsing a global variable declaration */ +define("STATE_GLOBAL" , 228); + +/** used when parsing the default value in a global variable declaration */ +define("PARSER_EVENT_GLOBAL_VALUE" , 129); +/** currently parsing the default value in a global variable declaration */ +define("STATE_GLOBAL_VALUE" , 229); + +/** used when parsing a "global $var1, $var2;" declaration in a function */ +define("PARSER_EVENT_FUNC_GLOBAL" , 130); +/** currently parsing a "global $var1, $var2;" declaration in a function */ +define("STATE_FUNC_GLOBAL" , 230); + +/** used when parsing a "static $var1, $var2;" declaration in a function */ +define("PARSER_EVENT_STATIC_VAR" , 131); +/** currently parsing a "static $var1, $var2;" declaration in a function */ +define("STATE_STATIC_VAR" , 231); + +/** used when parsing the value in a "static $var1 = x" declaration in a function */ +define("PARSER_EVENT_STATIC_VAR_VALUE" , 132); +/** currently parsing the value in a "static $var1 = x" declaration in a function */ +define("STATE_STATIC_VAR_VALUE" , 232); + +/** used when encountering a /**#@+ comment marking a new docblock template */ +define("PARSER_EVENT_DOCBLOCK_TEMPLATE" , 133); +/** currently parsing the value in a "static $var1 = x" declaration in a function */ +define("STATE_DOCBLOCK_TEMPLATE" , 233); + +/** used when encountering a /**#@-* / comment (no space) marking the end of using a docblock template */ +define("PARSER_EVENT_END_DOCBLOCK_TEMPLATE" , 134); +/** currently parsing the value in a "static $var1 = x" declaration in a function */ +define("STATE_END_DOCBLOCK_TEMPLATE" , 234); + +/** used by the {@link HighlightParser} only, when a method starts */ +define("PARSER_EVENT_METHOD" , 135); +/** currently parsing a method using the {@link HighlightParser} */ +define("STATE_METHOD" , 235); + +/** used by the {@link HighlightParser} only, when a method body is parsed */ +define("PARSER_EVENT_METHOD_LOGICBLOCK" , 136); +/** currently parsing the method body using the {@link HighlightParser} */ +define("STATE_METHOD_LOGICBLOCK" , 236); + +/** used by the {@link HighlightParser} only, when ->var or ->function() is encountered in a method */ +define("PARSER_EVENT_CLASS_MEMBER" , 137); +/** currently parsing a class member using the {@link HighlightParser} */ +define("STATE_CLASS_MEMBER" , 237); + +/** used by the {@link HighlightParser} only, when {$var} is encountered in a string */ +define("PARSER_EVENT_QUOTE_VAR" , 138); +/** currently parsing a {$encapsed_var} using the {@link HighlightParser} */ +define("STATE_QUOTE_VAR" , 238); + +/** used when parsing an access modifier */ +define("PARSER_EVENT_ACCESS_MODIFIER" , 139); +/** currently parsing an access modifier */ +define("STATE_ACCESS_MODIFIER" , 239); + +/** used when a class implements interfaces */ +define("PARSER_EVENT_IMPLEMENTS" , 140); +/** currently parsing an implements clause */ +define("STATE_IMPLEMENTS" , 240); + +/** used when a class implements interfaces */ +define("PARSER_EVENT_CLASS_CONSTANT" , 141); +/** currently parsing a class constant */ +define("STATE_CLASS_CONSTANT" , 241); + +/** used when a variable value is an array */ +define("PARSER_EVENT_VAR_ARRAY" , 142); +/** currently parsing a variable value is an array */ +define("STATE_VAR_ARRAY" , 242); + +/** used when a comment is found in a variable array value */ +define("PARSER_EVENT_VAR_ARRAY_COMMENT" , 143); +/** currently parsing a comment in a variable array value */ +define("STATE_VAR_ARRAY_COMMENT" , 243); + +if (!defined('T_INTERFACE')) +{ + define('T_INTERFACE', 'foo'); + if (!defined('T_CONST')) { + define('T_CONST', 'foo'); + } + define('T_ABSTRACT', 'foo'); + define('T_PRIVATE', 'foo'); + define('T_PUBLIC', 'foo'); + define('T_PROTECTED', 'foo'); + define('T_FINAL', 'foo'); + define('T_IMPLEMENTS', 'foo'); +} +if (!defined('T_DOC_COMMENT')) +{ + define('T_DOC_COMMENT', T_ML_COMMENT); +} +/** + * PHP Parser for PHP 4.2.3- + * + * This parser is slower than the tokenizer-based parser, and is deprecated. + * @author Joshua Eichorn + * @author Gregory Beaver + * @version $Id: Parser.inc,v 1.1 2005/10/17 18:36:56 jeichorn Exp $ + * @package phpDocumentor + * @subpackage Parsers + * @deprecated in favor of {@link phpDocumentorTParser} + */ +class Parser extends Publisher +{ + /**#@+ + * @access private + */ + /** + * Word parser + * @see WordParser + */ + var $wp; + + /** + * temporary parser variables + */ + var $p_vars = array('func' => false, 'function_data' => '', 'quote_data' => '', 'event_stack' => false, 'last_pevent' => 0, + 'two_words_ago' => '', 'temp_word' => '', 'docblock' => false, 'line' => array(), 'linecount' => 0, 'startword' => '', + 'periodline' => 0, 'shortdesc' => '', 'docblock_desc' => '', 'class' => false, 'source_location' => '', + 'define_params_data' => '', 'define' => false, 'define_name' => '', 'define_value' => '', 'var' => false, + 'oldtoken' => false, 'comment_data' => '', 'function_param' => NULL, 'inline_dockeyword_type' => false, + 'inline_dockeyword_data' => false, 'dockeyword_type' => false, 'dockeyword_data' =>false, 'param_var' => false, + 'include_name' => '', 'include_value' => '','include' => false, 'return_type' => '', 'cur_class' => '', + 'function_data' => false, 'varname' => '', 'returntype' => false, 'vartype' => false, 'paramtype' => false, + 'tagname' => '', 'find_global' => '', 'global_type' => '', 'paramname' => false, 'statics' => array(), + 'static_count' => 0, 'static_val' => array(), 'docblock_type' => 'docblock', 'seelement' => false); + + /** + * parser flags, for states that don't warrant a new event (like new line in a docblock) + */ + var $p_flags = array('docblocknewline' => false, 'docblockintags' => false, 'useperiod' => false, + 'definename_isset' => false, 'define_parens' => false, 'reset_quote_data' => false, + 'in_desc' => true, 'in_tag' => false, 'newline' => true, 'tempnewline' => false, + 'start_docblock' => false, 'includename_isset' => false, 'return_isset' => false, + 'is_return' => false, 'in_class' => false, 'asterisk' => false, 'var_equals' => false, + 'arrayinvarname' => false, 'valid_newline' => true, 'startline' => false, + 'function_global' => false, 'define_global' => false, 'static_value' => false,'funcparam_val' => false, + 'get_source' => false, 'getting_source' => false); + + /** + * lookup table for event handler methods + * @see Parser::parse() + */ + var $eventHandlers = array( + 'handleArray' => PARSER_EVENT_ARRAY, + 'handleClass' => PARSER_EVENT_CLASS, + 'handleComment' => PARSER_EVENT_COMMENT, + 'handleDocBlockTemplate' => PARSER_EVENT_DOCBLOCK_TEMPLATE, + 'handleEndDocBlockTemplate' => PARSER_EVENT_END_DOCBLOCK_TEMPLATE, + 'handleEscape' => PARSER_EVENT_ESCAPE, + 'handleLogicBlock' => PARSER_EVENT_LOGICBLOCK, + 'defaultHandler' => PARSER_EVENT_NOEVENTS, +// 'defaultHandler' => PARSER_EVENT_COMMENTBLOCK, (set in constructor below) +// 'defaultHandler' => PARSER_EVENT_OUTPHP, + 'handleDefine' => PARSER_EVENT_DEFINE, + 'handleDefineParams' => PARSER_EVENT_DEFINE_PARAMS, + 'handleDefineParamsParenthesis' => PARSER_EVENT_DEFINE_PARAMS_PARENTHESIS, + 'handleIncludeParamsParenthesis' => PARSER_EVENT_INCLUDE_PARAMS_PARENTHESIS, +// 'handleDocBlock' => PARSER_EVENT_DOCBLOCK, + 'BetterhandleDocBlock' => PARSER_EVENT_DOCBLOCK, + 'handleTags' => PARSER_EVENT_TAGS, + 'handleDesc' => PARSER_EVENT_DESC, +// 'handleDockeyword' => PARSER_EVENT_DOCKEYWORD, + 'handleTag' => PARSER_EVENT_DOCKEYWORD, + 'handleDockeywordEmail' => PARSER_EVENT_DOCKEYWORD_EMAIL, + 'handleEOFQuote' => PARSER_EVENT_EOFQUOTE, + 'handleFunction' => PARSER_EVENT_FUNCTION, + 'handleFunctionParams' => PARSER_EVENT_FUNCTION_PARAMS, + 'handleFuncGlobal' => PARSER_EVENT_FUNC_GLOBAL, + 'handleGlobal' => PARSER_EVENT_DEFINE_GLOBAL, + 'handleGlobalValue' => PARSER_EVENT_GLOBAL_VALUE, + 'handleInlineDockeyword' => PARSER_EVENT_INLINE_DOCKEYWORD, + 'handleInclude' => PARSER_EVENT_INCLUDE, + 'handleIncludeParams' => PARSER_EVENT_INCLUDE_PARAMS, + 'handleQuote' => PARSER_EVENT_QUOTE, + 'handlePhpCode' => PARSER_EVENT_PHPCODE, + 'handleSingleQuote' => PARSER_EVENT_SINGLEQUOTE, + 'handleStaticVar' => PARSER_EVENT_STATIC_VAR, + 'handleStaticValue' => PARSER_EVENT_STATIC_VAR_VALUE, + 'handleVar' => PARSER_EVENT_VAR, + ); + + /** + * event handlers for @tags + * @tutorial tags.pkg + */ + var $tagHandlers = array( + '*' => 'defaultTagHandler', + 'category' => 'categoryTagHandler', + 'example' => 'exampleTagHandler', + 'filesource' => 'invalidTagHandler', + 'return' => 'returnTagHandler', + 'returns' => 'returnTagHandler', + 'var' => 'varTagHandler', + 'package' => 'packageTagHandler', + 'param' => 'paramTagHandler', + 'parameter' => 'paramTagHandler', + 'global' => 'globalTagHandler', + 'staticvar' => 'staticvarTagHandler', + 'uses' => 'usesTagHandler' + ); + + var $laststart = false; + + /** + * An array of allowable @tags + */ + var $allowableTags; + + + /** + * An array of allowed inline @tags + */ + var $allowableInlineTags; + + /** + * Sets the states up, and creates a new WordParser + */ + + /** + * an array of parsing tokens organized by event number. + * A token is defined as the smallest group of characters that separates or + * defines a new parser element. In English, a space or punctuation are + * tokens that separate words. in PHP, tokens may be //, or even " + * Format: array(eventnum =>array(token1, token2, token3, ...),...) + * @var array + */ + var $tokens; + + /** + * array of events that are raised, organized by the tokens that raise them. + * Format: array(eventnum => array(token => neweventnum, token2 => neweventnum2,...),...) + * @var array + */ + var $pushEvent; + + /** + * array of tokens that end an event, organized by event + * Format: array(eventnum => array(token => neweventnum, token2 => neweventnum2,...),...) + * @var array + */ + var $popEvent; + /**#@-*/ + + /** + * Set up invariant parsing variables + */ + function Parser() + { + $this->allowableTags = $GLOBALS['_phpDocumentor_tags_allowed']; + $this->allowableInlineTags = $GLOBALS['_phpDocumentor_inline_doc_tags_allowed']; + $this->wp = new WordParser; + // strange PHP 4.0.6 behavior: it converts constants to strings without warning if it's an array index + $this->eventHandlers = array_flip($this->eventHandlers); + $this->eventHandlers[PARSER_EVENT_COMMENTBLOCK] = 'defaultHandler'; + $this->eventHandlers[PARSER_EVENT_OUTPHP] = 'defaultHandler'; + $this->subscribe(PHPDOCUMENTOR_EVENT_NEWLINENUM,$GLOBALS['phpDocumentor_errors']); + $this->subscribe(PHPDOCUMENTOR_EVENT_NEWFILE,$GLOBALS['phpDocumentor_errors']); + } + + /** + * Parse a new file + * + * @param string $parse_data + * @param string $path + * @param int $base number of directories to drop off the bottom when creating names using path + * @staticvar integer used for recursion limiting if a handler for an event is not found + * @return bool + */ + function parse (&$parse_data, $path, $base = 0, $packages = false) + { + global $_phpDocumentor_options; + static $endrecur = 0; + $this->p_vars = array('func' => false, 'function_data' => '', 'quote_data' => '', 'event_stack' => false, 'last_pevent' => 0, + 'two_words_ago' => '', 'temp_word' => '', 'docblock' => false, 'line' => array(), 'linecount' => 0, 'startword' => '', + 'periodline' => 0, 'shortdesc' => '', 'docblock_desc' => '', 'class' => false, 'source_location' => '', + 'define_params_data' => '', 'define' => false, 'define_name' => '', 'define_value' => '', 'var' => false, + 'oldtoken' => false, 'comment_data' => '', 'function_param' => NULL, 'inline_dockeyword_type' => false, + 'inline_dockeyword_data' => false, 'dockeyword_type' => false, 'dockeyword_data' =>false, 'param_var' => false, + 'include_name' => '', 'include_value' => '','include' => false, 'return_type' => '', 'cur_class' => '', + 'function_data' => false, 'varname' => '', 'returntype' => false, 'vartype' => false, 'paramtype' => false, + 'tagname' => '', 'find_global' => '', 'global_type' => '', 'paramname' => false, 'statics' => array(), + 'static_count' => 0, 'static_val' => array(), 'docblock_type' => 'docblock', 'linenum' => false, + 'seelement' => false); + + $this->p_flags = array('docblocknewline' => false, 'docblockintags' => false, 'useperiod' => false, + 'definename_isset' => false, 'define_parens' => false, 'reset_quote_data' => false, + 'in_desc' => true, 'in_tag' => false, 'newline' => true, 'tempnewline' => false, + 'start_docblock' => false, 'includename_isset' => false, 'return_isset' => false, + 'is_return' => false, 'in_class' => false, 'asterisk' => false, 'var_equals' => false, + 'arrayinvarname' => false, 'valid_newline' => true, 'startline' => false, + 'function_global' => false, 'define_global' => false, 'static_value' => false,'funcparam_val' => false, + 'get_source' => false, 'getting_source' => false, 'in_define' => false, 'in_include' => false, + 'in_var' => false, 'in_global' => false); + $this->p_vars['parsepath'] = $path; + $this->setupStates(); + if (strlen($parse_data) == 0) + { + return false; + } + + // initialize variables so E_ALL error_reporting doesn't complain + $pevent = 0; + $word = 0; + $this->p_vars['event_stack'] = new EventStack; + + $this->wp->setup($parse_data); + + + $page = new ParserPage; + $page->setPath($path); + $page->setPackageOutput($packages); + $page->setFile(basename($path)); + $this->publishEvent(PHPDOCUMENTOR_EVENT_NEWFILE,basename($path)); + //$name = str_replace("/","_",dirname($path)) . "_" . array_shift(explode(".",$page->getFile())); + // fc@fc.clever-soft.com 11/29/2001 + $name = str_replace(PATH_DELIMITER,"_",dirname($path)) . "_" . str_replace(".","_",$page->getFile()); + $tmp = explode("_",$name); + $name = str_replace(':','_',implode("_",array_slice($tmp,$base))); + // if base is '', drive letter is present in windows + + $page->setName($name); + $temploc = $_phpDocumentor_options['Program_Root'] . PATH_DELIMITER. implode(PATH_DELIMITER, + array_slice(explode(PATH_DELIMITER,$path),$base)); + + if ($temploc == $_phpDocumentor_options['Program_Root'] . PATH_DELIMITER) $temploc .= $path; + + $this->p_vars['source_location'] = $source_location = $temploc; + $page->setSourceLocation($source_location); + + $this->publishEvent(PHPDOCUMENTOR_EVENT_PAGE,$page); + unset($page); + $this->p_flags['reset_quote_data'] = 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->publishEvent(PHPDOCUMENTOR_EVENT_NEWSTATE,($pevent + 100)); + + if ($pevent == PARSER_EVENT_GLOBAL_VALUE || $pevent == PARSER_EVENT_DOCBLOCK || $pevent == PARSER_EVENT_DOCBLOCK_TEMPLATE) + { + $this->wp->setWhitespace(true); + } + + $this->p_vars['last_word'] = $word; + $word = $this->wp->getWord(); + // in wordparser, have to keep track of lines + $this->publishEvent(PHPDOCUMENTOR_EVENT_NEWLINENUM, $this->wp->linenum); + + if (0)//PHPDOCUMENTOR_DEBUG == true) + { + echo "\nLAST: |" . $this->p_vars['last_word'] . "|\n"; + echo "PEVENT: " . $this->getParserEventName($pevent) . "\n"; + echo "LASTPEVENT: " . $this->getParserEventName($this->p_vars['last_pevent']) . "\n"; + echo $this->wp->getPos() . ": |$word|\n--------------------------\n\n"; + } + if ($this->p_flags['get_source']) + { + if ($pevent == PARSER_EVENT_FUNCTION) + { + $this->wp->retrievesource("function $word"); + $this->p_flags['get_source'] = false; + $this->p_flags['getting_source'] = true; + } + } + if (false)//$this->p_flags['getting_source'] && ($pevent == PARSER_EVENT_DOCBLOCK) || ($pevent == PARSER_EVENT_NOEVENTS)) + { + addError(PDERROR_SOURCE_TAG_FUNCTION_NOT_FOUND); + // throw away source + $this->wp->getSource(); + } + if (isset($this->eventHandlers[$pevent])) + { + $handle = $this->eventHandlers[$pevent]; + $this->$handle($word, $pevent); + } else + { + debug('WARNING: possible error, no handler for event number '.$pevent); + if ($endrecur++ == 25) + { + die("FATAL ERROR, recursion limit reached"); + } + } + } while (!($word === false)); + $this->publishEvent(PHPDOCUMENTOR_EVENT_NEWSTATE,PHPDOCUMENTOR_EVENT_END_PAGE); + } + + /**#@+ + * @access private + * @param string token parsed from source + * @param integer parser constant from {@link Parser.inc} + */ + /** + * handler for NOEVENTS, OUTPHP, COMMENTBLOCK + */ + + function defaultHandler($word, $pevent) + { + $this->checkEventPush( $word, $pevent); + $this->checkEventPop($word,$pevent); + } + + /** + * handler for LOGICBLOCK + * + * Logic Blocks are the stuff between { and } in a function/method. A + * logic block can clearly contain other logic blocks, as in: + * + * + * function test($a) + * { + * if (testcondition) + * { // nested logic block + * } + * } + * + * + * So, the exit portion of the logic block handler must check to see if the + * logic block being exited is the top-level, and it does this by retrieving + * the last event from the stack. If it is a function (and not a logic block) + * then it backs up the word parser so that the function will exit properly. + * + * {@source 11} + */ + + function handleLogicBlock($word, $pevent) + { + $a = $this->checkEventPush( $word, $pevent); + if ($a == PARSER_EVENT_FUNC_GLOBAL || $a == PARSER_EVENT_STATIC_VAR) + { + if (substr($this->p_vars['last_word'],strlen($this->p_vars['last_word']) - 1,1) != ' ' && substr($this->p_vars['last_word'],strlen($this->p_vars['last_word']) - 1,1) != "\t" && substr($this->p_vars['last_word'],strlen($this->p_vars['last_word']) - 1,1) != "\n" && substr($this->p_vars['last_word'],strlen($this->p_vars['last_word']) - 1,1) != ";" && substr($this->p_vars['last_word'],strlen($this->p_vars['last_word']) - 1,1) != "}" && substr($this->p_vars['last_word'],strlen($this->p_vars['last_word']) - 1,1) != "{") + { + $this->p_vars['event_stack']->popEvent(); + } + } + if ($this->checkEventPop($word,$pevent)) + { + $e = $this->p_vars['event_stack']->popEvent(); + $this->p_vars['event_stack']->pushEvent($e); + if ($e == PARSER_EVENT_FUNCTION) + { + $this->wp->backupPos($word); + } + } + } + + /** + * handler for ESCAPE. + * this event handler parses "this string \"with its escape backslashes\"" and returns: + * this string "with its escape backslashes" + * to make it human-readable + */ + + function handleEscape($word, $pevent) + { + $this->p_vars['event_stack']->popEvent(); + } + + /** + * handler for COMMENT. + * this event handler parses single-line comments like: + * // this one + */ + + function handleComment($word, $pevent) + { + $this->checkEventPush( $word, $pevent); + + if (!isset($this->p_vars['comment_data'])) $this->p_vars['comment_data'] = ''; + $this->p_vars['comment_data'] .= $word; + + $this->checkEventPop($word,$pevent); + } + + /** + * handler for ARRAY. + * this event handler parses arrays in default values of function and var definitions + */ + + function handleArray($word, $pevent) + { + $e = $this->checkEventPush( $word, $pevent); + if (($e == PARSER_EVENT_COMMENTBLOCK) || + ($e == PARSER_EVENT_COMMENT)) return; + + if (!isset($this->p_vars['function_data']) || (isset($this->p_vars['function_data']) && empty($this->p_vars['function_data']))) + { + $this->p_vars['function_data'] = "array"; + } + + if ( ($this->p_vars['last_word'] == "'")) + { + $this->p_vars['function_data'] .= $this->p_vars['quote_data']."'"; + } + if ( ($this->p_vars['last_word'] == "\"")) + { + $this->p_vars['function_data'] .= $this->p_vars['quote_data']."\""; + } + + $this->p_vars['function_data'] .= $word; + //echo "function_data = |$this->p_vars['function_data']|\n"; + + if ($this->checkEventPop($word,$pevent)) + { + } + } + + /** + * handler for DEFINE. + * handles define(constant, value); statements + */ + + function handleDefine($word, $pevent) + { + if (!$this->p_flags['in_define']) + { + $this->p_vars['linenum'] = $this->wp->linenum; + } + $this->p_flags['in_define'] = true; + $this->checkEventPush( $word, $pevent); + + $this->p_flags['definename_isset'] = false; + $this->p_vars['define_params_data'] = ''; + unset($this->p_vars['quote_data']); + if ($this->checkEventPop($word,$pevent)) + { + $this->p_flags['in_define'] = false; + $this->p_vars['define'] = new parserDefine; + $this->p_vars['define']->setLineNumber($this->p_vars['linenum']); + $this->p_vars['define']->setName($this->p_vars['define_name']); + $this->p_vars['define']->setValue($this->p_vars['define_value']); + $this->publishEvent(PHPDOCUMENTOR_EVENT_DEFINE,$this->p_vars['define']); + $this->p_flags['definename_isset'] = false; + unset($this->p_vars['define']); + unset($this->p_vars['define_name']); + unset($this->p_vars['define_value']); + $this->p_flags['in_define'] = false; + $this->p_vars['define_params_data'] = ''; + } + } + + /** + * handler for DEFINE_PARAMS. + * handles the parsing of constant and value in define(constant, value); + */ + + function handleDefineParams($word, $pevent) + { + if ($this->checkEventPush( $word, $pevent)) + { + if ($word == '(') + { + $this->p_vars['define_params_data'] .= $word; + } + return; + } + + $this->p_flags['define_parens'] = true; + if(!isset($this->p_vars['define_params_data'])) $this->p_vars['define_params_data'] = ''; + + if ($this->checkEventPop($word,$pevent)) + { + if (!empty($this->p_vars['quote_data'])) + { + $this->p_vars['define_params_data'] .= $this->p_vars['quote_data']; + } + if (!empty($this->p_vars['define_params_data'])) + { + //echo $this->p_vars['define_params_data']."\n"; + $this->p_vars['define_value'] = $this->p_vars['define_params_data']; + } + else + { + if ( $this->p_vars['last_word'] != "/*" && + $this->p_vars['last_word'] != "//" && $this->p_vars['last_word'] != "#") + { + $this->p_vars['define_value'] = trim($this->p_vars['last_word']); + } + else + { + $this->p_vars['define_value'] = ""; + } + } + } + if ($this->p_flags['definename_isset']) + { + if (isset($this->p_vars['quote_data'])) + { + $this->p_vars['define_params_data'] .= '"'.$this->p_vars['quote_data'].'"'; + unset($this->p_vars['quote_data']); + } + $this->p_vars['define_params_data'] .= $word; + } else + { + if ($word != ",") + { + if (isset($this->p_vars['quote_data'])) + { + $this->p_vars['define_params_data'] .= $this->p_vars['quote_data']; + unset($this->p_vars['quote_data']); + } + $this->p_vars['define_params_data'] .= $word; + } else + { + if (isset($this->p_vars['quote_data']) && !$this->p_flags['definename_isset']) + { + $this->p_vars['define_params_data'] .= $this->p_vars['quote_data']; + unset($this->p_vars['quote_data']); + } + $this->p_flags['definename_isset'] = true; + $this->p_vars['define_name'] = $this->p_vars['define_params_data']; + unset($this->p_vars['quote_data']); + $this->p_vars['define_params_data'] = ''; + } + } + } + + /** + * handler for DEFINE_PARAMS_PARENTHESIS. + * this handler takes all parenthetical statements within constant or value in: + * define(constant, value) of a define statement, and handles them properly + */ + + function handleDefineParamsParenthesis($word, $pevent) + { + if (isset($this->p_vars['quote_data'])) + { + $this->p_vars['define_params_data'] .= '"'.$this->p_vars['quote_data'].'"'; + unset($this->p_vars['quote_data']); + } + $this->p_vars['define_params_data'] .= $word; + $this->checkEventPush( $word, $pevent); + $this->checkEventPop( $word, $pevent); + } + + /** + * handler for CLASS. + * this handler parses a class statement + */ + + function handleClass($word, $pevent) + { + $this->p_flags['in_class'] = true; + $a = $this->checkEventPush( $word, $pevent); + if ($a == PARSER_EVENT_DOCBLOCK || $a == PARSER_EVENT_DOCBLOCK_TEMPLATE) + { + $this->wp->setWhitespace(true); + } + + if (!isset($this->p_vars['class'])) $this->p_vars['class'] = false; + if (!is_subclass_of($this->p_vars['class'],"parserBase")) + { + $this->p_vars['class'] = new parserClass; + $this->p_vars['class']->setLineNumber($this->wp->linenum); + $this->p_vars['class']->setname($word); + $this->p_vars['cur_class'] = $word; + $this->p_vars['class']->setSourceLocation($this->p_vars['source_location']); + } + + if (strtolower($this->p_vars['last_word']) == "extends") + { + $this->p_vars['class']->setExtends($word); + } + + if ($word == "{") + { + $this->publishEvent(PHPDOCUMENTOR_EVENT_CLASS,$this->p_vars['class']); + } + //echo $this->wp->getPos() . ": |$word|\n"; + if ($this->checkEventPop($word,$pevent)) + { + $this->p_flags['in_class'] = false; + // throw an event when class is done + $this->publishEvent(PHPDOCUMENTOR_EVENT_NEWSTATE,STATE_END_CLASS); + $this->p_vars['class'] = false; + } + } + + /** + * handler for VAR. + * handle a var $varname = default_value; or var $varname; statement in a class definition + */ + + function handleVar($word, $pevent) + { + if (!$this->p_flags['in_var']) + { + $this->p_vars['linenum'] = $this->wp->linenum; + } + $this->p_flags['in_var'] = true; + //echo $word."\n"; + $e = $this->checkEventPush( $word, $pevent); + + if (!isset($this->p_vars['var'])) $this->p_vars['var'] = false; + if ($word == '=' || $word == ';') $this->p_flags['var_equals'] = true; + if (!$this->p_flags['var_equals']) + { + // if we haven't parsed the = yet, no arrays are possible! + if ($e == PARSER_EVENT_ARRAY) + { + $this->p_flags['arrayinvarname'] = true; + $this->p_vars['event_stack']->popEvent(); + } + if (!$e || ($e == PARSER_EVENT_ARRAY)) + $this->p_vars['varname'] .= $word; + } + + if (!$this->p_flags['var_equals']) + { + if ($word != "/*" && $word != "//" && $word != "#") + { + $this->p_vars['var'] = new parserVar($this->p_vars['cur_class']); + $this->p_vars['var']->setName($this->p_vars['varname']); + } + } + if ($this->p_vars['last_word'] == "=") + { + if ($word != "/*" && $word != "//" && $word != "#") + { + $this->p_vars['var']->setValue($word); + } + } + // fix 1202772 + if (isset($this->p_vars['quote_data']) && ($this->p_vars['last_pevent'] == PARSER_EVENT_QUOTE || $this->p_vars['last_pevent'] == PARSER_EVENT_SINGLEQUOTE)) + { + $this->p_vars['var']->setValue($this->p_vars['quote_data']); + unset($this->p_vars['quote_data']); + } + if ($this->p_vars['last_pevent'] == PARSER_EVENT_ARRAY) + { + $this->p_vars['var']->setValue($this->p_vars['function_data']); + $this->p_vars['function_data'] = false; + } + + if ($this->checkEventPop($word,$pevent)) + { + $this->p_vars['var']->setLineNumber($this->p_vars['linenum']); + $this->publishEvent(PHPDOCUMENTOR_EVENT_VAR,$this->p_vars['var']); + unset($this->p_vars['var']); + $this->p_flags['in_var'] = false; + $this->p_flags['var_equals'] = false; + $this->p_flags['arrayinvarname'] = false; + $this->p_vars['varname'] = ''; + } + } + + /** + * handler for QUOTE. + * this handler recognizes strings defined with double quotation marks (") and handles them correctly + * in any place that they legally appear in php code + */ + + function handleQuote($word, $pevent) + { + if ($this->p_flags['reset_quote_data'] === true) + { + $this->p_flags['reset_quote_data'] = false; + $this->p_vars['quote_data'] = ""; + } + $this->checkEventPush( $word, $pevent); + if ($word != "\"") + { + $this->p_vars['quote_data'] .= $word; + } + if ($this->checkEventPop($word,$pevent)) + { + $this->p_flags['reset_quote_data'] = true; + } + } + + /** + * handler for SINGLEQUOTE. + * this handler recognizes strings defined with single quotation marks (') and handles them correctly + * in any place that they legally appear in php code + */ + + function handleSingleQuote($word, $pevent) + { + $this->checkEventPush( $word, $pevent); + if ($this->checkEventPop($word,$pevent)) + { + if ($this->p_vars['last_word'] != "'") + { + $this->p_vars['quote_data'] = $this->p_vars['last_word']; + } else { + $this->p_vars['quote_data'] = ""; + } + } + } + + /** + * handler for EOFQUOTE. + * this handler recognizes strings defined with perl-style <<< EOF quotes, and handles them correctly + * in any place that they legally appear in php code + * + * an example: + * $var <<< EOF + * blah blah blah + * EOF; + */ + + function handleEOFQuote($word, $pevent) + { + // echo $this->wp->getPos() . ": word=|$word|\t\t\tlastword=|$this->p_vars['last_word']|\n"; + if (trim($this->p_vars['last_word']) == "<<<") + { + // ok we found the keyword + //echo "Keyword == $word\n"; + $this->p_vars['oldtoken'] = $this->tokens[STATE_EOFQUOTE]; + $this->tokens[STATE_EOFQUOTE] = array($word); + } + else if ($this->p_vars['last_pevent'] || PARSER_EVENT_EOFQUOTE) + { + // i don't think anything will ever use this so were not going to set it + //$this->p_vars['quote_data'] = $this->p_vars['last_word']; + $this->p_vars['event_stack']->popEvent(); + $this->tokens[STATE_EOFQUOTE] = $this->p_vars['oldtoken']; + } + } + /**#@-*/ + + /** + * Tells the parser to search for a global variable definition as + * defined by a @global type $name tag. + * + * The parser is fooled into looking for the entire global variable as a + * single token by amending the {@link $tokens} array. + * + * {@source} + * @access private + * @param string name of global variable as it appears in the source code + */ + function findGlobal($name) + { + if (!isset($this->p_vars['globaltofind'])) + { + $this->p_vars['globaltofind'] = $name; + $this->pushEvent[PARSER_EVENT_PHPCODE][strtolower($name)] = PARSER_EVENT_DEFINE_GLOBAL; + $this->tokens[STATE_PHPCODE][] = $name; + } else + { + addError(PDERROR_MULTIPLE_GLOBAL_TAGS,$this->p_vars['globaltofind'],$name); + } + } + + /**#@+ + * @access private + * @param string token parsed from source + * @param integer parser constant from {@link Parser.inc} + */ + /** + * handler for PHPCODE. + * this handler recognizes the php processor directive, and begins parsing php code + */ + + function handlePhpCode($word, $pevent) + { + $e = $this->checkEventPush( $word, $pevent); + if ($e == PARSER_EVENT_DOCBLOCK || $e == PARSER_EVENT_DOCBLOCK_TEMPLATE) + { + $this->wp->setWhitespace(true); + } + if (isset($this->p_vars['globaltofind']) && $e) + { + if ($e != PARSER_EVENT_DEFINE_GLOBAL && $e != PARSER_EVENT_ARRAY && $e != PARSER_EVENT_QUOTE && $e != PARSER_EVENT_SINGLEQUOTE && $e != PARSER_EVENT_COMMENT && $e != PARSER_EVENT_COMMENTBLOCK) + { + addError(PDERROR_GLOBAL_NOT_FOUND,$this->p_vars['globaltofind']); + unset($this->pushEvent[PARSER_EVENT_PHPCODE][strtolower($this->p_vars['globaltofind'])]); + foreach($this->tokens[STATE_PHPCODE] as $i => $notme) + if ($this->tokens[STATE_PHPCODE][$i] == $this->p_vars['globaltofind']) + unset($this->tokens[STATE_PHPCODE][$i]); + unset($this->p_vars['globaltofind']); + } + } + } + + /** + * handler for global variables + */ + function handleGlobal($word, $pevent) + { + if (!$this->p_flags['in_global']) + { + $this->p_vars['linenum'] = $this->wp->linenum; + } + $this->p_flags['in_global'] = true; + $e = $this->checkEventPush($word, $pevent); + if ($this->checkEventPop($word, $pevent)) + { + $this->p_flags['in_global'] = false; + $a = new parserGlobal; + $a->setDataType($this->p_vars['global_type']); + $this->p_vars['global_type'] = ''; + $a->setLineNumber($this->p_vars['linenum']); + $a->setName($this->p_vars['globaltofind']); + if (isset($this->p_vars['global_val'])) + $a->setValue(trim($this->p_vars['global_val'])); + unset($this->p_vars['global_val']); + $this->publishEvent(PHPDOCUMENTOR_EVENT_GLOBAL,$a); + unset($this->pushEvent[PARSER_EVENT_PHPCODE][strtolower($this->p_vars['globaltofind'])]); + foreach($this->tokens[STATE_PHPCODE] as $i => $notme) + if ($this->tokens[STATE_PHPCODE][$i] == $this->p_vars['globaltofind']) + unset($this->tokens[STATE_PHPCODE][$i]); + unset($this->p_vars['globaltofind']); + } + } + + /** + * Handles the stuff after the = in $globalvar = value + */ + function handleGlobalValue($word, $pevent) + { + if ($this->checkEventPush($word, $pevent)) + { + $this->wp->setWhitespace(false); + return; + } + if (!isset($this->p_vars['global_val'])) $this->p_vars['global_val'] = ''; + if ($this->p_vars['last_pevent'] == PARSER_EVENT_QUOTE || $this->p_vars['last_pevent'] == PARSER_EVENT_SINGLEQUOTE) + { + if (!isset($this->p_vars['quote_data'])) $this->p_vars['quote_data'] = ''; + $this->p_vars['global_val'] .= '"'.$this->p_vars['quote_data'].'"'; + unset($this->p_vars['quote_data']); + $this->p_vars['last_pevent'] = PARSER_EVENT_GLOBAL_VALUE; + } + if ($this->p_vars['last_pevent'] == PARSER_EVENT_ARRAY) + { + $this->p_vars['global_val'] .= $this->p_vars['function_data']; + $this->p_vars['function_data'] = false; + } + if ($word != ';') + $this->p_vars['global_val'] .= $word; + if ($this->checkEventPop($word, $pevent)) + { + $this->wp->setWhitespace(false); + $this->wp->backupPos($word); + } + } + + /** + * handler for FUNC_GLOBAL. + * this handler recognizes "global $var1, $var2" declarations in a function, and parses them + */ + + function handleFuncGlobal($word, $pevent) + { + if ((substr(trim($word),0,1) != '$') && ($word != ',') && ($word != ';')) + { // not a global declaration, using a variable named "$global" + $this->p_vars['event_stack']->popEvent(); + return; + } + if ($this->checkEventPop($word, $pevent)) + { + return; + } + if (!$this->checkEventPush($word, $pevent)) + { + if ($word == ',') + { // another variable + $this->p_vars['global_count']++; + } else + { + if (!isset($this->p_vars['globals'][$this->p_vars['global_count']])) + $this->p_vars['globals'][$this->p_vars['global_count']] = ''; + if (!empty($this->p_vars['globals'][$this->p_vars['global_count']])) $this->p_vars['global_count']++; + $this->p_vars['globals'][$this->p_vars['global_count']] = trim($word); + } + } + } + + /** + * handler for STATIC_VAR. + * this handler recognizes "static $var1, $var2 = 6" declarations in a function, and parses them + */ + + function handleStaticVar($word, $pevent) + { + if ($this->checkEventPop($word, $pevent)) + { + $this->p_vars['static_count']++; + return; + } + if (!$this->checkEventPush($word, $pevent)) + { + if ($word == ',') + { + $this->p_vars['static_count']++; + return; + } + if (!isset($this->p_vars['statics'][$this->p_vars['static_count']])) + $this->p_vars['statics'][$this->p_vars['static_count']] = ''; + if (!empty($this->p_vars['statics'][$this->p_vars['static_count']])) $this->p_vars['static_count']++; + $this->p_vars['statics'][$this->p_vars['static_count']] = trim($word); + } + } + + /** + * handler for STATIC_VAR_VALUE. + * this handler parses the 6 in "static $var1, $var2 = 6" + */ + + function handleStaticValue($word, $pevent) + { + if ($this->checkEventPush($word, $pevent)) + { + return; + } + if (!isset($this->p_vars['static_val'][$this->p_vars['static_count']])) $this->p_vars['static_val'][$this->p_vars['static_count']] = ''; + if ($this->p_vars['last_pevent'] == PARSER_EVENT_QUOTE || $this->p_vars['last_pevent'] == PARSER_EVENT_SINGLEQUOTE) + { + $this->p_vars['static_val'][$this->p_vars['static_count']] .= '"'.$this->p_vars['quote_data'].'"'; + unset($this->p_vars['quote_data']); + } + if ($this->p_vars['last_pevent'] == PARSER_EVENT_ARRAY) + { + $this->p_vars['static_val'][$this->p_vars['static_count']] .= $this->p_vars['function_data']; + $this->p_vars['function_data'] = false; + } + if ($this->checkEventPop($word, $pevent)) + { + $this->p_vars['static_val'][$this->p_vars['static_count']] = trim($this->p_vars['static_val'][$this->p_vars['static_count']]); + $this->wp->backupPos($word); + return; + } else $this->p_vars['static_val'][$this->p_vars['static_count']] .= $word; + } + + /** + * handler for FUNCTION. + * this handler recognizes function declarations, and parses them. The body + * of the function is parsed by handleLogicBlock() + * @see handleLogicBlock() + */ + + function handleFunction($word, $pevent) + { + if ($e = $this->checkEventPush( $word, $pevent)) + { + if ($e == PARSER_EVENT_COMMENT || $e == PARSER_EVENT_COMMENTBLOCK) return; + } + + if (!isset($this->p_vars['func'])) $this->p_vars['func'] = false; + if (! is_subclass_of($this->p_vars['func'],"parserBase")) + { + $this->p_vars['globals'] = array(); + $this->p_vars['global_count'] = 0; + if ($this->p_flags['in_class']) + $this->p_vars['func'] = new parserMethod($this->p_vars['cur_class']); + else + $this->p_vars['func'] = new parserFunction; + $this->p_vars['func']->setLineNumber($this->wp->linenum); + if (trim($word) != '&') + $this->p_vars['func']->setName(trim($word)); + else + $this->p_vars['func']->setReturnsReference(); + } else + { + if ($this->p_vars['func']->getReturnsReference()) + { + if ($this->p_vars['last_word'] == '&') + { + $this->p_vars['func']->setName(trim($word)); + } + } + } + if ($this->checkEventPop($word,$pevent)) + { + $this->p_vars['func']->addGlobals($this->p_vars['globals']); + $this->p_vars['func']->addStatics($this->p_vars['statics'],$this->p_vars['static_val']); + $this->p_vars['globals'] = array(); + $this->p_vars['global_count'] = 0; + if ($this->p_flags['getting_source']) + { + $x = $this->wp->getSource(); + $this->p_vars['func']->addSource($x); + $this->p_flags['get_source'] = false; + $this->p_flags['getting_source'] = false; + } + $this->publishEvent(PHPDOCUMENTOR_EVENT_FUNCTION,$this->p_vars['func']); + $this->p_vars['func'] = false; + } + } + + /**#@-*/ + /** + * Helper function for {@link handleFunctionParams()} + * + * This function adds a new parameter to the parameter list + * @access private + * @param string + */ + function endFunctionParam($word) + { + if (isset($this->p_vars['quote_data']) && ($this->p_vars['last_pevent'] == PARSER_EVENT_SINGLEQUOTE)) + { + $this->p_vars['function_data'] .= "'".$this->p_vars['quote_data']."'"; + unset($this->p_vars['quote_data']); + } + if (isset($this->p_vars['quote_data']) && ($this->p_vars['quote_data'] != '') && ($this->p_vars['last_pevent'] == PARSER_EVENT_QUOTE)) + { + $this->p_vars['function_data'] .= '"'.$this->p_vars['quote_data'].'"'; + unset($this->p_vars['quote_data']); + } + if (isset($this->p_vars['function_param'])) + { + $this->p_vars['func']->addParam($this->p_vars['function_param'],$this->p_vars['function_data'], $this->p_flags['funcparam_val']); + unset($this->p_vars['function_param']); + $this->p_vars['function_data'] = ''; + $this->p_flags['funcparam_val'] = false; + } + } + /**#@+ + * @access private + * @param string token parsed from source + * @param integer parser constant from {@link Parser.inc} + */ + /** + * handler for FUNCTION_PARAMS. + * this handler recognizes the parameters of a function within parentheses like function(param, param = default_value) + * and parses them + * @see endFunctionParam() + */ + + function handleFunctionParams($word, $pevent) + { + //echo $this->wp->getPos() . ": word=|$word|\t\t\tlastword=|".$this->p_vars['last_word']."|\n"; + //echo "function_param = '".$this->p_vars['function_param']."'\n"; + //echo "function_data = '".$this->p_vars['function_data']."'\n"; + $e1 = $this->checkEventPush( $word, $pevent); + + if (!$e1) + { + if ($word == ',' || $this->checkEventPop($word,$pevent)) + { + $this->endFunctionParam($word); + } elseif ($word == '=') + { + $this->p_flags['funcparam_val'] = true; + } else + { + if ($this->p_flags['funcparam_val']) + { + if (isset($this->p_vars['quote_data']) && ($this->p_vars['last_pevent'] == PARSER_EVENT_SINGLEQUOTE)) + { + $this->p_vars['function_data'] .= "'".$this->p_vars['quote_data']."'"; + unset($this->p_vars['quote_data']); + } + if (isset($this->p_vars['quote_data']) && ($this->p_vars['last_pevent'] == PARSER_EVENT_QUOTE)) + { + $this->p_vars['function_data'] .= '"'.$this->p_vars['quote_data'].'"'; + unset($this->p_vars['quote_data']); + } + $this->p_vars['function_data'] .= $word; + } else + { + $this->p_vars['function_param'] = $word; + } + } + } + } + + + /** + * javadoc-desc-compliant handler for DOCBLOCK. + * this handler recognizes @tags in DocBlocks and parses them for display. + * It also parses out unknown tags into their own array for use by the docblock + */ + + function JavaDochandleDocblock($word, $pevent) + { + $e1 = $this->checkEventPush( $word, $pevent); + if (!isset($this->p_vars[$this->p_vars['docblock_type']]) || !$this->p_vars[$this->p_vars['docblock_type']]) + { + $this->p_vars[$this->p_vars['docblock_type']] = new parserDocBlock(); + $this->p_vars['returntype'] = false; + $this->p_vars['vartype'] = false; + $this->p_flags['startdocblock'] = true; + $this->p_flags['valid_newline'] = true; + $this->p_flags['startline'] = true; + $this->p_flags['newline'] = true; + $this->p_flags['in_desc'] = true; + $this->p_flags['in_tag'] = false; + $this->p_flags['useperiod'] = false; + $this->p_vars['line'] = array(); + $this->p_vars['linecount'] = 0; + } + $e = $this->checkEventPop( $word, $pevent); + if (!$e1 && !$e) + { + if ($this->p_flags['in_desc']) $this->JavaDochandleDesc($word, $pevent); + else $this->handleTags($word, $pevent); + } + if ($e) + { + if (!isset($this->p_vars['periodline'])) $this->p_vars['periodline'] = 0; + if ($this->p_vars['periodline'] > 3) + { + $this->p_flags['useperiod'] = false; + } + + $this->p_vars['docblock_desc'] = new parserDesc; +// echo "i = ".$this->p_vars['periodline']."; i < " . count($this->p_vars['line']) . "\n"; + if ($this->p_vars['docblock_type'] == 'docblock') + { + if (isset($this->p_vars['docblock_template'])) + { + // copy template values if not overridden + if (!$this->p_vars['docblock']->getExplicitPackage()) + { + if ($p = $this->p_vars['docblock_template']->getKeyword('package')) + { + $this->p_vars['docblock']->addKeyword('package',$p); + $this->p_vars['docblock']->setExplicitPackage(); + } + if ($p = $this->p_vars['docblock_template']->getKeyword('category')) + { + $this->p_vars['docblock']->addKeyword('category',$p); + $this->p_vars['docblock']->setExplicitCategory(); + } + if ($p = $this->p_vars['docblock_template']->getKeyword('subpackage')) + { + $this->p_vars['docblock']->addKeyword('subpackage',$p); + } + } + $tags = $this->p_vars['docblock_template']->listTags(); + foreach($tags as $tag) + { + $this->p_vars['docblock']->addKeyword($tag->keyword,$tag->value); + } + $this->p_vars['docblock_desc']->add($this->p_vars['docblock_template']->desc); + if (!count($this->p_vars['docblock']->params)) $this->p_vars['docblock']->params = $this->p_vars['docblock_template']->params; + } + if ($a = strpos(trim($this->p_vars['shortdesc']),'

            ') === 0) + $this->p_vars['shortdesc'] = substr($this->p_vars['shortdesc'],strpos($this->p_vars['shortdesc'],'

            ') + 4); + $this->p_vars[$this->p_vars['docblock_type']]->setShortDesc($this->p_vars['shortdesc']); + } + for($i = 0; $i < count($this->p_vars['line']); $i++) + { + // the line will not be set if it doesn't start with a * + if (isset($this->p_vars['line'][$i])) + $this->p_vars['docblock_desc']->add($this->p_vars['line'][$i]); + } + + + $this->p_vars[$this->p_vars['docblock_type']]->setDesc($this->p_vars['docblock_desc']); + unset($this->p_vars['docblock_desc']); +// var_dump($this->p_vars[$this->p_vars['docblock_type']]); +// exit; + if ($this->p_vars['docblock_type'] == 'docblock') + { + $this->publishEvent(PHPDOCUMENTOR_EVENT_DOCBLOCK,$this->p_vars[$this->p_vars['docblock_type']]); + unset($this->p_vars[$this->p_vars['docblock_type']]); + $this->p_vars[$this->p_vars['docblock_type']] = new parserDocBlock(); + } + $this->p_flags['in_desc'] = true; + $this->p_flags['in_tag'] = false; + $this->p_flags['useperiod'] = false; + $this->p_vars['line'] = array(); + $this->p_vars['linecount'] = 0; + $this->p_flags['start_docblock'] = true; + $this->p_flags['valid_newline'] = true; + $this->wp->setWhitespace(false); + } + } + + /** + * handler for DOCKEYWORD_DESC. + * this handler parses the short and long description of a dockeyword + */ + + function JavaDochandleDesc($word, $pevent) + { + if ($this->p_flags['valid_newline']) + { + if ($word == '@' && $this->p_flags['startline']) + { + return $this->handleTag($word, $pevent); + } + if (!isset($this->p_vars['line'][$this->p_vars['linecount']])) + { + $this->p_vars['line'][$this->p_vars['linecount']] = new parserStringWithInlineTags; + } + if ($this->p_vars['last_word'] == "." && $this->p_flags['useperiod'] == false) + { + $this->p_vars['periodline'] = $this->p_vars['linecount']; + $this->p_vars['shortdesc'] = new parserDesc; + for($i = 0; ($i <= $this->p_vars['periodline']) && ($i < count($this->p_vars['line'])); $i++) + { + if (isset($this->p_vars['line'][$i])) + $this->p_vars['shortdesc']->add($this->p_vars['line'][$i]); + } + $this->p_flags['useperiod'] = true; + } + $this->p_vars['line'][$this->p_vars['linecount']]->add($word); +// debug("DESC $word"); + } + $this->handleCR($word); + } + + /** + * handler for DOCBLOCK. + * this handler recognizes @tags in DocBlocks and parses them for display. + * It also parses out unknown tags into their own array for use by the docblock + */ + + function BetterhandleDocblock($word, $pevent) + { + $e1 = $this->checkEventPush( $word, $pevent); + if (!$this->wp->returnWhiteSpace) + { + addErrorDie(PDERROR_NEED_WHITESPACE); + } + if (!isset($this->p_vars[$this->p_vars['docblock_type']]) || !$this->p_vars[$this->p_vars['docblock_type']]) + { + $this->p_vars[$this->p_vars['docblock_type']] = new parserDocBlock(); + $this->p_vars['returntype'] = false; + $this->p_vars['vartype'] = false; + $this->p_flags['startdocblock'] = true; + $this->p_flags['valid_newline'] = true; + $this->p_flags['startline'] = true; + $this->p_flags['newline'] = true; + $this->p_flags['in_desc'] = true; + $this->p_flags['in_tag'] = false; + $this->p_flags['useperiod'] = false; + $this->p_vars['line'] = array(); + $this->p_vars['linecount'] = 0; + } + $e = $this->checkEventPop( $word, $pevent); + if (!$e1 && !$e) + { + if ($this->p_flags['in_desc']) $this->handleDesc($word, $pevent); + else $this->handleTags($word, $pevent); + } + if ($e) + { + if (!isset($this->p_vars['periodline'])) $this->p_vars['periodline'] = 0; + if ($this->p_vars['periodline'] > 3) + { + $this->p_flags['useperiod'] = false; + } else + { + for($i = 0; $i < $this->p_vars['periodline']; $i++) + { + if (isset($this->p_vars['line'][$i])) + { + if ($this->p_vars['line'][$i]->trimmedStrlen() == 0 && isset($this->p_vars['line'][$i - 1]) && $this->p_vars['line'][$i - 1]->trimmedStrlen()) + { + $this->p_vars['periodline'] = $i; + } + } + } + } + // figure out the shortdesc + if ($this->p_flags['useperiod'] === false) + { + // use the first non blank line for short desc + for($i = 0; $i < count($this->p_vars['line']); $i++) + { + if (!isset($this->p_vars['line'][$i])) + $this->p_vars['line'][$i] = new parserStringWithInlineTags; + if ($this->p_vars['line'][$i]->trimmedStrlen() > 0) + { + $this->p_vars['periodline'] = $i; + $i = count($this->p_vars['line']); + } + } + + // check to see if we are going to use a blank line to end the shortdesc + // this can only be in the first 4 lines + if (count($this->p_vars['line']) > 4) + { + $max = 4; + } else { + $max = count($this->p_vars['line']); + } + + for($i = $this->p_vars['periodline']; $i < $max; $i++) + { + if (isset($this->p_vars['line'][$i])) + if ($this->p_vars['line'][$i]->trimmedStrlen() == 0) + { + $this->p_vars['periodline'] = $i; + $i = $max; + } + } + } + + if ($this->p_vars['docblock_type'] == 'docblock') + { + $this->p_vars['shortdesc'] = new parserDesc; + for($i = 0; ($i <= $this->p_vars['periodline']) && ($i < count($this->p_vars['line'])); $i++) + { + if (isset($this->p_vars['line'][$i])) + $this->p_vars['shortdesc']->add($this->p_vars['line'][$i]); + } + $this->p_vars['periodline']++; + + $this->p_vars['docblock_desc'] = new parserDesc; + if (isset($this->p_vars['docblock_template'])) + { + // copy template values if not overridden + if (!$this->p_vars['docblock']->getExplicitPackage()) + { + if ($p = $this->p_vars['docblock_template']->getKeyword('package')) + { + $this->p_vars['docblock']->addKeyword('package',$p); + $this->p_vars['docblock']->setExplicitPackage(); + } + if ($p = $this->p_vars['docblock_template']->getKeyword('category')) + { + $this->p_vars['docblock']->addKeyword('category',$p); + $this->p_vars['docblock']->setExplicitCategory(); + } + if ($p = $this->p_vars['docblock_template']->getKeyword('subpackage')) + { + $this->p_vars['docblock']->addKeyword('subpackage',$p); + } + } + $tags = $this->p_vars['docblock_template']->listTags(); + foreach($tags as $tag) + { + $this->p_vars['docblock']->addKeyword($tag->keyword,$tag->value); + } + if (!count($this->p_vars['docblock']->params)) $this->p_vars['docblock']->params = $this->p_vars['docblock_template']->params; + $this->p_vars['docblock_desc']->add($this->p_vars['docblock_template']->desc); + } + // echo "i = ".$this->p_vars['periodline']."; i < " . count($this->p_vars['line']) . "\n"; + for($i = $this->p_vars['periodline']; $i < count($this->p_vars['line']); $i++) + { + // the line will not be set if it doesn't start with a * + if (isset($this->p_vars['line'][$i])) + $this->p_vars['docblock_desc']->add($this->p_vars['line'][$i]); + } + } else + { + $this->p_vars['shortdesc'] = new parserDesc; + for($i = 0; ($i <= $this->p_vars['periodline']) && ($i < count($this->p_vars['line'])); $i++) + { + if (isset($this->p_vars['line'][$i])) + $this->p_vars['shortdesc']->add($this->p_vars['line'][$i]); + } + $this->p_vars['periodline']++; + + $this->p_vars['docblock_desc'] = new parserDesc; + for($i=$this->p_vars['periodline']; $i < count($this->p_vars['line']); $i++) + { + if (isset($this->p_vars['line'][$i])) + $this->p_vars['docblock_desc']->add($this->p_vars['line'][$i]); + } + } + + + $this->p_vars[$this->p_vars['docblock_type']]->setShortDesc($this->p_vars['shortdesc']); + $this->p_vars[$this->p_vars['docblock_type']]->setDesc($this->p_vars['docblock_desc']); + unset($this->p_vars['docblock_desc']); +// var_dump($this->p_vars[$this->p_vars['docblock_type']]); +// exit; + if ($this->p_vars['docblock_type'] == 'docblock') + { + $this->publishEvent(PHPDOCUMENTOR_EVENT_DOCBLOCK,$this->p_vars[$this->p_vars['docblock_type']]); + unset($this->p_vars[$this->p_vars['docblock_type']]); + $this->p_vars[$this->p_vars['docblock_type']] = new parserDocBlock(); + } else + { + $this->publishEvent(PHPDOCUMENTOR_EVENT_DOCBLOCK_TEMPLATE,$this->p_vars[$this->p_vars['docblock_type']]); + } + $this->p_flags['in_desc'] = true; + $this->p_flags['in_tag'] = false; + $this->p_flags['useperiod'] = false; + $this->p_vars['line'] = array(); + $this->p_vars['linecount'] = 0; + $this->p_flags['start_docblock'] = true; + $this->p_flags['valid_newline'] = true; + $this->wp->setWhitespace(false); + $this->p_vars['docblock_type'] = 'docblock'; + } + } + + /** + * Handles docblock templates + * @tutorial phpDocumentor.howto.pkg#basics.docblocktemplate + */ + function handleDocBlockTemplate($word, $pevent) + { + $this->p_vars['docblock_type'] = 'docblock_template'; + $this->p_vars['event_stack']->popEvent(); + $this->p_vars['event_stack']->pushEvent(PARSER_EVENT_DOCBLOCK); + // fool the docblock handler into thinking everything is totally normal + $this->p_vars['last_word'] = '/**'; + $pevent = PARSER_EVENT_DOCBLOCK; + $this->BetterhandleDocBlock($word, $pevent); + } + + /** + * Handles closing docblock templates /**#@-* / + * @tutorial phpDocumentor.howto.pkg#basics.docblocktemplate + */ + function handleEndDocBlockTemplate($word, $pevent) + { + unset($this->p_vars['docblock_template']); + $this->publishEvent(PHPDOCUMENTOR_EVENT_NEWSTATE,PHPDOCUMENTOR_EVENT_END_DOCBLOCK_TEMPLATE); + $this->p_vars['event_stack']->popEvent(); + } + /**#@-*/ + /** + * Handles a new line in a DocBlock + * @param string token containing a newline \n + * @access private + */ + function handleCR($word) + { + $this->laststart = $this->p_flags['startline']; + if ($word == "\n" || $word == ".\n") + { + $this->p_flags['start_docblock'] = false; + $this->p_flags['newline'] = true; + $this->p_flags['valid_newline'] = false; + if ($this->p_flags['in_desc'] && !$this->p_flags['useperiod']) + { + if ($word == ".\n") + { + $this->p_flags['useperiod'] = true; + $this->p_vars['periodline'] = $this->p_vars['linecount']; + } + } + } else + { + if ($this->p_flags['valid_newline'] && strlen(trim($word))) + { + $this->p_flags['startline'] = false; + } + if ($this->p_flags['newline'] && ($word == '*' || $this->p_flags['start_docblock'])) + { + $this->p_flags['newline'] = false; + $this->p_flags['valid_newline'] = true; + if (!$this->p_flags['start_docblock']) + $this->p_vars['linecount']++; + $this->p_flags['startline'] = true; + $justset = true; +// debug('valid newline'); + } + } + } + + /** + * handler for DOCKEYWORD_DESC. + * this handler parses the short and long description of a dockeyword + * @access private + */ + + function handleDesc($word, $pevent) + { +// echo "|$word|\n"; + if ($this->p_flags['valid_newline']) + { + if ($word == '@' && $this->p_flags['startline']) + { + return $this->handleTag($word, $pevent); + } + if ($this->p_vars['last_word'] == ". " || $this->p_vars['last_word'] == ".\t") + { + $this->p_flags['useperiod'] = true; + $this->p_vars['periodline'] = $this->p_vars['linecount']; + $this->p_vars['linecount']++; + } + if (!isset($this->p_vars['line'][$this->p_vars['linecount']])) + { + $this->p_vars['line'][$this->p_vars['linecount']] = new parserStringWithInlineTags; + } + if ($this->p_flags['startline']) + { + if ($word[0] == ' ') $word = substr($word,1); +// $word = ltrim($word," \t"); + } + if ($word != '') $this->p_vars['line'][$this->p_vars['linecount']]->add($word); +// debug("DESC $word"); + } + $this->handleCR($word); + } + + /**#@+ + * @access private + * @param string token parsed from source + * @param integer parser constant from {@link Parser.inc} + */ + /** + * handler for DOCKEYWORD_TAGS. + * this handler recognizes @tags in DocBlocks and parses them for display + * I think this may be unused. We'll delete from 1.1 if so + */ + function handleTags($word, $pevent) + { + if ($this->p_flags['valid_newline']) + { +// debug("TAGS $word"); + } + $this->handleCR($word); + } + + /** + * handler for DOCKEYWORD. + * this handler recognizes @tags in DocBlocks and parses them for display + */ + function handleTag($word, $pevent) + { + if ($this->p_flags['in_desc'] && !$this->p_flags['valid_newline']) + { + $this->p_vars['event_stack']->popEvent(); + return $this->handleDesc($word, $pevent); + } +// if ($this->p_vars['last_word'] == '@') fancy_debug('here'.$word,$this->p_flags['startline'],$this->p_flags['in_tag']); + if ($this->p_vars['tagname'] == 'author') + { + if ($word == '<') + { + $this->p_vars['event_stack']->pushEvent(PARSER_EVENT_DOCKEYWORD_EMAIL); + return $this->handleDockeywordEmail($word, $pevent); + } + } + if ($this->checkEventPush( $word, $pevent)) return; + if ($this->p_vars['last_word'] == '@' && !$this->p_flags['startline'] && $this->p_flags['in_desc']) + { + // fix 1203445 + if (!isset($this->p_vars['line'][$this->p_vars['linecount']])) + { + $this->p_vars['line'][$this->p_vars['linecount']] = new parserStringWithInlineTags; + } + $this->p_vars['event_stack']->popEvent(); + $this->p_vars['line'][$this->p_vars['linecount']]->add('@'); + return $this->handleDesc($word, $pevent); + } elseif($this->p_vars['last_word'] == '@' && !strlen(trim($word)) && empty($this->p_vars['tagname']) && $this->p_flags['in_desc']) + { + // fix 1203445 + if (!isset($this->p_vars['line'][$this->p_vars['linecount']])) + { + $this->p_vars['line'][$this->p_vars['linecount']] = new parserStringWithInlineTags; + } + $pevent = $this->p_vars['event_stack']->popEvent(); + $this->p_vars['line'][$this->p_vars['linecount']]->add('@'); + return $this->handleDesc($word, $pevent); + } + if ($word == '@' && $this->p_flags['startline'] && $this->p_flags['in_tag']) + { + $this->wp->backupPos($word); + $white = $this->wp->returnWhiteSpace; + $this->wp->setWhitespace(true); + $word1 = $this->wp->getWord(); + $this->wp->backupPos($word1); + if (strlen(trim($word1))) + { + $this->endTag(); + } + $this->wp->getWord(); + $this->wp->setWhitespace($white); + } + $this->p_flags['in_tag'] = true; + $e = $this->checkEventPop($word, $pevent); + if (!$e) + { + if ($this->p_flags['valid_newline']) + { + if (($this->p_flags['startline'] || $this->laststart) && $word != '@') + { + if ($this->p_vars['last_word'] == '@') + { +// debug("TAGSTART $word"); + $this->p_flags['in_tag'] = true; + $this->p_vars['tagname'] = $word; + $this->p_flags['startline'] = false; + $this->p_vars['tag_value'] = new parserStringWithInlineTags; + } else + { +// debug("TAG1 $word"); + if (isset($this->tagHandlers[$this->p_vars['tagname']])) + $handler = $this->tagHandlers[$this->p_vars['tagname']]; + else $handler = $this->tagHandlers['*']; + $this->$handler($word); + } + } else + { + if (empty($this->p_vars['tagname'])) + { + if ($this->p_flags['in_desc']) + { + $this->p_flags['in_tag'] = false; + // fix 1203445 + if (!isset($this->p_vars['line'][$this->p_vars['linecount']])) + { + $this->p_vars['line'][$this->p_vars['linecount']] = + new parserStringWithInlineTags; + } + $this->p_vars['line'][$this->p_vars['linecount']]->add('@'); + $this->p_vars['event_stack']->popEvent(); + $this->handleCR($word); + return $this->handleDesc($word, $pevent); + } + } +// debug("TAG2 $word"); + if (isset($this->tagHandlers[$this->p_vars['tagname']])) + $handler = $this->tagHandlers[$this->p_vars['tagname']]; + else $handler = $this->tagHandlers['*']; + $this->$handler($word); + } + } + $this->handleCR($word); + } + $this->p_flags['in_desc'] = false; + if ($e) + { + $this->endTag(); + $this->wp->setWhitespace(false); + // walk back a word + $this->wp->backupPos($word); + $this->wp->setWhitespace(true); + } + } + /**#@-*/ + /** + * Called to clean up at the end of parsing a @tag in a docblock + */ + function endTag() + { + if (isset($this->tagHandlers[$this->p_vars['tagname']])) + $handler = $this->tagHandlers[$this->p_vars['tagname']]; + else $handler = $this->tagHandlers['*']; + $this->$handler(false); + $this->p_vars['tagname'] = ''; + $this->p_flags['startline'] = true; +// debug("ENDTAG"); + } + + /**#@+ + * Tag Handlers + * @param string + */ + /** + * Handles all standard tags that only have a description + */ + function defaultTagHandler($word) + { + if ($word !== false) + { + $this->p_vars['tag_value']->add($word); + } else + { + $this->p_vars[$this->p_vars['docblock_type']]->addKeyword($this->p_vars['tagname'],$this->p_vars['tag_value']); + } + } + + /** + * Handles tags like '@filesource' that only work in PHP 4.3.0+ + */ + function invalidTagHandler($word) + { + if ($word === false) + { + addError(PDERROR_TAG_NOT_HANDLED,$this->p_vars['tagname']); + } + } + + /** + * handles @package + * @tutorial tags.package.pkg + */ + function packageTagHandler($word) + { + if ($word !== false) + { + $this->p_vars['tag_value']->add($word); + } else + { + $this->p_vars[$this->p_vars['docblock_type']]->addKeyword($this->p_vars['tagname'],$this->p_vars['tag_value']); + $this->p_vars[$this->p_vars['docblock_type']]->setExplicitPackage(); + } + } + + /** + * handles @example + * @tutorial tags.example.pkg + */ + function exampleTagHandler($word) + { + if ($word !== false) + { + $this->p_vars['tag_value']->add($word); + } else + { + $this->p_vars[$this->p_vars['docblock_type']]->addExample($this->p_vars['tag_value'], $this->p_vars['parsepath']); + } + } + + /** + * handles @category + * @tutorial tags.category.pkg + */ + function categoryTagHandler($word) + { + if ($word !== false) + { + $this->p_vars['tag_value']->add($word); + } else + { + $this->p_vars[$this->p_vars['docblock_type']]->addKeyword($this->p_vars['tagname'],$this->p_vars['tag_value']); + $this->p_vars[$this->p_vars['docblock_type']]->setExplicitCategory(); + } + } + + /** + * handles @global + * @tutorial tags.global.pkg + */ + function globalTagHandler($word) + { + if ($word !== false) + { + // no data yet + $a = trim($this->p_vars['tag_value']->getString()); + if (empty($a)) + { + // not an empty word + if (trim($word) != '') + { + if (!empty($this->p_vars['global_type'])) + { + if (!$this->p_flags['define_global'] && !$this->p_flags['function_global']) + { + // @global type $GLOBALVARNAME ? + if (substr($word,0,1) == '$') + { + $this->p_flags['define_global'] = true; + $this->p_flags['function_global'] = false; + $this->p_vars['find_global'] = $word; + } else + { // function @global type description + $this->p_flags['function_global'] = true; + $this->p_flags['define_global'] = false; + $this->p_vars['tag_value']->add($word); + } + } else + { + if ($this->p_flags['define_global']) + { + $this->p_vars['find_global'] .= $word; + } elseif($this->p_flags['function_global']) + { + // description, to be added to the tag + $this->p_vars['tag_value']->add($word); + } + } + } else + { + $this->p_vars['global_type'] = $word; + } + } else $this->p_vars['tag_value']->add($word); // add whitespace to the tag description + } else + { // tag_value has data, must be a function @global + $this->p_vars['tag_value']->add($word); + } + } else + { // endtag + if ($this->p_flags['define_global']) + { + $this->findGlobal($this->p_vars['find_global']); + } + elseif ($this->p_flags['function_global']) + { + $this->p_vars[$this->p_vars['docblock_type']]->addFuncGlobal($this->p_vars['global_type'],$this->p_vars['tag_value']); + $this->p_vars['global_type'] = ''; + } + else + { + addError(PDERROR_MALFORMED_GLOBAL_TAG); + } + $this->p_vars['find_global'] = ''; + $this->p_flags['define_global'] = false; + $this->p_flags['function_global'] = false; + } + } + + /** + * handles @staticvar + * @tutorial tags.staticvar.pkg + */ + function staticvarTagHandler($word) + { + if ($word !== false) + { + if (!$this->p_vars['returntype']) $this->p_vars['returntype'] = trim($word); + else + { + if (!$this->p_vars['paramname']) + { + if (substr(trim($word),0,1) == "$") + $this->p_vars['paramname'] = trim($word); + else $this->p_vars['tag_value']->add($word); + } else + { + if (0)//strtolower($this->p_vars['paramtype']) == 'object') + { + if (strlen(trim($word))) + $this->p_vars['paramname'] = trim($word); + } else $this->p_vars['tag_value']->add($word); + } + } + } else + { + if (!$this->p_vars['paramname']) + $this->p_vars[$this->p_vars['docblock_type']]->addStaticVar(null,$this->p_vars['returntype'],$this->p_vars['tag_value']); + else + $this->p_vars[$this->p_vars['docblock_type']]->addStaticVar($this->p_vars['paramname'],$this->p_vars['returntype'],$this->p_vars['tag_value']); + $this->p_vars['paramname'] = false; + $this->p_vars['returntype'] = false; + } + } + + /** + * handles @uses + * @tutorial tags.uses.pkg + */ + function usesTagHandler($word) + { + if ($word !== false) + { + if (!$this->p_vars['seelement']) $this->p_vars['seelement'] = trim($word); + else + { + $this->p_vars['tag_value']->add($word); + } + } else + { + $see = new parserStringWithInlineTags; + $see->add($this->p_vars['seelement']); + $this->p_vars[$this->p_vars['docblock_type']]->addUses($see,$this->p_vars['tag_value']); + $this->p_vars['seelement'] = false; + } + } + + /** + * handles @param + * @tutorial tags.param.pkg + */ + function paramTagHandler($word) + { + if ($word !== false) + { + if (!$this->p_vars['returntype']) $this->p_vars['returntype'] = trim($word); + else + { + if (!$this->p_vars['paramname']) + { + if (substr(trim($word),0,1) == "$" || substr(trim($word),0,2) == "&$") + $this->p_vars['paramname'] = trim($word); + else $this->p_vars['tag_value']->add($word); + } else + { + if (0)//strtolower($this->p_vars['paramtype']) == 'object') + { + if (strlen(trim($word))) + $this->p_vars['paramname'] = trim($word); + } else $this->p_vars['tag_value']->add($word); + } + } + } else + { + if (!$this->p_vars['paramname']) + $this->p_vars[$this->p_vars['docblock_type']]->addParam(null,$this->p_vars['returntype'],$this->p_vars['tag_value']); + else + $this->p_vars[$this->p_vars['docblock_type']]->addParam($this->p_vars['paramname'],$this->p_vars['returntype'],$this->p_vars['tag_value']); + $this->p_vars['paramname'] = false; + $this->p_vars['returntype'] = false; + } + } + + /** + * handles @return + * @tutorial tags.return.pkg + */ + function returnTagHandler($word) + { + if ($word !== false) + { + if (!$this->p_vars['returntype']) $this->p_vars['returntype'] = trim($word); + else + { + if (strtolower($this->p_vars['returntype']) == 'object') + { + if (strlen(trim($word))) + $this->p_vars['returntype'] = trim($word); + } else $this->p_vars['tag_value']->add($word); + } + } else + { + $this->p_vars[$this->p_vars['docblock_type']]->addReturn($this->p_vars['returntype'],$this->p_vars['tag_value']); + $this->p_vars['returntype'] = false; + } + } + + /** + * handles @var + * @tutorial tags.var.pkg + */ + function varTagHandler($word) + { + if ($word) + { + if (!$this->p_vars['vartype']) $this->p_vars['vartype'] = trim($word); + else + { + if (strtolower($this->p_vars['vartype']) == 'object') + { + if (strlen(trim($word))) + $this->p_vars['vartype'] = trim($word); + } + else $this->p_vars['tag_value']->add($word); + } + } elseif ($word === false) + { + $this->p_vars[$this->p_vars['docblock_type']]->addVar($this->p_vars['vartype'],$this->p_vars['tag_value']); + $this->p_vars['vartype'] = false; + } + } + /**#@-*/ + /** @access private */ + function getSource() + { + $this->p_flags['get_source'] = true; + } + /**#@+ + * @access private + * @param string token parsed from source + * @param integer parser constant from {@link Parser.inc} + */ + /** + * handler for DOCKEYWORD_EMAIL. + * this handler recognizes angle brackets < and > surrounding an email address in an @author tag, + * and returns a mailto: hyperlink + */ + + function handleDockeywordEmail($word, $pevent) + { + //echo $this->wp->getPos() . ": |$word|\n"; + if (!$this->checkEventPop($word,$pevent) && $word != "<") + { + if (strstr($word,"@")) + { + $this->p_vars['tag_value']->add('<'); + $this->p_vars['tag_value']->add(new parserLinkInlineTag("mailto:$word",$word)); + $this->p_vars['tag_value']->add('>'); + } else { + $this->p_vars['tag_value']->add("<$word>"); + } + } + } + + /** + * handler for INLINE_DOCKEYWORD. + * this handler recognizes {@inline tags} like link, and parses them, replacing them directly + * in the text flow with their output. + */ + + function handleInlineDockeyword($word, $pevent) + { + // echo $this->wp->getPos() . ": |$word|\n"; + + // echo "docktype: $this->p_vars['inline_dockeyword_type']\n"; + if (!isset($this->p_vars['inline_dockeyword_type'])) $this->p_vars['inline_dockeyword_type'] = false; + if (!isset($this->p_vars['inline_dockeyword_data'])) $this->p_vars['inline_dockeyword_data'] = ''; + if (!$this->p_vars['inline_dockeyword_type']) + { + if (in_array($word,$this->allowableInlineTags)) + { + if ($word == '}') + $this->p_vars['inline_dockeyword_type'] = ''; + else + $this->p_vars['inline_dockeyword_type'] = strtolower($word); + $this->p_vars['whitesp'] = $this->wp->returnWhiteSpace; + $this->wp->setWhiteSpace(true); + } else { + if ($this->p_flags['in_desc']) + { + // fix 1203445 + if (!isset($this->p_vars['line'][$this->p_vars['linecount']])) + { + $this->p_vars['line'][$this->p_vars['linecount']] = + new parserStringWithInlineTags; + } + if ($word == '}') + { + $this->p_vars['line'][$this->p_vars['linecount']]->add('{@'); + } else + { + $this->p_vars['line'][$this->p_vars['linecount']]->add('{@'.$word); + } + } elseif($this->p_flags['in_tag']) + { + if ($word == '}') + $this->p_vars['tag_value']->add('{@'.$word); + else + $this->p_vars['tag_value']->add('{@'.$word); + } + $this->p_vars['event_stack']->popEvent(); + $this->p_vars['inline_dockeyword_type'] = false; + $this->p_vars['inline_dockeyword_data'] = ''; + return; + } + } else + { + if ($word != "}") + { + $this->p_vars['inline_dockeyword_data'] .= $word; + } + } + if ($this->checkEventPop($word,$pevent)) + { + $this->wp->setWhiteSpace($this->p_vars['whitesp']); + if ($this->p_vars['inline_dockeyword_type']=='link') + { + // support hyperlinks of any protocol + if (is_numeric(strpos($this->p_vars['inline_dockeyword_data'],'://')) || (strpos(trim($this->p_vars['inline_dockeyword_data']),'mailto:') === 0)) + { + // if there is more than 1 parameter, the stuff after the space is the hyperlink text + if (strpos(trim($this->p_vars['inline_dockeyword_data']),' ')) + { + $i1 = strpos(trim($this->p_vars['inline_dockeyword_data']),' ') + 1; + $link = substr(trim($this->p_vars['inline_dockeyword_data']),0,$i1 - 1); + $text = substr(trim($this->p_vars['inline_dockeyword_data']),$i1); + $this->p_vars['inline_dockeyword_data'] = new parserLinkInlineTag($link,$text); +// ''.$text.''; + } + else + { + $this->p_vars['inline_dockeyword_data'] = new parserLinkInlineTag($this->p_vars['inline_dockeyword_data'],$this->p_vars['inline_dockeyword_data']); + } +// ''.$this->p_vars['inline_dockeyword_data'].''; + } else + { + if (!strpos($this->p_vars['inline_dockeyword_data'],',')) + { + $testp = explode('#',$this->p_vars['inline_dockeyword_data']); + if (count($testp) - 1) + $this->p_vars['inline_dockeyword_data'] = new parserLinkInlineTag($this->p_vars['inline_dockeyword_data'],$testp[1]); + else + $this->p_vars['inline_dockeyword_data'] = new parserLinkInlineTag($this->p_vars['inline_dockeyword_data'],$this->p_vars['inline_dockeyword_data']); + } else + $this->p_vars['inline_dockeyword_data'] = new parserLinkInlineTag($this->p_vars['inline_dockeyword_data'],$this->p_vars['inline_dockeyword_data']); + } + } + if ($this->p_vars['inline_dockeyword_type'] == 'tutorial') + { + $this->p_vars['inline_dockeyword_data'] = new parserTutorialInlineTag($this->p_vars['inline_dockeyword_data'],$this->p_vars['inline_dockeyword_data']); + } + if ($this->p_vars['inline_dockeyword_type'] == 'source') + { + $this->getSource(); + $this->p_vars['inline_dockeyword_data'] = new parserSourceInlineTag($this->p_vars['inline_dockeyword_data']); + } + if ($this->p_vars['inline_dockeyword_type'] == 'inheritdoc') + { + $this->p_vars['inline_dockeyword_data'] = new parserInheritdocInlineTag(); + } + if ($word == '*/') + { + if (!isset($this->p_vars['inline_dockeyword_type'])) $this->p_vars['inline_dockeyword_type'] = ''; + if (!isset($this->p_vars['tagname'])) $this->p_vars['tagname'] = ''; + if (!isset($this->p_vars['tag_value']) || !is_object($this->p_vars['tag_value'])) $this->p_vars['tag_value'] = new parserStringWithInlineTags; + addError(PDERROR_UNTERMINATED_INLINE_TAG,$this->p_vars['inline_dockeyword_type'],$this->p_vars['tagname'],'@'.$this->p_vars['tagname'].' '.$this->p_vars['tag_value']->getString()); + // when we add the error class, raise error here: we reached the end of the docblock + $this->wp->backupPos($word); + } + if ($this->p_flags['in_desc']) + { + $this->p_vars['line'][$this->p_vars['linecount']]->add($this->p_vars['inline_dockeyword_data']); + $this->p_vars['inline_dockeyword_type'] = false; + $this->p_vars['inline_dockeyword_data'] = ''; + } + elseif ($this->p_flags['in_tag']) + { + $this->p_vars['tag_value']->add($this->p_vars['inline_dockeyword_data']); + $this->p_vars['inline_dockeyword_type'] = false; + $this->p_vars['inline_dockeyword_data'] = ''; + } + } + } + + /** + * handler for INCLUDE. + * this handler recognizes include/require/include_once/include_once statements, and publishes the + * data to Render + */ + + function handleInclude($word, $pevent) + { + if (!$this->p_flags['in_include']) + { + $this->p_vars['linenum'] = $this->wp->linenum; + } + $this->p_flags['in_include'] = true; + $a = $this->checkEventPush( $word, $pevent); + if (!$this->p_flags['includename_isset']) + { + $this->p_flags['includename_isset'] = true; + $this->p_vars['include_name'] = $this->p_vars['last_word']; + if ($a) + $this->p_vars['include_value'] = ''; + else + $this->p_vars['include_value'] = $word; + unset($this->p_vars['quote_data']); + } else + { + if (!$a) + { + if (empty($this->p_vars['include_params_data'])) + { + if (isset($this->p_vars['quote_data'])) + { + $this->p_vars['include_value'] .= '"'.$this->p_vars['quote_data'].'"'; + unset($this->p_vars['quote_data']); + } + if ($word != ';') + $this->p_vars['include_value'] .= $word; + } + } else + { + $this->p_vars['include_params_data'] = ''; + } + } + + if ($this->checkEventPop($word,$pevent)) + { + $this->p_vars['include'] = new parserInclude; + $this->p_vars['include']->setLineNumber($this->p_vars['linenum']); + $this->p_flags['in_include'] = false; + $this->p_vars['include']->setName($this->p_vars['include_name']); + $this->p_vars['include']->setValue($this->p_vars['include_value']); + $this->publishEvent(PHPDOCUMENTOR_EVENT_INCLUDE,$this->p_vars['include']); + $this->p_flags['includename_isset'] = false; + unset($this->p_vars['include']); + unset($this->p_vars['include_name']); + unset($this->p_vars['include_value']); + unset($this->p_vars['include_params_data']); + } + } + + /** + * handler for INCLUDE_PARAMS. + * this handler parses the contents of ( ) in include/require/include_once/include_once statements + */ + + function handleIncludeParams($word, $pevent) + { + $this->checkEventPush( $word, $pevent); + + $this->p_flags['include_parens'] = true; + if(!isset($this->p_vars['include_params_data'])) $this->p_vars['include_params_data'] = ''; + + if ($this->checkEventPop($word,$pevent)) + { + if (isset($this->p_vars['quote_data'])) + { + $this->p_vars['include_value'] = $this->p_vars['include_params_data'].'"'.$this->p_vars['quote_data'].'"'; + unset($this->p_vars['quote_data']); + } else { + if (!empty($this->p_vars['include_params_data'])) + $this->p_vars['include_value'] = $this->p_vars['include_params_data']; + else + $this->p_vars['include_value'] = trim($this->p_vars['last_word']); + } + } + if (isset($this->p_vars['quote_data'])) + { + $this->p_vars['include_params_data'] .= '"'.$this->p_vars['quote_data'].'"'; + unset($this->p_vars['quote_data']); + } + if (($word != "'") && ($word != '"')) + $this->p_vars['include_params_data'] .= $word; + } + + /** + * handler for INCLUDE_PARAMS_PARENTHESIS. + * this handler takes all parenthetical statements within file in: + * include statement include(file), and handles them properly + */ + + function handleIncludeParamsParenthesis($word, $pevent) + { + if (isset($this->p_vars['quote_data'])) + { + $this->p_vars['include_params_data'] .= '"'.$this->p_vars['quote_data'].'"'; + unset($this->p_vars['quote_data']); + } + $this->p_vars['include_params_data'] .= $word; + $this->checkEventPush( $word, $pevent); + $this->checkEventPop( $word, $pevent); + } + /**#@-*/ + /** + * this function checks whether parameter $word is a token for pushing a new event onto the Event Stack. + * @return mixed returns false, or the event number + */ + + function checkEventPush($word,$pevent) + { + $e = false; + if (isset($this->pushEvent[$pevent])) + { + if (isset($this->pushEvent[$pevent][strtolower($word)])) + $e = $this->pushEvent[$pevent][strtolower($word)]; + } + if ($e) + { + $this->p_vars['event_stack']->pushEvent($e); + return $e; + } else { + return false; + } + } + + /** + * this function checks whether parameter $word is a token for popping the current event off of the Event Stack. + * @return mixed returns false, or the event number popped off of the stack + */ + + function checkEventPop($word,$pevent) + { + if (!isset($this->popEvent[$pevent])) return false; + if (in_array(strtolower($word),$this->popEvent[$pevent])) + { + return $this->p_vars['event_stack']->popEvent(); + } else { + return false; + } + } + + /** + * setup the parser tokens, and the pushEvent/popEvent arrays + * @see $tokens, $pushEvent, $popEvent + */ + + function setupStates() + { + $this->tokens[STATE_PHPCODE] = array(" ", "\t",";","?>","","/**#@+","/**#@-*/","/**", "//","/*","#","\r\n","\n","\r","(",'<<<','"',"'"); + $this->tokens[STATE_QUOTE] = array("\\\"","\\\\","\""); + $this->tokens[STATE_LOGICBLOCK] = array("{","}","\"","'","/*","//","#","?>","",'<<<','global','static'); + $this->tokens[STATE_FUNC_GLOBAL] = array("\"","'","/*","//","#",";",","); + $this->tokens[STATE_STATIC_VAR] = array("\"","'","/*","//","#",";",",",'=','array'); + $this->tokens[STATE_STATIC_VAR_VALUE] = array("/*","//","#"," ","\t",";","=","\"","'","array",","); + $this->tokens[STATE_NOEVENTS] = array("'); + $this->tokens[STATE_COMMENTBLOCK] = array("*/","\n"); + $this->tokens[STATE_COMMENT] = array("\r\n","\r","\n"); + $this->tokens[STATE_DEFINE] = array(" ","(",";"); + $this->tokens[STATE_DEFINE_PARAMS] = array("/*","//","#",",",")"," ","'","\"","("); + $this->tokens[STATE_DEFINE_PARAMS_PARENTHESIS] = array("(","'","\"",")"); + $this->tokens[STATE_FUNCTION_PARAMS] = array("/*","//","#","\"",",",")","="," ","'","("); + $this->tokens[STATE_SINGLEQUOTE] = array("'","\\'","\\\\"); + $this->tokens[STATE_CLASS] = array(" ", "\t", "?>", "", ";", "}", "{", + "/**#@+", "/**#@-*/", "/**", "//", "/*", "#", + "\r\n", "\n", "\r","("); + $this->tokens[STATE_DOCBLOCK] = array("*/","*","@","\r\n","\n","\r",". ",".\n",".\t",'{@'); + $this->tokens[STATE_DOCBLOCK_TEMPLATE] = array("*/","*","@","\r\n","\n","\r",". ",".\n",".\t",'{@'); + $this->tokens[STATE_DOCKEYWORD] = array("@","*/","*","\n","\r\n","\r","\t"," ","<",">",'{@'); + $this->tokens[STATE_INLINE_DOCKEYWORD] = array("{@","}","\t"," ","*/"); + $this->tokens[STATE_DOCKEYWORD_EMAIL] = array(">","\n","\r\n","\r"); + $this->tokens[STATE_VAR] = array("/*","//","#"," ","\t",";","=",",","\"","'","array"); + $this->tokens[STATE_GLOBAL] = array("/*","//","#"," ","\t",";","=","\"","'"); + $this->tokens[STATE_GLOBAL_VALUE] = array("/*","//","#"," ","\t",";","=","\"","'","array"); + $this->tokens[STATE_ARRAY] = array("/*","//","#","(",")","\"","'","array"); + $this->tokens[STATE_FUNCTION] = array("(","{","}"," ","\t","&","/*","//","#"); + $this->tokens[STATE_OUTPHP] = array("'); + $this->tokens[STATE_EOFQUOTE] = array(" ","\t","\n"); + $this->tokens[STATE_ESCAPE] = false;// this tells the word parser to just cycle + $this->tokens[STATE_INCLUDE] = array(" ","(",";","'",'"'); + $this->tokens[STATE_INCLUDE_PARAMS] = array("/*",")"," ","'","\"","("); + $this->tokens[STATE_INCLUDE_PARAMS_PARENTHESIS] = array("(","'","\"",")"); + + // 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_LOGICBLOCK] = + array( + "\"" => PARSER_EVENT_QUOTE, + "'" => PARSER_EVENT_SINGLEQUOTE, + "//" => PARSER_EVENT_COMMENT, + "#" => PARSER_EVENT_COMMENT, + "global" => PARSER_EVENT_FUNC_GLOBAL, + "static" => PARSER_EVENT_STATIC_VAR, + "/*" => PARSER_EVENT_COMMENTBLOCK, + "{" => PARSER_EVENT_LOGICBLOCK, + "?>" => PARSER_EVENT_OUTPHP, + "" => PARSER_EVENT_OUTPHP, + "<<<" => PARSER_EVENT_EOFQUOTE + ); + $this->popEvent[PARSER_EVENT_LOGICBLOCK] = array("}"); +########################## + + $this->pushEvent[PARSER_EVENT_FUNC_GLOBAL] = + array( + "\"" => PARSER_EVENT_QUOTE, + "'" => PARSER_EVENT_SINGLEQUOTE, + "//" => PARSER_EVENT_COMMENT, + "#" => PARSER_EVENT_COMMENT, + "/*" => PARSER_EVENT_COMMENTBLOCK, + ); + $this->popEvent[PARSER_EVENT_FUNC_GLOBAL] = array(";"); +########################## + + $this->pushEvent[PARSER_EVENT_STATIC_VAR] = + array( + "\"" => PARSER_EVENT_QUOTE, + "'" => PARSER_EVENT_SINGLEQUOTE, + "//" => PARSER_EVENT_COMMENT, + "#" => PARSER_EVENT_COMMENT, + "/*" => PARSER_EVENT_COMMENTBLOCK, + "=" => PARSER_EVENT_STATIC_VAR_VALUE, + ); + $this->popEvent[PARSER_EVENT_STATIC_VAR] = array(";"); +########################## + + $this->pushEvent[PARSER_EVENT_STATIC_VAR_VALUE] = + array( + "\"" => PARSER_EVENT_QUOTE, + "'" => PARSER_EVENT_SINGLEQUOTE, + "array" => PARSER_EVENT_ARRAY, + "/*" => PARSER_EVENT_COMMENTBLOCK, + "//" => PARSER_EVENT_COMMENT, + "#" => PARSER_EVENT_COMMENT + ); + $this->popEvent[PARSER_EVENT_STATIC_VAR_VALUE] = array(";",","); +########################## + + $this->pushEvent[PARSER_EVENT_NOEVENTS] = + array( + " PARSER_EVENT_PHPCODE, + " PARSER_EVENT_PHPCODE, + '" => PARSER_EVENT_OUTPHP, + ); +########################## + + $this->pushEvent[PARSER_EVENT_FUNCTION] = + array( + "(" => PARSER_EVENT_FUNCTION_PARAMS, + "//" => PARSER_EVENT_COMMENT, + "#" => PARSER_EVENT_COMMENT, + "/*" => PARSER_EVENT_COMMENTBLOCK, + "{" => PARSER_EVENT_LOGICBLOCK + ); + $this->popEvent[PARSER_EVENT_FUNCTION] = array("}"); +########################## + + $this->pushEvent[PARSER_EVENT_DOCBLOCK] = + array( + "@" => PARSER_EVENT_DOCKEYWORD, + "{@" => PARSER_EVENT_INLINE_DOCKEYWORD + ); + $this->popEvent[PARSER_EVENT_DOCBLOCK] = array("*/"); +########################## + + $this->pushEvent[PARSER_EVENT_DOCBLOCK_TEMPLATE] = + array( + "@" => PARSER_EVENT_DOCKEYWORD, + "{@" => PARSER_EVENT_INLINE_DOCKEYWORD + ); + $this->popEvent[PARSER_EVENT_DOCBLOCK_TEMPLATE] = array("*/"); +########################## + + $this->pushEvent[PARSER_EVENT_CLASS] = + array( + "function" => PARSER_EVENT_FUNCTION, + "var" => PARSER_EVENT_VAR, + "/**" => PARSER_EVENT_DOCBLOCK, + "/**#@+" => PARSER_EVENT_DOCBLOCK_TEMPLATE, + "/**#@-*/" => PARSER_EVENT_END_DOCBLOCK_TEMPLATE, + "//" => PARSER_EVENT_COMMENT, + "/*" => PARSER_EVENT_COMMENTBLOCK, + "#" => PARSER_EVENT_COMMENT, + "?>" => PARSER_EVENT_OUTPHP, + "" => PARSER_EVENT_OUTPHP, + ); + $this->popEvent[PARSER_EVENT_CLASS] = array("}"); +########################## + + $this->pushEvent[PARSER_EVENT_DEFINE] = + array( + "/*" => PARSER_EVENT_COMMENTBLOCK, + "(" => PARSER_EVENT_DEFINE_PARAMS + ); + $this->popEvent[PARSER_EVENT_DEFINE] = array(";"); +########################## + + $this->pushEvent[PARSER_EVENT_INCLUDE] = + array( + "/*" => PARSER_EVENT_COMMENTBLOCK, + "(" => PARSER_EVENT_INCLUDE_PARAMS, + "'" => PARSER_EVENT_SINGLEQUOTE, + '"' => PARSER_EVENT_QUOTE, + ); + $this->popEvent[PARSER_EVENT_INCLUDE] = array(";"); +########################## + + $this->pushEvent[PARSER_EVENT_DEFINE_PARAMS] = + array( + "(" => PARSER_EVENT_DEFINE_PARAMS_PARENTHESIS, + "'" => PARSER_EVENT_SINGLEQUOTE, + '"' => PARSER_EVENT_QUOTE, + "/*" => PARSER_EVENT_COMMENTBLOCK, + "//" => PARSER_EVENT_COMMENT, + "#" => PARSER_EVENT_COMMENT + ); + $this->popEvent[PARSER_EVENT_DEFINE_PARAMS] = array(")"); +########################## + + $this->pushEvent[PARSER_EVENT_INCLUDE_PARAMS] = + array( + "(" => PARSER_EVENT_INCLUDE_PARAMS_PARENTHESIS, + "'" => PARSER_EVENT_SINGLEQUOTE, + '"' => PARSER_EVENT_QUOTE, + ); + $this->popEvent[PARSER_EVENT_INCLUDE_PARAMS] = array(")"); +########################## + + $this->pushEvent[PARSER_EVENT_DEFINE_PARAMS_PARENTHESIS] = + array( + "(" => PARSER_EVENT_DEFINE_PARAMS_PARENTHESIS, + "'" => PARSER_EVENT_SINGLEQUOTE, + '"' => PARSER_EVENT_QUOTE, + ); + $this->popEvent[PARSER_EVENT_DEFINE_PARAMS_PARENTHESIS] = array(")"); +########################## + + $this->pushEvent[PARSER_EVENT_INCLUDE_PARAMS_PARENTHESIS] = + array( + "(" => PARSER_EVENT_INCLUDE_PARAMS_PARENTHESIS, + "'" => PARSER_EVENT_SINGLEQUOTE, + '"' => PARSER_EVENT_QUOTE, + ); + $this->popEvent[PARSER_EVENT_INCLUDE_PARAMS_PARENTHESIS] = array(")"); +########################## + + $this->pushEvent[PARSER_EVENT_VAR] = + array( + "\"" => PARSER_EVENT_QUOTE, + "'" => PARSER_EVENT_SINGLEQUOTE, + "array" => PARSER_EVENT_ARRAY, + "/*" => PARSER_EVENT_COMMENTBLOCK, + "//" => PARSER_EVENT_COMMENT, + "#" => PARSER_EVENT_COMMENT + ); + $this->popEvent[PARSER_EVENT_VAR] = array(";"); +########################## + + $this->pushEvent[PARSER_EVENT_DEFINE_GLOBAL] = + array( + "=" => PARSER_EVENT_GLOBAL_VALUE, + "\"" => PARSER_EVENT_QUOTE, + "'" => PARSER_EVENT_SINGLEQUOTE, + "/*" => PARSER_EVENT_COMMENTBLOCK, + "//" => PARSER_EVENT_COMMENT, + "#" => PARSER_EVENT_COMMENT + ); + $this->popEvent[PARSER_EVENT_DEFINE_GLOBAL] = array(";"); +########################## + + $this->pushEvent[PARSER_EVENT_GLOBAL_VALUE] = + array( + "\"" => PARSER_EVENT_QUOTE, + "'" => PARSER_EVENT_SINGLEQUOTE, + "array" => PARSER_EVENT_ARRAY, + "/*" => PARSER_EVENT_COMMENTBLOCK, + "//" => PARSER_EVENT_COMMENT, + "#" => PARSER_EVENT_COMMENT + ); + $this->popEvent[PARSER_EVENT_GLOBAL_VALUE] = array(";"); +########################## + + $this->pushEvent[PARSER_EVENT_COMMENT] = + array( + "\\" => PARSER_EVENT_ESCAPE + ); + $this->popEvent[PARSER_EVENT_COMMENT] = array("\n"); +########################## + + $this->popEvent[PARSER_EVENT_COMMENTBLOCK] = array("*/"); +########################## + $this->pushEvent[PARSER_EVENT_SINGLEQUOTE] = + array( + "\\" => PARSER_EVENT_ESCAPE + ); + + $this->popEvent[PARSER_EVENT_SINGLEQUOTE] = array("'"); +########################## + $this->pushEvent[PARSER_EVENT_FUNCTION_PARAMS] = + array( + "\"" => PARSER_EVENT_QUOTE, + "'" => PARSER_EVENT_SINGLEQUOTE, + "array" => PARSER_EVENT_ARRAY, + "/*" => PARSER_EVENT_COMMENTBLOCK, + "//" => PARSER_EVENT_COMMENT, + "#" => PARSER_EVENT_COMMENT + ); + $this->popEvent[PARSER_EVENT_FUNCTION_PARAMS] = array(")"); +########################## + $this->pushEvent[PARSER_EVENT_DOCKEYWORD] = + array( +// "<" => PARSER_EVENT_DOCKEYWORD_EMAIL, + "{@" => PARSER_EVENT_INLINE_DOCKEYWORD, + ); + + $this->popEvent[PARSER_EVENT_DOCKEYWORD] = array("*/"); +########################## + + $this->popEvent[PARSER_EVENT_INLINE_DOCKEYWORD] = array("}","*/"); +########################## + + $this->popEvent[PARSER_EVENT_OUTPHP] = array("'); +########################## + + $this->popEvent[PARSER_EVENT_DOCKEYWORD_EMAIL] = array(">","\n"); + +########################## + $this->pushEvent[PARSER_EVENT_ARRAY] = + array( + "\"" => PARSER_EVENT_QUOTE, + "'" => PARSER_EVENT_SINGLEQUOTE, + "array" => PARSER_EVENT_ARRAY, + "/*" => PARSER_EVENT_COMMENTBLOCK, + "//" => PARSER_EVENT_COMMENT, + "#" => PARSER_EVENT_COMMENT + ); + $this->popEvent[PARSER_EVENT_ARRAY] = array(")"); +########################## + } + + /** + * tell the parser's WordParser {@link $wp} to set up tokens to parse words by. + * tokens are word separators. In English, a space or punctuation are examples of tokens. + * In PHP, a token can be a ;, a parenthesis, or even the word "function" + * @param $value integer an event number + * @see WordParser + */ + + function configWordParser($e) + { + $this->wp->setSeperator($this->tokens[($e + 100)]); + } + + /** + * Debugging function, takes an event number and attempts to return its name + * @param $value integer an event number + */ + + + function getParserEventName ($value) + { + $lookup = array( + PARSER_EVENT_NOEVENTS => "PARSER_EVENT_NOEVENTS", + PARSER_EVENT_PHPCODE => "PARSER_EVENT_PHPCODE", + PARSER_EVENT_DOCBLOCK => "PARSER_EVENT_DOCBLOCK", + PARSER_EVENT_FUNCTION => "PARSER_EVENT_FUNCTION", + PARSER_EVENT_CLASS => "PARSER_EVENT_CLASS", + PARSER_EVENT_DEFINE => "PARSER_EVENT_DEFINE", + PARSER_EVENT_DEFINE_PARAMS => "PARSER_EVENT_DEFINE_PARAMS", + PARSER_EVENT_COMMENT => "PARSER_EVENT_COMMENT", + PARSER_EVENT_COMMENTBLOCK => "PARSER_EVENT_COMMENTBLOCK", + PARSER_EVENT_ESCAPE => "PARSER_EVENT_ESCAPE", + PARSER_EVENT_QUOTE => "PARSER_EVENT_QUOTE", + PARSER_EVENT_FUNCTION_PARAMS => "PARSER_EVENT_FUNCTION_PARAMS", + PARSER_EVENT_SINGLEQUOTE => "PARSER_EVENT_SINGLEQUOTE", + PARSER_EVENT_VAR => "PARSER_EVENT_VAR", + PARSER_EVENT_LOGICBLOCK => "PARSER_EVENT_LOGICBLOCK", + PARSER_EVENT_OUTPHP => "PARSER_EVENT_OUTPHP", + PARSER_EVENT_DOCKEYWORD => "PARSER_EVENT_DOCKEYWORD", + PARSER_EVENT_DOCKEYWORD_EMAIL => "PARSER_EVENT_DOCKEYWORD_EMAIL", + PARSER_EVENT_ARRAY => "PARSER_EVENT_ARRAY", + PARSER_EVENT_INLINE_DOCKEYWORD => "PARSER_EVENT_INLINE_DOCKEYWORD", + PARSER_EVENT_EOFQUOTE => "PARSER_EVENT_EOFQUOTE", + PARSER_EVENT_INCLUDE => "PARSER_EVENT_INCLUDE", + PARSER_EVENT_INCLUDE_PARAMS => "PARSER_EVENT_INCLUDE_PARAMS", + PARSER_EVENT_INCLUDE_PARAMS_PARENTHESIS => "PARSER_EVENT_INCLUDE_PARAMS_PARENTHESIS", + PARSER_EVENT_DEFINE_PARAMS_PARENTHESIS => "PARSER_EVENT_DEFINE_PARAMS_PARENTHESIS", + PARSER_EVENT_DEFINE_GLOBAL => "PARSER_EVENT_DEFINE_GLOBAL", + PARSER_EVENT_GLOBAL_VALUE => "PARSER_EVENT_GLOBAL_VALUE", + PARSER_EVENT_FUNC_GLOBAL => "PARSER_EVENT_FUNC_GLOBAL", + PARSER_EVENT_STATIC_VAR => "PARSER_EVENT_STATIC_VAR", + PARSER_EVENT_DOCBLOCK_TEMPLATE => "PARSER_EVENT_DOCBLOCK_TEMPLATE", + PARSER_EVENT_END_DOCBLOCK_TEMPLATE => "PARSER_EVENT_END_DOCBLOCK_TEMPLATE", + PARSER_EVENT_METHOD_LOGICBLOCK => 'PARSER_EVENT_METHOD_LOGICBLOCK', + PARSER_EVENT_CLASS_MEMBER => 'PARSER_EVENT_CLASS_MEMBER', + PARSER_EVENT_METHOD => 'PARSER_EVENT_METHOD', + PARSER_EVENT_QUOTE_VAR => 'PARSER_EVENT_QUOTE_VAR', + PARSER_EVENT_ACCESS_MODIFIER => 'PARSER_EVENT_ACCESS_MODIFIER', + PARSER_EVENT_IMPLEMENTS => 'PARSER_EVENT_IMPLEMENTS', + PARSER_EVENT_CLASS_CONSTANT => 'PARSER_EVENT_CLASS_CONSTANT', + PARSER_EVENT_VAR_ARRAY => 'PARSER_EVENT_VAR_ARRAY', + PARSER_EVENT_VAR_ARRAY_COMMENT =>'PARSER_EVENT_VAR_ARRAY_COMMENT', + ); + if (isset($lookup[$value])) + return $lookup[$value]; + else return $value; + } +} + +/** + * Global package page parser + * + * @deprecated in favor of tutorials + * @tutorial tutorials.pkg + * @package phpDocumentor + * @subpackage Parsers + */ +class ppageParser extends Parser +{ + /** @var string */ + var $package = false; + /** @var string */ + var $subpackage = ''; + /** + * set up invariant Parser variables + */ + function ppageParser() + { + Parser::Parser(); + $this->allowableInlineTags = $GLOBALS['_phpDocumentor_inline_tutorial_tags_allowed']; + $this->eventHandlers = array(); + $this->eventHandlers[PARSER_EVENT_NOEVENTS] = 'defaultHandler'; + $this->eventHandlers[PARSER_EVENT_INLINE_DOCKEYWORD] = 'handleInlineDocKeyword'; + } + + /** + * set up invariant Parser variables + */ + function setupStates() + { + $this->tokens[STATE_NOEVENTS] = array("{@","}"); + $this->tokens[STATE_INLINE_DOCKEYWORD] = array("{@","}","\t"," "); + +########################## + + $this->pushEvent[PARSER_EVENT_NOEVENTS] = + array( + "{@" => PARSER_EVENT_INLINE_DOCKEYWORD + ); +########################## + + $this->popEvent[PARSER_EVENT_INLINE_DOCKEYWORD] = array("}"); + } + + /** + * Parse a new file + * + * @param string $parse_data + * @param string $package + * @param int $subpackage + * @return mixed false or parsed data + */ + function parse (&$parse_data,$xml,$package = 'default',$subpackage = '',$tutorial = '', + $category='default', $path='') + { + $this->setupStates(); + $this->p_vars['total'] = new parserPackagePage($package,$xml); + $this->p_vars['tutorial'] = $tutorial; + $this->_path = $path; + $this->category = $category; + $this->package = $package; + if (!isset($subpackage) || !$subpackage) $subpackage = ''; + $this->subpackage = $subpackage; + if (strlen($parse_data) == 0) + { + return false; + } + + // initialize variables so E_ALL error_reporting doesn't complain + $pevent = 0; + $word = 0; + $this->p_vars['event_stack'] = new EventStack; + // change this to a new ParserStringWithInlineTags, and change all $total .= blah to $total->add(blah) + // then modify phpDocumentor_IntermediateParser->Convert to convert all package pages (the package page handler in phpDocumentor_IntermediateParser should + // save them all in a variable) to perform the linking. then, remove the legacy code from handleDocBlock + // and handleClass in Render.inc, and do a loop that converts each package page, and passes it to handleEvent + // just like Converter::walk does with the other elements. The only other addition that might be good is a + // new descendant of parserElement parserPackagePage that contains the data and stuff. Hope this helps :) + $total = ''; + + $this->wp->setup($parse_data); + + $this->p_flags['reset_quote_data'] = 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); + } + + if (!$xml) + $this->publishEvent(PHPDOCUMENTOR_EVENT_NEWSTATE,($pevent + 100)); + + + $this->p_vars['last_word'] = $word; + $word = $this->wp->getWord(); + + if (0)//PHPDOCUMENTOR_DEBUG == true) + { + echo "LAST: |" . $this->p_vars['last_word'] . "|\n"; + echo "PEVENT: " . $this->getParserEventName($pevent) . "\n"; + echo $this->wp->getPos() . ": |$word|\n"; + } + if (isset($this->eventHandlers[$pevent])) + { + $handle = $this->eventHandlers[$pevent]; + $this->$handle($word, $pevent); + } + } while (!($word === false)); + if (!$xml) + $this->PublishEvent(PHPDOCUMENTOR_EVENT_PACKAGEPAGE,$this->p_vars['total']); + else + return $this->p_vars['total']->value; + } + + /** + * Handles all non-inline tags + * + * @param string token + * @param integer parser event + */ + function defaultHandler($word, $pevent) + { + if (!$this->checkEventPush( $word, $pevent)) + { + if ($word) $this->p_vars['total']->add($word); + } + } + + /** + * handler for INLINE_DOCKEYWORD. + * this handler recognizes {@inline tags} like link, and parses them, replacing them directly + * in the text flow with their output. + * @param string token + * @param integer parser event + */ + + function handleInlineDockeyword($word, $pevent) + { + // echo $this->wp->getPos() . ": |$word|\n"; + + // echo "docktype: $this->p_vars['inline_dockeyword_type']\n"; + if (!isset($this->p_vars['inline_dockeyword_type'])) $this->p_vars['inline_dockeyword_type'] = false; + if (!isset($this->p_vars['inline_dockeyword_data'])) $this->p_vars['inline_dockeyword_data'] = ''; + if (!$this->p_vars['inline_dockeyword_type']) + { + if (in_array($word,$this->allowableInlineTags)) + { + $this->p_vars['inline_dockeyword_type'] = strtolower($word); + $this->p_vars['whitesp'] = $this->wp->returnWhiteSpace; + $this->wp->setWhiteSpace(true); + } else { + if ($word == '}') + $this->p_vars['total']->add('{@'); + else + { + $this->p_vars['total']->add('{@'.$word); + $this->p_vars['event_stack']->popEvent(); + } + $this->p_vars['inline_dockeyword_type'] = false; + $this->p_vars['inline_dockeyword_data'] = ''; + } + } else + { + if ($word != "}") + { + $this->p_vars['inline_dockeyword_data'] .= $word; + } + } + if ($this->checkEventPop($word,$pevent)) + { + $this->wp->setWhiteSpace($this->p_vars['whitesp']); + if ($this->p_vars['inline_dockeyword_type']=='link') + { + // support hyperlinks of any protocol + if (is_numeric(strpos($this->p_vars['inline_dockeyword_data'],'://')) || (strpos(trim($this->p_vars['inline_dockeyword_data']),'mailto:') === 0)) + { + // if there is more than 1 parameter, the stuff after the space is the hyperlink text + if (strpos(trim($this->p_vars['inline_dockeyword_data']),' ')) + { + $i1 = strpos(trim($this->p_vars['inline_dockeyword_data']),' ') + 1; + $link = substr(trim($this->p_vars['inline_dockeyword_data']),0,$i1 - 1); + $text = substr(trim($this->p_vars['inline_dockeyword_data']),$i1); + $this->p_vars['inline_dockeyword_data'] = new parserLinkInlineTag($link,$text); +// ''.$text.''; + } + else + { + $this->p_vars['inline_dockeyword_data'] = new parserLinkInlineTag($this->p_vars['inline_dockeyword_data'],$this->p_vars['inline_dockeyword_data']); + } +// ''.$this->p_vars['inline_dockeyword_data'].''; + } else + { + $testp = explode('#',$this->p_vars['inline_dockeyword_data']); + if (count($testp) - 1) $this->p_vars['inline_dockeyword_data'] = $testp[1]; + $this->p_vars['inline_dockeyword_data'] = new parserLinkInlineTag($this->p_vars['inline_dockeyword_data'],$this->p_vars['inline_dockeyword_data']); + } + } + if ($this->p_vars['inline_dockeyword_type']=='id') + { + $this->p_vars['inline_dockeyword_data'] = new parserIdInlineTag($this->category,$this->package,$this->subpackage,$this->p_vars['tutorial'],trim($this->p_vars['inline_dockeyword_data'])); + } + if ($this->p_vars['inline_dockeyword_type'] == 'tutorial') + { + $this->p_vars['inline_dockeyword_data'] = new parserTutorialInlineTag($this->p_vars['inline_dockeyword_data'],$this->p_vars['inline_dockeyword_data']); + } + if ($this->p_vars['inline_dockeyword_type'] == 'toc') + { + $this->p_vars['inline_dockeyword_data'] = new parserTocInlineTag(); + } + if ($this->p_vars['inline_dockeyword_type'] == 'example') + { + $example = + new parserExampleInlineTag($this->p_vars['inline_dockeyword_data'], $this->_path, true); + $this->p_vars['total']->add($example->getProgramListing()); + } else + { + $this->p_vars['total']->add($this->p_vars['inline_dockeyword_data']); + } + $this->p_vars['inline_dockeyword_type'] = false; + $this->p_vars['inline_dockeyword_data'] = ''; + } + } +} +?> diff --git a/buildscripts/PhpDocumentor/phpDocumentor/ParserData.inc b/buildscripts/PhpDocumentor/phpDocumentor/ParserData.inc new file mode 100644 index 00000000..d7d0f285 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/ParserData.inc @@ -0,0 +1,725 @@ + + * @since 1.0rc1 + * @version $Id: ParserData.inc,v 1.1 2005/10/17 18:36:57 jeichorn Exp $ + */ +/** + * Contains information about a PHP file, used to group procedural elements + * together. + * @package phpDocumentor + * @subpackage ParserData + * @author Greg Beaver + * @since 1.0rc1 + * @version $Id: ParserData.inc,v 1.1 2005/10/17 18:36:57 jeichorn Exp $ + */ +class parserPage +{ + /** + * Type is used by many functions to skip the hassle of if + * phpDocumentor_get_class($blah) == 'parserBlah' + * @var string + */ + var $type = 'page'; + /** + * not implemented in this version, will be used to link xml output pages + * @var string + */ + var $id = ''; + /** + * filename.ext (no path) + * @var string + */ + var $file = ''; + /** + * relative source location + * @var string + */ + var $sourceLocation = ''; + /** + * phpdoc-safe name (only letters, numbers and _) + * @var string + */ + var $name = ''; + /** + * @var string + */ + var $category = 'default'; + /** + * @var string + */ + var $package = 'default'; + /** + * @var string + */ + var $subpackage = ''; + /** + * @var string + */ + var $parserVersion = PHPDOCUMENTOR_VER; + /** + * not implemented yet + * file modification date, will be used for makefiles + * @var string + */ + var $modDate = ''; + /** + * @var string full path this page represents + */ + var $path = ''; + /** + * Tokenized source code of the file + * @var array + */ + var $source = array(); + /** + * Used to limit output, contains contents of --packageoutput commandline. + * Does not increase parsing time. Use --ignore for that + * @see phpDocumentor_IntermediateParser::$packageoutput, Converter::$package_output + * @var mixed either false or an array of packages + */ + var $packageOutput = false; + + /** + * sets package to default package + * @global string default package name + */ + function parserPage() + { + global $phpDocumentor_DefaultPackageName; + $this->package = $GLOBALS['phpDocumentor_DefaultPackageName']; + } + + /** + * @return string always "page" + */ + function getType() + { + return 'page'; + } + + /** + * Sets the source code of the file for highlighting. + * + * PHP 4.3.0+ passes an array of tokenizer tokens by line number. PHP + * 4.2.3- passes a string to be passed to {@link highlight_string()} + * @param string|array + */ + function setSource($source) + { + $this->source = $source; + } + + /** + * Sets the name to display in documentation (can be an alias set with @name) + * @param string $file + */ + function setFile($file) + { + $this->file = $file; + } + + /** + * @return string filename.ext or @name alias + */ + function getFile() + { + if (!isset($this->file)) return false; + return $this->file; + } + + /** + * @param string $path full path to file + */ + function setPath($path) + { + // look for special windows case + if(SMART_PATH_DELIMITER === '\\') + $this->path = strtr($path,'/','\\'); + else + $this->path = $path; + } + + /** + * @return string fully delimited path (OS-dependent format) + */ + function getPath() + { + if (!isset($this->path)) return false; + return $this->path; + } + + /** + * @param array $packages array of packages to display in documentation (package1,package2,...) + * @see phpDocumentor_IntermediateParser::$packageoutput + */ + function setPackageOutput($packages) + { + $this->packageOutput = $packages; + } + + /** + * @return array array of packages (package1,package2,...) + * @see phpDocumentor_IntermediateParser::$packageoutput + */ + function getPackageOutput() + { + return $this->packageOutput; + } + + /** + * @param string $name phpdoc-safe name (only _, numbers and letters) set by Parser::parse() + * @see Parser::parse() + */ + function setName($name) + { + $this->name = $name; + } + + /** + * @return string phpdoc-safe name (only _, numbers and letters) + */ + function getName() + { + if (!isset($this->name)) return false; + return $this->name; + } + + /** + * @param string $source path of this file relative to program root + */ + function setSourceLocation($source) + { + $this->sourceLocation = $source; + } + + /** + * @param Converter + * @param boolean if this parameter is true, it will truncate the source location to the + * subdirectory of pear + * @return string path of this file relative to program root + */ + function getSourceLocation ($c,$pearize = false) + { + global $_phpDocumentor_options; + if (!isset($this->sourceLocation)) return false; + if ($pearize) + { + $sl = $this->sourceLocation; + if (strpos($sl,'pear/')) + { + $sl = substr($sl,strpos($sl,'pear/') + 5); + return $sl; + } else + { + return str_replace($_phpDocumentor_options['Program_Root'] . PATH_DELIMITER,'',$sl); + } + return $sl; + } + return $this->sourceLocation; + } + /** + * Not implemented in this version + * @return boolean tell the parser whether to parse the file, otherwise + * this function will retrieve the parsed data from external file + */ + function getParseData() + { + return true; + } +} + +/** + * Contains an in-memory representation of all documentable elements + * ({@link parserPage}, {@link parserFunction}, {@link parserDefine}, + * {@link parserInclude}, {@link parserClass}, {@link parserMethod}, + * {@link parserVar}) and their DocBlocks ({@link parserDocBlock}). + * + * This class works in coordination with {@link phpDocumentor_IntermediateParser} + * to take output from {@link Parser::handleEvent()} and create indexes, links, + * and other assorted things (all documented in phpDocumentor_IntermediateParser + * and {@link Converter}) + * @package phpDocumentor + * @subpackage ParserData + * @author Greg Beaver + * @since 1.0rc1 + * @version $Id: ParserData.inc,v 1.1 2005/10/17 18:36:57 jeichorn Exp $ + */ +class parserData +{ + /** + * {@link parserPage} element that is this parserData's parent, or false if + * not set. + * @var false|parserPage + */ + var $parent = false; + /** + * array of parsed elements + * @var array + */ + var $elements = array(); + /** + * array of parsed elements with @access private + * @var array + */ + var $privateelements = array(); + /** + * array of parsed class elements + * @var array + */ + var $classelements = array(); + + /** + * @var parserTutorial|false + */ + var $tutorial = false; + /** + * array of parsed class elements with @access private + * @var array + */ + var $privateclasselements = array(); + /** + * array of links descended from {@link abstractLink} + * @var array + * @see pageLink, defineLink, classLink, functionLink, methodLink, varLink + */ + var $links = array(); + /** + * used by {@link phpDocumentor_IntermediateParser::handleDocBlock()} to + * determine whether a docblock is a page-level docblock or not. $clean is + * true as long as only 0 or 1 docblock has been parsed, and no element + * other than parserPage has been parsed + * @var boolean + */ + var $clean = true; + /** + * DocBlock ({@link parserDocBlock}) for this page, or false if not set + * @var mixed + */ + var $docblock = false; + /** + * Flag used to determine whether a page-level docblock is present + * @var boolean + * @access private + */ + var $_explicitdocblock = false; + /** + * Type is used by many functions to skip the hassle of if + * phpDocumentor_get_class($blah) == 'parserBlah' + * always 'page', used in element indexing and conversion functions found in + * {@link Converter} + * @var string + */ + var $type = 'page'; + + /** + * @param parserElement add a parsed element to the {@link $elements} array, + * also sets {@link $clean} to false + */ + function addElement(&$element) + { + $element->setPath($this->parent->path); + if ($element->getType() == 'class' || $element->getType() == 'method' || $element->getType() == 'var' + || $element->getType() == 'const') + { + $this->classelements[] = $element; + } else + { + $this->elements[] = $element; + } + $this->clean = false; + } + + /** + * @param parserTutorial + * @param Converter + */ + function addTutorial($t,&$c) + { + $this->tutorial = new tutorialLink; + $this->tutorial->addLink('',$t->path,$t->name,$t->package,$t->subpackage,$t->getTitle($c)); + } + + /** + * If this file has a tutorial associated with it, returns a link to the + * tutorial. + * @return tutorialLink + */ + function getTutorial() + { + return $this->tutorial; + } + + /** + * If the page-level DocBlock was present in the source, returns true + * @return boolean + */ + function hasExplicitDocBlock() + { + return $this->_explicitdocblock; + } + + /** + * Tells this page that its DocBlock was not implicit + */ + function explicitDocBlock() + { + $this->_explicitdocblock = true; + } + + /** + * @param parserElement element to add a new link (descended from + * {@link abstractLink})to the {@link $links} array + * @param string classname for elements that are class-based (this may be + * deprecated in the future, as the classname should be + * contained within the element. if $element is a page, this + * parameter is a package name + * @param string subpackage name for page elements + */ + function addLink(&$element,$classorpackage = '', $subpackage = '') + { + switch($element->type) + { + case 'function': + $x = new functionLink; + $x->addLink($this->parent->path, $this->parent->name, $element->name, $element->docblock->package, $element->docblock->subpackage); + return $x; + break; + case 'define': + $x = new defineLink; + $x->addLink($this->parent->path, $this->parent->name, $element->name, $element->docblock->package, $element->docblock->subpackage); + return $x; + break; + case 'global': + $x = new globalLink; + $x->addLink($this->parent->path, $this->parent->name, $element->name, $element->docblock->package, $element->docblock->subpackage); + return $x; + break; + case 'class': + $x = new classLink; + $x->addLink($this->parent->path, $this->parent->name, $element->name, $element->docblock->package, $element->docblock->subpackage); + return $x; + break; + case 'method': + $x = new methodLink; + $x->addLink($classorpackage, $this->parent->path, $this->parent->name, $element->name, $element->docblock->package, $element->docblock->subpackage); + return $x; + break; + case 'var': + $x = new varLink; + $x->addLink($classorpackage, $this->parent->path, $this->parent->name, $element->name, $element->docblock->package, $element->docblock->subpackage); + return $x; + break; + case 'page': + if (empty($classorpackage)) $classorpackage = $GLOBALS['phpDocumentor_DefaultPackageName']; + $x = new pageLink; + $x->addLink($element->path,$element->name,$element->file,$classorpackage, $subpackage); + return $x; + break; + } + } + + function &getLink(&$c, $text = false) + { + return $c->getPageLink($this->parent->file, $this->docblock->package, $this->parent->path, $text); + } + + /** + * returns a list of all classes declared in a file + * @param Converter &$c + * @return array Format: array(packagename => parserClass,packagename => parserClass,...) + */ + function getClasses(&$c) + { + $r = $c->classes->getClassesInPath($this->parent->path); + $rr = array(); + if ($r) + foreach($r as $class => $obj) + { + $rr[$obj->docblock->package][] = $obj; + } + return $rr; + } + + /** + * Get the output-safe filename (. changed to _) + * @return string + */ + function getName() + { + if (isset($this->parent) && $this->parent) + return $this->parent->getName(); + } + + /** + * @param parserPage parent element of this parsed data + */ + function setParent(&$parent) + { + $this->parent = $parent; + } + + /** + * @return bool returns the value of {@link $clean} + */ + function isClean() + { + return $this->clean; + } + + /** + * @param parserDocBlock + * @see parserDocBlock + */ + function setDocBlock(&$docblock) + { + $this->docblock = $docblock; + } +} + +/** + * Base class for all elements + * @package phpDocumentor + * @subpackage ParserData + * @abstract + * @author Greg Beaver + * @since 1.0rc1 + * @version $Id: ParserData.inc,v 1.1 2005/10/17 18:36:57 jeichorn Exp $ + */ +class parserBase +{ + /** + * Type is used by many functions to skip the hassle of if phpDocumentor_get_class($blah) == 'parserBlah' + * always base + * @var string + */ + var $type = 'base'; + /** + * set to different things by its descendants + * @abstract + * @var mixed + */ + var $value = false; + + /** + * @return string returns value of {@link $type} + */ + function getType() + { + return $this->type; + } + + /** + * @param mixed set the value of this element + */ + function setValue($value) + { + $this->value = $value; + } + + /** + * @return mixed get the value of this element (element-dependent) + */ + function getValue() + { + return $this->value; + } +} + + +/** + * Used to represent strings that contain inline tags, so that they can be properly parsed at link time + * @package phpDocumentor + * @subpackage ParserData + * @author Greg Beaver + * @since 1.0rc1 + * @version $Id: ParserData.inc,v 1.1 2005/10/17 18:36:57 jeichorn Exp $ + */ +class parserStringWithInlineTags extends parserBase +{ + /** + * Type is used by many functions to skip the hassle of if phpDocumentor_get_class($blah) == 'parserBlah' + * always '_string' + * @var string + */ + var $type = '_string'; + /** @access private */ + var $cache = false; + /** + * array of strings and {@link parserInlineTag}s + * Format: + * array(string1,string2,parserInlineTag1,string3,parserInlineTag2,...) + * @var array + */ + var $value = array(); + + /** + * equivalent to the . operator ($a = $b . $c) + * @param mixed either a string or a {@link parserInlineTag} + */ + function add($stringOrInlineTag) + { + if (is_string($stringOrInlineTag)) + { + if (!count($this->value)) + { + $this->value[] = $stringOrInlineTag; + return; + } + if (is_string($this->value[count($this->value) - 1])) + { + $this->value[count($this->value) - 1] .= $stringOrInlineTag; + return; + } else + { + $this->value[] = $stringOrInlineTag; + return; + } + } else + { + if (is_a($stringOrInlineTag,'parserinlinetag') && phpDocumentor_setup::checkIgnoreTag($stringOrInlineTag->inlinetype, true)) return; + $this->value[] = $stringOrInlineTag; + } + } + + /** + * Determine whether the string contains any inline tags + * @tutorial inlinetags.pkg + * @return boolean + */ + function hasInlineTag() + { + for($i=0;$ivalue);$i++) + { + if (is_a($this->value[$i],'parserinlinetag')) return true; + } + return false; + } + + /** + * Pass source code to any {@}source} tags contained within the string + * for later conversion. + * @param string|array source code ready to be highlighted + */ + function setSource($source) + { + for($i=0;$ivalue);$i++) + { + if (phpDocumentor_get_class($this->value[$i]) == 'parsersourceinlinetag') + { + $this->value[$i]->setSource($source); + } + } + } + + /** + * equivalent to trim(strlen($string)) + * @return integer length of the string this object represents + */ + function trimmedStrlen() + { + $a = 0; + for($i=0;$ivalue);$i++) + { + if (is_string($this->value[$i])) + { + if ($i == 0) + { + $a += strlen(ltrim($this->value[$i])); + } elseif ($i == count($this->value[$i]) - 1) + { + $a += strlen(chop($this->value[$i])); + } + } else + { + $a += $this->value[$i]->Strlen(); + } + } + return $a; + } + + /** + * return the string unconverted (all inline tags are taken out - this + * should only be used in pre-parsing to see if any other text + * is in the string) + * @uses parserInlineTag::getString() removes inline tag length, as it is + * indeterminate until conversion. + * @return string trimmed value + */ + function getString($trim = true) + { + $a = ''; + for($i=0; $ivalue); $i++) + { + if (is_string($this->value[$i])) + { + $a .= $this->value[$i]; + } else + { + $a .= $this->value[$i]->getString(); + } + } + if ($trim) $a = trim($a); + return $a; + } + + /** + * Use to convert the string to a real string with all inline tags parsed and linked + * @see Converter::returnSee() + * @param Converter + * @param boolean true if one needs to postprocess + * @param boolean false if the output should not be trimmed + */ + function Convert(&$converter,$postprocess = true, $trim = true) + { + if ($this->cache) + { + if ($converter->name == $this->cache['name'] && $converter->outputformat == $this->cache['output'] && $converter->checkState($this->cache['state']) && $this->cache['postprocess'] === $postprocess) return $this->cache['contents']; + if ($converter->name != $this->cache['name']) { + $this->cache = false; + } + } + if (is_string($this->value)) return $this->value; + $a = ''; + for($i=0; $ivalue); $i++) + { + if (is_string($this->value[$i])) + { + if ($postprocess && !method_exists($converter,'postProcess')) var_dump('a',$converter); + if ($postprocess) $a .= $converter->postProcess($this->value[$i]); + else $a .= $this->value[$i]; + } else + { + $a .= $this->value[$i]->Convert($converter, $postprocess); + } + } + if ($trim) { + $a = trim($a); + } + $this->cache = array('name' => $converter->name,'output' => $converter->outputformat, 'contents' => $a, 'state' => $converter->getState(), 'postprocess' => $postprocess); + return $a; + } +} + +?> \ No newline at end of file diff --git a/buildscripts/PhpDocumentor/phpDocumentor/ParserDescCleanup.inc b/buildscripts/PhpDocumentor/phpDocumentor/ParserDescCleanup.inc new file mode 100644 index 00000000..bd80d104 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/ParserDescCleanup.inc @@ -0,0 +1,1456 @@ + + * @since 1.2 + */ +/**#@+ + * {@link parserDescParser} token constants + */ +/** when <> is found in a desc */ +define('PHPDOCUMENTOR_PDP_EVENT_CODE', 600); +/** when <> is found in a desc */ +define('PHPDOCUMENTOR_PDP_STATE_CODE', 700); +/** when <

            > is found in a desc */ +define('PHPDOCUMENTOR_PDP_EVENT_P', 601); +/** when <

            > is found in a desc */ +define('PHPDOCUMENTOR_PDP_STATE_P', 701); +/** when \n\n is found in a desc */ +define('PHPDOCUMENTOR_PDP_EVENT_DOUBLECR', 602); +/** when \n\n is found in a desc */ +define('PHPDOCUMENTOR_PDP_STATE_DOUBLECR', 702); +/** when <

            > is found in a desc */
            +define('PHPDOCUMENTOR_PDP_EVENT_PRE', 603);
            +/** when <
            > is found in a desc */
            +define('PHPDOCUMENTOR_PDP_STATE_PRE', 703);
            +/** when <
              >/<
                > is found in a desc */ +define('PHPDOCUMENTOR_PDP_EVENT_LIST', 604); +/** when <
                  >/<
                    > is found in a desc */ +define('PHPDOCUMENTOR_PDP_STATE_LIST', 704); +/** when <> is found in a desc */ +define('PHPDOCUMENTOR_PDP_EVENT_B', 605); +/** when <> is found in a desc */ +define('PHPDOCUMENTOR_PDP_STATE_B', 705); +/** when <> is found in a desc */ +define('PHPDOCUMENTOR_PDP_EVENT_I', 606); +/** when <> is found in a desc */ +define('PHPDOCUMENTOR_PDP_STATE_I', 706); +/** when <
                    > is found in a desc */ +define('PHPDOCUMENTOR_PDP_EVENT_BR', 607); +/** when <
                    > is found in a desc */ +define('PHPDOCUMENTOR_PDP_STATE_BR', 707); +/** when the << potential escape for tags is found in a desc */ +define('PHPDOCUMENTOR_PDP_EVENT_ESCAPE',608); +/** when the << potential escape for tags is found in a desc */ +define('PHPDOCUMENTOR_PDP_STATE_ESCAPE',708); +/** when << /pre>> is found in a <
                    ><
                    > section */ +define('PHPDOCUMENTOR_PDP_EVENT_ESCAPE_PRE',609); +/** when << /pre>> is found in a <
                    ><
                    > section */ +define('PHPDOCUMENTOR_PDP_STATE_ESCAPE_PRE',709); +/** when << /code>> is found in a <><> section */ +define('PHPDOCUMENTOR_PDP_EVENT_ESCAPE_CODE',610); +/** when << /code>> is found in a <><> section */ +define('PHPDOCUMENTOR_PDP_STATE_ESCAPE_CODE',710); +/** when <> is found in a desc */ +define('PHPDOCUMENTOR_PDP_EVENT_VAR',611); +/** when <> is found in a desc */ +define('PHPDOCUMENTOR_PDP_STATE_VAR',711); +/** when <> is found in a desc */ +define('PHPDOCUMENTOR_PDP_EVENT_SAMP',612); +/** when <> is found in a desc */ +define('PHPDOCUMENTOR_PDP_STATE_SAMP',712); +/** when <> is found in a desc */ +define('PHPDOCUMENTOR_PDP_EVENT_KBD',613); +/** when <> is found in a desc */ +define('PHPDOCUMENTOR_PDP_STATE_KBD',713); +/** when a simple list is found in a desc + * + * like + *
                    + *  o item 1
                    + *  o item 2
                    + * 
                    + */ +define('PHPDOCUMENTOR_PDP_EVENT_SIMLIST',614); +/** when a simple list is found in a desc + * + * like + *
                    + *  o item 1
                    + *  o item 2
                    + * 
                    + */ +define('PHPDOCUMENTOR_PDP_STATE_SIMLIST',714); +/**#@-*/ +/** +* Like WordParser but designed to handle an array with strings and +* {@link parserInlineTag}s +* @package phpDocumentor +* @subpackage WordParsers +* @author Greg Beaver +* @since 1.2 +*/ +class ObjectWordParser extends WordParser +{ + /** + * Determines whether text searching is case-sensitive or not + * @access private + */ + var $_casesensitive = false; + + function ObjectWordParser($casesensitive = false) + { + $this->_casesensitive = $casesensitive; + } + + /** + * Set the word parser to go. + * + * @param array {@link parserStringWithInlineTags::$value} style-array, with + * alternating text and inline tags + */ + function setup(&$input) + { +// if (is_string($input[0])) $input[0] = ltrim($input[0]); + $this->data = & $input; + $this->pos = 0; + $this->linenum = 0; + $this->linenumpos = 0; + $this->cache = array(); + reset($this->data); + list($this->index,) = each($this->data); + if (!is_object($this->data[$this->index])) + $this->size = strlen($this->data[$this->index]); + else $this->size = 0; + //$this->run = 0; + //$this->word = WORD_PARSER_RET_WORD; + } + + function getWord() + { + if (!isset($this->data[$this->index])) return false; + // return any inline tags unchanged + if (is_object($this->data[$this->index])) + { + $index = $this->index; + list($this->index,) = each($this->data); + $this->pos = 0; + if ($this->index) + { + if (!is_object($this->data[$this->index])) + $this->size = strlen($this->data[$this->index]); + else $this->size = 0; + $this->cache = array(); + return $this->data[$index]; + } else + { + return false; + } + } + //$st = $this->mtime(); + if ($this->size == $this->pos) + { + // cycle to next line in the array + list($this->index,) = each($this->data); + if (!$this->index) return false; + $this->pos = 0; + if (!is_object($this->data[$this->index])) + $this->size = strlen($this->data[$this->index]); + else $this->size = 0; + $this->cache = array(); + return $this->getWord(); + } + + $npos = $this->size; + if (is_array($this->wordseperators)) + { + //$this->wordseperators = array(); + foreach($this->wordseperators as $sep) + { + if (isset($this->cache[$sep])) + $tpos = $this->cache[$sep]; + else + $tpos = false; + if ($tpos < $this->pos || !is_int($tpos)) + { + if ($this->_casesensitive) + $tpos = strpos($this->data[$this->index],$sep,$this->pos); + else + $tpos = strpos(strtolower($this->data[$this->index]),$sep,$this->pos); + } + + if ( ($tpos < $npos) && !($tpos === false)) + { + //echo trim($sep) . "=$tpos\n"; + $npos = $tpos; + $seplen = strlen($sep); + } + else if (!($tpos === false)) + { + $this->cache[$sep] = $tpos; + } + } + } else { + // its time to cycle + return ""; + } + + $len = $npos - $this->pos; + if ($len == 0) + { + $len = $seplen; + } + + //$st3 = $this->mtime(); + $word = substr($this->data[$this->index],$this->pos,$len); + + // Change random other os newlines to the unix one + if ($word == "\r" || $word == "\r\n") + { + $word = "\n"; + } + + if ($this->linenumpos <= $this->pos) + { + $this->linenumpos = $this->pos + $len; + $this->linenum += count(explode("\n",$word)) - 1; + } + + if ($this->getsource) + { + $this->source .= $word; + } + $this->pos = $this->pos + $len; + //$this->word = WORD_PARSER_RET_SEP; + + // Things like // commenats rely on the newline to find their end so im going to have to return them + // never return worthless white space /t ' ' + if ($this->returnWhiteSpace == false) + { + if (strlen(trim($word)) == 0 && $word != "\n") + { + $word = $this->getWord(); + } + } + //$this->time3 = $this->time3 + ($this->mtime() - $st3); + //$this->time = $this->time + ($this->mtime() - $st); + return $word; + } + + /** + * Determine if the next word is an inline tag + * @return boolean + */ + function nextIsObjectOrNonNL() + { + return (($this->size == $this->pos) && isset($this->data[$this->index + 1]) + && is_object($this->data[$this->index + 1])) || + (($this->size > $this->pos) && !in_array($this->data[$this->index]{$this->pos}, array("\n", "\r"))); + } +} + +/** + * Parses a DocBlock description to retrieve abstract representations of + * <
                    >,<>,<

                    >,<

                      >,<
                        >,<
                      1. >,<>,<> + * @tutorial phpDocumentor.howto.pkg#basics.desc + * @package phpDocumentor + * @subpackage Parsers + * @author Greg Beaver + * @since 1.2 + */ +class parserDescParser extends Parser +{ + /**#@+ + * @access private + */ + /** + * @var array + */ + var $eventHandlers = array(PHPDOCUMENTOR_PDP_EVENT_CODE => 'handleCode', + PHPDOCUMENTOR_PDP_EVENT_PRE => 'handlePre', + PHPDOCUMENTOR_PDP_EVENT_P => 'handleP', + PHPDOCUMENTOR_PDP_EVENT_DOUBLECR => 'handleDoubleCR', + PHPDOCUMENTOR_PDP_EVENT_LIST => 'handleList', + PHPDOCUMENTOR_PDP_EVENT_B => 'handleB', + PHPDOCUMENTOR_PDP_EVENT_I => 'handleI', + PHPDOCUMENTOR_PDP_EVENT_VAR => 'handleVar', + PHPDOCUMENTOR_PDP_EVENT_KBD => 'handleKbd', + PHPDOCUMENTOR_PDP_EVENT_SAMP => 'handleSamp', + PHPDOCUMENTOR_PDP_EVENT_BR => 'handleBr', + PHPDOCUMENTOR_PDP_EVENT_ESCAPE => 'handleEscape', + PHPDOCUMENTOR_PDP_EVENT_ESCAPE_CODE => 'handleEscapeCode', + PHPDOCUMENTOR_PDP_EVENT_ESCAPE_PRE => 'handleEscapePre', + PHPDOCUMENTOR_PDP_EVENT_SIMLIST => 'handleSimpleList', + PARSER_EVENT_NOEVENTS => 'defaultHandler', + ); + + /** + * @var array + */ + var $pars = array(); + /** + * Determines whether parsing of <p> tags will occur, or double CR will + * be used + * @var boolean + */ + var $parse_Ps; + /** + * Context stack. + * + * Values can be 'normal', or any tag container like 'my_i', 'my_b'. This + * is used to determine which tag text or nested tags should be added to + * @var array + */ + var $_context = array('normal'); + /**#@-*/ + + /** + * sets $wp to be a {@link ObjectWordParser} + * + * $wp is the word parser that retrieves tokens + */ + function parserDescParser() + { + $this->wp = new ObjectWordParser; + } + + /** + * Parse a long or short description for tags + * + * @param array array of strings or {@link parserInlineTag}s + * @param boolean true if the description is a short description. (only 1 paragraph allowed in short desc) + * @param string name of the class to instantiate for each paragraph. parserDesc for desc/sdesc, + * parserStringWithInlineTags for tag data + * @staticvar integer used for recursion limiting if a handler for an event is not found + */ + function parse (&$parse_data,$sdesc = false,$ind_type = 'parserDesc') + { + static $endrecur = 0; + global $_phpDocumentor_setting; + if (!is_array($parse_data) || count($parse_data) == 0) + { + return false; + } + $this->p_vars['indtype'] = $ind_type; + $this->setupStates($sdesc); + if (isset($_phpDocumentor_setting['javadocdesc']) && $_phpDocumentor_setting['javadocdesc'] == 'on') + $this->parse_Ps = true; + + // initialize variables so E_ALL error_reporting doesn't complain + $pevent = 0; + $word = 0; + $this->p_vars['curpar'] = 0; + $this->pars = array(); + $this->p_vars['start'] = true; + $this->p_vars['event_stack'] = new EventStack; + + $this->wp->setup($parse_data,$sdesc); + $this->wp->setWhitespace(true); + $this->p_vars['list_count'] = 0; + if ($sdesc) $this->p_vars['start'] = false; + do + { + if (!isset($this->pars[$this->p_vars['curpar']])) $this->pars[$this->p_vars['curpar']] = new $ind_type; + $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 (0)//PHPDOCUMENTOR_DEBUG == true) + { + echo "----------------\n"; + echo "LAST: |" . htmlentities($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: |".htmlentities($word)."|\n\n"; + var_dump($this->_context); + } + if (isset($this->eventHandlers[$pevent])) + { + $handle = $this->eventHandlers[$pevent]; + if ($word !== false) $this->$handle($word, $pevent); + else + { + if (!count($this->pars[$this->p_vars['curpar']]->value)) unset($this->pars[$this->p_vars['curpar']]); + } + } else + { + debug('WARNING: possible error, no ParserDescParser handler for event number '.$pevent); + if ($endrecur++ == 25) + { + die("FATAL ERROR, recursion limit reached"); + } + } + if (is_object($word) || trim($word) != '') + { + $this->p_vars['start'] = false; + } + } while (is_object($word) || !($word === false) && $word != ''); + $context = $this->getContext(); + if ($context != 'normal') + { + if ($context == 'list' && $this->p_flags['simplelist']) + { + $this->p_vars['lists'][0]->addItem($this->p_vars['list_item'][0]); + unset($this->p_vars['list_item'][0]); + $this->setContext('normal'); + $this->addText($this->p_vars['lists'][0]); + } else addError(PDERROR_UNCLOSED_TAG,str_replace('my_','',$context)); + } + if ($this->p_vars['list_count'] > 0) addError(PDERROR_UNMATCHED_LIST_TAG); + if ($sdesc) + $this->publishEvent(2,$this->pars); + else + $this->publishEvent(1,$this->pars); + } + /**#@+ @access private */ + /** + * basic handling + * + * This function checks to see if the first thing in + * a description is the

                        tag. If so, it will switch + * into a mode of parsing out paragraphs by

                        instead + * of a double line-break + * + * It also removes extra whitespace + * @uses doSimpleList() + */ + function defaultHandler($word, $pevent) + { + $context = $this->getContext(); + if ($context != 'normal') $this->setContext('normal'); + if ($this->p_vars['start'] && is_string($word) && strtolower($word) == '

                        ') + { + $this->parse_Ps = true; + } + if (is_string($word) && $this->checkEventPush($word, $pevent)) return; +// if (!isset($this->parse_Ps) || !$this->parse_Ps) + { + if (!is_object($word) && ($word == ' ' && $this->p_vars['last_word'] == ' ')) return; + if ($pevent == PARSER_EVENT_NOEVENTS) + { + if ($this->doSimpleList($word)) return; + } + $this->addText($word); + } + } + + /** + * Retrieve the current top-level tag to add text into + * @uses $_context + */ + function getContext() + { + array_push($this->_context,$a = array_pop($this->_context)); + return $a; + } + + /** + * Pop a context off of the context stack + * @uses $_context + */ + function dropContext() + { + array_pop($this->_context); + if (count($this->_context) == 0) + $this->_context = array('normal'); + } + + /** + * @uses $_context + * @param string context name + */ + function setContext($context) + { + array_push($this->_context,$context); + } + + /** + * add input as text to the current paragraph or list + * @param string|parserInlineTag + */ + function addText($text) + { + $context = $this->getContext(); + if ($context == 'list') + { +// debug('aded to '.$context); + $this->p_vars['list_item'][$this->p_vars['list_count']]->add($text); + } elseif ($context != 'normal') + { +// debug('added to '.$context); + $this->p_vars[$context]->add($text); + } else + { +// debug('added to normal '); + $indtype = $this->p_vars['indtype']; + if (!isset($this->pars[$this->p_vars['curpar']])) + $this->pars[$this->p_vars['curpar']] = new $indtype; + $this->pars[$this->p_vars['curpar']]->add($text); + } + } + + /**#@-*/ + /**#@+ + * @access private + * @param string|parserInlineTag token from the ObjectWordParser + * @param integer parser event from {@link ParserDescCleanup.inc} + */ + /** + * Handles special case where a description needs the text "" and tag + * is one of code, b, i, pre, var, or any other valid in-DocBlock html tag. + * + * the text <<>> in a DocBlock will parse out as <>, instead + * of being parsed as markup. + */ + function handleEscape($word, $pevent) + { + $this->p_vars['event_stack']->popEvent(); + if (!in_array($word, $this->tokens[PHPDOCUMENTOR_PDP_STATE_ESCAPE])) + { + if ($word == '<') + { + $this->addText($word); + $this->wp->backupPos($word.$word); + } else + $this->wp->backupPos($word); + return; + } + $this->addText('<'.str_replace('>>','>',$word)); + } + + /** + * Just like {@link handleEscape}, except the only valid escape is + * <<

                    >> + */ + function handleEscapePre($word, $pevent) + { + $this->p_vars['event_stack']->popEvent(); + $this->addText('
            '); + } + + /** + * Just like {@link handleEscape}, except the only valid escape is + * <<>> + */ + function handleEscapeCode($word, $pevent) + { + $this->p_vars['event_stack']->popEvent(); + $this->addText(''); + } + + /** + * Handle "<
            >" + * Add a new {@link parserBr} + * @uses addText() + */ + function handleBr($word, $pevent) + { + if (is_string($word) && $this->checkEventPop($word, $pevent)) + { + $this->addText(new parserBr); + } + } + + /** + * Handles simple lists + * + * phpEdit has an ingenious facility to handle simple lists used in a + * DocBlock like this: + * + * - item 1 + * - item 2 + * - item 3 + * + * The DocBlock is: + *
            +     * * - item 1
            +     * * - item 2
            +     * * - item 3
            +     * 
            + * This function converts these simple lists into the parserList class + * @param boolean true if this is the first list item in the list + */ + function handleSimpleList($word, $pevent, $start = false) + { + if (is_object($word) && $this->p_flags['in_item']) + { + $this->p_vars['list_item'][0]->add($word); + return; + } + if (is_string($word) && $this->checkEventPush($word, $pevent)) + { + $this->p_flags['in_event'] = true; + return; + } + $ltrimword = @substr($word, @strpos($word, ltrim($word))); + $is_valid = false; + if (strlen(trim($word)) == 0) + { + if ($this->wp->nextIsObjectOrNonNL()) + { + $is_valid = true; + } + } + if ($word == "\n" && is_string($this->p_vars['last_word']) + && $this->p_vars['last_word']{strlen($this->p_vars['last_word']) - 1} + == "\n") + { + if ($this->p_flags['in_item']) + { + $this->p_vars['lists'][0]->addItem($this->p_vars['list_item'][0]); + unset($this->p_vars['list_item'][0]); + $this->setContext('normal'); + $this->p_flags['simplelist'] = false; + $this->addText($this->p_vars['lists'][0]); + unset($this->p_vars['lists']); + unset($this->p_vars['last_list']); + $this->wp->backuppos($word); + $this->p_vars['event_stack']->popEvent(); + $this->p_flags['in_item'] = false; +// debug('end of list 3'); + return; + } else + { + $this->wp->backuppos($word); + $this->p_vars['event_stack']->popEvent(); + $this->p_flags['in_item'] = false; +// debug('not a list 2'); + return; + } + } + $start_list = $this->getStartList($word); + if (substr($ltrimword,0,strlen($start_list)) != $start_list + || $this->p_flags['in_event'] || is_object($this->p_vars['last_word'])) + { + if (((strlen($this->p_vars['whitespace']) + 1) < strlen(substr($word,0,strpos($word, $ltrimword)))) + || $word == "\n" + || $is_valid + || $this->p_flags['in_event'] + || (is_object($this->p_vars['last_word']) && $this->p_flags['in_item'])) + { + $this->p_vars['list_item'][0]->add($word); + $this->resetStartList($start_list); + $this->p_flags['in_event'] = false; +// debug('middle of list'); + } else + { + if ($this->p_flags['in_item']) + { + $this->p_vars['lists'][0]->addItem($this->p_vars['list_item'][0]); + unset($this->p_vars['list_item'][0]); + $this->setContext('normal'); + $this->p_flags['simplelist'] = false; + $this->addText($this->p_vars['lists'][0]); + unset($this->p_vars['lists']); + unset($this->p_vars['last_list']); + $this->wp->backuppos($word); + $this->p_vars['event_stack']->popEvent(); + $this->p_flags['in_item'] = false; +// debug('end of list 1'); + return; + } else + { + $this->wp->backuppos($word); + $this->p_vars['event_stack']->popEvent(); + $this->p_flags['in_item'] = false; +// debug('not a list'); + return; + } + } + } else + { + if ($this->p_vars['whitespace'] != substr($word,0,strpos($word, $start_list))) + { // if the whitespace is greater than that preceding the list + // delimiter, it's a multi-line list item + $this->setContext('normal'); + $this->p_flags['simplelist'] = false; + $this->addText($this->p_vars['lists'][0]); + unset($this->p_vars['lists']); + $this->wp->backuppos($word); + $this->p_vars['event_stack']->popEvent(); + unset($this->p_vars['last_list']); + $this->p_flags['in_item'] = false; +// debug('end of list 2'); + return; + } else + { + if ($this->p_flags['in_item']) + { + // end of a list item, add it to the list + $this->p_vars['lists'][0]->addItem($this->p_vars['list_item'][0]); + unset($this->p_vars['list_item'][0]); + } +// debug('next list item'); + $this->p_vars['list_item'][0] = new parserStringWithInlineTags; + $this->p_vars['list_item'][0]->add(ltrim(substr($ltrimword,strlen($start_list)))); + $this->p_flags['in_item'] = true; + } + } + } + /**#@-*/ + /** + * Get the next list marker + * + * In unordered lists, this will be something like "o", "-" + * + * In ordered lists, this will be either the number "3", "5" or "3.", "5." + * @return string text of the next list marker to look for + * @param string current word from the parser + * @access private + */ + function getStartList($word) + { + // unordered, return the first marker found + if (!$this->p_flags['orderedlist']) return $this->p_vars['start_list']; + if (isset($this->p_vars['last_list'])) + { + $this->p_vars['save_list'] = $this->p_vars['last_list']; + $next = $this->p_vars['last_list']; + // increment to next list number, convert to string + if (substr($this->p_vars['start_list'], strlen($this->p_vars['start_list']) - 1) == '.') + $next = (substr($next, 0, strpos($next,'.')) + 1) . '.'; + else + $next = ($next + 1) . ''; +// debug("next is '$next'"); + if ($this->p_vars['whitespace'] == substr($word,0,strpos($word, $next))) + return $this->p_vars['last_list'] = $next; + // the next number is not in this word, so return but don't save + return $next; + } else + { + $this->p_vars['last_list'] = $this->p_vars['start_list']; + return $this->p_vars['start_list']; + } + } + + /** + * Set the next list marker to the current list marker + * + * In ordered lists, this will ensure that the next number returned is the + * right number + * @param string token for next list marker + * @access private + */ + function resetStartList($start) + { + if (!isset($this->p_vars['save_list'])) return false; + $this->p_vars['last_list'] = $this->p_vars['save_list']; + } + + /**#@+ + * @access private + * @param string|parserInlineTag token from the ObjectWordParser + * @param integer parser event from {@link ParserDescCleanup.inc} + */ + /** + * Handles <
              >,<
            1. >,<
                > + * + * This allows parsing of lists nested to any level. Using + * the lists and list_item temporary variables and using + * list_count to control nesting, the method creates a {@link parserList} + * for each <
                  > or <
                    > tag, and a + * standard {@link parserStringWithInlineTags} for all the text, adding + * in nested lists as if they were inline tags (the conversion interface + * is the same for both object types) + */ + function handleList($word, $pevent) + { + if (is_string($word) && $this->checkEventPush($word, $pevent)) + { + return; + } + $ordered = false; + if (!is_object($this->p_vars['last_word']) && strtolower($this->p_vars['last_word']) == '
                      ') + { + // ordered list + $ordered = true; + } + // start a new list + if (!is_object($this->p_vars['last_word']) && (strtolower($this->p_vars['last_word']) == '
                        ' || strtolower($this->p_vars['last_word']) == '
                          ')) + { + $this->p_flags['in_item'] = false; + $this->setContext('list'); + $this->p_vars['lists'][++$this->p_vars['list_count']] = new parserList($ordered); + } + if (!is_object($word) && strtolower($word) == '
                        • ') + { + if ($this->p_flags['in_item']) + { + // end of a list item (no end tag), add it to the list + $this->p_vars['lists'][$this->p_vars['list_count']]->addItem($this->p_vars['list_item'][$this->p_vars['list_count']]); + unset($this->p_vars['list_item'][$this->p_vars['list_count']]); + } + // start a new list item + $this->p_vars['list_item'][$this->p_vars['list_count']] = new parserStringWithInlineTags; + $this->p_flags['in_item'] = true; + } else + { + if (is_object($word) || (strtolower($word) != '
                        • ')) + { + if (is_object($word) || (strtolower($word) != '
                        ' && strtolower($word) != '
                      ')) + { + // item text + if (isset($this->p_vars['list_item'][$this->p_vars['list_count']])) + { + if ($word == ' ' && $this->p_vars['last_word'] == ' ') return; + $this->p_vars['list_item'][$this->p_vars['list_count']]->add($word); + } + } else + { + if ($this->p_flags['in_item']) + { + // end the current list item before ending a list + $this->p_vars['lists'][$this->p_vars['list_count']]->addItem($this->p_vars['list_item'][$this->p_vars['list_count']]); + unset($this->p_vars['list_item'][$this->p_vars['list_count']]); + $this->p_flags['in_item'] = false; + } + if (is_string($word) && $this->checkEventPop($word, $pevent)) + { + if ($this->p_vars['list_count'] > 1) + { + // this is a sublist, add it to the list item of the parent list + $this->p_vars['list_item'][$this->p_vars['list_count'] - 1]->add($this->p_vars['lists'][$this->p_vars['list_count']]); + // remove the sublist item and sublist, drop to parent list + unset($this->p_vars['lists'][$this->p_vars['list_count']]); + unset($this->p_vars['lists'][$this->p_vars['list_count']]); + $this->p_vars['list_count']--; + $this->p_flags['in_item'] = true; + } else + { + // this is a primary list and it has concluded + $this->pars[$this->p_vars['curpar']]->add($this->p_vars['lists'][$this->p_vars['list_count']]); + unset($this->p_vars['lists']); + unset($this->p_vars['list_item']); + $this->p_vars['list_count'] = 0; + $this->dropContext(); + } + } + } + } else + { + // check to make sure our list item is not unclosed + if (!$this->p_flags['in_item']) + { + addError(PDERROR_TEXT_OUTSIDE_LI); + } else + { + // end of a list item, add it to the list + $this->p_vars['lists'][$this->p_vars['list_count']]->addItem($this->p_vars['list_item'][$this->p_vars['list_count']]); + unset($this->p_vars['list_item'][$this->p_vars['list_count']]); + $this->p_flags['in_item'] = false; + } + } + } + } + + /** + * Handles <><> blocks + */ + function handleCode($word, $pevent) + { + if (!isset($this->p_vars['my_code'])) + { + $this->setContext('my_code'); + $this->p_vars['my_code'] = new parserCode; + } + if (is_string($word) && $this->checkEventPush($word, $pevent)) return; + if (is_object($word) || strtolower($word) != '
                      ') $this->p_vars['my_code']->add($word); + if (is_string($word)) + { + if ($this->checkEventPop($word,$pevent)) + { + $this->dropContext(); + $this->addText($this->p_vars['my_code']); + unset($this->p_vars['my_code']); + } + } + } + + /** + * Handles <
                      ><
                      > blocks + */ + function handlePre($word, $pevent) + { + if (!isset($this->p_vars['my_pre'])) + { + $this->setContext('my_pre'); + $this->p_vars['my_pre'] = new parserPre; + } + if (is_string($word) && $this->checkEventPush($word, $pevent)) return; + if (is_object($word) || strtolower($word) != '
            ') $this->p_vars['my_pre']->add($word); + if (is_string($word)) + { + if ($this->checkEventPop($word,$pevent)) + { + $this->dropContext(); + $this->addText($this->p_vars['my_pre']); + unset($this->p_vars['my_pre']); + } + } + } + + /** + * Handles <><> blocks + */ + function handleB($word, $pevent) + { + if (!isset($this->p_vars['my_b'])) + { + $this->setContext('my_b'); + $this->p_vars['my_b'] = new parserB; + } + if (is_string($word)) + { + if ($this->checkEventPop($word,$pevent)) + { + $this->dropContext(); + $this->addText($this->p_vars['my_b']); + unset($this->p_vars['my_b']); + } else + { + $this->p_vars['my_b']->add($word); + } + } else $this->p_vars['my_b']->add($word); + } + + /** + * Handles <><> blocks + */ + function handleI($word, $pevent) + { + if (!isset($this->p_vars['my_i'])) + { + $this->p_vars['my_i'] = new parserI; + $this->setContext('my_i'); + } + if (is_string($word)) + { + if ($this->checkEventPop($word,$pevent)) + { + $this->dropContext(); + $this->addText($this->p_vars['my_i']); + unset($this->p_vars['my_i']); + } else + { + $this->p_vars['my_i']->add($word); + } + } else $this->p_vars['my_i']->add($word); + } + + /** + * Handles <><> blocks + */ + function handleVar($word, $pevent) + { + if (!isset($this->p_vars['my_var'])) + { + $this->setContext('my_var'); + $this->p_vars['my_var'] = new parserDescVar; + } + if (is_string($word)) + { + if ($this->checkEventPop($word,$pevent)) + { + $this->dropContext(); + $this->addText($this->p_vars['my_var']); + unset($this->p_vars['my_var']); + } else + { + $this->p_vars['my_var']->add($word); + } + } else $this->p_vars['my_var']->add($word); + } + + /** + * Handles <><> blocks + */ + function handleSamp($word, $pevent) + { + if (!isset($this->p_vars['my_samp'])) + { + $this->setContext('my_samp'); + $this->p_vars['my_samp'] = new parserSamp; + } + if (is_string($word)) + { + if ($this->checkEventPop($word,$pevent)) + { + $this->dropContext(); + $this->addText($this->p_vars['my_samp']); + unset($this->p_vars['my_samp']); + } else + { + $this->p_vars['my_samp']->add($word); + } + } else $this->p_vars['my_samp']->add($word); + } + + /** + * Handles <><> blocks + */ + function handleKbd($word, $pevent) + { + if (!isset($this->p_vars['my_kbd'])) + { + $this->setContext('my_kbd'); + $this->p_vars['my_kbd'] = new parserKbd; + } + if (is_string($word)) + { + if ($this->checkEventPop($word,$pevent)) + { + $this->dropContext(); + $this->addText($this->p_vars['my_kbd']); + unset($this->p_vars['my_kbd']); + } else + { + $this->p_vars['my_kbd']->add($word); + } + } else $this->p_vars['my_kbd']->add($word); + } + + /** + * Handles <

            ><

            > blocks + * + * Note that the only time <

            > will be interpreted as delimiting a + * paragraph is if it is the first thing in the description. + */ + function handleP($word, $pevent) + { + if (!isset($this->parse_Ps)) $this->parse_Ps = false; + if (is_string($word)) + { + if (is_string($word) && $this->checkEventPush($word, $pevent)) return; + } + if (!$this->parse_Ps) + { + $this->p_vars['event_stack']->popEvent(); + if (!is_object($word) && strtolower($this->p_vars['last_word']) == '

            ') $this->addText('

            '); + $this->addText($word); + return; + } + if ($word == "\n") $word = " "; + if (is_string($word)) + { + if ($this->checkEventPop($word, $pevent)) + { + $this->p_vars['curpar']++; + return; + } + // if no closing tag, pretend there was one + if (!is_object($word) && strtolower($word) == '

            ' && $this->parse_Ps) + { + $this->p_vars['curpar']++; + return; + } + } + if ($this->p_vars['start']) + { + $this->addText($word); + } else + {// if the

            is not at the beginning of the desc, then it is not + // possible to parse into paragraphs using this tag + if ($word == ' ' && $this->p_vars['last_word'] == ' ') return; + $this->addText($word); + } + } + + /** + * Handles \n\n as a paragraph marker + * @uses doSimpleList() + */ + function handleDoubleCR($word, $pevent) + { + $this->p_vars['event_stack']->popEvent(); + if ($word == "\n") + { + // only use this if

            isn't being used + if ((!isset($this->parse_Ps) || !$this->parse_Ps)) + { + if ($this->p_vars['last_word'] == "\n") + { + $this->p_vars['curpar']++; + $this->parse_Ps = false; + } else + { + if (is_string($word) && !$this->checkEventPush($word, $pevent)) + { + if ($word == ' ' && $this->p_vars['last_word'] == ' ') return; + $this->addText($word); + } + } + } else + { + if (is_string($word) && !$this->checkEventPush($word, $pevent)) + { + if ($word == ' ' && $this->p_vars['last_word'] == ' ') return; + $this->addText($word); + } + } + } else + { + if ($this->p_vars['last_word'] == "\n") + { + if ((!isset($this->parse_Ps) || !$this->parse_Ps)) + { + $this->addText(' '); + } + } + if (is_string($word) && !($e = $this->checkEventPush($word, $pevent))) + { + if ($word == ' ' && $this->p_vars['last_word'] == ' ') return; + if ($this->doSimpleList($word)) return; + $this->addText($word); + } + } + } + + /**#@-*/ + /** + * Return a simple list, if found + * + * This helper function extracts a simple list beginning with any of + * 'o','-'.'#','+','0','1','0.','1.' and starts parsing it. + * @param string line that may contain a simple list + * @return boolean true if a list is found, false otherwise + */ + function doSimpleList($word) + { + if ($this->p_flags['in_event']) return true; + if (is_object($word)) return false; + $ltrimword = ltrim($word); + if ((strlen($ltrimword) != strlen($word)) + && strlen($ltrimword) > 1 + && ((in_array($ltrimword{0},array('o','-','1','0','#','+')) && $ltrimword{1} == ' ')) + || ((strlen($ltrimword) >= 2) && (in_array(substr($ltrimword,0,2),array('1.','0.')) && $ltrimword{2} == ' '))) + { + // save the whitespace for comparison + $this->p_vars['whitespace'] = substr($word,0,strlen($word) - strlen($ltrimword)); + $this->p_vars['start_list'] = $ltrimword{0}; + if ($this->p_vars['start_list'] != '1' && $this->p_vars['start_list'] != '1.' && + $this->p_vars['start_list'] != '0' && $this->p_vars['start_list'] != '0.') + { + $this->p_flags['orderedlist'] = false; + } else + { + if (substr($ltrimword,0,2) == '1.') + { + $this->p_vars['start_list'] = '1.'; + } + $this->p_flags['orderedlist'] = true; + } + $this->p_vars['event_stack']->pushEvent(PHPDOCUMENTOR_PDP_EVENT_SIMLIST); + $this->setContext('list'); + $this->p_flags['simplelist'] = true; + $this->p_vars['lists'][0] = new parserList($this->p_flags['orderedlist']); + $this->p_vars['list_count'] = 0; + $this->handleSimpleList($word, PHPDOCUMENTOR_PDP_EVENT_SIMLIST, true); + return true; + } + return false; + } + /** + * setup the parser tokens, and the pushEvent/popEvent arrays + * @see $tokens, $pushEvent, $popEvent + * @param boolean determines whether to allow paragraph parsing + * @global boolean used to determine whether to slow things down or not by + * eliminating whitespace from comments + */ + + function setupStates($sdesc) + { + $this->p_flags['in_item'] = false; + $this->p_flags['in_event'] = false; + $this->p_flags['simplelist'] = false; + $this->_context = array('normal'); + $this->tokens[STATE_NOEVENTS] = array("\n", "", "

            ", "
              ", "
                ", + "", "", '', '', '', "tokens[STATE_NOEVENTS][] = "

                "; + $this->tokens[STATE_NOEVENTS][] = "

                "; + } + if (PHPDOCUMENTOR_KILL_WHITESPACE) $this->tokens[STATE_NOEVENTS][] = ' '; + $this->tokens[PHPDOCUMENTOR_PDP_STATE_P] = array("

                ","","
                ", '<
                ","\n","
                  ","
                    ","","","", '<<', + '', '', ''); + if (PHPDOCUMENTOR_KILL_WHITESPACE) $this->tokens[PHPDOCUMENTOR_PDP_STATE_P][] = ' '; + $this->tokens[PHPDOCUMENTOR_PDP_STATE_CODE] = array("", '<>'); + $this->tokens[PHPDOCUMENTOR_PDP_STATE_PRE] = array("
            >'); + $this->tokens[PHPDOCUMENTOR_PDP_STATE_LIST] = array("
              ","
                ","
            ","
        ","
      • ","
      • ","","","","
        ","', '', '');
        +        $this->tokens[PHPDOCUMENTOR_PDP_STATE_DOUBLECR]        = array("\n","
          ","
            ","","
            ","","","","

            ", + '', '', '', '<<'); + $this->tokens[PHPDOCUMENTOR_PDP_STATE_SIMLIST] = array("\n",'', '', '','','', '
            ', '',
            +                                                                    'tokens[PHPDOCUMENTOR_PDP_STATE_B]    = array("","\n","
            ","
              ","
                ","","","', '', ''); + $this->tokens[PHPDOCUMENTOR_PDP_STATE_KBD] = array("","\n","
                ","
                  ","
                    ","","","', '', ''); + $this->tokens[PHPDOCUMENTOR_PDP_STATE_VAR] = array("","\n","
                    ","
                      ","
                        ","","","', '', ''); + $this->tokens[PHPDOCUMENTOR_PDP_STATE_SAMP] = array("","\n","
                        ","
                          ","
                            ","","","', '', ''); + $this->tokens[PHPDOCUMENTOR_PDP_STATE_I] = array("","\n","
                            ","
                              ","
                                ","","","', '', ''); + $this->tokens[PHPDOCUMENTOR_PDP_STATE_BR] = array(">","/>"); + $this->tokens[PHPDOCUMENTOR_PDP_STATE_ESCAPE] = array('code>>', '/code>>', 'pre>>', '/pre>>', 'b>>', '/b>>', + 'i>>', '/i>>', 'ol>>', '/ol>>', 'ul>>', '/ul>>', + 'br>>', 'br />>', 'p>>', '/p>>', 'samp>>', '/samp>>', + 'kbd>>', '/kbd>>', 'var>>', '/var>>'); + if (PHPDOCUMENTOR_KILL_WHITESPACE) $this->tokens[PHPDOCUMENTOR_PDP_STATE_DOUBLECR][] = ' '; + + // For each event word to event mapings + $this->pushEvent[PARSER_EVENT_NOEVENTS] = + array( + "" => PHPDOCUMENTOR_PDP_EVENT_CODE, + ">' => PHPDOCUMENTOR_PDP_EVENT_ESCAPE_PRE, + ); + + $this->popEvent[PHPDOCUMENTOR_PDP_EVENT_PRE] = array("
                                "    => PHPDOCUMENTOR_PDP_EVENT_PRE,
                                +                "

                                " => PHPDOCUMENTOR_PDP_EVENT_P, + "" => PHPDOCUMENTOR_PDP_EVENT_VAR, + "" => PHPDOCUMENTOR_PDP_EVENT_SAMP, + "" => PHPDOCUMENTOR_PDP_EVENT_KBD, + "

                                  " => PHPDOCUMENTOR_PDP_EVENT_LIST, + "
                                    " => PHPDOCUMENTOR_PDP_EVENT_LIST, + "" => PHPDOCUMENTOR_PDP_EVENT_B, + "" => PHPDOCUMENTOR_PDP_EVENT_I, + " PHPDOCUMENTOR_PDP_EVENT_BR, + "\n" => PHPDOCUMENTOR_PDP_EVENT_DOUBLECR, + '<<' => PHPDOCUMENTOR_PDP_EVENT_ESCAPE, + ); +########################## + $this->pushEvent[PHPDOCUMENTOR_PDP_EVENT_CODE] = + array( + '<>' => PHPDOCUMENTOR_PDP_EVENT_ESCAPE_CODE, + ); + + $this->popEvent[PHPDOCUMENTOR_PDP_EVENT_CODE] = array(""); +########################## + $this->pushEvent[PHPDOCUMENTOR_PDP_EVENT_PRE] = + array( + '<
                            "); +########################## + + $this->popEvent[PHPDOCUMENTOR_PDP_EVENT_BR] = array(">","/>"); +########################## + $this->pushEvent[PHPDOCUMENTOR_PDP_EVENT_P] = + array( + "" => PHPDOCUMENTOR_PDP_EVENT_CODE, + "
                              " => PHPDOCUMENTOR_PDP_EVENT_LIST, + "
                                " => PHPDOCUMENTOR_PDP_EVENT_LIST, + "" => PHPDOCUMENTOR_PDP_EVENT_VAR, + "" => PHPDOCUMENTOR_PDP_EVENT_SAMP, + "" => PHPDOCUMENTOR_PDP_EVENT_KBD, + "
                                " => PHPDOCUMENTOR_PDP_EVENT_PRE,
                                +                "" => PHPDOCUMENTOR_PDP_EVENT_B,
                                +                "" => PHPDOCUMENTOR_PDP_EVENT_I,
                                +                " PHPDOCUMENTOR_PDP_EVENT_BR,
                                +                '<<' => PHPDOCUMENTOR_PDP_EVENT_ESCAPE,
                                +            );
                                +         
                                +        $this->popEvent[PHPDOCUMENTOR_PDP_EVENT_P] = array("

                                "); +########################## + + $this->pushEvent[PHPDOCUMENTOR_PDP_EVENT_LIST] = + array( + "
                                  " => PHPDOCUMENTOR_PDP_EVENT_LIST, + "
                                    " => PHPDOCUMENTOR_PDP_EVENT_LIST, + "" => PHPDOCUMENTOR_PDP_EVENT_CODE, + "" => PHPDOCUMENTOR_PDP_EVENT_VAR, + "" => PHPDOCUMENTOR_PDP_EVENT_SAMP, + "" => PHPDOCUMENTOR_PDP_EVENT_KBD, + "" => PHPDOCUMENTOR_PDP_EVENT_B, + "" => PHPDOCUMENTOR_PDP_EVENT_I, + "
                                    " => PHPDOCUMENTOR_PDP_EVENT_PRE,
                                    +                " PHPDOCUMENTOR_PDP_EVENT_BR,
                                    +                '<<' => PHPDOCUMENTOR_PDP_EVENT_ESCAPE,
                                    +            );
                                    +        
                                    +        $this->popEvent[PHPDOCUMENTOR_PDP_EVENT_LIST] = array("
                                ","
                            "); +########################## + + $this->pushEvent[PHPDOCUMENTOR_PDP_EVENT_SIMLIST] = + array( + "" => PHPDOCUMENTOR_PDP_EVENT_CODE, + "
                            "    => PHPDOCUMENTOR_PDP_EVENT_PRE,
                            +                "

                            " => PHPDOCUMENTOR_PDP_EVENT_P, + "" => PHPDOCUMENTOR_PDP_EVENT_VAR, + "" => PHPDOCUMENTOR_PDP_EVENT_SAMP, + "" => PHPDOCUMENTOR_PDP_EVENT_KBD, + "" => PHPDOCUMENTOR_PDP_EVENT_B, + "" => PHPDOCUMENTOR_PDP_EVENT_I, + " PHPDOCUMENTOR_PDP_EVENT_BR, + '<<' => PHPDOCUMENTOR_PDP_EVENT_ESCAPE, + ); +########################## + + $this->pushEvent[PHPDOCUMENTOR_PDP_EVENT_DOUBLECR] = + array( + "" => PHPDOCUMENTOR_PDP_EVENT_CODE, + "

                              " => PHPDOCUMENTOR_PDP_EVENT_LIST, + "
                                " => PHPDOCUMENTOR_PDP_EVENT_LIST, + "
                                " => PHPDOCUMENTOR_PDP_EVENT_PRE,
                                +                "" => PHPDOCUMENTOR_PDP_EVENT_B,
                                +                "" => PHPDOCUMENTOR_PDP_EVENT_I,
                                +                "" => PHPDOCUMENTOR_PDP_EVENT_VAR,
                                +                "" => PHPDOCUMENTOR_PDP_EVENT_SAMP,
                                +                "" => PHPDOCUMENTOR_PDP_EVENT_KBD,
                                +                " PHPDOCUMENTOR_PDP_EVENT_BR,
                                +                "

                                " => PHPDOCUMENTOR_PDP_EVENT_P, + '<<' => PHPDOCUMENTOR_PDP_EVENT_ESCAPE, + ); + +########################## + $this->pushEvent[PHPDOCUMENTOR_PDP_EVENT_B] = + array( + "" => PHPDOCUMENTOR_PDP_EVENT_CODE, + "

                                  " => PHPDOCUMENTOR_PDP_EVENT_LIST, + "
                                    " => PHPDOCUMENTOR_PDP_EVENT_LIST, + "
                                    " => PHPDOCUMENTOR_PDP_EVENT_PRE,
                                    +                "" => PHPDOCUMENTOR_PDP_EVENT_VAR,
                                    +                "" => PHPDOCUMENTOR_PDP_EVENT_SAMP,
                                    +                "" => PHPDOCUMENTOR_PDP_EVENT_KBD,
                                    +                " PHPDOCUMENTOR_PDP_EVENT_BR,
                                    +                '' => PHPDOCUMENTOR_PDP_EVENT_I,
                                    +                '<<' => PHPDOCUMENTOR_PDP_EVENT_ESCAPE,
                                    +            );
                                    +         
                                    +        $this->popEvent[PHPDOCUMENTOR_PDP_EVENT_B] = array("");
                                    +
                                    +##########################
                                    +        $this->pushEvent[PHPDOCUMENTOR_PDP_EVENT_I] =
                                    +            array(
                                    +                "" => PHPDOCUMENTOR_PDP_EVENT_CODE,
                                    +                "
                                      " => PHPDOCUMENTOR_PDP_EVENT_LIST, + "
                                        " => PHPDOCUMENTOR_PDP_EVENT_LIST, + "
                                        " => PHPDOCUMENTOR_PDP_EVENT_PRE,
                                        +                "" => PHPDOCUMENTOR_PDP_EVENT_VAR,
                                        +                "" => PHPDOCUMENTOR_PDP_EVENT_SAMP,
                                        +                "" => PHPDOCUMENTOR_PDP_EVENT_KBD,
                                        +                " PHPDOCUMENTOR_PDP_EVENT_BR,
                                        +                '' => PHPDOCUMENTOR_PDP_EVENT_B,
                                        +                '<<' => PHPDOCUMENTOR_PDP_EVENT_ESCAPE,
                                        +            );
                                        +         
                                        +        $this->popEvent[PHPDOCUMENTOR_PDP_EVENT_I] = array("");
                                        +
                                        +##########################
                                        +        $this->pushEvent[PHPDOCUMENTOR_PDP_EVENT_VAR] =
                                        +            array(
                                        +                "" => PHPDOCUMENTOR_PDP_EVENT_CODE,
                                        +                "
                                          " => PHPDOCUMENTOR_PDP_EVENT_LIST, + "
                                            " => PHPDOCUMENTOR_PDP_EVENT_LIST, + "
                                            " => PHPDOCUMENTOR_PDP_EVENT_PRE,
                                            +                "" => PHPDOCUMENTOR_PDP_EVENT_I,
                                            +                "" => PHPDOCUMENTOR_PDP_EVENT_SAMP,
                                            +                "" => PHPDOCUMENTOR_PDP_EVENT_KBD,
                                            +                " PHPDOCUMENTOR_PDP_EVENT_BR,
                                            +                '' => PHPDOCUMENTOR_PDP_EVENT_B,
                                            +                '<<' => PHPDOCUMENTOR_PDP_EVENT_ESCAPE,
                                            +            );
                                            +         
                                            +        $this->popEvent[PHPDOCUMENTOR_PDP_EVENT_VAR] = array("");
                                            +
                                            +##########################
                                            +        $this->pushEvent[PHPDOCUMENTOR_PDP_EVENT_SAMP] =
                                            +            array(
                                            +                "" => PHPDOCUMENTOR_PDP_EVENT_CODE,
                                            +                "
                                              " => PHPDOCUMENTOR_PDP_EVENT_LIST, + "
                                                " => PHPDOCUMENTOR_PDP_EVENT_LIST, + "
                                                " => PHPDOCUMENTOR_PDP_EVENT_PRE,
                                                +                "" => PHPDOCUMENTOR_PDP_EVENT_VAR,
                                                +                "" => PHPDOCUMENTOR_PDP_EVENT_I,
                                                +                "" => PHPDOCUMENTOR_PDP_EVENT_KBD,
                                                +                " PHPDOCUMENTOR_PDP_EVENT_BR,
                                                +                '' => PHPDOCUMENTOR_PDP_EVENT_B,
                                                +                '<<' => PHPDOCUMENTOR_PDP_EVENT_ESCAPE,
                                                +            );
                                                +         
                                                +        $this->popEvent[PHPDOCUMENTOR_PDP_EVENT_SAMP] = array("");
                                                +
                                                +##########################
                                                +        $this->pushEvent[PHPDOCUMENTOR_PDP_EVENT_KBD] =
                                                +            array(
                                                +                " PHPDOCUMENTOR_PDP_EVENT_CODE,
                                                +                "
                                                  " => PHPDOCUMENTOR_PDP_EVENT_LIST, + "
                                                    " => PHPDOCUMENTOR_PDP_EVENT_LIST, + " PHPDOCUMENTOR_PDP_EVENT_PRE, + "" => PHPDOCUMENTOR_PDP_EVENT_VAR, + "" => PHPDOCUMENTOR_PDP_EVENT_SAMP, + "" => PHPDOCUMENTOR_PDP_EVENT_I, + " PHPDOCUMENTOR_PDP_EVENT_BR, + '' => PHPDOCUMENTOR_PDP_EVENT_B, + '<<' => PHPDOCUMENTOR_PDP_EVENT_ESCAPE, + ); + + $this->popEvent[PHPDOCUMENTOR_PDP_EVENT_KBD] = array(""); + } + + function getParserEventName ($value) + { + $lookup = array( + PARSER_EVENT_NOEVENTS => "PARSER_EVENT_NOEVENTS", + PHPDOCUMENTOR_PDP_EVENT_CODE => "PHPDOCUMENTOR_PDP_EVENT_CODE", + PHPDOCUMENTOR_PDP_EVENT_P => "PHPDOCUMENTOR_PDP_EVENT_P", + PHPDOCUMENTOR_PDP_EVENT_B => "PHPDOCUMENTOR_PDP_EVENT_B", + PHPDOCUMENTOR_PDP_EVENT_I => "PHPDOCUMENTOR_PDP_EVENT_I", + PHPDOCUMENTOR_PDP_EVENT_BR => "PHPDOCUMENTOR_PDP_EVENT_BR", + PHPDOCUMENTOR_PDP_EVENT_VAR => "PHPDOCUMENTOR_PDP_EVENT_VAR", + PHPDOCUMENTOR_PDP_EVENT_SAMP => "PHPDOCUMENTOR_PDP_EVENT_SAMP", + PHPDOCUMENTOR_PDP_EVENT_KBD => "PHPDOCUMENTOR_PDP_EVENT_KBD", + PHPDOCUMENTOR_PDP_EVENT_ESCAPE => "PHPDOCUMENTOR_PDP_EVENT_ESCAPE", + PHPDOCUMENTOR_PDP_EVENT_ESCAPE_CODE => "PHPDOCUMENTOR_PDP_EVENT_ESCAPE_CODE", + PHPDOCUMENTOR_PDP_EVENT_ESCAPE_PRE => "PHPDOCUMENTOR_PDP_EVENT_ESCAPE_PRE", + PHPDOCUMENTOR_PDP_EVENT_DOUBLECR => "PHPDOCUMENTOR_PDP_EVENT_DOUBLECR", + PHPDOCUMENTOR_PDP_EVENT_LIST => "PHPDOCUMENTOR_PDP_EVENT_LIST", + PHPDOCUMENTOR_PDP_EVENT_PRE => "PHPDOCUMENTOR_PDP_EVENT_PRE", + PHPDOCUMENTOR_PDP_EVENT_SIMLIST => "PHPDOCUMENTOR_PDP_EVENT_SIMLIST", + ); + if (isset($lookup[$value])) + return $lookup[$value]; + else return $value; + } +} + +?> diff --git a/buildscripts/PhpDocumentor/phpDocumentor/ParserDocBlock.inc b/buildscripts/PhpDocumentor/phpDocumentor/ParserDocBlock.inc new file mode 100644 index 00000000..96ea1b20 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/ParserDocBlock.inc @@ -0,0 +1,1165 @@ + + * @since 1.0rc1 + * @version $Id: ParserDocBlock.inc,v 1.1 2005/10/17 18:36:57 jeichorn Exp $ + */ +class parserDesc extends parserStringWithInlineTags +{ + /** + * Type is used by many functions to skip the hassle of if phpDocumentor_get_class($blah) == 'parserBlah' + * always '_desc' + * @var string + */ + var $type = '_desc'; + + /** + * @param mixed like {@link parserStringWithInlineTags::add()}, this can be a string or parserInlineTag, but it can also be a + * parserStringWithInlineTags, and the contents will be merged + */ + function add($stringOrClass) + { + if (is_object($stringOrClass)) + { + if (phpDocumentor_get_class($stringOrClass) == 'parserstringwithinlinetags' || + phpDocumentor_get_class($stringOrClass) == 'parserdesc') + { + for($i=0;$ivalue);$i++) + { + parserStringWithInlineTags::add($stringOrClass->value[$i]); + } + } else + { + parserStringWithInlineTags::add($stringOrClass); + } + } else return parserStringWithInlineTags::add($stringOrClass); + } + + /** + * @return boolean whether this desc has an {@}inheritdoc} inline tag + */ + function hasInheritDoc() + { + for($i=0;$ivalue);$i++) + { + if (phpDocumentor_get_class($this->value[$i])=='parserinheritdocinlinetag') return true; + } + } + + /** + * @return boolean whether this desc has an {@}source} inline tag + */ + function hasSource() + { + for($i=0;$ivalue);$i++) + { + if (phpDocumentor_get_class($this->value[$i])=='parsersourceinlinetag') return true; + } + } + + /** + * replaces {@}inheritdoc} with the contents of the parent DocBlock + * @param parserDesc parent parserDesc, used to retrieve the description + */ + function replaceInheritDoc($desc) + { + $value = $this->value; + $this->value = array(); + for($i=0;$ivalue);$j++) + { + $this->add($desc->value[$j]); + } + } else $this->add($value[$i]); + } + } +} + +/** + * Represents a docblock and its components, {@link $desc}, {@link $sdesc}, {@link $tags}, and also {@link $params} for functions + * @package phpDocumentor + * @subpackage ParserDocBlock + * @author Greg Beaver + * @since 1.0rc1 + * @version $Id: ParserDocBlock.inc,v 1.1 2005/10/17 18:36:57 jeichorn Exp $ + */ +class parserDocBlock +{ + /** + * @var parserDesc + */ + var $desc = false; + /** + * @var array array of {@link parserDesc}s + */ + var $processed_desc = false; + /** + * @var array array of {@link parserDesc}s + */ + var $processed_sdesc = false; + /** + * @var parserDesc + */ + var $sdesc = false; + /** + * Line number in the source on which this docblock begins + * @since 1.2 + * @var false|integer + */ + var $linenumber = false; + /** + * Line number in the source on which this docblock ends + * @since 1.2 + * @var false|integer + */ + var $endlinenumber = false; + /** + * array of {@link parserTag}s + * @var array + */ + var $tags = array(); + /** + * array of unrecognized {@link parserTag}s + * @var array + */ + var $unknown_tags = array(); + /** + * array of param data. + * Format: + * array(index of param in function parameter list -OR- parameter name => + * parserStringWithInlineTags,...) + * @var array + */ + var $params = array(); + /** + * array of global variable data. + * Format: + * array(index of global variable in @global tag list -OR- global variable name => + * array(datatype,parserStringWithInlineTags),...) + * @var array + */ + var $funcglobals = array(); + + /** + * array of static variable data. + * Format: + * array(index of static variable in @global tag list -OR- static variable name => + * {@link parserStaticvarTag},...) + * @var array + */ + var $statics = array(); + /** + * This is either a {@link parserReturnTag} or false if no return tag is present + * @var mixed + */ + var $return = false; + /** + * This is either a {@link parserVarTag} or false if no var tag is present + * @var mixed + */ + var $var = false; + /** + * fix for bug 591396 + * @var boolean + */ + var $explicitpackage = false; + /** + * fix for bug 708559 + * @var boolean + */ + var $explicitcategory = false; + /** @var string */ + var $category; + /** @var string */ + var $package = 'default'; + /** @var string */ + var $subpackage = ''; + /** + * whether this DocBlock has an @access tag + * @var boolean */ + var $hasaccess = false; + /** + * whether this DocBlock has a @name tag + * @var boolean */ + var $hasname = false; + /** + * description of package parsed from @package tag + * Unused in this version + * @var string + */ + var $packagedescrip = ''; + /** + * description of subpackage parsed from @package tag + * Unused in this version + * @var string + */ + var $subpackagedescrip = ''; + /** + * Determines whether a DocBlock can legally have a {@}source} tag + * @tutorial tags.inlinesource.pkg + * @var boolean + * @access private + */ + var $_canSource = false; + + /** + * sets package to default + * @global string default package name + */ + function parserDocBlock() + { + global $phpDocumentor_DefaultPackageName; + $this->package = $GLOBALS['phpDocumentor_DefaultPackageName']; + $this->category = $GLOBALS['phpDocumentor_DefaultCategoryName']; + } + + /** + * Sets the starting line number for the DocBlock + * @param integer + */ + function setLineNumber($number) + { + $this->linenumber = $number; + } + + /** + * Retrieve starting line number + * @return integer + */ + function getLineNumber() + { + return $this->linenumber; + } + + /** + * Sets the ending line number for the DocBlock + * @param integer + */ + function setEndLineNumber($number) + { + $this->endlinenumber = $number; + } + + /** + * Retrieve ending line number + * @return integer + */ + function getEndLineNumber() + { + return $this->endlinenumber; + } + + /** + * Parse out any html tags from doc comments, and make them into + * abstract structures + * @uses parserDescParser::parse() + */ + function postProcess() + { + if ($this->sdesc) + { + $parser = new parserDescParser; + $parser->subscribe('*',$this); + if ($this->desc) $parser->parse($this->desc->value); + $parser->parse($this->sdesc->value,true); + } + } + + /** + * Tells the DocBlock it can have a @filesource tag + * + * Only page-level DocBlocks may have a @filesource tag + */ + function canSource() + { + $this->_canSource = true; + } + + /** + * Tells the DocBlock it can't have a @filesource tag + * + * Only page-level DocBlocks may have a @filesource tag + */ + function cantSource() + { + $this->_canSource = false; + } + + /** + * Indirectly called after parsing by {@link postProcess} + * + * @param integer either 1 for long desc or 2 for short desc + * @param array data organized into paragraphs. Each entry is a {@link parserStringWithInlineTags} + * @uses $processed_desc sets to the array passed from {@link parserDescParser::parse()} + * @uses $processed_sdesc sets to the array passed from {@link parserDescParser::parse()} + * @access private + */ + function HandleEvent($event,$data) + { + if ($event == 1) + $this->processed_desc = $data; + else + $this->processed_sdesc = $data; + } + + /** + * @param array + */ + function updateModifiers($modifiers) + { + if (is_array($modifiers) && count($modifiers)) + { + foreach ($modifiers as $modifier) + { + switch ($modifier) + { + case 'private' : + case 'public' : + case 'protected' : + unset($this->tags['access']); + $x = new parserAccessTag($modifier); + if ($x->isvalid) + { + $this->hasaccess = true; + $this->tags['access'][] = $x; + } + break; + case 'static' : + case 'abstract' : + unset($this->tags[$modifier]); + $this->addKeyword($modifier, ''); + break; + } + } + } + } + + /** + * Set the short description of the DocBlock + * + * Setting the short description is possible by passing in one of three + * possible parameters: + *
                                                      + *
                                                    • another DocBlock's short description
                                                    • + *
                                                    • another DocBlock, the short description will be extracted
                                                    • + *
                                                    • a Zend Studio-compatible @desc tag
                                                    • + *
                                                    + * @param parserDesc|parserDocBlock|parserTag sets {@link $sdesc} + */ + function setShortDesc($desc) + { + if (phpDocumentor_get_class($desc) == 'parsertag') + { + $this->sdesc = new parserDesc; + $this->processed_sdesc = $desc->value; + return; + } + if (phpDocumentor_get_class($desc) == 'parserdesc') { + $this->sdesc = $desc; + } else + { + $this->sdesc = $desc->sdesc; + $this->processed_sdesc = $desc->processed_sdesc; + } + + if ($this->sdesc && $this->sdesc->hasSource()) + { + addWarning(PDERROR_SOURCE_TAG_IGNORED,$this->sdesc->getString()); + } + } + + /** + * Passes to {@link parserStringWithInlineTags::setSource()} + * + * After passing, it calls {@link postProcess()} to set up the new + * source + * @param string|array tokenized highlight-ready source code + * @param false|string name of class if this is a method source + */ + function setSource($source, $class = false) + { + if ($this->desc) + { + $this->desc->setSource($source, $class); + $this->postProcess(); + } + } + + /** + * @param parserDesc|parserDocBlock sets {@link $desc} + */ + function setDesc($desc) + { + if (phpDocumentor_get_class($desc) == 'parserdesc') + $this->desc = $desc; + else + { + $this->desc = $desc->desc; + $this->processed_desc = $desc->processed_desc; + } + } + + /** + * Wrapper for {@link parserDesc::hasInheritDoc()} + * @return boolean + */ + function hasInheritDoc() + { + if (!$this->desc) return false; + return $this->desc->hasInheritDoc(); + } + + /** + * Wrapper for {@link parserDesc::replaceInheritDoc()} + * + * Also replaces {@}inheritdoc} in the {@link $processed_desc} + * @param parserDesc + */ + function replaceInheritDoc($desc) + { + if (!$this->desc) return false; + $this->desc->replaceInheritDoc($desc->desc); + $this->postProcess(); + } + + /** + * @param Converter takes {@link $sdesc} and converts it to a string and returns it if present, otherwise returns '' + * @return string + */ + function getSDesc(&$converter) + { + if ($this->sdesc && $this->processed_sdesc) + { + $result = ''; + foreach($this->processed_sdesc as $desc) + { + if (count($desc->value)) + $result .= $desc->Convert($converter); + } + return $result; + } else + { +// var_dump($this->desc,$this->processed_desc); + } + return ''; + } + + /** + * @param Converter takes {@link $desc} and converts it to a string and returns it if present, otherwise returns '' + * @return string + */ + function getDesc(&$converter) + { + if ($this->desc && $this->processed_desc) + { + $result = ''; + foreach($this->processed_desc as $desc) + { + if (count($desc->value)) + $result .= $converter->EncloseParagraph($desc->Convert($converter)); + } + return $result; + } else + { +// var_dump($this->desc,$this->processed_desc); + } + return ''; + } + + /** + * @param string $paramVar if empty, param is indexed in the order received and set using {@link changeParam()} + * @param parserStringWithInlineTags $value + */ + function addParam($paramVar, $paramType, $value) + { + if (empty($paramVar)) + $this->params[count($this->params)] = new parserParamTag($paramType,$value); + else + $this->params[$paramVar] = new parserParamTag($paramType,$value); + } + + /** + * @param integer $index index of parameter in the {@link $params} array + * @param string $name name of the parameter to set in the $params array + */ + function changeParam($index,$name) + { + $this->params[$name] = $this->params[$index]; + unset($this->params[$index]); + } + + /** + * replaces nameless parameters in the {@link $params} array with their names + * @param array $params Format: array(parameter index => parameter name,...) + */ + function updateParams($params) + { + for($i=0;$iparams[$i])) + { + $this->changeParam($i,$params[$i]); + } + } + if (isset($this->tags)) + unset($this->tags['param']); + } + + /** + * Used to insert DocBlock Template tags into a docblock + * @param parserTag tag + * @global array used to determine whether to add ignored tags, or not + */ + function addTag($tag) + { + global $_phpDocumentor_setting; + if (phpDocumentor_setup::checkIgnoreTag($tag->keyword)) return; + $value = $tag->value; + if (is_array($value)) $value = $value[0]; + if ($tag->keyword == 'uses') + { + $this->addUses($value, $tag->_description); + } else + { + $this->addKeyword($tag->keyword, $value); + } + } + + /** + * @param string $keyword tag name + * @param parserStringWithInlineTags $value the contents of the tag + * @global array used to determine whether to add the @internal tag or not + */ + function addKeyword($keyword, $value) + { + global $_phpDocumentor_setting; + if (phpDocumentor_setup::checkIgnoreTag($keyword)) return; + // don't add the tag at all if it was specified to ignore it with --ignore-tags + if ($keyword == 'package' || $keyword == 'subpackage' || $keyword == 'category') return $this->addPackage($keyword, $value); + if ($keyword == 'access') return $this->addAccess($value); + if ($keyword == 'link') return $this->addLink($value); + if ($keyword == 'see' || $keyword == 'tutorial') return $this->addSee($keyword,$value); + if ($keyword == 'uses') return $this->addUses($keyword, $value); + if ($keyword == 'name') return $this->addName($value); + if (!in_array($keyword,$GLOBALS['_phpDocumentor_tags_allowed'])) + $this->addUnknownTag($keyword,$value); + else + { + if ($keyword == 'internal' && (!isset($_phpDocumentor_setting['parseprivate']) || $_phpDocumentor_setting['parseprivate'] == 'off')) return; + if (!isset($this->tags[$keyword])) { + $this->tags[$keyword] = array(); + } + $ptag = 'parserTag'; + if (class_exists('parser'.$keyword.'tag')) + $ptag = 'parser'.ucfirst($keyword).'Tag'; + array_unshift($this->tags[$keyword], new $ptag($keyword, $value)); + } + } + + /** + * adds an @example tag + * @param string contents of the tag + * @param string path to the file containing this tag + */ + function addExample($value, $path) + { + $this->tags['example'][] = new parserExampleTag($value, $path); + } + + /** + * adds an unknown tag to the {@link $unknown_tags} array for use by custom converters + * @param string tag name + * @param string tag value + */ + function addUnknownTag($keyword, $value) + { + addWarning(PDERROR_UNKNOWN_TAG,$keyword); + $this->unknown_tags[$keyword][] = new parserTag($keyword, $value); + } + + /** + * set the element's package to the passed values. Used in {@link phpDocumentor_IntermediateParser} to align package of + * elements inside a class or procedural page to the package of the class/procedural page + * @param string + * @param string + * @param string + * @param string element name + * @param string element type (include, define, var, method, global, function, const) + */ + function overridePackage($category, $package,$subpackage,$elname,$type) + { + if ($this->package != $GLOBALS['phpDocumentor_DefaultPackageName']) + { + addError(PDERROR_OVERRIDDEN_PACKAGE_TAGS,$elname,$type,$this->package); + $this->explicitpackage = false; + } + if (!empty($this->subpackage)) + addError(PDERROR_OVERRIDDEN_SUBPACKAGE_TAGS,$type,$elname,$this->subpackage); + $this->package = $GLOBALS['phpDocumentor_DefaultPackageName']; + $this->subpackage = ''; + $this->category = $category; + $this->addPackage('package',$package); + $this->addPackage('subpackage',$subpackage); + } + + /** + * Used if this docblock has a @package tag. + * + * phpDocumentor will guess package for DocBlocks that don't have + * a @package tag + * @uses $explicitpackage + */ + function setExplicitPackage() + { + $this->explicitpackage = true; + } + + /** + * If the DocBlock has a @package tag, then this returns true + * @return boolean + */ + function getExplicitPackage() + { + return $this->explicitpackage; + } + + /** + * Used if this docblock has a @category tag. + * + * phpDocumentor will guess category for DocBlocks that don't have + * a @category tag + * @uses $explicitcategory + */ + function setExplicitCategory() + { + $this->explicitcategory = true; + } + + /** + * If the DocBlock has a @category tag, then this returns true + * @return boolean + */ + function getExplicitCategory() + { + return $this->explicitcategory; + } + + /** + * @param string $keyword tag name (either package or subpackage) + * @param mixed $value either a string or a parserStringWithInlineTags. Strips all inline tags and use the text as the package + */ + function addPackage($keyword, $value) + { + if ($keyword == 'package') + { + if (!$this->explicitpackage) + { + if (!is_string($value)) + $value = $value->getString(); + $rest = ''; + $value = explode(' ',$value); + if (count($value) - 1) + { + $rest = $value; + $value = $value[0]; + unset($rest[0]); + $rest = implode($rest,' '); + } else + { + $value = explode("\t",$value[0]); + if (count($value) - 1) + { + $rest = $value; + $value = $value[0]; + unset($rest[0]); + $rest = implode($rest,"\t"); + } else $value = $value[0]; + } + preg_match("/^([^`~!@#$%^&*(){}|<>,;]+)$/",$value,$match); + if (!isset($match[0])) + { + // if were a single line and the only bad character is a space then will fix things for them + preg_match("/^([^`~!@#$%^&*(){}|<>,;]+)$/",$value,$match); + if (!isset($match[0])) + { + addError(PDERROR_ILLEGAL_PACKAGENAME,'package','package',$value); + $value = $GLOBALS['phpDocumentor_DefaultPackageName']; + } + else + { + $value = + str_replace(array(" ","/","\\",":"),"_", + trim($value)); + } + } + $this->packagedescrip = $this->package = trim($value); + if (!empty($rest)) $this->packagedescrip = $rest; + } else + { + if (is_string($value)) + addError(PDERROR_MULTIPLE_PACKAGE_TAGS,$value); + else + addError(PDERROR_MULTIPLE_PACKAGE_TAGS,$value->getString()); + } + } elseif ($keyword == 'subpackage') + { + if (empty($this->subpackage)) + { + if (!is_string($value)) + $value = $value->getString(); + $rest = ''; + $value = explode(' ',$value); + if (count($value) - 1) + { + $rest = $value; + $value = $value[0]; + unset($rest[0]); + $rest = implode($rest,' '); + } else + { + $value = explode("\t",$value[0]); + if (count($value) - 1) + { + $rest = $value; + $value = $value[0]; + unset($rest[0]); + $rest = implode($rest,"\t"); + } else $value = $value[0]; + } + if (!empty($value)) + { + preg_match("/^([^`~!@#$%^&*(){}|<>,;]+)$/",$value,$match); + if (!isset($match[0])) + { + // if were a single line and the only bad character is a space then will fix things for them + preg_match("/^([^`~!@#$%^&*(){}|<>,;]+)$/",$value,$match); + if (!isset($match[0])) + { + addError(PDERROR_ILLEGAL_PACKAGENAME,'subpackage','subpackage',$value); + $value = ''; + } + else + { + $value = + str_replace(array(" ","/","\\",":"),"_", + trim($value)); + } + } + } + $this->subpackage = trim($value); + if (!empty($rest)) $this->subpackagedescrip = $rest; + } else + { + if (is_string($value)) + addError(PDERROR_MULTIPLE_SUBPACKAGE_TAGS,$value); + else + addError(PDERROR_MULTIPLE_SUBPACKAGE_TAGS,$value->getString()); + } + } elseif ($keyword == 'category') + { + if (!$this->explicitcategory) + { + if (!is_string($value)) + $value = $value->getString(); + $this->category = $value; + } else + { + if (is_string($value)) + addError(PDERROR_MULTIPLE_CATEGORY_TAGS,$value); + else + addError(PDERROR_MULTIPLE_CATEGORY_TAGS,$value->getString()); + } + } + } + + /** + * Adds a @name tag to the tag list + * @param string new name of element + */ + function addName($value) + { + if (is_object($value)) $value = $value->getString(); + if (!$this->hasname) + { + $x = new parserNameTag('name',$value); + $this->hasname = true; + $this->tags['name'][] = $x; + } else + { + addError(PDERROR_MULTIPLE_NAME_TAGS,$value); + } + } + + /** + * @param string if empty, staticvar is indexed in the order received and set using {@link changeStatic()} + * @param string data type + * @param parserStringWithInlineTags + */ + function addStaticVar($staticvar, $type, $descrip) + { + if (empty($staticvar)) + $this->statics[] = new parserStaticvarTag($type,$descrip); + else + $this->statics[$staticvar] = new parserStaticvarTag($type,$descrip); + } + + /** + * adds a function declaration of @global to the {@link $funcglobals} array + * @param string global type + * @param string description of how the global is used in the function + */ + function addFuncGlobal($type,$value) + { + $this->funcglobals[] = array($type,$value); + } + + /** + * @param integer $index index of parameter in the {@link $funcglobals} array + * @param string $name name of the parameter to set in the $funcglobals array + */ + function changeGlobal($index,$name) + { + $this->funcglobals[$name] = $this->funcglobals[$index]; + unset($this->funcglobals[$index]); + } + + /** + * @param integer $index index of parameter in the {@link $statics} array + * @param string $name name of the parameter to set in the $statics array + */ + function changeStatic($index,$name) + { + $this->statics[$name] = $this->statics[$index]; + unset($this->statics[$index]); + } + + /** + * replaces nameless global variables in the {@link $funcglobals} array with their names + * @param array + */ + function updateGlobals($funcs) + { + for($i=0;$ifuncglobals[$i])) + { + $this->changeGlobal($i,$funcs[$i]); + } + } + } + + /** + * replaces nameless static variables in the {@link $statics} array with their names + * @param array + */ + function updateStatics($funcs) + { + for($i=0;$istatics[$i])) + { + $this->changeStatic($i,$funcs[$i]); + } + } + } + + /** + * add an @access tag to the {@link tags} array + * @param string should be either public or private + */ + function addAccess($value) + { + if (is_object($value)) $value = $value->getString(); + $value = strtolower($value); + if (!$this->hasaccess) + { + $x = new parserAccessTag($value); + if ($x->isvalid) + { + $this->hasaccess = true; + $this->tags['access'][] = $x; + } + } else + { + if (is_string($value)) + addError(PDERROR_MULTIPLE_ACCESS_TAGS,$value); + else + addError(PDERROR_MULTIPLE_ACCESS_TAGS,$value->getString()); + } + } + + /** + * Adds a new @filesource tag to the DocBlock + * @tutorial tags.filesource.pkg + * @param string full path to the file + * @param array tokenized source code, ordered by line number + */ + function addFileSource($path, $source) + { + if (isset($this->tags['filesource'])) return; + $this->tags['filesource'][] = new parserFileSourceTag($path, $source); + } + + /** + * creates a {@link parserLinkTag} and adds it to the {@link $tags} array + * @param string $link + */ + function addLink($link) + { + if (phpDocumentor_setup::checkIgnoreTag('@link')) return; + $this->tags['link'][] = new parserLinkTag($link); + } + + /** + * creates a {@link parserLinkTag} and adds it to the {@link $tags} array + * @param string either see or uses + * @param string $value + */ + function addSee($keyword,$value) + { + if (phpDocumentor_setup::checkIgnoreTag($keyword)) return; + $tag = 'parser'.ucfirst($keyword).'Tag'; + $this->tags[$keyword][] = new $tag($value); + } + + /** + * creates a {@link parserReturnTag} and adds it to the {@link $tags} array + * @param string $returnType the one-word name of the return type (mixed should be used if more than one type) + * @param parserStringWithInlineTags $value + */ + function addReturn($returnType, $value) + { + // only take the first one + if (!$this->return) + { + $this->return = new parserReturnTag($returnType, $value); + } else + { + addError(PDERROR_MULTIPLE_RETURN_TAGS,$returnType,$value->getString()); + } + } + + /** + * creates a {@link parserVarTag} and adds it to the {@link $tags} array + * @param string $varType the one-word name of the variable type (mixed should be used if more than one type) + * @param parserStringWithInlineTags $value + */ + function addVar($varType, $value) + { + // only take the first one + if (!$this->var) + { + $this->var = new parserVarTag($varType, $value); + } else + { + addError(PDERROR_MULTIPLE_VAR_TAGS,$varType,$value->getString()); + } + } + + /** + * Adds a virtual @usedby tag to output + * @param abstractLink link to the element that has a @uses tag + * @param parserStringWithInlinetags description of how the elements uses + * this one + * @access private + */ + function addUsedBy($link, $descrip) + { + $this->tags['usedby'][] = new parserUsedByTag($link, $descrip); + } + + /** + * Add a @uses tag to the DocBlock + * @param string @see-style text, used for {@link Converter::getLink()} + * @param parserStringWithInlineTags description of how the used element is + * used + * @tutorial tags.uses.pkg + */ + function addUses($seeel, $description) + { + $this->tags['uses'][] = new parserUsesTag($seeel, $description); + } + + /** + * @param string + * @return mixed false if no keyword, unconverted value if one keyword, array of unconverted values if more than one keyword + */ + function getKeyword($keyword) + { + if ($keyword == 'filesource' && !$this->_canSource) return false; + if (isset($this->tags[$keyword])) + { + if (count($this->tags[$keyword]) == 1) + { + return $this->tags[$keyword][0]; + } else return $this->tags[$keyword]; + } else return false; + } + + /** + * @return array Format: array('var' => tag name, 'data' => unconverted tag value) + */ + function listParams() + { + if (isset($this->params)) + { + $ret = array(); + foreach($this->params as $key => $val) + { + $ret[] = array("var" => ucfirst($key),"data" => $val); + } + return $ret; + } else { + return array(); + } + } + + /** + * @param Converter + */ + function listTags() + { + $tags = array(); + foreach($this->tags as $keyword => $vals) + { + if ($keyword == 'filesource' && !$this->_canSource) continue; + foreach($vals as $val) + { + $tags[] = $val; + } + } + usort($tags,'tagsort'); + return $tags; + } + + /** @return string always 'docblock' */ + function getType() + { + return 'docblock'; + } +} + +/** + * @access private + */ +function tagsort($a, $b) +{ + switch(phpDocumentor_get_class($a)) + { + case 'parsertag' : + switch ($a->keyword) + { + case 'author' : + $o = 3; + break; + case 'version' : + $o = 4; + break; + case 'deprecated' : + case 'deprec' : + $o = 7; + break; + case 'todo' : + case 'TODO' : + $o = 8; + break; + case 'abstract' : + $o = 9; + break; + } + case 'parseraccesstag' : + $o = 10; + break; + case 'parsernametag' : + $o = 11; + break; + case 'parserseetag' : + $o = 5; + break; + case 'parserlinktag' : + $o = 6; + break; + case 'parserreturntag' : + $o = 0; + break; + case 'parservartag' : + $o = 1; + break; + case 'parserstaticvartag' : + $o = 2; + break; + default : + $o = 12; + break; + } + switch(phpDocumentor_get_class($b)) + { + case 'parsertag' : + switch ($b->keyword) + { + case 'author' : + $p = 3; + case 'version' : + $p = 4; + case 'deprecated' : + case 'deprec' : + $p = 7; + case 'todo' : + case 'TODO' : + $p = 8; + case 'abstract' : + $p = 9; + } + case 'parseraccesstag' : + $p = 10; + case 'parsernametag' : + $p = 11; + case 'parserseetag' : + $p = 5; + case 'parserlinktag' : + $p = 6; + case 'parserreturntag' : + $p = 0; + case 'parservartag' : + $p = 1; + case 'parsertutorialtag' : + $p = 1; + case 'parserstaticvartag' : + $p = 2; + default : + $p = 12; + } + if ($o == $p) return 0; + if ($o < $p) return -1; + if ($o > $p) return 1; +} +?> diff --git a/buildscripts/PhpDocumentor/phpDocumentor/ParserElements.inc b/buildscripts/PhpDocumentor/phpDocumentor/ParserElements.inc new file mode 100644 index 00000000..a95d24b8 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/ParserElements.inc @@ -0,0 +1,1910 @@ + + * @since 1.0rc1 + * @version $Id: ParserElements.inc,v 1.2 2005/11/28 07:27:59 cellog Exp $ + */ +class parserElement extends parserBase +{ + /** + * @var mixed either false or a {@link parserDocBlock} + */ + var $docblock = false; + /** + * name of this element, or include type if element is a {@link parserInclude} + */ + var $name; + + /** + * @var mixed either false or an array of paths to files with conflicts + */ + var $conflicts = false; + + /** + * location of this element (filename) + * @var string + */ + var $file = ''; + + /** + * full path location of this element (filename) + * @var string + */ + var $path = ''; + + /** + * line number on file where this element stops + * @since 1.2 + * @var false|integer + */ + var $endlinenumber = 0; + + /** + * Line number in the source on which this element appears + * @since 1.2 + * @var false|integer + */ + var $linenumber = false; + + /** + * @param parserDocBlock + */ + function setDocBlock($docblock) + { + $this->docblock = $docblock; + } + + /** + * @param string + */ + function setName($name) + { + $this->name = trim($name); + } + + /** + * Set starting line number + * @param integer + */ + function setLineNumber($number) + { + $this->linenumber = $number; + } + + /** + * Sets the ending line number of elements + * @param integer + */ + function setEndLineNumber($l) + { + $this->endlinenumber = $l; + } + + /** + * @return integer + */ + function getLineNumber() + { + return $this->linenumber; + } + + /** + * @return integer + */ + function getEndLineNumber() + { + return $this->endlinenumber; + } + + /** @return string package containing this element */ + function getPackage() + { + if ($this->docblock) + { + return $this->docblock->package; + } else return $GLOBALS['phpDocumentor_DefaultPackageName']; + } + + /** @param string */ + function setFile($file) + { + $this->file = $file; + } + + /** @param string */ + function setPath($file) + { + // look for special windows case + if(SMART_PATH_DELIMITER === '\\') + $this->path = strtr($file,'/','\\'); + else + $this->path = $file; + $this->path = $file; + } + + /** + * @return string + */ + function getName() + { + if (!isset($this->name)) return false; + return $this->name; + } + + /** + * @return string + */ + function getFile() + { + if (!isset($this->file)) return false; + return $this->file; + } + + /** + * @return string + */ + function getPath() + { + if (!isset($this->path)) return false; + return $this->path; + } +} + +/** + * @package phpDocumentor + * @subpackage ParserElements + * @author Greg Beaver + * @since 1.0rc1 + * @version $Id: ParserElements.inc,v 1.2 2005/11/28 07:27:59 cellog Exp $ + */ +class parserInclude extends parserElement +{ + /** + * Type is used by many functions to skip the hassle of if phpDocumentor_get_class($blah) == 'parserBlah' + * @var string always 'include' + */ + var $type = 'include'; +} + +/** + * @package phpDocumentor + * @subpackage ParserElements + * @author Greg Beaver + * @since 1.1 + * @version $Id: ParserElements.inc,v 1.2 2005/11/28 07:27:59 cellog Exp $ + */ +class parserGlobal extends parserElement +{ + /** + * Type is used by many functions to skip the hassle of if phpDocumentor_get_class($blah) == 'parserBlah' + * @var string always 'global' + */ + var $type = 'global'; + + /** + * Name of the global's data type + * @var string + */ + var $datatype = 'mixed'; + + /** + * quick way to link to this element + * @return mixed converter-specific link to this global variable + * @param Converter + * @param string text to display for the link or false for default text + */ + function getLink(&$c, $text = false, $returnobj = false) + { + if ($returnobj) + { + return $c->getLink('global ' . $this->name, $this->docblock->package); + } + return $c->getGlobalLink($this->name, $this->docblock->package, $this->path, $text); + } + + /** + * Returns all global variables in other packages that have the same name as this global variable + * @return mixed false or an array Format: (package => {@link parserGlobal} of conflicting global variable) + * @param Converter + */ + function getConflicts(&$c) + { + $a = $c->proceduralpages->getGlobalConflicts($this->name); + unset($a[$this->docblock->package]); + return $a; + } + + /** + * Sets the name of the global variable's type + * @param string + */ + function setDataType($type) + { + $this->datatype = $type; + } + + /** + * Retrieve converter-specific representation of the data type + * + * If the data type is a documented class name, then this function will + * return a Converter-specific link to that class's documentation, so users + * can click/browse to the documentation directly from the global variable + * declaration + * @return string + * @param Converter + */ + function getDataType(&$converter) + { + $converted_datatype = $this->datatype; + if (strpos($this->datatype,'|')) + { + $types = explode('|',$this->datatype); + foreach($types as $returntype) + { + $a = $converter->getLink($returntype); + if (is_object($a) && phpDocumentor_get_class($a) == 'classlink') + { + if (!empty($my_types)) $my_types .= '|'; + $my_types .= $converter->returnSee($a,$converter->type_adjust($returntype)); + } else + { + if (!empty($my_types)) $my_types .= '|'; + $my_types .= $converter->type_adjust($returntype); + } + } + $converted_datatype = $my_types; + } else + { + $a = $converter->getLink($this->datatype); + if (is_object($a) && phpDocumentor_get_class($a) == 'classlink') + { + $converted_datatype = $converter->returnSee($a,$converter->type_adjust($this->datatype)); + } else + { + $converted_dataype = $converter->type_adjust($this->datatype); + } + } + return $converted_datatype; + } + +} + +/** + * @package phpDocumentor + * @subpackage ParserElements + * @author Greg Beaver + * @since 1.0rc1 + * @version $Id: ParserElements.inc,v 1.2 2005/11/28 07:27:59 cellog Exp $ + */ +class parserFunction extends parserElement +{ + /** + * Type is used by many functions to skip the hassle of if phpDocumentor_get_class($blah) == 'parserBlah' + * @var string always 'function' + */ + var $type = 'function'; + /** + * parameters parsed from function definition. + * + * param name may be null, in which case, updateParams() must be called from the Converter + * @var array Format: array(param name => default value parsed from function definition) + * @see updateParams() + */ + var $params = false; + /** + * Function returns a reference to an element, instead of a value + * + * set to true if function is declared as: + * + * function &func(... + * + * @var boolean + */ + var $returnsreference = false; + /** + * global declarations parsed from function definition + * + * @var array Format: array(globalname1, globalname2,....) + */ + var $globals = false; + /** + * static variable declarations parsed from function definition + * @var array Format: array(array('name' => staticvar1,'val' => '' or default val of staticvar1),...) + */ + var $statics = false; + + var $source = ''; + /** + * @param string + * @param string default value parsed from function definition + * @param boolean indicates whether this parameter has a default value + */ + function addParam($name, $value, $has_default = true) + { + $this->params[$name] = array($value, $has_default); + } + + /** + * Set the source code. Always array in PHP 4.3.0+ + * @param string|array + */ + function addSource($source) + { + $this->source = $source; + } + + /** + * Determine whether the source code has been requested via {@}source} + * @return boolean + */ + function hasSource() + { + if (is_array($this->source)) return true; + return strlen($this->source); + } + + /** + * @return string|array source code ready for highlighting + */ + function getSource() + { + return $this->source; + } + + /** + * quick way to link to this element + * @return mixed converter-specific link to this function + * @param Converter + * @param string text to display for the link or false for default text + */ + function getLink($c, $text = false, $returnobj = false) + { + if ($returnobj) + { + return $c->getLink('function ' . $this->name, $this->docblock->package); + } + return $c->getFunctionLink($this->name, $this->docblock->package, $this->path, $text); + } + + /** + * Returns all functions in other packages that have the same name as this function + * @return mixed false or an array Format: (package => {@link parserFunction} of conflicting functions) + * @param Converter + */ + function getConflicts(&$c) + { + $a = $c->proceduralpages->getFuncConflicts($this->name); + unset($a[$this->docblock->package]); + return $a; + } + + /** + * Add all "global $var, $var2" declarations to this function + * @param array $globals Format: array(globalname1, globalname2,....) + */ + function addGlobals($globals) + { + $this->globals = $globals; + } + + /** + * Add all "static $var, $var2 = 6" declarations to this function + * @param array Format: array(varname1, varname2,...) + * @param array Format: array(default val of var 1, default val of var 2,...) if var 1 has no default, array(default val of var 2,...) + */ + function addStatics($static,$vals) + { + if (count($static)) + { + $this->statics = array(); + for($i=0;$istatics[] = array('name' => $static[$i],'val' => $a); + } + } + } + } + + /** + * @return string default value of param $name + * @param string + */ + function getParam ($name) + { + if (!isset($this->params[$name])) return false; + $test = $this->params[$name]; + if ($test[1]) + { + return $this->params[$name]; + } else + { + return false; + } + } + + /** + * @return array format: array(array(paramname, default value),...) + */ + function listParams () + { + if (isset($this->params)) + { + $ret = array(); + if ($this->params) + foreach($this->params as $key => $val) + { + if ($val[1]) + { + $arr = array($key,$val[0]); + if (isset($val[2])) + { + $arr[2] = $val[2]; + } + $ret[] = $arr; + } else + { + $arr = array($key,false); + if (isset($val[2])) + { + $arr[2] = $val[2]; + } + $ret[] = $arr; + } + } + return $ret; + } else { + return array(); + } + } + + /** + * @return array format: array(array(index, globalname),...) + */ + function listGlobals () + { + if (isset($this->globals)) + { + $ret = array(); + if ($this->globals) + foreach($this->globals as $key => $val) + { + $ret[] = array($key,$val); + } + return $ret; + } else { + return array(); + } + } + + /** + * @return array format: array(array(static var name, static var default value),...) + */ + function listStatics () + { + if (isset($this->statics)) + { + $ret = array(); + if ($this->statics) + foreach($this->statics as $key => $val) + { + $ret[] = array($val['name'],$val['val']); + } + return $ret; + } else { + return array(); + } + } + + /** + * sets {@link $returnsreference} to true + */ + function setReturnsReference() + { + $this->returnsreference = true; + } + + /** + * @return boolean returns value of {@link $returnsreference} + */ + function getReturnsReference() + { + return $this->returnsreference; + } + + /** + * Get a human-friendly description of the function call + * + * takes declaration like: + * + * /** @returns string ... {rest of docblock} + * function &func($param1, $param2 = 6, + * $param3 = array('20',9 => "heroo")) + * {...} + * + * and returns: + * string &func( $param1, [$param2 = 6], [$param3 = array('20',9 => "heroo")] ) + * @return string stylized function declaration + */ + function getFunctionCall() + { + $a = ''; + if ($this->getReturnsReference()) $a = '&'; + $function_call = $a.$this->getName() . " ( "; + $tmp = 0; + foreach($this->listParams() as $param) + { + if ($tmp == 0) + { + $tmp = 1; + } else { + $function_call .= ", "; + } + if ($param[1] !== false) + { + $function_call .= "[$param[0] = $param[1]]"; + } else { + $function_call .= $param[0]; + } + $update_params[] = $param[0]; + } + $function_call .= " )"; + return $function_call; + } + + /** + * Like getFunctionCall(), but has no English or pre-determined formatting. + * + * Much more flexible. + * @return array Format: + * + * array('name' => function name, + * 'returnsref' => boolean if declared as "function &name()" + * 'params' => array('type' => data type of parameter, + * 'description' => from @param tag, + * 'name' => variable name, + * 'default' => default value if any)) + * + * @see getFunctionCall() + */ + function getIntricateFunctionCall($converter,$paramtags) + { + $a = array(); + if ($this->getReturnsReference()) $a['returnsref'] = true; + $a['name'] = $converter->type_adjust($this->getName()); + $c = $this->listParams(); + foreach($c as $param) + { + $b = array(); + $b['type'] = 'mixed'; + if (isset($paramtags[$param[0]])) + { + $b['type'] = $paramtags[$param[0]]['datatype']; + $b['description'] = $paramtags[$param[0]]['data']; + unset($paramtags[$param[0]]); + } elseif(isset($paramtags[substr($param[0],1)])) + { + $b['type'] = $paramtags[substr($param[0],1)]['datatype']; + $b['description'] = $paramtags[substr($param[0],1)]['data']; + unset($paramtags[substr($param[0],1)]); + } + if (isset($param[2])) + { + $b['type'] = $param[2]; + } + $b['name'] = $param[0]; + $b['default'] = $param[1]; + $b['hasdefault'] = ($param[1] !== false); + $a['params'][] = $b; + } + // @param tags that don't correspond to actual parameters (like extra function values) + if (count($paramtags)) + { + foreach($paramtags as $param) + { + $b = array(); + $b['type'] = $param['datatype']; + $b['description'] = $param['data']; + $b['name'] = $param['var']; + $b['default'] = ''; + $b['hasdefault'] = false; + $a['params'][] = $b; + } + } + return $a; + } +} + +/** + * @package phpDocumentor + * @subpackage ParserElements + * @author Greg Beaver + * @since 1.0rc1 + * @version $Id: ParserElements.inc,v 1.2 2005/11/28 07:27:59 cellog Exp $ + */ +class parserClass extends parserElement +{ + /** + * Type is used by many functions to skip the hassle of if phpDocumentor_get_class($blah) == 'parserBlah' + * @var string always 'class' + */ + var $type = 'class'; + /** @var string + * @see parserPage::$sourceLocation */ + var $sourceLocation = ''; + /** + * @var mixed false or contents of extends clause in class declaration + */ + var $extends = false; + /** + * @var array a list of interfaces this class implements + */ + var $_implements = array(); + /** + * @var array a list of interfaces this class implements + * @access private + */ + var $_modifiers = false; + /** + * @var boolean determines whether a class is considered to be an interface + * @access private + */ + var $_isInterface = false; + /** + * Format: array(file, parent) where parent class is found or false if no parent + * @var mixed + */ + var $parent = false; + /** + * Used to determine whether a class should be ignored or not. Helps maintain integrity of parsing + * @var boolean + * @see Classes::getParentClass() + */ + var $ignore = false; + + /** + * @var string same as {@link parserElement::$path} + */ + var $curfile = false; + /** + * @var tutorialLink|false either a link to the tutorial associated with this class, or false + */ + var $tutorial = false; + + /** + * Return name of the class that contains this method + * @return string + */ + function getModifiers() + { + return $this->_modifiers; + } + + /** + * Return name of the class that contains this method + * @return string + */ + function setModifiers($m) + { + $this->_modifiers = $m; + } + + /** + * @param parserTutorial + * @param Converter + */ + function addTutorial($t,&$c) + { + $this->tutorial = new tutorialLink; + $this->tutorial->addLink('',$t->path,$t->name,$t->package,$t->subpackage,$t->getTitle($c)); + } + + /** + * Get the associated tutorial for this class, if any + * @tutorial tutorials.pkg + * @return parserTutorial + */ + function getTutorial() + { + return $this->tutorial; + } + + /** + * Returns all classes in other packages that have the same name as this class + * @return mixed false or an array Format: (package => {@link parserClass} of conflicting classes) + * @param Converter + */ + function getConflicts(&$c) + { + $a = $c->classes->getConflicts($this->name); + unset($a[$this->docblock->package]); + return $a; + } + + /** + * quick way to link to this element + * @return mixed converter-specific link to this class + * @param Converter + * @param string text to display for the link or false for default text + */ + function getLink($c, $text = false, $returnobj = false) + { + if ($returnobj) + { + return $c->getLink('object ' . $this->name, $this->docblock->package); + } + return $c->getClassLink($this->name, $this->docblock->package, $this->curfile, $text); + } + + /** + * @param string parent class name + * @param string parent class file + * @param Classes {@link Classes} object currently calling setParent + * @see Classes::setClassParent() + */ + + function setParent($p,$f, &$c) + { + $this->parent = array($f, $p); + $p = $c->getClass($p, $f); + // inherit package if no @package tag is in the docblock, fixes 591396 + if (!$this->docblock->getExplicitPackage()) + { + $this->docblock->package = $p->docblock->package; + } + if ($this->docblock->package == $p->docblock->package) + { + if ($this->docblock->subpackage == '') + $this->docblock->subpackage = $p->docblock->subpackage; + } + $author = $p->docblock->getKeyword('author'); + $version = $p->docblock->getKeyword('version'); + $copyright = $p->docblock->getKeyword('copyright'); + // inherit tags + if (!$this->docblock->getKeyword('author')) + { + if ($author && !is_array($author)) $author = array($author); + if ($author) $this->docblock->tags['author'] = $author; + } + if (!$this->docblock->getKeyword('version')) + { + if ($version && !is_array($version)) $version = array($version); + if ($version) $this->docblock->tags['version'] = $version; + } + if (!$this->docblock->getKeyword('copyright')) + { + if ($copyright && !is_array($copyright)) $copyright = array($copyright); + if ($copyright) $this->docblock->tags['copyright'] = $copyright; + } + if (!$this->docblock->sdesc) + { + $this->docblock->setShortDesc($p->docblock); + $this->docblock->setDesc($p->docblock); + } else + { + if ($this->docblock->hasInheritDoc()) + { + $this->docblock->replaceInheritDoc($p->docblock); + } + } + } + + /** + * @param string $par parent class name (used by {@link Classes::setClassParent()} if parent class not found + */ + function setParentNoClass($par) + { + $this->parent = $par; + } + + /** + * Use this method to set the type of class to be an interface + */ + function setInterface() + { + $this->_isInterface = true; + } + + /** + * @return boolean true if this is an interface class + */ + function isInterface() + { + return $this->_isInterface; + } + + /** + * Use this method to set access modifiers for a class + * @param array + */ + function setAccessModifiers($modifiers) + { + $this->_modifiers = $modifiers; + } + + /** + * retrieve object that represents the parent class + * @param Converter this function will not work before the Conversion stage of parsing + * @return mixed returns the {@link parserClass} representation of the parent class, or false if no parent class + */ + function &getParent(&$c) + { + $a = false; + if (!$this->parent) return $a; + if (is_array($this->parent)) + { + return $c->classes->getClass($this->parent[1],$this->parent[0]); + } else return $this->parent; + } + + /** + * @param Converter this function will not work before the Conversion stage of parsing + * @return array returns a simple array of method objects + */ + function getMethods(&$c) + { + return $c->classes->getMethods($this->name,$this->curfile); + } + + /** + * @return mixed {@link parserMethod} or false if not found + * @param Converter this function will not work before the Conversion stage of parsing + * @param string method name in this class + */ + function getMethod(&$c, $name) + { + return $c->classes->getMethod($this->name,$this->curfile,$name); + } + + /** + * @return mixed {@link parserVar} or false if not found + * @param Converter this function will not work before the Conversion stage of parsing + * @param string var name in this class + */ + function getVar(&$c, $name) + { + return $c->classes->getVar($this->name,$this->curfile,$name); + } + + /** + * @param Converter this function will not work before the Conversion stage of parsing + * @return array returns a simple array of method name strings + */ + function getMethodNames(&$c) + { + if (!$c->classes->hasMethods($this->curfile, $this->name)) return array(); + $arr = array(); + $arr1 = $this->getMethods($c); + for($i=0; $i < count($arr1); $i++) + { + $arr[] = $arr1[$i]->name; + } + return $arr; + } + + /** + * @param Converter this function will not work before the Conversion stage of parsing + * @param string method name + * @return boolean whether this class has a method of name $name + */ + function hasMethod(&$c,$name) + { + return $c->classes->hasMethod($this->name, $this->curfile, $name); + } + + /** + * @param Converter this function will not work before the Conversion stage of parsing + * @param string var name + * @return boolean whether this class has a var of name $name + */ + function hasVar(&$c,$name) + { + return $c->classes->hasVar($this->name, $this->curfile, $name); + } + + /** + * @param Converter this function will not work before the Conversion stage of parsing + * @param string class constant name + * @return boolean whether this class has a constant of name $name + */ + function hasConst(&$c,$name) + { + return $c->classes->hasConst($this->name, $this->curfile, $name); + } + + /** + * @param Converter this function will not work before the Conversion stage of parsing + * @return array returns a simple array of var objects + */ + function getVars(&$c) + { + return $c->classes->getVars($this->name,$this->curfile); + } + + /** + * @param Converter this function will not work before the Conversion stage of parsing + * @return array returns a simple array of const objects + */ + function getConsts(&$c) + { + return $c->classes->getConsts($this->name,$this->curfile); + } + + /** + * @param Converter this function will not work before the Conversion stage of parsing + * @return array returns a simple array of var name strings + */ + function getVarNames(&$c) + { + if (!$c->classes->hasVars($this->curfile, $this->name)) return array(); + $arr = array(); + $arr1 = $this->getVars($c); + for($i=0; $i < count($arr1); $i++) + { + $arr[] = $arr1[$i]->name; + } + return $arr; + } + + /** + * @param Converter this function will not work before the Conversion stage of parsing + * @return array returns a simple array of const name strings + */ + function getConstNames(&$c) + { + if (!$c->classes->hasConsts($this->curfile, $this->name)) return array(); + $arr = array(); + $arr1 = $this->getConsts($c); + for($i=0; $i < count($arr1); $i++) + { + $arr[] = $arr1[$i]->name; + } + return $arr; + } + + /** + * @param Converter this function will not work before the Conversion stage of parsing + * @param boolean determines whether overriden methods should be included in the list of inherited methods + * @return array returns an array of methods by parent classname array(name => array(method1,method2..),name2 => array(method1....)) + */ + function getInheritedMethods(&$c,$override = false) + { + $x = $this; + $methods = array(); + $arr = array(); + while ($x->parent && is_array($x->parent)) + { + $methods = array_merge($methods,$x->getMethodNames($c)); + $par = $x->getParent($c); + $parmethodnames = $par->getMethodNames($c); + $parmethods = $par->getMethods($c); + for($i=0; $idocblock && $parmethods[$i]->docblock->hasaccess && !$c->parseprivate && $parmethods[$i]->docblock->tags['access'][0]->value == 'private') + { + continue; + } + $methods[] = $parmethodnames[$i]; + $arr[$par->getName()]['methods'][] = $parmethods[$i]; + $arr[$par->getName()]['file'] = $par->curfile; + } + } else + { + // fix for bug 587733 + if ($parmethods[$i]->docblock && $parmethods[$i]->docblock->hasaccess && !$c->parseprivate && $parmethods[$i]->docblock->tags['access'][0]->value == 'private') + { + continue; + } + $arr[$par->getName()]['methods'][] = $parmethods[$i]; + $arr[$par->getName()]['file'] = $par->curfile; + } + } + $x = &$par; + } + return $arr; + } + + /** + * @param Converter this function will not work before the Conversion stage of parsing + * @param boolean determines whether overriden vars should be included in the list of inherited vars + * @return array returns an array of vars by parent classname array(name => array(var1,var1..),name2 => array(var1....)) + */ + function getInheritedVars(&$c,$override = true, $vars = false) + { + $x = $this; + $vars = array(); + $arr = array(); + while ($x->parent && is_array($x->parent)) + { + $vars = array_merge($vars,$x->getVarNames($c)); + $par = $x->getParent($c); + $parvarnames = $par->getVarNames($c); + $parvars = $par->getVars($c); + for($i=0; $idocblock && $parvars[$i]->docblock->hasaccess && !$c->parseprivate && $parvars[$i]->docblock->tags['access'][0]->value == 'private') + { + continue; + } + $vars[] = $parvarnames[$i]; + $arr[$par->getName()]['vars'][] = $parvars[$i]; + $arr[$par->getName()]['file'] = $par->curfile; + } + } else + { + // fix for bug 587733 + if ($parvars[$i]->docblock && $parvars[$i]->docblock->hasaccess && !$c->parseprivate && $parvars[$i]->docblock->tags['access'][0]->value == 'private') + { + continue; + } + $arr[$par->getName()]['vars'][] = $parvars[$i]; + $arr[$par->getName()]['file'] = $par->curfile; + } + } + $x = &$par; + } + return $arr; + } + + /** + * @param Converter this function will not work before the Conversion stage of parsing + * @param boolean determines whether overriden vars should be included in the list of inherited vars + * @return array returns an array of consts by parent classname array(name => array(const1,const2..),name2 => array(const1....)) + */ + function getInheritedConsts(&$c,$override = false, $consts = false) + { + $x = $this; + $consts = array(); + $arr = array(); + while ($x->parent && is_array($x->parent)) + { + $consts = array_merge($consts,$x->getConstNames($c)); + $par = $x->getParent($c); + $parvarnames = $par->getConstNames($c); + $parvars = $par->getConsts($c); + for($i=0; $idocblock && $parvars[$i]->docblock->hasaccess && !$c->parseprivate && $parvars[$i]->docblock->tags['access'][0]->value == 'private') + { + continue; + } + $consts[] = $parvarnames[$i]; + $arr[$par->getName()]['consts'][] = $parvars[$i]; + $arr[$par->getName()]['file'] = $par->curfile; + } + } else + { + // fix for bug 587733 + if ($parvars[$i]->docblock && $parvars[$i]->docblock->hasaccess && !$c->parseprivate && $parvars[$i]->docblock->tags['access'][0]->value == 'private') + { + continue; + } + $arr[$par->getName()]['consts'][] = $parvars[$i]; + $arr[$par->getName()]['file'] = $par->curfile; + } + } + $x = &$par; + } + return $arr; + } + + /** + * @param Converter this function will not work before the Conversion stage of parsing + * @return array Format: array(parentclassname => parserClass/false if no parent, parentclassname2 => ...) + */ + function getParentClassTree(&$c) + { + $result = array(); + $result[$this->name] = $arr = $this->getParent($c); + if (is_string($arr)) $result[$arr] = false; + while ($arr && is_object($arr)) + { + $result[$arr->name] = $arr->getParent($c); + $arr = $arr->getParent($c); + if (is_string($arr)) $result[$arr] = false; + } + return $result; + } + + /** + * returns a list of all child classes of this class + * @param Converter this function will not work before the Conversion stage of parsing + * @return array Format: array(parserClass child1,parserClass child2,...) + */ + function getChildClassList(&$c) + { + $list = array(); + $kids = $c->classes->getDefiniteChildren($this->name,$this->curfile); + if ($kids) + { + foreach($kids as $chile => $file) + { + $list[] = $c->classes->getClass($chile,$file); + } + } + return $list; + } + + /** + * @param string + * @see $sourceLocation + */ + function setSourceLocation($sl) + { + $this->sourceLocation = $sl; + } + + /** + * @param Converter + * @param boolean + * @return string + * @see $sourceLocation + */ + function getSourceLocation($c,$pearize = false) + { + global $_phpDocumentor_options; + if (!isset($this->sourceLocation)) return false; + if ($pearize) + { + $sl = $this->sourceLocation; + if (strpos($sl,'pear/')) + { + $sl = substr($sl,strpos($sl,'pear/') + 5); + return $sl; + } else + { + return $sl; + } + return $sl; + } + return $this->sourceLocation; + } + + /** + * @param string + * @see $extends + */ + function setExtends($extends) + { + $this->extends = $extends; + } + + /** + * @param string + */ + function addImplements($implements) + { + $this->_implements[] = $implements; + } + + /** + * @return array + */ + function getImplements() + { + return $this->_implements; + } + + /** + * @return boolean + * @see $extends + */ + function getExtends() + { + if (!isset($this->extends)) return false; + return $this->extends; + } +} + +/** + * @package phpDocumentor + * @subpackage ParserElements + * @author Greg Beaver + * @since 1.0rc1 + * @version $Id: ParserElements.inc,v 1.2 2005/11/28 07:27:59 cellog Exp $ + */ +class parserVar extends parserElement +{ + /** + * Type is used by many functions to skip the hassle of if phpDocumentor_get_class($blah) == 'parserBlah' + * @var string always 'var' + */ + var $type = 'var'; + /** @var string class that contains this var */ + var $class = ''; + /** @var array */ + var $_modifiers; + + /** + * @param string + */ + function parserVar($class) + { + $this->class = $class; + } + + /** + * Retrieve the class name + * @return string Class name that this var belongs to + */ + function getClass() + { + return $this->class; + } + + /** + * Return name of the class that contains this method + * @return string + */ + function getModifiers() + { + return $this->_modifiers; + } + + /** + * Return name of the class that contains this method + * @return string + */ + function setModifiers($m) + { + $this->_modifiers = $m; + } + + /** + * quick way to link to this element + * @return mixed converter-specific link to this var + * @param Converter $c + * @param string $text text to display for the link or false for default text + */ + function getLink($c, $text = false, $returnobj = false) + { + if ($returnobj) + { + return $c->getLink($this->class . '::' . $this->name, $this->docblock->package); + } + return $c->getVarLink($this->name, $this->class, $this->docblock->package, false, $text); + } + + /** + * @param Converter + * @return mixed {@link parserVar} representing var this var overrides from the parent class, or false if none + */ + function getOverrides(&$c) + { + $class = $c->classes->getClass($this->class,$this->path); + $par = $class->getParent($c); + + while (is_object($par)) + { + if ($par->hasVar($c,$this->name)) + { + $var = $par->getVar($c,$this->name); + if (!($var->docblock && $var->docblock->hasaccess && !$c->parseprivate && $var->docblock->tags['access'][0]->value == 'private')) + return $var; + } + $par = $par->getParent($c); + } + + return false; + } + + /** + * @param Converter + * @return array an array of parserVars from ALL child classes that override this var + */ + function getOverridingVars(&$c) + { + $class = $c->classes->getClass($this->class,$this->path); + + return $this->getOverridingVarsForClass($c, $class); + } + + /** + * @param Converter + * @param parserClass + * @return array an array of parserVars from ALL child classes that override this var in the given class + */ + function getOverridingVarsForClass(&$c, &$class) + { + $vars = array(); + if (!$class) return $meths; + $kids = $class->getChildClassList($c); + for($i=0; $ihasVar($c, $this->name)) + { + $var = $kids[$i]->getVar($c,$this->name); + if (!($var->docblock && $var->docblock->hasaccess && !$c->parseprivate && $var->docblock->tags['access'][0]->value == 'private')) + $vars[] = $var; + } + + $vars = array_merge($vars, $this->getOverridingVarsForClass($c, $kids[$i])); + } + return $vars; + } +} + +/** + * @package phpDocumentor + * @subpackage ParserElements + * @author Greg Beaver + * @since 1.2.4 + */ +class parserConst extends parserElement +{ + /** + * Type is used by many functions to skip the hassle of if phpDocumentor_get_class($blah) == 'parserBlah' + * @var string always 'const' + */ + var $type = 'const'; + /** @var string class that contains this var */ + var $class = ''; + + /** + * @param string + */ + function parserConst($class) + { + $this->class = $class; + } + + /** + * Retrieve the class name + * @return string Class name that this var belongs to + */ + function getClass() + { + return $this->class; + } + + /** + * quick way to link to this element + * @return mixed converter-specific link to this var + * @param Converter $c + * @param string $text text to display for the link or false for default text + */ + function getLink($c, $text = false, $returnobj = false) + { + if ($returnobj) + { + return $c->getLink($this->class . '::'. $this->name, $this->docblock->package); + } + return $c->getConstLink($this->name, $this->class, $this->docblock->package, false, $text); + } +} + +/** + * @package phpDocumentor + * @subpackage ParserElements + * @author Greg Beaver + * @since 1.0rc1 + * @version $Id: ParserElements.inc,v 1.2 2005/11/28 07:27:59 cellog Exp $ + */ +class parserMethod extends parserFunction +{ + /** + * Type is used by many functions to skip the hassle of if phpDocumentor_get_class($blah) == 'parserBlah' + * @var string always 'method' + */ + var $type = 'method'; + /** @var boolean whether this method is a constructor */ + var $isConstructor = false; + /** @var boolean whether this method is a destructor by PEAR standards */ + var $isDestructor = false; + /** @var string class that contains this method */ + var $class = ''; + var $_modifiers = array(); + + /** + * @param string + */ + function parserMethod($class) + { + $this->class = $class; + } + + /** + * @param string + * @param string default value parsed from function definition + * @param boolean indicates whether this parameter has a default value + * @param null|string class type hint + */ + function addParam($name, $value, $has_default = true, $typehint = null) + { + $this->params[$name] = array($value, $has_default); + if (isset($typehint)) + { + $this->params[$name][2] = $typehint; + } + } + + /** + * adds "constructor " to start of function call if {@link $isConstructor} is true + * @return string + * @see parent::getFunctionCall() + */ + function getFunctionCall() + { + $a = parserFunction::getFunctionCall(); + if ($this->isConstructor) $a = "constructor $a"; + return $a; + } + + function getIntricateFunctionCall($converter,$paramtags) + { + $a = parserFunction::getIntricateFunctionCall($converter,$paramtags); + if ($this->isConstructor) $a['constructor'] = true; + if ($this->isDestructor) $a['destructor'] = true; + return $a; + } + + /** + * Return name of the class that contains this method + * @return string + */ + function getClass() + { + return $this->class; + } + + /** + * Return name of the class that contains this method + * @return string + */ + function getModifiers() + { + return $this->_modifiers; + } + + /** + * Return name of the class that contains this method + * @return string + */ + function setModifiers($m) + { + $this->_modifiers = $m; + } + + /** + * @param Converter + * @return mixed {@link parserMethod} representing method this method overrides from the parent class, or false if none + */ + function getOverrides(&$c) + { + $class = $c->classes->getClass($this->class,$this->path); + + $par = $class->getParent($c); + + while (is_object($par)) + { + if ($par->hasMethod($c,$this->name)) + { + $meth = $par->getMethod($c,$this->name); + if (!($meth->docblock && $meth->docblock->hasaccess && !$c->parseprivate && $meth->docblock->tags['access'][0]->value == 'private')) + return $meth; + } + + $par = $par->getParent($c); + } + + return false; + } + + /** + * quick way to link to this element + * @return mixed converter-specific link to this method + * @param Converter $c + * @param string $text text to display for the link or false for default text + */ + function getLink($c, $text = false, $returnobj = false) + { + if ($returnobj) + { + return $c->getLink($this->class . '::' . $this->name . '()', $this->docblock->package); + } + return $c->getMethodLink($this->name, $this->class, $this->docblock->package, false, $text); + } + + /** + * Use this method to tell the parser that this method is the class constructor + */ + function setConstructor() + { + $this->isConstructor = true; + } + + /** + * Use this method to tell the parser that this method is the class constructor + */ + function setDestructor() + { + $this->isDestructor = true; + } + + /** + * @param Converter + * @return array an array of parserMethods from child classes that override this method + */ + function getOverridingMethods(&$c) + { + $class = $c->classes->getClass($this->class,$this->path); + + return $this->getOverridingMethodsForClass($c, $class); + } + + /** + * @param Converter + * @param parserClass + * @return array an array of parserMethods from ALL child classes that override this method in the given class + */ + function getOverridingMethodsForClass(&$c, &$class) + { + $meths = array(); + if (!$class) return $meths; + $kids = $class->getChildClassList($c); + for($i=0; $ihasMethod($c, $this->name)) + { + $meth = $kids[$i]->getMethod($c,$this->name); + if (!($meth->docblock && $meth->docblock->hasaccess && !$c->parseprivate && $meth->docblock->tags['access'][0]->value == 'private')) + $meths[] = $meth; + } + + $meths = array_merge($meths, $this->getOverridingMethodsForClass($c, $kids[$i])); + } + return $meths; + } +} + +/** + * @package phpDocumentor + * @subpackage ParserElements + * @author Greg Beaver + * @since 1.0rc1 + * @version $Id: ParserElements.inc,v 1.2 2005/11/28 07:27:59 cellog Exp $ + */ +class parserDefine extends parserElement +{ + /** + * Type is used by many functions to skip the hassle of if phpDocumentor_get_class($blah) == 'parserBlah' + * @var string always 'define' + */ + var $type = 'define'; + + /** + * quick way to link to this element + * @return mixed converter-specific link to this define + * @param Converter $c + * @param string $text text to display for the link or false for default text + */ + function getLink($c, $text = false, $returnobj = false) + { + if ($returnobj) + { + return $c->getLink('constant ' . $this->name, $this->docblock->package); + } + return $c->getDefineLink($this->name, $this->docblock->package, false, $text); + } + + /** + * Returns all defines in other packages that have the same name as this define + * @return mixed false or an array Format: (package => {@link parserDefine} of conflicting defines) + * @param Converter + */ + function getConflicts(&$c) + { + $a = $c->proceduralpages->getDefineConflicts($this->name); + unset($a[$this->docblock->package]); + return $a; + } + +} + +/** + * @package phpDocumentor + * @subpackage ParserElements + * @author Greg Beaver + * @since 1.0rc1 + * @version $Id: ParserElements.inc,v 1.2 2005/11/28 07:27:59 cellog Exp $ + */ +class parserPackagePage extends parserStringWithInlineTags +{ + /** + * Type is used by many functions to skip the hassle of if phpDocumentor_get_class($blah) == 'parserBlah' + * @var string always 'packagepage' + */ + var $type = 'packagepage'; + /** @var string */ + var $package = 'default'; + + /** + * @param string + */ + function parserPackagePage($package) + { + $this->package = $package; + } + + /** + * @param Converter + */ + function Convert(&$c) + { + return parent::Convert($c,false); + } +} + +/** + * @package phpDocumentor + * @subpackage ParserElements + * @since 1.2 + */ +class parserTutorial extends parserPackagePage +{ + /** + * Type is used by many functions to skip the hassle of if phpDocumentor_get_class($blah) == 'parserBlah' + * @var string always 'tutorial' + */ + var $type = 'tutorial'; + /** @var string */ + var $package = 'default'; + /** + * Either cls, pkg, or proc + * @var string + */ + var $tutorial_type; + /** + * The documentable element this tutorial is linked to + * + * Can be a parserData, parserClass, or nothing for package/subpackage docs + */ + var $linked_element; + /** + * path to the tutorial page + * @var string + */ + var $path; + /** + * filename minus extension of this tutorial (used for @tutorial tag) + * @var string + */ + var $name; + /** @var boolean */ + var $_xml = true; + /** + * output from tutorialname.ext.ini + * + * an array generated by {@link phpDocumentor_parse_ini_file()} containing + * an index 'Linked Tutorials' with an array of tutorial names in the order + * they should appear. This is used to generate a linked list of tutorials like + * {@tutorial phpDocumentor/tags.pkg} + * @var array + */ + var $ini = false; + /** + * link to the next tutorial in a document series, or false if none + * @var tutorialLink + */ + var $next = false; + /** + * link to the previous tutorial in a document series, or false if none + * @var tutorialLink + */ + var $prev = false; + /** + * link to the parent tutorial in a document series, or false if none + * + * This is used to generate an "Up" or "Home" link like the php manual. + * The parent is defined as a tutorial that has a parenttutorialname.ext.ini + * file and is not contained by any other tutorial's tutorialname.ext.ini + * @var tutorialLink + */ + var $parent = false; + /** + * links to the child tutorials, or false if none + * @var array + */ + var $children = false; + + /** + * @param parserXMLDocBookTag top-level tag ( for 1.2.0) + * @param information about the tutorial file. Format: + * + *
                                                    +     * array('tutename' => tutorial name,
                                                    +     *       'path' => relative path of tutorial to tutorials/ directory
                                                    +     *       'ini' => contents of the tutorial .ini file, if any)
                                                    +     * 
                                                    + */ + function parserTutorial($data, $info) + { + $this->value = $data; + $this->package = $info['package']; + $this->subpackage = $info['subpackage']; + $this->tutorial_type = $info['tutetype']; + $this->name = $info['tutename']; + $this->path = $info['path']; + $this->ini = $info['ini']; + } + + /** + * Retrieve the title of the tutorial, or of any subsection + * @param Converter + * @param string which subsection to retrieve the title from, if any + * @uses parserXMLDocBookTag::getSubSection() retrieve the subsection to + * to get a title from + */ + function getTitle(&$c,$subsection = '') + { + if (!empty($subsection)) + { + $z = $this->value->getSubSection($c,$subsection); + if (!$z) + { + addWarning(PDERROR_TUTORIAL_SUBSECTION_NOT_FOUND,$this->name,$subsection); + return $subsection; + } + return $z->getTitle($c); + } + return $this->value->getTitle($c); + } + + /** + * @param Converter + * @param boolean determines whether character data is postprocessed to be + * Converter-friendly or not. + */ + function Convert(&$c, $postprocess = true) + { + return $this->value->Convert($c, $postprocess); + } + + /** + * @uses $parent creates a link to the documentation for the parent tutorial + * @param parserTutorial + * @param Converter + */ + function setParent($parent,&$c) + { + $this->parent = new tutorialLink; + $this->parent->addLink('', $parent->path, $parent->name, $parent->package, $parent->subpackage, $parent->getTitle($c)); + } + + /** + * @param array array of parserTutorials that have child tutorials + */ + function isChildOf($parents) + { + foreach($parents as $i => $parent) + { + if ($parent->path == $this->path) continue; + if ($parent->ini && ($parent->package == $this->package) && ($parent->subpackage == $this->subpackage) && ($parent->tutorial_type == $this->tutorial_type)) + { + foreach($parent->ini['Linked Tutorials'] as $child) + { + if ($child . '.' . $this->tutorial_type == $this->name) return true; + } + } + } + } + + /** + * Retrieve converter-specific link to the parent tutorial's documentation + * @param Converter + */ + function getParent(&$c) + { + if (!$this->parent) return false; + return $c->returnSee($this->parent); + } + + /** + * @uses $next creates a link to the documentation for the next tutorial + * @param parserTutorial + * @param Converter + */ + function setNext($next,&$c) + { + if (phpDocumentor_get_class($next) == 'tutoriallink') return $this->next = $next; + $this->next = new tutorialLink; + $this->next->addLink('', $next->path, $next->name, $next->package, $next->subpackage, $next->getTitle($c)); + } + + /** + * Retrieve converter-specific link to the next tutorial's documentation + * @param Converter + */ + function getNext(&$c) + { + if (!$this->next) return false; + return $c->returnSee($this->next); + } + + /** + * @uses $prev creates a link to the documentation for the previous tutorial + * @param parserTutorial + * @param Converter + */ + function setPrev($prev,&$c) + { + if (phpDocumentor_get_class($prev) == 'tutoriallink') return $this->prev = $prev; + $this->prev = new tutorialLink; + $this->prev->addLink('', $prev->path, $prev->name, $prev->package, $prev->subpackage, $prev->getTitle($c)); + } + + /** + * Retrieve converter-specific link to the previous tutorial's documentation + * @param Converter + */ + function getPrev(&$c) + { + if (!$this->prev) return false; + return $c->returnSee($this->prev); + } + + /** + * Get a link to this tutorial, or to any subsection of this tutorial + * @param Converter + * @param boolean if true, returns a {@link tutorialLink} instead of a string + * @param string section name to link to + * @return string|tutorialLink + */ + function getLink(&$c,$pure = false,$section = '') + { + $link = new tutorialLink; + $link->addLink($section, $this->path, $this->name, $this->package, $this->subpackage, $this->getTitle($c), $this->category); + if ($pure) return $link; + return $c->returnSee($link); + } +} + +?> \ No newline at end of file diff --git a/buildscripts/PhpDocumentor/phpDocumentor/ProceduralPages.inc b/buildscripts/PhpDocumentor/phpDocumentor/ProceduralPages.inc new file mode 100644 index 00000000..a26fbacc --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/ProceduralPages.inc @@ -0,0 +1,782 @@ + + * @since 1.1 + * @version $Id: ProceduralPages.inc,v 1.1 2005/10/17 18:36:57 jeichorn Exp $ + */ +/** + * Intermediate procedural page parsing structure. + * This structure parses defines, functions, and global variables by file, + * and then iterates over the elements to document conflicts. + * @package phpDocumentor + * @author Greg Beaver + * @since 1.1 + * @version $Id: ProceduralPages.inc,v 1.1 2005/10/17 18:36:57 jeichorn Exp $ + */ +class ProceduralPages +{ + /** + * file being parsed, used in every add function to match up elements with the file that contains them + * @see addClass(), addMethod(), addVar(), nextFile() + * @var string + */ + var $curfile; + /** + * array of all procedural pages ordered by name + * Format: + * array(name => array(fullpath => parserPage,fullpath => parserPage2 [if there are name conflicts],...)) + * @var array + */ + var $pages = array(); + /** + * array of all procedural pages ordered by name that have been ignored via -po or @access private or @ignore + * Format: + * array(name => array(fullpath => parserPage,fullpath => parserPage2 [if there are name conflicts],...)) + * @var array + */ + var $ignorepages = array(); + /** + * array of all procedural page names ordered by full path to the file + * Format: + * array(fullpath => name) + * @var array + */ + var $pathpages = array(); + /** + * array of parsed includes organized by the full path of the file that contains the include. + * Format: + * array(full path => array(includename => {@link parserInclude})) + * @var array + */ + var $includesbyfile = array(); + /** + * array of parsed functions organized by the full path of the file that contains the function. + * Format: + * array(full path => array(functionname => {@link parserFunction})) + * @var array + */ + var $functionsbyfile = array(); + /** + * array of parsed defines organized by the full path of the file that contains the define. + * Format: + * array(full path => array(definename => {@link parserDefine})) + * @var array + */ + var $definesbyfile = array(); + /** + * array of parsed global variables organized by the full path of the file that contains the global variable definition. + * Format: + * array(full path => array(globalname => {@link parserGlobal})) + * @var array + */ + var $globalsbyfile = array(); + /** + * array of file names organized by functions that are in the file. + * This structure is designed to handle name conflicts. Two files can contain functions with the same name, and this array will + * record both filenames to help control namespace errors + * Format: + * array(functionname => array(full path of file containing functionname, full path of file 2 containing functionname...) + * @var array + */ + var $functionsbynamefile = array(); + /** + * array of file names organized by defines that are in the file. + * This structure is designed to handle name conflicts. Two files can contain defines with the same name, and this array will + * record both filenames to help control namespace errors + * Format: + * array(definename => array(full path of file containing definename, full path of file 2 containing definename...) + * @var array + */ + var $definesbynamefile = array(); + /** + * array of file names organized by global variables that are in the file. + * This structure is designed to handle name conflicts. Two files can contain global variables with the same name, and this array will + * record both filenames to help control namespace errors + * Format: + * array(global variablename => array(full path of file containing global variablename, full path of file 2 containing global variablename...) + * @var array + */ + var $globalsbynamefile = array(); + /** + * array of packages ordered by full path + * Format: + * array(fullpath => array(packagename,subpackagename)) + * @var array + */ + var $pagepackages = array(); + /** + * array of packages assigned to classes in a file, ordered by fullpath + * Format: + * array(fullpath => array(packagename => array(subpackagename => 1,subpackagename => 1,..),packagename2 =>...) + * @var array + */ + var $pageclasspackages = array(); + /** + * Namespace conflicts within all documented packages of functions + * Format: + * array(functionname => array(full path, full path,...)) + * @var array + */ + var $functionconflicts = array(); + /** + * Namespace conflicts within all documented pages + * Format: + * array(pagename => array(fullpath, fullpath,...)) + * @var array + */ + var $pageconflicts = array(); + /** + * Namespace conflicts within all documented packages of functions + * Format: + * array(functionname => array(full path, full path,...)) + * @var array + */ + var $defineconflicts = array(); + /** + * Namespace conflicts within all documented packages of functions + * Format: + * array(functionname => array(full path, full path,...)) + * @var array + */ + var $globalconflicts = array(); + /** @access private + * @var array */ + var $revcpbf = array(); + /** @access private + * @var boolean */ + var $packagesetup = false; + + /** + * sets up the {@link $pages} array + * @param parserPage &$element + */ + function addPage(&$element) + { + $this->curfile = $element->getPath(); + $this->pages[$element->getFile()][$element->getPath()] = $element; + $this->pathpages[$this->curfile] = $element->getFile(); + $this->addPagePackage($this->curfile, $element->package, $element->subpackage); + } + + /** + * moves a page from the {@link $pages} array to the {@link $ignorepages} array + * @param parserPage &$element + */ + function ignorePage(&$element) + { + $this->ignorepages[$element->getFile()][$element->getPath()] = $this->pages[$element->getFile()][$element->getPath()]; + unset($this->pages[$element->getFile()][$element->getPath()]); + } + + function getPathInfo($path,&$c) + { + $path = str_replace('/',SMART_PATH_DELIMITER,$path); + $info = array(); + if (!isset($this->pathpages[$path])) return false; + $p = $this->pages[$this->pathpages[$path]][$path]; + $p->name = $c->getPageName($p); + $info['package'] = $p->package; + $info['subpackage'] = $p->subpackage; + $info['name'] = $p->getFile(); + $info['source_loc'] = $p->getSourceLocation($c); + $x = new pageLink; + $x->addLink($p->path,$p->name,$p->file,$p->package, $p->subpackage); + $info['docs'] = $c->returnSee($x); + return $info; + } + + /** + * Change a page's name from its file to alias $name + * + * This function is used to handle a @name tag in a page-level DocBlock + * @param string $name + */ + function setName($name) + { + $this->pages[$name][$this->curfile] = $this->pages[$this->pathpages[$this->curfile]][$this->curfile]; + $this->pages[$name][$this->curfile]->file = $name; + unset($this->pages[$this->pathpages[$this->curfile]][$this->curfile]); + $this->pathpages[$this->curfile] = $name; + } + + /** + * Changes the package of the page represented by $path + * + * changes package in both the {@link $pages} array and the {@link pagepackages} array + * @param string $path full path + * @param string $package + * @param string $subpackage + */ + function addPagePackage($path,$package,$subpackage) + { + $this->pages[$this->pathpages[$path]][$path]->package = $package; + $this->pages[$this->pathpages[$path]][$path]->subpackage = $subpackage; + $this->pagepackages[$path] = array($package, $subpackage); + if (isset($this->includesbyfile[$path])) + { + foreach($this->includesbyfile[$path] as $i => $el) + { + $el->package = $package; + $el->subpackage = $subpackage; + $this->includesbyfile[$path][$i] = $el; + } + } + if (isset($this->functionsbyfile[$path])) + { + foreach($this->functionsbyfile[$path] as $i => $el) + { + $el->package = $package; + $el->subpackage = $subpackage; + $this->functionsbyfile[$path][$i] = $el; + } + } + if (isset($this->definesbyfile[$path])) + { + foreach($this->definesbyfile[$path] as $i => $el) + { + $el->package = $package; + $el->subpackage = $subpackage; + $this->definesbyfile[$path][$i] = $el; + } + } + if (isset($this->globalsbyfile[$path])) + { + foreach($this->globalsbyfile[$path] as $i => $el) + { + $el->package = $package; + $el->subpackage = $subpackage; + $this->globalsbyfile[$path][$i] = $el; + } + } + } + + /** + * sets up the {@link $includesbyfile} array using {@link $curfile} + * @param parserInclude &$element + */ + function addInclude(&$element) + { + $this->includesbyfile[$this->curfile][] = $element; + } + + /** + * sets up the {@link $functionsbyfile} array using {@link $curfile} + * @param parserFunction &$element + */ + function addFunction(&$element) + { + if (isset($this->functionsbyfile[$this->curfile])) + { + foreach($this->functionsbyfile[$this->curfile] as $i => $function) + { + if ($function->getName() == $element->getName()) + { + addWarning(PDERROR_ELEMENT_IGNORED,'function',$element->getName(),$this->curfile); + return; + } + } + } + $this->functionsbyfile[$this->curfile][] = $element; + $this->functionsbynamefile[$element->getName()][] = $this->curfile; + } + + /** + * sets up the {@link $globalsbyfile} array using {@link $curfile} + * @param parserGlobal &$element + */ + function addGlobal(&$element) + { + if (isset($this->globalsbyfile[$this->curfile])) + { + foreach($this->globalsbyfile[$this->curfile] as $i => $global) + { + if ($global->getName() == $element->getName()) + { + addWarning(PDERROR_ELEMENT_IGNORED,'global variable',$element->getName(),$this->curfile); + return; + } + } + } + $this->globalsbyfile[$this->curfile][] = $element; + $this->globalsbynamefile[$element->getName()][] = $this->curfile; + } + + /** + * sets up the {@link $definesbyfile} array using {@link $curfile} + * @param parserDefine &$element + */ + function addDefine(&$element) + { + if (isset($this->definesbyfile[$this->curfile])) + { + foreach($this->definesbyfile[$this->curfile] as $i => $define) + { + if ($define->getName() == $element->getName()) + { + addWarning(PDERROR_ELEMENT_IGNORED,'define',$element->getName(),$this->curfile); + return; + } + } + } + $this->definesbyfile[$this->curfile][] = $element; + $this->definesbynamefile[$element->getName()][] = $this->curfile; + } + + /** + * Used to align an element with the package of its parent page prior to Conversion. + * @param parserElement &$element + */ + function replaceElement(&$element) + { + if ($element->type == 'define') + { + foreach($this->definesbyfile[$element->getPath()] as $i => $el) + { + if ($el->getName() == $element->getName()) + { + $this->definesbyfile[$element->getPath()][$i] = &$element; + } + } + } elseif ($element->type == 'global') + { + foreach($this->globalsbyfile[$element->getPath()] as $i => $el) + { + if ($el->getName() == $element->getName()) + { + $this->globalsbyfile[$element->getPath()][$i] = &$element; + } + } + } elseif ($element->type == 'include') + { + foreach($this->includesbyfile[$element->getPath()] as $i => $el) + { + if ($el->getName() == $element->getName()) + { + $this->includesbyfile[$element->getPath()][$i] = &$element; + } + } + } elseif ($element->type == 'function') + { + foreach($this->functionsbyfile[$element->getPath()] as $i => $el) + { + if ($el->getName() == $element->getName()) + { + $this->functionsbyfile[$element->getPath()][$i] = &$element; + } + } + } + } + + /** + * adds a package from a class to the current file + * @param string $file full path to the file that contains the class + * @param string $package package name + */ + function addClassPackageToFile($file,$package,$subpackage) + { + // don't care about default +// if ($package == $GLOBALS['phpDocumentor_DefaultPackageName']) +// $this->revcpbf[$file][$package][$subpackage] = 1; + if (!isset($this->revcpbf[$file][$package][$subpackage])) + { + $this->pageclasspackages[$file][$package][$subpackage] = 1; + } + $this->revcpbf[$file][$package][$subpackage] = 1; + } + + /** + * if there is one class package in a file, the parent path inherits the package if its package is default. + * helps with -po to avoid dumb bugs + */ + function setupPagePackages() + { + if ($this->packagesetup) return; + foreach($this->pageclasspackages as $fullpath => $packages) + { + if (isset($this->pagepackages[$fullpath])) + { + if ($this->pagepackages[$fullpath][0] == $GLOBALS['phpDocumentor_DefaultPackageName']) + { + if (count($packages) == 1) + { + list($package,$subpackage) = each($packages); + if (count($subpackage) == 1) list($subpackage,) = each($subpackage); + else $subpackage = ''; + $this->addPagePackage($fullpath,$package,$subpackage); + } + } + } + } + $this->packagesetup = true; + } + + /** + * extracts function, define, and global variable name conflicts within the same package and between different + * packages. No two elements with the same name are allowed in the same package, to keep automatic linking + * possible. + * @access private + */ + function setupConflicts(&$render) + { + + foreach($this->functionsbynamefile as $function => $paths) + { + if (count($paths) - 1) + { //conflict + $package = array(); + foreach($paths as $path) + { + // create a list of conflicting functions in each package + $package[$this->pagepackages[$path][0]][] = $path; + } + foreach($package as $pathpackages) + { + // if at least 2 functions exist in the same package, delete all but the first one and add warnings + if (count($pathpackages) - 1) + { + for($i=1; $i < count($pathpackages); $i++) + { + addWarning(PDERROR_ELEMENT_IGNORED,'function',$function,$pathpackages[$i]); + foreach($this->functionsbyfile[$pathpackages[$i]] as $j => $blah) + { + if ($this->functionsbyfile[$pathpackages[$i]][$j]->getName() == $function) + unset($this->functionsbyfile[$pathpackages[$i]][$j]); + } + $oth = array_flip($paths); + unset($paths[$oth[$pathpackages[$i]]]); + } + } + } + $this->functionconflicts[$function] = $paths; + } + } + + foreach($this->definesbynamefile as $define => $paths) + { + if (count($paths) - 1) + { //conflict + $package = array(); + foreach($paths as $path) + { + // create a list of conflicting functions in each package + $package[$this->pagepackages[$path][0]][] = $path; + } + foreach($package as $pathpackages) + { + // if at least 2 functions exist in the same package, delete all but the first one and add warnings + if (count($pathpackages) - 1) + { + for($i=1; $i < count($pathpackages); $i++) + { + addWarning(PDERROR_ELEMENT_IGNORED,'define',$define,$pathpackages[$i]); + foreach($this->definesbyfile[$pathpackages[$i]] as $j => $blah) + { + if ($this->definesbyfile[$pathpackages[$i]][$j]->getName() == $define) + unset($this->definesbyfile[$pathpackages[$i]][$j]); + } + $oth = array_flip($paths); + unset($paths[$oth[$pathpackages[$i]]]); + } + } + } + $this->defineconflicts[$define] = $paths; + } + } + + foreach($this->globalsbynamefile as $global => $paths) + { + if (count($paths) - 1) + { //conflict + $package = array(); + foreach($paths as $path) + { + // create a list of conflicting functions in each package + $package[$this->pagepackages[$path][0]][] = $path; + } + foreach($package as $pathpackages) + { + // if at least 2 functions exist in the same package, delete all but the first one and add warnings + if (count($pathpackages) - 1) + { + for($i=1; $i < count($pathpackages); $i++) + { + addWarning(PDERROR_ELEMENT_IGNORED,'global variable',$global,$pathpackages[$i]); + foreach($this->globalsbyfile[$pathpackages[$i]] as $j => $blah) + { + if ($this->globalsbyfile[$pathpackages[$i]][$j]->getName() == $global) + unset($this->globalsbyfile[$pathpackages[$i]][$j]); + } + $oth = array_flip($paths); + unset($paths[$oth[$pathpackages[$i]]]); + } + } + } + $this->globalconflicts[$global] = $paths; + } + } + + foreach($this->pages as $name => $pages) + { + if (count($pages) - 1) + { // possible conflict + + } + } + } + + /** + * called by {@link parserFunction::getConflicts()} to get inter-package conflicts, should not be called directly + * @access private + * @return array Format: (package => {@link parserFunction} of conflicting function) + */ + function getFuncConflicts($name) + { + if (!isset($this->functionconflicts[$name])) return false; + $a = array(); + foreach($this->functionconflicts[$name] as $conflict) + { + foreach($this->functionsbyfile[$conflict] as $i => $func) + { + if ($func->getName() == $name) + $a[$this->functionsbyfile[$conflict][$i]->docblock->package] = $this->functionsbyfile[$conflict][$i]; + } + } + return $a; + } + + /** + * called by {@link parserGlobal::getConflicts()} to get inter-package conflicts, should not be called directly + * @access private + * @return array Format: (package => {@link parserGlobal} of conflicting global variable) + */ + function getGlobalConflicts($name) + { + if (!isset($this->globalconflicts[$name])) return false; + $a = array(); + foreach($this->globalconflicts[$name] as $conflict) + { + foreach($this->globalsbyfile[$conflict] as $i => $func) + { + if ($func->getName() == $name) + $a[$this->globalsbyfile[$conflict][$i]->docblock->package] = $this->globalsbyfile[$conflict][$i]; + } + } + return $a; + } + + /** + * called by {@link parserDefine::getConflicts()} to get inter-package conflicts, should not be called directly + * @access private + * @return array Format: (package => {@link parserDefine} of conflicting define) + */ + function getDefineConflicts($name) + { + if (!isset($this->defineconflicts[$name])) return false; + $a = array(); + foreach($this->defineconflicts[$name] as $conflict) + { + foreach($this->definesbyfile[$conflict] as $i => $func) + { + if ($func->getName() == $name) + $a[$this->definesbyfile[$conflict][$i]->docblock->package] = $this->definesbyfile[$conflict][$i]; + } + } + return $a; + } + + /** + * Adjusts packages of all pages and removes name conflicts within a package + * + * Automatic linking requires that each linkable name have exactly one element associated with it. In other words, there + * cannot be two functions named foo() in the same package. This also adheres to php rules with one exception: + * + * + * if ($test == 3) + * { + * define('whatever','this thing'); + * } else + * { + * define('whatever','this other thing'); + * } + * + * + * phpDocumentor is not aware of conditional control structures because it would slow things down considerably. + * So, what phpDocumentor does is automatically ignore the second define and raise a warning. The warning can + * be eliminated with an @ignore tag on the second element like so: + * + * + * if ($test == 3) + * { + * define('whatever','this thing'); + * } else + * { + * /** @ignore {@*} + * define('whatever','this other thing'); + * } + * + * + * if there are two files that contain the same procedural elements in the same package (for example, + * a common configuration file common.php), they will also be ignored as if they were in the same file. The + * reasoning behind this is simple. A package is an indivisible set of files and classes that a user will + * include in their code. Name conflicts must be avoided to allow successful execution. + * + * This function also plays the all-important role of calling {@link phpDocumentor_IntermediateParser::addElementToPage()} in + * order to add processed elements to their pages for Conversion. + * @param phpDocumentor_IntermediateParser &$render + */ + function setupPages(&$render) + { + global $_phpDocumentor_setting; + phpDocumentor_out("\nProcessing Procedural Page Element Name Conflicts\n\n"); + flush(); + $this->setupPagePackages(); + $this->setupConflicts($render); +// phpDocumentor_out("\nProcessing Procedural Pages\n\n"); + foreach($this->pathpages as $path => $name) + { +// phpDocumentor_out("Processing $path\n"); + $a = $this->pagepackages[$path]; + $b = &$this->pages[$name][$path]; + $render->addPage($b, $path); + $render->addUses($b, $path); + if (isset($this->includesbyfile[$path])) + foreach($this->includesbyfile[$path] as $include) + { + $include->docblock->package = $a[0]; + $include->docblock->subpackage = $a[1]; + $render->addElementToPage($include,$path); + } + + if (isset($this->functionsbyfile[$path])) + foreach($this->functionsbyfile[$path] as $function) + { + $function->docblock->package = $a[0]; + $function->docblock->subpackage = $a[1]; + $render->addElementToPage($function,$path); + $render->addUses($function,$path); + } + + if (isset($this->definesbyfile[$path])) + foreach($this->definesbyfile[$path] as $define) + { + $define->docblock->package = $a[0]; + $define->docblock->subpackage = $a[1]; + $render->addElementToPage($define,$path); + $render->addUses($define,$path); + } + + if (isset($this->globalsbyfile[$path])) + foreach($this->globalsbyfile[$path] as $global) + { + $global->docblock->package = $a[0]; + $global->docblock->subpackage = $a[1]; + $render->addElementToPage($global,$path); + $render->addUses($global,$path); + } + } + } + + function setParseBase($pbase) + { + $this->_parsedbase = $pbase; + } + + /** + * @return false|parserPage returns matched parserPage if found + */ + function pathMatchesParsedFile($path, $infile) + { + $test = $this->getRealPath($path, $infile); + if (is_string($test)) + { + if (isset($this->pathpages[$test])) + return $this->pages[$this->pathpages[$test]][$test]; + if (PHPDOCUMENTOR_WINDOWS) $test = str_replace('/','\\',$test); + if (isset($this->pathpages[$test])) + { + $a = $this->pages[$this->pathpages[$test]][$test]; + if (is_array($a->packageOutput) && !in_array($a->package, $a->packageOutput)) + return false; + return $this->pages[$this->pathpages[$test]][$test]; + } + } else + { + foreach($test as $file) + { + if (isset($this->pathpages[$file])) + return $this->pages[$this->pathpages[$file]][$file]; + if (PHPDOCUMENTOR_WINDOWS) $file = str_replace('/','\\',$file); + if (isset($this->pathpages[$file])) + { + $a = $this->pages[$this->pathpages[$file]][$file]; + if (is_array($a->packageOutput) && !in_array($a->package, $a->packageOutput)) + return false; + return $this->pages[$this->pathpages[$file]][$file]; + } + } + } + return false; + } + + /** + * @param string include() statement path to check + * @param string full path of file the statement is in + * @param string full path to base directory of parsing, used for . + * @return array|string returns an array of possible file locations or + * a string if there is an exact match + */ + function getRealPath($path, $file) + { + $curdir = str_replace('\\','/',dirname($file)); + $path = str_replace('\\','/',$path); + if (strpos($path,':') !== false) + { // windows, and we have a drive letter + return $path; + } elseif(strpos($path,'/') === 0) + { + return $path; + } + // not an absolute path + $path = explode('/',$path); + if ($path[0] == '.') + { + $path[0] = dirname($file); + return join($path,'/'); + } elseif ($path[0] == '..') + { + $dirfile = explode('/',dirname(str_replace('\\','/',$file))); + array_pop($dirfile); // remove the current directory + if (!count($dirfile)) return false; // we were at a top-level dir! + $path[0] = join($dirfile,'/'); // replace .. with parent dirname + return join($path,'/'); + } else + { + $path = join($path,'/'); + return array($curdir . PATH_DELIMITER . $path, + str_replace('\\','/',PHPDOCUMENTOR_BASE) . PATH_DELIMITER . $path); + } + } +} +?> \ No newline at end of file diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Publisher.inc b/buildscripts/PhpDocumentor/phpDocumentor/Publisher.inc new file mode 100644 index 00000000..7e038021 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Publisher.inc @@ -0,0 +1,84 @@ + + * @author Joshua Eichorn + * @version $Id: Publisher.inc,v 1.1 2005/10/17 18:36:57 jeichorn Exp $ + * @package phpDocumentor + */ +/** + * a class for handling the publishing of data + * + * @author Kellin + * @author Joshua Eichorn + * @version $Id: Publisher.inc,v 1.1 2005/10/17 18:36:57 jeichorn Exp $ + * @package phpDocumentor + */ +class Publisher +{ + /**#@+ + * @var array + */ + /** + * Array of references objects that have Subscribed to this publisher + */ + var $subscriber = array(); + + var $tokens = array(); + + var $pushEvent = array(); + var $popEvent = array(); + /**#@-*/ + + + /** + * Adds a subscriber to the {@link $subscriber} array(). + * if $event is '*', the publisher will use $object as the default event handler + * @param integer $event see {@link Parser.inc} PARSER_EVENT_* constants + * @param class $object any class that has a HandleEvent() method like {@link phpDocumentor_IntermediateParser::HandleEvent()} or {@link Classes::HandleEvent()} + */ + function subscribe($event, &$object) + { + $this->subscriber[$event] =& $object; + } + + /** + * @param integer $event see {@link Parser.inc} PARSER_EVENT_* constants + * @param mixed $data anything the subscribed event handler is expecting + */ + function publishEvent($event,$data) + { + + // see if there is a specific event handler + if (!empty($this->subscriber[$event])) + { + $this->subscriber[$event]->HandleEvent($event,$data); + } + else if (isset($this->subscriber['*']) && is_object($this->subscriber['*'])) // check to see if a generic handler exists + { + $this->subscriber['*']->HandleEvent($event,$data); + } + } +} +?> diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Setup.inc.php b/buildscripts/PhpDocumentor/phpDocumentor/Setup.inc.php new file mode 100644 index 00000000..1d953088 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Setup.inc.php @@ -0,0 +1,785 @@ + + * @version $Revision: 1.6 $ + * @package phpDocumentor + * @since 1.2 + */ +error_reporting(E_ALL); +/** common settings */ +include_once("phpDocumentor/common.inc.php"); + +include_once("phpDocumentor/Io.inc"); +include_once("phpDocumentor/Publisher.inc"); +include_once("phpDocumentor/Classes.inc"); +include_once("phpDocumentor/ProceduralPages.inc"); +include_once("phpDocumentor/IntermediateParser.inc"); +include_once("phpDocumentor/WordParser.inc"); +include_once("phpDocumentor/EventStack.inc"); +include_once("phpDocumentor/ParserData.inc"); +include_once("phpDocumentor/InlineTags.inc"); +include_once("phpDocumentor/DocBlockTags.inc"); +include_once("phpDocumentor/DescHTML.inc"); +include_once("phpDocumentor/ParserDocBlock.inc"); +include_once("phpDocumentor/ParserElements.inc"); +include_once("phpDocumentor/Parser.inc"); +include_once("phpDocumentor/phpDocumentorTWordParser.inc"); +include_once("phpDocumentor/phpDocumentorTParser.inc"); +include_once("phpDocumentor/HighlightParser.inc"); +include_once("phpDocumentor/TutorialHighlightParser.inc"); +include_once("phpDocumentor/ParserDescCleanup.inc"); +include_once("phpDocumentor/PackagePageElements.inc"); +include_once("phpDocumentor/XMLpackagePageParser.inc"); +include_once("phpDocumentor/LinkClasses.inc"); +include_once("phpDocumentor/Converter.inc"); +include_once("phpDocumentor/Errors.inc"); +if (isset($_GET)) +{ +/** + * $interface is either 'web' or is not set at all + * @global array $interface + */ + if (isset($_GET['interface'])) $interface = $_GET['interface']; +/** + * $_phpDocumentor_setting is either the value from the web interface, or is set up by {@link Io::parseArgv()} + * @global array $_phpDocumentor_setting + */ + if (isset($_GET['setting'])) $_phpDocumentor_setting = $_GET['setting']; +} + +/** + * default package name, set using -dn --defaultpackagename + * @global string $GLOBALS['phpDocumentor_DefaultPackageName'] + * @name $phpDocumentor_DefaultPackageName + */ +$GLOBALS['phpDocumentor_DefaultPackageName'] = 'default'; + +/** + * default package name, set using -dn --defaultcategoryname + * @global string $GLOBALS['phpDocumentor_DefaultCategoryName'] + * @name $phpDocumentor_DefaultCategoryName + */ +$GLOBALS['phpDocumentor_DefaultCategoryName'] = 'default'; + +/** + * @package phpDocumentor + */ +class phpDocumentor_setup +{ + /** + * The main parser + * @var Parser|phpDocumentorTParser + */ + var $parse; + /** + * Used to parse command-line options + * @var Io + */ + var $setup; + /** + * Used to organize output from the Parser before Conversion + * @var phpDocumentor_IntermediateParser + */ + var $render = false; + /** + * Packages to create documentation for + * @var string + */ + var $packages = false; + /** + * contents of --filename commandline + * @tutorial phpDocumentor.howto.pkg#using.command-line.filename + * @var string + */ + var $files = ''; + /** + * contents of --directory commandline + * @tutorial phpDocumentor.howto.pkg#using.command-line.directory + * @var string + */ + var $dirs = ''; + /** + * contents of --hidden commandline + * @tutorial phpDocumentor.howto.pkg#using.command-line.hidden + * @var boolean + */ + var $hidden = false; + /** + * time that parsing was started, used for informative timing of output + * @access private + */ + var $parse_start_time; + /** + * contents of --ignore commandline + * @tutorial phpDocumentor.howto.pkg#using.command-line.ignore + * @var string + */ + var $ignore_files = array(); + /** + * Checks PHP version, makes sure it is 4.2.0+, and chooses the + * phpDocumentorTParser if version is 4.3.0+ + * @uses parseIni() + */ + function phpDocumentor_setup() + { + global $_phpDocumentor_cvsphpfile_exts; + if (!function_exists('is_a')) + { + print "phpDocumentor requires PHP version 4.2.0 or greater to function"; + exit; + } + + // set runtime to a large value since this can take quite a while + // we can only set_time_limit when not in safe_mode bug #912064 + if (!ini_get('safe_mode')) + { + set_time_limit(0); // unlimited runtime + } else + { + phpDocumentor_out("time_limit cannot be set since your in safe_mode, please edit time_limit in your php.ini to allow enough time for phpDocumentor to run"); + } + ini_set("memory_limit","256M"); + + $phpver = phpversion(); + $phpdocver = PHPDOCUMENTOR_VER; + if (isset($_GET['interface'])) { + $phpver = "$phpver"; + $phpdocver = "$phpdocver"; + } + phpDocumentor_out("PHP Version $phpver\n"); + phpDocumentor_out("phpDocumentor version $phpdocver\n\n"); + + $this->parseIni(); + // create new classes + $this->setup = new Io; + if (tokenizer_ext) + { + phpDocumentor_out("using tokenizer Parser\n"); + $this->parse = new phpDocumentorTParser; + } else + { + phpDocumentor_out("using default (slower) Parser - get PHP 4.3.0+ +and load the tokenizer extension for faster parsing (your version is ".phpversion()."\n"); + $this->parse = new Parser; + } + } + + /** + * Get phpDocumentor settings from a user configuration file + * @param string user configuration file + */ + function readConfigFile($file) + { + global $_phpDocumentor_setting, $_phpDocumentor_options; + // security + $file = str_replace(array('..','.ini','\\'),array('','','/'),$file); + if (is_file($file . '.ini')) + { + $_phpDocumentor_setting = phpDocumentor_parse_ini_file($file.'.ini'); + } else + { + if ('@DATA-DIR@' != '@'.'DATA-DIR@') + { + $configdir = str_replace('\\','/', '@DATA-DIR@/PhpDocumentor') . PATH_DELIMITER . 'user' . PATH_DELIMITER; + } else { + $configdir = str_replace('\\','/',$GLOBALS['_phpDocumentor_install_dir']) . PATH_DELIMITER . 'user' . PATH_DELIMITER; + } + if (isset($_phpDocumentor_options['userdir'])) $configdir = $_phpDocumentor_options['userdir']; + if (substr($configdir,-1) != '/') + { + $configdir .= '/'; + } + $_phpDocumentor_setting = phpDocumentor_parse_ini_file( $configdir . $file . '.ini'); + if (empty($_phpDocumentor_setting['defaultpackagename'])) + { + $_phpDocumentor_setting['defaultpackagename'] = 'default'; + } + } + // don't want a loop condition! + unset($_phpDocumentor_setting['useconfig']); + $this->readCommandLineSettings(); + } + + /** + * Get phpDocumentor settings from command-line or web interface + */ + function readCommandLineSettings() + { + global $_phpDocumentor_setting,$interface,$_phpDocumentor_RIC_files; + // subscribe $render class to $parse class events + if (!isset($interface) && !isset($_GET['interface']) && !isset($_phpDocumentor_setting)) + { + // Parse the argv settings + $_phpDocumentor_setting = $this->setup->parseArgv(); + } + if (isset($_phpDocumentor_setting['useconfig']) && !empty($_phpDocumentor_setting['useconfig'])) return $this->readConfigFile($_phpDocumentor_setting['useconfig']); + if (!isset($_phpDocumentor_setting['junk'])) $_phpDocumentor_setting['junk'] = ''; + if (!isset($_phpDocumentor_setting['title'])) $_phpDocumentor_setting['title'] = 'Generated Documentation'; + $temp_title = $_phpDocumentor_setting['title']; + $this->render = new phpDocumentor_IntermediateParser($temp_title); + if (isset($_phpDocumentor_setting['help']) || $_phpDocumentor_setting['junk'] == "-h" || $_phpDocumentor_setting['junk'] == "--help") + { + echo $this->setup->displayHelpMsg(); + die(); + } + + if (isset($_phpDocumentor_setting['hidden'])) $this->hidden = true; + + // set to parse elements marked private with @access private + if (isset($_phpDocumentor_setting['parseprivate']) && $_phpDocumentor_setting['parseprivate'] == 'on') + { + $this->render->setParsePrivate(true); + } + + if (isset($_phpDocumentor_setting['ignoretags'])) + { + $ignoretags = explode(',', $_phpDocumentor_setting['ignoretags']); + $ignoretags = array_map('trim', $ignoretags); + $tags = array(); + foreach($ignoretags as $tag) + { + if (!in_array($tag,array('@global', '@access', '@package', '@ignore', '@name', '@param', '@return', '@staticvar', '@var'))) + $tags[] = $tag; + } + $_phpDocumentor_setting['ignoretags'] = $tags; + } + + if (isset($_phpDocumentor_setting['readmeinstallchangelog'])) + { + $_phpDocumentor_setting['readmeinstallchangelog'] = explode(',',str_replace(' ','',$_phpDocumentor_setting['readmeinstallchangelog'])); + $rics = array(); + foreach($_phpDocumentor_setting['readmeinstallchangelog'] as $ric) + { + $rics[] = strtoupper(trim($ric)); + } + $_phpDocumentor_RIC_files = $rics; + } + + if (isset($_phpDocumentor_setting['javadocdesc']) && $_phpDocumentor_setting['javadocdesc'] == 'on') + { + $this->parse->eventHandlers[PARSER_EVENT_DOCBLOCK] = 'JavaDochandleDocblock'; + } + if (tokenizer_ext) + { + if (isset($_phpDocumentor_setting['sourcecode']) && $_phpDocumentor_setting['sourcecode'] == 'on') + { + $_phpDocumentor_setting['sourcecode'] = true; + } else + { + $_phpDocumentor_setting['sourcecode'] = false; + } + } else + { + if (isset($_phpDocumentor_setting['sourcecode']) && $_phpDocumentor_setting['sourcecode'] == 'on') + { + addWarning(PDERROR_SOURCECODE_IGNORED); + } + $_phpDocumentor_setting['sourcecode'] = false; + } + if (isset($_phpDocumentor_setting['converterparams'])) + { + $_phpDocumentor_setting['converterparams'] = explode($_phpDocumentor_setting['converterparams']); + foreach($_phpDocumentor_setting['converterparams'] as $i => $p) + { + $_phpDocumentor_setting['converterparams'][$i] = trim($p); + } + } + if (isset($_phpDocumentor_setting['customtags']) && !empty($_phpDocumentor_setting['customtags'])) + { + $c = explode(',',$_phpDocumentor_setting['customtags']); + for($i=0;$irender->setQuietMode(true); + } + + // Setup the different classes + if (isset($_phpDocumentor_setting['templatebase'])) + { + $this->render->setTemplateBase($_phpDocumentor_setting['templatebase']); + } + if (isset($_phpDocumentor_setting['target']) && !empty($_phpDocumentor_setting['target'])) + { + $this->render->setTargetDir($_phpDocumentor_setting['target']); + } + else + { + echo "a target directory must be specified\n try phpdoc -h\n"; + die(); + } + if (!empty($_phpDocumentor_setting['packageoutput'])) + { + $this->packages = explode(",",$_phpDocumentor_setting['packageoutput']); + foreach($this->packages as $p => $v) + { + $this->packages[$p] = trim($v); + } + } + if (!empty($_phpDocumentor_setting['filename'])) + $this->files = $_phpDocumentor_setting['filename']; + if (!empty($_phpDocumentor_setting['directory'])) + $this->dirs = $_phpDocumentor_setting['directory']; + } + + function checkIgnoreTag($tagname, $inline = false) + { + global $_phpDocumentor_setting; + $tagname = '@'.$tagname; + if (!isset($_phpDocumentor_setting['ignoretags'])) return false; + if ($inline) $tagname = '{'.$tagname.'}'; + return in_array($tagname, $_phpDocumentor_setting['ignoretags']); + } + + function setJavadocDesc() + { + $this->parse->eventHandlers[PARSER_EVENT_DOCBLOCK] = 'JavaDochandleDocblock'; + } + + function setParsePrivate() + { + $this->render->setParserPrivate(true); + } + + function setQuietMode() + { + $this->render->setQuietMode(true); + } + + function setTargetDir($target) + { + $this->render->setTargetDir($target); + } + + function setTemplateBase($dir) + { + $this->render->setTemplateBase($dir); + } + + function setPackageOutput($po) + { + $this->packages = explode(",",$po); + } + + function setTitle($ti) + { + $this->render = new phpDocumentor_IntermediateParser($ti); + } + + function setFilesToParse($files) + { + $this->files = $files; + } + + function setDirectoriesToParse($dirs) + { + $this->dirs = $dirs; + } + + function parseHiddenFiles() + { + $this->hidden = true; + } + + function setIgnore($ig) + { + if (strstr($ig,",")) + { + $this->ignore_files = explode(",",$ig); + } else { + if (!empty($ig)) + $this->ignore_files = array($ig); + } + $this->ignore_files = array_map('trim', $this->ignore_files); + } + + function createDocs($title = false) + { + $this->parse_start_time = time(); + global $_phpDocumentor_setting; + if (!$this->render) + { + $this->render = new phpDocumentor_IntermediateParser($title); + } + // setup ignore list + $this->ignore_files =array(); + if(isset($_phpDocumentor_setting['ignore'])) + { + $this->setIgnore($_phpDocumentor_setting['ignore']); + } + $this->parse->subscribe("*",$this->render); + // parse the directory + if (!empty($this->files)) + { + $files = explode(",",$this->files); + foreach($files as $file) + { + $file = trim($file); + $test = $this->setup->getAllFiles($file); + if ($test) + { + foreach($test as $file) + { + $file = trim($file); + $dir = realpath(dirname($file)); + $dir = strtr($dir, "\\", "/"); + $dir = str_replace('//','/',$dir); + // strip trailing directory seperator + if (substr($dir,-1) == "/" || substr($dir,-1) == "\\") + { + $dir = substr($dir,0,-1); + } + $file = strtr(realpath($file), "\\", "/"); + $file = str_replace('//','/',$file); + + if (!$this->setup->checkIgnore(basename($file),dirname($file),$this->ignore_files)) + { + $filelist[] = str_replace('\\','/',$file); + } else { + phpDocumentor_out("File $file Ignored\n"); + flush(); + } + } + } else + { + $dir = realpath(dirname(realpath($file))); + $dir = strtr($dir, "\\", "/"); + $dir = str_replace('//','/',$dir); + // strip trailing directory seperator + if (substr($dir,-1) == "/" || substr($dir,-1) == "\\") + { + $dir = substr($dir,0,-1); + } + $base = count(explode("/",$dir)); + $file = strtr(realpath($file), "\\", "/"); + $file = str_replace('//','/',$file); + flush(); + + if (!$this->setup->checkIgnore(basename($file),dirname($file),$this->ignore_files)) + { + $filelist[] = str_replace('\\','/',$file); + } else { + phpDocumentor_out("File $file Ignored\n"); + flush(); + } + } + } + } + if (!empty($this->dirs)) + { + $dirs = explode(",",$this->dirs); + foreach($dirs as $dir) + { + $dir = trim(realpath($dir)); + $dir = strtr($dir, "\\", "/"); + $dir = str_replace('//','/',$dir); + // strip trailing directory seperator + if (substr($dir,-1) == "/" || substr($dir,-1) == "\\") + { + $dir = substr($dir,0,-1); + } + $files = $this->setup->dirList($dir,$this->hidden); + if (is_array($files)) + { + foreach($files as $file) + { + // Make sure the file isn't a hidden file + $file = strtr($file, "\\", "/"); + if (substr(basename($file),0,1) != ".") + { + if (!$this->setup->checkIgnore(basename($file),str_replace('\\','/',dirname($file)),$this->ignore_files)) + { + $filelist[] = str_replace('\\','/',$file); + } else { + phpDocumentor_out("File $file Ignored\n"); + flush(); + } + } + } + } + } + } + if (isset($filelist)) + { + if (PHPDOCUMENTOR_WINDOWS) + { + // case insensitive array_unique + usort($filelist,'strnatcasecmp'); + reset($filelist); + + $newarray = array(); + $i = 0; + + $element = current($filelist); + for ($n=0;$nsetup->getBase($filelist))); + define("PHPDOCUMENTOR_BASE",$source_base); + list($filelist,$ric) = $this->setup->getReadmeInstallChangelog($source_base, $filelist); + phpDocumentor_out("\n\nGrabbing README/INSTALL/CHANGELOG\n"); + flush(); + foreach($ric as $file) + { + phpDocumentor_out(basename($file).'...'); + flush(); + $fp = fopen($file,'r'); + $contents = fread($fp,filesize($file)); + $this->render->HandleEvent(PHPDOCUMENTOR_EVENT_README_INSTALL_CHANGELOG, array(basename($file),$contents)); + fclose($fp); + } + phpDocumentor_out("\ndone\n"); + flush(); + list($filelist,$tutorials) = $this->setup->getTutorials($filelist); + phpDocumentor_out("\n\nTutorial/Extended Documentation Parsing Stage\n\n"); + flush(); + if (count($tutorials)) + { + $tuteparser = new XMLPackagePageParser; + $tuteparser->subscribe('*',$this->render); + foreach($tutorials as $tutorial) + { + switch($tutorial['tutetype']) + { + case 'pkg' : + case 'cls' : + case 'proc' : + switch($tutorial['tutetype']) + { + case 'pkg' : + $ptext = 'Package-level Docs '; + if (!empty($tutorial['subpackage'])) + $ptext = 'Sub-Package Docs '; + break; + case 'cls' : + $ptext = 'Class-level Docs '; + break; + case 'proc' : + $ptext = 'Procedural-level Docs '; + break; + } + $fp = @fopen($tutorial['path'],"r"); + if ($fp) + { + $ret = fread($fp,filesize($tutorial['path'])); + // fix 1151650 + if (stristr($ret, "utf-8") !== "") + { + $ret = utf8_decode($ret); + } + fclose($fp); + unset($fp); + phpDocumentor_out('Parsing '.$ptext.$tutorial['path'].'...'); + flush(); + $tuteparser->parse($ret,$tutorial); + phpDocumentor_out("done\n"); + flush(); + } else + { + phpDocumentor_out('Error '.$ptext.$tutorial['path'].' doesn\'t exist'."\n"); + flush(); + } + default : + break; + } + } + } + phpDocumentor_out("done\n"); + flush(); + phpDocumentor_out("\n\nGeneral Parsing Stage\n\n"); + flush(); + foreach($filelist as $file) + { + phpDocumentor_out("Reading file $file"); + flush(); + $this->parse->parse($a = $this->setup->readPhpFile($file, $this->render->quietMode),$file,$base,$this->packages); + + } + $b = (time() - $this->parse_start_time); + phpDocumentor_out("done\n"); + flush(); + // render output + phpDocumentor_out("\nConverting From Abstract Parsed Data\n"); + flush(); + $this->render->output(); + $a = (time() - $this->parse_start_time); + $c = ($a - $b); + phpDocumentor_out("\nParsing time: $b seconds\n"); + phpDocumentor_out("\nConversion time: $c seconds\n"); + phpDocumentor_out("\nTotal Documentation Time: $a seconds\n"); + phpDocumentor_out("done\n"); + flush(); + } else + { + print "ERROR: nothing parsed"; + exit; + } + } + /** + * Parse configuration file phpDocumentor.ini + */ + function parseIni() + { + phpDocumentor_out("Parsing configuration file phpDocumentor.ini..."); + flush(); + if ('@DATA-DIR@' != '@'.'DATA-DIR@') + { + $options = phpDocumentor_parse_ini_file(str_replace('\\','/', '@DATA-DIR@/PhpDocumentor') . PATH_DELIMITER . 'phpDocumentor.ini',true); + } else { + $options = phpDocumentor_parse_ini_file(str_replace('\\','/',$GLOBALS['_phpDocumentor_install_dir']) . PATH_DELIMITER . 'phpDocumentor.ini',true); + } + + if (!$options) + { + print "ERROR: cannot open phpDocumentor.ini in directory " . $GLOBALS['_phpDocumentor_install_dir']."\n"; + print "-Is phpdoc in either the path or include_path in your php.ini file?"; + exit; + } + + foreach($options as $var => $values) + { + if ($var != 'DEBUG') + { +// phpDocumentor_out("\n$var"); + if ($var != '_phpDocumentor_setting' && $var != '_phpDocumentor_options' && $var != '_phpDocumentor_install_dir' ) $values = array_values($values); +// fancy_debug("\n$var",$values); + $GLOBALS[$var] = $values; + } + } + phpDocumentor_out("\ndone\n"); + flush(); + /** Debug Constant */ + define("PHPDOCUMENTOR_DEBUG",$options['DEBUG']['PHPDOCUMENTOR_DEBUG']); + define("PHPDOCUMENTOR_KILL_WHITESPACE",$options['DEBUG']['PHPDOCUMENTOR_KILL_WHITESPACE']); + $GLOBALS['_phpDocumentor_cvsphpfile_exts'] = $GLOBALS['_phpDocumentor_phpfile_exts']; + foreach($GLOBALS['_phpDocumentor_cvsphpfile_exts'] as $key => $val) + { + $GLOBALS['_phpDocumentor_cvsphpfile_exts'][$key] = "$val,v"; + } + // none of this stuff is used anymore + if (isset($GLOBALS['_phpDocumentor_html_allowed'])) + { + $___htmltemp = array_flip($GLOBALS['_phpDocumentor_html_allowed']); + $___html1 = array(); + foreach($___htmltemp as $tag => $trans) + { + $___html1['<'.$tag.'>'] = htmlentities('<'.$tag.'>'); + $___html1[''] = htmlentities(''); + } + $GLOBALS['phpDocumentor___html'] = array_flip($___html1); + } + } + + function setupConverters($output = false) + { + global $_phpDocumentor_setting; + if ($output) + { + $_phpDocumentor_setting['output'] = $output; + } + if (isset($_phpDocumentor_setting['output']) && !empty($_phpDocumentor_setting['output'])) + { + $c = explode(',',$_phpDocumentor_setting['output']); + for($i=0; $i< count($c); $i++) + { + $c[$i] = explode(':',$c[$i]); + $a = $c[$i][0]; + $b = false; + $d = 'default/'; + if (count($c[$i]) > 1) + { + $a = $c[$i][0]; + $b = $c[$i][1]; + if (isset($c[$i][2])) + { + $d = $c[$i][2]; + $d = str_replace("\\","/",$d); + if (substr($d,-1) != "/") + { + $d .= "/"; + } + } + else $d = 'default/'; + } + if (strtoupper(trim($a)) == 'HTML' && (trim($b) == 'default')) + { + phpDocumentor_out("WARNING: HTMLdefaultConverter is deprecated, using HTMLframesConverter.\n"); + phpDocumentor_out("WARNING: template output is identical, HTMLframes is more flexible.\n"); + phpDocumentor_out("WARNING: please adjust your usage\n"); + flush(); + $b = 'frames'; // change default to frames. + } + $this->render->addConverter(strtoupper(trim($a)),trim($b),trim($d)); + } + } else + { + $this->render->addConverter('HTML','frames','default/'); + } + if (empty($this->render->converters)) addErrorDie(PDERROR_NO_CONVERTERS); + } +} + +/** + * Print parse information if quiet setting is off + */ +function phpDocumentor_out($string) +{ + global $_phpDocumentor_setting; + if (!isset($_phpDocumentor_setting['quiet']) || !$_phpDocumentor_setting['quiet']) + { + print $string; + } + +} +?> diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/BUGS b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/BUGS new file mode 100644 index 00000000..fcbe48af --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/BUGS @@ -0,0 +1,7 @@ +Smarty is supported only in PHP 4.0.6 or later. + +Smarty versions previous to 2.0 require the PEAR libraries. Be sure to include +the path to the PEAR libraries in your php include_path. Config_file.class.php +uses the PEAR library for its error handling routines. PEAR comes with the PHP +distribution. Unix users check /usr/local/lib/php, windows users check +C:/php/pear. diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/COPYING.lib b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/COPYING.lib new file mode 100644 index 00000000..3b204400 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/COPYING.lib @@ -0,0 +1,458 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/ChangeLog b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/ChangeLog new file mode 100644 index 00000000..6dcda589 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/ChangeLog @@ -0,0 +1,5421 @@ +2003-11-18 Messju Mohr + + * NEWS + libs/Smarty.class.php + libs/Smarty_Compiler.class.php: + move Smarty::quote_replace() to Smarty_Compiler::_quote_replace() + + * libs/Smarty.class.php: + removed extract-calls from _include()- and _eval()-wrappers + variables passed with {include_php} have to accessed as members of $params + now + +2003-11-17 Messju Mohr + + * docs/designers.sgml: + fixed typo + +2003-11-13 Messju Mohr + + * libs/Config_File.class.php: + fix occasional notice + +2003-11-13 andreas halter + + * docs/de/designers.sgml: + - added cat modifier, thanks messju :-) + +2003-11-13 Monte Ohrt + + * (Smarty_2_6_0-RC3) + NEWS + libs/Config_File.class.php + libs/Smarty.class.php + libs/Smarty_Compiler.class.php: + commit RC3 tags + +2003-11-13 Messju Mohr + + * NEWS + libs/Smarty_Compiler.class.php: + fix handling of $var.key inside [] + + * libs/Smarty.class.php: + fix unnecessary loading of core.load_resource_plugin.php + + * (Smarty_2_6_0-RC3) + docs/fr/designers.sgml: + fixed example of html_table + +2003-11-11 Messju Mohr + + * NEWS + libs/core/core.process_cached_inserts.php: + fix handling of assign inside {insert}-tags + +2003-11-06 Messju Mohr + + * libs/core/core.read_cache_file.php: + added $exp_time-parameter + + * docs/programmers.sgml: + added $exp_time to cache_handler_func-example + + * libs/Smarty.class.php + libs/core/core.write_cache_file.php: + added $exp_time-parameter of clear_cache() and clear_all_cache() to + cache_handler_func. + +2003-11-05 Messju Mohr + + * NEWS + libs/Config_File.class.php: + fix handling if [...] inside triple-quotes in config-files + +2003-11-04 Messju Mohr + + * libs/Smarty.class.php: + fixed little bug in _parse_resource_name() (jlgunter, messju) + +2003-11-03 andreas halter + + * docs/designers.sgml + docs/de/designers.sgml + docs/fr/designers.sgml: + - changed Smarty.php.class occurences to Smarty.class.php + +2003-10-29 boots + + * docs/appendixes.sgml + docs/designers.sgml + docs/manual.sgml + docs/programmers.sgml + docs/de/appendixes.sgml + docs/de/designers.sgml + docs/de/programmers.sgml + docs/fr/appendixes.sgml + docs/fr/designers.sgml + docs/fr/getting-started.sgml + docs/fr/manual.sgml + docs/fr/preface.sgml + docs/fr/programmers.sgml: + Fixes to documentation syntax so that all content can be processed used + xsltproc docbook-xsl tools. In particular, fixes unescaped entities, + broken tags, unquoted attributes. + +2003-10-27 Messju Mohr + + * NEWS + libs/Smarty_Compiler.class.php: + fix handling of simple-math-operators inside modifiers + +2003-10-25 Messju Mohr + + * libs/Smarty_Compiler.class.php: + removed unused property _output_type + removed unused param $tag_attrs of _parse_var_props() + cleaned up alignment of class-properties + +2003-10-23 Messju Mohr + + * libs/Smarty_Compiler.class.php: + removed notice in php-tag handling in Smarty_Compiler::_compile_file() + + * libs/Smarty_Compiler.class.php: + removed two occasional E_NOTICES from + Smarty_Compiler::_compile_include_php_tag() + + * NEWS + libs/core/core.create_dir_structure.php: + fix handling of trailing-slashes in open_basedir in + smarty_core_create_dir_structure() + +2003-10-20 Messju Mohr + + * libs/Smarty_Compiler.class.php: + elements inside `` are bracketed now inside the compiled-tpl. this + fixes some issues with simple-math inside backticks. + +2003-10-16 Monte Ohrt + + * docs/designers.sgml: + update overlib docs, no working examples + +2003-10-12 Messju Mohr + + * libs/Smarty.class.php + libs/core/core.is_secure.php: + move check for template_dir in secure_dir-array into core.is_secure.php + + this makes template_exists() work correctly with security=true even if + template_dir is not inside the secure_dir-array + +2003-10-11 Messju Mohr + + * libs/plugins/shared.make_timestamp.php: + tightened check for YYYYMMDDHHMMSS-format. thanks konstantin for + pointing this out. + + removed a few tabs. + + * libs/Smarty_Compiler.class.php: + fix precedence of simple-math-operators before modifiers. + thanks dominik! + + * libs/Config_File.class.php + libs/Smarty.class.php + libs/Smarty_Compiler.class.php + libs/core/core.assemble_plugin_filepath.php + libs/core/core.assign_smarty_interface.php + libs/core/core.create_dir_structure.php + libs/core/core.display_debug_console.php + libs/core/core.get_include_path.php + libs/core/core.get_microtime.php + libs/core/core.get_php_resource.php + libs/core/core.is_secure.php + libs/core/core.is_trusted.php + libs/core/core.load_plugins.php + libs/core/core.load_resource_plugin.php + libs/core/core.process_cached_inserts.php + libs/core/core.process_compiled_include.php + libs/core/core.read_cache_file.php + libs/core/core.rm_auto.php + libs/core/core.rmdir.php + libs/core/core.run_insert_handler.php + libs/core/core.smarty_include_php.php + libs/core/core.write_compiled_include.php + libs/core/core.write_compiled_resource.php + libs/core/core.write_file.php: + removed tabs from the main and the core/*.php files + +2003-10-08 Monte Ohrt + + * (Smarty_2_6_0-RC2) + NEWS + libs/Config_File.class.php + libs/Smarty.class.php + libs/Smarty_Compiler.class.php: + update version numbers to RC2 + +2003-09-18 Messju Mohr + + * docs/designers.sgml + docs/de/designers.sgml: + fixed description of cycle's advance-attribute + +2003-09-16 Messju Mohr + + * NEWS + libs/Smarty_Compiler.class.php: + apply modifiers only once to section-loop and foreach-from attributes + +2003-09-15 Messju Mohr + + * libs/Smarty.class.php + libs/Smarty_Compiler.class.php + libs/core/core.write_cache_paths_file.php: + backed out _smarty_cached_paths-file-handling + + * libs/Smarty.class.php + libs/core/core.rm_auto.php: + fixed clear_compiled_tpl with explicit $tpl_file given + fixed return value of smarty_core_rm_auto() + Smarty::_unlink() + + * libs/Smarty.class.php: + little fix in _get_auto_filename() + +2003-09-14 Messju Mohr + + * libs/Smarty.class.php + libs/core/core.assemble_auto_filename.php: + removed auto-filenames from path-cache. merged assemble_auto_filename + back into Smarty::_get_auto_filename() + +2003-09-12 Messju Mohr + + * libs/Smarty_Compiler.class.php: + fixed quoting of modifier parameters + + * NEWS + libs/Smarty.class.php + libs/Smarty_Compiler.class.php + libs/core/core.get_php_resource.php + libs/core/core.load_plugins.php + libs/core/core.load_resource_plugin.php: + remove Smarty::_plugin_implementation_exists() - use php's native + is_callable() + +2003-09-11 Messju Mohr + + * libs/Smarty.class.php: + silenced two notices acces HTTP_SERVER_VARS + +2003-09-10 andreas halter + + * docs/de/designers.sgml + docs/de/getting-started.sgml + docs/de/programmers.sgml: + - minor fixes (2 rep), slight wording changes + - jade transform problem fixed + +2003-09-08 andreas halter + + * docs/de/designers.sgml + docs/de/getting-started.sgml + docs/de/manual.sgml + docs/de/preface.sgml + docs/de/programmers.sgml: + all updated for 2.6.0 release, translated everything from 2_5_0 branch to + 20030908 + +2003-09-04 Messju Mohr + + * libs/Smarty.class.php: + proper checking for files in _fetch_resource_info() + +2003-09-02 Messju Mohr + + * NEWS + libs/Smarty_Compiler.class.php: + ignore {strip}/{/strip) inside {strip}-blocks + + * libs/plugins/function.mailto.php: + fixed 2 notices in smarty_function_mailto() + +2003-09-01 Messju Mohr + + * libs/Smarty.class.php: + re-include cache_paths on multiple calls to fetch() to avoid + inconsistencies + at multiple calls to fetch() in one script + + * libs/Smarty_Compiler.class.php: + fixed handling of \r in {strip} + renamed $_trailing_lf to $_additional_newline + + * libs/Smarty_Compiler.class.php: + the weekly fix for {strip} :) + + * docs/designers.sgml: + fixed example for simple math. + +2003-08-29 Messju Mohr + + * libs/core/core.assign_smarty_interface.php + libs/core/core.display_debug_console.php + libs/plugins/function.assign.php + libs/plugins/function.html_options.php + libs/plugins/function.html_table.php: + fixed PHPDocumentor-comments (thanks Konstantin) + + * libs/core/core.rmdir.php: + made rmdir a bit more optimistic. especially it now removes + directories correctly that where created accidently by "safe_mode=On + && $use_sub_dirs=true" + +2003-08-27 Messju Mohr + + * NEWS + libs/Smarty_Compiler.class.php: + fixed removal of leading/trailing newlines in {strip}-blocks + +2003-08-25 Messju Mohr + + * INSTALL: + added note emphasizing the introduction of "libs/" with 2.5.0 + + * NEWS + libs/plugins/modifier.escape.php: + fixed proper escaping of " and ' with escape:javascript + +2003-08-22 Messju Mohr + + * NEWS + libs/core/core.assemble_plugin_filepath.php: + fixed bug in traversal of $smarty->plugins_dir-array in + smarty_core_assemble_plugin_filepath(). the first matching plugin in + the path should be used, not the last one. + + * libs/core/core.read_cache_file.php: + discard $_cache_info when the cache should be regenerated + +2003-08-20 Messju Mohr + + * NEWS + libs/Smarty_Compiler.class.php + libs/plugins/block.strip.php: + reverted {strip} from a block-plugin back into the compiler + + * docs/programmers.sgml: + fixed examples for register_function() and register_block() + + * libs/Smarty.class.php: + made template_exists() quiet when the template does not exist (thanks + to konstatin for pointing this out) + +2003-08-18 Monte Ohrt + + * docs/getting-started.sgml: + fix example title + + * docs/README + docs/getting-started.sgml: + change installation wording confusion + +2003-08-18 Messju Mohr + + * libs/Smarty.class.php + libs/core/core.read_cache_file.php: + fixed unnecessary load of source in template_exists() and the + compile-check of smarty_core_read_cache_file() + + * libs/Smarty_Compiler.class.php: + allow section-, array- and object-dereference in $smarty-references + +2003-08-15 Messju Mohr + + * docs/designers.sgml: + added parameter-descriptions for count_characters (thanks Konstantin + A. Pelepelin) + + fixed docs for {html_checkboxes} + +2003-08-14 Messju Mohr + + * libs/Smarty.class.php + libs/core/core.read_cache_file.php: + fixed timestamp-check of config-files in smarty_core_read_cache_file() + + * libs/Smarty.class.php: + fixed typecasting for arrays in _parse_resource_name() + + * NEWS + libs/plugins/function.config_load.php: + fixes in config_load: + - handling of section-attribute + - reusing the same config-file multiple times + - serialization of config-data for php<4.2.0 (no var_export) + + many thanks to atu for pointing this out and for testing + +2003-08-13 Messju Mohr + + * libs/Smarty.class.php + libs/core/core.smarty_include_php.php: + fixed problem with vars as attributes in {include_php} + +2003-08-13 Monte Ohrt + + * docs/README: + commit README file for documentation compiling + +2003-08-13 Messju Mohr + + * libs/debug.tpl + libs/plugins/modifier.debug_print_var.php: + removed '\r' from debug_print_vars' output + properly escape vars in javascript-version of debug.tpl + +2003-08-11 Monte Ohrt + + * (Smarty_2_6_0_RC1) + NEWS + docs/designers.sgml + docs/html.dsl + docs/php.dsl + libs/Config_File.class.php + libs/Smarty.class.php + libs/Smarty_Compiler.class.php: + get ready for 2.6.0-RC1 release + +2003-08-10 Messju Mohr + + * NEWS + libs/Smarty.class.php: + fixed status-header for cache_modified_check under cgi-sapi + +2003-08-09 Messju Mohr + + * libs/core/core.is_secure.php + libs/core/core.is_trusted.php: + synced secure_dir-checking with trusted_dir-checking + + * libs/core/core.is_secure.php: + tightenend path checking in smarty_core_is_secure() + +2003-08-08 Messju Mohr + + * libs/Smarty.class.php: + fix: proper nesting of $smarty->_cache_including flag in cascaded + cached/not-cached/fetched/inserted/foo-templates + + * libs/debug.tpl: + better escaping for $_debug_tpls[templates].filenames + + * libs/Smarty.class.php + libs/Smarty_Compiler.class.php: + removed redundant $smarty from Smarty::_smarty_include() + + * libs/debug.tpl: + proper escaping of filenames in debug-console (thanks to prossel). + +2003-08-07 Messju Mohr + + * docs/programmers.sgml: + added docs for block-methods of registered objects + + * docs/programmers.sgml: + fixed typo in example for registered objects + + * docs/designers.sgml: + fixed exampls of html_image and html_checkboxes + + * libs/plugins/function.debug.php: + fixed {debug} and removed tabs in function.debug.php + + * docs/programmers.sgml: + fixed example for register_object + + * docs/designers.sgml + docs/programmers.sgml: + updated docs for capture, html_table, html_image and register_object + +2003-08-07 Monte Ohrt + + * docs/designers.sgml + docs/programmers.sgml: + add math and default_resource_type to docs + + * docs/getting-started.sgml: + add core to example, add tech note + +2003-08-07 Messju Mohr + + * docs/manual.sgml + docs/fr/manual.sgml: + upd copyright in the docs + +2003-08-07 Monte Ohrt + + * docs/getting-started.sgml: + added core directory to install instructions + +2003-08-07 Messju Mohr + + * docs/designers.sgml + docs/programmers.sgml: + added docs for php-functions as modifiers + + * libs/Smarty.class.php + libs/Smarty_Compiler.class.php: + better caching of attributes for $cacheable=false-plugins + + * docs/programmers.sgml: + added section "caching.cacheable" to the docs, explaining the usage of + the $cacheable-flag of the register_(block|compiler|function)-functions + + * libs/Smarty_Compiler.class.php: + fixed output of custom-functions with cached attributes + + * docs/programmers.sgml: + docs update on callbacks to the register_*-functions + +2003-08-06 Messju Mohr + + * NEWS + libs/Smarty.class.php + libs/Smarty_Compiler.class.php + libs/core/core.process_compiled_include.php: + added optional parameter $cache_attrs to register_function() and + register_block(). $cache_attrs is an array containing attribute- names + that should be cached on calls to functions that have $cacheable set + to false. + + * libs/Smarty.class.php: + fixed bug in _run_mod_handler + + * libs/Smarty_Compiler.class.php: + fixed bug with autoload-handling of modifiers. thanks ándre. + +2003-08-05 Messju Mohr + + * libs/Config_File.class.php + libs/Smarty.class.php + libs/Smarty_Compiler.class.php: + updated copyright notice + + * libs/Smarty.class.php + libs/core/core.load_plugins.php: + fixed bug that occurred when using the same not-cacheable plugin in + multiple includes + + * docs/programmers.sgml: + docs-update for plugins.writing + +2003-08-04 Messju Mohr + + * docs/designers.sgml + docs/programmers.sgml: + updated docs for register_block_function(), block-functions, + $request_use_auto_globals and html_checkboxes + +2003-07-31 Messju Mohr + + * NEWS + libs/Smarty.class.php + libs/Smarty_Compiler.class.php: + enabled registration of class-methods as callbacks for the + register_*-functions + + use: array('classname', 'method_name')) as callback + +2003-07-29 Messju Mohr + + * libs/Smarty.class.php + libs/Smarty_Compiler.class.php: + modifiers are resolved at compile-time now. _run_mod_handler() is + still used for modifiers with map_array=true (== no preceeding '@') + + * libs/Smarty.class.php + libs/Smarty_Compiler.class.php + libs/core/core.smarty_include.php: + moved _smarty_include() back into Smarty.class.php + + * libs/Smarty.class.php + libs/core/core.load_plugins.php: + prevent unnecessary calls to _read_file() in _is_compiled() + converted method-call to internal function-call in + smarty_core_load_plugins() + +2003-07-28 Messju Mohr + + * libs/Smarty_Compiler.class.php: + quote smarty-header properly to prevent resource-names from escaping from + the comment + +2003-07-25 Messju Mohr + + * libs/core/core.create_dir_structure.php: + weakend race-condition and removed bogus error-message caused by that + in smarty_core_create_dir_structure(). + +2003-07-23 Messju Mohr + + * libs/Smarty.class.php + libs/core/core.display_debug_console.php + libs/core/core.fetch_resource_info.php + libs/core/core.get_php_resource.php + libs/core/core.parse_resource_name.php + libs/core/core.process_cached_inserts.php + libs/core/core.read_cache_file.php + libs/core/core.run_insert_handler.php + libs/core/core.smarty_include.php + libs/core/core.smarty_include_php.php + libs/plugins/function.eval.php: + moved _fetch_resource_info and _parse_resource_name back into + Smarty.class.php + renamed smarty_include and smarty_eval wrappers to _include and _eval + +2003-07-17 Messju Mohr + + * libs/core/core.process_compiled_include.php + libs/core/core.read_cache_file.php: + improved checking of compiled_include against cached-template with + non-cached-chunks + + * libs/core/core.write_compiled_include.php: + fixed too short open-tag + + * libs/plugins/function.eval.php: + fixed assign parameter for eval (must have gotton lost on its way to 2.5.0) + cleaned up indentiation + +2003-07-03 Messju Mohr + + * libs/Smarty_Compiler.class.php: + resurrected $foo->$bar syntax + + * libs/Smarty_Compiler.class.php: + i'm so stupid. kick me. + + * libs/Smarty_Compiler.class.php: + fixed initialisation of $this->_plugins in compile_block_tag() + +2003-07-03 Monte Ohrt + + * libs/Config_File.class.php: + add preg_quote delimiter + +2003-07-03 Messju Mohr + + * libs/Smarty_Compiler.class.php: + applied fix for {$var1->p1|modifier:$var2->p2}-syntax - thanks Dominik + +2003-07-02 Messju Mohr + + * libs/Smarty_Compiler.class.php: + fixed duplicate generation of arg-list in _compile_block_tag() + + * libs/Smarty_Compiler.class.php: + fixed off-by-one-error in nocache-tag-handling + +2003-06-30 Messju Mohr + + * libs/Smarty_Compiler.class.php: + backed out errornously committed support for $foo->$bar + + * libs/core/core.write_file.php: + fixed indentiation, silenced occasional warning + + * libs/plugins/function.html_image.php: + match first character of file-attribute against "/" instead of + DIRECTORY_SEPARATOR since it is a url-path and not a file-path. + + * libs/Smarty_Compiler.class.php + libs/core/core.write_file.php + libs/plugins/function.html_image.php: + libs/plugins/function.html_image.php + + * libs/Smarty_Compiler.class.php: + re-fixed cacheable_state-handling + + * libs/core/core.display_debug_console.php + libs/core/core.process_cached_inserts.php + libs/core/core.process_compiled_include.php + libs/core/core.run_insert_handler.php: + extincting $this out of smarty_core_*-functions + + * libs/Smarty.class.php + libs/Smarty_Compiler.class.php: + fixed handling of nocache-state + +2003-06-29 Messju Mohr + + * libs/Smarty.class.php + libs/core/core.smarty_include.php + libs/core/core.smarty_include_php.php + libs/plugins/function.eval.php: + removed $this from smarty_include and smarty_include_php + added cleaner handling of $this to {eval} + + * libs/core/core.load_resource_plugin.php: + fixed inlude_once-call + + * docs/de/designers.sgml + docs/fr/designers.sgml: + fixed examples of html_radios and html_checkboxes in german and french docs + +2003-06-25 Monte Ohrt + + * libs/core/core.assemble_auto_filename.php + libs/core/core.write_cache_paths_file.php: + fix typo, fix write_cache_paths logic + + * libs/Smarty.class.php + libs/core/core.assemble_auto_filename.php: + fix SMARTY_COMPILE_DIR_SEP problem, make local var + +2003-06-24 Monte Ohrt + + * libs/Smarty.class.php + libs/core/core.assemble_auto_filename.php + libs/core/core.write_cache_paths_file.php: + fixed cache_paths bug, simplified filename assembly logic + +2003-06-24 Messju Mohr + + * libs/plugins/function.html_image.php: + added parsing of forgotton param "basedir" + + * libs/Smarty_Compiler.class.php: + fixed $smarty.get-reference + + * libs/plugins/block.textformat.php: + removed warning + + * libs/Smarty_Compiler.class.php: + fixed value of _cacheable_state on compiler-startup + +2003-06-23 Monte Ohrt + + * libs/Smarty.class.php + libs/Smarty_Compiler.class.php + libs/core/core.write_cache_paths_file.php: + make cache_path per resource, fix a couple directory path issues + +2003-06-23 Messju Mohr + + * libs/Smarty_Compiler.class.php: + removed warning when compiling empty template + + * libs/core/core.write_compiled_include.php: + fixed bug in write_compiled_include + + * libs/core/core.assemble_plugin_filepath.php: + fixed warning + +2003-06-22 Messju Mohr + + * libs/plugins/function.eval.php: + fixed propagation of $this into evald code in smarty_function_eval() + + * libs/core/core.write_cache_paths_file.php + libs/core/core.write_compiled_include.php: + fix in compiled-include-handling + + * libs/core/core.assemble_auto_filename.php + libs/core/core.assemble_plugin_filepath.php + libs/core/core.assign_smarty_interface.php + libs/core/core.create_dir_structure.php + libs/core/core.fetch_resource_info.php + libs/core/core.get_include_path.php + libs/core/core.get_microtime.php + libs/core/core.get_php_resource.php + libs/core/core.is_secure.php + libs/core/core.is_trusted.php + libs/core/core.load_plugins.php + libs/core/core.load_resource_plugin.php + libs/core/core.parse_resource_name.php + libs/core/core.read_cache_file.php + libs/core/core.rm_auto.php + libs/core/core.rmdir.php + libs/core/core.write_cache_file.php + libs/core/core.write_cache_paths_file.php + libs/core/core.write_compiled_include.php + libs/core/core.write_compiled_resource.php + libs/core/core.write_file.php + libs/plugins/modifier.date_format.php: + started moving from $this to $smarty in core.*.php + +2003-06-21 Monte Ohrt + + * libs/core/core.create_dir_structure.php + libs/core/core.write_file.php + libs/plugins/function.config_load.php: + fix more dir paths + + * NEWS + libs/Smarty.class.php + libs/core/core.assemble_auto_filename.php + libs/core/core.assemble_plugin_filepath.php + libs/core/core.fetch_resource_info.php + libs/core/core.get_php_resource.php + libs/core/core.parse_resource_name.php + libs/core/core.process_cached_inserts.php + libs/core/core.read_cache_file.php + libs/core/core.rm_auto.php + libs/core/core.rmdir.php + libs/core/core.run_insert_handler.php + libs/core/core.smarty_include.php + libs/core/core.smarty_include_php.php + libs/core/core.write_cache_file.php + libs/core/core.write_cache_paths_file.php + libs/core/core.write_compiled_include.php + libs/core/core.write_compiled_resource.php + libs/core/core.write_file.php + libs/plugins/function.config_load.php + libs/plugins/function.fetch.php + libs/plugins/function.html_image.php: + fix filepaths to core files to use DIRECTORY_SEPARATOR + +2003-06-21 Messju Mohr + + * libs/Smarty_Compiler.class.php: + fixed {plugin|modifier} syntax + + * libs/Smarty.class.php + libs/core/core.write_compiled_include.php: + fixed compiled include handling + +2003-06-21 Monte Ohrt + + * libs/Smarty.class.php + libs/Smarty_Compiler.class.php + libs/core/core.assemble_auto_filename.php + libs/core/core.assemble_plugin_filepath.php + libs/core/core.write_cache_paths_file.php: + added filepath caching + +2003-06-20 Monte Ohrt + + * libs/Smarty_Compiler.class.php: + update more varnames + + * libs/Smarty.class.php + libs/core/core.display_debug_console.php + libs/core/core.fetch_file_info.php + libs/core/core.fetch_resource_info.php + libs/core/core.get_php_resource.php + libs/core/core.parse_file_path.php + libs/core/core.parse_resource_name.php + libs/core/core.process_cached_inserts.php + libs/core/core.read_cache_file.php + libs/core/core.run_insert_handler.php + libs/core/core.smarty_include.php + libs/core/core.smarty_include_php.php + libs/core/core.write_compiled_resource.php + libs/core/core.write_compiled_template.php + libs/plugins/function.config_load.php: + refactored var naming to better reflect "resource" instead of "file" where + appropriate + +2003-06-19 Messju Mohr + + * libs/Smarty.class.php: + updated version-number to 2.5.0-cvs + + * libs/core/core.write_cache_file.php: + omit is-cache_dir-writable-check if a cache_handler_function is in use + + * libs/core/core.smarty_include_php.php: + fixed comments in smarty_include_php + +2003-06-19 Monte Ohrt + + * libs/Smarty.class.php + libs/Smarty_Compiler.class.php + libs/core/core.display_debug_console.php + libs/core/core.smarty_include.php + libs/plugins/function.eval.php: + split up _compile_template to _compile_file and _compile_source, fix eval + function + VS: ---------------------------------------------------------------------- + + * libs/plugins/function.config_load.php: + fix logic for _is_compiled() + +2003-06-19 Messju Mohr + + * NEWS + libs/Smarty_Compiler.class.php: + added optional assign-attribute to {capture}-tag + + * NEWS + libs/Smarty.class.php: + added $cacheable-parameter to register_compiler_function() + +2003-06-18 Messju Mohr + + * NEWS + libs/Smarty.class.php + libs/Smarty_Compiler.class.php + libs/core/core.load_plugins.php + libs/core/core.process_compiled_include.php + libs/core/core.read_cache_file.php + libs/core/core.write_cache_file.php + libs/core/core.write_compiled_include.php: + added $cacheable-parameter to register_function() and register_block() + + * libs/Smarty.class.php: + append '.php' to all compiled templates regardless of the settings of + $use_sub_dirs + + * libs/Smarty.class.php + libs/core/core.read_cache_file.php: + fixed $file_path-parameters passed to smarty_core_fetch_file_info() + +2003-06-17 Monte Ohrt + + * NEWS: + fix name + + * libs/Smarty_Compiler.class.php: + change varnames to follow coding methods + + * NEWS + libs/Smarty_Compiler.class.php: + add math patch to core + +2003-06-17 Messju Mohr + + * libs/core/core.smarty_include.php: + switched _process_template() to _is_compiled()-logic + +2003-06-17 Monte Ohrt + + * libs/Smarty.class.php: + fix _is_compiled logic + + * NEWS: + update news file + + * libs/Smarty.class.php + libs/Smarty_Compiler.class.php: + fix _run_mod_handler routine + + * libs/Smarty.class.php + libs/Smarty_Compiler.class.php + libs/core/core.display_debug_console.php + libs/core/core.fetch_file_info.php + libs/core/core.parse_file_path.php + libs/core/core.write_compiled_template.php + libs/plugins/function.config_load.php: + fix path problems, rename some varibles from "template" to "file" + +2003-06-16 Monte Ohrt + + * libs/core/core.fetch_file_info.php + libs/core/core.fetch_template_info.php: + rename file, commit + + * libs/Smarty.class.php + libs/Smarty_Compiler.class.php + libs/core/core.parse_file_path.php + libs/core/core.read_cache_file.php + libs/plugins/block.strip.php + libs/plugins/block.textformat.php + libs/plugins/compiler.config_load.php + libs/plugins/function.config_load.php + libs/plugins/function.eval.php + libs/plugins/function.fetch.php + libs/plugins/function.html_image.php: + fix config_load, compile fetched arrays to compile_dir, switch display + back to runtime. clean up var names and function names, split up compile + testing and compiling to separate funcs, rename some template_* functions + to + file_* functions and update logic so they can be used for file resources + other than templates. + +2003-06-16 Messju Mohr + + * libs/Smarty_Compiler.class.php: + fixed little bug in _compile_custom_tag() + +2003-06-16 Monte Ohrt + + * NEWS + libs/Smarty.class.php + libs/Smarty_Compiler.class.php + libs/core/core.assign_smarty_interface.php + libs/core/core.create_dir_structure.php + libs/core/core.display_debug_console.php + libs/core/core.fetch_template_info.php + libs/core/core.get_include_path.php + libs/core/core.get_microtime.php + libs/core/core.get_php_resource.php + libs/core/core.is_secure.php + libs/core/core.is_trusted.php + libs/core/core.load_plugins.php + libs/core/core.load_resource_plugin.php + libs/core/core.parse_file_path.php + libs/core/core.process_cached_inserts.php + libs/core/core.read_cache_file.php + libs/core/core.rm_auto.php + libs/core/core.rmdir.php + libs/core/core.run_insert_handler.php + libs/core/core.smarty_include.php + libs/core/core.smarty_include_php.php + libs/core/core.write_cache_file.php + libs/core/core.write_compiled_template.php + libs/core/core.write_file.php + libs/plugins/core.assign_smarty_interface.php + libs/plugins/core.create_dir_structure.php + libs/plugins/core.display_debug_console.php + libs/plugins/core.fetch_template_info.php + libs/plugins/core.get_include_path.php + libs/plugins/core.get_microtime.php + libs/plugins/core.get_php_resource.php + libs/plugins/core.is_secure.php + libs/plugins/core.is_trusted.php + libs/plugins/core.load_plugins.php + libs/plugins/core.load_resource_plugin.php + libs/plugins/core.parse_file_path.php + libs/plugins/core.process_cached_inserts.php + libs/plugins/core.read_cache_file.php + libs/plugins/core.rm_auto.php + libs/plugins/core.rmdir.php + libs/plugins/core.run_insert_handler.php + libs/plugins/core.smarty_include.php + libs/plugins/core.smarty_include_php.php + libs/plugins/core.write_cache_file.php + libs/plugins/core.write_compiled_template.php + libs/plugins/core.write_file.php: + move core files into their own directory under SMARTY_DIR, + remove abstraction function _execute_core_function + + * libs/Smarty_Compiler.class.php: + fix newline handling for template for all template tags + +2003-06-11 Monte Ohrt + + * libs/plugins/compiler.config_load.php: + add compiler function to cvs repository + +2003-06-11 Messju Mohr + + * NEWS + libs/Smarty.class.php + libs/Smarty_Compiler.class.php: + added config-option "request_use_auto_globals" to make auto-globals be + used as request vars instead of HTTP_*_VARS + +2003-06-11 Monte Ohrt + + * NEWS + libs/Smarty.class.php + libs/Smarty_Compiler.class.php + libs/plugins/function.config_load.php: + make config vars compile statically + +2003-06-11 Messju Mohr + + * NEWS + libs/Smarty_Compiler.class.php: + backed out newlines patch + + * NEWS + libs/Smarty_Compiler.class.php: + removed newlines in compiled templates after closing tags + +2003-06-10 Messju Mohr + + * docs/de/designers.sgml: + fixed german note on html_image and disk-access + +2003-06-10 Monte Ohrt + + * libs/plugins/core.parse_file_path.php: + fix bug with resource_type resolving + +2003-06-09 Monte Ohrt + + * docs/designers.sgml: + replace example with more practical one + +2003-06-08 Messju Mohr + + * NEWS + libs/Smarty.class.php + libs/Smarty_Compiler.class.php: + added block-methods for registered objects + +2003-06-07 Messju Mohr + + * docs/programmers.sgml: + fixed bug in documentation for $smarty->default_modifiers + +2003-06-06 Monte Ohrt + + * libs/plugins/core.parse_file_path.php: + fix problem with new default_resource_type changes + + * NEWS: + update NEWS file info + + * NEWS + libs/Smarty.class.php + libs/plugins/core.parse_file_path.php: + add default_resource_type, ignore 1 char resource names + + * NEWS + libs/Config_File.class.php: + fix bug where config file starts with hidden section + +2003-06-04 Monte Ohrt + + * NEWS + libs/Smarty.class.php: + -** empty log message *** + +2003-06-03 Monte Ohrt + + * libs/plugins/function.html_image.php: + fix example in code comments + +2003-06-03 Messju Mohr + + * NEWS + libs/plugins/function.counter.php: + fixed behaviour of start=... for {counter} + +2003-06-02 Messju Mohr + + * NEWS + libs/plugins/function.counter.php: + fixed assign for {counter} + +2003-05-30 Monte Ohrt + + * libs/plugins/core.write_cache_file.php + libs/plugins/core.write_compiled_template.php: + add discrete error checking pertaining to $cache_dir + and $compile_dir, their existance and writability + +2003-05-28 Messju Mohr + + * NEWS + libs/plugins/function.html_table.php: + added params vdir, hdir and inner to html_table to allow looping over + the data in various directions + +2003-05-28 Monte Ohrt + + * libs/plugins/core.compile_template.php + libs/plugins/core.display_debug_console.php: + fix problem with security and debug.tpl file + +2003-05-23 Monte Ohrt + + * NEWS: + upd NEWS file + + * libs/Smarty_Compiler.class.php: + allow spaces in literal tags + +2003-05-22 Monte Ohrt + + * docs/fr/programmers.sgml: + fix special chars + +2003-05-19 Monte Ohrt + + * NEWS + libs/Smarty_Compiler.class.php: + speed up compiled templates, hardcode plugin filepaths instead of + recalculate at runtime + +2003-05-19 Messju Mohr + + * docs/designers.sgml: + fixed example of {html_image} + + * docs/designers.sgml: + fixed typo + +2003-05-12 Messju Mohr + + * libs/Smarty.class.php + libs/plugins/core.read_cache_file.php + libs/plugins/core.smarty_include.php + libs/plugins/function.config_load.php: + fixed multiple redundant occurrences for 'config' and 'template' in + $smarty->_cache_info + +2003-05-10 Messju Mohr + + * libs/plugins/core.create_dir_structure.php: + refurbished create_dir_structure to use '/' internally + + * libs/plugins/core.create_dir_structure.php: + fixed windows absolute-paths in smarty_core_create_dir_structure() + + * libs/plugins/core.create_dir_structure.php: + fixed error-message + +2003-05-09 Messju Mohr + + * libs/Smarty_Compiler.class.php: + fixed warning due to missing param to _execute_core_function() + + * libs/Smarty_Compiler.class.php: + fixed quoting in _compile_include_php + + * libs/Smarty_Compiler.class.php: + fixed quoting of "file"-parameter in _compile_include_tag() + +2003-05-08 Monte Ohrt + + * docs/programmers.sgml: + fix typo + + * libs/Smarty.class.php + libs/Smarty_Compiler.class.php + libs/plugins/core.compile_template.php + libs/plugins/core.create_dir_structure.php + libs/plugins/core.fetch_template_info.php + libs/plugins/core.get_include_path.php + libs/plugins/core.get_microtime.php + libs/plugins/core.get_php_resource.php + libs/plugins/core.is_secure.php + libs/plugins/core.is_trusted.php + libs/plugins/core.load_plugins.php + libs/plugins/core.load_resource_plugin.php + libs/plugins/core.parse_file_path.php + libs/plugins/core.process_cached_inserts.php + libs/plugins/core.read_cache_file.php + libs/plugins/core.rm_auto.php + libs/plugins/core.rmdir.php + libs/plugins/core.run_insert_handler.php + libs/plugins/core.smarty_include.php + libs/plugins/core.smarty_include_php.php + libs/plugins/core.write_cache_file.php + libs/plugins/core.write_compiled_template.php + libs/plugins/core.write_file.php + libs/plugins/function.config_load.php + libs/plugins/function.fetch.php + libs/plugins/function.html_image.php: + abstract more private functions to plugin directory + + * libs/Config_File.class.php: + only add DIRECTORY_SEPARATOR if it isn't already present + + * libs/Config_File.class.php: + fix directory separator code, use DIRECTORY_SEPARATOR + +2003-05-08 Messju Mohr + + * docs/designers.sgml: + fixed example of html_checkboxes + + * NEWS + libs/Smarty.class.php: + fixed bug in _create_dir_structure() when used with + open_basedir-restriction and relative paths + + * docs/designers.sgml: + fixed example for html_radios + +2003-05-07 Monte Ohrt + + * libs/Smarty.class.php + libs/Smarty_Compiler.class.php + libs/plugins/core.assign_smarty_interface.php + libs/plugins/core.display_debug_console.php + libs/plugins/function.display_debug_console.php: + abstracted display_debug_console and assign_smarty_interface to plugin dir + as a test + + * libs/Smarty.class.php + libs/plugins/function.display_debug_console.php: + correct misc varnames, abstract debug console display to plugin function + + * libs/plugins/modifier.escape.php: + fix typo + +2003-05-05 Monte Ohrt + + * libs/Smarty_Compiler.class.php: + add % to math + + * libs/Smarty.class.php: + clean up comments, formatting + + * NEWS + libs/Smarty.class.php: + keep DIR_SEP for 3rd party compatability + + * NEWS + libs/Smarty.class.php: + remove DIR_SEP, use DIRECTORY_SEPARATOR exclusively + + * libs/Smarty_Compiler.class.php: + remove ++ and -- math operators on template vars + +2003-05-04 Messju Mohr + + * libs/Smarty_Compiler.class.php: + removed unused parameter $quote from Smarty_Compiler::_parse_attrs() + + * libs/plugins/function.html_image.php: + fixed DIR_SEP in html_image-plugin + +2003-05-04 Monte Ohrt + + * NEWS + libs/Smarty.class.php: + rename DIR_SEP to SMARTY_DIR_SEP to avoid varname collisions + +2003-05-04 Messju Mohr + + * NEWS + libs/plugins/function.html_image.php: + changed "link" to "href" in html_image. "link" is still working but + deprecated + html_image always renders an alt-tag now (default alt="") + cleaned up indentiation of function.html_image.php + +2003-05-03 Monte Ohrt + + * libs/debug.tpl: + fix typo + +2003-05-02 Messju Mohr + + * NEWS + libs/plugins/function.counter.php: + fixed assign attribute for multiple counters + +2003-05-02 Monte Ohrt + + * libs/Smarty_Compiler.class.php: + allow math on negative number + + * NEWS + libs/Smarty_Compiler.class.php: + added simple math operators to variables + +2003-05-02 Messju Mohr + + * docs/designers.sgml: + fixed typos + +2003-04-30 Monte Ohrt + + * docs/fr/appendixes.sgml + docs/fr/common.dsl + docs/fr/designers.sgml + docs/fr/getting-started.sgml + docs/fr/html-common.dsl + docs/fr/html.dsl + docs/fr/manual.sgml + docs/fr/php.dsl + docs/fr/preface.sgml + docs/fr/programmers.sgml: + add frech docs to cvs repository + +2003-04-29 Messju Mohr + + * NEWS + libs/Smarty.class.php + libs/Smarty_Compiler.class.php: + reverted patch for case-insensitive tag-names + +2003-04-28 Messju Mohr + + * docs/programmers.sgml: + reverted back to humerous redundancy in the docs :). although we all + know we are here to generate template-based output, and not to have + fun ;-) + + * docs/getting-started.sgml: + fixed default user and group for max os x installation + + * libs/Smarty.class.php: + made $function[2] and $function[3] options for register_resource + + * libs/Smarty.class.php: + fixed issue with object-callback when fetching a php-resource + + * NEWS + libs/Smarty.class.php: + enabled array(&$obj. 'source', 'timestamp', 'secure', 'trusted') as + callback for register_resource() + + enabled array(&$obj, 'method') as callback for + $default_template_handler_func + +2003-04-27 Messju Mohr + + * docs/designers.sgml + docs/programmers.sgml: + fixed some typos, thank to mehdi + + * libs/plugins/function.counter.php: + prevent assign from overruling print-attribute in function.counter.php + + * libs/plugins/function.counter.php: + fixed problem with counter and assign + + * libs/Smarty.class.php: + fixed notice in _load_plugins() + + * NEWS + libs/Smarty.class.php + libs/Smarty_Compiler.class.php: + made plugin-names case-insensitive. this affects + compiler/block/custom-functions and modifers. + +2003-04-26 Monte Ohrt + + * NEWS + libs/Smarty_Compiler.class.php: + remove unnecessary close/open tags from compiled templates + +2003-04-26 Messju Mohr + + * docs/designers.sgml: + added documentation for foreach.property.* + +2003-04-24 Messju Mohr + + * docs/designers.sgml: + fixed example table_attr and tr_attr in html_table-example + +2003-04-21 Greg Beaver + + * libs/Smarty.class.php: + fixed small bug in doc comments + +2003-04-21 Messju Mohr + + * NEWS + libs/plugins/function.html_image.php: + fixed errornous creation of '//' in image_path in html_image + +2003-04-21 Monte Ohrt + + * libs/plugins/modifier.debug_print_var.php: + fix htmlspecialchars() conflict + + * NEWS + libs/plugins/modifier.debug_print_var.php: + fix escapement of special chars in key values of debug console + + * NEWS + libs/plugins/function.config_load.php: + fixed debug timing logic for config_load + + * docs/designers.sgml: + fix example text + + +2003-04-20 Greg Beaver + * plugins/* + Smarty.class.php + Smarty_Compiler.class.php + Config_File.class.php: + updated all doc comments to phpDocumentor format (whew!) + +2003-04-06 Messju Mohr + + * libs/plugins/function.math.php: + allowed "_" in the name of variable-parameters to {math}-function + +2003-04-04 Monte Ohrt + + * NEWS + docs/designers.sgml + libs/Smarty_Compiler.class.php: + change backtic syntax from $`foo` to `$foo` + + * NEWS + libs/Smarty_Compiler.class.php: + recognize $foo[][] syntax in embedded quotes without backticks + +2003-04-03 Messju Mohr + + * NEWS + libs/Smarty_Compiler.class.php: + name=123 is passed as an integer (not a string) to plugins now + +2003-04-01 Messju Mohr + + * libs/Smarty.class.php + libs/Smarty_Compiler.class.php: + added CVS $Id: ChangeLog,v 1.1 2005/10/17 18:37:38 jeichorn Exp $ + +2003-03-31 Messju Mohr + + * libs/Smarty.class.php: + added missing compile_id inside Smarty_Compiler + + * libs/Smarty_Compiler.class.php: + fixed flaw when generating an error for missing postfilter + +2003-03-31 Monte Ohrt + + * docs/getting-started.sgml + docs/programmers.sgml: + fix typos + +2003-03-27 Messju Mohr + + * NEWS + libs/plugins/modifier.debug_print_var.php: + $length is now propagated to sub-values in debug_print_var + +2003-03-26 Monte Ohrt + + * NEWS: + update header + + * RELEASE_NOTES: + commit changes to release notes + + * (Smarty_2_5_0_RC2) + libs/Config_File.class.php + libs/Smarty.class.php + libs/Smarty_Compiler.class.php: + committing RC2 + +2003-03-24 Messju Mohr + + * NEWS + libs/Smarty.class.php: + made clear_cache() ignore compile_id when clearing cache_groups + + * libs/plugins/function.popup.php: + made onmouseout XHTML-compatible in function.popup.php + +2003-03-21 Messju Mohr + + * NEWS + libs/Smarty.class.php: + applied new var-names to fetch() + + * NEWS + libs/Smarty.class.php: + renamed $localvars to $_localvars in cache-file-handling-functions, + added _get_auto_id()-function + +2003-03-21 Monte Ohrt + + * libs/plugins/function.mailto.php + libs/plugins/function.popup.php: + update functions for XHTML compatability + +2003-03-21 Messju Mohr + + * libs/Smarty.class.php: + fixed wrong $auto_id in _read_cache_file() + + * NEWS + libs/Smarty.class.php: + swapped compile_id and cache_id in read_cache_file and write_cache_file + + * libs/Smarty.class.php: + reverted patch for ignoring compile-id back to -r1.364, due to problems + + * NEWS + libs/plugins/function.html_checkboxes.php + libs/plugins/function.html_radios.php: + html_radios and html_checkboxes accept "selected" instead of "checked" + optionally now + + * NEWS + libs/Smarty.class.php: + swapped compile_id and cache_id for cache-file-handling again + +2003-03-20 Monte Ohrt + + * libs/Smarty_Compiler.class.php: + fix notice when no parameter is passed to default + +2003-03-20 Messju Mohr + + * NEWS + libs/Smarty.class.php: + removed notice of undefined var in _rm_auto() + +2003-03-19 Monte Ohrt + + * libs/plugins/function.html_checkboxes.php + libs/plugins/function.html_radios.php + libs/plugins/function.html_table.php: + fix a few error messages, follow consistancy format plugin_name: errormsg + + * libs/plugins/function.html_radios.php: + update error messages + + * NEWS + libs/plugins/function.html_radios.php: + add a warning when an array is passed as the 'checked' value of html_radios + +2003-03-19 Messju Mohr + + * NEWS + libs/Smarty_Compiler.class.php: + fixed errormessage in _compile_smarty_ref() + + * NEWS + docs/designers.sgml: + updated docs for html_image + +2003-03-18 Messju Mohr + + * NEWS + libs/Smarty.class.php: + cleaned up calls to readdir() + + * libs/plugins/function.html_options.php: + fixed label for optgroup in html_options + +2003-03-18 Monte Ohrt + + * NEWS + libs/Smarty_Compiler.class.php: + fix (newly introduced) bug with passing multiple modifiers to a parameter + +2003-03-18 Messju Mohr + + * NEWS + docs/designers.sgml: + updated docs for html_checkboxes, html_options and html_radios + + * libs/plugins/function.html_options.php: + fixed wrong default-"name" in function.html_options.php + + * NEWS + libs/plugins/function.html_checkboxes.php + libs/plugins/function.html_radios.php: + renamed "checkbox" and "radios" to "options" in {html_checkboxes} and + {html_radios} + + * libs/plugins/outputfilter.trimwhitespace.php: + tried to optimize re-replacement in outputfilter.trimwhitespace.php a + little + + * libs/plugins/outputfilter.trimwhitespace.php: + fixed greedy str_replace in outputfilter.trimwhitespace.php + + * NEWS + libs/plugins/function.html_checkboxes.php + libs/plugins/function.html_options.php + libs/plugins/function.html_radios.php: + html_options, html_checkboxes and html_radios now pass-thru all unknown + paramters + +2003-03-17 Messju Mohr + + * NEWS + libs/plugins/function.html_options.php: + html_options passthru all unknown paramters now + +2003-03-17 Monte Ohrt + + * NEWS + libs/plugins/function.html_image.php: + Fix link bug in html_image function, also make output XHTML compatible + + * libs/Smarty_Compiler.class.php: + fix issue of embedded var and escaped double quotes + +2003-03-15 Monte Ohrt + + * NEWS + libs/Smarty_Compiler.class.php: + back out "@" logic, apply only to default modifier special case + + * libs/Smarty_Compiler.class.php: + fix @ logic, only use upon an echo + + * NEWS + libs/Smarty_Compiler.class.php: + append "@" to template var echoes to supress possible notices + + * NEWS + libs/Smarty_Compiler.class.php: + append "@" to _run_mod_handler to supress warnings + +2003-03-14 Monte Ohrt + + * NEWS + libs/Smarty_Compiler.class.php: + fix problem with escaped double quotes + + * NEWS + libs/plugins/function.html_radios.php: + fixed html_options to not return an array + +2003-03-12 Messju Mohr + + * NEWS + libs/plugins/modifier.truncate.php: + fixed length in modifier.truncate.php + + * NEWS + libs/plugins/outputfilter.trimwhitespace.php: + fixed handling of '$'-signs in trimwhitespace outputfilter (messju) + +2003-03-12 Monte Ohrt + + * docs/programmers.sgml: + update technical explanation of assign_by_ref and append_by_ref + +2003-03-11 Monte Ohrt + + * NEWS + libs/Smarty.class.php: + fix config file recompiling code + +2003-03-07 Monte Ohrt + + * libs/plugins/function.html_image.php: + change E_USER_ERROR to E_USER_NOTICE + + * libs/plugins/function.html_image.php: + suppress warning in html_image + + * NEWS + libs/plugins/function.html_image.php: + update changes to html_image + +2003-03-06 Monte Ohrt + + * docs/designers.sgml + docs/de/appendixes.sgml + docs/de/common.dsl + docs/de/designers.sgml + docs/de/getting-started.sgml + docs/de/html-common.dsl + docs/de/html.dsl + docs/de/manual.sgml + docs/de/preface.sgml + docs/de/programmers.sgml: + add german docs to dist + + * NEWS: + update news file + + * libs/plugins/function.html_image.php: + fix width/height parameter index + + * NEWS + libs/Smarty.class.php: + get rid of unsetting name and script attributes to insert tags + +2003-03-05 Monte Ohrt + + * NEWS + RELEASE_NOTES: + update NEWS file + + * libs/plugins/modifier.string_format.php: + fix argument order, erroneously swapped a while back + + * (Smarty_2_5_0_RC1) + NEWS + README + RELEASE_NOTES + libs/Config_File.class.php + libs/Smarty.class.php + libs/Smarty_Compiler.class.php: + commit final changes for 2.5.0-RC1 + +2003-03-04 Monte Ohrt + + * docs/programmers.sgml: + remove $show_info_header and $show_info_include property vars from docs + +2003-03-03 Monte Ohrt + + * NEWS + libs/plugins/function.popup.php: + fixed PHP notice + +2003-02-28 Monte Ohrt + + * libs/Smarty_Compiler.class.php: + simplify smarty.const.foo and smarty.const.$foo logic + + * libs/Smarty_Compiler.class.php: + only allow $foo syntax in embedded quotes, unless escaped with backticks + then allow any dollar var + + * NEWS + libs/Smarty_Compiler.class.php: + fix "once" var compiling to work with new attr compiling methods for + include_php + + * FAQ + NEWS + README + docs/designers.sgml + docs/getting-started.sgml + libs/Smarty_Compiler.class.php + libs/plugins/function.html_checkboxes.php + libs/plugins/function.html_image.php + libs/plugins/function.html_options.php + libs/plugins/function.html_radios.php + libs/plugins/function.html_select_date.php + libs/plugins/function.html_select_time.php + libs/plugins/function.html_table.php: + fix $smarty.const.foo compiling, clean up double quoted strings, + allow full dollar var syntax in quotes again + +2003-02-27 Monte Ohrt + + * docs/designers.sgml + docs/programmers.sgml + libs/Smarty_Compiler.class.php: + update docs, fix smarty var compiling, allow any $smarty.*.$foo syntax, + add $`foobar` for embedded variables + + * libs/plugins/function.html_image.php: + update functionality + +2003-02-26 Monte Ohrt + + * NEWS + libs/plugins/modifier.nl2br.php: + add nl2br modifier + + * libs/plugins/function.html_image.php: + add link parameter + +2003-02-24 Monte Ohrt + + * libs/Smarty.class.php + libs/plugins/function.html_image.php: + fix rename problem in windows, unlink first + + * libs/plugins/function.html_checkboxes.php + libs/plugins/function.html_image.php + libs/plugins/function.html_options.php + libs/plugins/function.html_radios.php + libs/plugins/shared.escape_special_chars.php: + update functions with separate escape_special_chars routine + + * NEWS + libs/plugins/function.html_checkboxes.php + libs/plugins/function.html_radios.php: + commit checkboxes, update radios + + * NEWS + libs/Smarty.class.php + libs/plugins/function.html_image.php: + fix bug with get_registered_object + + * NEWS + libs/plugins/modifier.cat.php: + added cat modifier to distribution + + * NEWS + libs/Smarty_Compiler.class.php: + added << >> <> support to IF statements + + * libs/plugins/function.html_radios.php: + apply patch to initial html_radios function + + * NEWS + libs/Smarty.class.php: + fix _assign_smarty_interface to not overwrite keys other than 'request' + + * NEWS + libs/plugins/function.html_radios.php: + added html_radios to distribution + + * NEWS + libs/plugins/modifier.string_format.php: + fixed arg order of string_format + + * NEWS + libs/Smarty.class.php: + use tmp file for file writes, avoid race condition + + * NEWS + libs/Smarty_Compiler.class.php: + add $smarty.config.foo var, handle embedded smarty var correctly + + * NEWS + libs/plugins/function.fetch.php: + silence warnings in fetch plugin + +2003-02-21 Monte Ohrt + + * INSTALL: + update wording + + * INSTALL: + update install instructions + + * AUTHORS + BUGS + CREDITS + QUICKSTART + README + RESOURCES + TESTIMONIALS: + remove some files already in docs or elsewhere + + * demo/index.php: + add templates_c to repository + + * index.php: + move demo files to demo directory + + * Config_File.class.php + Smarty.class.php + Smarty_Compiler.class.php + debug.tpl: + moved lib files under libs directory + +2003-02-20 Monte Ohrt + + * NEWS + Smarty.class.php: + add get_config_vars() method, update get_template_vars() functionality + + * NEWS + Smarty.class.php: + fix minor logic in _fetch_template_info() + + * NEWS + Smarty.class.php: + support merging appended vars + + * NEWS + Smarty.class.php: + fix cache groups behavior with compile_id set + +2003-02-19 Monte Ohrt + + * Smarty.class.php: + back out third parameter, extend functionality of append + + * NEWS + Smarty_Compiler.class.php: + update imbedded vars, allow special $smarty vars + + * plugins/function.html_table.php: + add plugin html_table + + * NEWS + Smarty.class.php: + support appending key=>val pairs + + * NEWS + Smarty_Compiler.class.php: + change embedded variable logic to only recognize $foo and $foo[0][bar] + syntax + + * NEWS + Smarty_Compiler.class.php: + allow null as function attribute value + +2003-02-18 Monte Ohrt + + * NEWS + Smarty.class.php + Smarty_Compiler.class.php: + support foo->bar[index] syntax + + * Smarty_Compiler.class.php: + allow $foo->bar[0] syntax + +2003-02-17 Monte Ohrt + + * plugins/modifier.escape.php: + fix syntax error from previous commit + + * NEWS + Smarty.class.php: + add error msgs to get_registered_object + + * Smarty.class.php: + add function for getting reference to registered object + + * Smarty_Compiler.class.php: + back out patches for object and objref calls on $smarty var + + * NEWS + Smarty_Compiler.class.php: + treat unrecognized param attribute syntax as a string + + * NEWS + Smarty_Compiler.class.php: + support $smarty.const.$foo syntax + + * NEWS + debug.tpl + plugins/modifier.count_words.php + plugins/modifier.escape.php: + fix E_NOTICE messages + + * NEWS + Smarty.class.php + Smarty_Compiler.class.php: + add @ and === to if tokens, few param cleanups + +2003-02-16 Greg Beaver + + * ChangeLog + Smarty.class.php + Smarty_Compiler.class.php: + many more phpdoc comment upgrades + +2003-02-15 Greg Beaver + * Smarty.class.php + Smarty_Compiler.class.php + continue cleaning of phpdoc comments. All that is needed is the + addition of @return tags and perhaps a bit more verbose comments + and they are finished. + +2003-02-14 Monte Ohrt + + * NEWS + Smarty.class.php: + enable config_load error messages + + * NEWS + plugins/function.html_options.php: + fix html_options to not escape already escaped entities + + * NEWS + Smarty.class.php: + send Last-Modified header on cache creation, misc tab/spacing cleanup + +2003-02-13 Monte Ohrt + + * Smarty_Compiler.class.php + docs/designers.sgml: + allow dash in plain text + + * NEWS + Smarty_Compiler.class.php: + check strict syntax of function attributes + +2003-02-12 Monte Ohrt + + * NEWS + Smarty_Compiler.class.php: + dropped support for modifiers on object parameters, + added support for objects as modifier parameters + + * NEWS + Smarty_Compiler.class.php + docs/designers.sgml: + fix bug with decimal numbers in if statements, misc doc updates + +2003-02-11 Monte Ohrt + + * (Smarty_2_4_2) + Config_File.class.php + NEWS + README + RELEASE_NOTES + Smarty.class.php + Smarty_Compiler.class.php: + update version numbers + +2003-02-10 Monte Ohrt + + * NEWS + Smarty_Compiler.class.php: + add support for $foo->$bar syntax + + * NEWS: + update NEWS file + + * NEWS + Smarty_Compiler.class.php: + support full var syntax in quoted text, fix problem with const var access, + clean up some more regex code, fix object problem with no properties + +2003-02-06 Monte Ohrt + + * (Smarty_2_4_1) + Config_File.class.php + NEWS + README + RELEASE_NOTES + Smarty.class.php + Smarty_Compiler.class.php: + committed 2.4.1 changes + + * NEWS + Smarty_Compiler.class.php: + ignore case in IF statements + +2003-02-05 Monte Ohrt + + * NEWS + Smarty_Compiler.class.php: + treat undefined constants as null + + * NEWS + Smarty.class.php: + fix problem with inserts and nested fetches + + * Smarty_Compiler.class.php: + fix "if" regex for math tokens + + * NEWS + Smarty.class.php + Smarty_Compiler.class.php + docs/getting-started.sgml: + added support for extracting params to include_php + +2003-02-04 Monte Ohrt + + * RELEASE_NOTES: + reformat text + +2003-02-03 Monte Ohrt + + * NEWS: + update news file + +2003-02-03 Greg Beaver + + * ChangeLog + Smarty.class.php: + begin fixing phpdoc comments in Smarty.class.php + + * ChangeLog + Config_File.class.php: + fixed phpdoc comments + +2003-02-03 Monte Ohrt + + * Smarty_Compiler.class.php: + allow $foo->bar[$x].foo syntax + + * Smarty_Compiler.class.php + index.php + configs/test.conf + templates/index.tpl: + fix accidental commit + + * index.php + configs/test.conf + templates/index.tpl: + allow $foo->bar[$j].blah type of syntax + +2003-02-02 Greg Beaver + + * Smarty.class.php + begin fixing of phpdoc comments + + * Config_File.class.php + fix phpdoc comments, add phpDocumentor docblock templates + +2003-02-02 Monte Ohrt + + * Smarty.class.php + docs/html.dsl + docs/php.dsl: + fix version number + + * (Smarty_2_4_0) + Config_File.class.php + NEWS + README + RELEASE_NOTES + Smarty.class.php + Smarty_Compiler.class.php + docs/appendixes.sgml + docs/designers.sgml + docs/programmers.sgml: + update Smarty version numbers + +2003-01-30 Monte Ohrt + + * NEWS + Smarty_Compiler.class.php + TODO: + fix order of php tag comparisons + + * NEWS + Smarty_Compiler.class.php: + fix known php tag handling problems + +2003-01-29 Monte Ohrt + + * Smarty.class.php + Smarty_Compiler.class.php: + change comments to phpdoc style + +2003-01-28 Monte Ohrt + + * Smarty.class.php + docs/programmers.sgml: + make separate var for compiler file + + * plugins/function.fetch.php: + fix error call + +2003-01-25 Monte Ohrt + + * Smarty.class.php + Smarty_Compiler.class.php: + add support for restriction to registered methods + + * plugins/outputfilter.trimwhitespace.php: + update with textarea support + +2003-01-24 Monte Ohrt + + * Smarty_Compiler.class.php: + fix compiling problem with {foreach} tags + + * Smarty.class.php + Smarty_Compiler.class.php: + put objects in own array, add object param format support, change + object syntax from foo.bar to foo->bar + +2003-01-23 Monte Ohrt + + * NEWS + Smarty.class.php + Smarty_Compiler.class.php: + add support for object registration + +2003-01-22 Monte Ohrt + + * Smarty.class.php: + add file & line number of calling error to error message + +2003-01-21 Monte Ohrt + + * Smarty_Compiler.class.php: + put php style object syntax back in + +2003-01-20 Monte Ohrt + + * Smarty.class.php: + move security settings to fetch function for template_dir + + * NEWS + Smarty.class.php: + fix debug template and security, add template_dir to secure_dir at runtime + +2003-01-17 Monte Ohrt + + * NEWS + Smarty.class.php + Smarty_Compiler.class.php: + added new object support without new template syntax + +2003-01-15 Monte Ohrt + + * NEWS + Smarty.class.php + Smarty_Compiler.class.php: + fix if statement syntax for negative integers, fix issue with directories + named '0' + +2003-01-08 Monte Ohrt + + * Smarty.class.php + plugins/function.counter.php + plugins/function.cycle.php + plugins/function.debug.php + plugins/function.eval.php + plugins/function.fetch.php + plugins/function.html_options.php + plugins/function.html_select_date.php + plugins/function.html_select_time.php + plugins/function.mailto.php + plugins/function.math.php + plugins/function.popup.php + plugins/function.popup_init.php: + update plugins to return values instead of echo, fix config file cache + to include global config variables in cache file + + * Smarty_Compiler.class.php: + fix bug with >= tests in if statements, comment out full object support + +2003-01-06 Monte Ohrt + + * NEWS + docs/html.dsl + plugins/modifier.escape.php: + add javascript escape parameter to escape modifier + +2003-01-02 Monte Ohrt + + * templates/header.tpl: + move the title into head where it should be + +2002-12-24 Monte Ohrt + + * Smarty_Compiler.class.php: + added correct line numbers to smarty syntax error messages + + * docs/programmers.sgml: + update append documentation, make more clear on its function + + * Smarty_Compiler.class.php: + fix modifier matching regexp + +2002-12-23 Monte Ohrt + + * Smarty_Compiler.class.php: + support nested function calls in IF statements + +2002-12-20 Monte Ohrt + + * Smarty_Compiler.class.php: + few more fixes, spaces around function parameters + + * Smarty_Compiler.class.php: + fix misc syntax issues with {if} tags + +2002-12-20 Monte Ohrt + + * Smarty_Compiler.class.php: + fix misc syntax issues with {if} tags + +2002-12-19 Monte Ohrt + + * Smarty_Compiler.class.php: + commit updates, passes all smoke tests + + * NEWS: + update NEWS file + + * Smarty_Compiler.class.php: + fixed literal string not in quotes as parameters + + * NEWS + Smarty_Compiler.class.php: + fix misc syntax issues, add ability to pass modifiers to functions + +2002-12-18 Monte Ohrt + + * NEWS: + update NEWS + + * NEWS + Smarty.class.php + Smarty_Compiler.class.php: + update compiler code, clean up regex, add new syntax features + +2002-12-16 Monte Ohrt + + * NEWS: + update NEWS file + + * Smarty_Compiler.class.php: + commit updates for objects + +2002-12-14 Monte Ohrt + + * Smarty.class.php + Smarty_Compiler.class.php: + fix bug with compiling config files with caching on + +2002-12-13 Monte Ohrt + + * Smarty_Compiler.class.php: + fix problem with matching single quoted strings + + * Smarty_Compiler.class.php: + update embedded variable logic, get rid of ."" at end of output + + * NEWS + docs/designers.sgml + plugins/function.html_select_date.php: + add day_value_format to html_select_date + +2002-12-12 Monte Ohrt + + * plugins/modifier.debug_print_var.php: + fix bug, double escaped values in display + + * Smarty.class.php: + move debug test back into fetch() + + * NEWS + Smarty.class.php + Smarty_Compiler.class.php + plugins/outputfilter.trimwhitespace.php: + assigned vars are no longer in global name space, few debug cleanups + +2002-12-11 Monte Ohrt + + * plugins/function.popup.php: + fix error in newline code + + * plugins/function.popup.php: + fix popup to allow newlines in text data + +2002-12-10 Monte Ohrt + + * Smarty.class.php: + fix plugin error logic + + * docs/designers.sgml + docs/programmers.sgml: + edit examples, make more verbose + + * NEWS + plugins/function.html_options.php: + escape html entities in the option values and output + + * NEWS + plugins/function.html_options.php: + fixed bug with label of html_options + +2002-12-09 Monte Ohrt + + * Smarty.class.php: + add support for var_export() + + * Config_File.class.php + Smarty.class.php: + clean up code, respect force_compile and compile_check flags + + * NEWS + Smarty.class.php + Smarty_Compiler.class.php + docs/designers.sgml + plugins/function.mailto.php: + add caching feature to config loading, document update, add mailto plugin + +2002-12-08 Monte Ohrt + + * plugins/function.fetch.php: + fix query part of URL + +2002-12-05 Monte Ohrt + + * docs/designers.sgml: + fix typos + +2002-11-22 Monte Ohrt + + * Smarty_Compiler.class.php: + patch for warning message + +2002-11-21 Monte Ohrt + + * RELEASE_NOTES + Smarty.class.php: + get rid of testing for a set value with assign function, just set to + whatever is passed into the template + + * docs/programmers.sgml: + fix typo + +2002-11-19 Monte Ohrt + + * Config_File.class.php + NEWS + README + RELEASE_NOTES + Smarty.class.php + Smarty_Compiler.class.php: + commit changes, ready for 2.3.1 release + +2002-11-01 Monte Ohrt + + * plugins/function.html_options.php: + added label attribute to all option outputs, cover w3c spec. + + * NEWS: update NEWS file + + * docs/designers.sgml: update docs for optgroup output + + * plugins/function.html_options.php: + make html_options work with optgroup, make func modular and recursive. + +2002-10-29 Monte Ohrt + + * NEWS + Smarty.class.php: set mtime on compile files so they match source files + +2002-10-18 Monte Ohrt + + * NEWS + Smarty.class.php: added proper support for open_basedir setting + + * docs/designers.sgml: clear up docs on index, iteration and rownum + +2002-10-16 Monte Ohrt + + * plugins/modifier.default.php: fix warning message in default modifier + +2002-09-25 Monte Ohrt + + * docs/designers.sgml + plugins/modifier.strip.php + NEWS: added strip variable modifier + +2002-09-24 Andrei Zmievski + + * NEWS: *** empty log message *** + + * Smarty_Compiler.class.php: + Fix to be able to use $smarty.x variables as arrays. + +2002-09-23 Monte Ohrt + + * Config_File.class.php: + add support for mac/dos formatted config files (fix newlines) + + * docs/programmers.sgml: add optional tags to clear_cache parameters + + * docs/designers.sgml: + fix error with include_php description, add $this to description + +2002-09-20 Monte Ohrt + + * NEWS + docs/getting-started.sgml: fixed errors with example setup docs + +2002-09-16 Monte Ohrt + + * plugins/block.textformat.php + docs/designers.sgml + NEWS: add textformat block function + +2002-09-10 Monte Ohrt + + * docs/designers.sgml: + add assign attribute to cycle function documentation + + * docs/designers.sgml + docs/programmers.sgml: fix typos + +2002-09-09 Monte Ohrt + + * plugins/function.debug.php + templates/header.tpl: + fix header in debug template, fix typo in header.tpl example + +2002-08-15 mohrt + + * docs/programmers.sgml: fix typos + +2002-08-08 mohrt + + * RELEASE_NOTES + Smarty.class.php: + supress warnings from unlink() and is_dir(), let error handler deal with it + +2002-08-07 mohrt + + * docs/appendixes.sgml + docs/designers.sgml + docs/programmers.sgml + Config_File.class.php + NEWS + README + RELEASE_NOTES + Smarty.class.php + Smarty_Compiler.class.php: update files with new version numbers + +2002-08-02 mohrt + + * NEWS: update NEWS file with credits + + * NEWS + Smarty.class.php: added assign_by_ref() and append_by_ref() functions + +2002-08-01 mohrt + + * TODO + NEWS + Smarty.class.php: + changed default warning type for plugin errors from E_USER_WARNING to E_USER_ERROR + +2002-07-29 mohrt + + * plugins/function.html_select_time.php + docs/designers.sgml + NEWS: added paramters to html_select_time plugin + +2002-07-25 Andrei Zmievski + + * TODO: *** empty log message *** + +2002-07-24 mohrt + + * QUICKSTART: update QUICKSTART guide + + * NEWS + debug.tpl + plugins/modifier.debug_print_var.php: + update debug console to show objects, fix warning in debug.tpl + +2002-07-23 mohrt + + * docs/programmers.sgml: fix load_filter examples + + * Config_File.class.php + NEWS: fix error when there are no sections in config file + +2002-07-19 mohrt + + * docs/getting-started.sgml: fix error in install guide + +2002-07-18 mohrt + + * Smarty_Compiler.class.php: + correct the expression match for smarty:nodefaults + +2002-07-17 mohrt + + * Smarty_Compiler.class.php: fix default modifier to work with config vars + + * Smarty_Compiler.class.php: got args to strstr backwards... + + * NEWS + Smarty.class.php + Smarty_Compiler.class.php: + change default modifiers to array instead of string + + * Smarty_Compiler.class.php + docs/designers.sgml + Smarty.class.php: add default modifier logic, minor doc updates + + * NEWS + Smarty.class.php + plugins/function.popup_init.php: + make popup_init xhtml compliant, minor variable name changes for consistancy + +2002-07-16 mohrt + + * NEWS: update NEWS file + + * plugins/function.debug.php + Smarty.class.php + debug.tpl + NEWS: + fix problem with filenames on windows, add ability to supply expire time in seconds when clearing cache or compiled files + +2002-07-15 mohrt + + * Smarty.class.php: + fixed problem with insert tags when loading function from script attribute + and caching enabled (Monte) + +2002-07-14 mohrt + + * NEWS + Smarty.class.php: fix bug with debug_tpl file path for Windows + +2002-07-12 Monte Ohrt + + * Smarty.class.php: fix append function with array/string issue + +2002-07-11 Monte Ohrt + + * RELEASE_NOTES: update release notes + + * NEWS + README + RELEASE_NOTES + Smarty.class.php + Smarty_Compiler.class.php + Config_File.class.php: update files to 2.2.0 tags, get ready for release + +2002-07-09 Monte Ohrt + + * NEWS + Smarty.class.php: make debug.tpl work with any delimiter + + * NEWS + Smarty.class.php: + change tests in append and assign to != '' instead of empty(), which is more accurate + +2002-07-08 Monte Ohrt + + * docs/designers.sgml: minor doc update + + * Smarty.class.php: + cast var as an array, simplify and get rid of PHP warning messages + +2002-07-03 Monte Ohrt + + * Smarty.class.php: one more N + + * Smarty.class.php: + prepend "N" to filenames to avoid possible OS issues with dir names starting with "-" + + * Smarty.class.php: only set $debug_tpl in constructor if empty + + * Smarty.class.php + docs/designers.sgml + docs/getting-started.sgml + docs/programmers.sgml: + make use_sub_dirs go back to crc32 for subdir separation + +2002-06-29 Monte Ohrt + + * plugins/function.eval.php: do nothing if $val is empty + + * TODO + plugins/function.eval.php + plugins/function.popup_init.php: + add zindex to popup init, fix error message for eval. + +2002-06-27 Monte Ohrt + + * Smarty.class.php: + only loop through relative paths for PHP include_path, remove $_relative variable + + * Smarty_Compiler.class.php: added {$smarty.version} variable + +2002-06-26 Monte Ohrt + + * docs/appendixes.sgml + docs/designers.sgml + docs/getting-started.sgml + docs/programmers.sgml + Smarty.class.php: + update plugin loading logic, look in SMARTY_DIR, then cwd. If all fail, then retry all with include_path + + * templates/header.tpl + Smarty.class.php: update get_include_path, get _path_array only once + + * Smarty.class.php: fix get_include_path function for windows + + * Smarty.class.php: update plugin search logic + + * Smarty.class.php: only search include_path if relative path + + * plugins/function.html_select_date.php + plugins/function.html_select_time.php + plugins/modifier.date_format.php + Smarty_Compiler.class.php + NEWS + Smarty.class.php: allow plugins_dir to be an array of directories + +2002-06-25 Monte Ohrt + + * docs/programmers.sgml + docs/getting-started.sgml: update installation docs + + * debug.tpl + docs/getting-started.sgml + templates/debug.tpl + NEWS + Smarty.class.php: move debug.tpl to SMARTY_DIR, add to constructor + +2002-06-24 Monte Ohrt + + * plugins/function.assign_debug_info.php + NEWS: fixed warning message in function.assign_debug_info + + * Smarty.class.php: update include_path fixes + + * NEWS: + fixed $template_dir, $compile_dir, $cache_dir, $config_dir to respect include_path + +2002-06-23 Monte Ohrt + + * plugins/shared.make_timestamp.php: + update timestamp plugin to work when passed a timestamp + +2002-06-19 Monte Ohrt + + * NEWS: update NEWS file + + * plugins/modifier.date_format.php + docs/designers.sgml: + update date_format, allow optional 2nd paramater as default date if passed date is empty. update docs. + + * plugins/modifier.date_format.php: + fix date_format modifier, return nothing if given empty string + +2002-06-18 Monte Ohrt + + * NEWS + plugins/function.cycle.php: + gave $reset a default value in cycle function + + * plugins/function.html_select_date.php + plugins/shared.make_timestamp.php + NEWS: + corrected warnings in html_select_time function, made make timestamp always return a timestamp + +2002-06-17 Monte Ohrt + + * Smarty.class.php: swapped around cache_id and compile_id order + +2002-06-14 Monte Ohrt + + * docs/programmers.sgml + plugins/function.popup_init.php + Smarty.class.php: + change directory delimiter to "^" for cache and compile files + +2002-06-13 Andrei Zmievski + + * TODO: done. + + * Smarty_Compiler.class.php: + Optimize the calculation of section 'total' property. + +2002-06-11 Monte Ohrt + + * NEWS + Smarty.class.php: + added support for subdir exclusion, deletion by full or partial cache_id and compile_id, change file format to urlencoded values instead of crc32 + +2002-06-07 Monte Ohrt + + * Smarty.class.php: fix bug with last_modified_check code + + * NEWS + Smarty.class.php: + updated $GLOBALS refererence for HTTP_IF_MODIFIED_SINCE + +2002-06-06 Monte Ohrt + + * docs/designers.sgml + overlib.js: + remove overlib.js file from distribution, update plugin and docs + +2002-06-05 Monte Ohrt + + * docs/designers.sgml + NEWS + Smarty.class.php: fix 304 Not Modified, don't send content + +2002-06-03 Monte Ohrt + + * plugins/function.cycle.php: update version number + + * plugins/function.cycle.php + NEWS: + fixed cycle function to respect delimiter setting after initial setting + + * Smarty.class.php + NEWS: + update $GLOBALS references to work properly with track_globals settings + + * plugins/function.math.php: fixed bug with call $assign + + * docs/appendixes.sgml + docs/designers.sgml + plugins/function.html_options.php + plugins/function.html_select_time.php + NEWS + Smarty.class.php + Smarty_Compiler.class.php: + optimized for loops with count() function calls + +2002-06-01 Andrei Zmievski + + * TODO: *** empty log message *** + +2002-05-21 Monte Ohrt + + * NEWS: update NEWS file + + * plugins/function.html_select_date.php + RESOURCES + docs/designers.sgml + Config_File.class.php: + update html_select_date with month_value_format attribute for controlling the format of the month values. + +2002-05-17 Andrei Zmievski + + * NEWS + Smarty_Compiler.class.php: + Made it possible to use simple variables inside [] for indexing. + +2002-05-16 Monte Ohrt + + * docs/designers.sgml + docs/getting-started.sgml + NEWS + Smarty.class.php + Smarty_Compiler.class.php + TESTIMONIALS: add "once" attribute to php_include, update docs + +2002-05-09 Andrei Zmievski + + * NEWS + TODO: *** empty log message *** + +2002-05-07 Monte Ohrt + + * plugins/function.cycle.php: remove \n from cycle function + + * docs/designers.sgml + plugins/function.cycle.php + README + RELEASE_NOTES + Smarty.class.php + Smarty_Compiler.class.php + NEWS: + update cycle function to handle array as input, update files to 2.1.1 + +2002-05-06 Monte Ohrt + + * plugins/function.fetch.php: + update fetch function with more error checking + +2002-05-03 Monte Ohrt + + * docs/designers.sgml + plugins/function.counter.php: + update counter to use name instead of id (id still works though) + + * plugins/function.cycle.php + docs/designers.sgml: rename id to name for cycle function + + * plugins/function.cycle.php: + update cycle function to allow blank values parameter after initialized + + * plugins/function.cycle.php: fix syntax error + +2002-05-02 Monte Ohrt + + * plugins/function.cycle.php: ugh, another typo + + * plugins/function.cycle.php: update comments + + * docs/designers.sgml + plugins/function.cycle.php + NEWS: added function cycle + + * FAQ + Smarty.class.php: fix register_outputfilter function + +2002-05-01 Monte Ohrt + + * docs/designers.sgml + NEWS + Smarty.class.php: fixed bug with resource testing and include_path + +2002-04-30 Monte Ohrt + + * NEWS + README + RELEASE_NOTES + Smarty.class.php + Smarty_Compiler.class.php: update files for 2.1.0 release + +2002-04-30 Andrei Zmievski + + * plugins/function.fetch.php + docs/programmers.sgml + Smarty.class.php: Fix. + +2002-04-29 Andrei Zmievski + + * docs/programmers.sgml + docs/designers.sgml: A whole bunch of docs. + +2002-04-26 Monte Ohrt + + * FAQ + QUICKSTART + docs/programmers.sgml: update FAQ, QUICKSTART, small doc syntax fix + +2002-04-24 Monte Ohrt + + * docs/programmers.sgml + templates/debug.tpl + Smarty.class.php: changed doc structure a bit + +2002-04-16 Andrei Zmievski + + * Smarty.class.php: Add register/unregister API for output filters. + + * NEWS + Smarty.class.php + Smarty_Compiler.class.php + TODO: + Changed the way filters are loaded, which now has to be done explicitly, + either through load_filter() API or by filling in $autoload_filters variable. + Also renamed internal variable to avoid namespace pollution. + +2002-04-15 Andrei Zmievski + + * Smarty.class.php: + Fixed _get_php_resource() to take include_path into account. + +2002-04-15 Monte Ohrt + + * docs/designers.sgml: + update docs, get modifiers and functions into index for easy access + + * docs/programmers.sgml + NEWS + Smarty.class.php: update caching documentation + +2002-04-15 Andrei Zmievski + + * NEWS: *** empty log message *** + + * Smarty.class.php: Only turn down error notices if $debugging is false. + +2002-04-15 Monte Ohrt + + * NEWS: update NEWS file + + * plugins/function.html_select_date.php: + fixed logic so this works right when field_separator = "/" + + * plugins/function.html_select_date.php: + fix regular expression for matching date + +2002-04-13 Monte Ohrt + + * docs/designers.sgml: updated html_select_date docs to reflect changes + + * NEWS + plugins/function.html_select_date.php: + added YYYY-MM-DD support to html_select_date + +2002-04-12 Andrei Zmievski + + * TESTIMONIALS: New entry. + +2002-04-12 Monte Ohrt + + * plugins/modifier.strip_tags.php: back out changes to strip_tags + + * docs/programmers.sgml: update docs regarding cache_lifetime + + * plugins/modifier.strip_tags.php + Smarty.class.php: + update cache_lifetime logic: -1 = never expire, 0 = always expire + +2002-04-11 Andrei Zmievski + + * BUGS + FAQ + INSTALL + NEWS + Smarty.class.php + Smarty_Compiler.class.php + docs/getting-started.sgml: + Fixed directory separtor issue. Requiring PHP 4.0.6 now. + + * NEWS + Smarty_Compiler.class.php: + Added ability to use simple variables for array indices or object properties. + + * TESTIMONIALS: Another one. + + * TESTIMONIALS: Adding one from Mark P. + +2002-04-05 Andrei Zmievski + + * Smarty_Compiler.class.php + NEWS + Smarty.class.php: Make it possible to unregister pre/postfilter plugins. + +2002-04-05 Monte Ohrt + + * INSTALL: Remove addons file from INSTALL instructions + +2002-04-04 Monte Ohrt + + * docs/designers.sgml: update doc error + + * docs/designers.sgml + plugins/modifier.escape.php + NEWS + Smarty.class.php: added htmlall attribute to escape modifier + +2002-04-03 Andrei Zmievski + + * Smarty_Compiler.class.php: Fixed undefined offset warning in {if} tag. + + * Smarty.class.php + NEWS: Added template_exists() API. + + * Smarty.class.php + Smarty_Compiler.class.php + NEWS: + - Added $smarty.template variable. + - Fixed {include_php} tag when dynamic values were used for 'file' attribute. + + * Config_File.class.php: Separator setting fix. + +2002-03-28 Monte Ohrt + + * FAQ + README: add digest address + + * FAQ + README + Smarty.class.php: update mailing list addresses + +2002-03-28 Andrei Zmievski + + * NEWS: *** empty log message *** + + * plugins/function.html_select_date.php + plugins/function.html_select_time.php + plugins/modifier.date_format.php: + Fix for when plugins directory is not the default one. + +2002-03-28 Andrei Zmievski + + * NEWS: *** empty log message *** + + * plugins/function.html_select_date.php + plugins/function.html_select_time.php + plugins/modifier.date_format.php: + Fix for when plugins directory is not the default one. + +2002-03-27 Monte Ohrt + + * FAQ: update FAQ page + +2002-03-26 Andrei Zmievski + + * CREDITS + NEWS + Smarty.class.php + Smarty_Compiler.class.php + TODO: Block functions changes. + + * Config_File.class.php: *** empty log message *** + +2002-03-25 Andrei Zmievski + + * Smarty.class.php + Smarty_Compiler.class.php: Initial implementation of block functions. + +2002-03-22 Monte Ohrt + + * docs/designers.sgml: fix documentation error in capture + +2002-03-22 Andrei Zmievski + + * Smarty.class.php: *** empty log message *** + + * Smarty.class.php: Turn off notices. + +2002-03-21 Andrei Zmievski + + * Smarty_Compiler.class.php: Make _current_file available to prefilters. + + * NEWS + Smarty.class.php: + Made is possible to assign variables in pre/postfilters. + +2002-03-20 Andrei Zmievski + + * plugins/function.html_select_date.php: Fixed +/- functionality. + + * NEWS: *** empty log message *** + +2002-03-20 Monte Ohrt + + * Config_File.class.php + NEWS + README + RELEASE_NOTES + Smarty.class.php + Smarty_Compiler.class.php: update version numbers + + * plugins/function.html_select_date.php + plugins/function.html_select_time.php + plugins/modifier.date_format.php: + move .make_timestamp.php to shared.make_timestamp.php + + * NEWS + Smarty.class.php + docs/designers.sgml + plugins/function.fetch.php + plugins/function.html_select_date.php: + update file generation, replace crc32() '-' with 'N' + +2002-03-20 Andrei Zmievski + + * Smarty_Compiler.class.php: *** empty log message *** + +2002-03-19 Andrei Zmievski + + * NEWS: *** empty log message *** + + * Smarty.class.php + Smarty_Compiler.class.php: + Fix plugin behavior for inserts with script attribute. + + * NEWS: *** empty log message *** + + * Smarty_Compiler.class.php: Fix bug with $smarty.cookies. + + * TESTIMONIALS: *** empty log message *** + +2002-03-15 Monte Ohrt + + * NEWS + docs/designers.sgml: update Changelog + + * plugins/modifier.indent.php + plugins/modifier.wordwrap.php: add wordwrap and indent to repository + +2002-03-14 Monte Ohrt + + * Smarty.class.php: + remove show_info_include and show_info_header functions + +2002-03-13 Monte Ohrt + + * plugins/function.fetch.php: update fetch function + + * plugins/function.fetch.php: update fetch function with new parameters + +2002-03-12 Monte Ohrt + + * docs/designers.sgml: update doc tables + + * docs/designers.sgml: update docs columns + + * docs/getting-started.sgml + docs/appendixes.sgml: update docs + + * TESTIMONIALS + docs/appendixes.sgml: update syntax error in docs, add to testimonials + +2002-03-04 Monte Ohrt + + * FAQ + README: update FAQ, README with digest mode info + +2002-03-02 Monte Ohrt + + * QUICKSTART: update quickstart + + * Smarty.class.php: + change behavior so cache_lifetime = 0 never expires (instead of always regenerate) + +2002-03-01 Monte Ohrt + + * docs/designers.sgml: update doc example + +2002-03-01 Andrei Zmievski + + * CREDITS + RELEASE_NOTES + TODO + NEWS: *** empty log message *** + +2002-03-01 Monte Ohrt + + * docs/appendixes.sgml + docs/designers.sgml + docs/getting-started.sgml + docs/programmers.sgml: update document id tags + + * docs.sgml: remove docs.sgml + + * RESOURCES + Smarty.class.php: update resources + +2002-02-28 Andrei Zmievski + + * TESTIMONIALS + docs/appendixes.sgml + docs/designers.sgml + docs/programmers.sgml: *** empty log message *** + +2002-02-27 Andrei Zmievski + + * plugins/function.eval.php + docs/designers.sgml: *** empty log message *** + +2002-02-27 Monte Ohrt + + * plugins/function.eval.php: added eval function to plugin dir + +2002-02-27 Andrei Zmievski + + * NEWS: *** empty log message *** + +2002-02-27 Monte Ohrt + + * docs/designers.sgml: fix syntax error + + * docs/appendixes.sgml + docs/designers.sgml + docs/getting-started.sgml + docs/programmers.sgml: convert technical notes to docbook format + + * NEWS + docs/designers.sgml: added "eval" plugin docs + +2002-02-26 Andrei Zmievski + + * docs/programmers.sgml + docs/designers.sgml + docs/appendixes.sgml + docs/getting-started.sgml + docs/html-common.dsl + docs/.cvsignore: *** empty log message *** + + * docs/appendixes.sgml + docs/common.dsl + docs/designers.sgml + docs/getting-started.sgml + docs/html-common.dsl + docs/html.dsl + docs/manual.sgml + docs/preface.sgml + docs/programmers.sgml: Split up docs. + +2002-02-25 Andrei Zmievski + + * docs.sgml: *** empty log message *** + +2002-02-22 Monte Ohrt + + * docs.sgml: update docs + +2002-02-22 Andrei Zmievski + + * docs.sgml + AUTHORS + NEWS: *** empty log message *** + +2002-02-21 Monte Ohrt + + * Config_File.class.php + NEWS + Smarty.class.php + Smarty_Compiler.class.php + docs.sgml: update misc changes + +2002-02-21 Andrei Zmievski + + * docs.sgml: *** empty log message *** + +2002-02-20 Monte Ohrt + + * docs.sgml: misc updates + +2002-02-20 Andrei Zmievski + + * docs.sgml: *** empty log message *** + + * Smarty.class.php + plugins/function.assign.php + plugins/function.assign_debug_info.php + plugins/function.counter.php + plugins/function.fetch.php + plugins/function.math.php + plugins/function.popup.php + plugins/function.popup_init.php + plugins/modifier.escape.php: Fixup some naming. + +2002-02-20 Monte Ohrt + + * docs.sgml: update docs + +2002-02-20 Andrei Zmievski + + * docs.sgml: *** empty log message *** + +2002-02-20 Monte Ohrt + + * NEWS + docs.sgml + plugins/modifier.escape.php: + removed global vars from fetch function, added attrs to escape modifier + + * docs.sgml: add plugin chapter outline + +2002-02-19 Monte Ohrt + + * README + RELEASE_NOTES + RESOURCES + Smarty.class.php + docs.sgml + BUGS + FAQ + INSTALL + QUICKSTART: update docs + +2002-02-19 Andrei Zmievski + + * docs.sgml: Updated resources docs. + + * README: *** empty log message *** + + * docs.sgml: Updated description of {$smarty} variable. + + * BUGS + FAQ + INSTALL + QUICKSTART + RELEASE_NOTES + docs.sgml: Remove PEAR notes. + +2002-02-18 Andrei Zmievski + + * Config_File.class.php + NEWS: Removed dependency on PEAR. + +2002-02-18 Monte Ohrt + + * NEWS + docs.sgml + plugins/function.popup_init.php: add src attribute to popup_init + +2002-02-15 Andrei Zmievski + + * Smarty_Compiler.class.php + plugins/modifier.debug_print_var.php + NEWS + Smarty.class.php: Performance enhancements. + +2002-02-06 Andrei Zmievski + + * plugins/function.html_options.php: + Fix html_options output to be XHTML compatible. + +2002-02-05 Andrei Zmievski + + * Smarty.class.php + Smarty_Compiler.class.php: Fix up plugin inclusion. + + * Smarty.class.php + Smarty_Compiler.class.php + TODO + plugins/function.html_select_date.php + plugins/function.html_select_time.php + plugins/modifier.date_format.php: Fix plugin directory access. + +2002-02-04 Andrei Zmievski + + * .cvsignore + Smarty_Compiler.class.php: *** empty log message *** + +2002-01-31 Andrei Zmievski + + * NEWS: *** empty log message *** + + * Smarty.addons.php + Smarty.class.php + Smarty_Compiler.class.php + TODO + plugins/function.assign.php + plugins/function.assign_debug_info.php + plugins/function.counter.php + plugins/function.fetch.php + plugins/function.html_options.php + plugins/function.html_select_date.php + plugins/function.html_select_time.php + plugins/function.math.php + plugins/function.popup.php + plugins/function.popup_init.php + plugins/modifier.capitalize.php + plugins/modifier.count_characters.php + plugins/modifier.count_paragraphs.php + plugins/modifier.count_sentences.php + plugins/modifier.count_words.php + plugins/modifier.date_format.php + plugins/modifier.debug_print_var.php + plugins/modifier.default.php + plugins/modifier.escape.php + plugins/modifier.lower.php + plugins/modifier.regex_replace.php + plugins/modifier.replace.php + plugins/modifier.spacify.php + plugins/modifier.string_format.php + plugins/modifier.strip_tags.php + plugins/modifier.truncate.php + plugins/modifier.upper.php + plugins/shared.make_timestamp.php + templates/index.tpl + AUTHORS + CREDITS + Config_File.class.php + README: Implemented plugin architecture. + + * NEWS: *** empty log message *** + +2002-01-30 Monte Ohrt + + * NEWS + Smarty.addons.php + Smarty.class.php + docs.sgml: added modifiers wordwrap and indent + +2002-01-28 Monte Ohrt + + * Smarty.class.php + docs.sgml: + add support for is-modified-since headers, adjust a doc example + +2002-01-24 Monte Ohrt + + * Smarty.class.php: cleanup formatting + + * NEWS + Smarty.class.php + docs.sgml: update ChangeLog, remove insert_tag_check parameter + +2002-01-24 Andrei Zmievski + + * plugins/standard.plugin.php: *** empty log message *** + +2002-01-24 Monte Ohrt + + * Smarty.class.php: fix syntax error + + * Smarty.class.php: removed unneccesary test from fetch() + +2002-01-23 Monte Ohrt + + * Smarty.addons.php: update overlib fixes + + * NEWS: update changelog + + * FAQ + NEWS + RESOURCES + Smarty.addons.php: updated overlib fixes + +2001-12-31 Andrei Zmievski + + * NEWS + Smarty.class.php: Fixed compile_id problem. + +2001-12-28 Monte Ohrt + + * NEWS + Smarty.class.php + Smarty_Compiler.class.php: + fixed problem with using assigned var with include_php filepath + +2001-12-21 Monte Ohrt + + * RESOURCES: update RESOURCES + +2001-12-20 Monte Ohrt + + * FAQ + README: update FAQ + +2001-12-18 Monte Ohrt + + * Smarty_Compiler.class.php + docs.sgml + Config_File.class.php + NEWS + README + RELEASE_NOTES + Smarty.addons.php + Smarty.class.php: update version numbers + +2001-12-18 Andrei Zmievski + + * NEWS + Smarty.class.php: Fixed clear_cache(). + +2001-12-14 Monte Ohrt + + * NEWS + Smarty.addons.php: + fixed bug in smarty_make_timestamp introduced in PHP 4.1.0 + +2001-12-13 Monte Ohrt + + * NEWS + Smarty.class.php + docs.sgml: update default function args, fix cached insert debug timing + +2001-12-12 Monte Ohrt + + * docs.sgml: fix syntax error in documentation + + * Smarty.class.php: update default template handling functionality + +2001-12-11 Monte Ohrt + + * Smarty.class.php + Smarty_Compiler.class.php: update file fetching logic + +2001-12-11 Andrei Zmievski + + * NEWS + Smarty.class.php: Added 'script' attribute to {insert..}. + +2001-12-10 Monte Ohrt + + * NEWS + Smarty.class.php: added default template function handler + + * Config_File.class.php + NEWS + README + RELEASE_NOTES + Smarty.addons.php + Smarty.class.php + Smarty_Compiler.class.php: update version numbers in files to 1.5.1 + +2001-12-10 Andrei Zmievski + + * NEWS + Smarty.class.php: Removed error message from the _read_file() method. + + * Smarty.class.php: Fix check for compile and cache IDs. + +2001-12-06 Monte Ohrt + + * QUICKSTART: fix spelling error in QUICKSTART + + * docs.sgml: fixed spelling errors in documenation + + * Smarty_Compiler.class.php + docs.sgml + Config_File.class.php + NEWS + README + RELEASE_NOTES + Smarty.addons.php + Smarty.class.php: commit 1.5.0 release + + * RESOURCES + docs.sgml: added RESOURCES file + +2001-12-05 Andrei Zmievski + + * Smarty_Compiler.class.php: Refactor. + +2001-12-05 Monte Ohrt + + * NEWS + Smarty_Compiler.class.php + docs.sgml: added assign to include and php_include + + * Smarty.class.php + Smarty_Compiler.class.php + docs.sgml: *** empty log message *** + +2001-12-04 Andrei Zmievski + + * NEWS + Smarty_Compiler.class.php: Formatting. + +2001-12-04 Monte Ohrt + + * Smarty_Compiler.class.php + NEWS + Smarty.class.php: update ChangeLog + +2001-12-04 Andrei Zmievski + + * NEWS + Smarty.class.php: Formatting. + +2001-12-04 Monte Ohrt + + * Smarty.class.php: removed SMARTY_DIR setting in constructor + + * Smarty.class.php: fix Smarty.class.php indention error + + * Smarty.class.php: update trusted logic + +2001-12-03 Monte Ohrt + + * Smarty.class.php: + fix up is_secure, is_trusted, make _parse_tpl_path function + + * Smarty.class.php: fix problem with testing SMARTY_DIR as empty + + * NEWS + docs.sgml: update documentation, change log + + * Smarty.class.php: + update constructor to check for SMARTY_DIR before assigning + +2001-12-03 Andrei Zmievski + + * NEWS + Smarty.class.php: *** empty log message *** + +2001-12-03 Monte Ohrt + + * FAQ + INSTALL + RELEASE_NOTES: update a few files + + * NEWS + QUICKSTART + Smarty.class.php + docs.sgml: added trusted_dir functionality, cleaned up secure_dir logic + +2001-12-03 Andrei Zmievski + + * NEWS: *** empty log message *** + + * NEWS + Smarty.class.php: - Introduced $compile_id class variable. + - Fixed a situation where if $cache_id and $compile_id were both null + they were passed to auto functions as empty string instead of null. + +2001-11-30 Monte Ohrt + + * NEWS + Smarty.class.php: + change variable names in fetch() fuction to smarty_* to avoid namespace conflicts + + * NEWS + Smarty.class.php: fixed bug in _rm_auto with catenated null values + +2001-11-29 Andrei Zmievski + + * NEWS + Smarty_Compiler.class.php: Added $smarty.section.* syntax. + + * Smarty_Compiler.class.php: Made 'name' attribute optional for {foreach}. + +2001-11-29 Monte Ohrt + + * Smarty.class.php + index.php: remove assign "now" in index.tpl + +2001-11-29 Andrei Zmievski + + * NEWS + Smarty.addons.php + Smarty.class.php: Fix formatting. + +2001-11-28 Monte Ohrt + + * NEWS + Smarty.class.php + docs.sgml: + removed return statements from _read_cache_file (how did they get in there?) + +2001-11-27 Monte Ohrt + + * docs.sgml + NEWS + Smarty.addons.php + Smarty.class.php: + fixed bugs and added assign attribute to several functions + +2001-11-27 Andrei Zmievski + + * NEWS: Some rewording. + + * Smarty_Compiler.class.php: Fix $smarty.capture access. + + * TODO: *** empty log message *** + + * NEWS + Smarty.class.php + Smarty_Compiler.class.php: + Made {config_load ..} merge globals from each config file only once per scope. + + * NEWS + Smarty.class.php + Smarty_Compiler.class.php: - Added {foreach ...}. + - Made certain $smarty.* references handled at compilation time. + +2001-11-26 Monte Ohrt + + * Config_File.class.php + NEWS + Smarty.class.php + Smarty_Compiler.class.php + docs.sgml: commit cache handler functionality + +2001-11-20 Andrei Zmievski + + * NEWS + Smarty.addons.php + Smarty_Compiler.class.php: Various fixes and additions. + + * NEWS + index.php: *** empty log message *** + +2001-11-05 Monte Ohrt + + * Smarty.class.php: changed _read_file parameter from $end to $lines + + * NEWS + Smarty.class.php: fixed is_cache, make cache reading more efficient + +2001-11-02 Monte Ohrt + + * FAQ + NEWS: update FAQ with mailing list Reply-To header FAQ + + * NEWS + Smarty.class.php + index.php: supress fopen errors, return false if cache file won't load + +2001-11-01 Monte Ohrt + + * QUICKSTART + docs.sgml + index.php: update QUICKSTART guide with index key example + + * Config_File.class.php + NEWS + README + RELEASE_NOTES + Smarty.addons.php + Smarty.class.php + Smarty_Compiler.class.php + docs.sgml: commit all updates for 1.4.6 + +2001-11-01 Andrei Zmievski + + * NEWS: *** empty log message *** + +2001-10-30 Monte Ohrt + + * Smarty.addons.php: fix assign function problem with empty value passed + + * NEWS + Smarty.addons.php + Smarty.class.php + Smarty_Compiler.class.php + templates/debug.tpl: + fixed bug in assign function when passing an empty value + +2001-10-26 Monte Ohrt + + * Smarty.addons.php + Smarty.class.php + index.php: fix minor typo in debug code + +2001-10-26 Andrei Zmievski + + * Smarty.class.php: Typo. + +2001-10-26 Monte Ohrt + + * Smarty.addons.php: + update debug console output, handle html encoding correctly + +2001-10-26 Andrei Zmievski + + * Smarty.addons.php + templates/debug.tpl: Debug formatting. + + * Smarty.class.php: Disable rmdir warning. + +2001-10-26 Monte Ohrt + + * Smarty.addons.php + Smarty.class.php + templates/debug.tpl: update debugging to expand array variables + + * Smarty.class.php + docs.sgml: + update docs for fetching only timestamp with custom template source functions + + * Smarty.addons.php: fix debug console error + +2001-10-26 Andrei Zmievski + + * docs.sgml: Typos. + + * Smarty.addons.php: Cleanup whitespace. + + * Smarty_Compiler.class.php: Clean up whitespace. + + * Smarty.class.php: Cleaning up code, formatting mostly. + + * NEWS: *** empty log message *** + +2001-10-25 Monte Ohrt + + * NEWS + docs.sgml: update documentation to current version + + * NEWS + Smarty.addons.php: + updated fetch to give proper warning when fetching unreadable or nonexistant files + + * NEWS + Smarty.class.php + Smarty_Compiler.class.php: + fixed problem with newline at the end of compiled templates + + * NEWS + Smarty.class.php: recompile cache if config file gets modified too. + + * NEWS + Smarty.class.php: + added feature to regenerate cache if compile_check is enabled and an + involved template is modified + +2001-10-23 Monte Ohrt + + * Smarty.class.php: fix indent for insert tags in debug console + + * templates/debug.tpl: update debug.tpl file format + + * NEWS + Smarty.addons.php + Smarty.class.php + templates/debug.tpl: + update execution time debugging, move into include list + +2001-10-10 Monte Ohrt + + * NEWS + Smarty.addons.php + Smarty.class.php + Smarty_Compiler.class.php: + fixed up execution time output in debug console + +2001-10-09 Andrei Zmievski + + * Config_File.class.php + NEWS + Smarty.class.php + TODO: Added support for hidden config vars. + +2001-10-04 Monte Ohrt + + * NEWS + Smarty.addons.php + Smarty.class.php + templates/debug.tpl: added execution times to debug console + +2001-10-02 Andrei Zmievski + + * Smarty_Compiler.class.php: Add space. + +2001-10-01 Andrei Zmievski + + * Smarty.class.php: Fix reference to compile_id. + +2001-09-28 Andrei Zmievski + + * NEWS + Smarty.class.php + Smarty_Compiler.class.php: Added postfilter functions. + +2001-09-26 Andrei Zmievski + + * NEWS + Smarty.class.php + docs.sgml: Rename to clear_compiled_tpl(). + +2001-09-25 Andrei Zmievski + + * NEWS + Smarty_Compiler.class.php: + Fixed line number reporting when removing comments. + +2001-09-20 Monte Ohrt + + * NEWS + RELEASE_NOTES + Smarty.addons.php: made html_options output xhtml compatible + +2001-09-19 Monte Ohrt + + * Config_File.class.php + NEWS + README + RELEASE_NOTES + Smarty.addons.php + Smarty.class.php + Smarty_Compiler.class.php + templates/debug.tpl: updated version numbers + +2001-09-16 Monte Ohrt + + * FAQ + NEWS + docs.sgml: fix doc error with insert function + +2001-09-06 Andrei Zmievski + + * NEWS: *** empty log message *** + +2001-08-31 Monte Ohrt + + * NEWS: update ChangeLog + + * overlib.js + Smarty.addons.php + Smarty.class.php + docs.sgml: + update overlib to 3.50, adjust addon code so that the overlib.js file isn't modified + +2001-08-31 Andrei Zmievski + + * Smarty.class.php: - compile_id changes + + * NEWS + Smarty.addons.php: - compile_id support + - new options for html_select_date + +2001-08-23 Andrei Zmievski + + * TODO: *** empty log message *** + +2001-08-10 Andrei Zmievski + + * NEWS + Smarty.addons.php + Smarty.class.php + Smarty_Compiler.class.php: + Modified to pass Smarty object as second parameter to insert functions. + Also moved _smarty_mod_handler() and _smarty_insert_handler() into the class. + + * NEWS + Smarty_Compiler.class.php: + Passing Smarty as second parameter to prefilter functions. + +2001-08-09 Andrei Zmievski + + * NEWS: *** empty log message *** + +2001-08-09 Monte Ohrt + + * templates/index.tpl + Smarty.class.php: add smarty.now variable to template + +2001-08-06 Monte Ohrt + + * templates/index.tpl: change config_load section back to setup + +2001-08-06 Andrei Zmievski + + * Smarty.addons.php: Optimize a bit. + +2001-08-04 Monte Ohrt + + * docs.sgml: update capture documentation + +2001-08-03 Monte Ohrt + + * FAQ + NEWS + Smarty.class.php: + fix bug with URL controlled debugging, works now (Monte) + +2001-08-01 Andrei Zmievski + + * Config_File.class.php: *** empty log message *** + + * Smarty_Compiler.class.php + Smarty.class.php: - Fixed some E_NOTICE stuff in compiler. + - Generalized assign_smarty_interface() a bit. + +2001-07-24 Andrei Zmievski + + * NEWS + Smarty_Compiler.class.php + TODO: See ChangeLog for details. + +2001-07-20 Andrei Zmievski + + * Config_File.class.php: Booleanize case-insensitively. + +2001-07-17 Monte Ohrt + + * NEWS: update ChangeLog + + * Smarty.class.php + docs.sgml: put SMARTY_DIR on Config_File require + +2001-07-11 Monte Ohrt + + * docs.sgml + FAQ + NEWS + Smarty.class.php: + updated security to not include insecure docs, only warning + +2001-07-10 Andrei Zmievski + + * Smarty.class.php: Adding 'sizeof' as an allowed {if} function. + +2001-07-06 Andrei Zmievski + + * NEWS: *** empty log message *** + +2001-07-06 Monte Ohrt + + * Config_File.class.php + NEWS + README + RELEASE_NOTES + Smarty.addons.php + Smarty.class.php + Smarty_Compiler.class.php: update version number to 1.4.4 + + * NEWS + Smarty.addons.php + Smarty_Compiler.class.php + docs.sgml + templates/header.tpl + templates/index.tpl: update documenatation, template examples + +2001-07-03 Andrei Zmievski + + * NEWS + Smarty.class.php: Implemented access to request vars via $smarty var. + + * NEWS + Smarty_Compiler.class.php: + Fixed a bug with parsing function arguments in {if} tags. + +2001-06-30 Monte Ohrt + + * NEWS: update ChangeLog + +2001-06-29 Monte Ohrt + + * Smarty.addons.php + Smarty.class.php + docs.sgml + overlib.js: + moved overlib to separate file, added SMARTY_DIR, documented. added much documentation + +2001-06-29 Andrei Zmievski + + * NEWS + RELEASE_NOTES + TODO: *** empty log message *** + +2001-06-29 Monte Ohrt + + * NEWS + README + RELEASE_NOTES + Smarty.addons.php + Smarty.class.php + docs.sgml + index.php + templates/debug.tpl + templates/header.tpl + templates/index.tpl: update release notes + +2001-06-27 Andrei Zmievski + + * Smarty_Compiler.class.php: *** empty log message *** + + * NEWS + Smarty_Compiler.class.php: Implemented 'step' section attribute. + + * Smarty_Compiler.class.php: Negative values of 'max' will mean no max. + + * AUTHORS + NEWS: *** empty log message *** + +2001-06-26 Andrei Zmievski + + * NEWS + Smarty.class.php + Smarty_Compiler.class.php + index.php: Added 'max' and 'start' section attributes. + Added 'total' and 'iteration' section properties. + +2001-06-25 Andrei Zmievski + + * Config_File.class.php + RELEASE_NOTES + Smarty.addons.php + Smarty.class.php + Smarty_Compiler.class.php: Update version numbers. + +2001-06-23 Andrei Zmievski + + * TODO: *** empty log message *** + +2001-06-21 Andrei Zmievski + + * Config_File.class.php + NEWS: Fixed booleanization bug. + +2001-06-20 Monte Ohrt + + * docs.sgml: + update documents to reflect changes to cached content & debugging + +2001-06-20 Andrei Zmievski + + * Smarty.addons.php + Smarty.class.php: Remove debug output for cached and fetched cases. + +2001-06-20 Monte Ohrt + + * Smarty.class.php: update include_info to false + + * Smarty.class.php + docs.sgml + index.php + templates/footer.tpl: + moved debug logic into Smarty completely, created flags for it + +2001-06-19 Andrei Zmievski + + * Smarty.addons.php + Smarty.class.php + templates/debug.tpl: *** empty log message *** + + * NEWS + Smarty.class.php: Remove unneeded debug functions. + +2001-06-19 Monte Ohrt + + * NEWS + Smarty.addons.php + Smarty.class.php + docs.sgml + templates/debug.tpl + templates/footer.tpl: commit updates, add debug template + +2001-06-19 Andrei Zmievski + + * Smarty.class.php + Smarty_Compiler.class.php + TODO: + Moved config loading code inside main class, the compiled template now + simply calls that method. + +2001-06-15 Andrei Zmievski + + * NEWS + Smarty.class.php + Smarty_Compiler.class.php + templates/index.tpl: * moved config array into class itself + * added 'scope' attribute for config_load + + * Smarty_Compiler.class.php + Smarty.addons.php + Smarty.class.php: Finishing up secure mode. + +2001-06-15 Monte Ohrt + + * NEWS: update ChangeLog + + * Smarty_Compiler.class.php: cleaned up logic of if statement security + + * Smarty_Compiler.class.php: update if logic to cover more situations + + * Smarty_Compiler.class.php + docs.sgml: update if statement security feature + +2001-06-14 Andrei Zmievski + + * Smarty.addons.php + Smarty.class.php: *** empty log message *** + + * NEWS + Smarty_Compiler.class.php: + Fixed a bug with quoted strings inside if statements. + +2001-06-13 Monte Ohrt + + * Smarty.addons.php + Smarty.class.php: added secure_dir array for multiple secure directories + + * Smarty.addons.php: update fetch funtion to respect security setting + + * NEWS + Smarty.addons.php + Smarty.class.php + docs.sgml: update documentation, changelog + + * Smarty.addons.php + Smarty.class.php: moved _extract setting to assign functions + + * Smarty.addons.php + Smarty.class.php + Smarty_Compiler.class.php: + added assign/unassign custom functions, ability to re-extract tpl_vars + + * Smarty.class.php + Smarty_Compiler.class.php + docs.sgml + index.php: commit security features + +2001-06-11 Andrei Zmievski + + * Smarty.class.php: Version variable typo. + +2001-06-05 Andrei Zmievski + + * Smarty.class.php: + Create config object in fetch() or just set the config path if it already + exists. + +2001-06-04 Andrei Zmievski + + * Smarty.class.php: *** empty log message *** + + * NEWS + Smarty_Compiler.class.php: + Fixed a problem with $ inside strip tags. + +2001-05-31 Andrei Zmievski + + * NEWS: *** empty log message *** + + * Config_File.class.php: Allow empty config_path. + +2001-05-29 Monte Ohrt + + * Smarty_Compiler.class.php + docs.sgml + NEWS + README + RELEASE_NOTES + Smarty.addons.php + Smarty.class.php: update version numbers + + * NEWS + Smarty.class.php + Smarty_Compiler.class.php + docs.sgml: moved version variable to internal variable + +2001-05-22 Andrei Zmievski + + * NEWS + Smarty.class.php + Smarty_Compiler.class.php: + Moved $_smarty_sections and $_smarty_conf_obj into Smarty class. + +2001-05-18 Monte Ohrt + + * NEWS: update ChangeLog + + * FAQ + QUICKSTART: update FAQ, QUICKSTART for windows include_path setup + + * configs/test.conf: added configs directory to cvs + +2001-05-18 Andrei Zmievski + + * Smarty.class.php: Use compiler_class for including the file. + +2001-05-18 Monte Ohrt + + * docs.sgml: fix typo + +2001-05-16 Monte Ohrt + + * README + RELEASE_NOTES + Smarty.addons.php + Smarty.class.php + Smarty_Compiler.class.php: update files to version 1.4.1 + + * NEWS: update ChangeLog + +2001-05-15 Andrei Zmievski + + * NEWS: *** empty log message *** + + * index.php: forget that! + + * NEWS + Smarty_Compiler.class.php + index.php: Fixed a few E_NOTICE warnings. + +2001-05-09 Monte Ohrt + + * NEWS + RELEASE_NOTES + Smarty.addons.php + Smarty.class.php + docs.sgml: update dates versions + +2001-05-09 Andrei Zmievski + + * NEWS: *** empty log message *** + + * Smarty.class.php: + Use absolute paths when requiring/including Smart components. + + * NEWS: *** empty log message *** + + * Smarty.class.php: Use write mode instead of append. + +2001-05-02 Andrei Zmievski + + * NEWS + Smarty_Compiler.class.php: Fix indexing by section properties. + +2001-05-02 Monte Ohrt + + * NEWS: update changelog + + * Smarty.class.php: remove period from syntax error + +2001-05-02 Andrei Zmievski + + * Smarty_Compiler.class.php: Double-quote the attribute values by default. + +2001-04-30 Monte Ohrt + + * Smarty_Compiler.class.php + NEWS: added simple {capture} logic + +2001-04-30 Andrei Zmievski + + * TODO: *** empty log message *** + + * Smarty_Compiler.class.php + Smarty.class.php: Fix passing config vars to included files. + + * Smarty.class.php + Smarty_Compiler.class.php: Fix inclusion again. + +2001-04-30 Monte Ohrt + + * FAQ + RELEASE_NOTES + Smarty.class.php + misc/fix_vars.php + NEWS: update paths for windows (c:) + +2001-04-28 Andrei Zmievski + + * Smarty.class.php + Smarty_Compiler.class.php: Fix passing variables to included files. + + * templates/index.tpl: *** empty log message *** + +2001-04-27 Andrei Zmievski + + * Smarty_Compiler.class.php: Fix includes. + +2001-04-26 Andrei Zmievski + + * Smarty_Compiler.class.php + docs.sgml + Smarty.class.php: Formatting mostly. + + * Smarty_Compiler.class.php + Config_File.class.php: *** empty log message *** + +2001-04-26 Monte Ohrt + + * Smarty_Compiler.class.php + docs.sgml + FAQ + NEWS + QUICKSTART + RELEASE_NOTES + Smarty.class.php: update docs with new changes + +2001-04-26 Andrei Zmievski + + * RELEASE_NOTES: *** empty log message *** + + * docs.sgml + templates/index.tpl + NEWS + Smarty_Compiler.class.php: Added ability to reference object properties. + +2001-04-25 Andrei Zmievski + + * README + Smarty.addons.php + Smarty.class.php + Smarty_Compiler.class.php + docs.sgml + AUTHORS + Config_File.class.php + CREDITS + RELEASE_NOTES + NEWS: *** empty log message *** + + * docs.sgml: Docs on new parameter to custom functions. + + * NEWS: *** empty log message *** + + * Smarty_Compiler.class.php: + Changing the way tpl vars are referenced and passing smarty object + to custom functions. + + * RELEASE_NOTES + docs.sgml: Fixing docs a bit. + +2001-04-24 Andrei Zmievski + + * docs.sgml: Docs for $compiler_class and compiler functions. + + * templates/index.tpl: *** empty log message *** + + * Smarty_Compiler.class.php: Remove debugging. + +2001-04-24 Monte Ohrt + + * docs.sgml: update compiler function docs + +2001-04-24 Andrei Zmievski + + * NEWS + Smarty.class.php + Smarty_Compiler.class.php + templates/index.tpl: Added compiler function support. + +2001-04-24 Monte Ohrt + + * RELEASE_NOTES + Smarty.class.php: + update notes, change show_info_header to false by default + + * Smarty.class.php + Smarty_Compiler.class.php + docs.sgml + CREDITS + FAQ + NEWS + README + RELEASE_NOTES: update documenation, bug fixes + +2001-04-24 Andrei Zmievski + + * misc/fix_vars.php: Hopefully fix for sure. + +2001-04-23 Monte Ohrt + + * misc/fix_vars.php: uncomment copy/unlink + +2001-04-23 Andrei Zmievski + + * misc/fix_vars.php: Do it more thoroughly. + + * misc/fix_vars.php: check for } + +2001-04-22 Andrei Zmievski + + * misc/fix_vars.php: Fix variable parsing. + +2001-04-20 Monte Ohrt + + * misc/fix_vars.php: fix problem with 4.0.5-dev and preg_replace_callback + +2001-04-19 Monte Ohrt + + * Smarty_Compiler.class.php + docs.sgml + misc/fix_vars.php + NEWS + RELEASE_NOTES + Smarty.class.php: update notes/documentation + + * NEWS + README + RELEASE_NOTES + Smarty.addons.php + Smarty.class.php + Smarty_Compiler.class.php + docs.sgml: update files for 1.4.0 release + +2001-04-16 Andrei Zmievski + + * misc/fix_vars.php: Added fix_vars.php script. + +2001-04-16 Monte Ohrt + + * QUICKSTART + RELEASE_NOTES + docs.sgml + templates/index.tpl: + update RELEASE_NOTES & scripts with new section var syntax + +2001-04-13 Andrei Zmievski + + * Smarty_Compiler.class.php: * Implement new variable format parser. + * Optimizing config load a bit. + +2001-04-13 Monte Ohrt + + * FAQ + NEWS + RELEASE_NOTES + Smarty.class.php: + added $check_cached_insert_tags to speed up cached pages if + {insert ...} is not used (Monte) + +2001-04-12 Andrei Zmievski + + * NEWS + Smarty.class.php + RELEASE_NOTES: *** empty log message *** + + * Smarty_Compiler.class.php: Remove redundant functions. + + * Smarty.class.php: Formatting. + +2001-04-12 Monte Ohrt + + * Smarty.class.php: update file: parsing + + * Smarty.class.php + docs.sgml: update documentation + +2001-04-12 Andrei Zmievski + + * Smarty.class.php + Smarty_Compiler.class.php + TODO: *** empty log message *** + +2001-04-11 Monte Ohrt + + * FAQ + QUICKSTART + RELEASE_NOTES: added RELEASE_NOTES file to cvs + + * NEWS + docs.sgml: update ChangeLog, update documentation + + * Smarty.class.php + Smarty_Compiler.class.php + templates/index.tpl: + update Smarty to compile at run-time. added ability to get files from + absolute paths, added work around for LOCK_EX and windows, changed a few + file permissions to be more secure. + +2001-03-29 Monte Ohrt + + * NEWS + Smarty.addons.php: + allow arbitrary date strings instead of just timestamps + +2001-03-28 Monte Ohrt + + * Smarty.class.php + Smarty_Compiler.class.php + docs.sgml + FAQ + NEWS + README + Smarty.addons.php: + update version in class, update docs for count_ and new vars + + * templates/index.tpl + docs.sgml: update docs, example template + +2001-03-28 Andrei Zmievski + + * Smarty_Compiler.class.php: Some variable renaming. + +2001-03-23 Andrei Zmievski + + * Smarty_Compiler.class.php + NEWS: Fixed nested include infinite repeat bug. + +2001-03-23 Monte Ohrt + + * Smarty.class.php: fix version number + + * Smarty.class.php + NEWS: added optional HTML header to output + +2001-03-22 Andrei Zmievski + + * Smarty_Compiler.class.php: Fixed inclusion of dynamic files. + +2001-03-16 Andrei Zmievski + + * Smarty_Compiler.class.php: Fixing the config_load scoping. + + * Smarty_Compiler.class.php: making config variables global for now. + +2001-03-15 Andrei Zmievski + + * NEWS: *** empty log message *** + + * Smarty_Compiler.class.php: + * Includes are now always done via generated function call to protect + namespace. + * config_load now always uses global config object to improve + performance. + +2001-03-13 Monte Ohrt + + * docs.sgml: update math documentation with format attribute + +2001-03-11 Monte Ohrt + + * docs.sgml + NEWS + Smarty.addons.php + Smarty.class.php + Smarty_Compiler.class.php: update math function with format attribute + +2001-03-10 Andrei Zmievski + + * Smarty.addons.php: *** empty log message *** + + * NEWS + Smarty.addons.php + Smarty.class.php: Added html_select_time custom function. + +2001-03-08 Monte Ohrt + + * Smarty.class.php + Smarty_Compiler.class.php + NEWS + README + Smarty.addons.php: rename 1.3.1b to 1.3.1pl1 + + * NEWS + Smarty.addons.php + Smarty.class.php + Smarty_Compiler.class.php: update version numbers, changelog + + * Smarty.class.php + Smarty_Compiler.class.php: + moved _syntax_error to Smarty_Compiler.class.php + + * Smarty.class.php + docs.sgml: + missing _syntax_error function recovered. fixed minor syntax in docs + +2001-03-07 Monte Ohrt + + * QUICKSTART + README + Smarty.addons.php + Smarty.class.php + Smarty_Compiler.class.php + BUGS + INSTALL + NEWS: update everything to 1.3.1 + +2001-03-03 Monte Ohrt + + * Smarty_Compiler.class.php + Smarty.class.php: fixed bug with cached insert tags + +2001-03-02 Monte Ohrt + + * Smarty.class.php + Smarty_Compiler.class.php: + fix cache fuctions with separated compiled class + + * FAQ + NEWS + docs.sgml: update changelog + +2001-03-02 Andrei Zmievski + + * NEWS + Smarty_Compiler.class.php: Added 'first' and 'last' section properties. + +2001-03-02 Monte Ohrt + + * TODO: remove compiling separation TODO + + * Smarty_Compiler.class.php + Smarty.addons.php + Smarty.class.php: update function headers + + * templates/index.tpl + NEWS + Smarty.class.php + Smarty_Compiler.class.php + index.php: split out compiling code for faster execution + + * Smarty.class.php: fixed a few warning messages + + * Smarty.addons.php + Smarty.class.php + docs.sgml + NEWS: added fetch, unregister mod/fun, updated docs + +2001-03-01 Monte Ohrt + + * Smarty.addons.php: added "int" to available list + + * docs.sgml + FAQ + Smarty.class.php: update FAQ, add math functions & update documetation + + * index.php + Smarty.addons.php + Smarty.class.php + docs.sgml: fixed literal tags and other optional delimiters + +2001-02-26 Andrei Zmievski + + * NEWS + Smarty.class.php: + Added index_prev, index_next section properties and ability to + index by them. + + * NEWS + Smarty.addons.php + Smarty.class.php: Reverting the plugins patch - needs more thought. + + * Smarty.class.php: Fixing plugin loading. + +2001-02-23 Andrei Zmievski + + * Smarty.addons.php + Smarty.class.php + plugins/standard.plugin.php + NEWS: Added plugin functionality. + +2001-02-22 Monte Ohrt + + * docs.sgml + templates/index.tpl + NEWS + README + Smarty.class.php: fixed issue with php tags executed in literal blocks + +2001-02-21 Monte Ohrt + + * NEWS: update changelog for LGPL change + + * Smarty.class.php + docs.sgml + README + Smarty.addons.php: updated version numbers to 1.3.0 + + * NEWS + templates/index.tpl: update changelog, rearrange index.tpl file + +2001-02-21 Andrei Zmievski + + * NEWS + Smarty.class.php: *** empty log message *** + +2001-02-21 Monte Ohrt + + * docs.sgml: update parameters for is_cached and fetch + +2001-02-21 Andrei Zmievski + + * NEWS + Smarty.class.php: *** empty log message *** + +2001-02-21 Monte Ohrt + + * NEWS + Smarty.addons.php + docs.sgml: update docs, remove header function from addons + +2001-02-20 Monte Ohrt + + * FAQ + NEWS: update changelog + + * TODO: update todo + + * TODO: update todo list + + * Smarty.class.php: update php tag handling logic + +2001-02-19 Monte Ohrt + + * index.php + Config_File.class.php + FAQ + Smarty.class.php + docs.sgml: fixed + + * Smarty.addons.php: *** empty log message *** + +2001-02-13 Andrei Zmievski + + * TODO: *** empty log message *** + +2001-02-12 Andrei Zmievski + + * templates/index.tpl + Smarty.class.php: *** empty log message *** + +2001-02-10 Monte Ohrt + + * Smarty.class.php: remove unneeded preg_match + + * Smarty.class.php: remove comment + + * Smarty.class.php: updated php escape to handle +{/if} diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/block.strip.php b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/block.strip.php new file mode 100644 index 00000000..a25df360 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/block.strip.php @@ -0,0 +1,35 @@ + + * Name: strip
                                                    + * Purpose: strip unwanted white space from text
                                                    + * @link http://smarty.php.net/manual/en/language.function.strip.php {strip} + * (Smarty online manual) + * @param array unused, no parameters for this block + * @param string content of {strip}{/strip} tags + * @param Smarty clever method emulation + * @return string $content stripped of whitespace + */ +function smarty_block_strip($params, $content, &$this) +{ + /* Reformat data between 'strip' and '/strip' tags, removing spaces, tabs and newlines. */ + $_strip_search = array( + "![\t ]+$|^[\t ]+!m", // remove leading/trailing space chars + '%[\r\n]+%m'); // remove CRs and newlines + $_strip_replace = array( + '', + ''); + return preg_replace($_strip_search, $_strip_replace, $content); +} + +/* vim: set expandtab: */ + +?> diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/block.textformat.php b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/block.textformat.php new file mode 100644 index 00000000..f3462c21 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/block.textformat.php @@ -0,0 +1,83 @@ + + * Name: textformat
                                                    + * Purpose: format text a certain way with preset styles + * or custom wrap/indent settings
                                                    + * @link http://smarty.php.net/manual/en/language.function.textformat.php {textformat} + * (Smarty online manual) + * @param array + *
                                                    + * Params:   style: string (email)
                                                    + *           indent: integer (0)
                                                    + *           wrap: integer (80)
                                                    + *           wrap_char string ("\n")
                                                    + *           indent_char: string (" ")
                                                    + *           wrap_boundary: boolean (true)
                                                    + * 
                                                    + * @param string contents of the block + * @param Smarty clever simulation of a method + * @return string string $content re-formatted + */ +function smarty_block_textformat($params, $content, &$smarty) +{ + $style = null; + $indent = 0; + $indent_first = 0; + $indent_char = ' '; + $wrap = 80; + $wrap_char = "\n"; + $wrap_cut = false; + $assign = null; + + if($content == null) { + return true; + } + + extract($params); + + if($style == 'email') { + $wrap = 72; + } + + // split into paragraphs + $paragraphs = preg_split('![\r\n][\r\n]!',$content); + $output = ''; + + foreach($paragraphs as $paragraph) { + if($paragraph == '') { + continue; + } + // convert mult. spaces & special chars to single space + $paragraph = preg_replace(array('!\s+!','!(^\s+)|(\s+$)!'),array(' ',''),$paragraph); + // indent first line + if($indent_first > 0) { + $paragraph = str_repeat($indent_char,$indent_first) . $paragraph; + } + // wordwrap sentences + $paragraph = wordwrap($paragraph, $wrap - $indent, $wrap_char, $wrap_cut); + // indent lines + if($indent > 0) { + $paragraph = preg_replace('!^!m',str_repeat($indent_char,$indent),$paragraph); + } + $output .= $paragraph . $wrap_char . $wrap_char; + } + + if($assign != null) { + $smarty->assign($assign,$output); + } else { + return $output; + } +} + +/* vim: set expandtab: */ + +?> diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/function.assign.php b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/function.assign.php new file mode 100644 index 00000000..c04be8bc --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/function.assign.php @@ -0,0 +1,38 @@ + + * Name: assign
                                                    + * Purpose: assign a value to a template variable + * @link http://smarty.php.net/manual/en/language.custom.functions.php#LANGUAGE.FUNCTION.ASSIGN {assign} + * (Smarty online manual) + * @param array Format: array('var' => variable name, 'value' => value to assign) + * @param Smarty + */ +function smarty_function_assign($params, &$smarty) +{ + extract($params); + + if (empty($var)) { + $smarty->trigger_error("assign: missing 'var' parameter"); + return; + } + + if (!in_array('value', array_keys($params))) { + $smarty->trigger_error("assign: missing 'value' parameter"); + return; + } + + $smarty->assign($var, $value); +} + +/* vim: set expandtab: */ + +?> diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/function.assign_debug_info.php b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/function.assign_debug_info.php new file mode 100644 index 00000000..59ddaa16 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/function.assign_debug_info.php @@ -0,0 +1,39 @@ + + * Name: assign_debug_info
                                                    + * Purpose: assign debug info to the template
                                                    + * @param array unused in this plugin, this plugin uses {@link Smarty::$_config}, + * {@link Smarty::$_tpl_vars} and {@link Smarty::$_smarty_debug_info} + * @param Smarty + */ +function smarty_function_assign_debug_info($params, &$smarty) +{ + $assigned_vars = $smarty->_tpl_vars; + ksort($assigned_vars); + if (@is_array($smarty->_config[0])) { + $config_vars = $smarty->_config[0]; + ksort($config_vars); + $smarty->assign("_debug_config_keys", array_keys($config_vars)); + $smarty->assign("_debug_config_vals", array_values($config_vars)); + } + + $included_templates = $smarty->_smarty_debug_info; + + $smarty->assign("_debug_keys", array_keys($assigned_vars)); + $smarty->assign("_debug_vals", array_values($assigned_vars)); + + $smarty->assign("_debug_tpls", $included_templates); +} + +/* vim: set expandtab: */ + +?> diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/function.config_load.php b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/function.config_load.php new file mode 100644 index 00000000..d9d65b95 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/function.config_load.php @@ -0,0 +1,130 @@ + + * Name: config_load
                                                    + * Purpose: load config file vars + * @link http://smarty.php.net/manual/en/language.function.config.load.php {config_load} + * (Smarty online manual) + * @param array Format: + *
                                                    + * array('file' => required config file name,
                                                    + *       'section' => optional config file section to load
                                                    + *       'scope' => local/parent/global
                                                    + *       'global' => overrides scope, setting to parent if true)
                                                    + * 
                                                    + * @param Smarty + */ +function smarty_function_config_load($params, &$smarty) +{ + if ($smarty->debugging) { + $_params = array(); + require_once(SMARTY_DIR . 'core' . DIRECTORY_SEPARATOR . 'core.get_microtime.php'); + $_debug_start_time = smarty_core_get_microtime($_params, $smarty); + } + + $_file = isset($params['file']) ? $smarty->_dequote($params['file']) : null; + $_section = isset($params['section']) ? $smarty->_dequote($params['section']) : null; + $_scope = isset($params['scope']) ? $smarty->_dequote($params['scope']) : 'global'; + $_global = isset($params['global']) ? $smarty->_dequote($params['global']) : false; + + if (!isset($_file) || strlen($_file) == 0) { + $smarty->_syntax_error("missing 'file' attribute in config_load tag", E_USER_ERROR, __FILE__, __LINE__); + } + + if (isset($_scope)) { + if ($_scope != 'local' && + $_scope != 'parent' && + $_scope != 'global') { + $smarty->_syntax_error("invalid 'scope' attribute value", E_USER_ERROR, __FILE__, __LINE__); + } + } else { + if ($_global) { + $_scope = 'parent'; + } else { + $_scope = 'local'; + } + } + + if(@is_dir($smarty->config_dir)) { + $_config_dir = $smarty->config_dir; + } else { + // config_dir not found, try include_path + $_params = array('file_path' => $smarty->config_dir); + require_once(SMARTY_DIR . 'core' . DIRECTORY_SEPARATOR . 'core.get_include_path.php'); + smarty_core_get_include_path($_params, $smarty); + $_config_dir = $_params['new_file_path']; + } + + $_file_path = $_config_dir . DIRECTORY_SEPARATOR . $_file; + if (isset($_section)) + $_compile_file = $smarty->_get_compile_path($_file_path.'|'.$_section); + else + $_compile_file = $smarty->_get_compile_path($_file_path); + + if($smarty->force_compile + || !file_exists($_compile_file) + || ($smarty->compile_check + && !$smarty->_is_compiled($_file_path, $_compile_file))) { + // compile config file + if(!is_object($smarty->_conf_obj)) { + require_once SMARTY_DIR . $smarty->config_class . '.class.php'; + $smarty->_conf_obj = new $smarty->config_class($_config_dir); + $smarty->_conf_obj->overwrite = $smarty->config_overwrite; + $smarty->_conf_obj->booleanize = $smarty->config_booleanize; + $smarty->_conf_obj->read_hidden = $smarty->config_read_hidden; + $smarty->_conf_obj->fix_newlines = $smarty->config_fix_newlines; + $smarty->_conf_obj->set_path = $_config_dir; + } + $_config_vars = array_merge($smarty->_conf_obj->get($_file), + $smarty->_conf_obj->get($_file, $_section)); + if(function_exists('var_export')) { + $_output = ''; + } else { + $_output = ''\\\'', '\\'=>'\\\\')) . '\'); ?>'; + } + $_params = (array('compile_path' => $_compile_file, 'compiled_content' => $_output, 'resource_timestamp' => filemtime($_file_path))); + require_once(SMARTY_DIR . 'core' . DIRECTORY_SEPARATOR . 'core.write_compiled_resource.php'); + smarty_core_write_compiled_resource($_params, $smarty); + } else { + include($_compile_file); + } + + if ($smarty->caching) { + $smarty->_cache_info['config'][$_file] = true; + } + + $smarty->_config[0]['vars'] = @array_merge($smarty->_config[0]['vars'], $_config_vars); + $smarty->_config[0]['files'][$_file] = true; + + if ($_scope == 'parent') { + $smarty->_config[1]['vars'] = @array_merge($smarty->_config[1]['vars'], $_config_vars); + $smarty->_config[1]['files'][$_file] = true; + } else if ($_scope == 'global') { + for ($i = 1, $for_max = count($smarty->_config); $i < $for_max; $i++) { + $smarty->_config[$i]['vars'] = @array_merge($smarty->_config[$i]['vars'], $_config_vars); + $smarty->_config[$i]['files'][$_file] = true; + } + } + + if ($smarty->debugging) { + $_params = array(); + require_once(SMARTY_DIR . 'core' . DIRECTORY_SEPARATOR . 'core.get_microtime.php'); + $smarty->_smarty_debug_info[] = array('type' => 'config', + 'filename' => $_file.' ['.$_section.'] '.$_scope, + 'depth' => $smarty->_inclusion_depth, + 'exec_time' => smarty_core_get_microtime($_params, $smarty) - $_debug_start_time); + } + +} + +/* vim: set expandtab: */ + +?> diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/function.counter.php b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/function.counter.php new file mode 100644 index 00000000..8d17d2bb --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/function.counter.php @@ -0,0 +1,88 @@ + + * Name: counter
                                                    + * Purpose: print out a counter value + * @link http://smarty.php.net/manual/en/language.function.counter.php {counter} + * (Smarty online manual) + * @param array parameters + * @param Smarty + * @return string|null + */ +function smarty_function_counter($params, &$smarty) +{ + static $counters = array(); + + extract($params); + + if (!isset($name)) { + if(isset($id)) { + $name = $id; + } else { + $name = "default"; + } + } + + if (!isset($counters[$name])) { + $counters[$name] = array( + 'start'=>1, + 'skip'=>1, + 'direction'=>'up', + 'count'=>1 + ); + } + $counter =& $counters[$name]; + + if (isset($start)) { + $counter['start'] = $counter['count'] = $start; + } + + if (!empty($assign)) { + $counter['assign'] = $assign; + } + + if (isset($counter['assign'])) { + $smarty->assign($counter['assign'], $counter['count']); + } + + if (isset($print)) { + $print = (bool)$print; + } else { + $print = empty($counter['assign']); + } + + if ($print) { + $retval = $counter['count']; + } else { + $retval = null; + } + + if (isset($skip)) { + $counter['skip'] = $skip; + } + + if (isset($direction)) { + $counter['direction'] = $direction; + } + + if ($counter['direction'] == "down") + $counter['count'] -= $counter['skip']; + else + $counter['count'] += $counter['skip']; + + return $retval; + +} + +/* vim: set expandtab: */ + +?> diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/function.cycle.php b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/function.cycle.php new file mode 100644 index 00000000..c2e899d0 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/function.cycle.php @@ -0,0 +1,119 @@ + + * Name: cycle
                                                    + * Date: May 3, 2002
                                                    + * Purpose: cycle through given values
                                                    + * Input: + * - name = name of cycle (optional) + * - values = comma separated list of values to cycle, + * or an array of values to cycle + * (this can be left out for subsequent calls) + * - reset = boolean - resets given var to true + * - print = boolean - print var or not. default is true + * - advance = boolean - whether or not to advance the cycle + * - delimiter = the value delimiter, default is "," + * - assign = boolean, assigns to template var instead of + * printed. + * + * Examples:
                                                    + *
                                                    + * {cycle values="#eeeeee,#d0d0d0d"}
                                                    + * {cycle name=row values="one,two,three" reset=true}
                                                    + * {cycle name=row}
                                                    + * 
                                                    + * @link http://smarty.php.net/manual/en/language.function.cycle.php {cycle} + * (Smarty online manual) + * @author Monte Ohrt + * @author credit to Mark Priatel + * @author credit to Gerard + * @author credit to Jason Sweat + * @version 1.3 + * @param array + * @param Smarty + * @return string|null + */ +function smarty_function_cycle($params, &$smarty) +{ + static $cycle_vars; + + extract($params); + + if (empty($name)) { + $name = 'default'; + } + + if (!isset($print)) { + $print = true; + } + + if (!isset($advance)) { + $advance = true; + } + + if (!isset($reset)) { + $reset = false; + } + + if (!in_array('values', array_keys($params))) { + if(!isset($cycle_vars[$name]['values'])) { + $smarty->trigger_error("cycle: missing 'values' parameter"); + return; + } + } else { + if(isset($cycle_vars[$name]['values']) + && $cycle_vars[$name]['values'] != $values ) { + $cycle_vars[$name]['index'] = 0; + } + $cycle_vars[$name]['values'] = $values; + } + + if (isset($delimiter)) { + $cycle_vars[$name]['delimiter'] = $delimiter; + } elseif (!isset($cycle_vars[$name]['delimiter'])) { + $cycle_vars[$name]['delimiter'] = ','; + } + + if(!is_array($cycle_vars[$name]['values'])) { + $cycle_array = explode($cycle_vars[$name]['delimiter'],$cycle_vars[$name]['values']); + } else { + $cycle_array = $cycle_vars[$name]['values']; + } + + if(!isset($cycle_vars[$name]['index']) || $reset ) { + $cycle_vars[$name]['index'] = 0; + } + + if (isset($assign)) { + $print = false; + $smarty->assign($assign, $cycle_array[$cycle_vars[$name]['index']]); + } + + if($print) { + $retval = $cycle_array[$cycle_vars[$name]['index']]; + } else { + $retval = null; + } + + if($advance) { + if ( $cycle_vars[$name]['index'] >= count($cycle_array) -1 ) { + $cycle_vars[$name]['index'] = 0; + } else { + $cycle_vars[$name]['index']++; + } + } + + return $retval; +} + +/* vim: set expandtab: */ + +?> diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/function.debug.php b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/function.debug.php new file mode 100644 index 00000000..5fe02f30 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/function.debug.php @@ -0,0 +1,35 @@ + + * Name: debug
                                                    + * Date: July 1, 2002
                                                    + * Purpose: popup debug window + * @link http://smarty.php.net/manual/en/language.function.debug.php {debug} + * (Smarty online manual) + * @author Monte Ohrt + * @version 1.0 + * @param array + * @param Smarty + * @return string output from {@link Smarty::_generate_debug_output()} + */ +function smarty_function_debug($params, &$smarty) +{ + if($params['output']) { + $smarty->assign('_smarty_debug_output',$params['output']); + } + require_once(SMARTY_DIR . 'core' . DIRECTORY_SEPARATOR . 'core.display_debug_console.php'); + return smarty_core_display_debug_console(null, $smarty); +} + +/* vim: set expandtab: */ + +?> diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/function.eval.php b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/function.eval.php new file mode 100644 index 00000000..e6943876 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/function.eval.php @@ -0,0 +1,48 @@ + + * Name: eval
                                                    + * Purpose: evaluate a template variable as a template
                                                    + * @link http://smarty.php.net/manual/en/language.function.eval.php {eval} + * (Smarty online manual) + * @param array + * @param Smarty + */ +function smarty_function_eval($params, &$smarty) +{ + + if (!isset($params['var'])) { + $smarty->trigger_error("eval: missing 'var' parameter"); + return; + } + + if($params['var'] == '') { + return; + } + + $smarty->_compile_source('evaluated template', $params['var'], $_var_compiled); + + ob_start(); + $smarty->_eval('?>' . $_var_compiled); + $_contents = ob_get_contents(); + ob_end_clean(); + + if (!empty($params['assign'])) { + $smarty->assign($params['assign'], $_contents); + } else { + return $_contents; + } +} + +/* vim: set expandtab: */ + +?> diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/function.fetch.php b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/function.fetch.php new file mode 100644 index 00000000..082c3483 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/function.fetch.php @@ -0,0 +1,217 @@ + + * Name: fetch
                                                    + * Purpose: fetch file, web or ftp data and display results + * @link http://smarty.php.net/manual/en/language.function.fetch.php {fetch} + * (Smarty online manual) + * @param array + * @param Smarty + * @return string|null if the assign parameter is passed, Smarty assigns the + * result to a template variable + */ +function smarty_function_fetch($params, &$smarty) +{ + if (empty($params['file'])) { + $smarty->_trigger_fatal_error("[plugin] parameter 'file' cannot be empty"); + return; + } + + if ($smarty->security && !preg_match('!^(http|ftp)://!i', $params['file'])) { + $_params = array('resource_type' => 'file', 'resource_name' => $params['file']); + require_once(SMARTY_DIR . 'core' . DIRECTORY_SEPARATOR . 'core.is_secure.php'); + if(!smarty_core_is_secure($_params, $smarty)) { + $smarty->_trigger_fatal_error('[plugin] (secure mode) fetch \'' . $params['file'] . '\' is not allowed'); + return; + } + + // fetch the file + if($fp = @fopen($params['file'],'r')) { + while(!feof($fp)) { + $content .= fgets ($fp,4096); + } + fclose($fp); + } else { + $smarty->_trigger_fatal_error('[plugin] fetch cannot read file \'' . $params['file'] . '\''); + return; + } + } else { + // not a local file + if(preg_match('!^http://!i',$params['file'])) { + // http fetch + if($uri_parts = parse_url($params['file'])) { + // set defaults + $host = $server_name = $uri_parts['host']; + $timeout = 30; + $accept = "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*"; + $agent = "Smarty Template Engine ".$smarty->_version; + $referer = ""; + $uri = !empty($uri_parts['path']) ? $uri_parts['path'] : '/'; + $uri .= !empty($uri_parts['query']) ? '?' . $uri_parts['query'] : ''; + $_is_proxy = false; + if(empty($uri_parts['port'])) { + $port = 80; + } else { + $port = $uri_parts['port']; + } + if(empty($uri_parts['user'])) { + $user = ''; + } + // loop through parameters, setup headers + foreach($params as $param_key => $param_value) { + switch($param_key) { + case "file": + case "assign": + case "assign_headers": + break; + case "user": + if(!empty($param_value)) { + $user = $param_value; + } + break; + case "pass": + if(!empty($param_value)) { + $pass = $param_value; + } + break; + case "accept": + if(!empty($param_value)) { + $accept = $param_value; + } + break; + case "header": + if(!empty($param_value)) { + if(!preg_match('![\w\d-]+: .+!',$param_value)) { + $smarty->_trigger_fatal_error("[plugin] invalid header format '".$param_value."'"); + return; + } else { + $extra_headers[] = $param_value; + } + } + break; + case "proxy_host": + if(!empty($param_value)) { + $proxy_host = $param_value; + } + break; + case "proxy_port": + if(!preg_match('!\D!', $param_value)) { + $proxy_port = (int) $param_value; + } else { + $smarty->_trigger_fatal_error("[plugin] invalid value for attribute '".$param_key."'"); + return; + } + break; + case "agent": + if(!empty($param_value)) { + $agent = $param_value; + } + break; + case "referer": + if(!empty($param_value)) { + $referer = $param_value; + } + break; + case "timeout": + if(!preg_match('!\D!', $param_value)) { + $timeout = (int) $param_value; + } else { + $smarty->_trigger_fatal_error("[plugin] invalid value for attribute '".$param_key."'"); + return; + } + break; + default: + $smarty->_trigger_fatal_error("[plugin] unrecognized attribute '".$param_key."'"); + return; + } + } + if(!empty($proxy_host) && !empty($proxy_port)) { + $_is_proxy = true; + $fp = fsockopen($proxy_host,$proxy_port,$errno,$errstr,$timeout); + } else { + $fp = fsockopen($server_name,$port,$errno,$errstr,$timeout); + } + + if(!$fp) { + $smarty->_trigger_fatal_error("[plugin] unable to fetch: $errstr ($errno)"); + return; + } else { + if($_is_proxy) { + fputs($fp, 'GET ' . $params['file'] . " HTTP/1.0\r\n"); + } else { + fputs($fp, "GET $uri HTTP/1.0\r\n"); + } + if(!empty($host)) { + fputs($fp, "Host: $host\r\n"); + } + if(!empty($accept)) { + fputs($fp, "Accept: $accept\r\n"); + } + if(!empty($agent)) { + fputs($fp, "User-Agent: $agent\r\n"); + } + if(!empty($referer)) { + fputs($fp, "Referer: $referer\r\n"); + } + if(isset($extra_headers) && is_array($extra_headers)) { + foreach($extra_headers as $curr_header) { + fputs($fp, $curr_header."\r\n"); + } + } + if(!empty($user) && !empty($pass)) { + fputs($fp, "Authorization: BASIC ".base64_encode("$user:$pass")."\r\n"); + } + + $content = ''; + fputs($fp, "\r\n"); + while(!feof($fp)) { + $content .= fgets($fp,4096); + } + fclose($fp); + $csplit = split("\r\n\r\n",$content,2); + + $content = $csplit[1]; + + if(!empty($params['assign_headers'])) { + $smarty->assign($params['assign_headers'],split("\r\n",$csplit[0])); + } + } + } else { + $smarty->_trigger_fatal_error("[plugin] unable to parse URL, check syntax"); + return; + } + } else { + // ftp fetch + if($fp = @fopen($params['file'],'r')) { + while(!feof($fp)) { + $content .= fgets ($fp,4096); + } + fclose($fp); + } else { + $smarty->_trigger_fatal_error('[plugin] fetch cannot read file \'' . $params['file'] .'\''); + return; + } + } + + } + + + if (!empty($params['assign'])) { + $smarty->assign($params['assign'],$content); + } else { + return $content; + } +} + +/* vim: set expandtab: */ + +?> diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/function.html_checkboxes.php b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/function.html_checkboxes.php new file mode 100644 index 00000000..6b32c594 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/function.html_checkboxes.php @@ -0,0 +1,135 @@ + + * Type: function
                                                    + * Name: html_checkboxes
                                                    + * Date: 24.Feb.2003
                                                    + * Purpose: Prints out a list of checkbox input types
                                                    + * Input:
                                                    + * - name (optional) - string default "checkbox" + * - values (required) - array + * - options (optional) - associative array + * - checked (optional) - array default not set + * - separator (optional) - ie
                                                    or   + * - output (optional) - without this one the buttons don't have names + * Examples: + *
                                                    + * {html_checkboxes values=$ids output=$names}
                                                    + * {html_checkboxes values=$ids name='box' separator='
                                                    ' output=$names} + * {html_checkboxes values=$ids checked=$checked separator='
                                                    ' output=$names} + *
                                                    + * @link http://smarty.php.net/manual/en/language.function.html.checkboxes.php {html_checkboxes} + * (Smarty online manual) + * @author Christopher Kvarme + * @author credits to Monte Ohrt + * @version 1.0 + * @param array + * @param Smarty + * @return string + * @uses smarty_function_escape_special_chars() + */ +function smarty_function_html_checkboxes($params, &$smarty) +{ + require_once $smarty->_get_plugin_filepath('shared','escape_special_chars'); + + $name = 'checkbox'; + $values = null; + $options = null; + $selected = null; + $separator = ''; + $labels = true; + $output = null; + + $extra = ''; + + foreach($params as $_key => $_val) { + switch($_key) { + case 'name': + case 'separator': + $$_key = $_val; + break; + + case 'labels': + $$_key = (bool)$_val; + break; + + case 'options': + $$_key = (array)$_val; + break; + + case 'values': + case 'output': + $$_key = array_values((array)$_val); + break; + + case 'checked': + case 'selected': + $selected = array_values((array)$_val); + break; + + case 'checkboxes': + $smarty->trigger_error('html_checkboxes: the use of the "checkboxes" attribute is deprecated, use "options" instead', E_USER_WARNING); + $options = (array)$_val; + break; + + default: + if(!is_array($_val)) { + $extra .= ' '.$_key.'="'.smarty_function_escape_special_chars($_val).'"'; + } else { + $smarty->trigger_error("html_checkboxes: extra attribute '$_key' cannot be an array", E_USER_NOTICE); + } + break; + } + } + + if (!isset($options) && !isset($values)) + return ''; /* raise error here? */ + + settype($selected, 'array'); + $_html_result = ''; + + if (is_array($options)) { + + foreach ($options as $_key=>$_val) + $_html_result .= smarty_function_html_checkboxes_output($name, $_key, $_val, $selected, $extra, $separator, $labels); + + + } else { + foreach ($values as $_i=>$_key) { + $_val = isset($output[$_i]) ? $output[$_i] : ''; + $_html_result .= smarty_function_html_checkboxes_output($name, $_key, $_val, $selected, $extra, $separator, $labels); + } + + } + + return $_html_result; + +} + +function smarty_function_html_checkboxes_output($name, $value, $output, $selected, $extra, $separator, $labels) { + $_output = ''; + if ($labels) $_output .= ''; + $_output .= $separator . "\n"; + + return $_output; +} + +?> diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/function.html_image.php b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/function.html_image.php new file mode 100644 index 00000000..5ddbe4a1 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/function.html_image.php @@ -0,0 +1,143 @@ + + * Name: html_image
                                                    + * Date: Feb 24, 2003
                                                    + * Purpose: format HTML tags for the image
                                                    + * Input:
                                                    + * - file = file (and path) of image (required) + * - border = border width (optional, default 0) + * - height = image height (optional, default actual height) + * - image =image width (optional, default actual width) + * - basedir = base directory for absolute paths, default + * is environment variable DOCUMENT_ROOT + * + * Examples: {html_image file="images/masthead.gif"} + * Output: + * @link http://smarty.php.net/manual/en/language.function.html.image.php {html_image} + * (Smarty online manual) + * @author Monte Ohrt + * @author credits to Duda - wrote first image function + * in repository, helped with lots of functionality + * @version 1.0 + * @param array + * @param Smarty + * @return string + * @uses smarty_function_escape_special_chars() + */ +function smarty_function_html_image($params, &$smarty) +{ + require_once $smarty->_get_plugin_filepath('shared','escape_special_chars'); + + $alt = ''; + $file = ''; + $border = 0; + $height = ''; + $width = ''; + $extra = ''; + $prefix = ''; + $suffix = ''; + $basedir = isset($GLOBALS['HTTP_SERVER_VARS']['DOCUMENT_ROOT']) + ? $GLOBALS['HTTP_SERVER_VARS']['DOCUMENT_ROOT'] : ''; + if(strstr($GLOBALS['HTTP_SERVER_VARS']['HTTP_USER_AGENT'], 'Mac')) { + $dpi_default = 72; + } else { + $dpi_default = 96; + } + + foreach($params as $_key => $_val) { + switch($_key) { + case 'file': + case 'border': + case 'height': + case 'width': + case 'dpi': + case 'basedir': + $$_key = $_val; + break; + + case 'alt': + if(!is_array($_val)) { + $$_key = smarty_function_escape_special_chars($_val); + } else { + $smarty->trigger_error("html_image: extra attribute '$_key' cannot be an array", E_USER_NOTICE); + } + break; + + case 'link': + case 'href': + $prefix = ''; + $suffix = ''; + break; + + default: + if(!is_array($_val)) { + $extra .= ' '.$_key.'="'.smarty_function_escape_special_chars($_val).'"'; + } else { + $smarty->trigger_error("html_image: extra attribute '$_key' cannot be an array", E_USER_NOTICE); + } + break; + } + } + + if (empty($file)) { + $smarty->trigger_error("html_image: missing 'file' parameter", E_USER_NOTICE); + return; + } + + if (substr($file,0,1) == '/') { + $_image_path = $basedir . $file; + } else { + $_image_path = $file; + } + + if(!isset($params['width']) || !isset($params['height'])) { + if(!$_image_data = @getimagesize($_image_path)) { + if(!file_exists($_image_path)) { + $smarty->trigger_error("html_image: unable to find '$_image_path'", E_USER_NOTICE); + return; + } else if(!is_readable($_image_path)) { + $smarty->trigger_error("html_image: unable to read '$_image_path'", E_USER_NOTICE); + return; + } else { + $smarty->trigger_error("html_image: '$_image_path' is not a valid image file", E_USER_NOTICE); + return; + } + } + $_params = array('resource_type' => 'file', 'resource_name' => $_image_path); + require_once(SMARTY_DIR . 'core' . DIRECTORY_SEPARATOR . 'core.is_secure.php'); + if(!$smarty->security && !smarty_core_is_secure($_params, $smarty)) { + $smarty->trigger_error("html_image: (secure) '$_image_path' not in secure directory", E_USER_NOTICE); + return; + } + + if(!isset($params['width'])) { + $width = $_image_data[0]; + } + if(!isset($params['height'])) { + $height = $_image_data[1]; + } + + } + + if(isset($params['dpi'])) { + $_resize = $dpi_default/$params['dpi']; + $width = round($width * $_resize); + $height = round($height * $_resize); + } + + return $prefix . ''.$alt.'' . $suffix; +} + +/* vim: set expandtab: */ + +?> diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/function.html_options.php b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/function.html_options.php new file mode 100644 index 00000000..dfc38c83 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/function.html_options.php @@ -0,0 +1,118 @@ + + * Name: html_options
                                                    + * Input:
                                                    + * - name (optional) - string default "select" + * - values (required if no options supplied) - array + * - options (required if no values supplied) - associative array + * - selected (optional) - string default not set + * - output (required if not options supplied) - array + * Purpose: Prints the list of ' . "\n"; + foreach ($values as $key => $value) { + $optgroup_html .= smarty_function_html_options_optoutput($key, $value, $selected); + } + $optgroup_html .= "\n"; + return $optgroup_html; +} + +/* vim: set expandtab: */ + +?> diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/function.html_radios.php b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/function.html_radios.php new file mode 100644 index 00000000..f5052391 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/function.html_radios.php @@ -0,0 +1,138 @@ + + * Type: function
                                                    + * Name: html_radios
                                                    + * Date: 24.Feb.2003
                                                    + * Purpose: Prints out a list of radio input types
                                                    + * Input:
                                                    + * - name (optional) - string default "radio" + * - values (required) - array + * - options (optional) - associative array + * - checked (optional) - array default not set + * - separator (optional) - ie
                                                    or   + * - output (optional) - without this one the buttons don't have names + * Examples: + *
                                                    + * {html_radios values=$ids output=$names}
                                                    + * {html_radios values=$ids name='box' separator='
                                                    ' output=$names} + * {html_radios values=$ids checked=$checked separator='
                                                    ' output=$names} + *
                                                    + * @link http://smarty.php.net/manual/en/language.function.html.radios.php {html_radios} + * (Smarty online manual) + * @author Christopher Kvarme + * @author credits to Monte Ohrt + * @version 1.0 + * @param array + * @param Smarty + * @return string + * @uses smarty_function_escape_special_chars() + */ +function smarty_function_html_radios($params, &$smarty) +{ + require_once $smarty->_get_plugin_filepath('shared','escape_special_chars'); + + $name = 'radio'; + $values = null; + $options = null; + $selected = null; + $separator = ''; + $labels = true; + $output = null; + $extra = ''; + + foreach($params as $_key => $_val) { + switch($_key) { + case 'name': + case 'separator': + $$_key = (string)$_val; + break; + + case 'checked': + case 'selected': + if(is_array($_val)) { + $smarty->trigger_error('html_radios: the "' . $_key . '" attribute cannot be an array', E_USER_WARNING); + } else { + $selected = (string)$_val; + } + break; + + case 'labels': + $$_key = (bool)$_val; + break; + + case 'options': + $$_key = (array)$_val; + break; + + case 'values': + case 'output': + $$_key = array_values((array)$_val); + break; + + case 'radios': + $smarty->trigger_error('html_radios: the use of the "radios" attribute is deprecated, use "options" instead', E_USER_WARNING); + $options = (array)$_val; + break; + + + default: + if(!is_array($_val)) { + $extra .= ' '.$_key.'="'.smarty_function_escape_special_chars($_val).'"'; + } else { + $smarty->trigger_error("html_radios: extra attribute '$_key' cannot be an array", E_USER_NOTICE); + } + break; + } + } + + if (!isset($options) && !isset($values)) + return ''; /* raise error here? */ + + $_html_result = ''; + + if (isset($options) && is_array($options)) { + + foreach ((array)$options as $_key=>$_val) + $_html_result .= smarty_function_html_radios_output($name, $_key, $_val, $selected, $extra, $separator, $labels); + + } else { + + foreach ((array)$values as $_i=>$_key) { + $_val = isset($output[$_i]) ? $output[$_i] : ''; + $_html_result .= smarty_function_html_radios_output($name, $_key, $_val, $selected, $extra, $separator, $labels); + } + + } + + return $_html_result; + +} + +function smarty_function_html_radios_output($name, $value, $output, $selected, $extra, $separator, $labels) { + $_output = ''; + if ($labels) $_output .= ''; + $_output .= $separator . "\n"; + + return $_output; +} + +?> diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/function.html_select_date.php b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/function.html_select_date.php new file mode 100644 index 00000000..a607f555 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/function.html_select_date.php @@ -0,0 +1,243 @@ + + * Name: html_select_date
                                                    + * Purpose: Prints the dropdowns for date selection. + * + * ChangeLog:
                                                    + * - 1.0 initial release + * - 1.1 added support for +/- N syntax for begin + * and end year values. (Monte) + * - 1.2 added support for yyyy-mm-dd syntax for + * time value. (Jan Rosier) + * - 1.3 added support for choosing format for + * month values (Gary Loescher) + * - 1.3.1 added support for choosing format for + * day values (Marcus Bointon) + * @link http://smarty.php.net/manual/en/language.function.html.select.date.php {html_select_date} + * (Smarty online manual) + * @version 1.3 + * @author Andrei Zmievski + * @param array + * @param Smarty + * @return string + */ +function smarty_function_html_select_date($params, &$smarty) +{ + require_once $smarty->_get_plugin_filepath('shared','make_timestamp'); + require_once $smarty->_get_plugin_filepath('function','html_options'); + /* Default values. */ + $prefix = "Date_"; + $start_year = strftime("%Y"); + $end_year = $start_year; + $display_days = true; + $display_months = true; + $display_years = true; + $month_format = "%B"; + /* Write months as numbers by default GL */ + $month_value_format = "%m"; + $day_format = "%02d"; + /* Write day values using this format MB */ + $day_value_format = "%d"; + $year_as_text = false; + /* Display years in reverse order? Ie. 2000,1999,.... */ + $reverse_years = false; + /* Should the select boxes be part of an array when returned from PHP? + e.g. setting it to "birthday", would create "birthday[Day]", + "birthday[Month]" & "birthday[Year]". Can be combined with prefix */ + $field_array = null; + /* tags. + If not set, uses default dropdown. */ + $day_size = null; + $month_size = null; + $year_size = null; + /* Unparsed attributes common to *ALL* the tags. + An example might be in the template: all_extra ='class ="foo"'. */ + $all_extra = null; + /* Separate attributes for the tags. */ + $day_extra = null; + $month_extra = null; + $year_extra = null; + /* Order in which to display the fields. + "D" -> day, "M" -> month, "Y" -> year. */ + $field_order = 'MDY'; + /* String printed between the different fields. */ + $field_separator = "\n"; + $time = time(); + + + extract($params); + + // If $time is not in format yyyy-mm-dd + if (!preg_match('/^\d{4}-\d{2}-\d{2}$/', $time)) { + // then $time is empty or unix timestamp or mysql timestamp + // using smarty_make_timestamp to get an unix timestamp and + // strftime to make yyyy-mm-dd + $time = strftime('%Y-%m-%d', smarty_make_timestamp($time)); + } + // Now split this in pieces, which later can be used to set the select + $time = explode("-", $time); + + // make syntax "+N" or "-N" work with start_year and end_year + if (preg_match('!^(\+|\-)\s*(\d+)$!', $end_year, $match)) { + if ($match[1] == '+') { + $end_year = strftime('%Y') + $match[2]; + } else { + $end_year = strftime('%Y') - $match[2]; + } + } + if (preg_match('!^(\+|\-)\s*(\d+)$!', $start_year, $match)) { + if ($match[1] == '+') { + $start_year = strftime('%Y') + $match[2]; + } else { + $start_year = strftime('%Y') - $match[2]; + } + } + + $field_order = strtoupper($field_order); + + $html_result = $month_result = $day_result = $year_result = ""; + + if ($display_months) { + $month_names = array(); + $month_values = array(); + + for ($i = 1; $i <= 12; $i++) { + $month_names[] = strftime($month_format, mktime(0, 0, 0, $i, 1, 2000)); + $month_values[] = strftime($month_value_format, mktime(0, 0, 0, $i, 1, 2000)); + } + + $month_result .= ''; + } + + if ($display_days) { + $days = array(); + for ($i = 1; $i <= 31; $i++) { + $days[] = sprintf($day_format, $i); + $day_values[] = sprintf($day_value_format, $i); + } + + $day_result .= ''; + } + + if ($display_years) { + if (null !== $field_array){ + $year_name = $field_array . '[' . $prefix . 'Year]'; + } else { + $year_name = $prefix . 'Year'; + } + if ($year_as_text) { + $year_result .= ' $years, + 'values' => $years, + 'selected' => $time[0], + 'print_result' => false), + $smarty); + $year_result .= ''; + } + } + + // Loop thru the field_order field + for ($i = 0; $i <= 2; $i++){ + $c = substr($field_order, $i, 1); + switch ($c){ + case 'D': + $html_result .= $day_result; + break; + + case 'M': + $html_result .= $month_result; + break; + + case 'Y': + $html_result .= $year_result; + break; + } + // Add the field seperator + if($i != 2) { + $html_result .= $field_separator; + } + } + + return $html_result; +} + +/* vim: set expandtab: */ + +?> diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/function.html_select_time.php b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/function.html_select_time.php new file mode 100644 index 00000000..4643136b --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/function.html_select_time.php @@ -0,0 +1,163 @@ + + * Name: html_select_time
                                                    + * Purpose: Prints the dropdowns for time selection + * @link http://smarty.php.net/manual/en/language.function.html.select.time.php {html_select_time} + * (Smarty online manual) + * @param array + * @param Smarty + * @return string + * @uses smarty_make_timestamp() + */ +function smarty_function_html_select_time($params, &$smarty) +{ + require_once $smarty->_get_plugin_filepath('shared','make_timestamp'); + require_once $smarty->_get_plugin_filepath('function','html_options'); + /* Default values. */ + $prefix = "Time_"; + $time = time(); + $display_hours = true; + $display_minutes = true; + $display_seconds = true; + $display_meridian = true; + $use_24_hours = true; + $minute_interval = 1; + $second_interval = 1; + /* Should the select boxes be part of an array when returned from PHP? + e.g. setting it to "birthday", would create "birthday[Hour]", + "birthday[Minute]", "birthday[Seconds]" & "birthday[Meridian]". + Can be combined with prefix. */ + $field_array = null; + $all_extra = null; + $hour_extra = null; + $minute_extra = null; + $second_extra = null; + $meridian_extra = null; + + extract($params); + + $time = smarty_make_timestamp($time); + + $html_result = ''; + + if ($display_hours) { + $hours = $use_24_hours ? range(0, 23) : range(1, 12); + $hour_fmt = $use_24_hours ? '%H' : '%I'; + for ($i = 0, $for_max = count($hours); $i < $for_max; $i++) + $hours[$i] = sprintf('%02d', $hours[$i]); + $html_result .= '\n"; + } + + if ($display_minutes) { + $all_minutes = range(0, 59); + for ($i = 0, $for_max = count($all_minutes); $i < $for_max; $i+= $minute_interval) + $minutes[] = sprintf('%02d', $all_minutes[$i]); + $selected = intval(floor(strftime('%M', $time) / $minute_interval) * $minute_interval); + $html_result .= '\n"; + } + + if ($display_seconds) { + $all_seconds = range(0, 59); + for ($i = 0, $for_max = count($all_seconds); $i < $for_max; $i+= $second_interval) + $seconds[] = sprintf('%02d', $all_seconds[$i]); + $selected = intval(floor(strftime('%S', $time) / $second_interval) * $second_interval); + $html_result .= '\n"; + } + + if ($display_meridian && !$use_24_hours) { + $html_result .= '\n"; + } + + return $html_result; +} + +/* vim: set expandtab: */ + +?> diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/function.html_table.php b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/function.html_table.php new file mode 100644 index 00000000..ece9c8c5 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/function.html_table.php @@ -0,0 +1,113 @@ + + * Name: html_table
                                                    + * Date: Feb 17, 2003
                                                    + * Purpose: make an html table from an array of data
                                                    + * Input:
                                                    + * - loop = array to loop through + * - cols = number of columns + * - rows = number of rows + * - table_attr = table attributes + * - tr_attr = table row attributes (arrays are cycled) + * - td_attr = table cell attributes (arrays are cycled) + * - trailpad = value to pad trailing cells with + * - vdir = vertical direction (default: "down", means top-to-bottom) + * - hdir = horizontal direction (default: "right", means left-to-right) + * - inner = inner loop (default "cols": print $loop line by line, + * $loop will be printed column by column otherwise) + * + * + * Examples: + *
                                                    + * {table loop=$data}
                                                    + * {table loop=$data cols=4 tr_attr='"bgcolor=red"'}
                                                    + * {table loop=$data cols=4 tr_attr=$colors}
                                                    + * 
                                                    + * @author Monte Ohrt + * @version 1.0 + * @link http://smarty.php.net/manual/en/language.function.html.table.php {html_table} + * (Smarty online manual) + * @param array + * @param Smarty + * @return string + */ +function smarty_function_html_table($params, &$smarty) +{ + $table_attr = 'border="1"'; + $tr_attr = ''; + $td_attr = ''; + $cols = 3; + $rows = 3; + $trailpad = ' '; + $vdir = 'down'; + $hdir = 'right'; + $inner = 'cols'; + + extract($params); + + if (!isset($loop)) { + $smarty->trigger_error("html_table: missing 'loop' parameter"); + return; + } + + $loop_count = count($loop); + if (empty($params['rows'])) { + /* no rows specified */ + $rows = ceil($loop_count/$cols); + } elseif (empty($params['cols'])) { + if (!empty($params['rows'])) { + /* no cols specified, but rows */ + $cols = ceil($loop_count/$rows); + } + } + + $output = "\n"; + + for ($r=0; $r<$rows; $r++) { + $output .= "\n"; + $rx = ($vdir == 'down') ? $r*$cols : ($rows-1-$r)*$cols; + + for ($c=0; $c<$cols; $c++) { + $x = ($hdir == 'right') ? $rx+$c : $rx+$cols-1-$c; + if ($inner!='cols') { + /* shuffle x to loop over rows*/ + $x = floor($x/$cols) + ($x%$cols)*$rows; + } + + if ($x<$loop_count) { + $output .= "" . $loop[$x] . "\n"; + } else { + $output .= "$trailpad\n"; + } + } + $output .= "\n"; + } + $output .= "
                                                    \n"; + + return $output; +} + +function smarty_function_html_table_cycle($name, $var, $no) { + if(!is_array($var)) { + $ret = $var; + } else { + $ret = $var[$no % count($var)]; + } + + return ($ret) ? ' '.$ret : ''; +} + + +/* vim: set expandtab: */ + +?> diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/function.mailto.php b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/function.mailto.php new file mode 100644 index 00000000..9273ba39 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/function.mailto.php @@ -0,0 +1,140 @@ + + * Name: mailto
                                                    + * Date: May 21, 2002 + * Purpose: automate mailto address link creation, and optionally + * encode them.
                                                    + * Input:
                                                    + * - address = e-mail address + * - text = (optional) text to display, default is address + * - encode = (optional) can be one of: + * * none : no encoding (default) + * * javascript : encode with javascript + * * hex : encode with hexidecimal (no javascript) + * - cc = (optional) address(es) to carbon copy + * - bcc = (optional) address(es) to blind carbon copy + * - subject = (optional) e-mail subject + * - newsgroups = (optional) newsgroup(s) to post to + * - followupto = (optional) address(es) to follow up to + * - extra = (optional) extra tags for the href link + * + * Examples: + *
                                                    + * {mailto address="me@domain.com"}
                                                    + * {mailto address="me@domain.com" encode="javascript"}
                                                    + * {mailto address="me@domain.com" encode="hex"}
                                                    + * {mailto address="me@domain.com" subject="Hello to you!"}
                                                    + * {mailto address="me@domain.com" cc="you@domain.com,they@domain.com"}
                                                    + * {mailto address="me@domain.com" extra='class="mailto"'}
                                                    + * 
                                                    + * @link http://smarty.php.net/manual/en/language.function.mailto.php {mailto} + * (Smarty online manual) + * @version 1.2 + * @author Monte Ohrt + * @author credits to Jason Sweat (added cc, bcc and subject functionality) + * @param array + * @param Smarty + * @return string + */ +function smarty_function_mailto($params, &$smarty) +{ + $extra = ''; + extract($params); + + if (empty($address)) { + $smarty->trigger_error("mailto: missing 'address' parameter"); + return; + } + + if (empty($text)) { + $text = $address; + } + + // netscape and mozilla do not decode %40 (@) in BCC field (bug?) + // so, don't encode it. + + $mail_parms = array(); + if (!empty($cc)) { + $mail_parms[] = 'cc='.str_replace('%40','@',rawurlencode($cc)); + } + + if (!empty($bcc)) { + $mail_parms[] = 'bcc='.str_replace('%40','@',rawurlencode($bcc)); + } + + if (!empty($subject)) { + $mail_parms[] = 'subject='.rawurlencode($subject); + } + + if (!empty($newsgroups)) { + $mail_parms[] = 'newsgroups='.rawurlencode($newsgroups); + } + + if (!empty($followupto)) { + $mail_parms[] = 'followupto='.str_replace('%40','@',rawurlencode($followupto)); + } + + $mail_parm_vals = ''; + for ($i=0; $itrigger_error("mailto: 'encode' parameter must be none, javascript or hex"); + return; + } + + if ($encode == 'javascript' ) { + $string = 'document.write(\''.$text.'\');'; + + for ($x=0; $x < strlen($string); $x++) { + $js_encode .= '%' . bin2hex($string[$x]); + } + + return ''; + + } elseif ($encode == 'hex') { + + preg_match('!^(.*)(\?.*)$!',$address,$match); + if(!empty($match[2])) { + $smarty->trigger_error("mailto: hex encoding does not work with extra attributes. Try javascript."); + return; + } + for ($x=0; $x < strlen($address); $x++) { + if(preg_match('!\w!',$address[$x])) { + $address_encode .= '%' . bin2hex($address[$x]); + } else { + $address_encode .= $address[$x]; + } + } + for ($x=0; $x < strlen($text); $x++) { + $text_encode .= '&#x' . bin2hex($text[$x]).';'; + } + + return ''.$text_encode.''; + + } else { + // no encoding + return ''.$text.''; + + } + +} + +/* vim: set expandtab: */ + +?> diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/function.math.php b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/function.math.php new file mode 100644 index 00000000..d2b5d829 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/function.math.php @@ -0,0 +1,82 @@ + + * Name: math
                                                    + * Purpose: handle math computations in template
                                                    + * @link http://smarty.php.net/manual/en/language.function.math.php {math} + * (Smarty online manual) + * @param array + * @param Smarty + * @return string + */ +function smarty_function_math($params, &$smarty) +{ + // be sure equation parameter is present + if (empty($params['equation'])) { + $smarty->trigger_error("math: missing equation parameter"); + return; + } + + $equation = $params['equation']; + + // make sure parenthesis are balanced + if (substr_count($equation,"(") != substr_count($equation,")")) { + $smarty->trigger_error("math: unbalanced parenthesis"); + return; + } + + // match all vars in equation, make sure all are passed + preg_match_all("!\!(0x)([a-zA-Z][a-zA-Z0-9_]*)!",$equation, $match); + $allowed_funcs = array('int','abs','ceil','cos','exp','floor','log','log10', + 'max','min','pi','pow','rand','round','sin','sqrt','srand','tan'); + foreach($match[2] as $curr_var) { + if (!in_array($curr_var,array_keys($params)) && !in_array($curr_var, $allowed_funcs)) { + $smarty->trigger_error("math: parameter $curr_var not passed as argument"); + return; + } + } + + foreach($params as $key => $val) { + if ($key != "equation" && $key != "format" && $key != "assign") { + // make sure value is not empty + if (strlen($val)==0) { + $smarty->trigger_error("math: parameter $key is empty"); + return; + } + if (!is_numeric($val)) { + $smarty->trigger_error("math: parameter $key: is not numeric"); + return; + } + $equation = preg_replace("/\b$key\b/",$val, $equation); + } + } + + eval("\$smarty_math_result = ".$equation.";"); + + if (empty($params['format'])) { + if (empty($params['assign'])) { + return $smarty_math_result; + } else { + $smarty->assign($params['assign'],$smarty_math_result); + } + } else { + if (empty($params['assign'])){ + printf($params['format'],$smarty_math_result); + } else { + $smarty->assign($params['assign'],sprintf($params['format'],$smarty_math_result)); + } + } +} + +/* vim: set expandtab: */ + +?> diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/function.popup.php b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/function.popup.php new file mode 100644 index 00000000..0eb4fcb3 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/function.popup.php @@ -0,0 +1,87 @@ + + * Name: popup
                                                    + * Purpose: make text pop up in windows via overlib + * @link http://smarty.php.net/manual/en/language.function.popup.php {popup} + * (Smarty online manual) + * @param array + * @param Smarty + * @return string + */ +function smarty_function_popup($params, &$smarty) +{ + extract($params); + + if (empty($text) && !isset($inarray) && empty($function)) { + $smarty->trigger_error("overlib: attribute 'text' or 'inarray' or 'function' required"); + return false; + } + + if (empty($trigger)) { $trigger = "onmouseover"; } + + $retval = $trigger . '="return overlib(\''.preg_replace(array("!'!","![\r\n]!"),array("\'",'\r'),$text).'\''; + if ($sticky) { $retval .= ",STICKY"; } + if (!empty($caption)) { $retval .= ",CAPTION,'".str_replace("'","\'",$caption)."'"; } + if (!empty($fgcolor)) { $retval .= ",FGCOLOR,'$fgcolor'"; } + if (!empty($bgcolor)) { $retval .= ",BGCOLOR,'$bgcolor'"; } + if (!empty($textcolor)) { $retval .= ",TEXTCOLOR,'$textcolor'"; } + if (!empty($capcolor)) { $retval .= ",CAPCOLOR,'$capcolor'"; } + if (!empty($closecolor)) { $retval .= ",CLOSECOLOR,'$closecolor'"; } + if (!empty($textfont)) { $retval .= ",TEXTFONT,'$textfont'"; } + if (!empty($captionfont)) { $retval .= ",CAPTIONFONT,'$captionfont'"; } + if (!empty($closefont)) { $retval .= ",CLOSEFONT,'$closefont'"; } + if (!empty($textsize)) { $retval .= ",TEXTSIZE,$textsize"; } + if (!empty($captionsize)) { $retval .= ",CAPTIONSIZE,$captionsize"; } + if (!empty($closesize)) { $retval .= ",CLOSESIZE,$closesize"; } + if (!empty($width)) { $retval .= ",WIDTH,$width"; } + if (!empty($height)) { $retval .= ",HEIGHT,$height"; } + if (!empty($left)) { $retval .= ",LEFT"; } + if (!empty($right)) { $retval .= ",RIGHT"; } + if (!empty($center)) { $retval .= ",CENTER"; } + if (!empty($above)) { $retval .= ",ABOVE"; } + if (!empty($below)) { $retval .= ",BELOW"; } + if (isset($border)) { $retval .= ",BORDER,$border"; } + if (isset($offsetx)) { $retval .= ",OFFSETX,$offsetx"; } + if (isset($offsety)) { $retval .= ",OFFSETY,$offsety"; } + if (!empty($fgbackground)) { $retval .= ",FGBACKGROUND,'$fgbackground'"; } + if (!empty($bgbackground)) { $retval .= ",BGBACKGROUND,'$bgbackground'"; } + if (!empty($closetext)) { $retval .= ",CLOSETEXT,'".str_replace("'","\'",$closetext)."'"; } + if (!empty($noclose)) { $retval .= ",NOCLOSE"; } + if (!empty($status)) { $retval .= ",STATUS,'".str_replace("'","\'",$status)."'"; } + if (!empty($autostatus)) { $retval .= ",AUTOSTATUS"; } + if (!empty($autostatuscap)) { $retval .= ",AUTOSTATUSCAP"; } + if (isset($inarray)) { $retval .= ",INARRAY,'$inarray'"; } + if (isset($caparray)) { $retval .= ",CAPARRAY,'$caparray'"; } + if (!empty($capicon)) { $retval .= ",CAPICON,'$capicon'"; } + if (!empty($snapx)) { $retval .= ",SNAPX,$snapx"; } + if (!empty($snapy)) { $retval .= ",SNAPY,$snapy"; } + if (isset($fixx)) { $retval .= ",FIXX,$fixx"; } + if (isset($fixy)) { $retval .= ",FIXY,$fixy"; } + if (!empty($background)) { $retval .= ",BACKGROUND,'$background'"; } + if (!empty($padx)) { $retval .= ",PADX,$padx"; } + if (!empty($pady)) { $retval .= ",PADY,$pady"; } + if (!empty($fullhtml)) { $retval .= ",FULLHTML"; } + if (!empty($frame)) { $retval .= ",FRAME,'$frame'"; } + if (isset($timeout)) { $retval .= ",TIMEOUT,$timeout"; } + if (!empty($function)) { $retval .= ",FUNCTION,'$function'"; } + if (isset($delay)) { $retval .= ",DELAY,$delay"; } + if (!empty($hauto)) { $retval .= ",HAUTO"; } + if (!empty($vauto)) { $retval .= ",VAUTO"; } + $retval .= ');" onmouseout="nd();"'; + + return $retval; +} + +/* vim: set expandtab: */ + +?> diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/function.popup_init.php b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/function.popup_init.php new file mode 100644 index 00000000..e06de696 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/function.popup_init.php @@ -0,0 +1,39 @@ + + * Name: popup_init
                                                    + * Purpose: initialize overlib + * @link http://smarty.php.net/manual/en/language.function.popup.init.php {popup_init} + * (Smarty online manual) + * @param array + * @param Smarty + * @return string + */ +function smarty_function_popup_init($params, &$smarty) +{ + $zindex = 1000; + + if (!empty($params['zindex'])) { + $zindex = $params['zindex']; + } + + if (!empty($params['src'])) { + return '' . "\n" + . '' . "\n"; + } else { + $smarty->trigger_error("popup_init: missing src parameter"); + } +} + +/* vim: set expandtab: */ + +?> diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/function.var_dump.php b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/function.var_dump.php new file mode 100644 index 00000000..382032c1 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/function.var_dump.php @@ -0,0 +1,20 @@ +',$params,'
                                                '); +} + +/* vim: set expandtab: */ + +?> diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.capitalize.php b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.capitalize.php new file mode 100644 index 00000000..464d5f84 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.capitalize.php @@ -0,0 +1,25 @@ + + * Name: capitalize
                                                + * Purpose: capitalize words in the string + * @link http://smarty.php.net/manual/en/language.modifiers.php#LANGUAGE.MODIFIER.CAPITALIZE + * capitalize (Smarty online manual) + * @param string + * @return string + */ +function smarty_modifier_capitalize($string) +{ + return ucwords($string); +} + +?> diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.cat.php b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.cat.php new file mode 100644 index 00000000..176ee7ae --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.cat.php @@ -0,0 +1,33 @@ + + * Name: cat
                                                + * Date: Feb 24, 2003 + * Purpose: catenate a value to a variable + * Input: string to catenate + * Example: {$var|cat:"foo"} + * @link http://smarty.php.net/manual/en/language.modifier.cat.php cat + * (Smarty online manual) + * @author Monte Ohrt + * @version 1.0 + * @param string + * @param string + * @return string + */ +function smarty_modifier_cat($string, $cat) +{ + return $string . $cat; +} + +/* vim: set expandtab: */ + +?> diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.count_characters.php b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.count_characters.php new file mode 100644 index 00000000..2fb7c898 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.count_characters.php @@ -0,0 +1,31 @@ + + * Name: count_characteres
                                                + * Purpose: count the number of characters in a text + * @link http://smarty.php.net/manual/en/language.modifier.count.characters.php + * count_characters (Smarty online manual) + * @param string + * @param boolean include whitespace in the character count + * @return integer + */ +function smarty_modifier_count_characters($string, $include_spaces = false) +{ + if ($include_spaces) + return(strlen($string)); + + return preg_match_all("/[^\s]/",$string, $match); +} + +/* vim: set expandtab: */ + +?> diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.count_paragraphs.php b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.count_paragraphs.php new file mode 100644 index 00000000..5f6278fe --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.count_paragraphs.php @@ -0,0 +1,28 @@ + + * Name: count_paragraphs
                                                + * Purpose: count the number of paragraphs in a text + * @link http://smarty.php.net/manual/en/language.modifier.count.paragraphs.php + * count_paragraphs (Smarty online manual) + * @param string + * @return integer + */ +function smarty_modifier_count_paragraphs($string) +{ + // count \r or \n characters + return count(preg_split('/[\r\n]+/', $string)); +} + +/* vim: set expandtab: */ + +?> diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.count_sentences.php b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.count_sentences.php new file mode 100644 index 00000000..2f3ba65e --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.count_sentences.php @@ -0,0 +1,28 @@ + + * Name: count_sentences + * Purpose: count the number of sentences in a text + * @link http://smarty.php.net/manual/en/language.modifier.count.paragraphs.php + * count_sentences (Smarty online manual) + * @param string + * @return integer + */ +function smarty_modifier_count_sentences($string) +{ + // find periods with a word before but not after. + return preg_match_all('/[^\s]\.(?!\w)/', $string, $match); +} + +/* vim: set expandtab: */ + +?> diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.count_words.php b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.count_words.php new file mode 100644 index 00000000..a686e4b4 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.count_words.php @@ -0,0 +1,32 @@ + + * Name: count_words
                                                + * Purpose: count the number of words in a text + * @link http://smarty.php.net/manual/en/language.modifier.count.words.php + * count_words (Smarty online manual) + * @param string + * @return integer + */ +function smarty_modifier_count_words($string) +{ + // split text by ' ',\r,\n,\f,\t + $split_array = preg_split('/\s+/',$string); + // count matches that contain alphanumerics + $word_count = preg_grep('/[a-zA-Z0-9\\x80-\\xff]/', $split_array); + + return count($word_count); +} + +/* vim: set expandtab: */ + +?> diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.date_format.php b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.date_format.php new file mode 100644 index 00000000..ab7e9045 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.date_format.php @@ -0,0 +1,43 @@ +_get_plugin_filepath('shared','make_timestamp'); +/** + * Smarty date_format modifier plugin + * + * Type: modifier
                                                + * Name: date_format
                                                + * Purpose: format datestamps via strftime
                                                + * Input:
                                                + * - string: input date string + * - format: strftime format for output + * - default_date: default date if $string is empty + * @link http://smarty.php.net/manual/en/language.modifier.date.format.php + * date_format (Smarty online manual) + * @param string + * @param string + * @param string + * @return string|void + * @uses smarty_make_timestamp() + */ +function smarty_modifier_date_format($string, $format="%b %e, %Y", $default_date=null) +{ + if($string != '') { + return strftime($format, smarty_make_timestamp($string)); + } elseif (isset($default_date) && $default_date != '') { + return strftime($format, smarty_make_timestamp($default_date)); + } else { + return; + } +} + +/* vim: set expandtab: */ + +?> diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.debug_print_var.php b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.debug_print_var.php new file mode 100644 index 00000000..3158df00 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.debug_print_var.php @@ -0,0 +1,57 @@ + + * Name: debug_print_var
                                                + * Purpose: formats variable contents for display in the console + * @link http://smarty.php.net/manual/en/language.modifier.debug.print.var.php + * debug_print_var (Smarty online manual) + * @param array|object + * @param integer + * @param integer + * @return string + */ +function smarty_modifier_debug_print_var($var, $depth = 0, $length = 40) +{ + $_replace = array("\n"=>'\n', "\r"=>'\r', "\t"=>'\t'); + if (is_array($var)) { + $results = "Array (".count($var).")"; + foreach ($var as $curr_key => $curr_val) { + $return = smarty_modifier_debug_print_var($curr_val, $depth+1, $length); + $results .= "
                                                ".str_repeat(' ', $depth*2)."".strtr($curr_key, $_replace)." => $return"; + } + return $results; + } else if (is_object($var)) { + $object_vars = get_object_vars($var); + $results = "".get_class($var)." Object (".count($object_vars).")"; + foreach ($object_vars as $curr_key => $curr_val) { + $return = smarty_modifier_debug_print_var($curr_val, $depth+1, $length); + $results .= "
                                                ".str_repeat(' ', $depth*2)."$curr_key => $return"; + } + return $results; + } else { + if (empty($var) && $var != "0") { + return 'empty'; + } + if (strlen($var) > $length ) { + $results = substr($var, 0, $length-3).'...'; + } else { + $results = $var; + } + $results = htmlspecialchars($results); + $results = strtr($results, $_replace); + return $results; + } +} + +/* vim: set expandtab: */ + +?> diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.default.php b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.default.php new file mode 100644 index 00000000..4f1f800a --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.default.php @@ -0,0 +1,31 @@ + + * Name: default
                                                + * Purpose: designate default value for empty variables + * @link http://smarty.php.net/manual/en/language.modifier.default.php + * default (Smarty online manual) + * @param string + * @param string + * @return string + */ +function smarty_modifier_default($string, $default = '') +{ + if (!isset($string) || $string === '') + return $default; + else + return $string; +} + +/* vim: set expandtab: */ + +?> diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.escape.php b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.escape.php new file mode 100644 index 00000000..dc5ebc6f --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.escape.php @@ -0,0 +1,63 @@ + + * Name: escape
                                                + * Purpose: Escape the string according to escapement type + * @link http://smarty.php.net/manual/en/language.modifier.escape.php + * escape (Smarty online manual) + * @param string + * @param html|htmlall|url|quotes|hex|hexentity|javascript + * @return string + */ +function smarty_modifier_escape($string, $esc_type = 'html') +{ + switch ($esc_type) { + case 'html': + return htmlspecialchars($string, ENT_QUOTES); + + case 'htmlall': + return htmlentities($string, ENT_QUOTES); + + case 'url': + return urlencode($string); + + case 'quotes': + // escape unescaped single quotes + return preg_replace("%(?'\\\\',"'"=>"\\'",'"'=>'\\"',"\r"=>'\\r',"\n"=>'\\n')); + + default: + return $string; + } +} + +/* vim: set expandtab: */ + +?> diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.htmlentities.php b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.htmlentities.php new file mode 100644 index 00000000..72dcf7de --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.htmlentities.php @@ -0,0 +1,18 @@ + diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.indent.php b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.indent.php new file mode 100644 index 00000000..4a8b81c7 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.indent.php @@ -0,0 +1,27 @@ + + * Name: indent
                                                + * Purpose: indent lines of text + * @link http://smarty.php.net/manual/en/language.modifier.indent.php + * indent (Smarty online manual) + * @param string + * @param integer + * @param string + * @return string + */ +function smarty_modifier_indent($string,$chars=4,$char=" ") +{ + return preg_replace('!^!m',str_repeat($char,$chars),$string); +} + +?> diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.lower.php b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.lower.php new file mode 100644 index 00000000..fecb7168 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.lower.php @@ -0,0 +1,25 @@ + + * Name: lower
                                                + * Purpose: convert string to lowercase + * @link http://smarty.php.net/manual/en/language.modifier.lower.php + * lower (Smarty online manual) + * @param string + * @return string + */ +function smarty_modifier_lower($string) +{ + return strtolower($string); +} + +?> diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.nl2br.php b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.nl2br.php new file mode 100644 index 00000000..2a5f238b --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.nl2br.php @@ -0,0 +1,35 @@ + + * Name: nl2br
                                                + * Date: Feb 26, 2003 + * Purpose: convert \r\n, \r or \n to <
                                                > + * Input:
                                                + * - contents = contents to replace + * - preceed_test = if true, includes preceeding break tags + * in replacement + * Example: {$text|nl2br} + * @link http://smarty.php.net/manual/en/language.modifier.nl2br.php + * nl2br (Smarty online manual) + * @version 1.0 + * @author Monte Ohrt + * @param string + * @return string + */ +function smarty_modifier_nl2br($string) +{ + return nl2br($string); +} + +/* vim: set expandtab: */ + +?> diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.rawurlencode.php b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.rawurlencode.php new file mode 100644 index 00000000..d2d5e813 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.rawurlencode.php @@ -0,0 +1,18 @@ + diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.regex_replace.php b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.regex_replace.php new file mode 100644 index 00000000..a467dfba --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.regex_replace.php @@ -0,0 +1,29 @@ + + * Name: regex_replace
                                                + * Purpose: regular epxression search/replace + * @link http://smarty.php.net/manual/en/language.modifier.regex.replace.php + * regex_replace (Smarty online manual) + * @param string + * @param string|array + * @param string|array + * @return string + */ +function smarty_modifier_regex_replace($string, $search, $replace) +{ + return preg_replace($search, $replace, $string); +} + +/* vim: set expandtab: */ + +?> diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.replace.php b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.replace.php new file mode 100644 index 00000000..590e11b4 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.replace.php @@ -0,0 +1,29 @@ + + * Name: replace
                                                + * Purpose: simple search/replace + * @link http://smarty.php.net/manual/en/language.modifier.replace.php + * replace (Smarty online manual) + * @param string + * @param string + * @param string + * @return string + */ +function smarty_modifier_replace($string, $search, $replace) +{ + return str_replace($search, $replace, $string); +} + +/* vim: set expandtab: */ + +?> diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.spacify.php b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.spacify.php new file mode 100644 index 00000000..bcc5f941 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.spacify.php @@ -0,0 +1,29 @@ + + * Name: spacify
                                                + * Purpose: add spaces between characters in a string + * @link http://smarty.php.net/manual/en/language.modifier.spacify.php + * spacify (Smarty online manual) + * @param string + * @param string + * @return string + */ +function smarty_modifier_spacify($string, $spacify_char = ' ') +{ + return implode($spacify_char, + preg_split('//', $string, -1, PREG_SPLIT_NO_EMPTY)); +} + +/* vim: set expandtab: */ + +?> diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.string_format.php b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.string_format.php new file mode 100644 index 00000000..49903137 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.string_format.php @@ -0,0 +1,28 @@ + + * Name: string_format
                                                + * Purpose: format strings via sprintf + * @link http://smarty.php.net/manual/en/language.modifier.string.format.php + * string_format (Smarty online manual) + * @param string + * @param string + * @return string + */ +function smarty_modifier_string_format($string, $format) +{ + return sprintf($format, $string); +} + +/* vim: set expandtab: */ + +?> diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.strip.php b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.strip.php new file mode 100644 index 00000000..fc675582 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.strip.php @@ -0,0 +1,33 @@ + + * Name: strip
                                                + * Purpose: Replace all repeated spaces, newlines, tabs + * with a single space or supplied replacement string.
                                                + * Example: {$var|strip} {$var|strip:" "} + * Date: September 25th, 2002 + * @link http://smarty.php.net/manual/en/language.modifier.strip.php + * strip (Smarty online manual) + * @author Monte Ohrt + * @version 1.0 + * @param string + * @param string + * @return string + */ +function smarty_modifier_strip($text, $replace = ' ') +{ + return preg_replace('!\s+!', $replace, $text); +} + +/* vim: set expandtab: */ + +?> diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.strip_tags.php b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.strip_tags.php new file mode 100644 index 00000000..516a87fc --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.strip_tags.php @@ -0,0 +1,31 @@ + + * Name: strip_tags
                                                + * Purpose: strip html tags from text + * @link http://smarty.php.net/manual/en/language.modifier.strip.tags.php + * strip_tags (Smarty online manual) + * @param string + * @param boolean + * @return string + */ +function smarty_modifier_strip_tags($string, $replace_with_space = true) +{ + if ($replace_with_space) + return preg_replace('!<[^>]*?>!', ' ', $string); + else + return strip_tags($string); +} + +/* vim: set expandtab: */ + +?> diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.truncate.php b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.truncate.php new file mode 100644 index 00000000..775a20e8 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.truncate.php @@ -0,0 +1,43 @@ + + * Name: truncate
                                                + * Purpose: Truncate a string to a certain length if necessary, + * optionally splitting in the middle of a word, and + * appending the $etc string. + * @link http://smarty.php.net/manual/en/language.modifier.truncate.php + * truncate (Smarty online manual) + * @param string + * @param integer + * @param string + * @param boolean + * @return string + */ +function smarty_modifier_truncate($string, $length = 80, $etc = '...', + $break_words = false) +{ + if ($length == 0) + return ''; + + if (strlen($string) > $length) { + $length -= strlen($etc); + if (!$break_words) + $string = preg_replace('/\s+?(\S+)?$/', '', substr($string, 0, $length+1)); + + return substr($string, 0, $length).$etc; + } else + return $string; +} + +/* vim: set expandtab: */ + +?> diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.upper.php b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.upper.php new file mode 100644 index 00000000..899f6bb9 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.upper.php @@ -0,0 +1,25 @@ + + * Name: upper
                                                + * Purpose: convert string to uppercase + * @link http://smarty.php.net/manual/en/language.modifier.upper.php + * upper (Smarty online manual) + * @param string + * @return string + */ +function smarty_modifier_upper($string) +{ + return strtoupper($string); +} + +?> diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.wordwrap.php b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.wordwrap.php new file mode 100644 index 00000000..fe4407fc --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/modifier.wordwrap.php @@ -0,0 +1,28 @@ + + * Name: wordwrap
                                                + * Purpose: wrap a string of text at a given length + * @link http://smarty.php.net/manual/en/language.modifier.wordwrap.php + * wordwrap (Smarty online manual) + * @param string + * @param integer + * @param string + * @param boolean + * @return string + */ +function smarty_modifier_wordwrap($string,$length=80,$break="\n",$cut=false) +{ + return wordwrap($string,$length,$break,$cut); +} + +?> diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/outputfilter.trimwhitespace.php b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/outputfilter.trimwhitespace.php new file mode 100644 index 00000000..1fa5fe17 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/outputfilter.trimwhitespace.php @@ -0,0 +1,75 @@ + + * Type: outputfilter
                                                + * Name: trimwhitespace
                                                + * Date: Jan 25, 2003
                                                + * Purpose: trim leading white space and blank lines from + * template source after it gets interpreted, cleaning + * up code and saving bandwidth. Does not affect + * <
                                                >
                                                and blocks.
                                                + * Install: Drop into the plugin directory, call + * $smarty->load_filter('output','trimwhitespace'); + * from application. + * @author Monte Ohrt + * @author Contributions from Lars Noschinski + * @version 1.3 + * @param string + * @param Smarty + */ + function smarty_outputfilter_trimwhitespace($source, &$smarty) + { + // Pull out the script blocks + preg_match_all("!]+>.*?!is", $source, $match); + $_script_blocks = $match[0]; + $source = preg_replace("!]+>.*?!is", + '@@@SMARTY:TRIM:SCRIPT@@@', $source); + + // Pull out the pre blocks + preg_match_all("!
                                                .*?
                                                !is", $source, $match); + $_pre_blocks = $match[0]; + $source = preg_replace("!
                                                .*?
                                                !is", + '@@@SMARTY:TRIM:PRE@@@', $source); + + // Pull out the textarea blocks + preg_match_all("!]+>.*?!is", $source, $match); + $_textarea_blocks = $match[0]; + $source = preg_replace("!]+>.*?!is", + '@@@SMARTY:TRIM:TEXTAREA@@@', $source); + + // remove all leading spaces, tabs and carriage returns NOT + // preceeded by a php close tag. + $source = trim(preg_replace('/((?)\n)[\s]+/m', '\1', $source)); + + // replace script blocks + smarty_outputfilter_trimwhitespace_replace("@@@SMARTY:TRIM:SCRIPT@@@",$_script_blocks, $source); + + // replace pre blocks + smarty_outputfilter_trimwhitespace_replace("@@@SMARTY:TRIM:PRE@@@",$_pre_blocks, $source); + + // replace textarea blocks + smarty_outputfilter_trimwhitespace_replace("@@@SMARTY:TRIM:TEXTAREA@@@",$_textarea_blocks, $source); + + return $source; + } + +function smarty_outputfilter_trimwhitespace_replace($search_str, $replace, &$subject) { + $_len = strlen($search_str); + $_pos = 0; + for ($_i=0, $_count=count($replace); $_i<$_count; $_i++) + if (($_pos=strpos($subject, $search_str, $_pos))!==false) + $subject = substr_replace($subject, $replace[$_i], $_pos, $_len); + else + break; + +} + +?> diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/shared.escape_special_chars.php b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/shared.escape_special_chars.php new file mode 100644 index 00000000..72b8a48c --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/shared.escape_special_chars.php @@ -0,0 +1,30 @@ + + * Purpose: used by other smarty functions to escape + * special chars except for already escaped ones + * @param string + * @return string + */ +function smarty_function_escape_special_chars($string) +{ + if(!is_array($string)) { + $string = preg_replace('!&(#?\w+);!', '%%%SMARTY_START%%%\\1%%%SMARTY_END%%%', $string); + $string = htmlspecialchars($string); + $string = str_replace(array('%%%SMARTY_START%%%','%%%SMARTY_END%%%'), array('&',';'), $string); + } + return $string; +} + +/* vim: set expandtab: */ + +?> diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/shared.make_timestamp.php b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/shared.make_timestamp.php new file mode 100644 index 00000000..25c7f5c8 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/libs/plugins/shared.make_timestamp.php @@ -0,0 +1,43 @@ + + * Purpose: used by other smarty functions to make a timestamp + * from a string. + * @param string + * @return string + */ +function smarty_make_timestamp($string) +{ + if(empty($string)) { + $string = "now"; + } + $time = strtotime($string); + if (is_numeric($time) && $time != -1) + return $time; + + // is mysql timestamp format of YYYYMMDDHHMMSS? + if (preg_match('/^\d{14}$/', $string)) { + $time = mktime(substr($string,8,2),substr($string,10,2),substr($string,12,2), + substr($string,4,2),substr($string,6,2),substr($string,0,4)); + + return $time; + } + + // couldn't recognize it, try to return a time + $time = (int) $string; + if ($time > 0) + return $time; + else + return time(); +} + +/* vim: set expandtab: */ + +?> diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/misc/smarty_icon.README b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/misc/smarty_icon.README new file mode 100644 index 00000000..bea956fc --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/misc/smarty_icon.README @@ -0,0 +1,6 @@ +Feel free to put the smarty icon on your site. +You can cut-and-paste the following code, be sure +to adjust the path to the image: + + + diff --git a/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/misc/smarty_icon.gif b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/misc/smarty_icon.gif new file mode 100644 index 00000000..5d519699 Binary files /dev/null and b/buildscripts/PhpDocumentor/phpDocumentor/Smarty-2.6.0/misc/smarty_icon.gif differ diff --git a/buildscripts/PhpDocumentor/phpDocumentor/TutorialHighlightParser.inc b/buildscripts/PhpDocumentor/phpDocumentor/TutorialHighlightParser.inc new file mode 100644 index 00000000..ff7160ce --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/TutorialHighlightParser.inc @@ -0,0 +1,491 @@ + tags output. Using the + * WordParser, the phpDocumentor_TutorialHighlightParser + * retrieves PHP tokens one by one from the array generated by + * {@link WordParser} source retrieval functions + * and then highlights them individually. + * + * It accomplishes this highlighting through the assistance of methods in + * the output Converter passed to its parse() method, and then returns the + * fully highlighted source as a string + * @tutorial tags.example.pkg, tags.filesource.pkg + * @package phpDocumentor + * @subpackage Parsers + * @since 1.3.0 + */ + +/** + * Highlights source code using {@link parse()} + * @package phpDocumentor + * @subpackage Parsers + */ +class phpDocumentor_TutorialHighlightParser extends Parser +{ + /**#@+ @access private */ + /** + * Highlighted source is built up in this string + * @var string + */ + var $_output; + /** + * contents of the current source code line as it is parsed + * @var string + */ + var $_line; + /** + * Used to retrieve highlighted tokens + * @var Converter a descendant of Converter + */ + var $_converter; + /** + * Path to file being highlighted, if this is from a @filesource tag + * @var false|string full path + */ + var $_filesourcepath; + /** + * @var array + */ + var $eventHandlers = array( + TUTORIAL_EVENT_NOEVENTS => 'defaultHandler', + TUTORIAL_EVENT_ITAG => 'defaultHandler', + TUTORIAL_EVENT_ATTRIBUTE => 'attrHandler', + TUTORIAL_EVENT_OPENTAG => 'defaultHandler', + TUTORIAL_EVENT_CLOSETAG => 'defaultHandler', + TUTORIAL_EVENT_ENTITY => 'defaultHandler', + TUTORIAL_EVENT_COMMENT => 'defaultHandler', + TUTORIAL_EVENT_SINGLEQUOTE => 'defaultHandler', + TUTORIAL_EVENT_DOUBLEQUOTE => 'defaultHandler', + ); + /**#@-*/ + + /** + * @uses Converter::SourceLine() encloses {@link $_line} in a + * converter-specific format + */ + function newLineNum() + { + $this->_line .= $this->_converter->flushHighlightCache(); + $this->_output .= $this->_converter->SourceLine($this->_pv_curline + 1, $this->_line, $this->_path); + $this->_line = ''; + } + + /** + * Start the parsing at a certain line number + */ + function setLineNum($num) + { + $this->_wp->linenum = $num; + } + + /** + * Parse a new file + * + * The parse() method is a do...while() loop that retrieves tokens one by + * one from the {@link $_event_stack}, and uses the token event array set up + * by the class constructor to call event handlers. + * + * The event handlers each process the tokens passed to them, and use the + * {@link _addoutput()} method to append the processed tokens to the + * {@link $_line} variable. The word parser calls {@link newLineNum()} + * every time a line is reached. + * + * In addition, the event handlers use special linking functions + * {@link _link()} and its cousins (_classlink(), etc.) to create in-code + * hyperlinks to the documentation for source code elements that are in the + * source code. + * + * @uses setupStates() initialize parser state variables + * @uses configWordParser() pass $parse_data to prepare retrieval of tokens + * @param string + * @param Converter + * @param false|string full path to file with @filesource tag, if this + * is a @filesource parse + * @param false|integer starting line number from {@}source linenum} + * @staticvar integer used for recursion limiting if a handler for + * an event is not found + * @return bool + */ + function parse ($parse_data, &$converter, $filesourcepath = false, $linenum = false) + { + static $endrecur = 0; + $parse_data = str_replace(array("\r\n", "\t"), array("\n", ' '), $parse_data); + $this->_converter = &$converter; + $converter->startHighlight(); + $this->_path = $filesourcepath; + $this->setupStates($parse_data); + + $this->configWordParser(TUTORIAL_EVENT_NOEVENTS); + if ($linenum !== false) $this->setLineNum($linenum); + // initialize variables so E_ALL error_reporting doesn't complain + $pevent = 0; + $word = 0; + + do + { + $lpevent = $pevent; + $pevent = $this->_event_stack->getEvent(); + if ($lpevent != $pevent) + { + $this->_last_pevent = $lpevent; + $this->configWordParser($pevent); + } + $this->_wp->setWhitespace(true); + + $dbg_linenum = $this->_wp->linenum; + $dbg_pos = $this->_wp->getPos(); + $this->_pv_last_word = $word; + $this->_pv_curline = $this->_wp->linenum; + $word = $this->_wp->getWord(); + + if (0)//PHPDOCUMENTOR_DEBUG == true) + { + echo "LAST: "; + echo "|" . $this->_pv_last_word; + echo "|\n"; + echo "PEVENT: " . $this->getParserEventName($pevent) . "\n"; + echo "LASTPEVENT: " . $this->getParserEventName($this->_last_pevent) . "\n"; +// echo "LINE: ".$this->_line."\n"; +// echo "OUTPUT: ".$this->_output."\n"; + echo $dbg_linenum.'-'.$dbg_pos . ": "; + echo '|'.htmlspecialchars($word); + echo "|\n"; + echo "-------------------\n\n\n"; + flush(); + } + if (isset($this->eventHandlers[$pevent])) + { + $handle = $this->eventHandlers[$pevent]; + $this->$handle($word, $pevent); + } else + { + debug('WARNING: possible error, no handler for event number '.$pevent); + if ($endrecur++ == 25) + { + die("FATAL ERROR, recursion limit reached"); + } + } + } while (!($word === false)); + if (strlen($this->_line)) $this->newLineNum(); + return $this->_output; + } + + /**#@+ + * Event Handlers + * + * All Event Handlers use {@link checkEventPush()} and + * {@link checkEventPop()} to set up the event stack and parser state. + * @access private + * @param string|array token value + * @param integer parser event from {@link Parser.inc} + */ + /** + * Most tokens only need highlighting, and this method handles them + */ + function defaultHandler($word, $pevent) + { + if ($word == "\n") { + $this->newLineNum(); + return; + } + if ($this->checkEventPush($word, $pevent)) { + $this->_wp->backupPos($word); + return; + } + $this->_addoutput($word); + $this->checkEventPop($word, $pevent); + } + + /** + * Most tokens only need highlighting, and this method handles them + */ + function attrHandler($word, $pevent) + { + if ($word == "\n") { + $this->newLineNum(); + return; + } + if ($e = $this->checkEventPush($word, $pevent)) { + if ($e == TUTORIAL_EVENT_SINGLEQUOTE || $e == TUTORIAL_EVENT_DOUBLEQUOTE) { + $this->_addoutput($word); + } + return; + } + if ($this->checkEventPop($word, $pevent)) { + $this->_wp->backupPos($word); + return; + } + $this->_addoutput($word); + } + + /**#@+ + * Output Methods + * @access private + */ + /** + * This method adds output to {@link $_line} + * + * If a string with variables like "$test this" is present, then special + * handling is used to allow processing of the variable in context. + * @see _flush_save() + */ + function _addoutput($word, $preformatted = false) + { + $type = + array( + TUTORIAL_EVENT_ATTRIBUTE => 'attribute', + TUTORIAL_EVENT_SINGLEQUOTE => 'attributevalue', + TUTORIAL_EVENT_DOUBLEQUOTE => 'attributevalue', + TUTORIAL_EVENT_CLOSETAG => 'closetag', + TUTORIAL_EVENT_ENTITY => 'entity', + TUTORIAL_EVENT_ITAG => 'itag', + TUTORIAL_EVENT_OPENTAG => 'opentag', + TUTORIAL_EVENT_COMMENT => 'comment', + ); + $a = $this->_event_stack->getEvent(); + if (in_array($a, array_keys($type))) { + $this->_line .= $this->_converter->highlightTutorialSource($type[$a], $word); + } else { + $this->_line .= $this->_converter->flushHighlightCache(); + $this->_line .= $word; + } + } + /**#@-*/ + + /** + * tell the parser's WordParser {@link $wp} to set up tokens to parse words by. + * tokens are word separators. In English, a space or punctuation are examples of tokens. + * In PHP, a token can be a ;, a parenthesis, or even the word "function" + * @param $value integer an event number + * @see WordParser + */ + + function configWordParser($e) + { + $this->_wp->setSeperator($this->tokens[($e + 100)]); + } + /** + * this function checks whether parameter $word is a token for pushing a new event onto the Event Stack. + * @return mixed returns false, or the event number + */ + + function checkEventPush($word,$pevent) + { + $e = false; + if (isset($this->pushEvent[$pevent])) + { + if (isset($this->pushEvent[$pevent][strtolower($word)])) + $e = $this->pushEvent[$pevent][strtolower($word)]; + } + if ($e) + { + $this->_event_stack->pushEvent($e); + return $e; + } else { + return false; + } + } + + /** + * this function checks whether parameter $word is a token for popping the current event off of the Event Stack. + * @return mixed returns false, or the event number popped off of the stack + */ + + function checkEventPop($word,$pevent) + { + if (!isset($this->popEvent[$pevent])) return false; + if (in_array(strtolower($word),$this->popEvent[$pevent])) + { + return $this->_event_stack->popEvent(); + } else { + return false; + } + } + + /** + * Initialize all parser state variables + * @param boolean true if we are highlighting an inline {@}source} tag's + * output + * @param false|string name of class we are going to start from + * @uses $_wp sets to a new {@link phpDocumentor_HighlightWordParser} + */ + function setupStates($parsedata) + { + $this->_output = ''; + $this->_line = ''; + unset($this->_wp); + $this->_wp = new WordParser; + $this->_wp->setup($parsedata); + $this->_event_stack = new EventStack; + $this->_event_stack->popEvent(); + $this->_event_stack->pushEvent(TUTORIAL_EVENT_NOEVENTS); + $this->_pv_linenum = null; + $this->_pv_next_word = false; + } + + /** + * Initialize the {@link $tokenpushEvent, $wordpushEvent} arrays + */ + function phpDocumentor_TutorialHighlightParser() + { + $this->allowableInlineTags = $GLOBALS['_phpDocumentor_inline_tutorial_tags_allowed']; + $this->inlineTagHandlers = array('*' => 'handleDefaultInlineTag'); + $this->tokens[STATE_TUTORIAL_NOEVENTS] = array("\n",'{@', ''); + $this->tokens[STATE_TUTORIAL_ENTITY] = array("\n",';'); + $this->tokens[STATE_TUTORIAL_ATTRIBUTE] = array("\n",'"',"'",'>','/>'); + $this->tokens[STATE_TUTORIAL_DOUBLEQUOTE] = array("\n",'"','&','{@'); + $this->tokens[STATE_TUTORIAL_SINGLEQUOTE] = array("\n","'",'&','{@'); +/**************************************************************/ + + $this->pushEvent[TUTORIAL_EVENT_NOEVENTS] = + array( + "{@" => TUTORIAL_EVENT_ITAG, + '<' => TUTORIAL_EVENT_OPENTAG, + ' TUTORIAL_EVENT_CLOSETAG, + '&' => TUTORIAL_EVENT_ENTITY, + ''); +/**************************************************************/ + + $this->popEvent[TUTORIAL_EVENT_ATTRIBUTE] = array('>','/>'); +/**************************************************************/ + + $this->popEvent[TUTORIAL_EVENT_ITAG] = array('}'); +/**************************************************************/ + } + + function getParserEventName ($value) + { + $lookup = array( + TUTORIAL_EVENT_NOEVENTS => "TUTORIAL_EVENT_NOEVENTS", + TUTORIAL_EVENT_ITAG => "TUTORIAL_EVENT_ITAG", + TUTORIAL_EVENT_OPENTAG => "TUTORIAL_EVENT_OPENTAG", + TUTORIAL_EVENT_ATTRIBUTE => "TUTORIAL_EVENT_ATTRIBUTE", + TUTORIAL_EVENT_CLOSETAG => "TUTORIAL_EVENT_CLOSETAG", + TUTORIAL_EVENT_ENTITY => "TUTORIAL_EVENT_ENTITY", + TUTORIAL_EVENT_COMMENT => "TUTORIAL_EVENT_COMMENT", + TUTORIAL_EVENT_SINGLEQUOTE => "TUTORIAL_EVENT_SINGLEQUOTE", + TUTORIAL_EVENT_DOUBLEQUOTE => "TUTORIAL_EVENT_DOUBLEQUOTE", + ); + if (isset($lookup[$value])) + return $lookup[$value]; + else return $value; + } +} + + +/** starting state */ +define("TUTORIAL_EVENT_NOEVENTS" , 1); +/** currently in starting state */ +define("STATE_TUTORIAL_NOEVENTS" , 101); + +/** used when an {@}inline tag} is found */ +define("TUTORIAL_EVENT_ITAG" , 2); +/** currently parsing an {@}inline tag} */ +define("STATE_TUTORIAL_ITAG" , 102); + +/** used when an open is found */ +define("TUTORIAL_EVENT_OPENTAG" , 3); +/** currently parsing an open */ +define("STATE_TUTORIAL_OPENTAG" , 103); + +/** used when a is found */ +define("TUTORIAL_EVENT_ATTRIBUTE" , 4); +/** currently parsing an open */ +define("STATE_TUTORIAL_ATTRIBUTE" , 104); + +/** used when a close is found */ +define("TUTORIAL_EVENT_CLOSETAG" , 5); +/** currently parsing a close */ +define("STATE_TUTORIAL_CLOSETAG" , 105); + +/** used when an &entity; is found */ +define("TUTORIAL_EVENT_ENTITY" , 6); +/** currently parsing an &entity; */ +define("STATE_TUTORIAL_ENTITY" , 106); + +/** used when a is found */ +define("TUTORIAL_EVENT_COMMENT" , 7); +/** currently parsing a */ +define("STATE_TUTORIAL_COMMENT" , 107); + +/** used when a is found */ +define("TUTORIAL_EVENT_SINGLEQUOTE" , 8); +/** currently parsing a */ +define("STATE_TUTORIAL_SINGLEQUOTE" , 108); + +/** used when a is found */ +define("TUTORIAL_EVENT_DOUBLEQUOTE" , 9); +/** currently parsing a */ +define("STATE_TUTORIAL_DOUBLEQUOTE" , 109); +?> diff --git a/buildscripts/PhpDocumentor/phpDocumentor/WordParser.inc b/buildscripts/PhpDocumentor/phpDocumentor/WordParser.inc new file mode 100644 index 00000000..e0853370 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/WordParser.inc @@ -0,0 +1,325 @@ + + * @version $Id: WordParser.inc,v 1.1 2005/10/17 18:36:57 jeichorn Exp $ + * @package phpDocumentor + * @subpackage WordParsers + */ +/** + * Retrieves tokens from source code for use by the Parser + * @see Parser + * @author Joshua Eichorn + * @version $Id: WordParser.inc,v 1.1 2005/10/17 18:36:57 jeichorn Exp $ + * @package phpDocumentor + * @subpackage WordParsers + */ +class WordParser +{ + /* + New lines around the world + Macintosh: \r + Unix : \n + Windows : \r\n + */ + + /**#@+ + * @access private + */ + /** + * List of text that separates tokens, used to retrieve tokens + * @var array + */ + var $wordseperators = array(); + + /** + * Position within input of the cursor pointing to the next text to be + * retrieved as a token + * @var integer + */ + var $pos = 0; + + /** + * Size of the input source code + * @var integer + */ + var $size; + + /** + * Source code + * @var string + */ + var $data; + + var $cache; + /** + * Current line number + * @var integer + */ + var $linenum = 0; + /** + * Position the cursor was at the last time line numbers were counted, used + * to guarantee that line numbers are incremented + * @var integer + */ + var $linenumpos = 0; + + /** + * Used for {@}source} tag, contains currently parsed function source + * @var string + */ + var $source = ''; + /** + * flag, determines whether tokens are added to {@link $source} + * @var boolean + */ + var $getsource = false; + + /** + * If true, then white space is returned as a part of tokens, otherwise + * tokens are trimmed + * @var boolean + */ + var $returnWhiteSpace = false; + /**#@-*/ + + /** + * Initialize the WordParser + * @param string source code + */ + function setup(&$input) + { + $this->size = strlen($input); + $this->data = & $input; + $this->pos = 0; + $this->linenum = 0; + $this->linenumpos = 0; + $this->cache = array(); + //$this->run = 0; + //$this->word = WORD_PARSER_RET_WORD; + } + + /** + * Retrieve source code for the last function/method + * @return string + */ + function getSource() + { + $source = $this->source; + $this->source = ''; + $this->getsource = false; + return $source; + } + + /** + * Used to tell the WordParser to start retrieving source code + * @access private + */ + function retrievesource($word = '') + { + $this->source = $word; + $this->getsource = true; + } + + /** + * Retrieve a token from the token list + * + * The {@link Parser} class relies upon this method to retrieve the next + * token. The {@link $wordseperators} array is a collection of strings + * that delineate tokens for the current parser state. $wordseperators + * is set by the parser with a call to {@link Parser::configWordParser()} + * every time a new parser state is reached. + * + * For example, while parsing the source code for a class, the word + * var is a token, and global is not, + * but inside a function, the reverse is true. The parser state + * {@link PARSER_STATE_CLASS} has a token list that includes whitespace, + * code delimiters like ; and {}, and comment/DocBlock indicators + * + * If the whitespace option has been turned off using + * {@link setWhitespace()}, then no whitespace is returned with tokens + * + * {@internal + * In the first segment of the function, the code attempts to find the next + * token. A cache is used to speed repetitious tasks. The $tpos variable + * is used to hold the position of the next token. $npos is used to + * hold the end of the token, and so $npos - $tpos will give the length + * of the token. This is used to allow tokens that contain whitespace, + * should that option be desired. + * + * {@link $data} is of course the string containing the PHP code to be + * parsed, and {@link $pos} is the cursor, or current location within the + * parsed data. + * }} + * @return string|false the next token, an empty string if there are no + * token separators in the $wordseperators array, + * or false if the end of input has been reached + */ + function getWord() + { + //$st = $this->mtime(); + if ($this->size == $this->pos) + { + return false; + } + + // assume, for starting, that the token is from $this->pos to the end + $npos = $this->size; + if (is_array($this->wordseperators)) + { + //$this->wordseperators = array(); + foreach($this->wordseperators as $sep) + { + // cache is set if this separator has been tested + if (isset($this->cache[$sep])) + $tpos = $this->cache[$sep]; + else + $tpos = false; + if ($tpos < $this->pos || !is_int($tpos)) + { + // find the position of the next token separator + $tpos = strpos($this->data,$sep,$this->pos); + } + + // was a token separator found that is closer to the current + // location? + if ( ($tpos < $npos) && !($tpos === false)) + { + //echo trim($sep) . "=$tpos\n"; + // set the length of the token to be from $this->pos to + // the next token separator + $npos = $tpos; + $seplen = strlen($sep); + } + else if (!($tpos === false)) + { + $this->cache[$sep] = $tpos; + } + } + } else { + // no token separators, tell the parser to choose a new state + return ""; + } + + $len = $npos - $this->pos; + if ($len == 0) + { + $len = $seplen; + } + + //$st3 = $this->mtime(); + $word = substr($this->data,$this->pos,$len); + + // Change random other os newlines to the unix one + if ($word == "\r" || $word == "\r\n") + { + $word = "\n"; + } + + if ($this->linenumpos <= $this->pos) + { + $this->linenumpos = $this->pos + $len; + $this->linenum += count(explode("\n",$word)) - 1; + } + + if ($this->getsource) + { + $this->source .= $word; + } + $this->pos = $this->pos + $len; + //$this->word = WORD_PARSER_RET_SEP; + + // Things like // commenats rely on the newline to find their end so im going to have to return them + // never return worthless white space /t ' ' + if ($this->returnWhiteSpace == false) + { + if (strlen(trim($word)) == 0 && $word != "\n") + { + $word = $this->getWord(); + } + } + //$this->time3 = $this->time3 + ($this->mtime() - $st3); + //$this->time = $this->time + ($this->mtime() - $st); + return $word; + } + + + /** + * Returns the current pointer position, or 1 character after the end of the word + */ + function getPos() + { + return $this->pos; + } + + /** + * Unused + * + * {@source} + * @param integer starting position + * @param integer length of block to retrieve + */ + function getBlock($start,$len) + { + return substr($this->data,$start,$len); + } + + /** + * @uses $wordseperators + * @param array array of strings that separate tokens + */ + function setSeperator(&$seps) + { + $this->wordseperators = &$seps; + } + + /** + * Set the internal cursor within the source code + * @param integer + */ + function setPos($pos) + { + $this->pos = $pos; + } + + /** + * Backup to the previous token so that it can be retrieved again in a new + * context. + * + * Occasionally, a word will be passed to an event handler that should be + * handled by another event handler. This method allows that to happen. + * @param string token to back up to + */ + function backupPos($word) + { + if ($this->getsource) $this->source = substr($this->source,0,strlen($this->source) - 1); + $this->pos = $this->pos - strlen($word); + } + + /** + * set parser to return or strip whitespace + * @param boolean + */ + function setWhitespace($val = false) + { + $this->returnWhiteSpace = $val; + } +} +?> diff --git a/buildscripts/PhpDocumentor/phpDocumentor/XMLpackagePageParser.inc b/buildscripts/PhpDocumentor/phpDocumentor/XMLpackagePageParser.inc new file mode 100644 index 00000000..59a3f557 --- /dev/null +++ b/buildscripts/PhpDocumentor/phpDocumentor/XMLpackagePageParser.inc @@ -0,0 +1,554 @@ + + * @since 1.2 + */ +/** when is found */ +define('PHPDOCUMENTOR_PDP_EVENT_PROGRAMLISTING', 600); +/** when is found */ +define('PHPDOCUMENTOR_PDP_STATE_PROGRAMLISTING', 700); +/** when a DocBook is found */ +define('PHPDOCUMENTOR_PDP_EVENT_TAG', 601); +/** when a DocBook is found */ +define('PHPDOCUMENTOR_PDP_STATE_TAG', 701); +/** when is found */ +define('PHPDOCUMENTOR_PDP_EVENT_CDATA', 602); +/** when is found */ +define('PHPDOCUMENTOR_PDP_STATE_CDATA', 702); +/** when tag attributes name="value" are found */ +define('PHPDOCUMENTOR_PDP_EVENT_ATTRIBUTES', 603); +/** when tag attributes name="value" are found */ +define('PHPDOCUMENTOR_PDP_STATE_ATTRIBUTES', 703); +/** when tag attributes name="value" are found */ +define('PHPDOCUMENTOR_PDP_EVENT_ENTITY', 604); +/** when tag attributes name="value" are found */ +define('PHPDOCUMENTOR_PDP_STATE_ENTITY', 704); + +/** + * Used to parse XML DocBook-based tutorials + * @package phpDocumentor + * @subpackage Parsers + * @author Greg Beaver + * @since 1.2 + */ +class XMLPackagePageParser extends Parser +{ + /** @var array */ + var $eventHandlers = array( + PHPDOCUMENTOR_PDP_EVENT_TAG => 'handleTag', + PHPDOCUMENTOR_PDP_EVENT_ATTRIBUTES => 'handleAttributes', + PHPDOCUMENTOR_PDP_EVENT_CDATA => 'handleCData', + PARSER_EVENT_NOEVENTS => 'defaultHandler', + PARSER_EVENT_COMMENTBLOCK => 'ignoreHandler', + PARSER_EVENT_OUTPHP => 'ignoreHandler', + PARSER_EVENT_QUOTE => 'handleQuote', + PHPDOCUMENTOR_PDP_EVENT_ENTITY => 'handleEntity', + ); + + /** + * @var array + */ + var $pars = array(); + + var $refsect1id = false; + var $refsect2id = false; + var $refsect3id = false; + /** + * @var array the tag stack + */ + var $context; + /**#@+ @access private */ + var $_gettoc = false; + var $_toc = array(); + var $_cursection = 0; + /**#@-*/ + /** + * Set up the wordparser + * + * {@source} + * @uses ObjectWordParser + */ + function XMLPackagePageParser() + { + $this->wp = new ObjectWordParser(true); + } + /** + * Parse a new file + * + * @param string $parse_data + * @param array $tutorial for format, see {@link Io::getTutorials()} + * @staticvar integer used for recursion limiting if a handler for an event is not found + * @return bool + * @uses parserTutorial using {@link Publisher::PublishEvent()}, a new tutorial + * is created from the file parsed, and passed to the + * Intermediate Parser + */ + function parse ($parse_data, $tutorial) + { + $tempparse = new ppageParser; + $parse_data = $tempparse->parse($parse_data,true,$tutorial['package'],$tutorial['subpackage'], + basename($tutorial['path']),$tutorial['category'], $tutorial['path']); + unset($tempparse); + static $endrecur = 0; + if (!is_array($parse_data) || count($parse_data) == 0) + { + return false; + } + $this->setupStates(); + + // initialize variables so E_ALL error_reporting doesn't complain + $pevent = 0; + $word = 0; + $this->p_vars['start'] = true; + $this->p_vars['event_stack'] = new EventStack; + + $this->wp->setup($parse_data,false); + $this->wp->setWhitespace(true); + $this->context = array(); + if (isset($this->curtag)) unset($this->curtag); + + 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 (0)//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"; +// echo '"'.$this->p_vars['quote_data']."\"\n"; + } + if (isset($this->eventHandlers[$pevent])) + { + $handle = $this->eventHandlers[$pevent]; + if ($word !== false) $this->$handle($word, $pevent); + } else + { + debug('WARNING: possible error, no XMLPackagePageParser handler for event number '.$pevent); + if ($endrecur++ == 25) + { + die("FATAL ERROR, recursion limit reached"); + } + } + $this->p_vars['start'] = false; + } while (!($word === false)); + if (count($this->_toc) && isset($this->p_vars['toc'])) + { + $a = $this->curtag->getTOC($this->p_vars['toc']); + $a->setTOC($this->_toc); + $a->setPath($tutorial['path']); + $this->curtag->setTOC($this->p_vars['toc'],$a); + } + $this->PublishEvent(PHPDOCUMENTOR_EVENT_TUTORIAL,new parserTutorial($this->curtag, $tutorial)); + return $this->curtag; + } + + /**#@+ + * @access private + * @param string|parserInlineTag token + * @param integer parser event + */ + function defaultHandler($word, $pevent) + { + if (is_string($word) && $this->checkEventPush($word, $pevent)) + { + return; + } + } + + function ignoreHandler($word, $pevent) + { + $this->checkEventPop($word, $pevent); + } + + /** + * handler for QUOTE. + * this handler recognizes strings defined with double quotation marks (") and handles them correctly + * in any place that they legally appear in php code + */ + + function handleQuote($word, $pevent) + { + if ($this->p_flags['reset_quote_data'] === true) + { + $this->p_flags['reset_quote_data'] = false; + $this->p_vars['quote_data'] = ""; + } + if (!is_object($word)) $this->checkEventPush( $word, $pevent); + if ($word != "\"") + { + if (is_object($word)) + { + $this->p_vars['quote_data'] = $word; + } + else + { + if (!is_object($this->p_vars['quote_data'])) + $this->p_vars['quote_data'] .= $word; + } + } + if (!is_object($word)) + { + if ($word == '>') + { + if (is_object($this->p_vars['quote_data'])) $this->p_vars['quote_data'] = '{@id '.$this->p_vars['quote_data']->id.'}'; + addErrorDie(PDERROR_UNTERMINATED_ATTRIB,$this->curtag->name,$this->p_vars['attrname'],$this->p_vars['quote_data']); + } + if ($this->checkEventPop($word,$pevent)) + { + $this->p_flags['reset_quote_data'] = true; + } + } + } + + /** + * Handles all XML DocBook tags + */ + function handleTag($word, $pevent) + { + if (isset($this->curtag) && $this->curtag->hasTitle() && $this->_gettoc && $this->_gettoc->name == $this->curtag->name) + { + if (isset($this->_toc[$this->_cursection])) + { + $this->_toc[$this->_cursection]['title'] = $this->curtag->_title; + $this->_cursection++; + } + $this->_gettoc = false; + } + if ($this->p_vars['last_word'] == '<') + { // get tag name + $this->p_flags['begin_tag'] = true; + array_push($this->context,$word); +// if (isset($this->curtag)) debug("pushed ".$this->curtag->name); + if (isset($this->curtag)) + { + array_push($this->pars,$this->curtag); + } + $this->curtag = new parserXMLDocBookTag($word); + } elseif ($this->p_vars['last_word'] == '') + { + $tag = array_pop($this->context); + if ($word == '/>') { + // all is OK + $this->checkEventPop($word, $pevent); + $word = $tag; + } + if ($tag != $word) + { + addErrorDie(PDERROR_UNMATCHED_TUTORIAL_TAG,$tag,$word,$this->curtag->getString()); + } + if (in_array($this->curtag->name, array('refentry', 'refsect1', 'refsect2', 'refsect3'))) + { + if (!isset($this->curtag->_id)) + { + $title = ''; + if (isset($this->curtag->_title)) + { + $title = $this->curtag->_title->getString(); + } + addWarning(PDERROR_NO_DOCBOOK_ID, $this->curtag->name, $title); + } + } + $this->p_flags['begin_tag'] = false; + $curtag = @array_pop($this->pars); +// debug("popped $tag ".$curtag->name.' I am '.$this->curtag->name); + if ($curtag) + { + if ($this->curtag->name == 'refsect1') $this->refsect1id = false; + if ($this->curtag->name == 'refsect2') $this->refsect2id = false; + if ($this->curtag->name == 'refsect3') $this->refsect3id = false; + $curtag->add($this->curtag); +// debug("added ".$this->curtag->name." to ".$curtag->name.' '.$curtag->id); + $this->curtag = $curtag; + } else + { +// debug("here"); + } + } elseif (is_string($word)) + { + if (!($e = $this->checkEventPush($word, $pevent))) + { + if ($this->checkEventPop($word, $pevent)) + { + if ($this->p_flags['begin_tag']) + { + $this->p_vars['event_stack']->pushEvent(PHPDOCUMENTOR_PDP_EVENT_TAG); + $this->p_vars['event_stack']->pushEvent(PHPDOCUMENTOR_PDP_EVENT_CDATA); + $this->p_vars['last_tag'] = array_pop($this->context); + array_push($this->context,$this->p_vars['last_tag']); + $this->p_flags['in_cdata'] = false; + } + return; + } + } else + { + $this->p_flags['start_attr'] = true; + $this->p_flags['end_attr'] = false; + } + } else addErrorDie(PDERROR_CANT_HAVE_INLINE_IN_TAGNAME); + } + + /** + * Handle CData sections + */ + function handleCData($word, $pevent) + { + if ($this->curtag->name == 'refentry' && phpDocumentor_get_class($word) == 'parsertocinlinetag') + { + $this->p_vars['toc'] = $this->curtag->getTOC(); + } + if (is_string($word) && !$this->p_flags['in_cdata']) + { + if ($this->checkEventPop($word, $pevent)) + { + return; + } + if ($this->checkEventPush($word, $pevent)) + { + return; + } + } + if ($word == 'curtag->startCData(); + $this->p_flags['in_cdata'] = true; + } elseif ($this->p_flags['in_cdata'] && $word == ']]>') + { + $this->curtag->endCData(); + $this->p_flags['in_cdata'] = false; + } else + { + if ($this->p_flags['in_cdata']) + $this->curtag->addCData($word); + else + $this->curtag->add($word); + } + } + + /** + * Handle Entities like ” + */ + function handleEntity($word, $pevent) + { + if (!$word) + { + if (!isset($this->p_vars['entity_name'])) + $this->p_vars['entity_name'] = ''; + addErrorDie(PDERROR_UNTERMINATED_ENTITY,$this->p_vars['entity_name']); + } + $e = $this->checkEventPop($word, $pevent); + if ($word && !$e) $this->p_vars['entity_name'] = $word; + if ($e) + { + $entity = new parserEntity($this->p_vars['entity_name']); + unset($this->p_vars['entity_name']); + $this->curtag->add($entity); + } + } + + /** + * Handle Tag attributes name="value" + */ + function handleAttributes($word, $pevent) + { + if ($this->checkEventPush($word, $pevent)) return; + if ($word == '=') + { + $this->p_flags['start_attr'] = false; + $this->p_vars['end_attr'] = true; + } else + { + if ($this->p_flags['start_attr']) + { + $this->p_vars['attrname'] = $word; + } else + { + if (isset($this->p_vars['attrname'])) + { + $value = $this->p_vars['quote_data']; + if (phpDocumentor_get_class($value) == 'parseridinlinetag') + { // "inherit" the parent section's id, so + // + // ... + // + // ... + // + // + $a = ($this->refsect1id ? $this->refsect1id . '.' : ''); + $a .= ($this->refsect2id ? $this->refsect2id . '.' : ''); + $a .= ($this->refsect3id ? $this->refsect3id . '.' : ''); + if ($this->curtag->name == 'refsect1') + { + $this->refsect1id = $value->id; + } + if ($this->curtag->name == 'refsect2') + { + $this->refsect2id = $value->id; + } + if ($this->curtag->name == 'refsect3') + { + $this->refsect3id = $value->id; + } +// debug($value->id.' is now '.$a.$value->id); + $value->id = $a . $value->id; + if ($value->id != '') + { + if (isset($this->_toc[$this->_cursection])) + { + $this->_cursection++; + } + $this->_toc[$this->_cursection]['id'] = $value; + $this->_toc[$this->_cursection]['tag'] = new parserXMLDocBookTag($this->curtag->name); +// debug("set gettoc to ".$this->curtag->name .' '. $value->id); + $this->_gettoc = $this->curtag; + } + } + $this->curtag->addAttribute($this->p_vars['attrname'],$value); + unset($this->p_vars['attrname']); + $this->p_flags['end_attr'] = false; + } + } + } + if (is_string($word) && $this->checkEventPop($word, $pevent)) + { + $this->p_flags['start_attr'] = true; + $this->p_flags['end_attr'] = false; + $this->wp->setPos($this->wp->getPos() - strlen($word)); + } + } + /**#@-*/ + + /** + * setup the parser tokens, and the pushEvent/popEvent arrays + * @see $tokens, $pushEvent, $popEvent + */ + + function setupStates() + { + $this->_gettoc = false; + $this->_toc = array(); + $this->_cursection = 0; + if (isset($this->p_vars['toc'])) unset($this->p_vars['toc']); + + $this->tokens[STATE_NOEVENTS] = array('tokens[STATE_COMMENTBLOCK] = array('-->'); + $this->tokens[STATE_OUTPHP] = array('?>'); + $this->tokens[STATE_QUOTE] = array("\\\"","\\\\","\"",'>'); + $this->tokens[STATE_ESCAPE] = false;// this tells the word parser to just cycle + $this->tokens[PHPDOCUMENTOR_PDP_STATE_TAG] = array('>',' ','/>'); + $this->tokens[PHPDOCUMENTOR_PDP_STATE_CDATA] = array('&','"); +########################## + $this->pushEvent[PARSER_EVENT_QUOTE] = + array( + "\\" => PARSER_EVENT_ESCAPE + ); + $this->popEvent[PARSER_EVENT_QUOTE] = array("\""); +########################## + + $this->popEvent[PARSER_EVENT_OUTPHP] = array("?>"); +########################## + + $this->popEvent[PHPDOCUMENTOR_PDP_EVENT_ENTITY] = array(";"); +########################## + + $this->pushEvent[PHPDOCUMENTOR_PDP_EVENT_CDATA] = + array( + "<" => PHPDOCUMENTOR_PDP_EVENT_TAG, + ' + +
                                                +Last modified: $Date: 2005/10/17 18:15:16 $
                                                +Revision: $Revision: 1.1 $
                                                +
                                                + + + + + diff --git a/buildscripts/PhpDocumentor/poweredbyphpdoc.gif b/buildscripts/PhpDocumentor/poweredbyphpdoc.gif new file mode 100644 index 00000000..80e47255 Binary files /dev/null and b/buildscripts/PhpDocumentor/poweredbyphpdoc.gif differ diff --git a/buildscripts/PhpDocumentor/scripts/add_cvs.php b/buildscripts/PhpDocumentor/scripts/add_cvs.php new file mode 100644 index 00000000..2dfcd656 --- /dev/null +++ b/buildscripts/PhpDocumentor/scripts/add_cvs.php @@ -0,0 +1,153 @@ + + * @copyright Copyright 2003, Greg Beaver + * @version 1.0 + */ +/**#@+ + * phpDocumentor include files. If you don't have phpDocumentor, go get it! + * Your php life will be changed forever + */ +$dir = realpath(dirname(__FILE__).'/..'); +require_once("$dir/phpDocumentor/common.inc.php"); +require_once("$dir/phpDocumentor/Io.inc"); +/**#@-*/ + +/** +* Physical location on this computer of the package to parse +* @global string $cvsadd_directory +*/ +$cvsadd_directory = realpath('.'); +/** +* Comma-separated list of files and directories to ignore +* +* This uses wildcards * and ? to remove extra files/directories that are +* not part of the package or release +* @global string $ignore +*/ +$ignore = array('CVS/'); + +/****************************************************************************** +* Don't change anything below here unless you're adventuresome * +*******************************************************************************/ + +/** + * @global Io $files + */ +$files = new Io; + +$allfiles = $files->dirList($cvsadd_directory); +/**#@+ + * Sorting functions for the file list + * @param string + * @param string + */ +function sortfiles($a, $b) +{ + return strnatcasecmp($a['file'],$b['file']); +} + +function mystrucsort($a, $b) +{ + if (is_numeric($a) && is_string($b)) return 1; + if (is_numeric($b) && is_string($a)) return -1; + if (is_numeric($a) && is_numeric($b)) + { + if ($a > $b) return 1; + if ($a < $b) return -1; + if ($a == $b) return 0; + } + return strnatcasecmp($a,$b); +} +/**#@-*/ + +$struc = array(); +foreach($allfiles as $file) +{ + if ($files->checkIgnore(basename($file),dirname($file),$ignore, false)) + { +// print 'Ignoring '.$file."
                                                \n"; + continue; + } + $path = substr(dirname($file),strlen(str_replace('\\','/',realpath($cvsadd_directory)))+1); + if (!$path) $path = '/'; + $file = basename($file); + $ext = array_pop(explode('.',$file)); + if (strlen($ext) == strlen($file)) $ext = ''; + $struc[$path][] = array('file' => $file,'ext' => $ext); +} +uksort($struc,'strnatcasecmp'); +foreach($struc as $key => $ind) +{ + usort($ind,'sortfiles'); + $struc[$key] = $ind; +} +$tempstruc = $struc; +$struc = array('/' => $tempstruc['/']); +$bv = 0; +foreach($tempstruc as $key => $ind) +{ + $save = $key; + if ($key != '/') + { + $struc['/'] = setup_dirs($struc['/'], explode('/',$key), $tempstruc[$key]); + } +} +uksort($struc['/'],'mystrucsort'); +/** + * Recursively add files to cvs + * @param array the sorted directory structure + */ +function addToCVS($struc) +{ + foreach($struc as $dir => $files) + { + if ($dir === '/') + { + print 'processing '.$dir . "\n"; + addToCVS($struc[$dir]); + return; + } else + { + if (!isset($files['file'])) + { + print 'adding '.$dir . "\n"; + system('cvs add '.$dir); + chdir($dir); + addToCVS($files); + chdir('..'); + } else + { + print 'adding '.$files['file'] . "\n"; + system('cvs add '.$files['file']); + system('cvs commit -m "" '.$files['file']); + } + } + } +} +addToCVS($struc); +print "\n".'done'; +?> \ No newline at end of file diff --git a/buildscripts/PhpDocumentor/scripts/create_examples.php b/buildscripts/PhpDocumentor/scripts/create_examples.php new file mode 100644 index 00000000..d8b3b8ff --- /dev/null +++ b/buildscripts/PhpDocumentor/scripts/create_examples.php @@ -0,0 +1,66 @@ + 'HTML:default:default', + $output_directory.'/docs/phpdoc_l0l33t' => 'HTML:default:l0l33t', + $output_directory.'/docs/phpdoc_phpdoc_de' => 'HTML:default:phpdoc.de', + $output_directory.'/docs/phpdoc_DOM_default' => 'HTML:default:DOM/default', + $output_directory.'/docs/phpdoc_DOM_l0l33t' => 'HTML:default:DOM/l0l33t', + $output_directory.'/docs/phpdoc_DOM_phpdoc_de' => 'HTML:default:DOM/phpdoc.de', + $output_directory.'/docs/phpdoc_smarty_default' => 'HTML:Smarty:default' + $output_directory.'/docs/phpdoc_pdf_default' => 'PDF:default:default' + $output_directory.'/docs/phpdoc_chm_default' => 'CHM:default:default' + ); + +foreach($output as $output => $template) +{ + passthru("./phpdoc -d /home/jeichorn/phpdoc -dn $base_package -ti \"$title\" -td $template -t $output"); +} diff --git a/buildscripts/PhpDocumentor/scripts/create_package.xml.php b/buildscripts/PhpDocumentor/scripts/create_package.xml.php new file mode 100644 index 00000000..2ef0fd2c --- /dev/null +++ b/buildscripts/PhpDocumentor/scripts/create_package.xml.php @@ -0,0 +1,204 @@ +setOptions( +array('baseinstalldir' => 'PhpDocumentor', +'version' => '1.3.0RC4', +'packagedirectory' => $packagedir, +'state' => 'beta', +'filelistgenerator' => 'cvs', +'notes' => 'PHP 5 support and more, fix bugs + +This will be the last release in the 1.x series. 2.0 is next + +Features added to this release include: + + * Full PHP 5 support, phpDocumentor both runs in and parses Zend Engine 2 + language constructs. Note that you must be running phpDocumentor in + PHP 5 in order to parse PHP 5 code + * XML:DocBook/peardoc2:default converter now beautifies the source using + PEAR\'s XML_Beautifier if available + * inline {@example} tag - this works just like {@source} except that + it displays the contents of another file. In tutorials, it works + like + * customizable README/INSTALL/CHANGELOG files + * phpDocumentor tries to run .ini files out of the current directory + first, to allow you to put them anywhere you want to + * multi-national characters are now allowed in package/subpackage names + * images in tutorials with the tag + * un-modified output with + * html/xml source highlighting with + +From both Windows and Unix, both the command-line version +of phpDocumentor and the web interface will work +out of the box by using command phpdoc - guaranteed :) + +WARNING: in order to use the web interface through PEAR, you must set your +data_dir to a subdirectory of your document root. + +$ pear config-set data_dir /path/to/public_html/pear + +on Windows with default apache setup, it might be + +C:\> pear config-set data_dir "C:\Program Files\Apache\htdocs\pear" + +After this, install/upgrade phpDocumentor + +$ pear upgrade phpDocumentor + +and you can browse to: + +http://localhost/pear/PhpDocumentor/ + +for the web interface + +------ +WARNING: The PDF Converter will not work in PHP5. The PDF library that it relies upon +segfaults with the simplest of files. Generation still works great in PHP4 +------ + +- WARNING: phpDocumentor installs phpdoc in the + scripts directory, and this will conflict with PHPDoc, + you can\'t have both installed at the same time +- Switched to Smarty 2.6.0, now it will work in PHP 5. Other + changes made to the code to make it work in PHP 5, including parsing + of private/public/static/etc. access modifiers +- fixed these bugs: + [ not entered ] XMLDocBookpeardoc2 beautifier removes comments + [ 896444 ] Bad line numbers + [ 937235 ] duplicated /** after abstract method declaration + [ 962319 ] Define : don\'t show the assigned value + [ 977674 ] Parser error + [ 989258 ] wrong interfaces parsing + [ 1150809 ] Infinite loop when class extends itself + [ 1151196 ] PHP Fatal error: Cannot re-assign $this + [ 1151650 ] UTF8 decoding for DocBook packages + [ 1152781 ] PHP_NOTICE: Uninitialized string offset in ParserDescCleanup + [ 1153593 ] string id="...." in tutorials + [ 1164253 ] Inherited Class Constants are not displayed + [ 1171583 ] CHM wrong filesource + [ 1180200 ] HighlightParser does not handle Heredoc Blocks. + [ 1202772 ] missing parentheses in Parser.inc line 946 + [ 1203445 ] Call to a member function on a non-object in Parser.inc + [ 1203451 ] array to string conversion notice in InlineTags.inc +- fixed these bugs reported in PEAR: + Bug #2288: Webfrontend ignores more than one dir in "Files to ignore" + Bug #5011: PDF generation warning on uksort +', +'package' => 'PhpDocumentor', +'dir_roles' => array( + 'Documentation' => 'doc', + 'Documentation/tests' => 'test', + 'docbuilder' => 'data', + 'HTML_TreeMenu-1.1.2' => 'data', + 'tutorials' => 'doc', + 'phpDocumentor/Converters/CHM/default/templates/default/templates_c' => 'data', + 'phpDocumentor/Converters/PDF/default/templates/default/templates_c' => 'data', + 'phpDocumentor/Converters/HTML/frames/templates/default/templates_c' => 'data', + 'phpDocumentor/Converters/HTML/frames/templates/l0l33t/templates_c' => 'data', + 'phpDocumentor/Converters/HTML/frames/templates/phpdoc.de/templates_c' => 'data', + 'phpDocumentor/Converters/HTML/frames/templates/phphtmllib/templates_c' => 'data', + 'phpDocumentor/Converters/HTML/frames/templates/phpedit/templates_c' => 'data', + 'phpDocumentor/Converters/HTML/frames/templates/earthli/templates_c' => 'data', + 'phpDocumentor/Converters/HTML/frames/templates/DOM/default/templates_c' => 'data', + 'phpDocumentor/Converters/HTML/frames/templates/DOM/l0l33t/templates_c' => 'data', + 'phpDocumentor/Converters/HTML/frames/templates/DOM/phpdoc.de/templates_c' => 'data', + 'phpDocumentor/Converters/HTML/frames/templates/DOM/phphtmllib/templates_c' => 'data', + 'phpDocumentor/Converters/HTML/frames/templates/DOM/earthli/templates_c' => 'data', + 'phpDocumentor/Converters/HTML/Smarty/templates/default/templates_c' => 'data', + 'phpDocumentor/Converters/HTML/Smarty/templates/PHP/templates_c' => 'data', + 'phpDocumentor/Converters/HTML/Smarty/templates/HandS/templates_c' => 'data', + 'phpDocumentor/Converters/XML/DocBook/peardoc2/templates/default/templates_c' => 'data', + ), +'simpleoutput' => true, +'exceptions' => + array( + 'index.html' => 'data', + 'README' => 'doc', + 'ChangeLog' => 'doc', + 'PHPLICENSE.txt' => 'doc', + 'poweredbyphpdoc.gif' => 'data', + 'INSTALL' => 'doc', + 'FAQ' => 'doc', + 'Authors' => 'doc', + 'Release-1.2.0beta1' => 'doc', + 'Release-1.2.0beta2' => 'doc', + 'Release-1.2.0beta3' => 'doc', + 'Release-1.2.0rc1' => 'doc', + 'Release-1.2.0rc2' => 'doc', + 'Release-1.2.0' => 'doc', + 'Release-1.2.1' => 'doc', + 'Release-1.2.2' => 'doc', + 'Release-1.2.3' => 'doc', + 'Release-1.2.3.1' => 'doc', + 'Release-1.3.0' => 'doc', + 'pear-phpdoc' => 'script', + 'pear-phpdoc.bat' => 'script', + 'HTML_TreeMenu-1.1.2/TreeMenu.php' => 'php', + 'phpDocumentor/Smarty-2.6.0/libs/debug.tpl' => 'php', + 'new_phpdoc.php' => 'data', + 'phpdoc.php' => 'data', + ), +'ignore' => + array('package.xml', + "$packagedir/phpdoc", + 'phpdoc.bat', + 'LICENSE', + '*templates/PEAR/*', + 'phpDocumentor/Smarty-2.5.0/*', + '*CSV*', + 'makedocs.ini', + 'publicweb-PEAR-1.2.1.patch.txt', + ), +'installas' => + array('pear-phpdoc' => 'phpdoc', + 'pear-phpdoc.bat' => 'phpdoc.bat', + 'user/pear-makedocs.ini' => 'user/makedocs.ini', + ), +'installexceptions' => array('pear-phpdoc' => '/', 'pear-phpdoc.bat' => '/', 'scripts/makedoc.sh' => '/'), +)); +if (PEAR::isError($e)) { + echo $e->getMessage(); + exit; +} +$test->addPlatformException('pear-phpdoc.bat', 'windows'); +$test->addDependency('php', '4.1.0', 'ge', 'php'); +// optional dep for peardoc2 converter +$test->addDependency('XML_Beautifier', '1.1', 'ge', 'pkg', true); +// replace @PHP-BIN@ in this file with the path to php executable! pretty neat +$test->addReplacement('pear-phpdoc', 'pear-config', '@PHP-BIN@', 'php_bin'); +$test->addReplacement('pear-phpdoc.bat', 'pear-config', '@PHP-BIN@', 'php_bin'); +$test->addReplacement('pear-phpdoc.bat', 'pear-config', '@BIN-DIR@', 'bin_dir'); +$test->addReplacement('pear-phpdoc.bat', 'pear-config', '@PEAR-DIR@', 'php_dir'); +$test->addReplacement('pear-phpdoc.bat', 'pear-config', '@DATA-DIR@', 'data_dir'); +$test->addReplacement('docbuilder/includes/utilities.php', 'pear-config', '@DATA-DIR@', 'data_dir'); +$test->addReplacement('docbuilder/builder.php', 'pear-config', '@DATA-DIR@', 'data_dir'); +$test->addReplacement('docbuilder/file_dialog.php', 'pear-config', '@DATA-DIR@', 'data_dir'); +$test->addReplacement('docbuilder/file_dialog.php', 'pear-config', '@WEB-DIR@', 'data_dir'); +$test->addReplacement('docbuilder/actions.php', 'pear-config', '@WEB-DIR@', 'data_dir'); +$test->addReplacement('docbuilder/top.php', 'pear-config', '@DATA-DIR@', 'data_dir'); +$test->addReplacement('docbuilder/config.php', 'pear-config', '@DATA-DIR@', 'data_dir'); +$test->addReplacement('docbuilder/config.php', 'pear-config', '@WEB-DIR@', 'data_dir'); +$test->addReplacement('phpDocumentor/Setup.inc.php', 'pear-config', '@DATA-DIR@', 'data_dir'); +$test->addReplacement('phpDocumentor/Converter.inc', 'pear-config', '@DATA-DIR@', 'data_dir'); +$test->addReplacement('phpDocumentor/common.inc.php', 'package-info', '@VER@', 'version'); +$test->addReplacement('phpDocumentor/IntermediateParser.inc', 'package-info', '@VER@', 'version'); +$test->addReplacement('user/pear-makedocs.ini', 'pear-config', '@PEAR-DIR@', 'php_dir'); +$test->addReplacement('user/pear-makedocs.ini', 'pear-config', '@DOC-DIR@', 'doc_dir'); +$test->addReplacement('user/pear-makedocs.ini', 'package-info', '@VER@', 'version'); +$test->addRole('inc', 'php'); +$test->addRole('sh', 'script'); +if (isset($_GET['make'])) { + $test->writePackageFile(); +} else { + $test->debugPackageFile(); +} +if (!isset($_GET['make'])) { + echo 'Make this file'; +} +?> \ No newline at end of file diff --git a/buildscripts/PhpDocumentor/scripts/makedoc.sh b/buildscripts/PhpDocumentor/scripts/makedoc.sh new file mode 100644 index 00000000..83c3bcc0 --- /dev/null +++ b/buildscripts/PhpDocumentor/scripts/makedoc.sh @@ -0,0 +1,94 @@ +#!/bin/bash +# $Id: makedoc.sh,v 1.1 2005/10/17 18:37:43 jeichorn Exp $ + +#/** +# * makedoc - PHPDocumentor script to save your settings +# * +# * Put this file inside your PHP project homedir, edit its variables and run whenever you wants to +# * re/make your project documentation. +# * +# * The version of this file is the version of PHPDocumentor it is compatible. +# * +# * It simples run phpdoc with the parameters you set in this file. +# * NOTE: Do not add spaces after bash variables. +# * +# * @copyright makedoc.sh is part of PHPDocumentor project {@link http://freshmeat.net/projects/phpdocu/} and its LGPL +# * @author Roberto Berto +# * @version Release-1.1.0 +# */ + + +############################## +# should be edited +############################## + +#/** +# * title of generated documentation, default is 'Generated Documentation' +# * +# * @var string TITLE +# */ +TITLE="Your Project Documentation" + +#/** +# * name to use for the default package. If not specified, uses 'default' +# * +# * @var string PACKAGES +# */ +PACKAGES="yourProject" + +#/** +# * name of a directory(s) to parse directory1,directory2 +# * $PWD is the directory where makedoc.sh +# * +# * @var string PATH_PROJECT +# */ +PATH_PROJECT=$PWD + +#/** +# * path of PHPDoc executable +# * +# * @var string PATH_PHPDOC +# */ +PATH_PHPDOC=~/phpdoc/phpdoc + +#/** +# * where documentation will be put +# * +# * @var string PATH_DOCS +# */ +PATH_DOCS=$PWD/docs + +#/** +# * what outputformat to use (html/pdf) +# * +# * @var string OUTPUTFORMAT +# */ +OUTPUTFORMAT=HTML + +#/** +# * converter to be used +# * +# * @var string CONVERTER +# */ +CONVERTER=Smarty + +#/** +# * template to use +# * +# * @var string TEMPLATE +# */ +TEMPLATE=default + +#/** +# * parse elements marked as private +# * +# * @var bool (on/off) PRIVATE +# */ +PRIVATE=off + +# make documentation +$PATH_PHPDOC -d $PATH_PROJECT -t $PATH_DOCS -ti "$TITLE" -dn $PACKAGES \ +-o $OUTPUTFORMAT:$CONVERTER:$TEMPLATE -pp $PRIVATE + + +# vim: set expandtab : diff --git a/buildscripts/PhpDocumentor/scripts/tokenizer_test.php b/buildscripts/PhpDocumentor/scripts/tokenizer_test.php new file mode 100644 index 00000000..2b5ca25e --- /dev/null +++ b/buildscripts/PhpDocumentor/scripts/tokenizer_test.php @@ -0,0 +1,59 @@ +package_index)) + foreach(\$this->all_packages as \$key => \$val) + { + if (isset(\$this->pkg_elements[\$key])) + { + if (!isset(\$start)) \$start = \$key; + \$this->package_index[] = array('link' => \"li_\$key.html\", 'title' => \$key); + } + } + \$templ = new Smarty; + \$templ->template_dir = \$this->smarty_dir . PATH_DELIMITER . 'templates'; + \$templ->compile_dir = \$this->smarty_dir . PATH_DELIMITER . 'templates_c'; + \$templ->config_dir = \$this->smarty_dir . PATH_DELIMITER . 'configs'; + \$templ->assign(\"packageindex\",\$this->package_index); + \$templ->assign(\"phpdocversion\",PHPDOCUMENTOR_VER); + \$templ->assign(\"phpdocwebsite\",PHPDOCUMENTOR_WEBSITE); + \$templ->assign(\"package\",\$this->package); + \$templ->assign(\"subdir\",''); + return \$templ; + } +?> +"; +$tokens = token_get_all($file); + +$nl_check = array(T_WHITESPACE,T_ENCAPSED_AND_WHITESPACE,T_COMMENT,T_DOC_COMMENT,T_OPEN_TAG,T_CLOSE_TAG,T_INLINE_HTML); +print '
                                                ';
                                                +$line = 0;
                                                +foreach($tokens as $key => $val)
                                                +{
                                                +	if (is_array($val))
                                                +	{
                                                +		// seeing if we can get line numbers out of the beast
                                                +		if (in_array($val[0],$nl_check))
                                                +		{
                                                +			$line+=substr_count($val[1],"\n");
                                                +		}
                                                +		echo token_name($val[0])." => ".htmlentities($val[1])."\n";
                                                +	}
                                                +	else
                                                +	{
                                                +		echo "*** $val\n";
                                                +	}
                                                +}
                                                +echo "$line\n";
                                                +print '
                                                '; +?> diff --git a/buildscripts/PhpDocumentor/user/default.ini b/buildscripts/PhpDocumentor/user/default.ini new file mode 100644 index 00000000..4915f607 --- /dev/null +++ b/buildscripts/PhpDocumentor/user/default.ini @@ -0,0 +1,98 @@ +;; phpDocumentor parse configuration file +;; +;; This file is designed to cut down on repetitive typing on the command-line or web interface +;; You can copy this file to create a number of configuration files that can be used with the +;; command-line switch -c, as in phpdoc -c default.ini or phpdoc -c myini.ini. The web +;; interface will automatically generate a list of .ini files that can be used. +;; +;; default.ini is used to generate the online manual at http://www.phpdoc.org/docs +;; +;; ALL .ini files must be in the user subdirectory of phpDocumentor with an extension of .ini +;; +;; Copyright 2002, Greg Beaver +;; +;; WARNING: do not change the name of any command-line parameters, phpDocumentor will ignore them + +[Parse Data] +;; title of all the documentation +;; legal values: any string +title = phpDocumentor 1.3.0 Manual + +;; parse files that start with a . like .bash_profile +;; legal values: true, false +hidden = false + +;; show elements marked @access private in documentation by setting this to on +;; legal values: on, off +parseprivate = off + +;; parse with javadoc-like description (first sentence is always the short description) +;; legal values: on, off +javadocdesc = off + +;; add any custom @tags separated by commas here +;; legal values: any legal tagname separated by commas. +;customtags = mytag1,mytag2 + +;; This is only used by the XML:DocBook/peardoc2 converter +defaultcategoryname = Documentation + +;; what is the main package? +;; legal values: alphanumeric string plus - and _ +defaultpackagename = phpDocumentor + +;; output any parsing information? set to on for cron jobs +;; legal values: on +;quiet = on + +;; parse a PEAR-style repository. Do not turn this on if your project does +;; not have a parent directory named "pear" +;; legal values: on/off +;pear = on + +;; where should the documentation be written? +;; legal values: a legal path +target = /home/cellog/output + +;; Which files should be parsed out as special documentation files, such as README, +;; INSTALL and CHANGELOG? This overrides the default files found in +;; phpDocumentor.ini (this file is not a user .ini file, but the global file) +readmeinstallchangelog = README, INSTALL, CHANGELOG, NEWS, FAQ, LICENSE + +;; limit output to the specified packages, even if others are parsed +;; legal values: package names separated by commas +;packageoutput = package1,package2 + +;; comma-separated list of files to parse +;; legal values: paths separated by commas +;filename = /path/to/file1,/path/to/file2,fileincurrentdirectory + +;; comma-separated list of directories to parse +;; legal values: directory paths separated by commas +;directory = /path1,/path2,.,..,subdirectory +;directory = /home/jeichorn/cvs/pear +directory = /home/cellog/phpdoc + +;; template base directory (the equivalent directory of /phpDocumentor) +;templatebase = /path/to/my/templates + +;; directory to find any example files in through @example and {@example} tags +;examplesdir = /path/to/my/templates + +;; comma-separated list of files, directories or wildcards ? and * (any wildcard) to ignore +;; legal values: any wildcard strings separated by commas +;ignore = /path/to/ignore*,*list.php,myfile.php,subdirectory/ +ignore = templates_c/,*HTML/default/*,spec/ + +;; comma-separated list of Converters to use in outputformat:Convertername:templatedirectory format +;; legal values: HTML:frames:default,HTML:frames:l0l33t,HTML:frames:phpdoc.de,HTML:frames:phphtmllib, +;; HTML:frames:earthli, +;; HTML:frames:DOM/default,HTML:frames:DOM/l0l33t,HTML:frames:DOM/phpdoc.de, +;; HTML:frames:DOM/phphtmllib,HTML:frames:DOM/earthli +;; HTML:Smarty:default,HTML:Smarty:PHP,HTML:Smarty:HandS +;; PDF:default:default,CHM:default:default,XML:DocBook/peardoc2:default +output=HTML:frames:earthli,HTML:frames:default,HTML:frames:l0l33t,HTML:frames:phpdoc.de,HTML:frames:phphtmllib,HTML:frames:DOM/default,HTML:frames:DOM/l0l33t,HTML:frames:DOM/phpdoc.de,HTML:frames:DOM/earthli,HTML:frames:DOM/phphtmllib,HTML:frames:phpedit,HTML:Smarty:default,HTML:Smarty:PHP,HTML:Smarty:HandS,CHM:default:default,PDF:default:default + +;; turn this option on if you want highlighted source code for every file +;; legal values: on/off +sourcecode = on \ No newline at end of file diff --git a/buildscripts/PhpDocumentor/user/demo.ini b/buildscripts/PhpDocumentor/user/demo.ini new file mode 100644 index 00000000..edf0a353 --- /dev/null +++ b/buildscripts/PhpDocumentor/user/demo.ini @@ -0,0 +1,78 @@ +;; phpDocumentor demonstration parse configuration file +;; +;; RUN THIS FILE FROM THE INSTALL DIRECTORY +;; CHANGE HERE: + +;; where should the documentation be written? +;; legal values: a legal path +target = /home/CelloG/output + +;; DONT CHANGE BELOW HERE +;; +;; This file is designed to cut down on repetitive typing on the command-line or web interface +;; You can copy this file to create a number of configuration files that can be used with the +;; command-line switch -c, as in phpdoc -c default.ini or phpdoc -c myini.ini. The web +;; interface will automatically generate a list of .ini files that can be used. +;; +;; ALL .ini files must be in the user subdirectory of phpDocumentor with an extension of .ini +;; +;; Copyright 2002, Greg Beaver +;; +;; WARNING: do not change the + +[Parse Data] +;; title of all the documentation +;; legal values: any string +title = Generated Documentation + +;; parse files that start with a . like .bash_profile +;; legal values: true, false +hidden = false + +;; show elements marked @access private in documentation by setting this to on +;; legal values: on, off +parseprivate = off + +;; parse with javadoc-like description (first sentence is always the short description) +;; legal values: on, off +javadocdesc = off + +target=/dev/null + +;; add any custom @tags separated by commas here +;; legal values: any legal tagname separated by commas. +;customtags = mytag1,mytag2 + +;; what is the main package? +;; legal values: alphanumeric string plus - and _ +defaultpackagename = phpDocumentor + +;; output any parsing information? set to on for cron jobs +;; legal values: on +;quiet = on + +;; limit output to the specified packages, even if others are parsed +;; legal values: package names separated by commas +;packageoutput = package1,package2 + +;; comma-separated list of files to parse +;; legal values: paths separated by commas +;filename = /path/to/file1,/path/to/file2,fileincurrentdirectory +filename = test.php + +;; comma-separated list of directories to parse +;; legal values: directory paths separated by commas +;directory = /path1,/path2,.,..,subdirectory +;directory = /home/jeichorn/cvs/pear +;directory = . + +;; comma-separated list of files, directories or wildcards ? and * (any wildcard) to ignore +;; legal values: any wildcard strings separated by commas +;ignore = /path/to/ignore*,*list.php,myfile.php,subdirectory/ +ignore = templates_c/,*HTML/default/*,spec/ + +;; comma-separated list of Converters to use in outputformat:Convertername:templatedirectory format +;; legal values: HTML:frames:default,HTML:frames:l0l33t,HTML:frames:phpdoc.de,HTML:frames:phphtmllib +;; HTML:frames:phpedit,HTML:frames:DOM/default,HTML:frames:DOM/l0l33t,HTML:frames:DOM/phpdoc.de +;; HTML:Smarty:default,HTML:Smarty:PHP,PDF:default:default,CHM:default:default,XML:DocBook:default +output=HTML:frames:default,HTML:frames:l0l33t,HTML:frames:phpdoc.de,HTML:frames:phphtmllib,HTML:frames:DOM/default,HTML:frames:DOM/l0l33t,HTML:frames:DOM/phpdoc.de,HTML:frames:phpedit,HTML:Smarty:default,HTML:Smarty:HandS,HTML:Smarty:PHP,PDF:default:default,XML:DocBook/peardoc2:default,CHM:default:default \ No newline at end of file diff --git a/buildscripts/PhpDocumentor/user/error.ini b/buildscripts/PhpDocumentor/user/error.ini new file mode 100644 index 00000000..cb8d4ca5 --- /dev/null +++ b/buildscripts/PhpDocumentor/user/error.ini @@ -0,0 +1,82 @@ +;; phpDocumentor parse configuration file +;; +;; This file is designed to cut down on repetitive typing on the command-line or web interface +;; You can copy this file to create a number of configuration files that can be used with the +;; command-line switch -c, as in phpdoc -c default.ini or phpdoc -c myini.ini. The web +;; interface will automatically generate a list of .ini files that can be used. +;; +;; ALL .ini files must be in the user subdirectory of phpDocumentor with an extension of .ini +;; +;; Copyright 2002, Greg Beaver +;; +;; WARNING: do not change the name of any command-line parameters, phpDocumentor will halt + +[Parse Data] +;; title of all the documentation +;; legal values: any string +title = SlateLib Manual + +;; parse files that start with a . like .bash_profile +;; legal values: true, false +hidden = false + +;; show elements marked @access private in documentation by setting this to on +;; legal values: on, off +parseprivate = on + +;; parse with javadoc-like description (first sentence is always the short description) +;; legal values: on, off +javadocdesc = off + +;; add any custom @tags separated by commas here +;; legal values: any legal tagname separated by commas. +;customtags = mytag1,mytag2 + +;; This is only used by the XML:DocBook/peardoc2 converter +defaultcategoryname = Documentation + +;; what is the main package? +;; legal values: alphanumeric string plus - and _ +defaultpackagename = junk + +;; output any parsing information? set to on for cron jobs +;; legal values: on +;quiet = on + +;; parse a PEAR-style repository. Do not turn this on if your project does +;; not have a parent directory named "pear" +;; legal values: on/off +;pear = on + +;; where should the documentation be written? +;; legal values: a legal path +target = /tmp/docs + +;; limit output to the specified packages, even if others are parsed +;; legal values: package names separated by commas +;packageoutput = package1,package2 + +;; comma-separated list of files to parse +;; legal values: paths separated by commas +;filename = /path/to/file1,/path/to/file2,fileincurrentdirectory + +;; comma-separated list of directories to parse +;; legal values: directory paths separated by commas +;directory = /path1,/path2,.,..,subdirectory +;directory = /home/jeichorn/cvs/pear +directory = /home/jeichorn/cvs/slatelib + +;; comma-separated list of files, directories or wildcards ? and * (any wildcard) to ignore +;; legal values: any wildcard strings separated by commas +;ignore = /path/to/ignore*,*list.php,myfile.php,subdirectory/ +ignore = + +;; comma-separated list of Converters to use in outputformat:Convertername:templatedirectory format +;; legal values: HTML:frames:default,HTML:frames:l0l33t,HTML:frames:phpdoc.de,HTML:frames:phphtmllib +;; HTML:frames:DOM/default,HTML:frames:DOM/l0l33t,HTML:frames:DOM/phpdoc.de,HTML:Smarty:default +;; HTML:Smarty:PHP,PDF:default:default,CHM:default:default,XML:DocBook/peardoc2:default +output=HTML:Smarty:default,HTML:Smarty:PHP + +;; turn this option on if you want highlighted source code for every file +;; legal values: on/off +sourcecode = on diff --git a/buildscripts/PhpDocumentor/user/pear-makedocs.ini b/buildscripts/PhpDocumentor/user/pear-makedocs.ini new file mode 100644 index 00000000..750cf48f --- /dev/null +++ b/buildscripts/PhpDocumentor/user/pear-makedocs.ini @@ -0,0 +1,71 @@ +;; phpDocumentor parse configuration file +;; +;; This file is designed to cut down on repetitive typing on the command-line or web interface +;; You can copy this file to create a number of configuration files that can be used with the +;; command-line switch -c, as in phpdoc -c default.ini or phpdoc -c myini.ini. The web +;; interface will automatically generate a list of .ini files that can be used. +;; +;; ALL .ini files must be in the user subdirectory of phpDocumentor with an extension of .ini +;; +;; Copyright 2002, Greg Beaver +;; +;; WARNING: do not change the + +[Parse Data] +;; title of all the documentation +;; legal values: any string +title = phpDocumentor Manual + +;; parse files that start with a . like .bash_profile +;; legal values: true, false +hidden = false + +;; show elements marked @access private in documentation by setting this to on +;; legal values: on, off +parseprivate = off + +;; parse with javadoc-like description (first sentence is always the short description) +;; legal values: on, off +javadocdesc = off + +;; add any custom @tags separated by commas here +;; legal values: any legal tagname separated by commas. +;customtags = mytag1,mytag2 + +;; what is the main package? +;; legal values: alphanumeric string plus - and _ +defaultpackagename = phpDocumentor + +;; output any parsing information? set to on for cron jobs +;; legal values: on +;quiet = on + +;; where should the documentation be written? +;; legal values: a legal path +target = @DOC-DIR@/PhpDocumentor/Documentation/new + +;; limit output to the specified packages, even if others are parsed +;; legal values: package names separated by commas +;packageoutput = package1,package2 + +;; comma-separated list of files to parse +;; legal values: paths separated by commas +;filename = /path/to/file1,/path/to/file2,fileincurrentdirectory +filename = @DOC-DIR@/PhpDocumentor/README,@DOC-DIR@/PhpDocumentor/ChangeLog,@DOC-DIR@/PhpDocumentor/Release-@VER@,@DOC-DIR@/PhpDocumentor/FAQ +;; comma-separated list of directories to parse +;; legal values: directory paths separated by commas +;directory = /path1,/path2,.,..,subdirectory +;directory = /home/jeichorn/cvs/pear +directory = @PEAR-DIR@/PhpDocumentor,@DOC-DIR@/PhpDocumentor/tutorials + +releaseinstallchangelog = Release-@VER@,ChangeLog,README,FAQ + +;; comma-separated list of files, directories or wildcards ? and * (any wildcard) to ignore +;; legal values: any wildcard strings separated by commas +;ignore = /path/to/ignore*,*list.php,myfile.php,subdirectory/ + +;; comma-separated list of Converters to use in outputformat:Convertername:templatedirectory format +;; legal values: HTML:frames:default,HTML:frames:l0l33t,HTML:frames:phpdoc.de,HTML:frames:phphtmllib +;; HTML:frames:DOM/default,HTML:frames:DOM/l0l33t,HTML:frames:DOM/phpdoc.de,HTML:Smarty:default +;; HTML:Smarty:PHP,HTML:Smarty:HandS,PDF:default:default,CHM:default:default,XML:DocBook/peardoc2:default +output=HTML:Smarty:HandS \ No newline at end of file diff --git a/buildscripts/PhpDocumentor/user/prado.ini b/buildscripts/PhpDocumentor/user/prado.ini new file mode 100644 index 00000000..f009f873 --- /dev/null +++ b/buildscripts/PhpDocumentor/user/prado.ini @@ -0,0 +1,79 @@ +;; phpDocumentor demonstration parse configuration file +;; +;; RUN THIS FILE FROM THE INSTALL DIRECTORY +;; CHANGE HERE: + +;; where should the documentation be written? +;; legal values: a legal path +target = d:/wwwroot/prado3-doc + +;; DONT CHANGE BELOW HERE +;; +;; This file is designed to cut down on repetitive typing on the command-line or web interface +;; You can copy this file to create a number of configuration files that can be used with the +;; command-line switch -c, as in phpdoc -c default.ini or phpdoc -c myini.ini. The web +;; interface will automatically generate a list of .ini files that can be used. +;; +;; ALL .ini files must be in the user subdirectory of phpDocumentor with an extension of .ini +;; +;; Copyright 2002, Greg Beaver +;; +;; WARNING: do not change the + +[Parse Data] +;; title of all the documentation +;; legal values: any string +title = PRADO 3.0.1 API Manual + +;; parse files that start with a . like .bash_profile +;; legal values: true, false +hidden = false + +;; show elements marked @access private in documentation by setting this to on +;; legal values: on, off +parseprivate = off + +;; parse with javadoc-like description (first sentence is always the short description) +;; legal values: on, off +javadocdesc = off + +target=d:/wwwroot/prado3-doc/manual + +;; add any custom @tags separated by commas here +;; legal values: any legal tagname separated by commas. +;customtags = mytag1,mytag2 + +;; what is the main package? +;; legal values: alphanumeric string plus - and _ +defaultpackagename = default + +;; output any parsing information? set to on for cron jobs +;; legal values: on +;quiet = on + +;; limit output to the specified packages, even if others are parsed +;; legal values: package names separated by commas +;packageoutput = package1,package2 + +;; comma-separated list of files to parse +;; legal values: paths separated by commas +;filename = /path/to/file1,/path/to/file2,fileincurrentdirectory +;filename = + +;; comma-separated list of directories to parse +;; legal values: directory paths separated by commas +directory = D:/wwwroot/prado3-doc/prado-3.0.1/framework +;directory = /home/jeichorn/cvs/pear +;directory = . + +;; comma-separated list of files, directories or wildcards ? and * (any wildcard) to ignore +;; legal values: any wildcard strings separated by commas +;ignore = /path/to/ignore*,*list.php,myfile.php,subdirectory/ +ignore = templates_c/,*HTML/default/*,spec/,*pradolite.php,*3rdParty/*,*Javascripts/* + +;; comma-separated list of Converters to use in outputformat:Convertername:templatedirectory format +;; legal values: HTML:frames:default,HTML:frames:l0l33t,HTML:frames:phpdoc.de,HTML:frames:phphtmllib +;; HTML:frames:phpedit,HTML:frames:DOM/default,HTML:frames:DOM/l0l33t,HTML:frames:DOM/phpdoc.de +;; HTML:Smarty:default,HTML:Smarty:PHP,PDF:default:default,CHM:default:default,XML:DocBook:default +;;output=HTML:frames:default,CHM:default:default +output=HTML:Smarty:PradoSoft \ No newline at end of file diff --git a/buildscripts/PhpDocumentor/user/testdocbook.ini b/buildscripts/PhpDocumentor/user/testdocbook.ini new file mode 100644 index 00000000..8de48fc0 --- /dev/null +++ b/buildscripts/PhpDocumentor/user/testdocbook.ini @@ -0,0 +1,74 @@ +;; phpDocumentor parse configuration file +;; +;; This file is designed to cut down on repetitive typing on the command-line or web interface +;; You can copy this file to create a number of configuration files that can be used with the +;; command-line switch -c, as in phpdoc -c default.ini or phpdoc -c myini.ini. The web +;; interface will automatically generate a list of .ini files that can be used. +;; +;; ALL .ini files must be in the user subdirectory of phpDocumentor with an extension of .ini +;; +;; Copyright 2002, Greg Beaver +;; +;; WARNING: do not change the + +[Parse Data] +;; title of all the documentation +;; legal values: any string +title = Generated Documentation + +;; parse files that start with a . like .bash_profile +;; legal values: true, false +hidden = false + +;; show elements marked @access private in documentation by setting this to on +;; legal values: on, off +parseprivate = off + +pear=on + +;; parse with javadoc-like description (first sentence is always the short description) +;; legal values: on, off +javadocdesc = off + +;; add any custom @tags separated by commas here +;; legal values: any legal tagname separated by commas. +;customtags = mytag1,mytag2 + +;; what is the main package? +;; legal values: alphanumeric string plus - and _ +defaultpackagename = PEAR_PackageFileManager + +defaultcategoryname = pear + +;; output any parsing information? set to on for cron jobs +;; legal values: on +;quiet = on + +;; where should the documentation be written? +;; legal values: a legal path +target = /home/cellog/peardoc/en/package + +;; limit output to the specified packages, even if others are parsed +;; legal values: package names separated by commas +;packageoutput = package1,package2 + +;; comma-separated list of files to parse +;; legal values: paths separated by commas +;filename = /path/to/file1,/path/to/file2,fileincurrentdirectory + +;; comma-separated list of directories to parse +;; legal values: directory paths separated by commas +;directory = /path1,/path2,.,..,subdirectory +directory = /home/cellog/pear/PEAR_PackageFileManager +;directory = /home/CelloG/phpdoc + +;; comma-separated list of files, directories or wildcards ? and * (any wildcard) to ignore +;; legal values: any wildcard strings separated by commas +;ignore = /path/to/ignore*,*list.php,myfile.php,subdirectory/ +ignore = examples/ + +;; comma-separated list of Converters to use in outputformat:Convertername:templatedirectory format +;; legal values: HTML:frames:default,HTML:frames:l0l33t,HTML:frames:phpdoc.de,HTML:frames:phphtmllib +;; HTML:frames:DOM/default,HTML:frames:DOM/l0l33t,HTML:frames:DOM/phpdoc.de,HTML:Smarty:default +;; HTML:Smarty:PHP,PDF:default:default,CHM:default:default,XML:DocBook:default +output=XML:DocBook/peardoc2:default diff --git a/buildscripts/index/api_index.php b/buildscripts/index/api_index.php index ac2e37a7..c85fa267 100644 --- a/buildscripts/index/api_index.php +++ b/buildscripts/index/api_index.php @@ -25,6 +25,7 @@ class api_index $count = 0; foreach($files as $file) { + echo " processing $file...\n"; $content = $this->get_details($file, $this->_api); $doc = new Zend_Search_Lucene_Document(); @@ -86,8 +87,8 @@ class api_index if(is_file($filepath) && $entry[0] !== '_') $files[] = realpath($filepath); } - return $files; $d->close(); + return $files; } function get_doc_content($file) diff --git a/buildscripts/index/search.php b/buildscripts/index/search.php new file mode 100644 index 00000000..a34363f4 --- /dev/null +++ b/buildscripts/index/search.php @@ -0,0 +1,36 @@ +find(strtolower($keyword)); + $content=''; + foreach($results as $entry) + $content.="
                                              • link}\">{$entry->title}
                                              • \n"; + if($content!=='') + { + $count=count($results); + $content="

                                                Total $count pages matching keyword ".htmlentities($keyword).".\n

                                                  \n$content
                                                \n"; + } + else + $content="

                                                No page matches ".htmlentities($keyword).".

                                                "; +} +else + $content="

                                                Please specify a keyword to search for.

                                                "; + +$page=file_get_contents(dirname(__FILE__).'/index.html'); +$page=preg_replace('/.*/ms',$content,$page); +if($keyword!=='') + $page=preg_replace('/ \ No newline at end of file diff --git a/buildscripts/texbuilder/quickstart.tex b/buildscripts/texbuilder/quickstart.tex index ee3010fe..35ba86a5 100644 --- a/buildscripts/texbuilder/quickstart.tex +++ b/buildscripts/texbuilder/quickstart.tex @@ -42,10 +42,10 @@ %----------------- TITLE -------------- -\title{\Huge \bfseries Prado v3.0.1 Quick Start Tutorial +\title{\Huge \bfseries PRADO v3.0.2 Quickstart Tutorial \thanks{Copyright 2005-2006. All Rights Reserved.} } -\author{Qiang Xue, Wei Zhuo} +\author{Qiang Xue and Wei Zhuo} \date{\today} -- cgit v1.2.3