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,113 @@
1
+ const NakoColors = require('./nako_colors')
2
+
3
+ /**
4
+ * ă‚łăƒłăƒ‘ă‚€ăƒ«ă•ă‚ŒăŸăȘă§ă—ă“ăźăƒ—ăƒ­ă‚°ăƒ©ăƒ ă§ă€ă‚°ăƒ­ăƒŒăƒăƒ«ç©ș間ぼthisăŒæŒ‡ă™ă‚Șブゾェクト
5
+ */
6
+ class NakoGlobal {
7
+ /**
8
+ * @param {import('./nako3')} compiler
9
+ * @param {import('./nako_gen')} gen
10
+ */
11
+ constructor (compiler, gen) {
12
+ // ăƒŠăƒŒă‚¶ăƒŒăźăƒ—ăƒ­ă‚°ăƒ©ăƒ ă‹ă‚‰ç·šé›†ă•ă‚Œă‚‹ć€‰æ•°
13
+ this.__locals = {}
14
+ this.__varslist = [
15
+ { ...compiler.__varslist[0] }, // system
16
+ { ...compiler.__varslist[1] }, // global
17
+ { ...compiler.__varslist[2] } // local [2][3][4][5] ...
18
+ ]
19
+ this.index = 0
20
+ this.nextIndex = -1
21
+ this.__code = []
22
+ this.__callstack = []
23
+ this.__stack = []
24
+ this.__labels = []
25
+ this.__genMode = gen.genMode
26
+
27
+ // PluginSystemべdestroy()から揂照するため
28
+ this.__module = { ...compiler.__module } // shallow copy
29
+ this.pluginfiles = { ...compiler.pluginfiles }
30
+
31
+ // PluginWorkeră§ăƒŠăƒŒă‚¶ăƒŒćźšçŸ©é–ąæ•°ăźJavaScriptă‚łăƒŒăƒ‰ă‚’workerăźă‚łăƒłăƒ‘ă‚€ăƒ©ăźă‚€ăƒłă‚čタンă‚čăžă‚łăƒ”ăƒŒă™ă‚‹ăŸă‚
32
+ this.gen = gen
33
+
34
+ // ä»„äž‹ăźăƒĄă‚œăƒƒăƒ‰ă§äœżă†ăŸă‚
35
+ this.logger = compiler.logger
36
+ this.compiler = compiler
37
+ }
38
+
39
+ clearLog () {
40
+ this.__varslist[0]['èĄšç€șログ'] = ''
41
+ }
42
+
43
+ get log () {
44
+ let s = this.__varslist[0]['èĄšç€șログ']
45
+ s = s.replace(/\s+$/, '')
46
+ return s
47
+ }
48
+
49
+ /**
50
+ * ă€ŒăƒŠăƒ‡ă‚·ă‚łă€ć‘œä»€ăźăŸă‚ăźăƒĄă‚œăƒƒăƒ‰
51
+ * @param {string} code
52
+ * @param {string} fname
53
+ * @param {Partial<import('./nako3').CompilerOptions & { resetLog: boolean }>} opts
54
+ * @param {string} [preCode]
55
+ */
56
+ runEx (code, fname, opts, preCode = '') {
57
+ // ă‚čă‚łăƒŒăƒ—ă‚’ć…±æœ‰ă—ăŠćźŸèĄŒ
58
+ return this.compiler._runEx(code, fname, opts, preCode, this)
59
+ }
60
+
61
+ /**
62
+ * テă‚čăƒˆćźŸèĄŒăźăŸă‚ăźăƒĄă‚œăƒƒăƒ‰
63
+ * @param {{ name: string, f: () => void }[]} tests
64
+ */
65
+ _runTests (tests) {
66
+ let text = `${NakoColors.color.bold}テă‚čăƒˆăźćźŸèĄŒç”æžœ${NakoColors.color.reset}\n`
67
+ let pass = 0
68
+ let numFailures = 0
69
+ for (const t of tests) {
70
+ try {
71
+ t.f()
72
+ text += `${NakoColors.color.green}✔${NakoColors.color.reset} ${t.name}\n`
73
+ pass++
74
+ } catch (err) {
75
+ text += `${NakoColors.color.red}☓${NakoColors.color.reset} ${t.name}: ${err.message}\n`
76
+ numFailures++
77
+ }
78
+ }
79
+ if (numFailures > 0) {
80
+ text += `${NakoColors.color.green}æˆćŠŸ ${pass}ä»¶ ${NakoColors.color.red}ć€±æ•— ${numFailures}ä»¶`
81
+ } else {
82
+ text += `${NakoColors.color.green}æˆćŠŸ ${pass}ä»¶`
83
+ }
84
+ this.numFailures = numFailures
85
+ this.logger.send('stdout', text)
86
+ }
87
+
88
+ /**
89
+ * æŻŽăƒ—ăƒ©ă‚°ă‚€ăƒłăźă€Œ!クăƒȘă‚ąă€é–ąæ•°ă‚’ćźŸèĄŒ
90
+ */
91
+ clearPlugins () {
92
+ const clearName = '!クăƒȘケ'
93
+ for (const pname in this.pluginfiles) {
94
+ const po = this.__module[pname]
95
+ if (po[clearName] && po[clearName].fn) {
96
+ po[clearName].fn(this)
97
+ }
98
+ }
99
+ }
100
+
101
+ /**
102
+ * 搄繼ăƒȘă‚»ăƒƒăƒˆć‡Šç†
103
+ */
104
+ reset () {
105
+ this.clearPlugins()
106
+ }
107
+
108
+ destroy () {
109
+ this.reset()
110
+ }
111
+ }
112
+
113
+ module.exports = NakoGlobal
@@ -0,0 +1,480 @@
1
+ const { NakoIndentError } = require('./nako_errors')
2
+ const NakoPrepare = require('./nako_prepare')
3
+
4
+ /**
5
+ * ă‚€ăƒłăƒ‡ăƒłăƒˆæ§‹æ–‡æŒ‡ćźšăŒă‚ă‚Œă°ă‚łăƒŒăƒ‰ă‚’ć€‰æ›ă™ă‚‹
6
+ * @param {string} code
7
+ * @param {string} filename
8
+ * @returns {{ code: string, insertedLines: number[], deletedLines: { lineNumber: number, len: number }[] }}
9
+ */
10
+ function convert (code, filename) {
11
+ // æœ€ćˆăź30èĄŒă‚’ăƒă‚§ăƒƒă‚Ż
12
+ if (isIndentSyntaxEnabled(code)) {
13
+ return convertGo(code, filename)
14
+ }
15
+ return { code, insertedLines: [], deletedLines: [] }
16
+ }
17
+
18
+ // ありえăȘいæ”čèĄŒăƒžăƒŒă‚Żă‚’ćźšçŸ©
19
+ const SpecialRetMark = '🌟🌟æ”čèĄŒđŸŒŸđŸŒŸs4j#WjcSb😀/FcX3🌟🌟'
20
+
21
+ /**
22
+ * @param {string} code
23
+ * @returns {boolean}
24
+ */
25
+ function isIndentSyntaxEnabled (code) {
26
+ // ăƒ—ăƒ­ă‚°ăƒ©ăƒ ć†’é ­ă«ă€Œ!ă‚€ăƒłăƒ‡ăƒłăƒˆæ§‹æ–‡ă€ăŒă‚ă‚Œă°ă‚€ăƒłăƒ‡ăƒłăƒˆæ§‹æ–‡ăŒæœ‰ćŠč
27
+ const keywords = ['!ă‚€ăƒłăƒ‡ăƒłăƒˆæ§‹æ–‡', '!ă“ă“ăŸă§ă ă‚‹ă„']
28
+ const lines = code.split('\n', 30)
29
+ for (const line of lines) {
30
+ const s9 = line.substr(0, 8).replace('', '!')
31
+ if (keywords.indexOf(s9) >= 0) {
32
+ return true
33
+ }
34
+ }
35
+ return false
36
+ }
37
+
38
+ /**
39
+ * ă‚œăƒŒă‚čă‚łăƒŒăƒ‰ăźă‚ă‚‹1èĄŒăźäž­ăźă‚łăƒĄăƒłăƒˆă‚’ć…šăŠć–ă‚Šé™€ăă€‚
40
+ * äș‹ć‰ă«replaceRetMarkă«ă‚ˆăŁăŠæ–‡ć­—ćˆ—ă‚„çŻ„ć›Čコメント憅ぼæ”čèĄŒæ–‡ć­—ăŒçœźæ›ă•ă‚ŒăŠă„ă‚‹ćż…èŠăŒă‚ă‚‹ă€‚
41
+ * @param {string} src
42
+ * @return {string}
43
+ */
44
+ function removeCommentsFromLine (src) {
45
+ const prepare = new NakoPrepare() // `※`, `/`, `` ăšă„ăŁăŸăƒ‘ă‚żăƒŒăƒłć…šăŠă«ćŻŸćżœă™ă‚‹ăŸă‚ă«ćż…èŠ
46
+ const len = src.length
47
+ let result = ''
48
+ let eos = ''
49
+ let i = 0
50
+ let isComment = false
51
+ while (i < len) {
52
+ const c = src.charAt(i)
53
+ const ch2 = src.substr(i, 2)
54
+ const cPrepared = prepare.convert1ch(c)
55
+ const ch2Prepared = ch2.split('').map((c) => prepare.convert1ch(c)).join('')
56
+
57
+ // eosか?
58
+ if (eos !== '') {
59
+ // srcたiæ–‡ć­—ç›źä»„é™ăŒeosă§ć§‹ăŸă‚‹ăȘă‚‰æ–‡ć­—ćˆ—ă‚’ç”‚äș†ă€ăă†ă§ăȘければ1æ–‡ć­—é€Čめる
60
+ if (eos === (eos.length === 1 ? cPrepared : ch2Prepared)) {
61
+ if (!isComment) {
62
+ result += src.substr(i, eos.length)
63
+ }
64
+ i += eos.length
65
+ isComment = false
66
+ eos = ''
67
+ } else {
68
+ if (!isComment) {
69
+ result += c
70
+ }
71
+ i++
72
+ }
73
+ continue
74
+ }
75
+ // æ–‡ć­—ćˆ—ăźæ”čèĄŒă‚‚ç„ĄèŠ–ă™ă‚‹
76
+ switch (cPrepared) {
77
+ case '"':
78
+ case '\'':
79
+ eos = c
80
+ result += c
81
+ i++
82
+ continue
83
+ case '「':
84
+ eos = '」'
85
+ result += c
86
+ i++
87
+ continue
88
+ case '『':
89
+ eos = '』'
90
+ result += c
91
+ i++
92
+ continue
93
+ case '“':
94
+ eos = '”'
95
+ result += c
96
+ i++
97
+ continue
98
+ case '{':
99
+ eos = '}'
100
+ result += c
101
+ i++
102
+ continue
103
+ case '[':
104
+ eos = ']'
105
+ result += c
106
+ i++
107
+ continue
108
+ }
109
+
110
+ switch (ch2) {
111
+ case '🌮':
112
+ eos = '🌮'
113
+ result += ch2
114
+ i += 2
115
+ continue
116
+ case '🌿':
117
+ eos = '🌿'
118
+ result += ch2
119
+ i += 2
120
+ continue
121
+ }
122
+
123
+ // èĄŒă‚łăƒĄăƒłăƒˆ
124
+ if (cPrepared === '#') {
125
+ eos = '\n'
126
+ isComment = true
127
+ i++
128
+ continue
129
+ }
130
+ if (ch2Prepared === '//') {
131
+ eos = '\n'
132
+ isComment = true
133
+ i += 2
134
+ continue
135
+ }
136
+
137
+ // 範ć›Čコメント
138
+ if (ch2Prepared === '/*') {
139
+ eos = '*/'
140
+ isComment = true
141
+ i += 2
142
+ continue
143
+ }
144
+
145
+ result += c
146
+ i++
147
+ }
148
+ return result
149
+ }
150
+
151
+ /**
152
+ * @param {string} code
153
+ * @param {string} filename
154
+ * @returns {{ code: string, insertedLines: number[], deletedLines: { lineNumber: number, len: number }[] }}
155
+ */
156
+ function convertGo (code, filename) {
157
+ /** @type {number[]} */
158
+ const insertedLines = []
159
+ /** @type {{ lineNumber: number, len: number }[]} */
160
+ const deletedLines = []
161
+
162
+ const END = 'ă“ă“ăŸă§â€°'
163
+ const code2 = replaceRetMark(code) // æ–‡ć­—ćˆ—ăźäž­ăȘどたæ”čèĄŒă‚’çœźæ›
164
+ const lines = code2.split('\n')
165
+ /** @type {string[]} */
166
+ const lines2 = []
167
+ /** @type {number[]} */
168
+ const indentStack = []
169
+ let lastIndent = 0
170
+
171
+ let lineCount = -1
172
+ lines.forEach((line) => {
173
+ lineCount += line.split(SpecialRetMark).length
174
+ // trim line
175
+ // eslint-disable-next-line no-irregular-whitespace
176
+ if (/^[ ă€€ăƒ»\t]*$/.test(line)) {
177
+ deletedLines.push({ lineNumber: lines2.length, len: line.length })
178
+ return
179
+ }
180
+ // eslint-disable-next-line no-irregular-whitespace
181
+ const lineTrimed = removeCommentsFromLine(line).replace(/^[ ă€€ăƒ»\t]+/, '').replace(/\s+$/, '')
182
+ if (lineTrimed === '') {
183
+ lines2.push(line)
184
+ return
185
+ }
186
+ if (lineTrimed === 'ă“ă“ăŸă§') {
187
+ throw new NakoIndentError('ă‚€ăƒłăƒ‡ăƒłăƒˆæ§‹æ–‡ăŒæœ‰ćŠčćŒ–ă•ă‚ŒăŠă„ă‚‹ăšăă«ă€Žă“ă“ăŸă§ă€ă‚’äœżă†ă“ăšăŻă§ăăŸă›ă‚“ă€‚', lineCount, filename)
188
+ }
189
+
190
+ // check indent
191
+ const indent = countIndent(line)
192
+ if (lastIndent === indent) {
193
+ lines2.push(line)
194
+ return
195
+ }
196
+
197
+ // indent
198
+ if (lastIndent < indent) {
199
+ indentStack.push(lastIndent)
200
+ lastIndent = indent
201
+ lines2.push(line)
202
+ return
203
+ }
204
+ // unindent
205
+ if (lastIndent > indent) {
206
+ // 5曞
207
+ // 3曞
208
+ // 1ă‚’èĄšç€ș
209
+ // |
210
+ // |
211
+ lastIndent = indent
212
+ while (indentStack.length > 0) {
213
+ const n = indentStack.pop()
214
+ if (n === indent) {
215
+ if (lineTrimed.substr(0, 3) !== '違えば') {
216
+ insertedLines.push(lines2.length)
217
+ lines2.push(makeIndent(n) + END)
218
+ }
219
+ lines2.push(line)
220
+ return
221
+ }
222
+ if (indent < n) {
223
+ insertedLines.push(lines2.length)
224
+ lines2.push(makeIndent(n) + END)
225
+ continue
226
+ }
227
+ }
228
+ }
229
+ })
230
+ // æź‹ă‚Šăźă‚€ăƒłăƒ‡ăƒłăƒˆă‚’ć‡Šç†
231
+ while (indentStack.length > 0) {
232
+ const n = indentStack.pop()
233
+ insertedLines.push(lines2.length)
234
+ lines2.push(makeIndent(n) + END)
235
+ }
236
+ // ç‰čćˆ„ăƒžăƒŒă‚«ăƒŒă‚’æ”čèĄŒă«çœźæ›
237
+ /** @type {string[]} */
238
+ const lines3 = []
239
+ for (let i = 0; i < lines2.length; i++) {
240
+ if (lines2[i].includes(SpecialRetMark)) {
241
+ const lines4 = lines2[i].split(SpecialRetMark)
242
+
243
+ // çœźæ›ă•ă‚ŒăŸăƒžăƒŒă‚«ăƒŒăźæ•°ă ă‘ă€ăă‚Œä»„é™ăźèĄŒæ•°ă‚’ăšă‚‰ă™ă€‚
244
+ // unindentă«ă‚ˆăŁăŠæŒżć…„ă•ă‚ŒăŸèĄŒăŒSpecialRetMarkを搫むこずはăȘい。
245
+ for (let j = 0; j < insertedLines.length; j++) {
246
+ if (lines3.length < insertedLines[j]) {
247
+ insertedLines[j] += lines4.length - 1
248
+ }
249
+ }
250
+ for (let j = 0; j < deletedLines.length; j++) {
251
+ if (lines3.length < deletedLines[j].lineNumber) {
252
+ deletedLines[j].lineNumber += lines4.length - 1
253
+ }
254
+ }
255
+
256
+ lines3.push(...lines4)
257
+ } else {
258
+ lines3.push(lines2[i])
259
+ }
260
+ }
261
+
262
+ return { code: lines3.join('\n'), insertedLines, deletedLines }
263
+ }
264
+
265
+ function makeIndent (count) {
266
+ let s = ''
267
+ for (let i = 0; i < count; i++) {
268
+ s += ' '
269
+ }
270
+ return s
271
+ }
272
+
273
+ /**
274
+ * ă‚€ăƒłăƒ‡ăƒłăƒˆéƒšćˆ†ă‚’ć–ă‚Šć‡șす
275
+ * @param {string} line
276
+ * @returns {string}
277
+ */
278
+ function getIndent (line) {
279
+ // @ts-ignore
280
+ // eslint-disable-next-line no-irregular-whitespace
281
+ return /^([ ă€€ăƒ»\t]*)/.exec(removeCommentsFromLine(line))[1]
282
+ }
283
+
284
+ /**
285
+ * ă‚€ăƒłăƒ‡ăƒłăƒˆăźć€‹æ•°ă‚’æ•°ăˆă‚‹
286
+ * @param {string} line
287
+ */
288
+ function countIndent (line) {
289
+ let cnt = 0
290
+ for (let i = 0; i < line.length; i++) {
291
+ const ch = line.charAt(i)
292
+ if (ch === ' ') {
293
+ cnt++
294
+ continue
295
+ }
296
+ if (ch === ' ') {
297
+ cnt += 2
298
+ continue
299
+ }
300
+ if (ch === '・') {
301
+ cnt += 2
302
+ continue
303
+ }
304
+ if (ch === '\t') {
305
+ cnt += 4
306
+ continue
307
+ }
308
+ break
309
+ }
310
+ return cnt
311
+ }
312
+
313
+ function replaceRetMark (src) {
314
+ const prepare = new NakoPrepare() // `※`, `/`, `` ăšă„ăŁăŸăƒ‘ă‚żăƒŒăƒłć…šăŠă«ćŻŸćżœă™ă‚‹ăŸă‚ă«ćż…èŠ
315
+ const len = src.length
316
+ let result = ''
317
+ let eos = ''
318
+ let i = 0
319
+ while (i < len) {
320
+ const c = src.charAt(i)
321
+ const ch2 = src.substr(i, 2)
322
+ const cPrepared = prepare.convert1ch(c)
323
+ const ch2Prepared = ch2.split('').map((c) => prepare.convert1ch(c)).join('')
324
+
325
+ // eosか?
326
+ if (eos !== '') {
327
+ // srcたiæ–‡ć­—ç›źä»„é™ăŒeosă§ć§‹ăŸă‚‹ăȘă‚‰æ–‡ć­—ćˆ—ă‚’ç”‚äș†ă€ăă†ă§ăȘければ1æ–‡ć­—é€Čめる
328
+ if (eos === (eos.length === 1 ? cPrepared : ch2Prepared)) {
329
+ result += src.substr(i, eos.length)
330
+ i += eos.length
331
+ eos = ''
332
+ } else {
333
+ if (c === '\n') {
334
+ result += SpecialRetMark
335
+ } else {
336
+ result += c
337
+ }
338
+ i++
339
+ }
340
+ continue
341
+ }
342
+ // æ–‡ć­—ćˆ—ăźæ”čèĄŒă‚‚ç„ĄèŠ–ă™ă‚‹
343
+ switch (cPrepared) {
344
+ case '"':
345
+ case '\'':
346
+ eos = c
347
+ result += c
348
+ i++
349
+ continue
350
+ case '「':
351
+ eos = '」'
352
+ result += c
353
+ i++
354
+ continue
355
+ case '『':
356
+ eos = '』'
357
+ result += c
358
+ i++
359
+ continue
360
+ case '“':
361
+ eos = '”'
362
+ result += c
363
+ i++
364
+ continue
365
+ case '{':
366
+ eos = '}'
367
+ result += c
368
+ i++
369
+ continue
370
+ case '[':
371
+ eos = ']'
372
+ result += c
373
+ i++
374
+ continue
375
+ }
376
+
377
+ switch (ch2) {
378
+ case '🌮':
379
+ eos = '🌮'
380
+ result += ch2
381
+ i += 2
382
+ continue
383
+ case '🌿':
384
+ eos = '🌿'
385
+ result += ch2
386
+ i += 2
387
+ continue
388
+ }
389
+
390
+ // èĄŒă‚łăƒĄăƒłăƒˆ
391
+ if (cPrepared === '#') {
392
+ eos = '\n'
393
+ result += c
394
+ i++
395
+ continue
396
+ }
397
+ if (ch2Prepared === '//') {
398
+ eos = '\n'
399
+ result += ch2
400
+ i += 2
401
+ continue
402
+ }
403
+
404
+ // 範ć›Čコメント
405
+ if (ch2Prepared === '/*') {
406
+ eos = '*/'
407
+ result += ch2
408
+ i += 2
409
+ continue
410
+ }
411
+
412
+ result += c
413
+ i++
414
+ }
415
+ return result
416
+ }
417
+
418
+ /**
419
+ * ă‚łăƒŒăƒ‰ăźă‚€ăƒłăƒ‡ăƒłăƒˆăźæ§‹é€ ă‚’ć–ćŸ—ă™ă‚‹ă€‚
420
+ * ç©șç™œèĄŒă‚„è€‡æ•°èĄŒă«ăŸăŸăŒă‚‹æ§‹æ–‡ă‚’è€ƒæ…źă™ă‚‹ă€‚
421
+ * ă‚€ăƒłăƒ‡ăƒłăƒˆæ§‹æ–‡ăŒæœ‰ćŠč挖されどいăȘă„ć Žćˆă«ă‚‚äœżă‚ă‚Œă‚‹ă€‚
422
+ * @param {string} code
423
+ */
424
+ function getBlockStructure (code) {
425
+ /** @type {{ lines: number[], pairs: [number, number][], parents: (number | null)[], spaces: string[] }} */
426
+ const result = {
427
+ lines: [], // ć„èĄŒăźă‚€ăƒłăƒ‡ăƒłăƒˆé‡
428
+ pairs: [],
429
+ parents: [], // ć„èĄŒăźèŠȘăźèĄŒ
430
+ spaces: [] // ć„èĄŒăźă‚€ăƒłăƒ‡ăƒłăƒˆăźæ–‡ć­—ćˆ—
431
+ }
432
+
433
+ const lines = replaceRetMark(code).split('\n')
434
+
435
+ /** @type {number[]} */
436
+ const stack = []
437
+ let lineCount = 0
438
+ let prev = countIndent(lines[0])
439
+ for (const line of lines) {
440
+ const numLines = line.split(SpecialRetMark).length
441
+ const line2 = removeCommentsFromLine(line)
442
+ // eslint-disable-next-line no-irregular-whitespace
443
+ const current = (line2.replace(/^[ ă€€ăƒ»\t]+/, '') === '')
444
+ ? prev
445
+ : countIndent(line2)
446
+ result.lines.push(...Array(numLines).fill(current))
447
+ // @ts-ignore
448
+ result.spaces.push(...Array(numLines).fill(getIndent(line2)))
449
+
450
+ if (prev < current) {
451
+ stack.push(lineCount - 1)
452
+ } else if (prev > current) {
453
+ const last = stack.pop()
454
+ if (last !== undefined) {
455
+ result.pairs.push([last, lineCount])
456
+ }
457
+ }
458
+
459
+ const parent = stack[stack.length - 1] !== undefined ? stack[stack.length - 1] : null
460
+ result.parents.push(...Array(numLines).fill(parent))
461
+
462
+ prev = current
463
+ lineCount += numLines
464
+ }
465
+
466
+ // ă‚čă‚żăƒƒă‚ŻăŒäœ™ăŁăŸă‚‰ă‚łăƒŒăƒ‰ăźæœ«ć°Ÿăšăƒšă‚ąă«ă™ă‚‹ă€‚
467
+ for (const item of stack) {
468
+ result.pairs.push([item, lineCount])
469
+ }
470
+
471
+ return result
472
+ }
473
+
474
+ module.exports = {
475
+ convert,
476
+ getBlockStructure,
477
+ getIndent,
478
+ countIndent,
479
+ isIndentSyntaxEnabled
480
+ }
@@ -0,0 +1,46 @@
1
+ /**
2
+ * ćŠ©è©žăźäž€èŠ§
3
+ */
4
+
5
+ const josiList = [
6
+ 'に぀いお', 'くらい', 'ăȘぼか', 'ăŸă§ă‚’', 'ăŸă§ăź', 'ă«ă‚ˆă‚‹',
7
+ 'ずは', 'から', 'ăŸă§', 'だけ', 'より', 'ほど', 'ăȘど',
8
+ 'いど', 'えお', 'きど', 'けど', 'しど', 'っお', 'にお', 'みお',
9
+ 'めど', 'ねお', 'では', 'には', 'は~', 'んで',
10
+ 'は', 'を', 'に', 'ぞ', 'で', 'ず', 'が', 'た'
11
+ ]
12
+
13
+ // ă€Œă‚‚ă—ă€æ–‡ă§äœżă†ćŠ©è©ž
14
+ const tararebaJosiList = [
15
+ 'でăȘければ', 'ăȘければ', 'ăȘらば', 'ăȘら', 'たら', 'れば'
16
+ ]
17
+
18
+ // æ„ć‘łăźăȘă„ćŠ©è©ž(扊陀する) #936 #939 #974
19
+ const removeJosiList = [
20
+ 'こべ', 'である', 'です', 'ă—ăŸă™', 'でした'
21
+ ]
22
+
23
+ // äž€èŠ§ă‚’ăƒ—ăƒ­ă‚°ăƒ©ăƒ ă§æ‰±ă„ă‚„ă™ă„ă‚ˆă†ăƒžăƒƒăƒ—ă«ć€‰æ›
24
+ const tararebaMap = {}
25
+ tararebaJosiList.forEach(josi => {
26
+ josiList.push(josi)
27
+ tararebaMap[josi] = true
28
+ })
29
+ const removeJosiMap = {}
30
+ removeJosiList.forEach(josi => {
31
+ josiList.push(josi)
32
+ removeJosiMap[josi] = true
33
+ })
34
+
35
+ // æ–‡ć­—æ•°ăźé•·ă„é †ă«äžŠăłæ›żăˆ
36
+ josiList.sort((a, b) => b.length - a.length)
37
+
38
+ // æ­ŁèŠèĄšçŸă§ćŠ©è©žă‚’ăƒžăƒƒăƒă§ăă‚‹ă‚ˆă†ă«ă™ă‚‹
39
+ const josiRE = new RegExp('^[\\t ]*(' + josiList.join('|') + ')')
40
+
41
+ module.exports = {
42
+ josiRE,
43
+ tararebaMap,
44
+ removeJosiMap,
45
+ josiList
46
+ }