[d24f17c] | 1 | 'use strict'
|
---|
| 2 |
|
---|
| 3 | /* global window, self */
|
---|
| 4 |
|
---|
| 5 | // istanbul ignore next - Don't allow Prism to run on page load in browser or
|
---|
| 6 | // to start messaging from workers.
|
---|
| 7 | var ctx =
|
---|
| 8 | typeof globalThis === 'object'
|
---|
| 9 | ? globalThis
|
---|
| 10 | : typeof self === 'object'
|
---|
| 11 | ? self
|
---|
| 12 | : typeof window === 'object'
|
---|
| 13 | ? window
|
---|
| 14 | : typeof global === 'object'
|
---|
| 15 | ? global
|
---|
| 16 | : {}
|
---|
| 17 |
|
---|
| 18 | var restore = capture()
|
---|
| 19 |
|
---|
| 20 | ctx.Prism = {manual: true, disableWorkerMessageHandler: true}
|
---|
| 21 |
|
---|
| 22 | // Load all stuff in `prism.js` itself, except for `prism-file-highlight.js`.
|
---|
| 23 | // The wrapped non-leaky grammars are loaded instead of Prism’s originals.
|
---|
| 24 | var h = require('hastscript')
|
---|
| 25 | var decode = require('parse-entities')
|
---|
| 26 | var Prism = require('prismjs/components/prism-core')
|
---|
| 27 | var markup = require('./lang/markup')
|
---|
| 28 | var css = require('./lang/css')
|
---|
| 29 | var clike = require('./lang/clike')
|
---|
| 30 | var js = require('./lang/javascript')
|
---|
| 31 |
|
---|
| 32 | restore()
|
---|
| 33 |
|
---|
| 34 | var own = {}.hasOwnProperty
|
---|
| 35 |
|
---|
| 36 | // Inherit.
|
---|
| 37 | function Refractor() {}
|
---|
| 38 |
|
---|
| 39 | Refractor.prototype = Prism
|
---|
| 40 |
|
---|
| 41 | // Construct.
|
---|
| 42 | var refract = new Refractor()
|
---|
| 43 |
|
---|
| 44 | // Expose.
|
---|
| 45 | module.exports = refract
|
---|
| 46 |
|
---|
| 47 | // Create.
|
---|
| 48 | refract.highlight = highlight
|
---|
| 49 | refract.register = register
|
---|
| 50 | refract.alias = alias
|
---|
| 51 | refract.registered = registered
|
---|
| 52 | refract.listLanguages = listLanguages
|
---|
| 53 |
|
---|
| 54 | // Register bundled grammars.
|
---|
| 55 | register(markup)
|
---|
| 56 | register(css)
|
---|
| 57 | register(clike)
|
---|
| 58 | register(js)
|
---|
| 59 |
|
---|
| 60 | refract.util.encode = encode
|
---|
| 61 | refract.Token.stringify = stringify
|
---|
| 62 |
|
---|
| 63 | function register(grammar) {
|
---|
| 64 | if (typeof grammar !== 'function' || !grammar.displayName) {
|
---|
| 65 | throw new Error('Expected `function` for `grammar`, got `' + grammar + '`')
|
---|
| 66 | }
|
---|
| 67 |
|
---|
| 68 | // Do not duplicate registrations.
|
---|
| 69 | if (refract.languages[grammar.displayName] === undefined) {
|
---|
| 70 | grammar(refract)
|
---|
| 71 | }
|
---|
| 72 | }
|
---|
| 73 |
|
---|
| 74 | function alias(name, alias) {
|
---|
| 75 | var languages = refract.languages
|
---|
| 76 | var map = name
|
---|
| 77 | var key
|
---|
| 78 | var list
|
---|
| 79 | var length
|
---|
| 80 | var index
|
---|
| 81 |
|
---|
| 82 | if (alias) {
|
---|
| 83 | map = {}
|
---|
| 84 | map[name] = alias
|
---|
| 85 | }
|
---|
| 86 |
|
---|
| 87 | for (key in map) {
|
---|
| 88 | list = map[key]
|
---|
| 89 | list = typeof list === 'string' ? [list] : list
|
---|
| 90 | length = list.length
|
---|
| 91 | index = -1
|
---|
| 92 |
|
---|
| 93 | while (++index < length) {
|
---|
| 94 | languages[list[index]] = languages[key]
|
---|
| 95 | }
|
---|
| 96 | }
|
---|
| 97 | }
|
---|
| 98 |
|
---|
| 99 | function highlight(value, name) {
|
---|
| 100 | var sup = Prism.highlight
|
---|
| 101 | var grammar
|
---|
| 102 |
|
---|
| 103 | if (typeof value !== 'string') {
|
---|
| 104 | throw new Error('Expected `string` for `value`, got `' + value + '`')
|
---|
| 105 | }
|
---|
| 106 |
|
---|
| 107 | // `name` is a grammar object.
|
---|
| 108 | if (refract.util.type(name) === 'Object') {
|
---|
| 109 | grammar = name
|
---|
| 110 | name = null
|
---|
| 111 | } else {
|
---|
| 112 | if (typeof name !== 'string') {
|
---|
| 113 | throw new Error('Expected `string` for `name`, got `' + name + '`')
|
---|
| 114 | }
|
---|
| 115 |
|
---|
| 116 | if (own.call(refract.languages, name)) {
|
---|
| 117 | grammar = refract.languages[name]
|
---|
| 118 | } else {
|
---|
| 119 | throw new Error('Unknown language: `' + name + '` is not registered')
|
---|
| 120 | }
|
---|
| 121 | }
|
---|
| 122 |
|
---|
| 123 | return sup.call(this, value, grammar, name)
|
---|
| 124 | }
|
---|
| 125 |
|
---|
| 126 | function registered(language) {
|
---|
| 127 | if (typeof language !== 'string') {
|
---|
| 128 | throw new Error('Expected `string` for `language`, got `' + language + '`')
|
---|
| 129 | }
|
---|
| 130 |
|
---|
| 131 | return own.call(refract.languages, language)
|
---|
| 132 | }
|
---|
| 133 |
|
---|
| 134 | function listLanguages() {
|
---|
| 135 | var languages = refract.languages
|
---|
| 136 | var list = []
|
---|
| 137 | var language
|
---|
| 138 |
|
---|
| 139 | for (language in languages) {
|
---|
| 140 | if (
|
---|
| 141 | own.call(languages, language) &&
|
---|
| 142 | typeof languages[language] === 'object'
|
---|
| 143 | ) {
|
---|
| 144 | list.push(language)
|
---|
| 145 | }
|
---|
| 146 | }
|
---|
| 147 |
|
---|
| 148 | return list
|
---|
| 149 | }
|
---|
| 150 |
|
---|
| 151 | function stringify(value, language, parent) {
|
---|
| 152 | var env
|
---|
| 153 |
|
---|
| 154 | if (typeof value === 'string') {
|
---|
| 155 | return {type: 'text', value: value}
|
---|
| 156 | }
|
---|
| 157 |
|
---|
| 158 | if (refract.util.type(value) === 'Array') {
|
---|
| 159 | return stringifyAll(value, language)
|
---|
| 160 | }
|
---|
| 161 |
|
---|
| 162 | env = {
|
---|
| 163 | type: value.type,
|
---|
| 164 | content: refract.Token.stringify(value.content, language, parent),
|
---|
| 165 | tag: 'span',
|
---|
| 166 | classes: ['token', value.type],
|
---|
| 167 | attributes: {},
|
---|
| 168 | language: language,
|
---|
| 169 | parent: parent
|
---|
| 170 | }
|
---|
| 171 |
|
---|
| 172 | if (value.alias) {
|
---|
| 173 | env.classes = env.classes.concat(value.alias)
|
---|
| 174 | }
|
---|
| 175 |
|
---|
| 176 | refract.hooks.run('wrap', env)
|
---|
| 177 |
|
---|
| 178 | return h(
|
---|
| 179 | env.tag + '.' + env.classes.join('.'),
|
---|
| 180 | attributes(env.attributes),
|
---|
| 181 | env.content
|
---|
| 182 | )
|
---|
| 183 | }
|
---|
| 184 |
|
---|
| 185 | function stringifyAll(values, language) {
|
---|
| 186 | var result = []
|
---|
| 187 | var length = values.length
|
---|
| 188 | var index = -1
|
---|
| 189 | var value
|
---|
| 190 |
|
---|
| 191 | while (++index < length) {
|
---|
| 192 | value = values[index]
|
---|
| 193 |
|
---|
| 194 | if (value !== '' && value !== null && value !== undefined) {
|
---|
| 195 | result.push(value)
|
---|
| 196 | }
|
---|
| 197 | }
|
---|
| 198 |
|
---|
| 199 | index = -1
|
---|
| 200 | length = result.length
|
---|
| 201 |
|
---|
| 202 | while (++index < length) {
|
---|
| 203 | value = result[index]
|
---|
| 204 | result[index] = refract.Token.stringify(value, language, result)
|
---|
| 205 | }
|
---|
| 206 |
|
---|
| 207 | return result
|
---|
| 208 | }
|
---|
| 209 |
|
---|
| 210 | function encode(tokens) {
|
---|
| 211 | return tokens
|
---|
| 212 | }
|
---|
| 213 |
|
---|
| 214 | function attributes(attrs) {
|
---|
| 215 | var key
|
---|
| 216 |
|
---|
| 217 | for (key in attrs) {
|
---|
| 218 | attrs[key] = decode(attrs[key])
|
---|
| 219 | }
|
---|
| 220 |
|
---|
| 221 | return attrs
|
---|
| 222 | }
|
---|
| 223 |
|
---|
| 224 | function capture() {
|
---|
| 225 | var defined = 'Prism' in ctx
|
---|
| 226 | /* istanbul ignore next */
|
---|
| 227 | var current = defined ? ctx.Prism : undefined
|
---|
| 228 |
|
---|
| 229 | return restore
|
---|
| 230 |
|
---|
| 231 | function restore() {
|
---|
| 232 | /* istanbul ignore else - Clean leaks after Prism. */
|
---|
| 233 | if (defined) {
|
---|
| 234 | ctx.Prism = current
|
---|
| 235 | } else {
|
---|
| 236 | delete ctx.Prism
|
---|
| 237 | }
|
---|
| 238 |
|
---|
| 239 | defined = undefined
|
---|
| 240 | current = undefined
|
---|
| 241 | }
|
---|
| 242 | }
|
---|