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,251 @@
1
+ /** prepareとtokenizeのソースマッピング */
2
+ class SourceMappingOfTokenization {
3
+ /**
4
+ * @param {number} sourceCodeLength
5
+ * @param {{ text: string; sourcePosition: number }[]} preprocessed
6
+ */
7
+ constructor (sourceCodeLength, preprocessed) {
8
+ /** @private @readonly */
9
+ this.sourceCodeLength = sourceCodeLength
10
+
11
+ /** @private @readonly */
12
+ this.preprocessed = preprocessed
13
+
14
+ let i = 0
15
+ /** @private @readonly @type {number[]} */
16
+ this.cumulativeSum = []
17
+ for (const el of preprocessed) {
18
+ this.cumulativeSum.push(i)
19
+ i += el.text.length
20
+ }
21
+
22
+ /** @private */
23
+ this.lastIndex = 0
24
+ /** @private */
25
+ this.lastPreprocessedCodePosition = 0
26
+ /** @private */
27
+ }
28
+
29
+ /**
30
+ * preprocess後の文字列上のoffsetからソースコード上のoffsetへ変換
31
+ * @param {number} preprocessedCodePosition
32
+ * @returns {number}
33
+ */
34
+ map (preprocessedCodePosition) {
35
+ const i = this.findIndex(preprocessedCodePosition)
36
+ return Math.min(
37
+ this.preprocessed[i].sourcePosition + (preprocessedCodePosition - this.cumulativeSum[i]),
38
+ i === this.preprocessed.length - 1 ? this.sourceCodeLength : this.preprocessed[i + 1].sourcePosition - 1
39
+ )
40
+ }
41
+
42
+ /**
43
+ * @param {number} preprocessedCodePosition
44
+ * @returns {number}
45
+ */
46
+ findIndex (preprocessedCodePosition) {
47
+ // 連続アクセスに対する高速化
48
+ if (preprocessedCodePosition < this.lastPreprocessedCodePosition) {
49
+ this.lastIndex = 0
50
+ }
51
+ this.lastPreprocessedCodePosition = preprocessedCodePosition
52
+
53
+ for (let i = this.lastIndex; i < this.preprocessed.length - 1; i++) {
54
+ if (preprocessedCodePosition < this.cumulativeSum[i + 1]) {
55
+ this.lastIndex = i
56
+ return i
57
+ }
58
+ }
59
+
60
+ this.lastIndex = this.preprocessed.length - 1
61
+ return this.preprocessed.length - 1
62
+ }
63
+ }
64
+
65
+ class SourceMappingOfIndentSyntax {
66
+ /**
67
+ * @param {string} codeAfterProcessingIndentationSyntax
68
+ * @param {readonly number[]} linesInsertedByIndentationSyntax
69
+ * @param {readonly { lineNumber: number, len: number }[]} linesDeletedByIndentationSyntax
70
+ */
71
+ constructor (
72
+ codeAfterProcessingIndentationSyntax,
73
+ linesInsertedByIndentationSyntax,
74
+ linesDeletedByIndentationSyntax
75
+ ) {
76
+ /** @private @type {{ offset: number, len: number }[]} */
77
+ this.lines = []
78
+
79
+ /** @private @readonly */
80
+ this.linesInsertedByIndentationSyntax = linesInsertedByIndentationSyntax
81
+
82
+ /** @private @readonly */
83
+ this.linesDeletedByIndentationSyntax = linesDeletedByIndentationSyntax
84
+
85
+ let offset = 0
86
+ for (const line of codeAfterProcessingIndentationSyntax.split('\n')) {
87
+ this.lines.push({ offset, len: line.length })
88
+ offset += line.length + 1
89
+ }
90
+
91
+ /** @private */
92
+ this.lastLineNumber = 0
93
+ /** @private */
94
+ this.lastOffset = 0
95
+ }
96
+
97
+ /**
98
+ * @param {number | null} startOffset
99
+ * @param {number | null} endOffset
100
+ * @returns {{ startOffset: number | null, endOffset: number | null }}
101
+ */
102
+ map (startOffset, endOffset) {
103
+ if (startOffset === null) {
104
+ return { startOffset, endOffset }
105
+ }
106
+
107
+ // 何行目かを判定
108
+ const tokenLine = this.getLineNumber(startOffset)
109
+
110
+ for (const insertedLine of this.linesInsertedByIndentationSyntax) {
111
+ // インデント構文の処理後のソースコードの `insertedLine` 行目にあるトークンのソースマップ情報を削除する。
112
+ if (tokenLine === insertedLine) {
113
+ startOffset = null
114
+ endOffset = null
115
+ break
116
+ }
117
+
118
+ // インデント構文の処理後のソースコードの `insertedLine` 行目以降にあるトークンのoffsetから
119
+ // `linesInsertedByIndentationSyntax[i]` 行目の文字数(\rを含む) を引く。
120
+ if (tokenLine > insertedLine) {
121
+ // "\n"の分1足す
122
+ startOffset -= this.lines[insertedLine].len + 1
123
+ if (endOffset !== null) {
124
+ endOffset -= this.lines[insertedLine].len + 1
125
+ }
126
+ }
127
+ }
128
+ for (const deletedLine of this.linesDeletedByIndentationSyntax) {
129
+ if (tokenLine >= deletedLine.lineNumber) {
130
+ // "\n"の分1足す
131
+ if (startOffset !== null) {
132
+ startOffset += deletedLine.len + 1
133
+ }
134
+ if (endOffset !== null) {
135
+ endOffset += deletedLine.len + 1
136
+ }
137
+ }
138
+ }
139
+
140
+ return { startOffset, endOffset }
141
+ }
142
+
143
+ /**
144
+ * @param {number} offset
145
+ * @returns {number}
146
+ * @private
147
+ */
148
+ getLineNumber (offset) {
149
+ // 連続アクセスに対する高速化
150
+ if (offset < this.lastOffset) {
151
+ this.lastLineNumber = 0
152
+ }
153
+ this.lastOffset = offset
154
+
155
+ for (let i = this.lastLineNumber; i < this.lines.length - 1; i++) {
156
+ if (offset < this.lines[i + 1].offset) {
157
+ this.lastLineNumber = i
158
+ return i
159
+ }
160
+ }
161
+
162
+ this.lastLineNumber = this.lines.length - 1
163
+ return this.lines.length - 1
164
+ }
165
+ }
166
+
167
+ /** offsetから (line, column) へ変換する。 */
168
+ class OffsetToLineColumn {
169
+ /**
170
+ * @param {string} code
171
+ */
172
+ constructor (code) {
173
+ /** @private @type {number[]} */
174
+ this.lineOffsets = []
175
+
176
+ // 各行の先頭位置を先に計算しておく
177
+ let offset = 0
178
+ for (const line of code.split('\n')) {
179
+ this.lineOffsets.push(offset)
180
+ offset += line.length + 1
181
+ }
182
+
183
+ /** @private */
184
+ this.lastLineNumber = 0
185
+ /** @private */
186
+ this.lastOffset = 0
187
+ }
188
+
189
+ /**
190
+ * @param {number} offset
191
+ * @param {boolean} oneBasedLineNumber trueのときlineを1から始める
192
+ * @returns {{ line: number, column: number }}
193
+ */
194
+ map (offset, oneBasedLineNumber) {
195
+ // 連続アクセスに対する高速化
196
+ if (offset < this.lastOffset) {
197
+ this.lastLineNumber = 0
198
+ }
199
+ this.lastOffset = offset
200
+
201
+ for (let i = this.lastLineNumber; i < this.lineOffsets.length - 1; i++) {
202
+ if (offset < this.lineOffsets[i + 1]) {
203
+ this.lastLineNumber = i
204
+ return {
205
+ line: i + (oneBasedLineNumber ? 1 : 0),
206
+ column: offset - this.lineOffsets[i]
207
+ }
208
+ }
209
+ }
210
+
211
+ this.lastLineNumber = this.lineOffsets.length - 1
212
+ return {
213
+ line: this.lineOffsets.length - 1 + (oneBasedLineNumber ? 1 : 0),
214
+ column: offset - this.lineOffsets[this.lineOffsets.length - 1]
215
+ }
216
+ }
217
+ }
218
+
219
+ /**
220
+ * preCodeの分、ソースマップのoffset、行数、列数を減らす。
221
+ * @type {<T extends {line?: number, column?: number, startOffset: number | null, endOffset: number | null }>(sourceMap: T, preCode: string) => T}
222
+ */
223
+ function subtractSourceMapByPreCodeLength (sourceMap, preCode) {
224
+ // offsetは単純に引くだけでよい
225
+ if (typeof sourceMap.startOffset === 'number') {
226
+ sourceMap.startOffset -= preCode.length
227
+ }
228
+ if (typeof sourceMap.endOffset === 'number') {
229
+ sourceMap.endOffset -= preCode.length
230
+ }
231
+
232
+ // たとえば preCode = 'abc\ndef\nghi' のとき、line -= 2 して、先頭行なら column -= 3 もする。
233
+ if (preCode !== '') {
234
+ const lines = preCode.split('\n')
235
+ if (typeof sourceMap.line === 'number') {
236
+ sourceMap.line -= lines.length - 1
237
+ }
238
+ if (sourceMap.line === 0 && typeof sourceMap.column === 'number') {
239
+ sourceMap.column -= lines[lines.length - 1].length
240
+ }
241
+ }
242
+
243
+ return sourceMap
244
+ }
245
+
246
+ module.exports = {
247
+ SourceMappingOfTokenization,
248
+ SourceMappingOfIndentSyntax,
249
+ OffsetToLineColumn,
250
+ subtractSourceMapByPreCodeLength
251
+ }
@@ -0,0 +1,37 @@
1
+ class NakoTest {
2
+ constructor () {
3
+ /** @type {{ name: string, f: () => void }[]} */
4
+ this.tests = []
5
+ }
6
+
7
+ /** @param {any} a, @param {any} b */
8
+ static assertStrictEqual (a, b) {
9
+ if (a !== b) {
10
+ throw new Error('')
11
+ }
12
+ }
13
+
14
+ /** @param {unknown} a */
15
+ static inspect (a) {
16
+ switch (typeof a) {
17
+ case 'bigint': return `bigint値『${a}』`
18
+ case 'boolean': return a + ''
19
+ case 'function': return `関数『${a.name}』`
20
+ case 'number': return `数値${a}`
21
+ case 'object':
22
+ if (a === null) {
23
+ return a + ''
24
+ }
25
+ try {
26
+ return `オブジェクト『${JSON.stringify(a)}』`
27
+ } catch (e) { // 循環参照など
28
+ return `オブジェクト『${a}』`
29
+ }
30
+ case 'string': return `文字列『${a}』`
31
+ case 'symbol': return `シンボル『${a.toString()}』`
32
+ case 'undefined': return a + ''
33
+ }
34
+ }
35
+ }
36
+
37
+ module.exports = NakoTest
@@ -0,0 +1,8 @@
1
+ // なでしこバージョン
2
+ const nakoVersion = {
3
+ version: '3.2.27',
4
+ major: 3,
5
+ minor: 2,
6
+ patch: 27
7
+ }
8
+ module.exports = nakoVersion
@@ -0,0 +1,191 @@
1
+ // @ts-nocheck
2
+ // plugin_browser.js
3
+ const PartBrowserColor = require('./plugin_browser_color.js')
4
+ const PartBrowserSystem = require('./plugin_browser_system.js')
5
+ const PartBrowserDialog = require('./plugin_browser_dialog.js')
6
+ const PartBrowserLocation = require('./plugin_browser_location.js')
7
+ const PartBrowserAjax = require('./plugin_browser_ajax.js')
8
+ const PartBrowserDomBasic = require('./plugin_browser_dom_basic.js')
9
+ const PartBrowserDomEvent = require('./plugin_browser_dom_event.js')
10
+ const PartBrowserDomParts = require('./plugin_browser_dom_parts.js')
11
+ const PartBrowserHtml = require('./plugin_browser_html.js')
12
+ const PartBrowserStorage = require('./plugin_browser_storage.js')
13
+ const PartBrowserCanvas = require('./plugin_browser_canvas.js')
14
+ const PartBrowserGeolocation = require('./plugin_browser_geolocation.js')
15
+ const PartBrowserSpeech = require('./plugin_browser_speech.js')
16
+ const PartBrowserWebsocket = require('./plugin_browser_websocket.js')
17
+ const PartBrowserAudio = require('./plugin_browser_audio.js')
18
+ const PartBrowserHotkey = require('./plugin_browser_hotkey.js')
19
+ const PartBrowserChart = require('./plugin_browser_chart.js')
20
+ const PartBrowserCrypto = require('./plugin_browser_crypto.js')
21
+
22
+ const BrowserParts = [
23
+ PartBrowserColor,
24
+ PartBrowserSystem,
25
+ PartBrowserDialog,
26
+ PartBrowserLocation,
27
+ PartBrowserAjax,
28
+ PartBrowserDomBasic,
29
+ PartBrowserDomEvent,
30
+ PartBrowserDomParts,
31
+ PartBrowserHtml,
32
+ PartBrowserStorage,
33
+ PartBrowserCanvas,
34
+ PartBrowserGeolocation,
35
+ PartBrowserSpeech,
36
+ PartBrowserWebsocket,
37
+ PartBrowserAudio,
38
+ PartBrowserHotkey,
39
+ PartBrowserChart,
40
+ PartBrowserCrypto
41
+ ]
42
+
43
+ const PluginBrowser = {
44
+ 'meta': {
45
+ type: 'const',
46
+ value: {
47
+ pluginName: 'plugin_browser', // プラグインの名前
48
+ pluginVersion: '3.2.24', // プラグインのバージョン
49
+ nakoRuntime: ['wnako'], // 対象ランタイム
50
+ nakoVersion: '^3.2.24' // 要求なでしこバージョン
51
+ }
52
+ },
53
+ '初期化': {
54
+ type: 'func',
55
+ josi: [],
56
+ pure: true,
57
+ fn: function (sys) {
58
+ /* eslint no-global-assign: 0 */
59
+ if (typeof document === 'undefined') { document = { 'body': {} } }
60
+ if (typeof window === 'undefined') { window = { 'location': { 'href': '' } } }
61
+ if (typeof navigator === 'undefined') { navigator = {} }
62
+
63
+ // 定数を初期化
64
+ sys.__v0['AJAX:ONERROR'] = (err) => { console.log(err) }
65
+ // オブジェクトを初期化
66
+ sys.__v0.DOCUMENT = document
67
+ sys.__v0.WINDOW = window
68
+ sys.__v0.NAVIGATOR = navigator
69
+ sys.__v0['DOM親要素'] = document.body
70
+ sys.__v0['ブラウザURL'] = window.location.href
71
+
72
+ // 「!クリア」でDOMイベントを削除するため
73
+ sys.__dom_events = [] // [{}, {}, {} ...]
74
+ // DOM追加イベント
75
+ sys.__addEvent = (dom, event, func, setHandler) => {
76
+ // dom
77
+ if (typeof (dom) === 'string') {
78
+ dom = document.querySelector(dom)
79
+ if (!dom) { throw new Error('DOMイベントが追加できません。要素が見当たりません。') }
80
+ }
81
+ // func
82
+ if (typeof (func) === 'string') {
83
+ func = sys.__findVar(func, null)
84
+ if (!func) { throw new Error('DOMイベントが追加できません。関数が見当たりません。') }
85
+ }
86
+ // make wrapper func
87
+ const wrapperFunc = (e) => {
88
+ sys.__v0['対象'] = e.target
89
+ sys.__v0['対象イベント'] = e
90
+ // 追加データが得られる場合
91
+ if (setHandler) { setHandler(e, sys) }
92
+ return func(e, sys)
93
+ }
94
+ // add
95
+ sys.__dom_events.push({ dom, event, func: wrapperFunc, rawFunc: func })
96
+ dom.addEventListener(event, wrapperFunc)
97
+ }
98
+ // キーイベントハンドラ
99
+ sys.__keyHandler = (e, sys) => {
100
+ sys.__v0['押キー'] = e.key
101
+ }
102
+ // マウスイベントハンドラ
103
+ sys.__mouseHandler = (e, sys) => {
104
+ const box = e.target.getBoundingClientRect()
105
+ sys.__v0['マウスX'] = e.clientX - box.left
106
+ sys.__v0['マウスY'] = e.clientY - box.top
107
+ }
108
+ // タッチイベントハンドラ
109
+ sys.__touchHandler = (e, sys) => {
110
+ const box = e.target.getBoundingClientRect()
111
+ const touches = e.changedTouches
112
+ if (touches.length <= 0) { return }
113
+ const ts = []
114
+ for (let i = 0; i < touches.length; i++) {
115
+ const t = touches[i]
116
+ const tx = t.clientX - box.left
117
+ const ty = t.clientY - box.top
118
+ if (i === 0) {
119
+ sys.__v0['タッチX'] = tx
120
+ sys.__v0['タッチY'] = ty
121
+ }
122
+ ts.push([tx, ty])
123
+ }
124
+ sys.__v0['タッチ配列'] = ts
125
+ return ts
126
+ }
127
+ // DOMイベント削除 (探して削除)
128
+ sys.__removeEvent = (dom, event, func) => {
129
+ // dom
130
+ if (typeof (dom) === 'string') {
131
+ dom = document.querySelector(dom)
132
+ if (!dom) { throw new Error('DOMイベントが削除できません。要素が見当たりません。') }
133
+ }
134
+ // func
135
+ if (typeof (func) === 'string') {
136
+ func = sys.__findVar(func, null)
137
+ if (!func) { throw new Error('DOMイベントが削除できません。関数が見当たりません。') }
138
+ }
139
+ // find
140
+ for (let i = 0; i < sys.__dom_events.length; i++) {
141
+ const e = sys.__dom_events[i]
142
+ if (e.dom === dom && e.event === event && e.rawFunc === func) {
143
+ e.dom.removeEventListener(e.event, e.func)
144
+ sys.__dom_events.splice(i, 1)
145
+ break
146
+ }
147
+ }
148
+ }
149
+ // requestAnimationFrame のためのid
150
+ sys.__requestAnimationFrameLastId = 0
151
+ // DOMイベント全クリア
152
+ sys.__removeAllDomEvent = () => {
153
+ sys.__dom_events.forEach(e => {
154
+ console.log(e.event, e.dom, e)
155
+ e.dom.removeEventListener(e.event, e.func)
156
+ })
157
+ sys.__dom_events = []
158
+ // requestAnimationFrame
159
+ if (sys.__requestAnimationFrameLastId > 0) {
160
+ window.cancelAnimationFrame(sys.__requestAnimationFrameLastId)
161
+ sys.__requestAnimationFrameLastId = 0
162
+ }
163
+ }
164
+ }
165
+ },
166
+ '!クリア': {
167
+ type: 'func',
168
+ josi: [],
169
+ pure: false,
170
+ fn: function (sys) {
171
+ // chart.jsを破棄
172
+ if (sys.__chartjs) {
173
+ sys.__chartjs.destroy()
174
+ }
175
+ // 全DOMイベントをクリア
176
+ sys.__removeAllDomEvent()
177
+ }
178
+ }
179
+ }
180
+
181
+ BrowserParts.forEach((a) => {
182
+ const b = {}
183
+ Object.assign(b, a)
184
+ // 各モジュールでの初期化処理は認めない
185
+ if (typeof b['初期化'] !== 'undefined') {
186
+ delete b['初期化']
187
+ }
188
+ Object.assign(PluginBrowser, b)
189
+ })
190
+
191
+ module.exports = PluginBrowser