├── .gitignore ├── README.md ├── acorn_interpreter.js ├── blockly_compressed.js ├── blocks_compressed.js ├── javascript_compressed.js ├── media ├── 1x1.gif ├── click.mp3 ├── click.ogg ├── click.wav ├── delete.mp3 ├── delete.ogg ├── delete.wav ├── disconnect.mp3 ├── disconnect.ogg ├── disconnect.wav ├── handclosed.cur ├── handdelete.cur ├── handopen.cur ├── quote0.png ├── quote1.png ├── sprites.png └── sprites.svg ├── msg ├── js │ ├── ab.js │ ├── ar.js │ ├── az.js │ ├── ba.js │ ├── bcc.js │ ├── be-tarask.js │ ├── be.js │ ├── bg.js │ ├── bn.js │ ├── br.js │ ├── ca.js │ ├── cs.js │ ├── da.js │ ├── de.js │ ├── diq.js │ ├── el.js │ ├── en-gb.js │ ├── en.js │ ├── eo.js │ ├── es.js │ ├── et.js │ ├── fa.js │ ├── fi.js │ ├── fr.js │ ├── he.js │ ├── hi.js │ ├── hrx.js │ ├── hu.js │ ├── ia.js │ ├── id.js │ ├── is.js │ ├── it.js │ ├── ja.js │ ├── kab.js │ ├── ko.js │ ├── lb.js │ ├── lki.js │ ├── lrc.js │ ├── lt.js │ ├── lv.js │ ├── mk.js │ ├── ms.js │ ├── nb.js │ ├── nl.js │ ├── oc.js │ ├── pl.js │ ├── pms.js │ ├── pt-br.js │ ├── pt.js │ ├── ro.js │ ├── ru.js │ ├── sc.js │ ├── sd.js │ ├── shn.js │ ├── sk.js │ ├── sl.js │ ├── sq.js │ ├── sr.js │ ├── sv.js │ ├── ta.js │ ├── tcy.js │ ├── th.js │ ├── tl.js │ ├── tlh.js │ ├── tr.js │ ├── uk.js │ ├── vi.js │ ├── zh-hans.js │ └── zh-hant.js ├── json │ ├── ab.json │ ├── ar.json │ ├── az.json │ ├── ba.json │ ├── bcc.json │ ├── be-tarask.json │ ├── be.json │ ├── bg.json │ ├── bn.json │ ├── br.json │ ├── ca.json │ ├── constants.json │ ├── cs.json │ ├── da.json │ ├── de.json │ ├── diq.json │ ├── el.json │ ├── en-gb.json │ ├── en.json │ ├── eo.json │ ├── es.json │ ├── et.json │ ├── eu.json │ ├── fa.json │ ├── fi.json │ ├── fr.json │ ├── he.json │ ├── hi.json │ ├── hrx.json │ ├── hu.json │ ├── ia.json │ ├── id.json │ ├── is.json │ ├── it.json │ ├── ja.json │ ├── kab.json │ ├── ko.json │ ├── lb.json │ ├── lki.json │ ├── lrc.json │ ├── lt.json │ ├── lv.json │ ├── mk.json │ ├── ms.json │ ├── nb.json │ ├── nl.json │ ├── oc.json │ ├── pl.json │ ├── pms.json │ ├── pt-br.json │ ├── pt.json │ ├── qqq.json │ ├── ro.json │ ├── ru.json │ ├── sc.json │ ├── sd.json │ ├── shn.json │ ├── sk.json │ ├── sl.json │ ├── sq.json │ ├── sr.json │ ├── sv.json │ ├── synonyms.json │ ├── ta.json │ ├── tcy.json │ ├── th.json │ ├── tl.json │ ├── tlh.json │ ├── tr.json │ ├── uk.json │ ├── vi.json │ ├── zh-hans.json │ └── zh-hant.json └── messages.js ├── python_compressed.js ├── server.pem ├── simple_https_server.py ├── socket.io.slim.js └── src ├── blockly_1_hello_world └── index.html ├── blockly_2.1_run_js_with_interpreter └── index.html ├── blockly_2.2_custom_block_run_js_with_interpreter ├── index.html └── readme.md ├── blockly_2_generate_and_run_js └── index.html ├── blockly_3_1_generate_python └── index.html ├── blockly_3_2_custom_block_generate_python ├── index.html └── readme.md ├── blockly_3_3_custom_json_block_generate_python └── index.html ├── blockly_4_run_python_in_browser_simple ├── index.html ├── jquery.min.js ├── my_blocks.js ├── readme.md ├── skulpt-stdlib.js └── skulpt.min.js ├── blockly_5_run_python_in_browser_turtle_finish ├── embed-blocks-4a6a121b.js ├── embed-blocks-iframe-1162d752.js ├── embed-python-f3eb213f.js ├── index.html ├── jquery.min.js ├── my_blocks.js ├── readme.md ├── skulpt-stdlib.js └── skulpt.min.js ├── blockly_hello_world_with_togetherjs ├── index.html └── readme.md ├── blocks4edx ├── blocks.js ├── demo_xml.js ├── index.html └── storage.js ├── pxt-microbit_hello_world ├── pxt_doc.md └── readme.md ├── scratch-blocks_hello_world ├── readme.md ├── scratch-block-test │ ├── dist │ │ ├── index.html │ │ ├── media │ │ │ ├── 1x1.gif │ │ │ ├── click.mp3 │ │ │ ├── click.ogg │ │ │ ├── click.wav │ │ │ ├── delete.mp3 │ │ │ ├── delete.ogg │ │ │ ├── delete.wav │ │ │ ├── dropdown-arrow-dark.svg │ │ │ ├── dropdown-arrow.svg │ │ │ ├── extensions │ │ │ │ ├── music-block-icon.svg │ │ │ │ ├── pen-block-icon.svg │ │ │ │ └── wedo2-block-icon.svg │ │ │ ├── eyedropper.svg │ │ │ ├── green-flag.svg │ │ │ ├── handclosed.cur │ │ │ ├── handdelete.cur │ │ │ ├── handopen.cur │ │ │ ├── icons │ │ │ │ ├── arrow.svg │ │ │ │ ├── control_forever.svg │ │ │ │ ├── control_repeat.svg │ │ │ │ ├── control_stop.svg │ │ │ │ ├── control_wait.svg │ │ │ │ ├── event_broadcast_blue.svg │ │ │ │ ├── event_broadcast_coral.svg │ │ │ │ ├── event_broadcast_green.svg │ │ │ │ ├── event_broadcast_magenta.svg │ │ │ │ ├── event_broadcast_orange.svg │ │ │ │ ├── event_broadcast_purple.svg │ │ │ │ ├── event_when-broadcast-received_blue.svg │ │ │ │ ├── event_when-broadcast-received_coral.svg │ │ │ │ ├── event_when-broadcast-received_green.svg │ │ │ │ ├── event_when-broadcast-received_magenta.svg │ │ │ │ ├── event_when-broadcast-received_orange.svg │ │ │ │ ├── event_when-broadcast-received_purple.svg │ │ │ │ ├── event_whenflagclicked.svg │ │ │ │ ├── remove.svg │ │ │ │ ├── set-led_blue.svg │ │ │ │ ├── set-led_coral.svg │ │ │ │ ├── set-led_green.svg │ │ │ │ ├── set-led_magenta.svg │ │ │ │ ├── set-led_mystery.svg │ │ │ │ ├── set-led_orange.svg │ │ │ │ ├── set-led_purple.svg │ │ │ │ ├── set-led_white.svg │ │ │ │ ├── set-led_yellow.svg │ │ │ │ ├── wedo_motor-clockwise.svg │ │ │ │ ├── wedo_motor-counterclockwise.svg │ │ │ │ ├── wedo_motor-speed_fast.svg │ │ │ │ ├── wedo_motor-speed_med.svg │ │ │ │ ├── wedo_motor-speed_slow.svg │ │ │ │ ├── wedo_when-distance_close.svg │ │ │ │ ├── wedo_when-tilt-backward.svg │ │ │ │ ├── wedo_when-tilt-forward.svg │ │ │ │ ├── wedo_when-tilt-left.svg │ │ │ │ ├── wedo_when-tilt-right.svg │ │ │ │ └── wedo_when-tilt.svg │ │ │ ├── repeat.svg │ │ │ ├── rotate-left.svg │ │ │ ├── rotate-right.svg │ │ │ ├── sprites.png │ │ │ ├── sprites.svg │ │ │ ├── zoom-in.svg │ │ │ ├── zoom-out.svg │ │ │ └── zoom-reset.svg │ │ ├── python_compressed.js │ │ └── scratch-block-test.js │ ├── package.json │ ├── src │ │ ├── index.html │ │ ├── python_compressed.js │ │ └── scratch-block-test.js │ └── webpack.config.js └── scratch-block-test_note.md └── scratch3-adapter-4-blockly ├── index.html └── readme.md /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | 8 | # Runtime data 9 | pids 10 | *.pid 11 | *.seed 12 | *.pid.lock 13 | 14 | # Directory for instrumented libs generated by jscoverage/JSCover 15 | lib-cov 16 | 17 | # Coverage directory used by tools like istanbul 18 | coverage 19 | 20 | # nyc test coverage 21 | .nyc_output 22 | 23 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 24 | .grunt 25 | 26 | # Bower dependency directory (https://bower.io/) 27 | bower_components 28 | 29 | # node-waf configuration 30 | .lock-wscript 31 | 32 | # Compiled binary addons (https://nodejs.org/api/addons.html) 33 | build/Release 34 | 35 | # Dependency directories 36 | node_modules/ 37 | jspm_packages/ 38 | 39 | # Typescript v1 declaration files 40 | typings/ 41 | 42 | # Optional npm cache directory 43 | .npm 44 | 45 | # Optional eslint cache 46 | .eslintcache 47 | 48 | # Optional REPL history 49 | .node_repl_history 50 | 51 | # Output of 'npm pack' 52 | *.tgz 53 | 54 | # Yarn Integrity file 55 | .yarn-integrity 56 | 57 | # dotenv environment variables file 58 | .env 59 | 60 | # next.js build output 61 | .next 62 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # blockly_dev 2 | blockly开发笔记 3 | 4 | 相关文章见[博客](http://wwj718.github.io/) 5 | 6 | # 依赖 7 | [blockly](https://github.com/google/blockly)版本: 2018.1.3号clone到本地的[版本](https://github.com/google/blockly/commit/bfd21e8d4efcbc247d47cf9369f675aef58c99ed) 8 | 9 | 本项目根目录中来自[blockly](https://github.com/google/blockly)的文件有: 10 | 11 | * msg(文件夹) 12 | * media(文件夹) 13 | * blockly_compressed.js 14 | * blocks_compressed.js 15 | * python_compressed.js 16 | 17 | # 内容 18 | * hello world 19 | * generate js code/run js code 20 | * generate python 21 | * post python code to server(run on server) 22 | * run python in browser -------------------------------------------------------------------------------- /media/1x1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wwj718/blockly_dev/f25d2d97deb6a32d4f9484e068469e6634660963/media/1x1.gif -------------------------------------------------------------------------------- /media/click.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wwj718/blockly_dev/f25d2d97deb6a32d4f9484e068469e6634660963/media/click.mp3 -------------------------------------------------------------------------------- /media/click.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wwj718/blockly_dev/f25d2d97deb6a32d4f9484e068469e6634660963/media/click.ogg -------------------------------------------------------------------------------- /media/click.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wwj718/blockly_dev/f25d2d97deb6a32d4f9484e068469e6634660963/media/click.wav -------------------------------------------------------------------------------- /media/delete.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wwj718/blockly_dev/f25d2d97deb6a32d4f9484e068469e6634660963/media/delete.mp3 -------------------------------------------------------------------------------- /media/delete.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wwj718/blockly_dev/f25d2d97deb6a32d4f9484e068469e6634660963/media/delete.ogg -------------------------------------------------------------------------------- /media/delete.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wwj718/blockly_dev/f25d2d97deb6a32d4f9484e068469e6634660963/media/delete.wav -------------------------------------------------------------------------------- /media/disconnect.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wwj718/blockly_dev/f25d2d97deb6a32d4f9484e068469e6634660963/media/disconnect.mp3 -------------------------------------------------------------------------------- /media/disconnect.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wwj718/blockly_dev/f25d2d97deb6a32d4f9484e068469e6634660963/media/disconnect.ogg -------------------------------------------------------------------------------- /media/disconnect.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wwj718/blockly_dev/f25d2d97deb6a32d4f9484e068469e6634660963/media/disconnect.wav -------------------------------------------------------------------------------- /media/handclosed.cur: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wwj718/blockly_dev/f25d2d97deb6a32d4f9484e068469e6634660963/media/handclosed.cur -------------------------------------------------------------------------------- /media/handdelete.cur: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wwj718/blockly_dev/f25d2d97deb6a32d4f9484e068469e6634660963/media/handdelete.cur -------------------------------------------------------------------------------- /media/handopen.cur: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wwj718/blockly_dev/f25d2d97deb6a32d4f9484e068469e6634660963/media/handopen.cur -------------------------------------------------------------------------------- /media/quote0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wwj718/blockly_dev/f25d2d97deb6a32d4f9484e068469e6634660963/media/quote0.png -------------------------------------------------------------------------------- /media/quote1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wwj718/blockly_dev/f25d2d97deb6a32d4f9484e068469e6634660963/media/quote1.png -------------------------------------------------------------------------------- /media/sprites.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wwj718/blockly_dev/f25d2d97deb6a32d4f9484e068469e6634660963/media/sprites.png -------------------------------------------------------------------------------- /media/sprites.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | -------------------------------------------------------------------------------- /msg/json/constants.json: -------------------------------------------------------------------------------- 1 | {"MATH_HUE": "230", "LOOPS_HUE": "120", "LISTS_HUE": "260", "LOGIC_HUE": "210", "VARIABLES_HUE": "330", "TEXTS_HUE": "160", "PROCEDURES_HUE": "290", "COLOUR_HUE": "20"} -------------------------------------------------------------------------------- /msg/json/lrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "@metadata": { 3 | "authors": [ 4 | "Mogoeilor" 5 | ] 6 | }, 7 | "VARIABLES_DEFAULT_NAME": "قلم", 8 | "TODAY": "ئمروٙ", 9 | "DUPLICATE_BLOCK": "کپی کردن", 10 | "ADD_COMMENT": "نظرتونه اضاف بکید", 11 | "REMOVE_COMMENT": "نظر جا وه جا کو", 12 | "EXTERNAL_INPUTS": "داده یا وه دری", 13 | "INLINE_INPUTS": "داده یا مئنجا", 14 | "DELETE_BLOCK": "پاکسا کردن برشت", 15 | "DELETE_X_BLOCKS": "پاکسا کردن%1 د برشتیا", 16 | "COLLAPSE_BLOCK": "کوچک کردن برشت", 17 | "COLLAPSE_ALL": "کوچک کردن برشتیا", 18 | "EXPAND_BLOCK": "گپ کردن برشت", 19 | "EXPAND_ALL": "گپ کردن برشتیا", 20 | "DISABLE_BLOCK": "ناکشتگر کردن برشت", 21 | "ENABLE_BLOCK": "کنشتگر کردن برشت", 22 | "HELP": "هومياری", 23 | "CHANGE_VALUE_TITLE": "ارزشت آلشت کو:", 24 | "RENAME_VARIABLE": "د نو نوم نیائن آلشتگر...", 25 | "RENAME_VARIABLE_TITLE": "د نو نوم نیائن %1 د تموم آلشتگریا د:", 26 | "NEW_VARIABLE": "آلشتگر تازه...", 27 | "NEW_VARIABLE_TITLE": "نوم آلشتگر تازه:", 28 | "COLOUR_PICKER_HELPURL": "https://en.wikipedia.org/wiki/Color", 29 | "COLOUR_PICKER_TOOLTIP": "یه رن د رنگ دو انتخاو بکید", 30 | "COLOUR_RANDOM_TITLE": "رن بختکی", 31 | "COLOUR_RANDOM_TOOLTIP": "یه رنگ بختکی انتخاو بکید", 32 | "COLOUR_RGB_TITLE": "رن وا", 33 | "COLOUR_RGB_RED": "سور", 34 | "COLOUR_RGB_GREEN": "سوز", 35 | "COLOUR_RGB_BLUE": "آوی", 36 | "COLOUR_BLEND_TITLE": "شیوسته", 37 | "COLOUR_BLEND_COLOUR1": "رن 1", 38 | "COLOUR_BLEND_COLOUR2": "رن 2", 39 | "COLOUR_BLEND_RATIO": "نسوت", 40 | "COLOUR_BLEND_TOOLTIP": "هر کوم د رنگیانه وا نسوت دائه بیه به شیون(0.0 - 1.0).", 41 | "CONTROLS_REPEAT_HELPURL": "https://en.wikipedia.org/wiki/For_loop", 42 | "CONTROLS_REPEAT_TITLE": "%1 تکرار کو چن بار", 43 | "CONTROLS_REPEAT_INPUT_DO": "انجوم بئه", 44 | "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "تا تکرار کو", 45 | "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "تا تکرار کو", 46 | "CONTROLS_FOR_TITLE": "اشماردن وا %1 د %2 سی %3 وا %4", 47 | "CONTROLS_FOREACH_TITLE": "سی هر قلم %1 د نوم گه %2", 48 | "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "حلقه نه خراو کو", 49 | "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "حلقه شومل بیه نه خراو کو", 50 | "CONTROLS_IF_MSG_IF": "ار", 51 | "CONTROLS_IF_MSG_ELSEIF": "هنی ار", 52 | "CONTROLS_IF_MSG_ELSE": "هنی", 53 | "LOGIC_OPERATION_AND": "و", 54 | "LOGIC_OPERATION_OR": "یا", 55 | "LOGIC_NEGATE_TITLE": "نه %1", 56 | "LOGIC_BOOLEAN_TRUE": "راست و دوروست", 57 | "LOGIC_BOOLEAN_FALSE": "غلط", 58 | "LOGIC_BOOLEAN_TOOLTIP": "هم غلط و هم راس ورگن", 59 | "LOGIC_NULL": "خمثی", 60 | "LOGIC_TERNARY_CONDITION": "آزماشت کردن", 61 | "LOGIC_TERNARY_IF_TRUE": "ار درس بی", 62 | "LOGIC_TERNARY_IF_FALSE": "ار غلط بی", 63 | "MATH_NUMBER_HELPURL": "https://en.wikipedia.org/wiki/Number", 64 | "MATH_NUMBER_TOOLTIP": "یه شماره.", 65 | "MATH_ARITHMETIC_HELPURL": "https://en.wikipedia.org/wiki/Arithmetic", 66 | "MATH_ARITHMETIC_TOOLTIP_ADD": "وه انازه دو گل شماره ورگن.", 67 | "MATH_SINGLE_HELPURL": "https://en.wikipedia.org/wiki/Square_root", 68 | "MATH_SINGLE_OP_ROOT": "چارسوک ریشه", 69 | "MATH_SINGLE_OP_ABSOLUTE": "تموم و کمال", 70 | "MATH_TRIG_HELPURL": "https://en.wikipedia.org/wiki/Trigonometric_functions", 71 | "MATH_CONSTANT_HELPURL": "https://en.wikipedia.org/wiki/Mathematical_constant", 72 | "MATH_IS_EVEN": "همیشه هیئش", 73 | "MATH_IS_ODD": "تهنائه", 74 | "MATH_IS_PRIME": "وه اوله", 75 | "MATH_IS_WHOLE": "همشه", 76 | "MATH_IS_POSITIVE": "مثبته", 77 | "MATH_IS_NEGATIVE": "منفیه", 78 | "MATH_IS_DIVISIBLE_BY": "یه وا بهر بیه", 79 | "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", 80 | "MATH_CHANGE_TITLE": "آلشت بكيد %1 وا %2", 81 | "MATH_ROUND_HELPURL": "https://en.wikipedia.org/wiki/Rounding", 82 | "MATH_ROUND_OPERATOR_ROUND": "گرد کردن", 83 | "MATH_ROUND_OPERATOR_ROUNDUP": "وه رو گرد کردن", 84 | "MATH_ROUND_OPERATOR_ROUNDDOWN": "وه هار گرد کردن", 85 | "MATH_ONLIST_OPERATOR_SUM": "جم کردن نومگه", 86 | "MATH_ONLIST_OPERATOR_MIN": "کمترونه د نومگه", 87 | "MATH_ONLIST_OPERATOR_MAX": "بیشترونه د نومگه", 88 | "MATH_ONLIST_OPERATOR_AVERAGE": "مینجاگه نوم گه", 89 | "MATH_ONLIST_OPERATOR_MEDIAN": "مینجا نوم گه", 90 | "MATH_ONLIST_OPERATOR_MODE": "بیشری د نومگه", 91 | "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", 92 | "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", 93 | "MATH_RANDOM_FLOAT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", 94 | "TEXT_TEXT_HELPURL": "https://en.wikipedia.org/wiki/String_(computer_science)", 95 | "TEXT_JOIN_TITLE_CREATEWITH": "راس کردن متن وا", 96 | "TEXT_CREATE_JOIN_TITLE_JOIN": "پیوسن", 97 | "TEXT_ISEMPTY_TITLE": "%1 حالیه", 98 | "TEXT_INDEXOF_TITLE": "د متن %1 %2 %3", 99 | "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "د متن", 100 | "TEXT_GET_SUBSTRING_END_FROM_START": "سی واج#", 101 | "TEXT_GET_SUBSTRING_END_FROM_END": "سی واج# تا آخر", 102 | "TEXT_GET_SUBSTRING_END_LAST": "سی آخرین واج", 103 | "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "سی حرف گپ", 104 | "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "سی واج کؤچک", 105 | "LISTS_CREATE_EMPTY_TITLE": "یه گل نوم گه حالی راس بکیت", 106 | "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "نوم گه", 107 | "LISTS_ISEMPTY_TITLE": "%1 حالیه", 108 | "LISTS_INLIST": "د نوم گه", 109 | "LISTS_GET_INDEX_GET": "گرتن", 110 | "LISTS_GET_INDEX_GET_REMOVE": "گرتن و جاوه جا بیئن", 111 | "LISTS_GET_INDEX_REMOVE": "ؤرداشتن", 112 | "LISTS_GET_INDEX_FROM_END": "# تا آخر", 113 | "LISTS_GET_INDEX_FIRST": "اولی", 114 | "LISTS_GET_INDEX_LAST": "آخر", 115 | "LISTS_GET_INDEX_RANDOM": "بختكی", 116 | "LISTS_SET_INDEX_INSERT": "بنه د", 117 | "LISTS_SET_INDEX_INPUT_TO": "چی", 118 | "LISTS_GET_SUBLIST_END_FROM_START": "سی#", 119 | "LISTS_GET_SUBLIST_END_LAST": "سی آخر", 120 | "VARIABLES_SET": "میزوکاری %1 سی %2", 121 | "PROCEDURES_DEFNORETURN_TITLE": "سی", 122 | "PROCEDURES_DEFNORETURN_PROCEDURE": "یه کار انجوم بیئت", 123 | "PROCEDURES_BEFORE_PARAMS": "وا:", 124 | "PROCEDURES_CALL_BEFORE_PARAMS": "وا:", 125 | "PROCEDURES_DEFRETURN_RETURN": "ورگنیئن", 126 | "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", 127 | "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", 128 | "PROCEDURES_MUTATORCONTAINER_TITLE": "داده یا", 129 | "PROCEDURES_MUTATORARG_TITLE": "نوم داده:", 130 | "PROCEDURES_CREATE_DO": "راس کردن%1" 131 | } 132 | -------------------------------------------------------------------------------- /msg/json/mk.json: -------------------------------------------------------------------------------- 1 | { 2 | "@metadata": { 3 | "authors": [ 4 | "Bjankuloski06" 5 | ] 6 | }, 7 | "VARIABLES_DEFAULT_NAME": "елемент", 8 | "DUPLICATE_BLOCK": "Ископирај", 9 | "ADD_COMMENT": "Додај коментар:", 10 | "REMOVE_COMMENT": "Отстрани коментар", 11 | "EXTERNAL_INPUTS": "Надворешен внос", 12 | "INLINE_INPUTS": "Внатрешен внос", 13 | "DELETE_BLOCK": "Избриши блок", 14 | "DELETE_X_BLOCKS": "Избриши %1 блока", 15 | "DELETE_ALL_BLOCKS": "Да ги избришам сите %1 блокчиња?", 16 | "COLLAPSE_BLOCK": "Собери блок", 17 | "COLLAPSE_ALL": "Собери блокови", 18 | "EXPAND_BLOCK": "Рашири го блокови", 19 | "EXPAND_ALL": "Рашири блокови", 20 | "DISABLE_BLOCK": "Исклучи блок", 21 | "ENABLE_BLOCK": "Вклучи блок", 22 | "HELP": "Помош", 23 | "CHANGE_VALUE_TITLE": "Смена на вредност:", 24 | "NEW_VARIABLE": "Нова променлива...", 25 | "NEW_VARIABLE_TITLE": "Назив на новата променлива:", 26 | "RENAME_VARIABLE": "Преименувај променлива...", 27 | "RENAME_VARIABLE_TITLE": "Преименувај ги сите променливи „%1“ во:", 28 | "COLOUR_PICKER_HELPURL": "https://mk.wikipedia.org/wiki/Боја", 29 | "COLOUR_PICKER_TOOLTIP": "Изберете боја од палетата.", 30 | "COLOUR_RANDOM_TITLE": "случајна боја", 31 | "COLOUR_RANDOM_TOOLTIP": "Избери боја на тепка.", 32 | "COLOUR_RGB_TITLE": "боја со", 33 | "COLOUR_RGB_RED": "црвена", 34 | "COLOUR_RGB_GREEN": "зелена", 35 | "COLOUR_RGB_BLUE": "сина", 36 | "COLOUR_RGB_TOOLTIP": "Создајте боја со укажаните износи на црвена, зелена и сина. Сите вредности мора да бидат помеѓу 0 и 100.", 37 | "COLOUR_BLEND_TITLE": "смешај", 38 | "COLOUR_BLEND_COLOUR1": "боја 1", 39 | "COLOUR_BLEND_COLOUR2": "боја 2", 40 | "COLOUR_BLEND_RATIO": "сооднос", 41 | "COLOUR_BLEND_TOOLTIP": "Меша две бои во даден сооднос (0.0 - 1.0).", 42 | "CONTROLS_REPEAT_HELPURL": "https://mk.wikipedia.org/wiki/For-јамка", 43 | "CONTROLS_REPEAT_TITLE": "повтори %1 пати", 44 | "CONTROLS_REPEAT_INPUT_DO": "исполни", 45 | "CONTROLS_REPEAT_TOOLTIP": "Исполнува наредби неколку пати.", 46 | "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "повторувај додека", 47 | "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "повторувај сè до", 48 | "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Додека вредноста е вистинита, исполнува наредби.", 49 | "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Додека вредноста е невистинита, исполнува наредби.", 50 | "CONTROLS_FOR_TOOLTIP": "Променливата \"%1\" да ги земе вредностите од почетниот до завршниот број, броејќи според укажаниот интервал и ги исполнува укажаните блокови.", 51 | "CONTROLS_FOR_TITLE": "број со %1 од %2 до %3 со %4", 52 | "CONTROLS_FOREACH_TITLE": "за секој елемент %1 на списокот %2", 53 | "CONTROLS_FOREACH_TOOLTIP": "Му ја задава променливата „%1“ на секој елемент на списокот, а потоа исполнува наредби.", 54 | "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "излези од јамката", 55 | "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "продолжи со следното повторување на јамката", 56 | "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Излези од содржечката јамка.", 57 | "CONTROLS_IF_MSG_IF": "ако", 58 | "CONTROLS_IF_MSG_ELSEIF": "инаку ако", 59 | "CONTROLS_IF_MSG_ELSE": "инаку", 60 | "CONTROLS_IF_IF_TOOLTIP": "Додава, отстранува или прередува делови за прераспоредување на овој блок „ако“.", 61 | "LOGIC_COMPARE_HELPURL": "https://mk.wikipedia.org/wiki/Неравенство", 62 | "LOGIC_COMPARE_TOOLTIP_EQ": "Дава вистина ако обата вноса се еднакви.", 63 | "LOGIC_COMPARE_TOOLTIP_NEQ": "Дава вистина ако обата вноса не се еднакви.", 64 | "LOGIC_COMPARE_TOOLTIP_LT": "Дава вистина ако првиот внос е помал од вториот.", 65 | "LOGIC_COMPARE_TOOLTIP_LTE": "Дава вистина ако првиот внос е помал или еднаков на вториот.", 66 | "LOGIC_COMPARE_TOOLTIP_GT": "Дава вистина ако првиот внос е поголем од вториот.", 67 | "LOGIC_COMPARE_TOOLTIP_GTE": "Дава вистина ако првиот внос е поголем или еднаков на вториот.", 68 | "LOGIC_OPERATION_TOOLTIP_AND": "Дава вистина ако обата вноса се вистинити.", 69 | "LOGIC_OPERATION_AND": "и", 70 | "LOGIC_OPERATION_TOOLTIP_OR": "Дава вистина ако барем еден од вносовите е вистинит.", 71 | "LOGIC_OPERATION_OR": "или", 72 | "LOGIC_NEGATE_TITLE": "не %1", 73 | "LOGIC_NEGATE_TOOLTIP": "Дава вистина ако вносот е невистинит. Дава невистина ако вносот е вистинит.", 74 | "LOGIC_BOOLEAN_TRUE": "вистина", 75 | "LOGIC_BOOLEAN_FALSE": "невистина", 76 | "LOGIC_BOOLEAN_TOOLTIP": "Дава или вистина или невистина.", 77 | "LOGIC_NULL": "ништо", 78 | "LOGIC_NULL_TOOLTIP": "Дава ништо.", 79 | "LOGIC_TERNARY_CONDITION": "испробај", 80 | "LOGIC_TERNARY_IF_TRUE": "ако е вистинито", 81 | "LOGIC_TERNARY_IF_FALSE": "ако е невистинито", 82 | "MATH_CONSTANT_HELPURL": "https://mk.wikipedia.org/wiki/Математичка_константа", 83 | "MATH_CONSTANT_TOOLTIP": "Дава една од вообичаените константи: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), или ∞ (бесконечност).", 84 | "MATH_IS_EVEN": "е парен", 85 | "MATH_IS_ODD": "е непарен", 86 | "MATH_IS_PRIME": "е прост", 87 | "MATH_IS_WHOLE": "е цел", 88 | "MATH_IS_POSITIVE": "е позитивен", 89 | "MATH_IS_NEGATIVE": "е негативен", 90 | "MATH_IS_DIVISIBLE_BY": "е делив со", 91 | "MATH_IS_TOOLTIP": "Проверува дали бројот е парен, непарен, прост, цел, позитивен, негативен или делив со некој број. Дава вистина или невистина.", 92 | "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter?uselang=mk", 93 | "MATH_CHANGE_TITLE": "повиши %1 за %2", 94 | "MATH_CHANGE_TOOLTIP": "Ѝ додава број на променливата „%1“.", 95 | "MATH_ROUND_HELPURL": "https://mk.wikipedia.org/wiki/Заокружување", 96 | "MATH_ROUND_TOOLTIP": "Го заокружува бројот на поголем или помал.", 97 | "MATH_ROUND_OPERATOR_ROUND": "заокружи", 98 | "MATH_ROUND_OPERATOR_ROUNDUP": "заокружи на поголемо", 99 | "MATH_ROUND_OPERATOR_ROUNDDOWN": "заокружи на помало", 100 | "MATH_ONLIST_OPERATOR_SUM": "збир од списокот", 101 | "MATH_ONLIST_TOOLTIP_SUM": "Дава збир од сите броеви на списокот.", 102 | "MATH_ONLIST_OPERATOR_MIN": "најмал на списокот", 103 | "MATH_ONLIST_TOOLTIP_MIN": "Го дава најмалиот број на списокот.", 104 | "MATH_ONLIST_OPERATOR_MAX": "најголем на списокот", 105 | "MATH_ONLIST_TOOLTIP_MAX": "Го дава најголемиот број на списокот.", 106 | "MATH_ONLIST_OPERATOR_AVERAGE": "просек на списокот", 107 | "MATH_ONLIST_TOOLTIP_AVERAGE": "Дава просек (аритметичка средина) од броевите на списокот.", 108 | "MATH_ONLIST_OPERATOR_MEDIAN": "медијана на списокот", 109 | "MATH_ONLIST_TOOLTIP_MEDIAN": "Дава медијана од броевите на списокот.", 110 | "MATH_ONLIST_OPERATOR_MODE": "модул на списокот", 111 | "MATH_ONLIST_TOOLTIP_MODE": "Дава список на најзастапен(и) елемент(и) на списокот." 112 | } 113 | -------------------------------------------------------------------------------- /msg/json/oc.json: -------------------------------------------------------------------------------- 1 | { 2 | "@metadata": { 3 | "authors": [ 4 | "Cedric31" 5 | ] 6 | }, 7 | "VARIABLES_DEFAULT_NAME": "element", 8 | "TODAY": "Uèi", 9 | "DUPLICATE_BLOCK": "Duplicar", 10 | "ADD_COMMENT": "Apondre un comentari", 11 | "REMOVE_COMMENT": "Suprimir un comentari", 12 | "EXTERNAL_INPUTS": "Entradas extèrnas", 13 | "INLINE_INPUTS": "Entradas en linha", 14 | "DELETE_BLOCK": "Suprimir lo blòt", 15 | "DELETE_X_BLOCKS": "Suprimir %1 blòts", 16 | "DELETE_ALL_BLOCKS": "Suprimir totes los %1 blòts ?", 17 | "CLEAN_UP": "Netejar los blòts", 18 | "COLLAPSE_BLOCK": "Redusir lo blòt", 19 | "COLLAPSE_ALL": "Redusir los blòts", 20 | "EXPAND_BLOCK": "Desvolopar lo blòt", 21 | "EXPAND_ALL": "Desvolopar los blòts", 22 | "DISABLE_BLOCK": "Desactivar lo blòt", 23 | "ENABLE_BLOCK": "Activar lo blòt", 24 | "HELP": "Ajuda", 25 | "UNDO": "Anullar", 26 | "REDO": "Refar", 27 | "CHANGE_VALUE_TITLE": "Modificar la valor :", 28 | "RENAME_VARIABLE": "Renomenar la variabla…", 29 | "RENAME_VARIABLE_TITLE": "Renomenar totas las variablas « %1 » a :", 30 | "NEW_VARIABLE": "Crear una variabla...", 31 | "NEW_VARIABLE_TITLE": "Nom de la novèla variabla :", 32 | "COLOUR_PICKER_HELPURL": "https://oc.wikipedia.org/wiki/Color", 33 | "COLOUR_RANDOM_TITLE": "color aleatòria", 34 | "COLOUR_RANDOM_TOOLTIP": "Causir una color a l'azard.", 35 | "COLOUR_RGB_TITLE": "coloriar amb", 36 | "COLOUR_RGB_RED": "roge", 37 | "COLOUR_RGB_GREEN": "verd", 38 | "COLOUR_RGB_BLUE": "blau", 39 | "COLOUR_BLEND_TITLE": "mesclar", 40 | "COLOUR_BLEND_COLOUR1": "color 1", 41 | "COLOUR_BLEND_COLOUR2": "color 2", 42 | "COLOUR_BLEND_RATIO": "ratio", 43 | "CONTROLS_REPEAT_HELPURL": "https://oc.wikipedia.org/wiki/For_loop", 44 | "CONTROLS_REPEAT_TITLE": "repetir %1 còps", 45 | "CONTROLS_REPEAT_INPUT_DO": "far", 46 | "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "repetir tant que", 47 | "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "repetir fins a", 48 | "CONTROLS_FOR_TITLE": "comptar amb %1 de %2 a %3 per %4", 49 | "CONTROLS_FOREACH_TITLE": "per cada element %1 dins la lista %2", 50 | "CONTROLS_IF_MSG_IF": "se", 51 | "CONTROLS_IF_MSG_ELSEIF": "siquenon se", 52 | "CONTROLS_IF_MSG_ELSE": "siquenon", 53 | "LOGIC_COMPARE_TOOLTIP_EQ": "Renviar verai se las doas entradas son egalas.", 54 | "LOGIC_COMPARE_TOOLTIP_NEQ": "Renviar verai se las doas entradas son diferentas.", 55 | "LOGIC_OPERATION_TOOLTIP_AND": "Renviar verai se las doas entradas son vertadièras.", 56 | "LOGIC_OPERATION_AND": "e", 57 | "LOGIC_OPERATION_OR": "o", 58 | "LOGIC_NEGATE_TITLE": "pas %1", 59 | "LOGIC_BOOLEAN_TRUE": "verai", 60 | "LOGIC_BOOLEAN_FALSE": "fals", 61 | "LOGIC_NULL": "nul", 62 | "LOGIC_NULL_TOOLTIP": "Renvia nul.", 63 | "LOGIC_TERNARY_CONDITION": "tèst", 64 | "LOGIC_TERNARY_IF_TRUE": "se verai", 65 | "LOGIC_TERNARY_IF_FALSE": "se fals", 66 | "MATH_NUMBER_HELPURL": "https://oc.wikipedia.org/wiki/Nombre", 67 | "MATH_NUMBER_TOOLTIP": "Un nombre.", 68 | "MATH_ARITHMETIC_HELPURL": "https://oc.wikipedia.org/wiki/Aritmetica", 69 | "MATH_SINGLE_OP_ROOT": "raiç carrada", 70 | "MATH_SINGLE_OP_ABSOLUTE": "absolut", 71 | "MATH_IS_EVEN": "es par", 72 | "MATH_IS_ODD": "es impar", 73 | "MATH_IS_PRIME": "es primièr", 74 | "MATH_IS_WHOLE": "es entièr", 75 | "MATH_IS_POSITIVE": "es positiu", 76 | "MATH_IS_NEGATIVE": "es negatiu", 77 | "MATH_IS_DIVISIBLE_BY": "es devesible per", 78 | "MATH_CHANGE_TITLE": "incrementar %1 per %2", 79 | "MATH_ROUND_OPERATOR_ROUND": "arredondir", 80 | "MATH_ROUND_OPERATOR_ROUNDUP": "arredondir al superior", 81 | "MATH_ROUND_OPERATOR_ROUNDDOWN": "arredondir a l’inferior", 82 | "MATH_ONLIST_OPERATOR_SUM": "soma de la lista", 83 | "MATH_ONLIST_OPERATOR_MIN": "minimum de la lista", 84 | "MATH_ONLIST_OPERATOR_MAX": "maximum de la lista", 85 | "MATH_ONLIST_OPERATOR_AVERAGE": "mejana de la lista", 86 | "MATH_ONLIST_OPERATOR_MEDIAN": "mediana de la lista", 87 | "TEXT_CREATE_JOIN_TITLE_JOIN": "jónher", 88 | "TEXT_APPEND_TITLE": "a %1 apondre lo tèxte %2", 89 | "TEXT_LENGTH_TITLE": "longor de %1", 90 | "TEXT_ISEMPTY_TITLE": "%1 es void", 91 | "TEXT_INDEXOF_TITLE": "dins lo tèxte %1 %2 %3", 92 | "TEXT_CHARAT_FROM_START": "obténer la letra #", 93 | "TEXT_CHARAT_FROM_END": "obténer la letra # dempuèi la fin", 94 | "TEXT_CHARAT_FIRST": "obténer la primièra letra", 95 | "TEXT_CHARAT_LAST": "obténer la darrièra letra", 96 | "TEXT_CHARAT_RANDOM": "obténer una letra a l'azard", 97 | "TEXT_CHARAT_TOOLTIP": "Renvia la letra a la posicion indicada.", 98 | "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "dins lo tèxte", 99 | "TEXT_GET_SUBSTRING_END_FROM_START": "fins a la letra #", 100 | "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "en MAJUSCULAS", 101 | "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "en minusculas", 102 | "TEXT_PRINT_TITLE": "afichar %1", 103 | "LISTS_CREATE_WITH_INPUT_WITH": "crear una lista amb", 104 | "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "lista", 105 | "LISTS_INLIST": "dins la lista", 106 | "LISTS_GET_INDEX_GET": "obténer", 107 | "LISTS_GET_INDEX_GET_REMOVE": "obténer e suprimir", 108 | "LISTS_GET_INDEX_REMOVE": "suprimit", 109 | "LISTS_GET_INDEX_FROM_END": "# dempuèi la fin", 110 | "LISTS_GET_INDEX_FIRST": "primièr", 111 | "LISTS_GET_INDEX_LAST": "darrièr", 112 | "LISTS_GET_INDEX_RANDOM": "aleatòri", 113 | "LISTS_SET_INDEX_SET": "metre", 114 | "LISTS_SET_INDEX_INSERT": "inserir en", 115 | "LISTS_SET_INDEX_INPUT_TO": "coma", 116 | "LISTS_GET_SUBLIST_END_FROM_START": "fins a #", 117 | "LISTS_GET_SUBLIST_END_FROM_END": "fins a # dempuèi la fin", 118 | "LISTS_GET_SUBLIST_END_LAST": "fins a la fin", 119 | "LISTS_SORT_ORDER_ASCENDING": "creissent", 120 | "LISTS_SORT_ORDER_DESCENDING": "descreissent", 121 | "LISTS_SORT_TYPE_NUMERIC": "numeric", 122 | "LISTS_SORT_TYPE_TEXT": "alfabetic", 123 | "LISTS_SPLIT_WITH_DELIMITER": "amb lo separador", 124 | "VARIABLES_GET_CREATE_SET": "Crear 'fixar %1'", 125 | "VARIABLES_SET": "fixar %1 a %2", 126 | "PROCEDURES_DEFNORETURN_TITLE": "a", 127 | "PROCEDURES_DEFNORETURN_PROCEDURE": "far quicòm", 128 | "PROCEDURES_BEFORE_PARAMS": "amb :", 129 | "PROCEDURES_CALL_BEFORE_PARAMS": "amb :", 130 | "PROCEDURES_DEFRETURN_RETURN": "retorn", 131 | "PROCEDURES_MUTATORCONTAINER_TITLE": "entradas", 132 | "PROCEDURES_MUTATORARG_TITLE": "nom de l’entrada :", 133 | "PROCEDURES_CREATE_DO": "Crear '%1'" 134 | } 135 | -------------------------------------------------------------------------------- /msg/json/synonyms.json: -------------------------------------------------------------------------------- 1 | {"PROCEDURES_DEFRETURN_TITLE": "PROCEDURES_DEFNORETURN_TITLE", "CONTROLS_IF_IF_TITLE_IF": "CONTROLS_IF_MSG_IF", "CONTROLS_WHILEUNTIL_INPUT_DO": "CONTROLS_REPEAT_INPUT_DO", "CONTROLS_IF_MSG_THEN": "CONTROLS_REPEAT_INPUT_DO", "LISTS_GET_SUBLIST_INPUT_IN_LIST": "LISTS_INLIST", "CONTROLS_IF_ELSE_TITLE_ELSE": "CONTROLS_IF_MSG_ELSE", "PROCEDURES_DEFRETURN_PROCEDURE": "PROCEDURES_DEFNORETURN_PROCEDURE", "TEXT_CREATE_JOIN_ITEM_TITLE_ITEM": "VARIABLES_DEFAULT_NAME", "LISTS_GET_INDEX_INPUT_IN_LIST": "LISTS_INLIST", "PROCEDURES_DEFRETURN_COMMENT": "PROCEDURES_DEFNORETURN_COMMENT", "CONTROLS_IF_ELSEIF_TITLE_ELSEIF": "CONTROLS_IF_MSG_ELSEIF", "PROCEDURES_DEFRETURN_DO": "PROCEDURES_DEFNORETURN_DO", "CONTROLS_FOR_INPUT_DO": "CONTROLS_REPEAT_INPUT_DO", "LISTS_GET_INDEX_HELPURL": "LISTS_INDEX_OF_HELPURL", "LISTS_INDEX_OF_INPUT_IN_LIST": "LISTS_INLIST", "CONTROLS_FOREACH_INPUT_DO": "CONTROLS_REPEAT_INPUT_DO", "LISTS_CREATE_WITH_ITEM_TITLE": "VARIABLES_DEFAULT_NAME", "TEXT_APPEND_VARIABLE": "VARIABLES_DEFAULT_NAME", "MATH_CHANGE_TITLE_ITEM": "VARIABLES_DEFAULT_NAME", "LISTS_SET_INDEX_INPUT_IN_LIST": "LISTS_INLIST"} -------------------------------------------------------------------------------- /server.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN PRIVATE KEY----- 2 | MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC72MAo17sHyHfg 3 | 1K6wIvZK/QHlKWnSgLPg/xMwr/rfVqOirsMaavemgqpKK4wW6T67T1ZovjmN1EGj 4 | tdNCcih5+pPMiRrqtFWr0dkRVnccAgajBgCMLoLmAW5A13eo8IoKCHV67kisn05c 5 | prLp5mp9+CIlytA2SzhhW7BqtlteorK35/aJIM5qwYjN3tkpYA8zmsEj/OPpXDc3 6 | 86TSnxRRLtHxyuew6JtspjS2WAcqkzsPXB/r3eyJ8EvKWDAWQ+j6wktjAz4RLeGr 7 | hr9PhlT3CGlrd1z3RaMzjTU04Im0NdEAxKCNXsZ9ryOX4vkEqwLEAe8JF5T/Q6CS 8 | O/tmkG6NAgMBAAECggEACFXJ0QYhimrext8pES+79f/cAasgwvJrCOTImTR10Usq 9 | 36EZjyaH7p+FptzfznRzECSpFOS78QsmDnmW8i/Wk/MGc+DxjNCLrKAXHanUhy2f 10 | 1cQCajX2IPaXSdFFwf1KYr+VVusT1nULKRlMfwx2VTiZa0vgiUg1LDzBSzrkOwKx 11 | hddzFb28Y0mxQl5pBJTkjMirmX/0pKgbXabrZDCYadpMcjFYuJTcLD7X1b30rp0t 12 | 0J0/BEnZjIppZzrZk080JdCe/CcfRNfISOPu9iq2xw6HKFyCF10G1ZLrB/rvNLCx 13 | aiOCC02SdonUp4/pcnfItXXzveYisbZFWkKM9oAaEQKBgQD4uZ1Ks5jQltfB2vmH 14 | KulKV7CxjvvuyhqZHxNUIByhXGe9Y1lNd5ezP0ht6hVQUqwlNInj1NsN9o/uV+Z+ 15 | IxGxtmlnGFfMC56k+q77dWvVZfVjE132FWU0Ch7r4e6JDjDAMLopY3kOl5p7M9EG 16 | iXzAa5eHrByskC52KkszBmoCcwKBgQDBV0ulZBKLS3R4ENsplmqyZowCAo5TcIhk 17 | 5Z2roDMqjbdiVZe6c0dVPaapKtOUSMXye9QHIo4m54oY/Slv6USTFXIsw0P4L+Yd 18 | SrSQm6Dt+vN9dml42jUaxfmtbS6kEiIber5jjIcxBb8pJguFHFlKr9y9pg7tYI9w 19 | FNiN1EKK/wKBgBV/7fHEHoSBVXsjU4h0lB/h/psKkgptG+l6fzA5amAkXa9IRDLn 20 | EIzk/nzJzDfaPZkltnmkL59AXearYHgszd2/t9K6jvRLWNZH+RIxbzXOD20WAnxA 21 | EzRxX4TiTb05JcunKqBjQdaaEjduHjZjcg4r/rgyj3P3Lpz2QPPTLRyzAoGAeR9Y 22 | O6/60hseRw3AT0h1ZXhK5AN36JwKRrN22ItPIqyPo2Id4OfRW3x5CWfUDwScRfH/ 23 | fczPI15QrKEFMaAAnuiDk7lsvnI7hkRD5IgrBIv/uKzTHKwPMsuuRFCvNIhLp814 24 | suLZ2wNPo9a6xtRguCJ+dq0uktW4Zq4YkJnWaj8CgYEAzyeNq6xIcdmul83pxK7j 25 | srVcOus1iq5L+4mrpnjTy7Uagtg3PeMyTrzEMpbFz7g3/6Vtt/ZN8PUcZO3tq3HN 26 | 7uUCqPmq7bI0DMWItsHqJ56NXuH/v5LAnASsmJgJnuhX2X0Bo+3SV+q63sj2zpVp 27 | j9FOsC9j2puOLKTzvgCoFrE= 28 | -----END PRIVATE KEY----- 29 | -----BEGIN CERTIFICATE----- 30 | MIID2zCCAsOgAwIBAgIJAPJDiFbEYxcAMA0GCSqGSIb3DQEBCwUAMIGDMQswCQYD 31 | VQQGEwJjbjELMAkGA1UECAwCZ3oxCzAJBgNVBAcMAmd6MRAwDgYDVQQKDAdjb2Rl 32 | bGFiMRAwDgYDVQQLDAdjb2RlbGFiMRAwDgYDVQQDDAdjb2RlbGFiMSQwIgYJKoZI 33 | hvcNAQkBFhV3dXdlbmppZTcxOEBnbWFpbC5jb20wHhcNMTkwMTI4MDUyOTEyWhcN 34 | MjAwMTI4MDUyOTEyWjCBgzELMAkGA1UEBhMCY24xCzAJBgNVBAgMAmd6MQswCQYD 35 | VQQHDAJnejEQMA4GA1UECgwHY29kZWxhYjEQMA4GA1UECwwHY29kZWxhYjEQMA4G 36 | A1UEAwwHY29kZWxhYjEkMCIGCSqGSIb3DQEJARYVd3V3ZW5qaWU3MThAZ21haWwu 37 | Y29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAu9jAKNe7B8h34NSu 38 | sCL2Sv0B5Slp0oCz4P8TMK/631ajoq7DGmr3poKqSiuMFuk+u09WaL45jdRBo7XT 39 | QnIoefqTzIka6rRVq9HZEVZ3HAIGowYAjC6C5gFuQNd3qPCKCgh1eu5IrJ9OXKay 40 | 6eZqffgiJcrQNks4YVuwarZbXqKyt+f2iSDOasGIzd7ZKWAPM5rBI/zj6Vw3N/Ok 41 | 0p8UUS7R8crnsOibbKY0tlgHKpM7D1wf693sifBLylgwFkPo+sJLYwM+ES3hq4a/ 42 | T4ZU9whpa3dc90WjM401NOCJtDXRAMSgjV7Gfa8jl+L5BKsCxAHvCReU/0Ogkjv7 43 | ZpBujQIDAQABo1AwTjAdBgNVHQ4EFgQUrxTpHnb10g9ZFyDo3tRtE678EhkwHwYD 44 | VR0jBBgwFoAUrxTpHnb10g9ZFyDo3tRtE678EhkwDAYDVR0TBAUwAwEB/zANBgkq 45 | hkiG9w0BAQsFAAOCAQEAHIw01NolxXKwwN53dB+bYe9jR4fTGcvFilkXYjLUyCON 46 | JAaSxfZhhY7/rKYh9fHsjHxs7ZjGgzLIpMgjSpu/62olyQBCmHPy+CgLs3og0xjD 47 | kYMkvNbekFbf5mGZnpvz+x8sBvDlA6W0rMPgMDvhW1/PmS6g6q1Uc4V0GSX7bGGN 48 | mhYhRZkSPaJR2mEEjyP/dwMfdfNkj7zdgvUmH221HHdcgSuaq88tSgk/FeVw/Sfj 49 | N1ufor5+SujkPlfWBhV7VvoPn2E4h3S1Bc+4jiU7F15xDDUnNScsx3QPv07DyP3X 50 | TuDDwPSiMkZ8T5LuWJpwEXCt+yJ1wptO9QxWIN4faw== 51 | -----END CERTIFICATE----- 52 | -------------------------------------------------------------------------------- /simple_https_server.py: -------------------------------------------------------------------------------- 1 | import http.server, ssl 2 | 3 | server_address = ('localhost', 8601) 4 | httpd = http.server.HTTPServer(server_address, http.server.SimpleHTTPRequestHandler) 5 | httpd.socket = ssl.wrap_socket(httpd.socket, 6 | server_side=True, 7 | certfile='server.pem', 8 | ssl_version=ssl.PROTOCOL_TLSv1) 9 | httpd.serve_forever() 10 | -------------------------------------------------------------------------------- /src/blockly_1_hello_world/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Blockly Demo: Fixed Blockly 6 | 7 | 8 | 9 | 19 | 20 | 21 |

