list.js 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
  1. /* eslint-disable no-unused-expressions */
  2. import { pythonGenerator } from "blockly/python";
  3. const Blockly = {
  4. Python: pythonGenerator || { Msg: Object.create(null) }
  5. };
  6. Blockly.Python.lists_create_with = function (a) {
  7. for (var b = Array(a.itemCount_), c = 0; c < a.itemCount_; c++)
  8. b[c] = Blockly.Python.valueToCode(a, "ADD" + c, Blockly.Python.ORDER_NONE) || "None";
  9. return ["[" + b.join(", ") + "]", Blockly.Python.ORDER_ATOMIC]
  10. };
  11. Blockly.Python.text_list = function (a) {
  12. return ["[" + Blockly.Python.quote_empty(a.getFieldValue("TEXT")) + "]", Blockly.Python.ORDER_ATOMIC]
  13. };
  14. Blockly.Python.lists_create_with_object = function (a) {
  15. for (var b = Array(a.itemCount_), c = 0; c < a.itemCount_; c++)
  16. b[c] = Blockly.Python.valueToCode(a, "ADD" + c, Blockly.Python.ORDER_NONE) || "None";
  17. return ["[" + b.join(", ") + "]", Blockly.Python.ORDER_ATOMIC]
  18. };
  19. Blockly.Python.CocoRobo_return_list = function (a) {
  20. var b = Blockly.Python.valueToCode(a, "list_name", Blockly.Python.ORDER_ATOMIC);
  21. a = Blockly.Python.valueToCode(a, "list_items", Blockly.Python.ORDER_ATOMIC);
  22. return b + " \x3d " + a + "\n"
  23. };
  24. Blockly.Python.lists_append = function (a) {
  25. var b = Blockly.Python.valueToCode(a, "list_name", Blockly.Python.ORDER_ATOMIC);
  26. a = Blockly.Python.valueToCode(a, "last_item", Blockly.Python.ORDER_ATOMIC);
  27. return b + ".append(" + a + ")\n"
  28. };
  29. Blockly.Python.lists_extend = function (a) {
  30. var b = Blockly.Python.valueToCode(a, "list_name", Blockly.Python.ORDER_ATOMIC);
  31. a = Blockly.Python.valueToCode(a, "extend_list", Blockly.Python.ORDER_ATOMIC);
  32. return b + ".extend(" + a + ")\n"
  33. };
  34. Blockly.Python.lists_clear = function (a) {
  35. return Blockly.Python.valueToCode(a, "list_name", Blockly.Python.ORDER_ATOMIC) + ".clear()\n"
  36. };
  37. Blockly.Python.list_order_item = function (a) {
  38. var b = Blockly.Python.valueToCode(a, "list_name", Blockly.Python.ORDER_ATOMIC),
  39. c = a.getFieldValue("list_order");
  40. a = Blockly.Python.valueToCode(a, "list_order_item", Blockly.Python.ORDER_ATOMIC);
  41. return [b + c + a + "]", Blockly.Python.ORDER_ATOMIC]
  42. };
  43. Blockly.Python.lists_clear = function (a) {
  44. return Blockly.Python.valueToCode(a, "list_name", Blockly.Python.ORDER_ATOMIC) + ".clear()\n"
  45. };
  46. Blockly.Python.parts_of_list = function (a) {
  47. var b = Blockly.Python.valueToCode(a, "list_name", Blockly.Python.ORDER_ATOMIC),
  48. c = a.getFieldValue("list_start_order"),
  49. d = a.getFieldValue("list_end_order"),
  50. e = Blockly.Python.valueToCode(a, "start_item", Blockly.Python.ORDER_ATOMIC);
  51. a = Blockly.Python.valueToCode(a, "end_item", Blockly.Python.ORDER_ATOMIC);
  52. switch (d) {
  53. case ":":
  54. var f = parseInt(a) + 1;
  55. break;
  56. case ":-":
  57. f = a - 1
  58. }
  59. return [b + c + e + d + f + "]", Blockly.Python.ORDER_ATOMIC]
  60. };
  61. Blockly.Python.list_to_tuple = function (a) {
  62. return ["tuple(" + Blockly.Python.valueToCode(a, "list_name", Blockly.Python.ORDER_ATOMIC) + ")", Blockly.Python.ORDER_ATOMIC]
  63. };
  64. Blockly.Python.list_order_item = function (a) {
  65. var b = Blockly.Python.valueToCode(a, "list_name", Blockly.Python.ORDER_ATOMIC),
  66. c = a.getFieldValue("list_order");
  67. a = Blockly.Python.valueToCode(a, "list_order_item", Blockly.Python.ORDER_ATOMIC);
  68. return [b + c + a + "]", Blockly.Python.ORDER_ATOMIC]
  69. };
  70. Blockly.Python.set_list_order_item = function (a) {
  71. var b = Blockly.Python.valueToCode(a, "list_name", Blockly.Python.ORDER_ATOMIC),
  72. c = a.getFieldValue("list_order"),
  73. d = Blockly.Python.valueToCode(a, "list_order_item", Blockly.Python.ORDER_ATOMIC);
  74. a = Blockly.Python.valueToCode(a, "set_value", Blockly.Python.ORDER_ATOMIC);
  75. return b + c + d + "] \x3d " + a + "\n"
  76. };
  77. Blockly.Python.insert_list_order_item = function (a) {
  78. var b = Blockly.Python.valueToCode(a, "list_name", Blockly.Python.ORDER_ATOMIC),
  79. c = a.getFieldValue("list_order"),
  80. d = Blockly.Python.valueToCode(a, "list_order_item", Blockly.Python.ORDER_ATOMIC);
  81. a = Blockly.Python.valueToCode(a, "set_value", Blockly.Python.ORDER_ATOMIC);
  82. return b + ".insert" + c + d + ", " + a + ")\n"
  83. };
  84. Blockly.Python.list_item_exist = function (a) {
  85. var b = Blockly.Python.valueToCode(a, "list_name", Blockly.Python.ORDER_ATOMIC);
  86. return [Blockly.Python.valueToCode(a, "list_item", Blockly.Python.ORDER_ATOMIC) + " in " + b, Blockly.Python.ORDER_ATOMIC]
  87. };
  88. Blockly.Python.lists_repeat = function (a) {
  89. var b = Blockly.Python.valueToCode(a, "ITEM", Blockly.Python.ORDER_NONE) || "None";
  90. a = Blockly.Python.valueToCode(a, "NUM", Blockly.Python.ORDER_MULTIPLICATIVE) || "0";
  91. return ["[" + b + "] * " + a, Blockly.Python.ORDER_MULTIPLICATIVE]
  92. };
  93. Blockly.Python.lists_length = function (a) {
  94. return ["len(" + (Blockly.Python.valueToCode(a, "VALUE", Blockly.Python.ORDER_NONE) || "[]") + ")", Blockly.Python.ORDER_FUNCTION_CALL]
  95. };
  96. Blockly.Python.lists_isEmpty = function (a) {
  97. return ["not len(" + (Blockly.Python.valueToCode(a, "VALUE", Blockly.Python.ORDER_NONE) || "[]") + ")", Blockly.Python.ORDER_LOGICAL_NOT]
  98. };
  99. Blockly.Python.lists_indexOf = function (a) {
  100. var b = Blockly.Python.valueToCode(a, "FIND", Blockly.Python.ORDER_NONE) || "[]"
  101. , c = Blockly.Python.valueToCode(a, "VALUE", Blockly.Python.ORDER_NONE) || "''";
  102. if (a.workspace.options.oneBasedIndex)
  103. var d = " 0"
  104. , e = " + 1"
  105. , f = "";
  106. else
  107. d = " -1",
  108. e = "",
  109. f = " - 1";
  110. if ("FIRST" == a.getFieldValue("END"))
  111. return a = Blockly.Python.provideFunction_("first_index", ["def " + Blockly.Python.FUNCTION_NAME_PLACEHOLDER_ + "(my_list, elem):", " try: index = my_list.index(elem)" + e, " except: index =" + d, " return index"]),
  112. [a + "(" + c + ", " + b + ")", Blockly.Python.ORDER_FUNCTION_CALL];
  113. a = Blockly.Python.provideFunction_("last_index", ["def " + Blockly.Python.FUNCTION_NAME_PLACEHOLDER_ + "(my_list, elem):", " try: index = len(my_list) - my_list[::-1].index(elem)" + f, " except: index =" + d, " return index"]);
  114. return [a + "(" + c + ", " + b + ")", Blockly.Python.ORDER_FUNCTION_CALL]
  115. };
  116. Blockly.Python.lists_getIndex = function (a) {
  117. var b = a.getFieldValue("MODE") || "GET"
  118. , c = a.getFieldValue("WHERE") || "FROM_START"
  119. , d = Blockly.Python.valueToCode(a, "VALUE", "RANDOM" == c ? Blockly.Python.ORDER_NONE : Blockly.Python.ORDER_MEMBER) || "[]";
  120. switch (c) {
  121. case "FIRST":
  122. if ("GET" == b)
  123. return [d + "[0]", Blockly.Python.ORDER_MEMBER];
  124. if ("GET_REMOVE" == b)
  125. return [d + ".pop(0)", Blockly.Python.ORDER_FUNCTION_CALL];
  126. if ("REMOVE" == b)
  127. return d + ".pop(0)\n";
  128. break;
  129. case "LAST":
  130. if ("GET" == b)
  131. return [d + "[-1]", Blockly.Python.ORDER_MEMBER];
  132. if ("GET_REMOVE" == b)
  133. return [d + ".pop()", Blockly.Python.ORDER_FUNCTION_CALL];
  134. if ("REMOVE" == b)
  135. return d + ".pop()\n";
  136. break;
  137. case "FROM_START":
  138. a = Blockly.Python.valueToCode(a, "AT", Blockly.Python.ORDER_ATOMIC);
  139. if ("GET" == b)
  140. return [d + "[" + a + "]", Blockly.Python.ORDER_MEMBER];
  141. if ("GET_REMOVE" == b)
  142. return [d + ".pop(" + a + ")", Blockly.Python.ORDER_FUNCTION_CALL];
  143. if ("REMOVE" == b)
  144. return d + ".pop(" + a + ")\n";
  145. break;
  146. case "FROM_END":
  147. a = Blockly.Python.getAdjustedInt(a, "AT", 1, !0);
  148. if ("GET" == b)
  149. return [d + "[" + a + "]", Blockly.Python.ORDER_MEMBER];
  150. if ("GET_REMOVE" == b)
  151. return [d + ".pop(" + a + ")", Blockly.Python.ORDER_FUNCTION_CALL];
  152. if ("REMOVE" == b)
  153. return d + ".pop(" + a + ")\n";
  154. break;
  155. case "RANDOM":
  156. Blockly.Python.definitions_.import_random = "import random";
  157. if ("GET" == b)
  158. return ["random.choice(" + d + ")", Blockly.Python.ORDER_FUNCTION_CALL];
  159. d = Blockly.Python.provideFunction_("lists_remove_random_item", ["def " + Blockly.Python.FUNCTION_NAME_PLACEHOLDER_ + "(myList):", " x = int(random.random() * len(myList))", " return myList.pop(x)"]) + "(" + d + ")";
  160. if ("GET_REMOVE" == b)
  161. return [d, Blockly.Python.ORDER_FUNCTION_CALL];
  162. if ("REMOVE" == b)
  163. return d + "\n"
  164. }
  165. throw "Unhandled combination (lists_getIndex).";
  166. };
  167. Blockly.Python.lists_setIndex = function (a) {
  168. var b = Blockly.Python.valueToCode(a, "LIST", Blockly.Python.ORDER_MEMBER) || "[]"
  169. , c = a.getFieldValue("MODE") || "GET"
  170. , d = a.getFieldValue("WHERE") || "FROM_START"
  171. , e = Blockly.Python.valueToCode(a, "TO", Blockly.Python.ORDER_NONE) || "None";
  172. switch (d) {
  173. case "FIRST":
  174. if ("SET" == c)
  175. return b + "[0] = " + e + "\n";
  176. if ("INSERT" == c)
  177. return b + ".insert(0, " + e + ")\n";
  178. break;
  179. case "LAST":
  180. if ("SET" == c)
  181. return b + "[-1] = " + e + "\n";
  182. if ("INSERT" == c)
  183. return b + ".append(" + e + ")\n";
  184. break;
  185. case "FROM_START":
  186. a = Blockly.Python.getAdjustedInt(a, "AT");
  187. if ("SET" == c)
  188. return b + "[" + a + "] = " + e + "\n";
  189. if ("INSERT" == c)
  190. return b + ".insert(" + a + ", " + e + ")\n";
  191. break;
  192. case "FROM_END":
  193. a = Blockly.Python.getAdjustedInt(a, "AT", 1, !0);
  194. if ("SET" == c)
  195. return b + "[" + a + "] = " + e + "\n";
  196. if ("INSERT" == c)
  197. return b + ".insert(" + a + ", " + e + ")\n";
  198. break;
  199. case "RANDOM":
  200. Blockly.Python.definitions_.import_random = "import random";
  201. b.match(/^\w+$/) ? a = "" : (a = Blockly.Python.variableDB_.getDistinctName("tmp_list", Blockly.Variables.NAME_TYPE),
  202. d = a + " = " + b + "\n",
  203. b = a,
  204. a = d);
  205. d = Blockly.Python.variableDB_.getDistinctName("tmp_x", Blockly.Variables.NAME_TYPE);
  206. a += d + " = int(random.random() * len(" + b + "))\n";
  207. if ("SET" == c)
  208. return a + (b + "[" + d + "] = " + e + "\n");
  209. if ("INSERT" == c)
  210. return a + (b + ".insert(" + d + ", " + e + ")\n")
  211. }
  212. throw "Unhandled combination (lists_setIndex).";
  213. };
  214. Blockly.Python.lists_getSublist = function (a) {
  215. var b = Blockly.Python.valueToCode(a, "LIST", Blockly.Python.ORDER_MEMBER) || "[]"
  216. , c = a.getFieldValue("WHERE1")
  217. , d = a.getFieldValue("WHERE2");
  218. switch (c) {
  219. case "FROM_START":
  220. c = Blockly.Python.getAdjustedInt(a, "AT1");
  221. "0" == c && (c = "");
  222. break;
  223. case "FROM_END":
  224. c = Blockly.Python.getAdjustedInt(a, "AT1", 1, !0);
  225. break;
  226. case "FIRST":
  227. c = "";
  228. break;
  229. default:
  230. throw "Unhandled option (lists_getSublist)";
  231. }
  232. switch (d) {
  233. case "FROM_START":
  234. a = Blockly.Python.getAdjustedInt(a, "AT2", 1);
  235. break;
  236. case "FROM_END":
  237. a = Blockly.Python.getAdjustedInt(a, "AT2", 0, !0);
  238. Blockly.isNumber(String(a)) ? "0" == a && (a = "") : (Blockly.Python.definitions_.import_sys = "import sys",
  239. a += " or sys.maxsize");
  240. break;
  241. case "LAST":
  242. a = "";
  243. break;
  244. default:
  245. throw "Unhandled option (lists_getSublist)";
  246. }
  247. return [b + "[" + c + " : " + a + "]", Blockly.Python.ORDER_MEMBER]
  248. };
  249. Blockly.Python.lists_sort = function (a) {
  250. var b = Blockly.Python.valueToCode(a, "LIST", Blockly.Python.ORDER_NONE) || "[]"
  251. , c = a.getFieldValue("TYPE");
  252. a = "1" === a.getFieldValue("DIRECTION") ? "False" : "True";
  253. return [Blockly.Python.provideFunction_("lists_sort", ["def " + Blockly.Python.FUNCTION_NAME_PLACEHOLDER_ + "(my_list, type, reverse):", " def try_float(s):", " try:", " return float(s)", " except:", " return 0", " key_funcs = {", ' "NUMERIC": try_float,', ' "TEXT": str,', ' "IGNORE_CASE": lambda s: str(s).lower()', " }", " key_func = key_funcs[type]", " list_cpy = list(my_list)", " return sorted(list_cpy, key=key_func, reverse=reverse)"]) + "(" + b + ', "' + c + '", ' + a + ")", Blockly.Python.ORDER_FUNCTION_CALL]
  254. };
  255. Blockly.Python.lists_split = function (a) {
  256. var b = a.getFieldValue("MODE");
  257. if ("SPLIT" == b)
  258. b = Blockly.Python.valueToCode(a, "INPUT", Blockly.Python.ORDER_MEMBER) || "''",
  259. a = Blockly.Python.valueToCode(a, "DELIM", Blockly.Python.ORDER_NONE),
  260. a = b + ".split(" + a + ")";
  261. else if ("JOIN" == b)
  262. b = Blockly.Python.valueToCode(a, "INPUT", Blockly.Python.ORDER_NONE) || "[]",
  263. a = Blockly.Python.valueToCode(a, "DELIM", Blockly.Python.ORDER_MEMBER) || "''",
  264. a = a + ".join(" + b + ")";
  265. else
  266. throw "Unknown mode: " + b;
  267. return [a, Blockly.Python.ORDER_FUNCTION_CALL]
  268. };
  269. Blockly.Python.list_first_index = function(a) {
  270. var b = Blockly.Python.valueToCode(a, "elem", Blockly.Python.ORDER_ATOMIC),
  271. c = Blockly.Python.valueToCode(a, "my_list", Blockly.Python.ORDER_ATOMIC);
  272. a = a.getFieldValue("last_or_first");
  273. Blockly.Python.codeFunctions_.list_first_index = "def first_index(my_list, elem):\n try: index \x3d my_list.index(elem)\n except: index \x3d 0\n return index";
  274. Blockly.Python.codeFunctions_.list_last_index = "def last_index(my_list, elem):\n try: index \x3d len(my_list) - my_list[::-1].index(elem) - 1\n except: index \x3d 0\n return index";
  275. return [a + "_index(" + c + ", " + b + ")", Blockly.Python.ORDER_ATOMIC]
  276. };
  277. export default Blockly;