diff --git a/demo/kitchen-sink/doclist.js b/demo/kitchen-sink/doclist.js index 3543cb7a..db1383fe 100644 --- a/demo/kitchen-sink/doclist.js +++ b/demo/kitchen-sink/doclist.js @@ -74,6 +74,7 @@ var docs = { "docs/css.css": "CSS", "docs/dart.dart": "Dart", "docs/diff.diff": "Diff", + "docs/dot.dot": "Dot", "docs/glsl.glsl": "Glsl", "docs/golang.go": "Go", "docs/groovy.groovy": "Groovy", diff --git a/demo/kitchen-sink/docs/dot.dot b/demo/kitchen-sink/docs/dot.dot new file mode 100644 index 00000000..1e13be7e --- /dev/null +++ b/demo/kitchen-sink/docs/dot.dot @@ -0,0 +1,110 @@ +// Original source: http://www.graphviz.org/content/lion_share +##"A few people in the field of genetics are using dot to draw "marriage node diagram" pedigree drawings. Here is one I have done of a test pedigree from the FTREE pedigree drawing package (Lion Share was a racehorse)." Contributed by David Duffy. + +##Command to get the layout: "dot -Tpng thisfile > thisfile.png" + +digraph Ped_Lion_Share { +# page = "8.2677165,11.692913" ; +ratio = "auto" ; +mincross = 2.0 ; +label = "Pedigree Lion_Share" ; + +"001" [shape=box , regular=1,style=filled,fillcolor=white ] ; +"002" [shape=box , regular=1,style=filled,fillcolor=white ] ; +"003" [shape=circle , regular=1,style=filled,fillcolor=white ] ; +"004" [shape=box , regular=1,style=filled,fillcolor=white ] ; +"005" [shape=box , regular=1,style=filled,fillcolor=white ] ; +"006" [shape=circle , regular=1,style=filled,fillcolor=white ] ; +"007" [shape=circle , regular=1,style=filled,fillcolor=white ] ; +"009" [shape=circle , regular=1,style=filled,fillcolor=white ] ; +"014" [shape=circle , regular=1,style=filled,fillcolor=white ] ; +"015" [shape=circle , regular=1,style=filled,fillcolor=white ] ; +"016" [shape=circle , regular=1,style=filled,fillcolor=white ] ; +"ZZ01" [shape=circle , regular=1,style=filled,fillcolor=white ] ; +"ZZ02" [shape=circle , regular=1,style=filled,fillcolor=white ] ; +"017" [shape=circle , regular=1,style=filled,fillcolor=white ] ; +"012" [shape=circle , regular=1,style=filled,fillcolor=white ] ; +"008" [shape=box , regular=1,style=filled,fillcolor=white ] ; +"011" [shape=box , regular=1,style=filled,fillcolor=white ] ; +"013" [shape=box , regular=1,style=filled,fillcolor=white ] ; +"010" [shape=box , regular=1,style=filled,fillcolor=white ] ; +"023" [shape=circle , regular=1,style=filled,fillcolor=white ] ; +"020" [shape=circle , regular=1,style=filled,fillcolor=white ] ; +"021" [shape=circle , regular=1,style=filled,fillcolor=white ] ; +"018" [shape=circle , regular=1,style=filled,fillcolor=white ] ; +"025" [shape=circle , regular=1,style=filled,fillcolor=white ] ; +"019" [shape=box , regular=1,style=filled,fillcolor=white ] ; +"022" [shape=box , regular=1,style=filled,fillcolor=white ] ; +"024" [shape=box , regular=1,style=filled,fillcolor=white ] ; +"027" [shape=circle , regular=1,style=filled,fillcolor=white ] ; +"026" [shape=box , regular=1,style=filled,fillcolor=white ] ; +"028" [shape=box , regular=1,style=filled,fillcolor=grey ] ; +"marr0001" [shape=diamond,style=filled,label="",height=.1,width=.1] ; +"001" -> "marr0001" [dir=none,weight=1] ; +"007" -> "marr0001" [dir=none,weight=1] ; +"marr0001" -> "017" [dir=none, weight=2] ; +"marr0002" [shape=diamond,style=filled,label="",height=.1,width=.1] ; +"001" -> "marr0002" [dir=none,weight=1] ; +"ZZ02" -> "marr0002" [dir=none,weight=1] ; +"marr0002" -> "012" [dir=none, weight=2] ; +"marr0003" [shape=diamond,style=filled,label="",height=.1,width=.1] ; +"002" -> "marr0003" [dir=none,weight=1] ; +"003" -> "marr0003" [dir=none,weight=1] ; +"marr0003" -> "008" [dir=none, weight=2] ; +"marr0004" [shape=diamond,style=filled,label="",height=.1,width=.1] ; +"002" -> "marr0004" [dir=none,weight=1] ; +"006" -> "marr0004" [dir=none,weight=1] ; +"marr0004" -> "011" [dir=none, weight=2] ; +"marr0005" [shape=diamond,style=filled,label="",height=.1,width=.1] ; +"002" -> "marr0005" [dir=none,weight=1] ; +"ZZ01" -> "marr0005" [dir=none,weight=1] ; +"marr0005" -> "013" [dir=none, weight=2] ; +"marr0006" [shape=diamond,style=filled,label="",height=.1,width=.1] ; +"004" -> "marr0006" [dir=none,weight=1] ; +"009" -> "marr0006" [dir=none,weight=1] ; +"marr0006" -> "010" [dir=none, weight=2] ; +"marr0007" [shape=diamond,style=filled,label="",height=.1,width=.1] ; +"005" -> "marr0007" [dir=none,weight=1] ; +"015" -> "marr0007" [dir=none,weight=1] ; +"marr0007" -> "023" [dir=none, weight=2] ; +"marr0008" [shape=diamond,style=filled,label="",height=.1,width=.1] ; +"005" -> "marr0008" [dir=none,weight=1] ; +"016" -> "marr0008" [dir=none,weight=1] ; +"marr0008" -> "020" [dir=none, weight=2] ; +"marr0009" [shape=diamond,style=filled,label="",height=.1,width=.1] ; +"005" -> "marr0009" [dir=none,weight=1] ; +"012" -> "marr0009" [dir=none,weight=1] ; +"marr0009" -> "021" [dir=none, weight=2] ; +"marr0010" [shape=diamond,style=filled,label="",height=.1,width=.1] ; +"008" -> "marr0010" [dir=none,weight=1] ; +"017" -> "marr0010" [dir=none,weight=1] ; +"marr0010" -> "018" [dir=none, weight=2] ; +"marr0011" [shape=diamond,style=filled,label="",height=.1,width=.1] ; +"011" -> "marr0011" [dir=none,weight=1] ; +"023" -> "marr0011" [dir=none,weight=1] ; +"marr0011" -> "025" [dir=none, weight=2] ; +"marr0012" [shape=diamond,style=filled,label="",height=.1,width=.1] ; +"013" -> "marr0012" [dir=none,weight=1] ; +"014" -> "marr0012" [dir=none,weight=1] ; +"marr0012" -> "019" [dir=none, weight=2] ; +"marr0013" [shape=diamond,style=filled,label="",height=.1,width=.1] ; +"010" -> "marr0013" [dir=none,weight=1] ; +"021" -> "marr0013" [dir=none,weight=1] ; +"marr0013" -> "022" [dir=none, weight=2] ; +"marr0014" [shape=diamond,style=filled,label="",height=.1,width=.1] ; +"019" -> "marr0014" [dir=none,weight=1] ; +"020" -> "marr0014" [dir=none,weight=1] ; +"marr0014" -> "024" [dir=none, weight=2] ; +"marr0015" [shape=diamond,style=filled,label="",height=.1,width=.1] ; +"022" -> "marr0015" [dir=none,weight=1] ; +"025" -> "marr0015" [dir=none,weight=1] ; +"marr0015" -> "027" [dir=none, weight=2] ; +"marr0016" [shape=diamond,style=filled,label="",height=.1,width=.1] ; +"024" -> "marr0016" [dir=none,weight=1] ; +"018" -> "marr0016" [dir=none,weight=1] ; +"marr0016" -> "026" [dir=none, weight=2] ; +"marr0017" [shape=diamond,style=filled,label="",height=.1,width=.1] ; +"026" -> "marr0017" [dir=none,weight=1] ; +"027" -> "marr0017" [dir=none,weight=1] ; +"marr0017" -> "028" [dir=none, weight=2] ; +} diff --git a/demo/kitchen-sink/modelist.js b/demo/kitchen-sink/modelist.js index a9d2e32c..6c87f851 100644 --- a/demo/kitchen-sink/modelist.js +++ b/demo/kitchen-sink/modelist.js @@ -44,6 +44,7 @@ var modesByName = { css: ["CSS" , "css"], dart: ["Dart" , "dart"], diff: ["Diff" , "diff|patch"], + dot: ["Dot" , "dot"], glsl: ["Glsl" , "glsl|frag|vert"], golang: ["Go" , "go"], groovy: ["Groovy" , "groovy"], diff --git a/lib/ace/mode/dot.js b/lib/ace/mode/dot.js new file mode 100644 index 00000000..878ce56a --- /dev/null +++ b/lib/ace/mode/dot.js @@ -0,0 +1,81 @@ +define(function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var DotHighlightRules = require("./dot_highlight_rules").DotHighlightRules; +var DotFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + var highlighter = new DotHighlightRules(); + this.$outdent = new MatchingBraceOutdent(); + this.foldingRules = new DotFoldMode(); + this.$tokenizer = new Tokenizer(highlighter.getRules()); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.toggleCommentLines = function(state, doc, startRow, endRow) { + var outdent = true; + var re = /^(\s*)\/\//; + + for (var i=startRow; i<= endRow; i++) { + if (!re.test(doc.getLine(i))) { + outdent = false; + break; + } + } + + if (outdent) { + var deleteRange = new Range(0, 0, 0, 0); + for (var i=startRow; i<= endRow; i++) + { + var line = doc.getLine(i); + var m = line.match(re); + deleteRange.start.row = i; + deleteRange.end.row = i; + deleteRange.end.column = m[0].length; + doc.replace(deleteRange, m[1]); + } + } + else { + doc.indentRows(startRow, endRow, "//"); + } + }; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.$tokenizer.getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + var endState = tokenizedLine.state; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start") { + var match = line.match(/^.*(?:\bcase\b.*\:|[\{\(\[])\s*$/); + if (match) { + indent += tab; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/lib/ace/mode/dot_highlight_rules.js b/lib/ace/mode/dot_highlight_rules.js new file mode 100644 index 00000000..a4fe3b0b --- /dev/null +++ b/lib/ace/mode/dot_highlight_rules.js @@ -0,0 +1,126 @@ +define(function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; + +var DotHighlightRules = function() { + + var keywords = lang.arrayToMap( + ("strict|node|edge|graph|digraph|subgraph").split("|") + ); + + var attributes = lang.arrayToMap( + ("damping|k|url|area|arrowhead|arrowsize|arrowtail|aspect|bb|bgcolor|center|charset|clusterrank|color|colorscheme|comment|compound|concentrate|constraint|decorate|defaultdist|dim|dimen|dir|diredgeconstraints|distortion|dpi|edgeurl|edgehref|edgetarget|edgetooltip|epsilon|esep|fillcolor|fixedsize|fontcolor|fontname|fontnames|fontpath|fontsize|forcelabels|gradientangle|group|headurl|head_lp|headclip|headhref|headlabel|headport|headtarget|headtooltip|height|href|id|image|imagepath|imagescale|label|labelurl|label_scheme|labelangle|labeldistance|labelfloat|labelfontcolor|labelfontname|labelfontsize|labelhref|labeljust|labelloc|labeltarget|labeltooltip|landscape|layer|layerlistsep|layers|layerselect|layersep|layout|len|levels|levelsgap|lhead|lheight|lp|ltail|lwidth|margin|maxiter|mclimit|mindist|minlen|mode|model|mosek|nodesep|nojustify|normalize|nslimit|nslimit1|ordering|orientation|outputorder|overlap|overlap_scaling|pack|packmode|pad|page|pagedir|pencolor|penwidth|peripheries|pin|pos|quadtree|quantum|rank|rankdir|ranksep|ratio|rects|regular|remincross|repulsiveforce|resolution|root|rotate|rotation|samehead|sametail|samplepoints|scale|searchsize|sep|shape|shapefile|showboxes|sides|size|skew|smoothing|sortv|splines|start|style|stylesheet|tailurl|tail_lp|tailclip|tailhref|taillabel|tailport|tailtarget|tailtooltip|target|tooltip|truecolor|vertices|viewport|voro_margin|weight|width|xlabel|xlp|z").split("|") + ); + + this.$rules = { + "start" : [ + { + token : "comment", + regex : /\/\/.*$/ + }, { + token : "comment", + regex : /#.*$/ + }, { + token : "comment", // multi line comment + merge : true, + regex : /\/\*/, + next : "comment" + }, { + token : "string", + regex : "'(?=.)", + next : "qstring" + }, { + token : "string", + regex : '"(?=.)', + next : "qqstring" + }, { + token : "constant.numeric", + regex : /[+\-]?\d+(?:(?:\.\d*)?(?:[eE][+\-]?\d+)?)?\b/ + }, { + token : "keyword.operator", + regex : /\+|=|\->/ + }, { + token : "punctuation.operator", + regex : /,|;/ + }, { + token : "paren.lparen", + regex : /[\[{]/ + }, { + token : "paren.rparen", + regex : /[\]}]/ + }, { + token: "comment", + regex: /^#!.*$/ + }, { + token: function(value) { + if (keywords.hasOwnProperty(value.toLowerCase())) { + return "keyword"; + } + else if (attributes.hasOwnProperty(value.toLowerCase())) { + return "variable"; + } + else { + return "text"; + } + }, + regex: "\\-?[a-zA-Z_][a-zA-Z0-9_\\-]*" + } + ], + "comment" : [ + { + token : "comment", // closing comment + regex : ".*?\\*\\/", + merge : true, + next : "start" + }, { + token : "comment", // comment spanning whole line + merge : true, + regex : ".+" + } + ], + "qqstring" : [ + { + token : "string", + regex : '[^"\\\\]+', + merge : true + }, { + token : "string", + regex : "\\\\$", + next : "qqstring", + merge : true + }, { + token : "string", + regex : '"|$', + next : "start", + merge : true + } + ], + "qstring" : [ + { + token : "string", + regex : "[^'\\\\]+", + merge : true + }, { + token : "string", + regex : "\\\\$", + next : "qstring", + merge : true + }, { + token : "string", + regex : "'|$", + next : "start", + merge : true + } + ] + }; +}; + +oop.inherits(DotHighlightRules, TextHighlightRules); + +exports.DotHighlightRules = DotHighlightRules; + +});