all files / src/ Lowlight.js

93.1% Statements 27/29
85% Branches 17/20
66.67% Functions 2/3
93.1% Lines 27/29
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 78 79 80 81                                                                                                           
'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) {
  Eif (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'}
 
  Iif (props.inline) {
    codeProps.style = {display: 'inline'}
  }
 
  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