Skip to content

Commit 5cbac51

Browse files
committed
(enh) make emitter a beta config option
- make emitter configurable - mark this API as beta/private for now - make rendering HTML a responsibility of the emitter (though it can of course delegate) That wraps emitting/rendering up nicely into a single object.
1 parent 1b820c0 commit 5cbac51

File tree

2 files changed

+21
-7
lines changed

2 files changed

+21
-7
lines changed

src/highlight.js

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ https://highlightjs.org/
55

66
import deepFreeze from './vendor/deep_freeze';
77
import TokenTreeEmitter from './lib/token_tree';
8-
import HTMLRenderer from './lib/html_renderer';
98
import * as regex from './lib/regex';
109
import * as utils from './lib/utils';
1110
import * as MODES from './lib/modes';
@@ -44,7 +43,10 @@ const HLJS = function(hljs) {
4443
classPrefix: 'hljs-',
4544
tabReplace: null,
4645
useBR: false,
47-
languages: undefined
46+
languages: undefined,
47+
// beta configuration options, subject to change, welcome to discuss
48+
// https://github.com/highlightjs/highlight.js/issues/1086
49+
__emitter: TokenTreeEmitter
4850
};
4951

5052
/* Utility functions */
@@ -322,7 +324,7 @@ const HLJS = function(hljs) {
322324
var top = continuation || language;
323325
var continuations = {}; // keep continuations for sub-languages
324326
var result;
325-
var emitter = new TokenTreeEmitter();
327+
var emitter = new options.__emitter(options);
326328
processContinuations();
327329
var mode_buffer = '';
328330
var relevance = 0;
@@ -341,7 +343,7 @@ const HLJS = function(hljs) {
341343
processLexeme(codeToHighlight.substr(index));
342344
emitter.closeAllNodes();
343345
emitter.finalize();
344-
result = new HTMLRenderer(emitter, options).value();
346+
result = emitter.toHTML();
345347

346348
return {
347349
relevance: relevance,
@@ -395,7 +397,7 @@ const HLJS = function(hljs) {
395397
languageSubset = languageSubset || options.languages || Object.keys(languages);
396398
var result = {
397399
relevance: 0,
398-
emitter: new TokenTreeEmitter(),
400+
emitter: new options.__emitter(options),
399401
value: escape(code)
400402
};
401403
var second_best = result;

src/lib/token_tree.js

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import HTMLRenderer from './html_renderer';
2+
13
class TokenTree {
24
constructor() {
35
this.rootNode = { children: [] };
@@ -68,17 +70,22 @@ class TokenTree {
6870
Currently this is all private API, but this is the minimal API necessary
6971
that an Emitter must implement to fully support the parser.
7072
71-
API:
73+
Minimal interface:
7274
7375
- addKeyword(text, kind)
7476
- addText(text)
7577
- addSublanguage(emitter, subLangaugeName)
7678
- finalize()
79+
- openNode(kind)
80+
- closeNode()
81+
- closeAllNodes()
82+
- toHTML()
7783
7884
*/
7985
export default class TokenTreeEmitter extends TokenTree {
80-
constructor() {
86+
constructor(options) {
8187
super();
88+
this.options = options;
8289
}
8390

8491
addKeyword(text, kind) {
@@ -102,6 +109,11 @@ export default class TokenTreeEmitter extends TokenTree {
102109
this.add(node);
103110
}
104111

112+
toHTML() {
113+
let renderer = new HTMLRenderer(this, this.options);
114+
return renderer.value();
115+
}
116+
105117
finalize() {
106118
return;
107119
}

0 commit comments

Comments
 (0)