From 5047ac1a2da44cac4cf4b8b1ac3d41ee32950abb Mon Sep 17 00:00:00 2001 From: John Bauer Date: Wed, 6 Nov 2024 17:18:56 -0800 Subject: [PATCH] Add files such as the fonts and brat js libraries to the server as local files --- .../nlp/pipeline/StanfordCoreNLPServer.java | 52 + .../nlp/pipeline/demo/Astloch-Bold.ttf | Bin 0 -> 74988 bytes .../pipeline/demo/LiberationSans-Regular.ttf | Bin 0 -> 133828 bytes .../pipeline/demo/PTSansCaption-Regular.ttf | Bin 0 -> 234880 bytes .../nlp/pipeline/demo/annotation_log.js | 42 + .../nlp/pipeline/demo/configuration.js | 29 + .../nlp/pipeline/demo/corenlp-brat.html | 8 +- .../nlp/pipeline/demo/corenlp-brat.js | 18 +- .../nlp/pipeline/demo/corenlp-title.png | Bin 0 -> 15612 bytes .../stanford/nlp/pipeline/demo/dispatcher.js | 130 + .../nlp/pipeline/demo/head.load.min.js | 8 + .../nlp/pipeline/demo/jquery.svg.min.js | 6 + .../nlp/pipeline/demo/jquery.svgdom.min.js | 6 + .../stanford/nlp/pipeline/demo/loading.gif | Bin 0 -> 40144 bytes .../stanford/nlp/pipeline/demo/style-vis.css | 530 +++ .../stanford/nlp/pipeline/demo/url_monitor.js | 233 ++ src/edu/stanford/nlp/pipeline/demo/util.js | 609 ++++ .../stanford/nlp/pipeline/demo/visualizer.js | 3139 +++++++++++++++++ src/edu/stanford/nlp/pipeline/demo/webfont.js | 46 + .../nlp/pipeline/webapp/CoreNLPServlet.java | 2 +- 20 files changed, 4844 insertions(+), 14 deletions(-) create mode 100644 src/edu/stanford/nlp/pipeline/demo/Astloch-Bold.ttf create mode 100644 src/edu/stanford/nlp/pipeline/demo/LiberationSans-Regular.ttf create mode 100644 src/edu/stanford/nlp/pipeline/demo/PTSansCaption-Regular.ttf create mode 100644 src/edu/stanford/nlp/pipeline/demo/annotation_log.js create mode 100644 src/edu/stanford/nlp/pipeline/demo/configuration.js create mode 100644 src/edu/stanford/nlp/pipeline/demo/corenlp-title.png create mode 100644 src/edu/stanford/nlp/pipeline/demo/dispatcher.js create mode 100644 src/edu/stanford/nlp/pipeline/demo/head.load.min.js create mode 100644 src/edu/stanford/nlp/pipeline/demo/jquery.svg.min.js create mode 100644 src/edu/stanford/nlp/pipeline/demo/jquery.svgdom.min.js create mode 100644 src/edu/stanford/nlp/pipeline/demo/loading.gif create mode 100644 src/edu/stanford/nlp/pipeline/demo/style-vis.css create mode 100644 src/edu/stanford/nlp/pipeline/demo/url_monitor.js create mode 100644 src/edu/stanford/nlp/pipeline/demo/util.js create mode 100644 src/edu/stanford/nlp/pipeline/demo/visualizer.js create mode 100644 src/edu/stanford/nlp/pipeline/demo/webfont.js diff --git a/src/edu/stanford/nlp/pipeline/StanfordCoreNLPServer.java b/src/edu/stanford/nlp/pipeline/StanfordCoreNLPServer.java index 84653bfda9..fb89df926d 100644 --- a/src/edu/stanford/nlp/pipeline/StanfordCoreNLPServer.java +++ b/src/edu/stanford/nlp/pipeline/StanfordCoreNLPServer.java @@ -852,6 +852,35 @@ public void handle(HttpExchange httpExchange) throws IOException { } } // end static class FileHandler + /** + * Serve a content file (image, font, etc) from the filesystem or classpath + */ + public static class BytesFileHandler implements HttpHandler { + private final byte[] content; + private final String contentType; + public BytesFileHandler(String fileOrClasspath, String contentType) throws IOException { + try (InputStream is = IOUtils.getInputStreamFromURLOrClasspathOrFileSystem(fileOrClasspath)) { + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + int available = is.available(); + while (available > 0) { + byte next[] = new byte[available]; + is.read(next); + bos.write(next); + available = is.available(); + } + this.content = bos.toByteArray(); + } + this.contentType = contentType + "; charset=utf-8"; // always encode in utf-8 + } + @Override + public void handle(HttpExchange httpExchange) throws IOException { + httpExchange.getResponseHeaders().set("Content-type", this.contentType); + httpExchange.sendResponseHeaders(HTTP_OK, content.length); + httpExchange.getResponseBody().write(content); + httpExchange.close(); + } + } // end static class FileHandler + private int maybeAlterStanfordTimeout(HttpExchange httpExchange, int timeoutMilliseconds) { if ( ! stanford) { return timeoutMilliseconds; @@ -966,6 +995,7 @@ public void handle(HttpExchange httpExchange) throws IOException { setHttpExchangeResponseHeaders(httpExchange); if (!this.contextRoot.equals(httpExchange.getRequestURI().getRawPath())) { + System.out.println("Can't find " + httpExchange.getRequestURI().getRawPath()); String response = "URI " + httpExchange.getRequestURI().getRawPath() + " not handled"; httpExchange.getResponseHeaders().add("Content-type", "text/plain"); httpExchange.sendResponseHeaders(HTTP_NOT_FOUND, response.length()); @@ -1756,9 +1786,31 @@ public void run(Optional> basicAuth, withAuth(server.createContext(uriContext+"/semgrex", new SemgrexHandler(authenticator, callback)), basicAuth); withAuth(server.createContext(uriContext+"/tregex", new TregexHandler(authenticator, callback)), basicAuth); withAuth(server.createContext(uriContext+"/scenegraph", new SceneGraphHandler(authenticator)), basicAuth); + withAuth(server.createContext(uriContext+"/corenlp-brat.js", new FileHandler("edu/stanford/nlp/pipeline/demo/corenlp-brat.js", "application/javascript")), basicAuth); withAuth(server.createContext(uriContext+"/corenlp-brat.cs", new FileHandler("edu/stanford/nlp/pipeline/demo/corenlp-brat.css", "text/css")), basicAuth); withAuth(server.createContext(uriContext+"/corenlp-parseviewer.js", new FileHandler("edu/stanford/nlp/pipeline/demo/corenlp-parseviewer.js", "application/javascript")), basicAuth); + + withAuth(server.createContext(uriContext+"/style-vis.css", new FileHandler("edu/stanford/nlp/pipeline/demo/style-vis.css", "text/css")), basicAuth); + + withAuth(server.createContext(uriContext+"/static/fonts/Astloch-Bold.ttf", new BytesFileHandler("edu/stanford/nlp/pipeline/demo/Astloch-Bold.ttf", "font/ttfx")), basicAuth); + withAuth(server.createContext(uriContext+"/static/fonts/Liberation_Sans-Regular.ttf", new BytesFileHandler("edu/stanford/nlp/pipeline/demo/LiberationSans-Regular.ttf", "font/ttf")), basicAuth); + withAuth(server.createContext(uriContext+"/static/fonts/PT_Sans-Caption-Web-Regular.ttf", new BytesFileHandler("edu/stanford/nlp/pipeline/demo/PTSansCaption-Regular.ttf", "font/ttf")), basicAuth); + + withAuth(server.createContext(uriContext+"/annotation_log.js", new BytesFileHandler("edu/stanford/nlp/pipeline/demo/annotation_log.js", "application/javascript")), basicAuth); + withAuth(server.createContext(uriContext+"/configuration.js", new BytesFileHandler("edu/stanford/nlp/pipeline/demo/configuration.js", "application/javascript")), basicAuth); + withAuth(server.createContext(uriContext+"/dispatcher.js", new BytesFileHandler("edu/stanford/nlp/pipeline/demo/dispatcher.js", "application/javascript")), basicAuth); + withAuth(server.createContext(uriContext+"/head.load.min.js", new BytesFileHandler("edu/stanford/nlp/pipeline/demo/head.load.min.js", "application/javascript")), basicAuth); + withAuth(server.createContext(uriContext+"/jquery.svg.min.js", new BytesFileHandler("edu/stanford/nlp/pipeline/demo/jquery.svg.min.js", "application/javascript")), basicAuth); + withAuth(server.createContext(uriContext+"/jquery.svgdom.min.js", new BytesFileHandler("edu/stanford/nlp/pipeline/demo/jquery.svg.min.js", "application/javascript")), basicAuth); + withAuth(server.createContext(uriContext+"/url_monitor.js", new BytesFileHandler("edu/stanford/nlp/pipeline/demo/url_monitor.js", "application/javascript")), basicAuth); + withAuth(server.createContext(uriContext+"/util.js", new BytesFileHandler("edu/stanford/nlp/pipeline/demo/util.js", "application/javascript")), basicAuth); + withAuth(server.createContext(uriContext+"/visualizer.js", new BytesFileHandler("edu/stanford/nlp/pipeline/demo/visualizer.js", "application/javascript")), basicAuth); + withAuth(server.createContext(uriContext+"/webfont.js", new BytesFileHandler("edu/stanford/nlp/pipeline/demo/webfont.js", "application/javascript")), basicAuth); + + withAuth(server.createContext(uriContext+"/img/corenlp-title.png", new BytesFileHandler("edu/stanford/nlp/pipeline/demo/corenlp-title.png", "image/png")), basicAuth); + withAuth(server.createContext(uriContext+"/img/loading.gif", new BytesFileHandler("edu/stanford/nlp/pipeline/demo/loading.gif", "image/gif")), basicAuth); + withAuth(server.createContext(uriContext+"/ping", new PingHandler()), Optional.empty()); withAuth(server.createContext(uriContext+"/shutdown", new ShutdownHandler()), basicAuth); if (this.serverPort == this.statusPort) { diff --git a/src/edu/stanford/nlp/pipeline/demo/Astloch-Bold.ttf b/src/edu/stanford/nlp/pipeline/demo/Astloch-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..c6aba2adc8564f8c180590a616c7ff47212ee4b3 GIT binary patch literal 74988 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 literal 0 HcmV?d00001 diff --git a/src/edu/stanford/nlp/pipeline/demo/LiberationSans-Regular.ttf b/src/edu/stanford/nlp/pipeline/demo/LiberationSans-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..59d2e251b04ce9540c1915c5bd153cd1a709390c GIT binary patch literal 133828 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%0A#4WO;h)-5om@Q%c|Jj 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

