Frequently Asked Questions, with a few Questions I want people to Frequently Ask.
Prism works fine in Opera. However, this page might sometimes appear to not be working in Opera, due to the theme switcher triggering an Opera bug. This will be fixed soon.
It is true that to correctly handle every possible case of syntax found in the wild, one would need to write a full-blown parser. However, in most web applications and websites a small error margin is usually acceptable and a rare highlighting failure is not the end of the world. A syntax highlighter based on regular expressions might only be accurate 99% of the time (the actual percentage is just a guess), but in exchange for the small error margin, it offers some very important benefits:
For this reason, most syntax highlighters on the web and on desktop, are powered by regular expressions. This includes the internal syntax highlighters used by popular native applications like Espresso and Sublime Text, at the time of writing. Of course, not every regex-powered syntax highlighter is created equal. The number and type of failures can be vastly different, depending on the exact algorithm used. Prism’s known failures are documented in the Examples section.
Web Workers are good for preventing syntax highlighting of really large code blocks from blocking the main UI thread. In most cases, you will want to highlight reasonably sized chunks of code, and this will not be needed. Furthermore, using Web Workers is actually slower than synchronously highlighting, due to the overhead of creating and terminating the Worker. It just appears faster in these cases because it doesn’t block the main thread. In addition, since Web Workers operate on files instead of objects, plugins that hook on core parts of Prism (e.g. modify language definitions) will not work unless included in the same file (using the builder in the Download page will protect you from this pitfall). Lastly, Web Workers cannot interact with the DOM and most other APIs (e.g. the console), so they are notoriously hard to debug.
Because it would complicate the code a lot, although it’s not a crucial feature for most people. If it’s very important to you, you can use the Keep Markup plugin.
There is a number of ways around it. You can always break the block of code into multiple parts, and wrap the HTML around it (or just use a .highlight
class).
You can see an example of this in action at the “Basic usage” section of the homepage.
Another way around the limitation is to use the Line Highlght plugin, to highlight and link to specific lines and/or line ranges.
Every token that is highlighted gets two classes: token
and a class with the token type (e.g. comment
).
You can find the different types of tokens either by looking at the keys of the object defining the language or by running this snippet in the console:
function printTokens(o, prefix) { for (var i in o) { console.log((prefix? prefix + ' > ' : '') + i); if (o[i].inside) printTokens(o[i].inside, (prefix? prefix + ' > ' : '') + i); } };
Then you can use the function for every language you want to examine. For example, markup:
printTokens(Prism.languages.markup);
which outputs:
comment prolog doctype script script > tag script > tag > tag script > tag > tag > punctuation script > tag > tag > namespace script > tag > attr-value script > tag > attr-value > punctuation script > tag > punctuation script > tag > attr-name script > tag > attr-name > namespace script > rest style style > tag style > tag > tag style > tag > tag > punctuation style > tag > tag > namespace style > tag > attr-value style > tag > attr-value > punctuation style > tag > punctuation style > tag > attr-name style > tag > attr-name > namespace style > rest cdata tag tag > tag tag > tag > punctuation tag > tag > namespace tag > attr-value tag > attr-value > punctuation tag > punctuation tag > attr-name tag > attr-name > namespace entity
Just use a descendant selector, that includes the language class. The default prism.css
does this, to have different colors for
JavaScript strings (which are very common) and CSS strings (which are relatively rare). Here’s that code, simplified to illustrate the technique:
.token.string {
color: #690;
}
.language-css .token.string,
.style .token.string {
color: #a67f59;
}
Abbreviated language classes (e.g. lang-css
) will be converted to their extended forms, so you don’t need to account for them.
The same technique can be used to differentiate XML tag namespaces from attribute namespaces:
.tag > .token.namespace {
color: #b37298;
}
.attr-name > .token.namespace {
color: #ab6;
}