Skip to content

Commit

Permalink
custom lua mode (wip)
Browse files Browse the repository at this point in the history
  • Loading branch information
pq committed Jun 19, 2018
1 parent c862403 commit 02aa78a
Show file tree
Hide file tree
Showing 4 changed files with 2,161 additions and 1 deletion.
9 changes: 8 additions & 1 deletion app/src/editor.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ import 'brace/keybinding/vim';
import 'brace/keybinding/emacs';

import ace from 'brace';
import CustomLuaMode from './mode/lua';

const langTools = ace.acequire("ace/ext/language_tools");

class Editor extends Component {
Expand Down Expand Up @@ -151,7 +153,12 @@ class Editor extends Component {

const completer = getCompleter(fileName);
if (completer) {
langTools.addCompleter(completer);
// not where this would really happen; just for testing.
const customMode = new CustomLuaMode();
this.refs.ace.editor.getSession().setMode(customMode);

langTools.addCompleter(completer);
//debugger
}

return (
Expand Down
78 changes: 78 additions & 0 deletions app/src/mode/lua.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
/* eslint-disable */
import 'brace/mode/text';
import 'brace/mode/lua';

var WorkerClient = window.ace.acequire("ace/worker/worker_client").WorkerClient;

// relevant conversation: https://github.com/securingsincity/react-ace/issues/126
export class CustomHighlightRules extends window.ace.acequire("ace/mode/lua_highlight_rules").LuaHighlightRules {
constructor() {
super();

// not really but just to test contrib.
this.$keywordList.push("norns")

// incomplete, and just for testsing.
const builtinFunctions =
'key|enc|init';

// subset of bitwise ops for testing.
// ultimately not what we really care about since parsing is the real issue.
const operators =
'>>|<<';

const luaHighlightRules = this.getRules();

// also just for testing.
this.$rules = {
...luaHighlightRules,
start: [
...luaHighlightRules.start,
{
token: 'keyword.operator',
regex: operators,
},
{

}
],
};
console.log(this.$rules);

this.normalizeRules();

// debugger
}
}

export default class CustomLuaMode extends window.ace.acequire('ace/mode/lua').Mode {
constructor() {
super();
this.HighlightRules = CustomHighlightRules;

// TODO (pq): not working

// this.createWorker = function(session) {
// debugger
// // var worker = new WorkerClient(["ace"], "ace/mode/lua_worker", "Worker");

// //https://github.com/ajaxorg/ace/wiki/Syntax-validation

// var worker = new WorkerClient(["."], "lua_worker", "Worker");
// worker.attachToDocument(session.getDocument());

// worker.on("annotate", function(e) {
// session.setAnnotations(e.data);
// });

// worker.on("terminate", function() {
// session.clearAnnotations();
// });

// return worker;
// }

// required?
// this.$id = "ace/mode/lua";
}
}
82 changes: 82 additions & 0 deletions app/src/mode/lua_worker.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
/* eslint-disable */

/* ***** BEGIN LICENSE BLOCK *****
* Distributed under the BSD license:
*
* Copyright (c) 2010, Ajax.org B.V.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of Ajax.org B.V. nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* ***** END LICENSE BLOCK ***** */




define(function(require, exports, module) {
"use strict";

// var oop = require("../lib/oop");
// var Mirror = require("../worker/mirror").Mirror;
// var luaparse = require("luaparse");

var oop = window.ace.acequire("ace/lib/oop");
var Mirror = window.ace.acequire("ace/worker/mirror").Mirror;
var luaparse = require("luaparse");

debugger

var Worker = exports.Worker = function(sender) {
Mirror.call(this, sender);
this.setTimeout(500);
};

oop.inherits(Worker, Mirror);

(function() {

this.onUpdate = function() {
var value = this.doc.getValue();
var errors = [];

// var t=Date.now()
try {
luaparse.parse(value);
} catch(e) {
if (e instanceof SyntaxError) {
errors.push({
row: e.line - 1,
column: e.column,
text: e.message,
type: "error"
});
}
}
// console.log( t-Date.now())
this.sender.emit("annotate", errors);
};

}).call(Worker.prototype);

});

Loading

0 comments on commit 02aa78a

Please sign in to comment.