-
Notifications
You must be signed in to change notification settings - Fork 1
/
marki.context.ts
113 lines (81 loc) · 2.62 KB
/
marki.context.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
import * as marked from 'marked';
import * as _ from 'lodash';
export default class MarkiContext {
source: string; // markdown source
html?: string; // compiled html
private tokens?: Array<Token>; // original tokens
private filteredTokens?: Array<Token>; // filtered tokens
private needHandleTokens ?: Array<Token>;// non-handled tokens
private handledTokens?: Array<Token>; // handled tokens
markiOptions?: MarkiOptions; // marki options
codeFilters?: Array<CodeFilter>;
codeHandlers?: Array<CodeHandler>;
constructor(options?: MarkiOptions) {
let $this = this;
$this.markiOptions = options || {};
$this.codeFilters = [];
$this.codeHandlers = [];
// intern level marked object
$this.initTokens();
}
private initTokens() {
let $this = this;
$this.tokens = [];
$this.needHandleTokens = [];
$this.handledTokens = [];
$this.filteredTokens = [];
}
private handleTokens(source: string) {
let $this = this;
let lexer = new marked.Lexer();
$this.tokens = lexer.lex(source);
$this.doCodeFilter();
$this.doHandleCustomizeCodeType();
}
private doCodeFilter() {
let $this = this;
_.each($this.codeFilters, function (needFilteredCode) {
let {language} = needFilteredCode;
let needFilterTokenPredict = {
type: 'code',
lang: language
};
let needFilterTokens = _.filter($this.tokens, needFilterTokenPredict);
$this.filteredTokens = $this.filteredTokens.concat(needFilterTokens);
_.each(needFilterTokens, function (needFilterToken) {
_.remove($this.tokens, needFilterToken);
});
if (!_.isUndefined(needFilteredCode.handle) && needFilteredCode.handle) {
$this.needHandleTokens = $this.needHandleTokens.concat(needFilterTokens);
}
});
}
private doHandleCustomizeCodeType() {
// perform handle
let $this = this;
let groupByLanguageCodeHandlers = _.groupBy($this.codeHandlers,function (handler) {
return handler.language;
});
_.each($this.needHandleTokens,function (token) {
});
}
/* export level functions */
public addCodeFilters(filterCode: CodeFilter) {
let $this = this;
$this.codeFilters.push(filterCode);
}
public addCodeHandlers(language: string, handlerFn: Function) {
let $this = this;
$this.codeHandlers.push({
language: language,
handler: handlerFn
});
}
compile(source: string) {
let $this = this;
$this.source = source;
$this.handleTokens(source);
$this.html = marked.parser($this.tokens);
return $this.html;
}
}