Blockly > 22 | Demos > Fixed Blockly

23 | 24 |

This is a simple demo of injecting Blockly into a fixed-sized 'div' element.

25 | 26 |

→ More info on injecting fixed-sized Blockly

27 | 28 |
29 | 30 | 39 | 40 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /src/blockly_2.1_run_js_with_interpreter/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Blockly Demo: Fixed Blockly 6 | 7 | 8 | 9 | 10 | 11 | 21 | 22 | 23 |

Blockly > 24 | Demos > Fixed Blockly

25 | 26 |

This is a simple demo of injecting Blockly into a fixed-sized 'div' element.

27 | 28 |

→ More info on injecting fixed-sized Blockly

29 | 30 |

31 | 32 | 33 |

34 | 35 |
36 | 37 | 46 | 47 | 121 | 122 | 123 | -------------------------------------------------------------------------------- /src/blockly_2.2_custom_block_run_js_with_interpreter/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Blockly Demo: Fixed Blockly 6 | 7 | 8 | 9 | 10 | 11 | 12 | 22 | 42 | 43 | 44 |

Blockly > 45 | Demos > Fixed Blockly

46 | 47 |

This is a simple demo of injecting Blockly into a fixed-sized 'div' element.

48 | 49 |

→ More info on injecting fixed-sized Blockly

