nadesiko3 3.2.27

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (283) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +107 -0
  3. package/bin/cnako3 +10 -0
  4. package/bin/cnako3.bat +11 -0
  5. package/bin/nako3server.bat +6 -0
  6. package/demo/ace_editor.html +90 -0
  7. package/demo/ace_editor_tabs.html +162 -0
  8. package/demo/basic.html +71 -0
  9. package/demo/browsers.html +128 -0
  10. package/demo/css/basic.css +3 -0
  11. package/demo/css/common.css +157 -0
  12. package/demo/css/editor.css +8 -0
  13. package/demo/css/flow.css +3 -0
  14. package/demo/css/index.css +3 -0
  15. package/demo/extlib/ace@1.4.12/ace.js +17 -0
  16. package/demo/extlib/ace@1.4.12/ext-code_lens.min.js +1 -0
  17. package/demo/extlib/ace@1.4.12/ext-language_tools.min.js +1 -0
  18. package/demo/extlib/ace@1.4.12/ext-options.min.js +1 -0
  19. package/demo/extlib/ace@1.4.12/ext-settings_menu.js +8 -0
  20. package/demo/extlib/ace@1.4.12/keybinding-vscode.js +8 -0
  21. package/demo/extlib/ace@1.4.12/theme-monokai.js +8 -0
  22. package/demo/extlib/ace@1.4.12/theme-xcode.js +8 -0
  23. package/demo/extlib/chart.js@3.2.1/chart.min.js +13 -0
  24. package/demo/extlib/pure-min.css +11 -0
  25. package/demo/flow.html +97 -0
  26. package/demo/graph.html +53 -0
  27. package/demo/image/nako.png +0 -0
  28. package/demo/image/nakopad-icon256.png +0 -0
  29. package/demo/image/turtle.fla +0 -0
  30. package/demo/image/turtle.png +0 -0
  31. package/demo/index.html +134 -0
  32. package/demo/js/common.js +17 -0
  33. package/demo/js/turtle3d_test.js +44 -0
  34. package/demo/js/turtle_test.js +44 -0
  35. package/demo/runscript.html +47 -0
  36. package/demo/runscript2.html +33 -0
  37. package/demo/turtle.html +58 -0
  38. package/demo/turtle2.html +141 -0
  39. package/demo/turtle3.html +278 -0
  40. package/demo/turtle3d.html +58 -0
  41. package/demo/turtle3d2.html +107 -0
  42. package/demo/version.html +24 -0
  43. package/doc/SETUP.md +172 -0
  44. package/doc/about.md +34 -0
  45. package/doc/browsers.md +60 -0
  46. package/doc/docgen.md +21 -0
  47. package/doc/editor.md +44 -0
  48. package/doc/files.md +37 -0
  49. package/doc/plugins.md +195 -0
  50. package/doc/release.md +78 -0
  51. package/doc/win32.md +57 -0
  52. package/package.json +196 -0
  53. package/release/_hash.txt +65 -0
  54. package/release/_script-tags.txt +13 -0
  55. package/release/command.json +1 -0
  56. package/release/command.json.js +1 -0
  57. package/release/command_cnako3.json +1 -0
  58. package/release/command_list.json +1 -0
  59. package/release/editor.js +2 -0
  60. package/release/editor.js.LICENSE.txt +32 -0
  61. package/release/josi.json +48 -0
  62. package/release/nako_gen_async.js +1 -0
  63. package/release/nako_gen_async.js.LICENSE.txt +595 -0
  64. package/release/plugin_caniuse.js +1 -0
  65. package/release/plugin_caniuse.js.LICENSE.txt +411 -0
  66. package/release/plugin_csv.js +1 -0
  67. package/release/plugin_csv.js.LICENSE.txt +367 -0
  68. package/release/plugin_datetime.js +1 -0
  69. package/release/plugin_datetime.js.LICENSE.txt +471 -0
  70. package/release/plugin_kansuji.js +1 -0
  71. package/release/plugin_kansuji.js.LICENSE.txt +491 -0
  72. package/release/plugin_markup.js +1 -0
  73. package/release/plugin_markup.js.LICENSE.txt +363 -0
  74. package/release/plugin_turtle.js +1 -0
  75. package/release/plugin_turtle.js.LICENSE.txt +435 -0
  76. package/release/plugin_webworker.js +1 -0
  77. package/release/plugin_webworker.js.LICENSE.txt +491 -0
  78. package/release/version.js +2 -0
  79. package/release/version.js.LICENSE.txt +32 -0
  80. package/release/wnako3.js +2 -0
  81. package/release/wnako3.js.LICENSE.txt +1 -0
  82. package/release/wnako3webworker.js +1 -0
  83. package/release/wnako3webworker.js.LICENSE.txt +847 -0
  84. package/release/yoyakugo.json +30 -0
  85. package/src/browsers.md +60 -0
  86. package/src/cnako3.js +466 -0
  87. package/src/commander_ja.js +154 -0
  88. package/src/enako3.js +69 -0
  89. package/src/era.json +22 -0
  90. package/src/index.js +5 -0
  91. package/src/nako3.js +836 -0
  92. package/src/nako3_assert.js +37 -0
  93. package/src/nako3editorfix.sfd +106 -0
  94. package/src/nako3editorfix.woff +0 -0
  95. package/src/nako3server.js +51 -0
  96. package/src/nako_colors.js +86 -0
  97. package/src/nako_errors.js +176 -0
  98. package/src/nako_gen.js +1459 -0
  99. package/src/nako_gen_async.js +1622 -0
  100. package/src/nako_global.js +113 -0
  101. package/src/nako_indent.js +480 -0
  102. package/src/nako_josi_list.js +46 -0
  103. package/src/nako_lex_rules.js +259 -0
  104. package/src/nako_lexer.js +576 -0
  105. package/src/nako_logger.js +138 -0
  106. package/src/nako_parser3.js +1768 -0
  107. package/src/nako_parser_base.js +265 -0
  108. package/src/nako_parser_const.js +37 -0
  109. package/src/nako_prepare.js +293 -0
  110. package/src/nako_reserved_words.js +35 -0
  111. package/src/nako_source_mapping.js +251 -0
  112. package/src/nako_test.js +37 -0
  113. package/src/nako_version.js +8 -0
  114. package/src/plugin_browser.js +191 -0
  115. package/src/plugin_browser_ajax.js +352 -0
  116. package/src/plugin_browser_audio.js +109 -0
  117. package/src/plugin_browser_canvas.js +462 -0
  118. package/src/plugin_browser_chart.js +296 -0
  119. package/src/plugin_browser_color.js +49 -0
  120. package/src/plugin_browser_crypto.js +26 -0
  121. package/src/plugin_browser_dialog.js +53 -0
  122. package/src/plugin_browser_dom_basic.js +322 -0
  123. package/src/plugin_browser_dom_event.js +193 -0
  124. package/src/plugin_browser_dom_parts.js +163 -0
  125. package/src/plugin_browser_geolocation.js +51 -0
  126. package/src/plugin_browser_hotkey.js +25 -0
  127. package/src/plugin_browser_html.js +59 -0
  128. package/src/plugin_browser_in_worker.js +44 -0
  129. package/src/plugin_browser_location.js +21 -0
  130. package/src/plugin_browser_speech.js +111 -0
  131. package/src/plugin_browser_storage.js +121 -0
  132. package/src/plugin_browser_system.js +12 -0
  133. package/src/plugin_browser_websocket.js +73 -0
  134. package/src/plugin_caniuse.js +24 -0
  135. package/src/plugin_csv.js +57 -0
  136. package/src/plugin_datetime.js +414 -0
  137. package/src/plugin_express.js +212 -0
  138. package/src/plugin_kansuji.js +224 -0
  139. package/src/plugin_keigo.js +55 -0
  140. package/src/plugin_markup.js +32 -0
  141. package/src/plugin_math.js +319 -0
  142. package/src/plugin_node.js +1018 -0
  143. package/src/plugin_promise.js +94 -0
  144. package/src/plugin_system.js +2109 -0
  145. package/src/plugin_test.js +38 -0
  146. package/src/plugin_turtle.js +646 -0
  147. package/src/plugin_webworker.js +334 -0
  148. package/src/plugin_weykturtle3d.js +1216 -0
  149. package/src/plugin_worker.js +92 -0
  150. package/src/repl.nako3 +63 -0
  151. package/src/turtle-elephant.png +0 -0
  152. package/src/turtle-panda.png +0 -0
  153. package/src/turtle64.png +0 -0
  154. package/src/wnako3.js +162 -0
  155. package/src/wnako3_editor.css +215 -0
  156. package/src/wnako3_editor.js +1645 -0
  157. package/src/wnako3_editor_marker_red.png +0 -0
  158. package/src/wnako3_editor_marker_red.xcf +0 -0
  159. package/src/wnako3_editor_marker_yellow.png +0 -0
  160. package/src/wnako3_editor_marker_yellow.xcf +0 -0
  161. package/src/wnako3webworker.js +70 -0
  162. package/test/ace_editor/karma.config.js +94 -0
  163. package/test/ace_editor/test/.babelrc.json +3 -0
  164. package/test/ace_editor/test/ace_editor_test.js +178 -0
  165. package/test/ace_editor/test/html/custom_context.html +140 -0
  166. package/test/async/async_basic_test.js +124 -0
  167. package/test/browser/karma.config.js +212 -0
  168. package/test/browser/test/.babelrc.json +3 -0
  169. package/test/browser/test/compare_util.js +50 -0
  170. package/test/browser/test/html/canvas_basic.html +1 -0
  171. package/test/browser/test/html/div_basic.html +2 -0
  172. package/test/browser/test/html/event_dom_form.html +4 -0
  173. package/test/browser/test/html/event_dom_scrolldiv.html +5 -0
  174. package/test/browser/test/image/canvas_test1.png +0 -0
  175. package/test/browser/test/image/canvas_test2.png +0 -0
  176. package/test/browser/test/image/canvas_test3.png +0 -0
  177. package/test/browser/test/image/canvas_test4.png +0 -0
  178. package/test/browser/test/image/canvas_test7.png +0 -0
  179. package/test/browser/test/image/canvas_test8.png +0 -0
  180. package/test/browser/test/image/canvas_test_blank.png +0 -0
  181. package/test/browser/test/image/elephant_kana.png +0 -0
  182. package/test/browser/test/image/panda_kana.png +0 -0
  183. package/test/browser/test/image/turtle_kana.png +0 -0
  184. package/test/browser/test/import_plugin_checker.js +24 -0
  185. package/test/browser/test/plugin_browser_test.js +52 -0
  186. package/test/browser/test/plugin_browser_test_ajax.js +123 -0
  187. package/test/browser/test/plugin_browser_test_color.js +18 -0
  188. package/test/browser/test/plugin_browser_test_dialog.js +72 -0
  189. package/test/browser/test/plugin_browser_test_dom_event.js +598 -0
  190. package/test/browser/test/plugin_browser_test_dom_parts.js +125 -0
  191. package/test/browser/test/plugin_browser_test_system.js +9 -0
  192. package/test/browser/test/plugin_turtle_test.js +817 -0
  193. package/test/browser/test/plugin_webworker_test.js +87 -0
  194. package/test/browser/test/require_test.js +71 -0
  195. package/test/bundled/karma.config.base.js +117 -0
  196. package/test/bundled/karma.config.js +86 -0
  197. package/test/bundled/test/.babelrc.json +3 -0
  198. package/test/bundled/test/bundled_test.js +69 -0
  199. package/test/bundled/test/html/custom_context.html +65 -0
  200. package/test/bundled/test/html/custom_debug.html +66 -0
  201. package/test/bundled/test4b.cmd +52 -0
  202. package/test/bundled/test_base/.babelrc.json +3 -0
  203. package/test/bundled/test_base/_checktool_test.js +25 -0
  204. package/test/bundled/test_base/basic_ajax_test.js +56 -0
  205. package/test/bundled/test_base/basic_async_test.js +18 -0
  206. package/test/bundled/test_base/basic_test.js +153 -0
  207. package/test/bundled/test_base/calc_test.js +132 -0
  208. package/test/bundled/test_base/css/browsers_box.css +114 -0
  209. package/test/bundled/test_base/html/custom_context.html +69 -0
  210. package/test/bundled/test_base/html/custom_debug.html +71 -0
  211. package/test/bundled/test_base/js/browsers_box.js +72 -0
  212. package/test/bundled/test_base/plugin_csv_test.js +37 -0
  213. package/test/bundled/test_base/plugin_datetime_test.js +115 -0
  214. package/test/bundled/test_base/plugin_kansuji_test.js +49 -0
  215. package/test/bundled/test_base/plugin_system_test.js +410 -0
  216. package/test/bundled/test_base/plugin_webworker_test.js +53 -0
  217. package/test/bundled/test_base/resources/ok.txt +1 -0
  218. package/test/bundled/test_base/test_utils.js +191 -0
  219. package/test/common/array_test.js +40 -0
  220. package/test/common/basic_test.js +317 -0
  221. package/test/common/calc_test.js +139 -0
  222. package/test/common/debug_test.js +16 -0
  223. package/test/common/error_test.js +16 -0
  224. package/test/common/flow_test.js +360 -0
  225. package/test/common/func_call.js +136 -0
  226. package/test/common/func_test.js +149 -0
  227. package/test/common/indent_test.js +362 -0
  228. package/test/common/lex_test.js +146 -0
  229. package/test/common/literal_test.js +72 -0
  230. package/test/common/nako_logger_test.js +26 -0
  231. package/test/common/plugin_browser_test.js +24 -0
  232. package/test/common/plugin_browser_ut_audio_test.js +88 -0
  233. package/test/common/plugin_browser_ut_color_test.js +21 -0
  234. package/test/common/plugin_browser_ut_dialog_test.js +100 -0
  235. package/test/common/plugin_browser_ut_html_test.js +13 -0
  236. package/test/common/plugin_browser_ut_system_test.js +10 -0
  237. package/test/common/plugin_csv_test.js +39 -0
  238. package/test/common/plugin_datetime_test.js +120 -0
  239. package/test/common/plugin_kansuji_test.js +59 -0
  240. package/test/common/plugin_promise_test.js +18 -0
  241. package/test/common/plugin_system_test.js +451 -0
  242. package/test/common/prepare_test.js +93 -0
  243. package/test/common/re_test.js +20 -0
  244. package/test/common/variable_scope_test.js +105 -0
  245. package/test/jsconfig.json +19 -0
  246. package/test/karma.config.js +91 -0
  247. package/test/node/add_test.nako3 +1 -0
  248. package/test/node/async_test.js +80 -0
  249. package/test/node/commander_ja_test.js +82 -0
  250. package/test/node/error_message_test.js +244 -0
  251. package/test/node/kai_test.nako3 +6 -0
  252. package/test/node/node_test.js +43 -0
  253. package/test/node/plugin_broken.js.txt +3 -0
  254. package/test/node/plugin_browser_ut_ajax_test.js +355 -0
  255. package/test/node/plugin_browser_ut_location_test.js +32 -0
  256. package/test/node/plugin_markup_test.js +44 -0
  257. package/test/node/plugin_math_test.js +42 -0
  258. package/test/node/plugin_node_test.js +93 -0
  259. package/test/node/plugin_test.js +16 -0
  260. package/test/node/relative_import_test_1.nako3 +1 -0
  261. package/test/node/relative_import_test_2.nako3 +2 -0
  262. package/test/node/require_nako3_test.js +59 -0
  263. package/test/node/requiretest.nako3 +4 -0
  264. package/test/node/requiretest_indirect.nako3 +1 -0
  265. package/test/node/requiretest_name.nako3 +5 -0
  266. package/test/node/runtime_error.nako3 +2 -0
  267. package/test/node/side_effects_test.js +106 -0
  268. package/test/node/sjis.txt +5 -0
  269. package/test/node/syntax_error.nako3 +2 -0
  270. package/test/node/wnako3_editor_test.js +360 -0
  271. package/tools/README.md +7 -0
  272. package/tools/nako3edit/html/edit.html +83 -0
  273. package/tools/nako3edit/html/edit_plugin.js +6 -0
  274. package/tools/nako3edit/html/files.html +49 -0
  275. package/tools/nako3edit/html/nako3edit.css +66 -0
  276. package/tools/nako3edit/index.nako3 +145 -0
  277. package/tools/nako3edit/run.js +12 -0
  278. package/tools/nako3server/html/edit.html +104 -0
  279. package/tools/nako3server/html/edit_plugin.js +6 -0
  280. package/tools/nako3server/html/files.html +53 -0
  281. package/tools/nako3server/html/nako3edit.css +66 -0
  282. package/tools/nako3server/index.nako3 +129 -0
  283. package/tools/nako3server/run.js +12 -0
