diff --git a/README.md b/README.md
index de06a7b..a7ae414 100644
--- a/README.md
+++ b/README.md
@@ -33,5 +33,6 @@ Used libraries
--------------
- [Parsedown](https://github.com/erusev/parsedown/) - PHP markdown parser
+- [highlight.js](https://highlightjs.org/) - JavaScript syntax highlighter
Slim wiki is inspired by [Wikitten](https://github.com/victorstanciu/Wikitten).
diff --git a/src/.bowerrc b/src/.bowerrc
new file mode 100644
index 0000000..c680848
--- /dev/null
+++ b/src/.bowerrc
@@ -0,0 +1,3 @@
+{
+ "directory": "client/libs"
+}
diff --git a/src/Gruntfile.js b/src/Gruntfile.js
index 5c79826..f773320 100644
--- a/src/Gruntfile.js
+++ b/src/Gruntfile.js
@@ -10,7 +10,7 @@ module.exports = function (grunt) {
'less',
'useminPrepare',
'concat',
- //'uglify', // TODO: uncomment if there is JavaScript
+ 'uglify',
'cssmin',
'usemin'
]);
@@ -43,7 +43,7 @@ module.exports = function (grunt) {
dist: {
files: (function () {
var files = {};
- files[dist + '/client/css/style.css'] = 'client/less/style.less';
+ files['.tmp/app-view.css'] = 'client/less/app-view.less';
return files;
})()
}
diff --git a/src/articles/cheat-sheets/Markdown_cheat_sheet.md b/src/articles/cheat-sheets/Markdown_cheat_sheet.md
index 9c3253c..a6f12af 100644
--- a/src/articles/cheat-sheets/Markdown_cheat_sheet.md
+++ b/src/articles/cheat-sheets/Markdown_cheat_sheet.md
@@ -42,16 +42,25 @@ Numbered lists:
And now some code:
// Code is just text indented a bit
- which(is_easy) to_remember();
+ which(isEasy) toRemember();
~~~
// Un-indented code blocks work too
-if (this_is_more_code == true && !indented) {
+if (thisIsMoreCode == true && !indented) {
// tild wrapped code blocks, also not indented
}
~~~
+Backticks and language selection for syntax highlighting work too:
+
+```xml
+
+
..
blocks on a page.
+ */
+ function initHighlighting() {
+ if (initHighlighting.called)
+ return;
+ initHighlighting.called = true;
+
+ var blocks = document.querySelectorAll('pre code');
+ Array.prototype.forEach.call(blocks, highlightBlock);
+ }
+
+ /*
+ Attaches highlighting to the page load event.
+ */
+ function initHighlightingOnLoad() {
+ addEventListener('DOMContentLoaded', initHighlighting, false);
+ addEventListener('load', initHighlighting, false);
+ }
+
+ var languages = {};
+ var aliases = {};
+
+ function registerLanguage(name, language) {
+ var lang = languages[name] = language(hljs);
+ if (lang.aliases) {
+ lang.aliases.forEach(function(alias) {aliases[alias] = name;});
+ }
+ }
+
+ function listLanguages() {
+ return Object.keys(languages);
+ }
+
+ function getLanguage(name) {
+ name = (name || '').toLowerCase();
+ return languages[name] || languages[aliases[name]];
+ }
+
+ /* Interface definition */
+
+ hljs.highlight = highlight;
+ hljs.highlightAuto = highlightAuto;
+ hljs.fixMarkup = fixMarkup;
+ hljs.highlightBlock = highlightBlock;
+ hljs.configure = configure;
+ hljs.initHighlighting = initHighlighting;
+ hljs.initHighlightingOnLoad = initHighlightingOnLoad;
+ hljs.registerLanguage = registerLanguage;
+ hljs.listLanguages = listLanguages;
+ hljs.getLanguage = getLanguage;
+ hljs.inherit = inherit;
+
+ // Common regexps
+ hljs.IDENT_RE = '[a-zA-Z]\\w*';
+ hljs.UNDERSCORE_IDENT_RE = '[a-zA-Z_]\\w*';
+ hljs.NUMBER_RE = '\\b\\d+(\\.\\d+)?';
+ hljs.C_NUMBER_RE = '(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)'; // 0x..., 0..., decimal, float
+ hljs.BINARY_NUMBER_RE = '\\b(0b[01]+)'; // 0b...
+ hljs.RE_STARTERS_RE = '!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~';
+
+ // Common modes
+ hljs.BACKSLASH_ESCAPE = {
+ begin: '\\\\[\\s\\S]', relevance: 0
+ };
+ hljs.APOS_STRING_MODE = {
+ className: 'string',
+ begin: '\'', end: '\'',
+ illegal: '\\n',
+ contains: [hljs.BACKSLASH_ESCAPE]
+ };
+ hljs.QUOTE_STRING_MODE = {
+ className: 'string',
+ begin: '"', end: '"',
+ illegal: '\\n',
+ contains: [hljs.BACKSLASH_ESCAPE]
+ };
+ hljs.PHRASAL_WORDS_MODE = {
+ begin: /\b(a|an|the|are|I|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|like)\b/
+ };
+ hljs.COMMENT = function (begin, end, inherits) {
+ var mode = hljs.inherit(
+ {
+ className: 'comment',
+ begin: begin, end: end,
+ contains: []
+ },
+ inherits || {}
+ );
+ mode.contains.push(hljs.PHRASAL_WORDS_MODE);
+ mode.contains.push({
+ className: 'doctag',
+ begin: "(?:TODO|FIXME|NOTE|BUG|XXX):",
+ relevance: 0
+ });
+ return mode;
+ };
+ hljs.C_LINE_COMMENT_MODE = hljs.COMMENT('//', '$');
+ hljs.C_BLOCK_COMMENT_MODE = hljs.COMMENT('/\\*', '\\*/');
+ hljs.HASH_COMMENT_MODE = hljs.COMMENT('#', '$');
+ hljs.NUMBER_MODE = {
+ className: 'number',
+ begin: hljs.NUMBER_RE,
+ relevance: 0
+ };
+ hljs.C_NUMBER_MODE = {
+ className: 'number',
+ begin: hljs.C_NUMBER_RE,
+ relevance: 0
+ };
+ hljs.BINARY_NUMBER_MODE = {
+ className: 'number',
+ begin: hljs.BINARY_NUMBER_RE,
+ relevance: 0
+ };
+ hljs.CSS_NUMBER_MODE = {
+ className: 'number',
+ begin: hljs.NUMBER_RE + '(' +
+ '%|em|ex|ch|rem' +
+ '|vw|vh|vmin|vmax' +
+ '|cm|mm|in|pt|pc|px' +
+ '|deg|grad|rad|turn' +
+ '|s|ms' +
+ '|Hz|kHz' +
+ '|dpi|dpcm|dppx' +
+ ')?',
+ relevance: 0
+ };
+ hljs.REGEXP_MODE = {
+ className: 'regexp',
+ begin: /\//, end: /\/[gimuy]*/,
+ illegal: /\n/,
+ contains: [
+ hljs.BACKSLASH_ESCAPE,
+ {
+ begin: /\[/, end: /\]/,
+ relevance: 0,
+ contains: [hljs.BACKSLASH_ESCAPE]
+ }
+ ]
+ };
+ hljs.TITLE_MODE = {
+ className: 'title',
+ begin: hljs.IDENT_RE,
+ relevance: 0
+ };
+ hljs.UNDERSCORE_TITLE_MODE = {
+ className: 'title',
+ begin: hljs.UNDERSCORE_IDENT_RE,
+ relevance: 0
+ };
+
+hljs.registerLanguage('1c', function(hljs){
+ var IDENT_RE_RU = '[a-zA-Zа-яА-Я][a-zA-Z0-9_а-яА-Я]*';
+ var OneS_KEYWORDS = 'возврат дата для если и или иначе иначеесли исключение конецесли ' +
+ 'конецпопытки конецпроцедуры конецфункции конеццикла константа не перейти перем ' +
+ 'перечисление по пока попытка прервать продолжить процедура строка тогда фс функция цикл ' +
+ 'число экспорт';
+ var OneS_BUILT_IN = 'ansitooem oemtoansi ввестивидсубконто ввестидату ввестизначение ' +
+ 'ввестиперечисление ввестипериод ввестиплансчетов ввестистроку ввестичисло вопрос ' +
+ 'восстановитьзначение врег выбранныйплансчетов вызватьисключение датагод датамесяц ' +
+ 'датачисло добавитьмесяц завершитьработусистемы заголовоксистемы записьжурналарегистрации ' +
+ 'запуститьприложение зафиксироватьтранзакцию значениевстроку значениевстрокувнутр ' +
+ 'значениевфайл значениеизстроки значениеизстрокивнутр значениеизфайла имякомпьютера ' +
+ 'имяпользователя каталогвременныхфайлов каталогиб каталогпользователя каталогпрограммы ' +
+ 'кодсимв командасистемы конгода конецпериодаби конецрассчитанногопериодаби ' +
+ 'конецстандартногоинтервала конквартала конмесяца коннедели лев лог лог10 макс ' +
+ 'максимальноеколичествосубконто мин монопольныйрежим названиеинтерфейса названиенабораправ ' +
+ 'назначитьвид назначитьсчет найти найтипомеченныенаудаление найтиссылки началопериодаби ' +
+ 'началостандартногоинтервала начатьтранзакцию начгода начквартала начмесяца начнедели ' +
+ 'номерднягода номерднянедели номернеделигода нрег обработкаожидания окр описаниеошибки ' +
+ 'основнойжурналрасчетов основнойплансчетов основнойязык открытьформу открытьформумодально ' +
+ 'отменитьтранзакцию очиститьокносообщений периодстр полноеимяпользователя получитьвремята ' +
+ 'получитьдатута получитьдокументта получитьзначенияотбора получитьпозициюта ' +
+ 'получитьпустоезначение получитьта прав праводоступа предупреждение префиксавтонумерации ' +
+ 'пустаястрока пустоезначение рабочаядаттьпустоезначение рабочаядата разделительстраниц ' +
+ 'разделительстрок разм разобратьпозициюдокумента рассчитатьрегистрына ' +
+ 'рассчитатьрегистрыпо сигнал симв символтабуляции создатьобъект сокрл сокрлп сокрп ' +
+ 'сообщить состояние сохранитьзначение сред статусвозврата стрдлина стрзаменить ' +
+ 'стрколичествострок стрполучитьстроку стрчисловхождений сформироватьпозициюдокумента ' +
+ 'счетпокоду текущаядата текущеевремя типзначения типзначениястр удалитьобъекты ' +
+ 'установитьтана установитьтапо фиксшаблон формат цел шаблон';
+ var DQUOTE = {begin: '""'};
+ var STR_START = {
+ className: 'string',
+ begin: '"', end: '"|$',
+ contains: [DQUOTE]
+ };
+ var STR_CONT = {
+ className: 'string',
+ begin: '\\|', end: '"|$',
+ contains: [DQUOTE]
+ };
+
+ return {
+ case_insensitive: true,
+ lexemes: IDENT_RE_RU,
+ keywords: {keyword: OneS_KEYWORDS, built_in: OneS_BUILT_IN},
+ contains: [
+ hljs.C_LINE_COMMENT_MODE,
+ hljs.NUMBER_MODE,
+ STR_START, STR_CONT,
+ {
+ className: 'function',
+ begin: '(процедура|функция)', end: '$',
+ lexemes: IDENT_RE_RU,
+ keywords: 'процедура функция',
+ contains: [
+ {
+ begin: 'экспорт', endsWithParent: true,
+ lexemes: IDENT_RE_RU,
+ keywords: 'экспорт',
+ contains: [hljs.C_LINE_COMMENT_MODE]
+ },
+ {
+ className: 'params',
+ begin: '\\(', end: '\\)',
+ lexemes: IDENT_RE_RU,
+ keywords: 'знач',
+ contains: [STR_START, STR_CONT]
+ },
+ hljs.C_LINE_COMMENT_MODE,
+ hljs.inherit(hljs.TITLE_MODE, {begin: IDENT_RE_RU})
+ ]
+ },
+ {className: 'meta', begin: '#', end: '$'},
+ {className: 'number', begin: '\'\\d{2}\\.\\d{2}\\.(\\d{2}|\\d{4})\''} // date
+ ]
+ };
+});
+
+hljs.registerLanguage('accesslog', function(hljs) {
+ return {
+ contains: [
+ // IP
+ {
+ className: 'number',
+ begin: '\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?\\b'
+ },
+ // Other numbers
+ {
+ className: 'number',
+ begin: '\\b\\d+\\b',
+ relevance: 0
+ },
+ // Requests
+ {
+ className: 'string',
+ begin: '"(GET|POST|HEAD|PUT|DELETE|CONNECT|OPTIONS|PATCH|TRACE)', end: '"',
+ keywords: 'GET POST HEAD PUT DELETE CONNECT OPTIONS PATCH TRACE',
+ illegal: '\\n',
+ relevance: 10
+ },
+ // Dates
+ {
+ className: 'string',
+ begin: /\[/, end: /\]/,
+ illegal: '\\n'
+ },
+ // Strings
+ {
+ className: 'string',
+ begin: '"', end: '"',
+ illegal: '\\n'
+ }
+ ]
+ };
+});
+
+hljs.registerLanguage('actionscript', function(hljs) {
+ var IDENT_RE = '[a-zA-Z_$][a-zA-Z0-9_$]*';
+ var IDENT_FUNC_RETURN_TYPE_RE = '([*]|[a-zA-Z_$][a-zA-Z0-9_$]*)';
+
+ var AS3_REST_ARG_MODE = {
+ className: 'rest_arg',
+ begin: '[.]{3}', end: IDENT_RE,
+ relevance: 10
+ };
+
+ return {
+ aliases: ['as'],
+ keywords: {
+ keyword: 'as break case catch class const continue default delete do dynamic each ' +
+ 'else extends final finally for function get if implements import in include ' +
+ 'instanceof interface internal is namespace native new override package private ' +
+ 'protected public return set static super switch this throw try typeof use var void ' +
+ 'while with',
+ literal: 'true false null undefined'
+ },
+ contains: [
+ hljs.APOS_STRING_MODE,
+ hljs.QUOTE_STRING_MODE,
+ hljs.C_LINE_COMMENT_MODE,
+ hljs.C_BLOCK_COMMENT_MODE,
+ hljs.C_NUMBER_MODE,
+ {
+ className: 'class',
+ beginKeywords: 'package', end: '{',
+ contains: [hljs.TITLE_MODE]
+ },
+ {
+ className: 'class',
+ beginKeywords: 'class interface', end: '{', excludeEnd: true,
+ contains: [
+ {
+ beginKeywords: 'extends implements'
+ },
+ hljs.TITLE_MODE
+ ]
+ },
+ {
+ className: 'meta',
+ beginKeywords: 'import include', end: ';',
+ keywords: {'meta-keyword': 'import include'}
+ },
+ {
+ className: 'function',
+ beginKeywords: 'function', end: '[{;]', excludeEnd: true,
+ illegal: '\\S',
+ contains: [
+ hljs.TITLE_MODE,
+ {
+ className: 'params',
+ begin: '\\(', end: '\\)',
+ contains: [
+ hljs.APOS_STRING_MODE,
+ hljs.QUOTE_STRING_MODE,
+ hljs.C_LINE_COMMENT_MODE,
+ hljs.C_BLOCK_COMMENT_MODE,
+ AS3_REST_ARG_MODE
+ ]
+ },
+ {
+ begin: ':\\s*' + IDENT_FUNC_RETURN_TYPE_RE
+ }
+ ]
+ }
+ ],
+ illegal: /#/
+ };
+});
+
+hljs.registerLanguage('apache', function(hljs) {
+ var NUMBER = {className: 'number', begin: '[\\$%]\\d+'};
+ return {
+ aliases: ['apacheconf'],
+ case_insensitive: true,
+ contains: [
+ hljs.HASH_COMMENT_MODE,
+ {className: 'section', begin: '?', end: '>'},
+ {
+ className: 'attribute',
+ begin: /\w+/,
+ relevance: 0,
+ // keywords aren’t needed for highlighting per se, they only boost relevance
+ // for a very generally defined mode (starts with a word, ends with line-end
+ keywords: {
+ nomarkup:
+ 'order deny allow setenv rewriterule rewriteengine rewritecond documentroot ' +
+ 'sethandler errordocument loadmodule options header listen serverroot ' +
+ 'servername'
+ },
+ starts: {
+ end: /$/,
+ relevance: 0,
+ keywords: {
+ literal: 'on off all'
+ },
+ contains: [
+ {
+ className: 'meta',
+ begin: '\\s\\[', end: '\\]$'
+ },
+ {
+ className: 'variable',
+ begin: '[\\$%]\\{', end: '\\}',
+ contains: ['self', NUMBER]
+ },
+ NUMBER,
+ hljs.QUOTE_STRING_MODE
+ ]
+ }
+ }
+ ],
+ illegal: /\S/
+ };
+});
+
+hljs.registerLanguage('applescript', function(hljs) {
+ var STRING = hljs.inherit(hljs.QUOTE_STRING_MODE, {illegal: ''});
+ var PARAMS = {
+ className: 'params',
+ begin: '\\(', end: '\\)',
+ contains: ['self', hljs.C_NUMBER_MODE, STRING]
+ };
+ var COMMENT_MODE_1 = hljs.COMMENT('--', '$');
+ var COMMENT_MODE_2 = hljs.COMMENT(
+ '\\(\\*',
+ '\\*\\)',
+ {
+ contains: ['self', COMMENT_MODE_1] //allow nesting
+ }
+ );
+ var COMMENTS = [
+ COMMENT_MODE_1,
+ COMMENT_MODE_2,
+ hljs.HASH_COMMENT_MODE
+ ];
+
+ return {
+ aliases: ['osascript'],
+ keywords: {
+ keyword:
+ 'about above after against and around as at back before beginning ' +
+ 'behind below beneath beside between but by considering ' +
+ 'contain contains continue copy div does eighth else end equal ' +
+ 'equals error every exit fifth first for fourth from front ' +
+ 'get given global if ignoring in into is it its last local me ' +
+ 'middle mod my ninth not of on onto or over prop property put ref ' +
+ 'reference repeat returning script second set seventh since ' +
+ 'sixth some tell tenth that the|0 then third through thru ' +
+ 'timeout times to transaction try until where while whose with ' +
+ 'without',
+ literal:
+ 'AppleScript false linefeed return pi quote result space tab true',
+ built_in:
+ 'alias application boolean class constant date file integer list ' +
+ 'number real record string text ' +
+ 'activate beep count delay launch log offset read round ' +
+ 'run say summarize write ' +
+ 'character characters contents day frontmost id item length ' +
+ 'month name paragraph paragraphs rest reverse running time version ' +
+ 'weekday word words year'
+ },
+ contains: [
+ STRING,
+ hljs.C_NUMBER_MODE,
+ {
+ className: 'built_in',
+ begin:
+ '\\b(clipboard info|the clipboard|info for|list (disks|folder)|' +
+ 'mount volume|path to|(close|open for) access|(get|set) eof|' +
+ 'current date|do shell script|get volume settings|random number|' +
+ 'set volume|system attribute|system info|time to GMT|' +
+ '(load|run|store) script|scripting components|' +
+ 'ASCII (character|number)|localized string|' +
+ 'choose (application|color|file|file name|' +
+ 'folder|from list|remote application|URL)|' +
+ 'display (alert|dialog))\\b|^\\s*return\\b'
+ },
+ {
+ className: 'literal',
+ begin:
+ '\\b(text item delimiters|current application|missing value)\\b'
+ },
+ {
+ className: 'keyword',
+ begin:
+ '\\b(apart from|aside from|instead of|out of|greater than|' +
+ "isn't|(doesn't|does not) (equal|come before|come after|contain)|" +
+ '(greater|less) than( or equal)?|(starts?|ends|begins?) with|' +
+ 'contained by|comes (before|after)|a (ref|reference)|POSIX file|' +
+ 'POSIX path|(date|time) string|quoted form)\\b'
+ },
+ {
+ beginKeywords: 'on',
+ illegal: '[${=;\\n]',
+ contains: [hljs.UNDERSCORE_TITLE_MODE, PARAMS]
+ }
+ ].concat(COMMENTS),
+ illegal: '//|->|=>|\\[\\['
+ };
+});
+
+hljs.registerLanguage('armasm', function(hljs) {
+ //local labels: %?[FB]?[AT]?\d{1,2}\w+
+ return {
+ case_insensitive: true,
+ aliases: ['arm'],
+ lexemes: '\\.?' + hljs.IDENT_RE,
+ keywords: {
+ meta:
+ //GNU preprocs
+ '.2byte .4byte .align .ascii .asciz .balign .byte .code .data .else .end .endif .endm .endr .equ .err .exitm .extern .global .hword .if .ifdef .ifndef .include .irp .long .macro .rept .req .section .set .skip .space .text .word .arm .thumb .code16 .code32 .force_thumb .thumb_func .ltorg '+
+ //ARM directives
+ 'ALIAS ALIGN ARM AREA ASSERT ATTR CN CODE CODE16 CODE32 COMMON CP DATA DCB DCD DCDU DCDO DCFD DCFDU DCI DCQ DCQU DCW DCWU DN ELIF ELSE END ENDFUNC ENDIF ENDP ENTRY EQU EXPORT EXPORTAS EXTERN FIELD FILL FUNCTION GBLA GBLL GBLS GET GLOBAL IF IMPORT INCBIN INCLUDE INFO KEEP LCLA LCLL LCLS LTORG MACRO MAP MEND MEXIT NOFP OPT PRESERVE8 PROC QN READONLY RELOC REQUIRE REQUIRE8 RLIST FN ROUT SETA SETL SETS SN SPACE SUBT THUMB THUMBX TTL WHILE WEND ',
+ built_in:
+ 'r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 r14 r15 '+ //standard registers
+ 'pc lr sp ip sl sb fp '+ //typical regs plus backward compatibility
+ 'a1 a2 a3 a4 v1 v2 v3 v4 v5 v6 v7 v8 f0 f1 f2 f3 f4 f5 f6 f7 '+ //more regs and fp
+ 'p0 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 p15 '+ //coprocessor regs
+ 'c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 c11 c12 c13 c14 c15 '+ //more coproc
+ 'q0 q1 q2 q3 q4 q5 q6 q7 q8 q9 q10 q11 q12 q13 q14 q15 '+ //advanced SIMD NEON regs
+
+ //program status registers
+ 'cpsr_c cpsr_x cpsr_s cpsr_f cpsr_cx cpsr_cxs cpsr_xs cpsr_xsf cpsr_sf cpsr_cxsf '+
+ 'spsr_c spsr_x spsr_s spsr_f spsr_cx spsr_cxs spsr_xs spsr_xsf spsr_sf spsr_cxsf '+
+
+ //NEON and VFP registers
+ 's0 s1 s2 s3 s4 s5 s6 s7 s8 s9 s10 s11 s12 s13 s14 s15 '+
+ 's16 s17 s18 s19 s20 s21 s22 s23 s24 s25 s26 s27 s28 s29 s30 s31 '+
+ 'd0 d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11 d12 d13 d14 d15 '+
+ 'd16 d17 d18 d19 d20 d21 d22 d23 d24 d25 d26 d27 d28 d29 d30 d31 ' +
+
+ '{PC} {VAR} {TRUE} {FALSE} {OPT} {CONFIG} {ENDIAN} {CODESIZE} {CPU} {FPU} {ARCHITECTURE} {PCSTOREOFFSET} {ARMASM_VERSION} {INTER} {ROPI} {RWPI} {SWST} {NOSWST} . @'
+ },
+ contains: [
+ {
+ className: 'keyword',
+ begin: '\\b('+ //mnemonics
+ 'adc|'+
+ '(qd?|sh?|u[qh]?)?add(8|16)?|usada?8|(q|sh?|u[qh]?)?(as|sa)x|'+
+ 'and|adrl?|sbc|rs[bc]|asr|b[lx]?|blx|bxj|cbn?z|tb[bh]|bic|'+
+ 'bfc|bfi|[su]bfx|bkpt|cdp2?|clz|clrex|cmp|cmn|cpsi[ed]|cps|'+
+ 'setend|dbg|dmb|dsb|eor|isb|it[te]{0,3}|lsl|lsr|ror|rrx|'+
+ 'ldm(([id][ab])|f[ds])?|ldr((s|ex)?[bhd])?|movt?|mvn|mra|mar|'+
+ 'mul|[us]mull|smul[bwt][bt]|smu[as]d|smmul|smmla|'+
+ 'mla|umlaal|smlal?([wbt][bt]|d)|mls|smlsl?[ds]|smc|svc|sev|'+
+ 'mia([bt]{2}|ph)?|mrr?c2?|mcrr2?|mrs|msr|orr|orn|pkh(tb|bt)|rbit|'+
+ 'rev(16|sh)?|sel|[su]sat(16)?|nop|pop|push|rfe([id][ab])?|'+
+ 'stm([id][ab])?|str(ex)?[bhd]?|(qd?)?sub|(sh?|q|u[qh]?)?sub(8|16)|'+
+ '[su]xt(a?h|a?b(16)?)|srs([id][ab])?|swpb?|swi|smi|tst|teq|'+
+ 'wfe|wfi|yield'+
+ ')'+
+ '(eq|ne|cs|cc|mi|pl|vs|vc|hi|ls|ge|lt|gt|le|al|hs|lo)?'+ //condition codes
+ '[sptrx]?' , //legal postfixes
+ end: '\\s'
+ },
+ hljs.COMMENT('[;@]', '$', {relevance: 0}),
+ hljs.C_BLOCK_COMMENT_MODE,
+ hljs.QUOTE_STRING_MODE,
+ {
+ className: 'string',
+ begin: '\'',
+ end: '[^\\\\]\'',
+ relevance: 0
+ },
+ {
+ className: 'title',
+ begin: '\\|', end: '\\|',
+ illegal: '\\n',
+ relevance: 0
+ },
+ {
+ className: 'number',
+ variants: [
+ {begin: '[#$=]?0x[0-9a-f]+'}, //hex
+ {begin: '[#$=]?0b[01]+'}, //bin
+ {begin: '[#$=]\\d+'}, //literal
+ {begin: '\\b\\d+'} //bare number
+ ],
+ relevance: 0
+ },
+ {
+ className: 'symbol',
+ variants: [
+ {begin: '^[a-z_\\.\\$][a-z0-9_\\.\\$]+'}, //ARM syntax
+ {begin: '^\\s*[a-z_\\.\\$][a-z0-9_\\.\\$]+:'}, //GNU ARM syntax
+ {begin: '[=#]\\w+' } //label reference
+ ],
+ relevance: 0
+ }
+ ]
+ };
+});
+
+hljs.registerLanguage('xml', function(hljs) {
+ var XML_IDENT_RE = '[A-Za-z0-9\\._:-]+';
+ var PHP = {
+ begin: /<\?(php)?(?!\w)/, end: /\?>/,
+ subLanguage: 'php'
+ };
+ var TAG_INTERNALS = {
+ endsWithParent: true,
+ illegal: /,
+ relevance: 0,
+ contains: [
+ PHP,
+ {
+ className: 'attr',
+ begin: XML_IDENT_RE,
+ relevance: 0
+ },
+ {
+ begin: '=',
+ relevance: 0,
+ contains: [
+ {
+ className: 'string',
+ contains: [PHP],
+ variants: [
+ {begin: /"/, end: /"/},
+ {begin: /'/, end: /'/},
+ {begin: /[^\s\/>]+/}
+ ]
+ }
+ ]
+ }
+ ]
+ };
+ return {
+ aliases: ['html', 'xhtml', 'rss', 'atom', 'xsl', 'plist'],
+ case_insensitive: true,
+ contains: [
+ {
+ className: 'meta',
+ begin: '',
+ relevance: 10,
+ contains: [{begin: '\\[', end: '\\]'}]
+ },
+ hljs.COMMENT(
+ '',
+ {
+ relevance: 10
+ }
+ ),
+ {
+ begin: '<\\!\\[CDATA\\[', end: '\\]\\]>',
+ relevance: 10
+ },
+ {
+ className: 'tag',
+ /*
+ The lookahead pattern (?=...) ensures that 'begin' only matches
+ '', returnEnd: true,
+ subLanguage: ['css', 'xml']
+ }
+ },
+ {
+ className: 'tag',
+ // See the comment in the