summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorhallgren <hallgren@chalmers.se>2012-06-12 15:36:41 +0000
committerhallgren <hallgren@chalmers.se>2012-06-12 15:36:41 +0000
commitcc58e2d05f75710f018efd5e026686146e9b4b9d (patch)
tree349e8de32361f4ce29e9bce403755a5210bd51fb /src
parent3af1dbde67678f8b1e98886e7bd84adb440f9dfd (diff)
translator: documents can now be saved in the cloud
some other small fixes
Diffstat (limited to 'src')
-rw-r--r--src/compiler/GFServer.hs6
-rw-r--r--src/www/gfse/gf_abs.js2
-rw-r--r--src/www/translator/about.html8
-rw-r--r--src/www/translator/index.html3
-rw-r--r--src/www/translator/translator.js109
5 files changed, 97 insertions, 31 deletions
diff --git a/src/compiler/GFServer.hs b/src/compiler/GFServer.hs
index ee7b7326f..5b3c0d58f 100644
--- a/src/compiler/GFServer.hs
+++ b/src/compiler/GFServer.hs
@@ -165,7 +165,7 @@ handle state0 cache execute1
case cmd of
"make" -> make dir qs
"upload" -> upload qs
- "ls" -> jsonList
+ "ls" -> jsonList (maybe ".json" id $ lookup "ext" qs)
"rm" -> look "file" rm qs
"download" -> look "file" download qs
"link_directories" -> look "newdir" (link_directories dir) qs
@@ -183,8 +183,8 @@ handle state0 cache execute1
do mapM_ (uncurry updateFile) files
return (state,resp204)
- jsonList =
- do jsons <- ls_ext "." ".json"
+ jsonList ext =
+ do jsons <- ls_ext "." ext
return (state,json200 jsons)
rm path _ | takeExtension path==".json" =
diff --git a/src/www/gfse/gf_abs.js b/src/www/gfse/gf_abs.js
index e49837b7a..30f852196 100644
--- a/src/www/gfse/gf_abs.js
+++ b/src/www/gfse/gf_abs.js
@@ -216,7 +216,7 @@ function parse_oper(s) {
}
-/* --- Print as plain text (normal GF source syntax) ------------------------- */
+/* --- Print as plain text (normal GF source syntax) ------------------------ */
function show_type(t) {
var s="";
diff --git a/src/www/translator/about.html b/src/www/translator/about.html
index 4e24780da..b5d17f11e 100644
--- a/src/www/translator/about.html
+++ b/src/www/translator/about.html
@@ -33,8 +33,8 @@ grammar to use from a menu of available grammars. Through menu options,
the user also sets the source and target language for the document.
<p>
-The tool handles a set of documents. Documents can be named, saved (locally),
-closed and reopened later.
+The tool handles a set of documents. Documents can be named, saved,
+closed and reopened later. Documents can be saved locally or in the cloud.
<h2>TODO</h2>
<ul>
@@ -43,7 +43,7 @@ closed and reopened later.
<li>GF's lexer/unlexer is used to allow for more natural looking text, but
the unlexer does the wrong thing if the first word of a sentence is supposed
to be capitalized, e.g. "I am ready." and "Spanish wine is good."
- <li>Cloud service.
+ <li>Document sharing in the cloud.
<li>Interface to other translation services.
<li>Interface to the grammar editor for grammar extension.
<li>More browser compatibility testing (Chrome, Firefox &amp; Safari tested
@@ -55,7 +55,7 @@ closed and reopened later.
<hr>
<div class=modtime><small>
-<!-- hhmts start --> Last modified: Mon Jun 11 17:25:39 CEST 2012 <!-- hhmts end -->
+<!-- hhmts start --> Last modified: Tue Jun 12 17:32:46 CEST 2012 <!-- hhmts end -->
</small></div>
<address>
<a href="http://www.cse.chalmers.se/~hallgren/">TH</a>
diff --git a/src/www/translator/index.html b/src/www/translator/index.html
index dde471a0d..03264ebd5 100644
--- a/src/www/translator/index.html
+++ b/src/www/translator/index.html
@@ -58,6 +58,7 @@
<dt><label><input name=method value=Manual type=radio onchange="translator.change(this)">Manual</label>
</dl>
</table>
+ <dt><label><input name=cloud type=checkbox onchange="translator.change(this)"> Save in the cloud</label>
</dl>
</table>
</form>
@@ -70,7 +71,7 @@
</div>
<hr>
<div class=modtime><small>HMTL
-<!-- hhmts start --> Last modified: Sat May 26 13:23:57 CEST 2012 <!-- hhmts end -->
+<!-- hhmts start --> Last modified: Tue Jun 12 16:08:01 CEST 2012 <!-- hhmts end -->
</small></div>
<a href="about.html">About</a>
diff --git a/src/www/translator/translator.js b/src/www/translator/translator.js
index 4335ae19a..04c5b19f3 100644
--- a/src/www/translator/translator.js
+++ b/src/www/translator/translator.js
@@ -39,6 +39,7 @@ Translator.prototype.redraw=function() {
update_radiobutton("source",o.from)
update_radiobutton("target",o.to)
update_radiobutton("view",o.view || "segmentbysegment")
+ update_checkbox("cloud",o.cloud || false)
if(o.method!="Manual") {
function cont2(gr_info) {
t.grammar_info=gr_info
@@ -148,11 +149,18 @@ Translator.prototype.change=function(el) {
t.redraw()
}
}
+ function update_checkbox(field) {
+ if(el.checked!=o[field]) {
+ o[field]=el.checked
+ t.redraw()
+ }
+ }
switch(el.name) {
case "method": update("method"); break;
case "source": update("from"); break;
case "target": update("to"); break;
- case "view": update("view"); break;
+ case "view" : update("view"); break;
+ case "cloud" : update_checkbox("cloud"); break;
}
}
@@ -167,17 +175,32 @@ Translator.prototype.new=function(el) {
Translator.prototype.browse=function(el) {
hide_menu(el);
var t=this
- function browse() {
- var files=t.local.ls("/")
+ function ls(files,op) {
var ul=empty_class("ul","files")
for(var i in files) {
var name=files[i]
- var link=a(jsurl("translator.open('"+name+"')"),[text(name)])
+ var link=a(jsurl(op+"('"+name+"')"),[text(name)])
ul.appendChild(li(link))
}
+ return ul
+ }
+ function browse() {
clear(t.view)
t.view.appendChild(wrap("h2",text("Your translator documents")))
- t.view.appendChild(ul)
+ var files=t.local.ls("/")
+ if(files.length>0) {
+ t.view.appendChild(wrap("h3",text("Local documents")))
+ t.view.appendChild(ls(files,"translator.open"))
+ }
+ function lscloud(result) {
+ var filenames=JSON.parse(result)
+ var files=map(strip_cloudext,filenames)
+ if(files.length>0) {
+ t.view.appendChild(wrap("h3",text("Documents in the cloud")))
+ t.view.appendChild(ls(files,"translator.open_from_cloud"))
+ }
+ }
+ if(navigator.onLine) gfcloud("ls",{ext:cloudext},lscloud)
t.current="/"
t.local.put("current","/")
}
@@ -189,33 +212,52 @@ Translator.prototype.open=function(name) {
if(name) {
var path="/"+name
var document=t.local.get(path);
- if(document) {
- t.current=name;
- t.local.put("current",name)
- t.document=document;
- t.redraw();
- }
+ if(document) t.load(name,document)
else alert("No such document: "+name)
}
}
+Translator.prototype.load=function(name,document) {
+ var t=this
+ t.current=name;
+ t.local.put("current",name)
+ t.document=document;
+ t.redraw();
+}
+
+Translator.prototype.open_from_cloud=function(name) {
+ var t=this
+ var filename=name+cloudext
+ function ok(result) {
+ var document=JSON.parse(result)
+ if(document) t.load(name,document)
+ }
+ gfcloud("download",{file:encodeURIComponent(filename)},ok);
+}
Translator.prototype.save=function(el) {
+ var t=this
hide_menu(el);
- if(this.current!="/") {
- if(this.current) this.local.put("/"+this.current,this.document)
- else this.saveAs()
+ if(t.current!="/") {
+ if(t.current) {
+ if(t.document.options.cloud)
+ save_in_cloud(t.current+cloudext,t.document)
+ else
+ t.local.put("/"+t.current,t.document)
+ }
+ else t.saveAs()
}
}
Translator.prototype.saveAs=function(el) {
+ var t=this
hide_menu(el);
- if(this.current!="/") {
+ if(t.current!="/") {
var name=prompt("File name?")
if(name) {
- this.current=this.document.name=name;
- this.local.put("current",name)
- this.save();
- this.redraw();
+ t.current=t.document.name=name;
+ t.local.put("current",name)
+ t.save();
+ t.redraw();
}
}
}
@@ -264,7 +306,7 @@ Translator.prototype.add_segment=function(el) {
e.onsubmit=done
inp.focus();
}
- setTimeout(imp,100)
+ if(t.current!="/") setTimeout(imp,100)
}
Translator.prototype.import=function(el) {
@@ -306,7 +348,7 @@ Translator.prototype.import=function(el) {
e.onsubmit=done
inp.focus();
}
- setTimeout(imp,100)
+ if(t.current!="/") setTimeout(imp,100)
}
Translator.prototype.remove=function(el) {
@@ -397,11 +439,13 @@ function hide_menu(el) {
/* --- Documents ------------------------------------------------------------ */
/*
-type Document = { name:String, options: Options, segments:[Segment] }
+type Document = { name:String, options:DocOptions, segments:[Segment] }
type Segment = { source:String, target:String, options:Options }
+type DocOptions = Options & { view:View }
type Options = {from: Lang, to: Lang, method:Method}
type Lang = String // Eng, Swe, Ita, etc
type Method = "Manual" | GrammarName
+type View = "segmentbysegment" | "paralleltexts"
type GrammarName = String // e.g. "Foods.pgf"
*/
@@ -595,6 +639,23 @@ function split_punct(text,punct) {
return segs
}
+/* --- Cloud Support -------------------------------------------------------- */
+
+
+var cloudext=".gfstdoc"
+function strip_cloudext(s) { return s.substr(0,s.length-cloudext.length) }
+
+function save_in_cloud(filename,document) {
+ function done() { }
+ function save(dir) {
+ var form={dir:dir}
+ form[filename]=JSON.stringify(document);
+ ajax_http_post("/cloud","command=upload"+encodeArgs(form),done)
+ }
+ with_dir(save)
+}
+
+
/* --- DOM Support ---------------------------------------------------------- */
function a(url,linked) { return node("a",{href:url},linked); }
@@ -615,6 +676,10 @@ function update_radiobutton(name,value) {
for(var i in bs) if(bs[i].value==value) bs[i].checked=true
}
+function update_checkbox(name,checked) {
+ document.forms.options[name].checked=checked
+}
+
function submit(label) {
return node("input",{type:"submit",value:label||"OK"})
}