summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorhallgren <hallgren@chalmers.se>2013-04-18 13:11:46 +0000
committerhallgren <hallgren@chalmers.se>2013-04-18 13:11:46 +0000
commitff691dee7b0dfa3ea87952d41b61a7e552b67bac (patch)
tree5a1fa5ba69d0eb2999fffdad8fca5b01431bb4ca /src
parent5f35a59b95a85db3255dca8c163dcdbb7b15c1d2 (diff)
simple translator: improved translation with the GF robust parser
by separate punctuation from the string sent to the robust parser. Also added buttons to view parse trees from the robust parser.
Diffstat (limited to 'src')
-rw-r--r--src/www/translator/translator.js80
1 files changed, 54 insertions, 26 deletions
diff --git a/src/www/translator/translator.js b/src/www/translator/translator.js
index 7d766258d..9f056ff52 100644
--- a/src/www/translator/translator.js
+++ b/src/www/translator/translator.js
@@ -203,22 +203,24 @@ Translator.prototype.update_translation=function(i) {
upd3(["[Apertium does not support "+show_translation(o)+"]"])
}
function update_gfrobust_translation() {
- function upd3(txts) { update_segment("GFRobust",txts) }
- function upd2(ts) {
+ function upd3s(txt) { update_segment("GFRobust",[txt]) }
+ function upd2(ts,punct) {
switch(ts.length) {
- case 0: upd3(["[no translation]"]);break;
- default: mapc(unlextext,[ts],upd3); break;
+ case 0: upd3s("[no translation]");break;
+ default:
+ if(punct) ts=ts+" "+punct
+ unlextext(ts,upd3s);
}
}
- function upd1(translate_output) {
- //console.log(translate_output)
- upd2(translate_output)
- }
- function upd0(source) {
+ function upd0(source,punct) {
+ function upd1(translate_output) {
+ //console.log(translate_output)
+ upd2(translate_output,punct)
+ }
gfrobust.translate(source,o.to,upd1)
}
if(!window.gfrobust)
- upd3(["[GF robust parser is not available]"])
+ upd3s("[GF robust parser is not available]")
else {
function check_support(ssupport,tsupport) {
var fls=ssupport(o.from)
@@ -227,7 +229,7 @@ Translator.prototype.update_translation=function(i) {
var want={from:o.from, to:o.to, method:"GFRobust"}
if(!eq_options(segment.options,want)) {
//console.log("Updating "+i)
- lextext(segment.source,upd0)
+ lexgfrobust(segment.source,upd0)
//upd0(segment.source)
}
//else console.log("No update ",want,segment.options)
@@ -238,7 +240,7 @@ Translator.prototype.update_translation=function(i) {
var msg="The GF robust translation service: not supported:"
if(!fls) msg+=fn+(tls ? "." : ", ")
if(!tls) msg+=tn+"."
- upd3(["["+msg+"]"])
+ upd3s("["+msg+"]")
}
}
gfrobust.get_support(check_support)
@@ -283,9 +285,7 @@ Translator.prototype.update_translation=function(i) {
}
}
- var m= ss[i].options.method || doc.options.method
- var d=ss[i].use_default
- if(d || d==null) m=doc.options.method
+ var m=segment_method(doc,ss[i])
switch(m) {
case "Manual": /* Nothing to do */ break;
case "Apertium": update_apertium_translation(); break;
@@ -300,14 +300,6 @@ 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
- return /\.pgf$/.test(m) ? m : null
-}
-
Translator.prototype.add_apertium=function() {
var dl=element("methods")
if(dl) add_apertium_to_menu(dl,bind(this.change,this))
@@ -973,9 +965,21 @@ Translator.prototype.draw_segment_given_target=function(s,target,i) {
wrap_class("dl","popupmenu",
[insertB,removeB])]))
}
- var source=wrap_class("td","source",text(s.source))
+ var txt=wrap("span",text(s.source))
+ var source=wrap_class("td","source",txt)
if(!t.document.globalsight)
- source.onclick=function() { t.edit_source(source,i); }
+ txt.onclick=function() { t.edit_source(source,i); }
+ if(window.gfrobust && segment_method(t.document,s)=="GFRobust") {
+ function add_button(src) {
+ var btn=img("../minibar/tree-btn.png")
+ btn.className="right"
+ btn.other=gfrobust.parsetree_url(src)
+ btn.title="Click to toggle parse tree view."
+ btn.onclick=function() { toggle_img(btn) }
+ source.appendChild(btn)
+ }
+ lexgfrobust(s.source,add_button)
+ }
var options=wrap_class("td","options",draw_options())
return node("tr",{"class":"segment",id:i},[actions,source,options,target])
@@ -1000,6 +1004,20 @@ function set_manual(segment) {
segment.use_default=false
}
+// Return the name of the grammar if the segment uses GF for translation
+function uses_gf(doc,segment) {
+ var m= segment_method(doc,segment)
+ return /\.pgf$/.test(m) ? m : null
+}
+
+// Return the translation method use by a segment
+function segment_method(doc,segment) {
+ var m= segment.options.method || doc.options.method
+ var d=segment.use_default
+ if(d || d==null) m=doc.options.method
+ return m
+}
+
/* -------------------------------------------------------------------------- */
function draw_translation(o) { return text(show_translation(o)) }
@@ -1174,7 +1192,17 @@ function save_in_cloud(filename,document,cont) {
function unlextext(txt,cont) { gfshell('ps -bind -unlextext "'+txt+'"',cont) }
function lextext(txt,cont) { gfshell('ps -lextext "'+txt+'"',cont) }
-
+// Like lextext, but separate punctuation from the end
+function lexgfrobust(txt,cont) {
+ function rmpunct(txt) {
+ var ts=gf_lex(txt)
+ var n=ts.length
+ var punct=""
+ if(n>0 && /[.?!]/.test(ts[n-1])) { punct=ts[n-1]; ts.pop()}
+ cont(gf_unlex(ts),punct)
+ }
+ lextext(txt,rmpunct)
+}
/* --- DOM Support ---------------------------------------------------------- */