~ubuntu-branches/ubuntu/utopic/codemirror-js/utopic

« back to all changes in this revision

Viewing changes to mode/plsql/plsql.js

  • Committer: Package Import Robot
  • Author(s): David Paleino
  • Date: 2012-04-12 12:25:28 UTC
  • Revision ID: package-import@ubuntu.com-20120412122528-8xp5a8frj4h1d3ee
Tags: upstream-2.23
ImportĀ upstreamĀ versionĀ 2.23

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
CodeMirror.defineMode("plsql", function(config, parserConfig) {
 
2
  var indentUnit       = config.indentUnit,
 
3
      keywords         = parserConfig.keywords,
 
4
      functions        = parserConfig.functions,
 
5
      types            = parserConfig.types,
 
6
      sqlplus          = parserConfig.sqlplus,
 
7
      multiLineStrings = parserConfig.multiLineStrings;
 
8
  var isOperatorChar   = /[+\-*&%=<>!?:\/|]/;
 
9
  function chain(stream, state, f) {
 
10
    state.tokenize = f;
 
11
    return f(stream, state);
 
12
  }
 
13
 
 
14
  var type;
 
15
  function ret(tp, style) {
 
16
    type = tp;
 
17
    return style;
 
18
  }
 
19
 
 
20
  function tokenBase(stream, state) {
 
21
    var ch = stream.next();
 
22
    // start of string?
 
23
    if (ch == '"' || ch == "'")
 
24
      return chain(stream, state, tokenString(ch));
 
25
    // is it one of the special signs []{}().,;? Seperator?
 
26
    else if (/[\[\]{}\(\),;\.]/.test(ch))
 
27
      return ret(ch);
 
28
    // start of a number value?
 
29
    else if (/\d/.test(ch)) {
 
30
      stream.eatWhile(/[\w\.]/);
 
31
      return ret("number", "number");
 
32
    }
 
33
    // multi line comment or simple operator?
 
34
    else if (ch == "/") {
 
35
      if (stream.eat("*")) {
 
36
        return chain(stream, state, tokenComment);
 
37
      }
 
38
      else {
 
39
        stream.eatWhile(isOperatorChar);
 
40
        return ret("operator", "operator");
 
41
      }
 
42
    }
 
43
    // single line comment or simple operator?
 
44
    else if (ch == "-") {
 
45
      if (stream.eat("-")) {
 
46
        stream.skipToEnd();
 
47
        return ret("comment", "comment");
 
48
      }
 
49
      else {
 
50
        stream.eatWhile(isOperatorChar);
 
51
        return ret("operator", "operator");
 
52
      }
 
53
    }
 
54
    // pl/sql variable?
 
55
    else if (ch == "@" || ch == "$") {
 
56
      stream.eatWhile(/[\w\d\$_]/);
 
57
      return ret("word", "variable");
 
58
    }
 
59
    // is it a operator?
 
60
    else if (isOperatorChar.test(ch)) {
 
61
      stream.eatWhile(isOperatorChar);
 
62
      return ret("operator", "operator");
 
63
    }
 
64
    else {
 
65
      // get the whole word
 
66
      stream.eatWhile(/[\w\$_]/);
 
67
      // is it one of the listed keywords?
 
68
      if (keywords && keywords.propertyIsEnumerable(stream.current().toLowerCase())) return ret("keyword", "keyword");
 
69
      // is it one of the listed functions?
 
70
      if (functions && functions.propertyIsEnumerable(stream.current().toLowerCase())) return ret("keyword", "builtin");
 
71
      // is it one of the listed types?
 
72
      if (types && types.propertyIsEnumerable(stream.current().toLowerCase())) return ret("keyword", "variable-2");
 
73
      // is it one of the listed sqlplus keywords?
 
74
      if (sqlplus && sqlplus.propertyIsEnumerable(stream.current().toLowerCase())) return ret("keyword", "variable-3");
 
75
      // default: just a "word"
 
76
      return ret("word", "plsql-word");
 
77
    }
 
78
  }
 
79
 
 
80
  function tokenString(quote) {
 
81
    return function(stream, state) {
 
82
      var escaped = false, next, end = false;
 
83
      while ((next = stream.next()) != null) {
 
84
        if (next == quote && !escaped) {end = true; break;}
 
85
        escaped = !escaped && next == "\\";
 
86
      }
 
87
      if (end || !(escaped || multiLineStrings))
 
88
        state.tokenize = tokenBase;
 
89
      return ret("string", "plsql-string");
 
90
    };
 
91
  }
 
92
 
 
93
  function tokenComment(stream, state) {
 
94
    var maybeEnd = false, ch;
 
95
    while (ch = stream.next()) {
 
96
      if (ch == "/" && maybeEnd) {
 
97
        state.tokenize = tokenBase;
 
98
        break;
 
99
      }
 
100
      maybeEnd = (ch == "*");
 
101
    }
 
102
    return ret("comment", "plsql-comment");
 
103
  }
 
104
 
 
105
  // Interface
 
106
 
 
107
  return {
 
108
    startState: function(basecolumn) {
 
109
      return {
 
110
        tokenize: tokenBase,
 
111
        startOfLine: true
 
112
      };
 
113
    },
 
114
 
 
115
    token: function(stream, state) {
 
116
      if (stream.eatSpace()) return null;
 
117
      var style = state.tokenize(stream, state);
 
118
      return style;
 
119
    }
 
120
  };
 
121
});
 
