Update reference docs with most recent version of brodocs (#4600)
* Update 1.7 apidocs with new brodocs * Update 1.7 resource reference docs with new brodocs * Update 1.7 kubectl reference docs with new brodocs
This commit is contained in:
committed by
Andrew Chen
parent
4b004cf717
commit
217c86642f
@@ -153,7 +153,7 @@ function generateNestedNav(parent, nest) {
|
||||
|
||||
function generateNavJson(data) {
|
||||
var navJson = JSON.stringify(data);
|
||||
navScript = `(function(){navData = ${navJson}})();`;
|
||||
navScript = `(function(){navData = ${navJson};})();`;
|
||||
fs.writeFile('./navData.js', navScript, function(err) {
|
||||
if (err) {
|
||||
return console.log(err);
|
||||
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+3
-2
@@ -1,3 +1,4 @@
|
||||
var fs = require('fs');
|
||||
var execSync = require('child_process').execSync;
|
||||
var exec = function (cmd) {
|
||||
execSync(cmd, {stdio: 'inherit'});
|
||||
@@ -40,6 +41,7 @@ task('doc', function (dev) {
|
||||
});
|
||||
|
||||
task('docPublish', ['doc'], function () {
|
||||
fs.writeFileSync('out/CNAME', 'api.ejs.co');
|
||||
console.log('Pushing docs to gh-pages...');
|
||||
exec('./node_modules/.bin/git-directory-deploy --directory out/');
|
||||
console.log('Docs published to gh-pages.');
|
||||
@@ -57,8 +59,7 @@ publishTask('ejs', ['build'], function () {
|
||||
'package.json',
|
||||
'ejs.js',
|
||||
'ejs.min.js',
|
||||
'lib/**',
|
||||
'test/**'
|
||||
'lib/**'
|
||||
]);
|
||||
});
|
||||
|
||||
|
||||
+16
@@ -4,6 +4,7 @@ Embedded JavaScript templates
|
||||
|
||||
[](https://travis-ci.org/mde/ejs)
|
||||
[](https://david-dm.org/mde/ejs?type=dev)
|
||||
[](https://snyk.io/test/npm/ejs)
|
||||
|
||||
## Installation
|
||||
|
||||
@@ -162,6 +163,21 @@ If you want to clear the EJS cache, call `ejs.clearCache`. If you're using the
|
||||
LRU cache and need a different limit, simple reset `ejs.cache` to a new instance
|
||||
of the LRU.
|
||||
|
||||
## Custom FileLoader
|
||||
|
||||
The default file loader is `fs.readFileSync`, if you want to customize it, you can set ejs.fileLoader.
|
||||
|
||||
```javascript
|
||||
var ejs = require('ejs');
|
||||
var myFileLoad = function (filePath) {
|
||||
return 'myFileLoad: ' + fs.readFileSync(filePath);
|
||||
};
|
||||
|
||||
ejs.fileLoader = myFileLoad;
|
||||
```
|
||||
|
||||
With this feature, you can preprocess the template before reading it.
|
||||
|
||||
## Layouts
|
||||
|
||||
EJS does not specifically support blocks, but layouts can be implemented by
|
||||
|
||||
+161
-92
@@ -20,7 +20,7 @@
|
||||
'use strict';
|
||||
|
||||
/**
|
||||
* @file Embedded JavaScript templating engine.
|
||||
* @file Embedded JavaScript templating engine. {@link http://ejs.co}
|
||||
* @author Matthew Eernisse <mde@fleegix.org>
|
||||
* @author Tiancheng "Timothy" Gu <timothygu99@gmail.com>
|
||||
* @project EJS
|
||||
@@ -57,6 +57,10 @@ var _NAME = 'ejs';
|
||||
var _REGEX_STRING = '(<%%|%%>|<%=|<%-|<%_|<%#|<%|%>|-%>|_%>)';
|
||||
var _OPTS = ['delimiter', 'scope', 'context', 'debug', 'compileDebug',
|
||||
'client', '_with', 'rmWhitespace', 'strict', 'filename'];
|
||||
// We don't allow 'cache' option to be passed in the data obj
|
||||
// for the normal `render` call, but this is where Express puts it
|
||||
// so we make an exception for `renderFile`
|
||||
var _OPTS_EXPRESS = _OPTS.concat('cache');
|
||||
var _BOM = /^\uFEFF/;
|
||||
|
||||
/**
|
||||
@@ -69,6 +73,15 @@ var _BOM = /^\uFEFF/;
|
||||
|
||||
exports.cache = utils.cache;
|
||||
|
||||
/**
|
||||
* Custom file loader. Useful for template preprocessing or restricting access
|
||||
* to a certain part of the filesystem.
|
||||
*
|
||||
* @type {fileLoader}
|
||||
*/
|
||||
|
||||
exports.fileLoader = fs.readFileSync;
|
||||
|
||||
/**
|
||||
* Name of the object containing the locals.
|
||||
*
|
||||
@@ -109,16 +122,36 @@ exports.resolveInclude = function(name, filename, isDir) {
|
||||
* @param {Options} options compilation options
|
||||
* @return {String}
|
||||
*/
|
||||
function getIncludePath(path, options){
|
||||
function getIncludePath(path, options) {
|
||||
var includePath;
|
||||
var filePath;
|
||||
var views = options.views;
|
||||
|
||||
// Abs path
|
||||
if (path.charAt(0) == '/') {
|
||||
includePath = exports.resolveInclude(path.replace(/^\/*/,''), options.root || '/', true);
|
||||
}
|
||||
// Relative paths
|
||||
else {
|
||||
if (!options.filename) {
|
||||
throw new Error('`include` use relative path requires the \'filename\' option.');
|
||||
// Look relative to a passed filename first
|
||||
if (options.filename) {
|
||||
filePath = exports.resolveInclude(path, options.filename);
|
||||
if (fs.existsSync(filePath)) {
|
||||
includePath = filePath;
|
||||
}
|
||||
}
|
||||
// Then look in any views directories
|
||||
if (!includePath) {
|
||||
if (Array.isArray(views) && views.some(function (v) {
|
||||
filePath = exports.resolveInclude(path, v, true);
|
||||
return fs.existsSync(filePath);
|
||||
})) {
|
||||
includePath = filePath;
|
||||
}
|
||||
}
|
||||
if (!includePath) {
|
||||
throw new Error('Could not find include include file.');
|
||||
}
|
||||
includePath = exports.resolveInclude(path, options.filename);
|
||||
}
|
||||
return includePath;
|
||||
}
|
||||
@@ -155,7 +188,7 @@ function handleCache(options, template) {
|
||||
return func;
|
||||
}
|
||||
if (!hasTemplate) {
|
||||
template = fs.readFileSync(filename).toString().replace(_BOM, '');
|
||||
template = fileLoader(filename).toString().replace(_BOM, '');
|
||||
}
|
||||
}
|
||||
else if (!hasTemplate) {
|
||||
@@ -164,7 +197,7 @@ function handleCache(options, template) {
|
||||
throw new Error('Internal EJS error: no file name or template '
|
||||
+ 'provided');
|
||||
}
|
||||
template = fs.readFileSync(filename).toString().replace(_BOM, '');
|
||||
template = fileLoader(filename).toString().replace(_BOM, '');
|
||||
}
|
||||
func = exports.compile(template, options);
|
||||
if (options.cache) {
|
||||
@@ -173,6 +206,41 @@ function handleCache(options, template) {
|
||||
return func;
|
||||
}
|
||||
|
||||
/**
|
||||
* Try calling handleCache with the given options and data and call the
|
||||
* callback with the result. If an error occurs, call the callback with
|
||||
* the error. Used by renderFile().
|
||||
*
|
||||
* @memberof module:ejs-internal
|
||||
* @param {Options} options compilation options
|
||||
* @param {Object} data template data
|
||||
* @param {RenderFileCallback} cb callback
|
||||
* @static
|
||||
*/
|
||||
|
||||
function tryHandleCache(options, data, cb) {
|
||||
var result;
|
||||
try {
|
||||
result = handleCache(options)(data);
|
||||
}
|
||||
catch (err) {
|
||||
return cb(err);
|
||||
}
|
||||
return cb(null, result);
|
||||
}
|
||||
|
||||
/**
|
||||
* fileLoader is independent
|
||||
*
|
||||
* @param {String} filePath ejs file path.
|
||||
* @return {String} The contents of the specified file.
|
||||
* @static
|
||||
*/
|
||||
|
||||
function fileLoader(filePath){
|
||||
return exports.fileLoader(filePath);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the template function.
|
||||
*
|
||||
@@ -206,8 +274,8 @@ function includeSource(path, options) {
|
||||
var opts = utils.shallowCopy({}, options);
|
||||
var includePath;
|
||||
var template;
|
||||
includePath = getIncludePath(path,opts);
|
||||
template = fs.readFileSync(includePath).toString().replace(_BOM, '');
|
||||
includePath = getIncludePath(path, opts);
|
||||
template = fileLoader(includePath).toString().replace(_BOM, '');
|
||||
opts.filename = includePath;
|
||||
var templ = new Template(template, opts);
|
||||
templ.generateSource();
|
||||
@@ -231,11 +299,11 @@ function includeSource(path, options) {
|
||||
* @static
|
||||
*/
|
||||
|
||||
function rethrow(err, str, flnm, lineno){
|
||||
function rethrow(err, str, flnm, lineno, esc){
|
||||
var lines = str.split('\n');
|
||||
var start = Math.max(lineno - 3, 0);
|
||||
var end = Math.min(lines.length, lineno + 3);
|
||||
var filename = utils.escapeXML(flnm);
|
||||
var filename = esc(flnm); // eslint-disable-line
|
||||
// Error context
|
||||
var context = lines.slice(start, end).map(function (line, i){
|
||||
var curr = i + start + 1;
|
||||
@@ -255,7 +323,7 @@ function rethrow(err, str, flnm, lineno){
|
||||
throw err;
|
||||
}
|
||||
|
||||
function stripSemi(str) {
|
||||
function stripSemi(str){
|
||||
return str.replace(/;(\s*$)/, '$1');
|
||||
}
|
||||
|
||||
@@ -331,43 +399,43 @@ exports.render = function (template, d, o) {
|
||||
*/
|
||||
|
||||
exports.renderFile = function () {
|
||||
var args = Array.prototype.slice.call(arguments);
|
||||
var filename = args.shift();
|
||||
var cb = args.pop();
|
||||
var data = args.shift() || {};
|
||||
var opts = args.pop() || {};
|
||||
var optsKeys =_OPTS.slice();
|
||||
var result;
|
||||
var filename = arguments[0];
|
||||
var cb = arguments[arguments.length - 1];
|
||||
var opts = {filename: filename};
|
||||
var data;
|
||||
|
||||
// Don't pollute passed in opts obj with new vals
|
||||
opts = utils.shallowCopy({}, opts);
|
||||
if (arguments.length > 2) {
|
||||
data = arguments[1];
|
||||
|
||||
// We don't allow 'cache' option to be passed in the data obj
|
||||
// for the normal `render` call, but this is where Expres puts it
|
||||
// so we make an exception for `renderFile`
|
||||
optsKeys.push('cache');
|
||||
|
||||
// No options object -- if there are optiony names
|
||||
// in the data, copy them to options
|
||||
if (arguments.length == 3) {
|
||||
// Express 4
|
||||
if (data.settings && data.settings['view options']) {
|
||||
utils.shallowCopyFromList(opts, data.settings['view options'], optsKeys);
|
||||
// No options object -- if there are optiony names
|
||||
// in the data, copy them to options
|
||||
if (arguments.length === 3) {
|
||||
// Express 4
|
||||
if (data.settings) {
|
||||
if (data.settings['view options']) {
|
||||
utils.shallowCopyFromList(opts, data.settings['view options'], _OPTS_EXPRESS);
|
||||
}
|
||||
if (data.settings.views) {
|
||||
opts.views = data.settings.views;
|
||||
}
|
||||
}
|
||||
// Express 3 and lower
|
||||
else {
|
||||
utils.shallowCopyFromList(opts, data, _OPTS_EXPRESS);
|
||||
}
|
||||
}
|
||||
// Express 3 and lower
|
||||
else {
|
||||
utils.shallowCopyFromList(opts, data, optsKeys);
|
||||
// Use shallowCopy so we don't pollute passed in opts obj with new vals
|
||||
utils.shallowCopy(opts, arguments[2]);
|
||||
}
|
||||
}
|
||||
opts.filename = filename;
|
||||
|
||||
try {
|
||||
result = handleCache(opts)(data);
|
||||
opts.filename = filename;
|
||||
}
|
||||
catch(err) {
|
||||
return cb(err);
|
||||
else {
|
||||
data = {};
|
||||
}
|
||||
return cb(null, result);
|
||||
|
||||
return tryHandleCache(opts, data, cb);
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -400,6 +468,7 @@ function Template(text, opts) {
|
||||
options.rmWhitespace = opts.rmWhitespace;
|
||||
options.root = opts.root;
|
||||
options.localsName = opts.localsName || exports.localsName || _DEFAULT_LOCALS_NAME;
|
||||
options.views = opts.views;
|
||||
|
||||
if (options.strict) {
|
||||
options._with = false;
|
||||
@@ -435,7 +504,7 @@ Template.prototype = {
|
||||
var opts = this.opts;
|
||||
var prepended = '';
|
||||
var appended = '';
|
||||
var escape = opts.escapeFunction;
|
||||
var escapeFn = opts.escapeFunction;
|
||||
|
||||
if (!this.source) {
|
||||
this.generateSource();
|
||||
@@ -456,19 +525,15 @@ Template.prototype = {
|
||||
+ 'try {' + '\n'
|
||||
+ this.source
|
||||
+ '} catch (e) {' + '\n'
|
||||
+ ' rethrow(e, __lines, __filename, __line);' + '\n'
|
||||
+ ' rethrow(e, __lines, __filename, __line, escapeFn);' + '\n'
|
||||
+ '}' + '\n';
|
||||
}
|
||||
else {
|
||||
src = this.source;
|
||||
}
|
||||
|
||||
if (opts.debug) {
|
||||
console.log(src);
|
||||
}
|
||||
|
||||
if (opts.client) {
|
||||
src = 'escape = escape || ' + escape.toString() + ';' + '\n' + src;
|
||||
src = 'escapeFn = escapeFn || ' + escapeFn.toString() + ';' + '\n' + src;
|
||||
if (opts.compileDebug) {
|
||||
src = 'rethrow = rethrow || ' + rethrow.toString() + ';' + '\n' + src;
|
||||
}
|
||||
@@ -477,9 +542,12 @@ Template.prototype = {
|
||||
if (opts.strict) {
|
||||
src = '"use strict";\n' + src;
|
||||
}
|
||||
if (opts.debug) {
|
||||
console.log(src);
|
||||
}
|
||||
|
||||
try {
|
||||
fn = new Function(opts.localsName + ', escape, include, rethrow', src);
|
||||
fn = new Function(opts.localsName + ', escapeFn, include, rethrow', src);
|
||||
}
|
||||
catch(e) {
|
||||
// istanbul ignore else
|
||||
@@ -510,7 +578,7 @@ Template.prototype = {
|
||||
}
|
||||
return includeFile(path, opts)(d);
|
||||
};
|
||||
return fn.apply(opts.context, [data || {}, escape, include, rethrow]);
|
||||
return fn.apply(opts.context, [data || {}, escapeFn, include, rethrow]);
|
||||
};
|
||||
returnedFn.dependencies = this.dependencies;
|
||||
return returnedFn;
|
||||
@@ -569,7 +637,7 @@ Template.prototype = {
|
||||
+ ' try {' + '\n'
|
||||
+ includeObj.source
|
||||
+ ' } catch (e) {' + '\n'
|
||||
+ ' rethrow(e, __lines, __filename, __line);' + '\n'
|
||||
+ ' rethrow(e, __lines, __filename, __line, escapeFn);' + '\n'
|
||||
+ ' }' + '\n'
|
||||
+ ' ; }).call(this)' + '\n';
|
||||
}else{
|
||||
@@ -615,43 +683,43 @@ Template.prototype = {
|
||||
return arr;
|
||||
},
|
||||
|
||||
_addOutput: function (line) {
|
||||
if (this.truncate) {
|
||||
// Only replace single leading linebreak in the line after
|
||||
// -%> tag -- this is the single, trailing linebreak
|
||||
// after the tag that the truncation mode replaces
|
||||
// Handle Win / Unix / old Mac linebreaks -- do the \r\n
|
||||
// combo first in the regex-or
|
||||
line = line.replace(/^(?:\r\n|\r|\n)/, '');
|
||||
this.truncate = false;
|
||||
}
|
||||
else if (this.opts.rmWhitespace) {
|
||||
// rmWhitespace has already removed trailing spaces, just need
|
||||
// to remove linebreaks
|
||||
line = line.replace(/^\n/, '');
|
||||
}
|
||||
if (!line) {
|
||||
return line;
|
||||
}
|
||||
|
||||
// Preserve literal slashes
|
||||
line = line.replace(/\\/g, '\\\\');
|
||||
|
||||
// Convert linebreaks
|
||||
line = line.replace(/\n/g, '\\n');
|
||||
line = line.replace(/\r/g, '\\r');
|
||||
|
||||
// Escape double-quotes
|
||||
// - this will be the delimiter during execution
|
||||
line = line.replace(/"/g, '\\"');
|
||||
this.source += ' ; __append("' + line + '")' + '\n';
|
||||
},
|
||||
|
||||
scanLine: function (line) {
|
||||
var self = this;
|
||||
var d = this.opts.delimiter;
|
||||
var newLineCount = 0;
|
||||
|
||||
function _addOutput() {
|
||||
if (self.truncate) {
|
||||
// Only replace single leading linebreak in the line after
|
||||
// -%> tag -- this is the single, trailing linebreak
|
||||
// after the tag that the truncation mode replaces
|
||||
// Handle Win / Unix / old Mac linebreaks -- do the \r\n
|
||||
// combo first in the regex-or
|
||||
line = line.replace(/^(?:\r\n|\r|\n)/, '');
|
||||
self.truncate = false;
|
||||
}
|
||||
else if (self.opts.rmWhitespace) {
|
||||
// rmWhitespace has already removed trailing spaces, just need
|
||||
// to remove linebreaks
|
||||
line = line.replace(/^\n/, '');
|
||||
}
|
||||
if (!line) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Preserve literal slashes
|
||||
line = line.replace(/\\/g, '\\\\');
|
||||
|
||||
// Convert linebreaks
|
||||
line = line.replace(/\n/g, '\\n');
|
||||
line = line.replace(/\r/g, '\\r');
|
||||
|
||||
// Escape double-quotes
|
||||
// - this will be the delimiter during execution
|
||||
line = line.replace(/"/g, '\\"');
|
||||
self.source += ' ; __append("' + line + '")' + '\n';
|
||||
}
|
||||
|
||||
newLineCount = (line.split('\n').length - 1);
|
||||
|
||||
switch (line) {
|
||||
@@ -680,7 +748,7 @@ Template.prototype = {
|
||||
case '-' + d + '>':
|
||||
case '_' + d + '>':
|
||||
if (this.mode == Template.modes.LITERAL) {
|
||||
_addOutput();
|
||||
this._addOutput(line);
|
||||
}
|
||||
|
||||
this.mode = null;
|
||||
@@ -705,7 +773,7 @@ Template.prototype = {
|
||||
break;
|
||||
// Exec, esc, and output
|
||||
case Template.modes.ESCAPED:
|
||||
this.source += ' ; __append(escape(' + stripSemi(line) + '))' + '\n';
|
||||
this.source += ' ; __append(escapeFn(' + stripSemi(line) + '))' + '\n';
|
||||
break;
|
||||
// Exec and output
|
||||
case Template.modes.RAW:
|
||||
@@ -716,13 +784,13 @@ Template.prototype = {
|
||||
break;
|
||||
// Literal <%% mode, append as raw output
|
||||
case Template.modes.LITERAL:
|
||||
_addOutput();
|
||||
this._addOutput(line);
|
||||
break;
|
||||
}
|
||||
}
|
||||
// In string mode, just add the output
|
||||
else {
|
||||
_addOutput();
|
||||
this._addOutput(line);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -767,7 +835,7 @@ if (require.extensions) {
|
||||
filename: filename,
|
||||
client: true
|
||||
};
|
||||
var template = fs.readFileSync(filename).toString();
|
||||
var template = fileLoader(filename).toString();
|
||||
var fn = exports.compile(template, options);
|
||||
module._compile('module.exports = ' + fn.toString() + ';', filename);
|
||||
};
|
||||
@@ -934,11 +1002,12 @@ exports.shallowCopy = function (to, from) {
|
||||
* @private
|
||||
*/
|
||||
exports.shallowCopyFromList = function (to, from, list) {
|
||||
list.forEach(function (p) {
|
||||
for (var i = 0; i < list.length; i++) {
|
||||
var p = list[i];
|
||||
if (typeof from[p] != 'undefined') {
|
||||
to[p] = from[p];
|
||||
}
|
||||
});
|
||||
}
|
||||
return to;
|
||||
};
|
||||
|
||||
@@ -1384,7 +1453,7 @@ module.exports={
|
||||
"engine",
|
||||
"ejs"
|
||||
],
|
||||
"version": "2.5.4",
|
||||
"version": "2.5.6",
|
||||
"author": "Matthew Eernisse <mde@fleegix.org> (http://fleegix.org)",
|
||||
"contributors": [
|
||||
"Timothy Gu <timothygu99@gmail.com> (https://timothygu.github.io)"
|
||||
@@ -1413,7 +1482,7 @@ module.exports={
|
||||
"node": ">=0.10.0"
|
||||
},
|
||||
"scripts": {
|
||||
"test": "mocha",
|
||||
"test": "jake test",
|
||||
"lint": "eslint \"**/*.js\" Jakefile",
|
||||
"coverage": "istanbul cover node_modules/mocha/bin/_mocha",
|
||||
"doc": "jake doc",
|
||||
|
||||
+1
-1
File diff suppressed because one or more lines are too long
+156
-88
@@ -19,7 +19,7 @@
|
||||
'use strict';
|
||||
|
||||
/**
|
||||
* @file Embedded JavaScript templating engine.
|
||||
* @file Embedded JavaScript templating engine. {@link http://ejs.co}
|
||||
* @author Matthew Eernisse <mde@fleegix.org>
|
||||
* @author Tiancheng "Timothy" Gu <timothygu99@gmail.com>
|
||||
* @project EJS
|
||||
@@ -56,6 +56,10 @@ var _NAME = 'ejs';
|
||||
var _REGEX_STRING = '(<%%|%%>|<%=|<%-|<%_|<%#|<%|%>|-%>|_%>)';
|
||||
var _OPTS = ['delimiter', 'scope', 'context', 'debug', 'compileDebug',
|
||||
'client', '_with', 'rmWhitespace', 'strict', 'filename'];
|
||||
// We don't allow 'cache' option to be passed in the data obj
|
||||
// for the normal `render` call, but this is where Express puts it
|
||||
// so we make an exception for `renderFile`
|
||||
var _OPTS_EXPRESS = _OPTS.concat('cache');
|
||||
var _BOM = /^\uFEFF/;
|
||||
|
||||
/**
|
||||
@@ -68,6 +72,15 @@ var _BOM = /^\uFEFF/;
|
||||
|
||||
exports.cache = utils.cache;
|
||||
|
||||
/**
|
||||
* Custom file loader. Useful for template preprocessing or restricting access
|
||||
* to a certain part of the filesystem.
|
||||
*
|
||||
* @type {fileLoader}
|
||||
*/
|
||||
|
||||
exports.fileLoader = fs.readFileSync;
|
||||
|
||||
/**
|
||||
* Name of the object containing the locals.
|
||||
*
|
||||
@@ -108,16 +121,36 @@ exports.resolveInclude = function(name, filename, isDir) {
|
||||
* @param {Options} options compilation options
|
||||
* @return {String}
|
||||
*/
|
||||
function getIncludePath(path, options){
|
||||
function getIncludePath(path, options) {
|
||||
var includePath;
|
||||
var filePath;
|
||||
var views = options.views;
|
||||
|
||||
// Abs path
|
||||
if (path.charAt(0) == '/') {
|
||||
includePath = exports.resolveInclude(path.replace(/^\/*/,''), options.root || '/', true);
|
||||
}
|
||||
// Relative paths
|
||||
else {
|
||||
if (!options.filename) {
|
||||
throw new Error('`include` use relative path requires the \'filename\' option.');
|
||||
// Look relative to a passed filename first
|
||||
if (options.filename) {
|
||||
filePath = exports.resolveInclude(path, options.filename);
|
||||
if (fs.existsSync(filePath)) {
|
||||
includePath = filePath;
|
||||
}
|
||||
}
|
||||
// Then look in any views directories
|
||||
if (!includePath) {
|
||||
if (Array.isArray(views) && views.some(function (v) {
|
||||
filePath = exports.resolveInclude(path, v, true);
|
||||
return fs.existsSync(filePath);
|
||||
})) {
|
||||
includePath = filePath;
|
||||
}
|
||||
}
|
||||
if (!includePath) {
|
||||
throw new Error('Could not find include include file.');
|
||||
}
|
||||
includePath = exports.resolveInclude(path, options.filename);
|
||||
}
|
||||
return includePath;
|
||||
}
|
||||
@@ -154,7 +187,7 @@ function handleCache(options, template) {
|
||||
return func;
|
||||
}
|
||||
if (!hasTemplate) {
|
||||
template = fs.readFileSync(filename).toString().replace(_BOM, '');
|
||||
template = fileLoader(filename).toString().replace(_BOM, '');
|
||||
}
|
||||
}
|
||||
else if (!hasTemplate) {
|
||||
@@ -163,7 +196,7 @@ function handleCache(options, template) {
|
||||
throw new Error('Internal EJS error: no file name or template '
|
||||
+ 'provided');
|
||||
}
|
||||
template = fs.readFileSync(filename).toString().replace(_BOM, '');
|
||||
template = fileLoader(filename).toString().replace(_BOM, '');
|
||||
}
|
||||
func = exports.compile(template, options);
|
||||
if (options.cache) {
|
||||
@@ -172,6 +205,41 @@ function handleCache(options, template) {
|
||||
return func;
|
||||
}
|
||||
|
||||
/**
|
||||
* Try calling handleCache with the given options and data and call the
|
||||
* callback with the result. If an error occurs, call the callback with
|
||||
* the error. Used by renderFile().
|
||||
*
|
||||
* @memberof module:ejs-internal
|
||||
* @param {Options} options compilation options
|
||||
* @param {Object} data template data
|
||||
* @param {RenderFileCallback} cb callback
|
||||
* @static
|
||||
*/
|
||||
|
||||
function tryHandleCache(options, data, cb) {
|
||||
var result;
|
||||
try {
|
||||
result = handleCache(options)(data);
|
||||
}
|
||||
catch (err) {
|
||||
return cb(err);
|
||||
}
|
||||
return cb(null, result);
|
||||
}
|
||||
|
||||
/**
|
||||
* fileLoader is independent
|
||||
*
|
||||
* @param {String} filePath ejs file path.
|
||||
* @return {String} The contents of the specified file.
|
||||
* @static
|
||||
*/
|
||||
|
||||
function fileLoader(filePath){
|
||||
return exports.fileLoader(filePath);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the template function.
|
||||
*
|
||||
@@ -205,8 +273,8 @@ function includeSource(path, options) {
|
||||
var opts = utils.shallowCopy({}, options);
|
||||
var includePath;
|
||||
var template;
|
||||
includePath = getIncludePath(path,opts);
|
||||
template = fs.readFileSync(includePath).toString().replace(_BOM, '');
|
||||
includePath = getIncludePath(path, opts);
|
||||
template = fileLoader(includePath).toString().replace(_BOM, '');
|
||||
opts.filename = includePath;
|
||||
var templ = new Template(template, opts);
|
||||
templ.generateSource();
|
||||
@@ -230,11 +298,11 @@ function includeSource(path, options) {
|
||||
* @static
|
||||
*/
|
||||
|
||||
function rethrow(err, str, flnm, lineno){
|
||||
function rethrow(err, str, flnm, lineno, esc){
|
||||
var lines = str.split('\n');
|
||||
var start = Math.max(lineno - 3, 0);
|
||||
var end = Math.min(lines.length, lineno + 3);
|
||||
var filename = utils.escapeXML(flnm);
|
||||
var filename = esc(flnm); // eslint-disable-line
|
||||
// Error context
|
||||
var context = lines.slice(start, end).map(function (line, i){
|
||||
var curr = i + start + 1;
|
||||
@@ -254,7 +322,7 @@ function rethrow(err, str, flnm, lineno){
|
||||
throw err;
|
||||
}
|
||||
|
||||
function stripSemi(str) {
|
||||
function stripSemi(str){
|
||||
return str.replace(/;(\s*$)/, '$1');
|
||||
}
|
||||
|
||||
@@ -330,43 +398,43 @@ exports.render = function (template, d, o) {
|
||||
*/
|
||||
|
||||
exports.renderFile = function () {
|
||||
var args = Array.prototype.slice.call(arguments);
|
||||
var filename = args.shift();
|
||||
var cb = args.pop();
|
||||
var data = args.shift() || {};
|
||||
var opts = args.pop() || {};
|
||||
var optsKeys =_OPTS.slice();
|
||||
var result;
|
||||
var filename = arguments[0];
|
||||
var cb = arguments[arguments.length - 1];
|
||||
var opts = {filename: filename};
|
||||
var data;
|
||||
|
||||
// Don't pollute passed in opts obj with new vals
|
||||
opts = utils.shallowCopy({}, opts);
|
||||
if (arguments.length > 2) {
|
||||
data = arguments[1];
|
||||
|
||||
// We don't allow 'cache' option to be passed in the data obj
|
||||
// for the normal `render` call, but this is where Expres puts it
|
||||
// so we make an exception for `renderFile`
|
||||
optsKeys.push('cache');
|
||||
|
||||
// No options object -- if there are optiony names
|
||||
// in the data, copy them to options
|
||||
if (arguments.length == 3) {
|
||||
// Express 4
|
||||
if (data.settings && data.settings['view options']) {
|
||||
utils.shallowCopyFromList(opts, data.settings['view options'], optsKeys);
|
||||
// No options object -- if there are optiony names
|
||||
// in the data, copy them to options
|
||||
if (arguments.length === 3) {
|
||||
// Express 4
|
||||
if (data.settings) {
|
||||
if (data.settings['view options']) {
|
||||
utils.shallowCopyFromList(opts, data.settings['view options'], _OPTS_EXPRESS);
|
||||
}
|
||||
if (data.settings.views) {
|
||||
opts.views = data.settings.views;
|
||||
}
|
||||
}
|
||||
// Express 3 and lower
|
||||
else {
|
||||
utils.shallowCopyFromList(opts, data, _OPTS_EXPRESS);
|
||||
}
|
||||
}
|
||||
// Express 3 and lower
|
||||
else {
|
||||
utils.shallowCopyFromList(opts, data, optsKeys);
|
||||
// Use shallowCopy so we don't pollute passed in opts obj with new vals
|
||||
utils.shallowCopy(opts, arguments[2]);
|
||||
}
|
||||
}
|
||||
opts.filename = filename;
|
||||
|
||||
try {
|
||||
result = handleCache(opts)(data);
|
||||
opts.filename = filename;
|
||||
}
|
||||
catch(err) {
|
||||
return cb(err);
|
||||
else {
|
||||
data = {};
|
||||
}
|
||||
return cb(null, result);
|
||||
|
||||
return tryHandleCache(opts, data, cb);
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -399,6 +467,7 @@ function Template(text, opts) {
|
||||
options.rmWhitespace = opts.rmWhitespace;
|
||||
options.root = opts.root;
|
||||
options.localsName = opts.localsName || exports.localsName || _DEFAULT_LOCALS_NAME;
|
||||
options.views = opts.views;
|
||||
|
||||
if (options.strict) {
|
||||
options._with = false;
|
||||
@@ -434,7 +503,7 @@ Template.prototype = {
|
||||
var opts = this.opts;
|
||||
var prepended = '';
|
||||
var appended = '';
|
||||
var escape = opts.escapeFunction;
|
||||
var escapeFn = opts.escapeFunction;
|
||||
|
||||
if (!this.source) {
|
||||
this.generateSource();
|
||||
@@ -455,19 +524,15 @@ Template.prototype = {
|
||||
+ 'try {' + '\n'
|
||||
+ this.source
|
||||
+ '} catch (e) {' + '\n'
|
||||
+ ' rethrow(e, __lines, __filename, __line);' + '\n'
|
||||
+ ' rethrow(e, __lines, __filename, __line, escapeFn);' + '\n'
|
||||
+ '}' + '\n';
|
||||
}
|
||||
else {
|
||||
src = this.source;
|
||||
}
|
||||
|
||||
if (opts.debug) {
|
||||
console.log(src);
|
||||
}
|
||||
|
||||
if (opts.client) {
|
||||
src = 'escape = escape || ' + escape.toString() + ';' + '\n' + src;
|
||||
src = 'escapeFn = escapeFn || ' + escapeFn.toString() + ';' + '\n' + src;
|
||||
if (opts.compileDebug) {
|
||||
src = 'rethrow = rethrow || ' + rethrow.toString() + ';' + '\n' + src;
|
||||
}
|
||||
@@ -476,9 +541,12 @@ Template.prototype = {
|
||||
if (opts.strict) {
|
||||
src = '"use strict";\n' + src;
|
||||
}
|
||||
if (opts.debug) {
|
||||
console.log(src);
|
||||
}
|
||||
|
||||
try {
|
||||
fn = new Function(opts.localsName + ', escape, include, rethrow', src);
|
||||
fn = new Function(opts.localsName + ', escapeFn, include, rethrow', src);
|
||||
}
|
||||
catch(e) {
|
||||
// istanbul ignore else
|
||||
@@ -509,7 +577,7 @@ Template.prototype = {
|
||||
}
|
||||
return includeFile(path, opts)(d);
|
||||
};
|
||||
return fn.apply(opts.context, [data || {}, escape, include, rethrow]);
|
||||
return fn.apply(opts.context, [data || {}, escapeFn, include, rethrow]);
|
||||
};
|
||||
returnedFn.dependencies = this.dependencies;
|
||||
return returnedFn;
|
||||
@@ -568,7 +636,7 @@ Template.prototype = {
|
||||
+ ' try {' + '\n'
|
||||
+ includeObj.source
|
||||
+ ' } catch (e) {' + '\n'
|
||||
+ ' rethrow(e, __lines, __filename, __line);' + '\n'
|
||||
+ ' rethrow(e, __lines, __filename, __line, escapeFn);' + '\n'
|
||||
+ ' }' + '\n'
|
||||
+ ' ; }).call(this)' + '\n';
|
||||
}else{
|
||||
@@ -614,43 +682,43 @@ Template.prototype = {
|
||||
return arr;
|
||||
},
|
||||
|
||||
_addOutput: function (line) {
|
||||
if (this.truncate) {
|
||||
// Only replace single leading linebreak in the line after
|
||||
// -%> tag -- this is the single, trailing linebreak
|
||||
// after the tag that the truncation mode replaces
|
||||
// Handle Win / Unix / old Mac linebreaks -- do the \r\n
|
||||
// combo first in the regex-or
|
||||
line = line.replace(/^(?:\r\n|\r|\n)/, '');
|
||||
this.truncate = false;
|
||||
}
|
||||
else if (this.opts.rmWhitespace) {
|
||||
// rmWhitespace has already removed trailing spaces, just need
|
||||
// to remove linebreaks
|
||||
line = line.replace(/^\n/, '');
|
||||
}
|
||||
if (!line) {
|
||||
return line;
|
||||
}
|
||||
|
||||
// Preserve literal slashes
|
||||
line = line.replace(/\\/g, '\\\\');
|
||||
|
||||
// Convert linebreaks
|
||||
line = line.replace(/\n/g, '\\n');
|
||||
line = line.replace(/\r/g, '\\r');
|
||||
|
||||
// Escape double-quotes
|
||||
// - this will be the delimiter during execution
|
||||
line = line.replace(/"/g, '\\"');
|
||||
this.source += ' ; __append("' + line + '")' + '\n';
|
||||
},
|
||||
|
||||
scanLine: function (line) {
|
||||
var self = this;
|
||||
var d = this.opts.delimiter;
|
||||
var newLineCount = 0;
|
||||
|
||||
function _addOutput() {
|
||||
if (self.truncate) {
|
||||
// Only replace single leading linebreak in the line after
|
||||
// -%> tag -- this is the single, trailing linebreak
|
||||
// after the tag that the truncation mode replaces
|
||||
// Handle Win / Unix / old Mac linebreaks -- do the \r\n
|
||||
// combo first in the regex-or
|
||||
line = line.replace(/^(?:\r\n|\r|\n)/, '');
|
||||
self.truncate = false;
|
||||
}
|
||||
else if (self.opts.rmWhitespace) {
|
||||
// rmWhitespace has already removed trailing spaces, just need
|
||||
// to remove linebreaks
|
||||
line = line.replace(/^\n/, '');
|
||||
}
|
||||
if (!line) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Preserve literal slashes
|
||||
line = line.replace(/\\/g, '\\\\');
|
||||
|
||||
// Convert linebreaks
|
||||
line = line.replace(/\n/g, '\\n');
|
||||
line = line.replace(/\r/g, '\\r');
|
||||
|
||||
// Escape double-quotes
|
||||
// - this will be the delimiter during execution
|
||||
line = line.replace(/"/g, '\\"');
|
||||
self.source += ' ; __append("' + line + '")' + '\n';
|
||||
}
|
||||
|
||||
newLineCount = (line.split('\n').length - 1);
|
||||
|
||||
switch (line) {
|
||||
@@ -679,7 +747,7 @@ Template.prototype = {
|
||||
case '-' + d + '>':
|
||||
case '_' + d + '>':
|
||||
if (this.mode == Template.modes.LITERAL) {
|
||||
_addOutput();
|
||||
this._addOutput(line);
|
||||
}
|
||||
|
||||
this.mode = null;
|
||||
@@ -704,7 +772,7 @@ Template.prototype = {
|
||||
break;
|
||||
// Exec, esc, and output
|
||||
case Template.modes.ESCAPED:
|
||||
this.source += ' ; __append(escape(' + stripSemi(line) + '))' + '\n';
|
||||
this.source += ' ; __append(escapeFn(' + stripSemi(line) + '))' + '\n';
|
||||
break;
|
||||
// Exec and output
|
||||
case Template.modes.RAW:
|
||||
@@ -715,13 +783,13 @@ Template.prototype = {
|
||||
break;
|
||||
// Literal <%% mode, append as raw output
|
||||
case Template.modes.LITERAL:
|
||||
_addOutput();
|
||||
this._addOutput(line);
|
||||
break;
|
||||
}
|
||||
}
|
||||
// In string mode, just add the output
|
||||
else {
|
||||
_addOutput();
|
||||
this._addOutput(line);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -766,7 +834,7 @@ if (require.extensions) {
|
||||
filename: filename,
|
||||
client: true
|
||||
};
|
||||
var template = fs.readFileSync(filename).toString();
|
||||
var template = fileLoader(filename).toString();
|
||||
var fn = exports.compile(template, options);
|
||||
module._compile('module.exports = ' + fn.toString() + ';', filename);
|
||||
};
|
||||
|
||||
+3
-2
@@ -133,11 +133,12 @@ exports.shallowCopy = function (to, from) {
|
||||
* @private
|
||||
*/
|
||||
exports.shallowCopyFromList = function (to, from, list) {
|
||||
list.forEach(function (p) {
|
||||
for (var i = 0; i < list.length; i++) {
|
||||
var p = list[i];
|
||||
if (typeof from[p] != 'undefined') {
|
||||
to[p] = from[p];
|
||||
}
|
||||
});
|
||||
}
|
||||
return to;
|
||||
};
|
||||
|
||||
|
||||
+9
-9
@@ -14,13 +14,13 @@
|
||||
]
|
||||
],
|
||||
"_from": "ejs@>=2.5.2 <3.0.0",
|
||||
"_id": "ejs@2.5.5",
|
||||
"_id": "ejs@2.5.7",
|
||||
"_inCache": true,
|
||||
"_location": "/ejs",
|
||||
"_nodeVersion": "6.9.1",
|
||||
"_npmOperationalInternal": {
|
||||
"host": "packages-18-east.internal.npmjs.com",
|
||||
"tmp": "tmp/ejs-2.5.5.tgz_1481011535826_0.4493071837350726"
|
||||
"host": "s3://npm-registry-packages",
|
||||
"tmp": "tmp/ejs-2.5.7.tgz_1501385411193_0.3807816591579467"
|
||||
},
|
||||
"_npmUser": {
|
||||
"name": "mde",
|
||||
@@ -40,8 +40,8 @@
|
||||
"_requiredBy": [
|
||||
"#DEV:/"
|
||||
],
|
||||
"_resolved": "https://registry.npmjs.org/ejs/-/ejs-2.5.5.tgz",
|
||||
"_shasum": "6ef4e954ea7dcf54f66aad2fe7aa421932d9ed77",
|
||||
"_resolved": "https://registry.npmjs.org/ejs/-/ejs-2.5.7.tgz",
|
||||
"_shasum": "cc872c168880ae3c7189762fd5ffc00896c9518a",
|
||||
"_shrinkwrap": null,
|
||||
"_spec": "ejs@^2.5.2",
|
||||
"_where": "/brodocs",
|
||||
@@ -75,8 +75,8 @@
|
||||
},
|
||||
"directories": {},
|
||||
"dist": {
|
||||
"shasum": "6ef4e954ea7dcf54f66aad2fe7aa421932d9ed77",
|
||||
"tarball": "https://registry.npmjs.org/ejs/-/ejs-2.5.5.tgz"
|
||||
"shasum": "cc872c168880ae3c7189762fd5ffc00896c9518a",
|
||||
"tarball": "https://registry.npmjs.org/ejs/-/ejs-2.5.7.tgz"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=0.10.0"
|
||||
@@ -107,7 +107,7 @@
|
||||
"devdoc": "jake doc[dev]",
|
||||
"doc": "jake doc",
|
||||
"lint": "eslint \"**/*.js\" Jakefile",
|
||||
"test": "mocha"
|
||||
"test": "jake test"
|
||||
},
|
||||
"version": "2.5.5"
|
||||
"version": "2.5.7"
|
||||
}
|
||||
|
||||
-994
@@ -1,994 +0,0 @@
|
||||
/* jshint mocha: true */
|
||||
/* eslint-env node, mocha */
|
||||
|
||||
/**
|
||||
* Module dependencies.
|
||||
*/
|
||||
|
||||
var ejs = require('..');
|
||||
var fs = require('fs');
|
||||
var read = fs.readFileSync;
|
||||
var assert = require('assert');
|
||||
var path = require('path');
|
||||
var LRU = require('lru-cache');
|
||||
|
||||
try {
|
||||
fs.mkdirSync(__dirname + '/tmp');
|
||||
} catch (ex) {
|
||||
if (ex.code !== 'EEXIST') {
|
||||
throw ex;
|
||||
}
|
||||
}
|
||||
|
||||
// From https://gist.github.com/pguillory/729616
|
||||
function hook_stdio(stream, callback) {
|
||||
var old_write = stream.write;
|
||||
|
||||
stream.write = (function() {
|
||||
return function(string, encoding, fd) {
|
||||
callback(string, encoding, fd);
|
||||
};
|
||||
})(stream.write);
|
||||
|
||||
return function() {
|
||||
stream.write = old_write;
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Load fixture `name`.
|
||||
*/
|
||||
|
||||
function fixture(name) {
|
||||
return read('test/fixtures/' + name, 'utf8');
|
||||
}
|
||||
|
||||
/**
|
||||
* User fixtures.
|
||||
*/
|
||||
|
||||
var users = [];
|
||||
users.push({name: 'geddy'});
|
||||
users.push({name: 'neil'});
|
||||
users.push({name: 'alex'});
|
||||
|
||||
suite('ejs.compile(str, options)', function () {
|
||||
test('compile to a function', function () {
|
||||
var fn = ejs.compile('<p>yay</p>');
|
||||
assert.equal(fn(), '<p>yay</p>');
|
||||
});
|
||||
|
||||
test('empty input works', function () {
|
||||
var fn = ejs.compile('');
|
||||
assert.equal(fn(), '');
|
||||
});
|
||||
|
||||
test('throw if there are syntax errors', function () {
|
||||
try {
|
||||
ejs.compile(fixture('fail.ejs'));
|
||||
}
|
||||
catch (err) {
|
||||
assert.ok(err.message.indexOf('compiling ejs') > -1);
|
||||
|
||||
try {
|
||||
ejs.compile(fixture('fail.ejs'), {filename: 'fail.ejs'});
|
||||
}
|
||||
catch (err) {
|
||||
assert.ok(err.message.indexOf('fail.ejs') > -1);
|
||||
return;
|
||||
}
|
||||
}
|
||||
throw new Error('no error reported when there should be');
|
||||
});
|
||||
|
||||
test('allow customizing delimiter local var', function () {
|
||||
var fn;
|
||||
fn = ejs.compile('<p><?= name ?></p>', {delimiter: '?'});
|
||||
assert.equal(fn({name: 'geddy'}), '<p>geddy</p>');
|
||||
|
||||
fn = ejs.compile('<p><:= name :></p>', {delimiter: ':'});
|
||||
assert.equal(fn({name: 'geddy'}), '<p>geddy</p>');
|
||||
|
||||
fn = ejs.compile('<p><$= name $></p>', {delimiter: '$'});
|
||||
assert.equal(fn({name: 'geddy'}), '<p>geddy</p>');
|
||||
});
|
||||
|
||||
test('default to using ejs.delimiter', function () {
|
||||
var fn;
|
||||
ejs.delimiter = '&';
|
||||
fn = ejs.compile('<p><&= name &></p>');
|
||||
assert.equal(fn({name: 'geddy'}), '<p>geddy</p>');
|
||||
|
||||
fn = ejs.compile('<p><|= name |></p>', {delimiter: '|'});
|
||||
assert.equal(fn({name: 'geddy'}), '<p>geddy</p>');
|
||||
delete ejs.delimiter;
|
||||
});
|
||||
|
||||
test('have a working client option', function () {
|
||||
var fn;
|
||||
var str;
|
||||
var preFn;
|
||||
fn = ejs.compile('<p><%= foo %></p>', {client: true});
|
||||
str = fn.toString();
|
||||
if (!process.env.running_under_istanbul) {
|
||||
eval('var preFn = ' + str);
|
||||
assert.equal(preFn({foo: 'bar'}), '<p>bar</p>');
|
||||
}
|
||||
});
|
||||
|
||||
test('support client mode without locals', function () {
|
||||
var fn;
|
||||
var str;
|
||||
var preFn;
|
||||
fn = ejs.compile('<p><%= "foo" %></p>', {client: true});
|
||||
str = fn.toString();
|
||||
if (!process.env.running_under_istanbul) {
|
||||
eval('var preFn = ' + str);
|
||||
assert.equal(preFn(), '<p>foo</p>');
|
||||
}
|
||||
});
|
||||
|
||||
test('not include rethrow() in client mode if compileDebug is false', function () {
|
||||
var fn = ejs.compile('<p><%= "foo" %></p>', {
|
||||
client: true,
|
||||
compileDebug: false
|
||||
});
|
||||
// There could be a `rethrow` in the function declaration
|
||||
assert((fn.toString().match(/rethrow/g) || []).length <= 1);
|
||||
});
|
||||
|
||||
test('support custom escape function', function () {
|
||||
var customEscape;
|
||||
var fn;
|
||||
customEscape = function customEscape(str) {
|
||||
return !str ? '' : str.toUpperCase();
|
||||
};
|
||||
fn = ejs.compile('HELLO <%= name %>', {escape: customEscape});
|
||||
assert.equal(fn({name: 'world'}), 'HELLO WORLD');
|
||||
});
|
||||
|
||||
test('support custom escape function in client mode', function () {
|
||||
var customEscape;
|
||||
var fn;
|
||||
var str;
|
||||
customEscape = function customEscape(str) {
|
||||
return !str ? '' : str.toUpperCase();
|
||||
};
|
||||
fn = ejs.compile('HELLO <%= name %>', {escape: customEscape, client: true});
|
||||
str = fn.toString();
|
||||
if (!process.env.running_under_istanbul) {
|
||||
eval('var preFn = ' + str);
|
||||
assert.equal(preFn({name: 'world'}), 'HELLO WORLD'); // eslint-disable-line no-undef
|
||||
}
|
||||
});
|
||||
|
||||
test('strict mode works', function () {
|
||||
assert.equal(ejs.render(fixture('strict.ejs'), {}, {strict: true}), 'true');
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
/* Old API -- remove when this shim goes away */
|
||||
suite('ejs.render(str, dataAndOpts)', function () {
|
||||
test('render the template with data/opts passed together', function () {
|
||||
assert.equal(ejs.render('<p><?= foo ?></p>', {foo: 'yay', delimiter: '?'}),
|
||||
'<p>yay</p>');
|
||||
});
|
||||
|
||||
test('disallow unsafe opts passed along in data', function () {
|
||||
assert.equal(ejs.render('<p><?= locals.foo ?></p>',
|
||||
// localsName should not get reset because it's blacklisted
|
||||
{_with: false, foo: 'yay', delimiter: '?', localsName: '_'}),
|
||||
'<p>yay</p>');
|
||||
});
|
||||
});
|
||||
|
||||
suite('ejs.render(str, data, opts)', function () {
|
||||
test('render the template', function () {
|
||||
assert.equal(ejs.render('<p>yay</p>'), '<p>yay</p>');
|
||||
});
|
||||
|
||||
test('empty input works', function () {
|
||||
assert.equal(ejs.render(''), '');
|
||||
});
|
||||
|
||||
test('undefined renders nothing escaped', function () {
|
||||
assert.equal(ejs.render('<%= undefined %>'), '');
|
||||
});
|
||||
|
||||
test('undefined renders nothing raw', function () {
|
||||
assert.equal(ejs.render('<%- undefined %>'), '');
|
||||
});
|
||||
|
||||
test('null renders nothing escaped', function () {
|
||||
assert.equal(ejs.render('<%= null %>'), '');
|
||||
});
|
||||
|
||||
test('null renders nothing raw', function () {
|
||||
assert.equal(ejs.render('<%- null %>'), '');
|
||||
});
|
||||
|
||||
test('zero-value data item renders something escaped', function () {
|
||||
assert.equal(ejs.render('<%= 0 %>'), '0');
|
||||
});
|
||||
|
||||
test('zero-value data object renders something raw', function () {
|
||||
assert.equal(ejs.render('<%- 0 %>'), '0');
|
||||
});
|
||||
|
||||
test('accept locals', function () {
|
||||
assert.equal(ejs.render('<p><%= name %></p>', {name: 'geddy'}),
|
||||
'<p>geddy</p>');
|
||||
});
|
||||
|
||||
test('accept locals without using with() {}', function () {
|
||||
assert.equal(ejs.render('<p><%= locals.name %></p>', {name: 'geddy'},
|
||||
{_with: false}),
|
||||
'<p>geddy</p>');
|
||||
assert.throws(function() {
|
||||
ejs.render('<p><%= name %></p>', {name: 'geddy'},
|
||||
{_with: false});
|
||||
}, /name is not defined/);
|
||||
});
|
||||
|
||||
test('accept custom name for locals', function () {
|
||||
ejs.localsName = 'it';
|
||||
assert.equal(ejs.render('<p><%= it.name %></p>', {name: 'geddy'},
|
||||
{_with: false}),
|
||||
'<p>geddy</p>');
|
||||
assert.throws(function() {
|
||||
ejs.render('<p><%= name %></p>', {name: 'geddy'},
|
||||
{_with: false});
|
||||
}, /name is not defined/);
|
||||
ejs.localsName = 'locals';
|
||||
});
|
||||
|
||||
test('support caching', function () {
|
||||
var file = __dirname + '/tmp/render.ejs';
|
||||
var options = {cache: true, filename: file};
|
||||
var out = ejs.render('<p>Old</p>', {}, options);
|
||||
var expected = '<p>Old</p>';
|
||||
assert.equal(out, expected);
|
||||
// Assert no change, still in cache
|
||||
out = ejs.render('<p>New</p>', {}, options);
|
||||
assert.equal(out, expected);
|
||||
});
|
||||
|
||||
test('support LRU caching', function () {
|
||||
var oldCache = ejs.cache;
|
||||
var file = __dirname + '/tmp/render.ejs';
|
||||
var options = {cache: true, filename: file};
|
||||
var out;
|
||||
var expected = '<p>Old</p>';
|
||||
|
||||
// Switch to LRU
|
||||
ejs.cache = LRU();
|
||||
|
||||
out = ejs.render('<p>Old</p>', {}, options);
|
||||
assert.equal(out, expected);
|
||||
// Assert no change, still in cache
|
||||
out = ejs.render('<p>New</p>', {}, options);
|
||||
assert.equal(out, expected);
|
||||
|
||||
// Restore system cache
|
||||
ejs.cache = oldCache;
|
||||
});
|
||||
|
||||
test('opts.context', function () {
|
||||
var ctxt = {foo: 'FOO'};
|
||||
var out = ejs.render('<%= this.foo %>', {}, {context: ctxt});
|
||||
assert.equal(out, ctxt.foo);
|
||||
});
|
||||
});
|
||||
|
||||
suite('ejs.renderFile(path, [data], [options], fn)', function () {
|
||||
test('render a file', function(done) {
|
||||
ejs.renderFile('test/fixtures/para.ejs', function(err, html) {
|
||||
if (err) {
|
||||
return done(err);
|
||||
}
|
||||
assert.equal(html, '<p>hey</p>\n');
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
||||
test('accept locals', function(done) {
|
||||
var data = {name: 'fonebone'};
|
||||
var options = {delimiter: '$'};
|
||||
ejs.renderFile('test/fixtures/user.ejs', data, options, function(err, html) {
|
||||
if (err) {
|
||||
return done(err);
|
||||
}
|
||||
assert.equal(html, '<h1>fonebone</h1>\n');
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
||||
test('accept locals without using with() {}', function(done) {
|
||||
var data = {name: 'fonebone'};
|
||||
var options = {delimiter: '$', _with: false};
|
||||
var doneCount = 0;
|
||||
ejs.renderFile('test/fixtures/user-no-with.ejs', data, options, function(err, html) {
|
||||
if (err) {
|
||||
if (doneCount === 2) {
|
||||
return;
|
||||
}
|
||||
doneCount = 2;
|
||||
return done(err);
|
||||
}
|
||||
assert.equal(html, '<h1>fonebone</h1>\n');
|
||||
doneCount++;
|
||||
if (doneCount === 2) {
|
||||
done();
|
||||
}
|
||||
});
|
||||
ejs.renderFile('test/fixtures/user.ejs', data, options, function(err) {
|
||||
if (!err) {
|
||||
if (doneCount === 2) {
|
||||
return;
|
||||
}
|
||||
doneCount = 2;
|
||||
return done(new Error('error not thrown'));
|
||||
}
|
||||
doneCount++;
|
||||
if (doneCount === 2) {
|
||||
done();
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
test('not catch err thrown by callback', function(done) {
|
||||
var data = {name: 'fonebone'};
|
||||
var options = {delimiter: '$'};
|
||||
var counter = 0;
|
||||
|
||||
var d = require('domain').create();
|
||||
d.on('error', function (err) {
|
||||
assert.equal(counter, 1);
|
||||
assert.equal(err.message, 'Exception in callback');
|
||||
done();
|
||||
});
|
||||
d.run(function () {
|
||||
// process.nextTick() needed to work around mochajs/mocha#513
|
||||
//
|
||||
// tl;dr: mocha doesn't support synchronous exception throwing in
|
||||
// domains. Have to make it async. Ticket closed because: "domains are
|
||||
// deprecated :D"
|
||||
process.nextTick(function () {
|
||||
ejs.renderFile('test/fixtures/user.ejs', data, options, function(err) {
|
||||
counter++;
|
||||
if (err) {
|
||||
assert.notEqual(err.message, 'Exception in callback');
|
||||
return done(err);
|
||||
}
|
||||
throw new Error('Exception in callback');
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
test('support caching', function (done) {
|
||||
var expected = '<p>Old</p>';
|
||||
var file = __dirname + '/tmp/renderFile.ejs';
|
||||
var options = {cache: true};
|
||||
fs.writeFileSync(file, '<p>Old</p>');
|
||||
|
||||
ejs.renderFile(file, {}, options, function (err, out) {
|
||||
if (err) {
|
||||
done(err);
|
||||
}
|
||||
fs.writeFileSync(file, '<p>New</p>');
|
||||
assert.equal(out, expected);
|
||||
|
||||
ejs.renderFile(file, {}, options, function (err, out) {
|
||||
if (err) {
|
||||
done(err);
|
||||
}
|
||||
// Assert no change, still in cache
|
||||
assert.equal(out, expected);
|
||||
done();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
test('opts.context', function (done) {
|
||||
var ctxt = {foo: 'FOO'};
|
||||
ejs.renderFile('test/fixtures/with-context.ejs', {}, {context: ctxt}, function(err, html) {
|
||||
if (err) {
|
||||
return done(err);
|
||||
}
|
||||
assert.equal(html, ctxt.foo + '\n');
|
||||
done();
|
||||
});
|
||||
|
||||
});
|
||||
});
|
||||
|
||||
suite('cache specific', function () {
|
||||
test('`clearCache` work properly', function () {
|
||||
var expected = '<p>Old</p>';
|
||||
var file = __dirname + '/tmp/clearCache.ejs';
|
||||
var options = {cache: true, filename: file};
|
||||
var out = ejs.render('<p>Old</p>', {}, options);
|
||||
assert.equal(out, expected);
|
||||
|
||||
ejs.clearCache();
|
||||
|
||||
expected = '<p>New</p>';
|
||||
out = ejs.render('<p>New</p>', {}, options);
|
||||
assert.equal(out, expected);
|
||||
});
|
||||
|
||||
test('`clearCache` work properly, LRU', function () {
|
||||
var expected = '<p>Old</p>';
|
||||
var oldCache = ejs.cache;
|
||||
var file = __dirname + '/tmp/clearCache.ejs';
|
||||
var options = {cache: true, filename: file};
|
||||
var out;
|
||||
|
||||
ejs.cache = LRU();
|
||||
|
||||
out = ejs.render('<p>Old</p>', {}, options);
|
||||
assert.equal(out, expected);
|
||||
ejs.clearCache();
|
||||
expected = '<p>New</p>';
|
||||
out = ejs.render('<p>New</p>', {}, options);
|
||||
assert.equal(out, expected);
|
||||
|
||||
ejs.cache = oldCache;
|
||||
});
|
||||
|
||||
test('LRU with cache-size 1', function () {
|
||||
var oldCache = ejs.cache;
|
||||
var options;
|
||||
var out;
|
||||
var expected;
|
||||
var file;
|
||||
|
||||
ejs.cache = LRU(1);
|
||||
|
||||
file = __dirname + '/tmp/render1.ejs';
|
||||
options = {cache: true, filename: file};
|
||||
out = ejs.render('<p>File1</p>', {}, options);
|
||||
expected = '<p>File1</p>';
|
||||
assert.equal(out, expected);
|
||||
|
||||
// Same filename, different template, but output
|
||||
// should be the same because cache
|
||||
file = __dirname + '/tmp/render1.ejs';
|
||||
options = {cache: true, filename: file};
|
||||
out = ejs.render('<p>ChangedFile1</p>', {}, options);
|
||||
expected = '<p>File1</p>';
|
||||
assert.equal(out, expected);
|
||||
|
||||
// Different filiename -- output should be different,
|
||||
// and previous cache-entry should be evicted
|
||||
file = __dirname + '/tmp/render2.ejs';
|
||||
options = {cache: true, filename: file};
|
||||
out = ejs.render('<p>File2</p>', {}, options);
|
||||
expected = '<p>File2</p>';
|
||||
assert.equal(out, expected);
|
||||
|
||||
// Entry with first filename should now be out of cache,
|
||||
// results should be different
|
||||
file = __dirname + '/tmp/render1.ejs';
|
||||
options = {cache: true, filename: file};
|
||||
out = ejs.render('<p>ChangedFile1</p>', {}, options);
|
||||
expected = '<p>ChangedFile1</p>';
|
||||
assert.equal(out, expected);
|
||||
|
||||
ejs.cache = oldCache;
|
||||
});
|
||||
});
|
||||
|
||||
suite('<%', function () {
|
||||
test('without semicolons', function () {
|
||||
assert.equal(ejs.render(fixture('no.semicolons.ejs')),
|
||||
fixture('no.semicolons.html'));
|
||||
});
|
||||
});
|
||||
|
||||
suite('<%=', function () {
|
||||
test('should not throw an error with a // comment on the final line', function () {
|
||||
assert.equal(ejs.render('<%=\n// a comment\nname\n// another comment %>', {name: ' <script>'}),
|
||||
'&nbsp;<script>');
|
||||
});
|
||||
|
||||
test('escape &<script>', function () {
|
||||
assert.equal(ejs.render('<%= name %>', {name: ' <script>'}),
|
||||
'&nbsp;<script>');
|
||||
});
|
||||
|
||||
test('should escape \'', function () {
|
||||
assert.equal(ejs.render('<%= name %>', {name: 'The Jones\'s'}),
|
||||
'The Jones's');
|
||||
});
|
||||
|
||||
test('should escape &foo_bar;', function () {
|
||||
assert.equal(ejs.render('<%= name %>', {name: '&foo_bar;'}),
|
||||
'&foo_bar;');
|
||||
});
|
||||
|
||||
test('should accept custom function', function() {
|
||||
|
||||
var customEscape = function customEscape(str) {
|
||||
return !str ? '' : str.toUpperCase();
|
||||
};
|
||||
|
||||
assert.equal(
|
||||
ejs.render('<%= name %>', {name: 'The Jones\'s'}, {escape: customEscape}),
|
||||
'THE JONES\'S'
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
suite('<%-', function () {
|
||||
test('should not throw an error with a // comment on the final line', function () {
|
||||
assert.equal(ejs.render('<%-\n// a comment\nname\n// another comment %>', {name: ' <script>'}),
|
||||
' <script>');
|
||||
});
|
||||
|
||||
test('not escape', function () {
|
||||
assert.equal(ejs.render('<%- name %>', {name: '<script>'}),
|
||||
'<script>');
|
||||
});
|
||||
|
||||
test('terminate gracefully if no close tag is found', function () {
|
||||
try {
|
||||
ejs.compile('<h1>oops</h1><%- name ->');
|
||||
throw new Error('Expected parse failure');
|
||||
}
|
||||
catch (err) {
|
||||
assert.ok(err.message.indexOf('Could not find matching close tag for') > -1);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
suite('%>', function () {
|
||||
test('produce newlines', function () {
|
||||
assert.equal(ejs.render(fixture('newlines.ejs'), {users: users}),
|
||||
fixture('newlines.html'));
|
||||
});
|
||||
test('works with `-%>` interspersed', function () {
|
||||
assert.equal(ejs.render(fixture('newlines.mixed.ejs'), {users: users}),
|
||||
fixture('newlines.mixed.html'));
|
||||
});
|
||||
test('consecutive tags work', function () {
|
||||
assert.equal(ejs.render(fixture('consecutive-tags.ejs')),
|
||||
fixture('consecutive-tags.html'));
|
||||
});
|
||||
});
|
||||
|
||||
suite('-%>', function () {
|
||||
test('not produce newlines', function () {
|
||||
assert.equal(ejs.render(fixture('no.newlines.ejs'), {users: users}),
|
||||
fixture('no.newlines.html'));
|
||||
});
|
||||
test('stack traces work', function () {
|
||||
try {
|
||||
ejs.render(fixture('no.newlines.error.ejs'));
|
||||
}
|
||||
catch (e) {
|
||||
if (e.message.indexOf('>> 4| <%= qdata %>') > -1) {
|
||||
return;
|
||||
}
|
||||
throw e;
|
||||
}
|
||||
throw new Error('Expected ReferenceError');
|
||||
});
|
||||
|
||||
test('works with unix style', function () {
|
||||
var content = '<ul><% -%>\n'
|
||||
+ '<% users.forEach(function(user){ -%>\n'
|
||||
+ '<li><%= user.name -%></li>\n'
|
||||
+ '<% }) -%>\n'
|
||||
+ '</ul><% -%>\n';
|
||||
|
||||
var expectedResult = '<ul><li>geddy</li>\n<li>neil</li>\n<li>alex</li>\n</ul>';
|
||||
var fn;
|
||||
fn = ejs.compile(content);
|
||||
assert.equal(fn({users: users}),
|
||||
expectedResult);
|
||||
});
|
||||
|
||||
test('works with windows style', function () {
|
||||
var content = '<ul><% -%>\r\n'
|
||||
+ '<% users.forEach(function(user){ -%>\r\n'
|
||||
+ '<li><%= user.name -%></li>\r\n'
|
||||
+ '<% }) -%>\r\n'
|
||||
+ '</ul><% -%>\r\n';
|
||||
|
||||
var expectedResult = '<ul><li>geddy</li>\r\n<li>neil</li>\r\n<li>alex</li>\r\n</ul>';
|
||||
var fn;
|
||||
fn = ejs.compile(content);
|
||||
assert.equal(fn({users: users}),
|
||||
expectedResult);
|
||||
});
|
||||
});
|
||||
|
||||
suite('<%%', function () {
|
||||
test('produce literals', function () {
|
||||
assert.equal(ejs.render('<%%- "foo" %>'),
|
||||
'<%- "foo" %>');
|
||||
});
|
||||
test('work without an end tag', function () {
|
||||
assert.equal(ejs.render('<%%'), '<%');
|
||||
assert.equal(ejs.render(fixture('literal.ejs'), {}, {delimiter: ' '}),
|
||||
fixture('literal.html'));
|
||||
});
|
||||
});
|
||||
|
||||
suite('%%>', function () {
|
||||
test('produce literal', function () {
|
||||
assert.equal(ejs.render('%%>'),
|
||||
'%>');
|
||||
assert.equal(ejs.render(' >', {}, {delimiter: ' '}),
|
||||
' >');
|
||||
});
|
||||
});
|
||||
|
||||
suite('<%_ and _%>', function () {
|
||||
test('slurps spaces and tabs', function () {
|
||||
assert.equal(ejs.render(fixture('space-and-tab-slurp.ejs'), {users: users}),
|
||||
fixture('space-and-tab-slurp.html'));
|
||||
});
|
||||
});
|
||||
|
||||
suite('single quotes', function () {
|
||||
test('not mess up the constructed function', function () {
|
||||
assert.equal(ejs.render(fixture('single-quote.ejs')),
|
||||
fixture('single-quote.html'));
|
||||
});
|
||||
});
|
||||
|
||||
suite('double quotes', function () {
|
||||
test('not mess up the constructed function', function () {
|
||||
assert.equal(ejs.render(fixture('double-quote.ejs')),
|
||||
fixture('double-quote.html'));
|
||||
});
|
||||
});
|
||||
|
||||
suite('backslashes', function () {
|
||||
test('escape', function () {
|
||||
assert.equal(ejs.render(fixture('backslash.ejs')),
|
||||
fixture('backslash.html'));
|
||||
});
|
||||
});
|
||||
|
||||
suite('messed up whitespace', function () {
|
||||
test('work', function () {
|
||||
assert.equal(ejs.render(fixture('messed.ejs'), {users: users}),
|
||||
fixture('messed.html'));
|
||||
});
|
||||
});
|
||||
|
||||
suite('exceptions', function () {
|
||||
test('produce useful stack traces', function () {
|
||||
try {
|
||||
ejs.render(fixture('error.ejs'), {}, {filename: 'error.ejs'});
|
||||
}
|
||||
catch (err) {
|
||||
assert.equal(err.path, 'error.ejs');
|
||||
assert.equal(err.stack.split('\n').slice(0, 8).join('\n'), fixture('error.out'));
|
||||
return;
|
||||
}
|
||||
throw new Error('no error reported when there should be');
|
||||
});
|
||||
|
||||
test('not include fancy stack info if compileDebug is false', function () {
|
||||
try {
|
||||
ejs.render(fixture('error.ejs'), {}, {
|
||||
filename: 'error.ejs',
|
||||
compileDebug: false
|
||||
});
|
||||
}
|
||||
catch (err) {
|
||||
assert.ok(!err.path);
|
||||
assert.notEqual(err.stack.split('\n').slice(0, 8).join('\n'), fixture('error.out'));
|
||||
return;
|
||||
}
|
||||
throw new Error('no error reported when there should be');
|
||||
});
|
||||
|
||||
var unhook = null;
|
||||
test('log JS source when debug is set', function (done) {
|
||||
var out = '';
|
||||
var needToExit = false;
|
||||
unhook = hook_stdio(process.stdout, function (str) {
|
||||
out += str;
|
||||
if (needToExit) {
|
||||
return;
|
||||
}
|
||||
if (out.indexOf('__output')) {
|
||||
needToExit = true;
|
||||
unhook();
|
||||
unhook = null;
|
||||
return done();
|
||||
}
|
||||
});
|
||||
ejs.render(fixture('hello-world.ejs'), {}, {debug: true});
|
||||
});
|
||||
teardown(function() {
|
||||
if (!unhook) {
|
||||
return;
|
||||
}
|
||||
unhook();
|
||||
unhook = null;
|
||||
});
|
||||
});
|
||||
|
||||
suite('rmWhitespace', function () {
|
||||
test('works', function () {
|
||||
assert.equal(ejs.render(fixture('rmWhitespace.ejs'), {}, {rmWhitespace: true}),
|
||||
fixture('rmWhitespace.html'));
|
||||
});
|
||||
});
|
||||
|
||||
suite('include()', function () {
|
||||
test('include ejs', function () {
|
||||
var file = 'test/fixtures/include-simple.ejs';
|
||||
assert.equal(ejs.render(fixture('include-simple.ejs'), {}, {filename: file}),
|
||||
fixture('include-simple.html'));
|
||||
});
|
||||
|
||||
test('include ejs fails without `filename`', function () {
|
||||
try {
|
||||
ejs.render(fixture('include-simple.ejs'));
|
||||
}
|
||||
catch (err) {
|
||||
assert.ok(err.message.indexOf('requires the \'filename\' option') > -1);
|
||||
return;
|
||||
}
|
||||
throw new Error('expected inclusion error');
|
||||
});
|
||||
|
||||
test('strips BOM', function () {
|
||||
assert.equal(
|
||||
ejs.render('<%- include("fixtures/includes/bom.ejs") %>',
|
||||
{}, {filename: path.join(__dirname, 'f.ejs')}),
|
||||
'<p>This is a file with BOM.</p>\n');
|
||||
});
|
||||
|
||||
test('include ejs with locals', function () {
|
||||
var file = 'test/fixtures/include.ejs';
|
||||
assert.equal(ejs.render(fixture('include.ejs'), {pets: users}, {filename: file, delimiter: '@'}),
|
||||
fixture('include.html'));
|
||||
});
|
||||
|
||||
test('include ejs with absolute path and locals', function () {
|
||||
var file = 'test/fixtures/include-abspath.ejs';
|
||||
assert.equal(ejs.render(fixture('include-abspath.ejs'),
|
||||
{dir: path.join(__dirname, 'fixtures'), pets: users, path: path},
|
||||
{filename: file, delimiter: '@'}),
|
||||
fixture('include.html'));
|
||||
});
|
||||
|
||||
test('include ejs with set root path', function () {
|
||||
var file = 'test/fixtures/include-root.ejs';
|
||||
var viewsPath = path.join(__dirname, 'fixtures');
|
||||
assert.equal(ejs.render(fixture('include-root.ejs'), {pets: users}, {filename: file, delimiter: '@',root:viewsPath}),
|
||||
fixture('include.html'));
|
||||
});
|
||||
|
||||
test('work when nested', function () {
|
||||
var file = 'test/fixtures/menu.ejs';
|
||||
assert.equal(ejs.render(fixture('menu.ejs'), {pets: users}, {filename: file}),
|
||||
fixture('menu.html'));
|
||||
});
|
||||
|
||||
test('work with a variable path', function () {
|
||||
var file = 'test/fixtures/menu_var.ejs';
|
||||
var includePath = 'includes/menu-item';
|
||||
assert.equal(ejs.render(fixture('menu.ejs'), {pets: users, varPath: includePath}, {filename: file}),
|
||||
fixture('menu.html'));
|
||||
});
|
||||
|
||||
test('include arbitrary files as-is', function () {
|
||||
var file = 'test/fixtures/include.css.ejs';
|
||||
assert.equal(ejs.render(fixture('include.css.ejs'), {pets: users}, {filename: file}),
|
||||
fixture('include.css.html'));
|
||||
});
|
||||
|
||||
test('pass compileDebug to include', function () {
|
||||
var file = 'test/fixtures/include.ejs';
|
||||
var fn;
|
||||
fn = ejs.compile(fixture('include.ejs'), {
|
||||
filename: file,
|
||||
delimiter: '@',
|
||||
compileDebug: false
|
||||
});
|
||||
try {
|
||||
// Render without a required variable reference
|
||||
fn({foo: 'asdf'});
|
||||
}
|
||||
catch(e) {
|
||||
assert.equal(e.message, 'pets is not defined');
|
||||
assert.ok(!e.path);
|
||||
return;
|
||||
}
|
||||
throw new Error('no error reported when there should be');
|
||||
});
|
||||
|
||||
test('is dynamic', function () {
|
||||
fs.writeFileSync(__dirname + '/tmp/include.ejs', '<p>Old</p>');
|
||||
var file = 'test/fixtures/include_cache.ejs';
|
||||
var options = {filename: file};
|
||||
var out = ejs.compile(fixture('include_cache.ejs'), options);
|
||||
assert.equal(out(), '<p>Old</p>\n');
|
||||
|
||||
fs.writeFileSync(__dirname + '/tmp/include.ejs', '<p>New</p>');
|
||||
assert.equal(out(), '<p>New</p>\n');
|
||||
});
|
||||
|
||||
test('support caching', function () {
|
||||
fs.writeFileSync(__dirname + '/tmp/include.ejs', '<p>Old</p>');
|
||||
var file = 'test/fixtures/include_cache.ejs';
|
||||
var options = {cache: true, filename: file};
|
||||
var out = ejs.render(fixture('include_cache.ejs'), {}, options);
|
||||
var expected = fixture('include_cache.html');
|
||||
assert.equal(out, expected);
|
||||
out = ejs.render(fixture('include_cache.ejs'), {}, options);
|
||||
// No change, still in cache
|
||||
assert.equal(out, expected);
|
||||
fs.writeFileSync(__dirname + '/tmp/include.ejs', '<p>New</p>');
|
||||
out = ejs.render(fixture('include_cache.ejs'), {}, options);
|
||||
assert.equal(out, expected);
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
suite('preprocessor include', function () {
|
||||
test('work', function () {
|
||||
var file = 'test/fixtures/include_preprocessor.ejs';
|
||||
assert.equal(ejs.render(fixture('include_preprocessor.ejs'), {pets: users}, {filename: file, delimiter: '@'}),
|
||||
fixture('include_preprocessor.html'));
|
||||
});
|
||||
|
||||
test('no false positives', function () {
|
||||
assert.equal(ejs.render('<% %> include foo <% %>'), ' include foo ');
|
||||
});
|
||||
|
||||
test('fails without `filename`', function () {
|
||||
try {
|
||||
ejs.render(fixture('include_preprocessor.ejs'), {pets: users}, {delimiter: '@'});
|
||||
}
|
||||
catch (err) {
|
||||
assert.ok(err.message.indexOf('requires the \'filename\' option') > -1);
|
||||
return;
|
||||
}
|
||||
throw new Error('expected inclusion error');
|
||||
});
|
||||
|
||||
test('strips BOM', function () {
|
||||
assert.equal(
|
||||
ejs.render('<% include fixtures/includes/bom.ejs %>',
|
||||
{}, {filename: path.join(__dirname, 'f.ejs')}),
|
||||
'<p>This is a file with BOM.</p>\n');
|
||||
});
|
||||
|
||||
test('work when nested', function () {
|
||||
var file = 'test/fixtures/menu_preprocessor.ejs';
|
||||
assert.equal(ejs.render(fixture('menu_preprocessor.ejs'), {pets: users}, {filename: file}),
|
||||
fixture('menu_preprocessor.html'));
|
||||
});
|
||||
|
||||
test('tracks dependency correctly', function () {
|
||||
var file = 'test/fixtures/menu_preprocessor.ejs';
|
||||
var fn = ejs.compile(fixture('menu_preprocessor.ejs'), {filename: file});
|
||||
assert(fn.dependencies.length);
|
||||
});
|
||||
|
||||
test('include arbitrary files as-is', function () {
|
||||
var file = 'test/fixtures/include_preprocessor.css.ejs';
|
||||
assert.equal(ejs.render(fixture('include_preprocessor.css.ejs'), {pets: users}, {filename: file}),
|
||||
fixture('include_preprocessor.css.html'));
|
||||
});
|
||||
|
||||
test('pass compileDebug to include', function () {
|
||||
var file = 'test/fixtures/include_preprocessor.ejs';
|
||||
var fn;
|
||||
fn = ejs.compile(fixture('include_preprocessor.ejs'), {
|
||||
filename: file,
|
||||
delimiter: '@',
|
||||
compileDebug: false
|
||||
});
|
||||
try {
|
||||
// Render without a required variable reference
|
||||
fn({foo: 'asdf'});
|
||||
}
|
||||
catch(e) {
|
||||
assert.equal(e.message, 'pets is not defined');
|
||||
assert.ok(!e.path);
|
||||
return;
|
||||
}
|
||||
throw new Error('no error reported when there should be');
|
||||
});
|
||||
|
||||
test('is static', function () {
|
||||
fs.writeFileSync(__dirname + '/tmp/include_preprocessor.ejs', '<p>Old</p>');
|
||||
var file = 'test/fixtures/include_preprocessor_cache.ejs';
|
||||
var options = {filename: file};
|
||||
var out = ejs.compile(fixture('include_preprocessor_cache.ejs'), options);
|
||||
assert.equal(out(), '<p>Old</p>\n');
|
||||
|
||||
fs.writeFileSync(__dirname + '/tmp/include_preprocessor.ejs', '<p>New</p>');
|
||||
assert.equal(out(), '<p>Old</p>\n');
|
||||
});
|
||||
|
||||
test('support caching', function () {
|
||||
fs.writeFileSync(__dirname + '/tmp/include_preprocessor.ejs', '<p>Old</p>');
|
||||
var file = 'test/fixtures/include_preprocessor_cache.ejs';
|
||||
var options = {cache: true, filename: file};
|
||||
var out = ejs.render(fixture('include_preprocessor_cache.ejs'), {}, options);
|
||||
var expected = fixture('include_preprocessor_cache.html');
|
||||
assert.equal(out, expected);
|
||||
fs.writeFileSync(__dirname + '/tmp/include_preprocessor.ejs', '<p>New</p>');
|
||||
out = ejs.render(fixture('include_preprocessor_cache.ejs'), {}, options);
|
||||
assert.equal(out, expected);
|
||||
});
|
||||
|
||||
test('whitespace slurp and rmWhitespace work', function() {
|
||||
var file = 'test/fixtures/include_preprocessor_line_slurp.ejs';
|
||||
var template = fixture('include_preprocessor_line_slurp.ejs');
|
||||
var expected = fixture('include_preprocessor_line_slurp.html');
|
||||
var options = {rmWhitespace: true, filename: file};
|
||||
assert.equal(ejs.render(template, {}, options),
|
||||
expected);
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
suite('comments', function () {
|
||||
test('fully render with comments removed', function () {
|
||||
assert.equal(ejs.render(fixture('comments.ejs')),
|
||||
fixture('comments.html'));
|
||||
});
|
||||
});
|
||||
|
||||
suite('require', function () {
|
||||
|
||||
// Only works with inline/preprocessor includes
|
||||
test('allow ejs templates to be required as node modules', function () {
|
||||
var file = 'test/fixtures/include_preprocessor.ejs';
|
||||
var template = require(__dirname + '/fixtures/menu_preprocessor.ejs');
|
||||
if (!process.env.running_under_istanbul) {
|
||||
assert.equal(template({filename: file, pets: users}),
|
||||
fixture('menu_preprocessor.html'));
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
suite('examples', function () {
|
||||
function noop () {}
|
||||
fs.readdirSync('examples').forEach(function (f) {
|
||||
if (!/\.js$/.test(f)) {
|
||||
return;
|
||||
}
|
||||
suite(f, function () {
|
||||
test('doesn\'t throw any errors', function () {
|
||||
var stderr = hook_stdio(process.stderr, noop);
|
||||
var stdout = hook_stdio(process.stdout, noop);
|
||||
try {
|
||||
require('../examples/' + f);
|
||||
}
|
||||
catch (ex) {
|
||||
stdout();
|
||||
stderr();
|
||||
throw ex;
|
||||
}
|
||||
stdout();
|
||||
stderr();
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
suite('meta information', function () {
|
||||
test('has a version', function () {
|
||||
assert.strictEqual(ejs.VERSION, require('../package.json').version);
|
||||
});
|
||||
|
||||
test('had a name', function () {
|
||||
assert.strictEqual(ejs.name, 'ejs');
|
||||
});
|
||||
});
|
||||
-1
@@ -1 +0,0 @@
|
||||
\foo
|
||||
-1
@@ -1 +0,0 @@
|
||||
\foo
|
||||
-7
@@ -1,7 +0,0 @@
|
||||
<li><a href="foo"><% // double-slash comment %>foo</li>
|
||||
<li><a href="bar"><% /* C-style comment */ %>bar</li>
|
||||
<li><a href="baz"><% // double-slash comment with newline
|
||||
%>baz</li>
|
||||
<li><a href="qux"><% var x = 'qux'; // double-slash comment @ end of line %><%= x %></li>
|
||||
<li><a href="fee"><%# ERB style comment %>fee</li>
|
||||
<li><a href="bah"><%= 'not a ' + '//' + ' comment' %></a></li>
|
||||
-6
@@ -1,6 +0,0 @@
|
||||
<li><a href="foo">foo</li>
|
||||
<li><a href="bar">bar</li>
|
||||
<li><a href="baz">baz</li>
|
||||
<li><a href="qux">qux</li>
|
||||
<li><a href="fee">fee</li>
|
||||
<li><a href="bah">not a // comment</a></li>
|
||||
Generated
Vendored
-1
@@ -1 +0,0 @@
|
||||
<% var a = 'foo' %><% var b = 'bar' %><%= a %>
|
||||
Generated
Vendored
-1
@@ -1 +0,0 @@
|
||||
foo
|
||||
-1
@@ -1 +0,0 @@
|
||||
<p><%= "lo" + 'ki' %>'s "wheelchair"</p>
|
||||
-1
@@ -1 +0,0 @@
|
||||
<p>loki's "wheelchair"</p>
|
||||
-5
@@ -1,5 +0,0 @@
|
||||
<ul>
|
||||
<% if (users) { %>
|
||||
<p>Has users</p>
|
||||
<% } %>
|
||||
</ul>
|
||||
-8
@@ -1,8 +0,0 @@
|
||||
ReferenceError: error.ejs:2
|
||||
1| <ul>
|
||||
>> 2| <% if (users) { %>
|
||||
3| <p>Has users</p>
|
||||
4| <% } %>
|
||||
5| </ul>
|
||||
|
||||
users is not defined
|
||||
-1
@@ -1 +0,0 @@
|
||||
<% function foo() return 'foo'; %>
|
||||
-1
@@ -1 +0,0 @@
|
||||
<p>Hello world!</p>
|
||||
-5
@@ -1,5 +0,0 @@
|
||||
<ul>
|
||||
<@ pets.forEach(function(pet){ @>
|
||||
<@- include(path.join(dir, 'pet'), {pet: pet}); @>
|
||||
<@ }); @>
|
||||
</ul>
|
||||
-1
@@ -1 +0,0 @@
|
||||
<@- include('/include'); @>
|
||||
-3
@@ -1,3 +0,0 @@
|
||||
<ul>
|
||||
<%- include('hello-world'); %>
|
||||
</ul>
|
||||
-4
@@ -1,4 +0,0 @@
|
||||
<ul>
|
||||
<p>Hello world!</p>
|
||||
|
||||
</ul>
|
||||
-1
@@ -1 +0,0 @@
|
||||
<style><%- include('style.css', {value: 'bar'}); %></style>
|
||||
-4
@@ -1,4 +0,0 @@
|
||||
<style>body {
|
||||
foo: 'bar';
|
||||
}
|
||||
</style>
|
||||
-5
@@ -1,5 +0,0 @@
|
||||
<ul>
|
||||
<@ pets.forEach(function(pet){ @>
|
||||
<@- include('pet', {pet: pet}); @>
|
||||
<@ }); @>
|
||||
</ul>
|
||||
-12
@@ -1,12 +0,0 @@
|
||||
<ul>
|
||||
|
||||
<li>geddy</li>
|
||||
|
||||
|
||||
<li>neil</li>
|
||||
|
||||
|
||||
<li>alex</li>
|
||||
|
||||
|
||||
</ul>
|
||||
-1
@@ -1 +0,0 @@
|
||||
<%- include('../tmp/include') %>
|
||||
-1
@@ -1 +0,0 @@
|
||||
<p>Old</p>
|
||||
Generated
Vendored
-1
@@ -1 +0,0 @@
|
||||
<style><% var value = 'bar' %><% include style.css %></style>
|
||||
Generated
Vendored
-4
@@ -1,4 +0,0 @@
|
||||
<style>body {
|
||||
foo: 'bar';
|
||||
}
|
||||
</style>
|
||||
Generated
Vendored
-5
@@ -1,5 +0,0 @@
|
||||
<ul>
|
||||
<@ pets.forEach(function(pet){ @>
|
||||
<@ include pet @>
|
||||
<@ }) @>
|
||||
</ul>
|
||||
Generated
Vendored
-12
@@ -1,12 +0,0 @@
|
||||
<ul>
|
||||
|
||||
<li>geddy</li>
|
||||
|
||||
|
||||
<li>neil</li>
|
||||
|
||||
|
||||
<li>alex</li>
|
||||
|
||||
|
||||
</ul>
|
||||
Generated
Vendored
-1
@@ -1 +0,0 @@
|
||||
<%- include ../tmp/include_preprocessor %>
|
||||
Generated
Vendored
-1
@@ -1 +0,0 @@
|
||||
<p>Old</p>
|
||||
Generated
Vendored
-1
@@ -1 +0,0 @@
|
||||
<% include include_preprocessor_line_slurp_child %>
|
||||
Generated
Vendored
-5
@@ -1,5 +0,0 @@
|
||||
<div>
|
||||
12
|
||||
3
|
||||
45
|
||||
</div>
|
||||
Generated
Vendored
-5
@@ -1,5 +0,0 @@
|
||||
<div>
|
||||
1 <%_ if (true) { _%> 2
|
||||
3
|
||||
4 <%_ } _%> 5
|
||||
</div>
|
||||
-1
@@ -1 +0,0 @@
|
||||
<p>This is a file with BOM.</p>
|
||||
Generated
Vendored
-1
@@ -1 +0,0 @@
|
||||
<li><% include menu/item %></li>
|
||||
Generated
Vendored
-1
@@ -1 +0,0 @@
|
||||
<a href="/<%= url %>"><%= title %></a>
|
||||
-3
@@ -1,3 +0,0 @@
|
||||
<pre>There should be a space followed by a less-than sign and then two more
|
||||
spaces in the next line:
|
||||
< .</pre>
|
||||
-3
@@ -1,3 +0,0 @@
|
||||
<pre>There should be a space followed by a less-than sign and then two more
|
||||
spaces in the next line:
|
||||
< .</pre>
|
||||
-15
@@ -1,15 +0,0 @@
|
||||
<%- include('includes/menu-item', {
|
||||
url: '/foo'
|
||||
, title: 'Foo'
|
||||
}); -%>
|
||||
|
||||
<%- include('includes/menu-item', {
|
||||
url: '/bar'
|
||||
, title: 'Bar'
|
||||
}); -%>
|
||||
|
||||
<%- include('includes/menu-item', {
|
||||
url: '/baz'
|
||||
, title: 'Baz'
|
||||
}); -%>
|
||||
|
||||
-9
@@ -1,9 +0,0 @@
|
||||
<li><a href="//foo">Foo</a>
|
||||
</li>
|
||||
|
||||
<li><a href="//bar">Bar</a>
|
||||
</li>
|
||||
|
||||
<li><a href="//baz">Baz</a>
|
||||
</li>
|
||||
|
||||
Generated
Vendored
-11
@@ -1,11 +0,0 @@
|
||||
<% var url = '/foo' -%>
|
||||
<% var title = 'Foo' -%>
|
||||
<% include includes/menu-item -%>
|
||||
|
||||
<% var url = '/bar' -%>
|
||||
<% var title = 'Bar' -%>
|
||||
<% include includes/menu-item -%>
|
||||
|
||||
<% var url = '/baz' -%>
|
||||
<% var title = 'Baz' -%>
|
||||
<% include includes/menu-item -%>
|
||||
Generated
Vendored
-8
@@ -1,8 +0,0 @@
|
||||
<li><a href="//foo">Foo</a>
|
||||
</li>
|
||||
|
||||
<li><a href="//bar">Bar</a>
|
||||
</li>
|
||||
|
||||
<li><a href="//baz">Baz</a>
|
||||
</li>
|
||||
-15
@@ -1,15 +0,0 @@
|
||||
<%- include(varPath, {
|
||||
url: '/foo'
|
||||
, title: 'Foo'
|
||||
}); -%>
|
||||
|
||||
<%- include(varPath, {
|
||||
url: '/bar'
|
||||
, title: 'Bar'
|
||||
}); -%>
|
||||
|
||||
<%- include(varPath, {
|
||||
url: '/baz'
|
||||
, title: 'Baz'
|
||||
}); -%>
|
||||
|
||||
-1
@@ -1 +0,0 @@
|
||||
<ul><%users.forEach(function(user){%><li><%=user.name%></li><%})%></ul>
|
||||
-1
@@ -1 +0,0 @@
|
||||
<ul><li>geddy</li><li>neil</li><li>alex</li></ul>
|
||||
-5
@@ -1,5 +0,0 @@
|
||||
<ul>
|
||||
<% users.forEach(function(user){ %>
|
||||
<li><%= user.name %></li>
|
||||
<% }) %>
|
||||
</ul>
|
||||
-9
@@ -1,9 +0,0 @@
|
||||
<ul>
|
||||
|
||||
<li>geddy</li>
|
||||
|
||||
<li>neil</li>
|
||||
|
||||
<li>alex</li>
|
||||
|
||||
</ul>
|
||||
-6
@@ -1,6 +0,0 @@
|
||||
<ul>
|
||||
<% var unused1 = 'blah' -%>
|
||||
<% var unused2 = 'bleh' %>
|
||||
<% var unused3 = 'bloh' -%>
|
||||
<% var unused4 = 'bluh' %>
|
||||
</ul>
|
||||
-4
@@ -1,4 +0,0 @@
|
||||
<ul>
|
||||
|
||||
|
||||
</ul>
|
||||
-5
@@ -1,5 +0,0 @@
|
||||
<ul>
|
||||
<% users.forEach(function(user){ -%>
|
||||
<li><%= user.name %></li>
|
||||
<% }) -%>
|
||||
</ul>
|
||||
Generated
Vendored
-5
@@ -1,5 +0,0 @@
|
||||
AAA
|
||||
<% var data = "test"; -%>
|
||||
BBB
|
||||
<%= qdata %>
|
||||
CCC
|
||||
-5
@@ -1,5 +0,0 @@
|
||||
<ul>
|
||||
<li>geddy</li>
|
||||
<li>neil</li>
|
||||
<li>alex</li>
|
||||
</ul>
|
||||
-8
@@ -1,8 +0,0 @@
|
||||
This document does not use semicolons in scriptlets.
|
||||
<%
|
||||
var a = 'b'
|
||||
var b = 'c'
|
||||
var c
|
||||
c = b
|
||||
%>
|
||||
The value of c is: <%= c %>
|
||||
-3
@@ -1,3 +0,0 @@
|
||||
This document does not use semicolons in scriptlets.
|
||||
|
||||
The value of c is: c
|
||||
-1
@@ -1 +0,0 @@
|
||||
<p>hey</p>
|
||||
-1
@@ -1 +0,0 @@
|
||||
<li><@= pet.name @></li>
|
||||
-14
@@ -1,14 +0,0 @@
|
||||
<tag1>
|
||||
<tag2>
|
||||
A very long piece of text very long piece of text very long piece of
|
||||
text very long piece <% var f = 'f' %>of text very long piece of
|
||||
tex
t very long piece of<% %>text very long
|
||||
adsffadsfadsfad<%= f %>
|
||||
|
||||
piece of text.
|
||||
<% var a = 'a' %>
|
||||
Text again.
|
||||
<% var b = 'b' %>
|
||||
<% var c = 'c'
|
||||
var d = 'd' %>
|
||||
Another text. <%= c %>
|
||||
-8
@@ -1,8 +0,0 @@
|
||||
<tag1>
|
||||
<tag2>
|
||||
A very long piece of text very long piece of text very long piece of
|
||||
text very long piece of text very long piece of
|
||||
text very long piece oftext very long
|
||||
adsffadsfadsfadfpiece of text.
|
||||
Text again.
|
||||
Another text. c
|
||||
-1
@@ -1 +0,0 @@
|
||||
<p><%= 'loki' %>'s wheelchair</p>
|
||||
-1
@@ -1 +0,0 @@
|
||||
<p>loki's wheelchair</p>
|
||||
Generated
Vendored
-5
@@ -1,5 +0,0 @@
|
||||
<ul>
|
||||
<%_ users.forEach(function(user){ _%>
|
||||
<li><%= user.name %></li>
|
||||
<%_ }) _%>
|
||||
</ul>
|
||||
Generated
Vendored
-5
@@ -1,5 +0,0 @@
|
||||
<ul>
|
||||
<li>geddy</li>
|
||||
<li>neil</li>
|
||||
<li>alex</li>
|
||||
</ul>
|
||||
-5
@@ -1,5 +0,0 @@
|
||||
<%
|
||||
// Unspecified execution context should be `undefined` in strict mode
|
||||
var isReallyStrict = !((function () { return this; })())
|
||||
-%>
|
||||
<%= isReallyStrict -%>
|
||||
-3
@@ -1,3 +0,0 @@
|
||||
body {
|
||||
foo: '<%= value %>';
|
||||
}
|
||||
-1
@@ -1 +0,0 @@
|
||||
<h1><$= locals.name $></h1>
|
||||
-1
@@ -1 +0,0 @@
|
||||
<h1><$= name $></h1>
|
||||
-1
@@ -1 +0,0 @@
|
||||
<%= this.foo %>
|
||||
-3
@@ -1,3 +0,0 @@
|
||||
--ui tdd
|
||||
--reporter spec
|
||||
--check-leaks
|
||||
-1
@@ -1 +0,0 @@
|
||||
<p>New</p>
|
||||
-1
@@ -1 +0,0 @@
|
||||
<p>New</p>
|
||||
-1
@@ -1 +0,0 @@
|
||||
<p>New</p>
|
||||
Generated
Vendored
+8
@@ -254,6 +254,8 @@ Language names and aliases
|
||||
+-------------------------+---------------------------------------------------+
|
||||
| Haxe | haxe, hx |
|
||||
+-------------------------+---------------------------------------------------+
|
||||
| Hy | hy, hylang |
|
||||
+-------------------------+---------------------------------------------------+
|
||||
| Ini | ini |
|
||||
+-------------------------+---------------------------------------------------+
|
||||
| Inform7 | inform7, i7 |
|
||||
@@ -266,6 +268,8 @@ Language names and aliases
|
||||
+-------------------------+---------------------------------------------------+
|
||||
| JavaScript | javascript, js, jsx |
|
||||
+-------------------------+---------------------------------------------------+
|
||||
| Leaf | leaf |
|
||||
+-------------------------+---------------------------------------------------+
|
||||
| Lasso | lasso, ls, lassoscript |
|
||||
+-------------------------+---------------------------------------------------+
|
||||
| Less | less |
|
||||
@@ -302,6 +306,8 @@ Language names and aliases
|
||||
+-------------------------+---------------------------------------------------+
|
||||
| Moonscript | moonscript, moon |
|
||||
+-------------------------+---------------------------------------------------+
|
||||
| N1QL | n1ql |
|
||||
+-------------------------+---------------------------------------------------+
|
||||
| NSIS | nsis |
|
||||
+-------------------------+---------------------------------------------------+
|
||||
| Nginx | nginx, nginxconf |
|
||||
@@ -374,6 +380,8 @@ Language names and aliases
|
||||
+-------------------------+---------------------------------------------------+
|
||||
| Scilab | scilab, sci |
|
||||
+-------------------------+---------------------------------------------------+
|
||||
| Shell | shell, console |
|
||||
+-------------------------+---------------------------------------------------+
|
||||
| Smali | smali |
|
||||
+-------------------------+---------------------------------------------------+
|
||||
| Smalltalk | smalltalk, st |
|
||||
|
||||
+20
-22
@@ -51,19 +51,11 @@ https://highlightjs.org/
|
||||
languages: undefined
|
||||
};
|
||||
|
||||
// Object map that is used to escape some common HTML characters.
|
||||
var escapeRegexMap = {
|
||||
'&': '&',
|
||||
'<': '<',
|
||||
'>': '>'
|
||||
};
|
||||
|
||||
/* Utility functions */
|
||||
|
||||
function escape(value) {
|
||||
return value.replace(/[&<>]/gm, function(character) {
|
||||
return escapeRegexMap[character];
|
||||
});
|
||||
return value.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');
|
||||
}
|
||||
|
||||
function tag(node) {
|
||||
@@ -102,15 +94,17 @@ https://highlightjs.org/
|
||||
}
|
||||
}
|
||||
|
||||
function inherit(parent, obj) {
|
||||
function inherit(parent) { // inherit(parent, override_obj, override_obj, ...)
|
||||
var key;
|
||||
var result = {};
|
||||
var objects = Array.prototype.slice.call(arguments, 1);
|
||||
|
||||
for (key in parent)
|
||||
result[key] = parent[key];
|
||||
if (obj)
|
||||
objects.forEach(function(obj) {
|
||||
for (key in obj)
|
||||
result[key] = obj[key];
|
||||
});
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -178,7 +172,7 @@ https://highlightjs.org/
|
||||
}
|
||||
|
||||
function open(node) {
|
||||
function attr_str(a) {return ' ' + a.nodeName + '="' + escape(a.value) + '"';}
|
||||
function attr_str(a) {return ' ' + a.nodeName + '="' + escape(a.value).replace('"', '"') + '"';}
|
||||
result += '<' + tag(node) + ArrayProto.map.call(node.attributes, attr_str).join('') + '>';
|
||||
}
|
||||
|
||||
@@ -221,6 +215,15 @@ https://highlightjs.org/
|
||||
|
||||
/* Initialization */
|
||||
|
||||
function expand_mode(mode) {
|
||||
if (mode.variants && !mode.cached_variants) {
|
||||
mode.cached_variants = mode.variants.map(function(variant) {
|
||||
return inherit(mode, {variants: null}, variant);
|
||||
});
|
||||
}
|
||||
return mode.cached_variants || (mode.endsWithParent && [inherit(mode)]) || [mode];
|
||||
}
|
||||
|
||||
function compileLanguage(language) {
|
||||
|
||||
function reStr(re) {
|
||||
@@ -286,15 +289,9 @@ https://highlightjs.org/
|
||||
if (!mode.contains) {
|
||||
mode.contains = [];
|
||||
}
|
||||
var expanded_contains = [];
|
||||
mode.contains.forEach(function(c) {
|
||||
if (c.variants) {
|
||||
c.variants.forEach(function(v) {expanded_contains.push(inherit(c, v));});
|
||||
} else {
|
||||
expanded_contains.push(c === 'self' ? mode : c);
|
||||
}
|
||||
});
|
||||
mode.contains = expanded_contains;
|
||||
mode.contains = Array.prototype.concat.apply([], mode.contains.map(function(c) {
|
||||
return expand_mode(c === 'self' ? mode : c)
|
||||
}));
|
||||
mode.contains.forEach(function(c) {compileMode(c, mode);});
|
||||
|
||||
if (mode.starts) {
|
||||
@@ -593,6 +590,7 @@ https://highlightjs.org/
|
||||
} else if (options.tabReplace) {
|
||||
return p1.replace(/\t/g, options.tabReplace);
|
||||
}
|
||||
return '';
|
||||
});
|
||||
}
|
||||
|
||||
@@ -735,7 +733,7 @@ https://highlightjs.org/
|
||||
contains: [hljs.BACKSLASH_ESCAPE]
|
||||
};
|
||||
hljs.PHRASAL_WORDS_MODE = {
|
||||
begin: /\b(a|an|the|are|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/
|
||||
begin: /\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/
|
||||
};
|
||||
hljs.COMMENT = function (begin, end, inherits) {
|
||||
var mode = hljs.inherit(
|
||||
|
||||
+7
@@ -77,16 +77,20 @@ hljs.registerLanguage('haxe', require('./languages/haxe'));
|
||||
hljs.registerLanguage('hsp', require('./languages/hsp'));
|
||||
hljs.registerLanguage('htmlbars', require('./languages/htmlbars'));
|
||||
hljs.registerLanguage('http', require('./languages/http'));
|
||||
hljs.registerLanguage('hy', require('./languages/hy'));
|
||||
hljs.registerLanguage('inform7', require('./languages/inform7'));
|
||||
hljs.registerLanguage('ini', require('./languages/ini'));
|
||||
hljs.registerLanguage('irpf90', require('./languages/irpf90'));
|
||||
hljs.registerLanguage('java', require('./languages/java'));
|
||||
hljs.registerLanguage('javascript', require('./languages/javascript'));
|
||||
hljs.registerLanguage('jboss-cli', require('./languages/jboss-cli'));
|
||||
hljs.registerLanguage('json', require('./languages/json'));
|
||||
hljs.registerLanguage('julia', require('./languages/julia'));
|
||||
hljs.registerLanguage('julia-repl', require('./languages/julia-repl'));
|
||||
hljs.registerLanguage('kotlin', require('./languages/kotlin'));
|
||||
hljs.registerLanguage('lasso', require('./languages/lasso'));
|
||||
hljs.registerLanguage('ldif', require('./languages/ldif'));
|
||||
hljs.registerLanguage('leaf', require('./languages/leaf'));
|
||||
hljs.registerLanguage('less', require('./languages/less'));
|
||||
hljs.registerLanguage('lisp', require('./languages/lisp'));
|
||||
hljs.registerLanguage('livecodeserver', require('./languages/livecodeserver'));
|
||||
@@ -106,6 +110,7 @@ hljs.registerLanguage('perl', require('./languages/perl'));
|
||||
hljs.registerLanguage('mojolicious', require('./languages/mojolicious'));
|
||||
hljs.registerLanguage('monkey', require('./languages/monkey'));
|
||||
hljs.registerLanguage('moonscript', require('./languages/moonscript'));
|
||||
hljs.registerLanguage('n1ql', require('./languages/n1ql'));
|
||||
hljs.registerLanguage('nginx', require('./languages/nginx'));
|
||||
hljs.registerLanguage('nimrod', require('./languages/nimrod'));
|
||||
hljs.registerLanguage('nix', require('./languages/nix'));
|
||||
@@ -131,6 +136,7 @@ hljs.registerLanguage('qml', require('./languages/qml'));
|
||||
hljs.registerLanguage('r', require('./languages/r'));
|
||||
hljs.registerLanguage('rib', require('./languages/rib'));
|
||||
hljs.registerLanguage('roboconf', require('./languages/roboconf'));
|
||||
hljs.registerLanguage('routeros', require('./languages/routeros'));
|
||||
hljs.registerLanguage('rsl', require('./languages/rsl'));
|
||||
hljs.registerLanguage('ruleslanguage', require('./languages/ruleslanguage'));
|
||||
hljs.registerLanguage('rust', require('./languages/rust'));
|
||||
@@ -138,6 +144,7 @@ hljs.registerLanguage('scala', require('./languages/scala'));
|
||||
hljs.registerLanguage('scheme', require('./languages/scheme'));
|
||||
hljs.registerLanguage('scilab', require('./languages/scilab'));
|
||||
hljs.registerLanguage('scss', require('./languages/scss'));
|
||||
hljs.registerLanguage('shell', require('./languages/shell'));
|
||||
hljs.registerLanguage('smali', require('./languages/smali'));
|
||||
hljs.registerLanguage('smalltalk', require('./languages/smalltalk'));
|
||||
hljs.registerLanguage('sml', require('./languages/sml'));
|
||||
|
||||
+501
-70
@@ -1,78 +1,509 @@
|
||||
module.exports = 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 = {
|
||||
|
||||
// общий паттерн для определения идентификаторов
|
||||
var UNDERSCORE_IDENT_RE = '[A-Za-zА-Яа-яёЁ_][A-Za-zА-Яа-яёЁ_0-9]+';
|
||||
|
||||
// v7 уникальные ключевые слова, отсутствующие в v8 ==> keyword
|
||||
var v7_keywords =
|
||||
'далее ';
|
||||
|
||||
// v8 ключевые слова ==> keyword
|
||||
var v8_keywords =
|
||||
'возврат вызватьисключение выполнить для если и из или иначе иначеесли исключение каждого конецесли ' +
|
||||
'конецпопытки конеццикла не новый перейти перем по пока попытка прервать продолжить тогда цикл экспорт ';
|
||||
|
||||
// keyword : ключевые слова
|
||||
var KEYWORD = v7_keywords + v8_keywords;
|
||||
|
||||
// v7 уникальные директивы, отсутствующие в v8 ==> meta-keyword
|
||||
var v7_meta_keywords =
|
||||
'загрузитьизфайла ';
|
||||
|
||||
// v8 ключевые слова в инструкциях препроцессора, директивах компиляции, аннотациях ==> meta-keyword
|
||||
var v8_meta_keywords =
|
||||
'вебклиент вместо внешнеесоединение клиент конецобласти мобильноеприложениеклиент мобильноеприложениесервер ' +
|
||||
'наклиенте наклиентенасервере наклиентенасерверебезконтекста насервере насерверебезконтекста область перед ' +
|
||||
'после сервер толстыйклиентобычноеприложение толстыйклиентуправляемоеприложение тонкийклиент ';
|
||||
|
||||
// meta-keyword : ключевые слова в инструкциях препроцессора, директивах компиляции, аннотациях
|
||||
var METAKEYWORD = v7_meta_keywords + v8_meta_keywords;
|
||||
|
||||
// v7 системные константы ==> built_in
|
||||
var v7_system_constants =
|
||||
'разделительстраниц разделительстрок символтабуляции ';
|
||||
|
||||
// v7 уникальные методы глобального контекста, отсутствующие в v8 ==> built_in
|
||||
var v7_global_context_methods =
|
||||
'ansitooem oemtoansi ввестивидсубконто ввестиперечисление ввестипериод ввестиплансчетов выбранныйплансчетов ' +
|
||||
'датагод датамесяц датачисло заголовоксистемы значениевстроку значениеизстроки каталогиб каталогпользователя ' +
|
||||
'кодсимв конгода конецпериодаби конецрассчитанногопериодаби конецстандартногоинтервала конквартала конмесяца ' +
|
||||
'коннедели лог лог10 максимальноеколичествосубконто названиеинтерфейса названиенабораправ назначитьвид ' +
|
||||
'назначитьсчет найтиссылки началопериодаби началостандартногоинтервала начгода начквартала начмесяца ' +
|
||||
'начнедели номерднягода номерднянедели номернеделигода обработкаожидания основнойжурналрасчетов ' +
|
||||
'основнойплансчетов основнойязык очиститьокносообщений периодстр получитьвремята получитьдатута ' +
|
||||
'получитьдокументта получитьзначенияотбора получитьпозициюта получитьпустоезначение получитьта ' +
|
||||
'префиксавтонумерации пропись пустоезначение разм разобратьпозициюдокумента рассчитатьрегистрына ' +
|
||||
'рассчитатьрегистрыпо симв создатьобъект статусвозврата стрколичествострок сформироватьпозициюдокумента ' +
|
||||
'счетпокоду текущеевремя типзначения типзначениястр установитьтана установитьтапо фиксшаблон шаблон ';
|
||||
|
||||
// v8 методы глобального контекста ==> built_in
|
||||
var v8_global_context_methods =
|
||||
'acos asin atan base64значение base64строка cos exp log log10 pow sin sqrt tan xmlзначение xmlстрока ' +
|
||||
'xmlтип xmlтипзнч активноеокно безопасныйрежим безопасныйрежимразделенияданных булево ввестидату ввестизначение ' +
|
||||
'ввестистроку ввестичисло возможностьчтенияxml вопрос восстановитьзначение врег выгрузитьжурналрегистрации ' +
|
||||
'выполнитьобработкуоповещения выполнитьпроверкуправдоступа вычислить год данныеформывзначение дата день деньгода ' +
|
||||
'деньнедели добавитьмесяц заблокироватьданныедляредактирования заблокироватьработупользователя завершитьработусистемы ' +
|
||||
'загрузитьвнешнююкомпоненту закрытьсправку записатьjson записатьxml записатьдатуjson записьжурналарегистрации ' +
|
||||
'заполнитьзначениясвойств запроситьразрешениепользователя запуститьприложение запуститьсистему зафиксироватьтранзакцию ' +
|
||||
'значениевданныеформы значениевстрокувнутр значениевфайл значениезаполнено значениеизстрокивнутр значениеизфайла ' +
|
||||
'изxmlтипа импортмоделиxdto имякомпьютера имяпользователя инициализироватьпредопределенныеданные информацияобошибке ' +
|
||||
'каталогбиблиотекимобильногоустройства каталогвременныхфайлов каталогдокументов каталогпрограммы кодироватьстроку ' +
|
||||
'кодлокализацииинформационнойбазы кодсимвола командасистемы конецгода конецдня конецквартала конецмесяца конецминуты ' +
|
||||
'конецнедели конецчаса конфигурациябазыданныхизмененадинамически конфигурацияизменена копироватьданныеформы ' +
|
||||
'копироватьфайл краткоепредставлениеошибки лев макс местноевремя месяц мин минута монопольныйрежим найти ' +
|
||||
'найтинедопустимыесимволыxml найтиокнопонавигационнойссылке найтипомеченныенаудаление найтипоссылкам найтифайлы ' +
|
||||
'началогода началодня началоквартала началомесяца началоминуты началонедели началочаса начатьзапросразрешенияпользователя ' +
|
||||
'начатьзапускприложения начатькопированиефайла начатьперемещениефайла начатьподключениевнешнейкомпоненты ' +
|
||||
'начатьподключениерасширенияработыскриптографией начатьподключениерасширенияработысфайлами начатьпоискфайлов ' +
|
||||
'начатьполучениекаталогавременныхфайлов начатьполучениекаталогадокументов начатьполучениерабочегокаталогаданныхпользователя ' +
|
||||
'начатьполучениефайлов начатьпомещениефайла начатьпомещениефайлов начатьсозданиедвоичныхданныхизфайла начатьсозданиекаталога ' +
|
||||
'начатьтранзакцию начатьудалениефайлов начатьустановкувнешнейкомпоненты начатьустановкурасширенияработыскриптографией ' +
|
||||
'начатьустановкурасширенияработысфайлами неделягода необходимостьзавершениясоединения номерсеансаинформационнойбазы ' +
|
||||
'номерсоединенияинформационнойбазы нрег нстр обновитьинтерфейс обновитьнумерациюобъектов обновитьповторноиспользуемыезначения ' +
|
||||
'обработкапрерыванияпользователя объединитьфайлы окр описаниеошибки оповестить оповеститьобизменении ' +
|
||||
'отключитьобработчикзапросанастроекклиенталицензирования отключитьобработчикожидания отключитьобработчикоповещения ' +
|
||||
'открытьзначение открытьиндекссправки открытьсодержаниесправки открытьсправку открытьформу открытьформумодально ' +
|
||||
'отменитьтранзакцию очиститьжурналрегистрации очиститьнастройкипользователя очиститьсообщения параметрыдоступа ' +
|
||||
'перейтипонавигационнойссылке переместитьфайл подключитьвнешнююкомпоненту ' +
|
||||
'подключитьобработчикзапросанастроекклиенталицензирования подключитьобработчикожидания подключитьобработчикоповещения ' +
|
||||
'подключитьрасширениеработыскриптографией подключитьрасширениеработысфайлами подробноепредставлениеошибки ' +
|
||||
'показатьвводдаты показатьвводзначения показатьвводстроки показатьвводчисла показатьвопрос показатьзначение ' +
|
||||
'показатьинформациюобошибке показатьнакарте показатьоповещениепользователя показатьпредупреждение полноеимяпользователя ' +
|
||||
'получитьcomобъект получитьxmlтип получитьадреспоместоположению получитьблокировкусеансов получитьвремязавершенияспящегосеанса ' +
|
||||
'получитьвремязасыпанияпассивногосеанса получитьвремяожиданияблокировкиданных получитьданныевыбора ' +
|
||||
'получитьдополнительныйпараметрклиенталицензирования получитьдопустимыекодылокализации получитьдопустимыечасовыепояса ' +
|
||||
'получитьзаголовокклиентскогоприложения получитьзаголовоксистемы получитьзначенияотборажурналарегистрации ' +
|
||||
'получитьидентификаторконфигурации получитьизвременногохранилища получитьимявременногофайла ' +
|
||||
'получитьимяклиенталицензирования получитьинформациюэкрановклиента получитьиспользованиежурналарегистрации ' +
|
||||
'получитьиспользованиесобытияжурналарегистрации получитькраткийзаголовокприложения получитьмакетоформления ' +
|
||||
'получитьмаскувсефайлы получитьмаскувсефайлыклиента получитьмаскувсефайлысервера получитьместоположениепоадресу ' +
|
||||
'получитьминимальнуюдлинупаролейпользователей получитьнавигационнуюссылку получитьнавигационнуюссылкуинформационнойбазы ' +
|
||||
'получитьобновлениеконфигурациибазыданных получитьобновлениепредопределенныхданныхинформационнойбазы получитьобщиймакет ' +
|
||||
'получитьобщуюформу получитьокна получитьоперативнуюотметкувремени получитьотключениебезопасногорежима ' +
|
||||
'получитьпараметрыфункциональныхопцийинтерфейса получитьполноеимяпредопределенногозначения ' +
|
||||
'получитьпредставлениянавигационныхссылок получитьпроверкусложностипаролейпользователей получитьразделительпути ' +
|
||||
'получитьразделительпутиклиента получитьразделительпутисервера получитьсеансыинформационнойбазы ' +
|
||||
'получитьскоростьклиентскогосоединения получитьсоединенияинформационнойбазы получитьсообщенияпользователю ' +
|
||||
'получитьсоответствиеобъектаиформы получитьсоставстандартногоинтерфейсаodata получитьструктурухранениябазыданных ' +
|
||||
'получитьтекущийсеансинформационнойбазы получитьфайл получитьфайлы получитьформу получитьфункциональнуюопцию ' +
|
||||
'получитьфункциональнуюопциюинтерфейса получитьчасовойпоясинформационнойбазы пользователиос поместитьвовременноехранилище ' +
|
||||
'поместитьфайл поместитьфайлы прав праводоступа предопределенноезначение представлениекодалокализации представлениепериода ' +
|
||||
'представлениеправа представлениеприложения представлениесобытияжурналарегистрации представлениечасовогопояса предупреждение ' +
|
||||
'прекратитьработусистемы привилегированныйрежим продолжитьвызов прочитатьjson прочитатьxml прочитатьдатуjson пустаястрока ' +
|
||||
'рабочийкаталогданныхпользователя разблокироватьданныедляредактирования разделитьфайл разорватьсоединениесвнешнимисточникомданных ' +
|
||||
'раскодироватьстроку рольдоступна секунда сигнал символ скопироватьжурналрегистрации смещениелетнеговремени ' +
|
||||
'смещениестандартноговремени соединитьбуферыдвоичныхданных создатькаталог создатьфабрикуxdto сокрл сокрлп сокрп сообщить ' +
|
||||
'состояние сохранитьзначение сохранитьнастройкипользователя сред стрдлина стрзаканчиваетсяна стрзаменить стрнайти стрначинаетсяс ' +
|
||||
'строка строкасоединенияинформационнойбазы стрполучитьстроку стрразделить стрсоединить стрсравнить стрчисловхождений '+
|
||||
'стрчислострок стршаблон текущаядата текущаядатасеанса текущаяуниверсальнаядата текущаяуниверсальнаядатавмиллисекундах ' +
|
||||
'текущийвариантинтерфейсаклиентскогоприложения текущийвариантосновногошрифтаклиентскогоприложения текущийкодлокализации ' +
|
||||
'текущийрежимзапуска текущийязык текущийязыксистемы тип типзнч транзакцияактивна трег удалитьданныеинформационнойбазы ' +
|
||||
'удалитьизвременногохранилища удалитьобъекты удалитьфайлы универсальноевремя установитьбезопасныйрежим ' +
|
||||
'установитьбезопасныйрежимразделенияданных установитьблокировкусеансов установитьвнешнююкомпоненту ' +
|
||||
'установитьвремязавершенияспящегосеанса установитьвремязасыпанияпассивногосеанса установитьвремяожиданияблокировкиданных ' +
|
||||
'установитьзаголовокклиентскогоприложения установитьзаголовоксистемы установитьиспользованиежурналарегистрации ' +
|
||||
'установитьиспользованиесобытияжурналарегистрации установитькраткийзаголовокприложения ' +
|
||||
'установитьминимальнуюдлинупаролейпользователей установитьмонопольныйрежим установитьнастройкиклиенталицензирования ' +
|
||||
'установитьобновлениепредопределенныхданныхинформационнойбазы установитьотключениебезопасногорежима ' +
|
||||
'установитьпараметрыфункциональныхопцийинтерфейса установитьпривилегированныйрежим ' +
|
||||
'установитьпроверкусложностипаролейпользователей установитьрасширениеработыскриптографией ' +
|
||||
'установитьрасширениеработысфайлами установитьсоединениесвнешнимисточникомданных установитьсоответствиеобъектаиформы ' +
|
||||
'установитьсоставстандартногоинтерфейсаodata установитьчасовойпоясинформационнойбазы установитьчасовойпояссеанса ' +
|
||||
'формат цел час часовойпояс часовойпояссеанса число числопрописью этоадресвременногохранилища ';
|
||||
|
||||
// v8 свойства глобального контекста ==> built_in
|
||||
var v8_global_context_property =
|
||||
'wsссылки библиотекакартинок библиотекамакетовоформлениякомпоновкиданных библиотекастилей бизнеспроцессы ' +
|
||||
'внешниеисточникиданных внешниеобработки внешниеотчеты встроенныепокупки главныйинтерфейс главныйстиль ' +
|
||||
'документы доставляемыеуведомления журналыдокументов задачи информацияобинтернетсоединении использованиерабочейдаты ' +
|
||||
'историяработыпользователя константы критерииотбора метаданные обработки отображениерекламы отправкадоставляемыхуведомлений ' +
|
||||
'отчеты панельзадачос параметрзапуска параметрысеанса перечисления планывидоврасчета планывидовхарактеристик ' +
|
||||
'планыобмена планысчетов полнотекстовыйпоиск пользователиинформационнойбазы последовательности проверкавстроенныхпокупок ' +
|
||||
'рабочаядата расширенияконфигурации регистрыбухгалтерии регистрынакопления регистрырасчета регистрысведений ' +
|
||||
'регламентныезадания сериализаторxdto справочники средствагеопозиционирования средствакриптографии средствамультимедиа ' +
|
||||
'средстваотображениярекламы средствапочты средствателефонии фабрикаxdto файловыепотоки фоновыезадания хранилищанастроек ' +
|
||||
'хранилищевариантовотчетов хранилищенастроекданныхформ хранилищеобщихнастроек хранилищепользовательскихнастроекдинамическихсписков ' +
|
||||
'хранилищепользовательскихнастроекотчетов хранилищесистемныхнастроек ';
|
||||
|
||||
// built_in : встроенные или библиотечные объекты (константы, классы, функции)
|
||||
var BUILTIN =
|
||||
v7_system_constants +
|
||||
v7_global_context_methods + v8_global_context_methods +
|
||||
v8_global_context_property;
|
||||
|
||||
// v8 системные наборы значений ==> class
|
||||
var v8_system_sets_of_values =
|
||||
'webцвета windowsцвета windowsшрифты библиотекакартинок рамкистиля символы цветастиля шрифтыстиля ';
|
||||
|
||||
// v8 системные перечисления - интерфейсные ==> class
|
||||
var v8_system_enums_interface =
|
||||
'автоматическоесохранениеданныхформывнастройках автонумерациявформе автораздвижениесерий ' +
|
||||
'анимациядиаграммы вариантвыравниванияэлементовизаголовков вариантуправлениявысотойтаблицы ' +
|
||||
'вертикальнаяпрокруткаформы вертикальноеположение вертикальноеположениеэлемента видгруппыформы ' +
|
||||
'виддекорацииформы виддополненияэлементаформы видизмененияданных видкнопкиформы видпереключателя ' +
|
||||
'видподписейкдиаграмме видполяформы видфлажка влияниеразмеранапузырекдиаграммы горизонтальноеположение ' +
|
||||
'горизонтальноеположениеэлемента группировкаколонок группировкаподчиненныхэлементовформы ' +
|
||||
'группыиэлементы действиеперетаскивания дополнительныйрежимотображения допустимыедействияперетаскивания ' +
|
||||
'интервалмеждуэлементамиформы использованиевывода использованиеполосыпрокрутки ' +
|
||||
'используемоезначениеточкибиржевойдиаграммы историявыборапривводе источникзначенийоситочекдиаграммы ' +
|
||||
'источникзначенияразмерапузырькадиаграммы категориягруппыкоманд максимумсерий начальноеотображениедерева ' +
|
||||
'начальноеотображениесписка обновлениетекстаредактирования ориентациядендрограммы ориентациядиаграммы ' +
|
||||
'ориентацияметокдиаграммы ориентацияметоксводнойдиаграммы ориентацияэлементаформы отображениевдиаграмме ' +
|
||||
'отображениевлегендедиаграммы отображениегруппыкнопок отображениезаголовкашкалыдиаграммы ' +
|
||||
'отображениезначенийсводнойдиаграммы отображениезначенияизмерительнойдиаграммы ' +
|
||||
'отображениеинтерваладиаграммыганта отображениекнопки отображениекнопкивыбора отображениеобсужденийформы ' +
|
||||
'отображениеобычнойгруппы отображениеотрицательныхзначенийпузырьковойдиаграммы отображениепанелипоиска ' +
|
||||
'отображениеподсказки отображениепредупрежденияприредактировании отображениеразметкиполосырегулирования ' +
|
||||
'отображениестраницформы отображениетаблицы отображениетекстазначениядиаграммыганта ' +
|
||||
'отображениеуправленияобычнойгруппы отображениефигурыкнопки палитрацветовдиаграммы поведениеобычнойгруппы ' +
|
||||
'поддержкамасштабадендрограммы поддержкамасштабадиаграммыганта поддержкамасштабасводнойдиаграммы ' +
|
||||
'поисквтаблицепривводе положениезаголовкаэлементаформы положениекартинкикнопкиформы ' +
|
||||
'положениекартинкиэлементаграфическойсхемы положениекоманднойпанелиформы положениекоманднойпанелиэлементаформы ' +
|
||||
'положениеопорнойточкиотрисовки положениеподписейкдиаграмме положениеподписейшкалызначенийизмерительнойдиаграммы ' +
|
||||
'положениесостоянияпросмотра положениестрокипоиска положениетекстасоединительнойлинии положениеуправленияпоиском ' +
|
||||
'положениешкалывремени порядокотображенияточекгоризонтальнойгистограммы порядоксерийвлегендедиаграммы ' +
|
||||
'размеркартинки расположениезаголовкашкалыдиаграммы растягиваниеповертикалидиаграммыганта ' +
|
||||
'режимавтоотображениясостояния режимвводастроктаблицы режимвыборанезаполненного режимвыделениядаты ' +
|
||||
'режимвыделениястрокитаблицы режимвыделениятаблицы режимизмененияразмера режимизменениясвязанногозначения ' +
|
||||
'режимиспользованиядиалогапечати режимиспользованияпараметракоманды режиммасштабированияпросмотра ' +
|
||||
'режимосновногоокнаклиентскогоприложения режимоткрытияокнаформы режимотображениявыделения ' +
|
||||
'режимотображениягеографическойсхемы режимотображениязначенийсерии режимотрисовкисеткиграфическойсхемы ' +
|
||||
'режимполупрозрачностидиаграммы режимпробеловдиаграммы режимразмещениянастранице режимредактированияколонки ' +
|
||||
'режимсглаживаниядиаграммы режимсглаживанияиндикатора режимсписказадач сквозноевыравнивание ' +
|
||||
'сохранениеданныхформывнастройках способзаполнениятекстазаголовкашкалыдиаграммы ' +
|
||||
'способопределенияограничивающегозначениядиаграммы стандартнаягруппакоманд стандартноеоформление ' +
|
||||
'статусоповещенияпользователя стильстрелки типаппроксимациилиниитрендадиаграммы типдиаграммы ' +
|
||||
'типединицышкалывремени типимпортасерийслоягеографическойсхемы типлиниигеографическойсхемы типлиниидиаграммы ' +
|
||||
'типмаркерагеографическойсхемы типмаркерадиаграммы типобластиоформления ' +
|
||||
'типорганизацииисточникаданныхгеографическойсхемы типотображениясериислоягеографическойсхемы ' +
|
||||
'типотображенияточечногообъектагеографическойсхемы типотображенияшкалыэлементалегендыгеографическойсхемы ' +
|
||||
'типпоискаобъектовгеографическойсхемы типпроекциигеографическойсхемы типразмещенияизмерений ' +
|
||||
'типразмещенияреквизитовизмерений типрамкиэлементауправления типсводнойдиаграммы ' +
|
||||
'типсвязидиаграммыганта типсоединениязначенийпосериямдиаграммы типсоединенияточекдиаграммы ' +
|
||||
'типсоединительнойлинии типстороныэлементаграфическойсхемы типформыотчета типшкалырадарнойдиаграммы ' +
|
||||
'факторлиниитрендадиаграммы фигуракнопки фигурыграфическойсхемы фиксациявтаблице форматдняшкалывремени ' +
|
||||
'форматкартинки ширинаподчиненныхэлементовформы ';
|
||||
|
||||
// v8 системные перечисления - свойства прикладных объектов ==> class
|
||||
var v8_system_enums_objects_properties =
|
||||
'виддвижениябухгалтерии виддвижениянакопления видпериодарегистрарасчета видсчета видточкимаршрутабизнеспроцесса ' +
|
||||
'использованиеагрегатарегистранакопления использованиегруппиэлементов использованиережимапроведения ' +
|
||||
'использованиесреза периодичностьагрегатарегистранакопления режимавтовремя режимзаписидокумента режимпроведениядокумента ';
|
||||
|
||||
// v8 системные перечисления - планы обмена ==> class
|
||||
var v8_system_enums_exchange_plans =
|
||||
'авторегистрацияизменений допустимыйномерсообщения отправкаэлементаданных получениеэлементаданных ';
|
||||
|
||||
// v8 системные перечисления - табличный документ ==> class
|
||||
var v8_system_enums_tabular_document =
|
||||
'использованиерасшифровкитабличногодокумента ориентациястраницы положениеитоговколоноксводнойтаблицы ' +
|
||||
'положениеитоговстроксводнойтаблицы положениетекстаотносительнокартинки расположениезаголовкагруппировкитабличногодокумента ' +
|
||||
'способчтениязначенийтабличногодокумента типдвустороннейпечати типзаполненияобластитабличногодокумента ' +
|
||||
'типкурсоровтабличногодокумента типлиниирисункатабличногодокумента типлинииячейкитабличногодокумента ' +
|
||||
'типнаправленияпереходатабличногодокумента типотображениявыделениятабличногодокумента типотображениялинийсводнойтаблицы ' +
|
||||
'типразмещениятекстатабличногодокумента типрисункатабличногодокумента типсмещениятабличногодокумента ' +
|
||||
'типузоратабличногодокумента типфайлатабличногодокумента точностьпечати чередованиерасположениястраниц ';
|
||||
|
||||
// v8 системные перечисления - планировщик ==> class
|
||||
var v8_system_enums_sheduler =
|
||||
'отображениевремениэлементовпланировщика ';
|
||||
|
||||
// v8 системные перечисления - форматированный документ ==> class
|
||||
var v8_system_enums_formatted_document =
|
||||
'типфайлаформатированногодокумента ';
|
||||
|
||||
// v8 системные перечисления - запрос ==> class
|
||||
var v8_system_enums_query =
|
||||
'обходрезультатазапроса типзаписизапроса ';
|
||||
|
||||
// v8 системные перечисления - построитель отчета ==> class
|
||||
var v8_system_enums_report_builder =
|
||||
'видзаполнениярасшифровкипостроителяотчета типдобавленияпредставлений типизмеренияпостроителяотчета типразмещенияитогов ';
|
||||
|
||||
// v8 системные перечисления - работа с файлами ==> class
|
||||
var v8_system_enums_files =
|
||||
'доступкфайлу режимдиалогавыборафайла режимоткрытияфайла ';
|
||||
|
||||
// v8 системные перечисления - построитель запроса ==> class
|
||||
var v8_system_enums_query_builder =
|
||||
'типизмеренияпостроителязапроса ';
|
||||
|
||||
// v8 системные перечисления - анализ данных ==> class
|
||||
var v8_system_enums_data_analysis =
|
||||
'видданныханализа методкластеризации типединицыинтервалавременианализаданных типзаполнениятаблицырезультатаанализаданных ' +
|
||||
'типиспользованиячисловыхзначенийанализаданных типисточникаданныхпоискаассоциаций типколонкианализаданныхдереворешений ' +
|
||||
'типколонкианализаданныхкластеризация типколонкианализаданныхобщаястатистика типколонкианализаданныхпоискассоциаций ' +
|
||||
'типколонкианализаданныхпоискпоследовательностей типколонкимоделипрогноза типмерырасстоянияанализаданных ' +
|
||||
'типотсеченияправилассоциации типполяанализаданных типстандартизациианализаданных типупорядочиванияправилассоциациианализаданных ' +
|
||||
'типупорядочиванияшаблоновпоследовательностейанализаданных типупрощениядереварешений ';
|
||||
|
||||
// v8 системные перечисления - xml, json, xs, dom, xdto, web-сервисы ==> class
|
||||
var v8_system_enums_xml_json_xs_dom_xdto_ws =
|
||||
'wsнаправлениепараметра вариантxpathxs вариантзаписидатыjson вариантпростоготипаxs видгруппымоделиxs видфасетаxdto ' +
|
||||
'действиепостроителяdom завершенностьпростоготипаxs завершенностьсоставноготипаxs завершенностьсхемыxs запрещенныеподстановкиxs ' +
|
||||
'исключениягруппподстановкиxs категорияиспользованияатрибутаxs категорияограниченияидентичностиxs категорияограниченияпространствименxs ' +
|
||||
'методнаследованияxs модельсодержимогоxs назначениетипаxml недопустимыеподстановкиxs обработкапробельныхсимволовxs обработкасодержимогоxs ' +
|
||||
'ограничениезначенияxs параметрыотбораузловdom переносстрокjson позициявдокументеdom пробельныесимволыxml типатрибутаxml типзначенияjson ' +
|
||||
'типканоническогоxml типкомпонентыxs типпроверкиxml типрезультатаdomxpath типузлаdom типузлаxml формаxml формапредставленияxs ' +
|
||||
'форматдатыjson экранированиесимволовjson ';
|
||||
|
||||
// v8 системные перечисления - система компоновки данных ==> class
|
||||
var v8_system_enums_data_composition_system =
|
||||
'видсравнениякомпоновкиданных действиеобработкирасшифровкикомпоновкиданных направлениесортировкикомпоновкиданных ' +
|
||||
'расположениевложенныхэлементоврезультатакомпоновкиданных расположениеитоговкомпоновкиданных расположениегруппировкикомпоновкиданных ' +
|
||||
'расположениеполейгруппировкикомпоновкиданных расположениеполякомпоновкиданных расположениереквизитовкомпоновкиданных ' +
|
||||
'расположениересурсовкомпоновкиданных типбухгалтерскогоостаткакомпоновкиданных типвыводатекстакомпоновкиданных ' +
|
||||
'типгруппировкикомпоновкиданных типгруппыэлементовотборакомпоновкиданных типдополненияпериодакомпоновкиданных ' +
|
||||
'типзаголовкаполейкомпоновкиданных типмакетагруппировкикомпоновкиданных типмакетаобластикомпоновкиданных типостаткакомпоновкиданных ' +
|
||||
'типпериодакомпоновкиданных типразмещениятекстакомпоновкиданных типсвязинаборовданныхкомпоновкиданных типэлементарезультатакомпоновкиданных ' +
|
||||
'расположениелегендыдиаграммыкомпоновкиданных типпримененияотборакомпоновкиданных режимотображенияэлементанастройкикомпоновкиданных ' +
|
||||
'режимотображениянастроеккомпоновкиданных состояниеэлементанастройкикомпоновкиданных способвосстановлениянастроеккомпоновкиданных ' +
|
||||
'режимкомпоновкирезультата использованиепараметракомпоновкиданных автопозицияресурсовкомпоновкиданных '+
|
||||
'вариантиспользованиягруппировкикомпоновкиданных расположениересурсоввдиаграммекомпоновкиданных фиксациякомпоновкиданных ' +
|
||||
'использованиеусловногооформлениякомпоновкиданных ';
|
||||
|
||||
// v8 системные перечисления - почта ==> class
|
||||
var v8_system_enums_email =
|
||||
'важностьинтернетпочтовогосообщения обработкатекстаинтернетпочтовогосообщения способкодированияинтернетпочтовоговложения ' +
|
||||
'способкодированиянеasciiсимволовинтернетпочтовогосообщения типтекстапочтовогосообщения протоколинтернетпочты ' +
|
||||
'статусразборапочтовогосообщения ';
|
||||
|
||||
// v8 системные перечисления - журнал регистрации ==> class
|
||||
var v8_system_enums_logbook =
|
||||
'режимтранзакциизаписижурналарегистрации статустранзакциизаписижурналарегистрации уровеньжурналарегистрации ';
|
||||
|
||||
// v8 системные перечисления - криптография ==> class
|
||||
var v8_system_enums_cryptography =
|
||||
'расположениехранилищасертификатовкриптографии режимвключениясертификатовкриптографии режимпроверкисертификатакриптографии ' +
|
||||
'типхранилищасертификатовкриптографии ';
|
||||
|
||||
// v8 системные перечисления - ZIP ==> class
|
||||
var v8_system_enums_zip =
|
||||
'кодировкаименфайловвzipфайле методсжатияzip методшифрованияzip режимвосстановленияпутейфайловzip режимобработкиподкаталоговzip ' +
|
||||
'режимсохраненияпутейzip уровеньсжатияzip ';
|
||||
|
||||
// v8 системные перечисления -
|
||||
// Блокировка данных, Фоновые задания, Автоматизированное тестирование,
|
||||
// Доставляемые уведомления, Встроенные покупки, Интернет, Работа с двоичными данными ==> class
|
||||
var v8_system_enums_other =
|
||||
'звуковоеоповещение направлениепереходакстроке позициявпотоке порядокбайтов режимблокировкиданных режимуправленияблокировкойданных ' +
|
||||
'сервисвстроенныхпокупок состояниефоновогозадания типподписчикадоставляемыхуведомлений уровеньиспользованиязащищенногосоединенияftp ';
|
||||
|
||||
// v8 системные перечисления - схема запроса ==> class
|
||||
var v8_system_enums_request_schema =
|
||||
'направлениепорядкасхемызапроса типдополненияпериодамисхемызапроса типконтрольнойточкисхемызапроса типобъединениясхемызапроса ' +
|
||||
'типпараметрадоступнойтаблицысхемызапроса типсоединениясхемызапроса ';
|
||||
|
||||
// v8 системные перечисления - свойства объектов метаданных ==> class
|
||||
var v8_system_enums_properties_of_metadata_objects =
|
||||
'httpметод автоиспользованиеобщегореквизита автопрефиксномеразадачи вариантвстроенногоязыка видиерархии видрегистранакопления ' +
|
||||
'видтаблицывнешнегоисточникаданных записьдвиженийприпроведении заполнениепоследовательностей индексирование ' +
|
||||
'использованиебазыпланавидоврасчета использованиебыстроговыбора использованиеобщегореквизита использованиеподчинения ' +
|
||||
'использованиеполнотекстовогопоиска использованиеразделяемыхданныхобщегореквизита использованиереквизита ' +
|
||||
'назначениеиспользованияприложения назначениерасширенияконфигурации направлениепередачи обновлениепредопределенныхданных ' +
|
||||
'оперативноепроведение основноепредставлениевидарасчета основноепредставлениевидахарактеристики основноепредставлениезадачи ' +
|
||||
'основноепредставлениепланаобмена основноепредставлениесправочника основноепредставлениесчета перемещениеграницыприпроведении ' +
|
||||
'периодичностьномерабизнеспроцесса периодичностьномерадокумента периодичностьрегистрарасчета периодичностьрегистрасведений ' +
|
||||
'повторноеиспользованиевозвращаемыхзначений полнотекстовыйпоискпривводепостроке принадлежностьобъекта проведение ' +
|
||||
'разделениеаутентификацииобщегореквизита разделениеданныхобщегореквизита разделениерасширенийконфигурацииобщегореквизита '+
|
||||
'режимавтонумерацииобъектов режимзаписирегистра режимиспользованиямодальности ' +
|
||||
'режимиспользованиясинхронныхвызововрасширенийплатформыивнешнихкомпонент режимповторногоиспользованиясеансов ' +
|
||||
'режимполученияданныхвыборапривводепостроке режимсовместимости режимсовместимостиинтерфейса ' +
|
||||
'режимуправленияблокировкойданныхпоумолчанию сериикодовпланавидовхарактеристик сериикодовпланасчетов ' +
|
||||
'сериикодовсправочника созданиепривводе способвыбора способпоискастрокипривводепостроке способредактирования ' +
|
||||
'типданныхтаблицывнешнегоисточникаданных типкодапланавидоврасчета типкодасправочника типмакета типномерабизнеспроцесса ' +
|
||||
'типномерадокумента типномеразадачи типформы удалениедвижений ';
|
||||
|
||||
// v8 системные перечисления - разные ==> class
|
||||
var v8_system_enums_differents =
|
||||
'важностьпроблемыприменениярасширенияконфигурации вариантинтерфейсаклиентскогоприложения вариантмасштабаформклиентскогоприложения ' +
|
||||
'вариантосновногошрифтаклиентскогоприложения вариантстандартногопериода вариантстандартнойдатыначала видграницы видкартинки ' +
|
||||
'видотображенияполнотекстовогопоиска видрамки видсравнения видцвета видчисловогозначения видшрифта допустимаядлина допустимыйзнак ' +
|
||||
'использованиеbyteordermark использованиеметаданныхполнотекстовогопоиска источникрасширенийконфигурации клавиша кодвозвратадиалога ' +
|
||||
'кодировкаxbase кодировкатекста направлениепоиска направлениесортировки обновлениепредопределенныхданных обновлениеприизмененииданных ' +
|
||||
'отображениепанелиразделов проверказаполнения режимдиалогавопрос режимзапускаклиентскогоприложения режимокругления режимоткрытияформприложения ' +
|
||||
'режимполнотекстовогопоиска скоростьклиентскогосоединения состояниевнешнегоисточникаданных состояниеобновленияконфигурациибазыданных ' +
|
||||
'способвыборасертификатаwindows способкодированиястроки статуссообщения типвнешнейкомпоненты типплатформы типповеденияклавишиenter ' +
|
||||
'типэлементаинформацииовыполненииобновленияконфигурациибазыданных уровеньизоляциитранзакций хешфункция частидаты';
|
||||
|
||||
// class: встроенные наборы значений, системные перечисления (содержат дочерние значения, обращения к которым через разыменование)
|
||||
var CLASS =
|
||||
v8_system_sets_of_values +
|
||||
v8_system_enums_interface +
|
||||
v8_system_enums_objects_properties +
|
||||
v8_system_enums_exchange_plans +
|
||||
v8_system_enums_tabular_document +
|
||||
v8_system_enums_sheduler +
|
||||
v8_system_enums_formatted_document +
|
||||
v8_system_enums_query +
|
||||
v8_system_enums_report_builder +
|
||||
v8_system_enums_files +
|
||||
v8_system_enums_query_builder +
|
||||
v8_system_enums_data_analysis +
|
||||
v8_system_enums_xml_json_xs_dom_xdto_ws +
|
||||
v8_system_enums_data_composition_system +
|
||||
v8_system_enums_email +
|
||||
v8_system_enums_logbook +
|
||||
v8_system_enums_cryptography +
|
||||
v8_system_enums_zip +
|
||||
v8_system_enums_other +
|
||||
v8_system_enums_request_schema +
|
||||
v8_system_enums_properties_of_metadata_objects +
|
||||
v8_system_enums_differents;
|
||||
|
||||
// v8 общие объекты (у объектов есть конструктор, экземпляры создаются методом НОВЫЙ) ==> type
|
||||
var v8_shared_object =
|
||||
'comобъект ftpсоединение httpзапрос httpсервисответ httpсоединение wsопределения wsпрокси xbase анализданных аннотацияxs ' +
|
||||
'блокировкаданных буфердвоичныхданных включениеxs выражениекомпоновкиданных генераторслучайныхчисел географическаясхема ' +
|
||||
'географическиекоординаты графическаясхема группамоделиxs данныерасшифровкикомпоновкиданных двоичныеданные дендрограмма ' +
|
||||
'диаграмма диаграммаганта диалогвыборафайла диалогвыборацвета диалогвыборашрифта диалограсписаниярегламентногозадания ' +
|
||||
'диалогредактированиястандартногопериода диапазон документdom документhtml документацияxs доставляемоеуведомление ' +
|
||||
'записьdom записьfastinfoset записьhtml записьjson записьxml записьzipфайла записьданных записьтекста записьузловdom ' +
|
||||
'запрос защищенноесоединениеopenssl значенияполейрасшифровкикомпоновкиданных извлечениетекста импортxs интернетпочта ' +
|
||||
'интернетпочтовоесообщение интернетпочтовыйпрофиль интернетпрокси интернетсоединение информациядляприложенияxs ' +
|
||||
'использованиеатрибутаxs использованиесобытияжурналарегистрации источникдоступныхнастроеккомпоновкиданных ' +
|
||||
'итераторузловdom картинка квалификаторыдаты квалификаторыдвоичныхданных квалификаторыстроки квалификаторычисла ' +
|
||||
'компоновщикмакетакомпоновкиданных компоновщикнастроеккомпоновкиданных конструктормакетаоформлениякомпоновкиданных ' +
|
||||
'конструкторнастроеккомпоновкиданных конструкторформатнойстроки линия макеткомпоновкиданных макетобластикомпоновкиданных ' +
|
||||
'макетоформлениякомпоновкиданных маскаxs менеджеркриптографии наборсхемxml настройкикомпоновкиданных настройкисериализацииjson ' +
|
||||
'обработкакартинок обработкарасшифровкикомпоновкиданных обходдереваdom объявлениеатрибутаxs объявлениенотацииxs ' +
|
||||
'объявлениеэлементаxs описаниеиспользованиясобытиядоступжурналарегистрации ' +
|
||||
'описаниеиспользованиясобытияотказвдоступежурналарегистрации описаниеобработкирасшифровкикомпоновкиданных ' +
|
||||
'описаниепередаваемогофайла описаниетипов определениегруппыатрибутовxs определениегруппымоделиxs ' +
|
||||
'определениеограниченияидентичностиxs определениепростоготипаxs определениесоставноготипаxs определениетипадокументаdom ' +
|
||||
'определенияxpathxs отборкомпоновкиданных пакетотображаемыхдокументов параметрвыбора параметркомпоновкиданных ' +
|
||||
'параметрызаписиjson параметрызаписиxml параметрычтенияxml переопределениеxs планировщик полеанализаданных ' +
|
||||
'полекомпоновкиданных построительdom построительзапроса построительотчета построительотчетаанализаданных ' +
|
||||
'построительсхемxml поток потоквпамяти почта почтовоесообщение преобразованиеxsl преобразованиекканоническомуxml ' +
|
||||
'процессорвыводарезультатакомпоновкиданныхвколлекциюзначений процессорвыводарезультатакомпоновкиданныхвтабличныйдокумент ' +
|
||||
'процессоркомпоновкиданных разыменовательпространствименdom рамка расписаниерегламентногозадания расширенноеимяxml ' +
|
||||
'результатчтенияданных своднаядиаграмма связьпараметравыбора связьпотипу связьпотипукомпоновкиданных сериализаторxdto ' +
|
||||
'сертификатклиентаwindows сертификатклиентафайл сертификаткриптографии сертификатыудостоверяющихцентровwindows ' +
|
||||
'сертификатыудостоверяющихцентровфайл сжатиеданных системнаяинформация сообщениепользователю сочетаниеклавиш ' +
|
||||
'сравнениезначений стандартнаядатаначала стандартныйпериод схемаxml схемакомпоновкиданных табличныйдокумент ' +
|
||||
'текстовыйдокумент тестируемоеприложение типданныхxml уникальныйидентификатор фабрикаxdto файл файловыйпоток ' +
|
||||
'фасетдлиныxs фасетколичестваразрядовдробнойчастиxs фасетмаксимальноговключающегозначенияxs ' +
|
||||
'фасетмаксимальногоисключающегозначенияxs фасетмаксимальнойдлиныxs фасетминимальноговключающегозначенияxs ' +
|
||||
'фасетминимальногоисключающегозначенияxs фасетминимальнойдлиныxs фасетобразцаxs фасетобщегоколичестваразрядовxs ' +
|
||||
'фасетперечисленияxs фасетпробельныхсимволовxs фильтрузловdom форматированнаястрока форматированныйдокумент ' +
|
||||
'фрагментxs хешированиеданных хранилищезначения цвет чтениеfastinfoset чтениеhtml чтениеjson чтениеxml чтениеzipфайла ' +
|
||||
'чтениеданных чтениетекста чтениеузловdom шрифт элементрезультатакомпоновкиданных ';
|
||||
|
||||
// v8 универсальные коллекции значений ==> type
|
||||
var v8_universal_collection =
|
||||
'comsafearray деревозначений массив соответствие списокзначений структура таблицазначений фиксированнаяструктура ' +
|
||||
'фиксированноесоответствие фиксированныймассив ';
|
||||
|
||||
// type : встроенные типы
|
||||
var TYPE =
|
||||
v8_shared_object +
|
||||
v8_universal_collection;
|
||||
|
||||
// literal : примитивные типы
|
||||
var LITERAL = 'null истина ложь неопределено';
|
||||
|
||||
// number : числа
|
||||
var NUMBERS = hljs.inherit(hljs.NUMBER_MODE);
|
||||
|
||||
// string : строки
|
||||
var STRINGS = {
|
||||
className: 'string',
|
||||
begin: '\\|', end: '"|$',
|
||||
contains: [DQUOTE]
|
||||
begin: '"|\\|', end: '"|$',
|
||||
contains: [{begin: '""'}]
|
||||
};
|
||||
|
||||
// number : даты
|
||||
var DATE = {
|
||||
begin: "'", end: "'", excludeBegin: true, excludeEnd: true,
|
||||
contains: [
|
||||
{
|
||||
className: 'number',
|
||||
begin: '\\d{4}([\\.\\\\/:-]?\\d{2}){0,5}'
|
||||
}
|
||||
]
|
||||
};
|
||||
|
||||
// comment : комментарии
|
||||
var COMMENTS = hljs.inherit(hljs.C_LINE_COMMENT_MODE);
|
||||
|
||||
// meta : инструкции препроцессора, директивы компиляции
|
||||
var META = {
|
||||
className: 'meta',
|
||||
lexemes: UNDERSCORE_IDENT_RE,
|
||||
begin: '#|&', end: '$',
|
||||
keywords: {'meta-keyword': KEYWORD + METAKEYWORD},
|
||||
contains: [
|
||||
COMMENTS
|
||||
]
|
||||
};
|
||||
|
||||
// symbol : метка goto
|
||||
var SYMBOL = {
|
||||
className: 'symbol',
|
||||
begin: '~', end: ';|:', excludeEnd: true
|
||||
};
|
||||
|
||||
// function : объявление процедур и функций
|
||||
var FUNCTION = {
|
||||
className: 'function',
|
||||
lexemes: UNDERSCORE_IDENT_RE,
|
||||
variants: [
|
||||
{begin: 'процедура|функция', end: '\\)', keywords: 'процедура функция'},
|
||||
{begin: 'конецпроцедуры|конецфункции', keywords: 'конецпроцедуры конецфункции'}
|
||||
],
|
||||
contains: [
|
||||
{
|
||||
begin: '\\(', end: '\\)', endsParent : true,
|
||||
contains: [
|
||||
{
|
||||
className: 'params',
|
||||
lexemes: UNDERSCORE_IDENT_RE,
|
||||
begin: UNDERSCORE_IDENT_RE, end: ',', excludeEnd: true, endsWithParent: true,
|
||||
keywords: {
|
||||
keyword: 'знач',
|
||||
literal: LITERAL
|
||||
},
|
||||
contains: [
|
||||
NUMBERS,
|
||||
STRINGS,
|
||||
DATE
|
||||
]
|
||||
},
|
||||
COMMENTS
|
||||
]
|
||||
},
|
||||
hljs.inherit(hljs.TITLE_MODE, {begin: UNDERSCORE_IDENT_RE})
|
||||
]
|
||||
};
|
||||
|
||||
return {
|
||||
case_insensitive: true,
|
||||
lexemes: IDENT_RE_RU,
|
||||
keywords: {keyword: OneS_KEYWORDS, built_in: OneS_BUILT_IN},
|
||||
lexemes: UNDERSCORE_IDENT_RE,
|
||||
keywords: {
|
||||
keyword: KEYWORD,
|
||||
built_in: BUILTIN,
|
||||
class: CLASS,
|
||||
type: TYPE,
|
||||
literal: LITERAL
|
||||
},
|
||||
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
|
||||
]
|
||||
};
|
||||
META,
|
||||
FUNCTION,
|
||||
COMMENTS,
|
||||
SYMBOL,
|
||||
NUMBERS,
|
||||
STRINGS,
|
||||
DATE
|
||||
]
|
||||
}
|
||||
};
|
||||
+2
-1
@@ -91,7 +91,8 @@ module.exports = function (hljs) {
|
||||
contains : [
|
||||
{
|
||||
begin : hljs.UNDERSCORE_IDENT_RE + '\\s*\\(',
|
||||
keywords : KEYWORDS + ' ' + SHORTKEYS
|
||||
keywords : KEYWORDS + ' ' + SHORTKEYS,
|
||||
relevance: 0
|
||||
},
|
||||
hljs.QUOTE_STRING_MODE
|
||||
]
|
||||
|
||||
Generated
Vendored
+17
-6
@@ -1,12 +1,13 @@
|
||||
module.exports = function(hljs) {
|
||||
var BACKTICK_ESCAPE = {
|
||||
begin: /`[\s\S]/
|
||||
begin: '`[\\s\\S]'
|
||||
};
|
||||
|
||||
return {
|
||||
case_insensitive: true,
|
||||
aliases: [ 'ahk' ],
|
||||
keywords: {
|
||||
keyword: 'Break Continue Else Gosub If Loop Return While',
|
||||
keyword: 'Break Continue Critical Exit ExitApp Gosub Goto New OnExit Pause return SetBatchLines SetTimer Suspend Thread Throw Until ahk_id ahk_class ahk_pid ahk_exe ahk_group',
|
||||
literal: 'A|0 true false NOT AND OR',
|
||||
built_in: 'ComSpec Clipboard ClipboardAll ErrorLevel',
|
||||
},
|
||||
@@ -18,16 +19,26 @@ module.exports = function(hljs) {
|
||||
BACKTICK_ESCAPE,
|
||||
hljs.inherit(hljs.QUOTE_STRING_MODE, {contains: [BACKTICK_ESCAPE]}),
|
||||
hljs.COMMENT(';', '$', {relevance: 0}),
|
||||
hljs.C_BLOCK_COMMENT_MODE,
|
||||
{
|
||||
className: 'number',
|
||||
begin: hljs.NUMBER_RE,
|
||||
relevance: 0
|
||||
},
|
||||
{
|
||||
className: 'variable', // FIXME
|
||||
begin: '%', end: '%',
|
||||
illegal: '\\n',
|
||||
contains: [BACKTICK_ESCAPE]
|
||||
className: 'subst', // FIXED
|
||||
begin: '%(?=[a-zA-Z0-9#_$@])', end: '%',
|
||||
illegal: '[^a-zA-Z0-9#_$@]'
|
||||
},
|
||||
{
|
||||
className: 'built_in',
|
||||
begin: '^\\s*\\w+\\s*,'
|
||||
//I don't really know if this is totally relevant
|
||||
},
|
||||
{
|
||||
className: 'meta',
|
||||
begin: '^\\s*#\w+', end:'$',
|
||||
relevance: 0
|
||||
},
|
||||
{
|
||||
className: 'symbol',
|
||||
|
||||
+1
-1
@@ -26,7 +26,7 @@ module.exports = function(hljs) {
|
||||
|
||||
return {
|
||||
aliases: ['sh', 'zsh'],
|
||||
lexemes: /-?[a-z\._]+/,
|
||||
lexemes: /\b-?[a-z\._]+\b/,
|
||||
keywords: {
|
||||
keyword:
|
||||
'if then else elif fi for while in do done case esac function',
|
||||
|
||||
+1
@@ -85,6 +85,7 @@ module.exports = function(hljs) {
|
||||
LIST.contains = [hljs.COMMENT('comment', ''), NAME, BODY];
|
||||
BODY.contains = DEFAULT_CONTAINS;
|
||||
COLLECTION.contains = DEFAULT_CONTAINS;
|
||||
HINT_COL.contains = [COLLECTION];
|
||||
|
||||
return {
|
||||
aliases: ['clj'],
|
||||
|
||||
+14
-5
@@ -27,7 +27,7 @@ module.exports = function(hljs) {
|
||||
className: 'number',
|
||||
variants: [
|
||||
{ begin: '\\b(0b[01\']+)' },
|
||||
{ begin: '\\b([\\d\']+(\\.[\\d\']*)?|\\.[\\d\']+)(u|U|l|L|ul|UL|f|F|b|B)' },
|
||||
{ begin: '(-?)\\b([\\d\']+(\\.[\\d\']*)?|\\.[\\d\']+)(u|U|l|L|ul|UL|f|F|b|B)' },
|
||||
{ begin: '(-?)(\\b0[xX][a-fA-F0-9\']+|(\\b[\\d\']+(\\.[\\d\']*)?|\\.[\\d\']+)([eE][-+]?[\\d\']+)?)' }
|
||||
],
|
||||
relevance: 0
|
||||
@@ -48,7 +48,7 @@ module.exports = function(hljs) {
|
||||
hljs.inherit(STRINGS, {className: 'meta-string'}),
|
||||
{
|
||||
className: 'meta-string',
|
||||
begin: '<', end: '>',
|
||||
begin: /<[^\n>]*>/, end: /$/,
|
||||
illegal: '\\n',
|
||||
},
|
||||
hljs.C_LINE_COMMENT_MODE,
|
||||
@@ -60,15 +60,16 @@ module.exports = function(hljs) {
|
||||
|
||||
var CPP_KEYWORDS = {
|
||||
keyword: 'int float while private char catch import module export virtual operator sizeof ' +
|
||||
'dynamic_cast|10 typedef const_cast|10 const struct for static_cast|10 union namespace ' +
|
||||
'dynamic_cast|10 typedef const_cast|10 const for static_cast|10 union namespace ' +
|
||||
'unsigned long volatile static protected bool template mutable if public friend ' +
|
||||
'do goto auto void enum else break extern using class asm case typeid ' +
|
||||
'do goto auto void enum else break extern using asm case typeid ' +
|
||||
'short reinterpret_cast|10 default double register explicit signed typename try this ' +
|
||||
'switch continue inline delete alignof constexpr decltype ' +
|
||||
'noexcept static_assert thread_local restrict _Bool complex _Complex _Imaginary ' +
|
||||
'atomic_bool atomic_char atomic_schar ' +
|
||||
'atomic_uchar atomic_short atomic_ushort atomic_int atomic_uint atomic_long atomic_ulong atomic_llong ' +
|
||||
'atomic_ullong new throw return',
|
||||
'atomic_ullong new throw return ' +
|
||||
'and or not',
|
||||
built_in: 'std string cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream ' +
|
||||
'auto_ptr deque list queue stack vector map set bitset multiset multimap unordered_set ' +
|
||||
'unordered_map unordered_multiset unordered_multimap array shared_ptr abort abs acos ' +
|
||||
@@ -154,6 +155,14 @@ module.exports = function(hljs) {
|
||||
hljs.C_BLOCK_COMMENT_MODE,
|
||||
PREPROCESSOR
|
||||
]
|
||||
},
|
||||
{
|
||||
className: 'class',
|
||||
beginKeywords: 'class struct', end: /[{;:]/,
|
||||
contains: [
|
||||
{begin: /</, end: />/, contains: ['self']}, // skip generic stuff
|
||||
hljs.TITLE_MODE
|
||||
]
|
||||
}
|
||||
]),
|
||||
exports: {
|
||||
|
||||
+21
-4
@@ -6,10 +6,10 @@ module.exports = function(hljs) {
|
||||
var CRYSTAL_METHOD_RE = '[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\][=?]?';
|
||||
var CRYSTAL_KEYWORDS = {
|
||||
keyword:
|
||||
'abstract alias as asm begin break case class def do else elsif end ensure enum extend for fun if ifdef ' +
|
||||
'include instance_sizeof is_a? lib macro module next of out pointerof private protected rescue responds_to? ' +
|
||||
'return require self sizeof struct super then type typeof union unless until when while with yield ' +
|
||||
'__DIR__ __FILE__ __LINE__',
|
||||
'abstract alias as as? asm begin break case class def do else elsif end ensure enum extend for fun if ' +
|
||||
'include instance_sizeof is_a? lib macro module next nil? of out pointerof private protected rescue responds_to? ' +
|
||||
'return require select self sizeof struct super then type typeof union uninitialized unless until when while with yield ' +
|
||||
'__DIR__ __END_LINE__ __FILE__ __LINE__',
|
||||
literal: 'false nil true'
|
||||
};
|
||||
var SUBST = {
|
||||
@@ -47,6 +47,22 @@ module.exports = function(hljs) {
|
||||
{begin: '%w?%', end: '%'},
|
||||
{begin: '%w?-', end: '-'},
|
||||
{begin: '%w?\\|', end: '\\|'},
|
||||
{begin: /<<-\w+$/, end: /^\s*\w+$/},
|
||||
],
|
||||
relevance: 0,
|
||||
};
|
||||
var Q_STRING = {
|
||||
className: 'string',
|
||||
variants: [
|
||||
{begin: '%q\\(', end: '\\)', contains: recursiveParen('\\(', '\\)')},
|
||||
{begin: '%q\\[', end: '\\]', contains: recursiveParen('\\[', '\\]')},
|
||||
{begin: '%q{', end: '}', contains: recursiveParen('{', '}')},
|
||||
{begin: '%q<', end: '>', contains: recursiveParen('<', '>')},
|
||||
{begin: '%q/', end: '/'},
|
||||
{begin: '%q%', end: '%'},
|
||||
{begin: '%q-', end: '-'},
|
||||
{begin: '%q\\|', end: '\\|'},
|
||||
{begin: /<<-'\w+'$/, end: /^\s*\w+$/},
|
||||
],
|
||||
relevance: 0,
|
||||
};
|
||||
@@ -97,6 +113,7 @@ module.exports = function(hljs) {
|
||||
var CRYSTAL_DEFAULT_CONTAINS = [
|
||||
EXPANSION,
|
||||
STRING,
|
||||
Q_STRING,
|
||||
REGEXP,
|
||||
REGEXP2,
|
||||
ATTRIBUTE,
|
||||
|
||||
+17
-7
@@ -3,12 +3,11 @@ module.exports = function(hljs) {
|
||||
keyword:
|
||||
// Normal keywords.
|
||||
'abstract as base bool break byte case catch char checked const continue decimal ' +
|
||||
'default delegate do double else enum event explicit extern finally fixed float ' +
|
||||
'for foreach goto if implicit in int interface internal is lock long ' +
|
||||
'default delegate do double enum event explicit extern finally fixed float ' +
|
||||
'for foreach goto if implicit in int interface internal is lock long nameof ' +
|
||||
'object operator out override params private protected public readonly ref sbyte ' +
|
||||
'sealed short sizeof stackalloc static string struct switch this try typeof ' +
|
||||
'uint ulong unchecked unsafe ushort using virtual void volatile while ' +
|
||||
'nameof ' +
|
||||
// Contextual keywords.
|
||||
'add alias ascending async await by descending dynamic equals from get global group into join ' +
|
||||
'let on orderby partial remove select set value var where yield',
|
||||
@@ -72,6 +71,7 @@ module.exports = function(hljs) {
|
||||
};
|
||||
|
||||
var TYPE_IDENT_RE = hljs.IDENT_RE + '(<' + hljs.IDENT_RE + '(\\s*,\\s*' + hljs.IDENT_RE + ')*>)?(\\[\\])?';
|
||||
|
||||
return {
|
||||
aliases: ['csharp'],
|
||||
keywords: KEYWORDS,
|
||||
@@ -105,7 +105,9 @@ module.exports = function(hljs) {
|
||||
{
|
||||
className: 'meta',
|
||||
begin: '#', end: '$',
|
||||
keywords: {'meta-keyword': 'if else elif endif define undef warning error line region endregion pragma checksum'}
|
||||
keywords: {
|
||||
'meta-keyword': 'if else elif endif define undef warning error line region endregion pragma checksum'
|
||||
}
|
||||
},
|
||||
STRING,
|
||||
hljs.C_NUMBER_MODE,
|
||||
@@ -127,16 +129,24 @@ module.exports = function(hljs) {
|
||||
hljs.C_BLOCK_COMMENT_MODE
|
||||
]
|
||||
},
|
||||
{
|
||||
// [Attributes("")]
|
||||
className: 'meta',
|
||||
begin: '^\\s*\\[', excludeBegin: true, end: '\\]', excludeEnd: true,
|
||||
contains: [
|
||||
{className: 'meta-string', begin: /"/, end: /"/}
|
||||
]
|
||||
},
|
||||
{
|
||||
// Expression keywords prevent 'keyword Name(...)' from being
|
||||
// recognized as a function definition
|
||||
beginKeywords: 'new return throw await',
|
||||
beginKeywords: 'new return throw await else',
|
||||
relevance: 0
|
||||
},
|
||||
{
|
||||
className: 'function',
|
||||
begin: '(' + TYPE_IDENT_RE + '\\s+)+' + hljs.IDENT_RE + '\\s*\\(', returnBegin: true, end: /[{;=]/,
|
||||
excludeEnd: true,
|
||||
begin: '(' + TYPE_IDENT_RE + '\\s+)+' + hljs.IDENT_RE + '\\s*\\(', returnBegin: true,
|
||||
end: /[{;=]/, excludeEnd: true,
|
||||
keywords: KEYWORDS,
|
||||
contains: [
|
||||
{
|
||||
|
||||
Generated
Vendored
+2
-2
@@ -2,14 +2,14 @@ module.exports = function(hljs) {
|
||||
return {
|
||||
aliases: ['docker'],
|
||||
case_insensitive: true,
|
||||
keywords: 'from maintainer expose env user onbuild',
|
||||
keywords: 'from maintainer expose env arg user onbuild stopsignal',
|
||||
contains: [
|
||||
hljs.HASH_COMMENT_MODE,
|
||||
hljs.APOS_STRING_MODE,
|
||||
hljs.QUOTE_STRING_MODE,
|
||||
hljs.NUMBER_MODE,
|
||||
{
|
||||
beginKeywords: 'run cmd entrypoint volume add copy workdir label healthcheck',
|
||||
beginKeywords: 'run cmd entrypoint volume add copy workdir label healthcheck shell',
|
||||
starts: {
|
||||
end: /[^\\]\n/,
|
||||
subLanguage: 'bash'
|
||||
|
||||
+2
-1
@@ -77,6 +77,7 @@ module.exports = function(hljs) {
|
||||
COMMENT,
|
||||
|
||||
{begin: '->|<-'} // No markup, relevance booster
|
||||
]
|
||||
],
|
||||
illegal: /;/
|
||||
};
|
||||
};
|
||||
+1
-1
@@ -140,7 +140,7 @@ module.exports = function (hljs) {
|
||||
contains: [
|
||||
{ // Function title
|
||||
className: 'title',
|
||||
begin: /^[a-z][a-z0-9_]+/,
|
||||
begin: /^[a-z0-9_]+/,
|
||||
},
|
||||
PARAMS,
|
||||
SYMBOLS,
|
||||
|
||||
+4
-2
@@ -50,7 +50,7 @@ module.exports = function(hljs) {
|
||||
'getpath getPreviousTradingDay getPreviousWeekDay getRow getscalar3D getscalar4D getTrRow getwind glm gradcplx gradMT ' +
|
||||
'gradMTm gradMTT gradMTTm gradp graphprt graphset hasimag header headermt hess hessMT hessMTg hessMTgw hessMTm ' +
|
||||
'hessMTmw hessMTT hessMTTg hessMTTgw hessMTTm hessMTw hessp hist histf histp hsec imag indcv indexcat indices indices2 ' +
|
||||
'indicesf indicesfn indnv indsav indx integrate1d integrateControlCreate intgrat2 intgrat3 inthp1 inthp2 inthp3 inthp4 ' +
|
||||
'indicesf indicesfn indnv indsav integrate1d integrateControlCreate intgrat2 intgrat3 inthp1 inthp2 inthp3 inthp4 ' +
|
||||
'inthpControlCreate intquad1 intquad2 intquad3 intrleav intrleavsa intrsect intsimp inv invpd invswp iscplx iscplxf ' +
|
||||
'isden isinfnanmiss ismiss key keyav keyw lag lag1 lagn lapEighb lapEighi lapEighvb lapEighvi lapgEig lapgEigh lapgEighv ' +
|
||||
'lapgEigv lapgSchur lapgSvdcst lapgSvds lapgSvdst lapSvdcusv lapSvds lapSvdusv ldlp ldlsol linSolve listwise ln lncdfbvn ' +
|
||||
@@ -90,7 +90,9 @@ module.exports = function(hljs) {
|
||||
'utctodtv utrisol vals varCovMS varCovXS varget vargetl varmall varmares varput varputl vartypef vcm vcms vcx vcxs ' +
|
||||
'vec vech vecr vector vget view viewxyz vlist vnamecv volume vput vread vtypecv wait waitc walkindex where window ' +
|
||||
'writer xlabel xlsGetSheetCount xlsGetSheetSize xlsGetSheetTypes xlsMakeRange xlsReadM xlsReadSA xlsWrite xlsWriteM ' +
|
||||
'xlsWriteSA xpnd xtics xy xyz ylabel ytics zeros zeta zlabel ztics',
|
||||
'xlsWriteSA xpnd xtics xy xyz ylabel ytics zeros zeta zlabel ztics cdfEmpirical dot h5create h5open h5read h5readAttribute ' +
|
||||
'h5write h5writeAttribute ldl plotAddErrorBar plotAddSurface plotCDFEmpirical plotSetColormap plotSetContourLabels ' +
|
||||
'plotSetLegendFont plotSetTextInterpreter plotSetXTicCount plotSetYTicCount plotSetZLevels powerm strjoin strtrim sylvester',
|
||||
literal: 'DB_AFTER_LAST_ROW DB_ALL_TABLES DB_BATCH_OPERATIONS DB_BEFORE_FIRST_ROW DB_BLOB DB_EVENT_NOTIFICATIONS ' +
|
||||
'DB_FINISH_QUERY DB_HIGH_PRECISION DB_LAST_INSERT_ID DB_LOW_PRECISION_DOUBLE DB_LOW_PRECISION_INT32 ' +
|
||||
'DB_LOW_PRECISION_INT64 DB_LOW_PRECISION_NUMBERS DB_MULTIPLE_RESULT_SETS DB_NAMED_PLACEHOLDERS ' +
|
||||
|
||||
+1
-1
@@ -7,7 +7,7 @@ module.exports = function(hljs) {
|
||||
return {
|
||||
aliases: ['hx'],
|
||||
keywords: {
|
||||
keyword: 'break callback case cast catch continue default do dynamic else enum extern ' +
|
||||
keyword: 'break case cast catch continue default do dynamic else enum extern ' +
|
||||
'for function here if import in inline never new override package private get set ' +
|
||||
'public return static super switch this throw trace try typedef untyped using var while ' +
|
||||
HAXE_BASIC_TYPES,
|
||||
|
||||
+101
@@ -0,0 +1,101 @@
|
||||
module.exports = function(hljs) {
|
||||
var keywords = {
|
||||
'builtin-name':
|
||||
// keywords
|
||||
'!= % %= & &= * ** **= *= *map ' +
|
||||
'+ += , --build-class-- --import-- -= . / // //= ' +
|
||||
'/= < << <<= <= = > >= >> >>= ' +
|
||||
'@ @= ^ ^= abs accumulate all and any ap-compose ' +
|
||||
'ap-dotimes ap-each ap-each-while ap-filter ap-first ap-if ap-last ap-map ap-map-when ap-pipe ' +
|
||||
'ap-reduce ap-reject apply as-> ascii assert assoc bin break butlast ' +
|
||||
'callable calling-module-name car case cdr chain chr coll? combinations compile ' +
|
||||
'compress cond cons cons? continue count curry cut cycle dec ' +
|
||||
'def default-method defclass defmacro defmacro-alias defmacro/g! defmain defmethod defmulti defn ' +
|
||||
'defn-alias defnc defnr defreader defseq del delattr delete-route dict-comp dir ' +
|
||||
'disassemble dispatch-reader-macro distinct divmod do doto drop drop-last drop-while empty? ' +
|
||||
'end-sequence eval eval-and-compile eval-when-compile even? every? except exec filter first ' +
|
||||
'flatten float? fn fnc fnr for for* format fraction genexpr ' +
|
||||
'gensym get getattr global globals group-by hasattr hash hex id ' +
|
||||
'identity if if* if-not if-python2 import in inc input instance? ' +
|
||||
'integer integer-char? integer? interleave interpose is is-coll is-cons is-empty is-even ' +
|
||||
'is-every is-float is-instance is-integer is-integer-char is-iterable is-iterator is-keyword is-neg is-none ' +
|
||||
'is-not is-numeric is-odd is-pos is-string is-symbol is-zero isinstance islice issubclass ' +
|
||||
'iter iterable? iterate iterator? keyword keyword? lambda last len let ' +
|
||||
'lif lif-not list* list-comp locals loop macro-error macroexpand macroexpand-1 macroexpand-all ' +
|
||||
'map max merge-with method-decorator min multi-decorator multicombinations name neg? next ' +
|
||||
'none? nonlocal not not-in not? nth numeric? oct odd? open ' +
|
||||
'or ord partition permutations pos? post-route postwalk pow prewalk print ' +
|
||||
'product profile/calls profile/cpu put-route quasiquote quote raise range read read-str ' +
|
||||
'recursive-replace reduce remove repeat repeatedly repr require rest round route ' +
|
||||
'route-with-methods rwm second seq set-comp setattr setv some sorted string ' +
|
||||
'string? sum switch symbol? take take-nth take-while tee try unless ' +
|
||||
'unquote unquote-splicing vars walk when while with with* with-decorator with-gensyms ' +
|
||||
'xi xor yield yield-from zero? zip zip-longest | |= ~'
|
||||
};
|
||||
|
||||
var SYMBOLSTART = 'a-zA-Z_\\-!.?+*=<>&#\'';
|
||||
var SYMBOL_RE = '[' + SYMBOLSTART + '][' + SYMBOLSTART + '0-9/;:]*';
|
||||
var SIMPLE_NUMBER_RE = '[-+]?\\d+(\\.\\d+)?';
|
||||
|
||||
var SHEBANG = {
|
||||
className: 'meta',
|
||||
begin: '^#!', end: '$'
|
||||
};
|
||||
|
||||
var SYMBOL = {
|
||||
begin: SYMBOL_RE,
|
||||
relevance: 0
|
||||
};
|
||||
var NUMBER = {
|
||||
className: 'number', begin: SIMPLE_NUMBER_RE,
|
||||
relevance: 0
|
||||
};
|
||||
var STRING = hljs.inherit(hljs.QUOTE_STRING_MODE, {illegal: null});
|
||||
var COMMENT = hljs.COMMENT(
|
||||
';',
|
||||
'$',
|
||||
{
|
||||
relevance: 0
|
||||
}
|
||||
);
|
||||
var LITERAL = {
|
||||
className: 'literal',
|
||||
begin: /\b([Tt]rue|[Ff]alse|nil|None)\b/
|
||||
};
|
||||
var COLLECTION = {
|
||||
begin: '[\\[\\{]', end: '[\\]\\}]'
|
||||
};
|
||||
var HINT = {
|
||||
className: 'comment',
|
||||
begin: '\\^' + SYMBOL_RE
|
||||
};
|
||||
var HINT_COL = hljs.COMMENT('\\^\\{', '\\}');
|
||||
var KEY = {
|
||||
className: 'symbol',
|
||||
begin: '[:]{1,2}' + SYMBOL_RE
|
||||
};
|
||||
var LIST = {
|
||||
begin: '\\(', end: '\\)'
|
||||
};
|
||||
var BODY = {
|
||||
endsWithParent: true,
|
||||
relevance: 0
|
||||
};
|
||||
var NAME = {
|
||||
keywords: keywords,
|
||||
lexemes: SYMBOL_RE,
|
||||
className: 'name', begin: SYMBOL_RE,
|
||||
starts: BODY
|
||||
};
|
||||
var DEFAULT_CONTAINS = [LIST, STRING, HINT, HINT_COL, COMMENT, KEY, COLLECTION, NUMBER, LITERAL, SYMBOL];
|
||||
|
||||
LIST.contains = [hljs.COMMENT('comment', ''), NAME, BODY];
|
||||
BODY.contains = DEFAULT_CONTAINS;
|
||||
COLLECTION.contains = DEFAULT_CONTAINS;
|
||||
|
||||
return {
|
||||
aliases: ['hylang'],
|
||||
illegal: /\S/,
|
||||
contains: [SHEBANG, LIST, STRING, HINT, HINT_COL, COMMENT, KEY, COLLECTION, NUMBER, LITERAL]
|
||||
}
|
||||
};
|
||||
Generated
Vendored
+46
@@ -0,0 +1,46 @@
|
||||
module.exports = function (hljs) {
|
||||
var PARAM = {
|
||||
begin: /[\w-]+ *=/, returnBegin: true,
|
||||
relevance: 0,
|
||||
contains: [{className: 'attr', begin: /[\w-]+/}]
|
||||
};
|
||||
var PARAMSBLOCK = {
|
||||
className: 'params',
|
||||
begin: /\(/,
|
||||
end: /\)/,
|
||||
contains: [PARAM],
|
||||
relevance : 0
|
||||
};
|
||||
var OPERATION = {
|
||||
className: 'function',
|
||||
begin: /:[\w\-.]+/,
|
||||
relevance: 0
|
||||
};
|
||||
var PATH = {
|
||||
className: 'string',
|
||||
begin: /\B(([\/.])[\w\-.\/=]+)+/,
|
||||
};
|
||||
var COMMAND_PARAMS = {
|
||||
className: 'params',
|
||||
begin: /--[\w\-=\/]+/,
|
||||
};
|
||||
return {
|
||||
aliases: ['wildfly-cli'],
|
||||
lexemes: '[a-z\-]+',
|
||||
keywords: {
|
||||
keyword: 'alias batch cd clear command connect connection-factory connection-info data-source deploy ' +
|
||||
'deployment-info deployment-overlay echo echo-dmr help history if jdbc-driver-info jms-queue|20 jms-topic|20 ls ' +
|
||||
'patch pwd quit read-attribute read-operation reload rollout-plan run-batch set shutdown try unalias ' +
|
||||
'undeploy unset version xa-data-source', // module
|
||||
literal: 'true false'
|
||||
},
|
||||
contains: [
|
||||
hljs.HASH_COMMENT_MODE,
|
||||
hljs.QUOTE_STRING_MODE,
|
||||
COMMAND_PARAMS,
|
||||
OPERATION,
|
||||
PATH,
|
||||
PARAMSBLOCK
|
||||
]
|
||||
}
|
||||
};
|
||||
Generated
Vendored
+23
@@ -0,0 +1,23 @@
|
||||
module.exports = function(hljs) {
|
||||
return {
|
||||
contains: [
|
||||
{
|
||||
className: 'meta',
|
||||
begin: /^julia>/,
|
||||
relevance: 10,
|
||||
starts: {
|
||||
// end the highlighting if we are on a new line and the line does not have at
|
||||
// least six spaces in the beginning
|
||||
end: /^(?![ ]{6})/,
|
||||
subLanguage: 'julia'
|
||||
},
|
||||
// jldoctest Markdown blocks are used in the Julia manual and package docs indicate
|
||||
// code snippets that should be verified when the documentation is built. They can be
|
||||
// either REPL-like or script-like, but are usually REPL-like and therefore we apply
|
||||
// julia-repl highlighting to them. More information can be found in Documenter's
|
||||
// manual: https://juliadocs.github.io/Documenter.jl/latest/man/doctests.html
|
||||
aliases: ['jldoctest']
|
||||
}
|
||||
]
|
||||
}
|
||||
};
|
||||
+54
-70
@@ -1,104 +1,84 @@
|
||||
module.exports = function(hljs) {
|
||||
// Since there are numerous special names in Julia, it is too much trouble
|
||||
// to maintain them by hand. Hence these names (i.e. keywords, literals and
|
||||
// built-ins) are automatically generated from Julia (v0.3.0 and v0.4.1)
|
||||
// itself through following scripts for each.
|
||||
// built-ins) are automatically generated from Julia v0.6 itself through
|
||||
// the following scripts for each.
|
||||
|
||||
var KEYWORDS = {
|
||||
// # keyword generator
|
||||
// println("in")
|
||||
// # keyword generator, multi-word keywords handled manually below
|
||||
// foreach(println, ["in", "isa", "where"])
|
||||
// for kw in Base.REPLCompletions.complete_keyword("")
|
||||
// println(kw)
|
||||
// if !(contains(kw, " ") || kw == "struct")
|
||||
// println(kw)
|
||||
// end
|
||||
// end
|
||||
keyword:
|
||||
'in abstract baremodule begin bitstype break catch ccall const continue do else elseif end export ' +
|
||||
'finally for function global if immutable import importall let local macro module quote return try type ' +
|
||||
'typealias using while',
|
||||
'in isa where ' +
|
||||
'baremodule begin break catch ccall const continue do else elseif end export false finally for function ' +
|
||||
'global if import importall let local macro module quote return true try using while ' +
|
||||
// legacy, to be deprecated in the next release
|
||||
'type immutable abstract bitstype typealias ',
|
||||
|
||||
// # literal generator
|
||||
// println("true")
|
||||
// println("false")
|
||||
// for name in Base.REPLCompletions.completions("", 0)[1]
|
||||
// try
|
||||
// s = symbol(name)
|
||||
// v = eval(s)
|
||||
// if !isa(v, Function) &&
|
||||
// !isa(v, DataType) &&
|
||||
// !isa(v, IntrinsicFunction) &&
|
||||
// !issubtype(typeof(v), Tuple) &&
|
||||
// !isa(v, Union) &&
|
||||
// !isa(v, Module) &&
|
||||
// !isa(v, TypeConstructor) &&
|
||||
// !isa(v, TypeVar) &&
|
||||
// !isa(v, Colon)
|
||||
// v = eval(Symbol(name))
|
||||
// if !(v isa Function || v isa Type || v isa TypeVar || v isa Module || v isa Colon)
|
||||
// println(name)
|
||||
// end
|
||||
// end
|
||||
// end
|
||||
literal:
|
||||
// v0.3
|
||||
'true false ARGS CPU_CORES C_NULL DL_LOAD_PATH DevNull ENDIAN_BOM ENV I|0 Inf Inf16 Inf32 ' +
|
||||
'InsertionSort JULIA_HOME LOAD_PATH MS_ASYNC MS_INVALIDATE MS_SYNC MergeSort NaN NaN16 NaN32 OS_NAME QuickSort ' +
|
||||
'RTLD_DEEPBIND RTLD_FIRST RTLD_GLOBAL RTLD_LAZY RTLD_LOCAL RTLD_NODELETE RTLD_NOLOAD RTLD_NOW RoundDown ' +
|
||||
'RoundFromZero RoundNearest RoundToZero RoundUp STDERR STDIN STDOUT VERSION WORD_SIZE catalan cglobal e|0 eu|0 ' +
|
||||
'eulergamma golden im nothing pi γ π φ ' +
|
||||
// v0.4 (diff)
|
||||
'Inf64 NaN64 RoundNearestTiesAway RoundNearestTiesUp ',
|
||||
'true false ' +
|
||||
'ARGS C_NULL DevNull ENDIAN_BOM ENV I Inf Inf16 Inf32 Inf64 InsertionSort JULIA_HOME LOAD_PATH MergeSort ' +
|
||||
'NaN NaN16 NaN32 NaN64 PROGRAM_FILE QuickSort RoundDown RoundFromZero RoundNearest RoundNearestTiesAway ' +
|
||||
'RoundNearestTiesUp RoundToZero RoundUp STDERR STDIN STDOUT VERSION catalan e|0 eu|0 eulergamma golden im ' +
|
||||
'nothing pi γ π φ ',
|
||||
|
||||
// # built_in generator:
|
||||
// for name in Base.REPLCompletions.completions("", 0)[1]
|
||||
// try
|
||||
// v = eval(symbol(name))
|
||||
// if isa(v, DataType) || isa(v, TypeConstructor) || isa(v, TypeVar)
|
||||
// v = eval(Symbol(name))
|
||||
// if v isa Type || v isa TypeVar
|
||||
// println(name)
|
||||
// end
|
||||
// end
|
||||
// end
|
||||
built_in:
|
||||
// v0.3
|
||||
'ANY ASCIIString AbstractArray AbstractRNG AbstractSparseArray Any ArgumentError Array Associative Base64Pipe ' +
|
||||
'Bidiagonal BigFloat BigInt BitArray BitMatrix BitVector Bool BoundsError Box CFILE Cchar Cdouble Cfloat Char ' +
|
||||
'CharString Cint Clong Clonglong ClusterManager Cmd Coff_t Colon Complex Complex128 Complex32 Complex64 ' +
|
||||
'Condition Cptrdiff_t Cshort Csize_t Cssize_t Cuchar Cuint Culong Culonglong Cushort Cwchar_t DArray DataType ' +
|
||||
'DenseArray Diagonal Dict DimensionMismatch DirectIndexString Display DivideError DomainError EOFError ' +
|
||||
'EachLine Enumerate ErrorException Exception Expr Factorization FileMonitor FileOffset Filter Float16 Float32 ' +
|
||||
'Float64 FloatRange FloatingPoint Function GetfieldNode GotoNode Hermitian IO IOBuffer IOStream IPv4 IPv6 ' +
|
||||
'InexactError Int Int128 Int16 Int32 Int64 Int8 IntSet Integer InterruptException IntrinsicFunction KeyError ' +
|
||||
'LabelNode LambdaStaticData LineNumberNode LoadError LocalProcess MIME MathConst MemoryError MersenneTwister ' +
|
||||
'Method MethodError MethodTable Module NTuple NewvarNode Nothing Number ObjectIdDict OrdinalRange ' +
|
||||
'OverflowError ParseError PollingFileWatcher ProcessExitedException ProcessGroup Ptr QuoteNode Range Range1 ' +
|
||||
'Ranges Rational RawFD Real Regex RegexMatch RemoteRef RepString RevString RopeString RoundingMode Set ' +
|
||||
'SharedArray Signed SparseMatrixCSC StackOverflowError Stat StatStruct StepRange String SubArray SubString ' +
|
||||
'SymTridiagonal Symbol SymbolNode Symmetric SystemError Task TextDisplay Timer TmStruct TopNode Triangular ' +
|
||||
'Tridiagonal Type TypeConstructor TypeError TypeName TypeVar UTF16String UTF32String UTF8String UdpSocket ' +
|
||||
'Uint Uint128 Uint16 Uint32 Uint64 Uint8 UndefRefError UndefVarError UniformScaling UnionType UnitRange ' +
|
||||
'Unsigned Vararg VersionNumber WString WeakKeyDict WeakRef Woodbury Zip ' +
|
||||
// v0.4 (diff)
|
||||
'AbstractChannel AbstractFloat AbstractString AssertionError Base64DecodePipe Base64EncodePipe BufferStream ' +
|
||||
'CapturedException CartesianIndex CartesianRange Channel Cintmax_t CompositeException Cstring Cuintmax_t ' +
|
||||
'Cwstring Date DateTime Dims Enum GenSym GlobalRef HTML InitError InvalidStateException Irrational LinSpace ' +
|
||||
'LowerTriangular NullException Nullable OutOfMemoryError Pair PartialQuickSort Pipe RandomDevice ' +
|
||||
'ReadOnlyMemoryError ReentrantLock Ref RemoteException SegmentationFault SerializationState SimpleVector ' +
|
||||
'TCPSocket Text Tuple UDPSocket UInt UInt128 UInt16 UInt32 UInt64 UInt8 UnicodeError Union UpperTriangular ' +
|
||||
'Val Void WorkerConfig AbstractMatrix AbstractSparseMatrix AbstractSparseVector AbstractVecOrMat AbstractVector ' +
|
||||
'DenseMatrix DenseVecOrMat DenseVector Matrix SharedMatrix SharedVector StridedArray StridedMatrix ' +
|
||||
'StridedVecOrMat StridedVector VecOrMat Vector '
|
||||
'ANY AbstractArray AbstractChannel AbstractFloat AbstractMatrix AbstractRNG AbstractSerializer AbstractSet ' +
|
||||
'AbstractSparseArray AbstractSparseMatrix AbstractSparseVector AbstractString AbstractUnitRange AbstractVecOrMat ' +
|
||||
'AbstractVector Any ArgumentError Array AssertionError Associative Base64DecodePipe Base64EncodePipe Bidiagonal '+
|
||||
'BigFloat BigInt BitArray BitMatrix BitVector Bool BoundsError BufferStream CachingPool CapturedException ' +
|
||||
'CartesianIndex CartesianRange Cchar Cdouble Cfloat Channel Char Cint Cintmax_t Clong Clonglong ClusterManager ' +
|
||||
'Cmd CodeInfo Colon Complex Complex128 Complex32 Complex64 CompositeException Condition ConjArray ConjMatrix ' +
|
||||
'ConjVector Cptrdiff_t Cshort Csize_t Cssize_t Cstring Cuchar Cuint Cuintmax_t Culong Culonglong Cushort Cwchar_t ' +
|
||||
'Cwstring DataType Date DateFormat DateTime DenseArray DenseMatrix DenseVecOrMat DenseVector Diagonal Dict ' +
|
||||
'DimensionMismatch Dims DirectIndexString Display DivideError DomainError EOFError EachLine Enum Enumerate ' +
|
||||
'ErrorException Exception ExponentialBackOff Expr Factorization FileMonitor Float16 Float32 Float64 Function ' +
|
||||
'Future GlobalRef GotoNode HTML Hermitian IO IOBuffer IOContext IOStream IPAddr IPv4 IPv6 IndexCartesian IndexLinear ' +
|
||||
'IndexStyle InexactError InitError Int Int128 Int16 Int32 Int64 Int8 IntSet Integer InterruptException ' +
|
||||
'InvalidStateException Irrational KeyError LabelNode LinSpace LineNumberNode LoadError LowerTriangular MIME Matrix ' +
|
||||
'MersenneTwister Method MethodError MethodTable Module NTuple NewvarNode NullException Nullable Number ObjectIdDict ' +
|
||||
'OrdinalRange OutOfMemoryError OverflowError Pair ParseError PartialQuickSort PermutedDimsArray Pipe ' +
|
||||
'PollingFileWatcher ProcessExitedException Ptr QuoteNode RandomDevice Range RangeIndex Rational RawFD ' +
|
||||
'ReadOnlyMemoryError Real ReentrantLock Ref Regex RegexMatch RemoteChannel RemoteException RevString RoundingMode ' +
|
||||
'RowVector SSAValue SegmentationFault SerializationState Set SharedArray SharedMatrix SharedVector Signed ' +
|
||||
'SimpleVector Slot SlotNumber SparseMatrixCSC SparseVector StackFrame StackOverflowError StackTrace StepRange ' +
|
||||
'StepRangeLen StridedArray StridedMatrix StridedVecOrMat StridedVector String SubArray SubString SymTridiagonal ' +
|
||||
'Symbol Symmetric SystemError TCPSocket Task Text TextDisplay Timer Tridiagonal Tuple Type TypeError TypeMapEntry ' +
|
||||
'TypeMapLevel TypeName TypeVar TypedSlot UDPSocket UInt UInt128 UInt16 UInt32 UInt64 UInt8 UndefRefError UndefVarError ' +
|
||||
'UnicodeError UniformScaling Union UnionAll UnitRange Unsigned UpperTriangular Val Vararg VecElement VecOrMat Vector ' +
|
||||
'VersionNumber Void WeakKeyDict WeakRef WorkerConfig WorkerPool '
|
||||
};
|
||||
|
||||
// ref: http://julia.readthedocs.org/en/latest/manual/variables/#allowed-variable-names
|
||||
var VARIABLE_NAME_RE = '[A-Za-z_\\u00A1-\\uFFFF][A-Za-z_0-9\\u00A1-\\uFFFF]*';
|
||||
|
||||
// placeholder for recursive self-reference
|
||||
var DEFAULT = { lexemes: VARIABLE_NAME_RE, keywords: KEYWORDS, illegal: /<\// };
|
||||
|
||||
var TYPE_ANNOTATION = {
|
||||
className: 'type',
|
||||
begin: /::/
|
||||
};
|
||||
|
||||
var SUBTYPE = {
|
||||
className: 'type',
|
||||
begin: /<:/
|
||||
var DEFAULT = {
|
||||
lexemes: VARIABLE_NAME_RE, keywords: KEYWORDS, illegal: /<\//
|
||||
};
|
||||
|
||||
// ref: http://julia.readthedocs.org/en/latest/manual/integers-and-floating-point-numbers/
|
||||
@@ -163,13 +143,17 @@ module.exports = function(hljs) {
|
||||
DEFAULT.contains = [
|
||||
NUMBER,
|
||||
CHAR,
|
||||
TYPE_ANNOTATION,
|
||||
SUBTYPE,
|
||||
STRING,
|
||||
COMMAND,
|
||||
MACROCALL,
|
||||
COMMENT,
|
||||
hljs.HASH_COMMENT_MODE
|
||||
hljs.HASH_COMMENT_MODE,
|
||||
{
|
||||
className: 'keyword',
|
||||
begin:
|
||||
'\\b(((abstract|primitive)\\s+)type|(mutable\\s+)?struct)\\b'
|
||||
},
|
||||
{begin: /<:/} // relevance booster
|
||||
];
|
||||
INTERPOLATION.contains = DEFAULT.contains;
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user