nadesiko3 3.6.26 → 3.6.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.
- package/core/package.json +1 -1
- package/core/src/nako_ast.mts +2 -0
- package/core/src/nako_gen.mjs +60 -0
- package/core/src/nako_gen.mts +58 -0
- package/core/src/nako_lex_rules.mjs +1 -0
- package/core/src/nako_lex_rules.mts +1 -0
- package/core/src/nako_parser3.mjs +46 -0
- package/core/src/nako_parser3.mts +45 -0
- package/core/src/nako_prepare.mjs +7 -2
- package/core/src/nako_prepare.mts +7 -2
- package/core/src/nako_token.mts +1 -0
- package/core/test/basic_test.mjs +18 -0
- package/core/test/calc_test.mjs +16 -0
- package/package.json +1 -1
- package/release/_hash.txt +16 -16
- package/release/_script-tags.txt +33 -33
- package/release/version.js +1 -1
- package/release/version_main.js +1 -1
- package/release/version_main.js.map +1 -1
- package/release/wnako3.js +65 -62
- package/release/wnako3.js.map +3 -3
- package/release/wnako3webworker.js +39 -36
- package/release/wnako3webworker.js.map +3 -3
- package/src/nako_version.mjs +2 -2
- package/src/nako_version.mts +2 -2
- package/src/plugin_browser_dom_basic.mjs +4 -1
- package/src/plugin_browser_dom_basic.mts +4 -1
- package/src/plugin_browser_dom_parts.mjs +80 -28
- package/src/plugin_browser_dom_parts.mts +94 -34
package/core/package.json
CHANGED
package/core/src/nako_ast.mts
CHANGED
|
@@ -31,6 +31,7 @@ export type NodeType = 'nop'
|
|
|
31
31
|
| 'break'
|
|
32
32
|
| 'def_test'
|
|
33
33
|
| 'let'
|
|
34
|
+
| 'let_prop' // #1793
|
|
34
35
|
| 'let_array'
|
|
35
36
|
| 'json_array'
|
|
36
37
|
| 'json_obj'
|
|
@@ -50,6 +51,7 @@ export type NodeType = 'nop'
|
|
|
50
51
|
| 'def_local_var'
|
|
51
52
|
| 'def_local_varlist'
|
|
52
53
|
| 'ref_array' // 配列参照
|
|
54
|
+
| 'ref_prop' // #1793 (プロパティ参照)
|
|
53
55
|
| 'require'
|
|
54
56
|
| 'performance_monitor'
|
|
55
57
|
| 'speed_mode'
|
package/core/src/nako_gen.mjs
CHANGED
|
@@ -464,6 +464,12 @@ export class NakoGen {
|
|
|
464
464
|
case 'let':
|
|
465
465
|
code += this.convLet(node);
|
|
466
466
|
break;
|
|
467
|
+
case 'let_prop':
|
|
468
|
+
code += this.convLetProp(node);
|
|
469
|
+
break;
|
|
470
|
+
case 'ref_prop':
|
|
471
|
+
code += this.convRefProp(node);
|
|
472
|
+
break;
|
|
467
473
|
case 'inc':
|
|
468
474
|
code += this.convInc(node);
|
|
469
475
|
break;
|
|
@@ -977,6 +983,17 @@ export class NakoGen {
|
|
|
977
983
|
}
|
|
978
984
|
return code;
|
|
979
985
|
}
|
|
986
|
+
convRefProp(node) {
|
|
987
|
+
const name = this._convGen(node.name, true);
|
|
988
|
+
const list = node.index;
|
|
989
|
+
if (!list || list.length <= 0) {
|
|
990
|
+
throw NakoSyntaxError.fromNode('プロパティがありません。', node);
|
|
991
|
+
}
|
|
992
|
+
const prop = list[0].value;
|
|
993
|
+
const code = `( (function(){ if (${name}.__getProp) { return ${name}.__getProp('${prop}', __self) } ` +
|
|
994
|
+
`else { return ${name}['${prop}'] } })() )`;
|
|
995
|
+
return code;
|
|
996
|
+
}
|
|
980
997
|
convLetArray(node) {
|
|
981
998
|
const id = this.loopId++;
|
|
982
999
|
const valueNode = node.blocks[0];
|
|
@@ -1746,6 +1763,49 @@ export class NakoGen {
|
|
|
1746
1763
|
}
|
|
1747
1764
|
return ';' + this.convLineno(node, false) + code + '\n';
|
|
1748
1765
|
}
|
|
1766
|
+
// プロパティへの代入式 (#1793)
|
|
1767
|
+
convLetProp(node) {
|
|
1768
|
+
if (!node.index || node.index.length == 0) {
|
|
1769
|
+
throw NakoSyntaxError.fromNode('代入する先のプロパティ名がありません。', node);
|
|
1770
|
+
}
|
|
1771
|
+
if (!node.blocks || node.blocks.length == 0) {
|
|
1772
|
+
throw NakoSyntaxError.fromNode('代入する値がありません。', node);
|
|
1773
|
+
}
|
|
1774
|
+
const astProp = node.index[0];
|
|
1775
|
+
const astValue = node.blocks[0];
|
|
1776
|
+
let prop = '';
|
|
1777
|
+
if (astProp) {
|
|
1778
|
+
prop = astProp.value;
|
|
1779
|
+
}
|
|
1780
|
+
else {
|
|
1781
|
+
throw NakoSyntaxError.fromNode('代入する先のプロパティ名がありません。', node);
|
|
1782
|
+
}
|
|
1783
|
+
let value = null;
|
|
1784
|
+
// 値のプログラムを生成
|
|
1785
|
+
if (astValue) {
|
|
1786
|
+
value = this._convGen(astValue, true);
|
|
1787
|
+
}
|
|
1788
|
+
else {
|
|
1789
|
+
throw NakoSyntaxError.fromNode('代入する値がありません。', node);
|
|
1790
|
+
}
|
|
1791
|
+
// 変数名
|
|
1792
|
+
const name = node.name;
|
|
1793
|
+
const res = this.findVar(name, value);
|
|
1794
|
+
let code = '/*[convLetProp]*/';
|
|
1795
|
+
// 変数が存在しないとき
|
|
1796
|
+
if (res === null) {
|
|
1797
|
+
throw NakoSyntaxError.fromNode('変数が見当たりません。', node);
|
|
1798
|
+
}
|
|
1799
|
+
// ネームスペースを削除
|
|
1800
|
+
if (prop.indexOf('__') >= 0) {
|
|
1801
|
+
prop = prop.split('__')[1];
|
|
1802
|
+
}
|
|
1803
|
+
// プロパティへの代入式を作る
|
|
1804
|
+
const propVar = `${res.js}['${prop}']`;
|
|
1805
|
+
code += `if (typeof ${res.js}.__setProp === 'function') { ${res.js}.__setProp('${prop}', ${value}, __self); } `;
|
|
1806
|
+
code += `else { ${propVar} = ${value} };`;
|
|
1807
|
+
return ';' + this.convLineno(node, false) + code + '\n';
|
|
1808
|
+
}
|
|
1749
1809
|
convDefLocalVar(node) {
|
|
1750
1810
|
const astValue = node.blocks[0];
|
|
1751
1811
|
let value = '0';
|
package/core/src/nako_gen.mts
CHANGED
|
@@ -540,6 +540,12 @@ export class NakoGen {
|
|
|
540
540
|
case 'let':
|
|
541
541
|
code += this.convLet(node as AstLet)
|
|
542
542
|
break
|
|
543
|
+
case 'let_prop':
|
|
544
|
+
code += this.convLetProp(node as AstLet)
|
|
545
|
+
break
|
|
546
|
+
case 'ref_prop':
|
|
547
|
+
code += this.convRefProp(node as AstLet)
|
|
548
|
+
break
|
|
543
549
|
case 'inc':
|
|
544
550
|
code += this.convInc(node as AstBlocks)
|
|
545
551
|
break
|
|
@@ -1053,6 +1059,19 @@ export class NakoGen {
|
|
|
1053
1059
|
return code
|
|
1054
1060
|
}
|
|
1055
1061
|
|
|
1062
|
+
convRefProp (node: Ast): string {
|
|
1063
|
+
const name = this._convGen(node.name as Ast, true)
|
|
1064
|
+
const list: Ast[] | undefined = node.index
|
|
1065
|
+
if (!list || list.length <= 0) {
|
|
1066
|
+
throw NakoSyntaxError.fromNode('プロパティがありません。', node)
|
|
1067
|
+
}
|
|
1068
|
+
const prop = (list[0] as AstStrValue).value
|
|
1069
|
+
const code =
|
|
1070
|
+
`( (function(){ if (${name}.__getProp) { return ${name}.__getProp('${prop}', __self) } ` +
|
|
1071
|
+
`else { return ${name}['${prop}'] } })() )`
|
|
1072
|
+
return code
|
|
1073
|
+
}
|
|
1074
|
+
|
|
1056
1075
|
convLetArray (node: AstLetArray): string {
|
|
1057
1076
|
const id = this.loopId++
|
|
1058
1077
|
const valueNode: Ast = node.blocks[0]
|
|
@@ -1811,6 +1830,45 @@ export class NakoGen {
|
|
|
1811
1830
|
return ';' + this.convLineno(node, false) + code + '\n'
|
|
1812
1831
|
}
|
|
1813
1832
|
|
|
1833
|
+
// プロパティへの代入式 (#1793)
|
|
1834
|
+
convLetProp(node: AstLet): string {
|
|
1835
|
+
if (!node.index || node.index.length == 0) { throw NakoSyntaxError.fromNode('代入する先のプロパティ名がありません。', node) }
|
|
1836
|
+
if (!node.blocks || node.blocks.length == 0) { throw NakoSyntaxError.fromNode('代入する値がありません。', node) }
|
|
1837
|
+
const astProp = node.index[0]
|
|
1838
|
+
const astValue = node.blocks[0]
|
|
1839
|
+
let prop = ''
|
|
1840
|
+
if (astProp) {
|
|
1841
|
+
prop = (astProp as AstStrValue).value
|
|
1842
|
+
} else {
|
|
1843
|
+
throw NakoSyntaxError.fromNode('代入する先のプロパティ名がありません。', node)
|
|
1844
|
+
}
|
|
1845
|
+
let value = null
|
|
1846
|
+
// 値のプログラムを生成
|
|
1847
|
+
if (astValue) {
|
|
1848
|
+
value = this._convGen(astValue, true)
|
|
1849
|
+
} else {
|
|
1850
|
+
throw NakoSyntaxError.fromNode('代入する値がありません。', node)
|
|
1851
|
+
}
|
|
1852
|
+
|
|
1853
|
+
// 変数名
|
|
1854
|
+
const name: string = node.name
|
|
1855
|
+
const res = this.findVar(name, value)
|
|
1856
|
+
let code = '/*[convLetProp]*/'
|
|
1857
|
+
// 変数が存在しないとき
|
|
1858
|
+
if (res === null) {
|
|
1859
|
+
throw NakoSyntaxError.fromNode('変数が見当たりません。', node)
|
|
1860
|
+
}
|
|
1861
|
+
// ネームスペースを削除
|
|
1862
|
+
if (prop.indexOf('__') >= 0) {
|
|
1863
|
+
prop = prop.split('__')[1]
|
|
1864
|
+
}
|
|
1865
|
+
// プロパティへの代入式を作る
|
|
1866
|
+
const propVar = `${res.js}['${prop}']`
|
|
1867
|
+
code += `if (typeof ${res.js}.__setProp === 'function') { ${res.js}.__setProp('${prop}', ${value}, __self); } `
|
|
1868
|
+
code += `else { ${propVar} = ${value} };`
|
|
1869
|
+
return ';' + this.convLineno(node, false) + code + '\n'
|
|
1870
|
+
}
|
|
1871
|
+
|
|
1814
1872
|
convDefLocalVar(node: AstDefVar): string {
|
|
1815
1873
|
const astValue = node.blocks[0]
|
|
1816
1874
|
let value = '0'
|
|
@@ -81,6 +81,7 @@ export const rules = [
|
|
|
81
81
|
{ name: ')', pattern: /^\)/, readJosi: true },
|
|
82
82
|
{ name: '|', pattern: /^\|/ },
|
|
83
83
|
{ name: '??', pattern: /^\?\?/ }, // 「表示」のエイリアス #1745
|
|
84
|
+
{ name: '$', pattern: /^\$/ }, // #1793 プロパティアクセス
|
|
84
85
|
{ name: 'string', pattern: /^🌿/, cbParser: src => cbString('🌿', '🌿', src) },
|
|
85
86
|
{ name: 'string_ex', pattern: /^🌴/, cbParser: src => cbString('🌴', '🌴', src) },
|
|
86
87
|
{ name: 'string_ex', pattern: /^「/, cbParser: src => cbString('「', '」', src) },
|
|
@@ -101,6 +101,7 @@ export const rules: NakoLexRule[] = [
|
|
|
101
101
|
{ name: ')', pattern: /^\)/, readJosi: true },
|
|
102
102
|
{ name: '|', pattern: /^\|/ },
|
|
103
103
|
{ name: '??', pattern: /^\?\?/ }, // 「表示」のエイリアス #1745
|
|
104
|
+
{ name: '$', pattern: /^\$/ }, // #1793 プロパティアクセス
|
|
104
105
|
{ name: 'string', pattern: /^🌿/, cbParser: src => cbString('🌿', '🌿', src) },
|
|
105
106
|
{ name: 'string_ex', pattern: /^🌴/, cbParser: src => cbString('🌴', '🌴', src) },
|
|
106
107
|
{ name: 'string_ex', pattern: /^「/, cbParser: src => cbString('「', '」', src) },
|
|
@@ -1789,6 +1789,39 @@ export class NakoParser extends NakoParserBase {
|
|
|
1789
1789
|
throw NakoSyntaxError.fromNode(`${this.nodeToStr(word, { depth: 1 }, false)}への代入文で計算式に以下の書き間違いがあります。\n${err.message}`, map);
|
|
1790
1790
|
}
|
|
1791
1791
|
}
|
|
1792
|
+
// プロパティ代入文
|
|
1793
|
+
if (this.check2(['word', '$', 'word', 'eq'])) {
|
|
1794
|
+
const word = this.peek();
|
|
1795
|
+
let threw = false;
|
|
1796
|
+
try {
|
|
1797
|
+
if (this.accept(['word', '$', 'word', 'eq', this.yCalc])) {
|
|
1798
|
+
const nameToken = this.getVarName(this.y[0]);
|
|
1799
|
+
const propToken = this.getVarName(this.y[2]);
|
|
1800
|
+
const valueToken = this.y[4];
|
|
1801
|
+
return {
|
|
1802
|
+
type: 'let_prop',
|
|
1803
|
+
name: nameToken.value,
|
|
1804
|
+
index: [propToken],
|
|
1805
|
+
blocks: [valueToken],
|
|
1806
|
+
josi: '',
|
|
1807
|
+
...map,
|
|
1808
|
+
end: this.peekSourceMap()
|
|
1809
|
+
};
|
|
1810
|
+
}
|
|
1811
|
+
else {
|
|
1812
|
+
threw = true;
|
|
1813
|
+
this.logger.debug(`${this.nodeToStr(word, { depth: 1 }, true)}への代入文で計算式に書き間違いがあります。`, word);
|
|
1814
|
+
throw NakoSyntaxError.fromNode(`${this.nodeToStr(word, { depth: 1 }, false)}への代入文で計算式に書き間違いがあります。`, map);
|
|
1815
|
+
}
|
|
1816
|
+
}
|
|
1817
|
+
catch (err) {
|
|
1818
|
+
if (threw) {
|
|
1819
|
+
throw err;
|
|
1820
|
+
}
|
|
1821
|
+
this.logger.debug(`${this.nodeToStr(word, { depth: 1 }, true)}への代入文で計算式に以下の書き間違いがあります。\n${err.message}`, word);
|
|
1822
|
+
throw NakoSyntaxError.fromNode(`${this.nodeToStr(word, { depth: 1 }, false)}への代入文で計算式に以下の書き間違いがあります。\n${err.message}`, map);
|
|
1823
|
+
}
|
|
1824
|
+
}
|
|
1792
1825
|
// let_array ?
|
|
1793
1826
|
if (this.check2(['word', '@'])) {
|
|
1794
1827
|
const la = this.yLetArrayAt(map);
|
|
@@ -2581,6 +2614,19 @@ export class NakoParser extends NakoParserBase {
|
|
|
2581
2614
|
}
|
|
2582
2615
|
return ast;
|
|
2583
2616
|
}
|
|
2617
|
+
// word$prop
|
|
2618
|
+
if (word.josi === '' && this.check2(['$', 'word'])) {
|
|
2619
|
+
this.get(); // skip '$'
|
|
2620
|
+
const prop = this.get();
|
|
2621
|
+
return {
|
|
2622
|
+
type: 'ref_prop', // プロパティ参照
|
|
2623
|
+
name: word,
|
|
2624
|
+
index: [prop],
|
|
2625
|
+
josi: prop.josi,
|
|
2626
|
+
...map,
|
|
2627
|
+
end: this.peekSourceMap()
|
|
2628
|
+
};
|
|
2629
|
+
}
|
|
2584
2630
|
return word; // Token to Ast
|
|
2585
2631
|
}
|
|
2586
2632
|
return null;
|
|
@@ -1556,6 +1556,37 @@ export class NakoParser extends NakoParserBase {
|
|
|
1556
1556
|
throw NakoSyntaxError.fromNode(`${this.nodeToStr(word, { depth: 1 }, false)}への代入文で計算式に以下の書き間違いがあります。\n${err.message}`, map)
|
|
1557
1557
|
}
|
|
1558
1558
|
}
|
|
1559
|
+
// プロパティ代入文
|
|
1560
|
+
if (this.check2(['word', '$', 'word', 'eq'])) {
|
|
1561
|
+
const word = this.peek()
|
|
1562
|
+
let threw = false
|
|
1563
|
+
try {
|
|
1564
|
+
if (this.accept(['word', '$', 'word', 'eq', this.yCalc])) {
|
|
1565
|
+
const nameToken = this.getVarName(this.y[0])
|
|
1566
|
+
const propToken = this.getVarName(this.y[2])
|
|
1567
|
+
const valueToken = this.y[4]
|
|
1568
|
+
return {
|
|
1569
|
+
type: 'let_prop',
|
|
1570
|
+
name: (nameToken as AstStrValue).value,
|
|
1571
|
+
index: [propToken],
|
|
1572
|
+
blocks: [valueToken],
|
|
1573
|
+
josi: '',
|
|
1574
|
+
...map,
|
|
1575
|
+
end: this.peekSourceMap()
|
|
1576
|
+
} as AstLet
|
|
1577
|
+
} else {
|
|
1578
|
+
threw = true
|
|
1579
|
+
this.logger.debug(`${this.nodeToStr(word, { depth: 1 }, true)}への代入文で計算式に書き間違いがあります。`, word)
|
|
1580
|
+
throw NakoSyntaxError.fromNode(`${this.nodeToStr(word, { depth: 1 }, false)}への代入文で計算式に書き間違いがあります。`, map)
|
|
1581
|
+
}
|
|
1582
|
+
} catch (err: any) {
|
|
1583
|
+
if (threw) {
|
|
1584
|
+
throw err
|
|
1585
|
+
}
|
|
1586
|
+
this.logger.debug(`${this.nodeToStr(word, { depth: 1 }, true)}への代入文で計算式に以下の書き間違いがあります。\n${err.message}`, word)
|
|
1587
|
+
throw NakoSyntaxError.fromNode(`${this.nodeToStr(word, { depth: 1 }, false)}への代入文で計算式に以下の書き間違いがあります。\n${err.message}`, map)
|
|
1588
|
+
}
|
|
1589
|
+
}
|
|
1559
1590
|
|
|
1560
1591
|
// let_array ?
|
|
1561
1592
|
if (this.check2(['word', '@'])) {
|
|
@@ -2291,6 +2322,20 @@ export class NakoParser extends NakoParserBase {
|
|
|
2291
2322
|
if (ast.index && ast.index.length === 0) { throw NakoSyntaxError.fromNode(`配列『${word.value}』アクセスで指定ミス`, word) }
|
|
2292
2323
|
return ast
|
|
2293
2324
|
}
|
|
2325
|
+
|
|
2326
|
+
// word$prop
|
|
2327
|
+
if (word.josi === '' && this.check2(['$', 'word'])) {
|
|
2328
|
+
this.get() // skip '$'
|
|
2329
|
+
const prop = this.get() as Token
|
|
2330
|
+
return {
|
|
2331
|
+
type: 'ref_prop', // プロパティ参照
|
|
2332
|
+
name: word,
|
|
2333
|
+
index: [prop as Ast],
|
|
2334
|
+
josi: prop.josi,
|
|
2335
|
+
...map,
|
|
2336
|
+
end: this.peekSourceMap()
|
|
2337
|
+
}
|
|
2338
|
+
}
|
|
2294
2339
|
return word as any // Token to Ast
|
|
2295
2340
|
}
|
|
2296
2341
|
return null
|
|
@@ -118,10 +118,15 @@ export class NakoPrepare {
|
|
|
118
118
|
// 読点は「,」に変換する (#877)
|
|
119
119
|
[0x3001, ','], // 読点 --- JSON記法で「,」と「、」を区別したいので読点は変換しないことに。(#276)
|
|
120
120
|
[0xFF0C, ','], // 読点 ',' 論文などで利用、ただし句点はドットと被るので変換しない (#735)
|
|
121
|
-
[
|
|
121
|
+
[0x2715, '*'], // ✕の絵文字 (#1781) @see https://ja.wikipedia.org/wiki/%C3%97#%E7%AC%A6%E5%8F%B7%E4%BD%8D%E7%BD%AE
|
|
122
|
+
[0x2716, '*'], // ✖の絵文字 (#1183)
|
|
123
|
+
[0x2717, '*'], // ✗の絵文字 (#1781)
|
|
124
|
+
[0x2718, '*'], // ✘の絵文字 (#1781)
|
|
125
|
+
[0x274C, '*'], // ❌の絵文字 (#1781) CROSS MARK
|
|
122
126
|
[0x2795, '+'], // +の絵文字 (#1183)
|
|
123
127
|
[0x2796, '-'], // -の絵文字 (#1183)
|
|
124
|
-
[0x2797, '÷'] // ÷の絵文字 (#1183)
|
|
128
|
+
[0x2797, '÷'], // ÷の絵文字 (#1183)
|
|
129
|
+
[0x1F7F0, '='] //🟰の絵文字(#1781)
|
|
125
130
|
]);
|
|
126
131
|
}
|
|
127
132
|
// 一文字だけ変換
|
|
@@ -134,10 +134,15 @@ export class NakoPrepare {
|
|
|
134
134
|
// 読点は「,」に変換する (#877)
|
|
135
135
|
[0x3001, ','], // 読点 --- JSON記法で「,」と「、」を区別したいので読点は変換しないことに。(#276)
|
|
136
136
|
[0xFF0C, ','], // 読点 ',' 論文などで利用、ただし句点はドットと被るので変換しない (#735)
|
|
137
|
-
[
|
|
137
|
+
[0x2715, '*'], // ✕の絵文字 (#1781) @see https://ja.wikipedia.org/wiki/%C3%97#%E7%AC%A6%E5%8F%B7%E4%BD%8D%E7%BD%AE
|
|
138
|
+
[0x2716, '*'], // ✖の絵文字 (#1183)
|
|
139
|
+
[0x2717, '*'], // ✗の絵文字 (#1781)
|
|
140
|
+
[0x2718, '*'], // ✘の絵文字 (#1781)
|
|
141
|
+
[0x274C, '*'], // ❌の絵文字 (#1781) CROSS MARK
|
|
138
142
|
[0x2795, '+'], // +の絵文字 (#1183)
|
|
139
143
|
[0x2796, '-'], // -の絵文字 (#1183)
|
|
140
|
-
[0x2797, '÷'] // ÷の絵文字 (#1183)
|
|
144
|
+
[0x2797, '÷'], // ÷の絵文字 (#1183)
|
|
145
|
+
[0x1F7F0, '='] //🟰の絵文字(#1781)
|
|
141
146
|
])
|
|
142
147
|
}
|
|
143
148
|
|
package/core/src/nako_token.mts
CHANGED
package/core/test/basic_test.mjs
CHANGED
|
@@ -372,4 +372,22 @@ describe('basic', async () => {
|
|
|
372
372
|
await cmp('constructor=10;constructorを表示', '10')
|
|
373
373
|
await cmp('super=10;superを表示', '10')
|
|
374
374
|
})
|
|
375
|
+
it('オブジェクトを手軽に設定する-通常(#1793)', async () => {
|
|
376
|
+
await cmp('A={"幅":30};A$幅=50;A$幅を表示', '50')
|
|
377
|
+
await cmp('A={"高":30};A$高さ=50;A$高さを表示', '50') // 送り仮名の省略
|
|
378
|
+
})
|
|
379
|
+
it('オブジェクトを手軽に設定する-プロパティ関数(#1793)', async () => {
|
|
380
|
+
// プロパティの値を取得して10倍にして返す
|
|
381
|
+
await cmp(
|
|
382
|
+
'『 (function(prop, sys){ return this[prop] * 10 })』をJS実行してF_GETに代入。\n' +
|
|
383
|
+
'『 (function(prop, val, sys){ this[prop] = val })』をJS実行してF_SETに代入。\n' +
|
|
384
|
+
'A={"幅": 3, "__setProp": F_SET, "__getProp": F_GET};\n' +
|
|
385
|
+
'A$幅=5; A$幅を表示', '50')
|
|
386
|
+
// 値を10倍にして格納
|
|
387
|
+
await cmp(
|
|
388
|
+
'『 (function(prop, sys){ return this[prop] })』をJS実行してF_GETに代入。\n' +
|
|
389
|
+
'『 (function(prop, val, sys){ this[prop] = val*10 })』をJS実行してF_SETに代入。\n' +
|
|
390
|
+
'A={"幅": 3, "__setProp": F_SET, "__getProp": F_GET};\n' +
|
|
391
|
+
'A$幅=5; A$幅を表示', '50')
|
|
392
|
+
})
|
|
375
393
|
})
|
package/core/test/calc_test.mjs
CHANGED
|
@@ -237,4 +237,20 @@ describe('calc_test.js', async () => {
|
|
|
237
237
|
await cmp('123456789012345678901234567890123456789n>>60nを表示', '107081695084215790682')
|
|
238
238
|
})
|
|
239
239
|
|
|
240
|
+
it('似たフォント問題:なでしこ3で「✕」で掛け算させる #1781', async () => {
|
|
241
|
+
// multiple
|
|
242
|
+
await cmp('(2*3)を表示', '6')
|
|
243
|
+
await cmp('(2✕3)を表示', '6') // 0x2715
|
|
244
|
+
await cmp('(2✖3)を表示', '6') // 0x2716
|
|
245
|
+
await cmp('(2✗3)を表示', '6') // 0x2717
|
|
246
|
+
await cmp('(2✘3)を表示', '6') // 0x2718
|
|
247
|
+
await cmp('(2❌3)を表示', '6') // 0x274C
|
|
248
|
+
// others
|
|
249
|
+
await cmp('(2➕3)を表示', '5')
|
|
250
|
+
await cmp('(20➖3)を表示', '17')
|
|
251
|
+
await cmp('(21÷3)を表示', '7')
|
|
252
|
+
await cmp('(21➗3)を表示', '7')
|
|
253
|
+
await cmp('(20➖3)を表示', '17')
|
|
254
|
+
await cmp('A🟰3;Aを表示', '3')
|
|
255
|
+
})
|
|
240
256
|
})
|
package/package.json
CHANGED
package/release/_hash.txt
CHANGED
|
@@ -144,22 +144,22 @@ wnako3webworker.js:
|
|
|
144
144
|
sha256(base64): zkHQ1vYOjoH4nffi+OulPeq/tql28XhdNuKpcaBCOKk=
|
|
145
145
|
sha512(base64): cY0Mzrpoz/uEyY1n8MeJeWdDmm9vqI7dh28wEqJGtVRfYOJvDHiYDzzlfGndOWmzZmHUK6ZAE7YaUJ7zZxiZLw==
|
|
146
146
|
version.js:
|
|
147
|
-
md5(hex):
|
|
148
|
-
sha256(hex):
|
|
149
|
-
sha256(base64):
|
|
150
|
-
sha512(base64):
|
|
147
|
+
md5(hex): d708b19fdec6ffa1962f4f1dedfb439d
|
|
148
|
+
sha256(hex): 80642546f4dba459de18f9e60b210ffe9bee44bce615a2ff50cece5b27dada56
|
|
149
|
+
sha256(base64): gGQlRvTbpFneGPnmCyEP/pvuRLzmFaL/UM7OWyfa2lY=
|
|
150
|
+
sha512(base64): lFRH/BBFDXjIbZpt1VnQ9/8Ezkcv6C+DP2AE6DUf6eTQOJ+ygugwtfofhQnMsiJAXLrXkeJU2BKGxbzNREfmOA==
|
|
151
151
|
version_main.js:
|
|
152
|
-
md5(hex):
|
|
153
|
-
sha256(hex):
|
|
154
|
-
sha256(base64):
|
|
155
|
-
sha512(base64):
|
|
152
|
+
md5(hex): d708b19fdec6ffa1962f4f1dedfb439d
|
|
153
|
+
sha256(hex): 80642546f4dba459de18f9e60b210ffe9bee44bce615a2ff50cece5b27dada56
|
|
154
|
+
sha256(base64): gGQlRvTbpFneGPnmCyEP/pvuRLzmFaL/UM7OWyfa2lY=
|
|
155
|
+
sha512(base64): lFRH/BBFDXjIbZpt1VnQ9/8Ezkcv6C+DP2AE6DUf6eTQOJ+ygugwtfofhQnMsiJAXLrXkeJU2BKGxbzNREfmOA==
|
|
156
156
|
wnako3.js:
|
|
157
|
-
md5(hex):
|
|
158
|
-
sha256(hex):
|
|
159
|
-
sha256(base64):
|
|
160
|
-
sha512(base64):
|
|
157
|
+
md5(hex): afd7e0beca390190fd467cda3298dba2
|
|
158
|
+
sha256(hex): 6f1497fa19664a28272b60391dafd7c5ad79e8e5fd19ea9d4aae37ec4688b106
|
|
159
|
+
sha256(base64): bxSX+hlmSignK2A5Ha/Xxa156OX9GeqdSq437EaIsQY=
|
|
160
|
+
sha512(base64): oEMOJ/hy8fwcssdBb6ns2r7sKH7YydaFjno6KIZik1oluaQWR6d8x4ES7N4OeUkPnjYTqgIocTzaSUDlp3lr2Q==
|
|
161
161
|
wnako3webworker.js:
|
|
162
|
-
md5(hex):
|
|
163
|
-
sha256(hex):
|
|
164
|
-
sha256(base64):
|
|
165
|
-
sha512(base64):
|
|
162
|
+
md5(hex): 99abf084a2620d7414ec52133446e91f
|
|
163
|
+
sha256(hex): 9d4d81ab046f64e39bf7ca1fa9ac359241b60ed382e92be7dcf0ed78d20af2ca
|
|
164
|
+
sha256(base64): nU2BqwRvZOOb98ofqaw1kkG2DtOC6Svn3PDteNIK8so=
|
|
165
|
+
sha512(base64): q5MQ15v2liUAGJBLcVSZWHVJF2ML5yDX3quIih0BaXk2TaqrFXx1l7HUoyBw3pBWkEhT+9sMnXc78wV/GJ4dEA==
|
package/release/_script-tags.txt
CHANGED
|
@@ -1,33 +1,33 @@
|
|
|
1
|
-
<script defer src="https://nadesi.com/v3/cdn.php?v=3.6.
|
|
2
|
-
<script defer src="https://nadesi.com/v3/cdn.php?v=3.6.
|
|
3
|
-
<script defer src="https://nadesi.com/v3/cdn.php?v=3.6.
|
|
4
|
-
<script defer src="https://nadesi.com/v3/cdn.php?v=3.6.
|
|
5
|
-
<script defer src="https://nadesi.com/v3/cdn.php?v=3.6.
|
|
6
|
-
<script defer src="https://nadesi.com/v3/cdn.php?v=3.6.
|
|
7
|
-
<script defer src="https://nadesi.com/v3/cdn.php?v=3.6.
|
|
8
|
-
<script defer src="https://nadesi.com/v3/cdn.php?v=3.6.
|
|
9
|
-
<script defer src="https://nadesi.com/v3/cdn.php?v=3.6.
|
|
10
|
-
<script defer src="https://nadesi.com/v3/cdn.php?v=3.6.
|
|
11
|
-
<script defer src="https://nadesi.com/v3/cdn.php?v=3.6.
|
|
12
|
-
<script defer src="https://nadesi.com/v3/cdn.php?v=3.6.
|
|
13
|
-
<script defer src="https://nadesi.com/v3/cdn.php?v=3.6.
|
|
14
|
-
<script defer src="https://nadesi.com/v3/cdn.php?v=3.6.
|
|
15
|
-
<script defer src="https://nadesi.com/v3/cdn.php?v=3.6.
|
|
16
|
-
<script defer src="https://nadesi.com/v3/cdn.php?v=3.6.
|
|
17
|
-
<script defer src="https://nadesi.com/v3/cdn.php?v=3.6.
|
|
18
|
-
<script defer src="https://nadesi.com/v3/cdn.php?v=3.6.
|
|
19
|
-
<script defer src="https://nadesi.com/v3/cdn.php?v=3.6.
|
|
20
|
-
<script defer src="https://nadesi.com/v3/cdn.php?v=3.6.
|
|
21
|
-
<script defer src="https://nadesi.com/v3/cdn.php?v=3.6.
|
|
22
|
-
<script defer src="https://nadesi.com/v3/cdn.php?v=3.6.
|
|
23
|
-
<script defer src="https://nadesi.com/v3/cdn.php?v=3.6.
|
|
24
|
-
<script defer src="https://nadesi.com/v3/cdn.php?v=3.6.
|
|
25
|
-
<script defer src="https://nadesi.com/v3/cdn.php?v=3.6.
|
|
26
|
-
<script defer src="https://nadesi.com/v3/cdn.php?v=3.6.
|
|
27
|
-
<script defer src="https://nadesi.com/v3/cdn.php?v=3.6.
|
|
28
|
-
<script defer src="https://nadesi.com/v3/cdn.php?v=3.6.
|
|
29
|
-
<script defer src="https://nadesi.com/v3/cdn.php?v=3.6.
|
|
30
|
-
<script defer src="https://nadesi.com/v3/cdn.php?v=3.6.
|
|
31
|
-
<script defer src="https://nadesi.com/v3/cdn.php?v=3.6.
|
|
32
|
-
<script defer src="https://nadesi.com/v3/cdn.php?v=3.6.
|
|
33
|
-
<script defer src="https://nadesi.com/v3/cdn.php?v=3.6.
|
|
1
|
+
<script defer src="https://nadesi.com/v3/cdn.php?v=3.6.27&f=release/command.json.js" integrity="sha512-rJ9Ms3FyvbYE6Nzu349h+OEPn56Ayw2JBT+gVB4CGg+wxRzGcmF+LjRDIcgLKGZv8+OtbXHpXPujLktT9+gxmw==" crossorigin="anonymous"></script>
|
|
2
|
+
<script defer src="https://nadesi.com/v3/cdn.php?v=3.6.27&f=release/core_src_nako_josi_list_mjs.js" integrity="sha512-0+LAeEfPy2Lrl+DeJMjbBIUda9Y5ttpLGy3/FW8rjSW8bN3udrALJa5V/bhjxU7mYouumV/QGN2wt3oxMCKy9g==" crossorigin="anonymous"></script>
|
|
3
|
+
<script defer src="https://nadesi.com/v3/cdn.php?v=3.6.27&f=release/core_src_nako_reserved_words_mjs.js" integrity="sha512-UzZigh2tIhgBO3+Sp1wnqKMvAGfhqSRdH2+ffmRy4+8CVNEeepddaDV0oKJ+vyvi28zQLmXeMsjRu+Frj3YlTg==" crossorigin="anonymous"></script>
|
|
4
|
+
<script defer src="https://nadesi.com/v3/cdn.php?v=3.6.27&f=release/edit_main.js" integrity="sha512-6c5sHItNnqjo1f+yNr/cjXoxeiVNNzVWTFAQ+jM5/tlpbM8Y+YorWSx9Zl5hMbCgFKx+SKxI8pNGr6AncaEBYQ==" crossorigin="anonymous"></script>
|
|
5
|
+
<script defer src="https://nadesi.com/v3/cdn.php?v=3.6.27&f=release/edit_main.js" integrity="sha512-VluJJhYbxG+I5sofn1bKqOuIqMXdCyUUM9dnSBEVAkUXUy/ENHfG6hQFTZULcHy9iNfqPHXTfWuCgyMzQ9Hxrg==" crossorigin="anonymous"></script>
|
|
6
|
+
<script defer src="https://nadesi.com/v3/cdn.php?v=3.6.27&f=release/version_main.js" integrity="sha512-KMEb25tO1BMsNxzECPwLM6bi1IIS5wX+VRN6mdzbqhtqPr7eY1K7Wwg66MpCmhrc45KoEJthR4NWyw9O7ODgLw==" crossorigin="anonymous"></script>
|
|
7
|
+
<script defer src="https://nadesi.com/v3/cdn.php?v=3.6.27&f=release/editor.js" integrity="sha512-6c5sHItNnqjo1f+yNr/cjXoxeiVNNzVWTFAQ+jM5/tlpbM8Y+YorWSx9Zl5hMbCgFKx+SKxI8pNGr6AncaEBYQ==" crossorigin="anonymous"></script>
|
|
8
|
+
<script defer src="https://nadesi.com/v3/cdn.php?v=3.6.27&f=release/nako_gen_async.js" integrity="sha512-/73lycspxJ921s+NmqaOKF58X9rCsgEZrZT4O4sW1aCe5CSXtQevIasAoGgIoL3a5RmlaghbaIVASwAgmoE3+g==" crossorigin="anonymous"></script>
|
|
9
|
+
<script defer src="https://nadesi.com/v3/cdn.php?v=3.6.27&f=release/plugin_caniuse.js" integrity="sha512-V6nOBHnhxPChu+S/LfB7elCeBk985ukLmBmkCyPk4ai5VfoJZuOIttg72PbZSxWfP5eQTrlLNajsorfwNw/vcA==" crossorigin="anonymous"></script>
|
|
10
|
+
<script defer src="https://nadesi.com/v3/cdn.php?v=3.6.27&f=release/plugin_datetime.js" integrity="sha512-ofb5jVaHjjTRoCAmHnbewc2fS8vr1oEkX/B3WoOCjYpDnZ3nnl3EDz6fdAS8CFFzGvuekCk2RFN5BuM9kX6FAg==" crossorigin="anonymous"></script>
|
|
11
|
+
<script defer src="https://nadesi.com/v3/cdn.php?v=3.6.27&f=release/plugin_kansuji.js" integrity="sha512-N+S8Th1yCiQy3q5jh0TFvlTOtrWNE82a4UJZ9O3ml3BGBYA141bpWlJR5c34dObTe1prbLJZ7v5WvV0vnDnr9A==" crossorigin="anonymous"></script>
|
|
12
|
+
<script defer src="https://nadesi.com/v3/cdn.php?v=3.6.27&f=release/plugin_keigo.js" integrity="sha512-u067+CeBvMb6+oINFY9Wz77GBk4NSxS2+k35GJ3RsFFmphJliwzwmV2ceID0gZ4mbjJ0xJHQX9WIypiyI6yfdA==" crossorigin="anonymous"></script>
|
|
13
|
+
<script defer src="https://nadesi.com/v3/cdn.php?v=3.6.27&f=release/plugin_markup.js" integrity="sha512-mEcV3CYWM6+zmuxgojP/9wbQNtkTPuPzFHo1KTG2TPaDbSfdPZCazFcNmdjJ95o7+VFfxs2Id7yB02bqSeBxNg==" crossorigin="anonymous"></script>
|
|
14
|
+
<script defer src="https://nadesi.com/v3/cdn.php?v=3.6.27&f=release/plugin_three.js" integrity="sha512-4loRkhlxZ9A9v5t3sk5VECW7T33axIVbBQgwkNdgcjk03yRqAvxut5OS4n3BBS4jnWWHOE3i0vj9qxOOp4uV3Q==" crossorigin="anonymous"></script>
|
|
15
|
+
<script defer src="https://nadesi.com/v3/cdn.php?v=3.6.27&f=release/plugin_toml.js" integrity="sha512-Z4JmOCY66VuyoD8m4dCzKttEbCTEUfqyuqlmcOhs69m/88skKcPYWXi+4W+Td5LdI3xqezn4BkN32F9ZkPzUpQ==" crossorigin="anonymous"></script>
|
|
16
|
+
<script defer src="https://nadesi.com/v3/cdn.php?v=3.6.27&f=release/plugin_turtle.js" integrity="sha512-LEewcTTM8JrZxmsVnP1ONF916UDoC1tQaYlqYNhuUnB4t1jfchtZic24rFNtNIaO6AcFsjxukV9Uj3WMefoU3Q==" crossorigin="anonymous"></script>
|
|
17
|
+
<script defer src="https://nadesi.com/v3/cdn.php?v=3.6.27&f=release/plugin_webworker.js" integrity="sha512-6UHX2dgMPRY4BuIxLXaERKaA8Wg5eK2pWy+OysU0/+gt2E15M7K5Vr8+4CQt6hylWnmzmJQJfgObIr+yjW5kPw==" crossorigin="anonymous"></script>
|
|
18
|
+
<script defer src="https://nadesi.com/v3/cdn.php?v=3.6.27&f=release/plugin_weykturtle3d.js" integrity="sha512-ONFdombPCdgdnXs7VMUAHpe8IBvTuLzSgzmERf1jEhHo4l06wDpkpRRCk3/9a1hiXRHQ+le2LZBT7XH4VA27sQ==" crossorigin="anonymous"></script>
|
|
19
|
+
<script defer src="https://nadesi.com/v3/cdn.php?v=3.6.27&f=release/plugin_caniuse.js" integrity="sha512-V6nOBHnhxPChu+S/LfB7elCeBk985ukLmBmkCyPk4ai5VfoJZuOIttg72PbZSxWfP5eQTrlLNajsorfwNw/vcA==" crossorigin="anonymous"></script>
|
|
20
|
+
<script defer src="https://nadesi.com/v3/cdn.php?v=3.6.27&f=release/plugin_datetime.js" integrity="sha512-ofb5jVaHjjTRoCAmHnbewc2fS8vr1oEkX/B3WoOCjYpDnZ3nnl3EDz6fdAS8CFFzGvuekCk2RFN5BuM9kX6FAg==" crossorigin="anonymous"></script>
|
|
21
|
+
<script defer src="https://nadesi.com/v3/cdn.php?v=3.6.27&f=release/plugin_kansuji.js" integrity="sha512-N+S8Th1yCiQy3q5jh0TFvlTOtrWNE82a4UJZ9O3ml3BGBYA141bpWlJR5c34dObTe1prbLJZ7v5WvV0vnDnr9A==" crossorigin="anonymous"></script>
|
|
22
|
+
<script defer src="https://nadesi.com/v3/cdn.php?v=3.6.27&f=release/plugin_keigo.js" integrity="sha512-u067+CeBvMb6+oINFY9Wz77GBk4NSxS2+k35GJ3RsFFmphJliwzwmV2ceID0gZ4mbjJ0xJHQX9WIypiyI6yfdA==" crossorigin="anonymous"></script>
|
|
23
|
+
<script defer src="https://nadesi.com/v3/cdn.php?v=3.6.27&f=release/plugin_markup.js" integrity="sha512-mEcV3CYWM6+zmuxgojP/9wbQNtkTPuPzFHo1KTG2TPaDbSfdPZCazFcNmdjJ95o7+VFfxs2Id7yB02bqSeBxNg==" crossorigin="anonymous"></script>
|
|
24
|
+
<script defer src="https://nadesi.com/v3/cdn.php?v=3.6.27&f=release/plugin_three.js" integrity="sha512-4loRkhlxZ9A9v5t3sk5VECW7T33axIVbBQgwkNdgcjk03yRqAvxut5OS4n3BBS4jnWWHOE3i0vj9qxOOp4uV3Q==" crossorigin="anonymous"></script>
|
|
25
|
+
<script defer src="https://nadesi.com/v3/cdn.php?v=3.6.27&f=release/plugin_turtle.js" integrity="sha512-ce8etr+HoC+UjUyXSgxJzy3+pOYhsBdt9jDzhks2H/eEPQ1gIz7M8hoeyP0223zLLZHBBzlHiL/a6mmJdoKQ+w==" crossorigin="anonymous"></script>
|
|
26
|
+
<script defer src="https://nadesi.com/v3/cdn.php?v=3.6.27&f=release/plugin_webworker.js" integrity="sha512-6UHX2dgMPRY4BuIxLXaERKaA8Wg5eK2pWy+OysU0/+gt2E15M7K5Vr8+4CQt6hylWnmzmJQJfgObIr+yjW5kPw==" crossorigin="anonymous"></script>
|
|
27
|
+
<script defer src="https://nadesi.com/v3/cdn.php?v=3.6.27&f=release/plugin_weykturtle3d.js" integrity="sha512-ONFdombPCdgdnXs7VMUAHpe8IBvTuLzSgzmERf1jEhHo4l06wDpkpRRCk3/9a1hiXRHQ+le2LZBT7XH4VA27sQ==" crossorigin="anonymous"></script>
|
|
28
|
+
<script defer src="https://nadesi.com/v3/cdn.php?v=3.6.27&f=release/wnako3.js" integrity="sha512-ZBC5fnWXr1/lcjLwXqmTj1OXfBewmzxlPqnz6ZnDhtVUY9invxAimbYuxMrgb3ZiFnopNLH7xPbgWlFJNB/jmQ==" crossorigin="anonymous"></script>
|
|
29
|
+
<script defer src="https://nadesi.com/v3/cdn.php?v=3.6.27&f=release/wnako3webworker.js" integrity="sha512-cY0Mzrpoz/uEyY1n8MeJeWdDmm9vqI7dh28wEqJGtVRfYOJvDHiYDzzlfGndOWmzZmHUK6ZAE7YaUJ7zZxiZLw==" crossorigin="anonymous"></script>
|
|
30
|
+
<script defer src="https://nadesi.com/v3/cdn.php?v=3.6.27&f=release/version.js" integrity="sha512-lFRH/BBFDXjIbZpt1VnQ9/8Ezkcv6C+DP2AE6DUf6eTQOJ+ygugwtfofhQnMsiJAXLrXkeJU2BKGxbzNREfmOA==" crossorigin="anonymous"></script>
|
|
31
|
+
<script defer src="https://nadesi.com/v3/cdn.php?v=3.6.27&f=release/version_main.js" integrity="sha512-lFRH/BBFDXjIbZpt1VnQ9/8Ezkcv6C+DP2AE6DUf6eTQOJ+ygugwtfofhQnMsiJAXLrXkeJU2BKGxbzNREfmOA==" crossorigin="anonymous"></script>
|
|
32
|
+
<script defer src="https://nadesi.com/v3/cdn.php?v=3.6.27&f=release/wnako3.js" integrity="sha512-oEMOJ/hy8fwcssdBb6ns2r7sKH7YydaFjno6KIZik1oluaQWR6d8x4ES7N4OeUkPnjYTqgIocTzaSUDlp3lr2Q==" crossorigin="anonymous"></script>
|
|
33
|
+
<script defer src="https://nadesi.com/v3/cdn.php?v=3.6.27&f=release/wnako3webworker.js" integrity="sha512-q5MQ15v2liUAGJBLcVSZWHVJF2ML5yDX3quIih0BaXk2TaqrFXx1l7HUoyBw3pBWkEhT+9sMnXc78wV/GJ4dEA==" crossorigin="anonymous"></script>
|