mirror of
https://github.com/GrammaticalFramework/gf-core.git
synced 2026-05-05 17:22:51 -06:00
GF cloud: move support.js and pgf_online.js
Created the folder js and moved minibar/support.js and minibar/pgf_online.js there, to emphasize their status as app independent support libraries. There are probably more files that should be moved here. The cloud apps have been updated, externally hosted apps that link directly to our server need to be updated too.
This commit is contained in:
@@ -34,7 +34,7 @@ Some implementation details:
|
||||
(there are both styling and scripting issues).
|
||||
There seems to be some rendering bugs in Chrome 5.0.342.9 β.
|
||||
<li>The implementation consist of two JavaScript files:
|
||||
<a href="minibar.js">minibar.js</a> and <a href="support.js">support.js</a>
|
||||
<a href="minibar.js">minibar.js</a> and <a href="../js/support.js">support.js</a>
|
||||
The latter is also used in
|
||||
<a href="http://spraakbanken.gu.se/swe/forskning/saldo/ordspel">a couple of
|
||||
small web apps</a> based on the
|
||||
@@ -127,12 +127,12 @@ Some implementation details:
|
||||
<li>[Added 2010-10-27] Code restructuring:
|
||||
<ul>
|
||||
<li>The PGF server API has been moved to its own file:
|
||||
<a href="pgf_online.js">pgf_online.js</a>. This
|
||||
<a href="../js/pgf_online.js">pgf_online.js</a>. This
|
||||
allows it to be reused in other applicaitons without importing the entire
|
||||
minibar. It also allows minibar to be used with different server
|
||||
interfaces. <a href="minibar.html">minibar.html</a> has been updated to
|
||||
show how you use the new <a href="minibar.js">minibar.js</a> and
|
||||
<a href="pgf_online.js">pgf_online.js</a>.
|
||||
<a href="../js/pgf_online.js">pgf_online.js</a>.
|
||||
<li>The minibar code has been rewritten to avoid storing state information
|
||||
in the document tree and accessing it by referring to named document
|
||||
elements. The code now also avoids using string literals containing
|
||||
@@ -144,9 +144,9 @@ Some implementation details:
|
||||
<ul>
|
||||
<li><a href="gf-web-api-examples.html">gf-web-api-examples.html</a>:
|
||||
examples illustrating the PGF server API provided by
|
||||
<a href="pgf_online.js">pgf_online.js</a>.
|
||||
<a href="../js/pgf_online.js">pgf_online.js</a>.
|
||||
<li><a href="example.html">example.html</a>: a minimal example of a web
|
||||
page that uses <a href="pgf_online.js">pgf_online.js</a> to talk to the
|
||||
page that uses <a href="../js/pgf_online.js">pgf_online.js</a> to talk to the
|
||||
PGF server.
|
||||
</ul>
|
||||
<li>[Added 2011-03-03] Added a button to display word alignment.
|
||||
@@ -217,7 +217,7 @@ Some implementation details:
|
||||
|
||||
<hr>
|
||||
<div class=modtime><small>
|
||||
<!-- hhmts start -->Last modified: Mon Sep 10 00:50:08 CEST 2012 <!-- hhmts end -->
|
||||
<!-- hhmts start -->Last modified: Tue Nov 20 13:41:21 CET 2012 <!-- hhmts end -->
|
||||
</small></div>
|
||||
<address>
|
||||
<a href="http://www.cse.chalmers.se/~hallgren/">TH</a>
|
||||
|
||||
@@ -7,8 +7,8 @@ h1, h2, h3, small, th { font-family: sans-serif; }
|
||||
div.modtime { float: right; }
|
||||
.modtime { color: #666; white-space: nowrap; }
|
||||
</style>
|
||||
<script type="text/JavaScript" src="support.js"></script>
|
||||
<script type="text/JavaScript" src="pgf_online.js"></script>
|
||||
<script type="text/JavaScript" src="../js/support.js"></script>
|
||||
<script type="text/JavaScript" src="../js/pgf_online.js"></script>
|
||||
<script type="text/JavaScript">
|
||||
|
||||
var server_options={
|
||||
@@ -51,7 +51,7 @@ Output:
|
||||
|
||||
<hr>
|
||||
<div class=modtime><small>
|
||||
<!-- hhmts start --> Last modified: Wed Aug 3 16:52:51 CEST 2011 <!-- hhmts end -->
|
||||
<!-- hhmts start -->Last modified: Tue Nov 20 13:42:21 CET 2012 <!-- hhmts end -->
|
||||
</small></div>
|
||||
<address><a href="http://www.cse.chalmers.se/~hallgren/">TH</a></address>
|
||||
</body> </html>
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
<html> <head>
|
||||
<title>Feedback</title>
|
||||
<link rel=stylesheet type="text/css" href="minibar.css">
|
||||
<script type="text/JavaScript" src="support.js"></script>
|
||||
<script type="text/JavaScript" src="../js/support.js"></script>
|
||||
<script type="text/JavaScript" src="minibar_support.js"></script>
|
||||
<script type="text/JavaScript" src="minibar.js"></script>
|
||||
<meta name = "viewport" content = "width = device-width">
|
||||
|
||||
@@ -47,7 +47,7 @@ The
|
||||
Web Service API page</a> describes the calls supported by the GF web service
|
||||
API. Below, we illustrate these calls by examples, and also show
|
||||
how to make these calls from JavaScript using the API defined in
|
||||
<a href="pgf_online.js"><code>pgf_online.js</code></a>.
|
||||
<a href="../js/pgf_online.js"><code>pgf_online.js</code></a>.
|
||||
|
||||
<p>
|
||||
<strong>Note</strong> that <code>pgf_online.js</code> was initially developed
|
||||
@@ -174,6 +174,6 @@ full API.
|
||||
</dl>
|
||||
<hr>
|
||||
<div class=modtime><small>
|
||||
<!-- hhmts start -->Last modified: Sat Nov 17 18:40:55 CET 2012 <!-- hhmts end -->
|
||||
<!-- hhmts start -->Last modified: Tue Nov 20 13:54:42 CET 2012 <!-- hhmts end -->
|
||||
</small></div>
|
||||
<address><a href="http://www.cse.chalmers.se/~hallgren/">TH</a></address>
|
||||
|
||||
@@ -46,7 +46,7 @@ This object implements the complete Minibar web app. It is defined in
|
||||
<a href="minibar.js">minibar.js</a>. It also uses the <code>Input</code>
|
||||
and <code>Translations</code> objects described below, and some auxiliary
|
||||
functions defined in <a href="minibar_support.js">minibar_support.js</a>
|
||||
and <a href="support.js">support.js</a>, so to use it in an
|
||||
and <a href="../js/support.js">support.js</a>, so to use it in an
|
||||
HTML file, you would normally include at least the following:
|
||||
|
||||
<blockquote><pre>
|
||||
@@ -54,7 +54,7 @@ HTML file, you would normally include at least the following:
|
||||
<script type="text/JavaScript" src="minibar_input.js"></script>
|
||||
<script type="text/JavaScript" src="minibar_translations.js"></script>
|
||||
<script type="text/JavaScript" src="minibar_support.js"></script>
|
||||
<script type="text/JavaScript" src="support.js"></script>
|
||||
<script type="text/JavaScript" src="../js/support.js"></script>
|
||||
</pre></blockquote>
|
||||
|
||||
<p>
|
||||
@@ -111,13 +111,13 @@ It is defined in
|
||||
<a href="minibar_input.js">minibar_input.js</a>.
|
||||
It also uses some auxiliary functions defined
|
||||
in <a href="minibar_support.js">minibar_support.js</a>
|
||||
and <a href="support.js">support.js</a>, so to use it in an
|
||||
and <a href="../js/support.js">support.js</a>, so to use it in an
|
||||
HTML file, you would normally include at least the following:
|
||||
|
||||
<blockquote><pre>
|
||||
<script type="text/JavaScript" src="minibar_input.js"></script>
|
||||
<script type="text/JavaScript" src="minibar_support.js"></script>
|
||||
<script type="text/JavaScript" src="support.js"></script>
|
||||
<script type="text/JavaScript" src="../js/support.js"></script>
|
||||
</pre></blockquote>
|
||||
|
||||
<h3>Constructor</h3>
|
||||
@@ -188,13 +188,13 @@ This object displays translations. It is defined in
|
||||
<a href="minibar_translations.js">minibar_translations.js</a>.
|
||||
It also uses some auxiliary functions defined
|
||||
in <a href="minibar_support.js">minibar_support.js</a>
|
||||
and <a href="support.js">support.js</a>, so to use it in an
|
||||
and <a href="../js/support.js">support.js</a>, so to use it in an
|
||||
HTML file, you would normally include at least the following:
|
||||
|
||||
<blockquote><pre>
|
||||
<script type="text/JavaScript" src="minibar_translations.js"></script>
|
||||
<script type="text/JavaScript" src="minibar_support.js"></script>
|
||||
<script type="text/JavaScript" src="support.js"></script>
|
||||
<script type="text/JavaScript" src="../js/support.js"></script>
|
||||
</pre></blockquote>
|
||||
|
||||
<h3>Constructor</h3>
|
||||
@@ -249,7 +249,7 @@ the user interface:
|
||||
<hr>
|
||||
<div class=modtime>
|
||||
<small class=modtime>
|
||||
HTML <!-- hhmts start -->Last modified: Sun Sep 30 17:33:51 CEST 2012 <!-- hhmts end -->
|
||||
HTML <!-- hhmts start -->Last modified: Tue Nov 20 13:44:11 CET 2012 <!-- hhmts end -->
|
||||
</small>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -25,16 +25,16 @@
|
||||
& <a href="http://www.grammaticalframework.org:41296/translate/">Translator</a>]
|
||||
</small>
|
||||
<small class=modtime>
|
||||
HTML <!-- hhmts start --> Last modified: Fri Apr 27 15:53:46 CEST 2012 <!-- hhmts end -->
|
||||
HTML <!-- hhmts start -->Last modified: Tue Nov 20 13:38:35 CET 2012 <!-- hhmts end -->
|
||||
</small>
|
||||
<address>
|
||||
|
||||
<script type="text/JavaScript" src="support.js"></script>
|
||||
<script type="text/JavaScript" src="../js/support.js"></script>
|
||||
<script type="text/JavaScript" src="minibar.js"></script>
|
||||
<script type="text/JavaScript" src="minibar_input.js"></script>
|
||||
<script type="text/JavaScript" src="minibar_translations.js"></script>
|
||||
<script type="text/JavaScript" src="minibar_support.js"></script>
|
||||
<script type="text/JavaScript" src="pgf_online.js"></script>
|
||||
<script type="text/JavaScript" src="../js/pgf_online.js"></script>
|
||||
<script type="text/javascript" src="minibar_online.js"></script>
|
||||
<script type="text/javascript" src="../gfse/gf_abs.js"></script>
|
||||
|
||||
|
||||
@@ -43,7 +43,7 @@ even when you are offline.
|
||||
| <a href="minibar.html">Minibar online</a>]
|
||||
</small>
|
||||
<small class=modtime>
|
||||
HTML <!-- hhmts start --> Last modified: Mon Apr 30 16:01:32 CEST 2012 <!-- hhmts end -->
|
||||
HTML <!-- hhmts start -->Last modified: Tue Nov 20 13:45:07 CET 2012 <!-- hhmts end -->
|
||||
</small>
|
||||
<address><a href="http://www.cse.chalmers.se/~hallgren/">TH</a></address>
|
||||
|
||||
@@ -56,7 +56,7 @@ HTML <!-- hhmts start --> Last modified: Mon Apr 30 16:01:32 CEST 2012 <!-- hhmt
|
||||
<script type="text/JavaScript" src="http://www.grammaticalframework.org/~hallgren/hs2js/test/Services.js"></script>
|
||||
<script type="text/javascript" src="http://www.grammaticalframework.org/~hallgren/hs2js/test/visadolj.js"></script>
|
||||
|
||||
<script type="text/JavaScript" src="support.js"></script>
|
||||
<script type="text/JavaScript" src="../js/support.js"></script>
|
||||
<script type="text/JavaScript" src="minibar.js"></script>
|
||||
<script type="text/JavaScript" src="minibar_input.js"></script>
|
||||
<script type="text/JavaScript" src="minibar_translations.js"></script>
|
||||
|
||||
@@ -1,80 +0,0 @@
|
||||
|
||||
/* --- Grammar access object ------------------------------------------------ */
|
||||
|
||||
function pgf_online(options) {
|
||||
var server = {
|
||||
// State variables (private):
|
||||
grammars_url: "/grammars/",
|
||||
other_grammars_urls: [],
|
||||
grammar_list: null,
|
||||
current_grammar_url: null,
|
||||
|
||||
// Methods:
|
||||
switch_grammar: function(grammar_url,cont) {
|
||||
this.current_grammar_url=this.grammars_url+grammar_url;
|
||||
if(cont) cont();
|
||||
},
|
||||
add_grammars_url: function(grammars_url,cont) {
|
||||
this.other_grammars_urls.push(grammars_url);
|
||||
if(cont) cont();
|
||||
},
|
||||
switch_to_other_grammar: function(grammar_url,cont) {
|
||||
this.current_grammar_url=grammar_url;
|
||||
if(cont) cont();
|
||||
},
|
||||
get_grammarlist: function(cont,err) {
|
||||
if(this.grammar_list) cont(this.grammar_list)
|
||||
else http_get_json(this.grammars_url+"grammars.cgi",cont,err);
|
||||
},
|
||||
get_grammarlists: function(cont,err) { // May call cont several times!
|
||||
var ds=this.other_grammars_urls;
|
||||
var n=1+ds.length;
|
||||
function pair(dir) {
|
||||
return function(grammar_list){cont(dir,grammar_list,n)}
|
||||
}
|
||||
function ignore_error(err) { console.log(err) }
|
||||
this.get_grammarlist(pair(this.grammars_url),err)
|
||||
for(var i in ds)
|
||||
http_get_json(ds[i]+"grammars.cgi",pair(ds[i]),ignore_error);
|
||||
},
|
||||
pgf_call: function(cmd,args,cont,err) {
|
||||
var url=this.current_grammar_url+"?command="+cmd+encodeArgs(args)
|
||||
http_get_json(url,cont,err);
|
||||
},
|
||||
|
||||
get_languages: function(cont,err) {
|
||||
this.pgf_call("grammar",{},cont,err);
|
||||
},
|
||||
grammar_info: function(cont,err) {
|
||||
this.pgf_call("grammar",{},cont,err);
|
||||
},
|
||||
|
||||
get_random: function(args,cont,err) { // cat, limit
|
||||
args.random=Math.random(); // side effect!!
|
||||
this.pgf_call("random",args,cont,err);
|
||||
},
|
||||
linearize: function(args,cont,err) { // tree, to
|
||||
this.pgf_call("linearize",args,cont,err);
|
||||
},
|
||||
complete: function(args,cont,err) { // from, input, cat, limit
|
||||
this.pgf_call("complete",args,cont,err);
|
||||
},
|
||||
parse: function(args,cont,err) { // from, input, cat
|
||||
this.pgf_call("parse",args,cont,err);
|
||||
},
|
||||
translate: function(args,cont,err) { // from, input, cat, to
|
||||
this.pgf_call("translate",args,cont,err);
|
||||
},
|
||||
translategroup: function(args,cont,err) { // from, input, cat, to
|
||||
this.pgf_call("translategroup",args,cont,err);
|
||||
},
|
||||
browse: function(args,cont,err) { // id, format
|
||||
if(!args.format) args.format="json"; // sife effect!!
|
||||
this.pgf_call("browse",args,cont,err);
|
||||
}
|
||||
};
|
||||
for(var o in options) server[o]=options[o];
|
||||
if(server.grammar_list && server.grammar_list.length>0)
|
||||
server.switch_grammar(server.grammar_list[0]);
|
||||
return server;
|
||||
}
|
||||
@@ -20,12 +20,12 @@ see <a href="http://www.grammaticalframework.org/examples/phrasebook/doc-phraseb
|
||||
|
||||
</small>
|
||||
|
||||
<script type="text/JavaScript" src="support.js"></script>
|
||||
<script type="text/JavaScript" src="../js/support.js"></script>
|
||||
<script type="text/JavaScript" src="minibar.js"></script>
|
||||
<script type="text/JavaScript" src="minibar_input.js"></script>
|
||||
<script type="text/JavaScript" src="minibar_translations.js"></script>
|
||||
<script type="text/JavaScript" src="minibar_support.js"></script>
|
||||
<script type="text/JavaScript" src="pgf_online.js"></script>
|
||||
<script type="text/JavaScript" src="../js/pgf_online.js"></script>
|
||||
|
||||
<script type="text/JavaScript">
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
<html> <head>
|
||||
<title>Saldotest</title>
|
||||
<link rel=stylesheet type="text/css" href="minibar.css">
|
||||
<script type="text/JavaScript" src="support.js"></script>
|
||||
<script type="text/JavaScript" src="../js/support.js"></script>
|
||||
<script type="text/JavaScript" src="saldotest.js"></script>
|
||||
<meta name = "viewport" content = "width = device-width">
|
||||
</head>
|
||||
@@ -22,7 +22,7 @@
|
||||
[Baserad på <a href="http://spraakbanken.gu.se/sal/ws/">SALDOs nättjänster</a>]
|
||||
</small>
|
||||
<small class=modtime>
|
||||
HTML <!-- hhmts start --> Last modified: Thu May 27 14:02:42 CEST 2010 <!-- hhmts end -->
|
||||
HTML <!-- hhmts start -->Last modified: Tue Nov 20 13:47:13 CET 2012 <!-- hhmts end -->
|
||||
</small>
|
||||
<address>TH <img src="http://www.altocumulus.org/~hallgren/online.cgi?icon" alt=""></address>
|
||||
</body>
|
||||
|
||||
@@ -1,329 +0,0 @@
|
||||
/* --- Accessing document elements ------------------------------------------ */
|
||||
|
||||
function element(id) {
|
||||
return document.getElementById(id);
|
||||
}
|
||||
|
||||
/* --- JavaScript tricks ---------------------------------------------------- */
|
||||
|
||||
// To be able to use object methods that refer to "this" as callbacks
|
||||
// See section 3.3 of https://github.com/spencertipping/js-in-ten-minutes/raw/master/js-in-ten-minutes.pdf
|
||||
function bind(f, this_value) {
|
||||
return function () {return f.apply (this_value, arguments)};
|
||||
};
|
||||
|
||||
// Implement Array.isArray for older browsers that lack it.
|
||||
// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/isArray
|
||||
if(!Array.isArray) {
|
||||
Array.isArray = function (arg) {
|
||||
return Object.prototype.toString.call(arg) == '[object Array]';
|
||||
};
|
||||
}
|
||||
|
||||
/* --- JSONP ---------------------------------------------------------------- */
|
||||
|
||||
// Inspired by the function jsonp from
|
||||
// http://www.west-wind.com/Weblog/posts/107136.aspx
|
||||
// See also http://niryariv.wordpress.com/2009/05/05/jsonp-quickly/
|
||||
// http://en.wikipedia.org/wiki/JSONP
|
||||
function jsonp(url,callback)
|
||||
{
|
||||
if (url.indexOf("?") > -1)
|
||||
url += "&jsonp="
|
||||
else
|
||||
url += "?jsonp="
|
||||
url += callback;
|
||||
//url += "&" + new Date().getTime().toString(); // prevent caching
|
||||
|
||||
var script = empty("script");
|
||||
script.setAttribute("src",url);
|
||||
script.setAttribute("type","text/javascript");
|
||||
document.body.appendChild(script);
|
||||
}
|
||||
|
||||
var json = {next:0};
|
||||
|
||||
// Like jsonp, but instead of passing the name of the callback function, you
|
||||
// pass the callback function directly, making it possible to use anonymous
|
||||
// functions.
|
||||
function jsonpf(url,callback,errorcallback)
|
||||
{
|
||||
var name="callback"+(json.next++);
|
||||
json[name]=function(x) { delete json[name]; callback(x); }
|
||||
jsonp(url,"json."+name);
|
||||
}
|
||||
|
||||
/* --- AJAX ----------------------------------------------------------------- */
|
||||
|
||||
function GetXmlHttpObject(handler)
|
||||
{
|
||||
var objXMLHttp=null
|
||||
if (window.XMLHttpRequest)
|
||||
{
|
||||
// See http://www.w3.org/TR/XMLHttpRequest/
|
||||
// https://developer.mozilla.org/en/xmlhttprequest
|
||||
objXMLHttp=new XMLHttpRequest()
|
||||
}
|
||||
else if (window.ActiveXObject)
|
||||
{
|
||||
objXMLHttp=new ActiveXObject("Microsoft.XMLHTTP")
|
||||
}
|
||||
return objXMLHttp
|
||||
}
|
||||
|
||||
function ajax_http(method,url,body,callback,errorcallback) {
|
||||
var http=GetXmlHttpObject()
|
||||
if (!http) {
|
||||
var errortext="Browser does not support HTTP Request";
|
||||
if(errorcallback) errorcallback(errortext,500)
|
||||
else alert(errortext)
|
||||
}
|
||||
else {
|
||||
function statechange() {
|
||||
if (http.readyState==4 || http.readyState=="complete") {
|
||||
if(http.status<300) callback(http.responseText,http.status);
|
||||
else if(errorcallback)
|
||||
errorcallback(http.responseText,http.status,
|
||||
http.getResponseHeader("Content-Type"));
|
||||
else alert("Request for "+url+" failed: "
|
||||
+http.status+" "+http.statusText);
|
||||
}
|
||||
}
|
||||
http.onreadystatechange=statechange;
|
||||
http.open(method,url,true)
|
||||
http.send(body)
|
||||
}
|
||||
return http
|
||||
}
|
||||
|
||||
function ajax_http_get(url,callback,errorcallback) {
|
||||
ajax_http("GET",url,null,callback,errorcallback)
|
||||
}
|
||||
|
||||
function ajax_http_post(url,formdata,callback,errorcallback) {
|
||||
ajax_http("POST",url,formdata,callback,errorcallback)
|
||||
// See https://developer.mozilla.org/En/XMLHttpRequest/Using_XMLHttpRequest#Using_FormData_objects
|
||||
}
|
||||
|
||||
// JSON via AJAX
|
||||
function ajax_http_get_json(url,cont,errorcallback) {
|
||||
ajax_http_get(url,function(txt){cont(eval("("+txt+")"));}, errorcallback);
|
||||
}
|
||||
|
||||
function sameOrigin(url) {
|
||||
var a=empty("a");
|
||||
a.href=url; // converts to an absolute URL
|
||||
return hasPrefix(a.href,location.protocol+"//"+location.host+"/");
|
||||
}
|
||||
|
||||
// Use AJAX when possible, fallback to JSONP
|
||||
function http_get_json(url,cont,errorcallback) {
|
||||
if(sameOrigin(url)) ajax_http_get_json(url,cont,errorcallback);
|
||||
else jsonpf(url,cont,errorcallback);
|
||||
}
|
||||
|
||||
/* --- URL construction ----------------------------------------------------- */
|
||||
|
||||
function encodeArgs(args) {
|
||||
var q=""
|
||||
for(var arg in args)
|
||||
if(args[arg]!=undefined)
|
||||
q+="&"+arg+"="+encodeURIComponent(args[arg]);
|
||||
return q;
|
||||
}
|
||||
|
||||
/* --- HTML construction ---------------------------------------------------- */
|
||||
function text(s) { return document.createTextNode(s); }
|
||||
|
||||
function node(tag,as,ds) {
|
||||
var n=document.createElement(tag);
|
||||
for(var a in as) n.setAttribute(a,as[a]);
|
||||
if(ds) for(var i in ds) n.appendChild(ds[i]);
|
||||
return n;
|
||||
}
|
||||
|
||||
function empty(tag,name,value) {
|
||||
var el=node(tag,{},[])
|
||||
if(name && value) el.setAttribute(name,value);
|
||||
return el;
|
||||
}
|
||||
|
||||
function empty_id(tag,id) { return empty(tag,"id",id); }
|
||||
function empty_class(tag,cls) { return empty(tag,"class",cls); }
|
||||
|
||||
function div_id(id,cs) { return node("div",{id:id},cs); }
|
||||
function span_id(id) { return empty_id("span",id); }
|
||||
|
||||
function wrap(tag,contents) {
|
||||
return node(tag,{},Array.isArray(contents) ? contents : [contents]);
|
||||
}
|
||||
|
||||
function wrap_class(tag,cls,contents) {
|
||||
return node(tag,{"class":cls},
|
||||
contents ? Array.isArray(contents) ?
|
||||
contents : [contents] : [])
|
||||
}
|
||||
|
||||
function span_class(cls,contents) { return wrap_class("span",cls,contents); }
|
||||
function div_class(cls,contents) { return wrap_class("div",cls,contents); }
|
||||
|
||||
function p(contents) { return wrap("p",contents); }
|
||||
function dt(contents) { return wrap("dt",contents); }
|
||||
function dd(contents) { return wrap("dd",contents); }
|
||||
function li(contents) { return wrap("li",contents); }
|
||||
|
||||
function th(contents) { return wrap("th",contents); }
|
||||
function td(contents) { return wrap("td",contents); }
|
||||
|
||||
function tr(cells) { return wrap("tr",cells); }
|
||||
|
||||
function button(label,action,key) {
|
||||
var el=node("input",{"type":"button","value":label},[]);
|
||||
if(typeof action=="string") el.setAttribute("onclick",action);
|
||||
else el.onclick=action;
|
||||
if(key) el.setAttribute("accesskey",key);
|
||||
return el;
|
||||
}
|
||||
|
||||
function option(label,value) {
|
||||
return node("option",{"value":value},[text(label)]);
|
||||
}
|
||||
|
||||
function hidden(name,value) {
|
||||
return node("input",{type:"hidden",name:name,value:value},[])
|
||||
}
|
||||
|
||||
function tda(cs) { return node("td",{},cs); }
|
||||
|
||||
function img(src) { return empty("img","src",src); }
|
||||
|
||||
/* --- Document modification ------------------------------------------------ */
|
||||
|
||||
function clear(el) { replaceInnerHTML(el,""); }
|
||||
function replaceInnerHTML(el,html) { if(el) el.innerHTML=html; }
|
||||
function replaceChildren(el,newchild) { clear(el); el.appendChild(newchild); }
|
||||
|
||||
function appendChildren(el,ds) {
|
||||
for(var i in ds) el.appendChild(ds[i]);
|
||||
return el;
|
||||
}
|
||||
|
||||
function insertFirst(parent,child) {
|
||||
parent.insertBefore(child,parent.firstChild);
|
||||
}
|
||||
|
||||
function insertBefore(el,ref) { ref.parentNode.insertBefore(el,ref); }
|
||||
|
||||
function insertAfter(el,ref) {
|
||||
ref.parentNode.insertBefore(el,ref.nextSibling);
|
||||
}
|
||||
|
||||
/* --- Debug ---------------------------------------------------------------- */
|
||||
|
||||
function debug(s) {
|
||||
var d=element("debug");
|
||||
if(d) d.appendChild(text(s+"\n"))
|
||||
}
|
||||
|
||||
function show_props(obj, objName) {
|
||||
var result = "";
|
||||
for (var i in obj) {
|
||||
result += objName + "." + i + " = " + obj[i] + "<br>";
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
function field_names(obj) {
|
||||
var result = "";
|
||||
for (var i in obj) {
|
||||
result += " " + i;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/* --- Data manipulation ---------------------------------------------------- */
|
||||
function swap(a,i,j) { // Note: this doesn't work on strings.
|
||||
var tmp=a[i];
|
||||
a[i]=a[j];
|
||||
a[j]=tmp;
|
||||
return a;
|
||||
}
|
||||
|
||||
function sort(a) {
|
||||
// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Array/sort
|
||||
return a.sort();
|
||||
/* // Note: this doesn't work on strings.
|
||||
for(var i=0;i<a.length-1;i++) {
|
||||
var min=i;
|
||||
for(var j=i+1;j<a.length;j++)
|
||||
if(a[j]<a[min]) min=j;
|
||||
if(min!=i) swap(a,i,min);
|
||||
}
|
||||
return a;
|
||||
*/
|
||||
}
|
||||
|
||||
function filter(p,xs) {
|
||||
var ys=[];
|
||||
for(var i=0;i<xs.length;i++)
|
||||
if(p(xs[i])) ys[ys.length]=xs[i];
|
||||
return ys;
|
||||
}
|
||||
|
||||
function implode(cs) { // array of strings to string
|
||||
/*
|
||||
var s="";
|
||||
for(var i=0;i<cs.length;i++)
|
||||
s+=cs[i];
|
||||
return s;
|
||||
*/
|
||||
return cs.join("");
|
||||
}
|
||||
|
||||
function hasPrefix(s,pre) { return s.substr(0,pre.length)==pre; }
|
||||
|
||||
function commonPrefix(s1,s2) {
|
||||
for(var i=0;i<s1.length && i<s2.length && s1[i]==s2[i];i++);
|
||||
return s1.substr(0,i);
|
||||
}
|
||||
|
||||
/*
|
||||
function all(p,xs) {
|
||||
for(var i=0;i<xs.length;i++)
|
||||
if(!p(xs[i])) return false;
|
||||
return true;
|
||||
}
|
||||
*/
|
||||
|
||||
function map(f,xs) {
|
||||
var ys=[];
|
||||
for(var i=0;i<xs.length;i++) ys[i]=f(xs[i]);
|
||||
return ys;
|
||||
}
|
||||
|
||||
// map in continuation passing style
|
||||
function mapc(f,xs,cont) { mapc_from(f,xs,0,[],cont); }
|
||||
|
||||
function mapc_from(f,xs,i,ys,cont) {
|
||||
if(i<xs.length)
|
||||
f(xs[i],function(y){ys[i]=y;mapc_from(f,xs,i+1,ys,cont)});
|
||||
else
|
||||
cont(ys);
|
||||
}
|
||||
|
||||
function overlaps(as,bs) {
|
||||
for(var i=0;i<as.length;i++)
|
||||
if(elem(as[i],bs)) return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
function elem(a,as) {
|
||||
for(var i=0;i<as.length;i++)
|
||||
if(a==as[i]) return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
function shuffle(a) {
|
||||
for(i=0;i<a.length;i++) swap(a,i,Math.floor(Math.random()*a.length))
|
||||
return a;
|
||||
}
|
||||
Reference in New Issue
Block a user