/
collect-marker.wsc
77 lines (71 loc) · 2.31 KB
/
collect-marker.wsc
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
<?xml version="1.0" encoding="utf-8"?>
<?component error="false" debug="false"?>
<component>
<registration
progid="Component.MarkerCollection"
classid="{B61BABC6-54B3-48C2-883D-6055043A52B2}"/>
<public>
<method name="parse">
<parameter name="path"/>
<parameter name="encoding"/>
</method>
</public>
<object id="ado" progid="Component.Ado"/>
<script language="JScript" src="gin.js"></script>
<script language="JScript"><![CDATA[
function parse(path, encoding) {
var ret = [];
var str = ado.loadText(path, encoding);
var delimiter = '\t';
var Pre = Gin.Parser.RegExp;
Gin.OPEN = new Pre(/[\((<<\[[\{{≪〈《【〔「『]/);
Gin.CLOSE = new Pre(/[\))>>\]]\}}≫〉》】〕」』]/);
Gin.DOT = new Pre(/[..::]/);
Gin.KANJI_KANA = new Pre(/[\u3041-\u30FF\u4E00-\u9FA5]/);
Gin.STRING = new Pre(/[\x09\x20-\uD7FF\uE000-\uFFFD]+/);
Gin.CHAR = new Pre(/[\x09\x20-\uD7FF\uE000-\uFFFD]/);
Gin.S = new Pre(/[\x09\x20\u3000]/);
var gin = new Gin.Grammar({
Marker : / ( Marker0 | Marker1 | Marker2 ):marker ($STRING?):string /,
Marker0 : / $OPEN Types $CLOSE /,
Marker1 : / Types ( $CLOSE | $DOT ) ::unshift /,
Marker2 : / Symbols $KANJI_KANA:kanjikana ::unshift /,
Types : / Type Type? ::join /,
Type : / $CHAR - ( $DOT | $OPEN | $CLOSE ) /,
Symbols : / Symbol Symbol? $S? ::join /,
Symbol : / $CHAR - ( $DOT | $OPEN | $CLOSE | $KANJI_KANA ) /
}, 'Marker', Gin.SPACE);
var act = function() {
var that = {};
var _s = '';
that.marker = function(v) { return v.join(delimiter); };
that.kanjikana = function(v) { _s = v; return ''; };
that.string = function(v) { return _s + v.join(''); };
that.unshift = function(v) { v.unshift(''); return v; };
that.join = function(v) { return v.join(''); };
return that;
};
var trim = (function() {
var re = /^[\x09\x20\u3000]+|[\x09\x20\u3000]+$/g;
return function(str) {
return str.replace(re, '');
};
})();
var lines = str.split(/\n|\r\n?/);
for (var i = lines.length; i--;) {
var line = trim(lines[i]);
if (line.length === 0) {
continue;
}
var match = gin.parse(line, act());
if (!match || !match.full) {
continue;
}
var values = match.value;
values.unshift(path);
ret.push(values.join(delimiter));
}
return ret.join('\n');
}
]]></script>
</component>