From 63155b78023911fbec3c0abdd94dc5968effbc0a Mon Sep 17 00:00:00 2001
From: Dimage Sapelkin <kerabromsmu@users.noreply.github.com>
Date: Wed, 3 Jun 2015 18:38:13 +0300
Subject: [PATCH] [factor mode] Add

---
 doc/compress.html      |  1 +
 mode/factor/factor.js  | 83 ++++++++++++++++++++++++++++++++++++++++++
 mode/factor/index.html | 77 +++++++++++++++++++++++++++++++++++++++
 mode/index.html        |  1 +
 mode/meta.js           |  1 +
 5 files changed, 163 insertions(+)
 create mode 100644 mode/factor/factor.js
 create mode 100644 mode/factor/index.html

diff --git a/doc/compress.html b/doc/compress.html
index c5d0bf6ca..39a0c2a22 100644
--- a/doc/compress.html
+++ b/doc/compress.html
@@ -129,6 +129,7 @@
           <option value="http://codemirror.net/mode/eiffel/eiffel.js">eiffel.js</option>
           <option value="http://codemirror.net/mode/elm/elm.js">eml.js</option>
           <option value="http://codemirror.net/mode/erlang/erlang.js">erlang.js</option>
+          <option value="http://codemirror.net/mode/factor/factor.js">factor.js</option>
           <option value="http://codemirror.net/mode/forth/forth.js">forth.js</option>
           <option value="http://codemirror.net/mode/fortran/fortran.js">fortran.js</option>
           <option value="http://codemirror.net/mode/gfm/gfm.js">gfm.js</option>
