/
ArgdownTreeWalker.ts
115 lines (115 loc) · 2.83 KB
/
ArgdownTreeWalker.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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
import { EventEmitter } from "eventemitter3";
import {
IAstNode,
IRuleNode,
ITokenNode,
isRuleNode,
isTokenNode
} from "./model/model";
import { IArgdownLogger } from "./IArgdownLogger";
import { IArgdownRequest, IArgdownResponse } from "./index";
export interface IAstNodeHandler {
(
request: IArgdownRequest,
response: IArgdownResponse,
node: IAstNode,
parentNode: IRuleNode | null,
childIndex: number | null,
logger: IArgdownLogger
): void;
}
/**
* Interface for listeners of [rule.name]Entry and [rule.name]Exit events emitted by [[ArgdownTreeWalker]]
*
* @param request the request should contain the input and all configuration settings
*
* @param response the response should contain any data produced or transformed by plugins
*
* @param logger an application-wide logger that should be used instead of `console.log()`
*/
export interface IRuleNodeHandler {
(
request: IArgdownRequest,
response: IArgdownResponse,
node: IRuleNode,
parentNode: IRuleNode | null,
childIndex: number | null,
logger: IArgdownLogger
): void;
}
/**
* Interface for listeners of [token.tokenType.tokenName] events emitted by [[ArgdownTreeWalker]]
*/
export interface ITokenNodeHandler {
(
request: IArgdownRequest,
response: IArgdownResponse,
token: ITokenNode,
parentNode: IRuleNode | null,
childIndex: number | null,
logger: IArgdownLogger
): void;
}
/**
* Event emitter that visits every node in an Argdown Ast structure
* and emits events for every rule entered and exited
* and every token visited.
*/
export class ArgdownTreeWalker extends EventEmitter {
walk(
request: IArgdownRequest,
response: IArgdownResponse,
logger: IArgdownLogger
): void {
if (response.ast) {
this.visitNode(request, response, response.ast, null, null, logger);
}
}
private visitNode: IAstNodeHandler = (
request,
response,
node,
parentNode,
childIndex,
logger
) => {
if (node) {
if (isRuleNode(node)) {
this.emit(
node.name + "Entry",
request,
response,
node,
parentNode,
childIndex,
logger
);
if (node.children && node.children.length > 0) {
for (var i = 0; i < node.children.length; i++) {
let child = node.children[i];
this.visitNode(request, response, child, node, i, logger);
}
}
this.emit(
node.name + "Exit",
request,
response,
node,
parentNode,
childIndex,
logger
);
} else if (isTokenNode(node)) {
this.emit(
node.tokenType!.tokenName!,
request,
response,
node,
parentNode,
childIndex,
logger
);
}
}
};
}