Son CV dans un terminal web en Javascript!
https://terminal-cv.gregandev.fr
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
163 lines
3.0 KiB
163 lines
3.0 KiB
'use strict'
|
|
|
|
var chalk = require('chalk')
|
|
var lowlight = require('lowlight/lib/core.js')
|
|
|
|
var high = lowlight.highlight
|
|
var auto = lowlight.highlightAuto
|
|
|
|
// Inherit.
|
|
function Lowlight() {}
|
|
|
|
Lowlight.prototype = lowlight
|
|
|
|
var emphasize = new Lowlight()
|
|
|
|
// Expose.
|
|
module.exports = emphasize
|
|
|
|
emphasize.highlight = highlight
|
|
emphasize.highlightAuto = highlightAuto
|
|
|
|
// Default style sheet.
|
|
var defaultSheet = {
|
|
comment: chalk.gray,
|
|
quote: chalk.gray,
|
|
|
|
keyword: chalk.green,
|
|
'selector-tag': chalk.green,
|
|
addition: chalk.green,
|
|
|
|
number: chalk.cyan,
|
|
string: chalk.cyan,
|
|
'meta meta-string': chalk.cyan,
|
|
literal: chalk.cyan,
|
|
doctag: chalk.cyan,
|
|
regexp: chalk.cyan,
|
|
|
|
title: chalk.blue,
|
|
section: chalk.blue,
|
|
name: chalk.blue,
|
|
'selector-id': chalk.blue,
|
|
'selector-class': chalk.blue,
|
|
|
|
attribute: chalk.yellow,
|
|
attr: chalk.yellow,
|
|
variable: chalk.yellow,
|
|
'template-variable': chalk.yellow,
|
|
'class title': chalk.yellow,
|
|
type: chalk.yellow,
|
|
|
|
symbol: chalk.magenta,
|
|
bullet: chalk.magenta,
|
|
subst: chalk.magenta,
|
|
meta: chalk.magenta,
|
|
'meta keyword': chalk.magenta,
|
|
'selector-attr': chalk.magenta,
|
|
'selector-pseudo': chalk.magenta,
|
|
link: chalk.magenta,
|
|
|
|
/* eslint-disable camelcase */
|
|
built_in: chalk.red,
|
|
/* eslint-enable camelcase */
|
|
deletion: chalk.red,
|
|
|
|
emphasis: chalk.italic,
|
|
strong: chalk.bold,
|
|
formula: chalk.inverse
|
|
}
|
|
|
|
// Highlight `value` as `language`.
|
|
function highlight(language, value, sheet) {
|
|
var result = high.call(this, language, value)
|
|
result.value = all(sheet || defaultSheet, result.value)
|
|
return result
|
|
}
|
|
|
|
// Highlight `value` and guess its syntax.
|
|
function highlightAuto(value, options) {
|
|
var result
|
|
var sheet
|
|
var config
|
|
|
|
if (options) {
|
|
if (options.subset) {
|
|
sheet = options.sheet
|
|
config = {subset: options.subset}
|
|
} else {
|
|
sheet = options
|
|
}
|
|
}
|
|
|
|
if (!sheet) {
|
|
sheet = defaultSheet
|
|
}
|
|
|
|
result = auto.call(this, value, config)
|
|
|
|
result.value = all(sheet, result.value)
|
|
|
|
if (result.secondBest) {
|
|
result.secondBest.value = all(sheet, result.secondBest.value)
|
|
}
|
|
|
|
return result
|
|
}
|
|
|
|
// Visit one `node`.
|
|
function visit(sheet, node) {
|
|
var name = (node.properties || {}).className
|
|
var scoped = {}
|
|
var key
|
|
var parts
|
|
var color
|
|
var style
|
|
var content
|
|
|
|
// Always just one class.
|
|
name = name ? name[0].replace(/hljs-/, '') : ''
|
|
|
|
for (key in sheet) {
|
|
parts = key.split(' ')
|
|
color = sheet[key]
|
|
|
|
if (parts[0] === name) {
|
|
if (parts.length === 1) {
|
|
style = color
|
|
} else {
|
|
scoped[parts.slice(1).join(' ')] = color
|
|
}
|
|
} else {
|
|
scoped[key] = color
|
|
}
|
|
}
|
|
|
|
content = ''
|
|
|
|
if ('value' in node) {
|
|
content = node.value
|
|
}
|
|
|
|
if ('children' in node) {
|
|
content = all(scoped, node.children)
|
|
}
|
|
|
|
if (style) {
|
|
content = style(content)
|
|
}
|
|
|
|
return content
|
|
}
|
|
|
|
// Visit children in `node`.
|
|
function all(sheet, nodes) {
|
|
var result = []
|
|
var length = nodes.length
|
|
var index = -1
|
|
|
|
while (++index < length) {
|
|
result.push(visit(sheet, nodes[index]))
|
|
}
|
|
|
|
return result.join('')
|
|
}
|
|
|