/
Lowlight.js
77 lines (63 loc) · 1.99 KB
/
Lowlight.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
'use strict'
var React = require('react')
var PropTypes = require('prop-types')
var low = require('lowlight/lib/core')
var mapChildren = require('./mapChildren')
var addMarkers = require('./addMarkers')
var h = React.createElement
var registeredLanguages = 0
function Lowlight (props) {
if (process.env.NODE_ENV !== 'production') {
if (!props.language && registeredLanguages === 0) {
console.warn(
'No language definitions seems to be registered, ' +
'did you forget to call `Lowlight.registerLanguage`?'
)
}
}
var result = props.language
? low.highlight(props.language, props.value, {prefix: props.prefix})
: low.highlightAuto(props.value, {prefix: props.prefix, subset: props.subset})
var codeProps = result.language ? {className: 'hljs ' + result.language} : {className: 'hljs'}
if (props.inline) {
codeProps.style = {display: 'inline'}
codeProps.className = props.className
}
var ast = result.value
if (props.markers && props.markers.length > 0) {
ast = addMarkers(ast, {prefix: props.prefix, markers: props.markers})
}
var value = ast.length === 0 ? props.value : ast.map(mapChildren.depth(0))
var code = h('code', codeProps, value)
return props.inline ? code : h('pre', {className: props.className}, code)
}
Lowlight.propTypes = {
className: PropTypes.string,
inline: PropTypes.bool,
language: PropTypes.string,
prefix: PropTypes.string,
subset: PropTypes.arrayOf(PropTypes.string),
value: PropTypes.string.isRequired,
markers: PropTypes.arrayOf(
PropTypes.oneOfType([
PropTypes.number,
PropTypes.shape({
line: PropTypes.number.isRequired,
className: PropTypes.string
})
])
)
}
Lowlight.defaultProps = {
className: 'lowlight',
inline: false,
prefix: 'hljs-'
}
Lowlight.registerLanguage = function () {
registeredLanguages++
low.registerLanguage.apply(low, arguments)
}
Lowlight.hasLanguage = function (lang) {
return !!low.getLanguage(lang)
}
module.exports = Lowlight