@@ -207,8 +207,9 @@ const Main = (function() {
207207 } ) ;
208208
209209 document . getElementById ( 'custom-annotation' ) . onclick = function ( ) {
210- document . getElementById ( 'brat- input' ) . classList . add ( 'open' ) ;
210+ document . getElementById ( 'input-modal ' ) . classList . add ( 'open' ) ;
211211 }
212+
212213 document . getElementById ( 'options-toggle' ) . onclick = function ( ) {
213214 setActiveTab ( 'options' ) ;
214215 }
@@ -221,111 +222,56 @@ const Main = (function() {
221222 }
222223 } ) ;
223224
224- document . getElementById ( 'file-input' ) . onchange = loadFile ;
225- }
225+ // upload file
226+ document . getElementById ( 'file-input' ) . onchange = uploadFile ;
226227
227- function printErrorMessage ( text ) {
228- document . getElementById ( 'error-message' ) . textContent = text ;
229- }
230- function clearErrorMessage ( ) {
231- document . getElementById ( 'error-message' ) . textContent = '' ;
232- }
233- function clearFile ( ) {
234- document . getElementById ( 'form' ) . reset ( ) ;
235- document . getElementById ( 'text-input' ) = '' ;
228+ // upload file via drag and drop
229+ document . body . addEventListener ( 'dragenter' , ( e ) => e . preventDefault ( ) ) ;
230+ document . body . addEventListener ( 'dragover' , ( e ) => e . preventDefault ( ) ) ;
231+ document . body . addEventListener ( 'drop' , uploadFile ) ;
236232 }
237233
238- /**
239- * loadFile: read file
240- */
241- function loadFile ( e ) {
242- let files = e . target . files ;
243- console . log ( files ) ;
244-
245- // get extension
246- if ( files . length === 1 ) {
247- const file = files [ 0 ] ;
248- let fr = new FileReader ( ) ;
234+ /* read an externally loaded file */
235+ function uploadFile ( e ) {
236+ e . preventDefault ( ) ;
237+ let files = ( this === document . body ) ? e . dataTransfer . files : e . target . files ;
238+
239+ // read blobs with FileReader
240+ const promises = [ ...files ] . map ( file => {
241+ const fr = new FileReader ( ) ;
249242 fr . readAsText ( file ) ;
250- fr . onload = parseFile ;
251-
252- function parseFile ( ) {
253- clearErrorMessage ( ) ;
254- const text = fr . result ;
255-
256- // try to coerce it into an accepted format
257- try {
258- let w , l , c ;
259- if ( file . type === 'application/json' ) {
260- // reach json
261- parser . parseJson ( JSON . parse ( text ) ) ;
262- [ w , l , c ] = buildWordsAndLinks ( ) ;
263- } else if ( ! file . type ) {
264- // brat standoff
265- [ w , l , c ] = buildWordsLinksAnn ( text ) ;
266- } else {
267- printErrorMessage ( "Could not read file type: " + file . type ) ;
268- }
269-
270- if ( w && l && c ) {
271- clear ( ) ;
272- [ words , links , clusters ] = [ w , l , c ] ;
273- setSyntaxVisibility ( ) ;
274- draw ( ) ;
275- document . getElementById ( 'text-input' ) . textContent = text ;
276- }
277- } catch ( e ) {
278- console . log ( fr . result , e ) ;
279- printErrorMessage ( "See error in console" ) ;
243+ return new Promise ( ( resolve , reject ) => {
244+ fr . onload = function ( ) {
245+ resolve ( {
246+ name : file . name ,
247+ type : file . type ,
248+ content : fr . result
249+ } ) ;
250+ } ;
251+ } ) ;
252+ } ) ;
253+
254+ Promise . all ( promises ) . then ( files => {
255+ try {
256+ let message = parser . parseFiles ( files ) ;
257+ if ( message ) {
258+ redrawVisualization ( ) ;
259+ printMessage ( message ) ;
280260 }
281261 }
282- }
283- else if ( files . length > 1 ) {
284- // search for matching .ann and .txt file
285-
286- // sort by name
287- let sortedFiles = [ ] . slice . call ( files ) . sort ( ( a , b ) => a . name . localeCompare ( b . name ) ) ;
288-
289- let prev = 0 ;
290-
291- for ( let i = 1 ; i < sortedFiles . length ; ++ i ) {
292- let f1 = sortedFiles [ prev ] . name . toLowerCase ( ) ,
293- f2 = sortedFiles [ i ] . name . toLowerCase ( ) ;
294- let prefixesMatch = f1 . slice ( 0 , f1 . lastIndexOf ( '.' ) ) === f2 . slice ( 0 , f2 . lastIndexOf ( '.' ) ) ;
295- let typesMatch = f1 . endsWith ( '.ann' ) || f2 . endsWith ( '.ann' ) ;
296- if ( prefixesMatch && typesMatch && f1 !== f2 ) {
297- // matching files found
298- let fr = new FileReader ( ) ;
299- fr . readAsText ( sortedFiles [ prev ] ) ;
300- fr . onload = function ( ) {
301- let f1Text = fr . result ;
302- fr . readAsText ( sortedFiles [ i ] ) ;
303- fr . onload = function ( ) {
304- let w , l , c , text ;
305- if ( f1 . endsWith ( '.ann' ) ) {
306- text = fr . result ;
307- [ w , l , c ] = buildWordsLinksAnn ( fr . result , f1Text ) ;
308- }
309- else {
310- text = f1Text ;
311- [ w , l , c ] = buildWordsLinksAnn ( f1Text , fr . result ) ;
312- }
313-
314- if ( w && l && c ) {
315- clear ( ) ;
316- [ words , links , clusters ] = [ w , l , c ] ;
317- setSyntaxVisibility ( ) ;
318- draw ( ) ;
319- document . getElementById ( 'text-input' ) . textContent = text ;
320- }
321- }
322- } ;
323- break ;
324- } else {
325- prev = i ;
326- }
262+ catch ( err ) {
263+ console . log ( 'ERROR: ' , err ) ;
264+ printMessage ( err ) ;
327265 }
328- }
266+ document . getElementById ( 'form' ) . reset ( ) ;
267+ } ) ;
268+ }
269+
270+ function printMessage ( text ) {
271+ document . getElementById ( 'message' ) . textContent = text ;
272+ }
273+ function clearMessage ( ) {
274+ document . getElementById ( 'message' ) . textContent = '' ;
329275 }
330276
331277
@@ -344,19 +290,12 @@ const Main = (function() {
344290
345291 parser . loadFile ( path )
346292 . then ( data => {
347- ymlToJson . convert ( 'taxonomy.yml.txt' , function ( taxonomy ) {
348- clear ( ) ;
349- words = data . words ;
350- links = data . links ;
351- clusters = data . clusters ;
352- setSyntaxVisibility ( ) ;
353- draw ( ) ;
354-
355- tm . draw ( taxonomy , words ) ;
356- } ) ;
293+ redrawVisualization ( ) ;
294+ clearMessage ( ) ;
357295 } )
358296 . catch ( err => {
359297 console . log ( 'ERROR: ' , err ) ;
298+ printMessage ( err ) ;
360299 } ) ;
361300 } ;
362301
@@ -370,6 +309,20 @@ const Main = (function() {
370309 links . forEach ( link => link . svg && link . svg . remove ( ) ) ;
371310 }
372311
312+ function redrawVisualization ( ) {
313+ let data = parser . parsedData ;
314+ ymlToJson . convert ( 'taxonomy.yml.txt' , function ( taxonomy ) {
315+ clear ( ) ;
316+ words = data . words ;
317+ links = data . links ;
318+ clusters = data . clusters ;
319+ setSyntaxVisibility ( ) ;
320+ draw ( ) ;
321+
322+ tm . draw ( taxonomy , words ) ;
323+ } ) ;
324+ }
325+
373326 /**
374327 * draw: draw words, links, rows, etc. onto the visualization
375328 */
0 commit comments