You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							56 lines
						
					
					
						
							1.7 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							56 lines
						
					
					
						
							1.7 KiB
						
					
					
				
								var util = require("util");
							 | 
						|
								
							 | 
						|
								var StringSource = module.exports = function(string, description) {
							 | 
						|
								    var self = {
							 | 
						|
								        asString: function() {
							 | 
						|
								            return string;
							 | 
						|
								        },
							 | 
						|
								        range: function(startIndex, endIndex) {
							 | 
						|
								            return new StringSourceRange(string, description, startIndex, endIndex);
							 | 
						|
								        }
							 | 
						|
								    };
							 | 
						|
								    return self;
							 | 
						|
								};
							 | 
						|
								
							 | 
						|
								var StringSourceRange = function(string, description, startIndex, endIndex) {
							 | 
						|
								    this._string = string;
							 | 
						|
								    this._description = description;
							 | 
						|
								    this._startIndex = startIndex;
							 | 
						|
								    this._endIndex = endIndex;
							 | 
						|
								};
							 | 
						|
								
							 | 
						|
								StringSourceRange.prototype.to = function(otherRange) {
							 | 
						|
								    // TODO: Assert that tokens are the same across both iterators
							 | 
						|
								    return new StringSourceRange(this._string, this._description, this._startIndex, otherRange._endIndex);
							 | 
						|
								};
							 | 
						|
								
							 | 
						|
								StringSourceRange.prototype.describe = function() {
							 | 
						|
								    var position = this._position();
							 | 
						|
								    var description = this._description ? this._description + "\n" : "";
							 | 
						|
								    return util.format("%sLine number: %s\nCharacter number: %s",
							 | 
						|
								        description, position.lineNumber, position.characterNumber);
							 | 
						|
								};
							 | 
						|
								
							 | 
						|
								StringSourceRange.prototype.lineNumber = function() {
							 | 
						|
								    return this._position().lineNumber;
							 | 
						|
								};
							 | 
						|
								
							 | 
						|
								StringSourceRange.prototype.characterNumber = function() {
							 | 
						|
								    return this._position().characterNumber;
							 | 
						|
								};
							 | 
						|
								
							 | 
						|
								StringSourceRange.prototype._position = function() {
							 | 
						|
								    var self = this;
							 | 
						|
								    var index = 0;
							 | 
						|
								    var nextNewLine = function() {
							 | 
						|
								        return self._string.indexOf("\n", index);
							 | 
						|
								    };
							 | 
						|
								    
							 | 
						|
								    var lineNumber = 1;
							 | 
						|
								    while (nextNewLine() !== -1 && nextNewLine() < this._startIndex) {
							 | 
						|
								        index = nextNewLine() + 1;
							 | 
						|
								        lineNumber += 1;
							 | 
						|
								    }
							 | 
						|
								    var characterNumber = this._startIndex - index + 1;
							 | 
						|
								    return {lineNumber: lineNumber, characterNumber: characterNumber};
							 | 
						|
								};
							 | 
						|
								
							 |