50 | 51 |

52 | 53 | 54 |

55 | 56 |
57 | 58 | 68 | 69 | 158 | 159 | 160 | -------------------------------------------------------------------------------- /src/blockly_2.2_custom_block_run_js_with_interpreter/readme.md: -------------------------------------------------------------------------------- 1 | # 使用 2 | 在项目根目录: `python -m http.server 8002` 3 | 4 | 打开: `http://127.0.0.1:8002/src/blockly_2.2_custom_block_run_js_with_interpreter/` -------------------------------------------------------------------------------- /src/blockly_2_generate_and_run_js/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Blockly Demo: Fixed Blockly 6 | 7 | 8 | 9 | 10 | 20 | 21 | 22 |

Blockly > 23 | Demos > Fixed Blockly

24 | 25 |

This is a simple demo of injecting Blockly into a fixed-sized 'div' element.

26 | 27 |

→ More info on injecting fixed-sized Blockly

28 | 29 |

30 | 31 | 32 |

33 | 34 |
35 | 36 | 45 | 46 | 75 | 76 | 77 | -------------------------------------------------------------------------------- /src/blockly_3_1_generate_python/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Blockly Demo: Fixed Blockly 6 | 7 | 8 | 9 | 10 | 20 | 21 | 22 |

Blockly > 23 | Demos > Fixed Blockly

