Browse Source

[spark] Add support for R snippet

Enrico Berti 10 years ago
parent
commit
bf753b7

+ 2 - 10
apps/spark/src/spark/static/spark/js/spark.ko.js

@@ -105,20 +105,13 @@ var Result = function (snippet, result) {
   };
   };
 }
 }
 
 
-var TYPE_EDITOR_MAP = {
-  'hive': 'text/x-hiveql',
-  'impala': 'text/x-impalaql',
-  'python': 'text/x-python',
-  'scala': 'text/x-scala',
-  'pig': 'text/x-pig'
-}
-
 var TYPE_ACE_EDITOR_MAP = {
 var TYPE_ACE_EDITOR_MAP = {
   'hive': 'ace/mode/hive',
   'hive': 'ace/mode/hive',
   'impala': 'ace/mode/impala',
   'impala': 'ace/mode/impala',
   'python': 'ace/mode/python',
   'python': 'ace/mode/python',
   'scala': 'ace/mode/scala',
   'scala': 'ace/mode/scala',
-  'pig': 'ace/mode/pig'
+  'pig': 'ace/mode/pig',
+  'r': 'ace/mode/r',
 };
 };
 
 
 var getDefaultSnippetProperties = function (snippetType) {
 var getDefaultSnippetProperties = function (snippetType) {
@@ -160,7 +153,6 @@ var Snippet = function (vm, notebook, snippet) {
   self.id = ko.observable(typeof snippet.id != "undefined" && snippet.id != null ? snippet.id : UUID());
   self.id = ko.observable(typeof snippet.id != "undefined" && snippet.id != null ? snippet.id : UUID());
   self.name = ko.observable(typeof snippet.name != "undefined" && snippet.name != null ? snippet.name : '');
   self.name = ko.observable(typeof snippet.name != "undefined" && snippet.name != null ? snippet.name : '');
   self.type = ko.observable(typeof snippet.type != "undefined" && snippet.type != null ? snippet.type : "hive");
   self.type = ko.observable(typeof snippet.type != "undefined" && snippet.type != null ? snippet.type : "hive");
-  self.editorMode = ko.observable(TYPE_EDITOR_MAP[self.type()]);
 
 
   //Ace stuff
   //Ace stuff
   self.aceEditorMode = ko.observable(TYPE_ACE_EDITOR_MAP[self.type()]);
   self.aceEditorMode = ko.observable(TYPE_ACE_EDITOR_MAP[self.type()]);

+ 4 - 0
apps/spark/src/spark/templates/editor_components.mako

@@ -290,6 +290,10 @@ from django.utils.translation import ugettext as _
   <i class="fa fa-file-code-o snippet-icon"></i><sup style="color: #338bb8; margin-left: -2px">python</sup>
   <i class="fa fa-file-code-o snippet-icon"></i><sup style="color: #338bb8; margin-left: -2px">python</sup>
   <!-- /ko -->
   <!-- /ko -->
 
 
+  <!-- ko if: type() == 'r' -->
+  <img src="${ static('spark/art/icon_spark_48.png') }" class="snippet-icon"><sup style="color: #338bb8; margin-left: -2px">R</sup>
+  <!-- /ko -->
+
   <!-- ko if: type() == 'impala' -->
   <!-- ko if: type() == 'impala' -->
   <img src="${ static('impala/art/icon_impala_48.png') }" class="snippet-icon"><sup style="color: #338bb8; margin-left: -2px">impala</sup>
   <img src="${ static('impala/art/icon_impala_48.png') }" class="snippet-icon"><sup style="color: #338bb8; margin-left: -2px">impala</sup>
   <!-- /ko -->
   <!-- /ko -->

+ 2 - 1
apps/spark/src/spark/views.py

@@ -59,7 +59,8 @@ def notebook(request):
               'python': _('# Example: 1 + 1, or press CTRL + space'),
               'python': _('# Example: 1 + 1, or press CTRL + space'),
               'impala': _('-- Example: SELECT * FROM tablename, or press CTRL + space'),
               'impala': _('-- Example: SELECT * FROM tablename, or press CTRL + space'),
               'hive': _('-- Example: SELECT * FROM tablename, or press CTRL + space'),
               'hive': _('-- Example: SELECT * FROM tablename, or press CTRL + space'),
-              'text': _('<h2>This is a text snippet</h2>Type your text here')
+              'text': _('<h2>This is a text snippet</h2>Type your text here'),
+              'r': _('# Example: 1 + 1, or press CTRL + space')
           },
           },
           'session_properties': SparkApi.PROPERTIES
           'session_properties': SparkApi.PROPERTIES
       }),
       }),