diff --git a/mode/factor/factor.js b/mode/factor/factor.js
new file mode 100644
index 000000000..86d7adf62
--- /dev/null
+++ b/mode/factor/factor.js
@@ -0,0 +1,83 @@
+// CodeMirror, copyright (c) by Marijn Haverbeke and others
+// Distributed under an MIT license: http://codemirror.net/LICENSE
+
+// Factor syntax highlight - simple mode
+//
+// by Dimage Sapelkin (https://github.com/kerabromsmu)
+
+(function(mod) {
+  if (typeof exports == "object" && typeof module == "object") // CommonJS
+    mod(require("../../lib/codemirror"), require("../../addon/mode/simple"));
+  else if (typeof define == "function" && define.amd) // AMD
+    define(["../../lib/codemirror", "../../addon/mode/simple"], mod);
+  else // Plain browser env
+    mod(CodeMirror);
+})(function(CodeMirror) {
+  "use strict";
+
+  CodeMirror.defineSimpleMode("factor", {
+    // The start state contains the rules that are intially used
+    start: [
+      // comments
+      {regex: /#?!.*/, token: "comment"},
+      // strings """, multiline --> state
+      {regex: /"""/, token: "string", next: "string3"},
+      {regex: /"/, token: "string", next: "string"},
+      // numbers: dec, hex, unicode, bin, fractional, complex
+      {regex: /(?:[+-]?)(?:0x[\d,a-f]+)|(?:0o[0-7]+)|(?:0b[0,1]+)|(?:\d+.?\d*)/, token: "number"},
+      //{regex: /[+-]?/} //fractional
+      // definition: defining word, defined word, etc
+      {regex: /(\:)(\s+)(\S+)(\s+)(\()/, token: ["keyword", null, "def", null, "keyword"], next: "stack"},
+      // vocabulary using --> state
+      {regex: /USING\:/, token: "keyword", next: "vocabulary"},
+      // vocabulary definition/use
+      {regex: /(USE\:|IN\:)(\s+)(\S+)/, token: ["keyword", null, "variable-2"]},
+      // <constructors>
+      {regex: /<\S+>/, token: "builtin"},
+      // "keywords", incl. ; t f . [ ] { } defining words
+      {regex: /;|t|f|if|\.|\[|\]|\{|\}|MAIN:/, token: "keyword"},
+      // any id (?)
+      {regex: /\S+/, token: "variable"},
+
+      {
+        regex: /./,
+        token: null
+      }
+    ],
+    vocabulary: [
+      {regex: /;/, token: "keyword", next: "start"},
+      {regex: /\S+/, token: "variable-2"},
+      {
+        regex: /./,
+        token: null
+      }
+    ],
+    string: [
+      {regex: /(?:[^\\]|\\.)*?"/, token: "string", next: "start"},
+      {regex: /.*/, token: "string"}
+    ],
+    string3: [
+      {regex: /(?:[^\\]|\\.)*?"""/, token: "string", next: "start"},
+      {regex: /.*/, token: "string"}
+    ],
+    stack: [
+      {regex: /\)/, token: "meta", next: "start"},
+      {regex: /--/, token: "meta"},
+      {regex: /\S+/, token: "variable-3"},
+      {
+        regex: /./,
+        token: null
+      }
+    ],
+    // The meta property contains global information about the mode. It
+    // can contain properties like lineComment, which are supported by
+    // all modes, and also directives like dontIndentStates, which are
+    // specific to simple modes.
+    meta: {
+      dontIndentStates: ["start", "vocabulary", "string", "string3", "stack"],
+      lineComment: [ "!", "#!" ]
+    }
+  });
+
+  CodeMirror.defineMIME("text/x-factor", "factor");
+});
diff --git a/mode/factor/index.html b/mode/factor/index.html
new file mode 100644
index 000000000..9f1548914
--- /dev/null
+++ b/mode/factor/index.html
@@ -0,0 +1,77 @@
+<!doctype html>
+
+<title>CodeMirror: Factor mode</title>
+<meta charset="utf-8"/>
+<link rel=stylesheet href="../../doc/docs.css">
+
+<link href='http://fonts.googleapis.com/css?family=Droid+Sans+Mono' rel='stylesheet' type='text/css'>
+<link rel="stylesheet" href="../../lib/codemirror.css">
+<script src="../../lib/codemirror.js"></script>
+<script src="../../addon/mode/simple.js"></script>
+<script src="factor.js"></script>
+<style>
+.CodeMirror {
+    font-family: 'Droid Sans Mono', monospace;
+    font-size: 14px;
+}
+</style>
+<div id=nav>
+  <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>
+
+  <ul>
+    <li><a href="../../index.html">Home</a>
+    <li><a href="../../doc/manual.html">Manual</a>
+    <li><a href="https://github.com/codemirror/codemirror">Code</a>
+  </ul>
+  <ul>
+    <li><a href="../index.html">Language modes</a>
+    <li><a class=active href="#">Factor</a>
+  </ul>
+</div>
+
+<article>
+
+<h2>Factor mode</h2>
+
+<form><textarea id="code" name="code">
+! Copyright (C) 2008 Slava Pestov.
+! See http://factorcode.org/license.txt for BSD license.
+
+! A simple time server
+
+USING: accessors calendar calendar.format io io.encodings.ascii
+io.servers kernel threads ;
+IN: time-server
+
+: handle-time-client ( -- )
+    now timestamp>rfc822 print ;
+
+: <time-server> ( -- threaded-server )
+    ascii <threaded-server>
+        "time-server" >>name
+        1234 >>insecure
+        [ handle-time-client ] >>handler ;
+
+: start-time-server ( -- )
+    <time-server> start-server drop ;
+
+MAIN: start-time-server
+</textarea>
+  </form>
+
+<script>
+  var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
+    lineNumbers: true,
+    lineWrapping: true,
+    indentUnit: 2,
+    tabSize: 2,
+    autofocus: true,
+    mode: "text/x-factor"
+  });
+</script>
+<p/>
+<p>Simple mode that handles Factor Syntax (<a href="http://en.wikipedia.org/wiki/Factor_(programming_language)">Factor on WikiPedia</a>).</p>
+
+<p><strong>MIME types defined:</strong> <code>text/x-factor</code>.</p>
+
+</article>
diff --git a/mode/index.html b/mode/index.html
index e39561fb7..81b9b3b44 100644
--- a/mode/index.html
+++ b/mode/index.html
@@ -54,6 +54,7 @@ option.</p>
       <li><a href="eiffel/index.html">Eiffel</a></li>
       <li><a href="elm/index.html">Elm</a></li>
       <li><a href="erlang/index.html">Erlang</a></li>
+      <li><a href="factor/index.html">Factor</a></li>
       <li><a href="forth/index.html">Forth</a></li>
       <li><a href="fortran/index.html">Fortran</a></li>
       <li><a href="mllike/index.html">F#</a></li>
diff --git a/mode/meta.js b/mode/meta.js
index 00e32d866..b2f30c24d 100644
--- a/mode/meta.js
+++ b/mode/meta.js
@@ -42,6 +42,7 @@
     {name: "Embedded Javascript", mime: "application/x-ejs", mode: "htmlembedded", ext: ["ejs"]},
     {name: "Embedded Ruby", mime: "application/x-erb", mode: "htmlembedded", ext: ["erb"]},
     {name: "Erlang", mime: "text/x-erlang", mode: "erlang", ext: ["erl"]},
+    {name: "Factor", mime: "text/x-factor", mode: "factor", ext: ["factor"]},
     {name: "Forth", mime: "text/x-forth", mode: "forth", ext: ["forth", "fth", "4th"]},
     {name: "Fortran", mime: "text/x-fortran", mode: "fortran", ext: ["f", "for", "f77", "f90"]},
     {name: "F#", mime: "text/x-fsharp", mode: "mllike", ext: ["fs"], alias: ["fsharp"]},
-- 
GitLab