xIqyuHvA>)FN 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
3=v` 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

  • phHbUwq@Ap08qnER!$rmR^5ZHPfXVWq}fB9pZ zhD*wpZSeeLTjjilNLLjM_7HiYXXwKke-?*7M_g0-iEC3saG1Q@u}>Vu>>P} z^V_JtO_AA=o6UF%VDjYJqFpjhleHS(Eb|5Po$qJemYfW{9e`10Qfl;>fysIZziG(P zEIX~s;*t(F)YddM*3>rq_l6n;8LesXR)?#q!sXS~<>|jPd)i<(e>?*Y+kG}7gE z`b<>l4T6+ z6B4OJG+`KUfpe+xz{$WVwwzQph%LzFmWzxUqFJo*Z}IO@#8S&2@<)`W=a_^}5q|=q z6H~>@nDLH_{7kFc4GlU4tx3hba^sYRoXF1^E}HS<B4?`V$V?w@-b>yKI>m&FAgYNC^w_iMd$j{RqO&bJdkrynnQ#SK_V}Rfh?@5UM}QLm-~6^V ziulhMZ!-CnQCUoZ&xl0EMIuiLoy}!3ka&Wg;%D+g?sTr^iH;x49p~8eTQ2>UOV{K= z-*TaExzM*<(YF~hXV-WgtC}lpot^J$R()3kFPBb$_56X3f008iayT(#?~K1vH1^ai z36^)qB{`MIz)JgZL(g6zkon`Q zNnc*OLdL=ns9^IJ_PkC6m%r1OTo%#q7zBwWLOE?%pJe>6WeOvsz&WiPMcCw-mPV+{b6I8l03NRG}MEj-IQ^OfI^- z5-avLpdT0oHUPVTw54a5!x+#9D0t{Czz%@OShBIx{{&OI%oPnsK~MO$pWSxbZM(KF z{Xk<);&!y9s!;N=!bM36RaRF>kT3}6wQiSW~Zu`Rz>HA{U7?!Z5uak{$R<1g$v5+stOxR z^U8)Qdxt&uW@i`Hv{hg4_R)=_-fX}3-S4+Idwt6SxqV_v-?o2k--%c!kj^rXA*oMO zGe70JI9Z8HRY1~v+Q=3cZW6#%X7xlIW!p$2yQDDs>s@`+-JQnI^p0hO~ zKCWg)x}Rq05;873nRVgwR*EG#xe>WPTiXX{$!FwS@L|tGp2y`>wT{&<`Ml>v6bc(m zJlyRj7W3=r2+CNqSugQ1Uh5{k{3RCCY<}QT8q|%uJrBx_PSiiS+xwsvJ{Wh#B-?3c bGbmlfS()4~RS~If(`}nKd%pheGRyiuI<^Vz literal 0 HcmV?d00001 diff --git a/src/edu/stanford/nlp/pipeline/demo/annotation_log.js b/src/edu/stanford/nlp/pipeline/demo/annotation_log.js new file mode 100644 index 0000000000..b70872fc18 --- /dev/null +++ b/src/edu/stanford/nlp/pipeline/demo/annotation_log.js @@ -0,0 +1,42 @@ +// -*- Mode: JavaScript; tab-width: 2; indent-tabs-mode: nil; -*- +// vim:set ft=javascript ts=2 sw=2 sts=2 cindent: + +var AnnotationLog = (function(window, undefined) { + var AnnotationLog = function(dispatcher) { + var annotationLoggingOn = false; + var currentCollection = null; + var currentDocument = null; + var currentArguments = null; + + var rememberLoggingState = function(response) { + annotationLoggingOn = response.annotation_logging; + }; + + var rememberCurrent = function(_collection, _document, _arguments) { + currentCollection = _collection; + currentDocument = _document; + currentArguments = _arguments; + }; + + var logAction = function(_action) { + if (!annotationLoggingOn) { + // logging not requested for current collection + return false; + } else { + dispatcher.post('ajax', [ { + action: 'logAnnotatorAction', + collection: currentCollection, + 'document': currentDocument, + log: _action, + }, null]); + } + } + + dispatcher. + on('collectionLoaded', rememberLoggingState). + on('current', rememberCurrent). + on('logAction', logAction); + } + + return AnnotationLog; +})(window); diff --git a/src/edu/stanford/nlp/pipeline/demo/configuration.js b/src/edu/stanford/nlp/pipeline/demo/configuration.js new file mode 100644 index 0000000000..83fbfedffc --- /dev/null +++ b/src/edu/stanford/nlp/pipeline/demo/configuration.js @@ -0,0 +1,29 @@ +// -*- Mode: JavaScript; tab-width: 2; indent-tabs-mode: nil; -*- +// vim:set ft=javascript ts=2 sw=2 sts=2 cindent: +var Configuration = (function(window, undefined) { + var abbrevsOn = true; + var textBackgrounds = "striped"; + var svgWidth = '100%'; + var rapidModeOn = false; + var confirmModeOn = true; + var autorefreshOn = false; + + var visual = { + margin: { x: 2, y: 1 }, + arcTextMargin: 1, + boxSpacing: 1, + curlyHeight: 4, + arcSpacing: 9, //10; + arcStartHeight: 19, //23; //25; + } + + return { + abbrevsOn: abbrevsOn, + textBackgrounds: textBackgrounds, + visual: visual, + svgWidth: svgWidth, + rapidModeOn: rapidModeOn, + confirmModeOn: confirmModeOn, + autorefreshOn: autorefreshOn, + }; +})(window); \ No newline at end of file diff --git a/src/edu/stanford/nlp/pipeline/demo/corenlp-brat.html b/src/edu/stanford/nlp/pipeline/demo/corenlp-brat.html index deaa77e1b0..03d7101cd9 100644 --- a/src/edu/stanford/nlp/pipeline/demo/corenlp-brat.html +++ b/src/edu/stanford/nlp/pipeline/demo/corenlp-brat.html @@ -9,8 +9,8 @@ - - + + @@ -29,7 +29,7 @@
    version 4.5.8


    @@ -95,7 +95,7 @@ diff --git a/src/edu/stanford/nlp/pipeline/demo/corenlp-brat.js b/src/edu/stanford/nlp/pipeline/demo/corenlp-brat.js index 1b76235c15..c41d5229b7 100644 --- a/src/edu/stanford/nlp/pipeline/demo/corenlp-brat.js +++ b/src/edu/stanford/nlp/pipeline/demo/corenlp-brat.js @@ -8,19 +8,19 @@ var serverAddress = ''; var bratLocation = 'https://nlp.stanford.edu/js/brat/'; head.js( // External libraries - bratLocation + '/client/lib/jquery.svg.min.js', - bratLocation + '/client/lib/jquery.svgdom.min.js', + './jquery.svg.min.js', + './jquery.svgdom.min.js', // brat helper modules - bratLocation + '/client/src/configuration.js', - bratLocation + '/client/src/util.js', - bratLocation + '/client/src/annotation_log.js', - bratLocation + '/client/lib/webfont.js', + './configuration.js', + './util.js', + './annotation_log.js', + './webfont.js', // brat modules - bratLocation + '/client/src/dispatcher.js', - bratLocation + '/client/src/url_monitor.js', - bratLocation + '/client/src/visualizer.js', + './dispatcher.js', + './url_monitor.js', + './visualizer.js', // parse viewer './corenlp-parseviewer.js' diff --git a/src/edu/stanford/nlp/pipeline/demo/corenlp-title.png b/src/edu/stanford/nlp/pipeline/demo/corenlp-title.png new file mode 100644 index 0000000000000000000000000000000000000000..0b9ae041edc2c7c76a1cc02f36a8766c5a3cb8be GIT binary patch literal 15612 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 a0LCQQA>ns_xfu)sJk-{IP<-F!?f(NO*G7K; literal 0 HcmV?d00001 diff --git a/src/edu/stanford/nlp/pipeline/demo/dispatcher.js b/src/edu/stanford/nlp/pipeline/demo/dispatcher.js new file mode 100644 index 0000000000..f4e3bbccb8 --- /dev/null +++ b/src/edu/stanford/nlp/pipeline/demo/dispatcher.js @@ -0,0 +1,130 @@ +// -*- Mode: JavaScript; tab-width: 2; indent-tabs-mode: nil; -*- +// vim:set ft=javascript ts=2 sw=2 sts=2 cindent: +// TODO: does 'arguments.callee.caller' work? + +var Dispatcher = (function($, window, undefined) { + var Dispatcher = function() { + var that = this; + + var table = {}; + + var on = function(message, host, handler) { + if (handler === undefined) { + handler = host; + host = arguments.callee.caller; + } + if (table[message] === undefined) { + table[message] = []; + } + table[message].push([host, handler]); + return this; + }; + + // Notify listeners that we encountered an error in an asynch call + var inAsynchError = false; // To avoid error avalanches + var handleAsynchError = function(e) { + if (!inAsynchError) { + inAsynchError = true; + // TODO: Hook printout into dispatch elsewhere? + console.warn('Handled async error:', e); + that.post('dispatchAsynchError', [e]); + inAsynchError = false; + } else { + console.warn('Dropped asynch error:', e); + } + }; + + var post = function(asynch, message, args, returnType) { + if (typeof(asynch) !== 'number') { + // no asynch parameter + returnType = args; + args = message; + message = asynch; + asynch = null; + } + if (args === undefined) { + args = []; + } + var results = []; + // DEBUG: if (typeof(message) != "string" || !(message.match(/mouse/) || message == "hideComment")) console.log(message, args); + + if (typeof(message) === 'function') { + // someone was lazy and sent a simple function + var host = arguments.callee.caller; + if (asynch !== null) { + result = setTimeout(function() { + try { + message.apply(host, args); + } catch(e) { + that.handleAsynchError(e); + } + }, asynch); + } else { + result = message.apply(host, args); + } + results.push(result); + } else { + // a proper message, propagate to all interested parties + var todo = table[message]; + if (todo !== undefined) { + $.each(todo, function(itemNo, item) { + var result; + if (asynch !== null) { + result = setTimeout(function() { + try { + item[1].apply(item[0], args); + } catch (e) { + that.handleAsynchError(e); + } + }, asynch); + } else { + result = item[1].apply(item[0], args); + } + results.push(result); + }); +/* DEBUG + } else { + console.warn('Message ' + message + ' has no subscribers.'); // DEBUG +*/ + } + } + if (returnType == 'any') { + var i = results.length; + while (i--) { + if (results[i] !== false) return results[i]; + } + return false; + } + if (returnType == 'all') { + var i = results.length; + while (i--) { + if (results[i] === false) return results[i]; + } + } + return results; + }; + + var proxy = function(destination, message) { + this.on(message, function() { + destination.post(message, Array.prototype.slice.call(arguments)); + }); + }; + + var dispatcher = { + on: on, + post: post, + proxy: proxy, + }; + Dispatcher.dispatchers.push(dispatcher); + return dispatcher; + }; + + Dispatcher.dispatchers = []; + Dispatcher.post = function(asynch, message, args, returnType) { + $.each(Dispatcher.dispatchers, function(dispatcherNo, dispatcher) { + dispatcher.post(asynch, message, args, returnType); + }); + }; + + return Dispatcher; +})(jQuery, window); diff --git a/src/edu/stanford/nlp/pipeline/demo/head.load.min.js b/src/edu/stanford/nlp/pipeline/demo/head.load.min.js new file mode 100644 index 0000000000..8a561cd2d9 --- /dev/null +++ b/src/edu/stanford/nlp/pipeline/demo/head.load.min.js @@ -0,0 +1,8 @@ +/** + Head JS The only script in your + Copyright Tero Piirainen (tipiirai) + License MIT / http://bit.ly/mit-license + Version 0.9 + + http://headjs.com +*/(function(a){var b=a.documentElement,c,d,e=[],f=[],g={},h={},i=a.createElement("script").async===true||"MozAppearance"in a.documentElement.style||window.opera;var j=window.head_conf&&head_conf.head||"head",k=window[j]=window[j]||function(){k.ready.apply(null,arguments)};var l=0,m=1,n=2,o=3;i?k.js=function(){var a=arguments,b=a[a.length-1],c=[];t(b)||(b=null),s(a,function(d,e){d!=b&&(d=r(d),c.push(d),x(d,b&&e==a.length-2?function(){u(c)&&p(b)}:null))});return k}:k.js=function(){var a=arguments,b=[].slice.call(a,1),d=b[0];if(!c){f.push(function(){k.js.apply(null,a)});return k}d?(s(b,function(a){t(a)||w(r(a))}),x(r(a[0]),t(d)?d:function(){k.js.apply(null,b)})):x(r(a[0]));return k},k.ready=function(a,b){if(a=="dom"){d?p(b):e.push(b);return k}t(a)&&(b=a,a="ALL");var c=h[a];if(c&&c.state==o||a=="ALL"&&u()&&d){p(b);return k}var f=g[a];f?f.push(b):f=g[a]=[b];return k},k.ready("dom",function(){c&&u()&&s(g.ALL,function(a){p(a)}),k.feature&&k.feature("domloaded",true)});function p(a){a._done||(a(),a._done=1)}function q(a){var b=a.split("/"),c=b[b.length-1],d=c.indexOf("?");return d!=-1?c.substring(0,d):c}function r(a){var b;if(typeof a=="object")for(var c in a)a[c]&&(b={name:c,url:a[c]});else b={name:q(a),url:a};var d=h[b.name];if(d&&d.url===b.url)return d;h[b.name]=b;return b}function s(a,b){if(a){typeof a=="object"&&(a=[].slice.call(a));for(var c=0;c0){c.setAttribute('width',a.clientWidth)}if(a.clientHeight>0){c.setAttribute('height',a.clientHeight)}a.appendChild(c)}this._afterLoad(a,c,b||{})}catch(e){$(a).html('

    SVG is not supported natively on this browser

    ')}},_afterLoad:function(a,b,c){var c=c||this._settings[a.id];this._settings[a?a.id:'']=null;var d=new this._wrapperClass(b,a);$.data(a||b,$.svg.propertyName,d);try{if(c.loadURL){d.load(c.loadURL,c)}if(c.settings){d.configure(c.settings)}if(c.onLoad&&!c.loadURL){c.onLoad.apply(a||b,[d])}}catch(e){alert(e)}},_getSVG:function(a){return $(a).data(this.propertyName)},_destroySVG:function(a){a=$(a);if(!a.hasClass(this.markerClassName)){return}a.removeClass(this.markerClassName).removeData(this.propertyName);if(a[0].namespaceURI!==this.svgNS){a.empty()}},addExtension:function(a,b){this._extensions.push([a,b])},isSVGElem:function(a){return(a.nodeType===1&&a.namespaceURI===$.svg.svgNS)}});function SVGWrapper(a,b){this._svg=a;this._container=b;for(var i=0;i<$.svg._extensions.length;i++){var c=$.svg._extensions[i];this[c[0]]=new c[1](this)}}$.extend(SVGWrapper.prototype,{width:function(){return(this._container?this._container.clientWidth:this._svg.width)},height:function(){return(this._container?this._container.clientHeight:this._svg.height)},root:function(){return this._svg},configure:function(a,b,c){if(!a.nodeName){c=b;b=a;a=this._svg}if(c){for(var i=a.attributes.length-1;i>=0;i--){var d=a.attributes.item(i);if(!(d.nodeName==='onload'||d.nodeName==='version'||d.nodeName.substring(0,5)==='xmlns')){a.attributes.removeNamedItem(d.nodeName)}}}for(var e in b){a.setAttribute($.svg._attrNames[e]||e,b[e])}return this},getElementById:function(a){return this._svg.ownerDocument.getElementById(a)},change:function(a,b){if(a){for(var c in b){if(b[c]==null){a.removeAttribute($.svg._attrNames[c]||c)}else{a.setAttribute($.svg._attrNames[c]||c,b[c])}}}return this},_args:function(b,c,d){c.splice(0,0,'parent');c.splice(c.length,0,'settings');var e={};var f=0;if(b[0]!=null&&b[0].jquery){b[0]=b[0][0]}if(b[0]!=null&&!(typeof b[0]==='object'&&b[0].nodeName)){e['parent']=null;f=1}for(var i=0;i/g,'>'))}}}return b},_checkName:function(a){a=(a.substring(0,1)>='A'&&a.substring(0,1)<='Z'?a.toLowerCase():a);return(a.substring(0,4)==='svg:'?a.substring(4):a)},load:function(l,m){m=(typeof m==='boolean'?{addTo:m}:(typeof m==='function'?{onLoad:m}:(typeof m==='string'?{parent:m}:(typeof m==='object'&&m.nodeName?{parent:m}:(typeof m==='object'&&m.jquery?{parent:m}:m||{})))));if(!m.parent&&!m.addTo){this.clear(false)}var n=[this._svg.getAttribute('width'),this._svg.getAttribute('height')];var o=this;var p=function(a){a=$.svg.local.errorLoadingText+': '+a;if(m.onLoad){m.onLoad.apply(o._container||o._svg,[o,a])}else{o.text(null,10,20,a)}};var q=function(a){var b=new ActiveXObject('Microsoft.XMLDOM');b.validateOnParse=false;b.resolveExternals=false;b.async=false;b.loadXML(a);if(b.parseError.errorCode!==0){p(b.parseError.reason);return null}return b};var r=function(b){if(!b){return}if(b.documentElement.nodeName!=='svg'){var c=b.getElementsByTagName('parsererror');var d=(c.length?c[0].getElementsByTagName('div'):[]);p(!c.length?'???':(d.length?d[0]:c[0]).firstChild.nodeValue);return}var f=(m.parent?$(m.parent)[0]:o._svg);var g={};for(var i=0;i'}else{b='<'+a.nodeName;if(a.attributes){for(var i=0;i';var d=a.firstChild;while(d){b+=this._toSVG(d);d=d.nextSibling}b+=''}else{b+='/>'}}return b}});function SVGPath(){this._path=''}$.extend(SVGPath.prototype,{reset:function(){this._path='';return this},move:function(x,y,a){a=($.isArray(x)?y:a);return this._coords((a?'m':'M'),x,y)},line:function(x,y,a){a=($.isArray(x)?y:a);return this._coords((a?'l':'L'),x,y)},horiz:function(x,a){this._path+=(a?'h':'H')+($.isArray(x)?x.join(' '):x);return this},vert:function(y,a){this._path+=(a?'v':'V')+($.isArray(y)?y.join(' '):y);return this},curveC:function(a,b,c,d,x,y,e){e=($.isArray(a)?b:e);return this._coords((e?'c':'C'),a,b,c,d,x,y)},smoothC:function(a,b,x,y,c){c=($.isArray(a)?b:c);return this._coords((c?'s':'S'),a,b,x,y)},curveQ:function(a,b,x,y,c){c=($.isArray(a)?b:c);return this._coords((c?'q':'Q'),a,b,x,y)},smoothQ:function(x,y,a){a=($.isArray(x)?y:a);return this._coords((a?'t':'T'),x,y)},_coords:function(a,b,c,d,e,f,g){if($.isArray(b)){for(var i=0;i-1)}else{b=(c.apply($(this),[a]))}return!b});return b}}($.fn.hasClass);$.fn.attr=function(h){return function(a,b,c){if(typeof a==='string'&&b===undefined){var d=h.apply(this,arguments);if(d&&d.baseVal&&d.baseVal.numberOfItems!=null){b='';d=d.baseVal;if(a==='transform'){for(var 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 a;glDv*>yJx=Lxt2vBS-vQ|o}hQt3azPocg5 literal 0 HcmV?d00001 diff --git a/src/edu/stanford/nlp/pipeline/demo/style-vis.css b/src/edu/stanford/nlp/pipeline/demo/style-vis.css new file mode 100644 index 0000000000..83d4fb6ea7 --- /dev/null +++ b/src/edu/stanford/nlp/pipeline/demo/style-vis.css @@ -0,0 +1,530 @@ +/* -*- Mode: CSS; tab-width: 2; indent-tabs-mode: nil; -*- */ +/* vim:set ft=css ts=2 sw=2 sts=2 autoindent: */ + +/* Styling for annotations */ + +/* alternative font test */ +/* +text { + font-size: 13px; + font-family: helvetica,arial,freesans,clean,sans-serif; +} +*/ + +#svg { + margin: 34px auto 100px; + padding-top: 15px; +} + +.center_wrapper { + display: table; + position: absolute; + top: 0; + left: 0; + height: 100%; + width: 100%; +} +.center_wrapper > div { + display: table-cell; + vertical-align: middle; +} +.center_wrapper > div > div { + /* match jQuery UI .ui-widget-content color */ + color: #2e6e9e; + margin-left: auto; + margin-right: auto; + width: 30em; + font-size: 12px; + font-family: 'Liberation Sans', Verdana, Arial, Helvetica, sans-serif; +} +.center_wrapper > div > div h1 { + text-align: center; + font-size: 14px; +} +#no_svg_wrapper { + display: none; +} + +svg { + width: 100%; + height: 1px; + border: 1px solid #7fa2ff; + font-size: 15px; + /* font-size: 14px; */ +} +svg.reselect { + border: 1px solid #ff3333; +} + +/* "basic" font */ +text { + font-size: 13px; + font-family: 'Liberation Sans', Verdana, Arial, Helvetica, sans-serif; +} + +@-webkit-keyframes pulse { + 0% { color: #9999ff; margin-top: 0; } + 50% { color: #ffffff; margin-top: 7px; } + 100% { color: #9999ff; margin-top: 0; } +} + +path { + pointer-events: none; +} + +/* "basic" font */ +.span text { + /* font-size: 10.5px; */ + font-size: 10px; + text-anchor: middle; + font-family: 'PT Sans Caption', sans-serif; + pointer-events: none; +} + +/* this should likely match span font */ +.span_type_label { + font-size: 11px; + font-family: 'PT Sans Caption', sans-serif; +} +/* this should likely match arc font */ +.arc_type_label { + font-size: 11px; + font-family: 'PT Sans Caption', sans-serif; +} +.attribute_type_label .ui-button-text { + font-size: 11px; + font-family: 'PT Sans Caption', sans-serif; +} + +.span rect { + stroke-width: 0.75; +} + +.glyph { + fill: #444444; + font-family: sans-serif; + font-weight: bold; +} +.attribute_warning { + stroke: red; +} + +.span rect.False_positive { + stroke: #ff4141; + stroke-width: 2; +} + +.shadow_True_positive { + fill: #00ff00; +} + +.shadow_False_positive { + fill: #ff4141; +} + +#commentpopup.comment_False_positive { + background-color: #ff4141; +} + +.span rect.False_negative { + stroke: #c20000; + fill: #ffffff; + stroke-width: 2; +} + +.shadow_False_negative { + fill: #c20000; +} + +#commentpopup.comment_False_negative { + background-color: #c20000; +} + +.span rect.AnnotationError { + stroke-width: 1; +} + +.shadow_AnnotationError { + fill: #ff0000; +} + +#commentpopup.comment_AnnotationError { + background-color: #ff7777; +} + +.span rect.AnnotationWarning { + stroke-width: 1; +} + +.shadow_AnnotationWarning { + fill: #ff8800; +} + +#commentpopup.comment_AnnotationWarning { + background-color: #ff9900; +} + +.shadow_AnnotatorNotes { + /* fill: #00cc00; */ + fill: #3ab7ee; +} +#commentpopup.comment_AnnotatorNotes { + /* background-color: #00cc00; */ + /* background-color: #DAF7DC; */ + background-color: #d7e7ee; +} + +.shadow_Normalized { + /* fill: #00cc00; */ + fill: #3aee37; +} +#commentpopup.comment_Normalized { + /* background-color: #00cc00; */ + /* background-color: #DAF7DC; */ + background-color: #d7eee7; +} +rect.Normalized { + stroke-width: 1.5; +} + +.shadow_AnnotationIncomplete { + fill: #aaaaaa; +} +.span rect.AnnotationIncomplete { + stroke: #002200; + stroke-width: 0.5; + fill: #ffffff; +} +#commentpopup.comment_AnnotationIncomplete { + background-color: #ffff77; +} + +.shadow_AnnotationUnconfirmed { + fill: #eeeeee; +} +.span rect.AnnotationUnconfirmed { + stroke: #002200; + stroke-width: 0.5; + opacity : 0.5; +} +#commentpopup.comment_AnnotationUnconfirmed { + background-color: #ddddff; +} + +.span rect.True_positive { + /* stroke: #007700; */ +} + +rect.shadow_EditHighlight { + fill: #ffff99; +} +.shadow_EditHighlight_arc { + stroke: #ffff99; +} + +.span path { + fill: none; +} + +.span path.curly { + /* 'stroke' def here blocks 'stroke' set in JS..? */ + /* stroke: grey; */ + stroke-width: 0.5; +} + +.span path.boxcross { + stroke: black; + opacity: 0.5; +} + +.arcs path { + stroke: #989898; + fill: none; + stroke-width: 1; +} + +.arcs .highlight path { + stroke: #000000; + stroke-width: 1.5; + opacity: 1; +} +.arcs .highlight text { + stroke: black; + fill: black; + stroke-width: 0.5; +} +.span.highlight rect { + stroke-width: 2px; +} +.span rect.reselect { + stroke-width: 2px; +} +.span rect.reselectTarget { + stroke-width: 2px; +} +.arcs .reselect path { + stroke-width: 2px; + stroke: #ff0000 !important; +} +.arcs .reselect text { + fill: #ff0000 !important; +} + +.span rect.badTarget { + stroke: #f00; +} + +.arcs text { + font-size: 9px; + text-anchor: middle; + font-family: 'PT Sans Caption', sans-serif; + /* dominant-baseline: central; */ + cursor: default; +} + +.background0 { + stroke: none; + fill: #ffffff; +} + +.background1 { + stroke: none; + fill: #eeeeee; +} + +.backgroundHighlight { + stroke: none; + fill: #ffff99; +} + +.sentnum text { + fill: #999999; + text-anchor: end; +} + +.sentnum path { + stroke: #999999; + stroke-width: 1px; +} + +.span_cue { + fill: #eeeeee !important; +} + +.drag_stroke { + stroke: black; +} +.drag_fill { + fill: black; +} + + +.dialog { + display: none; +} +#span_free_div, #arc_free_div { + float: left; +} +fieldset { + /* match relevant parts of jQuery UI .ui-widget-content */ + border: 1px solid #a6c9e2; + /* round corners, same as jQuery UI .ui-corner-all */ + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + border-radius: 5px; + /* to prevent border from running into legend */ + margin-top: 5px; +} +fieldset legend { + font-weight: bold; + font-size: 90%; + -moz-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; + background-color: #70a8d2; + color: white; + padding-left: 0.5em; + padding-right: 0.5em; +} +.label-like { + /* for UI consistency, this should match the "fieldset legend" style; + sorry about the duplication. */ + font-family: monospace; + font-weight: bold; + font-size: 90%; + /* match jQuery UI .ui-widget-content color */ + color: #2e6e9e; +} + +.accesskey { + text-decoration: underline; +} + + +.shadow { + -moz-box-shadow: 5px 5px 5px #444444; + -webkit-box-shadow: 5px 5px 5px #444444; + box-shadow: 5px 5px 5px #444444; +} + +#span_selected, #arc_origin, #arc_target { + font-weight: bold; +} + +#commentpopup { + font-family: 'Liberation Sans', Verdana, Arial, Helvetica, sans-serif; + position: fixed; + top: 0; + left: 0; + opacity: 0.95; + padding: 10px; + display: none; + border: 1px outset #000000; + background-color: #f5f5f9; + /* background-color: #d7e7ee; */ + /* background-color: #eeeeee; */ + color: #000000; + z-index: 20; + -moz-box-shadow: 5px 5px 5px #aaaaaa; + -webkit-box-shadow: 5px 5px 5px #aaaaaa; + box-shadow: 5px 5px 5px #aaaaaa; + -moz-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; + max-width: 80%; +} +#more_info_readme { + height: 350px; +} +#readme_container { + position: relative; +} +#more_readme_button { + padding: 2px 5px; + position: absolute; + top: -2px; + right: -2px; +} + +.comment_id { + vertical-align: top; + float:right; + font-size: 75%; + font-family: monospace; + color: #333333; +} +.comment_type { + /* font-weight: bold; */ +} +.comment_text { + font-weight: bold; +} +.comment_type_id_wrapper { + /* padding for floating ID */ + padding-right: 2em; +} +.norm_info_label { + font-weight: bold; + font-size: 80%; +} +.norm_info_value { + font-size: 80%; +} +.norm_info_img { + float: right; + margin-left: 1em; +} + +#search_form select { + width: 100%; /* deal with overflowing selectboxes */ +} + +.scroll_fset { + height: 200px; +} +.scroll_fset fieldset { + height: 100%; + overflow-x: hidden; + overflow-y: hidden; +} +/* HACK to display properly */ + .scroll_fset { + margin-bottom: 2.5em; + } + .scroll_fset fieldset { + padding-bottom: 2em; + } +/* end HACK */ +.scroll_fset div.scroller { + overflow: auto; + width: 100%; + height: 100%; +} + +#span_highlight_link, #arc_highlight_link, #viewspan_highlight_link { + float: right; +} + +.unselectable { + -moz-user-select: -moz-none; + -khtml-user-select: none; + -webkit-user-select: none; + -o-user-select: none; + user-select: none; + cursor: default; +} +@font-face { + font-family: 'Liberation Sans'; + font-style: normal; + font-weight: normal; + src: local('Liberation Sans'), local('Liberation-Sans'), url('static/fonts/Liberation_Sans-Regular.ttf') format('truetype'); +} +@font-face { + font-family: 'PT Sans Caption'; + font-style: normal; + font-weight: normal; + src: local('PT Sans Caption'), local('PTSans-Caption'), url('static/fonts/PT_Sans-Caption-Web-Regular.ttf') format('truetype'); +} + +/* Apple iPad, iPhone, iPod */ + +* { + -webkit-tap-highlight-color: rgba(0,0,0,0); + -webkit-text-size-adjust: none; + select: none; +} + +.span rect.AddedAnnotation { + stroke: #ff4141; + stroke-width: 2; +} +.shadow_AddedAnnotation { + fill: #ff4141; +} +#commentpopup.comment_AddedAnnotation { + background-color: #ffcccc; +} +.span rect.MissingAnnotation { + stroke: #ffffff; + stroke-width: 2; +} +.shadow_MissingAnnotation { + fill: #ff4141; + opacity: 0.3; +} +#commentpopup.comment_MissingAnnotation { + background-color: #ffcccc; +} +.span rect.MissingAnnotation + text { + opacity: 0.5; +} +.span rect.ChangedAnnotation { + stroke: #ffff99; + stroke-width: 2; +} +.shadow_ChangedAnnotation { + fill: #ff4141; +} +#commentpopup.comment_ChangedAnnotation { + background-color: #ffcccc; +} diff --git a/src/edu/stanford/nlp/pipeline/demo/url_monitor.js b/src/edu/stanford/nlp/pipeline/demo/url_monitor.js new file mode 100644 index 0000000000..d71ec8e32c --- /dev/null +++ b/src/edu/stanford/nlp/pipeline/demo/url_monitor.js @@ -0,0 +1,233 @@ +// -*- Mode: JavaScript; tab-width: 2; indent-tabs-mode: nil; -*- +// vim:set ft=javascript ts=2 sw=2 sts=2 cindent: +var URLMonitor = (function($, window, undefined) { + var URLMonitor = function(dispatcher) { + var that = this; + + var reloadData = true; + var changed = false; + var newIntArgs = {}; + + that.url_hash = new URLHash(); + + // Thanks to: + // http://kilianvalkhof.com/2010/javascript/the-case-of-the-disappearing-favicon/ + var setFavicon = function() { + var link = $('link[type="image/x-icon"]').remove().attr("href"); + $('').appendTo('head'); + } + + var updateURL = function() { + var new_hash = that.url_hash.getHash(); + changed = false; + window.location.hash = new_hash; + setFavicon(); + dispatcher.post('hideForm'); + }; + + var setArguments = function(args, force) { + var oldArgs = that.url_hash.arguments; + var argSplit = URLHash.splitArgs(args); + + if (!Util.isEqual(that.url_hash.extArguments, argSplit[1])) { + changed = true; + that.url_hash.setArguments(args); + dispatcher.post('argsChanged', [args, oldArgs]); + } + if (changed) { + // hashchange event will trigger + newIntArgs = argSplit[0]; + updateURL(); + } else if (force || !Util.isEqual(that.url_hash.intArguments, argSplit[0])) { + // hash is same, but internal arguments differ + that.url_hash.setArguments(args); + // hashchange event won't trigger, but internal args have + // changed, so we have to do updateState's job + dispatcher.post('hideForm'); + dispatcher.post('argsChanged', [args, oldArgs]); + dispatcher.post('current', [that.url_hash.collection, + that.url_hash.document, that.url_hash.arguments, reloadData]); + reloadData = true; + } + }; + + var setDocument = function(doc, args) { + var oldDoc = that.url_hash.document; + if (oldDoc !== doc) { + changed = true; + that.url_hash.setDocument(doc); + dispatcher.post('docChanged', [doc, oldDoc]); + } + setArguments(args || null); + }; + + var setCollection = function(coll, doc, args) { + var oldColl = that.url_hash.collection; + if (oldColl !== coll) { + changed = true; + that.url_hash.setCollection(coll); + + // keep "blind" down while loading new collection + $('#waiter').dialog('open'); + + dispatcher.post('ajax', [{ + action: 'getCollectionInformation', + collection: coll + }, 'collectionLoaded', { + collection: coll, + keep: true + }]); + dispatcher.post('collectionChanged', [coll, oldColl]); + } + setDocument(doc || '', args); + } + + var updateState = function() { + dispatcher.post('makeAjaxObsolete'); + if (!changed) { + var new_url_hash = URLHash.parse(window.location.hash); + setCollection(new_url_hash.collection, new_url_hash.document, + $.extend(new_url_hash.arguments, newIntArgs)); + that.url_hash = new_url_hash; + newIntArgs = {}; + } + + dispatcher.post('current', [that.url_hash.collection, + that.url_hash.document, that.url_hash.arguments, reloadData]); + reloadData = true; + }; + + var forceUpdate = function() { + $(window).trigger('hashchange'); + }; + + var preventReloadByURL = function() { + reloadData = false; + } + var allowReloadByURL = function() { + reloadData = true; + } + + var init = function() { + $(window).bind('hashchange', updateState); + forceUpdate(); + } + + dispatcher. + on('forceUpdate', forceUpdate). + on('setArguments', setArguments). + on('setDocument', setDocument). + on('setCollection', setCollection). + on('preventReloadByURL', preventReloadByURL). + on('allowReloadByURL', allowReloadByURL). + on('init', init); + }; + + return URLMonitor; +})(jQuery, window); + +var URLHash = (function($, window, undefined) { + var URLHash = function(collection, _document, _arguments) { + var that = this; + that.collection = collection; + that.document = _document || ''; + that.arguments = _arguments || {}; + that.calcArgs(); + } + + URLHash.prototype = { + calcArgs: function() { + var args = URLHash.splitArgs(this.arguments); + this.intArguments = args[0]; + this.extArguments = args[1]; + }, + + setArgument: function(argument, value) { + if (!this.arguments) { + this.arguments = {}; + } + this.arguments[argument] = value; + this.calcArgs(); + return this; + }, + + setArguments: function(_arguments) { + // the $.extend here basically takes a copy; raw assignment + // would allow changes of the args to alter original, which + // could be e.g. the "args" of search results + this.arguments = $.extend({}, _arguments || {}); + this.calcArgs(); + return this; + }, + + setDocument: function(_document) { + this.document = _document; + return this; + }, + + setCollection: function(collection) { + this.collection = collection; + return this; + }, + + getHash: function() { + var url_hash = this.collection + this.document; + + var url_args = Util.param(this.extArguments); + + if (url_args.length) { + url_hash += '?' + url_args; + } + + if (url_hash.length) { + url_hash = '#' + url_hash; + } + + return url_hash; + }, + }; + + // arguments that do not appear in the URL + var INT_ARGS = ['match', 'matchfocus', 'edited']; + + URLHash.splitArgs = function(args) { + var intArgs = {}; + var extArgs = $.extend({}, args); + var intArgNameLen = INT_ARGS.length; + for (var i = 0; i < intArgNameLen; i++) { + intArgs[INT_ARGS[i]] = extArgs[INT_ARGS[i]]; + delete extArgs[INT_ARGS[i]]; + } + return [intArgs, extArgs]; + }; + + // TODO: Document and conform variables to the rest of the object + URLHash.parse = function(hash) { + if (hash.length) { + // Remove the leading hash (#) + hash = hash.substr(1); + } + + var pathAndArgs = hash.split('?'); + var path = pathAndArgs[0] || ''; + var argsStr = pathAndArgs[1] || ''; + var coll; + var slashPos = path.lastIndexOf('/'); + if (slashPos === -1) { + coll = '/'; + } else { + coll = path.substr(0, slashPos + 1); + if (coll[coll.length - 1] !== '/') { + coll += '/'; + } + if (coll[0] !== '/') { + coll = '/' + coll; + } + } + var doc = path.substr(slashPos + 1); + var args = Util.deparam(argsStr); + return new URLHash(coll, doc, args); + }; + + return URLHash; +})(jQuery, window) diff --git a/src/edu/stanford/nlp/pipeline/demo/util.js b/src/edu/stanford/nlp/pipeline/demo/util.js new file mode 100644 index 0000000000..6359d35382 --- /dev/null +++ b/src/edu/stanford/nlp/pipeline/demo/util.js @@ -0,0 +1,609 @@ +// -*- Mode: JavaScript; tab-width: 2; indent-tabs-mode: nil; -*- +// vim:set ft=javascript ts=2 sw=2 sts=2 cindent: +var Util = (function(window, undefined) { + + var monthNames = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']; + + var cmp = function(a,b) { + return a < b ? -1 : a > b ? 1 : 0; + } + + var cmpArrayOnFirstElement = function(a,b) { + a = a[0]; + b = b[0]; + return a < b ? -1 : a > b ? 1 : 0; + } + + var unitAgo = function(n, unit) { + if (n == 1) return "" + n + " " + unit + " ago"; + return "" + n + " " + unit + "s ago"; + }; + + var formatTimeAgo = function(time) { + if (time == -1000) { + return "never"; // FIXME make the server return the server time! + } + + var nowDate = new Date(); + var now = nowDate.getTime(); + var diff = Math.floor((now - time) / 1000); + if (!diff) return "just now"; + if (diff < 60) return unitAgo(diff, "second"); + diff = Math.floor(diff / 60); + if (diff < 60) return unitAgo(diff, "minute"); + diff = Math.floor(diff / 60); + if (diff < 24) return unitAgo(diff, "hour"); + diff = Math.floor(diff / 24); + if (diff < 7) return unitAgo(diff, "day"); + if (diff < 28) return unitAgo(Math.floor(diff / 7), "week"); + var thenDate = new Date(time); + var result = thenDate.getDate() + ' ' + monthNames[thenDate.getMonth()]; + if (thenDate.getYear() != nowDate.getYear()) { + result += ' ' + thenDate.getFullYear(); + } + return result; + } + + var realBBox = function(span) { + var box = span.rect.getBBox(); + var chunkTranslation = span.chunk.translation; + var rowTranslation = span.chunk.row.translation; + box.x += chunkTranslation.x + rowTranslation.x; + box.y += chunkTranslation.y + rowTranslation.y; + return box; + } + + var escapeHTML = function(str) { + return str.replace(/&/g,'&').replace(//g,'>'); + } + + var escapeHTMLandQuotes = function(str) { + return str.replace(/&/g,'&').replace(//g,'>').replace(/\"/g,'"'); + } + + var escapeHTMLwithNewlines = function(str) { + return str.replace(/&/g,'&').replace(//g,'>').replace(/\n/g,'
    '); + } + + var escapeQuotes = function(str) { + // we only use double quotes for HTML attributes + return str.replace(/\"/g,'"'); + } + + var getSpanLabels = function(spanTypes, spanType) { + var type = spanTypes[spanType]; + return type && type.labels || []; + } + + var spanDisplayForm = function(spanTypes, spanType) { + var labels = getSpanLabels(spanTypes, spanType); + return labels[0] || spanType; + } + + var getArcLabels = function(spanTypes, spanType, arcType, relationTypesHash) { + var type = spanTypes[spanType]; + var arcTypes = type && type.arcs || []; + var arcDesc = null; + // also consider matches without suffix number, if any + var noNumArcType; + if (arcType) { + var splitType = arcType.match(/^(.*?)(\d*)$/); + noNumArcType = splitType[1]; + } + $.each(arcTypes, function(arcno, arcDescI) { + if (arcDescI.type == arcType || arcDescI.type == noNumArcType) { + arcDesc = arcDescI; + return false; + } + }); + // fall back to relation types for unconfigured or missing def + if (!arcDesc) { + arcDesc = $.extend({}, relationTypesHash[arcType] || relationTypesHash[noNumArcType]); + } + return arcDesc && arcDesc.labels || []; + } + + var arcDisplayForm = function(spanTypes, spanType, arcType, relationTypesHash) { + var labels = getArcLabels(spanTypes, spanType, arcType, relationTypesHash); + return labels[0] || arcType; + } + + // TODO: switching to use of $.param(), this function should + // be deprecated and removed. + var objectToUrlStr = function(o) { + a = []; + $.each(o, function(key,value) { + a.push(key+"="+encodeURIComponent(value)); + }); + return a.join("&"); + } + + // color name RGB list, converted from + // http://www.w3schools.com/html/html_colornames.asp + // with perl as + // perl -e 'print "var colors = {\n"; while(<>) { /(\S+)\s+\#([0-9a-z]{2})([0-9a-z]{2})([0-9a-z]{2})\s*/i or die "Failed to parse $_"; ($r,$g,$b)=(hex($2),hex($3),hex($4)); print " '\''",lc($1),"'\'':\[$r,$g,$b\],\n" } print "};\n" ' + var colors = { + 'aliceblue':[240,248,255], + 'antiquewhite':[250,235,215], + 'aqua':[0,255,255], + 'aquamarine':[127,255,212], + 'azure':[240,255,255], + 'beige':[245,245,220], + 'bisque':[255,228,196], + 'black':[0,0,0], + 'blanchedalmond':[255,235,205], + 'blue':[0,0,255], + 'blueviolet':[138,43,226], + 'brown':[165,42,42], + 'burlywood':[222,184,135], + 'cadetblue':[95,158,160], + 'chartreuse':[127,255,0], + 'chocolate':[210,105,30], + 'coral':[255,127,80], + 'cornflowerblue':[100,149,237], + 'cornsilk':[255,248,220], + 'crimson':[220,20,60], + 'cyan':[0,255,255], + 'darkblue':[0,0,139], + 'darkcyan':[0,139,139], + 'darkgoldenrod':[184,134,11], + 'darkgray':[169,169,169], + 'darkgrey':[169,169,169], + 'darkgreen':[0,100,0], + 'darkkhaki':[189,183,107], + 'darkmagenta':[139,0,139], + 'darkolivegreen':[85,107,47], + 'darkorange':[255,140,0], + 'darkorchid':[153,50,204], + 'darkred':[139,0,0], + 'darksalmon':[233,150,122], + 'darkseagreen':[143,188,143], + 'darkslateblue':[72,61,139], + 'darkslategray':[47,79,79], + 'darkslategrey':[47,79,79], + 'darkturquoise':[0,206,209], + 'darkviolet':[148,0,211], + 'deeppink':[255,20,147], + 'deepskyblue':[0,191,255], + 'dimgray':[105,105,105], + 'dimgrey':[105,105,105], + 'dodgerblue':[30,144,255], + 'firebrick':[178,34,34], + 'floralwhite':[255,250,240], + 'forestgreen':[34,139,34], + 'fuchsia':[255,0,255], + 'gainsboro':[220,220,220], + 'ghostwhite':[248,248,255], + 'gold':[255,215,0], + 'goldenrod':[218,165,32], + 'gray':[128,128,128], + 'grey':[128,128,128], + 'green':[0,128,0], + 'greenyellow':[173,255,47], + 'honeydew':[240,255,240], + 'hotpink':[255,105,180], + 'indianred':[205,92,92], + 'indigo':[75,0,130], + 'ivory':[255,255,240], + 'khaki':[240,230,140], + 'lavender':[230,230,250], + 'lavenderblush':[255,240,245], + 'lawngreen':[124,252,0], + 'lemonchiffon':[255,250,205], + 'lightblue':[173,216,230], + 'lightcoral':[240,128,128], + 'lightcyan':[224,255,255], + 'lightgoldenrodyellow':[250,250,210], + 'lightgray':[211,211,211], + 'lightgrey':[211,211,211], + 'lightgreen':[144,238,144], + 'lightpink':[255,182,193], + 'lightsalmon':[255,160,122], + 'lightseagreen':[32,178,170], + 'lightskyblue':[135,206,250], + 'lightslategray':[119,136,153], + 'lightslategrey':[119,136,153], + 'lightsteelblue':[176,196,222], + 'lightyellow':[255,255,224], + 'lime':[0,255,0], + 'limegreen':[50,205,50], + 'linen':[250,240,230], + 'magenta':[255,0,255], + 'maroon':[128,0,0], + 'mediumaquamarine':[102,205,170], + 'mediumblue':[0,0,205], + 'mediumorchid':[186,85,211], + 'mediumpurple':[147,112,216], + 'mediumseagreen':[60,179,113], + 'mediumslateblue':[123,104,238], + 'mediumspringgreen':[0,250,154], + 'mediumturquoise':[72,209,204], + 'mediumvioletred':[199,21,133], + 'midnightblue':[25,25,112], + 'mintcream':[245,255,250], + 'mistyrose':[255,228,225], + 'moccasin':[255,228,181], + 'navajowhite':[255,222,173], + 'navy':[0,0,128], + 'oldlace':[253,245,230], + 'olive':[128,128,0], + 'olivedrab':[107,142,35], + 'orange':[255,165,0], + 'orangered':[255,69,0], + 'orchid':[218,112,214], + 'palegoldenrod':[238,232,170], + 'palegreen':[152,251,152], + 'paleturquoise':[175,238,238], + 'palevioletred':[216,112,147], + 'papayawhip':[255,239,213], + 'peachpuff':[255,218,185], + 'peru':[205,133,63], + 'pink':[255,192,203], + 'plum':[221,160,221], + 'powderblue':[176,224,230], + 'purple':[128,0,128], + 'red':[255,0,0], + 'rosybrown':[188,143,143], + 'royalblue':[65,105,225], + 'saddlebrown':[139,69,19], + 'salmon':[250,128,114], + 'sandybrown':[244,164,96], + 'seagreen':[46,139,87], + 'seashell':[255,245,238], + 'sienna':[160,82,45], + 'silver':[192,192,192], + 'skyblue':[135,206,235], + 'slateblue':[106,90,205], + 'slategray':[112,128,144], + 'slategrey':[112,128,144], + 'snow':[255,250,250], + 'springgreen':[0,255,127], + 'steelblue':[70,130,180], + 'tan':[210,180,140], + 'teal':[0,128,128], + 'thistle':[216,191,216], + 'tomato':[255,99,71], + 'turquoise':[64,224,208], + 'violet':[238,130,238], + 'wheat':[245,222,179], + 'white':[255,255,255], + 'whitesmoke':[245,245,245], + 'yellow':[255,255,0], + 'yellowgreen':[154,205,50], + }; + + // color parsing function originally from + // http://plugins.jquery.com/files/jquery.color.js.txt + // (with slight modifications) + + // Parse strings looking for color tuples [255,255,255] + var rgbNumRE = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/; + var rgbPercRE = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/; + var rgbHash6RE = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/; + var rgbHash3RE = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/; + + var strToRgb = function(color) { + var result; + + // Check if we're already dealing with an array of colors +// if ( color && color.constructor == Array && color.length == 3 ) +// return color; + + // Look for rgb(num,num,num) + if (result = rgbNumRE.exec(color)) + return [parseInt(result[1]), parseInt(result[2]), parseInt(result[3])]; + + // Look for rgb(num%,num%,num%) + if (result = rgbPercRE.exec(color)) + return [parseFloat(result[1])*2.55, parseFloat(result[2])*2.55, parseFloat(result[3])*2.55]; + + // Look for #a0b1c2 + if (result = rgbHash6RE.exec(color)) + return [parseInt(result[1],16), parseInt(result[2],16), parseInt(result[3],16)]; + + // Look for #fff + if (result = rgbHash3RE.exec(color)) + return [parseInt(result[1]+result[1],16), parseInt(result[2]+result[2],16), parseInt(result[3]+result[3],16)]; + + // Otherwise, we're most likely dealing with a named color + return colors[$.trim(color).toLowerCase()]; + } + + var rgbToStr = function(rgb) { + // TODO: there has to be a better way, even in JS + var r = Math.floor(rgb[0]).toString(16); + var g = Math.floor(rgb[1]).toString(16); + var b = Math.floor(rgb[2]).toString(16); + // pad + r = r.length < 2 ? '0' + r : r; + g = g.length < 2 ? '0' + g : g; + b = b.length < 2 ? '0' + b : b; + return ('#'+r+g+b); + } + + // Functions rgbToHsl and hslToRgb originally from + // http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript + // implementation of functions in Wikipedia + // (with slight modifications) + + // RGB to HSL color conversion + var rgbToHsl = function(rgb) { + var r = rgb[0]/255, g = rgb[1]/255, b = rgb[2]/255; + var max = Math.max(r, g, b), min = Math.min(r, g, b); + var h, s, l = (max + min) / 2; + + if (max == min) { + h = s = 0; // achromatic + } else { + var d = max - min; + s = l > 0.5 ? d / (2 - max - min) : d / (max + min); + switch (max) { + case r: h = (g - b) / d + (g < b ? 6 : 0); break; + case g: h = (b - r) / d + 2; break; + case b: h = (r - g) / d + 4; break; + } + h /= 6; + } + + return [h, s, l]; + } + + var hue2rgb = function(p, q, t) { + if (t < 0) t += 1; + if (t > 1) t -= 1; + if (t < 1/6) return p + (q - p) * 6 * t; + if (t < 1/2) return q; + if (t < 2/3) return p + (q - p) * (2/3 - t) * 6; + return p; + } + + var hslToRgb = function(hsl) { + var h = hsl[0], s = hsl[1], l = hsl[2]; + + var r, g, b; + + if (s == 0) { + r = g = b = l; // achromatic + } else { + var q = l < 0.5 ? l * (1 + s) : l + s - l * s; + var p = 2 * l - q; + r = hue2rgb(p, q, h + 1/3); + g = hue2rgb(p, q, h); + b = hue2rgb(p, q, h - 1/3); + } + + return [r * 255, g * 255, b * 255]; + } + + var adjustLightnessCache = {}; + + // given color string and -1<=adjust<=1, returns color string + // where lightness (in the HSL sense) is adjusted by the given + // amount, the larger the lighter: -1 gives black, 1 white, and 0 + // the given color. + var adjustColorLightness = function(colorstr, adjust) { + if (!(colorstr in adjustLightnessCache)) { + adjustLightnessCache[colorstr] = {} + } + if (!(adjust in adjustLightnessCache[colorstr])) { + var rgb = strToRgb(colorstr); + if (rgb === undefined) { + // failed color string conversion; just return the input + adjustLightnessCache[colorstr][adjust] = colorstr; + } else { + var hsl = rgbToHsl(rgb); + if (adjust > 0.0) { + hsl[2] = 1.0 - ((1.0-hsl[2])*(1.0-adjust)); + } else { + hsl[2] = (1.0+adjust)*hsl[2]; + } + var lightRgb = hslToRgb(hsl); + adjustLightnessCache[colorstr][adjust] = rgbToStr(lightRgb); + } + } + return adjustLightnessCache[colorstr][adjust]; + } + + // Partially stolen from: http://documentcloud.github.com/underscore/ + // MIT-License + // TODO: Mention in LICENSE.md + var isEqual = function(a, b) { + // Check object identity. + if (a === b) return true; + // Different types? + var atype = typeof(a), btype = typeof(b); + if (atype != btype) return false; + // Basic equality test (watch out for coercions). + if (a == b) return true; + // One is falsy and the other truthy. + if ((!a && b) || (a && !b)) return false; + // If a is not an object by this point, we can't handle it. + if (atype !== 'object') return false; + // Check for different array lengths before comparing contents. + if (a.length && (a.length !== b.length)) return false; + // Nothing else worked, deep compare the contents. + for (var key in b) if (!(key in a)) return false; + // Recursive comparison of contents. + for (var key in a) if (!(key in b) || !isEqual(a[key], b[key])) return false; + return true; + }; + + var keyValRE = /^([^=]+)=(.*)$/; // key=value + var isDigitsRE = /^[0-9]+$/; + + var deparam = function(str) { + var args = str.split('&'); + var len = args.length; + if (!len) return null; + var result = {}; + for (var i = 0; i < len; i++) { + var parts = args[i].match(keyValRE); + if (!parts || parts.length != 3) break; + var val = []; + var arr = parts[2].split(','); + var sublen = arr.length; + for (var j = 0; j < sublen; j++) { + var innermost = []; + // map empty arguments ("" in URL) to empty arrays + // (innermost remains []) + if (arr[j].length) { + var arrsplit = arr[j].split('~'); + var subsublen = arrsplit.length; + for (var k = 0; k < subsublen; k++) { + if(arrsplit[k].match(isDigitsRE)) { + // convert digits into ints ... + innermost.push(parseInt(arrsplit[k], 10)); + } + else { + // ... anything else remains a string. + innermost.push(arrsplit[k]); + } + } + } + val.push(innermost); + } + result[parts[1]] = val; + } + return result; + }; + + var paramArray = function(val) { + val = val || []; + var len = val.length; + var arr = []; + for (var i = 0; i < len; i++) { + if ($.isArray(val[i])) { + arr.push(val[i].join('~')); + } else { + // non-array argument; this is an error from the caller + console.error('param: Error: received non-array-in-array argument [', i, ']', ':', val[i], '(fix caller)'); + } + } + return arr; + }; + + var param = function(args) { + if (!args) return ''; + var vals = []; + for (var key in args) { + if (args.hasOwnProperty(key)) { + var val = args[key]; + if (val == undefined) { + console.error('Error: received argument', key, 'with value', val); + continue; + } + // values normally expected to be arrays, but some callers screw + // up, so check + if ($.isArray(val)) { + var arr = paramArray(val); + vals.push(key + '=' + arr.join(',')); + } else { + // non-array argument; this is an error from the caller + console.error('param: Error: received non-array argument', key, ':', val, '(fix caller)'); + } + } + } + return vals.join('&'); + }; + + var profiles = {}; + var profileStarts = {}; + var profileOn = false; + var profileEnable = function(on) { + if (on === undefined) on = true; + profileOn = on; + }; // profileEnable + var profileClear = function() { + if (!profileOn) return; + profiles = {}; + profileStarts = {}; + }; // profileClear + var profileStart = function(label) { + if (!profileOn) return; + profileStarts[label] = new Date(); + }; // profileStart + var profileEnd = function(label) { + if (!profileOn) return; + var profileElapsed = new Date() - profileStarts[label] + if (!profiles[label]) profiles[label] = 0; + profiles[label] += profileElapsed; + }; // profileEnd + var profileReport = function() { + if (!profileOn) return; + if (window.console) { + $.each(profiles, function(label, time) { + console.log("profile " + label, time); + }); + console.log("-------"); + } + }; // profileReport + + // container: ID or jQuery element + // collData: the collection data (in the format of the result of + // http://.../brat/ajax.cgi?action=getCollectionInformation&collection=... + // docData: the document data (in the format of the result of + // http://.../brat/ajax.cgi?action=getDocument&collection=...&document=... + // returns the embedded visualizer's dispatcher object + var embed = function(container, collData, docData, webFontURLs) { + var dispatcher = new Dispatcher(); + var visualizer = new Visualizer(dispatcher, container, webFontURLs); + docData.collection = null; + dispatcher.post('collectionLoaded', [collData]); + dispatcher.post('requestRenderData', [docData]); + return dispatcher; + }; + + // container: ID or jQuery element + // collDataURL: the URL of the collection data, or collection data + // object (if pre-fetched) + // docDataURL: the url of the document data (if pre-fetched, use + // simple `embed` instead) + // callback: optional; the callback to call afterwards; it will be + // passed the embedded visualizer's dispatcher object + var embedByURL = function(container, collDataURL, docDataURL, callback) { + var collData, docData; + var handler = function() { + if (collData && docData) { + var dispatcher = embed(container, collData, docData); + if (callback) callback(dispatcher); + } + }; + if (typeof(container) == 'string') { + $.getJSON(collDataURL, function(data) { collData = data; handler(); }); + } else { + collData = collDataURL; + } + $.getJSON(docDataURL, function(data) { docData = data; handler(); }); + }; + + + return { + profileEnable: profileEnable, + profileClear: profileClear, + profileStart: profileStart, + profileEnd: profileEnd, + profileReport: profileReport, + formatTimeAgo: formatTimeAgo, + realBBox: realBBox, + getSpanLabels: getSpanLabels, + spanDisplayForm: spanDisplayForm, + getArcLabels: getArcLabels, + arcDisplayForm: arcDisplayForm, + escapeQuotes: escapeQuotes, + escapeHTML: escapeHTML, + escapeHTMLandQuotes: escapeHTMLandQuotes, + escapeHTMLwithNewlines: escapeHTMLwithNewlines, + cmp: cmp, + rgbToHsl: rgbToHsl, + hslToRgb: hslToRgb, + adjustColorLightness: adjustColorLightness, + objectToUrlStr: objectToUrlStr, + isEqual: isEqual, + paramArray: paramArray, + param: param, + deparam: deparam, + embed: embed, + embedByURL: embedByURL, + }; + +})(window); diff --git a/src/edu/stanford/nlp/pipeline/demo/visualizer.js b/src/edu/stanford/nlp/pipeline/demo/visualizer.js new file mode 100644 index 0000000000..ea2b771c7e --- /dev/null +++ b/src/edu/stanford/nlp/pipeline/demo/visualizer.js @@ -0,0 +1,3139 @@ +// -*- Mode: JavaScript; tab-width: 2; indent-tabs-mode: nil; -*- +// vim:set ft=javascript ts=2 sw=2 sts=2 cindent: + +var Visualizer = (function($, window, undefined) { + var fontLoadTimeout = 0; // 0 seconds + fontLoadTimeout = 0; + + var DocumentData = function(text) { + this.text = text; + this.chunks = []; + this.spans = {}; + this.eventDescs = {}; + this.sentComment = {}; + this.arcs = []; + this.arcById = {}; + this.markedSent = {}; + this.spanAnnTexts = {}; + this.towers = {}; + // this.sizes = {}; + }; + + var Fragment = function(id, span, from, to) { + this.id = id; + this.span = span; + this.from = from; + this.to = to; + // this.towerId = undefined; + // this.drawOrder = undefined; + }; + + var Span = function(id, type, offsets, generalType) { + this.id = id; + this.type = type; + this.totalDist = 0; + this.numArcs = 0; + this.generalType = generalType; + this.offsets = offsets; + this.headFragment = null; + // this.from = undefined; + // this.to = undefined; + // this.wholeFrom = undefined; + // this.wholeTo = undefined; + // this.headFragment = undefined; + // this.chunk = undefined; + // this.marked = undefined; + // this.avgDist = undefined; + // this.curly = undefined; + // this.comment = undefined; // { type: undefined, text: undefined }; + // this.annotatorNotes = undefined; + // this.drawCurly = undefined; + // this.glyphedLabelText = undefined; + // this.group = undefined; + // this.height = undefined; + // this.highlightPos = undefined; + // this.indexNumber = undefined; + // this.labelText = undefined; + // this.nestingDepth = undefined; + // this.nestingDepthLR = undefined; + // this.nestingDepthRL = undefined; + // this.nestingHeight = undefined; + // this.nestingHeightLR = undefined; + // this.nestingHeightRL = undefined; + // this.rect = undefined; + // this.rectBox = undefined; + // this.refedIndexSum = undefined; + // this.right = undefined; + // this.totaldist = undefined; + // this.width = undefined; + this.initContainers(offsets); + }; + + Span.prototype.initContainers = function() { + this.incoming = []; + this.outgoing = []; + this.attributes = {}; + this.attributeText = []; + this.attributeCues = {}; + this.attributeCueFor = {}; + this.attributeMerge = {}; // for box, cross, etc. that are span-global + this.fragments = []; + this.normalizations = []; + }; + + Span.prototype.copy = function(id) { + var span = $.extend(new Span(), this); // clone + span.id = id; + span.initContainers(); // protect from shallow copy + return span; + }; + + var EventDesc = function(id, triggerId, roles, klass) { + this.id = id; + this.triggerId = triggerId; + var roleList = this.roles = []; + $.each(roles, function(roleNo, role) { + roleList.push({ type: role[0], targetId: role[1] }); + }); + if (klass == "equiv") { + this.equiv = true; + } else if (klass == "relation") { + this.relation = true; + } + // this.leftSpans = undefined; + // this.rightSpans = undefined; + // this.annotatorNotes = undefined; + }; + + var Chunk = function(index, text, from, to, space, spans) { + this.index = index; + this.text = text; + this.from = from; + this.to = to; + this.space = space; + this.fragments = []; + // this.sentence = undefined; + // this.group = undefined; + // this.highlightGroup = undefined; + // this.markedTextStart = undefined; + // this.markedTextEnd = undefined; + // this.nextSpace = undefined; + // this.right = undefined; + // this.row = undefined; + // this.textX = undefined; + // this.translation = undefined; + } + + var Arc = function(eventDesc, role, dist, eventNo) { + this.origin = eventDesc.id; + this.target = role.targetId; + this.dist = dist; + this.type = role.type; + this.shadowClass = eventDesc.shadowClass; + this.jumpHeight = 0; + if (eventDesc.equiv) { + this.equiv = true; + this.eventDescId = eventNo; + eventDesc.equivArc = this; + } else if (eventDesc.relation) { + this.relation = true; + this.eventDescId = eventNo; + } + // this.marked = undefined; + }; + + var Row = function(svg) { + this.group = svg.group(); + this.background = svg.group(this.group); + this.chunks = []; + this.hasAnnotations = false; + this.maxArcHeight = 0; + this.maxSpanHeight = 0; + }; + + var Measurements = function(widths, height, y) { + this.widths = widths; + this.height = height; + this.y = y; + }; + + // A naive whitespace tokeniser + var tokenise = function(text) { + var tokenOffsets = []; + var tokenStart = null; + var lastCharPos = null; + + for (var i = 0; i < text.length; i++) { + var c = text[i]; + // Have we found the start of a token? + if (tokenStart == null && !/\s/.test(c)) { + tokenStart = i; + lastCharPos = i; + // Have we found the end of a token? + } else if (/\s/.test(c) && tokenStart != null) { + tokenOffsets.push([tokenStart, i]); + tokenStart = null; + // Is it a non-whitespace character? + } else if (!/\s/.test(c)) { + lastCharPos = i; + } + } + // Do we have a trailing token? + if (tokenStart != null) { + tokenOffsets.push([tokenStart, lastCharPos + 1]); + } + + return tokenOffsets; + }; + + // A naive newline sentence splitter + var sentenceSplit = function(text) { + var sentenceOffsets = []; + var sentStart = null; + var lastCharPos = null; + + for (var i = 0; i < text.length; i++) { + var c = text[i]; + // Have we found the start of a sentence? + if (sentStart == null && !/\s/.test(c)) { + sentStart = i; + lastCharPos = i; + // Have we found the end of a sentence? + } else if (c == '\n' && sentStart != null) { + sentenceOffsets.push([sentStart, i]); + sentStart = null; + // Is it a non-whitespace character? + } else if (!/\s/.test(c)) { + lastCharPos = i; + } + } + // Do we have a trailing sentence without a closing newline? + if (sentStart != null) { + sentenceOffsets.push([sentStart, lastCharPos + 1]); + } + + return sentenceOffsets; + }; + + // Sets default values for a wide range of optional attributes + var setSourceDataDefaults = function(sourceData) { + // The following are empty lists if not set + $.each([ + 'attributes', + 'comments', + 'entities', + 'equivs', + 'events', + 'modifications', + 'normalizations', + 'relations', + 'triggers', + ], function(attrNo, attr) { + if (sourceData[attr] === undefined) { + sourceData[attr] = []; + } + }); + + // If we lack sentence offsets we fall back on naive sentence splitting + if (sourceData.sentence_offsets === undefined) { + sourceData.sentence_offsets = sentenceSplit(sourceData.text); + } + // Similarily we fall back on whitespace tokenisation + if (sourceData.token_offsets === undefined) { + sourceData.token_offsets = tokenise(sourceData.text); + } + }; + + // Set default values for a variety of collection attributes + var setCollectionDefaults = function(collectionData) { + // The following are empty lists if not set + $.each([ + 'entity_attribute_types', + 'entity_types', + 'event_attribute_types', + 'event_types', + 'relation_attribute_types', + 'relation_types', + 'unconfigured_types', + ], function(attrNo, attr) { + if (collectionData[attr] === undefined) { + collectionData[attr] = []; + } + }); + }; + + var Visualizer = function(dispatcher, svgId, webFontURLs) { + var $svgDiv = $('#' + svgId); + if (!$svgDiv.length) { + throw Error('Could not find container with id="' + svgId + '"'); + } + var that = this; + + // OPTIONS + var roundCoordinates = true; // try to have exact pixel offsets + var boxTextMargin = { x: 0, y: 1.5 }; // effect is inverse of "margin" for some reason + var highlightRounding = { x: 3, y:3 }; // rx, ry for highlight boxes + var spaceWidths = { + ' ': 4, + '\u00a0': 4, + '\u200b': 0, + '\u3000': 8, + '\n': 4 + }; + var coloredCurlies = true; // color curlies by box BG + var arcSlant = 15; //10; + var minArcSlant = 8; + var arcHorizontalSpacing = 10; // min space boxes with connecting arc + var rowSpacing = -5; // for some funny reason approx. -10 gives "tight" packing. + var sentNumMargin = 20; + var smoothArcCurves = true; // whether to use curves (vs lines) in arcs + var smoothArcSteepness = 0.5; // steepness of smooth curves (control point) + var reverseArcControlx = 5; // control point distance for "UFO catchers" + + // "shadow" effect settings (note, error, incompelete) + var rectShadowSize = 3; + var rectShadowRounding = 2.5; + var arcLabelShadowSize = 1; + var arcLabelShadowRounding = 5; + var shadowStroke = 2.5; // TODO XXX: this doesn't affect anything..? + + // "marked" effect settings (edited, focus, match) + var markedSpanSize = 6; + var markedArcSize = 2; + var markedArcStroke = 7; // TODO XXX: this doesn't seem to do anything..? + + var rowPadding = 2; + var nestingAdjustYStepSize = 2; // size of height adjust for nested/nesting spans + var nestingAdjustXStepSize = 1; // size of height adjust for nested/nesting spans + + var highlightSequence = '#FF9632;#FFCC00;#FF9632'; // yellow - deep orange + //var highlightSequence = '#FFFC69;#FFCC00;#FFFC69'; // a bit toned town + var highlightSpanSequence = highlightSequence; + var highlightArcSequence = highlightSequence; + var highlightTextSequence = highlightSequence; + var highlightDuration = '2s'; + // different sequence for "mere" matches (as opposed to "focus" and + // "edited" highlights) + var highlightMatchSequence = '#FFFF00'; // plain yellow + + var fragmentConnectorDashArray = '1,3,3,3'; + var fragmentConnectorColor = '#000000'; + + // END OPTIONS + + + var svg; + var $svg; + var data = null; + var sourceData = null; + var requestedData = null; + var coll, doc, args; + var relationTypesHash; + var isRenderRequested; + var isCollectionLoaded = false; + var entityAttributeTypes = null; + var eventAttributeTypes = null; + var spanTypes = null; + var highlightGroup; + + // var commentPrioLevels = ['Unconfirmed', 'Incomplete', 'Warning', 'Error', 'AnnotatorNotes']; + // XXX Might need to be tweaked - inserted diff levels + var commentPrioLevels = [ + 'Unconfirmed', 'Incomplete', 'Warning', 'Error', 'AnnotatorNotes', + 'AddedAnnotation', 'MissingAnnotation', 'ChangedAnnotation']; + + this.arcDragOrigin = null; // TODO + + // due to silly Chrome bug, I have to make it pay attention + var forceRedraw = function() { +// if (!$.browser.chrome) return; // not needed + $svg.css('margin-bottom', 1); + setTimeout(function() { $svg.css('margin-bottom', 0); }, 0); + } + + var rowBBox = function(span) { + var box = $.extend({}, span.rectBox); // clone + var chunkTranslation = span.chunk.translation; + box.x += chunkTranslation.x; + box.y += chunkTranslation.y; + return box; + }; + + var commentPriority = function(commentClass) { + if (commentClass === undefined) return -1; + var len = commentPrioLevels.length; + for (var i = 0; i < len; i++) { + if (commentClass.indexOf(commentPrioLevels[i]) != -1) return i; + } + return 0; + }; + + var clearSVG = function() { + data = null; + sourceData = null; + svg.clear(); + $svgDiv.hide(); + }; + + var setMarked = function(markedType) { + $.each(args[markedType] || [], function(markedNo, marked) { + if (marked[0] == 'sent') { + data.markedSent[marked[1]] = true; + } else if (marked[0] == 'equiv') { // [equiv, Equiv, T1] + $.each(sourceData.equivs, function(equivNo, equiv) { + if (equiv[1] == marked[1]) { + var len = equiv.length; + for (var i = 2; i < len; i++) { + if (equiv[i] == marked[2]) { + // found it + len -= 3; + for (var i = 1; i <= len; i++) { + var arc = data.eventDescs[equiv[0] + "*" + i].equivArc; + arc.marked = markedType; + } + return; // next equiv + } + } + } + }); + } else if (marked.length == 2) { + markedText.push([parseInt(marked[0], 10), parseInt(marked[1], 10), markedType]); + } else { + var span = data.spans[marked[0]]; + if (span) { + if (marked.length == 3) { // arc + $.each(span.outgoing, function(arcNo, arc) { + if (arc.target == marked[2] && arc.type == marked[1]) { + arc.marked = markedType; + } + }); + } else { // span + span.marked = markedType; + } + } else { + var eventDesc = data.eventDescs[marked[0]]; + if (eventDesc) { // relation + var relArc = eventDesc.roles[0]; + $.each(data.spans[eventDesc.triggerId].outgoing, function(arcNo, arc) { + if (arc.target == relArc.targetId && arc.type == relArc.type) { + arc.marked = markedType; + } + }); + } else { // try for trigger + $.each(data.eventDescs, function(eventDescNo, eventDesc) { + if (eventDesc.triggerId == marked[0]) { + data.spans[eventDesc.id].marked = markedType; + } + }); + } + } + } + }); + }; + + var fragmentComparator = function(a, b) { + var tmp; + var aSpan = a.span; + var bSpan = b.span; + + // spans with more fragments go first + tmp = aSpan.fragments.length - bSpan.fragments.length; + if (tmp) { + return tmp < 0 ? 1 : -1; + } + + // longer arc distances go last + tmp = aSpan.avgDist - bSpan.avgDist; + if (tmp) { + return tmp < 0 ? -1 : 1; + } + // spans with more arcs go last + tmp = aSpan.numArcs - bSpan.numArcs; + if (tmp) { + return tmp < 0 ? -1 : 1; + } + // compare the span widths, + // put wider on bottom so they don't mess with arcs, or shorter + // on bottom if there are no arcs. + var ad = a.to - a.from; + var bd = b.to - b.from; + tmp = ad - bd; + if (aSpan.numArcs == 0 && bSpan.numArcs == 0) { + tmp = -tmp; + } + if (tmp) { + return tmp < 0 ? 1 : -1; + } + tmp = aSpan.refedIndexSum - bSpan.refedIndexSum; + if (tmp) { + return tmp < 0 ? -1 : 1; + } + // if no other criterion is found, sort by type to maintain + // consistency + // TODO: isn't there a cmp() in JS? + if (aSpan.type < bSpan.type) { + return -1; + } else if (aSpan.type > bSpan.type) { + return 1; + } + + return 0; + }; + + + var setData = function(_sourceData) { + if (!args) args = {}; + sourceData = _sourceData; + dispatcher.post('newSourceData', [sourceData]); + data = new DocumentData(sourceData.text); + + // collect annotation data + $.each(sourceData.entities, function(entityNo, entity) { + // offsets given as array of (start, end) pairs + var span = + // (id, type, offsets, generalType) + new Span(entity[0], entity[1], entity[2], 'entity'); + data.spans[entity[0]] = span; + }); + var triggerHash = {}; + $.each(sourceData.triggers, function(triggerNo, trigger) { + triggerHash[trigger[0]] = + // (id, type, offsets, generalType), eventList + [new Span(trigger[0], trigger[1], trigger[2], 'trigger'), []]; + }); + $.each(sourceData.events, function(eventNo, eventRow) { + var eventDesc = data.eventDescs[eventRow[0]] = + // (id, triggerId, roles, klass) + new EventDesc(eventRow[0], eventRow[1], eventRow[2]); + var trigger = triggerHash[eventDesc.triggerId]; + var span = trigger[0].copy(eventDesc.id); + trigger[1].push(span); + data.spans[eventDesc.id] = span; + }); + + // XXX modifications: delete later + $.each(sourceData.modifications, function(modNo, mod) { + // mod: [id, spanId, modification] + if (!data.spans[mod[2]]) { + dispatcher.post('messages', [[['ERROR
    Event ' + mod[2] + ' (referenced from modification ' + mod[0] + ') does not occur in document ' + data.document + '
    (please correct the source data)', 'error', 5]]]); + return; + } + data.spans[mod[2]][mod[1]] = true; + }); + + var midpointComparator = function(a, b) { + var tmp = a.from + a.to - b.from - b.to; + if (!tmp) return 0; + return tmp < 0 ? -1 : 1; + }; + // split spans into span fragments (for discontinuous spans) + $.each(data.spans, function(spanNo, span) { + $.each(span.offsets, function(offsetsNo, offsets) { + var from = parseInt(offsets[0], 10); + var to = parseInt(offsets[1], 10); + var fragment = new Fragment(offsetsNo, span, from, to); + span.fragments.push(fragment); + }); + // ensure ascending order + span.fragments.sort(midpointComparator); + span.wholeFrom = span.fragments[0].from; + span.wholeTo = span.fragments[span.fragments.length - 1].to; + span.headFragment = span.fragments[(true) ? span.fragments.length - 1 : 0]; // TODO configurable! + }); + + var spanComparator = function(a, b) { + var aSpan = data.spans[a]; + var bSpan = data.spans[b]; + var tmp = aSpan.headFragment.from + aSpan.headFragment.to - bSpan.headFragment.from - bSpan.headFragment.to; + if (tmp) { + return tmp < 0 ? -1 : 1; + } + return 0; + }; + $.each(sourceData.equivs, function(equivNo, equiv) { + // equiv: ['*', 'Equiv', spanId...] + equiv[0] = "*" + equivNo; + var equivSpans = equiv.slice(2); + var okEquivSpans = []; + // collect the equiv spans in an array + $.each(equivSpans, function(equivSpanNo, equivSpan) { + if (data.spans[equivSpan]) okEquivSpans.push(equivSpan); + // TODO: #404, inform the user with a message? + }); + // sort spans in the equiv by their midpoint + okEquivSpans.sort(spanComparator); + // generate the arcs + var len = okEquivSpans.length; + for (var i = 1; i < len; i++) { + var eventDesc = data.eventDescs[equiv[0] + '*' + i] = + // (id, triggerId, roles, klass) + new EventDesc(okEquivSpans[i - 1], okEquivSpans[i - 1], [[equiv[1], okEquivSpans[i]]], 'equiv'); + eventDesc.leftSpans = okEquivSpans.slice(0, i); + eventDesc.rightSpans = okEquivSpans.slice(i); + } + }); + $.each(sourceData.relations, function(relNo, rel) { + // rel[2] is args, rel[2][a][0] is role and rel[2][a][1] is value for a in (0,1) + var argsDesc = relationTypesHash[rel[1]]; + argsDesc = argsDesc && argsDesc.args; + var t1, t2; + if (argsDesc) { + // sort the arguments according to the config + var args = {} + args[rel[2][0][0]] = rel[2][0][1]; + args[rel[2][1][0]] = rel[2][1][1]; + t1 = args[argsDesc[0].role]; + t2 = args[argsDesc[1].role]; + } else { + // (or leave as-is in its absence) + t1 = rel[2][0][1]; + t2 = rel[2][1][1]; + } + data.eventDescs[rel[0]] = + // (id, triggerId, roles, klass) + new EventDesc(t1, t1, [[rel[1], t2]], 'relation'); + }); + + // attributes + $.each(sourceData.attributes, function(attrNo, attr) { + // attr: [id, name, spanId, value, cueSpanId + + // TODO: might wish to check what's appropriate for the type + // instead of using the first attribute def found + var attrType = (eventAttributeTypes[attr[1]] || + entityAttributeTypes[attr[1]]); + var attrValue = attrType && attrType.values[attrType.bool || attr[3]]; + var span = data.spans[attr[2]]; + if (!span) { + dispatcher.post('messages', [[['Annotation ' + attr[2] + ', referenced from attribute ' + attr[0] + ', does not exist.', 'error']]]); + return; + } + var valText = (attrValue && attrValue.name) || attr[3]; + var attrText = attrType + ? (attrType.bool ? attrType.name : (attrType.name + ': ' + valText)) + : (attr[3] == true ? attr[1] : attr[1] + ': ' + attr[3]); + span.attributeText.push(attrText); + span.attributes[attr[1]] = attr[3]; + if (attr[4]) { // cue + span.attributeCues[attr[1]] = attr[4]; + var cueSpan = data.spans[attr[4]]; + cueSpan.attributeCueFor[data.spans[1]] = attr[2]; + cueSpan.cue = 'CUE'; // special css type + } + $.extend(span.attributeMerge, attrValue); + }); + + // comments + $.each(sourceData.comments, function(commentNo, comment) { + // comment: [entityId, type, text] + + // TODO error handling + + // sentence id: ['sent', sentId] + if (comment[0] instanceof Array && comment[0][0] == 'sent') { + // sentence comment + var sent = comment[0][1]; + var text = comment[2]; + if (data.sentComment[sent]) { + text = data.sentComment[sent].text + '
    ' + text; + } + data.sentComment[sent] = { type: comment[1], text: text }; + } else { + var id = comment[0]; + var trigger = triggerHash[id]; + var eventDesc = data.eventDescs[id]; + var commentEntities = + trigger + ? trigger[1] // trigger: [span, ...] + : id in data.spans + ? [data.spans[id]] // span: [span] + : id in data.eventDescs + ? [data.eventDescs[id]] // arc: [eventDesc] + : []; + $.each(commentEntities, function(entityId, entity) { + // if duplicate comment for entity: + // overwrite type, concatenate comment with a newline + if (!entity.comment) { + entity.comment = { type: comment[1], text: comment[2] }; + } else { + entity.comment.type = comment[1]; + entity.comment.text += "\n" + comment[2]; + } + // partially duplicate marking of annotator note comments + if (comment[1] == "AnnotatorNotes") { + entity.annotatorNotes = comment[2]; + } + // prioritize type setting when multiple comments are present + if (commentPriority(comment[1]) > commentPriority(entity.shadowClass)) { + entity.shadowClass = comment[1]; + } + }); + } + }); + + // normalizations + $.each(sourceData.normalizations, function(normNo, norm) { + var id = norm[0]; + var normType = norm[1]; + var target = norm[2]; + var refdb = norm[3]; + var refid = norm[4]; + var reftext = norm[5]; + + // grab entity / event the normalization applies to + var span = data.spans[target]; + if (!span) { + dispatcher.post('messages', [[['Annotation ' + target + ', referenced from normalization ' + id + ', does not exist.', 'error']]]); + return; + } + + // TODO: do we have any possible use for the normType? + span.normalizations.push([refdb, refid, reftext]); + + // quick hack for span box visual style + span.normalized = 'Normalized'; + }); + + // prepare span boundaries for token containment testing + var sortedFragments = []; + $.each(data.spans, function(spanNo, span) { + $.each(span.fragments, function(fragmentNo, fragment) { + sortedFragments.push(fragment); + }); + }); + // sort fragments by beginning, then by end + sortedFragments.sort(function(a, b) { + var x = a.from; + var y = b.from; + if (x == y) { + x = a.to; + y = b.to; + } + return ((x < y) ? -1 : ((x > y) ? 1 : 0)); + }); + var currentFragmentId = 0; + var startFragmentId = 0; + var numFragments = sortedFragments.length; + var lastTo = 0; + var firstFrom = null; + var chunkNo = 0; + var space; + var chunk = null; + // token containment testing (chunk recognition) + $.each(sourceData.token_offsets, function() { + var from = this[0]; + var to = this[1]; + if (firstFrom === null) firstFrom = from; + + // Replaced for speedup; TODO check correctness + // inSpan = false; + // $.each(data.spans, function(spanNo, span) { + // if (span.from < to && to < span.to) { + // // it does; no word break + // inSpan = true; + // return false; + // } + // }); + + // Is the token end inside a span? + if (startFragmentId && to > sortedFragments[startFragmentId - 1].to) { + while (startFragmentId < numFragments && to > sortedFragments[startFragmentId].from) { + startFragmentId++; + } + } + currentFragmentId = startFragmentId; + while (currentFragmentId < numFragments && to >= sortedFragments[currentFragmentId].to) { + currentFragmentId++; + } + // if yes, the next token is in the same chunk + if (currentFragmentId < numFragments && to > sortedFragments[currentFragmentId].from) { + return; + } + + // otherwise, create the chunk found so far + space = data.text.substring(lastTo, firstFrom); + var text = data.text.substring(firstFrom, to); + if (chunk) chunk.nextSpace = space; + // (index, text, from, to, space) { + chunk = new Chunk(chunkNo++, text, firstFrom, to, space); + data.chunks.push(chunk); + lastTo = to; + firstFrom = null; + }); + var numChunks = chunkNo; + + // find sentence boundaries in relation to chunks + chunkNo = 0; + var sentenceNo = 0; + var pastFirst = false; + $.each(sourceData.sentence_offsets, function() { + var from = this[0]; + if (chunkNo >= numChunks) return false; + if (data.chunks[chunkNo].from > from) return; + var chunk; + while (chunkNo < numChunks && (chunk = data.chunks[chunkNo]).from < from) { + chunkNo++; + } + chunkNo++; + if (pastFirst && from <= chunk.from) { + var numNL = chunk.space.split("\n").length - 1; + if (!numNL) numNL = 1; + sentenceNo += numNL; + chunk.sentence = sentenceNo; + } else { + pastFirst = true; + } + }); + + // assign fragments to appropriate chunks + var currentChunkId = 0; + var chunk; + $.each(sortedFragments, function(fragmentId, fragment) { + while (fragment.to > (chunk = data.chunks[currentChunkId]).to) currentChunkId++; + chunk.fragments.push(fragment); + fragment.text = chunk.text.substring(fragment.from - chunk.from, fragment.to - chunk.from); + fragment.chunk = chunk; + }); + + // assign arcs to spans; calculate arc distances + $.each(data.eventDescs, function(eventNo, eventDesc) { + var dist = 0; + var origin = data.spans[eventDesc.id]; + if (!origin) { + // TODO: include missing trigger ID in error message + dispatcher.post('messages', [[['ERROR
    Trigger for event "' + eventDesc.id + '" not found in ' + data.document + '
    (please correct the source data)', 'error', 5]]]); + return; + } + var here = origin.headFragment.from + origin.headFragment.to; + $.each(eventDesc.roles, function(roleNo, role) { + var target = data.spans[role.targetId]; + if (!target) { + dispatcher.post('messages', [[['ERROR
    "' + role.targetId + '" (referenced from "' + eventDesc.id + '") not found in ' + data.document + '
    (please correct the source data)', 'error', 5]]]); + return; + } + var there = target.headFragment.from + target.headFragment.to; + var dist = Math.abs(here - there); + var arc = new Arc(eventDesc, role, dist, eventNo); + origin.totalDist += dist; + origin.numArcs++; + target.totalDist += dist; + target.numArcs++; + data.arcs.push(arc); + target.incoming.push(arc); + origin.outgoing.push(arc); + // ID dict for easy access. TODO: have a function defining the + // (origin,type,target)->id mapping (see also annotator_ui.js) + var arcId = origin.id + '--' + role.type + '--' + target.id; + data.arcById[arcId] = arc; + }); // roles + }); // eventDescs + + // highlighting + markedText = []; + setMarked('edited'); // set by editing process + setMarked('focus'); // set by URL + setMarked('matchfocus'); // set by search process, focused match + setMarked('match'); // set by search process, other (non-focused) match + + $.each(data.spans, function(spanId, span) { + // calculate average arc distances + // average distance of arcs (0 for no arcs) + span.avgDist = span.numArcs ? span.totalDist / span.numArcs : 0; + lastSpan = span; + + // collect fragment texts into span texts + var fragmentTexts = []; + $.each(span.fragments, function(fragmentNo, fragment) { + // TODO heuristics + fragmentTexts.push(fragment.text); + }); + span.text = fragmentTexts.join(''); + }); // data.spans + + for (var i = 0; i < 2; i++) { + // preliminary sort to assign heights for basic cases + // (first round) and cases resolved in the previous + // round(s). + $.each(data.chunks, function(chunkNo, chunk) { + // sort + chunk.fragments.sort(fragmentComparator); + // renumber + $.each(chunk.fragments, function(fragmentNo, fragment) { + fragment.indexNumber = fragmentNo; + }); + }); + // nix the sums, so we can sum again + $.each(data.spans, function(spanNo, span) { + span.refedIndexSum = 0; + }); + // resolved cases will now have indexNumber set + // to indicate their relative order. Sum those for referencing cases + // for use in iterative resorting + $.each(data.arcs, function(arcNo, arc) { + data.spans[arc.origin].refedIndexSum += data.spans[arc.target].headFragment.indexNumber; + }); + } + + // Final sort of fragments in chunks for drawing purposes + // Also identify the marked text boundaries regarding chunks + $.each(data.chunks, function(chunkNo, chunk) { + // and make the next sort take this into account. Note that this will + // now resolve first-order dependencies between sort orders but not + // second-order or higher. + chunk.fragments.sort(fragmentComparator); + $.each(chunk.fragments, function(fragmentNo, fragment) { + fragment.drawOrder = fragmentNo; + }); + }); + + data.spanDrawOrderPermutation = Object.keys(data.spans); + data.spanDrawOrderPermutation.sort(function(a, b) { + var spanA = data.spans[a]; + var spanB = data.spans[b]; + + // We're jumping all over the chunks, but it's enough that + // we're doing everything inside each chunk in the right + // order. should it become necessary to actually do these in + // linear order, put in a similar condition for + // spanX.headFragment.chunk.index; but it should not be + // needed. + + var tmp = spanA.headFragment.drawOrder - spanB.headFragment.drawOrder; + if (tmp) return tmp < 0 ? -1 : 1; + + return 0; + }); + + // resort the spans for linear order by center + sortedFragments.sort(midpointComparator); + + // sort fragments into towers, calculate average arc distances + var lastFragment = null; + var towerId = -1; + $.each(sortedFragments, function(i, fragment) { + if (!lastFragment || (lastFragment.from != fragment.from || lastFragment.to != fragment.to)) { + towerId++; + } + fragment.towerId = towerId; + lastFragment = fragment; + }); // sortedFragments + + // find curlies (only the first fragment drawn in a tower) + $.each(data.spanDrawOrderPermutation, function(spanIdNo, spanId) { + var span = data.spans[spanId]; + + $.each(span.fragments, function(fragmentNo, fragment) { + if (!data.towers[fragment.towerId]) { + data.towers[fragment.towerId] = []; + fragment.drawCurly = true; + fragment.span.drawCurly = true; + } + data.towers[fragment.towerId].push(fragment); + }); + }); + + var spanAnnTexts = {}; + $.each(data.chunks, function(chunkNo, chunk) { + chunk.markedTextStart = []; + chunk.markedTextEnd = []; + + $.each(chunk.fragments, function(fragmentNo, fragment) { + if (chunk.firstFragmentIndex == undefined) { + chunk.firstFragmentIndex = fragment.towerId; + } + chunk.lastFragmentIndex = fragment.towerId; + + var spanLabels = Util.getSpanLabels(spanTypes, fragment.span.type); + fragment.labelText = Util.spanDisplayForm(spanTypes, fragment.span.type); + // Find the most appropriate label according to text width + if (Configuration.abbrevsOn && spanLabels) { + var labelIdx = 1; // first abbrev + var maxLength = (fragment.to - fragment.from) / 0.8; + while (fragment.labelText.length > maxLength && + spanLabels[labelIdx]) { + fragment.labelText = spanLabels[labelIdx]; + labelIdx++; + } + } + + var svgtext = svg.createText(); // one "text" element per row + var postfixArray = []; + var prefix = ''; + var postfix = ''; + var warning = false; + $.each(fragment.span.attributes, function(attrType, valType) { + // TODO: might wish to check what's appropriate for the type + // instead of using the first attribute def found + var attr = (eventAttributeTypes[attrType] || + entityAttributeTypes[attrType]); + if (!attr) { + // non-existent type + warning = true; + return; + } + var val = attr.values[attr.bool || valType]; + if (!val) { + // non-existent value + warning = true; + return; + } + if ($.isEmptyObject(val)) { + // defined, but lacks any visual presentation + warning = true; + return; + } + if (val.glyph) { + if (val.position == "left") { + prefix = val.glyph + prefix; + var css = 'glyph'; + if (attr.css) css += ' glyph_' + Util.escapeQuotes(attr.css); + svgtext.span(val.glyph, { 'class': css }); + } else { // XXX right is implied - maybe change + postfixArray.push([attr, val]); + postfix += val.glyph; + } + } + }); + var text = fragment.labelText; + if (prefix !== '') { + text = prefix + ' ' + text; + svgtext.string(' '); + } + svgtext.string(fragment.labelText); + if (postfixArray.length) { + text += ' ' + postfix; + svgtext.string(' '); + $.each(postfixArray, function(elNo, el) { + var css = 'glyph'; + if (el[0].css) css += ' glyph_' + Util.escapeQuotes(el[0].css); + svgtext.span(el[1].glyph, { 'class': css }); + }); + } + if (warning) { + svgtext.span("#", { 'class': 'glyph attribute_warning' }); + text += ' #'; + } + fragment.glyphedLabelText = text; + + if (!spanAnnTexts[text]) { + spanAnnTexts[text] = true; + data.spanAnnTexts[text] = svgtext; + } + }); // chunk.fragments + }); // chunks + + var numChunks = data.chunks.length; + // note the location of marked text with respect to chunks + var startChunk = 0; + var currentChunk; + // sort by "from"; we don't need to sort by "to" as well, + // because unlike spans, chunks are disjunct + markedText.sort(function(a, b) { + return Util.cmp(a[0], b[0]); + }); + $.each(markedText, function(textNo, textPos) { + var from = textPos[0]; + var to = textPos[1]; + var markedType = textPos[2]; + if (from < 0) from = 0; + if (to < 0) to = 0; + if (to >= data.text.length) to = data.text.length - 1; + if (from > to) from = to; + while (startChunk < numChunks) { + var chunk = data.chunks[startChunk]; + if (from <= chunk.to) { + chunk.markedTextStart.push([textNo, true, from - chunk.from, null, markedType]); + break; + } + startChunk++; + } + if (startChunk == numChunks) { + dispatcher.post('messages', [[['Wrong text offset', 'error']]]); + return; + } + currentChunk = startChunk; + while (currentChunk < numChunks) { + var chunk = data.chunks[currentChunk]; + if (to <= chunk.to) { + chunk.markedTextEnd.push([textNo, false, to - chunk.from]); + break + } + currentChunk++; + } + if (currentChunk == numChunks) { + dispatcher.post('messages', [[['Wrong text offset', 'error']]]); + var chunk = data.chunks[data.chunks.length - 1]; + chunk.markedTextEnd.push([textNo, false, chunk.text.length]); + return; + } + }); // markedText + + dispatcher.post('dataReady', [data]); + }; + + var resetData = function() { + setData(sourceData); + renderData(); + } + + var translate = function(element, x, y) { + $(element.group).attr('transform', 'translate(' + x + ', ' + y + ')'); + element.translation = { x: x, y: y }; + }; + + var showMtime = function() { + if (data.mtime) { + // we're getting seconds and need milliseconds + //$('#document_ctime').text("Created: " + Annotator.formatTime(1000 * data.ctime)).css("display", "inline"); + $('#document_mtime').text("Last modified: " + Util.formatTimeAgo(1000 * data.mtime)).css("display", "inline"); + } else { + //$('#document_ctime').css("display", "none"); + $('#document_mtime').css("display", "none"); + } + }; + + var addHeaderAndDefs = function() { + var commentName = (coll + '/' + doc).replace('--', '-\\-'); + $svg.append(''); + var defs = svg.defs(); + var $blurFilter = $(''); + svg.add(defs, $blurFilter); + return defs; + } + + var getTextMeasurements = function(textsHash, options, callback) { + // make some text elements, find out the dimensions + var textMeasureGroup = svg.group(options); + + // changed from $.each because of #264 ('length' can appear) + for (var text in textsHash) { + if (textsHash.hasOwnProperty(text)) { + svg.text(textMeasureGroup, 0, 0, text); + } + } + + // measuring goes on here + var widths = {}; + $(textMeasureGroup).find('text').each(function(svgTextNo, svgText) { + var text = $(svgText).text(); + widths[text] = this.getComputedTextLength(); + + if (callback) { + $.each(textsHash[text], function(text, object) { + callback(object, svgText); + }); + } + }); + var bbox = textMeasureGroup.getBBox(); + svg.remove(textMeasureGroup); + + return new Measurements(widths, bbox.height, bbox.y); + }; + + var getTextAndSpanTextMeasurements = function() { + // get the span text sizes + var chunkTexts = {}; // set of span texts + $.each(data.chunks, function(chunkNo, chunk) { + chunk.row = undefined; // reset + if (!(chunk.text in chunkTexts)) chunkTexts[chunk.text] = [] + var chunkText = chunkTexts[chunk.text]; + + // here we also need all the spans that are contained in + // chunks with this text, because we need to know the position + // of the span text within the respective chunk text + chunkText.push.apply(chunkText, chunk.fragments); + // and also the markedText boundaries + chunkText.push.apply(chunkText, chunk.markedTextStart); + chunkText.push.apply(chunkText, chunk.markedTextEnd); + }); + var textSizes = getTextMeasurements( + chunkTexts, + undefined, + function(fragment, text) { + if (fragment instanceof Fragment) { // it's a fragment! + // measure the fragment text position in pixels + var firstChar = fragment.from - fragment.chunk.from; + if (firstChar < 0) { + firstChar = 0; + dispatcher.post('messages', [[['WARNING' + + '
    ' + + 'The fragment [' + fragment.from + ', ' + fragment.to + '] (' + fragment.text + ') is not ' + + 'contained in its designated chunk [' + + fragment.chunk.from + ', ' + fragment.chunk.to + '] most likely ' + + 'due to the fragment starting or ending with a space, please ' + + 'verify the sanity of your data since we are unable to ' + + 'visualise this fragment correctly and will drop leading ' + + 'space characters' + , 'warning', 15]]]); + } + var startPos = text.getStartPositionOfChar(firstChar).x; + var lastChar = fragment.to - fragment.chunk.from - 1; + var endPos = (lastChar < 0) + ? startPos + : text.getEndPositionOfChar(lastChar).x; + fragment.curly = { + from: startPos, + to: endPos + }; + } else { // it's markedText [id, start?, char#, offset] + if (fragment[2] < 0) fragment[2] = 0; + if (!fragment[2]) { // start + fragment[3] = text.getStartPositionOfChar(fragment[2]).x; + } else { + fragment[3] = text.getEndPositionOfChar(fragment[2] - 1).x + 1; + } + } + }); + + // get the fragment annotation text sizes + var fragmentTexts = {}; + var noSpans = true; + $.each(data.spans, function(spanNo, span) { + $.each(span.fragments, function(fragmentNo, fragment) { + fragmentTexts[fragment.glyphedLabelText] = true; + noSpans = false; + }); + }); + if (noSpans) fragmentTexts.$ = true; // dummy so we can at least get the height + var fragmentSizes = getTextMeasurements(fragmentTexts, {'class': 'span'}); + + return { + texts: textSizes, + fragments: fragmentSizes + }; + }; + + var addArcTextMeasurements = function(sizes) { + // get the arc annotation text sizes (for all labels) + var arcTexts = {}; + $.each(data.arcs, function(arcNo, arc) { + var labels = Util.getArcLabels(spanTypes, data.spans[arc.origin].type, arc.type, relationTypesHash); + if (!labels.length) labels = [arc.type]; + $.each(labels, function(labelNo, label) { + arcTexts[label] = true; + }); + }); + var arcSizes = getTextMeasurements(arcTexts, {'class': 'arcs'}); + sizes.arcs = arcSizes; + }; + + var adjustTowerAnnotationSizes = function() { + // find biggest annotation in each tower + $.each(data.towers, function(towerNo, tower) { + var maxWidth = 0; + $.each(tower, function(fragmentNo, fragment) { + var width = data.sizes.fragments.widths[fragment.glyphedLabelText]; + if (width > maxWidth) maxWidth = width; + }); // tower + $.each(tower, function(fragmentNo, fragment) { + fragment.width = maxWidth; + }); // tower + }); // data.towers + }; + + var makeArrow = function(defs, spec) { + var parsedSpec = spec.split(','); + var type = parsedSpec[0]; + if (type == 'none') return; + + var width = 5; + var height = 5; + var color = "black"; + if ($.isNumeric(parsedSpec[1]) && parsedSpec[2]) { + if ($.isNumeric(parsedSpec[2]) && parsedSpec[3]) { + // 3 args, 2 numeric: assume width, height, color + width = parsedSpec[1]; + height = parsedSpec[2]; + color = parsedSpec[3] || 'black'; + } else { + // 2 args, 1 numeric: assume width/height, color + width = height = parsedSpec[1]; + color = parsedSpec[2] || 'black'; + } + } else { + // other: assume color only + width = height = 5; + color = parsedSpec[1] || 'black'; + } + // hash needs to be replaced as IDs don't permit it. + var arrowId = 'arrow_' + spec.replace(/#/g, '').replace(/,/g, '_'); + + var arrow; + if (type == 'triangle') { + arrow = svg.marker(defs, arrowId, + width, height / 2, width, height, 'auto', + { + markerUnits: 'strokeWidth', + 'fill': color, + }); + svg.polyline(arrow, [[0, 0], [width, height / 2], [0, height], [width / 12, height / 2]]); + } + return arrowId; + } + + + var drawing = false; + var redraw = false; + + var renderDataReal = function(sourceData) { + + +Util.profileEnd('before render'); +Util.profileStart('render'); +Util.profileStart('init'); + + if (!sourceData && !data) { + dispatcher.post('doneRendering', [coll, doc, args]); + return; + } + $svgDiv.show(); + if ((sourceData && sourceData.collection && (sourceData.document !== doc || sourceData.collection !== coll)) || drawing) { + redraw = true; + dispatcher.post('doneRendering', [coll, doc, args]); + return; + } + redraw = false; + drawing = true; + + if (sourceData) setData(sourceData); + showMtime(); + + // clear the SVG + svg.clear(true); + if (!data || data.length == 0) return; + + // establish the width according to the enclosing element + canvasWidth = that.forceWidth || $svgDiv.width(); + + var defs = addHeaderAndDefs(); + + var backgroundGroup = svg.group({ 'class': 'background' }); + var glowGroup = svg.group({ 'class': 'glow' }); + highlightGroup = svg.group({ 'class': 'highlight' }); + var textGroup = svg.group({ 'class': 'text' }); + +Util.profileEnd('init'); +Util.profileStart('measures'); + + var sizes = getTextAndSpanTextMeasurements(); + data.sizes = sizes; + + adjustTowerAnnotationSizes(); + var maxTextWidth = 0; + for (var text in sizes.texts.widths) { + if (sizes.texts.widths.hasOwnProperty(text)) { + var width = sizes.texts.widths[text] + if (width > maxTextWidth) maxTextWidth = width; + } + } + +Util.profileEnd('measures'); +Util.profileStart('chunks'); + + var currentX = Configuration.visual.margin.x + sentNumMargin + rowPadding; + var rows = []; + var fragmentHeights = []; + var sentenceToggle = 0; + var sentenceNumber = 0; + var row = new Row(svg); + row.sentence = ++sentenceNumber; + row.backgroundIndex = sentenceToggle; + row.index = 0; + var rowIndex = 0; + var twoBarWidths; // HACK to avoid measuring space's width + var openTextHighlights = {}; + var textMarkedRows = []; + + addArcTextMeasurements(sizes); + + // reserve places for spans + var floors = []; + var reservations = []; // reservations[chunk][floor] = [[from, to, headroom]...] + for (var i = 0; i <= data.lastFragmentIndex; i++) { + reservation[i] = {}; + } + var inf = 1.0/0.0; + + $.each(data.spanDrawOrderPermutation, function(spanIdNo, spanId) { + var span = data.spans[spanId]; + + var f1 = span.fragments[0]; + var f2 = span.fragments[span.fragments.length - 1]; + + var x1 = (f1.curly.from + f1.curly.to - f1.width) / 2 - + Configuration.visual.margin.x; + var i1 = f1.chunk.index; + + var x2 = (f2.curly.from + f2.curly.to + f2.width) / 2 + + Configuration.visual.margin.x; + var i2 = f2.chunk.index; + + // Start from the ground level, going up floor by floor. + // If no more floors, make a new available one. + // If a floor is available and there is no carpet, mark it as carpet. + // If a floor is available and there is carpet and height + // difference is at least fragment height + curly, OK. + // If a floor is not available, forget about carpet. + // -- + // When OK, calculate exact ceiling. + // If there isn't one, make a new floor, copy reservations + // from floor below (with decreased ceiling) + // Make the reservation from the carpet to just below the + // current floor. + // + // TODO drawCurly and height could be prettified to only check + // actual positions of curlies + var carpet = 0; + var outside = true; + var thisCurlyHeight = span.drawCurly ? Configuration.visual.curlyHeight : 0; + var height = sizes.fragments.height + thisCurlyHeight + Configuration.visual.boxSpacing + + 2 * Configuration.visual.margin.y - 3; + $.each(floors, function(floorNo, floor) { + var floorAvailable = true; + for (var i = i1; i <= i2; i++) { + if (!(reservations[i] && reservations[i][floor])) continue; + var from = (i == i1) ? x1 : -inf; + var to = (i == i2) ? x2 : inf; + $.each(reservations[i][floor], function(resNo, res) { + if (res[0] < to && from < res[1]) { + floorAvailable = false; + return false; + } + }); + } + if (floorAvailable) { + if (carpet === null) { + carpet = floor; + } else if (height + carpet <= floor) { + // found our floor! + outside = false; + return false; + } + } else { + carpet = null; + } + }); + var reslen = reservations.length; + var makeNewFloorIfNeeded = function(floor) { + var floorNo = $.inArray(floor, floors); + if (floorNo == -1) { + floors.push(floor); + floors.sort(Util.cmp); + floorNo = $.inArray(floor, floors); + if (floorNo != 0) { + // copy reservations from the floor below + var parquet = floors[floorNo - 1]; + for (var i = 0; i <= reslen; i++) { + if (reservations[i]) { + if (!reservations[i][parquet]) { + reservations[i][parquet] = []; + } + var footroom = floor - parquet; + $.each(reservations[i][parquet], function(resNo, res) { + if (res[2] > footroom) { + if (!reservations[i][floor]) { + reservations[i][floor] = []; + } + reservations[i][floor].push([res[0], res[1], res[2] - footroom]); + } + }); + } + } + } + } + return floorNo; + } + var ceiling = carpet + height; + var ceilingNo = makeNewFloorIfNeeded(ceiling); + var carpetNo = makeNewFloorIfNeeded(carpet); + // make the reservation + var floor, floorNo; + for (floorNo = carpetNo; + (floor = floors[floorNo]) !== undefined && floor < ceiling; + floorNo++) { + var headroom = ceiling - floor; + for (var i = i1; i <= i2; i++) { + var from = (i == i1) ? x1 : 0; + var to = (i == i2) ? x2 : inf; + if (!reservations[i]) reservations[i] = {}; + if (!reservations[i][floor]) reservations[i][floor] = []; + reservations[i][floor].push([from, to, headroom]); // XXX maybe add fragment; probably unnecessary + } + } + span.floor = carpet + thisCurlyHeight; + }); + + $.each(data.chunks, function(chunkNo, chunk) { + reservations = new Array(); + chunk.group = svg.group(row.group); + chunk.highlightGroup = svg.group(chunk.group); + + var y = 0; + var minArcDist; + var hasLeftArcs, hasRightArcs, hasInternalArcs; + var hasAnnotations; + var chunkFrom = Infinity; + var chunkTo = 0; + var chunkHeight = 0; + var spacing = 0; + var spacingChunkId = null; + var spacingRowBreak = 0; + + $.each(chunk.fragments, function(fragmentNo, fragment) { + var span = fragment.span; + var spanDesc = spanTypes[span.type]; + var bgColor = ((spanDesc && spanDesc.bgColor) || + (spanTypes.SPAN_DEFAULT && + spanTypes.SPAN_DEFAULT.bgColor) || '#ffffff'); + var fgColor = ((spanDesc && spanDesc.fgColor) || + (spanTypes.SPAN_DEFAULT && + spanTypes.SPAN_DEFAULT.fgColor) || '#000000'); + var borderColor = ((spanDesc && spanDesc.borderColor) || + (spanTypes.SPAN_DEFAULT && + spanTypes.SPAN_DEFAULT.borderColor) || '#000000'); + + // special case: if the border 'color' value is 'darken', + // then just darken the BG color a bit for the border. + if (borderColor == 'darken') { + borderColor = Util.adjustColorLightness(bgColor, -0.6); + } + + fragment.group = svg.group(chunk.group, { + 'class': 'span', + }); + + var fragmentHeight = 0; + + if (!y) y = -sizes.texts.height; + var x = (fragment.curly.from + fragment.curly.to) / 2; + + // XXX is it maybe sizes.texts? + var yy = y + sizes.fragments.y; + var hh = sizes.fragments.height; + var ww = fragment.width; + var xx = x - ww / 2; + + // text margin fine-tuning + yy += boxTextMargin.y; + hh -= 2*boxTextMargin.y; + xx += boxTextMargin.x; + ww -= 2*boxTextMargin.x; + var rectClass = 'span_' + (span.cue || span.type) + ' span_default'; // TODO XXX first part unneeded I think; remove + + // attach e.g. "False_positive" into the type + if (span.comment && span.comment.type) { rectClass += ' '+span.comment.type; } + var bx = xx - Configuration.visual.margin.x - boxTextMargin.x; + var by = yy - Configuration.visual.margin.y; + var bw = ww + 2 * Configuration.visual.margin.x; + var bh = hh + 2 * Configuration.visual.margin.y; + + if (roundCoordinates) { + x = (x|0)+0.5; + bx = (bx|0)+0.5; + } + + var shadowRect; + var markedRect; + if (span.marked) { + markedRect = svg.rect(chunk.highlightGroup, + bx - markedSpanSize, by - markedSpanSize, + bw + 2 * markedSpanSize, bh + 2 * markedSpanSize, { + + // filter: 'url(#Gaussian_Blur)', + 'class': "shadow_EditHighlight", + rx: markedSpanSize, + ry: markedSpanSize, + }); + svg.other(markedRect, 'animate', { + 'data-type': span.marked, + attributeName: 'fill', + values: (span.marked == 'match'? highlightMatchSequence + : highlightSpanSequence), + dur: highlightDuration, + repeatCount: 'indefinite', + begin: 'indefinite' + }); + chunkFrom = Math.min(bx - markedSpanSize, chunkFrom); + chunkTo = Math.max(bx + bw + markedSpanSize, chunkTo); + fragmentHeight = Math.max(bh + 2 * markedSpanSize, fragmentHeight); + } + // .match() removes unconfigured shadows, which were + // always showing up as black. + // TODO: don't hard-code configured shadowclasses. + if (span.shadowClass && + span.shadowClass.match('True_positive|False_positive|False_negative|AnnotationError|AnnotationWarning|AnnotatorNotes|Normalized|AnnotationIncomplete|AnnotationUnconfirmed|rectEditHighlight|EditHighlight_arc|MissingAnnotation|ChangedAnnotation ')) { + shadowRect = svg.rect(fragment.group, + bx - rectShadowSize, by - rectShadowSize, + bw + 2 * rectShadowSize, bh + 2 * rectShadowSize, { + 'class': 'shadow_' + span.shadowClass, + filter: 'url(#Gaussian_Blur)', + rx: rectShadowRounding, + ry: rectShadowRounding, + }); + chunkFrom = Math.min(bx - rectShadowSize, chunkFrom); + chunkTo = Math.max(bx + bw + rectShadowSize, chunkTo); + fragmentHeight = Math.max(bh + 2 * rectShadowSize, fragmentHeight); + } + fragment.rect = svg.rect(fragment.group, + bx, by, bw, bh, { + + 'class': rectClass, + fill: bgColor, + stroke: borderColor, + rx: Configuration.visual.margin.x, + ry: Configuration.visual.margin.y, + 'data-span-id': span.id, + 'data-fragment-id': fragment.id, + 'strokeDashArray': span.attributeMerge.dashArray, + }); + + // TODO XXX: quick nasty hack to allow normalizations + // to be marked visually; do something cleaner! + if (span.normalized) { + $(fragment.rect).addClass(span.normalized); + } + + fragment.right = bx + bw; // TODO put it somewhere nicer? + if (!(span.shadowClass || span.marked)) { + chunkFrom = Math.min(bx, chunkFrom); + chunkTo = Math.max(bx + bw, chunkTo); + fragmentHeight = Math.max(bh, fragmentHeight); + } + + fragment.rectBox = { x: bx, y: by - span.floor, width: bw, height: bh }; + fragment.height = span.floor + hh + 3 * Configuration.visual.margin.y + Configuration.visual.curlyHeight + Configuration.visual.arcSpacing; + var spacedTowerId = fragment.towerId * 2; + if (!fragmentHeights[spacedTowerId] || fragmentHeights[spacedTowerId] < fragment.height) { + fragmentHeights[spacedTowerId] = fragment.height; + } + $(fragment.rect).attr('y', yy - Configuration.visual.margin.y - span.floor); + if (shadowRect) { + $(shadowRect).attr('y', yy - rectShadowSize - Configuration.visual.margin.y - span.floor); + } + if (markedRect) { + $(markedRect).attr('y', yy - markedSpanSize - Configuration.visual.margin.y - span.floor); + } + if (span.attributeMerge.box === "crossed") { + svg.path(fragment.group, svg.createPath(). + move(xx, yy - Configuration.visual.margin.y - span.floor). + line(xx + fragment.width, + yy + hh + Configuration.visual.margin.y - span.floor), + { 'class': 'boxcross' }); + svg.path(fragment.group, svg.createPath(). + move(xx + fragment.width, yy - Configuration.visual.margin.y - span.floor). + line(xx, yy + hh + Configuration.visual.margin.y - span.floor), + { 'class': 'boxcross' }); + } + var fragmentText = svg.text(fragment.group, x, y - span.floor, data.spanAnnTexts[fragment.glyphedLabelText], { fill: fgColor }); + + // Make curlies to show the fragment + if (fragment.drawCurly) { + var curlyColor = 'grey'; + if (coloredCurlies) { + var spanDesc = spanTypes[span.type]; + var bgColor = ((spanDesc && spanDesc.bgColor) || + (spanTypes.SPAN_DEFAULT && + spanTypes.SPAN_DEFAULT.fgColor) || + '#000000'); + curlyColor = Util.adjustColorLightness(bgColor, -0.6); + } + + var bottom = yy + hh + Configuration.visual.margin.y - span.floor + 1; + svg.path(fragment.group, svg.createPath() + .move(fragment.curly.from, bottom + Configuration.visual.curlyHeight) + .curveC(fragment.curly.from, bottom, + x, bottom + Configuration.visual.curlyHeight, + x, bottom) + .curveC(x, bottom + Configuration.visual.curlyHeight, + fragment.curly.to, bottom, + fragment.curly.to, bottom + Configuration.visual.curlyHeight), + { + 'class': 'curly', + 'stroke': curlyColor, + }); + chunkFrom = Math.min(fragment.curly.from, chunkFrom); + chunkTo = Math.max(fragment.curly.to, chunkTo); + fragmentHeight = Math.max(Configuration.visual.curlyHeight, fragmentHeight); + } + + if (fragment == span.headFragment) { + // find the gap to fit the backwards arcs, but only on + // head fragment - other fragments don't have arcs + $.each(span.incoming, function(arcId, arc) { + var leftSpan = data.spans[arc.origin]; + var origin = leftSpan.headFragment.chunk; + var border; + if (chunk.index == origin.index) { + hasInternalArcs = true; + } + if (origin.row) { + var labels = Util.getArcLabels(spanTypes, leftSpan.type, arc.type, relationTypesHash); + if (!labels.length) labels = [arc.type]; + if (origin.row.index == rowIndex) { + // same row, but before this + border = origin.translation.x + leftSpan.fragments[leftSpan.fragments.length - 1].right; + } else { + border = Configuration.visual.margin.x + sentNumMargin + rowPadding; + } + var labelNo = Configuration.abbrevsOn ? labels.length - 1 : 0; + var smallestLabelWidth = sizes.arcs.widths[labels[labelNo]] + 2 * minArcSlant; + var gap = currentX + bx - border; + var arcSpacing = smallestLabelWidth - gap; + if (!hasLeftArcs || spacing < arcSpacing) { + spacing = arcSpacing; + spacingChunkId = origin.index + 1; + } + arcSpacing = smallestLabelWidth - bx; + if (!hasLeftArcs || spacingRowBreak < arcSpacing) { + spacingRowBreak = arcSpacing; + } + hasLeftArcs = true; + } else { + hasRightArcs = true; + } + }); + $.each(span.outgoing, function(arcId, arc) { + var leftSpan = data.spans[arc.target]; + var target = leftSpan.headFragment.chunk; + var border; + if (target.row) { + var labels = Util.getArcLabels(spanTypes, span.type, arc.type, relationTypesHash); + if (!labels.length) labels = [arc.type]; + if (target.row.index == rowIndex) { + // same row, but before this + border = target.translation.x + leftSpan.fragments[leftSpan.fragments.length - 1].right; + } else { + border = Configuration.visual.margin.x + sentNumMargin + rowPadding; + } + var labelNo = Configuration.abbrevsOn ? labels.length - 1 : 0; + var smallestLabelWidth = sizes.arcs.widths[labels[labelNo]] + 2 * minArcSlant; + var gap = currentX + bx - border; + var arcSpacing = smallestLabelWidth - gap; + if (!hasLeftArcs || spacing < arcSpacing) { + spacing = arcSpacing; + spacingChunkId = target.index + 1; + } + arcSpacing = smallestLabelWidth - bx; + if (!hasLeftArcs || spacingRowBreak < arcSpacing) { + spacingRowBreak = arcSpacing; + } + hasLeftArcs = true; + } else { + hasRightArcs = true; + } + }); + } + fragmentHeight += span.floor || Configuration.visual.curlyHeight; + if (fragmentHeight > chunkHeight) chunkHeight = fragmentHeight; + hasAnnotations = true; + }); // fragments + + // positioning of the chunk + chunk.right = chunkTo; + var textWidth = sizes.texts.widths[chunk.text]; + chunkHeight += sizes.texts.height; + var boxX = -Math.min(chunkFrom, 0); + var boxWidth = + Math.max(textWidth, chunkTo) - + Math.min(0, chunkFrom); + // if (hasLeftArcs) { + // TODO change this with smallestLeftArc + // var spacing = arcHorizontalSpacing - (currentX - lastArcBorder); + // arc too small? + if (spacing > 0) currentX += spacing; + // } + var rightBorderForArcs = hasRightArcs ? arcHorizontalSpacing : (hasInternalArcs ? arcSlant : 0); + + var lastX = currentX; + var lastRow = row; + + if (chunk.sentence) { + while (sentenceNumber < chunk.sentence) { + sentenceNumber++; + row.arcs = svg.group(row.group, { 'class': 'arcs' }); + rows.push(row); + row = new Row(svg); + sentenceToggle = 1 - sentenceToggle; + row.backgroundIndex = sentenceToggle; + row.index = ++rowIndex; + } + sentenceToggle = 1 - sentenceToggle; + } + + if (chunk.sentence || + currentX + boxWidth + rightBorderForArcs >= canvasWidth - 2 * Configuration.visual.margin.x) { + // the chunk does not fit + row.arcs = svg.group(row.group, { 'class': 'arcs' }); + // TODO: related to issue #571 + // replace arcHorizontalSpacing with a calculated value + currentX = Configuration.visual.margin.x + sentNumMargin + rowPadding + + (hasLeftArcs ? arcHorizontalSpacing : (hasInternalArcs ? arcSlant : 0)); + if (hasLeftArcs) { + var adjustedCurTextWidth = sizes.texts.widths[chunk.text] + arcHorizontalSpacing; + if (adjustedCurTextWidth > maxTextWidth) { + maxTextWidth = adjustedCurTextWidth; + } + } + if (spacingRowBreak > 0) { + currentX += spacingRowBreak; + spacing = 0; // do not center intervening elements + } + + // new row + rows.push(row); + + svg.remove(chunk.group); + row = new Row(svg); + row.backgroundIndex = sentenceToggle; + row.index = ++rowIndex; + svg.add(row.group, chunk.group); + chunk.group = row.group.lastElementChild; + $(chunk.group).children("g[class='span']"). + each(function(index, element) { + chunk.fragments[index].group = element; + }); + $(chunk.group).find("rect[data-span-id]"). + each(function(index, element) { + chunk.fragments[index].rect = element; + }); + } + + // break the text highlights when the row breaks + if (row.index !== lastRow.index) { + $.each(openTextHighlights, function(textId, textDesc) { + if (textDesc[3] != lastX) { + var newDesc = [lastRow, textDesc[3], lastX + boxX, textDesc[4]]; + textMarkedRows.push(newDesc); + } + textDesc[3] = currentX; + }); + } + + // open text highlights + $.each(chunk.markedTextStart, function(textNo, textDesc) { + textDesc[3] += currentX + boxX; + openTextHighlights[textDesc[0]] = textDesc; + }); + + // close text highlights + $.each(chunk.markedTextEnd, function(textNo, textDesc) { + textDesc[3] += currentX + boxX; + var startDesc = openTextHighlights[textDesc[0]]; + delete openTextHighlights[textDesc[0]]; + markedRow = [row, startDesc[3], textDesc[3], startDesc[4]]; + textMarkedRows.push(markedRow); + }); + + // XXX check this - is it used? should it be lastRow? + if (hasAnnotations) row.hasAnnotations = true; + + if (chunk.sentence) { + row.sentence = ++sentenceNumber; + } + + if (spacing > 0) { + // if we added a gap, center the intervening elements + spacing /= 2; + var firstChunkInRow = row.chunks[row.chunks.length - 1]; + if (spacingChunkId < firstChunkInRow.index) { + spacingChunkId = firstChunkInRow.index + 1; + } + for (var chunkIndex = spacingChunkId; chunkIndex < chunk.index; chunkIndex++) { + var movedChunk = data.chunks[chunkIndex]; + translate(movedChunk, movedChunk.translation.x + spacing, 0); + movedChunk.textX += spacing; + } + } + + row.chunks.push(chunk); + chunk.row = row; + + translate(chunk, currentX + boxX, 0); + chunk.textX = currentX + boxX; + + var spaceWidth = 0; + var spaceLen = chunk.nextSpace && chunk.nextSpace.length || 0; + for (var i = 0; i < spaceLen; i++) spaceWidth += spaceWidths[chunk.nextSpace[i]] || 0; + currentX += spaceWidth + boxWidth; + }); // chunks + + // finish the last row + row.arcs = svg.group(row.group, { 'class': 'arcs' }); + rows.push(row); + +Util.profileEnd('chunks'); +Util.profileStart('arcsPrep'); + + var arrows = {}; + var arrow = makeArrow(defs, 'none'); + if (arrow) arrows['none'] = arrow; + + var len = fragmentHeights.length; + for (var i = 0; i < len; i++) { + if (!fragmentHeights[i] || fragmentHeights[i] < Configuration.visual.arcStartHeight) { + fragmentHeights[i] = Configuration.visual.arcStartHeight; + } + } + + // find out how high the arcs have to go + $.each(data.arcs, function(arcNo, arc) { + arc.jumpHeight = 0; + var fromFragment = data.spans[arc.origin].headFragment; + var toFragment = data.spans[arc.target].headFragment; + if (fromFragment.towerId > toFragment.towerId) { + var tmp = fromFragment; fromFragment = toFragment; toFragment = tmp; + } + var from, to; + if (fromFragment.chunk.index == toFragment.chunk.index) { + from = fromFragment.towerId; + to = toFragment.towerId; + } else { + from = fromFragment.towerId + 1; + to = toFragment.towerId - 1; + } + for (var i = from; i <= to; i++) { + if (arc.jumpHeight < fragmentHeights[i * 2]) arc.jumpHeight = fragmentHeights[i * 2]; + } + }); + + // sort the arcs + data.arcs.sort(function(a, b) { + // first write those that have less to jump over + var tmp = a.jumpHeight - b.jumpHeight; + if (tmp) return tmp < 0 ? -1 : 1; + // if equal, then those that span less distance + tmp = a.dist - b.dist; + if (tmp) return tmp < 0 ? -1 : 1; + // if equal, then those where heights of the targets are smaller + tmp = data.spans[a.origin].headFragment.height + data.spans[a.target].headFragment.height - + data.spans[b.origin].headFragment.height - data.spans[b.target].headFragment.height; + if (tmp) return tmp < 0 ? -1 : 1; + // if equal, then those with the lower origin + tmp = data.spans[a.origin].headFragment.height - data.spans[b.origin].headFragment.height; + if (tmp) return tmp < 0 ? -1 : 1; + // if equal, they're just equal. + return 0; + }); + + // draw the drag arc marker + var arrowhead = svg.marker(defs, 'drag_arrow', + 5, 2.5, 5, 5, 'auto', + { + markerUnits: 'strokeWidth', + 'class': 'drag_fill', + }); + svg.polyline(arrowhead, [[0, 0], [5, 2.5], [0, 5], [0.2, 2.5]]); + +Util.profileEnd('arcsPrep'); +Util.profileStart('arcs'); + + // add the arcs + $.each(data.arcs, function(arcNo, arc) { + // separate out possible numeric suffix from type + var noNumArcType; + var splitArcType; + if (arc.type) { + splitArcType = arc.type.match(/^(.*?)(\d*)$/); + noNumArcType = splitArcType[1]; + } + + var originSpan = data.spans[arc.origin]; + var targetSpan = data.spans[arc.target]; + + var leftToRight = originSpan.headFragment.towerId < targetSpan.headFragment.towerId; + var left, right; + if (leftToRight) { + left = originSpan.headFragment; + right = targetSpan.headFragment; + } else { + left = targetSpan.headFragment; + right = originSpan.headFragment; + } + + var spanDesc = spanTypes[originSpan.type]; + // TODO: might make more sense to reformat this as dict instead + // of searching through the list every type + var arcDesc; + if (spanDesc && spanDesc.arcs) { + $.each(spanDesc.arcs, function(arcDescNo, arcDescIter) { + if (arcDescIter.type == arc.type) { + arcDesc = arcDescIter; + } + }); + } + // fall back on unnumbered type if not found in full + if (!arcDesc && noNumArcType && noNumArcType != arc.type && + spanDesc && spanDesc.arcs) { + $.each(spanDesc.arcs, function(arcDescNo, arcDescIter) { + if (arcDescIter.type == noNumArcType) { + arcDesc = arcDescIter; + } + }); + } + // fall back on relation types in case we still don't have + // an arc description, with final fallback to unnumbered relation + if (!arcDesc) { + arcDesc = $.extend({}, relationTypesHash[arc.type] || relationTypesHash[noNumArcType]); + } + var color = ((arcDesc && arcDesc.color) || + (spanTypes.ARC_DEFAULT && spanTypes.ARC_DEFAULT.color) || + '#000000'); + var symmetric = arcDesc && arcDesc.properties && arcDesc.properties.symmetric; + var dashArray = arcDesc && arcDesc.dashArray; + var arrowHead = ((arcDesc && arcDesc.arrowHead) || + (spanTypes.ARC_DEFAULT && spanTypes.ARC_DEFAULT.arrowHead) || + 'triangle,5') + ',' + color; + var labelArrowHead = ((arcDesc && arcDesc.labelArrow) || + (spanTypes.ARC_DEFAULT && spanTypes.ARC_DEFAULT.labelArrow) || + 'triangle,5') + ',' + color; + + var leftBox = rowBBox(left); + var rightBox = rowBBox(right); + var leftRow = left.chunk.row.index; + var rightRow = right.chunk.row.index; + + if (!arrows[arrowHead]) { + var arrow = makeArrow(defs, arrowHead); + if (arrow) arrows[arrowHead] = arrow; + } + if (!arrows[labelArrowHead]) { + var arrow = makeArrow(defs, labelArrowHead); + if (arrow) arrows[labelArrowHead] = arrow; + } + + // find the next height + var height = 0; + + var fromIndex2, toIndex2; + if (left.chunk.index == right.chunk.index) { + fromIndex2 = left.towerId * 2; + toIndex2 = right.towerId * 2; + } else { + fromIndex2 = left.towerId * 2 + 1; + toIndex2 = right.towerId * 2 - 1; + } + for (var i = fromIndex2; i <= toIndex2; i++) { + if (fragmentHeights[i] > height) height = fragmentHeights[i]; + } + height += Configuration.visual.arcSpacing; + var leftSlantBound, rightSlantBound; + for (var i = fromIndex2; i <= toIndex2; i++) { + if (fragmentHeights[i] < height) fragmentHeights[i] = height; + } + + // Adjust the height to align with pixels when rendered + + // TODO: on at least Chrome, this doesn't make a difference: + // the lines come out pixel-width even without it. Check. + height += 0.5 + + var chunkReverse = false; + var ufoCatcher = originSpan.headFragment.chunk.index == targetSpan.headFragment.chunk.index; + if (ufoCatcher) { + chunkReverse = + leftBox.x + leftBox.width / 2 < rightBox.x + rightBox.width / 2; + } + var ufoCatcherMod = ufoCatcher ? chunkReverse ? -0.5 : 0.5 : 1; + + for (var rowIndex = leftRow; rowIndex <= rightRow; rowIndex++) { + var row = rows[rowIndex]; + row.hasAnnotations = true; + var arcGroup = svg.group(row.arcs, { + 'data-from': arc.origin, + 'data-to': arc.target + }); + var from, to; + + if (rowIndex == leftRow) { + from = leftBox.x + (chunkReverse ? 0 : leftBox.width); + } else { + from = sentNumMargin; + } + + if (rowIndex == rightRow) { + to = rightBox.x + (chunkReverse ? rightBox.width : 0); + } else { + to = canvasWidth - 2 * Configuration.visual.margin.y; + } + + var originType = data.spans[arc.origin].type; + var arcLabels = Util.getArcLabels(spanTypes, originType, arc.type, relationTypesHash); + var labelText = Util.arcDisplayForm(spanTypes, originType, arc.type, relationTypesHash); + // if (Configuration.abbrevsOn && !ufoCatcher && arcLabels) { + if (Configuration.abbrevsOn && arcLabels) { + var labelIdx = 1; // first abbreviation + // strictly speaking 2*arcSlant would be needed to allow for + // the full-width arcs to fit, but judged unabbreviated text + // to be more important than the space for arcs. + var maxLength = (to - from) - (arcSlant); + while (sizes.arcs.widths[labelText] > maxLength && + arcLabels[labelIdx]) { + labelText = arcLabels[labelIdx]; + labelIdx++; + } + } + + var shadowGroup; + if (arc.shadowClass || arc.marked) { + shadowGroup = svg.group(arcGroup); + } + var options = { + 'fill': color, + 'data-arc-role': arc.type, + 'data-arc-origin': arc.origin, + 'data-arc-target': arc.target, + // TODO: confirm this is unused and remove. + //'data-arc-id': arc.id, + 'data-arc-ed': arc.eventDescId, + }; + + // construct SVG text, showing possible trailing index + // numbers (as in e.g. "Theme2") as subscripts + var svgText; + if (!splitArcType[2]) { + // no subscript, simple string suffices + svgText = labelText; + } else { + // Need to parse out possible numeric suffixes to avoid + // duplicating number in label and its subscript + var splitLabelText = labelText.match(/^(.*?)(\d*)$/); + var noNumLabelText = splitLabelText[1]; + + svgText = svg.createText(); + // TODO: to address issue #453, attaching options also + // to spans, not only primary text. Make sure there + // are no problems with this. + svgText.span(noNumLabelText, options); + var subscriptSettings = { + 'dy': '0.3em', + 'font-size': '80%' + }; + // alternate possibility +// var subscriptSettings = { +// 'baseline-shift': 'sub', +// 'font-size': '80%' +// }; + $.extend(subscriptSettings, options); + svgText.span(splitArcType[2], subscriptSettings); + } + + // guess at the correct baseline shift to get vertical centering. + // (CSS dominant-baseline can't be used as not all SVG rendereds support it.) + var baseline_shift = sizes.arcs.height / 4; + var text = svg.text(arcGroup, (from + to) / 2, -height + baseline_shift, + svgText, options); + + var width = sizes.arcs.widths[labelText]; + var textBox = { + x: (from + to - width) / 2, + width: width, + y: -height - sizes.arcs.height / 2, + height: sizes.arcs.height, + } + if (arc.marked) { + var markedRect = svg.rect(shadowGroup, + textBox.x - markedArcSize, textBox.y - markedArcSize, + textBox.width + 2 * markedArcSize, textBox.height + 2 * markedArcSize, { + // filter: 'url(#Gaussian_Blur)', + 'class': "shadow_EditHighlight", + rx: markedArcSize, + ry: markedArcSize, + }); + svg.other(markedRect, 'animate', { + 'data-type': arc.marked, + attributeName: 'fill', + values: (arc.marked == 'match' ? highlightMatchSequence + : highlightArcSequence), + dur: highlightDuration, + repeatCount: 'indefinite', + begin: 'indefinite' + }); + } + if (arc.shadowClass) { + svg.rect(shadowGroup, + textBox.x - arcLabelShadowSize, + textBox.y - arcLabelShadowSize, + textBox.width + 2 * arcLabelShadowSize, + textBox.height + 2 * arcLabelShadowSize, { + 'class': 'shadow_' + arc.shadowClass, + filter: 'url(#Gaussian_Blur)', + rx: arcLabelShadowRounding, + ry: arcLabelShadowRounding, + }); + } + var textStart = textBox.x; + var textEnd = textBox.x + textBox.width; + + // adjust by margin for arc drawing + textStart -= Configuration.visual.arcTextMargin; + textEnd += Configuration.visual.arcTextMargin; + + if (from > to) { + var tmp = textStart; textStart = textEnd; textEnd = tmp; + } + + var path; + + if (roundCoordinates) { + // don't ask + height = (height|0)+0.5; + } + if (height > row.maxArcHeight) row.maxArcHeight = height; + + var myArrowHead = ((arcDesc && arcDesc.arrowHead) || + (spanTypes.ARC_DEFAULT && spanTypes.ARC_DEFAULT.arrowHead)); + var arrowName = (leftToRight ? + symmetric && myArrowHead || 'none' : + myArrowHead || 'triangle,5') + ',' + color; + var arrowType = arrows[arrowName]; + var arrowDecl = arrowType && ('url(#' + arrowType + ')'); + + var arrowAtLabelAdjust = 0; + var labelArrowDecl = null; + var myLabelArrowHead = ((arcDesc && arcDesc.labelArrow) || + (spanTypes.ARC_DEFAULT && spanTypes.ARC_DEFAULT.labelArrow)); + if (myLabelArrowHead) { + var labelArrowName = (leftToRight ? + symmetric && myLabelArrowHead || 'none' : + myLabelArrowHead || 'triangle,5') + ',' + color; + var labelArrowSplit = labelArrowName.split(','); + arrowAtLabelAdjust = labelArrowSplit[0] != 'none' && parseInt(labelArrowSplit[1], 10) || 0; + var labelArrowType = arrows[labelArrowName]; + var labelArrowDecl = labelArrowType && ('url(#' + labelArrowType + ')'); + if (ufoCatcher) arrowAtLabelAdjust = -arrowAtLabelAdjust; + } + var arrowStart = textStart - arrowAtLabelAdjust; + path = svg.createPath().move(arrowStart, -height); + if (rowIndex == leftRow) { + var cornerx = from + ufoCatcherMod * arcSlant; + // for normal cases, should not be past textStart even if narrow + if (!ufoCatcher && cornerx > arrowStart - 1) { cornerx = arrowStart - 1; } + if (smoothArcCurves) { + var controlx = ufoCatcher ? cornerx + 2*ufoCatcherMod*reverseArcControlx : smoothArcSteepness*from+(1-smoothArcSteepness)*cornerx; + var endy = leftBox.y + (leftToRight || arc.equiv ? leftBox.height / 2 : Configuration.visual.margin.y); + // no curving for short lines covering short vertical + // distances, the arrowheads can go off (#925) + if (Math.abs(-height-endy) < 2 && + Math.abs(cornerx-from) < 5) { + endy = -height; + } + line = path.line(cornerx, -height). + curveQ(controlx, -height, from, endy); + } else { + path.line(cornerx, -height). + line(from, leftBox.y + (leftToRight || arc.equiv ? leftBox.height / 2 : Configuration.visual.margin.y)); + } + } else { + path.line(from, -height); + } + svg.path(arcGroup, path, { + markerEnd: arrowDecl, + markerStart: labelArrowDecl, + style: 'stroke: ' + color, + 'strokeDashArray': dashArray, + }); + if (arc.marked) { + svg.path(shadowGroup, path, { + 'class': 'shadow_EditHighlight_arc', + strokeWidth: markedArcStroke, + 'strokeDashArray': dashArray, + }); + svg.other(markedRect, 'animate', { + 'data-type': arc.marked, + attributeName: 'fill', + values: (arc.marked == 'match' ? highlightMatchSequence + : highlightArcSequence), + dur: highlightDuration, + repeatCount: 'indefinite', + begin: 'indefinite' + }); + } + if (arc.shadowClass) { + svg.path(shadowGroup, path, { + 'class': 'shadow_' + arc.shadowClass, + strokeWidth: shadowStroke, + 'strokeDashArray': dashArray, + }); + } + var myArrowHead = ((arcDesc && arcDesc.arrowHead) || + (spanTypes.ARC_DEFAULT && spanTypes.ARC_DEFAULT.arrowHead)); + var arrowName = (leftToRight ? + myArrowHead || 'triangle,5' : + symmetric && myArrowHead || 'none') + ',' + color; + var arrowType = arrows[arrowName]; + var arrowDecl = arrowType && ('url(#' + arrowType + ')'); + + var arrowAtLabelAdjust = 0; + var labelArrowDecl = null; + var myLabelArrowHead = ((arcDesc && arcDesc.labelArrow) || + (spanTypes.ARC_DEFAULT && spanTypes.ARC_DEFAULT.labelArrow)); + if (myLabelArrowHead) { + var labelArrowName = (leftToRight ? + myLabelArrowHead || 'triangle,5' : + symmetric && myLabelArrowHead || 'none') + ',' + color; + var labelArrowSplit = labelArrowName.split(','); + arrowAtLabelAdjust = labelArrowSplit[0] != 'none' && parseInt(labelArrowSplit[1], 10) || 0; + var labelArrowType = arrows[labelArrowName]; + var labelArrowDecl = labelArrowType && ('url(#' + labelArrowType + ')'); + if (ufoCatcher) arrowAtLabelAdjust = -arrowAtLabelAdjust; + } + var arrowEnd = textEnd + arrowAtLabelAdjust; + path = svg.createPath().move(arrowEnd, -height); + if (rowIndex == rightRow) { + var cornerx = to - ufoCatcherMod * arcSlant; + // TODO: duplicates above in part, make funcs + // for normal cases, should not be past textEnd even if narrow + if (!ufoCatcher && cornerx < arrowEnd + 1) { cornerx = arrowEnd + 1; } + if (smoothArcCurves) { + var controlx = ufoCatcher ? cornerx - 2*ufoCatcherMod*reverseArcControlx : smoothArcSteepness*to+(1-smoothArcSteepness)*cornerx; + var endy = rightBox.y + (leftToRight && !arc.equiv ? Configuration.visual.margin.y : rightBox.height / 2); + // no curving for short lines covering short vertical + // distances, the arrowheads can go off (#925) + if (Math.abs(-height-endy) < 2 && + Math.abs(cornerx-to) < 5) { + endy = -height; + } + path.line(cornerx, -height). + curveQ(controlx, -height, to, endy); + } else { + path.line(cornerx, -height). + line(to, rightBox.y + (leftToRight && !arc.equiv ? Configuration.visual.margin.y : rightBox.height / 2)); + } + } else { + path.line(to, -height); + } + svg.path(arcGroup, path, { + markerEnd: arrowDecl, + markerStart: labelArrowDecl, + style: 'stroke: ' + color, + 'strokeDashArray': dashArray, + }); + if (arc.marked) { + svg.path(shadowGroup, path, { + 'class': 'shadow_EditHighlight_arc', + strokeWidth: markedArcStroke, + 'strokeDashArray': dashArray, + }); + } + if (shadowGroup) { + svg.path(shadowGroup, path, { + 'class': 'shadow_' + arc.shadowClass, + strokeWidth: shadowStroke, + 'strokeDashArray': dashArray, + }); + } + } // arc rows + }); // arcs + +Util.profileEnd('arcs'); +Util.profileStart('fragmentConnectors'); + + $.each(data.spans, function(spanNo, span) { + var numConnectors = span.fragments.length - 1; + for (var connectorNo = 0; connectorNo < numConnectors; connectorNo++) { + var left = span.fragments[connectorNo]; + var right = span.fragments[connectorNo + 1]; + + var leftBox = rowBBox(left); + var rightBox = rowBBox(right); + var leftRow = left.chunk.row.index; + var rightRow = right.chunk.row.index; + + for (var rowIndex = leftRow; rowIndex <= rightRow; rowIndex++) { + var row = rows[rowIndex]; + row.hasAnnotations = true; + + if (rowIndex == leftRow) { + from = leftBox.x + leftBox.width; + } else { + from = sentNumMargin; + } + + if (rowIndex == rightRow) { + to = rightBox.x; + } else { + to = canvasWidth - 2 * Configuration.visual.margin.y; + } + + var height = leftBox.y + leftBox.height - Configuration.visual.margin.y; + if (roundCoordinates) { + // don't ask + height = (height|0)+0.5; + } + + var path = svg.createPath().move(from, height).line(to, height); + svg.path(row.arcs, path, { + style: 'stroke: ' + fragmentConnectorColor, + 'strokeDashArray': fragmentConnectorDashArray + }); + } // rowIndex + } // connectorNo + }); // spans + +Util.profileEnd('fragmentConnectors'); +Util.profileStart('rows'); + + // position the rows + var y = Configuration.visual.margin.y; + var sentNumGroup = svg.group({'class': 'sentnum'}); + var currentSent; + $.each(rows, function(rowId, row) { + $.each(row.chunks, function(chunkId, chunk) { + $.each(chunk.fragments, function(fragmentId, fragment) { + if (row.maxSpanHeight < fragment.height) row.maxSpanHeight = fragment.height; + }); + }); + if (row.sentence) { + currentSent = row.sentence; + } + // SLOW (#724) and replaced with calculations: + // + // var rowBox = row.group.getBBox(); + // // Make it work on IE + // rowBox = { x: rowBox.x, y: rowBox.y, height: rowBox.height, width: rowBox.width }; + // // Make it work on Firefox and Opera + // if (rowBox.height == -Infinity) { + // rowBox = { x: 0, y: 0, height: 0, width: 0 }; + // } + + // XXX TODO HACK: find out where 5 and 1.5 come from! + // This is the fix for #724, but the numbers are guessed. + var rowBoxHeight = Math.max(row.maxArcHeight + 5, row.maxSpanHeight + 1.5); // XXX TODO HACK: why 5, 1.5? + if (row.hasAnnotations) { + // rowBox.height = -rowBox.y + rowSpacing; + rowBoxHeight += rowSpacing + 1.5; // XXX TODO HACK: why 1.5? + } else { + rowBoxHeight -= 5; // XXX TODO HACK: why -5? + } + + rowBoxHeight += rowPadding; + var bgClass; + if (data.markedSent[currentSent]) { + // specifically highlighted + bgClass = 'backgroundHighlight'; + } else if (Configuration.textBackgrounds == "striped") { + // give every other sentence a different bg class + bgClass = 'background'+ row.backgroundIndex; + } else { + // plain "standard" bg + bgClass = 'background0'; + } + svg.rect(backgroundGroup, + 0, y + sizes.texts.y + sizes.texts.height, + canvasWidth, rowBoxHeight + sizes.texts.height + 1, { + 'class': bgClass, + }); + y += rowBoxHeight; + y += sizes.texts.height; + row.textY = y - rowPadding; + if (row.sentence) { + var sentence_hash = new URLHash(coll, doc, { focus: [[ 'sent', row.sentence ]] } ); + var link = svg.link(sentNumGroup, sentence_hash.getHash()); + var text = svg.text(link, sentNumMargin - Configuration.visual.margin.x, y - rowPadding, + '' + row.sentence, { 'data-sent': row.sentence }); + var sentComment = data.sentComment[row.sentence]; + if (sentComment) { + var box = text.getBBox(); + svg.remove(text); + // TODO: using rectShadowSize, but this shadow should + // probably have its own setting for shadow size + shadowRect = svg.rect(sentNumGroup, + box.x - rectShadowSize, box.y - rectShadowSize, + box.width + 2 * rectShadowSize, box.height + 2 * rectShadowSize, { + + 'class': 'shadow_' + sentComment.type, + filter: 'url(#Gaussian_Blur)', + rx: rectShadowRounding, + ry: rectShadowRounding, + 'data-sent': row.sentence, + }); + var text = svg.text(sentNumGroup, sentNumMargin - Configuration.visual.margin.x, y - rowPadding, + '' + row.sentence, { 'data-sent': row.sentence }); + } + } + + var rowY = y - rowPadding; + if (roundCoordinates) { + rowY = rowY|0; + } + translate(row, 0, rowY); + y += Configuration.visual.margin.y; + }); + y += Configuration.visual.margin.y; + +Util.profileEnd('rows'); +Util.profileStart('chunkFinish'); + + // chunk index sort functions for overlapping fragment drawing + // algorithm; first for left-to-right pass, sorting primarily + // by start offset, second for right-to-left pass by end + // offset. Secondary sort by fragment length in both cases. + var currentChunk; + var lrChunkComp = function(a,b) { + var ac = currentChunk.fragments[a]; + var bc = currentChunk.fragments[b] + var startDiff = Util.cmp(ac.from, bc.from); + return startDiff != 0 ? startDiff : Util.cmp(bc.to-bc.from, ac.to-ac.from); + } + var rlChunkComp = function(a,b) { + var ac = currentChunk.fragments[a]; + var bc = currentChunk.fragments[b] + var endDiff = Util.cmp(bc.to, ac.to); + return endDiff != 0 ? endDiff : Util.cmp(bc.to-bc.from, ac.to-ac.from); + } + + var sentenceText = null; + $.each(data.chunks, function(chunkNo, chunk) { + // context for sort + currentChunk = chunk; + + // text rendering + if (chunk.sentence) { + if (sentenceText) { + // svg.text(textGroup, sentenceText); // avoids jQuerySVG bug + svg.text(textGroup, 0, 0, sentenceText); + } + sentenceText = null; + } + if (!sentenceText) { + sentenceText = svg.createText(); + } + var nextChunk = data.chunks[chunkNo + 1]; + var nextSpace = nextChunk ? nextChunk.space : ''; + sentenceText.span(chunk.text + nextSpace, { + x: chunk.textX, + y: chunk.row.textY, + 'data-chunk-id': chunk.index + }); + + // chunk backgrounds + if (chunk.fragments.length) { + var orderedIdx = []; + for (var i=chunk.fragments.length-1; i>=0; i--) { + orderedIdx.push(i); + } + + // Mark entity nesting height/depth (number of + // nested/nesting entities). To account for crossing + // brackets in a (mostly) reasonable way, determine + // depth/height separately in a left-to-right traversal + // and a right-to-left traversal. + orderedIdx.sort(lrChunkComp); + + var openFragments = []; + for(var i=0; i current.from) { + stillOpen.push(openFragments[o]); + openFragments[o].nestingHeightLR++; + } + } + openFragments = stillOpen; + current.nestingDepthLR=openFragments.length; + openFragments.push(current); + } + + // re-sort for right-to-left traversal by end position + orderedIdx.sort(rlChunkComp); + + openFragments = []; + for(var i=0; i c.nestingHeightRL ? c.nestingHeightLR : c.nestingHeightRL; + c.nestingDepth = c.nestingDepthLR > c.nestingDepthRL ? c.nestingDepthLR : c.nestingDepthRL; + } + + // Re-order by nesting height and draw in order + orderedIdx.sort(function(a,b) { return Util.cmp(chunk.fragments[b].nestingHeight, chunk.fragments[a].nestingHeight) }); + + for(var i=0; i 1]) + var shrink = 0; + if(fragment.nestingDepth > 1 && fragment.nestingHeight == 0) { + shrink = 1; + } else if(fragment.nestingDepth == 0 && fragment.nestingHeight > 0) { + shrink = -1; + } + var yShrink = shrink * nestingAdjustYStepSize; + var xShrink = shrink * nestingAdjustXStepSize; + // bit lighter + var lightBgColor = Util.adjustColorLightness(bgColor, 0.8); + // tweak for Y start offset (and corresponding height + // reduction): text rarely hits font max height, so this + // tends to look better + var yStartTweak = 1; + // store to have same mouseover highlight without recalc + fragment.highlightPos = { + x: chunk.textX + fragment.curly.from + xShrink, + y: chunk.row.textY + sizes.texts.y + yShrink + yStartTweak, + w: fragment.curly.to - fragment.curly.from - 2*xShrink, + h: sizes.texts.height - 2*yShrink - yStartTweak, + }; + svg.rect(highlightGroup, + fragment.highlightPos.x, fragment.highlightPos.y, + fragment.highlightPos.w, fragment.highlightPos.h, + { fill: lightBgColor, //opacity:1, + rx: highlightRounding.x, + ry: highlightRounding.y, + }); + } + } + }); + if (sentenceText) { + // svg.text(textGroup, sentenceText); // avoids jQuerySVG bug + svg.text(textGroup, 0, 0, sentenceText); + } + + // draw the markedText + $.each(textMarkedRows, function(textRowNo, textRowDesc) { // row, from, to + var textHighlight = svg.rect(highlightGroup, + textRowDesc[1] - 2, textRowDesc[0].textY - sizes.fragments.height, + textRowDesc[2] - textRowDesc[1] + 4, sizes.fragments.height + 4, + { fill: 'yellow' } // TODO: put into css file, as default - turn into class + ); + // NOTE: changing highlightTextSequence here will give + // different-colored highlights + // TODO: entirely different settings for non-animations? + var markedType = textRowDesc[3]; + svg.other(textHighlight, 'animate', { + 'data-type': markedType, + attributeName: 'fill', + values: (markedType == 'match' ? highlightMatchSequence + : highlightTextSequence), + dur: highlightDuration, + repeatCount: 'indefinite', + begin: 'indefinite' + }); + }); + + +Util.profileEnd('chunkFinish'); +Util.profileStart('finish'); + + svg.path(sentNumGroup, svg.createPath(). + move(sentNumMargin, 0). + line(sentNumMargin, y)); + + // resize the SVG + var width = maxTextWidth + sentNumMargin + 2 * Configuration.visual.margin.x + 1; + if (width > canvasWidth) canvasWidth = width; + + $svg.width(canvasWidth); + $svg.height(y); + $svgDiv.height(y); + +Util.profileEnd('finish'); +Util.profileEnd('render'); +Util.profileReport(); + + + drawing = false; + if (redraw) { + redraw = false; + renderDataReal(); + } + $svg.find('animate').each(function() { + if (this.beginElement) { // protect against non-SMIL browsers + this.beginElement(); + } + }); + dispatcher.post('doneRendering', [coll, doc, args]); + }; + + var renderErrors = { + unableToReadTextFile: true, + annotationFileNotFound: true, + isDirectoryError: true + }; + var renderData = function(sourceData) { + Util.profileEnd('invoke getDocument'); + if (sourceData && sourceData.exception) { + if (renderErrors[sourceData.exception]) { + dispatcher.post('renderError:' + sourceData.exception, [sourceData]); + } else { + dispatcher.post('unknownError', [sourceData.exception]); + } + } else { + // Fill in default values that don't necessarily go over the protocol + if (sourceData) { + setSourceDataDefaults(sourceData); + } + + dispatcher.post('startedRendering', [coll, doc, args]); + dispatcher.post('spin'); + setTimeout(function() { + try { + renderDataReal(sourceData); + } catch (e) { + // We are sure not to be drawing anymore, reset the state + drawing = false; + // TODO: Hook printout into dispatch elsewhere? + console.warn('Rendering terminated due to:', e); + dispatcher.post('renderError: Fatal', [sourceData, e]); + } + dispatcher.post('unspin'); + }, 0); + } + }; + + var renderDocument = function() { + Util.profileStart('invoke getDocument'); + dispatcher.post('ajax', [{ + action: 'getDocument', + collection: coll, + 'document': doc, + }, 'renderData', { + collection: coll, + 'document': doc + }]); + }; + + var triggerRender = function() { + if (svg && ((isRenderRequested && isCollectionLoaded) || requestedData) && Visualizer.areFontsLoaded) { + isRenderRequested = false; + if (requestedData) { + +Util.profileClear(); +Util.profileStart('before render'); + + renderData(requestedData); + } else if (doc.length) { + +Util.profileClear(); +Util.profileStart('before render'); + + renderDocument(); + } else { + dispatcher.post(0, 'renderError:noFileSpecified'); + } + } + }; + + var requestRenderData = function(sourceData) { + requestedData = sourceData; + triggerRender(); + }; + + var collectionChanged = function() { + isCollectionLoaded = false; + }; + + var gotCurrent = function(_coll, _doc, _args, reloadData) { + coll = _coll; + doc = _doc; + args = _args; + if (reloadData) { + isRenderRequested = true; + triggerRender(); + } + }; + + + // event handlers + + var highlight, highlightArcs, highlightSpans, commentId; + + var onMouseOver = function(evt) { + var target = $(evt.target); + var id; + if (id = target.attr('data-span-id')) { + commentId = id; + var span = data.spans[id]; + dispatcher.post('displaySpanComment', [ + evt, target, id, span.type, span.attributeText, + span.text, + span.comment && span.comment.text, + span.comment && span.comment.type, + span.normalizations]); + + var spanDesc = spanTypes[span.type]; + var bgColor = ((spanDesc && spanDesc.bgColor) || + (spanTypes.SPAN_DEFAULT && spanTypes.SPAN_DEFAULT.bgColor) || + '#ffffff'); + highlight = []; + $.each(span.fragments, function(fragmentNo, fragment) { + highlight.push(svg.rect(highlightGroup, + fragment.highlightPos.x, fragment.highlightPos.y, + fragment.highlightPos.w, fragment.highlightPos.h, + { 'fill': bgColor, opacity:0.75, + rx: highlightRounding.x, + ry: highlightRounding.y, + })); + }); + + if (that.arcDragOrigin) { + target.parent().addClass('highlight'); + } else { + highlightArcs = $svg. + find('g[data-from="' + id + '"], g[data-to="' + id + '"]'). + addClass('highlight'); + var spans = {}; + spans[id] = true; + var spanIds = []; + $.each(span.incoming, function(arcNo, arc) { + spans[arc.origin] = true; + }); + $.each(span.outgoing, function(arcNo, arc) { + spans[arc.target] = true; + }); + $.each(spans, function(spanId, dummy) { + spanIds.push('rect[data-span-id="' + spanId + '"]'); + }); + highlightSpans = $svg. + find(spanIds.join(', ')). + parent(). + addClass('highlight'); + } + forceRedraw(); + } else if (!that.arcDragOrigin && (id = target.attr('data-arc-role'))) { + var originSpanId = target.attr('data-arc-origin'); + var targetSpanId = target.attr('data-arc-target'); + var role = target.attr('data-arc-role'); + var symmetric = (relationTypesHash && + relationTypesHash[role] && + relationTypesHash[role].properties && + relationTypesHash[role].properties.symmetric); + // NOTE: no commentText, commentType for now + var arcEventDescId = target.attr('data-arc-ed'); + var commentText = ''; + var commentType = ''; + var arcId; + if (arcEventDescId) { + var eventDesc = data.eventDescs[arcEventDescId]; + var comment = eventDesc.comment; + if (comment) { + commentText = comment.text; + commentType = comment.type; + if (commentText == '' && commentType) { + // default to type if missing text + commentText = commentType; + } + } + if (eventDesc.relation) { + // among arcs, only ones corresponding to relations have + // "independent" IDs + arcId = arcEventDescId; + } + } + var originSpanType = data.spans[originSpanId].type || ''; + var targetSpanType = data.spans[targetSpanId].type || ''; + dispatcher.post('displayArcComment', [ + evt, target, symmetric, arcId, + originSpanId, originSpanType, role, + targetSpanId, targetSpanType, + commentText, commentType]); + highlightArcs = $svg. + find('g[data-from="' + originSpanId + '"][data-to="' + targetSpanId + '"]'). + addClass('highlight'); + highlightSpans = $($svg). + find('rect[data-span-id="' + originSpanId + '"], rect[data-span-id="' + targetSpanId + '"]'). + parent(). + addClass('highlight'); + } else if (id = target.attr('data-sent')) { + var comment = data.sentComment[id]; + if (comment) { + dispatcher.post('displaySentComment', [evt, target, comment.text, comment.type]); + } + } + }; + + var onMouseOut = function(evt) { + var target = $(evt.target); + target.removeClass('badTarget'); + dispatcher.post('hideComment'); + if (highlight) { + $.each(highlight, function() { + svg.remove(this); + }); + highlight = undefined; + } + if (highlightSpans) { + highlightArcs.removeClass('highlight'); + highlightSpans.removeClass('highlight'); + highlightSpans = undefined; + } + forceRedraw(); + }; + + var setAbbrevs = function(_abbrevsOn) { + // TODO: this is a slightly weird place to tweak the configuration + Configuration.abbrevsOn = _abbrevsOn; + dispatcher.post('configurationChanged'); + } + + var setTextBackgrounds = function(_textBackgrounds) { + Configuration.textBackgrounds = _textBackgrounds; + dispatcher.post('configurationChanged'); + } + + var setLayoutDensity = function(_density) { + //dispatcher.post('messages', [[['Setting layout density ' + _density, 'comment']]]); + // TODO: store standard settings instead of hard-coding + // them here (again) + if (_density < 2) { + // dense + Configuration.visual.margin = { x: 1, y: 0 }; + Configuration.visual.boxSpacing = 1; + Configuration.visual.curlyHeight = 1; + Configuration.visual.arcSpacing = 7; + Configuration.visual.arcStartHeight = 18 + } else if(_density > 2) { + // spacious + Configuration.visual.margin = { x: 2, y: 1 }; + Configuration.visual.boxSpacing = 3; + Configuration.visual.curlyHeight = 6; + Configuration.visual.arcSpacing = 12; + Configuration.visual.arcStartHeight = 23; + } else { + // standard + Configuration.visual.margin = { x: 2, y: 1 }; + Configuration.visual.boxSpacing = 1; + Configuration.visual.curlyHeight = 4; + Configuration.visual.arcSpacing = 9; + Configuration.visual.arcStartHeight = 19; + } + dispatcher.post('configurationChanged'); + } + + var setSvgWidth = function(_width) { + $svgDiv.width(_width); + if (Configuration.svgWidth != _width) { + Configuration.svgWidth = _width; + dispatcher.post('configurationChanged'); + } + } + + $svgDiv = $($svgDiv).hide(); + + // register event listeners + var registerHandlers = function(element, events) { + $.each(events, function(eventNo, eventName) { + element.bind(eventName, + function(evt) { + dispatcher.post(eventName, [evt], 'all'); + } + ); + }); + }; + registerHandlers($svgDiv, [ + 'mouseover', 'mouseout', 'mousemove', + 'mouseup', 'mousedown', + 'dragstart', + 'dblclick', 'click' + ]); + registerHandlers($(document), [ + 'keydown', 'keypress', + 'touchstart', 'touchend' + ]); + registerHandlers($(window), [ + 'resize' + ]); + + // create the svg wrapper + $svgDiv.svg({ + onLoad: function(_svg) { + that.svg = svg = _svg; + $svg = $(svg._svg); + + /* XXX HACK REMOVED - not efficient? + + // XXX HACK to allow off-DOM SVG element creation + // we need to replace the jQuery SVG's _makeNode function + // with a modified one. + // Be aware of potential breakage upon jQuery SVG upgrade. + svg._makeNode = function(parent, name, settings) { + // COMMENTED OUT: parent = parent || this._svg; + var node = this._svg.ownerDocument.createElementNS($.svg.svgNS, name); + for (var name in settings) { + var value = settings[name]; + if (value != null && value != null && + (typeof value != 'string' || value != '')) { + node.setAttribute($.svg._attrNames[name] || name, value); + } + } + // ADDED IN: + if (parent) + parent.appendChild(node); + return node; + }; + */ + + triggerRender(); + } + }); + + var loadSpanTypes = function(types) { + $.each(types, function(typeNo, type) { + if (type) { + spanTypes[type.type] = type; + var children = type.children; + if (children && children.length) { + loadSpanTypes(children); + } + } + }); + } + + var loadAttributeTypes = function(response_types) { + var processed = {}; + $.each(response_types, function(aTypeNo, aType) { + processed[aType.type] = aType; + // count the values; if only one, it's a boolean attribute + var values = []; + for (var i in aType.values) { + if (aType.values.hasOwnProperty(i)) { + values.push(i); + } + } + if (values.length == 1) { + aType.bool = values[0]; + } + }); + return processed; + } + + var loadRelationTypes = function(relation_types) { + $.each(relation_types, function(relTypeNo, relType) { + if (relType) { + relationTypesHash[relType.type] = relType; + var children = relType.children; + if (children && children.length) { + loadRelationTypes(children); + } + } + }); + } + + var collectionLoaded = function(response) { + if (!response.exception) { + setCollectionDefaults(response); + eventAttributeTypes = loadAttributeTypes(response.event_attribute_types); + entityAttributeTypes = loadAttributeTypes(response.entity_attribute_types); + spanTypes = {}; + loadSpanTypes(response.entity_types); + loadSpanTypes(response.event_types); + loadSpanTypes(response.unconfigured_types); + relationTypesHash = {}; + loadRelationTypes(response.relation_types); + loadRelationTypes(response.unconfigured_types); + // TODO XXX: isn't the following completely redundant with + // loadRelationTypes? + $.each(response.relation_types, function(relTypeNo, relType) { + relationTypesHash[relType.type] = relType; + }); + + dispatcher.post('spanAndAttributeTypesLoaded', [spanTypes, entityAttributeTypes, eventAttributeTypes, relationTypesHash]); + + isCollectionLoaded = true; + triggerRender(); + } else { + // exception on collection load; allow visualizer_ui + // collectionLoaded to handle this + } + }; + + var isReloadOkay = function() { + // do not reload while the user is in the dialog + return !drawing; + }; + + // If we are yet to load our fonts, dispatch them + if (!Visualizer.areFontsLoaded) { + var webFontConfig = { + custom: { + families: [ + 'Astloch', + 'PT Sans Caption', + // 'Ubuntu', + 'Liberation Sans' + ], + /* For some cases, in particular for embedding, we need to + allow for fonts being hosted elsewhere */ + urls: webFontURLs !== undefined ? webFontURLs : [ + 'static/fonts/Astloch-Bold.ttf', + 'static/fonts/PT_Sans-Caption-Web-Regular.ttf', + // + 'static/fonts/Liberation_Sans-Regular.ttf' + ], + }, + active: proceedWithFonts, + inactive: proceedWithFonts, + fontactive: function(fontFamily, fontDescription) { + // Note: Enable for font debugging + //console.log("font active: ", fontFamily, fontDescription); + }, + fontloading: function(fontFamily, fontDescription) { + // Note: Enable for font debugging + //console.log("font loading:", fontFamily, fontDescription); + }, + }; + WebFont.load(webFontConfig); + setTimeout(function() { + if (!Visualizer.areFontsLoaded) { + console.error('Timeout in loading fonts'); + proceedWithFonts(); + } + }, fontLoadTimeout); + } + + dispatcher. + on('collectionChanged', collectionChanged). + on('collectionLoaded', collectionLoaded). + on('renderData', renderData). + on('triggerRender', triggerRender). + on('requestRenderData', requestRenderData). + on('isReloadOkay', isReloadOkay). + on('resetData', resetData). + on('abbrevs', setAbbrevs). + on('textBackgrounds', setTextBackgrounds). + on('layoutDensity', setLayoutDensity). + on('svgWidth', setSvgWidth). + on('current', gotCurrent). + on('clearSVG', clearSVG). + on('mouseover', onMouseOver). + on('mouseout', onMouseOut); + }; + + Visualizer.areFontsLoaded = false; + + var proceedWithFonts = function() { + Visualizer.areFontsLoaded = true; + // Note: Enable for font debugging + //console.log("fonts done"); + Dispatcher.post('triggerRender'); + }; + + return Visualizer; +})(jQuery, window); diff --git a/src/edu/stanford/nlp/pipeline/demo/webfont.js b/src/edu/stanford/nlp/pipeline/demo/webfont.js new file mode 100644 index 0000000000..6b11188cda --- /dev/null +++ b/src/edu/stanford/nlp/pipeline/demo/webfont.js @@ -0,0 +1,46 @@ +/* + * Copyright 2012 Small Batch, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +;(function(window,document,undefined){ +function i(a){return function(){return this[a]}}var j;function n(a,b){var c=arguments.length>2?Array.prototype.slice.call(arguments,2):[];return function(){c.push.apply(c,arguments);return b.apply(a,c)}};function o(a,b){this.K=a;this.c=b}o.prototype.createElement=function(a,b,c){a=this.K.createElement(a);if(b)for(var d in b)if(b.hasOwnProperty(d))d=="style"?q(this,a,b[d]):a.setAttribute(d,b[d]);c&&a.appendChild(this.K.createTextNode(c));return a};function r(a,b,c){a=a.K.getElementsByTagName(b)[0];if(!a)a=document.documentElement;if(a&&a.lastChild){a.insertBefore(c,a.lastChild);return true}return false}function aa(a,b){function c(){document.body?b():setTimeout(c,0)}c()} +function s(a,b){if(b.parentNode){b.parentNode.removeChild(b);return true}return false}function t(a,b){return a.createElement("link",{rel:"stylesheet",href:b})}function u(a,b){return a.createElement("script",{src:b})}function v(a,b,c){a=b.className.split(/\s+/);for(var d=0,e=a.length;d=6)}return new y("MSIE","Unknown","MSIE","Unknown",A(a),D(a),E(a,a.k),false)} +function da(a){var b="Unknown",c="Unknown",d=C(a,a.c,/(Presto\/[\d\w\.]+)/,1);if(d!=""){c=d.split("/");b=c[0];c=c[1]}else{if(a.c.indexOf("Gecko")!=-1)b="Gecko";d=C(a,a.c,/rv:([^\)]+)/,1);if(d!="")c=d}if(a.c.indexOf("Version/")!=-1){d=C(a,a.c,/Version\/([\d\.]+)/,1);if(d!="")return new y("Opera",d,b,c,A(a),D(a),E(a,a.k),F(a,d)>=10)}d=C(a,a.c,/Opera[\/ ]([\d\.]+)/,1);if(d!="")return new y("Opera",d,b,c,A(a),D(a),E(a,a.k),F(a,d)>=10);return new y("Opera","Unknown",b,c,A(a),D(a),E(a,a.k),false)} +function ea(a){var b=A(a),c=D(a),d=C(a,a.c,/AppleWebKit\/([\d\.\+]+)/,1);if(d=="")d="Unknown";var e="Unknown";if(a.c.indexOf("Chrome")!=-1)e="Chrome";else if(a.c.indexOf("Safari")!=-1)e="Safari";else if(a.c.indexOf("AdobeAIR")!=-1)e="AdobeAIR";var f="Unknown";if(a.c.indexOf("Version/")!=-1)f=C(a,a.c,/Version\/([\d\.\w]+)/,1);else if(e=="Chrome")f=C(a,a.c,/Chrome\/([\d\.]+)/,1);else if(e=="AdobeAIR")f=C(a,a.c,/AdobeAIR\/([\d\.]+)/,1);var g=false;if(e=="AdobeAIR"){g=C(a,f,/\d+\.(\d+)/,1);g=F(a,f)>2|| +F(a,f)==2&&parseInt(g,10)>=5}else{g=C(a,d,/\d+\.(\d+)/,1);g=F(a,d)>=526||F(a,d)>=525&&parseInt(g,10)>=13}return new y(e,f,"AppleWebKit",d,b,c,E(a,a.k),g)} +function fa(a){var b="Unknown",c="Unknown",d=false;if(a.c.indexOf("Firefox")!=-1){b="Firefox";var e=C(a,a.c,/Firefox\/([\d\w\.]+)/,1);if(e!=""){d=C(a,e,/\d+\.(\d+)/,1);c=e;d=e!=""&&F(a,e)>=3&&parseInt(d,10)>=5}}else if(a.c.indexOf("Mozilla")!=-1)b="Mozilla";e=C(a,a.c,/rv:([^\)]+)/,1);if(e=="")e="Unknown";else if(!d){d=F(a,e);var f=parseInt(C(a,e,/\d+\.(\d+)/,1),10),g=parseInt(C(a,e,/\d+\.\d+\.(\d+)/,1),10);d=d>1||d==1&&f>9||d==1&&f==9&&g>=2||e.match(/1\.9\.1b[123]/)!=null||e.match(/1\.9\.1\.[\d\.]+/)!= +null}return new y(b,c,"Gecko",e,A(a),D(a),E(a,a.k),d)}function F(a,b){a=C(a,b,/(\d+)/,1);if(a!="")return parseInt(a,10);return-1}function C(a,b,c,d){if((a=b.match(c))&&a[d])return a[d];return""}function E(a,b){if(b.documentMode)return b.documentMode};function ga(a,b,c,d){this.a=a;this.g=b;this.U=c;this.j=d||ha;this.h=new G("-")}var ha="wf";function H(a){v(a.a,a.g,a.h.e(a.j,"loading"));I(a,"loading")}function J(a){w(a.a,a.g,a.h.e(a.j,"loading"));x(a.a,a.g,a.h.e(a.j,"active"))||v(a.a,a.g,a.h.e(a.j,"inactive"));I(a,"inactive")}function ia(a){w(a.a,a.g,a.h.e(a.j,"loading"));w(a.a,a.g,a.h.e(a.j,"inactive"));v(a.a,a.g,a.h.e(a.j,"active"));I(a,"active")}function I(a,b,c,d){a.U[b]&&a.U[b](c,d)};function ja(){this.fa={}}function ka(a,b){var c=[];for(var d in b)if(b.hasOwnProperty(d)){var e=a.fa[d];e&&c.push(e(b[d]))}return c};function L(a,b,c,d,e){this.a=a;this.A=b;this.n=c;this.u=d;this.D=e;this.V=0;this.ja=this.ea=false}L.prototype.watch=function(a,b,c,d,e){for(var f=a.length,g=0;g=5E3)Q(this,this.$);else{this.ca=a;this.da=b;qa(this)}};function qa(a){a.u(function(b,c){return function(){c.call(b)}}(a,a.J),25)}function Q(a,b){s(a.a,a.Q);s(a.a,a.R);b(a.L,a.B)}function na(a,b){b=P(a,b,true);var c=a.n.p(b);s(a.a,b);return c}function P(a,b,c){b=a.a.createElement("span",{style:R(a,b,a.B,c)},a.sa);r(a.a,"body",b);return b} +function R(a,b,c,d){c=a.v.expand(c);return"position:absolute;top:-999px;left:-999px;font-size:300px;width:auto;height:auto;line-height:normal;margin:0;padding:0;font-variant:normal;font-family:"+(d?"":a.Aa.quote(a.L)+",")+b+";"+c};function S(a,b,c,d,e){this.a=a;this.X=b;this.g=c;this.u=d;this.c=e;this.M=this.N=0}S.prototype.q=function(a,b){this.X.fa[a]=b};S.prototype.load=function(a){var b=new ga(this.a,this.g,a);this.c.w()?ra(this,b,a):J(b)};S.prototype.ya=function(a,b,c,d){var e=a.Z?a.Z():N;if(d)a.load(n(this,this.Ca,b,c,e));else{a=--this.N==0;this.M--;if(a)this.M==0?J(b):H(b);c.watch([],{},{},e,a)}}; +S.prototype.Ca=function(a,b,c,d,e,f){var g=--this.N==0;g&&H(a);this.u(n(this,function(h,l,k,m,B,p){h.watch(l,k||{},m||{},B,p)},b,d,e,f,c,g))};function ra(a,b,c){c=ka(a.X,c);a.M=a.N=c.length;for(var d=new L(a.a,b,{p:function(h){return h.offsetWidth}},a.u,function(){return(new Date).getTime()}),e=0,f=c.length;e=5E3)this.t[a]&&this.t[b]&&xa[this.L]?Q(this,this.H):Q(this,this.$);else qa(this)};function ya(a){this.I=a?a:("https:"==window.location.protocol?"https:":"http:")+za;this.f=[];this.S=[]}var za="//fonts.googleapis.com/css";ya.prototype.e=function(){if(this.f.length==0)throw new Error("No fonts to load !");if(this.I.indexOf("kit=")!=-1)return this.I;for(var a=this.f.length,b=[],c=0;c0)a+="&subset="+this.S.join(",");return a};function Aa(a){this.f=a;this.ga=[];this.ka={};this.F={};this.v=new O}var Ba={ultralight:"n2",light:"n3",regular:"n4",bold:"n7",italic:"i4",bolditalic:"i7",ul:"n2",l:"n3",r:"n4",b:"n7",i:"i4",bi:"i7"},Ca={latin:ma,cyrillic:"йяЖ",greek:"αβΣ",khmer:"កខគ",Hanuman:"កខគ"}; +Aa.prototype.parse=function(){for(var a=this.f.length,b=0;b=2){var f=c[1],g=[];if(f){f=f.split(",");for(var h=f.length,l=0;l0)e=g;if(c.length==3){c=c[2];g=[];c=c?c.split(","):g;if(c.length>0)if(c=Ca[c[0]])this.F[d]= +c}}if(!this.F[d])if(c=Ca[d])this.F[d]=c;this.ga.push(d);this.ka[d]=e}};function W(a,b,c){this.c=a;this.a=b;this.d=c}W.prototype.z=function(a,b){b(a.w())};W.prototype.Z=function(){if(this.c.Y()=="AppleWebKit")return V;return N};W.prototype.load=function(a){var b=this.a;this.c.getName()=="MSIE"&&this.d.blocking!=true?aa(b,n(this,this.ba,a)):this.ba(a)}; +W.prototype.ba=function(a){for(var b=this.a,c=new ya(this.d.api),d=this.d.families,e=d.length,f=0;f"); + "head.load.min.js\">"); // Main Javascript that hooks into all that we have introduced so far. out.println("");