24 | 25 |

This is a simple demo of injecting Blockly into a fixed-sized 'div' element.

26 | 27 |

→ More info on injecting fixed-sized Blockly

28 | 29 |

30 | 31 |

32 | 33 |
34 | 35 | 44 | 45 | 61 | 62 | 63 | -------------------------------------------------------------------------------- /src/blockly_3_2_custom_block_generate_python/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Blockly Demo: Fixed Blockly 6 | 7 | 8 | 9 | 10 | 20 | 21 | 35 | 36 | 37 | 38 |

Blockly > 39 | Demos > Fixed Blockly

40 | 41 |

This is a simple demo of injecting Blockly into a fixed-sized 'div' element.

42 | 43 |

→ More info on injecting fixed-sized Blockly

44 | 45 |

46 | 47 |

48 | 49 |
50 | 51 | 61 | 62 | 78 | 79 | 80 | -------------------------------------------------------------------------------- /src/blockly_3_2_custom_block_generate_python/readme.md: -------------------------------------------------------------------------------- 1 | # readme 2 | 自定义模块 3 | 4 | # 模块分类 5 | * 序列 6 | * 接受输入 7 | * 接受的类型 8 | * 有返回值 9 | * 返回值类型 10 | * 包装其他系列作为输入 11 | 12 | 关于积木块怎么定义参考:[Define Blocks](https://developers.google.com/blockly/guides/create-custom-blocks/define-blocks) 13 | 14 | 使用json可逆,更清晰 15 | 16 | ### 序列 17 | 摘自`blockly_5_run_python_in_browser_turtle_finish` 中的`my_blocks.js` 18 | 19 | 该模块的功能是在turtle中,留下一个印记。无输入和函数输出。(副作用) 20 | 21 | [blockfactory draw_stamp](https://blockly-demo.appspot.com/static/demos/blockfactory/index.html#ixsmmd) 22 | 23 | ``` 24 | Blockly.Blocks.draw_stamp = { 25 | init: function() { 26 | this.setColour(160), 27 | this.appendDummyInput().appendField("stamp"), 28 | this.setPreviousStatement(!0), 29 | this.setNextStatement(!0) 30 | } 31 | }, 32 | Blockly.Python.draw_stamp = function(block) { 33 | Blockly.Python.definitions_.import_turtle = "import turtle\nturtle=turtle.Turtle()"; 34 | return "turtle.stamp()\n" 35 | } 36 | ``` 37 | 38 | 结束程序: 39 | 40 | ``` 41 | Blockly.Blocks['sys_exit'] = { 42 | init: function() { 43 | this.appendDummyInput() 44 | .appendField(new Blockly.FieldImage(require('./media/hexinchulichuanshu/sys_exit.png'),40,40,"*")) 45 | .appendField("结束程序"); 46 | this.setInputsInline(true); 47 | this.setPreviousStatement(true, null); 48 | this.setNextStatement(true, null); 49 | this.setColour(170); 50 | this.setTooltip(''); 51 | this.setHelpUrl('http://www.example.com/'); 52 | } 53 | }; 54 | 55 | 56 | Blockly.Python['sys_exit'] = function(block) { 57 | var code = 'import sys;sys.exit(0)\n'; 58 | return code; 59 | } 60 | ``` 61 | 62 | 63 | ### 接受输入 64 | 65 | 该模块实现休眠功能 66 | 67 | ![]() 68 | 69 | ``` 70 | //输入为数字的模块 71 | //https://blockly-demo.appspot.com/static/demos/blockfactory/index.html#ytviqi 72 | //https://blockly-demo.appspot.com/static/demos/blockfactory/index.html#8vwuu3 73 | //https://blockly-demo.appspot.com/static/demos/blockfactory/index.html#ndieuv 图标 74 | 75 | 76 | Blockly.Blocks['time_sleep'] = { 77 | init: function() { 78 | this.appendDummyInput() 79 | .appendField(new Blockly.FieldImage(require('./media/hexinchulichuanshu/time_sleep.png'),40,40,"*")) 80 | .appendField("休眠时间") 81 | .appendField(new Blockly.FieldNumber(1, 0), "mytime"); 82 | this.setInputsInline(true); 83 | this.setPreviousStatement(true, null); 84 | this.setNextStatement(true, null); 85 | this.setColour(170); 86 | this.setTooltip(''); 87 | this.setHelpUrl('http://www.example.com/'); 88 | } 89 | } 90 | 91 | Blockly.Python['time_sleep'] = function(block) { 92 | var number_mytime = block.getFieldValue('mytime'); 93 | // TODO: Assemble Python into code variable. 94 | 95 | var code = `import time;time.sleep(${number_mytime})\n`; 96 | return code; 97 | }; 98 | ``` 99 | 100 | ### 有返回值 101 | 102 | ``` 103 | //只有输出的块:获取障碍物距离( 104 | 105 | //https://blockly-demo.appspot.com/static/demos/blockfactory/index.html#a88ugi 完整版 106 | 107 | //https://developers.google.com/blockly/guides/configure/web/code-generators 108 | //https://developers.google.com/blockly/guides/create-custom-blocks/generating-code 109 | // https://github.com/google/blockly/blob/master/generators/python/math.js 实际例子,跟踪:math_number 110 | 111 | Blockly.Blocks['get_distance'] = { 112 | init: function() { 113 | this.appendDummyInput() 114 | .appendField(new Blockly.FieldImage(require('./media/chuanganqi/get_distance.png'),40,40,"*")) 115 | .appendField("获取障碍物距离"); 116 | this.setOutput(true, "Number"); 117 | this.setColour(110); 118 | // this.setTooltip(''); 119 | // this.setHelpUrl('http://www.example.com/'); 120 | } 121 | }; 122 | 123 | 124 | Blockly.Python['get_distance'] = function(block) { 125 | // distance 全局,得到的是代码,需要代码编译完才是想要的,赋值给变量 126 | 127 | var code = 'distance.get_distance()'; 128 | // 这里有个层次的问题,如何获得另一个语言里的变量,如何输出为数字 129 | 130 | // 硬件的输出如何变为一个块 可被其他读取,并没有对接到其他部分,不能是python代码 131 | 132 | // TODO: Change ORDER_NONE to the correct strength. 133 | 134 | // 需要回传数值,用于变量 135 | 136 | return [code, Blockly.Python.ORDER_ATOMIC]; 137 | }; 138 | ``` 139 | 140 | # 工具 141 | 构建工具: [blockfactory](https://blockly-demo.appspot.com/static/demos/blockfactory/index.html) 142 | 143 | 帮助文档看这里:[Blockly Developer Tools docs](https://developers.google.com/blockly/guides/create-custom-blocks/blockly-developer-tools) 144 | 145 | # 自定义积木块 146 | 在[blockfactory](https://blockly-demo.appspot.com/static/demos/blockfactory/index.html)中通过拖拽定义好积木后。 在 `Generator stub`定义好该模块将编译出的代码 . 最后将`Generator stub`和`Block Definition`中的代码拷贝到js脚本中即可。 147 | 148 | # 参考 149 | 更多积木可以参考(内部项目): `jinping/src/views/projects/hardwarelab/block.js` 150 | 151 | 每个类型积木都有相应的注释,可以看到它在[blockfactory](https://blockly-demo.appspot.com/static/demos/blockfactory/index.html) 是如何构建的 152 | 153 | 也可以参考项目 blockly_5_run_python_in_browser_turtle_finish 中的my_blocks.js 154 | 155 | ### 技巧 156 | 注意力放在generate 的return部分。看它需要从js中获取什么`输入`,是否对外`输出`。 157 | 158 | 159 | 剩下的就是type问题,是否可以组合 160 | 161 | # 难点 162 | ### Operator Precedence 163 | [Operator Precedence](https://developers.google.com/blockly/guides/create-custom-blocks/) 164 | 165 | > Still don't understand? No problem. Just use ORDER_ATOMIC as the order on every call to valueToCode, and use ORDER_NONE as the order for the final return statement on every value block. The resulting code will be infested with needless parentheses, but is guaranteed to be correct. 166 | 167 | ORDER只关乎优先级问题,不影响其他,一般而言,对外输出值的时候,把值包在一起(ORDER_NONE) 168 | 169 | ### 块范例 170 | [Custom Blocks: Block Paradigms](https://developers.google.com/blockly/guides/create-custom-blocks/block-paradigms) 171 | 172 | 并行块 173 | 174 | > If the target language is something like Python, then the allCode array may be assembled into a single program that uses a threading module. 175 | 176 | 事件驱动 177 | 178 | Blockly.BlockSvg.START_HAT = true 179 | 180 | -------------------------------------------------------------------------------- /src/blockly_3_3_custom_json_block_generate_python/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Blockly Demo: Fixed Blockly 6 | 7 | 8 | 9 | 10 | 20 | 21 | 45 | 46 | 47 | 48 |

