|
@@ -82,7 +82,7 @@
|
|
|
ko.bindingHandlers.clickToCopy = {
|
|
ko.bindingHandlers.clickToCopy = {
|
|
|
init: function (element, valueAccessor) {
|
|
init: function (element, valueAccessor) {
|
|
|
$(element).click(function () {
|
|
$(element).click(function () {
|
|
|
- var $input = $('<input>').css({ opacity: 0 }).val(valueAccessor()).appendTo('body').select();
|
|
|
|
|
|
|
+ var $input = $('<textarea>').css({ opacity: 0 }).val(ko.unwrap(valueAccessor())).appendTo('body').select();
|
|
|
document.execCommand('copy');
|
|
document.execCommand('copy');
|
|
|
$input.remove()
|
|
$input.remove()
|
|
|
});
|
|
});
|
|
@@ -4905,99 +4905,85 @@
|
|
|
init: function (element) {
|
|
init: function (element) {
|
|
|
$(element).addClass('ace-highlight');
|
|
$(element).addClass('ace-highlight');
|
|
|
},
|
|
},
|
|
|
- update: function (element, valueAccessor, allBindingsAccessor) {
|
|
|
|
|
|
|
+ update: function (element, valueAccessor) {
|
|
|
var options = $.extend({
|
|
var options = $.extend({
|
|
|
dialect: 'hive',
|
|
dialect: 'hive',
|
|
|
value: '',
|
|
value: '',
|
|
|
- format: false
|
|
|
|
|
|
|
+ formatted: false
|
|
|
}, valueAccessor());
|
|
}, valueAccessor());
|
|
|
|
|
|
|
|
- var createAceHighlight = function (value) {
|
|
|
|
|
- if (typeof value !== 'undefined' && value !== '') { // allows highlighting static code
|
|
|
|
|
- if (options.path) {
|
|
|
|
|
- value = value[options.path];
|
|
|
|
|
- }
|
|
|
|
|
- ace.require([
|
|
|
|
|
- 'ace/mode/impala_highlight_rules',
|
|
|
|
|
- 'ace/mode/hive_highlight_rules',
|
|
|
|
|
- 'ace/mode/xml_highlight_rules',
|
|
|
|
|
- 'ace/tokenizer',
|
|
|
|
|
- 'ace/layer/text'
|
|
|
|
|
- ], function (impalaRules, hiveRules, xmlRules, tokenizer, text) {
|
|
|
|
|
- var res = [];
|
|
|
|
|
-
|
|
|
|
|
- var Tokenizer = tokenizer.Tokenizer;
|
|
|
|
|
- var Rules = hiveRules.HiveHighlightRules;
|
|
|
|
|
- if (options.dialect && ko.unwrap(options.dialect) == 'impala') {
|
|
|
|
|
- Rules = impalaRules.ImpalaHighlightRules;
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ var value = ko.unwrap(options.value);
|
|
|
|
|
+
|
|
|
|
|
+ if (typeof value !== 'undefined' && value !== '') { // allows highlighting static code
|
|
|
|
|
+ if (options.path) {
|
|
|
|
|
+ value = value[options.path];
|
|
|
|
|
+ }
|
|
|
|
|
+ ace.require([
|
|
|
|
|
+ 'ace/mode/impala_highlight_rules',
|
|
|
|
|
+ 'ace/mode/hive_highlight_rules',
|
|
|
|
|
+ 'ace/mode/xml_highlight_rules',
|
|
|
|
|
+ 'ace/tokenizer',
|
|
|
|
|
+ 'ace/layer/text'
|
|
|
|
|
+ ], function (impalaRules, hiveRules, xmlRules, tokenizer, text) {
|
|
|
|
|
+ var res = [];
|
|
|
|
|
+
|
|
|
|
|
+ var Tokenizer = tokenizer.Tokenizer;
|
|
|
|
|
+ var Rules = hiveRules.HiveHighlightRules;
|
|
|
|
|
+ if (options.dialect && ko.unwrap(options.dialect) == 'impala') {
|
|
|
|
|
+ Rules = impalaRules.ImpalaHighlightRules;
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
- var Text = text.Text;
|
|
|
|
|
|
|
+ var Text = text.Text;
|
|
|
|
|
|
|
|
- var tok = new Tokenizer(new Rules().getRules());
|
|
|
|
|
- var lines = value.split('\n');
|
|
|
|
|
|
|
+ var tok = new Tokenizer(new Rules().getRules());
|
|
|
|
|
+ var lines = value.split('\n');
|
|
|
|
|
|
|
|
- var renderSimpleLine = function(txt, stringBuilder, tokens) {
|
|
|
|
|
- var screenColumn = 0;
|
|
|
|
|
- var token = tokens[0];
|
|
|
|
|
- var value = token.value;
|
|
|
|
|
- if (value) {
|
|
|
|
|
|
|
+ var renderSimpleLine = function(txt, stringBuilder, tokens) {
|
|
|
|
|
+ var screenColumn = 0;
|
|
|
|
|
+ var token = tokens[0];
|
|
|
|
|
+ var value = token.value;
|
|
|
|
|
+ if (value) {
|
|
|
|
|
+ screenColumn = txt.$renderToken(stringBuilder, screenColumn, token, value);
|
|
|
|
|
+ }
|
|
|
|
|
+ for (var i = 1; i < tokens.length; i++) {
|
|
|
|
|
+ token = tokens[i];
|
|
|
|
|
+ value = token.value;
|
|
|
|
|
+ try {
|
|
|
screenColumn = txt.$renderToken(stringBuilder, screenColumn, token, value);
|
|
screenColumn = txt.$renderToken(stringBuilder, screenColumn, token, value);
|
|
|
}
|
|
}
|
|
|
- for (var i = 1; i < tokens.length; i++) {
|
|
|
|
|
- token = tokens[i];
|
|
|
|
|
- value = token.value;
|
|
|
|
|
- try {
|
|
|
|
|
- screenColumn = txt.$renderToken(stringBuilder, screenColumn, token, value);
|
|
|
|
|
- }
|
|
|
|
|
- catch (e) {
|
|
|
|
|
- if (console && console.warn) {
|
|
|
|
|
- console.warn(value, 'This token has some parsing errors and it has been rendered without highlighting.');
|
|
|
|
|
- }
|
|
|
|
|
- stringBuilder.push(value);
|
|
|
|
|
- screenColumn = screenColumn + value.length;
|
|
|
|
|
|
|
+ catch (e) {
|
|
|
|
|
+ if (console && console.warn) {
|
|
|
|
|
+ console.warn(value, 'This token has some parsing errors and it has been rendered without highlighting.');
|
|
|
}
|
|
}
|
|
|
|
|
+ stringBuilder.push(value);
|
|
|
|
|
+ screenColumn = screenColumn + value.length;
|
|
|
}
|
|
}
|
|
|
- };
|
|
|
|
|
-
|
|
|
|
|
- var additionalClass = '';
|
|
|
|
|
- if (!options.splitLines && !options.format) {
|
|
|
|
|
- additionalClass = 'pull-left';
|
|
|
|
|
- } else if (options.format) {
|
|
|
|
|
- additionalClass = 'ace-highlight-pre';
|
|
|
|
|
}
|
|
}
|
|
|
|
|
+ };
|
|
|
|
|
|
|
|
- lines.forEach(function (line) {
|
|
|
|
|
- var renderedTokens = [];
|
|
|
|
|
- var tokens = tok.getLineTokens(line);
|
|
|
|
|
|
|
+ var additionalClass = '';
|
|
|
|
|
+ if (!options.splitLines && !options.formatted) {
|
|
|
|
|
+ additionalClass = 'pull-left';
|
|
|
|
|
+ } else if (options.formatted) {
|
|
|
|
|
+ additionalClass = 'ace-highlight-pre';
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
- if (tokens && tokens.tokens.length) {
|
|
|
|
|
- renderSimpleLine(new Text(document.createElement('div')), renderedTokens, tokens.tokens);
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ lines.forEach(function (line) {
|
|
|
|
|
+ var renderedTokens = [];
|
|
|
|
|
+ var tokens = tok.getLineTokens(line);
|
|
|
|
|
|
|
|
- res.push('<div class="ace_line ' + additionalClass + '">' + renderedTokens.join('') + ' </div>');
|
|
|
|
|
- });
|
|
|
|
|
|
|
+ if (tokens && tokens.tokens.length) {
|
|
|
|
|
+ renderSimpleLine(new Text(document.createElement('div')), renderedTokens, tokens.tokens);
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
- element.innerHTML = '<div class="ace_editor ace-hue"><div class="ace_layer" style="position: static;">' + res.join('') + '</div></div>';
|
|
|
|
|
|
|
+ res.push('<div class="ace_line ' + additionalClass + '">' + renderedTokens.join('') + ' </div>');
|
|
|
});
|
|
});
|
|
|
- }
|
|
|
|
|
- };
|
|
|
|
|
-
|
|
|
|
|
- var value = ko.unwrap(options.value);
|
|
|
|
|
|
|
|
|
|
- if (options.format) {
|
|
|
|
|
- ApiHelper.getInstance().formatSql(value).done(function (data) {
|
|
|
|
|
- if (data.status == 0) {
|
|
|
|
|
- createAceHighlight(data.formatted_statements);
|
|
|
|
|
- } else {
|
|
|
|
|
- createAceHighlight(value);
|
|
|
|
|
- }
|
|
|
|
|
- }).fail(function () {
|
|
|
|
|
- createAceHighlight(value);
|
|
|
|
|
- })
|
|
|
|
|
- } else {
|
|
|
|
|
- createAceHighlight(value);
|
|
|
|
|
|
|
+ element.innerHTML = '<div class="ace_editor ace-hue"><div class="ace_layer" style="position: static;">' + res.join('') + '</div></div>';
|
|
|
|
|
+ });
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
}
|
|
}
|
|
|
};
|
|
};
|
|
|
|
|
|