📄 highlight.js
字号:
/* Syntax highlighting with language autodetection. http://softwaremaniacs.org/soft/highlight/*/var hljs = new function() { var DEFAULT_LANGUAGES = ['python', 'ruby', 'perl', 'php', 'css', 'xml', 'html', 'django', 'javascript', 'java', 'cpp', 'cs', 'sql', 'ini', 'diff']; var ALL_LANGUAGES = (DEFAULT_LANGUAGES.join(',') + ',' + ['1c', 'axapta', 'delphi', 'rib', 'rsl', 'vbscript', 'profile', 'dos', 'bash', 'lisp', 'smalltalk', 'mel'].join(',')).split(','); var LANGUAGE_GROUPS = { 'xml': 'www', 'html': 'www', 'css': 'www', 'django': 'www', 'python': 'dynamic', 'perl': 'dynamic', 'php': 'dynamic', 'ruby': 'dynamic', 'cpp': 'static', 'java': 'static', 'delphi': 'static', 'cs': 'static', 'rib': 'renderman', 'rsl': 'renderman' } var LANGUAGES = {} var selected_languages = {}; function escape(value) { return value.replace(/&/gm, '&').replace(/</gm, '<').replace(/>/gm, '>'); } function contains(array, item) { if (!array) return false; for (var i = 0; i < array.length; i++) if (array[i] == item) return true; return false; } function highlight(language_name, value) { function compileSubModes(mode, language) { mode.sub_modes = []; for (var i = 0; i < mode.contains.length; i++) { for (var j = 0; j < language.modes.length; j++) { if (language.modes[j].className == mode.contains[i]) { mode.sub_modes[mode.sub_modes.length] = language.modes[j]; } } } } function subMode(lexem, mode) { if (!mode.contains) { return null; } if (!mode.sub_modes) { compileSubModes(mode, language); } for (var i = 0; i < mode.sub_modes.length; i++) { if (mode.sub_modes[i].beginRe.test(lexem)) { return mode.sub_modes[i]; } } return null; } function endOfMode(mode_index, lexem) { if (modes[mode_index].end && modes[mode_index].endRe.test(lexem)) return 1; if (modes[mode_index].endsWithParent) { var level = endOfMode(mode_index - 1, lexem); return level ? level + 1 : 0; } return 0; } function isIllegal(lexem, mode) { return mode.illegalRe && mode.illegalRe.test(lexem); } function compileTerminators(mode, language) { var terminators = []; function addTerminator(re) { if (!contains(terminators, re)) { terminators[terminators.length] = re; } } if (mode.contains) for (var i = 0; i < language.modes.length; i++) { if (contains(mode.contains, language.modes[i].className)) { addTerminator(language.modes[i].begin); } } var index = modes.length - 1; do { if (modes[index].end) { addTerminator(modes[index].end); } index--; } while (modes[index + 1].endsWithParent); if (mode.illegal) { addTerminator(mode.illegal); } var terminator_re = '(' + terminators[0]; for (var i = 0; i < terminators.length; i++) terminator_re += '|' + terminators[i]; terminator_re += ')'; return langRe(language, terminator_re); } function eatModeChunk(value, index) { var mode = modes[modes.length - 1]; if (!mode.terminators) { mode.terminators = compileTerminators(mode, language); } value = value.substr(index); var match = mode.terminators.exec(value); if (!match) return [value, '', true]; if (match.index == 0) return ['', match[0], false]; else return [value.substr(0, match.index), match[0], false]; } function keywordMatch(mode, match) { var match_str = language.case_insensitive ? match[0].toLowerCase() : match[0] for (var className in mode.keywordGroups) { if (!mode.keywordGroups.hasOwnProperty(className)) continue; var value = mode.keywordGroups[className].hasOwnProperty(match_str); if (value) return [className, value]; } return false; } function processKeywords(buffer, mode) { if (!mode.keywords || !mode.lexems) return escape(buffer); if (!mode.lexemsRe) { var lexems_re = '(' + mode.lexems[0]; for (var i = 1; i < mode.lexems.length; i++) lexems_re += '|' + mode.lexems[i]; lexems_re += ')'; mode.lexemsRe = langRe(language, lexems_re, true); } var result = ''; var last_index = 0; mode.lexemsRe.lastIndex = 0; var match = mode.lexemsRe.exec(buffer); while (match) { result += escape(buffer.substr(last_index, match.index - last_index)); keyword_match = keywordMatch(mode, match); if (keyword_match) { keyword_count += keyword_match[1]; result += '<span class="'+ keyword_match[0] +'">' + escape(match[0]) + '</span>'; } else { result += escape(match[0]); } last_index = mode.lexemsRe.lastIndex; match = mode.lexemsRe.exec(buffer); } result += escape(buffer.substr(last_index, buffer.length - last_index)); return result; } function processBuffer(buffer, mode) { if (mode.subLanguage && selected_languages[mode.subLanguage]) { var result = highlight(mode.subLanguage, buffer); keyword_count += result.keyword_count; relevance += result.relevance; return result.value; } else { return processKeywords(buffer, mode); } } function startNewMode(mode, lexem) { if (mode.returnBegin) { result += '<span class="' + mode.className + '">'; mode.buffer = ''; } else if (mode.excludeBegin) { result += escape(lexem) + '<span class="' + mode.className + '">'; mode.buffer = ''; } else { result += '<span class="' + mode.className + '">'; mode.buffer = lexem; } modes[modes.length] = mode; } function processModeInfo(buffer, lexem, end) { var current_mode = modes[modes.length - 1]; if (end) { result += processBuffer(current_mode.buffer + buffer, current_mode); return false; } var new_mode = subMode(lexem, current_mode); if (new_mode) { result += processBuffer(current_mode.buffer + buffer, current_mode); startNewMode(new_mode, lexem); relevance += new_mode.relevance; return new_mode.returnBegin; } var end_level = endOfMode(modes.length - 1, lexem); if (end_level) { if (current_mode.returnEnd) { result += processBuffer(current_mode.buffer + buffer, current_mode) + '</span>'; } else if (current_mode.excludeEnd) { result += processBuffer(current_mode.buffer + buffer, current_mode) + '</span>' + escape(lexem); } else { result += processBuffer(current_mode.buffer + buffer + lexem, current_mode) + '</span>'; } while (end_level > 1) { result += '</span>'; end_level--; modes.length--; } modes.length--; modes[modes.length - 1].buffer = ''; if (current_mode.starts) { for (var i = 0; i < language.modes.length; i++) { if (language.modes[i].className == current_mode.starts) { startNewMode(language.modes[i], ''); break; } } } return current_mode.returnEnd; } if (isIllegal(lexem, current_mode)) throw 'Illegal'; } var language = LANGUAGES[language_name]; var modes = [language.defaultMode]; var relevance = 0; var keyword_count = 0; var result = ''; try { var index = 0; language.defaultMode.buffer = ''; do { var mode_info = eatModeChunk(value, index); var return_lexem = processModeInfo(mode_info[0], mode_info[1], mode_info[2]); index += mode_info[0].length; if (!return_lexem) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -