7 * @subpackage exception
\r
9 class Less_Exception_Parser extends Exception{
\r
14 * @var Less_ImportedFile
\r
16 public $currentFile;
\r
19 * The current parser index
\r
27 protected $details = array();
\r
33 * @param string $message
\r
34 * @param Exception $previous Previous exception
\r
35 * @param integer $index The current parser index
\r
36 * @param Less_FileInfo|string $currentFile The file
\r
37 * @param integer $code The exception code
\r
39 public function __construct($message = null, Exception $previous = null, $index = null, $currentFile = null, $code = 0){
\r
41 if (PHP_VERSION_ID < 50300) {
\r
42 $this->previous = $previous;
\r
43 parent::__construct($message, $code);
\r
45 parent::__construct($message, $code, $previous);
\r
48 $this->currentFile = $currentFile;
\r
49 $this->index = $index;
\r
51 $this->genMessage();
\r
55 protected function getInput(){
\r
57 if( !$this->input && $this->currentFile && $this->currentFile['filename'] && file_exists($this->currentFile['filename']) ){
\r
58 $this->input = file_get_contents( $this->currentFile['filename'] );
\r
65 * Converts the exception to string
\r
69 public function genMessage(){
\r
71 if( $this->currentFile && $this->currentFile['filename'] ){
\r
72 $this->message .= ' in '.basename($this->currentFile['filename']);
\r
75 if( $this->index !== null ){
\r
78 $line = self::getLineNumber();
\r
79 $this->message .= ' on line '.$line.', column '.self::getColumn();
\r
81 $lines = explode("\n",$this->input);
\r
83 $count = count($lines);
\r
84 $start_line = max(0, $line-3);
\r
85 $last_line = min($count, $start_line+6);
\r
86 $num_len = strlen($last_line);
\r
87 for( $i = $start_line; $i < $last_line; $i++ ){
\r
88 $this->message .= "\n".str_pad($i+1,$num_len,'0',STR_PAD_LEFT).'| '.$lines[$i];
\r
96 * Returns the line number the error was encountered
\r
100 public function getLineNumber(){
\r
101 if( $this->index ){
\r
102 // https://bugs.php.net/bug.php?id=49790
\r
103 if (ini_get("mbstring.func_overload")) {
\r
104 return substr_count(substr($this->input, 0, $this->index), "\n") + 1;
\r
106 return substr_count($this->input, "\n", 0, $this->index) + 1;
\r
114 * Returns the column the error was encountered
\r
118 public function getColumn(){
\r
120 $part = substr($this->input, 0, $this->index);
\r
121 $pos = strrpos($part,"\n");
\r
122 return $this->index - $pos;
\r