Blockly > 49 | Demos > Fixed Blockly

50 | 51 |

This is a simple demo of injecting Blockly into a fixed-sized 'div' element.

52 | 53 |

→ More info on injecting fixed-sized Blockly

54 | 55 |

56 | 57 |

58 | 59 |
60 | 61 | 71 | 72 | 88 | 89 | 90 | -------------------------------------------------------------------------------- /src/blockly_4_run_python_in_browser_simple/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Blockly Demo: Fixed Blockly 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 29 | 30 | 31 |

Blockly > 32 | Demos > Fixed Blockly

33 | 34 |

This is a simple demo of injecting Blockly into a fixed-sized 'div' element.

35 | 36 |

→ More info on injecting fixed-sized Blockly

37 | 38 |

39 | 40 | 41 | 42 |

43 | 44 |
 
 45 |   
 46 |   
47 | 48 |
49 | 50 | 60 | 61 | 130 | 131 | 132 | -------------------------------------------------------------------------------- /src/blockly_4_run_python_in_browser_simple/my_blocks.js: -------------------------------------------------------------------------------- 1 | //'use strict'; 2 | 3 | Blockly.Blocks.draw_move = { 4 | init: function() { 5 | var a = [["move forward by", "forward"], ["move backward by", "backward"]]; 6 | this.setColour(160), 7 | this.appendValueInput("VALUE").setCheck("Number").appendField(new Blockly.FieldDropdown(a), "DIR"), 8 | this.setPreviousStatement(!0), 9 | this.setNextStatement(!0) 10 | } 11 | }, 12 | Blockly.Python.draw_move = function(a) { 13 | Blockly.Python.definitions_.import_turtle = "import turtle"; 14 | var b = Blockly.Python.valueToCode(a, "VALUE", Blockly.Python.ORDER_NONE) || "0"; 15 | return "t = turtle.Turtle()\n"+"t." + a.getFieldValue("DIR") + "(" + b + ")\n" 16 | } 17 | 18 | // import turtle;t = turtle.Turtle();t.forward(100); -------------------------------------------------------------------------------- /src/blockly_4_run_python_in_browser_simple/readme.md: -------------------------------------------------------------------------------- 1 | # readme 2 | python中自带了turtle库,方便入门者学习编程,这是来自LOGO语言的传统。我们想在浏览器中使用python驱动turtle 3 | 4 | # 技术方案 5 | 使用[skulpt](https://github.com/skulpt/skulpt)在浏览器中运行python 6 | 7 | 需要注意的是: 8 | 9 | > Skulpt is a Javascript implementation of Python 2.x. Python that runs in your browser! 10 | 11 | 参考[Instances — A Herd of Turtles](http://interactivepython.org/runestone/static/thinkcspy/PythonTurtle/InstancesAHerdofTurtles.html) 12 | 13 | 14 | # 思路 15 | 16 | blockly生成python 17 | 18 | 之后python在浏览器中被skulpt解析,skulpt使用python库作出及时反馈(如turtle库或是图形库做数据分析:[blockpy](https://github.com/RealTimeWeb/blockpy)) 19 | 20 | 一番搜索发现 http://www.skulpt.org/ 中有个项目很符合预期,在skulpt中利用turtle模块绘图 21 | 22 | # 依赖 23 | http://www.skulpt.org/ 24 | 25 | ```html 26 | 27 | 28 | 29 | ``` 30 | 31 | # 如何构建合理的积木块 32 | 从[hourofpython.trinket.io/from-blocks-to-code-with-trinket](https://hourofpython.trinket.io/from-blocks-to-code-with-trinket#/blocks/dragging-and-dropping)中扣取即可 33 | 34 | 分析积木块文件可得到线索,以及一些高级用法,诸如如何在头部提前import 35 | 36 | ``` 37 | Blockly.Blocks.draw_pen = { 38 | init: function() { 39 | var a = [["pen up", "penup"], ["pen down", "pendown"]]; 40 | this.setColour(160), 41 | this.appendDummyInput().appendField(new Blockly.FieldDropdown(a), "PEN"), 42 | this.setPreviousStatement(!0), 43 | this.setNextStatement(!0) 44 | } 45 | }, 46 | Blockly.Python.draw_pen = function(a) { 47 | return Blockly.Python.definitions_.import_turtle = "import turtle", 48 | "turtle." + a.getFieldValue("PEN") + "()\n" 49 | } 50 | ``` 51 | 52 | 我们集中分析一个块,往某个方向移动若干距离 53 | 54 | ![](http://oav6fgfj1.bkt.clouddn.com/blocklyc49bf6c1.png) 55 | 56 | 在文件:`embed-blocks-iframe...` 57 | 58 | ``` 59 | Blockly.Blocks.draw_move = { 60 | init: function() { 61 | var a = [["move forward by", "forward"], ["move backward by", "backward"]]; 62 | this.setColour(160), 63 | this.appendValueInput("VALUE").setCheck("Number").appendField(new Blockly.FieldDropdown(a), "DIR"), 64 | this.setPreviousStatement(!0), 65 | this.setNextStatement(!0) 66 | } 67 | }, 68 | Blockly.Python.draw_move = function(a) { 69 | Blockly.Python.definitions_.import_turtle = "import turtle"; 70 | var b = Blockly.Python.valueToCode(a, "VALUE", Blockly.Python.ORDER_NONE) || "0"; 71 | return "turtle." + a.getFieldValue("DIR") + "(" + b + ")\n" 72 | } 73 | ``` 74 | 75 | # 参考 76 | * [From Blocks to Code with Trinket!](https://hourofpython.trinket.io/from-blocks-to-code-with-trinket#/blocks/dragging-and-dropping) 77 | * [Instances — A Herd of Turtles](http://interactivepython.org/runestone/static/thinkcspy/PythonTurtle/InstancesAHerdofTurtles.html) 78 | * [编程猫 wood](https://wood.codemao.cn/) 79 | 80 | # 附录 81 | blockly-games中也有一个用blockly驱动[turtle](https://blockly-games.appspot.com/turtle)的游戏 -------------------------------------------------------------------------------- /src/blockly_5_run_python_in_browser_turtle_finish/readme.md: -------------------------------------------------------------------------------- 1 | # readme 2 | 本节中我们实现完整的turtle,模仿 [trinket.io](https://hourofpython.trinket.io/from-blocks-to-code-with-trinket#/blocks/dragging-and-dropping) 3 | 4 | 文件继承自 run_python_in_browser_simple,是对它的一个增强 5 | 6 | # 依赖 7 | 从[trinket.io](https://hourofpython.trinket.io/from-blocks-to-code-with-trinket#/blocks/dragging-and-dropping)中取出两个js文件 8 | 9 | * embed-blocks-4a6a121b.js 10 | * embed-blocks-iframe-1162d752.js 11 | * embed-python-f3eb213f.js 12 | 13 | # 策略 14 | 通过拖拽[trinket.io](https://hourofpython.trinket.io/from-blocks-to-code-with-trinket#/blocks/dragging-and-dropping)中的模块,观察对应python,然后在源码中搜索,以确定是怎么构造的 15 | 16 | 如移动块,搜索`forward` 17 | 18 | ``` 19 | Blockly.Blocks.draw_pen = { 20 | init: function() { 21 | var a = [["pen up", "penup"], ["pen down", "pendown"]]; 22 | this.setColour(160), 23 | this.appendDummyInput().appendField(new Blockly.FieldDropdown(a), "PEN"), 24 | this.setPreviousStatement(!0), 25 | this.setNextStatement(!0) 26 | } 27 | }, 28 | Blockly.Python.draw_pen = function(a) { 29 | return Blockly.Python.definitions_.import_turtle = "import turtle", 30 | "turtle." + a.getFieldValue("PEN") + "()\n" 31 | } 32 | ``` 33 | 34 | # 修改blocks 35 | 把所有`import turtle`改为`import turtle\nturtle=turtle.Turtle()` 36 | 37 | 学习 trinket.io 的代码 技巧blockly 38 | 39 | # 问题 40 | ### toolbox 41 | 自动生成toolbox 在`embed-blocks-iframe-1162d752.js`里,可以搜索toolbox 和category 42 | 43 | 44 | ### 替换turtle 45 | https://blog.trinket.io/using-images-in-turtle-programs/ 46 | 47 | 注意:不可用 trinket做了特殊处理!! 48 | 49 | ``` 50 | import turtle 51 | 52 | screen = turtle.Screen() 53 | 54 | # click the image icon in the top right of the code window to see 55 | # which images are available in this trinket 56 | # image = "https://trinket.io/proxy/https://trinket-user-assets.trinket.io/02b81dd84f5006e360288e728d69cdd60aeec160-552d25d3d1570f876e1cb766.png" 57 | 58 | # add the shape first then set the turtle shape 59 | image = '' 60 | screen.addshape(image) // 不可用 trinket做了特殊处理 61 | turtle.shape(image) 62 | 63 | screen.bgcolor("lightblue") 64 | 65 | move_speed = 10 66 | turn_speed = 10 67 | 68 | # these defs control the movement of our "turtle" 69 | def forward(): 70 | turtle.forward(move_speed) 71 | 72 | def backward(): 73 | turtle.backward(move_speed) 74 | 75 | def left(): 76 | turtle.left(turn_speed) 77 | 78 | def right(): 79 | turtle.right(turn_speed) 80 | 81 | turtle.penup() 82 | turtle.speed(0) 83 | turtle.home() 84 | 85 | # now associate the defs from above with certain keyboard events 86 | screen.onkey(forward, "Up") 87 | screen.onkey(backward, "Down") 88 | screen.onkey(left, "Left") 89 | screen.onkey(right, "Right") 90 | screen.listen() 91 | ``` 92 | 93 | screen.bgcolor("lightblue") 有效 94 | 95 | 图片依赖于`embed-python-f3eb213f.js` 96 | 97 | 98 | 99 | #### skulpt预定于的图形 100 | https://github.com/skulpt/skulpt/blob/036d7022348c487278b89d63a7f3eb0aeba09641/src/lib/turtle.js#L66 101 | 102 | 103 | 104 | #### 自定义 105 | ``` 106 | //https://github.com/skulpt/skulpt/blob/036d7022348c487278b89d63a7f3eb0aeba09641/src/lib/turtle.js#L64:12 107 | proto.$register_shape = proto.$addshape = function(name, points) { 108 | SHAPES[name] = points; 109 | }; 110 | ``` 111 | 112 | 其中points为 113 | 114 | ``` 115 | SHAPES.arrow = [[-10,0],[10,0],[0,10]]; 116 | ``` 117 | 118 | # tips 119 | * media可以用`https://blockly-demo.appspot.com/static/media/` 120 | * trinket.io还可以把项目下载为本地python代码运行 121 | * 完整的默认库参考: https://blockly-demo.appspot.com/static/demos/code/index.html 122 | 123 | 124 | # 高阶 125 | ### 点击 126 | ``` 127 | import turtle 128 | 129 | class MyTurtle(turtle.Turtle): 130 | def __init__(self, screen = turtle.Screen()): 131 | turtle.Turtle.__init__(self, screen) 132 | self.hideturtle() 133 | 134 | def create_turtles(screen, n = 10): 135 | for i in range(n): 136 | MyTurtle(screen) 137 | 138 | def move_turtles(screen, dist=10, angle = 4): 139 | for i, turtle in enumerate(screen.turtles()): 140 | turtle.left(angle*(1+i)) 141 | turtle.forward(dist) 142 | x, y = turtle.pos() 143 | try: 144 | turtle.color(abs(x), abs(y), abs(x+y)) 145 | except: 146 | pass 147 | 148 | writer = MyTurtle() 149 | writer.penup() 150 | writer.goto(0,100) 151 | writer.write("Click Me!", font=("Arial",30), align = "center") 152 | 153 | 154 | number_of_turtles = 10 155 | 156 | screen = turtle.Screen() 157 | 158 | def draw_shape(x, y, n = 20, clear = True): 159 | if clear: 160 | writer.clear() 161 | screen.tracer(0) 162 | for turtle in screen.turtles(): 163 | turtle.penup() 164 | turtle.goto(x,y) 165 | turtle.pendown() 166 | screen.tracer(1) 167 | for i in range(n): 168 | screen.tracer(0) 169 | move_turtles(screen) 170 | screen.tracer(1) 171 | 172 | create_turtles(screen, number_of_turtles) 173 | 174 | draw_shape(0,-150, clear = False) 175 | 176 | screen.onclick(draw_shape) 177 | 178 | screen.listen() 179 | turtle.done() 180 | ``` 181 | 182 | ### 支持的库 183 | https://github.com/skulpt/skulpt/tree/036d7022348c487278b89d63a7f3eb0aeba09641/src/lib 184 | 185 | ### 游戏 186 | https://trinket.io/python/0f3985959e 187 | 188 | ### 背景 189 | https://blog.trinket.io/using-images-in-turtle-programs/ 190 | 191 | # todo 192 | 分组 Turtle : [Toolbox](https://developers.google.com/blockly/guides/configure/web/toolbox) -------------------------------------------------------------------------------- /src/blockly_hello_world_with_togetherjs/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Blockly Demo: Fixed Blockly 6 | 7 | 8 | 9 | 10 | 11 | 21 | 22 | 23 |

