love_monster 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (985) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.rdoc +3 -0
  4. data/Rakefile +37 -0
  5. data/app/assets/fonts/love_monster/glyphicons-halflings-regular.eot +0 -0
  6. data/app/assets/fonts/love_monster/glyphicons-halflings-regular.svg +288 -0
  7. data/app/assets/fonts/love_monster/glyphicons-halflings-regular.ttf +0 -0
  8. data/app/assets/fonts/love_monster/glyphicons-halflings-regular.woff +0 -0
  9. data/app/assets/fonts/love_monster/glyphicons-halflings-regular.woff2 +0 -0
  10. data/app/assets/images/love_monster/chosen-sprite.png +0 -0
  11. data/app/assets/images/love_monster/emoji/-1.png +0 -0
  12. data/app/assets/images/love_monster/emoji/100.png +0 -0
  13. data/app/assets/images/love_monster/emoji/1234.png +0 -0
  14. data/app/assets/images/love_monster/emoji/8ball.png +0 -0
  15. data/app/assets/images/love_monster/emoji/_1.png +0 -0
  16. data/app/assets/images/love_monster/emoji/a.png +0 -0
  17. data/app/assets/images/love_monster/emoji/ab.png +0 -0
  18. data/app/assets/images/love_monster/emoji/abc.png +0 -0
  19. data/app/assets/images/love_monster/emoji/abcd.png +0 -0
  20. data/app/assets/images/love_monster/emoji/accept.png +0 -0
  21. data/app/assets/images/love_monster/emoji/aerial_tramway.png +0 -0
  22. data/app/assets/images/love_monster/emoji/airplane.png +0 -0
  23. data/app/assets/images/love_monster/emoji/alarm_clock.png +0 -0
  24. data/app/assets/images/love_monster/emoji/alien.png +0 -0
  25. data/app/assets/images/love_monster/emoji/ambulance.png +0 -0
  26. data/app/assets/images/love_monster/emoji/anchor.png +0 -0
  27. data/app/assets/images/love_monster/emoji/angel.png +0 -0
  28. data/app/assets/images/love_monster/emoji/anger.png +0 -0
  29. data/app/assets/images/love_monster/emoji/angry.png +0 -0
  30. data/app/assets/images/love_monster/emoji/anguished.png +0 -0
  31. data/app/assets/images/love_monster/emoji/ant.png +0 -0
  32. data/app/assets/images/love_monster/emoji/apple.png +0 -0
  33. data/app/assets/images/love_monster/emoji/aquarius.png +0 -0
  34. data/app/assets/images/love_monster/emoji/aries.png +0 -0
  35. data/app/assets/images/love_monster/emoji/arrow_backward.png +0 -0
  36. data/app/assets/images/love_monster/emoji/arrow_double_down.png +0 -0
  37. data/app/assets/images/love_monster/emoji/arrow_double_up.png +0 -0
  38. data/app/assets/images/love_monster/emoji/arrow_down.png +0 -0
  39. data/app/assets/images/love_monster/emoji/arrow_down_small.png +0 -0
  40. data/app/assets/images/love_monster/emoji/arrow_forward.png +0 -0
  41. data/app/assets/images/love_monster/emoji/arrow_heading_down.png +0 -0
  42. data/app/assets/images/love_monster/emoji/arrow_heading_up.png +0 -0
  43. data/app/assets/images/love_monster/emoji/arrow_left.png +0 -0
  44. data/app/assets/images/love_monster/emoji/arrow_lower_left.png +0 -0
  45. data/app/assets/images/love_monster/emoji/arrow_lower_right.png +0 -0
  46. data/app/assets/images/love_monster/emoji/arrow_right.png +0 -0
  47. data/app/assets/images/love_monster/emoji/arrow_right_hook.png +0 -0
  48. data/app/assets/images/love_monster/emoji/arrow_up.png +0 -0
  49. data/app/assets/images/love_monster/emoji/arrow_up_down.png +0 -0
  50. data/app/assets/images/love_monster/emoji/arrow_up_small.png +0 -0
  51. data/app/assets/images/love_monster/emoji/arrow_upper_left.png +0 -0
  52. data/app/assets/images/love_monster/emoji/arrow_upper_right.png +0 -0
  53. data/app/assets/images/love_monster/emoji/arrows_clockwise.png +0 -0
  54. data/app/assets/images/love_monster/emoji/arrows_counterclockwise.png +0 -0
  55. data/app/assets/images/love_monster/emoji/art.png +0 -0
  56. data/app/assets/images/love_monster/emoji/articulated_lorry.png +0 -0
  57. data/app/assets/images/love_monster/emoji/astonished.png +0 -0
  58. data/app/assets/images/love_monster/emoji/atm.png +0 -0
  59. data/app/assets/images/love_monster/emoji/b.png +0 -0
  60. data/app/assets/images/love_monster/emoji/baby.png +0 -0
  61. data/app/assets/images/love_monster/emoji/baby_bottle.png +0 -0
  62. data/app/assets/images/love_monster/emoji/baby_chick.png +0 -0
  63. data/app/assets/images/love_monster/emoji/baby_symbol.png +0 -0
  64. data/app/assets/images/love_monster/emoji/back.png +0 -0
  65. data/app/assets/images/love_monster/emoji/baggage_claim.png +0 -0
  66. data/app/assets/images/love_monster/emoji/balloon.png +0 -0
  67. data/app/assets/images/love_monster/emoji/ballot_box_with_check.png +0 -0
  68. data/app/assets/images/love_monster/emoji/bamboo.png +0 -0
  69. data/app/assets/images/love_monster/emoji/banana.png +0 -0
  70. data/app/assets/images/love_monster/emoji/bangbang.png +0 -0
  71. data/app/assets/images/love_monster/emoji/bank.png +0 -0
  72. data/app/assets/images/love_monster/emoji/bar_chart.png +0 -0
  73. data/app/assets/images/love_monster/emoji/barber.png +0 -0
  74. data/app/assets/images/love_monster/emoji/baseball.png +0 -0
  75. data/app/assets/images/love_monster/emoji/basketball.png +0 -0
  76. data/app/assets/images/love_monster/emoji/bath.png +0 -0
  77. data/app/assets/images/love_monster/emoji/bathtub.png +0 -0
  78. data/app/assets/images/love_monster/emoji/battery.png +0 -0
  79. data/app/assets/images/love_monster/emoji/bear.png +0 -0
  80. data/app/assets/images/love_monster/emoji/bee.png +0 -0
  81. data/app/assets/images/love_monster/emoji/beer.png +0 -0
  82. data/app/assets/images/love_monster/emoji/beers.png +0 -0
  83. data/app/assets/images/love_monster/emoji/beetle.png +0 -0
  84. data/app/assets/images/love_monster/emoji/beginner.png +0 -0
  85. data/app/assets/images/love_monster/emoji/bell.png +0 -0
  86. data/app/assets/images/love_monster/emoji/bento.png +0 -0
  87. data/app/assets/images/love_monster/emoji/bicyclist.png +0 -0
  88. data/app/assets/images/love_monster/emoji/bike.png +0 -0
  89. data/app/assets/images/love_monster/emoji/bikini.png +0 -0
  90. data/app/assets/images/love_monster/emoji/bird.png +0 -0
  91. data/app/assets/images/love_monster/emoji/birthday.png +0 -0
  92. data/app/assets/images/love_monster/emoji/black_circle.png +0 -0
  93. data/app/assets/images/love_monster/emoji/black_joker.png +0 -0
  94. data/app/assets/images/love_monster/emoji/black_medium_small_square.png +0 -0
  95. data/app/assets/images/love_monster/emoji/black_medium_square.png +0 -0
  96. data/app/assets/images/love_monster/emoji/black_nib.png +0 -0
  97. data/app/assets/images/love_monster/emoji/black_small_square.png +0 -0
  98. data/app/assets/images/love_monster/emoji/black_square.png +0 -0
  99. data/app/assets/images/love_monster/emoji/black_square_button.png +0 -0
  100. data/app/assets/images/love_monster/emoji/blossom.png +0 -0
  101. data/app/assets/images/love_monster/emoji/blowfish.png +0 -0
  102. data/app/assets/images/love_monster/emoji/blue_book.png +0 -0
  103. data/app/assets/images/love_monster/emoji/blue_car.png +0 -0
  104. data/app/assets/images/love_monster/emoji/blue_heart.png +0 -0
  105. data/app/assets/images/love_monster/emoji/blush.png +0 -0
  106. data/app/assets/images/love_monster/emoji/boar.png +0 -0
  107. data/app/assets/images/love_monster/emoji/boat.png +0 -0
  108. data/app/assets/images/love_monster/emoji/bomb.png +0 -0
  109. data/app/assets/images/love_monster/emoji/book.png +0 -0
  110. data/app/assets/images/love_monster/emoji/bookmark.png +0 -0
  111. data/app/assets/images/love_monster/emoji/bookmark_tabs.png +0 -0
  112. data/app/assets/images/love_monster/emoji/books.png +0 -0
  113. data/app/assets/images/love_monster/emoji/boom.png +0 -0
  114. data/app/assets/images/love_monster/emoji/boot.png +0 -0
  115. data/app/assets/images/love_monster/emoji/bouquet.png +0 -0
  116. data/app/assets/images/love_monster/emoji/bow.png +0 -0
  117. data/app/assets/images/love_monster/emoji/bowling.png +0 -0
  118. data/app/assets/images/love_monster/emoji/bowtie.png +0 -0
  119. data/app/assets/images/love_monster/emoji/boy.png +0 -0
  120. data/app/assets/images/love_monster/emoji/bread.png +0 -0
  121. data/app/assets/images/love_monster/emoji/bride_with_veil.png +0 -0
  122. data/app/assets/images/love_monster/emoji/bridge_at_night.png +0 -0
  123. data/app/assets/images/love_monster/emoji/briefcase.png +0 -0
  124. data/app/assets/images/love_monster/emoji/broken_heart.png +0 -0
  125. data/app/assets/images/love_monster/emoji/bug.png +0 -0
  126. data/app/assets/images/love_monster/emoji/bulb.png +0 -0
  127. data/app/assets/images/love_monster/emoji/bullettrain_front.png +0 -0
  128. data/app/assets/images/love_monster/emoji/bullettrain_side.png +0 -0
  129. data/app/assets/images/love_monster/emoji/bus.png +0 -0
  130. data/app/assets/images/love_monster/emoji/busstop.png +0 -0
  131. data/app/assets/images/love_monster/emoji/bust_in_silhouette.png +0 -0
  132. data/app/assets/images/love_monster/emoji/busts_in_silhouette.png +0 -0
  133. data/app/assets/images/love_monster/emoji/cactus.png +0 -0
  134. data/app/assets/images/love_monster/emoji/cake.png +0 -0
  135. data/app/assets/images/love_monster/emoji/calendar.png +0 -0
  136. data/app/assets/images/love_monster/emoji/calling.png +0 -0
  137. data/app/assets/images/love_monster/emoji/camel.png +0 -0
  138. data/app/assets/images/love_monster/emoji/camera.png +0 -0
  139. data/app/assets/images/love_monster/emoji/cancer.png +0 -0
  140. data/app/assets/images/love_monster/emoji/candy.png +0 -0
  141. data/app/assets/images/love_monster/emoji/capital_abcd.png +0 -0
  142. data/app/assets/images/love_monster/emoji/capricorn.png +0 -0
  143. data/app/assets/images/love_monster/emoji/car.png +0 -0
  144. data/app/assets/images/love_monster/emoji/card_index.png +0 -0
  145. data/app/assets/images/love_monster/emoji/carousel_horse.png +0 -0
  146. data/app/assets/images/love_monster/emoji/cat.png +0 -0
  147. data/app/assets/images/love_monster/emoji/cat2.png +0 -0
  148. data/app/assets/images/love_monster/emoji/cd.png +0 -0
  149. data/app/assets/images/love_monster/emoji/chart.png +0 -0
  150. data/app/assets/images/love_monster/emoji/chart_with_downwards_trend.png +0 -0
  151. data/app/assets/images/love_monster/emoji/chart_with_upwards_trend.png +0 -0
  152. data/app/assets/images/love_monster/emoji/checkered_flag.png +0 -0
  153. data/app/assets/images/love_monster/emoji/cherries.png +0 -0
  154. data/app/assets/images/love_monster/emoji/cherry_blossom.png +0 -0
  155. data/app/assets/images/love_monster/emoji/chestnut.png +0 -0
  156. data/app/assets/images/love_monster/emoji/chicken.png +0 -0
  157. data/app/assets/images/love_monster/emoji/children_crossing.png +0 -0
  158. data/app/assets/images/love_monster/emoji/chocolate_bar.png +0 -0
  159. data/app/assets/images/love_monster/emoji/christmas_tree.png +0 -0
  160. data/app/assets/images/love_monster/emoji/church.png +0 -0
  161. data/app/assets/images/love_monster/emoji/cinema.png +0 -0
  162. data/app/assets/images/love_monster/emoji/circus_tent.png +0 -0
  163. data/app/assets/images/love_monster/emoji/city_sunrise.png +0 -0
  164. data/app/assets/images/love_monster/emoji/city_sunset.png +0 -0
  165. data/app/assets/images/love_monster/emoji/cl.png +0 -0
  166. data/app/assets/images/love_monster/emoji/clap.png +0 -0
  167. data/app/assets/images/love_monster/emoji/clapper.png +0 -0
  168. data/app/assets/images/love_monster/emoji/clipboard.png +0 -0
  169. data/app/assets/images/love_monster/emoji/clock1.png +0 -0
  170. data/app/assets/images/love_monster/emoji/clock10.png +0 -0
  171. data/app/assets/images/love_monster/emoji/clock1030.png +0 -0
  172. data/app/assets/images/love_monster/emoji/clock11.png +0 -0
  173. data/app/assets/images/love_monster/emoji/clock1130.png +0 -0
  174. data/app/assets/images/love_monster/emoji/clock12.png +0 -0
  175. data/app/assets/images/love_monster/emoji/clock1230.png +0 -0
  176. data/app/assets/images/love_monster/emoji/clock130.png +0 -0
  177. data/app/assets/images/love_monster/emoji/clock2.png +0 -0
  178. data/app/assets/images/love_monster/emoji/clock230.png +0 -0
  179. data/app/assets/images/love_monster/emoji/clock3.png +0 -0
  180. data/app/assets/images/love_monster/emoji/clock330.png +0 -0
  181. data/app/assets/images/love_monster/emoji/clock4.png +0 -0
  182. data/app/assets/images/love_monster/emoji/clock430.png +0 -0
  183. data/app/assets/images/love_monster/emoji/clock5.png +0 -0
  184. data/app/assets/images/love_monster/emoji/clock530.png +0 -0
  185. data/app/assets/images/love_monster/emoji/clock6.png +0 -0
  186. data/app/assets/images/love_monster/emoji/clock630.png +0 -0
  187. data/app/assets/images/love_monster/emoji/clock7.png +0 -0
  188. data/app/assets/images/love_monster/emoji/clock730.png +0 -0
  189. data/app/assets/images/love_monster/emoji/clock8.png +0 -0
  190. data/app/assets/images/love_monster/emoji/clock830.png +0 -0
  191. data/app/assets/images/love_monster/emoji/clock9.png +0 -0
  192. data/app/assets/images/love_monster/emoji/clock930.png +0 -0
  193. data/app/assets/images/love_monster/emoji/closed_book.png +0 -0
  194. data/app/assets/images/love_monster/emoji/closed_lock_with_key.png +0 -0
  195. data/app/assets/images/love_monster/emoji/closed_umbrella.png +0 -0
  196. data/app/assets/images/love_monster/emoji/cloud.png +0 -0
  197. data/app/assets/images/love_monster/emoji/clubs.png +0 -0
  198. data/app/assets/images/love_monster/emoji/cn.png +0 -0
  199. data/app/assets/images/love_monster/emoji/cocktail.png +0 -0
  200. data/app/assets/images/love_monster/emoji/coffee.png +0 -0
  201. data/app/assets/images/love_monster/emoji/cold_sweat.png +0 -0
  202. data/app/assets/images/love_monster/emoji/collision.png +0 -0
  203. data/app/assets/images/love_monster/emoji/computer.png +0 -0
  204. data/app/assets/images/love_monster/emoji/confetti_ball.png +0 -0
  205. data/app/assets/images/love_monster/emoji/confounded.png +0 -0
  206. data/app/assets/images/love_monster/emoji/confused.png +0 -0
  207. data/app/assets/images/love_monster/emoji/congratulations.png +0 -0
  208. data/app/assets/images/love_monster/emoji/construction.png +0 -0
  209. data/app/assets/images/love_monster/emoji/construction_worker.png +0 -0
  210. data/app/assets/images/love_monster/emoji/convenience_store.png +0 -0
  211. data/app/assets/images/love_monster/emoji/cookie.png +0 -0
  212. data/app/assets/images/love_monster/emoji/cool.png +0 -0
  213. data/app/assets/images/love_monster/emoji/cop.png +0 -0
  214. data/app/assets/images/love_monster/emoji/copyright.png +0 -0
  215. data/app/assets/images/love_monster/emoji/corn.png +0 -0
  216. data/app/assets/images/love_monster/emoji/couple.png +0 -0
  217. data/app/assets/images/love_monster/emoji/couple_with_heart.png +0 -0
  218. data/app/assets/images/love_monster/emoji/couplekiss.png +0 -0
  219. data/app/assets/images/love_monster/emoji/cow.png +0 -0
  220. data/app/assets/images/love_monster/emoji/cow2.png +0 -0
  221. data/app/assets/images/love_monster/emoji/credit_card.png +0 -0
  222. data/app/assets/images/love_monster/emoji/crescent_moon.png +0 -0
  223. data/app/assets/images/love_monster/emoji/crocodile.png +0 -0
  224. data/app/assets/images/love_monster/emoji/crossed_flags.png +0 -0
  225. data/app/assets/images/love_monster/emoji/crown.png +0 -0
  226. data/app/assets/images/love_monster/emoji/cry.png +0 -0
  227. data/app/assets/images/love_monster/emoji/crying_cat_face.png +0 -0
  228. data/app/assets/images/love_monster/emoji/crystal_ball.png +0 -0
  229. data/app/assets/images/love_monster/emoji/cupid.png +0 -0
  230. data/app/assets/images/love_monster/emoji/curly_loop.png +0 -0
  231. data/app/assets/images/love_monster/emoji/currency_exchange.png +0 -0
  232. data/app/assets/images/love_monster/emoji/curry.png +0 -0
  233. data/app/assets/images/love_monster/emoji/custard.png +0 -0
  234. data/app/assets/images/love_monster/emoji/customs.png +0 -0
  235. data/app/assets/images/love_monster/emoji/cyclone.png +0 -0
  236. data/app/assets/images/love_monster/emoji/dancer.png +0 -0
  237. data/app/assets/images/love_monster/emoji/dancers.png +0 -0
  238. data/app/assets/images/love_monster/emoji/dango.png +0 -0
  239. data/app/assets/images/love_monster/emoji/dart.png +0 -0
  240. data/app/assets/images/love_monster/emoji/dash.png +0 -0
  241. data/app/assets/images/love_monster/emoji/date.png +0 -0
  242. data/app/assets/images/love_monster/emoji/de.png +0 -0
  243. data/app/assets/images/love_monster/emoji/deciduous_tree.png +0 -0
  244. data/app/assets/images/love_monster/emoji/department_store.png +0 -0
  245. data/app/assets/images/love_monster/emoji/diamond_shape_with_a_dot_inside.png +0 -0
  246. data/app/assets/images/love_monster/emoji/diamonds.png +0 -0
  247. data/app/assets/images/love_monster/emoji/disappointed.png +0 -0
  248. data/app/assets/images/love_monster/emoji/disappointed_relieved.png +0 -0
  249. data/app/assets/images/love_monster/emoji/dizzy.png +0 -0
  250. data/app/assets/images/love_monster/emoji/dizzy_face.png +0 -0
  251. data/app/assets/images/love_monster/emoji/do_not_litter.png +0 -0
  252. data/app/assets/images/love_monster/emoji/dog.png +0 -0
  253. data/app/assets/images/love_monster/emoji/dog2.png +0 -0
  254. data/app/assets/images/love_monster/emoji/dollar.png +0 -0
  255. data/app/assets/images/love_monster/emoji/dolls.png +0 -0
  256. data/app/assets/images/love_monster/emoji/dolphin.png +0 -0
  257. data/app/assets/images/love_monster/emoji/donut.png +0 -0
  258. data/app/assets/images/love_monster/emoji/door.png +0 -0
  259. data/app/assets/images/love_monster/emoji/doughnut.png +0 -0
  260. data/app/assets/images/love_monster/emoji/dragon.png +0 -0
  261. data/app/assets/images/love_monster/emoji/dragon_face.png +0 -0
  262. data/app/assets/images/love_monster/emoji/dress.png +0 -0
  263. data/app/assets/images/love_monster/emoji/dromedary_camel.png +0 -0
  264. data/app/assets/images/love_monster/emoji/droplet.png +0 -0
  265. data/app/assets/images/love_monster/emoji/dvd.png +0 -0
  266. data/app/assets/images/love_monster/emoji/e-mail.png +0 -0
  267. data/app/assets/images/love_monster/emoji/ear.png +0 -0
  268. data/app/assets/images/love_monster/emoji/ear_of_rice.png +0 -0
  269. data/app/assets/images/love_monster/emoji/earth_africa.png +0 -0
  270. data/app/assets/images/love_monster/emoji/earth_americas.png +0 -0
  271. data/app/assets/images/love_monster/emoji/earth_asia.png +0 -0
  272. data/app/assets/images/love_monster/emoji/egg.png +0 -0
  273. data/app/assets/images/love_monster/emoji/eggplant.png +0 -0
  274. data/app/assets/images/love_monster/emoji/eight.png +0 -0
  275. data/app/assets/images/love_monster/emoji/eight_pointed_black_star.png +0 -0
  276. data/app/assets/images/love_monster/emoji/eight_spoked_asterisk.png +0 -0
  277. data/app/assets/images/love_monster/emoji/electric_plug.png +0 -0
  278. data/app/assets/images/love_monster/emoji/elephant.png +0 -0
  279. data/app/assets/images/love_monster/emoji/email.png +0 -0
  280. data/app/assets/images/love_monster/emoji/end.png +0 -0
  281. data/app/assets/images/love_monster/emoji/envelope.png +0 -0
  282. data/app/assets/images/love_monster/emoji/es.png +0 -0
  283. data/app/assets/images/love_monster/emoji/euro.png +0 -0
  284. data/app/assets/images/love_monster/emoji/european_castle.png +0 -0
  285. data/app/assets/images/love_monster/emoji/european_post_office.png +0 -0
  286. data/app/assets/images/love_monster/emoji/evergreen_tree.png +0 -0
  287. data/app/assets/images/love_monster/emoji/exclamation.png +0 -0
  288. data/app/assets/images/love_monster/emoji/expressionless.png +0 -0
  289. data/app/assets/images/love_monster/emoji/eyeglasses.png +0 -0
  290. data/app/assets/images/love_monster/emoji/eyes.png +0 -0
  291. data/app/assets/images/love_monster/emoji/facepunch.png +0 -0
  292. data/app/assets/images/love_monster/emoji/factory.png +0 -0
  293. data/app/assets/images/love_monster/emoji/fallen_leaf.png +0 -0
  294. data/app/assets/images/love_monster/emoji/family.png +0 -0
  295. data/app/assets/images/love_monster/emoji/fast_forward.png +0 -0
  296. data/app/assets/images/love_monster/emoji/fax.png +0 -0
  297. data/app/assets/images/love_monster/emoji/fearful.png +0 -0
  298. data/app/assets/images/love_monster/emoji/feelsgood.png +0 -0
  299. data/app/assets/images/love_monster/emoji/feet.png +0 -0
  300. data/app/assets/images/love_monster/emoji/ferris_wheel.png +0 -0
  301. data/app/assets/images/love_monster/emoji/file_folder.png +0 -0
  302. data/app/assets/images/love_monster/emoji/finnadie.png +0 -0
  303. data/app/assets/images/love_monster/emoji/fire.png +0 -0
  304. data/app/assets/images/love_monster/emoji/fire_engine.png +0 -0
  305. data/app/assets/images/love_monster/emoji/fireworks.png +0 -0
  306. data/app/assets/images/love_monster/emoji/first_quarter_moon.png +0 -0
  307. data/app/assets/images/love_monster/emoji/first_quarter_moon_with_face.png +0 -0
  308. data/app/assets/images/love_monster/emoji/fish.png +0 -0
  309. data/app/assets/images/love_monster/emoji/fish_cake.png +0 -0
  310. data/app/assets/images/love_monster/emoji/fishing_pole_and_fish.png +0 -0
  311. data/app/assets/images/love_monster/emoji/fist.png +0 -0
  312. data/app/assets/images/love_monster/emoji/five.png +0 -0
  313. data/app/assets/images/love_monster/emoji/flags.png +0 -0
  314. data/app/assets/images/love_monster/emoji/flashlight.png +0 -0
  315. data/app/assets/images/love_monster/emoji/floppy_disk.png +0 -0
  316. data/app/assets/images/love_monster/emoji/flower_playing_cards.png +0 -0
  317. data/app/assets/images/love_monster/emoji/flushed.png +0 -0
  318. data/app/assets/images/love_monster/emoji/foggy.png +0 -0
  319. data/app/assets/images/love_monster/emoji/football.png +0 -0
  320. data/app/assets/images/love_monster/emoji/fork_and_knife.png +0 -0
  321. data/app/assets/images/love_monster/emoji/fountain.png +0 -0
  322. data/app/assets/images/love_monster/emoji/four.png +0 -0
  323. data/app/assets/images/love_monster/emoji/four_leaf_clover.png +0 -0
  324. data/app/assets/images/love_monster/emoji/fr.png +0 -0
  325. data/app/assets/images/love_monster/emoji/free.png +0 -0
  326. data/app/assets/images/love_monster/emoji/fried_shrimp.png +0 -0
  327. data/app/assets/images/love_monster/emoji/fries.png +0 -0
  328. data/app/assets/images/love_monster/emoji/frog.png +0 -0
  329. data/app/assets/images/love_monster/emoji/frowning.png +0 -0
  330. data/app/assets/images/love_monster/emoji/fu.png +0 -0
  331. data/app/assets/images/love_monster/emoji/fuelpump.png +0 -0
  332. data/app/assets/images/love_monster/emoji/full_moon.png +0 -0
  333. data/app/assets/images/love_monster/emoji/full_moon_with_face.png +0 -0
  334. data/app/assets/images/love_monster/emoji/game_die.png +0 -0
  335. data/app/assets/images/love_monster/emoji/gb.png +0 -0
  336. data/app/assets/images/love_monster/emoji/gem.png +0 -0
  337. data/app/assets/images/love_monster/emoji/gemini.png +0 -0
  338. data/app/assets/images/love_monster/emoji/ghost.png +0 -0
  339. data/app/assets/images/love_monster/emoji/gift.png +0 -0
  340. data/app/assets/images/love_monster/emoji/gift_heart.png +0 -0
  341. data/app/assets/images/love_monster/emoji/girl.png +0 -0
  342. data/app/assets/images/love_monster/emoji/globe_with_meridians.png +0 -0
  343. data/app/assets/images/love_monster/emoji/goat.png +0 -0
  344. data/app/assets/images/love_monster/emoji/goberserk.png +0 -0
  345. data/app/assets/images/love_monster/emoji/godmode.png +0 -0
  346. data/app/assets/images/love_monster/emoji/golf.png +0 -0
  347. data/app/assets/images/love_monster/emoji/grapes.png +0 -0
  348. data/app/assets/images/love_monster/emoji/green_apple.png +0 -0
  349. data/app/assets/images/love_monster/emoji/green_book.png +0 -0
  350. data/app/assets/images/love_monster/emoji/green_heart.png +0 -0
  351. data/app/assets/images/love_monster/emoji/grey_exclamation.png +0 -0
  352. data/app/assets/images/love_monster/emoji/grey_question.png +0 -0
  353. data/app/assets/images/love_monster/emoji/grimacing.png +0 -0
  354. data/app/assets/images/love_monster/emoji/grin.png +0 -0
  355. data/app/assets/images/love_monster/emoji/grinning.png +0 -0
  356. data/app/assets/images/love_monster/emoji/guardsman.png +0 -0
  357. data/app/assets/images/love_monster/emoji/guitar.png +0 -0
  358. data/app/assets/images/love_monster/emoji/gun.png +0 -0
  359. data/app/assets/images/love_monster/emoji/haircut.png +0 -0
  360. data/app/assets/images/love_monster/emoji/hamburger.png +0 -0
  361. data/app/assets/images/love_monster/emoji/hammer.png +0 -0
  362. data/app/assets/images/love_monster/emoji/hamster.png +0 -0
  363. data/app/assets/images/love_monster/emoji/hand.png +0 -0
  364. data/app/assets/images/love_monster/emoji/handbag.png +0 -0
  365. data/app/assets/images/love_monster/emoji/hankey.png +0 -0
  366. data/app/assets/images/love_monster/emoji/hash.png +0 -0
  367. data/app/assets/images/love_monster/emoji/hatched_chick.png +0 -0
  368. data/app/assets/images/love_monster/emoji/hatching_chick.png +0 -0
  369. data/app/assets/images/love_monster/emoji/headphones.png +0 -0
  370. data/app/assets/images/love_monster/emoji/hear_no_evil.png +0 -0
  371. data/app/assets/images/love_monster/emoji/heart.png +0 -0
  372. data/app/assets/images/love_monster/emoji/heart_decoration.png +0 -0
  373. data/app/assets/images/love_monster/emoji/heart_eyes.png +0 -0
  374. data/app/assets/images/love_monster/emoji/heart_eyes_cat.png +0 -0
  375. data/app/assets/images/love_monster/emoji/heartbeat.png +0 -0
  376. data/app/assets/images/love_monster/emoji/heartpulse.png +0 -0
  377. data/app/assets/images/love_monster/emoji/hearts.png +0 -0
  378. data/app/assets/images/love_monster/emoji/heavy_check_mark.png +0 -0
  379. data/app/assets/images/love_monster/emoji/heavy_division_sign.png +0 -0
  380. data/app/assets/images/love_monster/emoji/heavy_dollar_sign.png +0 -0
  381. data/app/assets/images/love_monster/emoji/heavy_exclamation_mark.png +0 -0
  382. data/app/assets/images/love_monster/emoji/heavy_minus_sign.png +0 -0
  383. data/app/assets/images/love_monster/emoji/heavy_multiplication_x.png +0 -0
  384. data/app/assets/images/love_monster/emoji/heavy_plus_sign.png +0 -0
  385. data/app/assets/images/love_monster/emoji/helicopter.png +0 -0
  386. data/app/assets/images/love_monster/emoji/herb.png +0 -0
  387. data/app/assets/images/love_monster/emoji/hibiscus.png +0 -0
  388. data/app/assets/images/love_monster/emoji/high_brightness.png +0 -0
  389. data/app/assets/images/love_monster/emoji/high_heel.png +0 -0
  390. data/app/assets/images/love_monster/emoji/hocho.png +0 -0
  391. data/app/assets/images/love_monster/emoji/honey_pot.png +0 -0
  392. data/app/assets/images/love_monster/emoji/honeybee.png +0 -0
  393. data/app/assets/images/love_monster/emoji/horse.png +0 -0
  394. data/app/assets/images/love_monster/emoji/horse_racing.png +0 -0
  395. data/app/assets/images/love_monster/emoji/hospital.png +0 -0
  396. data/app/assets/images/love_monster/emoji/hotel.png +0 -0
  397. data/app/assets/images/love_monster/emoji/hotsprings.png +0 -0
  398. data/app/assets/images/love_monster/emoji/hourglass.png +0 -0
  399. data/app/assets/images/love_monster/emoji/hourglass_flowing_sand.png +0 -0
  400. data/app/assets/images/love_monster/emoji/house.png +0 -0
  401. data/app/assets/images/love_monster/emoji/house_with_garden.png +0 -0
  402. data/app/assets/images/love_monster/emoji/hurtrealbad.png +0 -0
  403. data/app/assets/images/love_monster/emoji/hushed.png +0 -0
  404. data/app/assets/images/love_monster/emoji/ice_cream.png +0 -0
  405. data/app/assets/images/love_monster/emoji/icecream.png +0 -0
  406. data/app/assets/images/love_monster/emoji/id.png +0 -0
  407. data/app/assets/images/love_monster/emoji/ideograph_advantage.png +0 -0
  408. data/app/assets/images/love_monster/emoji/imp.png +0 -0
  409. data/app/assets/images/love_monster/emoji/inbox_tray.png +0 -0
  410. data/app/assets/images/love_monster/emoji/incoming_envelope.png +0 -0
  411. data/app/assets/images/love_monster/emoji/information_desk_person.png +0 -0
  412. data/app/assets/images/love_monster/emoji/information_source.png +0 -0
  413. data/app/assets/images/love_monster/emoji/innocent.png +0 -0
  414. data/app/assets/images/love_monster/emoji/interrobang.png +0 -0
  415. data/app/assets/images/love_monster/emoji/iphone.png +0 -0
  416. data/app/assets/images/love_monster/emoji/it.png +0 -0
  417. data/app/assets/images/love_monster/emoji/izakaya_lantern.png +0 -0
  418. data/app/assets/images/love_monster/emoji/jack_o_lantern.png +0 -0
  419. data/app/assets/images/love_monster/emoji/japan.png +0 -0
  420. data/app/assets/images/love_monster/emoji/japanese_castle.png +0 -0
  421. data/app/assets/images/love_monster/emoji/japanese_goblin.png +0 -0
  422. data/app/assets/images/love_monster/emoji/japanese_ogre.png +0 -0
  423. data/app/assets/images/love_monster/emoji/jeans.png +0 -0
  424. data/app/assets/images/love_monster/emoji/joy.png +0 -0
  425. data/app/assets/images/love_monster/emoji/joy_cat.png +0 -0
  426. data/app/assets/images/love_monster/emoji/jp.png +0 -0
  427. data/app/assets/images/love_monster/emoji/key.png +0 -0
  428. data/app/assets/images/love_monster/emoji/keycap_ten.png +0 -0
  429. data/app/assets/images/love_monster/emoji/kimono.png +0 -0
  430. data/app/assets/images/love_monster/emoji/kiss.png +0 -0
  431. data/app/assets/images/love_monster/emoji/kissing.png +0 -0
  432. data/app/assets/images/love_monster/emoji/kissing_cat.png +0 -0
  433. data/app/assets/images/love_monster/emoji/kissing_closed_eyes.png +0 -0
  434. data/app/assets/images/love_monster/emoji/kissing_face.png +0 -0
  435. data/app/assets/images/love_monster/emoji/kissing_heart.png +0 -0
  436. data/app/assets/images/love_monster/emoji/kissing_smiling_eyes.png +0 -0
  437. data/app/assets/images/love_monster/emoji/koala.png +0 -0
  438. data/app/assets/images/love_monster/emoji/koko.png +0 -0
  439. data/app/assets/images/love_monster/emoji/kr.png +0 -0
  440. data/app/assets/images/love_monster/emoji/large_blue_circle.png +0 -0
  441. data/app/assets/images/love_monster/emoji/large_blue_diamond.png +0 -0
  442. data/app/assets/images/love_monster/emoji/large_orange_diamond.png +0 -0
  443. data/app/assets/images/love_monster/emoji/last_quarter_moon.png +0 -0
  444. data/app/assets/images/love_monster/emoji/last_quarter_moon_with_face.png +0 -0
  445. data/app/assets/images/love_monster/emoji/laughing.png +0 -0
  446. data/app/assets/images/love_monster/emoji/leaves.png +0 -0
  447. data/app/assets/images/love_monster/emoji/ledger.png +0 -0
  448. data/app/assets/images/love_monster/emoji/left_luggage.png +0 -0
  449. data/app/assets/images/love_monster/emoji/left_right_arrow.png +0 -0
  450. data/app/assets/images/love_monster/emoji/leftwards_arrow_with_hook.png +0 -0
  451. data/app/assets/images/love_monster/emoji/lemon.png +0 -0
  452. data/app/assets/images/love_monster/emoji/leo.png +0 -0
  453. data/app/assets/images/love_monster/emoji/leopard.png +0 -0
  454. data/app/assets/images/love_monster/emoji/libra.png +0 -0
  455. data/app/assets/images/love_monster/emoji/light_rail.png +0 -0
  456. data/app/assets/images/love_monster/emoji/link.png +0 -0
  457. data/app/assets/images/love_monster/emoji/lips.png +0 -0
  458. data/app/assets/images/love_monster/emoji/lipstick.png +0 -0
  459. data/app/assets/images/love_monster/emoji/lock.png +0 -0
  460. data/app/assets/images/love_monster/emoji/lock_with_ink_pen.png +0 -0
  461. data/app/assets/images/love_monster/emoji/lollipop.png +0 -0
  462. data/app/assets/images/love_monster/emoji/loop.png +0 -0
  463. data/app/assets/images/love_monster/emoji/loudspeaker.png +0 -0
  464. data/app/assets/images/love_monster/emoji/love_hotel.png +0 -0
  465. data/app/assets/images/love_monster/emoji/love_letter.png +0 -0
  466. data/app/assets/images/love_monster/emoji/low_brightness.png +0 -0
  467. data/app/assets/images/love_monster/emoji/m.png +0 -0
  468. data/app/assets/images/love_monster/emoji/mag.png +0 -0
  469. data/app/assets/images/love_monster/emoji/mag_right.png +0 -0
  470. data/app/assets/images/love_monster/emoji/mahjong.png +0 -0
  471. data/app/assets/images/love_monster/emoji/mailbox.png +0 -0
  472. data/app/assets/images/love_monster/emoji/mailbox_closed.png +0 -0
  473. data/app/assets/images/love_monster/emoji/mailbox_with_mail.png +0 -0
  474. data/app/assets/images/love_monster/emoji/mailbox_with_no_mail.png +0 -0
  475. data/app/assets/images/love_monster/emoji/man.png +0 -0
  476. data/app/assets/images/love_monster/emoji/man_with_gua_pi_mao.png +0 -0
  477. data/app/assets/images/love_monster/emoji/man_with_turban.png +0 -0
  478. data/app/assets/images/love_monster/emoji/mans_shoe.png +0 -0
  479. data/app/assets/images/love_monster/emoji/maple_leaf.png +0 -0
  480. data/app/assets/images/love_monster/emoji/mask.png +0 -0
  481. data/app/assets/images/love_monster/emoji/massage.png +0 -0
  482. data/app/assets/images/love_monster/emoji/meat_on_bone.png +0 -0
  483. data/app/assets/images/love_monster/emoji/mega.png +0 -0
  484. data/app/assets/images/love_monster/emoji/melon.png +0 -0
  485. data/app/assets/images/love_monster/emoji/memo.png +0 -0
  486. data/app/assets/images/love_monster/emoji/mens.png +0 -0
  487. data/app/assets/images/love_monster/emoji/metal.png +0 -0
  488. data/app/assets/images/love_monster/emoji/metro.png +0 -0
  489. data/app/assets/images/love_monster/emoji/microphone.png +0 -0
  490. data/app/assets/images/love_monster/emoji/microscope.png +0 -0
  491. data/app/assets/images/love_monster/emoji/milky_way.png +0 -0
  492. data/app/assets/images/love_monster/emoji/minibus.png +0 -0
  493. data/app/assets/images/love_monster/emoji/minidisc.png +0 -0
  494. data/app/assets/images/love_monster/emoji/mobile_phone_off.png +0 -0
  495. data/app/assets/images/love_monster/emoji/money_with_wings.png +0 -0
  496. data/app/assets/images/love_monster/emoji/moneybag.png +0 -0
  497. data/app/assets/images/love_monster/emoji/monkey.png +0 -0
  498. data/app/assets/images/love_monster/emoji/monkey_face.png +0 -0
  499. data/app/assets/images/love_monster/emoji/monorail.png +0 -0
  500. data/app/assets/images/love_monster/emoji/mortar_board.png +0 -0
  501. data/app/assets/images/love_monster/emoji/mount_fuji.png +0 -0
  502. data/app/assets/images/love_monster/emoji/mountain_bicyclist.png +0 -0
  503. data/app/assets/images/love_monster/emoji/mountain_cableway.png +0 -0
  504. data/app/assets/images/love_monster/emoji/mountain_railway.png +0 -0
  505. data/app/assets/images/love_monster/emoji/mouse.png +0 -0
  506. data/app/assets/images/love_monster/emoji/mouse2.png +0 -0
  507. data/app/assets/images/love_monster/emoji/movie_camera.png +0 -0
  508. data/app/assets/images/love_monster/emoji/moyai.png +0 -0
  509. data/app/assets/images/love_monster/emoji/muscle.png +0 -0
  510. data/app/assets/images/love_monster/emoji/mushroom.png +0 -0
  511. data/app/assets/images/love_monster/emoji/musical_keyboard.png +0 -0
  512. data/app/assets/images/love_monster/emoji/musical_note.png +0 -0
  513. data/app/assets/images/love_monster/emoji/musical_score.png +0 -0
  514. data/app/assets/images/love_monster/emoji/mute.png +0 -0
  515. data/app/assets/images/love_monster/emoji/nail_care.png +0 -0
  516. data/app/assets/images/love_monster/emoji/name_badge.png +0 -0
  517. data/app/assets/images/love_monster/emoji/neckbeard.png +0 -0
  518. data/app/assets/images/love_monster/emoji/necktie.png +0 -0
  519. data/app/assets/images/love_monster/emoji/negative_squared_cross_mark.png +0 -0
  520. data/app/assets/images/love_monster/emoji/neutral_face.png +0 -0
  521. data/app/assets/images/love_monster/emoji/new.png +0 -0
  522. data/app/assets/images/love_monster/emoji/new_moon.png +0 -0
  523. data/app/assets/images/love_monster/emoji/new_moon_with_face.png +0 -0
  524. data/app/assets/images/love_monster/emoji/newspaper.png +0 -0
  525. data/app/assets/images/love_monster/emoji/ng.png +0 -0
  526. data/app/assets/images/love_monster/emoji/nine.png +0 -0
  527. data/app/assets/images/love_monster/emoji/no_bell.png +0 -0
  528. data/app/assets/images/love_monster/emoji/no_bicycles.png +0 -0
  529. data/app/assets/images/love_monster/emoji/no_entry.png +0 -0
  530. data/app/assets/images/love_monster/emoji/no_entry_sign.png +0 -0
  531. data/app/assets/images/love_monster/emoji/no_good.png +0 -0
  532. data/app/assets/images/love_monster/emoji/no_mobile_phones.png +0 -0
  533. data/app/assets/images/love_monster/emoji/no_mouth.png +0 -0
  534. data/app/assets/images/love_monster/emoji/no_pedestrians.png +0 -0
  535. data/app/assets/images/love_monster/emoji/no_smoking.png +0 -0
  536. data/app/assets/images/love_monster/emoji/non-potable_water.png +0 -0
  537. data/app/assets/images/love_monster/emoji/nose.png +0 -0
  538. data/app/assets/images/love_monster/emoji/notebook.png +0 -0
  539. data/app/assets/images/love_monster/emoji/notebook_with_decorative_cover.png +0 -0
  540. data/app/assets/images/love_monster/emoji/notes.png +0 -0
  541. data/app/assets/images/love_monster/emoji/nut_and_bolt.png +0 -0
  542. data/app/assets/images/love_monster/emoji/o.png +0 -0
  543. data/app/assets/images/love_monster/emoji/o2.png +0 -0
  544. data/app/assets/images/love_monster/emoji/ocean.png +0 -0
  545. data/app/assets/images/love_monster/emoji/octocat.png +0 -0
  546. data/app/assets/images/love_monster/emoji/octopus.png +0 -0
  547. data/app/assets/images/love_monster/emoji/oden.png +0 -0
  548. data/app/assets/images/love_monster/emoji/office.png +0 -0
  549. data/app/assets/images/love_monster/emoji/ok.png +0 -0
  550. data/app/assets/images/love_monster/emoji/ok_hand.png +0 -0
  551. data/app/assets/images/love_monster/emoji/ok_woman.png +0 -0
  552. data/app/assets/images/love_monster/emoji/older_man.png +0 -0
  553. data/app/assets/images/love_monster/emoji/older_woman.png +0 -0
  554. data/app/assets/images/love_monster/emoji/on.png +0 -0
  555. data/app/assets/images/love_monster/emoji/oncoming_automobile.png +0 -0
  556. data/app/assets/images/love_monster/emoji/oncoming_bus.png +0 -0
  557. data/app/assets/images/love_monster/emoji/oncoming_police_car.png +0 -0
  558. data/app/assets/images/love_monster/emoji/oncoming_taxi.png +0 -0
  559. data/app/assets/images/love_monster/emoji/one.png +0 -0
  560. data/app/assets/images/love_monster/emoji/open_file_folder.png +0 -0
  561. data/app/assets/images/love_monster/emoji/open_hands.png +0 -0
  562. data/app/assets/images/love_monster/emoji/open_mouth.png +0 -0
  563. data/app/assets/images/love_monster/emoji/ophiuchus.png +0 -0
  564. data/app/assets/images/love_monster/emoji/orange_book.png +0 -0
  565. data/app/assets/images/love_monster/emoji/outbox_tray.png +0 -0
  566. data/app/assets/images/love_monster/emoji/ox.png +0 -0
  567. data/app/assets/images/love_monster/emoji/package.png +0 -0
  568. data/app/assets/images/love_monster/emoji/page_facing_up.png +0 -0
  569. data/app/assets/images/love_monster/emoji/page_with_curl.png +0 -0
  570. data/app/assets/images/love_monster/emoji/pager.png +0 -0
  571. data/app/assets/images/love_monster/emoji/palm_tree.png +0 -0
  572. data/app/assets/images/love_monster/emoji/panda_face.png +0 -0
  573. data/app/assets/images/love_monster/emoji/paperclip.png +0 -0
  574. data/app/assets/images/love_monster/emoji/parking.png +0 -0
  575. data/app/assets/images/love_monster/emoji/part_alternation_mark.png +0 -0
  576. data/app/assets/images/love_monster/emoji/partly_sunny.png +0 -0
  577. data/app/assets/images/love_monster/emoji/passport_control.png +0 -0
  578. data/app/assets/images/love_monster/emoji/paw_prints.png +0 -0
  579. data/app/assets/images/love_monster/emoji/peach.png +0 -0
  580. data/app/assets/images/love_monster/emoji/pear.png +0 -0
  581. data/app/assets/images/love_monster/emoji/pencil.png +0 -0
  582. data/app/assets/images/love_monster/emoji/pencil2.png +0 -0
  583. data/app/assets/images/love_monster/emoji/penguin.png +0 -0
  584. data/app/assets/images/love_monster/emoji/pensive.png +0 -0
  585. data/app/assets/images/love_monster/emoji/performing_arts.png +0 -0
  586. data/app/assets/images/love_monster/emoji/persevere.png +0 -0
  587. data/app/assets/images/love_monster/emoji/person_frowning.png +0 -0
  588. data/app/assets/images/love_monster/emoji/person_with_blond_hair.png +0 -0
  589. data/app/assets/images/love_monster/emoji/person_with_pouting_face.png +0 -0
  590. data/app/assets/images/love_monster/emoji/phone.png +0 -0
  591. data/app/assets/images/love_monster/emoji/pig.png +0 -0
  592. data/app/assets/images/love_monster/emoji/pig2.png +0 -0
  593. data/app/assets/images/love_monster/emoji/pig_nose.png +0 -0
  594. data/app/assets/images/love_monster/emoji/pill.png +0 -0
  595. data/app/assets/images/love_monster/emoji/pineapple.png +0 -0
  596. data/app/assets/images/love_monster/emoji/pisces.png +0 -0
  597. data/app/assets/images/love_monster/emoji/pizza.png +0 -0
  598. data/app/assets/images/love_monster/emoji/plus1.png +0 -0
  599. data/app/assets/images/love_monster/emoji/point_down.png +0 -0
  600. data/app/assets/images/love_monster/emoji/point_left.png +0 -0
  601. data/app/assets/images/love_monster/emoji/point_right.png +0 -0
  602. data/app/assets/images/love_monster/emoji/point_up.png +0 -0
  603. data/app/assets/images/love_monster/emoji/point_up_2.png +0 -0
  604. data/app/assets/images/love_monster/emoji/police_car.png +0 -0
  605. data/app/assets/images/love_monster/emoji/poodle.png +0 -0
  606. data/app/assets/images/love_monster/emoji/poop.png +0 -0
  607. data/app/assets/images/love_monster/emoji/post_office.png +0 -0
  608. data/app/assets/images/love_monster/emoji/postal_horn.png +0 -0
  609. data/app/assets/images/love_monster/emoji/postbox.png +0 -0
  610. data/app/assets/images/love_monster/emoji/potable_water.png +0 -0
  611. data/app/assets/images/love_monster/emoji/pouch.png +0 -0
  612. data/app/assets/images/love_monster/emoji/poultry_leg.png +0 -0
  613. data/app/assets/images/love_monster/emoji/pound.png +0 -0
  614. data/app/assets/images/love_monster/emoji/pouting_cat.png +0 -0
  615. data/app/assets/images/love_monster/emoji/pray.png +0 -0
  616. data/app/assets/images/love_monster/emoji/princess.png +0 -0
  617. data/app/assets/images/love_monster/emoji/punch.png +0 -0
  618. data/app/assets/images/love_monster/emoji/purple_heart.png +0 -0
  619. data/app/assets/images/love_monster/emoji/purse.png +0 -0
  620. data/app/assets/images/love_monster/emoji/pushpin.png +0 -0
  621. data/app/assets/images/love_monster/emoji/put_litter_in_its_place.png +0 -0
  622. data/app/assets/images/love_monster/emoji/question.png +0 -0
  623. data/app/assets/images/love_monster/emoji/rabbit.png +0 -0
  624. data/app/assets/images/love_monster/emoji/rabbit2.png +0 -0
  625. data/app/assets/images/love_monster/emoji/racehorse.png +0 -0
  626. data/app/assets/images/love_monster/emoji/radio.png +0 -0
  627. data/app/assets/images/love_monster/emoji/radio_button.png +0 -0
  628. data/app/assets/images/love_monster/emoji/rage.png +0 -0
  629. data/app/assets/images/love_monster/emoji/rage1.png +0 -0
  630. data/app/assets/images/love_monster/emoji/rage2.png +0 -0
  631. data/app/assets/images/love_monster/emoji/rage3.png +0 -0
  632. data/app/assets/images/love_monster/emoji/rage4.png +0 -0
  633. data/app/assets/images/love_monster/emoji/railway_car.png +0 -0
  634. data/app/assets/images/love_monster/emoji/rainbow.png +0 -0
  635. data/app/assets/images/love_monster/emoji/raised_hand.png +0 -0
  636. data/app/assets/images/love_monster/emoji/raised_hands.png +0 -0
  637. data/app/assets/images/love_monster/emoji/raising_hand.png +0 -0
  638. data/app/assets/images/love_monster/emoji/ram.png +0 -0
  639. data/app/assets/images/love_monster/emoji/ramen.png +0 -0
  640. data/app/assets/images/love_monster/emoji/rat.png +0 -0
  641. data/app/assets/images/love_monster/emoji/recycle.png +0 -0
  642. data/app/assets/images/love_monster/emoji/red_car.png +0 -0
  643. data/app/assets/images/love_monster/emoji/red_circle.png +0 -0
  644. data/app/assets/images/love_monster/emoji/registered.png +0 -0
  645. data/app/assets/images/love_monster/emoji/relaxed.png +0 -0
  646. data/app/assets/images/love_monster/emoji/relieved.png +0 -0
  647. data/app/assets/images/love_monster/emoji/repeat.png +0 -0
  648. data/app/assets/images/love_monster/emoji/repeat_one.png +0 -0
  649. data/app/assets/images/love_monster/emoji/restroom.png +0 -0
  650. data/app/assets/images/love_monster/emoji/revolving_hearts.png +0 -0
  651. data/app/assets/images/love_monster/emoji/rewind.png +0 -0
  652. data/app/assets/images/love_monster/emoji/ribbon.png +0 -0
  653. data/app/assets/images/love_monster/emoji/rice.png +0 -0
  654. data/app/assets/images/love_monster/emoji/rice_ball.png +0 -0
  655. data/app/assets/images/love_monster/emoji/rice_cracker.png +0 -0
  656. data/app/assets/images/love_monster/emoji/rice_scene.png +0 -0
  657. data/app/assets/images/love_monster/emoji/ring.png +0 -0
  658. data/app/assets/images/love_monster/emoji/rocket.png +0 -0
  659. data/app/assets/images/love_monster/emoji/roller_coaster.png +0 -0
  660. data/app/assets/images/love_monster/emoji/rooster.png +0 -0
  661. data/app/assets/images/love_monster/emoji/rose.png +0 -0
  662. data/app/assets/images/love_monster/emoji/rotating_light.png +0 -0
  663. data/app/assets/images/love_monster/emoji/round_pushpin.png +0 -0
  664. data/app/assets/images/love_monster/emoji/rowboat.png +0 -0
  665. data/app/assets/images/love_monster/emoji/ru.png +0 -0
  666. data/app/assets/images/love_monster/emoji/rugby_football.png +0 -0
  667. data/app/assets/images/love_monster/emoji/runner.png +0 -0
  668. data/app/assets/images/love_monster/emoji/running.png +0 -0
  669. data/app/assets/images/love_monster/emoji/running_shirt_with_sash.png +0 -0
  670. data/app/assets/images/love_monster/emoji/sa.png +0 -0
  671. data/app/assets/images/love_monster/emoji/sagittarius.png +0 -0
  672. data/app/assets/images/love_monster/emoji/sailboat.png +0 -0
  673. data/app/assets/images/love_monster/emoji/sake.png +0 -0
  674. data/app/assets/images/love_monster/emoji/sandal.png +0 -0
  675. data/app/assets/images/love_monster/emoji/santa.png +0 -0
  676. data/app/assets/images/love_monster/emoji/satellite.png +0 -0
  677. data/app/assets/images/love_monster/emoji/satisfied.png +0 -0
  678. data/app/assets/images/love_monster/emoji/saxophone.png +0 -0
  679. data/app/assets/images/love_monster/emoji/school.png +0 -0
  680. data/app/assets/images/love_monster/emoji/school_satchel.png +0 -0
  681. data/app/assets/images/love_monster/emoji/scissors.png +0 -0
  682. data/app/assets/images/love_monster/emoji/scorpius.png +0 -0
  683. data/app/assets/images/love_monster/emoji/scream.png +0 -0
  684. data/app/assets/images/love_monster/emoji/scream_cat.png +0 -0
  685. data/app/assets/images/love_monster/emoji/scroll.png +0 -0
  686. data/app/assets/images/love_monster/emoji/seat.png +0 -0
  687. data/app/assets/images/love_monster/emoji/secret.png +0 -0
  688. data/app/assets/images/love_monster/emoji/see_no_evil.png +0 -0
  689. data/app/assets/images/love_monster/emoji/seedling.png +0 -0
  690. data/app/assets/images/love_monster/emoji/seven.png +0 -0
  691. data/app/assets/images/love_monster/emoji/shaved_ice.png +0 -0
  692. data/app/assets/images/love_monster/emoji/sheep.png +0 -0
  693. data/app/assets/images/love_monster/emoji/shell.png +0 -0
  694. data/app/assets/images/love_monster/emoji/ship.png +0 -0
  695. data/app/assets/images/love_monster/emoji/shipit.png +0 -0
  696. data/app/assets/images/love_monster/emoji/shirt.png +0 -0
  697. data/app/assets/images/love_monster/emoji/shit.png +0 -0
  698. data/app/assets/images/love_monster/emoji/shoe.png +0 -0
  699. data/app/assets/images/love_monster/emoji/shower.png +0 -0
  700. data/app/assets/images/love_monster/emoji/signal_strength.png +0 -0
  701. data/app/assets/images/love_monster/emoji/six.png +0 -0
  702. data/app/assets/images/love_monster/emoji/six_pointed_star.png +0 -0
  703. data/app/assets/images/love_monster/emoji/ski.png +0 -0
  704. data/app/assets/images/love_monster/emoji/skull.png +0 -0
  705. data/app/assets/images/love_monster/emoji/sleeping.png +0 -0
  706. data/app/assets/images/love_monster/emoji/sleepy.png +0 -0
  707. data/app/assets/images/love_monster/emoji/slot_machine.png +0 -0
  708. data/app/assets/images/love_monster/emoji/small_blue_diamond.png +0 -0
  709. data/app/assets/images/love_monster/emoji/small_orange_diamond.png +0 -0
  710. data/app/assets/images/love_monster/emoji/small_red_triangle.png +0 -0
  711. data/app/assets/images/love_monster/emoji/small_red_triangle_down.png +0 -0
  712. data/app/assets/images/love_monster/emoji/smile.png +0 -0
  713. data/app/assets/images/love_monster/emoji/smile_cat.png +0 -0
  714. data/app/assets/images/love_monster/emoji/smiley.png +0 -0
  715. data/app/assets/images/love_monster/emoji/smiley_cat.png +0 -0
  716. data/app/assets/images/love_monster/emoji/smiling_imp.png +0 -0
  717. data/app/assets/images/love_monster/emoji/smirk.png +0 -0
  718. data/app/assets/images/love_monster/emoji/smirk_cat.png +0 -0
  719. data/app/assets/images/love_monster/emoji/smoking.png +0 -0
  720. data/app/assets/images/love_monster/emoji/snail.png +0 -0
  721. data/app/assets/images/love_monster/emoji/snake.png +0 -0
  722. data/app/assets/images/love_monster/emoji/snowboarder.png +0 -0
  723. data/app/assets/images/love_monster/emoji/snowflake.png +0 -0
  724. data/app/assets/images/love_monster/emoji/snowman.png +0 -0
  725. data/app/assets/images/love_monster/emoji/sob.png +0 -0
  726. data/app/assets/images/love_monster/emoji/soccer.png +0 -0
  727. data/app/assets/images/love_monster/emoji/soon.png +0 -0
  728. data/app/assets/images/love_monster/emoji/sos.png +0 -0
  729. data/app/assets/images/love_monster/emoji/sound.png +0 -0
  730. data/app/assets/images/love_monster/emoji/space_invader.png +0 -0
  731. data/app/assets/images/love_monster/emoji/spades.png +0 -0
  732. data/app/assets/images/love_monster/emoji/spaghetti.png +0 -0
  733. data/app/assets/images/love_monster/emoji/sparkle.png +0 -0
  734. data/app/assets/images/love_monster/emoji/sparkler.png +0 -0
  735. data/app/assets/images/love_monster/emoji/sparkles.png +0 -0
  736. data/app/assets/images/love_monster/emoji/sparkling_heart.png +0 -0
  737. data/app/assets/images/love_monster/emoji/speak_no_evil.png +0 -0
  738. data/app/assets/images/love_monster/emoji/speaker.png +0 -0
  739. data/app/assets/images/love_monster/emoji/speech_balloon.png +0 -0
  740. data/app/assets/images/love_monster/emoji/speedboat.png +0 -0
  741. data/app/assets/images/love_monster/emoji/squirrel.png +0 -0
  742. data/app/assets/images/love_monster/emoji/star.png +0 -0
  743. data/app/assets/images/love_monster/emoji/star2.png +0 -0
  744. data/app/assets/images/love_monster/emoji/stars.png +0 -0
  745. data/app/assets/images/love_monster/emoji/station.png +0 -0
  746. data/app/assets/images/love_monster/emoji/statue_of_liberty.png +0 -0
  747. data/app/assets/images/love_monster/emoji/steam_locomotive.png +0 -0
  748. data/app/assets/images/love_monster/emoji/stew.png +0 -0
  749. data/app/assets/images/love_monster/emoji/straight_ruler.png +0 -0
  750. data/app/assets/images/love_monster/emoji/strawberry.png +0 -0
  751. data/app/assets/images/love_monster/emoji/stuck_out_tongue.png +0 -0
  752. data/app/assets/images/love_monster/emoji/stuck_out_tongue_closed_eyes.png +0 -0
  753. data/app/assets/images/love_monster/emoji/stuck_out_tongue_winking_eye.png +0 -0
  754. data/app/assets/images/love_monster/emoji/sun_with_face.png +0 -0
  755. data/app/assets/images/love_monster/emoji/sunflower.png +0 -0
  756. data/app/assets/images/love_monster/emoji/sunglasses.png +0 -0
  757. data/app/assets/images/love_monster/emoji/sunny.png +0 -0
  758. data/app/assets/images/love_monster/emoji/sunrise.png +0 -0
  759. data/app/assets/images/love_monster/emoji/sunrise_over_mountains.png +0 -0
  760. data/app/assets/images/love_monster/emoji/surfer.png +0 -0
  761. data/app/assets/images/love_monster/emoji/sushi.png +0 -0
  762. data/app/assets/images/love_monster/emoji/suspect.png +0 -0
  763. data/app/assets/images/love_monster/emoji/suspension_railway.png +0 -0
  764. data/app/assets/images/love_monster/emoji/sweat.png +0 -0
  765. data/app/assets/images/love_monster/emoji/sweat_drops.png +0 -0
  766. data/app/assets/images/love_monster/emoji/sweat_smile.png +0 -0
  767. data/app/assets/images/love_monster/emoji/sweet_potato.png +0 -0
  768. data/app/assets/images/love_monster/emoji/swimmer.png +0 -0
  769. data/app/assets/images/love_monster/emoji/symbols.png +0 -0
  770. data/app/assets/images/love_monster/emoji/syringe.png +0 -0
  771. data/app/assets/images/love_monster/emoji/tada.png +0 -0
  772. data/app/assets/images/love_monster/emoji/tanabata_tree.png +0 -0
  773. data/app/assets/images/love_monster/emoji/tangerine.png +0 -0
  774. data/app/assets/images/love_monster/emoji/taurus.png +0 -0
  775. data/app/assets/images/love_monster/emoji/taxi.png +0 -0
  776. data/app/assets/images/love_monster/emoji/tea.png +0 -0
  777. data/app/assets/images/love_monster/emoji/telephone.png +0 -0
  778. data/app/assets/images/love_monster/emoji/telephone_receiver.png +0 -0
  779. data/app/assets/images/love_monster/emoji/telescope.png +0 -0
  780. data/app/assets/images/love_monster/emoji/tennis.png +0 -0
  781. data/app/assets/images/love_monster/emoji/tent.png +0 -0
  782. data/app/assets/images/love_monster/emoji/thought_balloon.png +0 -0
  783. data/app/assets/images/love_monster/emoji/three.png +0 -0
  784. data/app/assets/images/love_monster/emoji/thumbsdown.png +0 -0
  785. data/app/assets/images/love_monster/emoji/thumbsup.png +0 -0
  786. data/app/assets/images/love_monster/emoji/ticket.png +0 -0
  787. data/app/assets/images/love_monster/emoji/tiger.png +0 -0
  788. data/app/assets/images/love_monster/emoji/tiger2.png +0 -0
  789. data/app/assets/images/love_monster/emoji/tired_face.png +0 -0
  790. data/app/assets/images/love_monster/emoji/tm.png +0 -0
  791. data/app/assets/images/love_monster/emoji/toilet.png +0 -0
  792. data/app/assets/images/love_monster/emoji/tokyo_tower.png +0 -0
  793. data/app/assets/images/love_monster/emoji/tomato.png +0 -0
  794. data/app/assets/images/love_monster/emoji/tongue.png +0 -0
  795. data/app/assets/images/love_monster/emoji/top.png +0 -0
  796. data/app/assets/images/love_monster/emoji/tophat.png +0 -0
  797. data/app/assets/images/love_monster/emoji/tractor.png +0 -0
  798. data/app/assets/images/love_monster/emoji/traffic_light.png +0 -0
  799. data/app/assets/images/love_monster/emoji/train.png +0 -0
  800. data/app/assets/images/love_monster/emoji/train2.png +0 -0
  801. data/app/assets/images/love_monster/emoji/tram.png +0 -0
  802. data/app/assets/images/love_monster/emoji/triangular_flag_on_post.png +0 -0
  803. data/app/assets/images/love_monster/emoji/triangular_ruler.png +0 -0
  804. data/app/assets/images/love_monster/emoji/trident.png +0 -0
  805. data/app/assets/images/love_monster/emoji/triumph.png +0 -0
  806. data/app/assets/images/love_monster/emoji/trolleybus.png +0 -0
  807. data/app/assets/images/love_monster/emoji/trollface.png +0 -0
  808. data/app/assets/images/love_monster/emoji/trophy.png +0 -0
  809. data/app/assets/images/love_monster/emoji/tropical_drink.png +0 -0
  810. data/app/assets/images/love_monster/emoji/tropical_fish.png +0 -0
  811. data/app/assets/images/love_monster/emoji/truck.png +0 -0
  812. data/app/assets/images/love_monster/emoji/trumpet.png +0 -0
  813. data/app/assets/images/love_monster/emoji/tshirt.png +0 -0
  814. data/app/assets/images/love_monster/emoji/tulip.png +0 -0
  815. data/app/assets/images/love_monster/emoji/turtle.png +0 -0
  816. data/app/assets/images/love_monster/emoji/tv.png +0 -0
  817. data/app/assets/images/love_monster/emoji/twisted_rightwards_arrows.png +0 -0
  818. data/app/assets/images/love_monster/emoji/two.png +0 -0
  819. data/app/assets/images/love_monster/emoji/two_hearts.png +0 -0
  820. data/app/assets/images/love_monster/emoji/two_men_holding_hands.png +0 -0
  821. data/app/assets/images/love_monster/emoji/two_women_holding_hands.png +0 -0
  822. data/app/assets/images/love_monster/emoji/u5272.png +0 -0
  823. data/app/assets/images/love_monster/emoji/u5408.png +0 -0
  824. data/app/assets/images/love_monster/emoji/u55b6.png +0 -0
  825. data/app/assets/images/love_monster/emoji/u6307.png +0 -0
  826. data/app/assets/images/love_monster/emoji/u6708.png +0 -0
  827. data/app/assets/images/love_monster/emoji/u6709.png +0 -0
  828. data/app/assets/images/love_monster/emoji/u6e80.png +0 -0
  829. data/app/assets/images/love_monster/emoji/u7121.png +0 -0
  830. data/app/assets/images/love_monster/emoji/u7533.png +0 -0
  831. data/app/assets/images/love_monster/emoji/u7981.png +0 -0
  832. data/app/assets/images/love_monster/emoji/u7a7a.png +0 -0
  833. data/app/assets/images/love_monster/emoji/uk.png +0 -0
  834. data/app/assets/images/love_monster/emoji/umbrella.png +0 -0
  835. data/app/assets/images/love_monster/emoji/unamused.png +0 -0
  836. data/app/assets/images/love_monster/emoji/underage.png +0 -0
  837. data/app/assets/images/love_monster/emoji/unlock.png +0 -0
  838. data/app/assets/images/love_monster/emoji/up.png +0 -0
  839. data/app/assets/images/love_monster/emoji/us.png +0 -0
  840. data/app/assets/images/love_monster/emoji/v.png +0 -0
  841. data/app/assets/images/love_monster/emoji/vertical_traffic_light.png +0 -0
  842. data/app/assets/images/love_monster/emoji/vhs.png +0 -0
  843. data/app/assets/images/love_monster/emoji/vibration_mode.png +0 -0
  844. data/app/assets/images/love_monster/emoji/video_camera.png +0 -0
  845. data/app/assets/images/love_monster/emoji/video_game.png +0 -0
  846. data/app/assets/images/love_monster/emoji/violin.png +0 -0
  847. data/app/assets/images/love_monster/emoji/virgo.png +0 -0
  848. data/app/assets/images/love_monster/emoji/volcano.png +0 -0
  849. data/app/assets/images/love_monster/emoji/vs.png +0 -0
  850. data/app/assets/images/love_monster/emoji/walking.png +0 -0
  851. data/app/assets/images/love_monster/emoji/waning_crescent_moon.png +0 -0
  852. data/app/assets/images/love_monster/emoji/waning_gibbous_moon.png +0 -0
  853. data/app/assets/images/love_monster/emoji/warning.png +0 -0
  854. data/app/assets/images/love_monster/emoji/watch.png +0 -0
  855. data/app/assets/images/love_monster/emoji/water_buffalo.png +0 -0
  856. data/app/assets/images/love_monster/emoji/watermelon.png +0 -0
  857. data/app/assets/images/love_monster/emoji/wave.png +0 -0
  858. data/app/assets/images/love_monster/emoji/wavy_dash.png +0 -0
  859. data/app/assets/images/love_monster/emoji/waxing_crescent_moon.png +0 -0
  860. data/app/assets/images/love_monster/emoji/waxing_gibbous_moon.png +0 -0
  861. data/app/assets/images/love_monster/emoji/wc.png +0 -0
  862. data/app/assets/images/love_monster/emoji/weary.png +0 -0
  863. data/app/assets/images/love_monster/emoji/wedding.png +0 -0
  864. data/app/assets/images/love_monster/emoji/whale.png +0 -0
  865. data/app/assets/images/love_monster/emoji/whale2.png +0 -0
  866. data/app/assets/images/love_monster/emoji/wheelchair.png +0 -0
  867. data/app/assets/images/love_monster/emoji/white_check_mark.png +0 -0
  868. data/app/assets/images/love_monster/emoji/white_circle.png +0 -0
  869. data/app/assets/images/love_monster/emoji/white_flower.png +0 -0
  870. data/app/assets/images/love_monster/emoji/white_large_square.png +0 -0
  871. data/app/assets/images/love_monster/emoji/white_medium_small_square.png +0 -0
  872. data/app/assets/images/love_monster/emoji/white_medium_square.png +0 -0
  873. data/app/assets/images/love_monster/emoji/white_small_square.png +0 -0
  874. data/app/assets/images/love_monster/emoji/white_square_button.png +0 -0
  875. data/app/assets/images/love_monster/emoji/wind_chime.png +0 -0
  876. data/app/assets/images/love_monster/emoji/wine_glass.png +0 -0
  877. data/app/assets/images/love_monster/emoji/wink.png +0 -0
  878. data/app/assets/images/love_monster/emoji/wolf.png +0 -0
  879. data/app/assets/images/love_monster/emoji/woman.png +0 -0
  880. data/app/assets/images/love_monster/emoji/womans_clothes.png +0 -0
  881. data/app/assets/images/love_monster/emoji/womans_hat.png +0 -0
  882. data/app/assets/images/love_monster/emoji/womens.png +0 -0
  883. data/app/assets/images/love_monster/emoji/worried.png +0 -0
  884. data/app/assets/images/love_monster/emoji/wrench.png +0 -0
  885. data/app/assets/images/love_monster/emoji/x.png +0 -0
  886. data/app/assets/images/love_monster/emoji/yellow_heart.png +0 -0
  887. data/app/assets/images/love_monster/emoji/yen.png +0 -0
  888. data/app/assets/images/love_monster/emoji/yum.png +0 -0
  889. data/app/assets/images/love_monster/emoji/zap.png +0 -0
  890. data/app/assets/images/love_monster/emoji/zero.png +0 -0
  891. data/app/assets/images/love_monster/emoji/zzz.png +0 -0
  892. data/app/assets/javascripts/love_monster/application.js +17 -0
  893. data/app/assets/javascripts/love_monster/bootstrap.js +2363 -0
  894. data/app/assets/javascripts/love_monster/chosen.js +1257 -0
  895. data/app/assets/javascripts/love_monster/emojify.js +378 -0
  896. data/app/assets/javascripts/love_monster/emojis.js +166 -0
  897. data/app/assets/javascripts/love_monster/jquery.js +9210 -0
  898. data/app/assets/javascripts/love_monster/loves.js +56 -0
  899. data/app/assets/javascripts/love_monster/textcomplete.js +1215 -0
  900. data/app/assets/stylesheets/love_monster/application.css +23 -0
  901. data/app/assets/stylesheets/love_monster/bootstrap-chosen.css +346 -0
  902. data/app/assets/stylesheets/love_monster/bootstrap-theme.css +587 -0
  903. data/app/assets/stylesheets/love_monster/bootstrap.css.erb +6800 -0
  904. data/app/assets/stylesheets/love_monster/emojify.css +7 -0
  905. data/app/assets/stylesheets/love_monster/loves.css +4 -0
  906. data/app/assets/stylesheets/love_monster/textcomplete.css +33 -0
  907. data/app/assets/stylesheets/scaffold.css +56 -0
  908. data/app/controllers/love_monster/api/v1/people_controller.rb +7 -0
  909. data/app/controllers/love_monster/application_controller.rb +5 -0
  910. data/app/controllers/love_monster/likes_controller.rb +24 -0
  911. data/app/controllers/love_monster/loves_controller.rb +43 -0
  912. data/app/controllers/love_monster/people_controller.rb +13 -0
  913. data/app/helpers/love_monster/application_helper.rb +4 -0
  914. data/app/helpers/love_monster/loves_helper.rb +13 -0
  915. data/app/models/love_monster/like.rb +13 -0
  916. data/app/models/love_monster/love.rb +17 -0
  917. data/app/models/love_monster/person.rb +19 -0
  918. data/app/views/kaminari/_first_page.html.erb +3 -0
  919. data/app/views/kaminari/_gap.html.erb +3 -0
  920. data/app/views/kaminari/_last_page.html.erb +3 -0
  921. data/app/views/kaminari/_next_page.html.erb +3 -0
  922. data/app/views/kaminari/_page.html.erb +9 -0
  923. data/app/views/kaminari/_paginator.html.erb +15 -0
  924. data/app/views/kaminari/_prev_page.html.erb +3 -0
  925. data/app/views/love_monster/loves/_form.html.erb +37 -0
  926. data/app/views/love_monster/loves/_like_button.html.erb +3 -0
  927. data/app/views/love_monster/loves/_table.html.erb +24 -0
  928. data/app/views/love_monster/loves/index.html.erb +21 -0
  929. data/app/views/love_monster/people/show.html.erb +25 -0
  930. data/config/routes.rb +14 -0
  931. data/db/migrate/20150722155657_create_love_monster_people.rb +12 -0
  932. data/db/migrate/20150722155658_create_love_monster_loves.rb +13 -0
  933. data/db/migrate/20150724145323_create_love_monster_likes.rb +10 -0
  934. data/lib/love_monster/engine.rb +19 -0
  935. data/lib/love_monster/version.rb +3 -0
  936. data/lib/love_monster.rb +4 -0
  937. data/lib/tasks/love_tasks.rake +4 -0
  938. data/test/controllers/love_monster/loves_controller_test.rb +24 -0
  939. data/test/dummy/README.rdoc +28 -0
  940. data/test/dummy/Rakefile +6 -0
  941. data/test/dummy/app/assets/javascripts/application.js +13 -0
  942. data/test/dummy/app/assets/stylesheets/application.css +15 -0
  943. data/test/dummy/app/controllers/application_controller.rb +5 -0
  944. data/test/dummy/app/helpers/application_helper.rb +2 -0
  945. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  946. data/test/dummy/bin/bundle +3 -0
  947. data/test/dummy/bin/rails +4 -0
  948. data/test/dummy/bin/rake +4 -0
  949. data/test/dummy/bin/setup +29 -0
  950. data/test/dummy/config/application.rb +26 -0
  951. data/test/dummy/config/boot.rb +5 -0
  952. data/test/dummy/config/database.yml +25 -0
  953. data/test/dummy/config/environment.rb +5 -0
  954. data/test/dummy/config/environments/development.rb +41 -0
  955. data/test/dummy/config/environments/production.rb +79 -0
  956. data/test/dummy/config/environments/test.rb +42 -0
  957. data/test/dummy/config/initializers/assets.rb +11 -0
  958. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  959. data/test/dummy/config/initializers/cookies_serializer.rb +3 -0
  960. data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  961. data/test/dummy/config/initializers/inflections.rb +16 -0
  962. data/test/dummy/config/initializers/mime_types.rb +4 -0
  963. data/test/dummy/config/initializers/session_store.rb +3 -0
  964. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  965. data/test/dummy/config/locales/en.yml +23 -0
  966. data/test/dummy/config/routes.rb +4 -0
  967. data/test/dummy/config/secrets.yml +22 -0
  968. data/test/dummy/config.ru +4 -0
  969. data/test/dummy/db/schema.rb +33 -0
  970. data/test/dummy/db/test.sqlite3 +0 -0
  971. data/test/dummy/log/test.log +8 -0
  972. data/test/dummy/public/404.html +67 -0
  973. data/test/dummy/public/422.html +67 -0
  974. data/test/dummy/public/500.html +66 -0
  975. data/test/dummy/public/favicon.ico +0 -0
  976. data/test/fixtures/love_monster/likes.yml +11 -0
  977. data/test/fixtures/love_monster/love.yml +15 -0
  978. data/test/fixtures/love_monster/users.yml +13 -0
  979. data/test/integration/navigation_test.rb +10 -0
  980. data/test/love_monster_test.rb +7 -0
  981. data/test/models/love_monster/like_test.rb +9 -0
  982. data/test/models/love_monster/love_test.rb +9 -0
  983. data/test/models/love_monster/user_test.rb +9 -0
  984. data/test/test_helper.rb +20 -0
  985. metadata +1122 -0
