Skip to content

Commit 74f2820

Browse files
LingDong-Lingdong Huang
authored andcommitted
arr lib & macro
1 parent a893f3d commit 74f2820

File tree

8 files changed

+520
-11
lines changed

8 files changed

+520
-11
lines changed

examples/macro.wy

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
或云「「書「甲」焉」」。
2+
蓋謂「「吾有一言。曰「甲」。書之」」。
3+
4+
書「「問天地好在」」焉。
5+
6+
注曰「「書「「問天地好在」」焉。」」
7+
疏曰「「凡居「「」」與『』中之宏。不予展開」」
8+
9+
吾嘗觀「「列經」」之書。方悟「遍施」「篩剔」「左併」之義。
10+
11+
12+
吾有一術。名之曰「加一」。欲行是術。必先得一數曰「甲」。是術曰。
13+
加一於「甲」。乃得矣。
14+
是謂「加一」之術也。
15+
16+
吾有一術。名之曰「比三」。欲行是術。必先得一數曰「甲」。是術曰。
17+
若「甲」大於三者乃得陽。若非乃得陰也。
18+
是謂「比三」之術也。
19+
20+
吾有一術。名之曰「相加」。欲行是術。必先得二數曰「甲」曰「乙」。是術曰。
21+
加「甲」以「乙」。乃得矣。
22+
是謂「相加」之術也。
23+
24+
25+
吾有一列。名之曰「某列」。充「某列」以一以二以三以四以五以六。
26+
27+
28+
施「遍施」於「加一」於「某列」。書之。
29+
30+
凡「某列」皆「加一」其上者。書之。
31+
32+
33+
施「篩剔」於「比三」於「某列」。書之。
34+
35+
唯「某列」中得「比三」者。書之。
36+
37+
38+
施「左併」於「相加」於零於「某列」。書之。
39+
40+
併「某列」於零以「相加」者。書之。
41+
42+
43+
施「左併」於「相加」於零。名之曰「求和」。
44+
45+
施「求和」於「某列」。書之。

