summaryrefslogtreecommitdiff
path: root/src/editor/simple/editor.js
diff options
context:
space:
mode:
authorhallgren <hallgren@chalmers.se>2011-05-06 15:24:45 +0000
committerhallgren <hallgren@chalmers.se>2011-05-06 15:24:45 +0000
commitc207175e983bdb10e160310d3285a979dd66b4ea (patch)
treeace49d22eec830ff490efa17e79c7abfdffaba3a /src/editor/simple/editor.js
parenta01d18dd33573fdcdc0f5ddb10be49efb78409d2 (diff)
gfse: you can now add concrete syntax for arbitrary languages
Before, you had to pick a language from a list of supported languages, but now you can also pick Other and change the language code afterwards.
Diffstat (limited to 'src/editor/simple/editor.js')
-rw-r--r--src/editor/simple/editor.js146
1 files changed, 58 insertions, 88 deletions
diff --git a/src/editor/simple/editor.js b/src/editor/simple/editor.js
index d08948be5..f6e47fc5d 100644
--- a/src/editor/simple/editor.js
+++ b/src/editor/simple/editor.js
@@ -142,22 +142,21 @@ function lang1(name) {
}
var languages =
map(lang1,"Amharic Arabic Bulgarian Catalan Danish Dutch English Finnish French German Hindi Ina/Interlingua Italian Latin Norwegian Polish Ron/Romanian Russian Spanish Swedish Thai Turkish Urdu".split(" "));
-//languages.push(lang("Other","Other"));
+languages.push(lang("Other","Other"));
var langname={};
-//for(var i=0;i<languages.length;i++)
for(var i in languages)
langname[languages[i].code]=languages[i].name
+function concname(code) { return langname[code] || code; }
+
function add_concrete(g,el) {
var file=element("file");
file.innerHTML="";
var dc={};
-// for(var i=0;i<g.concretes.length;i++)
for(var i in g.concretes)
dc[g.concretes[i].langcode]=true;
var list=[]
-// for(var i=0;i<languages.length;i++) {
for(var i in languages) {
var l=languages[i], c=l.code;
if(!dc[c])
@@ -165,17 +164,24 @@ function add_concrete(g,el) {
[text(l.name)])]));
}
var from= g.current>0
- ? "a copy of "+langname[g.concretes[g.current-1].langcode]
+ ? "a copy of "+concname(g.concretes[g.current-1].langcode)
:"scratch";
file.appendChild(p(text("You are about to create a new concrete syntax by starting from "+from+".")));
file.appendChild(p(text("Pick a language for the new concrete syntax:")));
- file.appendChild(node("ul",{},list));
+ file.appendChild(node("ul",{class:"languages"},list));
}
function new_concrete(code) {
return { langcode:code,params:[],lincats:[],opers:[],lins:[] };
}
+function adjust_opens(cnc,oldcode,code) {
+ for(var oi in cnc.opens)
+ for(var li in rgl_modules)
+ if(cnc.opens[oi]==rgl_modules[li]+oldcode)
+ cnc.opens[oi]=rgl_modules[li]+code;
+}
+
function add_concrete2(ix,code) {
var g=local.get(ix);
var cs=g.concretes;
@@ -189,10 +195,7 @@ function add_concrete2(ix,code) {
var oldcode=cs[g.current-1].langcode;
var cnc=g.concretes[ci];
cnc.langcode=code;
- for(var oi in cnc.opens)
- for(var li in rgl_modules)
- if(cnc.opens[oi]==rgl_modules[li]+oldcode)
- cnc.opens[oi]=rgl_modules[li]+code;
+ adjust_opens(cnc,oldcode,code);
}
else
cs.push(new_concrete(code))
@@ -216,7 +219,7 @@ function delete_concrete(g,ci) {
var ok=c.params.length==0 && c.lincats.length==0 && c.opers.length==0
&& c.lins.length==0
|| confirm("Do you really want to delete the concrete syntax for "+
- langname[c.langcode]+"?");
+ concname(c.langcode)+"?");
if(ok) {
g.concretes=delete_ix(g.concretes,ci)
if(g.current && g.current-1>=ci) g.current--;
@@ -233,11 +236,10 @@ function draw_filebar(g) {
var cs=g.concretes;
function del(ci) { return function() { delete_concrete(g,ci); }}
function open_conc(i) { return function() {open_concrete(g,1*i); }}
-// for(var i=0;i<cs.length;i++)
for(var i in cs) {
filebar.appendChild(gap());
filebar.appendChild(
- tab(i==cur,deletable(del(i),button(langname[cs[i].langcode],open_conc(i)),"Delete this concrete syntax")));
+ tab(i==cur,deletable(del(i),button(concname(cs[i].langcode),open_conc(i)),"Delete this concrete syntax")));
}
filebar.appendChild(td_gap(more(g,add_concrete,"Add a concrete syntax")));
return wrap_class("table","tabs",filebar);
@@ -384,7 +386,6 @@ function draw_funs(g) {
function draw_efun(i,df) {
return editable("span",draw_fun(funs[i],dc,df),g,edit_fun(i),"Edit this function");
}
-// for(var i=0;i<funs.length;i++) {
for(var i in funs) {
es.push(node_sortable("fun",funs[i].name,[deletable(del(i),draw_efun(i,df),"Delete this function")]));
df[funs[i].name]=true;
@@ -408,7 +409,6 @@ function draw_type(t,dc) {
function check(t,el) {
return ifError(!dc[t],"Undefined category",el);
}
-// for(var i=0;i<t.length;i++) {
for(var i in t) {
if(i>0) el.appendChild(sep(" → "));
el.appendChild(check(t[i],ident(t[i])));
@@ -432,8 +432,21 @@ function edit_name(g,el) {
function draw_concrete(g,i) {
var conc=g.concretes[i];
+ function edit_langcode(g,el) {
+ function change_langcode(code) {
+ var err=check_name(g.basename+code,"Name of concrete syntax");
+ if(err) return err;
+ adjust_opens(conc,conc.langcode,code);
+ conc.langcode=code;
+ reload_grammar(g);
+ }
+ string_editor(el,conc.langcode,change_langcode)
+ }
return div_id("file",
- [kw("concrete "),ident(g.basename+conc.langcode),
+ [kw("concrete "),
+ ident(g.basename),
+ editable("span",ident(conc.langcode),g,
+ edit_langcode,"Change language"),
kw(" of "),ident(g.basename),sep(" = "),
indent([extensible([kw("open "),draw_opens(g,i)])]),
indent([kw("lincat"),draw_lincats(g,i)]),
@@ -570,18 +583,13 @@ function draw_lincats(g,i) {
var conc=g.concretes[i];
function edit(c) {
return function(g,el) {
- function check(s,cont) {
- function check2(msg) {
- if(!msg) {
- if(c.template) conc.lincats.push({cat:c.cat,type:s});
- else c.type=s;
- reload_grammar(g);
- }
- cont(msg);
- }
- check_exp(s,check2);
+ function ok(s) {
+ if(c.template) conc.lincats.push({cat:c.cat,type:s});
+ else c.type=s;
+ reload_grammar(g);
+ return null;
}
- string_editor(el,c.type,check,true)
+ string_editor(el,c.type,ok)
}
}
function del(c) { return function() { delete_lincat(g,i,c); } }
@@ -708,19 +716,14 @@ function draw_lins(g,i) {
var conc=g.concretes[i];
function edit(f) {
return function(g,el) {
- function check(s,cont) {
- function check2(msg) {
- if(!msg) {
- if(f.template)
- conc.lins.push({fun:f.fun,args:f.args,lin:s});
- else f.lin=s;
- reload_grammar(g);
- }
- cont(msg);
- }
- check_exp(s,check2);
+ function ok(s) {
+ if(f.template)
+ conc.lins.push({fun:f.fun,args:f.args,lin:s});
+ else f.lin=s;
+ reload_grammar(g);
+ return null;
}
- string_editor(el,f.lin,check,true)
+ string_editor(el,f.lin,ok)
}
}
function del(fun) { return function () { delete_lin(g,i,fun); } }
@@ -765,55 +768,25 @@ function draw_lins(g,i) {
/* -------------------------------------------------------------------------- */
-function with_dir(cont) {
+function upload(g) {
var dir=local.get("dir","");
- if(/^\/tmp\//.test(dir)) cont(dir);
- else ajax_http_get("/new",
+ if(dir) upload2(g,dir);
+ else ajax_http_get("upload.cgi?dir",
function(dir) {
local.put("dir",dir);
- cont(dir);
+ upload2(g,dir);
});
}
-// Send a command to the GF shell
-function gfshell(cmd,cont) {
- with_dir(function(dir) {
- var enc=encodeURIComponent;
- ajax_http_get("/gfshell?dir="+enc(dir)+"&command="+enc(cmd),cont)
- })
-}
-
-// Check the syntax of an expression
-function check_exp(s,cont) {
- function check(gf_message) {
- debug("cc "+s+" = "+gf_message);
- cont(/parse error/.test(gf_message) ? "parse error" : null);
- }
- gfshell("cc "+s,check);
-}
-
-// Upload the grammar to the server and check it for errors
-function upload(g) {
- function upload2(dir) {
- var form=node("form",{method:"post",action:"/upload"},
- [hidden("dir",dir),hidden(g.basename,show_abstract(g))])
- var files = [g.basename+".gf"]
- for(var i in g.concretes) {
- var cname=g.basename+g.concretes[i].langcode;
- files.push(cname+".gf");
- form.appendChild(hidden(cname,
- show_concrete(g.basename)(g.concretes[i])));
- }
- editor.appendChild(form);
- form.submit();
- form.parentNode.removeChild(form);
- /* wait until upload is done */
- gfshell("i -retain "+files.join(" "),upload3)
- }
-
- function upload3(message) { if(message) alert(message); }
-
- with_dir(upload2)
+function upload2(g,dir) {
+ var form=node("form",{method:"post",action:"upload.cgi"+dir},
+ [hidden(g.basename,show_abstract(g))])
+ for(var i in g.concretes)
+ form.appendChild(hidden(g.basename+g.concretes[i].langcode,
+ show_concrete(g.basename)(g.concretes[i])));
+ editor.appendChild(form);
+ form.submit();
+ form.parentNode.removeChild(form);
}
function hidden(name,value) {
@@ -824,7 +797,6 @@ function hidden(name,value) {
function delete_ix(old,ix) {
var a=[];
-// for(var i=0;i<old.length;i++) if(i!=ix) a.push(old[i]);
for(var i in old) if(i!=ix) a.push(old[i]);
return a;
}
@@ -852,7 +824,7 @@ function sort_list(list,olditems,key) {
}
}
-function string_editor(el,init,ok,async) {
+function string_editor(el,init,ok) {
var p=el.parentNode;
function restore() {
e.parentNode.removeChild(e);
@@ -861,9 +833,8 @@ function string_editor(el,init,ok,async) {
function done() {
var edited=e.it.value;
restore();
- function cont(msg) { if(msg) start(msg); }
- if(async) ok(edited,cont)
- else cont(ok(edited));
+ var msg=ok(edited);
+ if(msg) start(msg);
return false;
}
function start(msg) {
@@ -942,7 +913,6 @@ function touch_edit() {
b.onchange=touch;
insertAfter(b,editor);
insertAfter(wrap("small",text("Enable editing on touch devices. ")),b);
-
}
/* --- Initialization ------------------------------------------------------- */