@@ -0,0 +1,1215 @@
1
+ (function (factory) {
2
+ if (typeof define === 'function' && define.amd) {
3
+ // AMD. Register as an anonymous module.
4
+ define(['jquery'], factory);
5
+ } else if (typeof module === "object" && module.exports) {
6
+ var $ = require('jquery');
7
+ module.exports = factory($);
8
+ } else {
9
+ // Browser globals
10
+ factory(jQuery);
11
+ }
12
+ }(function (jQuery) {
13
+
14
+ /*!
15
+ * jQuery.textcomplete
16
+ *
17
+ * Repository: https://github.com/yuku-t/jquery-textcomplete
18
+ * License: MIT (https://github.com/yuku-t/jquery-textcomplete/blob/master/LICENSE)
19
+ * Author: Yuku Takahashi
20
+ */
21
+
22
+ if (typeof jQuery === 'undefined') {
23
+ throw new Error('jQuery.textcomplete requires jQuery');
24
+ }
25
+
26
+ +function ($) {
27
+ 'use strict';
28
+
29
+ var warn = function (message) {
30
+ if (console.warn) { console.warn(message); }
31
+ };
32
+
33
+ var id = 1;
34
+
35
+ $.fn.textcomplete = function (strategies, option) {
36
+ var args = Array.prototype.slice.call(arguments);
37
+ return this.each(function () {
38
+ var $this = $(this);
39
+ var completer = $this.data('textComplete');
40
+ if (!completer) {
41
+ option || (option = {});
42
+ option._oid = id++; // unique object id
43
+ completer = new $.fn.textcomplete.Completer(this, option);
44
+ $this.data('textComplete', completer);
45
+ }
46
+ if (typeof strategies === 'string') {
47
+ if (!completer) return;
48
+ args.shift()
49
+ completer[strategies].apply(completer, args);
50
+ if (strategies === 'destroy') {
51
+ $this.removeData('textComplete');
52
+ }
53
+ } else {
54
+ // For backward compatibility.
55
+ // TODO: Remove at v0.4
56
+ $.each(strategies, function (obj) {
57
+ $.each(['header', 'footer', 'placement', 'maxCount'], function (name) {
58
+ if (obj[name]) {
59
+ completer.option[name] = obj[name];
60
+ warn(name + 'as a strategy param is deprecated. Use option.');
61
+ delete obj[name];
62
+ }
63
+ });
64
+ });
65
+ completer.register($.fn.textcomplete.Strategy.parse(strategies));
66
+ }
67
+ });
68
+ };
69
+
70
+ }(jQuery);
71
+
72
+ +function ($) {
73
+ 'use strict';
74
+
75
+ // Exclusive execution control utility.
76
+ //
77
+ // func - The function to be locked. It is executed with a function named
78
+ // `free` as the first argument. Once it is called, additional
79
+ // execution are ignored until the free is invoked. Then the last
80
+ // ignored execution will be replayed immediately.
81
+ //
82
+ // Examples
83
+ //
84
+ // var lockedFunc = lock(function (free) {
85
+ // setTimeout(function { free(); }, 1000); // It will be free in 1 sec.
86
+ // console.log('Hello, world');
87
+ // });
88
+ // lockedFunc(); // => 'Hello, world'
89
+ // lockedFunc(); // none
90
+ // lockedFunc(); // none
91
+ // // 1 sec past then
92
+ // // => 'Hello, world'
93
+ // lockedFunc(); // => 'Hello, world'
94
+ // lockedFunc(); // none
95
+ //
96
+ // Returns a wrapped function.
97
+ var lock = function (func) {
98
+ var locked, queuedArgsToReplay;
99
+
100
+ return function () {
101
+ // Convert arguments into a real array.
102
+ var args = Array.prototype.slice.call(arguments);
103
+ if (locked) {
104
+ // Keep a copy of this argument list to replay later.
105
+ // OK to overwrite a previous value because we only replay
106
+ // the last one.
107
+ queuedArgsToReplay = args;
108
+ return;
109
+ }
110
+ locked = true;
111
+ var self = this;
112
+ args.unshift(function replayOrFree() {
113
+ if (queuedArgsToReplay) {
114
+ // Other request(s) arrived while we were locked.
115
+ // Now that the lock is becoming available, replay
116
+ // the latest such request, then call back here to
117
+ // unlock (or replay another request that arrived
118
+ // while this one was in flight).
119
+ var replayArgs = queuedArgsToReplay;
120
+ queuedArgsToReplay = undefined;
121
+ replayArgs.unshift(replayOrFree);
122
+ func.apply(self, replayArgs);
123
+ } else {
124
+ locked = false;
125
+ }
126
+ });
127
+ func.apply(this, args);
128
+ };
129
+ };
130
+
131
+ var isString = function (obj) {
132
+ return Object.prototype.toString.call(obj) === '[object String]';
133
+ };
134
+
135
+ var isFunction = function (obj) {
136
+ return Object.prototype.toString.call(obj) === '[object Function]';
137
+ };
138
+
139
+ var uniqueId = 0;
140
+
141
+ function Completer(element, option) {
142
+ this.$el = $(element);
143
+ this.id = 'textcomplete' + uniqueId++;
144
+ this.strategies = [];
145
+ this.views = [];
146
+ this.option = $.extend({}, Completer._getDefaults(), option);
147
+
148
+ if (!this.$el.is('input[type=text]') && !this.$el.is('textarea') && !element.isContentEditable && element.contentEditable != 'true') {
149
+ throw new Error('textcomplete must be called on a Textarea or a ContentEditable.');
150
+ }
151
+
152
+ if (element === document.activeElement) {
153
+ // element has already been focused. Initialize view objects immediately.
154
+ this.initialize()
155
+ } else {
156
+ // Initialize view objects lazily.
157
+ var self = this;
158
+ this.$el.one('focus.' + this.id, function () { self.initialize(); });
159
+ }
160
+ }
161
+
162
+ Completer._getDefaults = function () {
163
+ if (!Completer.DEFAULTS) {
164
+ Completer.DEFAULTS = {
165
+ appendTo: $('body'),
166
+ zIndex: '100'
167
+ };
168
+ }
169
+
170
+ return Completer.DEFAULTS;
171
+ }
172
+
173
+ $.extend(Completer.prototype, {
174
+ // Public properties
175
+ // -----------------
176
+
177
+ id: null,
178
+ option: null,
179
+ strategies: null,
180
+ adapter: null,
181
+ dropdown: null,
182
+ $el: null,
183
+
184
+ // Public methods
185
+ // --------------
186
+
187
+ initialize: function () {
188
+ var element = this.$el.get(0);
189
+ // Initialize view objects.
190
+ this.dropdown = new $.fn.textcomplete.Dropdown(element, this, this.option);
191
+ var Adapter, viewName;
192
+ if (this.option.adapter) {
193
+ Adapter = this.option.adapter;
194
+ } else {
195
+ if (this.$el.is('textarea') || this.$el.is('input[type=text]')) {
196
+ viewName = typeof element.selectionEnd === 'number' ? 'Textarea' : 'IETextarea';
197
+ } else {
198
+ viewName = 'ContentEditable';
199
+ }
200
+ Adapter = $.fn.textcomplete[viewName];
201
+ }
202
+ this.adapter = new Adapter(element, this, this.option);
203
+ },
204
+
205
+ destroy: function () {
206
+ this.$el.off('.' + this.id);
207
+ if (this.adapter) {
208
+ this.adapter.destroy();
209
+ }
210
+ if (this.dropdown) {
211
+ this.dropdown.destroy();
212
+ }
213
+ this.$el = this.adapter = this.dropdown = null;
214
+ },
215
+
216
+ // Invoke textcomplete.
217
+ trigger: function (text, skipUnchangedTerm) {
218
+ if (!this.dropdown) { this.initialize(); }
219
+ text != null || (text = this.adapter.getTextFromHeadToCaret());
220
+ var searchQuery = this._extractSearchQuery(text);
221
+ if (searchQuery.length) {
222
+ var term = searchQuery[1];
223
+ // Ignore shift-key, ctrl-key and so on.
224
+ if (skipUnchangedTerm && this._term === term) { return; }
225
+ this._term = term;
226
+ this._search.apply(this, searchQuery);
227
+ } else {
228
+ this._term = null;
229
+ this.dropdown.deactivate();
230
+ }
231
+ },
232
+
233
+ fire: function (eventName) {
234
+ var args = Array.prototype.slice.call(arguments, 1);
235
+ this.$el.trigger(eventName, args);
236
+ return this;
237
+ },
238
+
239
+ register: function (strategies) {
240
+ Array.prototype.push.apply(this.strategies, strategies);
241
+ },
242
+
243
+ // Insert the value into adapter view. It is called when the dropdown is clicked
244
+ // or selected.
245
+ //
246
+ // value - The selected element of the array callbacked from search func.
247
+ // strategy - The Strategy object.
248
+ // e - Click or keydown event object.
249
+ select: function (value, strategy, e) {
250
+ this.adapter.select(value, strategy, e);
251
+ this.fire('change').fire('textComplete:select', value, strategy);
252
+ this.adapter.focus();
253
+ },
254
+
255
+ // Private properties
256
+ // ------------------
257
+
258
+ _clearAtNext: true,
259
+ _term: null,
260
+
261
+ // Private methods
262
+ // ---------------
263
+
264
+ // Parse the given text and extract the first matching strategy.
265
+ //
266
+ // Returns an array including the strategy, the query term and the match
267
+ // object if the text matches an strategy; otherwise returns an empty array.
268
+ _extractSearchQuery: function (text) {
269
+ for (var i = 0; i < this.strategies.length; i++) {
270
+ var strategy = this.strategies[i];
271
+ var context = strategy.context(text);
272
+ if (context || context === '') {
273
+ var matchRegexp = isFunction(strategy.match) ? strategy.match(text) : strategy.match;
274
+ if (isString(context)) { text = context; }
275
+ var match = text.match(matchRegexp);
276
+ if (match) { return [strategy, match[strategy.index], match]; }
277
+ }
278
+ }
279
+ return []
280
+ },
281
+
282
+ // Call the search method of selected strategy..
283
+ _search: lock(function (free, strategy, term, match) {
284
+ var self = this;
285
+ strategy.search(term, function (data, stillSearching) {
286
+ if (!self.dropdown.shown) {
287
+ self.dropdown.activate();
288
+ }
289
+ if (self._clearAtNext) {
290
+ // The first callback in the current lock.
291
+ self.dropdown.clear();
292
+ self._clearAtNext = false;
293
+ }
294
+ self.dropdown.setPosition(self.adapter.getCaretPosition());
295
+ self.dropdown.render(self._zip(data, strategy, term));
296
+ if (!stillSearching) {
297
+ // The last callback in the current lock.
298
+ free();
299
+ self._clearAtNext = true; // Call dropdown.clear at the next time.
300
+ }
301
+ }, match);
302
+ }),
303
+
304
+ // Build a parameter for Dropdown#render.
305
+ //
306
+ // Examples
307
+ //
308
+ // this._zip(['a', 'b'], 's');
309
+ // //=> [{ value: 'a', strategy: 's' }, { value: 'b', strategy: 's' }]
310
+ _zip: function (data, strategy, term) {
311
+ return $.map(data, function (value) {
312
+ return { value: value, strategy: strategy, term: term };
313
+ });
314
+ }
315
+ });
316
+
317
+ $.fn.textcomplete.Completer = Completer;
318
+ }(jQuery);
319
+
320
+ +function ($) {
321
+ 'use strict';
322
+
323
+ var $window = $(window);
324
+
325
+ var include = function (zippedData, datum) {
326
+ var i, elem;
327
+ var idProperty = datum.strategy.idProperty
328
+ for (i = 0; i < zippedData.length; i++) {
329
+ elem = zippedData[i];
330
+ if (elem.strategy !== datum.strategy) continue;
331
+ if (idProperty) {
332
+ if (elem.value[idProperty] === datum.value[idProperty]) return true;
333
+ } else {
334
+ if (elem.value === datum.value) return true;
335
+ }
336
+ }
337
+ return false;
338
+ };
339
+
340
+ var dropdownViews = {};
341
+ $(document).on('click', function (e) {
342
+ var id = e.originalEvent && e.originalEvent.keepTextCompleteDropdown;
343
+ $.each(dropdownViews, function (key, view) {
344
+ if (key !== id) { view.deactivate(); }
345
+ });
346
+ });
347
+
348
+ var commands = {
349
+ SKIP_DEFAULT: 0,
350
+ KEY_UP: 1,
351
+ KEY_DOWN: 2,
352
+ KEY_ENTER: 3,
353
+ KEY_PAGEUP: 4,
354
+ KEY_PAGEDOWN: 5,
355
+ KEY_ESCAPE: 6
356
+ };
357
+
358
+ // Dropdown view
359
+ // =============
360
+
361
+ // Construct Dropdown object.
362
+ //
363
+ // element - Textarea or contenteditable element.
364
+ function Dropdown(element, completer, option) {
365
+ this.$el = Dropdown.createElement(option);
366
+ this.completer = completer;
367
+ this.id = completer.id + 'dropdown';
368
+ this._data = []; // zipped data.
369
+ this.$inputEl = $(element);
370
+ this.option = option;
371
+
372
+ // Override setPosition method.
373
+ if (option.listPosition) { this.setPosition = option.listPosition; }
374
+ if (option.height) { this.$el.height(option.height); }
375
+ var self = this;
376
+ $.each(['maxCount', 'placement', 'footer', 'header', 'noResultsMessage', 'className'], function (_i, name) {
377
+ if (option[name] != null) { self[name] = option[name]; }
378
+ });
379
+ this._bindEvents(element);
380
+ dropdownViews[this.id] = this;
381
+ }
382
+
383
+ $.extend(Dropdown, {
384
+ // Class methods
385
+ // -------------
386
+
387
+ createElement: function (option) {
388
+ var $parent = option.appendTo;
389
+ if (!($parent instanceof $)) { $parent = $($parent); }
390
+ var $el = $('<ul></ul>')
391
+ .addClass('dropdown-menu textcomplete-dropdown')
392
+ .attr('id', 'textcomplete-dropdown-' + option._oid)
393
+ .css({
394
+ display: 'none',
395
+ left: 0,
396
+ position: 'absolute',
397
+ zIndex: option.zIndex
398
+ })
399
+ .appendTo($parent);
400
+ return $el;
401
+ }
402
+ });
403
+
404
+ $.extend(Dropdown.prototype, {
405
+ // Public properties
406
+ // -----------------
407
+
408
+ $el: null, // jQuery object of ul.dropdown-menu element.
409
+ $inputEl: null, // jQuery object of target textarea.
410
+ completer: null,
411
+ footer: null,
412
+ header: null,
413
+ id: null,
414
+ maxCount: 10,
415
+ placement: '',
416
+ shown: false,
417
+ data: [], // Shown zipped data.
418
+ className: '',
419
+
420
+ // Public methods
421
+ // --------------
422
+
423
+ destroy: function () {
424
+ // Don't remove $el because it may be shared by several textcompletes.
425
+ this.deactivate();
426
+
427
+ this.$el.off('.' + this.id);
428
+ this.$inputEl.off('.' + this.id);
429
+ this.clear();
430
+ this.$el = this.$inputEl = this.completer = null;
431
+ delete dropdownViews[this.id]
432
+ },
433
+
434
+ render: function (zippedData) {
435
+ var contentsHtml = this._buildContents(zippedData);
436
+ var unzippedData = $.map(this.data, function (d) { return d.value; });
437
+ if (this.data.length) {
438
+ this._renderHeader(unzippedData);
439
+ this._renderFooter(unzippedData);
440
+ if (contentsHtml) {
441
+ this._renderContents(contentsHtml);
442
+ this._fitToBottom();
443
+ this._activateIndexedItem();
444
+ }
445
+ this._setScroll();
446
+ } else if (this.noResultsMessage) {
447
+ this._renderNoResultsMessage(unzippedData);
448
+ } else if (this.shown) {
449
+ this.deactivate();
450
+ }
451
+ },
452
+
453
+ setPosition: function (pos) {
454
+ this.$el.css(this._applyPlacement(pos));
455
+
456
+ // Make the dropdown fixed if the input is also fixed
457
+ // This can't be done during init, as textcomplete may be used on multiple elements on the same page
458
+ // Because the same dropdown is reused behind the scenes, we need to recheck every time the dropdown is showed
459
+ var position = 'absolute';
460
+ // Check if input or one of its parents has positioning we need to care about
461
+ this.$inputEl.add(this.$inputEl.parents()).each(function() {
462
+ if($(this).css('position') === 'absolute') // The element has absolute positioning, so it's all OK
463
+ return false;
464
+ if($(this).css('position') === 'fixed') {
465
+ position = 'fixed';
466
+ return false;
467
+ }
468
+ });
469
+ this.$el.css({ position: position }); // Update positioning
470
+
471
+ return this;
472
+ },
473
+
474
+ clear: function () {
475
+ this.$el.html('');
476
+ this.data = [];
477
+ this._index = 0;
478
+ this._$header = this._$footer = this._$noResultsMessage = null;
479
+ },
480
+
481
+ activate: function () {
482
+ if (!this.shown) {
483
+ this.clear();
484
+ this.$el.show();
485
+ if (this.className) { this.$el.addClass(this.className); }
486
+ this.completer.fire('textComplete:show');
487
+ this.shown = true;
488
+ }
489
+ return this;
490
+ },
491
+
492
+ deactivate: function () {
493
+ if (this.shown) {
494
+ this.$el.hide();
495
+ if (this.className) { this.$el.removeClass(this.className); }
496
+ this.completer.fire('textComplete:hide');
497
+ this.shown = false;
498
+ }
499
+ return this;
500
+ },
501
+
502
+ isUp: function (e) {
503
+ return e.keyCode === 38 || (e.ctrlKey && e.keyCode === 80); // UP, Ctrl-P
504
+ },
505
+
506
+ isDown: function (e) {
507
+ return e.keyCode === 40 || (e.ctrlKey && e.keyCode === 78); // DOWN, Ctrl-N
508
+ },
509
+
510
+ isEnter: function (e) {
511
+ var modifiers = e.ctrlKey || e.altKey || e.metaKey || e.shiftKey;
512
+ return !modifiers && (e.keyCode === 13 || e.keyCode === 9 || (this.option.completeOnSpace === true && e.keyCode === 32)) // ENTER, TAB
513
+ },
514
+
515
+ isPageup: function (e) {
516
+ return e.keyCode === 33; // PAGEUP
517
+ },
518
+
519
+ isPagedown: function (e) {
520
+ return e.keyCode === 34; // PAGEDOWN
521
+ },
522
+
523
+ isEscape: function (e) {
524
+ return e.keyCode === 27; // ESCAPE
525
+ },
526
+
527
+ // Private properties
528
+ // ------------------
529
+
530
+ _data: null, // Currently shown zipped data.
531
+ _index: null,
532
+ _$header: null,
533
+ _$noResultsMessage: null,
534
+ _$footer: null,
535
+
536
+ // Private methods
537
+ // ---------------
538
+
539
+ _bindEvents: function () {
540
+ this.$el.on('mousedown.' + this.id, '.textcomplete-item', $.proxy(this._onClick, this));
541
+ this.$el.on('touchstart.' + this.id, '.textcomplete-item', $.proxy(this._onClick, this));
542
+ this.$el.on('mouseover.' + this.id, '.textcomplete-item', $.proxy(this._onMouseover, this));
543
+ this.$inputEl.on('keydown.' + this.id, $.proxy(this._onKeydown, this));
544
+ },
545
+
546
+ _onClick: function (e) {
547
+ var $el = $(e.target);
548
+ e.preventDefault();
549
+ e.originalEvent.keepTextCompleteDropdown = this.id;
550
+ if (!$el.hasClass('textcomplete-item')) {
551
+ $el = $el.closest('.textcomplete-item');
552
+ }
553
+ var datum = this.data[parseInt($el.data('index'), 10)];
554
+ this.completer.select(datum.value, datum.strategy, e);
555
+ var self = this;
556
+ // Deactive at next tick to allow other event handlers to know whether
557
+ // the dropdown has been shown or not.
558
+ setTimeout(function () {
559
+ self.deactivate();
560
+ if (e.type === 'touchstart') {
561
+ self.$inputEl.focus();
562
+ }
563
+ }, 0);
564
+ },
565
+
566
+ // Activate hovered item.
567
+ _onMouseover: function (e) {
568
+ var $el = $(e.target);
569
+ e.preventDefault();
570
+ if (!$el.hasClass('textcomplete-item')) {
571
+ $el = $el.closest('.textcomplete-item');
572
+ }
573
+ this._index = parseInt($el.data('index'), 10);
574
+ this._activateIndexedItem();
575
+ },
576
+
577
+ _onKeydown: function (e) {
578
+ if (!this.shown) { return; }
579
+
580
+ var command;
581
+
582
+ if ($.isFunction(this.option.onKeydown)) {
583
+ command = this.option.onKeydown(e, commands);
584
+ }
585
+
586
+ if (command == null) {
587
+ command = this._defaultKeydown(e);
588
+ }
589
+
590
+ switch (command) {
591
+ case commands.KEY_UP:
592
+ e.preventDefault();
593
+ this._up();
594
+ break;
595
+ case commands.KEY_DOWN:
596
+ e.preventDefault();
597
+ this._down();
598
+ break;
599
+ case commands.KEY_ENTER:
600
+ e.preventDefault();
601
+ this._enter(e);
602
+ break;
603
+ case commands.KEY_PAGEUP:
604
+ e.preventDefault();
605
+ this._pageup();
606
+ break;
607
+ case commands.KEY_PAGEDOWN:
608
+ e.preventDefault();
609
+ this._pagedown();
610
+ break;
611
+ case commands.KEY_ESCAPE:
612
+ e.preventDefault();
613
+ this.deactivate();
614
+ break;
615
+ }
616
+ },
617
+
618
+ _defaultKeydown: function (e) {
619
+ if (this.isUp(e)) {
620
+ return commands.KEY_UP;
621
+ } else if (this.isDown(e)) {
622
+ return commands.KEY_DOWN;
623
+ } else if (this.isEnter(e)) {
624
+ return commands.KEY_ENTER;
625
+ } else if (this.isPageup(e)) {
626
+ return commands.KEY_PAGEUP;
627
+ } else if (this.isPagedown(e)) {
628
+ return commands.KEY_PAGEDOWN;
629
+ } else if (this.isEscape(e)) {
630
+ return commands.KEY_ESCAPE;
631
+ }
632
+ },
633
+
634
+ _up: function () {
635
+ if (this._index === 0) {
636
+ this._index = this.data.length - 1;
637
+ } else {
638
+ this._index -= 1;
639
+ }
640
+ this._activateIndexedItem();
641
+ this._setScroll();
642
+ },
643
+
644
+ _down: function () {
645
+ if (this._index === this.data.length - 1) {
646
+ this._index = 0;
647
+ } else {
648
+ this._index += 1;
649
+ }
650
+ this._activateIndexedItem();
651
+ this._setScroll();
652
+ },
653
+
654
+ _enter: function (e) {
655
+ var datum = this.data[parseInt(this._getActiveElement().data('index'), 10)];
656
+ this.completer.select(datum.value, datum.strategy, e);
657
+ this.deactivate();
658
+ },
659
+
660
+ _pageup: function () {
661
+ var target = 0;
662
+ var threshold = this._getActiveElement().position().top - this.$el.innerHeight();
663
+ this.$el.children().each(function (i) {
664
+ if ($(this).position().top + $(this).outerHeight() > threshold) {
665
+ target = i;
666
+ return false;
667
+ }
668
+ });
669
+ this._index = target;
670
+ this._activateIndexedItem();
671
+ this._setScroll();
672
+ },
673
+
674
+ _pagedown: function () {
675
+ var target = this.data.length - 1;
676
+ var threshold = this._getActiveElement().position().top + this.$el.innerHeight();
677
+ this.$el.children().each(function (i) {
678
+ if ($(this).position().top > threshold) {
679
+ target = i;
680
+ return false
681
+ }
682
+ });
683
+ this._index = target;
684
+ this._activateIndexedItem();
685
+ this._setScroll();
686
+ },
687
+
688
+ _activateIndexedItem: function () {
689
+ this.$el.find('.textcomplete-item.active').removeClass('active');
690
+ this._getActiveElement().addClass('active');
691
+ },
692
+
693
+ _getActiveElement: function () {
694
+ return this.$el.children('.textcomplete-item:nth(' + this._index + ')');
695
+ },
696
+
697
+ _setScroll: function () {
698
+ var $activeEl = this._getActiveElement();
699
+ var itemTop = $activeEl.position().top;
700
+ var itemHeight = $activeEl.outerHeight();
701
+ var visibleHeight = this.$el.innerHeight();
702
+ var visibleTop = this.$el.scrollTop();
703
+ if (this._index === 0 || this._index == this.data.length - 1 || itemTop < 0) {
704
+ this.$el.scrollTop(itemTop + visibleTop);
705
+ } else if (itemTop + itemHeight > visibleHeight) {
706
+ this.$el.scrollTop(itemTop + itemHeight + visibleTop - visibleHeight);
707
+ }
708
+ },
709
+
710
+ _buildContents: function (zippedData) {
711
+ var datum, i, index;
712
+ var html = '';
713
+ for (i = 0; i < zippedData.length; i++) {
714
+ if (this.data.length === this.maxCount) break;
715
+ datum = zippedData[i];
716
+ if (include(this.data, datum)) { continue; }
717
+ index = this.data.length;
718
+ this.data.push(datum);
719
+ html += '<li class="textcomplete-item" data-index="' + index + '"><a>';
720
+ html += datum.strategy.template(datum.value, datum.term);
721
+ html += '</a></li>';
722
+ }
723
+ return html;
724
+ },
725
+
726
+ _renderHeader: function (unzippedData) {
727
+ if (this.header) {
728
+ if (!this._$header) {
729
+ this._$header = $('<li class="textcomplete-header"></li>').prependTo(this.$el);
730
+ }
731
+ var html = $.isFunction(this.header) ? this.header(unzippedData) : this.header;
732
+ this._$header.html(html);
733
+ }
734
+ },
735
+
736
+ _renderFooter: function (unzippedData) {
737
+ if (this.footer) {
738
+ if (!this._$footer) {
739
+ this._$footer = $('<li class="textcomplete-footer"></li>').appendTo(this.$el);
740
+ }
741
+ var html = $.isFunction(this.footer) ? this.footer(unzippedData) : this.footer;
742
+ this._$footer.html(html);
743
+ }
744
+ },
745
+
746
+ _renderNoResultsMessage: function (unzippedData) {
747
+ if (this.noResultsMessage) {
748
+ if (!this._$noResultsMessage) {
749
+ this._$noResultsMessage = $('<li class="textcomplete-no-results-message"></li>').appendTo(this.$el);
750
+ }
751
+ var html = $.isFunction(this.noResultsMessage) ? this.noResultsMessage(unzippedData) : this.noResultsMessage;
752
+ this._$noResultsMessage.html(html);
753
+ }
754
+ },
755
+
756
+ _renderContents: function (html) {
757
+ if (this._$footer) {
758
+ this._$footer.before(html);
759
+ } else {
760
+ this.$el.append(html);
761
+ }
762
+ },
763
+
764
+ _fitToBottom: function() {
765
+ var windowScrollBottom = $window.scrollTop() + $window.height();
766
+ var height = this.$el.height();
767
+ if ((this.$el.position().top + height) > windowScrollBottom) {
768
+ this.$el.offset({top: windowScrollBottom - height});
769
+ }
770
+ },
771
+
772
+ _applyPlacement: function (position) {
773
+ // If the 'placement' option set to 'top', move the position above the element.
774
+ if (this.placement.indexOf('top') !== -1) {
775
+ // Overwrite the position object to set the 'bottom' property instead of the top.
776
+ position = {
777
+ top: 'auto',
778
+ bottom: this.$el.parent().height() - position.top + position.lineHeight,
779
+ left: position.left
780
+ };
781
+ } else {
782
+ position.bottom = 'auto';
783
+ delete position.lineHeight;
784
+ }
785
+ if (this.placement.indexOf('absleft') !== -1) {
786
+ position.left = 0;
787
+ } else if (this.placement.indexOf('absright') !== -1) {
788
+ position.right = 0;
789
+ position.left = 'auto';
790
+ }
791
+ return position;
792
+ }
793
+ });
794
+
795
+ $.fn.textcomplete.Dropdown = Dropdown;
796
+ $.extend($.fn.textcomplete, commands);
797
+ }(jQuery);
798
+
799
+ +function ($) {
800
+ 'use strict';
801
+
802
+ // Memoize a search function.
803
+ var memoize = function (func) {
804
+ var memo = {};
805
+ return function (term, callback) {
806
+ if (memo[term]) {
807
+ callback(memo[term]);
808
+ } else {
809
+ func.call(this, term, function (data) {
810
+ memo[term] = (memo[term] || []).concat(data);
811
+ callback.apply(null, arguments);
812
+ });
813
+ }
814
+ };
815
+ };
816
+
817
+ function Strategy(options) {
818
+ $.extend(this, options);
819
+ if (this.cache) { this.search = memoize(this.search); }
820
+ }
821
+
822
+ Strategy.parse = function (optionsArray) {
823
+ return $.map(optionsArray, function (options) {
824
+ return new Strategy(options);
825
+ });
826
+ };
827
+
828
+ $.extend(Strategy.prototype, {
829
+ // Public properties
830
+ // -----------------
831
+
832
+ // Required
833
+ match: null,
834
+ replace: null,
835
+ search: null,
836
+
837
+ // Optional
838
+ cache: false,
839
+ context: function () { return true; },
840
+ index: 2,
841
+ template: function (obj) { return obj; },
842
+ idProperty: null
843
+ });
844
+
845
+ $.fn.textcomplete.Strategy = Strategy;
846
+
847
+ }(jQuery);
848
+
849
+ +function ($) {
850
+ 'use strict';
851
+
852
+ var now = Date.now || function () { return new Date().getTime(); };
853
+
854
+ // Returns a function, that, as long as it continues to be invoked, will not
855
+ // be triggered. The function will be called after it stops being called for
856
+ // `wait` msec.
857
+ //
858
+ // This utility function was originally implemented at Underscore.js.
859
+ var debounce = function (func, wait) {
860
+ var timeout, args, context, timestamp, result;
861
+ var later = function () {
862
+ var last = now() - timestamp;
863
+ if (last < wait) {
864
+ timeout = setTimeout(later, wait - last);
865
+ } else {
866
+ timeout = null;
867
+ result = func.apply(context, args);
868
+ context = args = null;
869
+ }
870
+ };
871
+
872
+ return function () {
873
+ context = this;
874
+ args = arguments;
875
+ timestamp = now();
876
+ if (!timeout) {
877
+ timeout = setTimeout(later, wait);
878
+ }
879
+ return result;
880
+ };
881
+ };
882
+
883
+ function Adapter () {}
884
+
885
+ $.extend(Adapter.prototype, {
886
+ // Public properties
887
+ // -----------------
888
+
889
+ id: null, // Identity.
890
+ completer: null, // Completer object which creates it.
891
+ el: null, // Textarea element.
892
+ $el: null, // jQuery object of the textarea.
893
+ option: null,
894
+
895
+ // Public methods
896
+ // --------------
897
+
898
+ initialize: function (element, completer, option) {
899
+ this.el = element;
900
+ this.$el = $(element);
901
+ this.id = completer.id + this.constructor.name;
902
+ this.completer = completer;
903
+ this.option = option;
904
+
905
+ if (this.option.debounce) {
906
+ this._onKeyup = debounce(this._onKeyup, this.option.debounce);
907
+ }
908
+
909
+ this._bindEvents();
910
+ },
911
+
912
+ destroy: function () {
913
+ this.$el.off('.' + this.id); // Remove all event handlers.
914
+ this.$el = this.el = this.completer = null;
915
+ },
916
+
917
+ // Update the element with the given value and strategy.
918
+ //
919
+ // value - The selected object. It is one of the item of the array
920
+ // which was callbacked from the search function.
921
+ // strategy - The Strategy associated with the selected value.
922
+ select: function (/* value, strategy */) {
923
+ throw new Error('Not implemented');
924
+ },
925
+
926
+ // Returns the caret's relative coordinates from body's left top corner.
927
+ //
928
+ // FIXME: Calculate the left top corner of `this.option.appendTo` element.
929
+ getCaretPosition: function () {
930
+ var position = this._getCaretRelativePosition();
931
+ var offset = this.$el.offset();
932
+ position.top += offset.top;
933
+ position.left += offset.left;
934
+ return position;
935
+ },
936
+
937
+ // Focus on the element.
938
+ focus: function () {
939
+ this.$el.focus();
940
+ },
941
+
942
+ // Private methods
943
+ // ---------------
944
+
945
+ _bindEvents: function () {
946
+ this.$el.on('keyup.' + this.id, $.proxy(this._onKeyup, this));
947
+ },
948
+
949
+ _onKeyup: function (e) {
950
+ if (this._skipSearch(e)) { return; }
951
+ this.completer.trigger(this.getTextFromHeadToCaret(), true);
952
+ },
953
+
954
+ // Suppress searching if it returns true.
955
+ _skipSearch: function (clickEvent) {
956
+ switch (clickEvent.keyCode) {
957
+ case 13: // ENTER
958
+ case 40: // DOWN
959
+ case 38: // UP
960
+ return true;
961
+ }
962
+ if (clickEvent.ctrlKey) switch (clickEvent.keyCode) {
963
+ case 78: // Ctrl-N
964
+ case 80: // Ctrl-P
965
+ return true;
966
+ }
967
+ }
968
+ });
969
+
970
+ $.fn.textcomplete.Adapter = Adapter;
971
+ }(jQuery);
972
+
973
+ +function ($) {
974
+ 'use strict';
975
+
976
+ // Textarea adapter
977
+ // ================
978
+ //
979
+ // Managing a textarea. It doesn't know a Dropdown.
980
+ function Textarea(element, completer, option) {
981
+ this.initialize(element, completer, option);
982
+ }
983
+
984
+ Textarea.DIV_PROPERTIES = {
985
+ left: -9999,
986
+ position: 'absolute',
987
+ top: 0,
988
+ whiteSpace: 'pre-wrap'
989
+ }
990
+
991
+ Textarea.COPY_PROPERTIES = [
992
+ 'border-width', 'font-family', 'font-size', 'font-style', 'font-variant',
993
+ 'font-weight', 'height', 'letter-spacing', 'word-spacing', 'line-height',
994
+ 'text-decoration', 'text-align', 'width', 'padding-top', 'padding-right',
995
+ 'padding-bottom', 'padding-left', 'margin-top', 'margin-right',
996
+ 'margin-bottom', 'margin-left', 'border-style', 'box-sizing', 'tab-size'
997
+ ];
998
+
999
+ $.extend(Textarea.prototype, $.fn.textcomplete.Adapter.prototype, {
1000
+ // Public methods
1001
+ // --------------
1002
+
1003
+ // Update the textarea with the given value and strategy.
1004
+ select: function (value, strategy, e) {
1005
+ var pre = this.getTextFromHeadToCaret();
1006
+ var post = this.el.value.substring(this.el.selectionEnd);
1007
+ var newSubstr = strategy.replace(value, e);
1008
+ if ($.isArray(newSubstr)) {
1009
+ post = newSubstr[1] + post;
1010
+ newSubstr = newSubstr[0];
1011
+ }
1012
+ pre = pre.replace(strategy.match, newSubstr);
1013
+ this.$el.val(pre + post);
1014
+ this.el.selectionStart = this.el.selectionEnd = pre.length;
1015
+ },
1016
+
1017
+ // Private methods
1018
+ // ---------------
1019
+
1020
+ // Returns the caret's relative coordinates from textarea's left top corner.
1021
+ //
1022
+ // Browser native API does not provide the way to know the position of
1023
+ // caret in pixels, so that here we use a kind of hack to accomplish
1024
+ // the aim. First of all it puts a dummy div element and completely copies
1025
+ // the textarea's style to the element, then it inserts the text and a
1026
+ // span element into the textarea.
1027
+ // Consequently, the span element's position is the thing what we want.
1028
+ _getCaretRelativePosition: function () {
1029
+ var dummyDiv = $('<div></div>').css(this._copyCss())
1030
+ .text(this.getTextFromHeadToCaret());
1031
+ var span = $('<span></span>').text('.').appendTo(dummyDiv);
1032
+ this.$el.before(dummyDiv);
1033
+ var position = span.position();
1034
+ position.top += span.height() - this.$el.scrollTop();
1035
+ position.lineHeight = span.height();
1036
+ dummyDiv.remove();
1037
+ return position;
1038
+ },
1039
+
1040
+ _copyCss: function () {
1041
+ return $.extend({
1042
+ // Set 'scroll' if a scrollbar is being shown; otherwise 'auto'.
1043
+ overflow: this.el.scrollHeight > this.el.offsetHeight ? 'scroll' : 'auto'
1044
+ }, Textarea.DIV_PROPERTIES, this._getStyles());
1045
+ },
1046
+
1047
+ _getStyles: (function ($) {
1048
+ var color = $('<div></div>').css(['color']).color;
1049
+ if (typeof color !== 'undefined') {
1050
+ return function () {
1051
+ return this.$el.css(Textarea.COPY_PROPERTIES);
1052
+ };
1053
+ } else { // jQuery < 1.8
1054
+ return function () {
1055
+ var $el = this.$el;
1056
+ var styles = {};
1057
+ $.each(Textarea.COPY_PROPERTIES, function (i, property) {
1058
+ styles[property] = $el.css(property);
1059
+ });
1060
+ return styles;
1061
+ };
1062
+ }
1063
+ })($),
1064
+
1065
+ getTextFromHeadToCaret: function () {
1066
+ return this.el.value.substring(0, this.el.selectionEnd);
1067
+ }
1068
+ });
1069
+
1070
+ $.fn.textcomplete.Textarea = Textarea;
1071
+ }(jQuery);
1072
+
1073
+ +function ($) {
1074
+ 'use strict';
1075
+
1076
+ var sentinelChar = '吶';
1077
+
1078
+ function IETextarea(element, completer, option) {
1079
+ this.initialize(element, completer, option);
1080
+ $('<span>' + sentinelChar + '</span>').css({
1081
+ position: 'absolute',
1082
+ top: -9999,
1083
+ left: -9999
1084
+ }).insertBefore(element);
1085
+ }
1086
+
1087
+ $.extend(IETextarea.prototype, $.fn.textcomplete.Textarea.prototype, {
1088
+ // Public methods
1089
+ // --------------
1090
+
1091
+ select: function (value, strategy, e) {
1092
+ var pre = this.getTextFromHeadToCaret();
1093
+ var post = this.el.value.substring(pre.length);
1094
+ var newSubstr = strategy.replace(value, e);
1095
+ if ($.isArray(newSubstr)) {
1096
+ post = newSubstr[1] + post;
1097
+ newSubstr = newSubstr[0];
1098
+ }
1099
+ pre = pre.replace(strategy.match, newSubstr);
1100
+ this.$el.val(pre + post);
1101
+ this.el.focus();
1102
+ var range = this.el.createTextRange();
1103
+ range.collapse(true);
1104
+ range.moveEnd('character', pre.length);
1105
+ range.moveStart('character', pre.length);
1106
+ range.select();
1107
+ },
1108
+
1109
+ getTextFromHeadToCaret: function () {
1110
+ this.el.focus();
1111
+ var range = document.selection.createRange();
1112
+ range.moveStart('character', -this.el.value.length);
1113
+ var arr = range.text.split(sentinelChar)
1114
+ return arr.length === 1 ? arr[0] : arr[1];
1115
+ }
1116
+ });
1117
+
1118
+ $.fn.textcomplete.IETextarea = IETextarea;
1119
+ }(jQuery);
1120
+
1121
+ // NOTE: TextComplete plugin has contenteditable support but it does not work
1122
+ // fine especially on old IEs.
1123
+ // Any pull requests are REALLY welcome.
1124
+
1125
+ +function ($) {
1126
+ 'use strict';
1127
+
1128
+ // ContentEditable adapter
1129
+ // =======================
1130
+ //
1131
+ // Adapter for contenteditable elements.
1132
+ function ContentEditable (element, completer, option) {
1133
+ this.initialize(element, completer, option);
1134
+ }
1135
+
1136
+ $.extend(ContentEditable.prototype, $.fn.textcomplete.Adapter.prototype, {
1137
+ // Public methods
1138
+ // --------------
1139
+
1140
+ // Update the content with the given value and strategy.
1141
+ // When an dropdown item is selected, it is executed.
1142
+ select: function (value, strategy, e) {
1143
+ var pre = this.getTextFromHeadToCaret();
1144
+ var sel = window.getSelection()
1145
+ var range = sel.getRangeAt(0);
1146
+ var selection = range.cloneRange();
1147
+ selection.selectNodeContents(range.startContainer);
1148
+ var content = selection.toString();
1149
+ var post = content.substring(range.startOffset);
1150
+ var newSubstr = strategy.replace(value, e);
1151
+ if ($.isArray(newSubstr)) {
1152
+ post = newSubstr[1] + post;
1153
+ newSubstr = newSubstr[0];
1154
+ }
1155
+ pre = pre.replace(strategy.match, newSubstr);
1156
+ range.selectNodeContents(range.startContainer);
1157
+ range.deleteContents();
1158
+ var node = document.createTextNode(pre + post);
1159
+ range.insertNode(node);
1160
+ range.setStart(node, pre.length);
1161
+ range.collapse(true);
1162
+ sel.removeAllRanges();
1163
+ sel.addRange(range);
1164
+ },
1165
+
1166
+ // Private methods
1167
+ // ---------------
1168
+
1169
+ // Returns the caret's relative position from the contenteditable's
1170
+ // left top corner.
1171
+ //
1172
+ // Examples
1173
+ //
1174
+ // this._getCaretRelativePosition()
1175
+ // //=> { top: 18, left: 200, lineHeight: 16 }
1176
+ //
1177
+ // Dropdown's position will be decided using the result.
1178
+ _getCaretRelativePosition: function () {
1179
+ var range = window.getSelection().getRangeAt(0).cloneRange();
1180
+ var node = document.createElement('span');
1181
+ range.insertNode(node);
1182
+ range.selectNodeContents(node);
1183
+ range.deleteContents();
1184
+ var $node = $(node);
1185
+ var position = $node.offset();
1186
+ position.left -= this.$el.offset().left;
1187
+ position.top += $node.height() - this.$el.offset().top;
1188
+ position.lineHeight = $node.height();
1189
+ $node.remove();
1190
+ var dir = this.$el.attr('dir') || this.$el.css('direction');
1191
+ if (dir === 'rtl') { position.left -= this.listView.$el.width(); }
1192
+ return position;
1193
+ },
1194
+
1195
+ // Returns the string between the first character and the caret.
1196
+ // Completer will be triggered with the result for start autocompleting.
1197
+ //
1198
+ // Example
1199
+ //
1200
+ // // Suppose the html is '<b>hello</b> wor|ld' and | is the caret.
1201
+ // this.getTextFromHeadToCaret()
1202
+ // // => ' wor' // not '<b>hello</b> wor'
1203
+ getTextFromHeadToCaret: function () {
1204
+ var range = window.getSelection().getRangeAt(0);
1205
+ var selection = range.cloneRange();
1206
+ selection.selectNodeContents(range.startContainer);
1207
+ return selection.toString().substring(0, range.startOffset);
1208
+ }
1209
+ });
1210
+
1211
+ $.fn.textcomplete.ContentEditable = ContentEditable;
1212
+ }(jQuery);
1213
+
1214
+ return jQuery;
1215
+ }));