class Gibber
Constants
- MARGIN
- VERSION
Public Instance Methods
replace(text)
click to toggle source
# File lib/gibber.rb, line 7 def replace(text) parsed = Nokogiri::HTML.fragment(text) parsed.xpath('.//text()').each do |node| node.content = node.content .gsub(/\W/, '|\0|') .split('|') .map(&method(:replace_word)) .join('') end parsed.to_html end
Private Instance Methods
blank?(word)
click to toggle source
# File lib/gibber.rb, line 34 def blank?(word) !word || word == "" end
conditional_capitalize(original_word, translated_word)
click to toggle source
# File lib/gibber.rb, line 61 def conditional_capitalize(original_word, translated_word) if original_word[0] == original_word[0].upcase translated_word.capitalize else translated_word end end
generate_key(word)
click to toggle source
# File lib/gibber.rb, line 80 def generate_key(word) margin = (MARGIN * word.length).to_i lbound = [word.length - margin, 1].max rbound = word.length + margin [lbound, rbound] end
keys_within_margin_for_word(word)
click to toggle source
# File lib/gibber.rb, line 46 def keys_within_margin_for_word(word) word_hash.keys.select { |k| word.length >= k[0] && word.length <= k[1]} end
numeric?(word)
click to toggle source
# File lib/gibber.rb, line 38 def numeric?(word) word =~ /^\d+$/ end
replace_word(word, tries_left=100)
click to toggle source
recursive if missing translation
# File lib/gibber.rb, line 23 def replace_word(word, tries_left=100) return word if blank?(word) || numeric?(word) || !wordy?(word) possible_keys = keys_within_margin_for_word(word) if translation = translation_at_keys(*possible_keys) conditional_capitalize(word, translation) else tries_left == 0 ? ['I','V','X'].sample : replace_word(word[0..-2], tries_left - 1) end end
text()
click to toggle source
# File lib/gibber.rb, line 87 def text <<-LATIN Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce id risus lorem. Fusce in nulla auctor felis viverra suscipit. Sed auctor lobortis massa, euismod varius nulla interdum a. Morbi rhoncus ultrices urna, vitae vulputate dui tempor gravida. Quisque quis diam lorem. Nam non urna posuere, faucibus leo vitae, ullamcorper sem. Donec nec felis ultrices, ultrices augue et, fringilla ante. Etiam lacinia dolor non odio malesuada elementum. Vestibulum vitae risus sollicitudin, lobortis massa eget, auctor ante. Curabitur nec urna quis sapien iaculis hendrerit. Nam scelerisque leo dolor, non pulvinar ipsum tempus nec. Proin volutpat magna eu feugiat egestas. Pellentesque sed massa arcu. Nam vel magna posuere, viverra nunc eu, mollis turpis. Integer ultrices lacus ut velit ullamcorper, ac molestie risus rhoncus. Morbi at ante luctus, dignissim ligula in, ullamcorper elit. Aenean vel efficitur lacus. Suspendisse quis nunc libero. Nullam a elit venenatis, porttitor nibh vel, dignissim turpis. Cras luctus arcu vitae velit semper, et convallis eros ultricies. Nunc at risus nec sem scelerisque tincidunt. Suspendisse eu accumsan orci. In hac habitasse platea dictumst. Etiam faucibus odio dui, quis volutpat eros pulvinar at. Donec tristique quam sem, sit amet feugiat felis tincidunt sit amet. In tincidunt lobortis est et euismod. Quisque tempus ex id enim tincidunt scelerisque. Fusce odio tortor, consequat pulvinar molestie interdum, mollis aliquam erat. Nam nec augue ornare, laoreet ante et, finibus dolor. Aenean pulvinar felis vel mauris efficitur faucibus. Duis venenatis id nisl eget molestie. In venenatis, sem quis dignissim fermentum, justo risus tempus quam, at venenatis diam ex a massa. Etiam urna diam, placerat ac commodo eget, egestas a urna. Proin vitae malesuada libero, eu porta risus. Nullam congue, magna non ullamcorper lobortis, lorem urna gravida sem, non pellentesque tortor elit nec nisi. Nunc lobortis dui non eros rhoncus volutpat. Nunc imperdiet urna magna, sed blandit purus efficitur aliquam. Morbi mattis, sapien non faucibus aliquam, tortor dui rhoncus diam, vitae aliquam ipsum diam nec ex. Vivamus hendrerit tortor fermentum, pulvinar felis et, porta massa. Nam et ultricies ligula. Nulla vitae augue in odio pulvinar facilisis. Pellentesque purus felis, posuere ullamcorper nibh sit amet, pellentesque pulvinar libero. Quisque a mi tellus. Nunc pretium massa in tempor maximus. Vivamus fermentum sapien nec eros ornare molestie. Vestibulum vitae est condimentum, varius nulla et, ornare justo. Vivamus gravida, neque ut faucibus placerat, metus metus lacinia lorem, ac feugiat arcu leo in arcu. Vestibulum eu augue non tellus hendrerit pharetra id a purus. Sed et velit quis leo efficitur rutrum ac eu leo. Maecenas rhoncus est est, vel eleifend arcu pharetra sed. Curabitur ligula enim, dapibus non vulputate id, efficitur ut nisl. Nulla facilisi. Integer vulputate ultricies mi id interdum. Sed pharetra risus vitae urna mattis, nec maximus nisl bibendum. Sed in elit sit amet ipsum condimentum commodo. Etiam consequat purus magna, vel malesuada est interdum iaculis. Proin commodo, magna ac vehicula pharetra, tellus urna fermentum dui, in rutrum turpis lacus in sem. Donec in elementum nisi. Etiam fringilla diam vitae nulla varius volutpat. Vivamus at lacus porttitor, luctus dui at, eleifend ligula. Sed ac elit in enim varius vestibulum quis rhoncus arcu. Nullam tristique id nisi non feugiat. LATIN end
translation_at_keys(*keys)
click to toggle source
# File lib/gibber.rb, line 50 def translation_at_keys(*keys) if translation = word_hash .values_at(*keys) .flatten .reject { |t| t == @previous } # Never have two identical translations after each other .sample @previous = translation end end
word_hash()
click to toggle source
# File lib/gibber.rb, line 70 def word_hash @_word_hash ||= begin text.split(' ').select(&method(:wordy?)).inject({}) do |hash, word| key = generate_key(word) hash[key] ||= [] hash[key] = (hash[key] + [word.downcase]).uniq; hash end end end
wordy?(word)
click to toggle source
# File lib/gibber.rb, line 42 def wordy?(word) word =~ /^\w+$/ end