122
 
 
123
(function() {
 
124
  function keywords(str) {
 
125
    var obj = {}, words = str.split(" ");
 
126
    for (var i = 0; i < words.length; ++i) obj[words[i]] = true;
 
127
    return obj;
 
128
  }
 
129
  var cKeywords = "abort accept access add all alter and any array arraylen as asc assert assign at attributes audit " +
 
130
        "authorization avg " +
 
131
        "base_table begin between binary_integer body boolean by " +
 
132
        "case cast char char_base check close cluster clusters colauth column comment commit compress connect " +
 
133
        "connected constant constraint crash create current currval cursor " +
 
134
        "data_base database date dba deallocate debugoff debugon decimal declare default definition delay delete " +
 
135
        "desc digits dispose distinct do drop " +
 
136
        "else elsif enable end entry escape exception exception_init exchange exclusive exists exit external " +
 
137
        "fast fetch file for force form from function " +
 
138
        "generic goto grant group " +
 
139
        "having " +
 
140
        "identified if immediate in increment index indexes indicator initial initrans insert interface intersect " +
 
141
        "into is " +
 
142
        "key " +
 
143
        "level library like limited local lock log logging long loop " +
 
144
        "master maxextents maxtrans member minextents minus mislabel mode modify multiset " +
 
145
        "new next no noaudit nocompress nologging noparallel not nowait number_base " +
 
146
        "object of off offline on online only open option or order out " +
 
147
        "package parallel partition pctfree pctincrease pctused pls_integer positive positiven pragma primary prior " +
 
148
        "private privileges procedure public " +
 
149
        "raise range raw read rebuild record ref references refresh release rename replace resource restrict return " +
 
150
        "returning reverse revoke rollback row rowid rowlabel rownum rows run " +
 
151
        "savepoint schema segment select separate session set share snapshot some space split sql start statement " +
 
152
        "storage subtype successful synonym " +
 
153
        "tabauth table tables tablespace task terminate then to trigger truncate type " +
 
154
        "union unique unlimited unrecoverable unusable update use using " +
 
155
        "validate value values variable view views " +
 
156
        "when whenever where while with work";
 
157
 
 
158
  var cFunctions = "abs acos add_months ascii asin atan atan2 average " +
 
159
        "bfilename " +
 
160
        "ceil chartorowid chr concat convert cos cosh count " +
 
161
        "decode deref dual dump dup_val_on_index " +
 
162
        "empty error exp " +
 
163
        "false floor found " +
 
164
        "glb greatest " +
 
165
        "hextoraw " +
 
166
        "initcap instr instrb isopen " +
 
167
        "last_day least lenght lenghtb ln lower lpad ltrim lub " +
 
168
        "make_ref max min mod months_between " +
 
169
        "new_time next_day nextval nls_charset_decl_len nls_charset_id nls_charset_name nls_initcap nls_lower " +
 
170
        "nls_sort nls_upper nlssort no_data_found notfound null nvl " +
 
171
        "others " +
 
172
        "power " +
 
173
        "rawtohex reftohex round rowcount rowidtochar rpad rtrim " +
 
174
        "sign sin sinh soundex sqlcode sqlerrm sqrt stddev substr substrb sum sysdate " +
 
175
        "tan tanh to_char to_date to_label to_multi_byte to_number to_single_byte translate true trunc " +
 
176
        "uid upper user userenv " +
 
177
        "variance vsize";
 
178
 
 
179
  var cTypes = "bfile blob " +
 
180
        "character clob " +
 
181
        "dec " +
 
182
        "float " +
 
183
        "int integer " +
 
184
        "mlslabel " +
 
185
        "natural naturaln nchar nclob number numeric nvarchar2 " +
 
186
        "real rowtype " +
 
187
        "signtype smallint string " +
 
188
        "varchar varchar2";
 
189
 
 
190
  var cSqlplus = "appinfo arraysize autocommit autoprint autorecovery autotrace " +
 
191
        "blockterminator break btitle " +
 
192
        "cmdsep colsep compatibility compute concat copycommit copytypecheck " +
 
193
        "define describe " +
 
194
        "echo editfile embedded escape exec execute " +
 
195
        "feedback flagger flush " +
 
196
        "heading headsep " +
 
197
        "instance " +
 
198
        "linesize lno loboffset logsource long longchunksize " +
 
199
        "markup " +
 
200
        "native newpage numformat numwidth " +
 
201
        "pagesize pause pno " +
 
202
        "recsep recsepchar release repfooter repheader " +
 
203
        "serveroutput shiftinout show showmode size spool sqlblanklines sqlcase sqlcode sqlcontinue sqlnumber " +
 
204
        "sqlpluscompatibility sqlprefix sqlprompt sqlterminator suffix " +
 
205
        "tab term termout time timing trimout trimspool ttitle " +
 
206
        "underline " +
 
207
        "verify version " +
 
208
        "wrap";
 
209
 
 
210
  CodeMirror.defineMIME("text/x-plsql", {
 
211
    name: "plsql",
 
212
    keywords: keywords(cKeywords),
 
213
    functions: keywords(cFunctions),
 
214
    types: keywords(cTypes),
 
215
    sqlplus: keywords(cSqlplus)
 
216
  });
 
217
}());