123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- <?php
- /**
- * Parser output with source map
- *
- * @package Less
- * @subpackage Output
- */
- class Less_Output_Mapped extends Less_Output {
- /**
- * The source map generator
- *
- * @var Less_SourceMap_Generator
- */
- protected $generator;
- /**
- * Current line
- *
- * @var integer
- */
- protected $lineNumber = 0;
- /**
- * Current column
- *
- * @var integer
- */
- protected $column = 0;
- /**
- * Array of contents map (file and its content)
- *
- * @var array
- */
- protected $contentsMap = array();
- /**
- * Constructor
- *
- * @param array $contentsMap Array of filename to contents map
- * @param Less_SourceMap_Generator $generator
- */
- public function __construct( array $contentsMap, $generator ) {
- $this->contentsMap = $contentsMap;
- $this->generator = $generator;
- }
- /**
- * Adds a chunk to the stack
- * The $index for less.php may be different from less.js since less.php does not chunkify inputs
- *
- * @param string $chunk
- * @param string $fileInfo
- * @param integer $index
- * @param mixed $mapLines
- */
- public function add( $chunk, $fileInfo = null, $index = 0, $mapLines = null ) {
- // ignore adding empty strings
- if ( $chunk === '' ) {
- return;
- }
- $sourceLines = array();
- $sourceColumns = ' ';
- if ( $fileInfo ) {
- $url = $fileInfo['currentUri'];
- if ( isset( $this->contentsMap[$url] ) ) {
- $inputSource = substr( $this->contentsMap[$url], 0, $index );
- $sourceLines = explode( "\n", $inputSource );
- $sourceColumns = end( $sourceLines );
- } else {
- throw new Exception( 'Filename '.$url.' not in contentsMap' );
- }
- }
- $lines = explode( "\n", $chunk );
- $columns = end( $lines );
- if ( $fileInfo ) {
- if ( !$mapLines ) {
- $this->generator->addMapping(
- $this->lineNumber + 1, // generated_line
- $this->column, // generated_column
- count( $sourceLines ), // original_line
- strlen( $sourceColumns ), // original_column
- $fileInfo
- );
- } else {
- for ( $i = 0, $count = count( $lines ); $i < $count; $i++ ) {
- $this->generator->addMapping(
- $this->lineNumber + $i + 1, // generated_line
- $i === 0 ? $this->column : 0, // generated_column
- count( $sourceLines ) + $i, // original_line
- $i === 0 ? strlen( $sourceColumns ) : 0, // original_column
- $fileInfo
- );
- }
- }
- }
- if ( count( $lines ) === 1 ) {
- $this->column += strlen( $columns );
- } else {
- $this->lineNumber += count( $lines ) - 1;
- $this->column = strlen( $columns );
- }
- // add only chunk
- parent::add( $chunk );
- }
- }
|