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.
176 lines
4.3 KiB
176 lines
4.3 KiB
// Generated by CoffeeScript 1.9.3 |
|
var SpecialString, fn, i, len, prop, ref; |
|
|
|
module.exports = SpecialString = (function() { |
|
var self; |
|
|
|
self = SpecialString; |
|
|
|
SpecialString._tabRx = /^\t/; |
|
|
|
SpecialString._tagRx = /^<[^>]+>/; |
|
|
|
SpecialString._quotedHtmlRx = /^&(gt|lt|quot|amp|apos|sp);/; |
|
|
|
function SpecialString(str) { |
|
if (!(this instanceof self)) { |
|
return new self(str); |
|
} |
|
this._str = String(str); |
|
this._len = 0; |
|
} |
|
|
|
SpecialString.prototype._getStr = function() { |
|
return this._str; |
|
}; |
|
|
|
SpecialString.prototype.set = function(str) { |
|
this._str = String(str); |
|
return this; |
|
}; |
|
|
|
SpecialString.prototype.clone = function() { |
|
return new SpecialString(this._str); |
|
}; |
|
|
|
SpecialString.prototype.isEmpty = function() { |
|
return this._str === ''; |
|
}; |
|
|
|
SpecialString.prototype.isOnlySpecialChars = function() { |
|
return !this.isEmpty() && this.length === 0; |
|
}; |
|
|
|
SpecialString.prototype._reset = function() { |
|
return this._len = 0; |
|
}; |
|
|
|
SpecialString.prototype.splitIn = function(limit, trimLeftEachLine) { |
|
var buffer, bufferLength, justSkippedSkipChar, lines; |
|
if (trimLeftEachLine == null) { |
|
trimLeftEachLine = false; |
|
} |
|
buffer = ''; |
|
bufferLength = 0; |
|
lines = []; |
|
justSkippedSkipChar = false; |
|
self._countChars(this._str, function(char, charLength) { |
|
if (bufferLength > limit || bufferLength + charLength > limit) { |
|
lines.push(buffer); |
|
buffer = ''; |
|
bufferLength = 0; |
|
} |
|
if (bufferLength === 0 && char === ' ' && !justSkippedSkipChar && trimLeftEachLine) { |
|
return justSkippedSkipChar = true; |
|
} else { |
|
buffer += char; |
|
bufferLength += charLength; |
|
return justSkippedSkipChar = false; |
|
} |
|
}); |
|
if (buffer.length > 0) { |
|
lines.push(buffer); |
|
} |
|
return lines; |
|
}; |
|
|
|
SpecialString.prototype.trim = function() { |
|
return new SpecialString(this.str.trim()); |
|
}; |
|
|
|
SpecialString.prototype.trimLeft = function() { |
|
return new SpecialString(this.str.replace(/^\s+/, '')); |
|
}; |
|
|
|
SpecialString.prototype.trimRight = function() { |
|
return new SpecialString(this.str.replace(/\s+$/, '')); |
|
}; |
|
|
|
SpecialString.prototype._getLength = function() { |
|
var sum; |
|
sum = 0; |
|
self._countChars(this._str, function(char, charLength) { |
|
sum += charLength; |
|
}); |
|
return sum; |
|
}; |
|
|
|
SpecialString.prototype.cut = function(from, to, trimLeft) { |
|
var after, before, cur, cut; |
|
if (trimLeft == null) { |
|
trimLeft = false; |
|
} |
|
if (to == null) { |
|
to = this.length; |
|
} |
|
from = parseInt(from); |
|
if (from >= to) { |
|
throw Error("`from` shouldn't be larger than `to`"); |
|
} |
|
before = ''; |
|
after = ''; |
|
cut = ''; |
|
cur = 0; |
|
self._countChars(this._str, (function(_this) { |
|
return function(char, charLength) { |
|
if (_this.str === 'ab<tag>') { |
|
console.log(charLength, char); |
|
} |
|
if (cur === from && char.match(/^\s+$/) && trimLeft) { |
|
return; |
|
} |
|
if (cur < from) { |
|
before += char; |
|
} else if (cur < to || cur + charLength <= to) { |
|
cut += char; |
|
} else { |
|
after += char; |
|
} |
|
cur += charLength; |
|
}; |
|
})(this)); |
|
this._str = before + after; |
|
this._reset(); |
|
return SpecialString(cut); |
|
}; |
|
|
|
SpecialString._countChars = function(text, cb) { |
|
var char, charLength, m; |
|
while (text.length !== 0) { |
|
if (m = text.match(self._tagRx)) { |
|
char = m[0]; |
|
charLength = 0; |
|
text = text.substr(char.length, text.length); |
|
} else if (m = text.match(self._quotedHtmlRx)) { |
|
char = m[0]; |
|
charLength = 1; |
|
text = text.substr(char.length, text.length); |
|
} else if (text.match(self._tabRx)) { |
|
char = "\t"; |
|
charLength = 8; |
|
text = text.substr(1, text.length); |
|
} else { |
|
char = text[0]; |
|
charLength = 1; |
|
text = text.substr(1, text.length); |
|
} |
|
cb.call(null, char, charLength); |
|
} |
|
}; |
|
|
|
return SpecialString; |
|
|
|
})(); |
|
|
|
ref = ['str', 'length']; |
|
fn = function() { |
|
var methodName; |
|
methodName = '_get' + prop[0].toUpperCase() + prop.substr(1, prop.length); |
|
return SpecialString.prototype.__defineGetter__(prop, function() { |
|
return this[methodName](); |
|
}); |
|
}; |
|
for (i = 0, len = ref.length; i < len; i++) { |
|
prop = ref[i]; |
|
fn(); |
|
}
|
|
|