File diff suppressed because it is too large
+ 0 - 0
desktop/core/src/desktop/static/desktop/js/ace/mode-r.js


+ 111 - 18
tools/ace-editor/lib/ace/mode/r_highlight_rules.js

@@ -46,15 +46,117 @@ define(function(require, exports, module)
    var RHighlightRules = function()
    var RHighlightRules = function()
    {
    {
 
 
-      var keywords = lang.arrayToMap(
-            ("function|if|in|break|next|repeat|else|for|return|switch|while|try|tryCatch|stop|warning|require|library|attach|detach|source|setMethod|setGeneric|setGroupGeneric|setClass")
-                  .split("|")
-            );
+      var keywords = ( // from R's ls('package:base')
+          "function|if|in|break|next|repeat|else|for|return|switch|while|try|tryCatch|stop|" +
+          "warning|require|library|attach|detach|source|setMethod|setGeneric|setGroupGeneric|setClass|" +
+          "Arg|Cstack_info|Encoding<-|Filter|I|ISOdatetime|LETTERS|La_version|Math.Date|" +
+          "Math.data.frame|Math.factor|NCOL|Negate|OlsonNames|Ops.POSIXt|Ops.difftime|" +
+          "Ops.numeric_version|Position|R.home|R.version.string|RNGversion|Re|Reduce|Summary.POSIXct|" +
+          "Summary.data.frame|Summary.factor|Summary.ordered|Sys.chmod|Sys.getlocale|Sys.glob|" +
+          "Sys.localeconv|Sys.setFileTime|Sys.setlocale|Sys.time|Sys.umask|Sys.which|UseMethod|" +
+          "[.Date|[.POSIXct|[.data.frame|[.factor|[.listof|[.numeric_version|[.simple.list|[<-|" +
+          "[<-.POSIXct|[<-.data.frame|[<-.numeric_version|[[.Date|[[.data.frame|[[.numeric_version|" +
+          "[[<-.data.frame|[[<-.numeric_version|abbreviate|acos|addNA|agrep|alist|all.equal|" +
+          "all.equal.character|all.equal.envRefClass|all.equal.factor|all.equal.language|" +
+          "all.equal.numeric|all.names|any|anyDuplicated.array|anyDuplicated.default|anyNA|" +
+          "anyNA.numeric_version|aperm.default|append|args|arrayInd|as.Date.POSIXct|" +
+          "as.Date.character|as.Date.dates|as.Date.factor|as.POSIXct|as.POSIXct.POSIXlt|" +
+          "as.POSIXct.dates|as.POSIXct.numeric|as.POSIXlt.Date|as.POSIXlt.character|" +
+          "as.POSIXlt.dates|as.POSIXlt.factor|as.array|as.call|as.character.Date|" +
+          "as.character.condition|as.character.error|as.character.hexmode|as.character.octmode|" +
+          "as.complex|as.data.frame.AsIs|as.data.frame.POSIXct|as.data.frame.array|" +
+          "as.data.frame.complex|as.data.frame.default|as.data.frame.factor|as.data.frame.list|" +
+          "as.data.frame.matrix|as.data.frame.noquote|as.data.frame.numeric_version|" +
+          "as.data.frame.raw|as.data.frame.ts|as.difftime|as.double.POSIXlt|as.environment|" +
+          "as.expression.default|as.function|as.hexmode|as.list|as.list.POSIXct|" +
+          "as.list.default|as.list.factor|as.list.numeric_version|as.logical.factor|" +
+          "as.matrix.POSIXlt|as.matrix.default|as.name|as.null.default|as.numeric_version|" +
+          "as.ordered|as.pairlist|as.raw|as.single.default|as.table|as.vector|asNamespace|" +
+          "asS4|asinh|atan|atanh|attachNamespace|attr.all.equal|attributes|autoload|backsolve|" +
+          "basename|besselJ|besselY|bindingIsActive|bindtextdomain|bitwNot|bitwShiftL|bitwXor|" +
+          "body<-|break|browserCondition|browserText|by|by.default|c|c.POSIXct|c.noquote|" +
+          "c.warnings|callCC|casefold|cbind|ceiling|charToRaw|charmatch|check_tzones|chol.default|" +
+          "choose|class<-|close|close.srcfile|closeAllConnections|colMeans|colnames|commandArgs|" +
+          "comment<-|computeRestarts|conditionCall.condition|conditionMessage.condition|" +
+          "contributors|cosh|crossprod|cummin|cumsum|cut|cut.POSIXt|dQuote|data.frame|date|" +
+          "debuggingState|default.stringsAsFactors|deparse|detach|determinant.matrix|diag|" +
+          "diff|diff.POSIXt|difftime|dim|dim<-|dimnames.data.frame|dimnames<-.data.frame|" +
+          "dir.create|dirname|dontCheck|dput|droplevels|droplevels.factor|duplicated|" +
+          "duplicated.array|duplicated.default|duplicated.numeric_version|dyn.unload|eapply|" +
+          "emptyenv|enc2utf8|enquote|environment|environmentIsLocked|eval|evalq|exp|expm1|" +
+          "extSoftVersion|factorial|file|file.append|file.copy|file.exists|file.link|file.mtime|" +
+          "file.remove|file.show|file.symlink|findInterval|findRestart|flush|for|forceAndCall|" +
+          "formals<-|format.AsIs|format.POSIXct|format.data.frame|format.difftime|format.hexmode|" +
+          "format.libraryIQR|format.octmode|format.pval|formatC|forwardsolve|gamma|gc.time|" +
+          "gctorture|get|getAllConnections|getCallingDLLe|getDLLRegisteredRoutines|" +
+          "getDLLRegisteredRoutines.character|getExportedValue|getLoadedDLLs|getNamespaceExports|" +
+          "getNamespaceInfo|getNamespaceUsers|getNativeSymbolInfo|getRversion|getTaskCallbackNames|" +
+          "gettext|getwd|globalenv|grep|grepl|gzcon|iconv|icuGetCollate|identical|if|importIntoEnv|" +
+          "intToBits|integer|interactive|inverse.rle|invokeRestart|is.R|is.atomic|is.character|" +
+          "is.data.frame|is.element|is.expression|is.finite|is.infinite|is.language|is.loaded|" +
+          "is.matrix|is.na.POSIXlt|is.na.numeric_version|is.na<-.default|is.na<-.numeric_version|" +
+          "is.nan|is.numeric|is.numeric.POSIXt|is.numeric_version|is.ordered|is.pairlist|is.qr|" +
+          "is.recursive|is.symbol|is.unsorted|isBaseNamespace|isNamespace|isOpen|isS4|isSymmetric|" +
+          "isTRUE|isdebugged|julian|julian.POSIXt|kappa.default|kappa.qr|l10n_info|labels.default|" +
+          "last.warning|lazyLoadDBexec|lbeta|length|length<-|lengths|levels|levels<-|lfactorial|" +
+          "libcurlVersion|library.dynam|licence|list|list.files|load|loadedNamespaces|local|" +
+          "lockEnvironment|log10|log2|logical|ls|make.unique|mapply|mat.or.vec|match.arg|" +
+          "match.fun|max|mean|mean.POSIXct|mean.default|mem.limits|memDecompress|merge|" +
+          "merge.default|mget|missing|mode<-|month.name|months.Date|mostattributes<-|names.POSIXlt|" +
+          "names<-.POSIXlt|namespaceImport|namespaceImportFrom|nargs|ncol|next|nlevels|norm|nrow|" +
+          "numeric_version|objects|oldClass<-|open|open.srcfile|open.srcfilecopy|order|outer|" +
+          "packageEvent|packageStartupMessage|pairlist|parent.env<-|parse|paste|path.expand|" +
+          "pcre_config|pipe|pmax|pmin|polyroot|pretty|prettyNum|print.AsIs|print.DLLInfoList|" +
+          "print.Date|print.NativeRoutineList|print.POSIXlt|print.condition|print.data.frame|" +
+          "print.difftime|print.function|print.libraryIQR|print.noquote|print.octmode|" +
+          "print.proc_time|print.rle|print.srcfile|print.summary.table|print.table|prmatrix|" +
+          "prod|provideDimnames|pushBack|q|qr.Q|qr.X|qr.default|qr.qty|qr.resid|quarters|" +
+          "quarters.POSIXt|quote|range.default|rapply|rawConnection|rawShift|rawToChar|" +
+          "rbind.data.frame|read.dcf|readChar|readRDS|readline|regexec|registerS3method|regmatches|" +
+          "remove|rep|rep.POSIXct|rep.factor|rep.numeric_version|repeat|replicate|requireNamespace|" +
+          "restartFormals|return|rev|rle|round|round.POSIXt|row.names|row.names.default|" +
+          "row.names<-.data.frame|rowMeans|rownames|rowsum|rowsum.default|sample|sapply|save.image|" +
+          "scale|scan|searchpaths|seek.connection|seq.Date|seq.default|seq_along|sequence|set.seed|" +
+          "setNamespaceInfo|setTimeLimit|setequal|shQuote|sign|signif|simpleError|simpleWarning|sin|" +
+          "sinh|sink.number|slice.index|socketSelect|solve.default|sort|sort.default|sort.list|split|" +
+          "split.POSIXct|split.default|split<-.data.frame|sprintf|srcfile|srcfilecopy|standardGeneric|" +
+          "stdin|stop|storage.mode|strftime|strsplit|strtrim|strwrap|subset|subset.default|substitute|" +
+          "substr<-|substring<-|summary|summary.POSIXct|summary.connection|summary.default|" +
+          "summary.matrix|summary.srcfile|summary.table|suppressPackageStartupMessages|svd|" +
+          "switch|sys.calls|sys.frames|sys.load.image|sys.on.exit|sys.parents|sys.source|system|" +
+          "system.time|t|t.default|tabulate|tanh|tapply|tcrossprod|tempfile|textConnection|toString|" +
+          "tolower|toupper|traceback|tracingState|transform.data.frame|trigamma|trunc|trunc.POSIXt|" +
+          "truncate.connection|tryCatch|unclass|union|unique.POSIXlt|unique.data.frame|unique.matrix|" +
+          "unique.warnings|units.difftime|units<-.difftime|unlink|unloadNamespace|unname|unsplit|" +
+          "untracemem|upper.tri|utf8ToInt|vector|warning|weekdays|weekdays.POSIXt|which.max|while|" +
+          "with.default|withRestarts|within|within.list|write.dcf|writeChar|xor|xor.octmode|xtfrm|" +
+          "xtfrm.Date|xtfrm.POSIXlt|xtfrm.default|xtfrm.factor|xzfile|.hexmode"
+        );
 
 
-      var buildinConstants = lang.arrayToMap(
-            ("NULL|NA|TRUE|FALSE|T|F|Inf|NaN|NA_integer_|NA_real_|NA_character_|" +
-             "NA_complex_").split("|")
-            );
+      var builtinFunctions = ( // from http://www.sr.bham.ac.uk/~ajrs/R/r-function_list.html
+        "builtins|options|?NA|abs|append|c|cat|cbind|diff|gl|grep|identical|jitter|julian|length|ls|" +
+          "mat.or.vec|paste|range|rep|rev|seq|sequence|sign|sort|order|tolower|toupper|unique|system|" +
+            "vector|formatC|floor|ceiling|round|signif|trunc|Sys.getenv|Sys.putenv|Sys.time|Sys.Date|" +
+            "getwd|setwd|?files|list.files|file.info|log|logb|log10|log2|exp|expm1|log1p|sqrt|cos|sin|" +
+            "tan|acos|asin|atan|atan2|cosh|sinh|tanh|acosh|asinh|atanh|union|intersect|setdiff|setequal|" +
+            "eigen|deriv|integrate|sqrt|sum|?Control|?Extract|?Logic|?Mod|?Paren|?regex|?Syntax|?Special|" +
+            "help|plot|par|curve|points|arrows|abline|lines|segments|hist|pairs|matplot|?device|postscript|" +
+            "pdf|png|jpeg|X11|persp|contour|image|lm|glm|nls|lqs|optim|optimize|constrOptim|nlm|nlminb|" +
+            "?Chisquare|?Poisson|cor.test|cumsum|cumprod|cummin|cummax|density|ks.test|loess|lowess|mad|" +
+            "meanx|weighted.meanx|medianx|minx|maxx|quantile|rnorm|runif|splinefun|smooth.spline|sd|" +
+            "summary|t.test|var|sample|ecdf|qqplot"
+        );
+
+      var builtinConstants = (
+        "NULL|NA|TRUE|FALSE|T|F|Inf|NaN|NA_integer_|NA_real_|NA_character_|" +
+          "NA_complex_|pi|letters|LETTERS|month.abb,month.name"
+        );
+
+      var keywordMapper = this.$keywords = this.createKeywordMapper({
+        "support.function": builtinFunctions,
+        "keyword": keywords,
+        "constant.language": builtinConstants
+      }, "identifier");
 
 
       // regexp must not have capturing parentheses. Use (?:) instead.
       // regexp must not have capturing parentheses. Use (?:) instead.
       // regexps are ordered -> the first match is used
       // regexps are ordered -> the first match is used
@@ -111,16 +213,7 @@ define(function(require, exports, module)
                regex : "`.*?`"
                regex : "`.*?`"
             },
             },
             {
             {
-               onMatch : function(value) {
-                  if (keywords[value])
-                     return "keyword";
-                  else if (buildinConstants[value])
-                     return "constant.language";
-                  else if (value == '...' || value.match(/^\.\.\d+$/))
-                     return "variable.language";
-                  else
-                     return "identifier";
-               },
+               token : keywordMapper,
                regex : "[a-zA-Z.][a-zA-Z0-9._]*\\b"
                regex : "[a-zA-Z.][a-zA-Z0-9._]*\\b"
             },
             },
             {
             {

Some files were not shown because too many files changed in this diff