📄 highlight.js
字号:
var IDENT_RE = '[a-zA-Z][a-zA-Z0-9_]*';var UNDERSCORE_IDENT_RE = '[a-zA-Z_][a-zA-Z0-9_]*';var NUMBER_RE = '\\b\\d+(\\.\\d+)?';var C_NUMBER_RE = '\\b(0x[A-Za-z0-9]+|\\d+(\\.\\d+)?)';// Common modesvar APOS_STRING_MODE = { className: 'string', begin: '\'', end: '(^|[^\\\\])\'', relevance: 0}var QUOTE_STRING_MODE = { className: 'string', begin: '"', end: '(^|[^\\\\])"', relevance: 0}var C_LINE_COMMENT_MODE = { className: 'comments', begin: '//', end: '$', relevance: 0}var C_BLOCK_COMMENT_MODE = { className: 'comments', begin: '/\\*', end: '\\*/'}var HASH_COMMENT_MODE = { className: 'comments', begin: '#', end: '$'}var C_NUMBER_MODE = { className: 'number', begin: C_NUMBER_RE, end: '^', relevance: 0}var LANGUAGES = {}var PASCAL_KEYWORDS = {'abs': 1,'addr': 1,'and': 1,'ansichar': 1,'ansistring': 1,'array': 1,'as': 1,'asm': 1,'begin': 1,'boolean': 1,'byte': 1,'cardinal': 1,'case': 1,'char': 1,'class': 1,'comp': 1,'const': 1,'constructor': 1,'currency': 1,'destructor': 1,'div': 1,'do': 1,'double': 1,'downto': 1,'else': 1,'end': 1,'except': 1,'exports': 1,'extended': 1,'false': 1,'file': 1,'finalization': 1,'finally': 1,'for': 1,'function': 1,'goto': 1,'if': 1,'implementation': 1,'in': 1,'inherited': 1,'int64': 1,'initialization': 1,'integer': 1,'interface': 1,'is': 1,'label': 1,'library': 1,'longint': 1,'longword': 1,'mod': 1,'nil': 1,'not': 1,'object': 1,'of': 1,'on': 1,'operator': 1,'or': 1,'packed': 1,'pansichar': 1,'pansistring': 1,'pchar': 1,'pcurrency': 1,'pdatetime': 1,'pextended': 1,'pint64': 1,'pointer': 1,'private': 1,'procedure': 1,'program': 1,'property': 1,'pshortstring': 1,'pstring': 1,'pvariant': 1,'pwidechar': 1,'pwidestring': 1,'protected': 1,'public': 1,'published': 1,'raise': 1,'real': 1,'real48': 1,'record': 1,'repeat': 1,'set': 1,'shl': 1,'shortint': 1,'shortstring': 1,'shr': 1,'single': 1,'smallint': 1,'string': 1,'then': 1,'threadvar': 1,'to': 1,'true': 1,'type': 1,'unit': 1,'until': 1,'uses': 1,'val': 1,'var': 1,'varirnt': 1,'while': 1,'widechar': 1,'widestring': 1,'with': 1,'word': 1,'write': 1,'writeln': 1,'xor': 1,'assign': 1,'reset': 1,'rewrite': 1,'exit': 1,'halt': 1,'break': 1,'read': 1,'readln': 1,'new': 1,'length': 1,'append': 1,'close': 1};LANGUAGES.pascal = { defaultMode: { lexems: [IDENT_RE], illegal: '("|\\$[G-Zg-z]|\\/\\*|</)', contains: ['comments', 'string', 'number', 'function', 'class'], keywords: PASCAL_KEYWORDS }, case_insensitive: true, modes: [ { className: 'comments', begin: '{', end: '}' }, { className: 'comments', begin: '\\(\\*', end: '\\*\\)', relevance: 10 }, C_LINE_COMMENT_MODE, { className: 'number', begin: NUMBER_RE, end: '^', relevance: 0 }, { className: 'string', begin: '\'', end: '\'', contains: ['quote'], relevance: 0 }, { className: 'quote', begin: '\'\'', end: '^' }, { className: 'function', begin: 'function', end: '[:;]', lexems: [IDENT_RE], keywords: {'function': 1}, contains: ['title', 'params', 'comments'], relevance: 0 }, { className: 'function', begin: '(procedure|constructor|destructor)', end: ';', lexems: [IDENT_RE], keywords: {'constructor': 1, 'destructor': 1, 'procedure': 1}, contains: ['title', 'params', 'comments'], relevance: 10 }, { className: 'title', begin: IDENT_RE, end: '^' }, { className: 'params', begin: '\\(', end: '\\)', lexems: [IDENT_RE], keywords: PASCAL_KEYWORDS, contains: ['string'] } ]};//pascal, written by matrix67.comLANGUAGES.cpp = { defaultMode: { lexems: [UNDERSCORE_IDENT_RE], illegal: '</', contains: ['comments', 'string', 'number', 'preprocessor'], keywords: {'false': 1, 'int': 1, 'float': 1, 'while': 1, 'private': 1, 'char': 1, 'catch': 1, 'export': 1, 'virtual': 1, 'operator': 1, 'sizeof': 1, 'dynamic_cast': 1, 'typedef': 1, 'const_cast': 1, 'const': 1, 'struct': 1, 'for': 1, 'static_cast': 1, 'union': 1, 'namespace': 1, 'unsigned': 1, 'long': 1, 'throw': 1, 'volatile': 1, 'static': 1, 'protected': 1, 'bool': 1, 'template': 1, 'mutable': 1, 'if': 1, 'public': 1, 'friend': 1, 'do': 1, 'return': 1, 'goto': 1, 'auto': 1, 'void': 1, 'enum': 1, 'else': 1, 'break': 1, 'new': 1, 'extern': 1, 'using': 1, 'true': 1, 'class': 1, 'asm': 1, 'case': 1, 'typeid': 1, 'short': 1, 'reinterpret_cast': 1, 'default': 1, 'double': 1, 'register': 1, 'explicit': 1, 'signed': 1, 'typename': 1, 'try': 1, 'this': 1, 'switch': 1, 'continue': 1, 'wchar_t': 1, 'inline': 1, 'delete': 1} }, modes: [ C_LINE_COMMENT_MODE, C_BLOCK_COMMENT_MODE, C_NUMBER_MODE, QUOTE_STRING_MODE, { className: 'string', begin: '\'', end: '[^\\\\]\'', illegal: '[^\\\\][^\']' }, { className: 'preprocessor', begin: '#', end: '$' } ]};//cppLANGUAGES.javascript = { defaultMode: { lexems: [UNDERSCORE_IDENT_RE], contains: ['string', 'comments', 'number', 'regexp', 'function', 'literal'], keywords: {'in': 1, 'if': 1, 'for': 1, 'while': 1, 'finally': 1, 'var': 1, 'new': 1, 'function': 1, 'do': 1, 'return': 1, 'void': 1, 'else': 1, 'break': 1, 'catch': 1, 'instanceof': 1, 'with': 1, 'throw': 1, 'case': 1, 'default': 1, 'try': 1, 'this': 1, 'switch': 1, 'continue': 1, 'typeof': 1, 'delete': 1} }, modes: [ C_LINE_COMMENT_MODE, C_BLOCK_COMMENT_MODE, C_NUMBER_MODE, { className: 'literal', begin: '\\b(true|false|null)', end: '^' }, APOS_STRING_MODE, QUOTE_STRING_MODE, { className: 'regexp', begin: '\\/[^\\/]', end: '(^|[^\\\\])\\/[gim]*' }, { className: 'function', begin: 'function ', end: '{', lexems: [UNDERSCORE_IDENT_RE], keywords: {'function': 1}, contains: ['title', 'params'] }, { className: 'title', begin: UNDERSCORE_IDENT_RE, end: '^' }, { className: 'params', begin: '\\(', end: '\\)', contains: ['string', 'comments'] } ]};//javascriptfunction langRe(language, value, global) { var mode = 'm' + (language.case_insensitive ? 'i' : '') + (global ? 'g' : ''); return new RegExp(value, mode);}//refor (var i in LANGUAGES) { var language = LANGUAGES[i]; for (var key in language.modes) { if (language.modes[key].begin) language.modes[key].beginRe = langRe(language, '^' + language.modes[key].begin); if (language.modes[key].end) language.modes[key].endRe = langRe(language, '^' + language.modes[key].end); if (language.modes[key].illegal) language.modes[key].illegalRe = langRe(language, '^(?:' + language.modes[key].illegal + ')'); language.defaultMode.illegalRe = langRe(language, '^(?:' + language.defaultMode.illegal + ')'); }//for}//forvar selected_languages = {};function Highlighter(language_name, value) { currentMode = function(){ return modes[modes.length - 1]; }//currentMode function subMode(lexem) { if (!currentMode().contains) return null; for (var key in language.modes) if (contains(currentMode().contains, language.modes[key].className) && language.modes[key].beginRe.test(lexem)) return language.modes[key]; return null; }//subMode 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; }//if return 0; }//endOfMode function isIllegal(lexem) { if (!currentMode().illegalRe) return false; return currentMode().illegalRe.test(lexem); }//isIllegal function eatModeChunk(value, index) { if (!currentMode().terminators) { var terminators = []; if (currentMode().contains) for (var key in language.modes) { if (contains(currentMode().contains, language.modes[key].className) && !contains(terminators, language.modes[key].begin)) terminators[terminators.length] = language.modes[key].begin; }//for var mode_index = modes.length - 1; do { if (modes[mode_index].end && !contains(terminators, modes[mode_index].end)) terminators[terminators.length] = modes[mode_index].end; mode_index--; } while (modes[mode_index + 1].endsWithParent); if (currentMode().illegal) if (!contains(terminators, currentMode().illegal)) terminators[terminators.length] = currentMode().illegal; var terminator_re = '(' + terminators[0]; for (var i = 0; i < terminators.length; i++) terminator_re += '|' + terminators[i]; terminator_re += ')'; currentMode().terminators = langRe(language, terminator_re); }//if value = value.substr(index); var match = currentMode().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]; }//eatModeChunk function escape(value) { return value.replace(/&/gm, '&').replace(/</gm, '<').replace(/>/gm, '>'); }//escape function processKeywords(buffer) { var mode = currentMode(); if (!mode.keywords || !mode.lexems) return escape(buffer); if (!mode.lexemsRe) { var lexems = []; for (var key in mode.lexems) if (!contains(lexems, mode.lexems[key])) lexems[lexems.length] = mode.lexems[key]; var lexems_re = '(' + lexems[0]; for (var i = 1; i < lexems.length; i++) lexems_re += '|' + lexems[i]; lexems_re += ')'; mode.lexemsRe = langRe(language, lexems_re, true); }//if 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)); if (mode.keywords[language.case_insensitive ? match[0].toLowerCase() : match[0]]) { keyword_count++; result += '<span class="keyword">' + escape(match[0]) + '</span>'; } else { result += escape(match[0]); }//if last_index = mode.lexemsRe.lastIndex; match = mode.lexemsRe.exec(buffer); }//while result += escape(buffer.substr(last_index, buffer.length - last_index)); return result; }//processKeywords function processModeInfo(buffer, lexem, end) { if (end) { result += processKeywords(currentMode().buffer + buffer); return; }//if if (isIllegal(lexem)) throw 'Illegal'; var new_mode = subMode(lexem); if (new_mode) { currentMode().buffer += buffer; result += processKeywords(currentMode().buffer); if (new_mode.excludeBegin) { result += lexem + '<span class="' + new_mode.className + '">'; new_mode.buffer = ''; } else { result += '<span class="' + new_mode.className + '">'; new_mode.buffer = lexem; }//if modes[modes.length] = new_mode; relevance += currentMode().relevance != undefined ? currentMode().relevance : 1; return; }//if var end_level = endOfMode(modes.length - 1, lexem); if (end_level) { currentMode().buffer += buffer; if (currentMode().excludeEnd) { result += processKeywords(currentMode().buffer) + '</span>' + lexem; } else { result += processKeywords(currentMode().buffer + lexem) + '</span>'; } while (end_level > 1) { result += '</span>'; end_level--; modes.length--; }//while modes.length--; currentMode().buffer = ''; return; }//if }//processModeInfo function highlight(value) { var index = 0; language.defaultMode.buffer = ''; for (var mode_info = eatModeChunk(value, index); index < value.length; mode_info = eatModeChunk(value, index)) { processModeInfo(mode_info[0], mode_info[1], mode_info[2]); index += mode_info[0].length + mode_info[1].length; }//for if(modes.length > 1) throw 'Illegal'; }//highlight this.language_name = language_name; var language = LANGUAGES[language_name]; var modes = [language.defaultMode]; var relevance = 0; var keyword_count = 0; var result = ''; try { highlight(value); this.relevance = relevance; this.keyword_count = keyword_count; this.result = result; } catch (e) { if (e == 'Illegal') { this.relevance = 0; this.keyword_count = 0; this.result = escape(value); } else { throw e; }//if }//try}//Highlighterfunction contains(array, item) { if (!array) return false; for (var key in array) if (array[key] == item) return true; return false;}//containsfunction blockText(block) { var result = ''; for (var i = 0; i < block.childNodes.length; i++) if (block.childNodes[i].nodeType == 3) result += block.childNodes[i].nodeValue; else if (block.childNodes[i].nodeName == 'BR') result += '\n'; else throw 'Complex markup'; return result;}//blockTextfunction initHighlight(block) { if (block.className.search(/\bno\-highlight\b/) != -1) return; try { blockText(block); } catch (e) { if (e == 'Complex markup') return; }//try var classes = block.className.split(/\s+/); for (var i = 0; i < classes.length; i++) { if (LANGUAGES[classes[i]]) { highlightLanguage(block, classes[i]); return; }//if }//for}//initHighlightfunction highlightLanguage(block, language) { var highlight = new Highlighter(language, blockText(block)); // See these 4 lines? This is IE's notion of "block.innerHTML = result". Love this browser :-/ var container = document.createElement('div'); container.innerHTML = '<pre><code class="' + block.className + '">' + highlight.result + '</code></pre>'; var environment = block.parentNode.parentNode; environment.replaceChild(container.firstChild, block.parentNode);}//highlightLanguagefunction initHighlighting() { if (initHighlighting.called) return; initHighlighting.called = true; if (arguments.length) { for (var i = 0; i < arguments.length; i++) { if (LANGUAGES[arguments[i]]) { selected_languages[arguments[i]] = LANGUAGES[arguments[i]]; }//if }//for } else selected_languages = LANGUAGES; var pres = document.getElementsByTagName('pre'); for (var i = 0; i < pres.length; i++) { if (pres[i].firstChild && pres[i].firstChild.nodeName == 'CODE') initHighlight(pres[i].firstChild); }//for}//initHighlightingfunction initHighlightingOnLoad() { var original_arguments = arguments; var handler = function(){initHighlighting.apply(null, original_arguments)}; if (window.addEventListener) { window.addEventListener('DOMContentLoaded', handler, false); window.addEventListener('load', handler, false); } else if (window.attachEvent) window.attachEvent('onload', handler); else window.onload = handler;}//initHighlightingOnLoad
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -