Pelzini

This is the code documentation for the Pelzini project

source of /processor/javascript_parser.php

Contains the JavascriptParser class
  1. <?php
  2. /*
  3. Copyright 2008 Josh Heidenreich
  4.  
  5. This file is part of Pelzini.
  6.  
  7. Pelzini is free software: you can redistribute it and/or modify
  8. it under the terms of the GNU General Public License as published by
  9. the Free Software Foundation, either version 3 of the License, or
  10. (at your option) any later version.
  11.  
  12. Pelzini is distributed in the hope that it will be useful,
  13. but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. GNU General Public License for more details.
  16.  
  17. You should have received a copy of the GNU General Public License
  18. along with Pelzini. If not, see <http://www.gnu.org/licenses/>.
  19. */
  20.  
  21.  
  22. /**
  23.  * Contains the {@link JavascriptParser} class
  24.  *
  25.  * @package Parsers
  26.  * @author Josh
  27.  * @since 0.2
  28.  **/
  29.  
  30. /**
  31.  * Does the complete parsing of a javascript file.
  32.  **/
  33. class JavascriptParser
  34. {
  35. private $lexer;
  36. private $analyser;
  37.  
  38. public function __construct()
  39. {
  40. $this->lexer = new JavascriptLexer();
  41. $this->analyser = new JavascriptAnalyser();
  42. }
  43.  
  44.  
  45. /**
  46.   * Parses a file
  47.   *
  48.   * @param string $filename The file to parse
  49.   * @return A ParserFile object, or null if there was an error
  50.   **/
  51. public function parseFile($base_dir, $filename)
  52. {
  53. $this->lexer->resetState();
  54. $this->analyser->resetState();
  55.  
  56. $source = @file_get_contents($base_dir . $filename);
  57. if ($source == null) return null;
  58.  
  59. // Simple "minified" detection
  60. // These don't have useful comments, and sometimes crash the parser as well
  61. $num_lines = substr_count($source, "\n") + 1;
  62. $num_chars = strlen($source);
  63. $avg_line_length = $num_chars / $num_lines;
  64. if ($avg_line_length > 200) {
  65. return null;
  66. }
  67.  
  68. $tokens = $this->lexer->process($source);
  69. if ($tokens === null) return null;
  70.  
  71. //echo "<style>i {color: #777;}</style>";
  72. //echo '<pre>Tokens for file ', $filename, "\n";
  73. //foreach ($tokens as $i => $t) echo "<b>{$i}</b> {$t->getTypeName()} <i>{$t->getValue()}</i>\n";
  74. //echo '</pre>';
  75.  
  76. $file = new ParserFile();
  77. $file->name = $filename;
  78. $file->source = $source;
  79.  
  80. $result = $this->analyser->process($tokens, $file);
  81. if ($result === false) return null;
  82.  
  83. return $file;
  84. }
  85.  
  86.  
  87. }
  88.  
  89.  
  90. ?>
  91.