/** * Licensed Materials - Property of IBM * IBM Cognos Products: Modeling UI (C) Copyright IBM Corp. 2018, 2019 * US Government Users Restricted Rights - Use, duplication or disclosure restricted by GSA ADP Schedule Contract with IBM Corp. */ // this is a model defining the syntax highlighting rules and the code complete list // for the sql modeler // it uses the text mode as its base mode/highlighter ace.define( "ace/mode/modeler_sql_highlight_rules", [ "require", "exports", "module", "ace/mode/modeler_resources", "ace/lib/oop", "ace/lib/lang", "ace/mode/text_highlight_rules" ], function( require, exports, module ) { var oop = require("../lib/oop"); var Resources = require("ace/mode/modeler_resources"); require("../lib/lang"); // get the text highlight so we can use it as our base, so we get bracet matching and what not var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; // this list comes from RQPSQLKWYWORD.JAVA from XQE var keyWordsGroup = { name: Resources.get('keywordsGroup'), val: ["absolute","action","add","admin","after","alias","all","allocate","alter","and","any","are","array","as","asc","assertion","at","authorization","before","begin","binary","bit","blob","boolean","both","breadth","by","call","cascade","cascaded","catalog","character","check","class","clob","close","collate","collation","column","commit","completion","connect","connection","constraint","constraints","constructor","continue","corresponding","create","cross","cube","current","current_path","current_role","current_user","cursor","cycle","deallocate","declare","deferrable","deferred","delete","depth","deref","desc","describe","descriptor","destroy","destructor","deterministic","dictionary","diagnostics","disconnect","domain","drop","dynamic","each","end-exec","every","exception","exec","execute","external","false","fetch","first","foreign","found","from","free","full","function","general","get","global","go","goto","grant","group","grouping","having","host","identity","ignore","immediate","indicator","initialize","initially","inner","inout","input","into","is","isolation","iterate","join","key","language","large","last","lateral","leading","left","less","limit","local","locator","map","match","modifies","modify","module","names","national","natural","nchar","nclob","new","next","no","none","numeric","object","of","off","old","on","only","open","operation","option","or","order","ordinality","out","outer","output","pad","parameter","parameters","partial","path","postfix","precision","prefix","preorder","prepare","preserve","primary","prior","privileges","procedure","public","read","reads","recursive","ref","references","referencing","relative","restrict","result","return","returns","revoke","right","rollback","rollup","routine","savepoint","scroll","scope","search","section","select","sequence","sets","size","some","specific","specifictype","sql","sqlexception","sqlstate","sqlwarning","start","state","statement","static","structure","table","temporary","terminate","than","timezone_hour","timezone_minute","to","trailing","transaction","translation","treat","trigger","true","under","union","unknown","unnest","update","usage","using","values","variable","varying","view","whenever","where","with","without","work","write","zone"] }; // build the regex string for the keywords var keyWordsRegExStr = "\\b(" + keyWordsGroup.val.join("|") + ")\\b"; // these are the actually rules, add more as you see fit, the token is basically the CSS styling class that // will be used for the matched text, if the token value "foo" it means it will apply one class calls foo, if // it is "foo.bar" it means it will apply 2 classes foo and bar var ModelerHighlightRules = function() { var mapper = function(map, defaultToken, ignoreCase, splitChar) { var keywords = Object.create(null); Object.keys(map).forEach(function(className) { var a = map[className]; if (ignoreCase) a = a.toLowerCase(); var list = a.split(splitChar || "|"); for (var i = list.length; i--; ) keywords[list[i]] = className; }); if (Object.getPrototypeOf(keywords)) { keywords.__proto__ = null; } this.$keywordList = Object.keys(keywords); map = null; return ignoreCase ? function(value) {return keywords[value.toLowerCase()] || defaultToken; } : function(value) {return keywords[value] || defaultToken; }; }; this.setKeywords = function(kwMap) { this.keywordRule.onMatch = mapper(kwMap, "identifier", true) } this.keywordRule = { regex : "[\\w\\-\\.]+", onMatch : function() {return "text"} } this.$rules = { start : [ { token : 'comment', regex : '--.*$' },{ token : 'comment-block', start : '/\\*', end : '\\*/' },{ token : 'macro-block', start : '\\#', end : '\\#' },{ token : 'keyword', regex : keyWordsRegExStr, caseInsensitive : true },{ token : 'operator', regex : '\\+|\\-|\\*|\\/|\\/\\/|%|<@>|@>|<@|&|\\^|~|<|>|<=|=>|==|!=|<>|=' },{ token : 'paren.lparen', regex : '\\(|\\[|\\{' },{ token : 'paren.rparen', regex : '\\)|\\]|\\}' },{ token : 'string', regex : /".*?"/ },{ token : 'string', regex : /'.*?'/ }, this.keywordRule ] }; this.normalizeRules() }; // do the actual inheritance oop.inherits(ModelerHighlightRules, TextHighlightRules); ModelerHighlightRules._keyWordsGroup = keyWordsGroup; exports.ModelerHighlightRules = ModelerHighlightRules; }); ace.define("ace/mode/folding/modeler_sql_rules", [], function(require, exports, module) { "use strict"; var oop = require("../../lib/oop"); var Range = require("../../range").Range; var BaseFoldMode = require("./fold_mode").FoldMode; var FoldMode = exports.FoldMode = function() {}; oop.inherits(FoldMode, BaseFoldMode); (function() { this.foldingStartMarker = /(\()/; this.foldingEndMarker = /(\))/; var shouldFold = function(line) { var lineStartMarkerCount = (line.match(/\(/g) || []).length; var lineEndMarkerCount = (line.match(/\)/g) || []).length; return (lineStartMarkerCount > lineEndMarkerCount); } this.getFoldWidgetRange = function(session, foldStyle, row) { var line = session.getLine(row); if(shouldFold(line)) { var match = line.match(this.foldingStartMarker); if (match && match[1]) { return this.openingBracketBlock(session, match[1], row, match.index); } } else { var range = this.indentationBlock(session, row); if (range) return range; var re = /\S/; var startLevel = line.search(re); if (startLevel == -1) return; var startColumn = line.length; var maxRow = session.getLength(); var startRow = row; var endRow = row; while (++row < maxRow) { line = session.getLine(row); var level = line.search(re); if (level == -1) continue; endRow = row; } if (endRow > startRow) { var endColumn = session.getLine(endRow).length; return new Range(startRow, startColumn, endRow, endColumn); } } }; // must return "" if there's no fold, to enable caching this.getFoldWidget = function(session, foldStyle, row) { var line = session.getLine(row); var indent = line.search(/\S/); var next = session.getLine(row + 1); var prev = session.getLine(row - 1); var prevIndent = prev.search(/\S/); var nextIndent = next.search(/\S/); if(shouldFold(line)) { return "start"; } if (indent == -1) { session.foldWidgets[row - 1] = prevIndent!= -1 && prevIndent < nextIndent ? "start" : ""; return ""; } if (prevIndent!= -1 && prevIndent < indent && !prev.search(/\(/)) session.foldWidgets[row - 1] = "start"; if (indent < nextIndent) return "start"; else return ""; }; }).call(FoldMode.prototype); }); ace.define("ace/mode/modeler-sql",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/modeler_sql_highlight_rules","ace/ext-language_tools", "ace/mode/folding/rules"], function(require, exports, module) { var oop = require("../lib/oop"); var Range = require("../range").Range; // get the base text mode so we can inherit it var TextMode = require("./text").Mode; // get the highlight rules we defined var ModelerHighlightRules = require("./modeler_sql_highlight_rules").ModelerHighlightRules; var MyFoldMode = require("./folding/modeler_sql_rules").FoldMode; // prepare the Mode function var Mode = function() { this.HighlightRules = ModelerHighlightRules; this.foldingRules = new MyFoldMode(); }; // do the actual inheritance for the mode oop.inherits(Mode, TextMode); (function() { this.$id = "ace/mode/modeler-sql"; this.lineCommentStart = "--"; }).call(Mode.prototype); exports.Mode = Mode; }); ace.define("ace/snippets/text",["require","exports","module"], function(require, exports, module) { exports.snippetText =undefined; exports.scope = "text"; }); window.define(function() { return { setResources: function(res) { ace.define("ace/mode/modeler_resources",["require","exports","module"], function(require, exports, module) { exports.get = function(str) { return res.getString(str); }; }); } }; });