-
Notifications
You must be signed in to change notification settings - Fork 3.7k
Open
Labels
enhancementAn enhancement or new featureAn enhancement or new featuregood first issueShould be easier for first time contributorsShould be easier for first time contributorshelp welcomeCould use help from communityCould use help from communityparser
Description
Related #2212.
I'm not sure this belongs in core yet, and I don't necessarily want a hard or soft Prism dependency. I suppose perhaps you could also pass Prism into the function itself though so it's late binding?
Caveats
- Using custom parsers is still private API since the
EmitterAPI is public yet. Hence the__emitTokensname of the property. - See private __emitTokens API #3620
What needs to be done
- Figure out where this goes, how to package it, etc.
- Write a comprehensive
prismTypeToScopefunction
Example Usage
To replace our JavaScript support with Prism's:
import Prism from 'prismjs'
const prismJS = fromPrism(Prism.languages.javascript)
hljs.registerLanguage("javascript", prismJS)Code
function prismTypeToScope(name) {
// very poor results, must be improved
return name;
}
function prismTokensToEmitter(tokens, emitter) {
tokens.forEach(token => {
if (typeof(token) === "string") {
emitter.addText(token)
} else if (token.type) {
let scope = prismTypeToScope(token.type)
if (typeof(token.content) === "string") {
emitter.addKeyword(token.content, scope)
} else { // array of tokens
emitter.openNode(scope)
prismTokensToEmitter(token.content, emitter)
emitter.closeNode()
}
}
})
}
function prismParserWrapper(code, emitter) {
const tokens = Prism.tokenize(code, this._prism)
prismTokensToEmitter(tokens, emitter)
}
function fromPrism(prismGrammar) {
return function(hljs) {
let self = {}
Object.assign(self, {
_prism: prismGrammar,
__emitTokens: prismParserWrapper.bind(self)
})
return self
}
}Metadata
Metadata
Assignees
Labels
enhancementAn enhancement or new featureAn enhancement or new featuregood first issueShould be easier for first time contributorsShould be easier for first time contributorshelp welcomeCould use help from communityCould use help from communityparser