PageRenderTime 53ms CodeModel.GetById 25ms RepoModel.GetById 0ms app.codeStats 0ms

/src/nid/utils/StringUtils2.as

http://github.com/nidin/as3-ppt-to-swf-converter
ActionScript | 412 lines | 350 code | 23 blank | 39 comment | 180 complexity | 525f813b599d89c39b82346bbcbe102a MD5 | raw file
  1. package nid.utils
  2. {
  3. import flash.events.*;
  4. public class StringUtils2
  5. {
  6. public static function trim(input:String):String {
  7. return StringUtils2.ltrim(StringUtils2.rtrim(input));
  8. }
  9. public static function ltrim(input:String):String {
  10. if (input != null) {
  11. var size:Number = input.length;
  12. for(var i:Number = 0; i < size; i++) {
  13. if(input.charCodeAt(i) > 32) {
  14. return input.substring(i);
  15. }
  16. }
  17. }
  18. return "";
  19. }
  20. public static function rtrim(input:String):String {
  21. if (input != null) {
  22. var size:Number = input.length;
  23. for(var i:Number = size; i > 0; i--) {
  24. if(input.charCodeAt(i - 1) > 32) {
  25. return input.substring(0, i);
  26. }
  27. }
  28. }
  29. return "";
  30. }
  31. public static function simpleEscape(input:String):String {
  32. input = input.split("\n").join("\\n");
  33. input = input.split("\r").join("\\r");
  34. input = input.split("\t").join("\\t");
  35. input = input.split("\f").join("\\f");
  36. input = input.split("\b").join("\\b");
  37. return input;
  38. }
  39. public static function strictEscape(input:String, trim:Boolean = true):String {
  40. if (input != null && input.length > 0) {
  41. if (trim) {
  42. input = StringUtils2.trim(input);
  43. }
  44. input = encodeURIComponent(input);
  45. var a:Array = input.split("");
  46. for (var i:uint = 0; i < a.length; i++) {
  47. switch(a[i]) {
  48. case "!": a[i] = "%21"; break;
  49. case "'": a[i] = "%27"; break;
  50. case "(": a[i] = "%28"; break;
  51. case ")": a[i] = "%29"; break;
  52. case "*": a[i] = "%2A"; break;
  53. case "-": a[i] = "%2D"; break;
  54. case ".": a[i] = "%2E"; break;
  55. case "_": a[i] = "%5F"; break;
  56. case "~": a[i] = "%7E"; break;
  57. }
  58. }
  59. return a.join("");
  60. }
  61. return "";
  62. }
  63. public static function repeat(n:uint, str:String = " "):String {
  64. return new Array(n + 1).join(str);
  65. }
  66. private static var i:int = 0;
  67. private static const SIGN_UNDEF:int = 0;
  68. private static const SIGN_POS:int = -1;
  69. private static const SIGN_NEG:int = 1;
  70. public static function printf(format:String, ...args):String {
  71. var result:String = "";
  72. var indexValue:int = 0;
  73. var isIndexed:int = -1;
  74. var typeLookup:String = "diufFeEgGxXoscpn";
  75. for(i = 0; i < format.length; i++) {
  76. var c:String = format.charAt(i);
  77. if(c == "%") {
  78. if(++i < format.length) {
  79. c = format.charAt(i);
  80. if(c == "%") {
  81. result += c;
  82. } else {
  83. var flagSign:Boolean = false;
  84. var flagLeftAlign:Boolean = false;
  85. var flagAlternate:Boolean = false;
  86. var flagLeftPad:Boolean = false;
  87. var flagZeroPad:Boolean = false;
  88. var width:int = -1;
  89. var precision:int = -1;
  90. var type:String = "";
  91. var value:*;
  92. var j:int;
  93. ///////////////////////////
  94. // parse parameter
  95. ///////////////////////////
  96. var idx:int = getIndex(format);
  97. if(idx < -1 || idx == 0) {
  98. trace("ERR parsing index");
  99. break;
  100. } else if(idx == -1) {
  101. if(isIndexed == 1) { trace("ERR: indexed placeholder expected"); break; }
  102. if(isIndexed == -1) { isIndexed = 0; }
  103. indexValue++;
  104. } else {
  105. if(isIndexed == 0) { trace("ERR: non-indexed placeholder expected"); break; }
  106. if(isIndexed == -1) { isIndexed = 1; }
  107. indexValue = idx;
  108. }
  109. ///////////////////////////
  110. // parse flags
  111. ///////////////////////////
  112. while((c = format.charAt(i)) == "+" || c == "-" || c == "#" || c == " " || c == "0") {
  113. switch(c) {
  114. case "+": flagSign = true; break;
  115. case "-": flagLeftAlign = true; break;
  116. case "#": flagAlternate = true; break;
  117. case " ": flagLeftPad = true; break;
  118. case "0": flagZeroPad = true; break;
  119. }
  120. if(++i == format.length) { break; }
  121. c = format.charAt(i);
  122. }
  123. if(i == format.length) { break; }
  124. ///////////////////////////
  125. // parse width
  126. ///////////////////////////
  127. if(c == "*") {
  128. var widthIndex:int = 0;
  129. if(++i == format.length) { break; }
  130. idx = getIndex(format);
  131. if(idx < -1 || idx == 0) {
  132. trace("ERR parsing index for width");
  133. break;
  134. } else if(idx == -1) {
  135. if(isIndexed == 1) { trace("ERR: indexed placeholder expected for width"); break; }
  136. if(isIndexed == -1) { isIndexed = 0; }
  137. widthIndex = indexValue++;
  138. } else {
  139. if(isIndexed == 0) { trace("ERR: non-indexed placeholder expected for width"); break; }
  140. if(isIndexed == -1) { isIndexed = 1; }
  141. widthIndex = idx;
  142. }
  143. widthIndex--;
  144. if(args.length > widthIndex && widthIndex >= 0) {
  145. width = parseInt(args[widthIndex]);
  146. if(isNaN(width)) {
  147. width = -1;
  148. trace("ERR NaN while parsing width");
  149. break;
  150. }
  151. } else {
  152. trace("ERR index out of bounds while parsing width");
  153. break;
  154. }
  155. c = format.charAt(i);
  156. } else {
  157. var hasWidth:Boolean = false;
  158. while(c >= "0" && c <= "9") {
  159. if(width == -1) { width = 0; }
  160. width = (width * 10) + uint(c);
  161. if(++i == format.length) { break; }
  162. c = format.charAt(i);
  163. }
  164. if(width != -1 && i == format.length) {
  165. trace("ERR eof while parsing width");
  166. break;
  167. }
  168. }
  169. ///////////////////////////
  170. // parse precision
  171. ///////////////////////////
  172. if(c == ".") {
  173. if(++i == format.length) { break; }
  174. c = format.charAt(i);
  175. if(c == "*") {
  176. var precisionIndex:int = 0;
  177. if(++i == format.length) { break; }
  178. idx = getIndex(format);
  179. if(idx < -1 || idx == 0) {
  180. trace("ERR parsing index for precision");
  181. break;
  182. } else if(idx == -1) {
  183. if(isIndexed == 1) { trace("ERR: indexed placeholder expected for precision"); break; }
  184. if(isIndexed == -1) { isIndexed = 0; }
  185. precisionIndex = indexValue++;
  186. } else {
  187. if(isIndexed == 0) { trace("ERR: non-indexed placeholder expected for precision"); break; }
  188. if(isIndexed == -1) { isIndexed = 1; }
  189. precisionIndex = idx;
  190. }
  191. precisionIndex--;
  192. if(args.length > precisionIndex && precisionIndex >= 0) {
  193. precision = parseInt(args[precisionIndex]);
  194. if(isNaN(precision)) {
  195. precision = -1;
  196. trace("ERR NaN while parsing precision");
  197. break;
  198. }
  199. } else {
  200. trace("ERR index out of bounds while parsing precision");
  201. break;
  202. }
  203. c = format.charAt(i);
  204. } else {
  205. while(c >= "0" && c <= "9") {
  206. if(precision == -1) { precision = 0; }
  207. precision = (precision * 10) + uint(c);
  208. if(++i == format.length) { break; }
  209. c = format.charAt(i);
  210. }
  211. if(precision != -1 && i == format.length) {
  212. trace("ERR eof while parsing precision");
  213. break;
  214. }
  215. }
  216. }
  217. ///////////////////////////
  218. // parse length (ignored)
  219. ///////////////////////////
  220. switch(c) {
  221. case "h":
  222. case "l":
  223. if(++i == format.length) { trace("ERR eof after length"); break; }
  224. var c1:String = format.charAt(i);
  225. if((c == "h" && c1 == "h") || (c == "l" && c1 == "l")) {
  226. if(++i == format.length) { trace("ERR eof after length"); break; }
  227. c = format.charAt(i);
  228. } else {
  229. c = c1;
  230. }
  231. break;
  232. case "L":
  233. case "z":
  234. case "j":
  235. case "t":
  236. if(++i == format.length) { trace("ERR eof after length"); break; }
  237. c = format.charAt(i);
  238. break;
  239. }
  240. ///////////////////////////
  241. // parse type
  242. ///////////////////////////
  243. if(typeLookup.indexOf(c) >= 0) {
  244. type = c;
  245. } else {
  246. trace("ERR unknown type: " + c);
  247. break;
  248. }
  249. if(args.length >= indexValue && indexValue > 0) {
  250. value = args[indexValue - 1];
  251. } else {
  252. trace("ERR value index out of bounds (" + indexValue + ")");
  253. break;
  254. }
  255. var valueStr:String;
  256. var valueFloat:Number;
  257. var valueInt:int;
  258. var sign:int = SIGN_UNDEF;
  259. switch(type) {
  260. case "s":
  261. valueStr = value.toString();
  262. if(precision != -1) { valueStr = valueStr.substr(0, precision); }
  263. break;
  264. case "c":
  265. valueStr = value.toString().getAt(0);
  266. break;
  267. case "d":
  268. case "i":
  269. valueInt = ((typeof value == "number") ? int(value) : parseInt(value));
  270. valueStr = Math.abs(valueInt).toString();
  271. sign = (valueInt < 0) ? SIGN_NEG : SIGN_POS;
  272. break;
  273. case "u":
  274. valueStr = ((typeof value == "number") ? uint(value) : uint(parseInt(value))).toString();
  275. break;
  276. case "f":
  277. case "F":
  278. case "e":
  279. case "E":
  280. case "g":
  281. case "G":
  282. if(precision == -1) { precision = 6; }
  283. var exp10:Number = Math.pow(10, precision);
  284. valueFloat = (typeof value == "number") ? Number(value) : parseFloat(value);
  285. valueStr = (Math.round(Math.abs(valueFloat) * exp10) / exp10).toString();
  286. if(precision > 0) {
  287. var numZerosToAppend:int;
  288. var dotPos:int = valueStr.indexOf(".");
  289. if(dotPos == -1) {
  290. valueStr += ".";
  291. numZerosToAppend = precision;
  292. } else {
  293. numZerosToAppend = precision - (valueStr.length - dotPos - 1);
  294. }
  295. for(j = 0; j < numZerosToAppend; j++) {
  296. valueStr += "0";
  297. }
  298. }
  299. sign = (valueFloat < 0) ? SIGN_NEG : SIGN_POS;
  300. break;
  301. case "x":
  302. case "X":
  303. case "p":
  304. valueStr = ((typeof value == "number") ? uint(value) : parseInt(value)).toString(16);
  305. if(type == "X") { valueStr = valueStr.toUpperCase(); }
  306. break;
  307. case "o":
  308. valueStr = ((typeof value == "number") ? uint(value) : parseInt(value)).toString(8);
  309. break;
  310. }
  311. var hasSign:Boolean = ((sign == SIGN_NEG) || flagSign || flagLeftPad);
  312. if(width > -1) {
  313. var numFill:int = width - valueStr.length;
  314. if(hasSign) { numFill--; }
  315. if(numFill > 0) {
  316. var fillChar:String = (flagZeroPad && !flagLeftAlign) ? "0" : " ";
  317. if(flagLeftAlign) {
  318. for(j = 0; j < numFill; j++) {
  319. valueStr += fillChar;
  320. }
  321. } else {
  322. for(j = 0; j < numFill; j++) {
  323. valueStr = fillChar + valueStr;
  324. }
  325. }
  326. }
  327. }
  328. if(hasSign) {
  329. if(sign == SIGN_POS) {
  330. valueStr = (flagLeftPad ? " " : "0") + valueStr;
  331. } else {
  332. valueStr = "-" + valueStr;
  333. }
  334. }
  335. result += valueStr;
  336. ///////////////////////////
  337. // debug
  338. ///////////////////////////
  339. /*
  340. var d:String = "";
  341. d += "type:" + type + " ";
  342. d += "width:" + width + " ";
  343. d += "precision:" + precision + " ";
  344. d += "flags:";
  345. var da:Array = [];
  346. if(flagSign) { da.push("sign"); }
  347. if(flagLeftAlign) { da.push("leftalign"); }
  348. if(flagAlternate) { da.push("alternate"); }
  349. if(flagLeftPad) { da.push("leftpad"); }
  350. if(flagZeroPad) { da.push("zeropad"); }
  351. d += ((da.length == 0) ? "-" : da.toString()) + " ";
  352. d += "index:" + indexValue + " ";
  353. d += "value:" + value + " ";
  354. d += "result:" + valueStr;
  355. trace(d);
  356. */
  357. }
  358. } else {
  359. result += c;
  360. }
  361. } else {
  362. result += c;
  363. }
  364. }
  365. return result;
  366. }
  367. private static function getIndex(format:String):int {
  368. var result:int = 0;
  369. var isIndexed:Boolean = false;
  370. var c:String = "";
  371. var iTmp:int = i;
  372. while((c = format.charAt(i)) >= "0" && c <= "9") {
  373. isIndexed = true;
  374. result = (result * 10) + uint(c);
  375. if(++i == format.length) { return -2; }
  376. }
  377. if(isIndexed) {
  378. if(c != "$") {
  379. i = iTmp;
  380. return -1;
  381. }
  382. if(++i == format.length) { return -2; }
  383. return result;
  384. } else {
  385. return -1;
  386. }
  387. }
  388. }
  389. }