From d10c6bc85fa3a7d1859a65641e46f3f450e12987 Mon Sep 17 00:00:00 2001 From: hallgren Date: Wed, 3 Apr 2013 20:24:57 +0000 Subject: [PATCH] Simple Translation Tool: initial support for editing source segments in the minibar --- src/www/gfse/index.html | 3 +- src/www/gfse/localstorage.js | 29 +----- src/www/gfse/share.html | 3 +- src/www/minibar/minibar.html | 3 +- src/www/minibar/minibar_input.js | 30 ++---- src/www/minibar/minibar_translations.js | 37 ++----- src/www/translator/index.html | 13 ++- src/www/translator/translator.css | 6 ++ src/www/translator/translator.js | 132 +++++++++++++++--------- 9 files changed, 125 insertions(+), 131 deletions(-) diff --git a/src/www/gfse/index.html b/src/www/gfse/index.html index c607b4374..cfa89762d 100644 --- a/src/www/gfse/index.html +++ b/src/www/gfse/index.html @@ -33,12 +33,13 @@ This page does not work without JavaScript.
HTML -Last modified: Tue Nov 20 13:39:47 CET 2012 +Last modified: Wed Apr 3 20:30:24 CEST 2013
About

  
 
+
 
 
 
diff --git a/src/www/gfse/localstorage.js b/src/www/gfse/localstorage.js
index 162b1db3b..11ae0973c 100644
--- a/src/www/gfse/localstorage.js
+++ b/src/www/gfse/localstorage.js
@@ -1,29 +1,4 @@
 
-// Grammars are stored locally in the browser using localStorage.
-// See http://diveintohtml5.info/storage.html
+//Needs ../js/localstorage.js
 
