mirror of
https://github.com/GrammaticalFramework/gf-core.git
synced 2026-04-26 13:02:50 -06:00
The editor needs to keep track of both the raw term and the nice term returned by exprToAPI. (Manually constructed linearization rules will now have the raw term and can not be tested.) Also replace metavariables in generalized terms with the apropriate parameter from the linearization rule. Also fix communication problems caused by inconsistent use of show/read vs showExpr/readExpr.
158 lines
4.1 KiB
JavaScript
158 lines
4.1 KiB
JavaScript
|
|
var example_based=[];
|
|
|
|
/*
|
|
-- cat lincat fun lin fun cat cat
|
|
environ :: ([(CId, CId)],[(CId, Expr)],[((CId, CId), [CId])]) -> Environ
|
|
*/
|
|
function exb_state(g,ci) {
|
|
var conc=g.concretes[ci]
|
|
function show_list(show1,xs) {
|
|
return "["+map(show1,xs).join(",")+"]";
|
|
}
|
|
function show_fun(fun) {
|
|
var t=fun.type
|
|
var res=t[t.length-1]
|
|
var args=t.slice(0,length-1);
|
|
return "(("+fun.name+","+res+"),["+args.join(",")+"])"
|
|
}
|
|
function show_lincat(lincat) {
|
|
return "("+lincat.cat+","+lincat.type+")"
|
|
}
|
|
function show_lin(lin) {
|
|
return "("+lin.fun+","+(lin.eb_lin||"?")+")"
|
|
}
|
|
function show_funs(funs) { return show_list(show_fun,funs) }
|
|
function show_lincats(lincats) { return show_list(show_lincat,lincats); }
|
|
function show_lins(lins) { return show_list(show_lin,lins) }
|
|
return "("+show_lincats(conc.lincats)
|
|
+","+show_lins(conc.lins)
|
|
+","+show_funs(g.abstract.funs)+")"
|
|
}
|
|
|
|
function exb_call(g,ci,command,args,cont) {
|
|
var url="exb/exb.fcgi?command="+command+"&state="+exb_state(g,ci);
|
|
for(var arg in args) url+="&"+arg+"="+encodeURIComponent(args[arg]);
|
|
http_get_json(url,cont)
|
|
}
|
|
|
|
function ask_possibilities(g,ci) {
|
|
var conc=g.concretes[ci];
|
|
|
|
function show_poss(poss) {
|
|
//debug("possibilities: "+JSON.stringify(poss))
|
|
var exready={}
|
|
for(var i in poss[0]) exready[poss[0][i]]=true;
|
|
var testable={}
|
|
for(var i in poss[1]) testable[poss[1][i]]=true;
|
|
example_based[ci]={exready:exready,testable:testable}
|
|
conc.example_based=true;
|
|
conc.example_lang=g.concretes[0].langcode;
|
|
reload_grammar(g);
|
|
}
|
|
|
|
exb_call(g,ci,"possibilities",{},show_poss)
|
|
}
|
|
|
|
function exb_extra(g,ci) {
|
|
var conc=g.concretes[ci];
|
|
function stop_exb() {
|
|
conc.example_based=false;
|
|
reload_grammar(g);
|
|
}
|
|
|
|
function exblangmenu() {
|
|
function opt(conc) { return option(conc.langcode,conc.langcode); }
|
|
// skip target language
|
|
var m =node("select",{},map(opt,g.concretes));
|
|
m.onchange=function() { conc.example_lang=m.value }
|
|
return m
|
|
}
|
|
|
|
function ask_poss() { ask_possibilities(g,ci) }
|
|
|
|
if(navigator.onLine && conc.example_based && !example_based[ci]) ask_poss();
|
|
return conc.langcode=="Eng"
|
|
? indent([text("Example based editing: "),
|
|
conc.example_based
|
|
? node("span",{},[button("Stop",stop_exb),
|
|
text(" Example language: "),
|
|
exblangmenu()
|
|
])
|
|
: button("Start",ask_poss)])
|
|
: text("")
|
|
}
|
|
|
|
function exb_linbuttons(g,ci,f) {
|
|
var conc=g.concretes[ci];
|
|
var fun=f.fun;
|
|
var eb=example_based[ci];
|
|
var exb_output;
|
|
function fill_example(maybetree) {
|
|
var tree=maybetree.Just
|
|
if(tree) {
|
|
if(f.template)
|
|
conc.lins.push({fun:f.fun,args:f.args,
|
|
lin:tree[0],eb_lin:tree[1]});
|
|
else {
|
|
f.lin=tree[0];
|
|
f.eb_lin=tree[1];
|
|
}
|
|
ask_possibilities(g,ci)
|
|
}
|
|
else exb_output.innerHTML="Bug: no tree found"
|
|
}
|
|
function show_example(example){
|
|
exb_output.innerHTML="";
|
|
var s=prompt(example[1]);
|
|
if(s) {
|
|
var t=function_type(g,fun);
|
|
var abscat=t[t.length-1]
|
|
var cat=cat_lincat(conc,abscat)
|
|
exb_output.innerHTML="...";
|
|
//server.parse({from:"ParseEng",cat:cat,input:s},fill_example)
|
|
exb_call(g,ci,"abstract_example",
|
|
{cat:cat,input:s,
|
|
params:"["+f.args.join(",")+"]",
|
|
abstract:example[0]},
|
|
fill_example)
|
|
}
|
|
}
|
|
function by_example() {
|
|
var dir=local.get("dir")
|
|
if(dir) {
|
|
if(exb_output) {
|
|
exb_output.innerHTML="...";
|
|
exb_call(g,ci,"provide_example",
|
|
{lang:g.basename+conc.example_lang,
|
|
fun:fun,
|
|
grammar:"."+dir+"/"+g.basename+".pgf"},
|
|
show_example)
|
|
}
|
|
}
|
|
else exb_output.innerHTML="Compile the grammar first!"
|
|
}
|
|
function show_test(txt) {
|
|
exb_output.innerHTML="";
|
|
exb_output.appendChild(text(txt))
|
|
}
|
|
function test_it(b) {
|
|
if(exb_output) {
|
|
exb_output.innerHTML="...";
|
|
exb_call(g,ci,"test_function",{fun:fun},show_test)
|
|
}
|
|
}
|
|
var buttons=[];
|
|
if(conc.example_based && eb) {
|
|
if(eb.exready[fun])
|
|
buttons.push(button("By example",by_example))
|
|
if(eb.testable[fun]) {
|
|
var b=button("Test it",test_it);
|
|
buttons.push(b)
|
|
}
|
|
var exb_output=empty("span");
|
|
buttons.push(exb_output)
|
|
}
|
|
return buttons
|
|
}
|