diff options
| author | john.j.camilleri <john.j.camilleri@chalmers.se> | 2012-11-27 10:09:40 +0000 |
|---|---|---|
| committer | john.j.camilleri <john.j.camilleri@chalmers.se> | 2012-11-27 10:09:40 +0000 |
| commit | b3c1177f9ed5a3eaff378671fa119be1c605498e (patch) | |
| tree | 6c32e5fc86fd45b91a934b8d0fc6da2cf236ab8a /src | |
| parent | def375e58808ea431ef0d786ae0abb9de0a67155 (diff) | |
Syntax editor: improvements and fixes with grammar manager
Diffstat (limited to 'src')
| -rw-r--r-- | src/www/js/grammar_manager.js | 26 | ||||
| -rw-r--r-- | src/www/js/support.js | 21 | ||||
| -rw-r--r-- | src/www/syntax-editor/README.md | 30 | ||||
| -rw-r--r-- | src/www/syntax-editor/ast.js | 6 | ||||
| -rw-r--r-- | src/www/syntax-editor/editor.html | 2 | ||||
| -rw-r--r-- | src/www/syntax-editor/editor.js | 39 | ||||
| -rw-r--r-- | src/www/syntax-editor/editor_menu.js | 12 | ||||
| -rw-r--r-- | src/www/syntax-editor/editor_online.js | 9 |
8 files changed, 65 insertions, 80 deletions
diff --git a/src/www/js/grammar_manager.js b/src/www/js/grammar_manager.js index a2bf3b830..11d13d71c 100644 --- a/src/www/js/grammar_manager.js +++ b/src/www/js/grammar_manager.js @@ -20,7 +20,7 @@ function GrammarManager(server,opts) { this.options = { initial: {} }; - this.hooks = { + this.actions = { onload: [ function(gm){ debug("default action: onload"); } ], @@ -36,13 +36,13 @@ function GrammarManager(server,opts) { } // Apply supplied options -// if(opts) for(var o in opts) this.options[o]=opts[o]; + if(opts) for(var o in opts) this.options[o]=opts[o]; /* --- Client state initialisation -------------------------------------- */ this.server = server; this.grammar = null; // current grammar - // this.grammars=[]; - // this.grammar_dirs=[]; + this.grammars=[]; + this.grammar_dirs=[]; this.startcat = null; // current startcat this.languages = []; // current languages (empty means all langs) @@ -71,17 +71,23 @@ GrammarManager.prototype.onload=function(dir,grammar_names,dir_count) { /* --- Registering / unregistering actions to hooks ------------------------- */ GrammarManager.prototype.register_action=function(hook,action) { - this.hooks[hook].push(action); + var hookring = this.actions[hook]; + hookring.push(action); } GrammarManager.prototype.unregister_action=function(hook,action) { - // TODO! + var hookring = this.actions[hook]; + for (var f=0; f < hookring.length; f++) { + if (hookring[f] == action) { + hookring = Array.remove(hookring, f); + } + } } // Execute actions for a given hook // TODO: any number of arguments GrammarManager.prototype.run_actions=function(hook,arg1,arg2,arg3) { - var acts = this.hooks[hook]; + var acts = this.actions[hook]; for (f in acts) { acts[f](arg1,arg2,arg3); } @@ -147,11 +153,11 @@ GrammarManager.prototype.update_language_list=function(grammar) { // Replace the options in the menu with the languages in the grammar var langs=grammar.languages; for(var i=0; i<langs.length; i++) { - var ln=langs[i].name; + var ln=langs[i].name; // "PhrasebookEng" if(!hasPrefix(ln,"Disamb")) { - var lp=langpart(ln,grammar.name); + var lp=langpart(ln,grammar.name); // "Eng" if (elem(lp, t.options.initial.languages)) { - t.languages.push(ln); // or lp? + t.languages.push(ln); } } } diff --git a/src/www/js/support.js b/src/www/js/support.js index eefda3f8b..47753e768 100644 --- a/src/www/js/support.js +++ b/src/www/js/support.js @@ -22,12 +22,21 @@ if(!Array.isArray) { // Create a clone of an array // http://davidwalsh.name/javascript-clone-array -// Note that iterating over an array with for...in will include "clone" as a key! -// if(!Array.clone) { -// Array.prototype.clone = function() { -// return this.slice(0); -// }; -// } +if(!Array.clone) { + Array.clone = function(arg) { + return arg.slice(0); + }; +} + +// Array Remove - By John Resig (MIT Licensed) +// http://ejohn.org/blog/javascript-array-remove/if(!Array.remove) { +if(!Array.remove) { + Array.remove = function(arg, from, to) { + var rest = arg.slice((to || from) + 1 || arg.length); + arg.length = from < 0 ? arg.length + from : from; + return arg.push.apply(arg, rest); + }; +} /* --- JSONP ---------------------------------------------------------------- */ diff --git a/src/www/syntax-editor/README.md b/src/www/syntax-editor/README.md index 62c7e32cd..8857bc46a 100644 --- a/src/www/syntax-editor/README.md +++ b/src/www/syntax-editor/README.md @@ -13,21 +13,21 @@ An improved version of the [old syntax editor][1]. ## Available startup options - var editor_options = { - target: "editor", - initial: { - grammar: "http://localhost:41296/grammars/Foods.pgf", - startcat: "Kind", - languages: ["Eng","Swe","Mlt"], - abstr: "Pred (That Fish) Expensive" - }, - show: { - grammar_menu: true, - startcat_menu: true, - to_menu: true, - random_button: true - } - } +|Options|Description|Default| +|:------|:----------|:------| +|target | |"editor"| +|initial.grammar|Initial grammar URL, e.g. `"http://localhost:41296/grammars/Foods.pgf"`|-| +|initial.startcat|Initial startcat|-| +|initial.languages|Initial linearisation languages, e.g. `["Eng","Swe","Mlt"]`|-| +|initial.abstr|Initial abstract tree (as string), e.g. `"Pred (That Fish) Expensive"`|-| +|show.grammar_menu|Show grammar menu?|true| +|show.startcat_menu|Show start category menu?|true| +|show.to_menu|Show languages menu?|true| +|show.random_button|Show random button?|true| + +## Example usage + +See `editor.html` and `editor_online.js`. ## TODO diff --git a/src/www/syntax-editor/ast.js b/src/www/syntax-editor/ast.js index 143b9836c..2cad53600 100644 --- a/src/www/syntax-editor/ast.js +++ b/src/www/syntax-editor/ast.js @@ -8,7 +8,7 @@ function NodeID(x) { switch (typeof x) { case "number": this.id = [x]; break; case "string": this.id = map(function(s){return parseInt(s)}, x.split(",")); break; - case "object": this.id = x.get().slice(); break; // another NodeID + case "object": this.id = Array.clone(x.get()); break; // another NodeID } } @@ -101,7 +101,7 @@ function AST(fun, cat) { // set tree at given id this._setSubtree = function(id, subtree) { - var lid = id.get().slice(); // clone NodeID array + var lid = Array.clone(id.get()); // clone NodeID array var node = this.root; if (lid.length==1) @@ -124,7 +124,7 @@ function AST(fun, cat) { switch (typeof id) { case "number": lid = [id]; break; case "string": lid = id.split(","); break; - case "object": lid = id.get().slice(); break; // clone NodeID array + case "object": lid = Array.clone(id.get()); break; // clone NodeID array } var node = this.root; if (lid[0] == 0) lid.shift(); diff --git a/src/www/syntax-editor/editor.html b/src/www/syntax-editor/editor.html index 403b4bbeb..8105df60d 100644 --- a/src/www/syntax-editor/editor.html +++ b/src/www/syntax-editor/editor.html @@ -11,7 +11,7 @@ <h2>Syntax Editor</h2> <div id="minibar"></div> <div id="editor"></div> - <noscript>This page doesn't works unless JavaScript is enabled.</noscript> + <noscript>This page doesn't work unless JavaScript is enabled.</noscript> <hr /> <small class="modtime"> diff --git a/src/www/syntax-editor/editor.js b/src/www/syntax-editor/editor.js index 031a461a2..41360c53f 100644 --- a/src/www/syntax-editor/editor.js +++ b/src/www/syntax-editor/editor.js @@ -1,20 +1,4 @@ /* --- Main Editor object --------------------------------------------------- */ -/* When creating the object, stuff gets called in this order: -new EditorMenu - server.get_grammarlists - EditorMenu.show_grammarlist - EditorMenu.change_grammar - server.switch_to_other_grammar - server.get_grammar_info - EditorMenu.update_startcat_menu - EditorMenu.update_language_menu - Editor.change_grammar - Editor.get_grammar_constructors - Editor.start_fresh - Editor.update_current_node(); - Editor.redraw_tree(); - Editor.get_refinements(); -*/ function Editor(gm,opts) { var t = this; /* --- Configuration ---------------------------------------------------- */ @@ -64,11 +48,6 @@ function Editor(gm,opts) { /* --- Register Grammar Manager hooks ----------------------------------- */ this.gm.register_action("change_grammar",function(grammar){ debug("Editor: change grammar"); - var startcat0 = t.options.initial.startcat; - if (elem(startcat0, grammar.categories)) - t.startcat = startcat0; - else - t.startcat = null; t.get_grammar_constructors(bind(t.start_fresh,t)); }); this.gm.register_action("change_startcat",function(startcat){ @@ -124,19 +103,19 @@ Editor.prototype.get_startcat=function() { } // TODO -Editor.prototype.initialize_from=function(opts) { - var t=this; - if (opts.startcat) - t.options.initial_startcat=opts.startcat; - t.change_grammar(); - if (opts.abstr) - t.import_ast(opts.abstr); -} +// Editor.prototype.initialize_from=function(opts) { +// var t=this; +// if (opts.startcat) +// t.options.initial_startcat=opts.startcat; +// t.change_grammar(); +// if (opts.abstr) +// t.import_ast(opts.abstr); +// } // Called after changing grammar or startcat Editor.prototype.start_fresh=function () { var t = this; - t.ast = new AST(null, t.get_startcat()); + t.ast = new AST(null, t.get_startcat()); if (t.options.initial.abstr) { t.import_ast(t.options.initial.abstr); } diff --git a/src/www/syntax-editor/editor_menu.js b/src/www/syntax-editor/editor_menu.js index e207133e7..31927a26e 100644 --- a/src/www/syntax-editor/editor_menu.js +++ b/src/www/syntax-editor/editor_menu.js @@ -107,7 +107,7 @@ EditorMenu.prototype.hook_onload=function(dir,grammar_names,dir_count) { appendChildren(t.ui.grammar_menu, map(opt, grammar_names)); function pick_first_grammar() { if(t.timeout) clearTimeout(t.timeout),t.timeout=null; - var grammar0=t.options.initial.grammar; + var grammar0=t.gm.options.initial.grammar; if(!grammar0) grammar0=t.grammars[0]; t.ui.grammar_menu.value=grammar0; // t.change_grammar(); @@ -139,16 +139,11 @@ EditorMenu.prototype.update_startcat_menu=function(grammar) { menu.innerHTML=""; var cats=grammar.categories; for(var cat in cats) menu.appendChild(option(cats[cat],cats[cat])) -// var startcat=this.local.get("startcat") || grammar.startcat; - var startcat0 = t.options.initial.startcat; + var startcat0 = t.gm.options.initial.startcat; if (elem(startcat0, cats)) menu.value = startcat0; else menu.value = grammar.startcat; - // else { - // insertFirst(menu,option("Default","")); - // menu.value=""; - // } } /* --- Langugage (to) menu -------------------------------------------------- */ @@ -168,9 +163,8 @@ EditorMenu.prototype.update_language_menu=function(menu,grammar) { if(!hasPrefix(ln,"Disamb")) { var lp=langpart(ln,grammar.name); var opt=option(lp,ln); - if (elem(lp, t.options.initial.languages)) { + if (elem(lp, t.gm.options.initial.languages)) { opt.selected=true; - t.editor.languages.push(opt.value); } menu.appendChild(opt); } diff --git a/src/www/syntax-editor/editor_online.js b/src/www/syntax-editor/editor_online.js index 5ca81c9fa..56e8a9de3 100644 --- a/src/www/syntax-editor/editor_online.js +++ b/src/www/syntax-editor/editor_online.js @@ -4,12 +4,9 @@ var server_options = { } var editor_options = { target: "editor", - // initial: { - // grammar: "http://localhost:41296/grammars/Phrasebook.pgf", - // startcat: "Proposition", - // languages: ["Eng","Swe","Ita"], - // abstr: "PropOpenDate (SuperlPlace TheMostExpensive School) Tomorrow" - // }, + initial: { +// abstr: "PropOpenDate (SuperlPlace TheMostExpensive School) Tomorrow" + }, show: { grammar_menu: true, startcat_menu: true, |