-function supports_html5_storage() {
-  try {
-    return 'localStorage' in window && window['localStorage'] !== null;
-  } catch (e) {
-    return false;
-  }
-}
-
-var local={
-    prefix:"gf.editor.simple.grammar",
-    get: function (name,def) {
-	var id=this.prefix+name
-	return localStorage[id] ? JSON.parse(localStorage[id]) : def;
-    },
-    put: function (name,value) {
-	var id=this.prefix+name;
-	localStorage[id]=JSON.stringify(value);
-    },
-    remove: function(name) {
-	var id=this.prefix+name;
-	localStorage.removeItem(id);
-    },
-    get count() { return this.get("count",0); },
-    set count(v) { this.put("count",v); }
-}
+var local=appLocalStorage("gf.editor.simple.grammar")
diff --git a/src/www/gfse/share.html b/src/www/gfse/share.html
index ff92d2f73..9a5c0bb7c 100644
--- a/src/www/gfse/share.html
+++ b/src/www/gfse/share.html
@@ -13,8 +13,9 @@
 
 
-Last modified: Tue Nov 20 13:39:57 CET 2012 +Last modified: Wed Apr 3 21:53:09 CEST 2013 + diff --git a/src/www/minibar/minibar.html b/src/www/minibar/minibar.html index c729561cd..8c193bd07 100644 --- a/src/www/minibar/minibar.html +++ b/src/www/minibar/minibar.html @@ -27,12 +27,13 @@ & Translator] -HTML Last modified: Fri Nov 23 16:07:35 CET 2012 +HTML Last modified: Wed Apr 3 18:48:06 CEST 2013
+ diff --git a/src/www/minibar/minibar_input.js b/src/www/minibar/minibar_input.js index e2566da7d..be58530e7 100644 --- a/src/www/minibar/minibar_input.js +++ b/src/www/minibar/minibar_input.js @@ -40,7 +40,7 @@ function Input(server,translations,opts) { // Input object constructor var o=options; if(o.initial_grammar && o.initial && o.initial.from && o.initial.input) - t.set_input_for(o.initial_grammar,o.initial.from,o.initial.input) + t.set_input_for(o.initial_grammar,o.initial) } /* --- Input client state initialization --- */ @@ -89,11 +89,12 @@ Input.prototype.change_language=function () { this.add_words(new_input) } -Input.prototype.set_input_for=function(grammar_url,from,new_input) { +Input.prototype.set_input_for=function(grammar_url,initial) { var t=this var local=mi_local(grammar_url) - local.put("from",from) - local.put("current",{from:from,input:new_input}) + local.put("from",initial.from) + local.put("current",{from:initial.from,input:initial.input}) + if(initial.startcat) local.put("startcat",initial.startcat) } Input.prototype.clear_all2=function() { @@ -484,26 +485,7 @@ Input.prototype.browse=function(id,cont) { function mi_local(grammar_url) { - function dummy() { - return { - get: function(name,def) { return def }, - put: function(name,value) { } - } - } - function real() { - var prefix="gf.minibar_input."+grammar_url+"." - return { - get: function (name,def) { - var id=prefix+name - return localStorage[id] ? JSON.parse(localStorage[id]) : def; - }, - put: function (name,value) { - var id=prefix+name; - localStorage[id]=JSON.stringify(value); - } - } - } - return window.localStorage ? real() : dummy() + return appLocalStorage("gf.minibar_input."+grammar_url+".") } diff --git a/src/www/minibar/minibar_translations.js b/src/www/minibar/minibar_translations.js index ffb21972f..ead0f592d 100644 --- a/src/www/minibar/minibar_translations.js +++ b/src/www/minibar/minibar_translations.js @@ -28,6 +28,11 @@ function Translations(server,opts) { var tom=this.to_menu=node("select",{id:"to_menu",multiple:"",size:5},[]); appendChildren(this.menus,[text(" To: "), this.to_menu]) tom.onchange=bind(this.change_language,this); + var o=this.options + if(o.initial_grammar && o.initial_toLangs) { + var local=mt_local(o.initial_grammar); + local.put("toLangs",o.initial_toLangs) + } /* // This seems triggers weird scrolling behavior in Firefox and Chrome: tom.onmouseover=function() { var n=tom.options.length; tom.size=n<12 ? n : 12; } @@ -39,8 +44,9 @@ function Translations(server,opts) { Translations.prototype.change_grammar=function(grammar) { var t=this t.grammar=grammar; - + t.local=mt_local(t.server.current_grammar_url) + update_language_menu(t.to_menu,grammar); insertFirst(t.to_menu,option("All","All")); t.to_menu.value="All"; @@ -263,6 +269,10 @@ Translations.prototype.parsetree_button=function(abs,lang) { /* --- Auxiliary functions -------------------------------------------------- */ +function mt_local(grammar_url) { + return appLocalStorage("gf.minibar_translations."+grammar_url+".") +} + function tree_button(img_url,opt) { var imgs=[tree_icon,img_url+(opt||"&nofun=true"),img_url] var current=0; @@ -283,31 +293,6 @@ function draw_brackets(b) { b.children.map(draw_brackets)) } - -// Access to localStorage, if available -function mt_local(grammar_url) { - function dummy() { - return { - get: function(name,def) { return def }, - put: function(name,value) { } - } - } - function real() { - var prefix="gf.minibar_translations."+grammar_url+"." - return { - get: function (name,def) { - var id=prefix+name - return localStorage[id] ? JSON.parse(localStorage[id]) : def; - }, - put: function (name,value) { - var id=prefix+name; - localStorage[id]=JSON.stringify(value); - } - } - } - return window.localStorage ? real() : dummy() -} - // Convert an array of strings to a set (for quick & easy membership tests) function toSet(a) { var set={} diff --git a/src/www/translator/index.html b/src/www/translator/index.html index 27314d595..7dc696352 100644 --- a/src/www/translator/index.html +++ b/src/www/translator/index.html @@ -3,6 +3,7 @@ Simple Translation Tool + @@ -75,15 +76,23 @@
HMTL -Last modified: Mon Feb 11 16:09:58 CET 2013 +Last modified: Wed Apr 3 20:29:44 CEST 2013
About - + + + + + + + + + diff --git a/src/www/translator/translator.css b/src/www/translator/translator.css index 47a28e8aa..d85c605ab 100644 --- a/src/www/translator/translator.css +++ b/src/www/translator/translator.css @@ -119,3 +119,9 @@ div.overlay > div { box-shadow: 4px 4px 12px rgba(0,0,0,0.33); /*border-radius: 5px;*/ } + +div#minibar { + border: 1px solid black; + padding: 5px; + background: #ccc url("../minibar/brushed-metal.png"); +} diff --git a/src/www/translator/translator.js b/src/www/translator/translator.js index aad6f7e28..2d9a278a1 100644 --- a/src/www/translator/translator.js +++ b/src/www/translator/translator.js @@ -4,11 +4,12 @@ function Translator() { var t=this - t.local=tr_local(); + + t.local=appLocalStorage("gf.translator.") t.view=element("document") t.filebox=element("filebox") if(!supports_html5_storage()) { - var warning=span_class("error",text("It appears that localStorage is unsupported or disabled in this browser. Documents will not be preserved after you leave or reload this page!")) + var warning=span_class("error",text("It appears that localStorage is unsupported or disabled in this browser. Local documents will not be preserved after you leave or reload this page!")) insertAfter(warning,t.view) } if(!supports_local_files()) { @@ -18,6 +19,16 @@ function Translator() { t.servers={}; //The API is stateful, use one pgf_online object per grammar t.grammar_info={}; pgf_online({}).get_grammarlist(bind(t.extend_methods,t)) + + function update_language_menu(t,id) { + var dl=element(id); + clear(dl); + for(var i in languages) { + var l=languages[i] + dl.appendChild(dt(radiobutton(id,l.code,l.name,bind(t.change,t)))) + } + } + update_language_menu(t,"source") update_language_menu(t,"target") if(window.apertium) t.add_apertium() @@ -30,15 +41,6 @@ function Translator() { } } -function update_language_menu(t,id) { - var dl=element(id); - clear(dl); - for(var i in languages) { - var l=languages[i] - dl.appendChild(dt(radiobutton(id,l.code,l.name,bind(t.change,t)))) - } -} - Translator.prototype.redraw=function() { var t=this; if(t.current=="/") t.browse() @@ -67,7 +69,7 @@ Translator.prototype.switch_grammar=function(grammar,cont) { var pgf=t.servers[grammar] if(pgf) pgf.waiting.push(cont) else { - pgf=t.servers[grammar]=pgf_online({}) + pgf=t.servers[grammar]=pgf_online({grammar_list:[grammar]}) pgf.waiting=[cont] function cont2(gr_info) { t.grammar_info[grammar]=gr_info @@ -201,11 +203,9 @@ Translator.prototype.update_translation=function(i) { var server=t.servers[grammar] function upd3(txts) { update_segment(grammar,txts) } function upd2(ts) { - function unlex(txt,cont) { gfshell('ps -unlextext "'+txt+'"',cont) } - switch(ts.length) { case 0: upd3(["[no translation]"]);break; - default: mapc(unlex,ts,upd3); break; + default: mapc(unlextext,ts,upd3); break; } } function upd1(translate_output) { @@ -221,7 +221,7 @@ Translator.prototype.update_translation=function(i) { var want={from:o.from, to:o.to, method:grammar} if(!eq_options(segment.options,want)) { //console.log("Updating "+i) - gfshell('ps -lextext "'+segment.source+'"',upd0) + lextext(segment.source,upd0) } //else console.log("No update ",want,segment.options) } @@ -253,6 +253,18 @@ Translator.prototype.update_translation=function(i) { } } +// Return the name of the grammar if the segment uses GF for translation +function uses_gf(doc,segment) { + var m= segment.options.method || doc.options.method + var d=segment.use_default + if(d || d==null) m=doc.options.method + switch(m) { + case "Manual": return null + case "Apertium": return null + default: return m + } +} + Translator.prototype.add_apertium=function() { var dl=element("methods") if(dl) add_apertium_to_menu(dl,bind(this.change,this)) @@ -688,11 +700,12 @@ Translator.prototype.pick_translation=function(i,txt) { Translator.prototype.edit_source=function(source,i) { var t=this - var s=t.document.segments[i] + var doc=t.document + var s=doc.segments[i] function restore() { t.replace_segment(i,t.draw_segment(s,i)) } - function done() { - s.source=inp.value // side effect, updating the document in-place + function change(str) { + s.source=str // side effect, updating the document in-place restore(); if(s.options.method!="Manual") { s.options.to="" // hack to force an update @@ -700,9 +713,55 @@ Translator.prototype.edit_source=function(source,i) { } return false; } + function done() { change(inp.value) } + + function goto_minibar() { + function cont(grammar_info) { + var gname=grammar_info.name + var gfrom=gname+doc.options.from + var gto=gname+doc.options.to + var pgf_server=t.servers[grammarname] + function cont2(source) { + function ok() { + unlextext(gf_unlex(minibar.input.current.input),change) + t.hide_filebox() + } + function cancel() { + restore() + t.hide_filebox() + } + var minibar_options= { + startcat_menu: false, + random_button: false, + try_google: false, + show_abstract: true, + show_trees: true, + show_grouped_translations: false, + word_replacements: true, + default_source_language: "Eng", + initial_grammar: pgf_server.current_grammar_url, + initial:{from:gfrom, + startcat:grammar_info.startcat, + input:source.split(" ")}, + initial_toLangs: [gto] + } + replaceChildren(t.filebox,empty_id("div","minibar")) + var minibar=new Minibar(pgf_server,minibar_options) + appendChildren(t.filebox,[button("OK",ok), + button("Cancel",cancel)]) + t.show_filebox() + } + lextext(s.source,cont2) + + } + t.switch_grammar(grammarname,cont) + } var inp=node("input",{name:"it",value:s.source}) - var e=wrap("form",[inp, submit(), button("Cancel",restore)]) + var e=wrap("form",[inp, submit(), button("Cancel",restore), + text(" ")]) + var grammarname=uses_gf(doc,s) + if(grammarname) e.appendChild(button("Minibar",goto_minibar)) clear(source) source.appendChild(e) e.onsubmit=done @@ -930,35 +989,6 @@ for(var i in languages) { function concname(code) { return langname[code] || code; } function alangcode(code) { return langcode2[code] || code; } -function tr_local() { - function real(storage) { - var appPrefix="gf.translator." - return { - get: function (name,def) { - var id=appPrefix+name - return storage[id] ? JSON.parse(storage[id]) : def; - }, - put: function (name,value) { - var id=appPrefix+name; - storage[id]=JSON.stringify(value); - }, - remove: function(name) { - var id=appPrefix+name; - delete storage[id] - }, - ls: function(prefix) { - var pre=appPrefix+prefix - var files=[] - for(var i in storage) - if(hasPrefix(i,pre)) files.push(i.substr(pre.length)) - files.sort() - return files - } - } - } - return supports_html5_storage() ? real(localStorage) : real([]) -} - // Collect alternative texts in the output from PGF service translate command function collect_texts(ts) { var list=[] @@ -1096,6 +1126,10 @@ function save_in_cloud(filename,document,cont) { with_dir(save) } +function unlextext(txt,cont) { gfshell('ps -unlextext "'+txt+'"',cont) } +function lextext(txt,cont) { gfshell('ps -lextext "'+txt+'"',cont) } + + /* --- DOM Support ---------------------------------------------------------- */