knowledgebase_law/node_modules/refractor/core.js

243 lines
4.8 KiB
JavaScript
Raw Normal View History

2025-04-11 23:47:09 +08:00
'use strict'
/* global window, self */
// istanbul ignore next - Don't allow Prism to run on page load in browser or
// to start messaging from workers.
var ctx =
typeof globalThis === 'object'
? globalThis
: typeof self === 'object'
? self
: typeof window === 'object'
? window
: typeof global === 'object'
? global
: {}
var restore = capture()
ctx.Prism = {manual: true, disableWorkerMessageHandler: true}
// Load all stuff in `prism.js` itself, except for `prism-file-highlight.js`.
// The wrapped non-leaky grammars are loaded instead of Prisms originals.
var h = require('hastscript')
var decode = require('parse-entities')
var Prism = require('prismjs/components/prism-core')
var markup = require('./lang/markup')
var css = require('./lang/css')
var clike = require('./lang/clike')
var js = require('./lang/javascript')
restore()
var own = {}.hasOwnProperty
// Inherit.
function Refractor() {}
Refractor.prototype = Prism
// Construct.
var refract = new Refractor()
// Expose.
module.exports = refract
// Create.
refract.highlight = highlight
refract.register = register
refract.alias = alias
refract.registered = registered
refract.listLanguages = listLanguages
// Register bundled grammars.
register(markup)
register(css)
register(clike)
register(js)
refract.util.encode = encode
refract.Token.stringify = stringify
function register(grammar) {
if (typeof grammar !== 'function' || !grammar.displayName) {
throw new Error('Expected `function` for `grammar`, got `' + grammar + '`')
}
// Do not duplicate registrations.
if (refract.languages[grammar.displayName] === undefined) {
grammar(refract)
}
}
function alias(name, alias) {
var languages = refract.languages
var map = name
var key
var list
var length
var index
if (alias) {
map = {}
map[name] = alias
}
for (key in map) {
list = map[key]
list = typeof list === 'string' ? [list] : list
length = list.length
index = -1
while (++index < length) {
languages[list[index]] = languages[key]
}
}
}
function highlight(value, name) {
var sup = Prism.highlight
var grammar
if (typeof value !== 'string') {
throw new Error('Expected `string` for `value`, got `' + value + '`')
}
// `name` is a grammar object.
if (refract.util.type(name) === 'Object') {
grammar = name
name = null
} else {
if (typeof name !== 'string') {
throw new Error('Expected `string` for `name`, got `' + name + '`')
}
if (own.call(refract.languages, name)) {
grammar = refract.languages[name]
} else {
throw new Error('Unknown language: `' + name + '` is not registered')
}
}
return sup.call(this, value, grammar, name)
}
function registered(language) {
if (typeof language !== 'string') {
throw new Error('Expected `string` for `language`, got `' + language + '`')
}
return own.call(refract.languages, language)
}
function listLanguages() {
var languages = refract.languages
var list = []
var language
for (language in languages) {
if (
own.call(languages, language) &&
typeof languages[language] === 'object'
) {
list.push(language)
}
}
return list
}
function stringify(value, language, parent) {
var env
if (typeof value === 'string') {
return {type: 'text', value: value}
}
if (refract.util.type(value) === 'Array') {
return stringifyAll(value, language)
}
env = {
type: value.type,
content: refract.Token.stringify(value.content, language, parent),
tag: 'span',
classes: ['token', value.type],
attributes: {},
language: language,
parent: parent
}
if (value.alias) {
env.classes = env.classes.concat(value.alias)
}
refract.hooks.run('wrap', env)
return h(
env.tag + '.' + env.classes.join('.'),
attributes(env.attributes),
env.content
)
}
function stringifyAll(values, language) {
var result = []
var length = values.length
var index = -1
var value
while (++index < length) {
value = values[index]
if (value !== '' && value !== null && value !== undefined) {
result.push(value)
}
}
index = -1
length = result.length
while (++index < length) {
value = result[index]
result[index] = refract.Token.stringify(value, language, result)
}
return result
}
function encode(tokens) {
return tokens
}
function attributes(attrs) {
var key
for (key in attrs) {
attrs[key] = decode(attrs[key])
}
return attrs
}
function capture() {
var defined = 'Prism' in ctx
/* istanbul ignore next */
var current = defined ? ctx.Prism : undefined
return restore
function restore() {
/* istanbul ignore else - Clean leaks after Prism. */
if (defined) {
ctx.Prism = current
} else {
delete ctx.Prism
}
defined = undefined
current = undefined
}
}