Blockly > 24 | Demos > Fixed Blockly

25 | 26 |

This is a simple demo of injecting Blockly into a fixed-sized 'div' element.

27 | 28 |

→ More info on injecting fixed-sized Blockly

29 | 30 |
31 | 32 | 41 | 42 | 43 | 44 | 50 | 51 | 52 | -------------------------------------------------------------------------------- /src/blockly_hello_world_with_togetherjs/readme.md: -------------------------------------------------------------------------------- 1 | # readme 2 | 在blockly_dev下: `python -m http.server 8002` 3 | 4 | open `http://10.10.100.126:8002/src/blockly_1_hello_world_with_togetherjs/` 5 | 6 | 7 | 目前togetherjs回默认同步编辑器里的内容。 8 | 9 | togetherjs目前不支持svg,而blockly使用svg。 10 | 11 | 欲同步积木的效果,可以使用 [Communication Channel](https://togetherjs.com/docs/) 12 | 13 | togetherjs在canvas协同工作:[Drawing Example](https://togetherjs.com/examples/drawing/) 14 | 15 | -------------------------------------------------------------------------------- /src/pxt-microbit_hello_world/pxt_doc.md: -------------------------------------------------------------------------------- 1 | # pxt_doc 2 | 参考:[makecode docs](https://makecode.com/target-creation) 3 | 4 | ### 关于MakeCode 5 | * 基于Google Blockly的代码编辑器以及JavaScript转换器 6 | * 基于Monaco的文本编辑器,具有强大的自动补全和由TypeScript提供支持的自动纠正。 7 | * 基于markdown的文档系统,内置宏来渲染块摘要 8 | * 一个ARM Thumb机器码发射器 9 | * 一个命令行包管理器 10 | 11 | # 创建target项目 12 | ### target 13 | * 可以修改定制pxt-microbit的docs 14 | * 可以发布为静态文件 15 | * 可以保存到用户中(作为二级域名,使用主域名的cookie) 16 | 17 | ### 结构 18 | 参考[target-creation](https://makecode.com/target-creation),关于项目的布局和修改方法都在这里 19 | 20 | * /libs,定义API(在C ++,Static TypeScript或Thumb汇编器中)的包(有时称为库)以及它们应该如何暴露为积木块 21 | * /sim,浏览器模拟器的 TypeScript源代码(如果有的话) 22 | * /docs,markdown文档页面 23 | * pxtarget.json文件包含目标(target)的配置选项 24 | * target最终可以发布到NPM,package.json配置相关信息 25 | * 图片在`/docs/static` 26 | 27 | ### 打包静态文件 28 | [pxt-staticpkg Manual Page](https://makecode.com/cli/staticpkg) 29 | 30 | 把target项目大包为HTML静态页面 31 | 32 | > Running `pxt staticpkg` will create a number of files under `built/packaged`. You can use `pxt serve -pkg` or any other any web server. For example, you can use http-server for easy testing. 33 | 34 | ``` 35 | npm install -g http-server 36 | http-server -c-1 built/packaged 37 | ``` 38 | 39 | 40 | #### 操作过程记录 41 | ``` 42 | pxt staticpkg 43 | cd built/packaged/ 44 | python -m http.server # python2 -m SimpleHTTPServer # 45 | ``` 46 | 47 | 发布到GitHub Pages参考: `GitHub Pages support` 48 | 49 | ### 主题化 50 | [自定义样式、主题](https://makecode.com/targets/theming) 51 | 52 | ### tips 53 | * [pxt.json](https://makecode.com/packages/pxtJson)是用来配置软件包(如pxt-neopixel)的,而不是target项目 54 | * [自定义积木块](https://makecode.com/defining-blocks),你可以设计你的整个API而不用实现它 55 | 56 | 57 | 58 | # 创建pxt包 59 | 参考[packages](https://makecode.com/packages) 60 | 61 | 62 | 包是用于扩展target的PXT的动态/静态库机制 63 | 64 | PXT会直接从GitHub动态加载neopixel软件包,编译并将其合并到Web应用程序中 65 | 66 | 编程pxt的入门指南:[packages/getting-started](https://makecode.com/packages/getting-started) 67 | 68 | 69 | # 编程文档 70 | 参考[writing-docs](https://makecode.com/writing-docs) 71 | 72 | MakeCode提供了一个集成的解决方案来构建文档。 73 | 74 | * 文档以markdown语法编写,使用macros(宏)来支持widget 75 | * block images可以通过解析markdown特定语法表达,之后渲染出,避免截图 76 | * 支持浏览器内部的`step by step tutorials or sidebar hosted docs` 77 | 78 | ### macros 79 | 80 | 通过[macros](https://makecode.com/writing-docs/macros)来扩展markdown 81 | 82 | ### tutorials 83 | 通过[tutorials](https://makecode.com/writing-docs/tutorials)提供站内引导教程,也可以用作课程 84 | 85 | 标题为“Light Blaster”的教程会有这样的路径:/docs/tutorials/light-blaster.md 86 | 87 | 在编辑器中选择教程时,教程运行程序将教程markdown的内容转换为用户交互 88 | 89 | 90 | #### Getting Started tutorial 91 | 'Getting Started' tutorial 是一种特殊的教程 92 | 93 | in pxtarget.json with "sideDoc": "tutorials/getting-started" 94 | 95 | inked to it is retrieved from /docs/tutorials/getting-started.md. 96 | 97 | 98 | 多语言支持通过[Crowdin](https://makecode.com/translate)来做 99 | 100 | 101 | ### routing 102 | PXT假定文档位于该/docs文件夹下,网站路由遵循以下文件结构 103 | 104 | ``` 105 | /about -> /docs/about.md 106 | /reference/math -> /docs/reference/math.md 107 | ``` 108 | 109 | 诸如图片之类的静态资产可以放置在该/docs/static文件夹下 110 | 111 | 112 | 113 | ### pxt工具 114 | [pyconv](https://makecode.com/cli/pyconv) 将MicroPython模块转换为PXT -------------------------------------------------------------------------------- /src/pxt-microbit_hello_world/readme.md: -------------------------------------------------------------------------------- 1 | # readme 2 | pxt与pxt-microbit的文档 3 | 4 | # 开始 5 | 6 | ### pxt入手(从这里开始) 7 | [pxt-sample](https://github.com/Microsoft/pxt-sample) 8 | 9 | [pxtarget文档](https://makecode.com/targets/pxtarget) 10 | 11 | 成果: 修改docs,生效! 12 | 13 | 14 | 最终编译为纯静态文件:[microsoft.github.io/pxt-sample](https://microsoft.github.io/pxt-sample/) 15 | 16 | 对应仓库为:[pxt-sample/tree/gh-pages](https://github.com/Microsoft/pxt-sample/tree/gh-pages) 17 | 18 | 19 | 问题:如何build为纯静态文件 20 | 21 | 使用[pkg](https://github.com/zeit/pkg)上传到github gh.更多细节参考:[这儿](https://github.com/Microsoft/pxt-sample/blob/master/README.md#todos) 22 | 23 | 关于该项目的更多探索参考[wwj718/pxt-sample](https://github.com/wwj718/pxt-sample) 24 | 25 | ### 安装pxt-microbit 26 | 27 | #### 快速开始(非开发环境) 28 | 29 | ``` 30 | npm install -g pxt 31 | mkdir microbit 32 | cd microbit 33 | pxt target microbit 34 | pxt serve 35 | ``` 36 | 37 | 入口形如: http://localhost:3232/#local_token=0774fdd6-5291-4e93-b95c-bcde0a3702bc&wsport=3233 38 | 39 | 参考 :https://makecode.com/cli 40 | 41 | #### pxt-microbit开发环境 42 | https://github.com/Microsoft/pxt-microbit 43 | 44 | 45 | 安装yotta.app 46 | 47 | alias yotta="/Applications/yotta.app/Contents/MacOS/yotta" 48 | 49 | 目录: /Users/wwj/mylab/just4fun/pxt-microbit 50 | 51 | pxt help 52 | 53 | pxt serve 54 | 55 | 56 | ### pxt提供了文档工具( 57 | 58 | 使用这种工具做教程,可以避免反复的截图 59 | 60 | https://github.com/Microsoft/pxt/blob/master/docs/writing-docs.md 61 | 62 | #### 文档工具的问题 63 | 对文档做的修改不会生效 64 | 65 | 原因: `pxtlib.js`(位于`built/packaged/pxtlib.js`)中硬编码了`Cloud.apiRoot = "https://www.pxt.io/api/";`(8002行) 66 | 67 | 这部分和cloud配置相关 68 | 69 | 从pxt-microbit/built/packaged中 ,`ack "www.pxt.io"`得出上述原因. 而pxtlib.js在`sim/public/siminstructions.html`中引入 70 | 71 | `https://www.pxt.io/api/md/microbit/blocks?targetVersion=local&lang=zh-CN&live=1` 返回的是markdown 72 | 73 | 74 | 本地运行的: `https://www.pxt.io/api/md/microbit/docs/blocks.html?targetVersion=0.0.0&lang=zh-CN&live=1` 因为全部编译到本地了 75 | 76 | 修改 Cloud.apiRoot. 需要定制 `pxtlib` 77 | 78 | built/packaged/main.js中有 79 | 80 | ``` 81 | var hm = /^(https:\/\/[^/]+)/.exec(window.location.href); 82 | if (hm) 83 | Cloud.apiRoot = hm[1] + "/api/"; 84 | ``` 85 | 86 | 内联的文档都从这里读取(pxt-sample正常) 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | -------------------------------------------------------------------------------- /src/scratch-blocks_hello_world/readme.md: -------------------------------------------------------------------------------- 1 | # readme 2 | ``` 3 | //2018.1.4版本: https://github.com/LLK/scratch-blocks/commit/11cf4bdeb9ce7ef7665520aba5bbba17f5b765b7 4 | git clone https://github.com/LLK/scratch-blocks --depth=1 5 | # 下载google-closure-library zip 6 | # https://github.com/LLK/scratch-blocks/blob/develop/build.py#L475 7 | mv google-closure-library/ ../closure-library 外层 8 | cd scratch-blocks 9 | # 需要python2 env 10 | npm install --registry https://registry.npm.taobao.org 11 | 12 | cd gh-pages/playgrounds/tests/ 13 | # open vertical_playground.html #完整路径 scratch-blocks/gh-pages/playgrounds/tests/vertical_playground.html 14 | 15 | # generate python 16 | # 在/Users/wwj/mylab/changxue/scratch-blocks可行 17 | ``` 18 | 19 | 20 | 21 | # 问题 22 | 23 | ### 关于scratch-blocks是够可以generate python code 24 | * [Generators - Support & Documentation ](https://github.com/LLK/scratch-blocks/issues/691) 25 | 26 | scratch-blocks已经重命名Blockly中使用的所有块 27 | 28 | 之前有过一次提交被清理了: [Remove all generators and update build.py](https://github.com/LLK/scratch-blocks/commit/0c4d175184ffa21da287a37585e01bc7531b5d15) 29 | 30 | [Add generators](https://github.com/LLK/scratch-blocks/pull/787/files) 31 | 32 | # 自定义generator 33 | 34 | 引入playgrounds目录下的:`` 35 | 36 | 定义好收集的代码 37 | 38 | ``` 39 | Blockly.Python.control_if = function(a) { 40 | Blockly.Python.definitions_.import_turtle = "import turtle\nturtle=turtle.Turtle()"; 41 | var b = Blockly.Python.valueToCode(a, "VALUE", Blockly.Python.ORDER_NONE) || "0"; 42 | return "turtle." + a.getFieldValue("DIR") + "(" + b + ")\n" 43 | }; 44 | ``` 45 | 46 | 之后即可拿到code:`Blockly.Python.workspaceToCode(workspace)` or `Blockly["Python"].workspaceToCode(workspace)` 47 | 48 | 49 | # todo 50 | 本目录下的index.html需要closure的支持 51 | 52 | 或者先build:python build.py 53 | 54 | 或者获取 npm install scratch-blocks 获取编译好的 55 | -------------------------------------------------------------------------------- /src/scratch-blocks_hello_world/scratch-block-test/dist/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | Hello, World!! 4 | 5 | 6 |
Test
7 |
8 | 9 | 10 | 11 | 19 | 20 | -------------------------------------------------------------------------------- /src/scratch-blocks_hello_world/scratch-block-test/dist/media/1x1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wwj718/blockly_dev/f25d2d97deb6a32d4f9484e068469e6634660963/src/scratch-blocks_hello_world/scratch-block-test/dist/media/1x1.gif -------------------------------------------------------------------------------- /src/scratch-blocks_hello_world/scratch-block-test/dist/media/click.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wwj718/blockly_dev/f25d2d97deb6a32d4f9484e068469e6634660963/src/scratch-blocks_hello_world/scratch-block-test/dist/media/click.mp3 -------------------------------------------------------------------------------- /src/scratch-blocks_hello_world/scratch-block-test/dist/media/click.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wwj718/blockly_dev/f25d2d97deb6a32d4f9484e068469e6634660963/src/scratch-blocks_hello_world/scratch-block-test/dist/media/click.ogg -------------------------------------------------------------------------------- /src/scratch-blocks_hello_world/scratch-block-test/dist/media/click.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wwj718/blockly_dev/f25d2d97deb6a32d4f9484e068469e6634660963/src/scratch-blocks_hello_world/scratch-block-test/dist/media/click.wav -------------------------------------------------------------------------------- /src/scratch-blocks_hello_world/scratch-block-test/dist/media/delete.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wwj718/blockly_dev/f25d2d97deb6a32d4f9484e068469e6634660963/src/scratch-blocks_hello_world/scratch-block-test/dist/media/delete.mp3 -------------------------------------------------------------------------------- /src/scratch-blocks_hello_world/scratch-block-test/dist/media/delete.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wwj718/blockly_dev/f25d2d97deb6a32d4f9484e068469e6634660963/src/scratch-blocks_hello_world/scratch-block-test/dist/media/delete.ogg -------------------------------------------------------------------------------- /src/scratch-blocks_hello_world/scratch-block-test/dist/media/delete.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wwj718/blockly_dev/f25d2d97deb6a32d4f9484e068469e6634660963/src/scratch-blocks_hello_world/scratch-block-test/dist/media/delete.wav -------------------------------------------------------------------------------- /src/scratch-blocks_hello_world/scratch-block-test/dist/media/dropdown-arrow-dark.svg: -------------------------------------------------------------------------------- 1 | dropdown-arrow 2 | -------------------------------------------------------------------------------- /src/scratch-blocks_hello_world/scratch-block-test/dist/media/dropdown-arrow.svg: -------------------------------------------------------------------------------- 1 | dropdown-arrow -------------------------------------------------------------------------------- /src/scratch-blocks_hello_world/scratch-block-test/dist/media/extensions/music-block-icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | music-block-icon 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/scratch-blocks_hello_world/scratch-block-test/dist/media/extensions/pen-block-icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | pen-icon 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /src/scratch-blocks_hello_world/scratch-block-test/dist/media/eyedropper.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Artboard 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /src/scratch-blocks_hello_world/scratch-block-test/dist/media/green-flag.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 9 | greenflag 10 | 15 | 17 | 18 | -------------------------------------------------------------------------------- /src/scratch-blocks_hello_world/scratch-block-test/dist/media/handclosed.cur: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wwj718/blockly_dev/f25d2d97deb6a32d4f9484e068469e6634660963/src/scratch-blocks_hello_world/scratch-block-test/dist/media/handclosed.cur -------------------------------------------------------------------------------- /src/scratch-blocks_hello_world/scratch-block-test/dist/media/handdelete.cur: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wwj718/blockly_dev/f25d2d97deb6a32d4f9484e068469e6634660963/src/scratch-blocks_hello_world/scratch-block-test/dist/media/handdelete.cur -------------------------------------------------------------------------------- /src/scratch-blocks_hello_world/scratch-block-test/dist/media/handopen.cur: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wwj718/blockly_dev/f25d2d97deb6a32d4f9484e068469e6634660963/src/scratch-blocks_hello_world/scratch-block-test/dist/media/handopen.cur -------------------------------------------------------------------------------- /src/scratch-blocks_hello_world/scratch-block-test/dist/media/icons/arrow.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | arrow 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /src/scratch-blocks_hello_world/scratch-block-test/dist/media/icons/control_forever.svg: -------------------------------------------------------------------------------- 1 | control_forever -------------------------------------------------------------------------------- /src/scratch-blocks_hello_world/scratch-block-test/dist/media/icons/control_repeat.svg: -------------------------------------------------------------------------------- 1 | control_repeat -------------------------------------------------------------------------------- /src/scratch-blocks_hello_world/scratch-block-test/dist/media/icons/control_stop.svg: -------------------------------------------------------------------------------- 1 | control_stop -------------------------------------------------------------------------------- /src/scratch-blocks_hello_world/scratch-block-test/dist/media/icons/control_wait.svg: -------------------------------------------------------------------------------- 1 | wait -------------------------------------------------------------------------------- /src/scratch-blocks_hello_world/scratch-block-test/dist/media/icons/event_broadcast_blue.svg: -------------------------------------------------------------------------------- 1 | event_broadcast_blue -------------------------------------------------------------------------------- /src/scratch-blocks_hello_world/scratch-block-test/dist/media/icons/event_broadcast_coral.svg: -------------------------------------------------------------------------------- 1 | event_broadcast_coral -------------------------------------------------------------------------------- /src/scratch-blocks_hello_world/scratch-block-test/dist/media/icons/event_broadcast_green.svg: -------------------------------------------------------------------------------- 1 | event_broadcast_green -------------------------------------------------------------------------------- /src/scratch-blocks_hello_world/scratch-block-test/dist/media/icons/event_broadcast_magenta.svg: -------------------------------------------------------------------------------- 1 | event_broadcast_magenta -------------------------------------------------------------------------------- /src/scratch-blocks_hello_world/scratch-block-test/dist/media/icons/event_broadcast_orange.svg: -------------------------------------------------------------------------------- 1 | event_broadcast_orange -------------------------------------------------------------------------------- /src/scratch-blocks_hello_world/scratch-block-test/dist/media/icons/event_broadcast_purple.svg: -------------------------------------------------------------------------------- 1 | send-message-purple -------------------------------------------------------------------------------- /src/scratch-blocks_hello_world/scratch-block-test/dist/media/icons/event_when-broadcast-received_blue.svg: -------------------------------------------------------------------------------- 1 | LetterGet_Blue -------------------------------------------------------------------------------- /src/scratch-blocks_hello_world/scratch-block-test/dist/media/icons/event_when-broadcast-received_coral.svg: -------------------------------------------------------------------------------- 1 | LetterGet_Coral -------------------------------------------------------------------------------- /src/scratch-blocks_hello_world/scratch-block-test/dist/media/icons/event_when-broadcast-received_green.svg: -------------------------------------------------------------------------------- 1 | LetterGet_Green -------------------------------------------------------------------------------- /src/scratch-blocks_hello_world/scratch-block-test/dist/media/icons/event_when-broadcast-received_magenta.svg: -------------------------------------------------------------------------------- 1 | LetterGet_Magenta -------------------------------------------------------------------------------- /src/scratch-blocks_hello_world/scratch-block-test/dist/media/icons/event_when-broadcast-received_orange.svg: -------------------------------------------------------------------------------- 1 | LetterGet_Orange -------------------------------------------------------------------------------- /src/scratch-blocks_hello_world/scratch-block-test/dist/media/icons/event_when-broadcast-received_purple.svg: -------------------------------------------------------------------------------- 1 | LetterGet_Purple -------------------------------------------------------------------------------- /src/scratch-blocks_hello_world/scratch-block-test/dist/media/icons/event_whenflagclicked.svg: -------------------------------------------------------------------------------- 1 | greenflag -------------------------------------------------------------------------------- /src/scratch-blocks_hello_world/scratch-block-test/dist/media/icons/remove.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | delete-argument v2 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /src/scratch-blocks_hello_world/scratch-block-test/dist/media/icons/set-led_blue.svg: -------------------------------------------------------------------------------- 1 | set-led_blue -------------------------------------------------------------------------------- /src/scratch-blocks_hello_world/scratch-block-test/dist/media/icons/set-led_coral.svg: -------------------------------------------------------------------------------- 1 | set-led_coral -------------------------------------------------------------------------------- /src/scratch-blocks_hello_world/scratch-block-test/dist/media/icons/set-led_green.svg: -------------------------------------------------------------------------------- 1 | set-led_green -------------------------------------------------------------------------------- /src/scratch-blocks_hello_world/scratch-block-test/dist/media/icons/set-led_magenta.svg: -------------------------------------------------------------------------------- 1 | set-led-magenta -------------------------------------------------------------------------------- /src/scratch-blocks_hello_world/scratch-block-test/dist/media/icons/set-led_mystery.svg: -------------------------------------------------------------------------------- 1 | set-led-mystery -------------------------------------------------------------------------------- /src/scratch-blocks_hello_world/scratch-block-test/dist/media/icons/set-led_orange.svg: -------------------------------------------------------------------------------- 1 | set-led-orange -------------------------------------------------------------------------------- /src/scratch-blocks_hello_world/scratch-block-test/dist/media/icons/set-led_purple.svg: -------------------------------------------------------------------------------- 1 | set-led-purple -------------------------------------------------------------------------------- /src/scratch-blocks_hello_world/scratch-block-test/dist/media/icons/set-led_white.svg: -------------------------------------------------------------------------------- 1 | set-led-white -------------------------------------------------------------------------------- /src/scratch-blocks_hello_world/scratch-block-test/dist/media/icons/set-led_yellow.svg: -------------------------------------------------------------------------------- 1 | set-led-yellow -------------------------------------------------------------------------------- /src/scratch-blocks_hello_world/scratch-block-test/dist/media/icons/wedo_motor-clockwise.svg: -------------------------------------------------------------------------------- 1 | wedo_motorclockwise -------------------------------------------------------------------------------- /src/scratch-blocks_hello_world/scratch-block-test/dist/media/icons/wedo_motor-counterclockwise.svg: -------------------------------------------------------------------------------- 1 | wedo_motorclockwise -------------------------------------------------------------------------------- /src/scratch-blocks_hello_world/scratch-block-test/dist/media/icons/wedo_motor-speed_fast.svg: -------------------------------------------------------------------------------- 1 | set-motor-speed_fast -------------------------------------------------------------------------------- /src/scratch-blocks_hello_world/scratch-block-test/dist/media/icons/wedo_motor-speed_med.svg: -------------------------------------------------------------------------------- 1 | set-motor-speed_med -------------------------------------------------------------------------------- /src/scratch-blocks_hello_world/scratch-block-test/dist/media/icons/wedo_motor-speed_slow.svg: -------------------------------------------------------------------------------- 1 | set-motor-speed_slow -------------------------------------------------------------------------------- /src/scratch-blocks_hello_world/scratch-block-test/dist/media/icons/wedo_when-distance_close.svg: -------------------------------------------------------------------------------- 1 | wedo_whendistanceclose -------------------------------------------------------------------------------- /src/scratch-blocks_hello_world/scratch-block-test/dist/media/icons/wedo_when-tilt-backward.svg: -------------------------------------------------------------------------------- 1 | wedo_whentiltbackward -------------------------------------------------------------------------------- /src/scratch-blocks_hello_world/scratch-block-test/dist/media/icons/wedo_when-tilt-forward.svg: -------------------------------------------------------------------------------- 1 | start-when-tilted-forward -------------------------------------------------------------------------------- /src/scratch-blocks_hello_world/scratch-block-test/dist/media/icons/wedo_when-tilt-left.svg: -------------------------------------------------------------------------------- 1 | start-when-tilted-left -------------------------------------------------------------------------------- /src/scratch-blocks_hello_world/scratch-block-test/dist/media/icons/wedo_when-tilt-right.svg: -------------------------------------------------------------------------------- 1 | start-when-tilted-right -------------------------------------------------------------------------------- /src/scratch-blocks_hello_world/scratch-block-test/dist/media/icons/wedo_when-tilt.svg: -------------------------------------------------------------------------------- 1 | start-when-tilted-any -------------------------------------------------------------------------------- /src/scratch-blocks_hello_world/scratch-block-test/dist/media/repeat.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 9 | repeat 10 | 14 | 18 | 19 | -------------------------------------------------------------------------------- /src/scratch-blocks_hello_world/scratch-block-test/dist/media/rotate-left.svg: -------------------------------------------------------------------------------- 1 | rotate-clockwise -------------------------------------------------------------------------------- /src/scratch-blocks_hello_world/scratch-block-test/dist/media/rotate-right.svg: -------------------------------------------------------------------------------- 1 | rotate-counter-clockwise -------------------------------------------------------------------------------- /src/scratch-blocks_hello_world/scratch-block-test/dist/media/sprites.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wwj718/blockly_dev/f25d2d97deb6a32d4f9484e068469e6634660963/src/scratch-blocks_hello_world/scratch-block-test/dist/media/sprites.png -------------------------------------------------------------------------------- /src/scratch-blocks_hello_world/scratch-block-test/dist/media/sprites.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | -------------------------------------------------------------------------------- /src/scratch-blocks_hello_world/scratch-block-test/dist/media/zoom-in.svg: -------------------------------------------------------------------------------- 1 | zoom-in -------------------------------------------------------------------------------- /src/scratch-blocks_hello_world/scratch-block-test/dist/media/zoom-out.svg: -------------------------------------------------------------------------------- 1 | zoom-out -------------------------------------------------------------------------------- /src/scratch-blocks_hello_world/scratch-block-test/dist/media/zoom-reset.svg: -------------------------------------------------------------------------------- 1 | zoom-reset -------------------------------------------------------------------------------- /src/scratch-blocks_hello_world/scratch-block-test/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "scratch-block-test", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "keywords": [], 10 | "author": "", 11 | "license": "ISC", 12 | "devDependencies": { 13 | "babel-core": "^6.26.0", 14 | "babel-eslint": "^8.0.3", 15 | "babel-loader": "^7.1.2", 16 | "babel-preset-es2015": "^6.24.1", 17 | "babel-preset-es2016": "^6.24.1", 18 | "copy-webpack-plugin": "^4.3.0", 19 | "scratch-blocks": "0.1.0-prerelease.1513719016", 20 | "webpack": "^3.10.0", 21 | "webpack-dev-server": "^2.9.7" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/scratch-blocks_hello_world/scratch-block-test/src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | Hello, World!! 4 | 5 | 6 |
Test
7 |
8 | 9 | 10 | 11 | 19 | 20 | -------------------------------------------------------------------------------- /src/scratch-blocks_hello_world/scratch-block-test/src/python_compressed.js: -------------------------------------------------------------------------------- 1 | // Do not edit this file; automatically generated by build.py. 2 | 'use strict'; 3 | 4 | 5 | // Copyright 2012 Google Inc. Apache License 2.0 6 | Blockly.Python=new Blockly.Generator("Python");Blockly.Python.addReservedWords("False,None,True,and,as,assert,break,class,continue,def,del,elif,else,except,exec,finally,for,from,global,if,import,in,is,lambda,nonlocal,not,or,pass,print,raise,return,try,while,with,yield,NotImplemented,Ellipsis,__debug__,quit,exit,copyright,license,credits,ArithmeticError,AssertionError,AttributeError,BaseException,BlockingIOError,BrokenPipeError,BufferError,BytesWarning,ChildProcessError,ConnectionAbortedError,ConnectionError,ConnectionRefusedError,ConnectionResetError,DeprecationWarning,EOFError,Ellipsis,EnvironmentError,Exception,FileExistsError,FileNotFoundError,FloatingPointError,FutureWarning,GeneratorExit,IOError,ImportError,ImportWarning,IndentationError,IndexError,InterruptedError,IsADirectoryError,KeyError,KeyboardInterrupt,LookupError,MemoryError,ModuleNotFoundError,NameError,NotADirectoryError,NotImplemented,NotImplementedError,OSError,OverflowError,PendingDeprecationWarning,PermissionError,ProcessLookupError,RecursionError,ReferenceError,ResourceWarning,RuntimeError,RuntimeWarning,StandardError,StopAsyncIteration,StopIteration,SyntaxError,SyntaxWarning,SystemError,SystemExit,TabError,TimeoutError,TypeError,UnboundLocalError,UnicodeDecodeError,UnicodeEncodeError,UnicodeError,UnicodeTranslateError,UnicodeWarning,UserWarning,ValueError,Warning,ZeroDivisionError,_,__build_class__,__debug__,__doc__,__import__,__loader__,__name__,__package__,__spec__,abs,all,any,apply,ascii,basestring,bin,bool,buffer,bytearray,bytes,callable,chr,classmethod,cmp,coerce,compile,complex,copyright,credits,delattr,dict,dir,divmod,enumerate,eval,exec,execfile,exit,file,filter,float,format,frozenset,getattr,globals,hasattr,hash,help,hex,id,input,int,intern,isinstance,issubclass,iter,len,license,list,locals,long,map,max,memoryview,min,next,object,oct,open,ord,pow,print,property,quit,range,raw_input,reduce,reload,repr,reversed,round,set,setattr,slice,sorted,staticmethod,str,sum,super,tuple,type,unichr,unicode,vars,xrange,zip"); 7 | Blockly.Python.ORDER_ATOMIC=0;Blockly.Python.ORDER_COLLECTION=1;Blockly.Python.ORDER_STRING_CONVERSION=1;Blockly.Python.ORDER_MEMBER=2.1;Blockly.Python.ORDER_FUNCTION_CALL=2.2;Blockly.Python.ORDER_EXPONENTIATION=3;Blockly.Python.ORDER_UNARY_SIGN=4;Blockly.Python.ORDER_BITWISE_NOT=4;Blockly.Python.ORDER_MULTIPLICATIVE=5;Blockly.Python.ORDER_ADDITIVE=6;Blockly.Python.ORDER_BITWISE_SHIFT=7;Blockly.Python.ORDER_BITWISE_AND=8;Blockly.Python.ORDER_BITWISE_XOR=9;Blockly.Python.ORDER_BITWISE_OR=10; 8 | Blockly.Python.ORDER_RELATIONAL=11;Blockly.Python.ORDER_LOGICAL_NOT=12;Blockly.Python.ORDER_LOGICAL_AND=13;Blockly.Python.ORDER_LOGICAL_OR=14;Blockly.Python.ORDER_CONDITIONAL=15;Blockly.Python.ORDER_LAMBDA=16;Blockly.Python.ORDER_NONE=99; 9 | Blockly.Python.ORDER_OVERRIDES=[[Blockly.Python.ORDER_FUNCTION_CALL,Blockly.Python.ORDER_MEMBER],[Blockly.Python.ORDER_FUNCTION_CALL,Blockly.Python.ORDER_FUNCTION_CALL],[Blockly.Python.ORDER_MEMBER,Blockly.Python.ORDER_MEMBER],[Blockly.Python.ORDER_MEMBER,Blockly.Python.ORDER_FUNCTION_CALL],[Blockly.Python.ORDER_LOGICAL_NOT,Blockly.Python.ORDER_LOGICAL_NOT],[Blockly.Python.ORDER_LOGICAL_AND,Blockly.Python.ORDER_LOGICAL_AND],[Blockly.Python.ORDER_LOGICAL_OR,Blockly.Python.ORDER_LOGICAL_OR]]; 10 | Blockly.Python.init=function(a){Blockly.Python.PASS=this.INDENT+"pass\n";Blockly.Python.definitions_=Object.create(null);Blockly.Python.functionNames_=Object.create(null);Blockly.Python.variableDB_?Blockly.Python.variableDB_.reset():Blockly.Python.variableDB_=new Blockly.Names(Blockly.Python.RESERVED_WORDS_);var e=[];a=a.getAllVariables();for(var b=0;bb?"int("+a+" - "+-b+")":"int("+a+")",c&&(a="-"+a));return a}; -------------------------------------------------------------------------------- /src/scratch-blocks_hello_world/scratch-block-test/src/scratch-block-test.js: -------------------------------------------------------------------------------- 1 | const Blockly = require("scratch-blocks"); 2 | window.Blockly = Blockly; 3 | class HelloWorld { 4 | hello() { 5 | console.log("Hello, World!!"); 6 | } 7 | } 8 | 9 | var helloWorld = new HelloWorld(); 10 | helloWorld.hello(); 11 | 12 | // Instantiate scratch-blocks and attach it to the DOM. 13 | const workspace = Blockly.inject('blocks', { 14 | media: './media/', // 不存在使用线上的吧 15 | zoom: { 16 | controls: true, 17 | wheel: true, 18 | startScale: 0.75 19 | }, 20 | colours: { 21 | workspace: '#334771', 22 | flyout: '#283856', 23 | scrollbar: '#24324D', 24 | scrollbarHover: '#0C111A', 25 | insertionMarker: '#FFFFFF', 26 | insertionMarkerOpacity: 0.3, 27 | fieldShadow: 'rgba(255, 255, 255, 0.3)', 28 | dragShadowOpacity: 0.6 29 | } 30 | }); 31 | window.workspace = workspace; -------------------------------------------------------------------------------- /src/scratch-blocks_hello_world/scratch-block-test/webpack.config.js: -------------------------------------------------------------------------------- 1 | const CopyWebpackPlugin = require('copy-webpack-plugin'); 2 | const path = require('path'); 3 | const webpack = require('webpack'); 4 | 5 | 6 | const base = { 7 | devServer: { 8 | contentBase: false, 9 | host: '0.0.0.0', 10 | port: process.env.PORT || 8362 11 | }, 12 | output: { 13 | filename: 'bundle.js', 14 | path: path.resolve(__dirname, 'dist') 15 | }, 16 | module: { 17 | rules: [{ 18 | loader: 'babel-loader', 19 | include: path.resolve(__dirname, 'src'), 20 | query: { 21 | presets: ['es2015'] 22 | } 23 | }] 24 | }, 25 | plugins: process.env.NODE_ENV === 'production' ? [ 26 | new webpack.optimize.UglifyJsPlugin({ 27 | include: /\.min\.js$/, 28 | minimize: true 29 | }) 30 | ] : [] 31 | }; 32 | 33 | module.exports = [ 34 | Object.assign({}, base, { 35 | target: 'web', 36 | entry: { 37 | 'scratch-block-test': './src/scratch-block-test.js', 38 | 'python_compressed': './src/python_compressed.js' 39 | }, 40 | output: { 41 | path: path.resolve(__dirname, 'dist'), 42 | filename: '[name].js' 43 | }, 44 | plugins: base.plugins.concat([ 45 | new CopyWebpackPlugin([ 46 | { 47 | from: 'src' 48 | } 49 | ]) 50 | ]) 51 | }), 52 | ]; 53 | -------------------------------------------------------------------------------- /src/scratch-blocks_hello_world/scratch-block-test_note.md: -------------------------------------------------------------------------------- 1 | 2 | # scratch_webpack_note 3 | 4 | 参考 https://github.com/kyorohiro/doc.advent.scratch30 5 | 6 | # 使用 7 | ``` 8 | git clone https://github.com/kyorohiro/doc.advent.scratch30 9 | cd doc.advent.scratch30 10 | cd scratch-block-test 11 | npm install # 慢! 12 | 13 | # 是build 14 | webpack 15 | cd dist 16 | cp -r /Users/wwj/mylab/changxue/scratch-blocks/media/ media 17 | open index.html # ok 18 | 19 | # dev 20 | webpack-dev-server 21 | 22 | ``` 23 | 24 | # generate python 25 | Blockly.Python.workspaceToCode(workspace) 26 | 27 | 注意看`scratch-block-test.js` 中的全局变量 28 | 29 | # `doc.advent.scratch30/scratch-vm-test` 项目 30 | ``` 31 | ln -s /Users/wwj/mylab/changxue/blockly_dev/src/scratch-blocks_hello_world/scratch-block-test/node_modules/ node_modules 32 | ``` 33 | 34 | scratch3组件都是es6模块 35 | 36 | # todo 37 | 驱动cozmo 使用remote_control -------------------------------------------------------------------------------- /src/scratch3-adapter-4-blockly/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Blockly Demo: Fixed Blockly 6 | 7 | 8 | 9 | 10 | 11 | 12 | 22 | 42 | 43 | 44 |

45 | Blockly > 46 | Demos > Fixed Blockly 47 |

48 | 49 |

50 | This is a simple demo of injecting Blockly into a fixed-sized 'div' 51 | element. 52 |

53 | 54 |

55 | → More info on 56 | injecting fixed-sized Blockly… 60 |

61 | 62 |

63 | 64 | 65 |

66 | 67 |
68 | 69 | 76 | 77 | 167 | 168 | 169 | -------------------------------------------------------------------------------- /src/scratch3-adapter-4-blockly/readme.md: -------------------------------------------------------------------------------- 1 | # 使用 2 | 我们需要在本地运行https服务。 3 | 4 | 5 | 在项目根目录创建Python文件 6 | 7 | 8 | simple_https_server.py 9 | 10 | ```python 11 | # python3 12 | import http.server, ssl 13 | 14 | server_address = ('localhost', 8601) 15 | httpd = http.server.HTTPServer(server_address, http.server.SimpleHTTPRequestHandler) 16 | httpd.socket = ssl.wrap_socket(httpd.socket, 17 | server_side=True, 18 | certfile='server.pem', 19 | ssl_version=ssl.PROTOCOL_TLSv1) 20 | httpd.serve_forever() 21 | ``` 22 | 23 | 在根目录运行运行: `➜ blockly_dev git:(master) ✗ python3 simple_https_server.py` 24 | 25 | 打开: `https://127.0.0.1:8601/src/scratch3-adapter-4-blockly/` 26 | 27 | --------------------------------------------------------------------------------