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,362 @@
1
+ const assert = require('assert')
2
+ const NakoIndent = require('../../src/nako_indent')
3
+
4
+ describe('indent', () => {
5
+ const cmp = (src, expected) => {
6
+ src = NakoIndent.convert(src).code
7
+ src = src.replace(/\s+$/, '')
8
+ expected = expected.replace(/\s+$/, '')
9
+ assert.strictEqual(src, expected)
10
+ }
11
+ it('もし', () => {
12
+ cmp('!インデント構文\n'+
13
+ 'もしA=1ならば\n'+
14
+ '  1を表示\n',
15
+ // ---
16
+ '!インデント構文\n'+
17
+ 'もしA=1ならば\n' +
18
+ '  1を表示\n' +
19
+ 'ここまで‰\n')
20
+ cmp('!インデント構文\n'+
21
+ 'もしA=1ならば\n'+
22
+ '  「わん」と表示。\n',
23
+ // ---
24
+ '!インデント構文\n'+
25
+ 'もしA=1ならば\n' +
26
+ '  「わん」と表示。\n' +
27
+ 'ここまで‰\n')
28
+ })
29
+ it('もし 違えば', () => {
30
+ cmp('!インデント構文\n'+
31
+ 'もしA=1ならば\n'+
32
+ '  1を表示\n' +
33
+ '違えば\n'+
34
+ '  2を表示\n',
35
+ // ---
36
+ '!インデント構文\n'+
37
+ 'もしA=1ならば\n' +
38
+ '  1を表示\n' +
39
+ '違えば\n' +
40
+ '  2を表示\n' +
41
+ 'ここまで‰\n')
42
+ })
43
+ it('3回と5回', () => {
44
+ cmp('!インデント構文\n'+
45
+ '5回\n' +
46
+ '  3回\n'+
47
+ '    1を表示\n',
48
+ // ---
49
+ '!インデント構文\n'+
50
+ '5回\n' +
51
+ '  3回\n' +
52
+ '    1を表示\n' +
53
+ ' ここまで‰\n' +
54
+ 'ここまで‰\n')
55
+ })
56
+ it('もし 違えば 入れ子', () => {
57
+ cmp('!インデント構文\n'+
58
+ 'もしA=1ならば\n'+
59
+ '  もしB=1ならば\n' +
60
+ '    1を表示\n' +
61
+ '  違えば\n' +
62
+ '    2を表示\n' +
63
+ '違えば\n'+
64
+ '  3を表示\n',
65
+ // ---
66
+ '!インデント構文\n'+
67
+ 'もしA=1ならば\n'+
68
+ '  もしB=1ならば\n' +
69
+ '    1を表示\n' +
70
+ '  違えば\n' +
71
+ '    2を表示\n' +
72
+ ' ここまで‰\n' +
73
+ '違えば\n'+
74
+ '  3を表示\n' +
75
+ 'ここまで‰\n')
76
+ })
77
+ it('JSONで改行がある場合(#699)', () => {
78
+ cmp('!インデント構文\n'+
79
+ 'J={"taro":30,\n'+
80
+ ' "jiro":50}\n',
81
+ // ---
82
+ '!インデント構文\n'+
83
+ 'J={"taro":30,\n'+
84
+ ' "jiro":50}\n')
85
+ cmp('!インデント構文\n'+
86
+ 'S=「aaa\n'+
87
+ 'bbb」\n'+
88
+ 'もしS=30ならば\n' +
89
+ '  「あ」と表示\n',
90
+ // ---
91
+ '!インデント構文\n'+
92
+ 'S=「aaa\n'+
93
+ 'bbb」\n'+
94
+ 'もしS=30ならば\n' +
95
+ '  「あ」と表示\n' +
96
+ 'ここまで‰\n')
97
+ })
98
+ it('コメント内に文字列リテラルの開始記号がある場合', () => {
99
+ cmp('!インデント構文\n'+
100
+ 'もしA=1ならば\n'+
101
+ `  1を表示 # 「\n`+
102
+ '2を表示\n',
103
+ // ---
104
+ '!インデント構文\n'+
105
+ 'もしA=1ならば\n' +
106
+ `  1を表示 # 「\n`+
107
+ 'ここまで‰\n'+
108
+ '2を表示\n'
109
+ )
110
+ cmp('!インデント構文\n'+
111
+ 'もしA=1ならば\n'+
112
+ `  1を表示 // 「\n`+
113
+ '2を表示\n',
114
+ // ---
115
+ '!インデント構文\n'+
116
+ 'もしA=1ならば\n' +
117
+ `  1を表示 // 「\n`+
118
+ 'ここまで‰\n'+
119
+ '2を表示\n'
120
+ )
121
+ })
122
+ it('複数行コメント内に文字列リテラルの開始記号がある場合', () => {
123
+ cmp('!インデント構文\n'+
124
+ 'もしA=1ならば\n'+
125
+ `  1を表示 /* 「 */\n`+
126
+ '2を表示\n',
127
+ // ---
128
+ '!インデント構文\n'+
129
+ 'もしA=1ならば\n' +
130
+ `  1を表示 /* 「 */\n`+
131
+ 'ここまで‰\n'+
132
+ '2を表示\n'
133
+ )
134
+ cmp('!インデント構文\n'+
135
+ 'もしA=1ならば\n'+
136
+ `  1を表示 /* 「 */\n`+
137
+ '2を表示\n',
138
+ // ---
139
+ '!インデント構文\n'+
140
+ 'もしA=1ならば\n' +
141
+ `  1を表示 /* 「 */\n`+
142
+ 'ここまで‰\n'+
143
+ '2を表示\n'
144
+ )
145
+ })
146
+ it('改行を含む、絵文字による文字列がある場合', () => {
147
+ cmp(
148
+ '!インデント構文\n' +
149
+ '2回\n' +
150
+ ' 🌴1\n' +
151
+ '🌴を表示\n' +
152
+ '「2」を表示\n',
153
+ // ---
154
+ '!インデント構文\n' +
155
+ '2回\n' +
156
+ ' 🌴1\n' +
157
+ '🌴を表示\n' +
158
+ 'ここまで‰\n' +
159
+ '「2」を表示\n'
160
+ )
161
+ })
162
+ it('前後が一致しない括弧がある場合', () => {
163
+ cmp(
164
+ '!インデント構文\n' +
165
+ '2回\n' +
166
+ ' A={\n' +
167
+ '}を表示\n' +
168
+ '1を表示\n',
169
+ // ---
170
+ '!インデント構文\n' +
171
+ '2回\n' +
172
+ ' A={\n' +
173
+ '}を表示\n' +
174
+ 'ここまで‰\n' +
175
+ '1を表示\n'
176
+ )
177
+ })
178
+ it('「違えば」に行コメントがある場合', () => {
179
+ cmp('!インデント構文\n'+
180
+ 'もしA=1ならば\n'+
181
+ '  1を表示\n' +
182
+ '違えば # コメント\n'+
183
+ '  2を表示\n',
184
+ // ---
185
+ '!インデント構文\n'+
186
+ 'もしA=1ならば\n' +
187
+ '  1を表示\n' +
188
+ '違えば # コメント\n' +
189
+ '  2を表示\n' +
190
+ 'ここまで‰\n')
191
+ })
192
+ it('「違えば」に範囲コメントがある場合', () => {
193
+ cmp('!インデント構文\n'+
194
+ 'もしA=1ならば\n'+
195
+ '  1を表示\n' +
196
+ '/* foo \n'+
197
+ '*/違えば /* bar */\n'+
198
+ '  2を表示\n',
199
+ // ---
200
+ '!インデント構文\n'+
201
+ 'もしA=1ならば\n'+
202
+ '  1を表示\n' +
203
+ '/* foo \n'+
204
+ '*/違えば /* bar */\n'+
205
+ '  2を表示\n' +
206
+ 'ここまで‰\n')
207
+ })
208
+ it('コメントのみの行がある場合', () => {
209
+ cmp('!インデント構文\n'+
210
+ 'もしA=1ならば\n'+
211
+ '    # コメント\n' +
212
+ '  1を表示\n' +
213
+ '違えば\n'+
214
+ '/* */\n'+
215
+ '/* */ \n'+
216
+ '  2を表示\n',
217
+ // ---
218
+ '!インデント構文\n'+
219
+ 'もしA=1ならば\n' +
220
+ '    # コメント\n' +
221
+ '  1を表示\n' +
222
+ '違えば\n' +
223
+ '/* */\n'+
224
+ '/* */ \n'+
225
+ '  2を表示\n' +
226
+ 'ここまで‰\n')
227
+ })
228
+ it('"・"がある場合', () => {
229
+ cmp('!インデント構文\n'+
230
+ '1回\n' +
231
+ '・1回\n' +
232
+ '・・1を表示\n' +
233
+ '・\n' +
234
+ '・・2を表示\n',
235
+ // ---
236
+ '!インデント構文\n'+
237
+ '1回\n' +
238
+ '・1回\n' +
239
+ '・・1を表示\n' +
240
+ '・・2を表示\n' +
241
+ ' ここまで‰\n' +
242
+ 'ここまで‰\n',
243
+ )
244
+ })
245
+ it('「違えばもし」の場合(#940)', () => {
246
+ cmp('!インデント構文\n'+
247
+ 'もしA=1ならば\n'+
248
+ '  1を表示\n' +
249
+ '違えば、もしA=2ならば\n'+
250
+ '  2を表示\n' +
251
+ '違えば\n' +
252
+ '  3を表示\n',
253
+ // ---
254
+ '!インデント構文\n'+
255
+ 'もしA=1ならば\n'+
256
+ '  1を表示\n' +
257
+ '違えば、もしA=2ならば\n'+
258
+ '  2を表示\n' +
259
+ '違えば\n'+
260
+ '  3を表示\n' +
261
+ 'ここまで‰\n')
262
+ })
263
+ it('ソースマップ', () => {
264
+ const result = NakoIndent.convert(
265
+ '!インデント構文\n' +
266
+ '\n' +
267
+ '●(nを)階乗とは\n' +
268
+ ' もしnが1と等しいならば\n' +
269
+ ' それは1\n' +
270
+ ' 違えば\n' +
271
+ ' それは((n - 1)を階乗) * n\n' +
272
+ '\n' +
273
+ 'もし1=1なら\n' +
274
+ ' 「こんに\n' +
275
+ 'ちは」と表示\n' +
276
+ '\n' +
277
+ '「こんにちは」と表示\n' +
278
+ '\n' +
279
+ '',
280
+ )
281
+
282
+ /**
283
+ * 出力されるべきコード:
284
+ * ```
285
+ * 0!インデント構文
286
+ * 1 ●(nを)階乗とは
287
+ * 2 もしnが1と等しいならば
288
+ * 3 それは1
289
+ * 4 違えば
290
+ * 5 それは((n - 1)を階乗) * n
291
+ * 6 ここまで‰
292
+ * 7 ここまで‰
293
+ * 8 もし1=1なら
294
+ * 9 「こんに
295
+ * 10 ちは」と表示
296
+ * 11 ここまで‰
297
+ * 12 「こんにちは」と表示
298
+ * ```
299
+ */
300
+
301
+ // 6, 7, 11 行目に「ここまで‰」が挿入された。
302
+ assert.deepStrictEqual(result.insertedLines, [6, 7, 11])
303
+
304
+ // 1, 6, 11, 13, 13行目の直前の空白行が消された。
305
+ // ※ 正確には、各空白行を消したときに、それまでに出力した行数(「ここまで‰」を含む)が 1, 6, 11, 13, 13 行。
306
+ assert.deepStrictEqual(result.deletedLines, [
307
+ { lineNumber: 1, len: 0 },
308
+ { lineNumber: 6, len: 0 },
309
+ { lineNumber: 11, len: 0 },
310
+ { lineNumber: 13, len: 0 },
311
+ { lineNumber: 13, len: 0 }
312
+ ])
313
+ })
314
+ it('ブロック構造の取得', () => {
315
+ assert.deepStrictEqual(
316
+ NakoIndent.getBlockStructure(
317
+ 'もしはいならば\n' +
318
+ ' 「こん\n' +
319
+ 'にちは」を表示\n' +
320
+ 'ここまで',
321
+ ),
322
+ {
323
+ lines: [0, 4, 4, 0], // 各行の高さは 0, 4, 4, 0
324
+ pairs: [[0, 3]], // 0行目と3行目のペアがブロックを構成している。
325
+ parents: [null, 0, 0, null],
326
+ spaces: ['', ' ', ' ', '']
327
+ }
328
+ )
329
+ })
330
+ it('ブロック構造の取得 - 複数行にまたがる構文', () => {
331
+ // 複数行にまたがる文の2行目以降のインデントは、先頭行のインデントと等しいものとする。
332
+ // コメントのみの行のインデントは、直近の通常の行のインデントと等しいものとする。
333
+ assert.deepStrictEqual(
334
+ NakoIndent.getBlockStructure(
335
+ '!インデント構文\n' +
336
+ 'Nを1から3まで繰り返す\n' +
337
+ ' 「1行目\n' +
338
+ '2行目」を表示\n' +
339
+ '/*範囲コメント\n' +
340
+ '*/'
341
+ ),
342
+ {
343
+ lines: [0, 0, 4, 4, 4, 4],
344
+ pairs: [[1, 6]],
345
+ parents: [null, null, 1, 1, 1, 1],
346
+ spaces: ['', '', ' ', ' ', '', ''],
347
+ }
348
+ )
349
+ })
350
+ it('ブロック構造の取得 - 違えば', () => {
351
+ assert.deepStrictEqual(
352
+ NakoIndent.getBlockStructure(
353
+ 'もしはいならば\n' +
354
+ ' a\n' +
355
+ '違えば\n' +
356
+ ' b\n' +
357
+ 'ここまで',
358
+ ).pairs,
359
+ [[0, 2], [2, 4]],
360
+ )
361
+ })
362
+ })
@@ -0,0 +1,146 @@
1
+ const assert = require('assert')
2
+ const NakoCompiler = require('../../src/nako3')
3
+
4
+ describe('lex_test', () => {
5
+ const nako = new NakoCompiler()
6
+ // nako.logger.addListener('trace', ({ browserConsole }) => { console.log(...browserConsole) })
7
+ const cmp = (code, res) => {
8
+ nako.logger.debug('code=' + code)
9
+ assert.strictEqual(nako.run(code).log, res)
10
+ }
11
+ // --- test ---
12
+ it('送り仮名の省略テスト', () => {
13
+ cmp('『abc』の『a』を「*」に置換。表示', '*bc')
14
+ cmp('『abc』の『a』を「*」に置換します。それを表示', '*bc')
15
+ cmp('『abc』の『a』を「*」に置換しろ。表示しろ。', '*bc')
16
+ })
17
+ it('仮名表記の曖昧', () => {
18
+ cmp('『abc』の『a』を「*」に置き換え。表示', '*bc')
19
+ })
20
+ it('範囲コメントの処理', () => {
21
+ cmp('1を表示\n/*2を表示\n3を表示\n*/\n4を表示\n', '1\n4')
22
+ cmp('1を表示\n/*2を表示\n3を表示\n4を表示\n5を表示\n*/\n6を表示\n', '1\n6')
23
+ })
24
+ it('文字列の埋め込み', () => {
25
+ cmp('見出し=30;「--{見出し}--」を表示', '--30--')
26
+ })
27
+ it('文字列の埋め込み語句のかな省略', () => {
28
+ cmp('見出し=30;「--{見出}--」を表示', '--30--')
29
+ })
30
+ it('文字列に式を埋め込む', () => {
31
+ cmp('「--{3に2を掛ける}--」を表示', "--6--")
32
+ })
33
+ it('文字列の埋め込み変数名全角英数字', () => {
34
+ cmp('N1=30;「--{N1}--」を表示', '--30--')
35
+ })
36
+ it('文字列の埋め込みで対応しない閉じ括弧がある場合', () => {
37
+ cmp('B=1;E=2;「A{B}C}D{E}F」を表示', 'A1C}D2F')
38
+ })
39
+ it('文字列の埋め込み配列', () => {
40
+ cmp('手説明=["グー","チョキ","パー"];「自分は{手説明@1}、相手は{手説明@0}」と表示', '自分はチョキ、相手はグー')
41
+ })
42
+ it('はい/いいえ', () => {
43
+ cmp('はいを表示', '1')
44
+ cmp('いいえを表示', '0')
45
+ })
46
+ it('A = 8の書き方', () => {
47
+ cmp('A = 8;Aを表示', '8')
48
+ })
49
+ it('数値表現のテスト', () => {
50
+ cmp('123e1を表示', '1230')
51
+ cmp('123E-1を表示', '12.3')
52
+ cmp('123e+1を表示', '1230')
53
+ cmp('.123e-1を表示', '0.0123')
54
+ cmp('123.e1を表示', '1230')
55
+ })
56
+ it('2進数/8進数/16進数のテスト', () => {
57
+ cmp('0xFFを表示', '255')
58
+ cmp('0XFFを表示', '255')
59
+ cmp('0b11を表示', '3')
60
+ cmp('0B1111を表示', '15')
61
+ cmp('0o10を表示', '8')
62
+ cmp('0O11を表示', '9')
63
+ })
64
+ it('《特別名トークン》のテスト', () => {
65
+ cmp('《今日から明日》=30;《今日から明日》を表示', '30')
66
+ cmp('《AからBまで》=30;《AからBまで》を表示', '30')
67
+ })
68
+ it('以上、以下、超、未満 (#918)', () => {
69
+ cmp('A=4;もし、Aが2以上ならば\nAを表示;\nここまで。', '4')
70
+ cmp('A=4;もし、30がA以上ならば\nAを表示;\nここまで。', '4')
71
+ })
72
+ it('ソースマップ - 単純な例', () => {
73
+ const tokens = nako.lex('「こんにちは」と表示').tokens
74
+
75
+ // 0-7文字目: 「こんにちは」と
76
+ assert.strictEqual(tokens[0].startOffset, 0)
77
+ assert.strictEqual(tokens[0].endOffset, 8)
78
+
79
+ // 8-9文字目: 表示
80
+ assert.strictEqual(tokens[1].startOffset, 8)
81
+ assert.strictEqual(tokens[1].endOffset, 10)
82
+ })
83
+ it('ソースマップ - スペース扱いの文字', () => {
84
+ // '・'はスペース扱いであり、トークン化されない。
85
+ const tokens = nako.lex('ならば・A').tokens
86
+
87
+ // 0-2文字目: ならば
88
+ assert.strictEqual(tokens[0].startOffset, 0)
89
+ assert.strictEqual(tokens[0].endOffset, 3)
90
+
91
+ // 4文字目: A
92
+ assert.strictEqual(tokens[1].startOffset, 4)
93
+ assert.strictEqual(tokens[1].endOffset, 5)
94
+ })
95
+ it('ソースマップ - 複数行の場合', () => {
96
+ const tokens = nako.lex('「こんにちは」を表示する。\n「こんにちは」を表示する。').tokens
97
+ assert.strictEqual(tokens[0].startOffset, 0) // 0-7: 「こんにちは」を
98
+ assert.strictEqual(tokens[1].startOffset, 8) // 8-11: 表示する
99
+ assert.strictEqual(tokens[2].startOffset, 12) // 12: 。
100
+ assert.strictEqual(tokens[3].startOffset, 13) // 13: eol
101
+ assert.strictEqual(tokens[4].startOffset, 14) // 14-21: 「こんにちは」を
102
+ assert.strictEqual(tokens[5].startOffset, 22) // 22-25: 表示する
103
+ assert.strictEqual(tokens[6].startOffset, 26) // 26: 。
104
+ })
105
+ it('ソースマップ - 行コメント', () => {
106
+ const tokens = nako.lex(`# コメント`).commentTokens
107
+ assert.strictEqual(tokens[0].startOffset, 0)
108
+ assert.strictEqual(tokens[0].endOffset, 6)
109
+ })
110
+ it('ソースマップ - 範囲コメント', () => {
111
+ const tokens = nako.lex(`/*\nここは全部コメント\nここは全部コメント\n*/`).commentTokens
112
+ assert.strictEqual(tokens[0].startOffset, 0)
113
+ assert.strictEqual(tokens[0].endOffset, 25)
114
+ })
115
+ it('ソースマップ - 範囲コメントの直後に文字がある場合', () => {
116
+ const result = nako.lex(`/*\nここは全部コメント\nここは全部コメント\n*/a`)
117
+
118
+ // コメント
119
+ assert.strictEqual(result.commentTokens[0].startOffset, 0)
120
+ assert.strictEqual(result.commentTokens[0].endOffset, 25)
121
+
122
+ // a
123
+ assert.strictEqual(result.tokens[0].startOffset, 25)
124
+ assert.strictEqual(result.tokens[0].endOffset, 26)
125
+ })
126
+ it('ソースマップ - "_"による改行', () => {
127
+ const tokens = nako.lex(`[_\n]\nりんごの値段は30`).tokens
128
+ const nedan = tokens.find((t) => t.value === '値段')
129
+ assert.strictEqual(nedan.startOffset, 9)
130
+ assert.strictEqual(nedan.endOffset, 11)
131
+ })
132
+ it('ソースマップ - インデント構文', () => {
133
+ const tokens = nako.lex(`!インデント構文\n1回\n 「2」を表示\n\n「3」を表示`).tokens
134
+ assert.strictEqual(tokens.find((t) => t.value === '2').startOffset, 16) // 「1」を
135
+ assert.strictEqual(tokens.find((t) => t.value === '3').startOffset, 24) // 「2」を
136
+ })
137
+ it('ソースマップ - string_ex', () => {
138
+ const tokens = nako.lex(`"{あ}"`).tokens
139
+ assert.strictEqual(tokens.find((t) => t.value === 'あ').startOffset, 2)
140
+ assert.strictEqual(tokens.find((t) => t.value === 'あ').endOffset, 3)
141
+ })
142
+ it('「ならば」+「(全角|半角)空白」直後の改行が消える問題 #1015', () => {
143
+ cmp('もし、3=3ならば \n『OK』と表示;違えば;「NG」と表示;ここまで。', 'OK')
144
+ cmp('もし、3=3ならば \n『OK』と表示;違えば;「NG」と表示;ここまで。', 'OK')
145
+ })
146
+ })
@@ -0,0 +1,72 @@
1
+ const assert = require('assert')
2
+ const NakoCompiler = require('../../src/nako3')
3
+ describe('literal_test', () => {
4
+ const nako = new NakoCompiler()
5
+ // nako.logger.addListener('trace', ({ browserConsole }) => { console.log(...browserConsole) })
6
+ const cmp = (code, res) => {
7
+ nako.logger.debug('code=' + code)
8
+ assert.strictEqual(nako.run(code).log, res)
9
+ }
10
+ const err = (code) => {
11
+ nako.logger.debug('code=' + code)
12
+ try {
13
+ nako.run(code)
14
+ } catch (error) {
15
+ assert.ok(error)
16
+ return
17
+ }
18
+ assert.fail()
19
+ }
20
+ // --- test ---
21
+ it('非数', () => {
22
+ cmp('0/0を表示', 'NaN')
23
+ cmp('非数を表示', 'NaN')
24
+ })
25
+ it('無限大', () => {
26
+ cmp('3/無限大を表示', '0')
27
+ })
28
+ describe('十進法のテスト', () => {
29
+ //基本的に(整数部)(小数部)(指数部)です
30
+ it('0', () => {
31
+ cmp('0の変数型確認して表示', 'number')
32
+ cmp('013+014を表示', '27') //javascriptとは違い0から始まる7以下の数字だけで構成される数は八進数ではなく十進数として解釈されます
33
+ })
34
+ it('小数点', () => {
35
+ cmp('.11の変数型確認して表示', 'number') //小数点から始まっても数として解釈
36
+ cmp('222.の変数型確認して表示', 'number') //逆に小数点で終わっても数として解釈
37
+ err('123.$の変数型確認して表示') //しかしドットの後に定義されていない文字列をくっつけるとエラー
38
+ })
39
+ it('指数表記', () => {
40
+ cmp('7e+8=7e8を表示', 'true') //指数表記の+は省略可能
41
+ cmp('7.5e8の変数型確認して表示', 'number') //小数と組み合わせることもできる
42
+ cmp('7.e8の変数型確認して表示', 'number') //もちろん小数部を省略しても数として解釈
43
+ })
44
+ })
45
+ it('十六進法のテスト', () => {
46
+ cmp('0x1dfの変数型確認して表示', 'number')
47
+ })
48
+ it('八進法のテスト', () => {
49
+ cmp('0o157の変数型確認して表示', 'number')
50
+ })
51
+ it('二進法のテスト', () => {
52
+ cmp('0b101の変数型確認して表示', 'number')
53
+ })
54
+ it('数値区切文字', () => {
55
+ cmp('12345_00=123_4500を表示', 'true') //区切り文字として「_」が使用できます
56
+ cmp('12345_00=1_23_4500を表示', 'true') //数字の中でのどこでも使用できます
57
+ err('1____23_4500を表示') //連続して使うことはできません
58
+ cmp('_123を表示', 'undefined') // 区切り文字で始めることはできません(定義されていない変数「_123」の参照)
59
+ err('123_を表示') //区切り文字で終わらせることはできません
60
+ cmp('0xCAFE_F00Dの変数型確認して表示', 'number') //十六進数でも
61
+ cmp('0o123456_777の変数型確認して表示', 'number') //八進数でも
62
+ cmp('0b1111_0000の変数型確認して表示', 'number') //二進数でも
63
+ cmp('101_475_938.322_8の変数型確認して表示', 'number') //小数でも
64
+ err('3_.1415の変数型確認して表示', 'number') //小数点等の標識の前後では区切り文字は使えません
65
+ err('3e_1415の変数型確認して表示', 'number')
66
+ })
67
+ it('単位のテスト #994', () => {
68
+ cmp('30kgを表示', '30')
69
+ cmp('A=100円;Aを表示', '100')
70
+ cmp('B=300㎡;B=B+1㎡;Bを表示', '301')
71
+ })
72
+ })
@@ -0,0 +1,26 @@
1
+ const NakoColors = require('../../src/nako_colors')
2
+ const assert = require('assert')
3
+ const NakoLogger = require('root/src/nako_logger')
4
+
5
+ describe('nako_logger_test', () => {
6
+ it('色付けのテスト', () => {
7
+ const out = NakoColors.convertColorTextFormat(`デフォルト${NakoColors.color.bold}太字${NakoColors.color.red}太字赤${NakoColors.color.reset}デフォルト<script>`)
8
+ assert.strictEqual(out.noColor, 'デフォルト太字太字赤デフォルト<script>')
9
+ assert.strictEqual(out.nodeConsole, 'デフォルト\u001b[1m太字\u001b[31m太字赤\u001b[0mデフォルト<script>\u001b[0m')
10
+ assert.strictEqual(out.html, '<span>デフォルト</span><span style="color: inherit; font-weight: bold;">太字</span><span style="color: red; font-weight: bold;">太字赤</span><span style="color: inherit; font-weight: inherit;">デフォルト&lt;script&gt;</span>')
11
+ assert.deepStrictEqual(out.browserConsole, [
12
+ 'デフォルト%c太字%c太字赤%cデフォルト<script>',
13
+ 'color: inherit; font-weight: bold;',
14
+ 'color: red; font-weight: bold;',
15
+ 'color: inherit; font-weight: inherit;'
16
+ ])
17
+ })
18
+ it('ログの取得のテスト', (done) => {
19
+ const logger = new NakoLogger()
20
+ logger.addListener('info', (data) => {
21
+ assert.strictEqual(data.noColor, '[情報](2行目): foo')
22
+ done()
23
+ })
24
+ logger.info('foo', { line: 1 })
25
+ })
26
+ })
@@ -0,0 +1,24 @@
1
+ const assert = require('assert')
2
+ const NakoCompiler = require('../../src/nako3')
3
+ const PluginBrowser = require('../../src/plugin_browser')
4
+
5
+ describe('plugin_browser_test', () => {
6
+ const nako = new NakoCompiler()
7
+ // nako.logger.addListener('trace', ({ browserConsole }) => { console.log(...browserConsole) })
8
+ nako.addPluginFile('PluginBrowser', 'plugin_browser.js', PluginBrowser)
9
+ const cmp = (code, res) => {
10
+ nako.logger.debug('code=' + code)
11
+ assert.strictEqual(nako.run(code).log, res)
12
+ }
13
+ // --- test ---
14
+ it('RGB', () => {
15
+ cmp('CODE=RGB(255,255,255);CODEを大文字変換して表示', '#FFFFFF')
16
+ cmp('CODE=RGB(0,255,255);CODEを大文字変換して表示', '#00FFFF')
17
+ cmp('CODE=RGB(0,0,0);CODEを大文字変換して表示', '#000000')
18
+ cmp('CODE=22と25と255のRGB;CODEを大文字変換して表示', '#1619FF')
19
+ cmp('22と25と255のRGBを大文字変換して表示', '#1619FF')
20
+ })
21
+ it('色混ぜる', () => {
22
+ cmp('[255,255,255]の色混ぜして大文字変換して表示', '#FFFFFF')
23
+ })
24
+ })