class TranslationTable
constructor: (@translation, data) -> @data = JSON.parse(data) get_table: => ret = $("<table>" class: 'translation-table' ) ret.append(@get_header()) for row in @data.table ret.append(@get_row(row)) return ret get_header: => ret = $("<tr>") i = 0 for word in @data.source src = $("<th>" class: 'ac-source' html: word "data-position": i click: (event) => position = parseInt($(event.currentTarget).data('position')) if @position_marked(position) @unmark_position(position) else @mark_position(position) $(window).trigger('loadSuggestions') ) ret.append(src) i += 1 return ret get_row: (row) => ret = $("<tr>") i = 0 for word in row len = parseInt(word.w) if !word.str ret.append("<td colspan='#{len}' class='ac-empty'></td>") else cell = $("<td colspan='#{len}' class='ac-word'></td>") content = $("<div>" 'data-position-from': i 'data-position-to': (i + len - 1) html: word.str click: (event) => i = parseInt($(event.currentTarget).data('position-from')) while i <= parseInt($(event.currentTarget).data('position-to')) @mark_position(i) i += 1 @translation.add_words($(event.currentTarget).text()) $(window).trigger('loadSuggestions') ) cell.append(content) ret.append(cell) i += len return ret position_marked: (position) => return true if $("th.ac-source").slice(position, (position + 1)).hasClass('ac-selected') return false #use edit distance to mark written words mark_words: (word) => word = Utils.trim word best_result = 10000 best_element = null maximal_acceptable_distance = 1 maximal_acceptable_distance = 0 if word.length < 5 maximal_acceptable_distance = 2 if word.length > 10 for el in $(".ac-word div") element_text = Utils.trim($(el).text()) result = Utils.edit_distance(word, element_text) if result < best_result best_result = result best_element = $(el) if best_element != null and best_result <= maximal_acceptable_distance @mark_interval(best_element.data('position-from'), best_element.data('position-to')) #when more words, there should be fix on server side giving most likely continuation mark_words_OLD: (words) => console.log "MARKING WORDS: #{words}" words = "#{words} " for el in $(".ac-word div") el_text = Utils.trim $(el).text() el_text = "#{el_text} " if ((words.indexOf(el_text) == 0) and (words.length >= el_text.length)) #console.log "#{words}, #{el_text}, #{words.length} , #{el_text.length}" @mark_interval($(el).data('position-from'), $(el).data('position-to')) $(window).trigger('loadSuggestions') words = words.substr(el_text.length) words = Utils.trim(words) words = "#{words} " return unless words.length > 0 mark_interval: (from, to) => i = from while i <= to @mark_position(i) i += 1 mark_position: (position) => $("th.ac-source").slice(position, (position + 1)).addClass('ac-selected') unmark_position: (position) => $("th.ac-source").slice(position, (position + 1)).removeClass('ac-selected') covered_vector: => ret = "" for el in $("th.ac-source") if $(el).hasClass('ac-selected') ret += "1" else ret += "0" return ret