source: node_modules/refractor/core.js@ 65b6638

main
Last change on this file since 65b6638 was d24f17c, checked in by Aleksandar Panovski <apano77@…>, 15 months ago

Initial commit

  • Property mode set to 100644
File size: 4.8 KB
Line 
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.
7var 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
18var restore = capture()
19
20ctx.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.
24var h = require('hastscript')
25var decode = require('parse-entities')
26var Prism = require('prismjs/components/prism-core')
27var markup = require('./lang/markup')
28var css = require('./lang/css')
29var clike = require('./lang/clike')
30var js = require('./lang/javascript')
31
32restore()
33
34var own = {}.hasOwnProperty
35
36// Inherit.
37function Refractor() {}
38
39Refractor.prototype = Prism
40
41// Construct.
42var refract = new Refractor()
43
44// Expose.
45module.exports = refract
46
47// Create.
48refract.highlight = highlight
49refract.register = register
50refract.alias = alias
51refract.registered = registered
52refract.listLanguages = listLanguages
53
54// Register bundled grammars.
55register(markup)
56register(css)
57register(clike)
58register(js)
59
60refract.util.encode = encode
61refract.Token.stringify = stringify
62
63function 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
74function 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
99function 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
126function 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
134function 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
151function 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
185function 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
210function encode(tokens) {
211 return tokens
212}
213
214function attributes(attrs) {
215 var key
216
217 for (key in attrs) {
218 attrs[key] = decode(attrs[key])
219 }
220
221 return attrs
222}
223
224function 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}
Note: See TracBrowser for help on using the repository browser.