/*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ 'use strict'; export var conf = { comments: { lineComment: '//' }, brackets: [['{', '}'], ['[', ']'], ['(', ')']], autoClosingPairs: [ { open: '"', close: '"', notIn: ['string', 'comment'] }, { open: '\'', close: '\'', notIn: ['string', 'comment'] }, { open: '{', close: '}', notIn: ['string', 'comment'] }, { open: '[', close: ']', notIn: ['string', 'comment'] }, { open: '(', close: ')', notIn: ['string', 'comment'] }, ], folding: { offSide: true } }; export var language = { defaultToken: '', tokenPostfix: '.pug', ignoreCase: true, brackets: [ { token: 'delimiter.curly', open: '{', close: '}' }, { token: 'delimiter.array', open: '[', close: ']' }, { token: 'delimiter.parenthesis', open: '(', close: ')' } ], keywords: ['append', 'block', 'case', 'default', 'doctype', 'each', 'else', 'extends', 'for', 'if', 'in', 'include', 'mixin', 'typeof', 'unless', 'var', 'when'], tags: [ 'a', 'abbr', 'acronym', 'address', 'area', 'article', 'aside', 'audio', 'b', 'base', 'basefont', 'bdi', 'bdo', 'blockquote', 'body', 'br', 'button', 'canvas', 'caption', 'center', 'cite', 'code', 'col', 'colgroup', 'command', 'datalist', 'dd', 'del', 'details', 'dfn', 'div', 'dl', 'dt', 'em', 'embed', 'fieldset', 'figcaption', 'figure', 'font', 'footer', 'form', 'frame', 'frameset', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'header', 'hgroup', 'hr', 'html', 'i', 'iframe', 'img', 'input', 'ins', 'keygen', 'kbd', 'label', 'li', 'link', 'map', 'mark', 'menu', 'meta', 'meter', 'nav', 'noframes', 'noscript', 'object', 'ol', 'optgroup', 'option', 'output', 'p', 'param', 'pre', 'progress', 'q', 'rp', 'rt', 'ruby', 's', 'samp', 'script', 'section', 'select', 'small', 'source', 'span', 'strike', 'strong', 'style', 'sub', 'summary', 'sup', 'table', 'tbody', 'td', 'textarea', 'tfoot', 'th', 'thead', 'time', 'title', 'tr', 'tracks', 'tt', 'u', 'ul', 'video', 'wbr' ], // we include these common regular expressions symbols: /[\+\-\*\%\&\|\!\=\/\.\,\:]+/, escapes: /\\(?:[abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/, tokenizer: { root: [ // Tag or a keyword at start [/^(\s*)([a-zA-Z_-][\w-]*)/, { cases: { '$2@tags': { cases: { '@eos': ['', 'tag'], '@default': ['', { token: 'tag', next: '@tag.$1' },] } }, '$2@keywords': ['', { token: 'keyword.$2' },], '@default': ['', '',] } } ], // id [/^(\s*)(#[a-zA-Z_-][\w-]*)/, { cases: { '@eos': ['', 'tag.id'], '@default': ['', { token: 'tag.id', next: '@tag.$1' }] } }], // class [/^(\s*)(\.[a-zA-Z_-][\w-]*)/, { cases: { '@eos': ['', 'tag.class'], '@default': ['', { token: 'tag.class', next: '@tag.$1' }] } }], // plain text with pipe [/^(\s*)(\|.*)$/, ''], { include: '@whitespace' }, // keywords [/[a-zA-Z_$][\w$]*/, { cases: { '@keywords': { token: 'keyword.$0' }, '@default': '' } }], // delimiters and operators [/[{}()\[\]]/, '@brackets'], [/@symbols/, 'delimiter'], // numbers [/\d+\.\d+([eE][\-+]?\d+)?/, 'number.float'], [/\d+/, 'number'], // strings: [/"/, 'string', '@string."'], [/'/, 'string', '@string.\''], ], tag: [ [/(\.)(\s*$)/, [{ token: 'delimiter', next: '@blockText.$S2.' }, '']], [/\s+/, { token: '', next: '@simpleText' }], // id [/#[a-zA-Z_-][\w-]*/, { cases: { '@eos': { token: 'tag.id', next: '@pop' }, '@default': 'tag.id' } }], // class [/\.[a-zA-Z_-][\w-]*/, { cases: { '@eos': { token: 'tag.class', next: '@pop' }, '@default': 'tag.class' } }], // attributes [/\(/, { token: 'delimiter.parenthesis', next: '@attributeList' }], ], simpleText: [ [/[^#]+$/, { token: '', next: '@popall' }], [/[^#]+/, { token: '' }], // interpolation [/(#{)([^}]*)(})/, { cases: { '@eos': ['interpolation.delimiter', 'interpolation', { token: 'interpolation.delimiter', next: '@popall' }], '@default': ['interpolation.delimiter', 'interpolation', 'interpolation.delimiter'] } }], [/#$/, { token: '', next: '@popall' }], [/#/, ''] ], attributeList: [ [/\s+/, ''], [/(\w+)(\s*=\s*)("|')/, ['attribute.name', 'delimiter', { token: 'attribute.value', next: '@value.$3' }]], [/\w+/, 'attribute.name'], [/,/, { cases: { '@eos': { token: 'attribute.delimiter', next: '@popall' }, '@default': 'attribute.delimiter' } }], [/\)$/, { token: 'delimiter.parenthesis', next: '@popall' }], [/\)/, { token: 'delimiter.parenthesis', next: '@pop' }], ], whitespace: [ [/^(\s*)(\/\/.*)$/, { token: 'comment', next: '@blockText.$1.comment' }], [/[ \t\r\n]+/, ''], [//, { token: 'comment', next: '@pop' }], [/