/
parser.ts
93 lines (78 loc) · 2.02 KB
/
parser.ts
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
import * as flatten from 'lodash.flatten';
import {Registry} from './registry';
export type Field = { label?: string; text: string };
export type ParsedLine = (Field | string)[];
export interface Parser {
parse(line: string): ParsedLine;
}
export var registry = new Registry<Parser>('parser');
export class RegexpParser implements Parser {
re: RegExp;
constructor(arg: string = '\\s+') {
this.re = new RegExp(`(${arg})`);
}
parse(line: string) {
return line.split(this.re).map((part: string, index: number) => {
if (index % 2 === 0) {
return { text: part };
} else {
return part;
}
});
}
}
export class WholeParser implements Parser {
parse(line: string) {
return [ { text: line } ];
}
}
export class LTSVParser implements Parser {
parse(line: string) {
return flatten(line.split(/(\t)/).map((part: string) => {
if (part === '\t') {
return part;
}
let m = /^([0-9A-Za-z_.-]+):(.*)$/.exec(part);
if (!m) {
return part
}
return [ `${m[1]}:`, { label: m[1], text: m[2] } ];
}));
}
}
export class ApacheLogParser implements Parser {
parse(line: string) {
let m = /^(\d+\.\d+\.\d+\.\d+) (\S+) (\S+) \[(.+?)\] "(.+?)" (\d\d\d) (\d+)( "(.+?)" "(.+?)")?$/.exec(line);
if (!m) {
return [line];
}
let parts = [
{ label: 'remote', text: m[1] },
' ',
{ label: 'logname', text: m[2] },
' ',
{ label: 'user', text: m[3] },
' [',
{ label: 'time', text: m[4] },
'] ',
{ label: 'request', text: m[5] },
' ',
{ label: 'status', text: m[6] },
' ',
{ label: 'size', text: m[7] }
];
if (m[8]) {
parts.push(
' ',
{ label: 'referer', text: m[9] },
' ',
{ label: 'ua', text: m[10] }
);
}
return parts;
}
}
registry.register('regexp', RegexpParser);
registry.register('line', WholeParser);
registry.register('ltsv', LTSVParser);
registry.register('apache', ApacheLogParser);