Integrated automatic language recognition algorithm.
Some other minor change. git-svn-id: http://svn.research-infrastructures.eu/public/d4science/gcube/trunk/data-analysis/nlphub@164886 82a268e6-3cf1-43bd-a215-b396298e98cf
This commit is contained in:
parent
7f660e7377
commit
07fb54148b
|
@ -36,7 +36,7 @@ import org.gcube.nlphub.nlp.NlpNerRunner;
|
||||||
public class NLPHub extends HttpServlet {
|
public class NLPHub extends HttpServlet {
|
||||||
private Logger logger = Logger.getLogger(NLPHub.class.getSimpleName());
|
private Logger logger = Logger.getLogger(NLPHub.class.getSimpleName());
|
||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
private String service = "http://dataminer-prototypes.d4science.org/wps/";
|
public static final String service = "http://dataminer-prototypes.d4science.org/wps/";
|
||||||
private String token = "df2cc5f5-63ee-48c1-b2a6-1210030c57b8-843339462";
|
private String token = "df2cc5f5-63ee-48c1-b2a6-1210030c57b8-843339462";
|
||||||
private boolean devMode = true;
|
private boolean devMode = true;
|
||||||
|
|
||||||
|
@ -77,8 +77,6 @@ public class NLPHub extends HttpServlet {
|
||||||
|
|
||||||
|
|
||||||
if (algs.length >= 1) {
|
if (algs.length >= 1) {
|
||||||
// single algorithm execution
|
|
||||||
System.out.println("algs[0]: " + algs[0]);
|
|
||||||
NlpNerRunner runner = new NlpNerRunner(service, algs, token, response);
|
NlpNerRunner runner = new NlpNerRunner(service, algs, token, response);
|
||||||
runner.run(request.getParameter("plink"), request.getParameter("annotations"),
|
runner.run(request.getParameter("plink"), request.getParameter("annotations"),
|
||||||
request.getParameter("lang"));
|
request.getParameter("lang"));
|
||||||
|
|
|
@ -25,6 +25,8 @@ import org.apache.log4j.Logger;
|
||||||
import org.gcube.nlphub.legacy.Constants;
|
import org.gcube.nlphub.legacy.Constants;
|
||||||
import org.gcube.nlphub.legacy.JsonManager;
|
import org.gcube.nlphub.legacy.JsonManager;
|
||||||
import org.gcube.nlphub.legacy.NlpHubException;
|
import org.gcube.nlphub.legacy.NlpHubException;
|
||||||
|
import org.gcube.nlphub.nlp.NLpLanguageRecognizer;
|
||||||
|
import org.gcube.nlphub.nlp.NlpUtils;
|
||||||
import org.gcube.nlphub.workspace.WorkspaceManager;
|
import org.gcube.nlphub.workspace.WorkspaceManager;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -141,7 +143,12 @@ public class NLPUploader extends HttpServlet {
|
||||||
}
|
}
|
||||||
|
|
||||||
String link = ws.getPublicLink(fileName, token);
|
String link = ws.getPublicLink(fileName, token);
|
||||||
writer.println(new JsonManager().getSuccessJsonResponse("" + link));
|
String sentence = NlpUtils.getLanguageRecognizerDigest(stringContent);
|
||||||
|
System.out.println(sentence);
|
||||||
|
NLpLanguageRecognizer recognizer = new NLpLanguageRecognizer(NLPHub.service, token, sentence, link, response);
|
||||||
|
recognizer.run();
|
||||||
|
|
||||||
|
//writer.println(new JsonManager().getSuccessJsonResponse("" + link));
|
||||||
} catch (Exception x) {
|
} catch (Exception x) {
|
||||||
x.printStackTrace();
|
x.printStackTrace();
|
||||||
logger.error(x.getClass().getName() + ": " + x.getLocalizedMessage());
|
logger.error(x.getClass().getName() + ": " + x.getLocalizedMessage());
|
||||||
|
|
|
@ -27,12 +27,4 @@ public class Constants {
|
||||||
}
|
}
|
||||||
return new String(hexChars);
|
return new String(hexChars);
|
||||||
}
|
}
|
||||||
/*
|
|
||||||
public static void main(String[] args) {
|
|
||||||
String text = "I am here in\nPisa.";
|
|
||||||
System.out.println(text);
|
|
||||||
System.out.println(hexDump(text.getBytes()));
|
|
||||||
text = text.replaceAll("\n", "\\\\n");
|
|
||||||
System.out.println(hexDump(text.getBytes()));
|
|
||||||
}*/
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -51,6 +51,7 @@ public class JsonManager {
|
||||||
return jsonObjectRoot.toString();
|
return jsonObjectRoot.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public String getSuccessJsonResponse(String message) {
|
public String getSuccessJsonResponse(String message) {
|
||||||
return getResponse(true, message);
|
return getResponse(true, message);
|
||||||
}
|
}
|
||||||
|
@ -59,12 +60,23 @@ public class JsonManager {
|
||||||
return getResponse(false, message);
|
return getResponse(false, message);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getSuccessJsonResponse(String language, String message) {
|
||||||
|
return getResponse(true, language, message);
|
||||||
|
}
|
||||||
|
|
||||||
private String getResponse(boolean success, String message) {
|
private String getResponse(boolean success, String message) {
|
||||||
jsonObjectRoot.addProperty(RESPONSE, (success ? OK : ERROR));
|
jsonObjectRoot.addProperty(RESPONSE, (success ? OK : ERROR));
|
||||||
jsonObjectRoot.addProperty(MESSAGE, message);
|
jsonObjectRoot.addProperty(MESSAGE, message);
|
||||||
return jsonObjectRoot.toString();
|
return jsonObjectRoot.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private String getResponse(boolean success, String language, String message) {
|
||||||
|
jsonObjectRoot.addProperty(RESPONSE, (success ? OK : ERROR));
|
||||||
|
jsonObjectRoot.addProperty(LANGUAGE, language);
|
||||||
|
jsonObjectRoot.addProperty(MESSAGE, message);
|
||||||
|
return jsonObjectRoot.toString();
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
public void buildNerOutputJson(NerOutput nerOut) {
|
public void buildNerOutputJson(NerOutput nerOut) {
|
||||||
// build the root json object initial property fields
|
// build the root json object initial property fields
|
||||||
|
|
|
@ -1,8 +1,14 @@
|
||||||
package org.gcube.nlphub.nlp;
|
package org.gcube.nlphub.nlp;
|
||||||
|
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
import java.net.HttpURLConnection;
|
||||||
|
import java.net.URL;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
import org.apache.log4j.Logger;
|
import org.apache.log4j.Logger;
|
||||||
import org.gcube.data.analysis.dataminermanagercl.server.dmservice.SClient;
|
import org.gcube.data.analysis.dataminermanagercl.server.dmservice.SClient;
|
||||||
import org.gcube.data.analysis.dataminermanagercl.shared.data.OutputData;
|
import org.gcube.data.analysis.dataminermanagercl.shared.data.OutputData;
|
||||||
|
@ -15,14 +21,17 @@ import org.gcube.data.analysis.dataminermanagercl.shared.parameters.ListParamete
|
||||||
import org.gcube.data.analysis.dataminermanagercl.shared.parameters.ObjectParameter;
|
import org.gcube.data.analysis.dataminermanagercl.shared.parameters.ObjectParameter;
|
||||||
import org.gcube.data.analysis.dataminermanagercl.shared.parameters.Parameter;
|
import org.gcube.data.analysis.dataminermanagercl.shared.parameters.Parameter;
|
||||||
import org.gcube.data.analysis.dataminermanagercl.shared.parameters.ParameterType;
|
import org.gcube.data.analysis.dataminermanagercl.shared.parameters.ParameterType;
|
||||||
|
import org.gcube.nlphub.legacy.Constants;
|
||||||
import org.gcube.nlphub.legacy.DataminerClient;
|
import org.gcube.nlphub.legacy.DataminerClient;
|
||||||
|
import org.gcube.nlphub.legacy.JsonManager;
|
||||||
import org.gcube.nlphub.legacy.NlpHubException;
|
import org.gcube.nlphub.legacy.NlpHubException;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public class NLpLanguageRecognizer extends DataminerClient {
|
public class NLpLanguageRecognizer extends DataminerClient {
|
||||||
|
private HttpServletResponse response;
|
||||||
private Logger logger = Logger.getLogger(NLpLanguageRecognizer.class.getSimpleName());
|
private Logger logger = Logger.getLogger(NLpLanguageRecognizer.class.getSimpleName());
|
||||||
private String sentence;
|
private String sentence, publicLink;
|
||||||
public final static String RECOGNIZER_ID = "org.gcube.dataanalysis.wps.statisticalmanager.synchserver.mappedclasses.transducerers.LANGUAGE_RECOGNIZER";
|
public final static String RECOGNIZER_ID = "org.gcube.dataanalysis.wps.statisticalmanager.synchserver.mappedclasses.transducerers.LANGUAGE_RECOGNIZER";
|
||||||
// private String service = "http://dataminer-prototypes.d4science.org/wps/";
|
// private String service = "http://dataminer-prototypes.d4science.org/wps/";
|
||||||
// private String token = "df2cc5f5-63ee-48c1-b2a6-1210030c57b8-843339462";
|
// private String token = "df2cc5f5-63ee-48c1-b2a6-1210030c57b8-843339462";
|
||||||
|
@ -30,8 +39,15 @@ public class NLpLanguageRecognizer extends DataminerClient {
|
||||||
public NLpLanguageRecognizer(String service, String token, String sentence) {
|
public NLpLanguageRecognizer(String service, String token, String sentence) {
|
||||||
super(service, "", token);
|
super(service, "", token);
|
||||||
this.sentence = sentence;
|
this.sentence = sentence;
|
||||||
|
response = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public NLpLanguageRecognizer(String service, String token, String sentence, String publicLink, HttpServletResponse response) {
|
||||||
|
super(service, "", token);
|
||||||
|
this.sentence = sentence;
|
||||||
|
this.response = response;
|
||||||
|
this.publicLink = publicLink;
|
||||||
|
}
|
||||||
|
|
||||||
public void run() throws NlpHubException {
|
public void run() throws NlpHubException {
|
||||||
try {
|
try {
|
||||||
|
@ -61,13 +77,14 @@ public class NLpLanguageRecognizer extends DataminerClient {
|
||||||
Resource r = mapResource.getMap().get(key);
|
Resource r = mapResource.getMap().get(key);
|
||||||
if (r.isFile()) {
|
if (r.isFile()) {
|
||||||
FileResource f = (FileResource) r;
|
FileResource f = (FileResource) r;
|
||||||
String mimeType = f.getMimeType();
|
String name = f.getName();
|
||||||
if (mimeType.equalsIgnoreCase("application/d4science")) {
|
String link = f.getUrl();
|
||||||
String link = f.getUrl();
|
if(name.equalsIgnoreCase("outfile")) {
|
||||||
System.out.println("url: " + link);
|
String content = readFileContent(link);
|
||||||
String op = computationId.getOperatorId();
|
System.out.println(content + ".");
|
||||||
op = op.substring(op.lastIndexOf(".") + 1);
|
if(response != null) {
|
||||||
//testEndOfProcess(op + ":::" + link);
|
response.getWriter().println(new JsonManager().getSuccessJsonResponse(content, publicLink));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -78,23 +95,41 @@ public class NLpLanguageRecognizer extends DataminerClient {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void main(String[] args) {
|
private String readFileContent(String link) throws Exception {
|
||||||
// String service = "http://dataminer-prototypes.d4science.org/wps/";
|
URL url = new URL(link);
|
||||||
// String token = "df2cc5f5-63ee-48c1-b2a6-1210030c57b8-843339462";
|
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
|
||||||
// String sentence = "Per me si va nella città dolente";
|
connection.setRequestProperty(Constants.TOKEN_PARAMETER, super.getToken());
|
||||||
//
|
connection.setDoInput(true);
|
||||||
// NLpLanguageRecognizer recognizer = new NLpLanguageRecognizer(service, token, sentence);
|
connection.setDoOutput(true);
|
||||||
// try {
|
connection.setUseCaches(false);
|
||||||
// recognizer.run();
|
connection.setRequestMethod("GET");
|
||||||
// } catch (Exception x) {
|
|
||||||
// x.printStackTrace();
|
BufferedReader r = new BufferedReader(new InputStreamReader(connection.getInputStream()));
|
||||||
// }
|
|
||||||
/*
|
StringBuffer response = new StringBuffer();
|
||||||
String test = "Anch'io ho voglia di dare il mio contributo\n alla causa";
|
String inputLine;
|
||||||
String regularized = test.replaceAll("[\\s]+", " ");
|
while ((inputLine = r.readLine()) != null) {
|
||||||
System.out.println("Before: " + test + "\n" + "After: " + regularized);
|
response.append(inputLine);
|
||||||
regularized = test.replaceAll("[\\n]+", " ");
|
}
|
||||||
System.out.println("After: " + regularized);
|
|
||||||
*/
|
String out = response.toString();
|
||||||
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
public static void main(String[] args) {
|
||||||
|
String service = "http://dataminer-prototypes.d4science.org/wps/";
|
||||||
|
String token = "df2cc5f5-63ee-48c1-b2a6-1210030c57b8-843339462";
|
||||||
|
String sentence = "Per me si va nella città dolente";
|
||||||
|
sentence = "Querido amigo, te escribo, así que me distraigo un poco.";
|
||||||
|
sentence = "Per me si va in città";
|
||||||
|
|
||||||
|
NLpLanguageRecognizer recognizer = new NLpLanguageRecognizer(service, token, sentence);
|
||||||
|
try {
|
||||||
|
recognizer.run();
|
||||||
|
} catch (Exception x) {
|
||||||
|
x.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
}*/
|
||||||
}
|
}
|
||||||
|
|
|
@ -80,7 +80,6 @@ public class NlpNerRunner extends DataminerClient {
|
||||||
for (String key : mapResource.getMap().keySet()) {
|
for (String key : mapResource.getMap().keySet()) {
|
||||||
Resource r = mapResource.getMap().get(key);
|
Resource r = mapResource.getMap().get(key);
|
||||||
if (r.isFile()) {
|
if (r.isFile()) {
|
||||||
|
|
||||||
FileResource f = (FileResource) r;
|
FileResource f = (FileResource) r;
|
||||||
String mimeType = f.getMimeType();
|
String mimeType = f.getMimeType();
|
||||||
if (mimeType.equalsIgnoreCase("application/d4science")) {
|
if (mimeType.equalsIgnoreCase("application/d4science")) {
|
||||||
|
@ -104,9 +103,11 @@ public class NlpNerRunner extends DataminerClient {
|
||||||
for (String id : identifiers) {
|
for (String id : identifiers) {
|
||||||
try {
|
try {
|
||||||
super.identifier = id;
|
super.identifier = id;
|
||||||
|
System.out.println("Running: " + id);
|
||||||
super.init();
|
super.init();
|
||||||
List<Parameter> parameters = mapParameters(filePublicLink, annotations);
|
List<Parameter> parameters = mapParameters(filePublicLink, annotations);
|
||||||
super.execute(parameters);
|
super.execute(parameters);
|
||||||
|
System.out.println("Runned: " + id);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
logger.error(e.getLocalizedMessage());
|
logger.error(e.getLocalizedMessage());
|
||||||
throw new NlpHubException(e.getLocalizedMessage(), e);
|
throw new NlpHubException(e.getLocalizedMessage(), e);
|
||||||
|
@ -123,7 +124,7 @@ public class NlpNerRunner extends DataminerClient {
|
||||||
if (outputLinks.size() == identifiers.length) {
|
if (outputLinks.size() == identifiers.length) {
|
||||||
String[] links = new String[outputLinks.size()];
|
String[] links = new String[outputLinks.size()];
|
||||||
links = outputLinks.toArray(links);
|
links = outputLinks.toArray(links);
|
||||||
System.out.println("testEndOfProcess");
|
//System.out.println("testEndOfProcess");
|
||||||
writeResponse(links);
|
writeResponse(links);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,53 @@
|
||||||
|
package org.gcube.nlphub.nlp;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
public class NlpUtils {
|
||||||
|
|
||||||
|
public static String getLanguageRecognizerDigest(String content) {
|
||||||
|
int minToken = 10;
|
||||||
|
|
||||||
|
content = content.trim();
|
||||||
|
String[] tokens = content.split("\\.");
|
||||||
|
if(tokens.length == 1)
|
||||||
|
tokens = content.split(";");
|
||||||
|
if(tokens.length == 1)
|
||||||
|
return content;
|
||||||
|
|
||||||
|
ArrayList<String> list = new ArrayList<>();
|
||||||
|
|
||||||
|
for(int i=0; i<tokens.length; i++) {
|
||||||
|
int n = countTokens(tokens[i]);
|
||||||
|
if(n >= minToken) {
|
||||||
|
list.add(tokens[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(list.isEmpty())
|
||||||
|
return content;
|
||||||
|
|
||||||
|
String digest = list.get(0);
|
||||||
|
for(String s : list) {
|
||||||
|
if(s.length() < digest.length())
|
||||||
|
digest = s;
|
||||||
|
}
|
||||||
|
return digest;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int countTokens(String content) {
|
||||||
|
return content.split("\\s").length;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
public static void main(String[] args) {
|
||||||
|
String text = "Per me si va nella Città dolente.\n Per me si va tra la perduta Gente";
|
||||||
|
text = "North Korea has agreed to send a delegation to next month's Winter Olympics in South Korea, the first notable breakthrough to come out of a face-to-face meeting Tuesday between the neighboring nations.";
|
||||||
|
text += "In talks, held at the border village of Panmunjom or \"truce village,\" in the Korean peninsula\'s heavily fortified demilitarized zone, North Korea negotiators agreed to send a \"high-level delegation\" comprising athletes, a cheering squad, an art troupe, a visitors\' group, a Taekwondo demonstration team and a press corps, South Korea\'s Unification Ministry told reporters in Seoul.";
|
||||||
|
text += "Unification Vice Minister Chun Hae-sung also announced that both sides plan to re-open a military hotline on the western Korean Peninsula.";
|
||||||
|
text += "The hotline was one of many that were closed as inter-Korean relations soured.";
|
||||||
|
|
||||||
|
System.out.println(getLanguageRecognizerDigest(text));
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
}
|
|
@ -0,0 +1,60 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>Colors</title>
|
||||||
|
<script type="text/javascript">
|
||||||
|
var hexLetters = '0123456789ABCDEF';
|
||||||
|
|
||||||
|
enhanceColor = function(color) {
|
||||||
|
var c = eval("0x" + color);
|
||||||
|
var hi = Math.round(c / 16);
|
||||||
|
if (hi < 15) {
|
||||||
|
hi += Math.round((15 - hi) / 1.5);
|
||||||
|
}
|
||||||
|
if (hi > 15)
|
||||||
|
hi = 15;
|
||||||
|
return '' + hexLetters[hi] + hexLetters[c % 16];
|
||||||
|
}
|
||||||
|
|
||||||
|
randomRGB = function() {
|
||||||
|
var color = '';
|
||||||
|
var couple = '';
|
||||||
|
for (var i = 0; i < 3; i++) {
|
||||||
|
//do {
|
||||||
|
couple = '' + hexLetters[Math.floor(Math.random() * 10)]
|
||||||
|
+ hexLetters[Math.floor(Math.random() * 16)];
|
||||||
|
// for (j = 0; j < 2; j++) {
|
||||||
|
// couple += letters[Math.floor(Math.random() * 16)];
|
||||||
|
// }
|
||||||
|
//} while ((255 - parseInt("0x" + couple)) < 128)
|
||||||
|
color += couple;
|
||||||
|
}
|
||||||
|
|
||||||
|
return color;
|
||||||
|
}
|
||||||
|
|
||||||
|
changeColor = function() {
|
||||||
|
var color = randomRGB();
|
||||||
|
var complemetar = 0xFFFFFF - eval("0x" + color.substring(1));
|
||||||
|
var complement = complemetar.toString(16);
|
||||||
|
var R = enhanceColor(complement.substring(0, 2));
|
||||||
|
var G = enhanceColor(complement.substring(2, 4));
|
||||||
|
var B = enhanceColor(complement.substring(4));
|
||||||
|
complement = "#" + R + G + B;
|
||||||
|
var span = document.getElementsByTagName("SPAN");
|
||||||
|
span[0].setAttribute("style", "color:#" + color + "; font-weight:bold;");
|
||||||
|
span[1].setAttribute("style", "color:#" + color + "; background:"
|
||||||
|
+ complement + "; font-weight:bold;");
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
</head>
|
||||||
|
<body onload="changeColor()">
|
||||||
|
<div>
|
||||||
|
<span>TEST COLORE</span>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<span>TEST COLORE + SFONDO</span>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -17,692 +17,8 @@
|
||||||
<script type="text/javascript" src="js/materialize.min.js"></script>
|
<script type="text/javascript" src="js/materialize.min.js"></script>
|
||||||
<script type="text/javascript" src="js/jquery.simple.websocket.min.js"></script>
|
<script type="text/javascript" src="js/jquery.simple.websocket.min.js"></script>
|
||||||
<script type="text/javascript" src="js/jquery.uploadfile.min.js"></script>
|
<script type="text/javascript" src="js/jquery.uploadfile.min.js"></script>
|
||||||
|
<script type="text/javascript" src="js/main.js"></script>
|
||||||
<script type="text/javascript" src="js/merge.js"></script>
|
<script type="text/javascript" src="js/merge.js"></script>
|
||||||
<!-- <script type="text/javascript" src="js/main.js"></script> -->
|
|
||||||
<!-- scripting code -->
|
|
||||||
<script type="text/javascript">
|
|
||||||
var tableRawSize = 5;
|
|
||||||
var annotations = [];
|
|
||||||
var algorithms = [];
|
|
||||||
var languages = [];
|
|
||||||
var publicLink = null;
|
|
||||||
var pageGreen = "#4CAF50";
|
|
||||||
var pageGray = "#A0A0A0";
|
|
||||||
var savedAnnotations = "";
|
|
||||||
var jsonContent = null;
|
|
||||||
var named = null;
|
|
||||||
var resultText = "";
|
|
||||||
|
|
||||||
// ------------------------------------------------------------------------------------------------------
|
|
||||||
// Starting point: get the csv file with algorithm parameters and set the page with valid algs info.
|
|
||||||
// ------------------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
$
|
|
||||||
.ajax({
|
|
||||||
url : "https://data.d4science.org/bnp4UDNyb21lSURkQXdDUnlSS0JkVWgzWk1KMUxWVGZHbWJQNStIS0N6Yz0",
|
|
||||||
type : "GET",
|
|
||||||
async : true,
|
|
||||||
contentType : "text/plain; charset=utf-8",
|
|
||||||
success : function(data, stato) {
|
|
||||||
$("#ner-result-container").hide();
|
|
||||||
var lineTokens = manageCsvData(data);
|
|
||||||
getAlgorithms(lineTokens);
|
|
||||||
buildLanguageSelection();
|
|
||||||
buildLanguageList();
|
|
||||||
buildAnnotations();
|
|
||||||
resizeTable();
|
|
||||||
resizeLogo();
|
|
||||||
|
|
||||||
$("#back-ner-ui-button").click(function() {
|
|
||||||
$("#ner-result-container").hide();
|
|
||||||
$("#ner-ui").show();
|
|
||||||
$("#input-textarea").val("");
|
|
||||||
publicLink = null;
|
|
||||||
jsonContent = null;
|
|
||||||
});
|
|
||||||
|
|
||||||
$("#execute-button").css("background-color", pageGray);
|
|
||||||
|
|
||||||
$("#upload-button")
|
|
||||||
.uploadFile(
|
|
||||||
{
|
|
||||||
url : "/nlphub/nlphub-uploader-servlet",
|
|
||||||
fileName : "mytxtfile",
|
|
||||||
maxFileCount : 100,
|
|
||||||
multiple : false,
|
|
||||||
maxFileSize : 1024 * 1000 * 6.14,
|
|
||||||
showFileCounter : false,
|
|
||||||
showCancel : true,
|
|
||||||
dragDropStr : "<img class='img-prompt' src='img/upload.png' width='60px' height='60px' style='display:block; margin:auto; padding: 10px'>",
|
|
||||||
extErrorStr : "Error. Text file only",
|
|
||||||
sizeErrorStr : "Error. Max size: 6 Mb",
|
|
||||||
onLoad : function(obj) {
|
|
||||||
$("#file-info").remove();
|
|
||||||
$("#reset-upload").remove();
|
|
||||||
$("#fu-container")
|
|
||||||
.append(
|
|
||||||
"<div id=\"right-child\" class=\"float-right-div\"></div>");
|
|
||||||
$("#right-child")
|
|
||||||
.append(
|
|
||||||
"<div id=\"file-info\" class=\"centered\"></div>");
|
|
||||||
$("#right-child")
|
|
||||||
.append(
|
|
||||||
"<div id=\"reset-upload\" class=\"centered\">Cancel</div>");
|
|
||||||
$("#reset-upload").hide();
|
|
||||||
$("#reset-upload")
|
|
||||||
.click(
|
|
||||||
function() {
|
|
||||||
resetExecuteButton();
|
|
||||||
$("#file-info")
|
|
||||||
.empty();
|
|
||||||
$(
|
|
||||||
"#reset-upload")
|
|
||||||
.css(
|
|
||||||
"display",
|
|
||||||
"none");
|
|
||||||
textAreaEnable(true);
|
|
||||||
});
|
|
||||||
savedAnnotations = "";
|
|
||||||
setEventListeners();
|
|
||||||
},
|
|
||||||
onSelect : function(files) {
|
|
||||||
showProgress();
|
|
||||||
textAreaEnable(false);
|
|
||||||
$("#input-textarea").val("");
|
|
||||||
},
|
|
||||||
onSuccess : function(files, data, xhr) {
|
|
||||||
hideProgress();
|
|
||||||
$("#reset-upload").css("display",
|
|
||||||
"inline");
|
|
||||||
console.log("files: " + files);
|
|
||||||
$("#file-info").empty();
|
|
||||||
$("#file-info")
|
|
||||||
.append(
|
|
||||||
"Uploaded: <span style=\"color:#4CAF50; letter-spacing: 1px; font-weight: bold;\">"
|
|
||||||
+ files
|
|
||||||
+ "</span>");
|
|
||||||
publicLink = data.message;
|
|
||||||
$("#execute-button").css(
|
|
||||||
"background-color",
|
|
||||||
pageGreen);
|
|
||||||
if (publicLink == null) {
|
|
||||||
alert("Error uploading file.");
|
|
||||||
}
|
|
||||||
},
|
|
||||||
onError : function(files, status,
|
|
||||||
errMsg, pd) {
|
|
||||||
hideProgress();
|
|
||||||
textAreaEnable(true);
|
|
||||||
alert(errMsg);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
},
|
|
||||||
error : function(richiesta, stato, errori) {
|
|
||||||
alert("Unexpected Error. Status: " + richiesta.status);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
manageCsvData = function(data) {
|
|
||||||
// first of all: split on the "newline" character in order to
|
|
||||||
// get all lines.
|
|
||||||
var lines = data.split("\n");
|
|
||||||
var tokens = [], lineTokens = [];
|
|
||||||
|
|
||||||
// second: parse each line
|
|
||||||
for (i in lines) {
|
|
||||||
var line = ',' + lines[i];
|
|
||||||
var tokenStart = -1;
|
|
||||||
for (var j = 0; j < line.length; j++) {
|
|
||||||
if (line.charAt(j) == '\"') {
|
|
||||||
j = line.indexOf('\"', j + 1);
|
|
||||||
if (j < 0)
|
|
||||||
return;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (line.charAt(j) == ',') {
|
|
||||||
if (tokenStart == -1) {
|
|
||||||
tokenStart = j;
|
|
||||||
} else {
|
|
||||||
tokens[tokens.length] = line.substring(tokenStart + 1,
|
|
||||||
j);
|
|
||||||
tokenStart = j;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// get the new token and push it in the array
|
|
||||||
tokens[tokens.length] = line.substring(tokenStart + 1);
|
|
||||||
lineTokens[lineTokens.length] = tokens;
|
|
||||||
tokens = [];
|
|
||||||
}
|
|
||||||
|
|
||||||
return lineTokens;
|
|
||||||
}
|
|
||||||
|
|
||||||
getAlgorithms = function(lineTokens) {
|
|
||||||
// build the list of supported algorithms
|
|
||||||
for (i = 0; i < lineTokens.length; i++) {
|
|
||||||
if ((i == 0) || (lineTokens[i].length != 8))
|
|
||||||
continue; // skip the header
|
|
||||||
if (lineTokens[i][7].trim().toUpperCase() == "OK") {
|
|
||||||
var algName = lineTokens[i][0].trim();
|
|
||||||
var algDescription = lineTokens[i][1].trim();
|
|
||||||
var algId = lineTokens[i][2].trim();
|
|
||||||
var annotationList = lineTokens[i][3].replace(/"/g, " ").trim();
|
|
||||||
var language = lineTokens[i][4].replace(/"/g, " ").trim();
|
|
||||||
|
|
||||||
algorithms[algorithms.length] = {
|
|
||||||
"name" : algName,
|
|
||||||
"description" : algDescription,
|
|
||||||
"id" : algId,
|
|
||||||
"lang" : language,
|
|
||||||
"annotations" : annotationList
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
buildAnnotationsAndLanguages = function() {
|
|
||||||
// extract data about languages and annotations in order to populate the proper
|
|
||||||
// controls in the page
|
|
||||||
buildLanguageSelection();
|
|
||||||
buildAnnotations();
|
|
||||||
|
|
||||||
}*/
|
|
||||||
|
|
||||||
buildAnnotations = function() {
|
|
||||||
annotations = [];
|
|
||||||
var language = $("#language-select").val();
|
|
||||||
for (i in algorithms) {
|
|
||||||
if(algorithms[i].lang.toLowerCase() != language.toLowerCase())
|
|
||||||
continue;
|
|
||||||
var annotationList = algorithms[i].annotations;
|
|
||||||
var a = annotationList.split(/\s|,/);
|
|
||||||
for (j in a) {
|
|
||||||
a[j] = a[j].trim();
|
|
||||||
if (a[j].length > 0) {
|
|
||||||
var thereIs = false;
|
|
||||||
for (k in annotations) {
|
|
||||||
if (annotations[k].toUpperCase() == a[j].toUpperCase()) {
|
|
||||||
thereIs = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!thereIs)
|
|
||||||
annotations[annotations.length] = a[j];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
buildLanguageSelection = function() {
|
|
||||||
for (i in algorithms) {
|
|
||||||
var languageList = algorithms[i].lang;
|
|
||||||
var langs = languageList.split(/\s|,/);
|
|
||||||
for (j in langs) {
|
|
||||||
langs[j] = langs[j].trim();
|
|
||||||
if (langs[j].length > 0) {
|
|
||||||
var thereIs = false;
|
|
||||||
for (k in languages) {
|
|
||||||
if (languages[k].toUpperCase() == langs[j].toUpperCase()) {
|
|
||||||
thereIs = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!thereIs)
|
|
||||||
languages[languages.length] = langs[j];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
setEventListeners = function() {
|
|
||||||
$("#input-textarea").on("keyup", function() {
|
|
||||||
if ($("#input-textarea").val() == "")
|
|
||||||
$("#execute-button").css("background-color", pageGray);
|
|
||||||
else
|
|
||||||
$("#execute-button").css("background-color", pageGreen);
|
|
||||||
});
|
|
||||||
|
|
||||||
$("#execute-button")
|
|
||||||
.click(
|
|
||||||
function() {
|
|
||||||
if ((publicLink == null)
|
|
||||||
&& ($("#input-textarea").val() == "")) {
|
|
||||||
alert("You must upload a file or write some text in the text area before submit a request.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
showProgress();
|
|
||||||
// if some text has been written in the text area, then a corresponding text file
|
|
||||||
// must be written in the workspace and the public link is set.
|
|
||||||
if ($("#input-textarea").val().length > 0) {
|
|
||||||
freeText = $("#input-textarea").val();
|
|
||||||
$
|
|
||||||
.ajax({
|
|
||||||
url : "/nlphub/nlphub-uploader-servlet?freetext="
|
|
||||||
+ encodeURI(freeText),
|
|
||||||
type : "POST",
|
|
||||||
async : true,
|
|
||||||
contentType : "text/plain; charset=utf-8",
|
|
||||||
success : function(data, stato) {
|
|
||||||
publicLink = data.message;
|
|
||||||
if (publicLink == null) {
|
|
||||||
alert("Error uploading file.");
|
|
||||||
}
|
|
||||||
launchAlgorithm();
|
|
||||||
},
|
|
||||||
error : function(richiesta, stato,
|
|
||||||
errori) {
|
|
||||||
alert("Unexpected Error. Status: "
|
|
||||||
+ richiesta.status);
|
|
||||||
hideProgress();
|
|
||||||
textAreaEnable(true);
|
|
||||||
$("#file-info").empty();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
else {
|
|
||||||
launchAlgorithm();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
showProgress = function() {
|
|
||||||
var width = $(".progress-circular-div").width();
|
|
||||||
var height = $(".progress-circular-div").height();
|
|
||||||
var left = parseInt((window.innerWidth - width) / 2);
|
|
||||||
var top = parseInt((window.innerHeight - height) / 2);
|
|
||||||
$(".progress-circular-div").css("left", left);
|
|
||||||
$(".progress-circular-div").css("top", top);
|
|
||||||
$(".hidden-div").css("display", "block");
|
|
||||||
}
|
|
||||||
|
|
||||||
hideProgress = function() {
|
|
||||||
$(".hidden-div").css("display", "none");
|
|
||||||
}
|
|
||||||
|
|
||||||
launchAlgorithm = function() {
|
|
||||||
if (publicLink == null) {
|
|
||||||
alert("No input text available for the service.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
var list = buildInputAnnotationList();
|
|
||||||
var annList = "";
|
|
||||||
for (i in list) {
|
|
||||||
annList += list[i] + ",";
|
|
||||||
}
|
|
||||||
annList = annList.substring(0, annList.length - 1);
|
|
||||||
savedAnnotations = annList;
|
|
||||||
|
|
||||||
var algList = "";
|
|
||||||
for (j in algorithms) {
|
|
||||||
if(algorithms[j].lang.toLowerCase().indexOf($("#language-select").val().toLowerCase()) >= 0) {
|
|
||||||
algList += encodeURI(algorithms[j].id) + ",";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(algList.length == 0) {
|
|
||||||
alert("Warning. No algorithm matching with selected language.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
algList = algList.substring(0, algList.length - 1);
|
|
||||||
|
|
||||||
var parameters = "annotations=" + annList;
|
|
||||||
parameters += "&lang=" + $("#language-select").val();
|
|
||||||
parameters += "&plink=" + encodeURI(publicLink);
|
|
||||||
parameters += "&algs=" + algList;
|
|
||||||
|
|
||||||
$.ajax({
|
|
||||||
url : "/nlphub/nlphub-servlet?" + parameters,
|
|
||||||
type : "POST",
|
|
||||||
async : true,
|
|
||||||
success : function(data, stato) {
|
|
||||||
textAreaEnable(true);
|
|
||||||
$("#file-info").empty();
|
|
||||||
if (typeof (data.response) != 'undefined') {
|
|
||||||
var jsonOut = getOutputJson(data.message);
|
|
||||||
} else if (typeof (data.error) != 'undefined') {
|
|
||||||
hideProgress();
|
|
||||||
alert(data.message);
|
|
||||||
} else {
|
|
||||||
hideProgress();
|
|
||||||
alert("Unexpected response");
|
|
||||||
}
|
|
||||||
resetExecuteButton();
|
|
||||||
},
|
|
||||||
error : function(richiesta, stato, errori) {
|
|
||||||
hideProgress();
|
|
||||||
textAreaEnable(true);
|
|
||||||
alert("Unexpected Error. Status: " + richiesta.status);
|
|
||||||
resetExecuteButton();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
getOutputJson = function(message) {
|
|
||||||
var tobemap = "";
|
|
||||||
for (var i = 0; i < message.length; i++) {
|
|
||||||
tobemap += message[i] + "|";
|
|
||||||
}
|
|
||||||
|
|
||||||
tobemap = tobemap.substring(0, tobemap.length - 1);
|
|
||||||
|
|
||||||
var parameters = "annotations=" + savedAnnotations;
|
|
||||||
parameters += "&plink=" + encodeURI(publicLink);
|
|
||||||
parameters += "&lang=" + $("#language-select").val();
|
|
||||||
parameters += "&tobemap=" + encodeURI(tobemap);
|
|
||||||
console.log(parameters);
|
|
||||||
|
|
||||||
$.ajax({
|
|
||||||
url : "/nlphub/nlphub-mapper-servlet?" + parameters,
|
|
||||||
type : "POST",
|
|
||||||
async : true,
|
|
||||||
success : function(data, stato) {
|
|
||||||
hideProgress();
|
|
||||||
console.log(data);
|
|
||||||
if((typeof (data.response) != "undefined") && (data.response.trim().toUpperCase() == "ERROR")) {
|
|
||||||
alert ("ERROR\n" + data.message);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
$("#reset-upload").hide();
|
|
||||||
savedAnnotations = "";
|
|
||||||
publicLink = null;
|
|
||||||
showResult(data);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
error : function(richiesta, stato, errori) {
|
|
||||||
hideProgress();
|
|
||||||
$("#reset-upload").hide();
|
|
||||||
savedAnnotations = "";
|
|
||||||
publicLink = null;
|
|
||||||
alert("Unexpected Error. Status: " + richiesta.status);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
showResult = function(data) {
|
|
||||||
$("#ner-ui").hide();
|
|
||||||
$("#ner-result-container").show();
|
|
||||||
|
|
||||||
jsonContent = data;
|
|
||||||
//jsonContent = JSON.parse(purgeJson(data));
|
|
||||||
|
|
||||||
//resultText = jsonToText(jsonContent.output.text);
|
|
||||||
resultText = jsonContent.output.text;
|
|
||||||
|
|
||||||
$("#result-header").empty();
|
|
||||||
$("#result-params-div").empty();
|
|
||||||
$("#result-text-div").empty();
|
|
||||||
|
|
||||||
$("#result-header")
|
|
||||||
.append(
|
|
||||||
"<p>You can download the overall result as a JSON file <a href='" + jsonContent.link +"'>here</a></p>");
|
|
||||||
var localText = resultText;
|
|
||||||
localText = resultText.replace(/\n/g, "<br>");
|
|
||||||
$("#result-text-div").empty();
|
|
||||||
$("#result-text-div").append("<p>" + localText + "</p>");
|
|
||||||
|
|
||||||
showAnnotationList(jsonContent.output.annotations);
|
|
||||||
}
|
|
||||||
|
|
||||||
showAnnotationList = function(list) {
|
|
||||||
var colorDisabled = "CCCCCC";
|
|
||||||
var color;
|
|
||||||
var colors = [];
|
|
||||||
var annotations = list.split(",");
|
|
||||||
for (var i = 0; i < annotations.length; i++) {
|
|
||||||
do {
|
|
||||||
color = randomRGB();
|
|
||||||
}
|
|
||||||
while(color == colorDisabled);
|
|
||||||
colors[colors.length] = color;
|
|
||||||
}
|
|
||||||
|
|
||||||
$("#result-params-div")
|
|
||||||
.append("<form id='colored-annotations'></form>");
|
|
||||||
for (var i = 0; i < annotations.length; i++) {
|
|
||||||
var cb = "<input type='radio' name='foo' ";
|
|
||||||
if(!checkAnnotation(annotations[i])) {
|
|
||||||
cb += "disabled ";
|
|
||||||
colors[i] = colorDisabled;
|
|
||||||
}
|
|
||||||
cb += "named='" + annotations[i] + "' value='" + colors[i] + "' id='color-" + i + "' class='filled-in'>";
|
|
||||||
cb += "<label for='color-" + i + "'><span style='font-weight:bold; color:#" + colors[i] + "'>"
|
|
||||||
+ annotations[i] + "</span></label><br>";
|
|
||||||
$("#colored-annotations").append(cb);
|
|
||||||
}
|
|
||||||
$("#colored-annotations :radio").change(function() {
|
|
||||||
if (this.checked) {
|
|
||||||
rewriteText(this.getAttribute("named"), "#" + this.value);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
countSubstringOccurrencies = function(string, substring) {
|
|
||||||
var occurrencies = 0;
|
|
||||||
var index = 0;
|
|
||||||
var s = string;
|
|
||||||
while(index >= 0) {
|
|
||||||
index = s.indexOf(substring);
|
|
||||||
if(index >= 0) {
|
|
||||||
occurrencies++;
|
|
||||||
s = s.substring(index + 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return occurrencies;
|
|
||||||
}
|
|
||||||
|
|
||||||
rewriteText = function(annotation, color) {
|
|
||||||
$("#result-text-div").empty();
|
|
||||||
console.log(annotation + " " + color);
|
|
||||||
var complement = "#"
|
|
||||||
+ (0xFFFFFF - eval("0x" + color.substring(1))).toString(16);
|
|
||||||
complement = "#F0F0F0";
|
|
||||||
var indices = getIndices(annotation);
|
|
||||||
var indexedText = "";
|
|
||||||
|
|
||||||
if ((typeof (indices) == 'undefined' ) || (indices.length == 0)) {
|
|
||||||
indexedText = resultText;
|
|
||||||
indexedText = indexedText.replace(/\n/g, "<br>");
|
|
||||||
$("#result-text-div").append("<p>" + indexedText + "</p>");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var t = 0;
|
|
||||||
var offset = 0;
|
|
||||||
for (var i = 0; i < indices.length; i++) {
|
|
||||||
var index = indices[i];
|
|
||||||
var start = index[0];
|
|
||||||
var end = index[1];
|
|
||||||
indexedText += resultText.substring(t, start);
|
|
||||||
offset += countSubstringOccurrencies(resultText.substring(t, start), "\n");
|
|
||||||
offset += countSubstringOccurrencies(resultText.substring(t, start), "\r");
|
|
||||||
offset += countSubstringOccurrencies(resultText.substring(t, start), "\t");
|
|
||||||
start += offset;
|
|
||||||
end += offset;
|
|
||||||
var colored = "<span style='color:" + color + "; background:" + complement + "; font-weight:bold;'>"
|
|
||||||
+ resultText.substring(start, end) + "</span>";
|
|
||||||
indexedText += colored;
|
|
||||||
t = end;
|
|
||||||
}
|
|
||||||
if (t < resultText.length)
|
|
||||||
indexedText += resultText.substring(t);
|
|
||||||
|
|
||||||
indexedText = indexedText.replace(/\n/g, "<br>");
|
|
||||||
$("#result-text-div").append("<p>" + indexedText + "</p>");
|
|
||||||
}
|
|
||||||
|
|
||||||
checkAnnotation = function(annotation) {
|
|
||||||
for (var i = 0; i < jsonContent.output.result.length; i++) {
|
|
||||||
var entities = jsonContent.output.result[i].entities;
|
|
||||||
for (var j = 0; j < entities.length; j++) {
|
|
||||||
a = entities[j][annotation];
|
|
||||||
if (typeof a != 'undefined') {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
getIndices = function(annotation) {
|
|
||||||
var indices = [];
|
|
||||||
// get indices
|
|
||||||
for (var i = 0; i < jsonContent.output.result.length; i++) {
|
|
||||||
var entities = jsonContent.output.result[i].entities;
|
|
||||||
for (var j = 0; j < entities.length; j++) {
|
|
||||||
a = entities[j][annotation];
|
|
||||||
if (typeof a != 'undefined') {
|
|
||||||
indices[i] = [];
|
|
||||||
for (var k = 0; k < a.length; k++) {
|
|
||||||
var index = a[k].indices;
|
|
||||||
indices[i][k] = index;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var indices2 = [];
|
|
||||||
for(var i=0; i<indices.length; i++) {
|
|
||||||
if(typeof (indices[i]) != 'undefined')
|
|
||||||
indices2[indices2.length] = indices[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
return mergeIndices(indices2);
|
|
||||||
}
|
|
||||||
|
|
||||||
mergeIndices = function(indices) {
|
|
||||||
var newIndices = []
|
|
||||||
if (indices.length <= 1)
|
|
||||||
newIndices = indices[0];
|
|
||||||
else
|
|
||||||
newIndices = mergeAll(indices);
|
|
||||||
return newIndices;
|
|
||||||
}
|
|
||||||
|
|
||||||
resetExecuteButton = function() {
|
|
||||||
publicLink = null;
|
|
||||||
$("#execute-button").css("background-color", pageGray);
|
|
||||||
}
|
|
||||||
|
|
||||||
resizeTable = function() {
|
|
||||||
// resize the annotation table
|
|
||||||
$("#annotations-table").empty();
|
|
||||||
var rowId = "";
|
|
||||||
var ratio = window.innerWidth / window.innerHeight;
|
|
||||||
|
|
||||||
if (ratio <= 0.35) {
|
|
||||||
tableRawSize = 1;
|
|
||||||
} else if ((ratio > 0.35) && (ratio <= 0.75)) {
|
|
||||||
tableRawSize = 2;
|
|
||||||
} else if ((ratio > 0.75) && (ratio <= 1)) {
|
|
||||||
tableRawSize = 3;
|
|
||||||
} else if ((ratio > 1) && (ratio <= 1.5)) {
|
|
||||||
tableRawSize = 4;
|
|
||||||
} else {
|
|
||||||
tableRawSize = 5;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (var i = 0; i < annotations.length; i++) {
|
|
||||||
if (i % tableRawSize == 0) {
|
|
||||||
rowId = "row-" + i;
|
|
||||||
$("#annotations-table").append("<tr id=\"" + rowId +"\"></tr>");
|
|
||||||
}
|
|
||||||
var annotationElement = "<input type=\"checkbox\" id=\"check-" + i + "\" value=\"" + annotations[i] + "\" checked=\"checked\"></input> <label for=\"check-" + i + "\">"
|
|
||||||
+ annotations[i] + "</label>";
|
|
||||||
$("#" + rowId).append("<td>" + annotationElement + "</td>");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
resizeLogo = function() {
|
|
||||||
if (window.innerWidth < 200)
|
|
||||||
$("#logo-image").width(window.innerWidth - 10);
|
|
||||||
}
|
|
||||||
|
|
||||||
buildInputAnnotationList = function() {
|
|
||||||
var list = [];
|
|
||||||
for (var i = 0; i < annotations.length; i++) {
|
|
||||||
if ($("#check-" + i).is(":Checked"))
|
|
||||||
list[list.length] = $("#check-" + i).val();
|
|
||||||
}
|
|
||||||
return list;
|
|
||||||
}
|
|
||||||
|
|
||||||
// event handlers
|
|
||||||
window.onresize = function(event) {
|
|
||||||
resizeTable();
|
|
||||||
resizeLogo();
|
|
||||||
};
|
|
||||||
|
|
||||||
$(".ajax-file-upload-abort").on("DOMAttrModified", function(event) {
|
|
||||||
$(".ajax-file-upload-abort").css("display", "none");
|
|
||||||
if (event.attributeName == "display") { // which attribute you want to watch for changes
|
|
||||||
$(".ajax-file-upload-abort").css("display", "none");
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
buildLanguageList = function() {
|
|
||||||
// build the language selection input control
|
|
||||||
for (i in languages) {
|
|
||||||
var opt = "<option value=\"" + languages[i] + "\" selected=\"selected\">"
|
|
||||||
+ languages[i] + "</option>";
|
|
||||||
if (i > 1)
|
|
||||||
opt = "<option value=\"" + languages[i] + "\">" + languages[i]
|
|
||||||
+ "</option>";
|
|
||||||
$("#language-select").append(opt);
|
|
||||||
}
|
|
||||||
$("#language-select").on("change", function() {
|
|
||||||
selectAnnotationsByLanguage();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
selectAnnotationsByLanguage = function() {
|
|
||||||
buildAnnotations();
|
|
||||||
resizeTable();
|
|
||||||
}
|
|
||||||
|
|
||||||
textAreaEnable = function(enable) {
|
|
||||||
if (enable == true)
|
|
||||||
$("#input-textarea").prop('disabled', false);
|
|
||||||
else
|
|
||||||
$("#input-textarea").prop('disabled', true);
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
purgeJson = function(json) {
|
|
||||||
console.log("purgeJson:before: " + json.length);
|
|
||||||
var purged = json.replace(/\n/g, "\\\\n").replace(/\r/g, "\\\\r")
|
|
||||||
.replace(/\t/g, "\\\\t");
|
|
||||||
console.log("purgeJson:after : " + purged.length);
|
|
||||||
return purged;
|
|
||||||
}
|
|
||||||
|
|
||||||
jsonToText = function(json) {
|
|
||||||
console.log("jsonToText:before: " + json.length);
|
|
||||||
var purged = json.replace(/\\n/g, "");
|
|
||||||
console.log("jsonToText:after : " + purged.length);
|
|
||||||
return purged;
|
|
||||||
//return json.replace(/\\n/g, "\n");
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
randomRGB = function() {
|
|
||||||
var letters = '0123456789ABCDEF';
|
|
||||||
var color = '';
|
|
||||||
var couple = '';
|
|
||||||
for(var i=0; i < 3; i++) {
|
|
||||||
do {
|
|
||||||
couple = '';
|
|
||||||
for(j=0; j<2; j++) {
|
|
||||||
couple += letters[Math.floor(Math.random() * 16)];
|
|
||||||
}
|
|
||||||
} while((255 - parseInt("0x" + couple)) < 48)
|
|
||||||
color += couple;
|
|
||||||
}
|
|
||||||
|
|
||||||
return color;
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
</head>
|
</head>
|
||||||
<body style="padding: 0 15px;">
|
<body style="padding: 0 15px;">
|
||||||
|
|
|
@ -1,156 +1,763 @@
|
||||||
$(document).ready(function(){
|
var tableRawSize = 5;
|
||||||
|
var annotations = [];
|
||||||
|
var algorithms = [];
|
||||||
|
var languages = [];
|
||||||
|
var publicLink = null;
|
||||||
|
var pageGreen = "#4CAF50";
|
||||||
|
var pageGray = "#A0A0A0";
|
||||||
|
var savedAnnotations = "";
|
||||||
|
var jsonContent = null;
|
||||||
|
var named = null;
|
||||||
|
var resultText = "";
|
||||||
|
var hexLetters = '0123456789ABCDEF';
|
||||||
|
|
||||||
// $("#upload-button").uploadFile({
|
// ------------------------------------------------------------------------------------------------------
|
||||||
// url : "uploader.php",
|
// Starting point: get the csv file with algorithm parameters and set the page
|
||||||
// fileName : "myfile",
|
// with valid algs info.
|
||||||
// maxFileCount : 100,
|
// ------------------------------------------------------------------------------------------------------
|
||||||
// multiple : false,
|
|
||||||
// maxFileSize : 1024 * 1000 * 1,
|
|
||||||
// showFileCounter : false,
|
|
||||||
// showCancel : true,
|
|
||||||
// allowedTypes : "txt",
|
|
||||||
// //dragDropStr : "<img class='img-prompt' src='images/upload.png' width='60px' height='60px' style='display:block; margin:auto;'>",
|
|
||||||
// doneStr : "Done",
|
|
||||||
// abortStr : "End",
|
|
||||||
// cancelStr : "Cancel",
|
|
||||||
// extErrorStr : "Only text file (.txt), please",
|
|
||||||
// sizeErrorStr : "Max size: 1 Mb",
|
|
||||||
// onLoad : function(obj) {
|
|
||||||
// //resizeTutor();
|
|
||||||
// },
|
|
||||||
// onSuccess : function(files, data, xhr) {
|
|
||||||
// alert("Success");
|
|
||||||
// /*$(".ajax-file-upload-statusbar")
|
|
||||||
// .hide();
|
|
||||||
// $(".obfuscating").css('opacity', '0.6');
|
|
||||||
// $(".obfuscating").show();
|
|
||||||
// $("#uploadedimg").attr("src", "images/" + uName + "/" + files[0]);
|
|
||||||
// source = $("#uploadedimg").attr("src");
|
|
||||||
// window.setTimeout(function(){ sizePopupUpload(); $("#popup-1-section").show();}, 500);*/
|
|
||||||
// },
|
|
||||||
// onError : function(files, status,
|
|
||||||
// errMsg, pd) {
|
|
||||||
// alert(errMsg);
|
|
||||||
// }
|
|
||||||
// });
|
|
||||||
|
|
||||||
|
$
|
||||||
|
.ajax({
|
||||||
|
url : "https://data.d4science.org/bnp4UDNyb21lSURkQXdDUnlSS0JkVWgzWk1KMUxWVGZHbWJQNStIS0N6Yz0",
|
||||||
|
type : "GET",
|
||||||
|
async : true,
|
||||||
|
contentType : "text/plain; charset=utf-8",
|
||||||
|
success : function(data, stato) {
|
||||||
|
$("#ner-result-container").hide();
|
||||||
|
var lineTokens = manageCsvData(data);
|
||||||
|
getAlgorithms(lineTokens);
|
||||||
|
buildLanguageSelection();
|
||||||
|
buildLanguageList();
|
||||||
|
buildAnnotations();
|
||||||
|
resizeTable();
|
||||||
|
resizeLogo();
|
||||||
|
|
||||||
$( "#execute-button" ).click(function() {
|
$("#back-ner-ui-button").click(function() {
|
||||||
var firstnameBox = $.trim( $('#input-textarea').val() )
|
$("#ner-result-container").hide();
|
||||||
if (firstnameBox == "") {
|
$("#ner-ui").show();
|
||||||
$('#input-textarea').css("border-color","red");
|
$("#input-textarea").val("");
|
||||||
$('#input-textarea').attr("placeholder", "Paste your text here!");
|
publicLink = null;
|
||||||
|
jsonContent = null;
|
||||||
|
});
|
||||||
|
|
||||||
|
$("#execute-button").css("background-color", pageGray);
|
||||||
|
|
||||||
|
$("#upload-button")
|
||||||
|
.uploadFile(
|
||||||
|
{
|
||||||
|
url : "/nlphub/nlphub-uploader-servlet",
|
||||||
|
fileName : "mytxtfile",
|
||||||
|
maxFileCount : 100,
|
||||||
|
multiple : false,
|
||||||
|
maxFileSize : 1024 * 1000 * 6.14,
|
||||||
|
showFileCounter : false,
|
||||||
|
showCancel : true,
|
||||||
|
dragDropStr : "<img class='img-prompt' src='img/upload.png' width='60px' height='60px' style='display:block; margin:auto; padding: 10px'>",
|
||||||
|
extErrorStr : "Error. Text file only",
|
||||||
|
sizeErrorStr : "Error. Max size: 6 Mb",
|
||||||
|
onLoad : function(obj) {
|
||||||
|
$("#file-info").remove();
|
||||||
|
$("#reset-upload").remove();
|
||||||
|
$("#fu-container")
|
||||||
|
.append(
|
||||||
|
"<div id=\"right-child\" class=\"float-right-div\"></div>");
|
||||||
|
$("#right-child")
|
||||||
|
.append(
|
||||||
|
"<div id=\"file-info\" class=\"centered\"></div>");
|
||||||
|
$("#right-child")
|
||||||
|
.append(
|
||||||
|
"<div id=\"reset-upload\" class=\"centered\">Cancel</div>");
|
||||||
|
$("#reset-upload").hide();
|
||||||
|
$("#reset-upload").click(
|
||||||
|
function() {
|
||||||
|
resetExecuteButton();
|
||||||
|
$("#file-info").empty();
|
||||||
|
$("#reset-upload").css(
|
||||||
|
"display", "none");
|
||||||
|
textAreaEnable(true);
|
||||||
|
});
|
||||||
|
savedAnnotations = "";
|
||||||
|
setEventListeners();
|
||||||
|
},
|
||||||
|
onSelect : function(files) {
|
||||||
|
showProgress();
|
||||||
|
textAreaEnable(false);
|
||||||
|
$("#input-textarea").val("");
|
||||||
|
},
|
||||||
|
onSuccess : function(files, data, xhr) {
|
||||||
|
hideProgress();
|
||||||
|
console.log('' + data.language);
|
||||||
|
checkLanguage(data.language);
|
||||||
|
selectAnnotationsByLanguage();
|
||||||
|
$("#reset-upload").css("display",
|
||||||
|
"inline");
|
||||||
|
console.log("files: " + files);
|
||||||
|
$("#file-info").empty();
|
||||||
|
$("#file-info")
|
||||||
|
.append(
|
||||||
|
"Uploaded: <span style=\"color:#4CAF50; letter-spacing: 1px; font-weight: bold;\">"
|
||||||
|
+ files
|
||||||
|
+ "</span>");
|
||||||
|
publicLink = data.message;
|
||||||
|
$("#execute-button").css(
|
||||||
|
"background-color", pageGreen);
|
||||||
|
if (publicLink == null) {
|
||||||
|
alert("Error uploading file.");
|
||||||
|
}
|
||||||
|
},
|
||||||
|
onError : function(files, status, errMsg,
|
||||||
|
pd) {
|
||||||
|
hideProgress();
|
||||||
|
textAreaEnable(true);
|
||||||
|
alert(errMsg);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
error : function(richiesta, stato, errori) {
|
||||||
|
alert("Unexpected Error. Status: " + richiesta.status);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Utility function processing the language indication returned by the language recognition service
|
||||||
|
*/
|
||||||
|
checkLanguage = function(lang) {
|
||||||
|
var options = $("#language-select option");
|
||||||
|
for(var i=0; i<options.length; i++) {
|
||||||
|
if(options[i].innerText.toLowerCase() == lang.toLowerCase()) {
|
||||||
|
$("#language-select").val(options[i].innerText);
|
||||||
|
buildAnnotations();
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
else {
|
}
|
||||||
$('#input-textarea').css("border-color","#555");
|
alert("The uploaded file seems to be written in " + lang + ", but this language is not supported by listed algorithms. Select the language you want, or try with another text.");
|
||||||
doStartComputation();
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* CSV parser
|
||||||
|
*/
|
||||||
|
manageCsvData = function(data) {
|
||||||
|
// first of all: split on the "newline" character in order to
|
||||||
|
// get all lines.
|
||||||
|
var lines = data.split("\n");
|
||||||
|
var tokens = [], lineTokens = [];
|
||||||
|
|
||||||
|
// second: parse each line
|
||||||
|
for (i in lines) {
|
||||||
|
var line = ',' + lines[i];
|
||||||
|
var tokenStart = -1;
|
||||||
|
for (var j = 0; j < line.length; j++) {
|
||||||
|
if (line.charAt(j) == '\"') {
|
||||||
|
j = line.indexOf('\"', j + 1);
|
||||||
|
if (j < 0)
|
||||||
|
return;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (line.charAt(j) == ',') {
|
||||||
|
if (tokenStart == -1) {
|
||||||
|
tokenStart = j;
|
||||||
|
} else {
|
||||||
|
tokens[tokens.length] = line.substring(tokenStart + 1, j);
|
||||||
|
tokenStart = j;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
// get the new token and push it in the array
|
||||||
|
tokens[tokens.length] = line.substring(tokenStart + 1);
|
||||||
|
lineTokens[lineTokens.length] = tokens;
|
||||||
|
tokens = [];
|
||||||
|
}
|
||||||
|
|
||||||
|
return lineTokens;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Map the supported algorithms (from CSV) in the internal global algorithm array
|
||||||
|
*/
|
||||||
|
getAlgorithms = function(lineTokens) {
|
||||||
|
// build the list of supported algorithms
|
||||||
|
for (i = 0; i < lineTokens.length; i++) {
|
||||||
|
if ((i == 0) || (lineTokens[i].length != 8))
|
||||||
|
continue; // skip the header
|
||||||
|
if (lineTokens[i][7].trim().toUpperCase() == "OK") {
|
||||||
|
var algName = lineTokens[i][0].trim();
|
||||||
|
var algDescription = lineTokens[i][1].trim();
|
||||||
|
var algId = lineTokens[i][2].trim();
|
||||||
|
var annotationList = lineTokens[i][3].replace(/"/g, " ").trim();
|
||||||
|
var language = lineTokens[i][4].replace(/"/g, " ").trim();
|
||||||
|
|
||||||
|
algorithms[algorithms.length] = {
|
||||||
|
"name" : algName,
|
||||||
|
"description" : algDescription,
|
||||||
|
"id" : algId,
|
||||||
|
"lang" : language,
|
||||||
|
"annotations" : annotationList
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Build the annotation list based on the language selected
|
||||||
|
*/
|
||||||
|
buildAnnotations = function() {
|
||||||
|
annotations = [];
|
||||||
|
var language = $("#language-select").val();
|
||||||
|
for (i in algorithms) {
|
||||||
|
if (algorithms[i].lang.toLowerCase() != language.toLowerCase())
|
||||||
|
continue;
|
||||||
|
var annotationList = algorithms[i].annotations;
|
||||||
|
var a = annotationList.split(/\s|,/);
|
||||||
|
for (j in a) {
|
||||||
|
a[j] = a[j].trim();
|
||||||
|
if (a[j].length > 0) {
|
||||||
|
var thereIs = false;
|
||||||
|
for (k in annotations) {
|
||||||
|
if (annotations[k].toUpperCase() == a[j].toUpperCase()) {
|
||||||
|
thereIs = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!thereIs)
|
||||||
|
annotations[annotations.length] = a[j];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Build the language array
|
||||||
|
*/
|
||||||
|
buildLanguageSelection = function() {
|
||||||
|
for (i in algorithms) {
|
||||||
|
var languageList = algorithms[i].lang;
|
||||||
|
var langs = languageList.split(/\s|,/);
|
||||||
|
for (j in langs) {
|
||||||
|
langs[j] = langs[j].trim();
|
||||||
|
if (langs[j].length > 0) {
|
||||||
|
var thereIs = false;
|
||||||
|
for (k in languages) {
|
||||||
|
if (languages[k].toUpperCase() == langs[j].toUpperCase()) {
|
||||||
|
thereIs = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!thereIs)
|
||||||
|
languages[languages.length] = langs[j];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set the listeners on the text area and the execute button
|
||||||
|
*/
|
||||||
|
setEventListeners = function() {
|
||||||
|
$("#input-textarea").on("keyup", function() {
|
||||||
|
if ($("#input-textarea").val() == "")
|
||||||
|
$("#execute-button").css("background-color", pageGray);
|
||||||
|
else
|
||||||
|
$("#execute-button").css("background-color", pageGreen);
|
||||||
});
|
});
|
||||||
|
|
||||||
doCallback = function(uri) {
|
$("#execute-button")
|
||||||
$.ajax({
|
.click(
|
||||||
url : "nlphub-servlet",
|
function() {
|
||||||
type : 'GET',
|
if ((publicLink == null)
|
||||||
datatype : 'json',
|
&& ($("#input-textarea").val() == "")) {
|
||||||
data : {
|
alert("You must upload a file or write some text in the text area before submit a request.");
|
||||||
uri : uri
|
return;
|
||||||
},
|
}
|
||||||
success : function(data) {
|
|
||||||
var obj = eval("(" + data + ")");
|
showProgress();
|
||||||
var str = JSON.stringify(obj, undefined, 4);
|
// if some text has been written in the text area, then
|
||||||
$('#result').html(syntaxHighlight(str));
|
// a corresponding text file
|
||||||
|
// must be written in the workspace and the public link
|
||||||
|
// is set.
|
||||||
|
if ($("#input-textarea").val().length > 0) {
|
||||||
|
freeText = $("#input-textarea").val();
|
||||||
|
$
|
||||||
|
.ajax({
|
||||||
|
url : "/nlphub/nlphub-uploader-servlet?freetext="
|
||||||
|
+ encodeURI(freeText),
|
||||||
|
type : "POST",
|
||||||
|
async : true,
|
||||||
|
contentType : "text/plain; charset=utf-8",
|
||||||
|
success : function(data, stato) {
|
||||||
|
publicLink = data.message;
|
||||||
|
// console.log(data.language);
|
||||||
|
if (publicLink == null) {
|
||||||
|
alert("Error uploading file.");
|
||||||
|
}
|
||||||
|
launchAlgorithm();
|
||||||
|
},
|
||||||
|
error : function(richiesta, stato,
|
||||||
|
errori) {
|
||||||
|
alert("Unexpected Error. Status: "
|
||||||
|
+ richiesta.status);
|
||||||
|
hideProgress();
|
||||||
|
textAreaEnable(true);
|
||||||
|
$("#file-info").empty();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
else {
|
||||||
|
launchAlgorithm();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* show the in-progress popup
|
||||||
|
*/
|
||||||
|
showProgress = function() {
|
||||||
|
var width = $(".progress-circular-div").width();
|
||||||
|
var height = $(".progress-circular-div").height();
|
||||||
|
var left = parseInt((window.innerWidth - width) / 2);
|
||||||
|
var top = parseInt((window.innerHeight - height) / 2);
|
||||||
|
$(".progress-circular-div").css("left", left);
|
||||||
|
$(".progress-circular-div").css("top", top);
|
||||||
|
$(".hidden-div").css("display", "block");
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* hide the in-progress popup
|
||||||
|
*/
|
||||||
|
hideProgress = function() {
|
||||||
|
$(".hidden-div").css("display", "none");
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* run the algorithms selected by the chosen language
|
||||||
|
*/
|
||||||
|
launchAlgorithm = function() {
|
||||||
|
if (publicLink == null) {
|
||||||
|
alert("No input text available for the service.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var list = buildInputAnnotationList();
|
||||||
|
var annList = "";
|
||||||
|
for (i in list) {
|
||||||
|
annList += list[i] + ",";
|
||||||
|
}
|
||||||
|
annList = annList.substring(0, annList.length - 1);
|
||||||
|
savedAnnotations = annList;
|
||||||
|
|
||||||
|
var algList = "";
|
||||||
|
for (j in algorithms) {
|
||||||
|
if (algorithms[j].lang.toLowerCase().indexOf(
|
||||||
|
$("#language-select").val().toLowerCase()) >= 0) {
|
||||||
|
algList += encodeURI(algorithms[j].id) + ",";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (algList.length == 0) {
|
||||||
|
alert("Warning. No algorithm matching with selected language.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
algList = algList.substring(0, algList.length - 1);
|
||||||
|
|
||||||
|
var parameters = "annotations=" + annList;
|
||||||
|
parameters += "&lang=" + $("#language-select").val();
|
||||||
|
parameters += "&plink=" + encodeURI(publicLink);
|
||||||
|
parameters += "&algs=" + algList;
|
||||||
|
|
||||||
|
$.ajax({
|
||||||
|
url : "/nlphub/nlphub-servlet?" + parameters,
|
||||||
|
type : "POST",
|
||||||
|
async : true,
|
||||||
|
success : function(data, stato) {
|
||||||
|
textAreaEnable(true);
|
||||||
|
$("#file-info").empty();
|
||||||
|
if (typeof (data.response) != 'undefined') {
|
||||||
|
var jsonOut = getOutputJson(data.message);
|
||||||
|
} else if (typeof (data.error) != 'undefined') {
|
||||||
|
hideProgress();
|
||||||
|
alert(data.message);
|
||||||
|
} else {
|
||||||
|
hideProgress();
|
||||||
|
alert("Unexpected response");
|
||||||
}
|
}
|
||||||
});
|
resetExecuteButton();
|
||||||
|
},
|
||||||
|
error : function(richiesta, stato, errori) {
|
||||||
|
hideProgress();
|
||||||
|
textAreaEnable(true);
|
||||||
|
alert("Unexpected Error. Status: " + richiesta.status);
|
||||||
|
resetExecuteButton();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Get the final json returned by the server
|
||||||
|
*/
|
||||||
|
getOutputJson = function(message) {
|
||||||
|
var tobemap = "";
|
||||||
|
for (var i = 0; i < message.length; i++) {
|
||||||
|
tobemap += message[i] + "|";
|
||||||
}
|
}
|
||||||
|
|
||||||
doStartComputation = function() {
|
tobemap = tobemap.substring(0, tobemap.length - 1);
|
||||||
var options = "default";
|
|
||||||
options = $("input[type=checkbox]:checked").map(
|
|
||||||
function () {return this.value;}).get().join("|");
|
|
||||||
$('#result').html("");
|
|
||||||
//var token2Send = getUrlParameter("token") == null ? "" : getUrlParameter("token");
|
|
||||||
var tokenParam = getUrlParameter("token");
|
|
||||||
var token2Send = ((tokenParam == null) || (tokenParam.length == 0)) ? "18fed2d9-030b-4c77-93af-af2015d945f7-843339462" : getUrlParameter("token");
|
|
||||||
|
|
||||||
webSocket.send({
|
var parameters = "annotations=" + savedAnnotations;
|
||||||
'action': 'start',
|
parameters += "&plink=" + encodeURI(publicLink);
|
||||||
'text' : $("#input-textarea").val(),
|
parameters += "&lang=" + $("#language-select").val();
|
||||||
'options' : options,
|
parameters += "&tobemap=" + encodeURI(tobemap);
|
||||||
'token' : token2Send
|
console.log(parameters);
|
||||||
}).done(function() {
|
|
||||||
showProgressBar(true);
|
$.ajax({
|
||||||
enableCommands(false);
|
url : "/nlphub/nlphub-mapper-servlet?" + parameters,
|
||||||
}).fail(function(e) {
|
type : "POST",
|
||||||
console.log("failed");
|
async : true,
|
||||||
});
|
success : function(data, stato) {
|
||||||
|
hideProgress();
|
||||||
|
console.log(data);
|
||||||
|
if ((typeof (data.response) != "undefined")
|
||||||
|
&& (data.response.trim().toUpperCase() == "ERROR")) {
|
||||||
|
alert("ERROR\n" + data.message);
|
||||||
|
} else {
|
||||||
|
$("#reset-upload").hide();
|
||||||
|
savedAnnotations = "";
|
||||||
|
publicLink = null;
|
||||||
|
showResult(data);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
error : function(richiesta, stato, errori) {
|
||||||
|
hideProgress();
|
||||||
|
$("#reset-upload").hide();
|
||||||
|
savedAnnotations = "";
|
||||||
|
publicLink = null;
|
||||||
|
alert("Unexpected Error. Status: " + richiesta.status);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Show the computation result
|
||||||
|
*/
|
||||||
|
showResult = function(data) {
|
||||||
|
$("#ner-ui").hide();
|
||||||
|
$("#ner-result-container").show();
|
||||||
|
|
||||||
|
jsonContent = data;
|
||||||
|
resultText = jsonContent.output.text;
|
||||||
|
|
||||||
|
$("#result-header").empty();
|
||||||
|
$("#result-params-div").empty();
|
||||||
|
$("#result-text-div").empty();
|
||||||
|
|
||||||
|
$("#result-header").append(
|
||||||
|
"<p>You can download the overall result as a JSON file <a href='"
|
||||||
|
+ jsonContent.link + "'>here</a></p>");
|
||||||
|
var localText = resultText;
|
||||||
|
localText = resultText.replace(/\n/g, "<br>");
|
||||||
|
$("#result-text-div").empty();
|
||||||
|
$("#result-text-div").append("<p>" + localText + "</p>");
|
||||||
|
|
||||||
|
showAnnotationList(jsonContent.output.annotations);
|
||||||
|
}
|
||||||
|
|
||||||
|
showAnnotationList = function(list) {
|
||||||
|
var colorDisabled = "CCCCCC";
|
||||||
|
var color;
|
||||||
|
var colors = [];
|
||||||
|
var annotations = list.split(",");
|
||||||
|
for (var i = 0; i < annotations.length; i++) {
|
||||||
|
do {
|
||||||
|
color = randomRGB();
|
||||||
|
} while (color == colorDisabled);
|
||||||
|
colors[colors.length] = color;
|
||||||
}
|
}
|
||||||
|
|
||||||
doHandleResponse = function(message) {
|
$("#result-params-div").append("<form id='colored-annotations'></form>");
|
||||||
if (message.response == "error") {
|
for (var i = 0; i < annotations.length; i++) {
|
||||||
$('#result').html("<span style='color: red;'>"+message.value+"</span>");
|
var cb = "<input type='radio' name='foo' ";
|
||||||
enableCommands(true);
|
if (!checkAnnotation(annotations[i])) {
|
||||||
showProgressBar(false);
|
cb += "disabled ";
|
||||||
|
colors[i] = colorDisabled;
|
||||||
}
|
}
|
||||||
else if (message.response == "computing") {
|
cb += "named='" + annotations[i] + "' value='" + colors[i]
|
||||||
showProgressBar(true);
|
+ "' id='color-" + i + "' class='filled-in'>";
|
||||||
enableCommands(false);
|
cb += "<label for='color-" + i
|
||||||
|
+ "'><span style='font-weight:bold; color:#" + colors[i] + "'>"
|
||||||
|
+ annotations[i] + "</span></label><br>";
|
||||||
|
$("#colored-annotations").append(cb);
|
||||||
|
}
|
||||||
|
$("#colored-annotations :radio").change(function() {
|
||||||
|
if (this.checked) {
|
||||||
|
rewriteText(this.getAttribute("named"), "#" + this.value);
|
||||||
}
|
}
|
||||||
else if (message.response == "computed") {
|
});
|
||||||
showProgressBar(false);
|
}
|
||||||
enableCommands(true);
|
|
||||||
console.log("message="+message.value);
|
/*
|
||||||
if (message.value.startsWith("http")) {
|
* Utility function
|
||||||
$('#downloadLink').html("Result: <a class=\"waves-effect waves-light btn red darken-1\" href=\""+message.value+"\">Download</a> " +
|
*/
|
||||||
"<a class=\"waves-effect waves-light btn blue darken-1\" href=\"Javascript:doCallback(encodeURI('"+message.value.trim()+"'));\">View</a>");
|
countSubstringOccurrencies = function(string, substring) {
|
||||||
|
var occurrencies = 0;
|
||||||
|
var index = 0;
|
||||||
|
var s = string;
|
||||||
|
while (index >= 0) {
|
||||||
|
index = s.indexOf(substring);
|
||||||
|
if (index >= 0) {
|
||||||
|
occurrencies++;
|
||||||
|
s = s.substring(index + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return occurrencies;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Utility
|
||||||
|
*/
|
||||||
|
|
||||||
|
enhanceColor = function(color) {
|
||||||
|
var c = eval("0x" + color);
|
||||||
|
var hi = Math.round(c / 16);
|
||||||
|
if(hi < 15) {
|
||||||
|
hi += Math.round((15 - hi) / 1.5);
|
||||||
|
}
|
||||||
|
if(hi > 15) hi = 15;
|
||||||
|
return '' + hexLetters[hi] + hexLetters[c%16];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Write the html paragraph <p> containing the text highlighted on annotation value
|
||||||
|
*/
|
||||||
|
rewriteText = function(annotation, color) {
|
||||||
|
$("#result-text-div").empty();
|
||||||
|
|
||||||
|
var complemetar = 0xFFFFFF - eval("0x" + color.substring(1));
|
||||||
|
var complement = complemetar.toString(16);
|
||||||
|
var R = enhanceColor(complement.substring(0,2));
|
||||||
|
var G = enhanceColor(complement.substring(2,4));
|
||||||
|
var B = enhanceColor(complement.substring(4));
|
||||||
|
complement = "#" + R + G + B;
|
||||||
|
var indices = getIndices(annotation);
|
||||||
|
var indexedText = "";
|
||||||
|
|
||||||
|
if ((typeof (indices) == 'undefined') || (indices.length == 0)) {
|
||||||
|
indexedText = resultText;
|
||||||
|
indexedText = indexedText.replace(/\n/g, "<br>");
|
||||||
|
$("#result-text-div").append("<p>" + indexedText + "</p>");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var t = 0;
|
||||||
|
var offset = 0;
|
||||||
|
for (var i = 0; i < indices.length; i++) {
|
||||||
|
var index = indices[i];
|
||||||
|
var start = index[0];
|
||||||
|
var end = index[1];
|
||||||
|
indexedText += resultText.substring(t, start);
|
||||||
|
offset += countSubstringOccurrencies(resultText.substring(t, start),
|
||||||
|
"\n");
|
||||||
|
offset += countSubstringOccurrencies(resultText.substring(t, start),
|
||||||
|
"\r");
|
||||||
|
offset += countSubstringOccurrencies(resultText.substring(t, start),
|
||||||
|
"\t");
|
||||||
|
start += offset;
|
||||||
|
end += offset;
|
||||||
|
var colored = "<span style='color:" + color + "; background:"
|
||||||
|
+ complement + "; font-weight:bold;'>"
|
||||||
|
+ resultText.substring(start, end) + "</span>";
|
||||||
|
indexedText += colored;
|
||||||
|
t = end;
|
||||||
|
}
|
||||||
|
if (t < resultText.length)
|
||||||
|
indexedText += resultText.substring(t);
|
||||||
|
|
||||||
|
indexedText = indexedText.replace(/\n/g, "<br>");
|
||||||
|
$("#result-text-div").append("<p>" + indexedText + "</p>");
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Find if the annotation is presente in the json
|
||||||
|
*/
|
||||||
|
checkAnnotation = function(annotation) {
|
||||||
|
for (var i = 0; i < jsonContent.output.result.length; i++) {
|
||||||
|
var entities = jsonContent.output.result[i].entities;
|
||||||
|
for (var j = 0; j < entities.length; j++) {
|
||||||
|
a = entities[j][annotation];
|
||||||
|
if (typeof a != 'undefined') {
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Retrieve the annotation indices from the json
|
||||||
|
*/
|
||||||
|
getIndices = function(annotation) {
|
||||||
|
var indices = [];
|
||||||
|
// get indices
|
||||||
|
for (var i = 0; i < jsonContent.output.result.length; i++) {
|
||||||
|
var entities = jsonContent.output.result[i].entities;
|
||||||
|
for (var j = 0; j < entities.length; j++) {
|
||||||
|
a = entities[j][annotation];
|
||||||
|
if (typeof a != 'undefined') {
|
||||||
|
indices[i] = [];
|
||||||
|
for (var k = 0; k < a.length; k++) {
|
||||||
|
var index = a[k].indices;
|
||||||
|
indices[i][k] = index;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var indices2 = [];
|
||||||
|
for (var i = 0; i < indices.length; i++) {
|
||||||
|
if (typeof (indices[i]) != 'undefined')
|
||||||
|
indices2[indices2.length] = indices[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
return mergeIndices(indices2);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Merge the indices
|
||||||
|
*/
|
||||||
|
mergeIndices = function(indices) {
|
||||||
|
var newIndices = []
|
||||||
|
if (indices.length <= 1)
|
||||||
|
newIndices = indices[0];
|
||||||
|
else
|
||||||
|
newIndices = mergeAll(indices);
|
||||||
|
return newIndices;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Utility function
|
||||||
|
*/
|
||||||
|
resetExecuteButton = function() {
|
||||||
|
publicLink = null;
|
||||||
|
$("#execute-button").css("background-color", pageGray);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Resize the annotation table based on the screen geometry
|
||||||
|
*/
|
||||||
|
resizeTable = function() {
|
||||||
|
// resize the annotation table
|
||||||
|
$("#annotations-table").empty();
|
||||||
|
var rowId = "";
|
||||||
|
var ratio = window.innerWidth / window.innerHeight;
|
||||||
|
|
||||||
|
if (ratio <= 0.35) {
|
||||||
|
tableRawSize = 1;
|
||||||
|
} else if ((ratio > 0.35) && (ratio <= 0.75)) {
|
||||||
|
tableRawSize = 2;
|
||||||
|
} else if ((ratio > 0.75) && (ratio <= 1)) {
|
||||||
|
tableRawSize = 3;
|
||||||
|
} else if ((ratio > 1) && (ratio <= 1.5)) {
|
||||||
|
tableRawSize = 4;
|
||||||
|
} else {
|
||||||
|
tableRawSize = 5;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var i = 0; i < annotations.length; i++) {
|
||||||
|
if (i % tableRawSize == 0) {
|
||||||
|
rowId = "row-" + i;
|
||||||
|
$("#annotations-table").append("<tr id=\"" + rowId + "\"></tr>");
|
||||||
|
}
|
||||||
|
var annotationElement = "<input type=\"checkbox\" id=\"check-" + i
|
||||||
|
+ "\" value=\"" + annotations[i]
|
||||||
|
+ "\" checked=\"checked\"></input> <label for=\"check-" + i
|
||||||
|
+ "\">" + annotations[i] + "</label>";
|
||||||
|
$("#" + rowId).append("<td>" + annotationElement + "</td>");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Resize the page logo image based on the screen geometry
|
||||||
|
*/
|
||||||
|
resizeLogo = function() {
|
||||||
|
if (window.innerWidth < 200)
|
||||||
|
$("#logo-image").width(window.innerWidth - 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Build the annotation list for the service invocation
|
||||||
|
*/
|
||||||
|
buildInputAnnotationList = function() {
|
||||||
|
var list = [];
|
||||||
|
for (var i = 0; i < annotations.length; i++) {
|
||||||
|
if ($("#check-" + i).is(":Checked"))
|
||||||
|
list[list.length] = $("#check-" + i).val();
|
||||||
|
}
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Handler for the window resize event
|
||||||
|
*/
|
||||||
|
window.onresize = function(event) {
|
||||||
|
resizeTable();
|
||||||
|
resizeLogo();
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Handler for the file upload control
|
||||||
|
*/
|
||||||
|
$(".ajax-file-upload-abort").on("DOMAttrModified", function(event) {
|
||||||
|
$(".ajax-file-upload-abort").css("display", "none");
|
||||||
|
if (event.attributeName == "display") { // which attribute you want to watch
|
||||||
|
// for changes
|
||||||
|
$(".ajax-file-upload-abort").css("display", "none");
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
function showProgressBar(show) {
|
/*
|
||||||
var display = (show) ? "visible" : "hidden";
|
* Build the option list of supported language
|
||||||
$('#progressBar').css('visibility', display);
|
*/
|
||||||
}
|
buildLanguageList = function() {
|
||||||
|
// build the language selection input control
|
||||||
function enableCommands(enable) {
|
for (i in languages) {
|
||||||
if (enable) {
|
var opt = "<option value=\"" + languages[i]
|
||||||
$('#execute-button').removeAttr("disabled");
|
+ "\" selected=\"selected\">" + languages[i] + "</option>";
|
||||||
$('#execute-button').text('Execute');
|
if (i > 1)
|
||||||
$('input[type=checkbox]').removeAttr("disabled");
|
opt = "<option value=\"" + languages[i] + "\">" + languages[i]
|
||||||
} else {
|
+ "</option>";
|
||||||
$('#execute-button').text('Computing ...');
|
$("#language-select").append(opt);
|
||||||
$('input[type=checkbox]').attr('disabled', 'true');
|
|
||||||
$('#execute-button').attr('disabled', 'disabled');
|
|
||||||
$('#downloadLink').html("");
|
|
||||||
}
|
}
|
||||||
}
|
$("#language-select").on("change", function() {
|
||||||
|
selectAnnotationsByLanguage();
|
||||||
function syntaxHighlight(json) {
|
|
||||||
if (typeof json != 'string') {
|
|
||||||
json = JSON.stringify(json, undefined, 1);
|
|
||||||
}
|
|
||||||
json = json.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');
|
|
||||||
return json.replace(/("(\\u[a-zA-Z0-9]{4}|\\[^u]|[^\\"])*"(\s*:)?|\b(true|false|null)\b|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?)/g, function (match) {
|
|
||||||
var cls = 'number';
|
|
||||||
if (/^"/.test(match)) {
|
|
||||||
if (/:$/.test(match)) {
|
|
||||||
cls = 'key';
|
|
||||||
} else {
|
|
||||||
cls = 'string';
|
|
||||||
}
|
|
||||||
} else if (/true|false/.test(match)) {
|
|
||||||
cls = 'boolean';
|
|
||||||
} else if (/null/.test(match)) {
|
|
||||||
cls = 'null';
|
|
||||||
}
|
|
||||||
return '<span class="' + cls + '">' + match + '</span>';
|
|
||||||
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function getUrlParameter(name) {
|
/*
|
||||||
name = name.replace(/[\[]/, '\\[').replace(/[\]]/, '\\]');
|
* Utility
|
||||||
var regex = new RegExp('[\\?&]' + name + '=([^&#]*)');
|
*/
|
||||||
var results = regex.exec(location.search);
|
selectAnnotationsByLanguage = function() {
|
||||||
return results === null ? '' : decodeURIComponent(results[1].replace(/\+/g, ' '));
|
buildAnnotations();
|
||||||
};
|
resizeTable();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Enable/disable the input text area
|
||||||
|
*/
|
||||||
|
textAreaEnable = function(enable) {
|
||||||
|
if (enable == true)
|
||||||
|
$("#input-textarea").prop('disabled', false);
|
||||||
|
else
|
||||||
|
$("#input-textarea").prop('disabled', true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Get a random RGB color
|
||||||
|
*/
|
||||||
|
randomRGB = function() {
|
||||||
|
var color = '';
|
||||||
|
var couple = '';
|
||||||
|
for (var i = 0; i < 3; i++) {
|
||||||
|
couple = '' + hexLetters[Math.floor(Math.random() * 10)] + hexLetters[Math.floor(Math.random() * 16)];
|
||||||
|
color += couple;
|
||||||
|
}
|
||||||
|
|
||||||
|
return color;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue