diff --git a/Rakefile b/Rakefile index 3cfb315..a19739d 100644 --- a/Rakefile +++ b/Rakefile @@ -12,7 +12,7 @@ require "gemoji" medium_dark_skin_tone: ["🏾", "Medium-Dark Skin Tone"], dark_skin_tone: ["🏿", "Dark Skin Tone"], }.each do |key, (unicode_alias, desc)| - Emoji.create(key) do |char| + Emoji.create(key.to_s) do |char| char.add_unicode_alias unicode_alias char.description = desc end @@ -27,22 +27,47 @@ task :rebuild => "build" do Emoji.all.each do |emoji| uuid = SecureRandom.uuid - name = [ - emoji.raw, - emoji.description, - emoji.aliases.map { "\"#{_1}\"" }.join(", "), - ] - name << "(#{emoji.tags.join(", ")})" unless emoji.tags.empty? + keywords = [emoji.description] + + keywords.concat( + emoji.aliases + .map { _1.gsub(?_, " ") } + .reject { str_match(emoji.description, _1) } + ) + keywords.concat(emoji.tags) File.write("build/#{emoji.name} [#{uuid}].json", JSON.dump({ alfredsnippet: { snippet: emoji.raw, dontautoexpand: true, uid: uuid, - name: name.join(" "), + name: "#{emoji.raw} #{keywords.join(", ")}", keyword: emoji.name, }, })) end end task :default => :rebuild + +def str_match(a, b) + return true if a.gsub(/[^\w]+/, "").downcase.include?(b.gsub(/[^\w]+/, "").downcase) + levenshtein(a, b) < 2 +end + +def levenshtein(a, b) + memo = Hash.new {|h,(a,b)| + h[[a,b]] = (->() { + return b.length if a.empty? + return a.length if b.empty? + return h[[a[1..], b[1..]]] if a[0] == b[0] + + 1 + [ + h[[a, b[1..]]], + h[[a[1..], b]], + h[[a[1..], b[1..]]], + ].min + }).() + } + + memo[[a, b].map(&:downcase)] +end