@@ -0,0 +1,38 @@
1
+ // @ts-nocheck
2
+ /**
3
+ * file: plugin_test.js
4
+ * テスト実行用プラグイン
5
+ */
6
+ const PluginTest = {
7
+ // @テスト
8
+ 'ASSERT等': { // @ テストで、ASSERTでAとBが正しいことを報告する // @ASSERTひとしい
9
+ type: 'func',
10
+ josi: [['と'], ['が']],
11
+ pure: true,
12
+ fn: function (a, b, sys) {
13
+ if (a !== b) {
14
+ throw new Error(`不一致 [実際]${a} [期待]${b}`)
15
+ }
16
+ return true
17
+ }
18
+ },
19
+ 'テスト実行': { // @ テストで、ASSERTでAとBでテスト実行してAとBが等しいことを報告する // @てすとじっこう
20
+ type: 'func',
21
+ josi: [['と'], ['で']],
22
+ pure: false,
23
+ fn: function (a, b, sys) {
24
+ sys.__exec('ASSERT等', [a, b, sys])
25
+ }
26
+ },
27
+ 'テスト等': { // @ テストで、ASSERTでAとBが正しいことを報告する // @テストひとしい
28
+ type: 'func',
29
+ josi: [['と'], ['が']],
30
+ pure: false,
31
+ fn: function (a, b, sys) {
32
+ sys.__exec('ASSERT等', [a, b, sys])
33
+ }
34
+ }
35
+
36
+ }
37
+
38
+ module.exports = PluginTest
@@ -0,0 +1,646 @@
1
+ // @ts-nocheck
2
+ /**
3
+ * Turtle Graphics for Web browser (nadesiko3)
4
+ * plugin_turtle.js
5
+ */
6
+
7
+ const turtleImage = require('./turtle64.png').default
8
+ const elephantImage = require('./turtle-elephant.png').default
9
+ const pandaImage = require('./turtle-panda.png').default
10
+
11
+ const PluginTurtle = {
12
+ '初期化': {
13
+ type: 'func',
14
+ josi: [],
15
+ pure: true,
16
+ fn: function (sys) {
17
+ /* istanbul ignore if */
18
+ if (sys._turtle) { return }
19
+ sys._turtle = {
20
+ list: [],
21
+ target: -1,
22
+ ctx: null,
23
+ canvas: null,
24
+ canvas_r: { left: 0, top: 0, width: 640, height: 400 },
25
+ clearAll: function () {
26
+ const me = this
27
+ console.log('[TURTLE] clearAll')
28
+ for (let i = 0; i < me.list.length; i++) {
29
+ const tt = me.list[i]
30
+ tt.mlist = [] // ジョブをクリア
31
+ document.body.removeChild(tt.canvas)
32
+ }
33
+ me.list = []
34
+ if (me.canvas !== null) {
35
+ me.ctx.clearRect(0, 0,
36
+ me.canvas.width,
37
+ me.canvas.height)
38
+ }
39
+
40
+ me.target = -1
41
+ me.flagSetTimer = false
42
+ },
43
+ drawTurtle: function (id) {
44
+ const tt = this.list[id]
45
+ if (!tt) { return }
46
+ const cr = this.canvas_r
47
+ // カメの位置を移動
48
+ tt.canvas.style.left = (cr.left + tt.x - tt.cx) + 'px'
49
+ tt.canvas.style.top = (cr.top + tt.y - tt.cx) + 'px'
50
+ if (!tt.f_update) { return }
51
+ /* istanbul ignore if */
52
+ if (!tt.flagLoaded) { return }
53
+ tt.f_update = false
54
+ tt.ctx.clearRect(0, 0,
55
+ tt.canvas.width,
56
+ tt.canvas.height)
57
+ if (!tt.f_visible) { return }
58
+ if (tt.dir !== 270) {
59
+ const rad = (tt.dir + 90) * 0.017453292519943295
60
+ tt.ctx.save()
61
+ tt.ctx.translate(tt.cx, tt.cy)
62
+ tt.ctx.rotate(rad)
63
+ tt.ctx.translate(-tt.cx, -tt.cy)
64
+ tt.ctx.drawImage(tt.img, 0, 0)
65
+ tt.ctx.restore()
66
+ } else { tt.ctx.drawImage(tt.img, 0, 0) }
67
+ },
68
+ getCur: function () {
69
+ if (this.list.length === 0) { throw Error('最初に『カメ作成』命令を呼び出してください。') }
70
+
71
+ return this.list[this.target]
72
+ },
73
+ flagSetTimer: false,
74
+ setTimer: function () {
75
+ if (this.flagSetTimer) { return }
76
+ this.flagSetTimer = true
77
+ console.log('[TURTLE] standby ...')
78
+ setTimeout(() => {
79
+ console.log('[TURTLE] Let\'s go!')
80
+ sys._turtle.play()
81
+ }, 1)
82
+ },
83
+ line: function (tt, x1, y1, x2, y2) {
84
+ /* istanbul ignore else */
85
+ if (tt) { if (!tt.flagDown) { return } }
86
+
87
+ const ctx = this.ctx
88
+ if (tt.flagBegeinPath) {
89
+ ctx.lineTo(x2, y2)
90
+ } else {
91
+ ctx.beginPath()
92
+ ctx.lineWidth = tt.lineWidth
93
+ ctx.strokeStyle = tt.color
94
+ ctx.moveTo(x1, y1)
95
+ ctx.lineTo(x2, y2)
96
+ ctx.stroke()
97
+ }
98
+ },
99
+ doMacro: function (tt, wait) {
100
+ const me = this
101
+ if (!tt.flagLoaded && wait > 0) {
102
+ // console.log('[TURTLE] waiting ...')
103
+ return true
104
+ }
105
+ const m = tt.mlist.shift()
106
+ const cmd = (m !== undefined) ? m[0] : ''
107
+ switch (cmd) {
108
+ case 'xy':
109
+ // 起点を移動する
110
+ tt.x = m[1]
111
+ tt.y = m[2]
112
+ break
113
+ case 'begin':
114
+ // 描画を明示的に開始する
115
+ this.ctx.beginPath()
116
+ this.ctx.moveTo(tt.x, tt.y)
117
+ tt.flagBegeinPath = true
118
+ break
119
+ case 'close':
120
+ // パスを閉じる
121
+ this.ctx.closePath()
122
+ tt.flagBegeinPath = false
123
+ break
124
+ case 'fill':
125
+ if (tt.flagBegeinPath) {
126
+ this.ctx.closePath()
127
+ tt.flagBegeinPath = false
128
+ }
129
+ this.ctx.fill()
130
+ break
131
+ case 'stroke':
132
+ if (tt.flagBegeinPath) {
133
+ this.ctx.closePath()
134
+ tt.flagBegeinPath = false
135
+ }
136
+ this.ctx.stroke()
137
+ break
138
+ case 'text':
139
+ this.ctx.fillText(m[1], tt.x, tt.y)
140
+ break
141
+ case 'textset':
142
+ this.ctx.font = m[1]
143
+ break
144
+ case 'fillStyle':
145
+ this.ctx.fillStyle = m[1]
146
+ break
147
+ case 'mv': {
148
+ // 線を引く
149
+ me.line(tt, tt.x, tt.y, m[1], m[2])
150
+ // カメの角度を変更
151
+ const mvRad = Math.atan2(m[2] - tt.y, m[1] - tt.x)
152
+ tt.dir = mvRad * 57.29577951308232
153
+ tt.f_update = true
154
+ // 実際に位置を移動
155
+ tt.x = m[1]
156
+ tt.y = m[2]
157
+ break
158
+ }
159
+ case 'fd': {
160
+ const fdv = m[1] * m[2]
161
+ const rad = tt.dir * 0.017453292519943295
162
+ const x2 = tt.x + Math.cos(rad) * fdv
163
+ const y2 = tt.y + Math.sin(rad) * fdv
164
+ me.line(tt, tt.x, tt.y, x2, y2)
165
+ tt.x = x2
166
+ tt.y = y2
167
+ break
168
+ }
169
+ case 'angle': {
170
+ const angle = m[1]
171
+ tt.dir = ((angle - 90 + 360) % 360)
172
+ tt.f_update = true
173
+ break
174
+ }
175
+ case 'rotr': {
176
+ const rv = m[1]
177
+ tt.dir = (tt.dir + rv) % 360
178
+ tt.f_update = true
179
+ break
180
+ }
181
+ case 'rotl': {
182
+ const lv = m[1]
183
+ tt.dir = (tt.dir - lv + 360) % 360
184
+ tt.f_update = true
185
+ break
186
+ }
187
+ case 'color':
188
+ tt.color = m[1]
189
+ this.ctx.strokeStyle = tt.color
190
+ break
191
+ case 'size':
192
+ this.ctx.lineWidth = tt.lineWidth
193
+ tt.lineWidth = m[1]
194
+ break
195
+ case 'penOn':
196
+ tt.flagDown = m[1]
197
+ break
198
+ case 'visible':
199
+ tt.f_visible = m[1]
200
+ tt.f_update = true
201
+ break
202
+ case 'changeImage':
203
+ tt.flagLoaded = false
204
+ tt.img.src = m[1]
205
+ break
206
+ }
207
+ if (tt.flagLoaded) { sys._turtle.drawTurtle(tt.id) }
208
+ return (tt.mlist.length > 0)
209
+ },
210
+ doMacroAll: function (wait) {
211
+ let hasNext = false
212
+ for (let i = 0; i < sys._turtle.list.length; i++) {
213
+ const tt = sys._turtle.list[i]
214
+ if (this.doMacro(tt, wait)) { hasNext = true }
215
+ }
216
+ return hasNext
217
+ },
218
+ play: function () {
219
+ const me = this
220
+ const wait = sys.__v0['カメ速度']
221
+ let hasNext = this.doMacroAll(wait)
222
+ if (wait <= 0) {
223
+ while (hasNext) { hasNext = this.doMacroAll(wait) }
224
+ } else if (hasNext) {
225
+ setTimeout(() => me.play(), wait)
226
+ return
227
+ }
228
+ console.log('[TURTLE] finished.')
229
+ me.flagSetTimer = false
230
+ },
231
+ setupCanvas: function (sys) {
232
+ // 描画先をセットする
233
+ let canvasId = sys.__v0['カメ描画先']
234
+ if (typeof canvasId === 'string') {
235
+ canvasId = document.getElementById(canvasId) || document.querySelector(canvasId)
236
+ sys.__v0['カメ描画先'] = canvasId
237
+ }
238
+ console.log('カメ描画先=', canvasId)
239
+ const cv = sys._turtle.canvas = canvasId
240
+ if (!cv) {
241
+ console.log('[ERROR] カメ描画先が見当たりません。' + canvasId)
242
+ throw Error('カメ描画先が見当たりません。')
243
+ }
244
+ const ctx = sys._turtle.ctx = sys._turtle.canvas.getContext('2d')
245
+ ctx.lineWidth = 4
246
+ ctx.strokeStyle = 'black'
247
+ ctx.lineCap = 'round'
248
+ sys._turtle.resizeCanvas(sys)
249
+ },
250
+ resizeCanvas: function (sys) {
251
+ const cv = sys._turtle.canvas
252
+ const rect = cv.getBoundingClientRect()
253
+ const rx = rect.left + window.pageXOffset
254
+ const ry = rect.top + window.pageYOffset
255
+ sys._turtle.canvas_r = {
256
+ 'left': rx,
257
+ 'top': ry,
258
+ width: rect.width,
259
+ height: rect.height
260
+ }
261
+ },
262
+ createTurtle: function (imageUrl, sys) {
263
+ // キャンバス情報は毎回参照する (#734)
264
+ sys._turtle.setupCanvas(sys)
265
+ // const cv = sys._turtle.canvas
266
+ // カメの情報を sys._turtle リストに追加
267
+ const id = sys._turtle.list.length
268
+ const tt = {
269
+ id: id,
270
+ img: null,
271
+ canvas: null,
272
+ ctx: null,
273
+ dir: 270, // 上向き
274
+ cx: 32,
275
+ cy: 32,
276
+ x: 0,
277
+ y: 0,
278
+ color: 'black',
279
+ lineWidth: 4,
280
+ flagDown: true,
281
+ flagBegeinPath: false,
282
+ f_update: true,
283
+ flagLoaded: false,
284
+ f_visible: true,
285
+ mlist: []
286
+ }
287
+ sys._turtle.list.push(tt)
288
+ sys._turtle.target = id
289
+ // 画像を読み込む
290
+ tt.img = document.createElement('img')
291
+ tt.canvas = document.createElement('canvas')
292
+ tt.ctx = tt.canvas.getContext('2d')
293
+ tt.canvas.id = id
294
+ tt.img.onload = () => {
295
+ tt.cx = tt.img.width / 2
296
+ tt.cy = tt.img.height / 2
297
+ tt.canvas.width = tt.img.width
298
+ tt.canvas.height = tt.img.height
299
+ tt.flagLoaded = true
300
+ tt.f_update = true
301
+ sys._turtle.drawTurtle(tt.id)
302
+ console.log('turtle.onload')
303
+ }
304
+ tt.img.onerror = () => {
305
+ console.log('カメの読み込みに失敗')
306
+ tt.flagLoaded = true
307
+ tt.f_visible = false
308
+ tt.f_update = true
309
+ sys._turtle.drawTurtle(tt.id)
310
+ }
311
+ tt.img.src = imageUrl
312
+ tt.canvas.style.position = 'absolute'
313
+ document.body.appendChild(tt.canvas)
314
+ // デフォルト位置の設定
315
+ tt.x = sys._turtle.canvas_r.width / 2
316
+ tt.y = sys._turtle.canvas_r.height / 2
317
+ return id
318
+ }
319
+ }
320
+ }
321
+ },
322
+
323
+ '!クリア': {
324
+ type: 'func',
325
+ josi: [],
326
+ pure: true,
327
+ fn: function (sys) {
328
+ sys._turtle.clearAll()
329
+ }
330
+ },
331
+
332
+ // @タートルグラフィックス・カメ描画
333
+ 'カメ作成': { // @タートルグラフィックスを開始してカメのIDを返す // @かめさくせい
334
+ type: 'func',
335
+ josi: [],
336
+ pure: true,
337
+ fn: function (sys) {
338
+ const imageUrl = sys.__v0['カメ画像URL']
339
+ return sys._turtle.createTurtle(imageUrl, sys)
340
+ }
341
+ },
342
+ 'ゾウ作成': { // @ゾウの画像でタートルグラフィックスを開始してIDを返す // @ぞうさくせい
343
+ type: 'func',
344
+ josi: [],
345
+ pure: true,
346
+ fn: function (sys) {
347
+ const imageUrl = elephantImage
348
+ return sys._turtle.createTurtle(imageUrl, sys)
349
+ }
350
+ },
351
+ 'パンダ作成': { // @パンダの画像でタートルグラフィックスを開始してIDを返す // @ぱんださくせい
352
+ type: 'func',
353
+ josi: [],
354
+ pure: true,
355
+ fn: function (sys) {
356
+ const imageUrl = pandaImage
357
+ return sys._turtle.createTurtle(imageUrl, sys)
358
+ }
359
+ },
360
+ 'カメ操作対象設定': { // @IDを指定して操作対象となるカメを変更する // @かめそうさたいしょうせってい
361
+ type: 'func',
362
+ josi: [['に', 'へ', 'の']],
363
+ pure: true,
364
+ fn: function (id, sys) {
365
+ sys._turtle.target = id
366
+ },
367
+ return_none: true
368
+ },
369
+ 'カメ描画先': { type: 'var', value: 'turtle_cv' }, // @かめびょうがさき
370
+ 'カメ画像URL': { type: 'var', value: turtleImage }, // @かめがぞうURL
371
+ 'カメ画像変更': { // @カメの画像をURLに変更する // @かめがぞうへんこう
372
+ type: 'func',
373
+ josi: [['に', 'へ']],
374
+ pure: true,
375
+ fn: function (url, sys) {
376
+ const tt = sys._turtle.getCur()
377
+ tt.mlist.push(['changeImage', url])
378
+ sys._turtle.setTimer()
379
+ },
380
+ return_none: true
381
+ },
382
+ 'カメ速度': { type: 'const', value: 100 }, // @かめそくど
383
+ 'カメ速度設定': { // @カメの動作速度vに設定(大きいほど遅い) // @かめそくどせってい
384
+ type: 'func',
385
+ josi: [['に', 'へ']],
386
+ pure: true,
387
+ fn: function (v, sys) {
388
+ sys.__varslist[0]['カメ速度'] = v
389
+ }
390
+ },
391
+ 'カメ移動': { // @カメの位置を[x,y]へ移動する // @かめいどう
392
+ type: 'func',
393
+ josi: [['に', 'へ']],
394
+ pure: true,
395
+ fn: function (xy, sys) {
396
+ const tt = sys._turtle.getCur()
397
+ tt.mlist.push(['mv', xy[0], xy[1]])
398
+ sys._turtle.setTimer()
399
+ },
400
+ return_none: true
401
+ },
402
+ 'カメ起点移動': { // @カメの描画起点位置を[x,y]へ移動する // @かめきてんいどう
403
+ type: 'func',
404
+ josi: [['に', 'へ']],
405
+ pure: true,
406
+ fn: function (xy, sys) {
407
+ const tt = sys._turtle.getCur()
408
+ tt.mlist.push(['xy', xy[0], xy[1]])
409
+ sys._turtle.setTimer()
410
+ },
411
+ return_none: true
412
+ },
413
+ 'カメ進': { // @カメの位置をVだけ進める // @かめすすむ
414
+ type: 'func',
415
+ josi: [['だけ']],
416
+ pure: true,
417
+ fn: function (v, sys) {
418
+ const tt = sys._turtle.getCur()
419
+ tt.mlist.push(['fd', v, 1])
420
+ sys._turtle.setTimer()
421
+ },
422
+ return_none: true
423
+ },
424
+ 'カメ戻': { // @カメの位置をVだけ戻す // @かめもどる
425
+ type: 'func',
426
+ josi: [['だけ']],
427
+ pure: true,
428
+ fn: function (v, sys) {
429
+ const tt = sys._turtle.getCur()
430
+ tt.mlist.push(['fd', v, -1])
431
+ sys._turtle.setTimer()
432
+ },
433
+ return_none: true
434
+ },
435
+ 'カメ角度設定': { // @カメの向きをDEGに設定する // @かめかくどせってい
436
+ type: 'func',
437
+ josi: [['に', 'へ', 'の']],
438
+ pure: true,
439
+ fn: function (v, sys) {
440
+ const tt = sys._turtle.getCur()
441
+ tt.mlist.push(['angle', parseFloat(v)])
442
+ sys._turtle.setTimer()
443
+ },
444
+ return_none: true
445
+ },
446
+ 'カメ右回転': { // @カメの向きをDEGだけ右に向ける // @かめみぎかいてん
447
+ type: 'func',
448
+ josi: [['だけ']],
449
+ pure: true,
450
+ fn: function (v, sys) {
451
+ const tt = sys._turtle.getCur()
452
+ tt.mlist.push(['rotr', v])
453
+ sys._turtle.setTimer()
454
+ },
455
+ return_none: true
456
+ },
457
+ 'カメ左回転': { // @カメの向きをDEGだけ左に向ける // @かめひだりかいてん
458
+ type: 'func',
459
+ josi: [['だけ']],
460
+ pure: true,
461
+ fn: function (v, sys) {
462
+ const tt = sys._turtle.getCur()
463
+ tt.mlist.push(['rotl', v])
464
+ sys._turtle.setTimer()
465
+ },
466
+ return_none: true
467
+ },
468
+ 'カメペン色設定': { // @カメのペン描画色をCに設定する // @かめぺんいろせってい
469
+ type: 'func',
470
+ josi: [['に', 'へ']],
471
+ pure: true,
472
+ fn: function (c, sys) {
473
+ const tt = sys._turtle.getCur()
474
+ tt.mlist.push(['color', c])
475
+ sys._turtle.setTimer()
476
+ },
477
+ return_none: true
478
+ },
479
+ 'カメペンサイズ設定': { // @カメペンのサイズをWに設定する // @かめぺんさいずせってい
480
+ type: 'func',
481
+ josi: [['に', 'へ']],
482
+ pure: true,
483
+ fn: function (w, sys) {
484
+ const tt = sys._turtle.getCur()
485
+ tt.mlist.push(['size', w])
486
+ sys._turtle.setTimer()
487
+ }
488
+ },
489
+ 'カメペン設定': { // @カメペンを使うかどうかをV(オン/オフ)に設定する // @かめぺんせってい
490
+ type: 'func',
491
+ josi: [['に', 'へ']],
492
+ pure: true,
493
+ fn: function (w, sys) {
494
+ const tt = sys._turtle.getCur()
495
+ tt.mlist.push(['penOn', w])
496
+ sys._turtle.setTimer()
497
+ }
498
+ },
499
+ 'カメパス開始': { // @カメで明示的にパスの描画を開始する // @かめぱすかいし
500
+ type: 'func',
501
+ josi: [],
502
+ pure: true,
503
+ fn: function (sys) {
504
+ const tt = sys._turtle.getCur()
505
+ tt.mlist.push(['begin'])
506
+ sys._turtle.setTimer()
507
+ }
508
+ },
509
+ 'カメパス閉': { // @カメでパスを明示的に閉じる(省略可能) // @かめぱすとじる
510
+ type: 'func',
511
+ josi: [],
512
+ pure: true,
513
+ fn: function (sys) {
514
+ const tt = sys._turtle.getCur()
515
+ tt.mlist.push(['close'])
516
+ sys._turtle.setTimer()
517
+ }
518
+ },
519
+ 'カメパス線引': { // @カメでパスを閉じて、カメペン色設定で指定した色で枠線を引く // @かめぱすせんひく
520
+ type: 'func',
521
+ josi: [],
522
+ pure: true,
523
+ fn: function (sys) {
524
+ const tt = sys._turtle.getCur()
525
+ tt.mlist.push(['stroke'])
526
+ sys._turtle.setTimer()
527
+ }
528
+ },
529
+ 'カメパス塗': { // @カメでパスを閉じて、カメ塗り色設定で指定した色で塗りつぶす // @かめぱすぬる
530
+ type: 'func',
531
+ josi: [],
532
+ pure: true,
533
+ fn: function (sys) {
534
+ const tt = sys._turtle.getCur()
535
+ tt.mlist.push(['fill'])
536
+ sys._turtle.setTimer()
537
+ }
538
+ },
539
+ 'カメ文字描画': { // @カメの位置に文字Sを描画 // @かめもじびょうが
540
+ type: 'func',
541
+ josi: [['を', 'と', 'の']],
542
+ pure: true,
543
+ fn: function (s, sys) {
544
+ const tt = sys._turtle.getCur()
545
+ tt.mlist.push(['text', s])
546
+ sys._turtle.setTimer()
547
+ }
548
+ },
549
+ 'カメ文字設定': { // @カメ文字描画で描画するテキストサイズやフォント(48px serif)などを設定 // @かめもじせってい
550
+ type: 'func',
551
+ josi: [['に', 'へ', 'で']],
552
+ pure: true,
553
+ fn: function (s, sys) {
554
+ s = '' + s // 文字列に
555
+ if (s.match(/^\d+$/)) {
556
+ s = s + 'px serif'
557
+ } else if (s.match(/^\d+(px|em)$/)) {
558
+ s = s + ' serif'
559
+ }
560
+ const tt = sys._turtle.getCur()
561
+ tt.mlist.push(['textset', s])
562
+ sys._turtle.setTimer()
563
+ }
564
+ },
565
+ 'カメ塗色設定': { // @カメパスの塗り色をCに設定する // @かめぬりいろせってい
566
+ type: 'func',
567
+ josi: [['に', 'へ']],
568
+ pure: true,
569
+ fn: function (c, sys) {
570
+ const tt = sys._turtle.getCur()
571
+ tt.mlist.push(['fillStyle', c])
572
+ sys._turtle.setTimer()
573
+ },
574
+ return_none: true
575
+ },
576
+ 'カメ全消去': { // @表示しているカメと描画内容を全部消去する // @かめぜんしょうきょ
577
+ type: 'func',
578
+ josi: [],
579
+ pure: true,
580
+ fn: function (sys) {
581
+ sys._turtle.clearAll()
582
+ },
583
+ return_none: true
584
+ },
585
+ 'カメコマンド実行': { // @カメにコマンドSを実行する。コマンドは改行か「;」で区切る。コマンドと引数は「=」で区切り引数はかカンマで区切る // @かめこまんどじっこう
586
+ type: 'func',
587
+ josi: [['の', 'を']],
588
+ pure: true,
589
+ fn: function (cmd, sys) {
590
+ const tt = sys._turtle.getCur()
591
+ const a = cmd.split(/(\n|;)/)
592
+ for (let i = 0; i < a.length; i++) {
593
+ let c = a[i]
594
+ c = c.replace(/^([a-zA-Z_]+)\s*(\d+)/, '$1,$2')
595
+ c = c.replace(/^([a-zA-Z_]+)\s*=/, '$1,')
596
+ const ca = c.split(/\s*,\s*/)
597
+ tt.mlist.push(ca)
598
+ }
599
+ sys._turtle.setTimer()
600
+ },
601
+ return_none: true
602
+ },
603
+ 'カメ非表示': { // @カメの画像を非表示にする。描画に影響しない。 // @かめひひょうじ
604
+ type: 'func',
605
+ josi: [],
606
+ pure: true,
607
+ fn: function (sys) {
608
+ const tt = sys._turtle.getCur()
609
+ tt.mlist.push(['visible', false])
610
+ sys._turtle.setTimer()
611
+ },
612
+ return_none: true
613
+ },
614
+ 'カメ表示': { // @非表示にしたカメを表示する。 // @かめひょうじ
615
+ type: 'func',
616
+ josi: [],
617
+ pure: true,
618
+ fn: function (sys) {
619
+ const tt = sys._turtle.getCur()
620
+ tt.mlist.push(['visible', true])
621
+ sys._turtle.setTimer()
622
+ },
623
+ return_none: true
624
+ },
625
+ 'カメクリック時': { // @ 操作対象のカメをクリックした時のイベントを設定する // @かめくりっくしたとき
626
+ type: 'func',
627
+ josi: [['を']],
628
+ pure: false,
629
+ fn: function (func, sys) {
630
+ func = sys.__findVar(func, null) // 文字列指定なら関数に変換
631
+ const tid = sys._turtle.target
632
+ const tt = sys._turtle.list[tid]
633
+ tt.canvas.onclick = (e) => {
634
+ sys.__v0['対象'] = e.target
635
+ return func(e, sys)
636
+ }
637
+ },
638
+ return_none: true
639
+ }
640
+ }
641
+
642
+ module.exports = PluginTurtle
643
+
644
+ // scriptタグで取り込んだ時、自動で登録する
645
+ /* istanbul ignore else */
646
+ if (typeof (navigator) === 'object' && typeof (navigator.nako3)) { navigator.nako3.addPluginObject('PluginTurtle', PluginTurtle) }