lib/列經.wy

Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
或云「「凡「甲」皆「乙」其上者」」。
2+
蓋謂「「施「遍施」於「乙」於「甲」」」
3+
4+
或云「「唯「甲」中得「乙」者」」
5+
蓋謂「「施「篩剔」於「乙」於「甲」」」
6+
7+
或云「「併「甲」於「乙」以「丙」者」」
8+
蓋謂「「施「左併」於「丙」於「乙」於「甲」」」
9+
10+
11+
今有一術。名之曰「遍施」。欲行是術。必先得一術。曰「甲」。一列。曰「乙」。乃行是術曰。
12+
吾有一列。名之曰「丙」。
13+
凡「乙」中之「丁」。
14+
施「甲」於「丁」。充「丙」以其也。
15+
乃得「丙」。
16+
是謂「遍施」之術也。
17+
18+
19+
今有一術。名之曰「篩剔」。欲行是術。必先得一術。曰「甲」。一列。曰「乙」。乃行是術曰。
20+
吾有一列。名之曰「丙」。
21+
凡「乙」中之「丁」。
22+
施「甲」於「丁」。
23+
若其者。充「丙」以「丁」也。
24+
云云。
25+
乃得「丙」。
26+
是謂「篩剔」之術也。
27+
28+
29+
今有一術。名之曰「左併」。欲行是術。必先得一術。曰「甲」。一物。曰「乙」。一列。曰「丙」。乃行是術曰。
30+
吾有一物曰「乙」。名之曰「丁」。
31+
凡「丙」中之「戊」。
32+
施「甲」於「丁」於「戊」。
33+
昔之「丁」者。今其是矣。
34+
云云。
35+
乃得「丁」。
36+
是謂「左併」之術也。
37+
38+
39+
今有一術。名之曰「右併」。欲行是術。必先得一術。曰「甲」。一物。曰「乙」。一列。曰「丙」。乃行是術曰。
40+
吾有一物曰「乙」。名之曰「丁」。
41+
夫「丙」之長。名之曰「戊」。
42+
恆為是。若「戊」小於一者乃止也。
43+
夫「丙」之「戊」。夫「丁」。取二以施「甲」。
44+
昔之「丁」者。今其是矣。
45+
減「戊」以一。昔之「戊」者。今其是矣。云云。
46+
乃得「丁」。
47+
是謂「右併」之術也。
48+
49+
50+
今有一術。名之曰「排序」。欲行是術。必先得一術。曰「甲」。一列。曰「乙」。乃行是術曰。
51+
52+
若「乙」之長不大於一者。乃得「乙」也。
53+
吾有三列。名之曰「首」。曰「頷」。曰「尾」。
54+
55+
夫「乙」之一。名之曰「乙一」。
56+
充「頷」以「乙一」。
57+
夫「乙」之其餘。名之曰「乙餘」。
58+
59+
凡「乙餘」中之「丁」。
60+
施「甲」於「丁」於「甲一」。
61+
若其小於零者。
62+
充「首」以「丁」。
63+
若非。
64+
充「尾」以「丁」
65+
也。
66+
云云。
67+
施「快排」於「首」。昔之「首」者。今其是矣。
68+
施「快排」於「尾」。昔之「尾」者。今其是矣。
69+
70+
銜「首」以「頷」以「尾」。名之曰「丙」。
71+
乃得「丙」。
72+
73+
是謂「排序」之術也。
74+
75+
76+
今有一術。名之曰「倒序」。欲行是術。必先得一列。曰「甲」。乃行是術曰。
77+
吾有一列。名之曰「乙」。
78+
夫「甲」之長。名之曰「戊」。
79+
恆為是。若「戊」小於一者乃止也。
80+
夫「甲」之「戊」。充「乙」以其。
81+
減「戊」以一。昔之「戊」者。今其是矣。云云。
82+
乃得「乙」。
83+
是謂「倒序」之術也。
84+
85+
86+
今有一術。名之曰「擷取」。欲行是術。必先得一列。曰「甲」。二數。曰「乙」曰「丙」。乃行是術曰。
87+
吾有一列。名之曰「丁」。
88+
吾有一數。曰「乙」。名之曰「戊」。
89+
若「丙」小於零者。夫「甲」之長。加其以「丙」。昔之「丙」者。今其是矣。
90+
91+
恆為是。若「戊」大於「丙」者乃止也。
92+
夫「甲」之「戊」。充「丁」以其。
93+
加「戊」以一。昔之「戊」者。今其是矣。云云。
94+
乃得「丙」。
95+
96+
是謂「擷取」之術也。
97+
98+
99+
今有一術。名之曰「製列」。欲行是術。必先得一數。曰「甲」。一術。曰「乙」。一列。曰「丙」。乃行是術曰。
100+
吾有一列。名之曰「丁」。
101+
吾有一數曰一。名之曰「戊」。
102+
103+
恆為是。若「戊」大於「甲」者乃止也。
104+
施「乙」於「戊」。充「丁」以其。
105+
加「戊」以一。昔之「戊」者。今其是矣。云云。
106+
乃得「丁」。
107+
是謂「製列」之術也。
108+
109+
110+
今有一術。名之曰「索一」。欲行是術。必先得一物。曰「甲」。一列。曰「乙」。乃行是術曰。
111+
吾有一數曰一。名之曰「戊」。
112+
恆為是。若「戊」大於「甲」之長者乃止也。
113+
若「乙」等於「甲」之「戊」者。乃得「戊」也。
114+
加「戊」以一。昔之「戊」者。今其是矣。云云。
115+
乃得負一。
116+
是謂「索一」之術也。
117+
118+
119+

site/ide.html

Lines changed: 160 additions & 3 deletions
Large diffs are not rendered by default.

