| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,145 @@ | ||
| <!doctype html> | ||
| <html> | ||
| <head> | ||
| <meta charset="utf-8"> | ||
| <title>CodeMirror: SCSS mode</title> | ||
| <link rel="stylesheet" href="../../lib/codemirror.css"> | ||
| <script src="../../lib/codemirror.js"></script> | ||
| <script src="css.js"></script> | ||
| <style>.CodeMirror {background: #f8f8f8;}</style> | ||
| <link rel="stylesheet" href="../../doc/docs.css"> | ||
| </head> | ||
| <body> | ||
| <h1>CodeMirror: SCSS mode</h1> | ||
| <form><textarea id="code" name="code"> | ||
| /* Some example SCSS */ | ||
|
|
||
| @import "compass/css3"; | ||
| $variable: #333; | ||
|
|
||
| $blue: #3bbfce; | ||
| $margin: 16px; | ||
|
|
||
| .content-navigation { | ||
| #nested { | ||
| background-color: black; | ||
| } | ||
| border-color: $blue; | ||
| color: | ||
| darken($blue, 9%); | ||
| } | ||
|
|
||
| .border { | ||
| padding: $margin / 2; | ||
| margin: $margin / 2; | ||
| border-color: $blue; | ||
| } | ||
|
|
||
| @mixin table-base { | ||
| th { | ||
| text-align: center; | ||
| font-weight: bold; | ||
| } | ||
| td, th {padding: 2px} | ||
| } | ||
|
|
||
| table.hl { | ||
| margin: 2em 0; | ||
| td.ln { | ||
| text-align: right; | ||
| } | ||
| } | ||
|
|
||
| li { | ||
| font: { | ||
| family: serif; | ||
| weight: bold; | ||
| size: 1.2em; | ||
| } | ||
| } | ||
|
|
||
| @mixin left($dist) { | ||
| float: left; | ||
| margin-left: $dist; | ||
| } | ||
|
|
||
| #data { | ||
| @include left(10px); | ||
| @include table-base; | ||
| } | ||
|
|
||
| .source { | ||
| @include flow-into(target); | ||
| border: 10px solid green; | ||
| margin: 20px; | ||
| width: 200px; } | ||
|
|
||
| .new-container { | ||
| @include flow-from(target); | ||
| border: 10px solid red; | ||
| margin: 20px; | ||
| width: 200px; } | ||
|
|
||
| body { | ||
| margin: 0; | ||
| padding: 3em 6em; | ||
| font-family: tahoma, arial, sans-serif; | ||
| color: #000; | ||
| } | ||
|
|
||
| @mixin yellow() { | ||
| background: yellow; | ||
| } | ||
|
|
||
| .big { | ||
| font-size: 14px; | ||
| } | ||
|
|
||
| .nested { | ||
| @include border-radius(3px); | ||
| @extend .big; | ||
| p { | ||
| background: whitesmoke; | ||
| a { | ||
| color: red; | ||
| } | ||
| } | ||
| } | ||
|
|
||
| #navigation a { | ||
| font-weight: bold; | ||
| text-decoration: none !important; | ||
| } | ||
|
|
||
| h1 { | ||
| font-size: 2.5em; | ||
| } | ||
|
|
||
| h2 { | ||
| font-size: 1.7em; | ||
| } | ||
|
|
||
| h1:before, h2:before { | ||
| content: "::"; | ||
| } | ||
|
|
||
| code { | ||
| font-family: courier, monospace; | ||
| font-size: 80%; | ||
| color: #418A8A; | ||
| } | ||
| </textarea></form> | ||
| <script> | ||
| var editor = CodeMirror.fromTextArea(document.getElementById("code"), { | ||
| lineNumbers: true, | ||
| matchBrackets: true, | ||
| mode: "text/x-scss" | ||
| }); | ||
| </script> | ||
|
|
||
| <p><strong>MIME types defined:</strong> <code>text/scss</code>.</p> | ||
|
|
||
| <p><strong>Parsing/Highlighting Tests:</strong> <a href="../../test/index.html#scss_*">normal</a>, <a href="../../test/index.html#verbose,scss_*">verbose</a>.</p> | ||
|
|
||
| </body> | ||
| </html> |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,80 @@ | ||
| (function() { | ||
| var mode = CodeMirror.getMode({tabSize: 4}, "text/x-scss"); | ||
| function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1), "scss"); } | ||
|
|
||
| MT('url_with_quotation', | ||
| "[tag foo] { [property background][operator :][string-2 url]([string test.jpg]) }"); | ||
|
|
||
| MT('url_with_double_quotes', | ||
| "[tag foo] { [property background][operator :][string-2 url]([string \"test.jpg\"]) }"); | ||
|
|
||
| MT('url_with_single_quotes', | ||
| "[tag foo] { [property background][operator :][string-2 url]([string \'test.jpg\']) }"); | ||
|
|
||
| MT('string', | ||
| "[def @import] [string \"compass/css3\"]"); | ||
|
|
||
| MT('important_keyword', | ||
| "[tag foo] { [property background][operator :][string-2 url]([string \'test.jpg\']) [keyword !important] }"); | ||
|
|
||
| MT('variable', | ||
| "[variable-2 $blue][operator :][atom #333]"); | ||
|
|
||
| MT('variable_as_attribute', | ||
| "[tag foo] { [property color][operator :][variable-2 $blue] }"); | ||
|
|
||
| MT('numbers', | ||
| "[tag foo] { [property padding][operator :][number 10px] [number 10] [number 10em] [number 8in] }"); | ||
|
|
||
| MT('number_percentage', | ||
| "[tag foo] { [property width][operator :][number 80%] }"); | ||
|
|
||
| MT('selector', | ||
| "[builtin #hello][qualifier .world]{}"); | ||
|
|
||
| MT('singleline_comment', | ||
| "[comment // this is a comment]"); | ||
|
|
||
| MT('multiline_comment', | ||
| "[comment /*foobar*/]"); | ||
|
|
||
| MT('attribute_with_hyphen', | ||
| "[tag foo] { [property font-size][operator :][number 10px] }"); | ||
|
|
||
| MT('string_after_attribute', | ||
| "[tag foo] { [property content][operator :][string \"::\"] }"); | ||
|
|
||
| MT('directives', | ||
| "[def @include] [qualifier .mixin]"); | ||
|
|
||
| MT('basic_structure', | ||
| "[tag p] { [property background][operator :][keyword red]; }"); | ||
|
|
||
| MT('nested_structure', | ||
| "[tag p] { [tag a] { [property color][operator :][keyword red]; } }"); | ||
|
|
||
| MT('mixin', | ||
| "[def @mixin] [tag table-base] {}"); | ||
|
|
||
| MT('number_without_semicolon', | ||
| "[tag p] {[property width][operator :][number 12]}", | ||
| "[tag a] {[property color][operator :][keyword red];}"); | ||
|
|
||
| MT('atom_in_nested_block', | ||
| "[tag p] { [tag a] { [property color][operator :][atom #000]; } }"); | ||
|
|
||
| MT('interpolation_in_property', | ||
| "[tag foo] { [operator #{][variable-2 $hello][operator }:][atom #000]; }"); | ||
|
|
||
| MT('interpolation_in_selector', | ||
| "[tag foo][operator #{][variable-2 $hello][operator }] { [property color][operator :][atom #000]; }"); | ||
|
|
||
| MT('interpolation_error', | ||
| "[tag foo][operator #{][error foo][operator }] { [property color][operator :][atom #000]; }"); | ||
|
|
||
| MT("divide_operator", | ||
| "[tag foo] { [property width][operator :][number 4] [operator /] [number 2] }"); | ||
|
|
||
| MT('nested_structure_with_id_selector', | ||
| "[tag p] { [builtin #hello] { [property color][operator :][keyword red]; } }"); | ||
| })(); |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,23 @@ | ||
| The MIT License | ||
|
|
||
| Copyright (c) 2013 Kenneth Bentley | ||
| Modified from the CoffeeScript CodeMirror mode, Copyright (c) 2011 Jeff Pickhardt | ||
| Modified from the Python CodeMirror mode, Copyright (c) 2010 Timothy Farrell | ||
|
|
||
| Permission is hereby granted, free of charge, to any person obtaining a copy | ||
| of this software and associated documentation files (the "Software"), to deal | ||
| in the Software without restriction, including without limitation the rights | ||
| to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||
| copies of the Software, and to permit persons to whom the Software is | ||
| furnished to do so, subject to the following conditions: | ||
|
|
||
| The above copyright notice and this permission notice shall be included in | ||
| all copies or substantial portions of the Software. | ||
|
|
||
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
| IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
| FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||
| AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||
| LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||
| OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||
| THE SOFTWARE. |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,267 @@ | ||
| /** | ||
| * Link to the project's GitHub page: | ||
| * https://github.com/duralog/CodeMirror | ||
| */ | ||
| (function() { | ||
| CodeMirror.defineMode('livescript', function(){ | ||
| var tokenBase, external; | ||
| tokenBase = function(stream, state){ | ||
| var next_rule, nr, i$, len$, r, m; | ||
| if (next_rule = state.next || 'start') { | ||
| state.next = state.next; | ||
| if (Array.isArray(nr = Rules[next_rule])) { | ||
| for (i$ = 0, len$ = nr.length; i$ < len$; ++i$) { | ||
| r = nr[i$]; | ||
| if (r.regex && (m = stream.match(r.regex))) { | ||
| state.next = r.next; | ||
| return r.token; | ||
| } | ||
| } | ||
| stream.next(); | ||
| return 'error'; | ||
| } | ||
| if (stream.match(r = Rules[next_rule])) { | ||
| if (r.regex && stream.match(r.regex)) { | ||
| state.next = r.next; | ||
| return r.token; | ||
| } else { | ||
| stream.next(); | ||
| return 'error'; | ||
| } | ||
| } | ||
| } | ||
| stream.next(); | ||
| return 'error'; | ||
| }; | ||
| external = { | ||
| startState: function(){ | ||
| return { | ||
| next: 'start', | ||
| lastToken: null | ||
| }; | ||
| }, | ||
| token: function(stream, state){ | ||
| var style; | ||
| style = tokenBase(stream, state); | ||
| state.lastToken = { | ||
| style: style, | ||
| indent: stream.indentation(), | ||
| content: stream.current() | ||
| }; | ||
| return style.replace(/\./g, ' '); | ||
| }, | ||
| indent: function(state){ | ||
| var indentation; | ||
| indentation = state.lastToken.indent; | ||
| if (state.lastToken.content.match(indenter)) { | ||
| indentation += 2; | ||
| } | ||
| return indentation; | ||
| } | ||
| }; | ||
| return external; | ||
| }); | ||
|
|
||
| var identifier = '(?![\\d\\s])[$\\w\\xAA-\\uFFDC](?:(?!\\s)[$\\w\\xAA-\\uFFDC]|-[A-Za-z])*'; | ||
| var indenter = RegExp('(?:[({[=:]|[-~]>|\\b(?:e(?:lse|xport)|d(?:o|efault)|t(?:ry|hen)|finally|import(?:\\s*all)?|const|var|let|new|catch(?:\\s*' + identifier + ')?))\\s*$'); | ||
| var keywordend = '(?![$\\w]|-[A-Za-z]|\\s*:(?![:=]))'; | ||
| var stringfill = { | ||
| token: 'string', | ||
| regex: '.+' | ||
| }; | ||
| var Rules = { | ||
| start: [ | ||
| { | ||
| token: 'comment.doc', | ||
| regex: '/\\*', | ||
| next: 'comment' | ||
| }, { | ||
| token: 'comment', | ||
| regex: '#.*' | ||
| }, { | ||
| token: 'keyword', | ||
| regex: '(?:t(?:h(?:is|row|en)|ry|ypeof!?)|c(?:on(?:tinue|st)|a(?:se|tch)|lass)|i(?:n(?:stanceof)?|mp(?:ort(?:\\s+all)?|lements)|[fs])|d(?:e(?:fault|lete|bugger)|o)|f(?:or(?:\\s+own)?|inally|unction)|s(?:uper|witch)|e(?:lse|x(?:tends|port)|val)|a(?:nd|rguments)|n(?:ew|ot)|un(?:less|til)|w(?:hile|ith)|o[fr]|return|break|let|var|loop)' + keywordend | ||
| }, { | ||
| token: 'constant.language', | ||
| regex: '(?:true|false|yes|no|on|off|null|void|undefined)' + keywordend | ||
| }, { | ||
| token: 'invalid.illegal', | ||
| regex: '(?:p(?:ackage|r(?:ivate|otected)|ublic)|i(?:mplements|nterface)|enum|static|yield)' + keywordend | ||
| }, { | ||
| token: 'language.support.class', | ||
| regex: '(?:R(?:e(?:gExp|ferenceError)|angeError)|S(?:tring|yntaxError)|E(?:rror|valError)|Array|Boolean|Date|Function|Number|Object|TypeError|URIError)' + keywordend | ||
| }, { | ||
| token: 'language.support.function', | ||
| regex: '(?:is(?:NaN|Finite)|parse(?:Int|Float)|Math|JSON|(?:en|de)codeURI(?:Component)?)' + keywordend | ||
| }, { | ||
| token: 'variable.language', | ||
| regex: '(?:t(?:hat|il|o)|f(?:rom|allthrough)|it|by|e)' + keywordend | ||
| }, { | ||
| token: 'identifier', | ||
| regex: identifier + '\\s*:(?![:=])' | ||
| }, { | ||
| token: 'variable', | ||
| regex: identifier | ||
| }, { | ||
| token: 'keyword.operator', | ||
| regex: '(?:\\.{3}|\\s+\\?)' | ||
| }, { | ||
| token: 'keyword.variable', | ||
| regex: '(?:@+|::|\\.\\.)', | ||
| next: 'key' | ||
| }, { | ||
| token: 'keyword.operator', | ||
| regex: '\\.\\s*', | ||
| next: 'key' | ||
| }, { | ||
| token: 'string', | ||
| regex: '\\\\\\S[^\\s,;)}\\]]*' | ||
| }, { | ||
| token: 'string.doc', | ||
| regex: '\'\'\'', | ||
| next: 'qdoc' | ||
| }, { | ||
| token: 'string.doc', | ||
| regex: '"""', | ||
| next: 'qqdoc' | ||
| }, { | ||
| token: 'string', | ||
| regex: '\'', | ||
| next: 'qstring' | ||
| }, { | ||
| token: 'string', | ||
| regex: '"', | ||
| next: 'qqstring' | ||
| }, { | ||
| token: 'string', | ||
| regex: '`', | ||
| next: 'js' | ||
| }, { | ||
| token: 'string', | ||
| regex: '<\\[', | ||
| next: 'words' | ||
| }, { | ||
| token: 'string.regex', | ||
| regex: '//', | ||
| next: 'heregex' | ||
| }, { | ||
| token: 'string.regex', | ||
| regex: '\\/(?:[^[\\/\\n\\\\]*(?:(?:\\\\.|\\[[^\\]\\n\\\\]*(?:\\\\.[^\\]\\n\\\\]*)*\\])[^[\\/\\n\\\\]*)*)\\/[gimy$]{0,4}', | ||
| next: 'key' | ||
| }, { | ||
| token: 'constant.numeric', | ||
| regex: '(?:0x[\\da-fA-F][\\da-fA-F_]*|(?:[2-9]|[12]\\d|3[0-6])r[\\da-zA-Z][\\da-zA-Z_]*|(?:\\d[\\d_]*(?:\\.\\d[\\d_]*)?|\\.\\d[\\d_]*)(?:e[+-]?\\d[\\d_]*)?[\\w$]*)' | ||
| }, { | ||
| token: 'lparen', | ||
| regex: '[({[]' | ||
| }, { | ||
| token: 'rparen', | ||
| regex: '[)}\\]]', | ||
| next: 'key' | ||
| }, { | ||
| token: 'keyword.operator', | ||
| regex: '\\S+' | ||
| }, { | ||
| token: 'text', | ||
| regex: '\\s+' | ||
| } | ||
| ], | ||
| heregex: [ | ||
| { | ||
| token: 'string.regex', | ||
| regex: '.*?//[gimy$?]{0,4}', | ||
| next: 'start' | ||
| }, { | ||
| token: 'string.regex', | ||
| regex: '\\s*#{' | ||
| }, { | ||
| token: 'comment.regex', | ||
| regex: '\\s+(?:#.*)?' | ||
| }, { | ||
| token: 'string.regex', | ||
| regex: '\\S+' | ||
| } | ||
| ], | ||
| key: [ | ||
| { | ||
| token: 'keyword.operator', | ||
| regex: '[.?@!]+' | ||
| }, { | ||
| token: 'identifier', | ||
| regex: identifier, | ||
| next: 'start' | ||
| }, { | ||
| token: 'text', | ||
| regex: '.', | ||
| next: 'start' | ||
| } | ||
| ], | ||
| comment: [ | ||
| { | ||
| token: 'comment.doc', | ||
| regex: '.*?\\*/', | ||
| next: 'start' | ||
| }, { | ||
| token: 'comment.doc', | ||
| regex: '.+' | ||
| } | ||
| ], | ||
| qdoc: [ | ||
| { | ||
| token: 'string', | ||
| regex: ".*?'''", | ||
| next: 'key' | ||
| }, stringfill | ||
| ], | ||
| qqdoc: [ | ||
| { | ||
| token: 'string', | ||
| regex: '.*?"""', | ||
| next: 'key' | ||
| }, stringfill | ||
| ], | ||
| qstring: [ | ||
| { | ||
| token: 'string', | ||
| regex: '[^\\\\\']*(?:\\\\.[^\\\\\']*)*\'', | ||
| next: 'key' | ||
| }, stringfill | ||
| ], | ||
| qqstring: [ | ||
| { | ||
| token: 'string', | ||
| regex: '[^\\\\"]*(?:\\\\.[^\\\\"]*)*"', | ||
| next: 'key' | ||
| }, stringfill | ||
| ], | ||
| js: [ | ||
| { | ||
| token: 'string', | ||
| regex: '[^\\\\`]*(?:\\\\.[^\\\\`]*)*`', | ||
| next: 'key' | ||
| }, stringfill | ||
| ], | ||
| words: [ | ||
| { | ||
| token: 'string', | ||
| regex: '.*?\\]>', | ||
| next: 'key' | ||
| }, stringfill | ||
| ] | ||
| }; | ||
| for (var idx in Rules) { | ||
| var r = Rules[idx]; | ||
| if (Array.isArray(r)) { | ||
| for (var i = 0, len = r.length; i < len; ++i) { | ||
| var rr = r[i]; | ||
| if (rr.regex) { | ||
| Rules[idx][i].regex = new RegExp('^' + rr.regex); | ||
| } | ||
| } | ||
| } else if (r.regex) { | ||
| Rules[idx].regex = new RegExp('^' + r.regex); | ||
| } | ||
| } | ||
| })(); | ||
|
|
||
| CodeMirror.defineMIME('text/x-livescript', 'livescript'); |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,266 @@ | ||
| /** | ||
| * Link to the project's GitHub page: | ||
| * https://github.com/duralog/CodeMirror | ||
| */ | ||
| CodeMirror.defineMode 'livescript', (conf) -> | ||
| tokenBase = (stream, state) -> | ||
| #indent = | ||
| if next_rule = state.next or \start | ||
| state.next = state.next | ||
| if Array.isArray nr = Rules[next_rule] | ||
| for r in nr | ||
| if r.regex and m = stream.match r.regex | ||
| state.next = r.next | ||
| return r.token | ||
| stream.next! | ||
| return \error | ||
| if stream.match r = Rules[next_rule] | ||
| if r.regex and stream.match r.regex | ||
| state.next = r.next | ||
| return r.token | ||
| else | ||
| stream.next! | ||
| return \error | ||
| stream.next! | ||
| return 'error' | ||
| external = { | ||
| startState: (basecolumn) -> | ||
| { | ||
| next: \start | ||
| lastToken: null | ||
| } | ||
| token: (stream, state) -> | ||
| style = tokenBase stream, state #tokenLexer stream, state | ||
| state.lastToken = { | ||
| style: style | ||
| indent: stream.indentation! | ||
| content: stream.current! | ||
| } | ||
| style.replace /\./g, ' ' | ||
| indent: (state, textAfter) -> | ||
| # XXX this won't work with backcalls | ||
| indentation = state.lastToken.indent | ||
| if state.lastToken.content.match indenter then indentation += 2 | ||
| return indentation | ||
| } | ||
| external | ||
|
|
||
| ### Highlight Rules | ||
| # taken from mode-ls.ls | ||
|
|
||
| indenter = // (? | ||
| : [({[=:] | ||
| | [-~]> | ||
| | \b (?: e(?:lse|xport) | d(?:o|efault) | t(?:ry|hen) | finally | | ||
| import (?:\s* all)? | const | var | | ||
| let | new | catch (?:\s* #identifier)? ) | ||
| ) \s* $ // | ||
|
|
||
| identifier = /(?![\d\s])[$\w\xAA-\uFFDC](?:(?!\s)[$\w\xAA-\uFFDC]|-[A-Za-z])*/$ | ||
| keywordend = /(?![$\w]|-[A-Za-z]|\s*:(?![:=]))/$ | ||
| stringfill = token: \string, regex: '.+' | ||
|
|
||
| Rules = | ||
| start: | ||
| * token: \comment.doc | ||
| regex: '/\\*' | ||
| next : \comment | ||
|
|
||
| * token: \comment | ||
| regex: '#.*' | ||
|
|
||
| * token: \keyword | ||
| regex: //(? | ||
| :t(?:h(?:is|row|en)|ry|ypeof!?) | ||
| |c(?:on(?:tinue|st)|a(?:se|tch)|lass) | ||
| |i(?:n(?:stanceof)?|mp(?:ort(?:\s+all)?|lements)|[fs]) | ||
| |d(?:e(?:fault|lete|bugger)|o) | ||
| |f(?:or(?:\s+own)?|inally|unction) | ||
| |s(?:uper|witch) | ||
| |e(?:lse|x(?:tends|port)|val) | ||
| |a(?:nd|rguments) | ||
| |n(?:ew|ot) | ||
| |un(?:less|til) | ||
| |w(?:hile|ith) | ||
| |o[fr]|return|break|let|var|loop | ||
| )//$ + keywordend | ||
|
|
||
| * token: \constant.language | ||
| regex: '(?:true|false|yes|no|on|off|null|void|undefined)' + keywordend | ||
|
|
||
| * token: \invalid.illegal | ||
| regex: '(? | ||
| :p(?:ackage|r(?:ivate|otected)|ublic) | ||
| |i(?:mplements|nterface) | ||
| |enum|static|yield | ||
| )' + keywordend | ||
|
|
||
| * token: \language.support.class | ||
| regex: '(? | ||
| :R(?:e(?:gExp|ferenceError)|angeError) | ||
| |S(?:tring|yntaxError) | ||
| |E(?:rror|valError) | ||
| |Array|Boolean|Date|Function|Number|Object|TypeError|URIError | ||
| )' + keywordend | ||
|
|
||
| * token: \language.support.function | ||
| regex: '(? | ||
| :is(?:NaN|Finite) | ||
| |parse(?:Int|Float) | ||
| |Math|JSON | ||
| |(?:en|de)codeURI(?:Component)? | ||
| )' + keywordend | ||
|
|
||
| * token: \variable.language | ||
| regex: '(?:t(?:hat|il|o)|f(?:rom|allthrough)|it|by|e)' + keywordend | ||
|
|
||
| * token: \identifier | ||
| regex: identifier + /\s*:(?![:=])/$ | ||
|
|
||
| * token: \variable | ||
| regex: identifier | ||
|
|
||
| * token: \keyword.operator | ||
| regex: /(?:\.{3}|\s+\?)/$ | ||
|
|
||
| * token: \keyword.variable | ||
| regex: /(?:@+|::|\.\.)/$ | ||
| next : \key | ||
|
|
||
| * token: \keyword.operator | ||
| regex: /\.\s*/$ | ||
| next : \key | ||
|
|
||
| * token: \string | ||
| regex: /\\\S[^\s,;)}\]]*/$ | ||
|
|
||
| * token: \string.doc | ||
| regex: \''' | ||
| next : \qdoc | ||
|
|
||
| * token: \string.doc | ||
| regex: \""" | ||
| next : \qqdoc | ||
|
|
||
| * token: \string | ||
| regex: \' | ||
| next : \qstring | ||
|
|
||
| * token: \string | ||
| regex: \" | ||
| next : \qqstring | ||
|
|
||
| * token: \string | ||
| regex: \` | ||
| next : \js | ||
|
|
||
| * token: \string | ||
| regex: '<\\[' | ||
| next : \words | ||
|
|
||
| * token: \string.regex | ||
| regex: \// | ||
| next : \heregex | ||
|
|
||
| * token: \string.regex | ||
| regex: // | ||
| /(?: [^ [ / \n \\ ]* | ||
| (?: (?: \\. | ||
| | \[ [^\]\n\\]* (?:\\.[^\]\n\\]*)* \] | ||
| ) [^ [ / \n \\ ]* | ||
| )* | ||
| )/ [gimy$]{0,4} | ||
| //$ | ||
| next : \key | ||
|
|
||
| * token: \constant.numeric | ||
| regex: '(?:0x[\\da-fA-F][\\da-fA-F_]* | ||
| |(?:[2-9]|[12]\\d|3[0-6])r[\\da-zA-Z][\\da-zA-Z_]* | ||
| |(?:\\d[\\d_]*(?:\\.\\d[\\d_]*)?|\\.\\d[\\d_]*) | ||
| (?:e[+-]?\\d[\\d_]*)?[\\w$]*)' | ||
|
|
||
| * token: \lparen | ||
| regex: '[({[]' | ||
|
|
||
| * token: \rparen | ||
| regex: '[)}\\]]' | ||
| next : \key | ||
|
|
||
| * token: \keyword.operator | ||
| regex: \\\S+ | ||
|
|
||
| * token: \text | ||
| regex: \\\s+ | ||
|
|
||
| heregex: | ||
| * token: \string.regex | ||
| regex: '.*?//[gimy$?]{0,4}' | ||
| next : \start | ||
| * token: \string.regex | ||
| regex: '\\s*#{' | ||
| * token: \comment.regex | ||
| regex: '\\s+(?:#.*)?' | ||
| * token: \string.regex | ||
| regex: '\\S+' | ||
|
|
||
| key: | ||
| * token: \keyword.operator | ||
| regex: '[.?@!]+' | ||
| * token: \identifier | ||
| regex: identifier | ||
| next : \start | ||
| * token: \text | ||
| regex: '.' | ||
| next : \start | ||
|
|
||
| comment: | ||
| * token: \comment.doc | ||
| regex: '.*?\\*/' | ||
| next : \start | ||
| * token: \comment.doc | ||
| regex: '.+' | ||
|
|
||
| qdoc: | ||
| token: \string | ||
| regex: ".*?'''" | ||
| next : \key | ||
| stringfill | ||
|
|
||
| qqdoc: | ||
| token: \string | ||
| regex: '.*?"""' | ||
| next : \key | ||
| stringfill | ||
|
|
||
| qstring: | ||
| token: \string | ||
| regex: /[^\\']*(?:\\.[^\\']*)*'/$ | ||
| next : \key | ||
| stringfill | ||
|
|
||
| qqstring: | ||
| token: \string | ||
| regex: /[^\\"]*(?:\\.[^\\"]*)*"/$ | ||
| next : \key | ||
| stringfill | ||
|
|
||
| js: | ||
| token: \string | ||
| regex: /[^\\`]*(?:\\.[^\\`]*)*`/$ | ||
| next : \key | ||
| stringfill | ||
|
|
||
| words: | ||
| token: \string | ||
| regex: '.*?\\]>' | ||
| next : \key | ||
| stringfill | ||
|
|
||
| # for optimization, precompile the regexps | ||
| for idx, r of Rules | ||
| if Array.isArray r | ||
| for rr, i in r | ||
| if rr.regex then Rules[idx][i].regex = new RegExp '^'+rr.regex | ||
| else if r.regex then Rules[idx].regex = new RegExp '^'+r.regex | ||
|
|
||
| CodeMirror.defineMIME 'text/x-livescript', 'livescript' |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,149 @@ | ||
| <!doctype html> | ||
| <html> | ||
| <head> | ||
| <meta charset="utf-8"> | ||
| <title>CodeMirror: mIRC mode</title> | ||
| <link rel="stylesheet" href="../../lib/codemirror.css"> | ||
| <script src="../../lib/codemirror.js"></script> | ||
| <script src="mirc.js"></script> | ||
| <link rel="stylesheet" href="../../theme/twilight.css"> | ||
| <style>.CodeMirror {border: 1px solid black;}</style> | ||
| <link rel="stylesheet" href="../../doc/docs.css"> | ||
| </head> | ||
| <body> | ||
| <h1>CodeMirror: mIRC mode</h1> | ||
| <form><textarea id="code" name="code"> | ||
| ;AKA Nick Tracker by Ford_Lawnmower irc.GeekShed.net #Script-Help | ||
| ;*****************************************************************************; | ||
| ;**Start Setup | ||
| ;Change JoinDisplay, below, for On Join AKA Display. On = 1 - Off = 0 | ||
| alias -l JoinDisplay { return 1 } | ||
| ;Change MaxNicks, below, to the number of nicknames you want to store for each hostmask. I wouldn't go over 400 with this ;/ | ||
| alias -l MaxNicks { return 20 } | ||
| ;Change AKALogo, below, To the text you want displayed before each AKA result. | ||
| alias -l AKALogo { return 06 05A06K07A 06 } | ||
| ;**End Setup | ||
| ;*****************************************************************************; | ||
| On *:Join:#: { | ||
| if ($nick == $me) { .timer 1 1 ialupdateCheck $chan } | ||
| NickNamesAdd $nick $+($network,$wildsite) | ||
| if ($JoinDisplay) { .timerNickNames $+ $nick 1 2 NickNames.display $nick $chan $network $wildsite } | ||
| } | ||
| on *:Nick: { NickNamesAdd $newnick $+($network,$wildsite) $nick } | ||
| alias -l NickNames.display { | ||
| if ($gettok($hget(NickNames,$+($3,$4)),0,126) > 1) { | ||
| echo -g $2 $AKALogo $+(09,$1) $AKALogo 07 $mid($replace($hget(NickNames,$+($3,$4)),$chr(126),$chr(44)),2,-1) | ||
| } | ||
| } | ||
| alias -l NickNamesAdd { | ||
| if ($hget(NickNames,$2)) { | ||
| if (!$regex($hget(NickNames,$2),/~\Q $+ $replacecs($1,\E,\E\\E\Q) $+ \E~/i)) { | ||
| if ($gettok($hget(NickNames,$2),0,126) <= $MaxNicks) { | ||
| hadd NickNames $2 $+($hget(NickNames,$2),$1,~) | ||
| } | ||
| else { | ||
| hadd NickNames $2 $+($mid($hget(NickNames,$2),$pos($hget(NickNames,$2),~,2)),$1,~) | ||
| } | ||
| } | ||
| } | ||
| else { | ||
| hadd -m NickNames $2 $+(~,$1,~,$iif($3,$+($3,~))) | ||
| } | ||
| } | ||
| alias -l Fix.All.MindUser { | ||
| var %Fix.Count = $hfind(NickNames,/[^~]+[0-9]{4}~/,0,r).data | ||
| while (%Fix.Count) { | ||
| if ($Fix.MindUser($hget(NickNames,$hfind(NickNames,/[^~]+[0-9]{4}~/,%Fix.Count,r).data))) { | ||
| echo -ag Record %Fix.Count - $v1 - Was Cleaned | ||
| hadd NickNames $hfind(NickNames,/[^~]+[0-9]{4}~/,%Fix.Count,r).data $v1 | ||
| } | ||
| dec %Fix.Count | ||
| } | ||
| } | ||
| alias -l Fix.MindUser { return $regsubex($1,/[^~]+[0-9]{4}~/g,$null) } | ||
| menu nicklist,query { | ||
| - | ||
| .AKA | ||
| ..Check $$1: { | ||
| if ($gettok($hget(NickNames,$+($network,$address($1,2))),0,126) > 1) { | ||
| NickNames.display $1 $active $network $address($1,2) | ||
| } | ||
| else { echo -ag $AKALogo $+(09,$1) 07has not been known by any other nicknames while I have been watching. } | ||
| } | ||
| ..Cleanup $$1:hadd NickNames $+($network,$address($1,2)) $fix.minduser($hget(NickNames,$+($network,$address($1,2)))) | ||
| ..Clear $$1:hadd NickNames $+($network,$address($1,2)) $+(~,$1,~) | ||
| ..AKA Search Dialog:dialog $iif($dialog(AKA_Search),-v,-m) AKA_Search AKA_Search | ||
| - | ||
| } | ||
| menu status,channel { | ||
| - | ||
| .AKA | ||
| ..AKA Search Dialog:dialog $iif($dialog(AKA_Search),-v,-m) AKA_Search AKA_Search | ||
| ..Clean All Records:Fix.All.Minduser | ||
| - | ||
| } | ||
| dialog AKA_Search { | ||
| title "AKA Search Engine" | ||
| size -1 -1 206 221 | ||
| option dbu | ||
| edit "", 1, 8 5 149 10, autohs | ||
| button "Search", 2, 163 4 32 12 | ||
| radio "Search HostMask", 4, 61 22 55 10 | ||
| radio "Search Nicknames", 5, 123 22 56 10 | ||
| list 6, 8 38 190 169, sort extsel vsbar | ||
| button "Check Selected", 7, 67 206 40 12 | ||
| button "Close", 8, 160 206 38 12, cancel | ||
| box "Search Type", 3, 11 17 183 18 | ||
| button "Copy to Clipboard", 9, 111 206 46 12 | ||
| } | ||
| On *:Dialog:Aka_Search:init:*: { did -c $dname 5 } | ||
| On *:Dialog:Aka_Search:Sclick:2,7,9: { | ||
| if ($did == 2) && ($did($dname,1)) { | ||
| did -r $dname 6 | ||
| var %search $+(*,$v1,*), %type $iif($did($dname,5).state,data,item), %matches = $hfind(NickNames,%search,0,w). [ $+ [ %type ] ] | ||
| while (%matches) { | ||
| did -a $dname 6 $hfind(NickNames,%search,%matches,w). [ $+ [ %type ] ] | ||
| dec %matches | ||
| } | ||
| did -c $dname 6 1 | ||
| } | ||
| elseif ($did == 7) && ($did($dname,6).seltext) { echo -ga $AKALogo 07 $mid($replace($hget(NickNames,$v1),$chr(126),$chr(44)),2,-1) } | ||
| elseif ($did == 9) && ($did($dname,6).seltext) { clipboard $mid($v1,$pos($v1,*,1)) } | ||
| } | ||
| On *:Start:{ | ||
| if (!$hget(NickNames)) { hmake NickNames 10 } | ||
| if ($isfile(NickNames.hsh)) { hload NickNames NickNames.hsh } | ||
| } | ||
| On *:Exit: { if ($hget(NickNames)) { hsave NickNames NickNames.hsh } } | ||
| On *:Disconnect: { if ($hget(NickNames)) { hsave NickNames NickNames.hsh } } | ||
| On *:Unload: { hfree NickNames } | ||
| alias -l ialupdateCheck { | ||
| inc -z $+(%,ialupdateCheck,$network) $calc($nick($1,0) / 4) | ||
| ;If your ial is already being updated on join .who $1 out. | ||
| ;If you are using /names to update ial you will still need this line. | ||
| .who $1 | ||
| } | ||
| Raw 352:*: { | ||
| if ($($+(%,ialupdateCheck,$network),2)) haltdef | ||
| NickNamesAdd $6 $+($network,$address($6,2)) | ||
| } | ||
| Raw 315:*: { | ||
| if ($($+(%,ialupdateCheck,$network),2)) haltdef | ||
| } | ||
|
|
||
| </textarea></form> | ||
| <script> | ||
| var editor = CodeMirror.fromTextArea(document.getElementById("code"), { | ||
| tabMode: "indent", | ||
| theme: "twilight", | ||
| lineNumbers: true, | ||
| matchBrackets: true, | ||
| indentUnit: 4, | ||
| mode: "text/mirc" | ||
| }); | ||
| </script> | ||
|
|
||
| <p><strong>MIME types defined:</strong> <code>text/mirc</code>.</p> | ||
|
|
||
| </body> | ||
| </html> |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,177 @@ | ||
| //mIRC mode by Ford_Lawnmower :: Based on Velocity mode by Steve O'Hara | ||
| CodeMirror.defineMIME("text/mirc", "mirc"); | ||
| CodeMirror.defineMode("mirc", function() { | ||
| function parseWords(str) { | ||
| var obj = {}, words = str.split(" "); | ||
| for (var i = 0; i < words.length; ++i) obj[words[i]] = true; | ||
| return obj; | ||
| } | ||
| var specials = parseWords("$! $$ $& $? $+ $abook $abs $active $activecid " + | ||
| "$activewid $address $addtok $agent $agentname $agentstat $agentver " + | ||
| "$alias $and $anick $ansi2mirc $aop $appactive $appstate $asc $asctime " + | ||
| "$asin $atan $avoice $away $awaymsg $awaytime $banmask $base $bfind " + | ||
| "$binoff $biton $bnick $bvar $bytes $calc $cb $cd $ceil $chan $chanmodes " + | ||
| "$chantypes $chat $chr $cid $clevel $click $cmdbox $cmdline $cnick $color " + | ||
| "$com $comcall $comchan $comerr $compact $compress $comval $cos $count " + | ||
| "$cr $crc $creq $crlf $ctime $ctimer $ctrlenter $date $day $daylight " + | ||
| "$dbuh $dbuw $dccignore $dccport $dde $ddename $debug $decode $decompress " + | ||
| "$deltok $devent $dialog $did $didreg $didtok $didwm $disk $dlevel $dll " + | ||
| "$dllcall $dname $dns $duration $ebeeps $editbox $emailaddr $encode $error " + | ||
| "$eval $event $exist $feof $ferr $fgetc $file $filename $filtered $finddir " + | ||
| "$finddirn $findfile $findfilen $findtok $fline $floor $fopen $fread $fserve " + | ||
| "$fulladdress $fulldate $fullname $fullscreen $get $getdir $getdot $gettok $gmt " + | ||
| "$group $halted $hash $height $hfind $hget $highlight $hnick $hotline " + | ||
| "$hotlinepos $ial $ialchan $ibl $idle $iel $ifmatch $ignore $iif $iil " + | ||
| "$inelipse $ini $inmidi $inpaste $inpoly $input $inrect $inroundrect " + | ||
| "$insong $instok $int $inwave $ip $isalias $isbit $isdde $isdir $isfile " + | ||
| "$isid $islower $istok $isupper $keychar $keyrpt $keyval $knick $lactive " + | ||
| "$lactivecid $lactivewid $left $len $level $lf $line $lines $link $lock " + | ||
| "$lock $locked $log $logstamp $logstampfmt $longfn $longip $lower $ltimer " + | ||
| "$maddress $mask $matchkey $matchtok $md5 $me $menu $menubar $menucontext " + | ||
| "$menutype $mid $middir $mircdir $mircexe $mircini $mklogfn $mnick $mode " + | ||
| "$modefirst $modelast $modespl $mouse $msfile $network $newnick $nick $nofile " + | ||
| "$nopath $noqt $not $notags $notify $null $numeric $numok $oline $onpoly " + | ||
| "$opnick $or $ord $os $passivedcc $pic $play $pnick $port $portable $portfree " + | ||
| "$pos $prefix $prop $protect $puttok $qt $query $rand $r $rawmsg $read $readomo " + | ||
| "$readn $regex $regml $regsub $regsubex $remove $remtok $replace $replacex " + | ||
| "$reptok $result $rgb $right $round $scid $scon $script $scriptdir $scriptline " + | ||
| "$sdir $send $server $serverip $sfile $sha1 $shortfn $show $signal $sin " + | ||
| "$site $sline $snick $snicks $snotify $sock $sockbr $sockerr $sockname " + | ||
| "$sorttok $sound $sqrt $ssl $sreq $sslready $status $strip $str $stripped " + | ||
| "$syle $submenu $switchbar $tan $target $ticks $time $timer $timestamp " + | ||
| "$timestampfmt $timezone $tip $titlebar $toolbar $treebar $trust $ulevel " + | ||
| "$ulist $upper $uptime $url $usermode $v1 $v2 $var $vcmd $vcmdstat $vcmdver " + | ||
| "$version $vnick $vol $wid $width $wildsite $wildtok $window $wrap $xor"); | ||
| var keywords = parseWords("abook ajinvite alias aline ame amsg anick aop auser autojoin avoice " + | ||
| "away background ban bcopy beep bread break breplace bset btrunc bunset bwrite " + | ||
| "channel clear clearall cline clipboard close cnick color comclose comopen " + | ||
| "comreg continue copy creq ctcpreply ctcps dcc dccserver dde ddeserver " + | ||
| "debug dec describe dialog did didtok disable disconnect dlevel dline dll " + | ||
| "dns dqwindow drawcopy drawdot drawfill drawline drawpic drawrect drawreplace " + | ||
| "drawrot drawsave drawscroll drawtext ebeeps echo editbox emailaddr enable " + | ||
| "events exit fclose filter findtext finger firewall flash flist flood flush " + | ||
| "flushini font fopen fseek fsend fserve fullname fwrite ghide gload gmove " + | ||
| "gopts goto gplay gpoint gqreq groups gshow gsize gstop gtalk gunload hadd " + | ||
| "halt haltdef hdec hdel help hfree hinc hload hmake hop hsave ial ialclear " + | ||
| "ialmark identd if ignore iline inc invite iuser join kick linesep links list " + | ||
| "load loadbuf localinfo log mdi me menubar mkdir mnick mode msg nick noop notice " + | ||
| "notify omsg onotice part partall pdcc perform play playctrl pop protect pvoice " + | ||
| "qme qmsg query queryn quit raw reload remini remote remove rename renwin " + | ||
| "reseterror resetidle return rlevel rline rmdir run ruser save savebuf saveini " + | ||
| "say scid scon server set showmirc signam sline sockaccept sockclose socklist " + | ||
| "socklisten sockmark sockopen sockpause sockread sockrename sockudp sockwrite " + | ||
| "sound speak splay sreq strip switchbar timer timestamp titlebar tnick tokenize " + | ||
| "toolbar topic tray treebar ulist unload unset unsetall updatenl url uwho " + | ||
| "var vcadd vcmd vcrem vol while whois window winhelp write writeint if isalnum " + | ||
| "isalpha isaop isavoice isban ischan ishop isignore isin isincs isletter islower " + | ||
| "isnotify isnum ison isop isprotect isreg isupper isvoice iswm iswmcs " + | ||
| "elseif else goto menu nicklist status title icon size option text edit " + | ||
| "button check radio box scroll list combo link tab item"); | ||
| var functions = parseWords("if elseif else and not or eq ne in ni for foreach while switch"); | ||
| var isOperatorChar = /[+\-*&%=<>!?^\/\|]/; | ||
| function chain(stream, state, f) { | ||
| state.tokenize = f; | ||
| return f(stream, state); | ||
| } | ||
| function tokenBase(stream, state) { | ||
| var beforeParams = state.beforeParams; | ||
| state.beforeParams = false; | ||
| var ch = stream.next(); | ||
| if (/[\[\]{}\(\),\.]/.test(ch)) { | ||
| if (ch == "(" && beforeParams) state.inParams = true; | ||
| else if (ch == ")") state.inParams = false; | ||
| return null; | ||
| } | ||
| else if (/\d/.test(ch)) { | ||
| stream.eatWhile(/[\w\.]/); | ||
| return "number"; | ||
| } | ||
| else if (ch == "\\") { | ||
| stream.eat("\\"); | ||
| stream.eat(/./); | ||
| return "number"; | ||
| } | ||
| else if (ch == "/" && stream.eat("*")) { | ||
| return chain(stream, state, tokenComment); | ||
| } | ||
| else if (ch == ";" && stream.match(/ *\( *\(/)) { | ||
| return chain(stream, state, tokenUnparsed); | ||
| } | ||
| else if (ch == ";" && !state.inParams) { | ||
| stream.skipToEnd(); | ||
| return "comment"; | ||
| } | ||
| else if (ch == '"') { | ||
| stream.eat(/"/); | ||
| return "keyword"; | ||
| } | ||
| else if (ch == "$") { | ||
| stream.eatWhile(/[$_a-z0-9A-Z\.:]/); | ||
| if (specials && specials.propertyIsEnumerable(stream.current().toLowerCase())) { | ||
| return "keyword"; | ||
| } | ||
| else { | ||
| state.beforeParams = true; | ||
| return "builtin"; | ||
| } | ||
| } | ||
| else if (ch == "%") { | ||
| stream.eatWhile(/[^,^\s^\(^\)]/); | ||
| state.beforeParams = true; | ||
| return "string"; | ||
| } | ||
| else if (isOperatorChar.test(ch)) { | ||
| stream.eatWhile(isOperatorChar); | ||
| return "operator"; | ||
| } | ||
| else { | ||
| stream.eatWhile(/[\w\$_{}]/); | ||
| var word = stream.current().toLowerCase(); | ||
| if (keywords && keywords.propertyIsEnumerable(word)) | ||
| return "keyword"; | ||
| if (functions && functions.propertyIsEnumerable(word)) { | ||
| state.beforeParams = true; | ||
| return "keyword"; | ||
| } | ||
| return null; | ||
| } | ||
| } | ||
| function tokenComment(stream, state) { | ||
| var maybeEnd = false, ch; | ||
| while (ch = stream.next()) { | ||
| if (ch == "/" && maybeEnd) { | ||
| state.tokenize = tokenBase; | ||
| break; | ||
| } | ||
| maybeEnd = (ch == "*"); | ||
| } | ||
| return "comment"; | ||
| } | ||
| function tokenUnparsed(stream, state) { | ||
| var maybeEnd = 0, ch; | ||
| while (ch = stream.next()) { | ||
| if (ch == ";" && maybeEnd == 2) { | ||
| state.tokenize = tokenBase; | ||
| break; | ||
| } | ||
| if (ch == ")") | ||
| maybeEnd++; | ||
| else if (ch != " ") | ||
| maybeEnd = 0; | ||
| } | ||
| return "meta"; | ||
| } | ||
| return { | ||
| startState: function() { | ||
| return { | ||
| tokenize: tokenBase, | ||
| beforeParams: false, | ||
| inParams: false | ||
| }; | ||
| }, | ||
| token: function(stream, state) { | ||
| if (stream.eatSpace()) return null; | ||
| return state.tokenize(stream, state); | ||
| } | ||
| }; | ||
| }); |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,21 @@ | ||
| The MIT License | ||
|
|
||
| Copyright (c) 2013 Hasan Karahan | ||
|
|
||
| Permission is hereby granted, free of charge, to any person obtaining a copy | ||
| of this software and associated documentation files (the "Software"), to deal | ||
| in the Software without restriction, including without limitation the rights | ||
| to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||
| copies of the Software, and to permit persons to whom the Software is | ||
| furnished to do so, subject to the following conditions: | ||
|
|
||
| The above copyright notice and this permission notice shall be included in | ||
| all copies or substantial portions of the Software. | ||
|
|
||
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
| IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
| FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||
| AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||
| LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||
| OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||
| THE SOFTWARE. |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,129 @@ | ||
| <!doctype html> | ||
| <html> | ||
| <head> | ||
| <meta charset="utf-8"> | ||
| <title>CodeMirror: Tcl mode</title> | ||
| <link rel="stylesheet" href="../../lib/codemirror.css"> | ||
| <script src="../../lib/codemirror.js"></script> | ||
| <script src="tcl.js"></script> | ||
| <link rel="stylesheet" href="../../theme/night.css"> | ||
| <link rel="stylesheet" href="../../doc/docs.css"> | ||
| </head> | ||
| <body> | ||
| <h1>CodeMirror: Tcl mode</h1> | ||
| <form><textarea id="code" name="code"> | ||
| ############################################################################################## | ||
| ## ## whois.tcl for eggdrop by Ford_Lawnmower irc.geekshed.net #Script-Help ## ## | ||
| ############################################################################################## | ||
| ## To use this script you must set channel flag +whois (ie .chanset #chan +whois) ## | ||
| ############################################################################################## | ||
| ## ____ __ ########################################### ## | ||
| ## / __/___ _ ___ _ ___/ /____ ___ ___ ########################################### ## | ||
| ## / _/ / _ `// _ `// _ // __// _ \ / _ \ ########################################### ## | ||
| ## /___/ \_, / \_, / \_,_//_/ \___// .__/ ########################################### ## | ||
| ## /___/ /___/ /_/ ########################################### ## | ||
| ## ########################################### ## | ||
| ############################################################################################## | ||
| ## ## Start Setup. ## ## | ||
| ############################################################################################## | ||
| namespace eval whois { | ||
| ## change cmdchar to the trigger you want to use ## ## | ||
| variable cmdchar "!" | ||
| ## change command to the word trigger you would like to use. ## ## | ||
| ## Keep in mind, This will also change the .chanset +/-command ## ## | ||
| variable command "whois" | ||
| ## change textf to the colors you want for the text. ## ## | ||
| variable textf "\017\00304" | ||
| ## change tagf to the colors you want for tags: ## ## | ||
| variable tagf "\017\002" | ||
| ## Change logo to the logo you want at the start of the line. ## ## | ||
| variable logo "\017\00304\002\[\00306W\003hois\00304\]\017" | ||
| ## Change lineout to the results you want. Valid results are channel users modes topic ## ## | ||
| variable lineout "channel users modes topic" | ||
| ############################################################################################## | ||
| ## ## End Setup. ## ## | ||
| ############################################################################################## | ||
| variable channel "" | ||
| setudef flag $whois::command | ||
| bind pub -|- [string trimleft $whois::cmdchar]${whois::command} whois::list | ||
| bind raw -|- "311" whois::311 | ||
| bind raw -|- "312" whois::312 | ||
| bind raw -|- "319" whois::319 | ||
| bind raw -|- "317" whois::317 | ||
| bind raw -|- "313" whois::multi | ||
| bind raw -|- "310" whois::multi | ||
| bind raw -|- "335" whois::multi | ||
| bind raw -|- "301" whois::301 | ||
| bind raw -|- "671" whois::multi | ||
| bind raw -|- "320" whois::multi | ||
| bind raw -|- "401" whois::multi | ||
| bind raw -|- "318" whois::318 | ||
| bind raw -|- "307" whois::307 | ||
| } | ||
| proc whois::311 {from key text} { | ||
| if {[regexp -- {^[^\s]+\s(.+?)\s(.+?)\s(.+?)\s\*\s\:(.+)$} $text wholematch nick ident host realname]} { | ||
| putserv "PRIVMSG $whois::channel :${whois::logo} ${whois::tagf}Host:${whois::textf} \ | ||
| $nick \(${ident}@${host}\) ${whois::tagf}Realname:${whois::textf} $realname" | ||
| } | ||
| } | ||
| proc whois::multi {from key text} { | ||
| if {[regexp {\:(.*)$} $text match $key]} { | ||
| putserv "PRIVMSG $whois::channel :${whois::logo} ${whois::tagf}Note:${whois::textf} [subst $$key]" | ||
| return 1 | ||
| } | ||
| } | ||
| proc whois::312 {from key text} { | ||
| regexp {([^\s]+)\s\:} $text match server | ||
| putserv "PRIVMSG $whois::channel :${whois::logo} ${whois::tagf}Server:${whois::textf} $server" | ||
| } | ||
| proc whois::319 {from key text} { | ||
| if {[regexp {.+\:(.+)$} $text match channels]} { | ||
| putserv "PRIVMSG $whois::channel :${whois::logo} ${whois::tagf}Channels:${whois::textf} $channels" | ||
| } | ||
| } | ||
| proc whois::317 {from key text} { | ||
| if {[regexp -- {.*\s(\d+)\s(\d+)\s\:} $text wholematch idle signon]} { | ||
| putserv "PRIVMSG $whois::channel :${whois::logo} ${whois::tagf}Connected:${whois::textf} \ | ||
| [ctime $signon] ${whois::tagf}Idle:${whois::textf} [duration $idle]" | ||
| } | ||
| } | ||
| proc whois::301 {from key text} { | ||
| if {[regexp {^.+\s[^\s]+\s\:(.*)$} $text match awaymsg]} { | ||
| putserv "PRIVMSG $whois::channel :${whois::logo} ${whois::tagf}Away:${whois::textf} $awaymsg" | ||
| } | ||
| } | ||
| proc whois::318 {from key text} { | ||
| namespace eval whois { | ||
| variable channel "" | ||
| } | ||
| variable whois::channel "" | ||
| } | ||
| proc whois::307 {from key text} { | ||
| putserv "PRIVMSG $whois::channel :${whois::logo} ${whois::tagf}Services:${whois::textf} Registered Nick" | ||
| } | ||
| proc whois::list {nick host hand chan text} { | ||
| if {[lsearch -exact [channel info $chan] "+${whois::command}"] != -1} { | ||
| namespace eval whois { | ||
| variable channel "" | ||
| } | ||
| variable whois::channel $chan | ||
| putserv "WHOIS $text" | ||
| } | ||
| } | ||
| putlog "\002*Loaded* \017\00304\002\[\00306W\003hois\00304\]\017 \002by \ | ||
| Ford_Lawnmower irc.GeekShed.net #Script-Help" | ||
| </textarea></form> | ||
| <script> | ||
| var editor = CodeMirror.fromTextArea(document.getElementById("code"), { | ||
| tabMode: "indent", | ||
| theme: "night", | ||
| lineNumbers: true, | ||
| indentUnit: 2, | ||
| mode: "text/x-tcl" | ||
| }); | ||
| </script> | ||
|
|
||
| <p><strong>MIME types defined:</strong> <code>text/x-tcl</code>.</p> | ||
|
|
||
| </body> | ||
| </html> |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,131 @@ | ||
| //tcl mode by Ford_Lawnmower :: Based on Velocity mode by Steve O'Hara | ||
| CodeMirror.defineMode("tcl", function() { | ||
| function parseWords(str) { | ||
| var obj = {}, words = str.split(" "); | ||
| for (var i = 0; i < words.length; ++i) obj[words[i]] = true; | ||
| return obj; | ||
| } | ||
| var keywords = parseWords("Tcl safe after append array auto_execok auto_import auto_load " + | ||
| "auto_mkindex auto_mkindex_old auto_qualify auto_reset bgerror " + | ||
| "binary break catch cd close concat continue dde eof encoding error " + | ||
| "eval exec exit expr fblocked fconfigure fcopy file fileevent filename " + | ||
| "filename flush for foreach format gets glob global history http if " + | ||
| "incr info interp join lappend lindex linsert list llength load lrange " + | ||
| "lreplace lsearch lset lsort memory msgcat namespace open package parray " + | ||
| "pid pkg::create pkg_mkIndex proc puts pwd re_syntax read regex regexp " + | ||
| "registry regsub rename resource return scan seek set socket source split " + | ||
| "string subst switch tcl_endOfWord tcl_findLibrary tcl_startOfNextWord " + | ||
| "tcl_wordBreakAfter tcl_startOfPreviousWord tcl_wordBreakBefore tcltest " + | ||
| "tclvars tell time trace unknown unset update uplevel upvar variable " + | ||
| "vwait"); | ||
| var functions = parseWords("if elseif else and not or eq ne in ni for foreach while switch"); | ||
| var isOperatorChar = /[+\-*&%=<>!?^\/\|]/; | ||
| function chain(stream, state, f) { | ||
| state.tokenize = f; | ||
| return f(stream, state); | ||
| } | ||
| function tokenBase(stream, state) { | ||
| var beforeParams = state.beforeParams; | ||
| state.beforeParams = false; | ||
| var ch = stream.next(); | ||
| if ((ch == '"' || ch == "'") && state.inParams) | ||
| return chain(stream, state, tokenString(ch)); | ||
| else if (/[\[\]{}\(\),;\.]/.test(ch)) { | ||
| if (ch == "(" && beforeParams) state.inParams = true; | ||
| else if (ch == ")") state.inParams = false; | ||
| return null; | ||
| } | ||
| else if (/\d/.test(ch)) { | ||
| stream.eatWhile(/[\w\.]/); | ||
| return "number"; | ||
| } | ||
| else if (ch == "#" && stream.eat("*")) { | ||
| return chain(stream, state, tokenComment); | ||
| } | ||
| else if (ch == "#" && stream.match(/ *\[ *\[/)) { | ||
| return chain(stream, state, tokenUnparsed); | ||
| } | ||
| else if (ch == "#" && stream.eat("#")) { | ||
| stream.skipToEnd(); | ||
| return "comment"; | ||
| } | ||
| else if (ch == '"') { | ||
| stream.skipTo(/"/); | ||
| return "comment"; | ||
| } | ||
| else if (ch == "$") { | ||
| stream.eatWhile(/[$_a-z0-9A-Z\.{:]/); | ||
| stream.eatWhile(/}/); | ||
| state.beforeParams = true; | ||
| return "builtin"; | ||
| } | ||
| else if (isOperatorChar.test(ch)) { | ||
| stream.eatWhile(isOperatorChar); | ||
| return "comment"; | ||
| } | ||
| else { | ||
| stream.eatWhile(/[\w\$_{}]/); | ||
| var word = stream.current().toLowerCase(); | ||
| if (keywords && keywords.propertyIsEnumerable(word)) | ||
| return "keyword"; | ||
| if (functions && functions.propertyIsEnumerable(word)) { | ||
| state.beforeParams = true; | ||
| return "keyword"; | ||
| } | ||
| return null; | ||
| } | ||
| } | ||
| function tokenString(quote) { | ||
| return function(stream, state) { | ||
| var escaped = false, next, end = false; | ||
| while ((next = stream.next()) != null) { | ||
| if (next == quote && !escaped) { | ||
| end = true; | ||
| break; | ||
| } | ||
| escaped = !escaped && next == "\\"; | ||
| } | ||
| if (end) state.tokenize = tokenBase; | ||
| return "string"; | ||
| }; | ||
| } | ||
| function tokenComment(stream, state) { | ||
| var maybeEnd = false, ch; | ||
| while (ch = stream.next()) { | ||
| if (ch == "#" && maybeEnd) { | ||
| state.tokenize = tokenBase; | ||
| break; | ||
| } | ||
| maybeEnd = (ch == "*"); | ||
| } | ||
| return "comment"; | ||
| } | ||
| function tokenUnparsed(stream, state) { | ||
| var maybeEnd = 0, ch; | ||
| while (ch = stream.next()) { | ||
| if (ch == "#" && maybeEnd == 2) { | ||
| state.tokenize = tokenBase; | ||
| break; | ||
| } | ||
| if (ch == "]") | ||
| maybeEnd++; | ||
| else if (ch != " ") | ||
| maybeEnd = 0; | ||
| } | ||
| return "meta"; | ||
| } | ||
| return { | ||
| startState: function() { | ||
| return { | ||
| tokenize: tokenBase, | ||
| beforeParams: false, | ||
| inParams: false | ||
| }; | ||
| }, | ||
| token: function(stream, state) { | ||
| if (stream.eatSpace()) return null; | ||
| return state.tokenize(stream, state); | ||
| } | ||
| }; | ||
| }); | ||
| CodeMirror.defineMIME("text/x-tcl", "tcl"); |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,6 +1,6 @@ | ||
| .cm-tw-syntaxerror { | ||
| color: #FFF; | ||
| background-color: #900; | ||
| } | ||
|
|
||
| .cm-tw-deleted { | ||
|
|
||