.
*/
include_once 'phing/filters/BaseFilterReader.php';
include_once 'phing/filters/ChainableReader.php';
/**
* This is a Php comment and string stripper reader that filters
* those lexical tokens out for purposes of simple Php parsing.
* (if you have more complex Php parsing needs, use a real lexer).
* Since this class heavily relies on the single char read function,
* you are reccomended to make it work on top of a buffered reader.
*
* @author Yannick Lecaillez
* @author hans lellelid, hans@velum.net
* @version $Revision: 1.6 $ $Date: 2004/07/16 01:36:35 $
* @access public
* @see FilterReader
* @package phing.filters
* @todo -c use new PHP functions to perform this instead of regex.
*/
class StripPhpComments extends BaseFilterReader implements ChainableReader {
/**
* The read-ahead character, used for effectively pushing a single
* character back. -1 indicates that no character is in the buffer.
*/
private $_readAheadCh = -1;
/**
* Whether or not the parser is currently in the middle of a string
* literal.
* @var boolean
*/
private $_inString = false;
/**
* Returns the stream without Php comments.
*
* @return the resulting stream, or -1
* if the end of the resulting stream has been reached
*
* @throws IOException if the underlying stream throws an IOException
* during reading
*/
function read($len = null) {
$buffer = $this->in->read($len);
if($buffer === -1) {
return -1;
}
// This regex replace /* */ and // style comments
$buffer = preg_replace('/\/\*[^*]*\*+([^\/*][^*]*\*+)*\/|\/\/[^\n]*|("(\\\\.|[^"\\\\])*"|\'(\\\\.|[^\'\\\\])*\'|.[^\/"\'\\\\]*)/s', "$2", $buffer);
// The regex above is not identical to, but is based on the expression below:
//
// created by Jeffrey Friedl
// and later modified by Fred Curtis.
// s{
// /\* ## Start of /* ... */ comment
// [^*]*\*+ ## Non-* followed by 1-or-more *'s
// (
// [^/*][^*]*\*+
// )* ## 0-or-more things which don't start with /
// ## but do end with '*'
// / ## End of /* ... */ comment
//
// | ## OR various things which aren't comments:
//
// (
// " ## Start of " ... " string
// (
// \\. ## Escaped char
// | ## OR
// [^"\\] ## Non "\
// )*
// " ## End of " ... " string
//
// | ## OR
//
// ' ## Start of ' ... ' string
// (
// \\. ## Escaped char
// | ## OR
// [^'\\] ## Non '\
// )*
// ' ## End of ' ... ' string
//
// | ## OR
//
// . ## Anything other char
// [^/"'\\]* ## Chars which doesn't start a comment, string or escape
// )
// }{$2}gxs;
return $buffer;
}
/*
* Returns the next character in the filtered stream, not including
* Php comments.
*
* @return the next character in the resulting stream, or -1
* if the end of the resulting stream has been reached
*
* @throws IOException if the underlying stream throws an IOException
* during reading
* @deprecated
*/
function readChar() {
$ch = -1;
if ( $this->_readAheadCh !== -1 ) {
$ch = $this->_readAheadCh;
$this->_readAheadCh = -1;
} else {
$ch = $this->in->readChar();
if ( $ch === "\"" ) {
$this->_inString = !$this->_inString;
} else {
if ( !$this->_inString ) {
if ( $ch === "/" ) {
$ch = $this->in->readChar();
if ( $ch === "/" ) {
while ( $ch !== "\n" && $ch !== -1 ) {
$ch = $this->in->readChar();
}
} else if ( $ch === "*" ) {
while ( $ch !== -1 ) {
$ch = $this->in->readChar();
while ( $ch === "*" && $ch !== -1 ) {
$ch = $this->in->readChar();
}
if ( $ch === "/" ) {
$ch = $this->readChar();
echo "$ch\n";
break;
}
}
} else {
$this->_readAheadCh = $ch;
$ch = "/";
}
}
}
}
}
return $ch;
}
/**
* Creates a new StripJavaComments using the passed in
* Reader for instantiation.
*
* @param reader A Reader object providing the underlying stream.
* Must not be null
.
*
* @return a new filter based on this configuration, but filtering
* the specified reader
*/
function chain(Reader $reader) {
$newFilter = new StripPhpComments($reader);
$newFilter->setProject($this->getProject());
return $newFilter;
}
}
?>