src/keywords.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,9 @@ var KEYWORDS_DEFINE = {
9696
不知何禍歟: ["try", "catchall"],
9797
乃作罷: ["try", "end"],
9898

99+
或云: ["macro", "from"],
100+
蓋謂: ["macro", "to"],
101+
99102
注曰: ["comment"],
100103
疏曰: ["comment"],
101104
批曰: ["comment"]

src/macro.js

Lines changed: 157 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,157 @@
1+
function extractMacros(lang, txt, { lib, reader }) {
2+
function getImports() {
3+
var imps = [];
4+
for (var i = 0; i < txt.length; i++) {
5+
if (txt[i] == "吾" && txt[i + 1] == "嘗" && txt[i + 2] == "觀") {
6+
var imp = txt
7+
.slice(i + 3)
8+
.split(/[]/g)[0]
9+
.replace(/[]/g, "");
10+
imps.push(imp);
11+
}
12+
}
13+
return imps;
14+
}
15+
function getMacros() {
16+
var macs = [];
17+
var qlvl = 0;
18+
for (var i = 0; i < txt.length; i++) {
19+
if (txt[i] == "「") {
20+
qlvl++;
21+
} else if (txt[i] == "」") {
22+
qlvl--;
23+
} else if (txt[i] == "『") {
24+
qlvl += 2;
25+
} else if (txt[i] == "』") {
26+
qlvl -= 2;
27+
}
28+
if (qlvl != 0) {
29+
continue;
30+
}
31+
if (txt[i] == "或" && txt[i + 1] == "云") {
32+
function grabLit() {
33+
var lvl = 0;
34+
var s = "";
35+
while (true) {
36+
if (txt[j] == "「") {
37+
lvl++;
38+
} else if (txt[j] == "」") {
39+
lvl--;
40+
} else if (txt[j] == "『") {
41+
lvl += 2;
42+
} else if (txt[j] == "』") {
43+
lvl -= 2;
44+
}
45+
s += txt[j];
46+
j++;
47+
if (lvl == 0) {
48+
break;
49+
}
50+
if (j >= txt.length) {
51+
return s;
52+
}
53+
}
54+
return s;
55+
}
56+
var j = i + 2;
57+
var s0 = grabLit();
58+
while (!(txt[j] == "蓋" && txt[j + 1] == "謂")) {
59+
j++;
60+
if (j >= txt.length) {
61+
return macs;
62+
}
63+
}
64+
j += 2;
65+
var s1 = grabLit();
66+
67+
function stripQuotes(s) {
68+
if (s[0] == "「") {
69+
s = s.slice(2);
70+
} else {
71+
s = s.slice(1);
72+
}
73+
if (s[s.length - 1] == "」") {
74+
s = s.slice(0, -2);
75+
} else {
76+
s = s.slice(0, -1);
77+
}
78+
return s;
79+
}
80+
s0 = stripQuotes(s0);
81+
s1 = stripQuotes(s1);
82+
var ins = s0.match(/[]/g);
83+
var ous = s1.match(/[]/g);
84+
85+
for (var k = 0; k < ous.length; k++) {
86+
var ii = ins.indexOf(ous[k]);
87+
s1 = s1.replace(new RegExp(ous[k], "g"), `\$${ii + 1}`);
88+
}
89+
s0 = s0.replace(/[]/g, "(.*?)");
90+
macs.push([s0, s1]);
91+
i = j;
92+
}
93+
}
94+
return macs;
95+
}
96+
var imports = getImports();
97+
var macros = getMacros();
98+
for (var i = 0; i < imports.length; i++) {
99+
var isrc;
100+
if (imports[i] in lib[lang]) {
101+
isrc = lib[lang][imports[i]];
102+
} else if (imports[i] in lib) {
103+
isrc = lib[imports[i]];
104+
} else {
105+
isrc = reader(imports[i]);
106+
}
107+
macros = macros.concat(extractMacros(lang, isrc, { lib, reader }));
108+
}
109+
return macros;
110+
}
111+
112+
function expandMacros(txt, macros) {
113+
function calclmask(ntxt) {
114+
var lmask = [];
115+
var qlvl = 0;
116+
for (var i = 0; i < ntxt.length; i++) {
117+
if (ntxt[i] == "「") {
118+
qlvl++;
119+
} else if (ntxt[i] == "」") {
120+
qlvl--;
121+
} else if (ntxt[i] == "『") {
122+
qlvl += 2;
123+
} else if (ntxt[i] == "』") {
124+
qlvl -= 2;
125+
}
126+
lmask.push(qlvl > 0);
127+
}
128+
return lmask;
129+
}
130+
for (var i = 0; i < macros.length; i++) {
131+
function doit(ntxt) {
132+
var lmask = calclmask(ntxt);
133+
var re = new RegExp(macros[i][0]);
134+
var idx = ntxt.search(re);
135+
if (idx == -1) {
136+
return ntxt;
137+
}
138+
if (lmask[idx]) {
139+
// console.log("refused to expand macro inside string")
140+
var nxtend = idx;
141+
while (lmask[nxtend] == true && nxtend < lmask.length) {
142+
nxtend++;
143+
}
144+
nxtend++;
145+
ntxt = ntxt.slice(0, nxtend) + doit(ntxt.slice(nxtend));
146+
} else {
147+
ntxt = doit(ntxt.replace(re, macros[i][1]));
148+
}
149+
return ntxt;
150+
}
151+
txt = doit(txt);
152+
}
153+
return txt;
154+
}
155+
try {
156+
module.exports = { extractMacros, expandMacros };
157+
} catch (e) {}

0 commit comments

Comments
 (0)