StringImpl.hx 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. package python.internal;
  2. @:keep
  3. @:native("HxString")
  4. class StringImpl {
  5. static inline function builtin ():Dynamic return Syntax.pythonCode("_hx_builtin");
  6. public static function split (s:String, d:String) {
  7. return if (d == "") Syntax.field(builtin(), "list")(s) else Syntax.callField(s, "split", d);
  8. }
  9. public static function charCodeAt(s:String, index:Int) {
  10. return
  11. if (s == null || s.length == 0 || index < 0 || index >= s.length) null
  12. else Syntax.callField(builtin(), "ord", Syntax.arrayAccess(s, index));
  13. }
  14. public static inline function charAt(s:String, index:Int) {
  15. return if (index < 0 || index >= s.length) "" else Syntax.arrayAccess(s,index);
  16. }
  17. public static inline function lastIndexOf(s:String, str:String, ?startIndex:Int):Int {
  18. if (startIndex == null) {
  19. return Syntax.callField(s, "rfind", str, 0, s.length);
  20. } else {
  21. var i = Syntax.callField(s, "rfind", str, 0, startIndex+1);
  22. var startLeft = i == -1 ? Syntax.callField(builtin(), "max", 0,startIndex+1-str.length) : i+1;
  23. var check = Syntax.callField(s,"find", str, startLeft, s.length);
  24. if (check > i && check <= startIndex) {
  25. return check;
  26. } else {
  27. return i;
  28. }
  29. }
  30. }
  31. public static function toUpperCase (s:String) {
  32. return Syntax.callField(s, "upper");
  33. }
  34. public static function toLowerCase (s:String) {
  35. return Syntax.callField(s, "lower");
  36. }
  37. public static function indexOf (s:String, str:String, ?startIndex:Int) {
  38. if (startIndex == null)
  39. return Syntax.callField(s, "find", str);
  40. else
  41. return Syntax.callField(s, "find", str, startIndex);
  42. }
  43. public static function toString (s:String) {
  44. return s;
  45. }
  46. public static function get_length (s:String) {
  47. return Syntax.field(builtin(), "len")(s);
  48. }
  49. public static inline function fromCharCode( code : Int ) : String {
  50. #if doc_gen
  51. return "";
  52. #else
  53. var c = code;
  54. return Syntax.callField('', "join",
  55. Syntax.callField(builtin(), "map", Syntax.field(builtin(), "chr"), [c])); // TODO: check cast
  56. #end
  57. }
  58. public static function substring( s:String, startIndex : Int, ?endIndex : Int ) : String {
  59. if (startIndex < 0) startIndex = 0;
  60. if (endIndex == null) {
  61. return Syntax.arrayAccessWithLeadingColon(s, startIndex);
  62. } else {
  63. if (endIndex < 0) endIndex = 0;
  64. if (endIndex < startIndex) {
  65. return Syntax.arrayAccess(s, endIndex, startIndex);
  66. } else {
  67. return Syntax.arrayAccess(s, startIndex, endIndex);
  68. }
  69. }
  70. }
  71. public static function substr( s:String, startIndex : Int, ?len : Int ) : String {
  72. if (len == null) {
  73. return Syntax.arrayAccessWithLeadingColon(s, startIndex);
  74. } else {
  75. if (len == 0) return "";
  76. return Syntax.arrayAccess(s, startIndex, startIndex+len);
  77. }
  78. }
  79. }