From cd617cef3994c6aa3438525954396053f7c1df2e Mon Sep 17 00:00:00 2001 From: halotukozak Date: Sun, 7 Apr 2024 12:49:39 +0200 Subject: [PATCH] add alert, emoji, quote, others; fix code, nameOf --- src/main/scala/Markdown.scala | 2 +- src/main/scala/typography/Alert.scala | 9 + src/main/scala/typography/Code.scala | 9 +- src/main/scala/typography/Emoji.scala | 1841 +++++++++++++++++ src/main/scala/typography/Quote.scala | 10 + src/main/scala/typography/Reference.scala | 9 +- src/main/scala/typography/macros/Code.scala | 7 + src/main/scala/typography/macros/Emoji.scala | 9 + src/main/scala/typography/macros/Quote.scala | 8 + src/main/scala/typography/other.scala | 5 +- src/main/scala/utils/NameOfType.scala | 2 +- .../scala/integration/IntegrationTest.scala | 78 + src/test/scala/typography/CodeTest.scala | 26 +- src/test/scala/typography/EmojiTest.scala | 25 + src/test/scala/typography/QuoteTest.scala | 41 + 15 files changed, 2056 insertions(+), 25 deletions(-) create mode 100644 src/main/scala/typography/Alert.scala create mode 100644 src/main/scala/typography/Emoji.scala create mode 100644 src/main/scala/typography/Quote.scala create mode 100644 src/main/scala/typography/macros/Code.scala create mode 100644 src/main/scala/typography/macros/Emoji.scala create mode 100644 src/main/scala/typography/macros/Quote.scala create mode 100644 src/test/scala/integration/IntegrationTest.scala create mode 100644 src/test/scala/typography/EmojiTest.scala create mode 100644 src/test/scala/typography/QuoteTest.scala diff --git a/src/main/scala/Markdown.scala b/src/main/scala/Markdown.scala index f86cab2..22c7341 100644 --- a/src/main/scala/Markdown.scala +++ b/src/main/scala/Markdown.scala @@ -1,3 +1,3 @@ package halotukozak.smark -def markdown(input: String*): String = input.mkString("\n") +def markdown(input: String*): String = input.mkString("\n\n") diff --git a/src/main/scala/typography/Alert.scala b/src/main/scala/typography/Alert.scala new file mode 100644 index 0000000..2b53afb --- /dev/null +++ b/src/main/scala/typography/Alert.scala @@ -0,0 +1,9 @@ +package halotukozak.smark +package typography + +type Alert +type Note <: Alert +type Tip <: Alert +type Important <: Alert +type Warning <: Alert +type Caution <: Alert diff --git a/src/main/scala/typography/Code.scala b/src/main/scala/typography/Code.scala index e945ef8..0690c48 100644 --- a/src/main/scala/typography/Code.scala +++ b/src/main/scala/typography/Code.scala @@ -1,7 +1,7 @@ package halotukozak.smark package typography -import typography.macros.text +import typography.macros.{codeUnsafe, text} import utils.nameOf type code <: String @@ -11,9 +11,9 @@ type java <: code type kotlin <: code type sql <: code type bash <: code +type html <: code -inline def code[L <: code](inline code: L): String = nameOf[L] + text[BlockCode](code) -inline def codeUnsafe(language: String, code: String): String = language + text[BlockCode](code) +inline def code[L <: code](inline code: L): String = codeUnsafe(nameOf[L], code) implicit class ScalaHelper(private val sc: StringContext) extends AnyVal { def scala(args: Any*): scala = sc.s(args *).asInstanceOf[scala] @@ -28,6 +28,5 @@ implicit class ScalaHelper(private val sc: StringContext) extends AnyVal { def bash(args: Any*): bash = sc.s(args *).asInstanceOf[bash] - - def html(args: Any*): String = "\n" + sc.s(args *) + "\n" + def html(args: Any*): html = sc.s(args *).asInstanceOf[html] } diff --git a/src/main/scala/typography/Emoji.scala b/src/main/scala/typography/Emoji.scala new file mode 100644 index 0000000..24a9fd0 --- /dev/null +++ b/src/main/scala/typography/Emoji.scala @@ -0,0 +1,1841 @@ +package halotukozak.smark +package typography + +type Emoji + +type grinning <: Emoji +type smiley <: Emoji +type smile <: Emoji +type grin <: Emoji +type laughing <: Emoji +type sweat_smile <: Emoji +type rofl <: Emoji +type joy <: Emoji +type slightly_smiling_face <: Emoji +type upside_down_face <: Emoji +type wink <: Emoji +type blush <: Emoji +type innocent <: Emoji +type smiling_face_with_three_hearts <: Emoji +type heart_eyes <: Emoji +type star_struck <: Emoji +type kissing_heart <: Emoji +type kissing <: Emoji +type relaxed <: Emoji +type kissing_closed_eyes <: Emoji +type kissing_smiling_eyes <: Emoji +type smiling_face_with_tear <: Emoji +type yum <: Emoji +type stuck_out_tongue <: Emoji +type stuck_out_tongue_winking_eye <: Emoji +type zany_face <: Emoji +type stuck_out_tongue_closed_eyes <: Emoji +type money_mouth_face <: Emoji +type hugs <: Emoji +type hand_over_mouth <: Emoji +type shushing_face <: Emoji +type thinking <: Emoji +type zipper_mouth_face <: Emoji +type raised_eyebrow <: Emoji +type neutral_face <: Emoji +type expressionless <: Emoji +type no_mouth <: Emoji +type face_in_clouds <: Emoji +type smirk <: Emoji +type unamused <: Emoji +type roll_eyes <: Emoji +type grimacing <: Emoji +type face_exhaling <: Emoji +type lying_face <: Emoji +type relieved <: Emoji +type pensive <: Emoji +type sleepy <: Emoji +type drooling_face <: Emoji +type sleeping <: Emoji +type mask <: Emoji +type face_with_thermometer <: Emoji +type face_with_head_bandage <: Emoji +type nauseated_face <: Emoji +type vomiting_face <: Emoji +type sneezing_face <: Emoji +type hot_face <: Emoji +type cold_face <: Emoji +type woozy_face <: Emoji +type dizzy_face <: Emoji +type face_with_spiral_eyes <: Emoji +type exploding_head <: Emoji +type cowboy_hat_face <: Emoji +type partying_face <: Emoji +type disguised_face <: Emoji +type sunglasses <: Emoji +type nerd_face <: Emoji +type monocle_face <: Emoji +type confused <: Emoji +type worried <: Emoji +type slightly_frowning_face <: Emoji +type frowning_face <: Emoji +type open_mouth <: Emoji +type hushed <: Emoji +type astonished <: Emoji +type flushed <: Emoji +type pleading_face <: Emoji +type frowning <: Emoji +type anguished <: Emoji +type fearful <: Emoji +type cold_sweat <: Emoji +type disappointed_relieved <: Emoji +type cry <: Emoji +type sob <: Emoji +type scream <: Emoji +type confounded <: Emoji +type persevere <: Emoji +type disappointed <: Emoji +type sweat <: Emoji +type weary <: Emoji +type tired_face <: Emoji +type yawning_face <: Emoji +type triumph <: Emoji +type pout <: Emoji +type angry <: Emoji +type cursing_face <: Emoji +type smiling_imp <: Emoji +type imp <: Emoji +type skull <: Emoji +type skull_and_crossbones <: Emoji +type hankey <: Emoji +type clown_face <: Emoji +type japanese_ogre <: Emoji +type japanese_goblin <: Emoji +type ghost <: Emoji +type alien <: Emoji +type space_invader <: Emoji +type robot <: Emoji +type smiley_cat <: Emoji +type smile_cat <: Emoji +type joy_cat <: Emoji +type heart_eyes_cat <: Emoji +type smirk_cat <: Emoji +type kissing_cat <: Emoji +type scream_cat <: Emoji +type crying_cat_face <: Emoji +type pouting_cat <: Emoji +type see_no_evil <: Emoji +type hear_no_evil <: Emoji +type speak_no_evil <: Emoji +type love_letter <: Emoji +type cupid <: Emoji +type gift_heart <: Emoji +type sparkling_heart <: Emoji +type heartpulse <: Emoji +type heartbeat <: Emoji +type revolving_hearts <: Emoji +type two_hearts <: Emoji +type heart_decoration <: Emoji +type heavy_heart_exclamation <: Emoji +type broken_heart <: Emoji +type heart_on_fire <: Emoji +type mending_heart <: Emoji +type heart <: Emoji +type orange_heart <: Emoji +type yellow_heart <: Emoji +type green_heart <: Emoji +type blue_heart <: Emoji +type purple_heart <: Emoji +type brown_heart <: Emoji +type black_heart <: Emoji +type white_heart <: Emoji +type kiss <: Emoji +type `100` <: Emoji +type anger <: Emoji +type boom <: Emoji +type dizzy <: Emoji +type sweat_drops <: Emoji +type dash <: Emoji +type hole <: Emoji +type speech_balloon <: Emoji +type eye_speech_bubble <: Emoji +type left_speech_bubble <: Emoji +type right_anger_bubble <: Emoji +type thought_balloon <: Emoji +type zzz <: Emoji +type wave <: Emoji +type raised_back_of_hand <: Emoji +type raised_hand_with_fingers_splayed <: Emoji +type hand <: Emoji +type vulcan_salute <: Emoji +type ok_hand <: Emoji +type pinched_fingers <: Emoji +type pinching_hand <: Emoji +type v <: Emoji +type crossed_fingers <: Emoji +type love_you_gesture <: Emoji +type metal <: Emoji +type call_me_hand <: Emoji +type point_left <: Emoji +type point_right <: Emoji +type point_up_2 <: Emoji +type fu <: Emoji +type point_down <: Emoji +type point_up <: Emoji +type `+1` <: Emoji +type `-1` <: Emoji +type thumbsup <: Emoji +type thumbsdown <: Emoji +type fist <: Emoji +type facepunch <: Emoji +type fist_left <: Emoji +type fist_right <: Emoji +type clap <: Emoji +type raised_hands <: Emoji +type open_hands <: Emoji +type palms_up_together <: Emoji +type handshake <: Emoji +type pray <: Emoji +type writing_hand <: Emoji +type nail_care <: Emoji +type selfie <: Emoji +type muscle <: Emoji +type mechanical_arm <: Emoji +type mechanical_leg <: Emoji +type leg <: Emoji +type foot <: Emoji +type ear <: Emoji +type ear_with_hearing_aid <: Emoji +type nose <: Emoji +type brain <: Emoji +type anatomical_heart <: Emoji +type lungs <: Emoji +type tooth <: Emoji +type bone <: Emoji +type eyes <: Emoji +type eye <: Emoji +type tongue <: Emoji +type lips <: Emoji +type baby <: Emoji +type child <: Emoji +type boy <: Emoji +type girl <: Emoji +type adult <: Emoji +type blond_haired_person <: Emoji +type man <: Emoji +type bearded_person <: Emoji +type man_beard <: Emoji +type woman_beard <: Emoji +type red_haired_man <: Emoji +type curly_haired_man <: Emoji +type white_haired_man <: Emoji +type bald_man <: Emoji +type woman <: Emoji +type red_haired_woman <: Emoji +type person_red_hair <: Emoji +type curly_haired_woman <: Emoji +type person_curly_hair <: Emoji +type white_haired_woman <: Emoji +type person_white_hair <: Emoji +type bald_woman <: Emoji +type person_bald <: Emoji +type blond_haired_woman <: Emoji +type blond_haired_man <: Emoji +type older_adult <: Emoji +type older_man <: Emoji +type older_woman <: Emoji +type frowning_person <: Emoji +type frowning_man <: Emoji +type frowning_woman <: Emoji +type pouting_face <: Emoji +type pouting_man <: Emoji +type pouting_woman <: Emoji +type no_good <: Emoji +type ng_man <: Emoji +type ng_woman <: Emoji +type ok_person <: Emoji +type ok_man <: Emoji +type ok_woman <: Emoji +type information_desk_person <: Emoji +type sassy_man <: Emoji +type sassy_woman <: Emoji +type raising_hand <: Emoji +type raising_hand_man <: Emoji +type raising_hand_woman <: Emoji +type deaf_person <: Emoji +type deaf_man <: Emoji +type deaf_woman <: Emoji +type bow <: Emoji +type bowing_man <: Emoji +type bowing_woman <: Emoji +type facepalm <: Emoji +type man_facepalming <: Emoji +type woman_facepalming <: Emoji +type shrug <: Emoji +type man_shrugging <: Emoji +type woman_shrugging <: Emoji +type health_worker <: Emoji +type man_health_worker <: Emoji +type woman_health_worker <: Emoji +type student <: Emoji +type man_student <: Emoji +type woman_student <: Emoji +type teacher <: Emoji +type man_teacher <: Emoji +type woman_teacher <: Emoji +type judge <: Emoji +type man_judge <: Emoji +type woman_judge <: Emoji +type farmer <: Emoji +type man_farmer <: Emoji +type woman_farmer <: Emoji +type cook <: Emoji +type man_cook <: Emoji +type woman_cook <: Emoji +type mechanic <: Emoji +type man_mechanic <: Emoji +type woman_mechanic <: Emoji +type factory_worker <: Emoji +type man_factory_worker <: Emoji +type woman_factory_worker <: Emoji +type office_worker <: Emoji +type man_office_worker <: Emoji +type woman_office_worker <: Emoji +type scientist <: Emoji +type man_scientist <: Emoji +type woman_scientist <: Emoji +type technologist <: Emoji +type man_technologist <: Emoji +type woman_technologist <: Emoji +type singer <: Emoji +type man_singer <: Emoji +type woman_singer <: Emoji +type artist <: Emoji +type man_artist <: Emoji +type woman_artist <: Emoji +type pilot <: Emoji +type man_pilot <: Emoji +type woman_pilot <: Emoji +type astronaut <: Emoji +type man_astronaut <: Emoji +type woman_astronaut <: Emoji +type firefighter <: Emoji +type man_firefighter <: Emoji +type woman_firefighter <: Emoji +type cop <: Emoji +type policeman <: Emoji +type policewoman <: Emoji +type detective <: Emoji +type male_detective <: Emoji +type female_detective <: Emoji +type guard <: Emoji +type guardsman <: Emoji +type guardswoman <: Emoji +type ninja <: Emoji +type construction_worker <: Emoji +type construction_worker_man <: Emoji +type construction_worker_woman <: Emoji +type prince <: Emoji +type princess <: Emoji +type person_with_turban <: Emoji +type man_with_turban <: Emoji +type woman_with_turban <: Emoji +type man_with_gua_pi_mao <: Emoji +type woman_with_headscarf <: Emoji +type person_in_tuxedo <: Emoji +type man_in_tuxedo <: Emoji +type woman_in_tuxedo <: Emoji +type person_with_veil <: Emoji +type man_with_veil <: Emoji +type bride_with_veil <: Emoji +type pregnant_woman <: Emoji +type breast_feeding <: Emoji +type woman_feeding_baby <: Emoji +type man_feeding_baby <: Emoji +type person_feeding_baby <: Emoji +type angel <: Emoji +type santa <: Emoji +type mrs_claus <: Emoji +type mx_claus <: Emoji +type superhero <: Emoji +type superhero_man <: Emoji +type superhero_woman <: Emoji +type supervillain <: Emoji +type supervillain_man <: Emoji +type supervillain_woman <: Emoji +type mage <: Emoji +type mage_man <: Emoji +type mage_woman <: Emoji +type fairy <: Emoji +type fairy_man <: Emoji +type fairy_woman <: Emoji +type vampire <: Emoji +type vampire_man <: Emoji +type vampire_woman <: Emoji +type merperson <: Emoji +type merman <: Emoji +type mermaid <: Emoji +type elf <: Emoji +type elf_man <: Emoji +type elf_woman <: Emoji +type genie <: Emoji +type genie_man <: Emoji +type genie_woman <: Emoji +type zombie <: Emoji +type zombie_man <: Emoji +type zombie_woman <: Emoji +type massage <: Emoji +type massage_man <: Emoji +type massage_woman <: Emoji +type haircut <: Emoji +type haircut_man <: Emoji +type haircut_woman <: Emoji +type walking <: Emoji +type walking_man <: Emoji +type walking_woman <: Emoji +type standing_person <: Emoji +type standing_man <: Emoji +type standing_woman <: Emoji +type kneeling_person <: Emoji +type kneeling_man <: Emoji +type kneeling_woman <: Emoji +type person_with_probing_cane <: Emoji +type man_with_probing_cane <: Emoji +type woman_with_probing_cane <: Emoji +type person_in_motorized_wheelchair <: Emoji +type man_in_motorized_wheelchair <: Emoji +type woman_in_motorized_wheelchair <: Emoji +type person_in_manual_wheelchair <: Emoji +type man_in_manual_wheelchair <: Emoji +type woman_in_manual_wheelchair <: Emoji +type runner <: Emoji +type running_man <: Emoji +type running_woman <: Emoji +type dancer <: Emoji +type man_dancing <: Emoji +type business_suit_levitating <: Emoji +type dancers <: Emoji +type dancing_men <: Emoji +type dancing_women <: Emoji +type sauna_person <: Emoji +type sauna_man <: Emoji +type sauna_woman <: Emoji +type climbing <: Emoji +type climbing_man <: Emoji +type climbing_woman <: Emoji +type person_fencing <: Emoji +type horse_racing <: Emoji +type skier <: Emoji +type snowboarder <: Emoji +type golfing <: Emoji +type golfing_man <: Emoji +type golfing_woman <: Emoji +type surfer <: Emoji +type surfing_man <: Emoji +type surfing_woman <: Emoji +type rowboat <: Emoji +type rowing_man <: Emoji +type rowing_woman <: Emoji +type swimmer <: Emoji +type swimming_man <: Emoji +type swimming_woman <: Emoji +type bouncing_ball_person <: Emoji +type basketball_man <: Emoji +type basketball_woman <: Emoji +type weight_lifting <: Emoji +type weight_lifting_man <: Emoji +type weight_lifting_woman <: Emoji +type bicyclist <: Emoji +type biking_man <: Emoji +type biking_woman <: Emoji +type mountain_bicyclist <: Emoji +type mountain_biking_man <: Emoji +type mountain_biking_woman <: Emoji +type cartwheeling <: Emoji +type man_cartwheeling <: Emoji +type woman_cartwheeling <: Emoji +type wrestling <: Emoji +type men_wrestling <: Emoji +type women_wrestling <: Emoji +type water_polo <: Emoji +type man_playing_water_polo <: Emoji +type woman_playing_water_polo <: Emoji +type handball_person <: Emoji +type man_playing_handball <: Emoji +type woman_playing_handball <: Emoji +type juggling_person <: Emoji +type man_juggling <: Emoji +type woman_juggling <: Emoji +type lotus_position <: Emoji +type lotus_position_man <: Emoji +type lotus_position_woman <: Emoji +type bath <: Emoji +type sleeping_bed <: Emoji +type people_holding_hands <: Emoji +type two_women_holding_hands <: Emoji +type couple <: Emoji +type two_men_holding_hands <: Emoji +type couplekiss <: Emoji +type couplekiss_man_woman <: Emoji +type couplekiss_man_man <: Emoji +type couplekiss_woman_woman <: Emoji +type couple_with_heart <: Emoji +type couple_with_heart_woman_man <: Emoji +type couple_with_heart_man_man <: Emoji +type couple_with_heart_woman_woman <: Emoji +type family_man_woman_boy <: Emoji +type family_man_woman_girl <: Emoji +type family_man_woman_girl_boy <: Emoji +type family_man_woman_boy_boy <: Emoji +type family_man_woman_girl_girl <: Emoji +type family_man_man_boy <: Emoji +type family_man_man_girl <: Emoji +type family_man_man_girl_boy <: Emoji +type family_man_man_boy_boy <: Emoji +type family_man_man_girl_girl <: Emoji +type family_woman_woman_boy <: Emoji +type family_woman_woman_girl <: Emoji +type family_woman_woman_girl_boy <: Emoji +type family_woman_woman_boy_boy <: Emoji +type family_woman_woman_girl_girl <: Emoji +type family_man_boy <: Emoji +type family_man_boy_boy <: Emoji +type family_man_girl <: Emoji +type family_man_girl_boy <: Emoji +type family_man_girl_girl <: Emoji +type family_woman_boy <: Emoji +type family_woman_boy_boy <: Emoji +type family_woman_girl <: Emoji +type family_woman_girl_boy <: Emoji +type family_woman_girl_girl <: Emoji +type speaking_head <: Emoji +type bust_in_silhouette <: Emoji +type busts_in_silhouette <: Emoji +type people_hugging <: Emoji +type family <: Emoji +type footprints <: Emoji +type monkey_face <: Emoji +type monkey <: Emoji +type gorilla <: Emoji +type orangutan <: Emoji +type dog <: Emoji +type dog2 <: Emoji +type guide_dog <: Emoji +type service_dog <: Emoji +type poodle <: Emoji +type wolf <: Emoji +type fox_face <: Emoji +type raccoon <: Emoji +type cat <: Emoji +type cat2 <: Emoji +type black_cat <: Emoji +type lion <: Emoji +type tiger <: Emoji +type tiger2 <: Emoji +type leopard <: Emoji +type horse <: Emoji +type racehorse <: Emoji +type unicorn <: Emoji +type zebra <: Emoji +type deer <: Emoji +type bison <: Emoji +type cow <: Emoji +type ox <: Emoji +type water_buffalo <: Emoji +type cow2 <: Emoji +type pig <: Emoji +type pig2 <: Emoji +type boar <: Emoji +type pig_nose <: Emoji +type ram <: Emoji +type sheep <: Emoji +type goat <: Emoji +type dromedary_camel <: Emoji +type camel <: Emoji +type llama <: Emoji +type giraffe <: Emoji +type elephant <: Emoji +type mammoth <: Emoji +type rhinoceros <: Emoji +type hippopotamus <: Emoji +type mouse <: Emoji +type mouse2 <: Emoji +type rat <: Emoji +type hamster <: Emoji +type rabbit <: Emoji +type rabbit2 <: Emoji +type chipmunk <: Emoji +type beaver <: Emoji +type hedgehog <: Emoji +type bat <: Emoji +type bear <: Emoji +type polar_bear <: Emoji +type koala <: Emoji +type panda_face <: Emoji +type sloth <: Emoji +type otter <: Emoji +type skunk <: Emoji +type kangaroo <: Emoji +type badger <: Emoji +type feet <: Emoji +type turkey <: Emoji +type chicken <: Emoji +type rooster <: Emoji +type hatching_chick <: Emoji +type baby_chick <: Emoji +type hatched_chick <: Emoji +type bird <: Emoji +type penguin <: Emoji +type dove <: Emoji +type eagle <: Emoji +type duck <: Emoji +type swan <: Emoji +type owl <: Emoji +type dodo <: Emoji +type feather <: Emoji +type flamingo <: Emoji +type peacock <: Emoji +type parrot <: Emoji +type frog <: Emoji +type crocodile <: Emoji +type turtle <: Emoji +type lizard <: Emoji +type snake <: Emoji +type dragon_face <: Emoji +type dragon <: Emoji +type sauropod <: Emoji +type `t-rex` <: Emoji +type whale <: Emoji +type whale2 <: Emoji +type dolphin <: Emoji +type seal <: Emoji +type fish <: Emoji +type tropical_fish <: Emoji +type blowfish <: Emoji +type shark <: Emoji +type octopus <: Emoji +type shell <: Emoji +type snail <: Emoji +type butterfly <: Emoji +type bug <: Emoji +type ant <: Emoji +type bee <: Emoji +type beetle <: Emoji +type lady_beetle <: Emoji +type cricket <: Emoji +type cockroach <: Emoji +type spider <: Emoji +type spider_web <: Emoji +type scorpion <: Emoji +type mosquito <: Emoji +type fly <: Emoji +type worm <: Emoji +type microbe <: Emoji +type bouquet <: Emoji +type cherry_blossom <: Emoji +type white_flower <: Emoji +type rosette <: Emoji +type rose <: Emoji +type wilted_flower <: Emoji +type hibiscus <: Emoji +type sunflower <: Emoji +type blossom <: Emoji +type tulip <: Emoji +type seedling <: Emoji +type potted_plant <: Emoji +type evergreen_tree <: Emoji +type deciduous_tree <: Emoji +type palm_tree <: Emoji +type cactus <: Emoji +type ear_of_rice <: Emoji +type herb <: Emoji +type shamrock <: Emoji +type four_leaf_clover <: Emoji +type maple_leaf <: Emoji +type fallen_leaf <: Emoji +type leaves <: Emoji +type mushroom <: Emoji +type grapes <: Emoji +type melon <: Emoji +type watermelon <: Emoji +type mandarin <: Emoji +type lemon <: Emoji +type banana <: Emoji +type pineapple <: Emoji +type mango <: Emoji +type apple <: Emoji +type green_apple <: Emoji +type pear <: Emoji +type peach <: Emoji +type cherries <: Emoji +type strawberry <: Emoji +type blueberries <: Emoji +type kiwi_fruit <: Emoji +type tomato <: Emoji +type olive <: Emoji +type coconut <: Emoji +type avocado <: Emoji +type eggplant <: Emoji +type potato <: Emoji +type carrot <: Emoji +type corn <: Emoji +type hot_pepper <: Emoji +type bell_pepper <: Emoji +type cucumber <: Emoji +type leafy_green <: Emoji +type broccoli <: Emoji +type garlic <: Emoji +type onion <: Emoji +type peanuts <: Emoji +type chestnut <: Emoji +type bread <: Emoji +type croissant <: Emoji +type baguette_bread <: Emoji +type flatbread <: Emoji +type pretzel <: Emoji +type bagel <: Emoji +type pancakes <: Emoji +type waffle <: Emoji +type cheese <: Emoji +type meat_on_bone <: Emoji +type poultry_leg <: Emoji +type cut_of_meat <: Emoji +type bacon <: Emoji +type hamburger <: Emoji +type fries <: Emoji +type pizza <: Emoji +type hotdog <: Emoji +type sandwich <: Emoji +type taco <: Emoji +type burrito <: Emoji +type tamale <: Emoji +type stuffed_flatbread <: Emoji +type falafel <: Emoji +type egg <: Emoji +type fried_egg <: Emoji +type shallow_pan_of_food <: Emoji +type stew <: Emoji +type fondue <: Emoji +type bowl_with_spoon <: Emoji +type green_salad <: Emoji +type popcorn <: Emoji +type butter <: Emoji +type salt <: Emoji +type canned_food <: Emoji +type bento <: Emoji +type rice_cracker <: Emoji +type rice_ball <: Emoji +type rice <: Emoji +type curry <: Emoji +type ramen <: Emoji +type spaghetti <: Emoji +type sweet_potato <: Emoji +type oden <: Emoji +type sushi <: Emoji +type fried_shrimp <: Emoji +type fish_cake <: Emoji +type moon_cake <: Emoji +type dango <: Emoji +type dumpling <: Emoji +type fortune_cookie <: Emoji +type takeout_box <: Emoji +type crab <: Emoji +type lobster <: Emoji +type shrimp <: Emoji +type squid <: Emoji +type oyster <: Emoji +type icecream <: Emoji +type shaved_ice <: Emoji +type ice_cream <: Emoji +type doughnut <: Emoji +type cookie <: Emoji +type birthday <: Emoji +type cake <: Emoji +type cupcake <: Emoji +type pie <: Emoji +type chocolate_bar <: Emoji +type candy <: Emoji +type lollipop <: Emoji +type custard <: Emoji +type honey_pot <: Emoji +type baby_bottle <: Emoji +type milk_glass <: Emoji +type coffee <: Emoji +type teapot <: Emoji +type tea <: Emoji +type sake <: Emoji +type champagne <: Emoji +type wine_glass <: Emoji +type cocktail <: Emoji +type tropical_drink <: Emoji +type beer <: Emoji +type beers <: Emoji +type clinking_glasses <: Emoji +type tumbler_glass <: Emoji +type cup_with_straw <: Emoji +type bubble_tea <: Emoji +type beverage_box <: Emoji +type mate <: Emoji +type ice_cube <: Emoji +type chopsticks <: Emoji +type plate_with_cutlery <: Emoji +type fork_and_knife <: Emoji +type spoon <: Emoji +type hocho <: Emoji +type amphora <: Emoji +type earth_africa <: Emoji +type earth_americas <: Emoji +type earth_asia <: Emoji +type globe_with_meridians <: Emoji +type world_map <: Emoji +type japan <: Emoji +type compass <: Emoji +type mountain_snow <: Emoji +type mountain <: Emoji +type volcano <: Emoji +type mount_fuji <: Emoji +type camping <: Emoji +type beach_umbrella <: Emoji +type desert <: Emoji +type desert_island <: Emoji +type national_park <: Emoji +type stadium <: Emoji +type classical_building <: Emoji +type building_construction <: Emoji +type bricks <: Emoji +type rock <: Emoji +type wood <: Emoji +type hut <: Emoji +type houses <: Emoji +type derelict_house <: Emoji +type house <: Emoji +type house_with_garden <: Emoji +type office <: Emoji +type post_office <: Emoji +type european_post_office <: Emoji +type hospital <: Emoji +type bank <: Emoji +type hotel <: Emoji +type love_hotel <: Emoji +type convenience_store <: Emoji +type school <: Emoji +type department_store <: Emoji +type factory <: Emoji +type japanese_castle <: Emoji +type european_castle <: Emoji +type wedding <: Emoji +type tokyo_tower <: Emoji +type statue_of_liberty <: Emoji +type church <: Emoji +type mosque <: Emoji +type hindu_temple <: Emoji +type synagogue <: Emoji +type shinto_shrine <: Emoji +type kaaba <: Emoji +type fountain <: Emoji +type tent <: Emoji +type foggy <: Emoji +type night_with_stars <: Emoji +type cityscape <: Emoji +type sunrise_over_mountains <: Emoji +type sunrise <: Emoji +type city_sunset <: Emoji +type city_sunrise <: Emoji +type bridge_at_night <: Emoji +type hotsprings <: Emoji +type carousel_horse <: Emoji +type ferris_wheel <: Emoji +type roller_coaster <: Emoji +type barber <: Emoji +type circus_tent <: Emoji +type steam_locomotive <: Emoji +type railway_car <: Emoji +type bullettrain_side <: Emoji +type bullettrain_front <: Emoji +type train2 <: Emoji +type metro <: Emoji +type light_rail <: Emoji +type station <: Emoji +type tram <: Emoji +type monorail <: Emoji +type mountain_railway <: Emoji +type train <: Emoji +type bus <: Emoji +type oncoming_bus <: Emoji +type trolleybus <: Emoji +type minibus <: Emoji +type ambulance <: Emoji +type fire_engine <: Emoji +type police_car <: Emoji +type oncoming_police_car <: Emoji +type taxi <: Emoji +type oncoming_taxi <: Emoji +type car <: Emoji +type oncoming_automobile <: Emoji +type blue_car <: Emoji +type pickup_truck <: Emoji +type truck <: Emoji +type articulated_lorry <: Emoji +type tractor <: Emoji +type racing_car <: Emoji +type motorcycle <: Emoji +type motor_scooter <: Emoji +type manual_wheelchair <: Emoji +type motorized_wheelchair <: Emoji +type auto_rickshaw <: Emoji +type bike <: Emoji +type kick_scooter <: Emoji +type skateboard <: Emoji +type roller_skate <: Emoji +type busstop <: Emoji +type motorway <: Emoji +type railway_track <: Emoji +type oil_drum <: Emoji +type fuelpump <: Emoji +type rotating_light <: Emoji +type traffic_light <: Emoji +type vertical_traffic_light <: Emoji +type stop_sign <: Emoji +type construction <: Emoji +type anchor <: Emoji +type boat <: Emoji +type canoe <: Emoji +type speedboat <: Emoji +type passenger_ship <: Emoji +type ferry <: Emoji +type motor_boat <: Emoji +type ship <: Emoji +type airplane <: Emoji +type small_airplane <: Emoji +type flight_departure <: Emoji +type flight_arrival <: Emoji +type parachute <: Emoji +type seat <: Emoji +type helicopter <: Emoji +type suspension_railway <: Emoji +type mountain_cableway <: Emoji +type aerial_tramway <: Emoji +type artificial_satellite <: Emoji +type rocket <: Emoji +type flying_saucer <: Emoji +type bellhop_bell <: Emoji +type luggage <: Emoji +type hourglass <: Emoji +type hourglass_flowing_sand <: Emoji +type watch <: Emoji +type alarm_clock <: Emoji +type stopwatch <: Emoji +type timer_clock <: Emoji +type mantelpiece_clock <: Emoji +type clock12 <: Emoji +type clock1230 <: Emoji +type clock1 <: Emoji +type clock130 <: Emoji +type clock2 <: Emoji +type clock230 <: Emoji +type clock3 <: Emoji +type clock330 <: Emoji +type clock4 <: Emoji +type clock430 <: Emoji +type clock5 <: Emoji +type clock530 <: Emoji +type clock6 <: Emoji +type clock630 <: Emoji +type clock7 <: Emoji +type clock730 <: Emoji +type clock8 <: Emoji +type clock830 <: Emoji +type clock9 <: Emoji +type clock930 <: Emoji +type clock10 <: Emoji +type clock1030 <: Emoji +type clock11 <: Emoji +type clock1130 <: Emoji +type new_moon <: Emoji +type waxing_crescent_moon <: Emoji +type first_quarter_moon <: Emoji +type moon <: Emoji +type full_moon <: Emoji +type waning_gibbous_moon <: Emoji +type last_quarter_moon <: Emoji +type waning_crescent_moon <: Emoji +type crescent_moon <: Emoji +type new_moon_with_face <: Emoji +type first_quarter_moon_with_face <: Emoji +type last_quarter_moon_with_face <: Emoji +type thermometer <: Emoji +type sunny <: Emoji +type full_moon_with_face <: Emoji +type sun_with_face <: Emoji +type ringed_planet <: Emoji +type star <: Emoji +type star2 <: Emoji +type stars <: Emoji +type milky_way <: Emoji +type cloud <: Emoji +type partly_sunny <: Emoji +type cloud_with_lightning_and_rain <: Emoji +type sun_behind_small_cloud <: Emoji +type sun_behind_large_cloud <: Emoji +type sun_behind_rain_cloud <: Emoji +type cloud_with_rain <: Emoji +type cloud_with_snow <: Emoji +type cloud_with_lightning <: Emoji +type tornado <: Emoji +type fog <: Emoji +type wind_face <: Emoji +type cyclone <: Emoji +type rainbow <: Emoji +type closed_umbrella <: Emoji +type open_umbrella <: Emoji +type umbrella <: Emoji +type parasol_on_ground <: Emoji +type zap <: Emoji +type snowflake <: Emoji +type snowman_with_snow <: Emoji +type snowman <: Emoji +type comet <: Emoji +type fire <: Emoji +type droplet <: Emoji +type ocean <: Emoji +type emojijack_o_lantern <: Emoji +type christmas_tree <: Emoji +type fireworks <: Emoji +type sparkler <: Emoji +type firecracker <: Emoji +type sparkles <: Emoji +type balloon <: Emoji +type tada <: Emoji +type confetti_ball <: Emoji +type tanabata_tree <: Emoji +type bamboo <: Emoji +type dolls <: Emoji +type flags <: Emoji +type wind_chime <: Emoji +type rice_scene <: Emoji +type red_envelope <: Emoji +type ribbon <: Emoji +type gift <: Emoji +type reminder_ribbon <: Emoji +type tickets <: Emoji +type ticket <: Emoji +type medal_military <: Emoji +type trophy <: Emoji +type medal_sports <: Emoji +type `1st_place_medal` <: Emoji +type `2nd_place_medal` <: Emoji +type `3rd_place_medal` <: Emoji +type soccer <: Emoji +type baseball <: Emoji +type softball <: Emoji +type basketball <: Emoji +type volleyball <: Emoji +type football <: Emoji +type rugby_football <: Emoji +type tennis <: Emoji +type flying_disc <: Emoji +type bowling <: Emoji +type cricket_game <: Emoji +type field_hockey <: Emoji +type ice_hockey <: Emoji +type lacrosse <: Emoji +type ping_pong <: Emoji +type badminton <: Emoji +type boxing_glove <: Emoji +type martial_arts_uniform <: Emoji +type goal_net <: Emoji +type golf <: Emoji +type ice_skate <: Emoji +type fishing_pole_and_fish <: Emoji +type diving_mask <: Emoji +type running_shirt_with_sash <: Emoji +type ski <: Emoji +type sled <: Emoji +type curling_stone <: Emoji +type dart <: Emoji +type yo_yo <: Emoji +type kite <: Emoji +type gun <: Emoji +type `8ball` <: Emoji +type crystal_ball <: Emoji +type magic_wand <: Emoji +type video_game <: Emoji +type joystick <: Emoji +type slot_machine <: Emoji +type game_die <: Emoji +type jigsaw <: Emoji +type teddy_bear <: Emoji +type pinata <: Emoji +type nesting_dolls <: Emoji +type spades <: Emoji +type hearts <: Emoji +type diamonds <: Emoji +type clubs <: Emoji +type chess_pawn <: Emoji +type black_joker <: Emoji +type mahjong <: Emoji +type flower_playing_cards <: Emoji +type performing_arts <: Emoji +type framed_picture <: Emoji +type art <: Emoji +type thread <: Emoji +type sewing_needle <: Emoji +type yarn <: Emoji +type knot <: Emoji +type eyeglasses <: Emoji +type dark_sunglasses <: Emoji +type goggles <: Emoji +type lab_coat <: Emoji +type safety_vest <: Emoji +type necktie <: Emoji +type shirt <: Emoji +type jeans <: Emoji +type scarf <: Emoji +type gloves <: Emoji +type coat <: Emoji +type socks <: Emoji +type dress <: Emoji +type kimono <: Emoji +type sari <: Emoji +type one_piece_swimsuit <: Emoji +type swim_brief <: Emoji +type shorts <: Emoji +type bikini <: Emoji +type womans_clothes <: Emoji +type purse <: Emoji +type handbag <: Emoji +type pouch <: Emoji +type shopping <: Emoji +type school_satchel <: Emoji +type thong_sandal <: Emoji +type mans_shoe <: Emoji +type athletic_shoe <: Emoji +type hiking_boot <: Emoji +type flat_shoe <: Emoji +type high_heel <: Emoji +type sandal <: Emoji +type ballet_shoes <: Emoji +type boot <: Emoji +type crown <: Emoji +type womans_hat <: Emoji +type tophat <: Emoji +type mortar_board <: Emoji +type billed_cap <: Emoji +type military_helmet <: Emoji +type rescue_worker_helmet <: Emoji +type prayer_beads <: Emoji +type lipstick <: Emoji +type ring <: Emoji +type gem <: Emoji +type mute <: Emoji +type speaker <: Emoji +type sound <: Emoji +type loud_sound <: Emoji +type loudspeaker <: Emoji +type mega <: Emoji +type postal_horn <: Emoji +type bell <: Emoji +type no_bell <: Emoji +type musical_score <: Emoji +type musical_note <: Emoji +type notes <: Emoji +type studio_microphone <: Emoji +type level_slider <: Emoji +type control_knobs <: Emoji +type microphone <: Emoji +type headphones <: Emoji +type radio <: Emoji +type saxophone <: Emoji +type accordion <: Emoji +type guitar <: Emoji +type musical_keyboard <: Emoji +type trumpet <: Emoji +type violin <: Emoji +type banjo <: Emoji +type drum <: Emoji +type long_drum <: Emoji +type iphone <: Emoji +type calling <: Emoji +type phone <: Emoji +type telephone_receiver <: Emoji +type pager <: Emoji +type fax <: Emoji +type battery <: Emoji +type electric_plug <: Emoji +type computer <: Emoji +type desktop_computer <: Emoji +type printer <: Emoji +type keyboard <: Emoji +type computer_mouse <: Emoji +type trackball <: Emoji +type minidisc <: Emoji +type floppy_disk <: Emoji +type cd <: Emoji +type dvd <: Emoji +type abacus <: Emoji +type movie_camera <: Emoji +type film_strip <: Emoji +type film_projector <: Emoji +type clapper <: Emoji +type tv <: Emoji +type camera <: Emoji +type camera_flash <: Emoji +type video_camera <: Emoji +type vhs <: Emoji +type mag <: Emoji +type mag_right <: Emoji +type candle <: Emoji +type bulb <: Emoji +type flashlight <: Emoji +type izakaya_lantern <: Emoji +type diya_lamp <: Emoji +type notebook_with_decorative_cover <: Emoji +type closed_book <: Emoji +type book <: Emoji +type green_book <: Emoji +type blue_book <: Emoji +type orange_book <: Emoji +type books <: Emoji +type notebook <: Emoji +type ledger <: Emoji +type page_with_curl <: Emoji +type scroll <: Emoji +type page_facing_up <: Emoji +type newspaper <: Emoji +type newspaper_roll <: Emoji +type bookmark_tabs <: Emoji +type bookmark <: Emoji +type label <: Emoji +type moneybag <: Emoji +type coin <: Emoji +type yen <: Emoji +type dollar <: Emoji +type euro <: Emoji +type pound <: Emoji +type money_with_wings <: Emoji +type credit_card <: Emoji +type receipt <: Emoji +type chart <: Emoji +type envelope <: Emoji +type `e-mail` <: Emoji +type incoming_envelope <: Emoji +type envelope_with_arrow <: Emoji +type outbox_tray <: Emoji +type inbox_tray <: Emoji +type `package` <: Emoji +type mailbox <: Emoji +type mailbox_closed <: Emoji +type mailbox_with_mail <: Emoji +type mailbox_with_no_mail <: Emoji +type postbox <: Emoji +type ballot_box <: Emoji +type pencil2 <: Emoji +type black_nib <: Emoji +type fountain_pen <: Emoji +type pen <: Emoji +type paintbrush <: Emoji +type crayon <: Emoji +type memo <: Emoji +type briefcase <: Emoji +type file_folder <: Emoji +type open_file_folder <: Emoji +type card_index_dividers <: Emoji +type date <: Emoji +type calendar <: Emoji +type spiral_notepad <: Emoji +type spiral_calendar <: Emoji +type card_index <: Emoji +type chart_with_upwards_trend <: Emoji +type chart_with_downwards_trend <: Emoji +type bar_chart <: Emoji +type clipboard <: Emoji +type pushpin <: Emoji +type round_pushpin <: Emoji +type paperclip <: Emoji +type paperclips <: Emoji +type straight_ruler <: Emoji +type triangular_ruler <: Emoji +type scissors <: Emoji +type card_file_box <: Emoji +type file_cabinet <: Emoji +type wastebasket <: Emoji +type lock <: Emoji +type unlock <: Emoji +type lock_with_ink_pen <: Emoji +type closed_lock_with_key <: Emoji +type key <: Emoji +type old_key <: Emoji +type hammer <: Emoji +type axe <: Emoji +type pick <: Emoji +type hammer_and_pick <: Emoji +type hammer_and_wrench <: Emoji +type dagger <: Emoji +type crossed_swords <: Emoji +type bomb <: Emoji +type boomerang <: Emoji +type bow_and_arrow <: Emoji +type shield <: Emoji +type carpentry_saw <: Emoji +type wrench <: Emoji +type screwdriver <: Emoji +type nut_and_bolt <: Emoji +type gear <: Emoji +type clamp <: Emoji +type balance_scale <: Emoji +type probing_cane <: Emoji +type link <: Emoji +type chains <: Emoji +type hook <: Emoji +type toolbox <: Emoji +type magnet <: Emoji +type ladder <: Emoji +type alembic <: Emoji +type test_tube <: Emoji +type petri_dish <: Emoji +type dna <: Emoji +type microscope <: Emoji +type telescope <: Emoji +type satellite <: Emoji +type syringe <: Emoji +type drop_of_blood <: Emoji +type pill <: Emoji +type adhesive_bandage <: Emoji +type stethoscope <: Emoji +type door <: Emoji +type elevator <: Emoji +type mirror <: Emoji +type window <: Emoji +type bed <: Emoji +type couch_and_lamp <: Emoji +type chair <: Emoji +type toilet <: Emoji +type plunger <: Emoji +type shower <: Emoji +type bathtub <: Emoji +type mouse_trap <: Emoji +type razor <: Emoji +type lotion_bottle <: Emoji +type safety_pin <: Emoji +type broom <: Emoji +type basket <: Emoji +type roll_of_paper <: Emoji +type bucket <: Emoji +type soap <: Emoji +type toothbrush <: Emoji +type sponge <: Emoji +type fire_extinguisher <: Emoji +type shopping_cart <: Emoji +type smoking <: Emoji +type coffin <: Emoji +type headstone <: Emoji +type funeral_urn <: Emoji +type nazar_amulet <: Emoji +type moyai <: Emoji +type placard <: Emoji +type atm <: Emoji +type put_litter_in_its_place <: Emoji +type potable_water <: Emoji +type wheelchair <: Emoji +type mens <: Emoji +type womens <: Emoji +type restroom <: Emoji +type baby_symbol <: Emoji +type wc <: Emoji +type passport_control <: Emoji +type customs <: Emoji +type baggage_claim <: Emoji +type left_luggage <: Emoji +type warning <: Emoji +type children_crossing <: Emoji +type no_entry <: Emoji +type no_entry_sign <: Emoji +type no_bicycles <: Emoji +type no_smoking <: Emoji +type do_not_litter <: Emoji +type `non-potable_water` <: Emoji +type no_pedestrians <: Emoji +type no_mobile_phones <: Emoji +type underage <: Emoji +type radioactive <: Emoji +type biohazard <: Emoji +type arrow_up <: Emoji +type arrow_upper_right <: Emoji +type arrow_right <: Emoji +type arrow_lower_right <: Emoji +type arrow_down <: Emoji +type arrow_lower_left <: Emoji +type arrow_left <: Emoji +type arrow_upper_left <: Emoji +type arrow_up_down <: Emoji +type left_right_arrow <: Emoji +type leftwards_arrow_with_hook <: Emoji +type arrow_right_hook <: Emoji +type arrow_heading_up <: Emoji +type arrow_heading_down <: Emoji +type arrows_clockwise <: Emoji +type arrows_counterclockwise <: Emoji +type back <: Emoji +type end <: Emoji +type on <: Emoji +type soon <: Emoji +type top <: Emoji +type place_of_worship <: Emoji +type atom_symbol <: Emoji +type om <: Emoji +type star_of_david <: Emoji +type wheel_of_dharma <: Emoji +type yin_yang <: Emoji +type latin_cross <: Emoji +type orthodox_cross <: Emoji +type star_and_crescent <: Emoji +type peace_symbol <: Emoji +type menorah <: Emoji +type six_pointed_star <: Emoji +type aries <: Emoji +type taurus <: Emoji +type gemini <: Emoji +type cancer <: Emoji +type leo <: Emoji +type virgo <: Emoji +type libra <: Emoji +type scorpius <: Emoji +type sagittarius <: Emoji +type capricorn <: Emoji +type aquarius <: Emoji +type pisces <: Emoji +type ophiuchus <: Emoji +type twisted_rightwards_arrows <: Emoji +type repeat <: Emoji +type repeat_one <: Emoji +type arrow_forward <: Emoji +type fast_forward <: Emoji +type next_track_button <: Emoji +type play_or_pause_button <: Emoji +type arrow_backward <: Emoji +type rewind <: Emoji +type previous_track_button <: Emoji +type arrow_up_small <: Emoji +type arrow_double_up <: Emoji +type arrow_down_small <: Emoji +type arrow_double_down <: Emoji +type pause_button <: Emoji +type stop_button <: Emoji +type record_button <: Emoji +type eject_button <: Emoji +type cinema <: Emoji +type low_brightness <: Emoji +type high_brightness <: Emoji +type signal_strength <: Emoji +type vibration_mode <: Emoji +type mobile_phone_off <: Emoji +type female_sign <: Emoji +type male_sign <: Emoji +type transgender_symbol <: Emoji +type heavy_multiplication_x <: Emoji +type heavy_plus_sign <: Emoji +type heavy_minus_sign <: Emoji +type heavy_division_sign <: Emoji +type infinity <: Emoji +type bangbang <: Emoji +type interrobang <: Emoji +type question <: Emoji +type grey_question <: Emoji +type grey_exclamation <: Emoji +type exclamation <: Emoji +type wavy_dash <: Emoji +type currency_exchange <: Emoji +type heavy_dollar_sign <: Emoji +type medical_symbol <: Emoji +type recycle <: Emoji +type fleur_de_lis <: Emoji +type trident <: Emoji +type name_badge <: Emoji +type beginner <: Emoji +type o <: Emoji +type white_check_mark <: Emoji +type ballot_box_with_check <: Emoji +type heavy_check_mark <: Emoji +type x <: Emoji +type negative_squared_cross_mark <: Emoji +type curly_loop <: Emoji +type loop <: Emoji +type part_alternation_mark <: Emoji +type eight_spoked_asterisk <: Emoji +type eight_pointed_black_star <: Emoji +type sparkle <: Emoji +type copyright <: Emoji +type registered <: Emoji +type tm <: Emoji +type hash <: Emoji +type asterisk <: Emoji +type zero <: Emoji +type one <: Emoji +type two <: Emoji +type three <: Emoji +type four <: Emoji +type five <: Emoji +type six <: Emoji +type seven <: Emoji +type eight <: Emoji +type nine <: Emoji +type keycap_ten <: Emoji +type capital_abcd <: Emoji +type abcd <: Emoji +type `1234` <: Emoji +type symbols <: Emoji +type abc <: Emoji +type a <: Emoji +type ab <: Emoji +type b <: Emoji +type cl <: Emoji +type cool <: Emoji +type free <: Emoji +type information_source <: Emoji +type id <: Emoji +type m <: Emoji +type `new` <: Emoji +type ng <: Emoji +type o2 <: Emoji +type ok <: Emoji +type parking <: Emoji +type sos <: Emoji +type up <: Emoji +type vs <: Emoji +type koko <: Emoji +type sa <: Emoji +type u6708 <: Emoji +type u6709 <: Emoji +type u6307 <: Emoji +type ideograph_advantage <: Emoji +type u5272 <: Emoji +type u7121 <: Emoji +type u7981 <: Emoji +type accept <: Emoji +type u7533 <: Emoji +type u5408 <: Emoji +type u7a7a <: Emoji +type congratulations <: Emoji +type secret <: Emoji +type u55b6 <: Emoji +type u6e80 <: Emoji +type red_circle <: Emoji +type orange_circle <: Emoji +type yellow_circle <: Emoji +type green_circle <: Emoji +type large_blue_circle <: Emoji +type purple_circle <: Emoji +type brown_circle <: Emoji +type black_circle <: Emoji +type white_circle <: Emoji +type red_square <: Emoji +type orange_square <: Emoji +type yellow_square <: Emoji +type green_square <: Emoji +type blue_square <: Emoji +type purple_square <: Emoji +type brown_square <: Emoji +type black_large_square <: Emoji +type white_large_square <: Emoji +type black_medium_square <: Emoji +type white_medium_square <: Emoji +type black_medium_small_square <: Emoji +type white_medium_small_square <: Emoji +type black_small_square <: Emoji +type white_small_square <: Emoji +type large_orange_diamond <: Emoji +type large_blue_diamond <: Emoji +type small_orange_diamond <: Emoji +type small_blue_diamond <: Emoji +type small_red_triangle <: Emoji +type small_red_triangle_down <: Emoji +type diamond_shape_with_a_dot_inside <: Emoji +type radio_button <: Emoji +type white_square_button <: Emoji +type black_square_button <: Emoji +type checkered_flag <: Emoji +type triangular_flag_on_post <: Emoji +type crossed_flags <: Emoji +type black_flag <: Emoji +type white_flag <: Emoji +type rainbow_flag <: Emoji +type transgender_flag <: Emoji +type pirate_flag <: Emoji +type ascension_island <: Emoji +type andorra <: Emoji +type united_arab_emirates <: Emoji +type afghanistan <: Emoji +type antigua_barbuda <: Emoji +type anguilla <: Emoji +type albania <: Emoji +type armenia <: Emoji +type angola <: Emoji +type antarctica <: Emoji +type argentina <: Emoji +type american_samoa <: Emoji +type austria <: Emoji +type australia <: Emoji +type aruba <: Emoji +type aland_islands <: Emoji +type azerbaijan <: Emoji +type bosnia_herzegovina <: Emoji +type barbados <: Emoji +type bangladesh <: Emoji +type belgium <: Emoji +type burkina_faso <: Emoji +type bulgaria <: Emoji +type bahrain <: Emoji +type burundi <: Emoji +type benin <: Emoji +type st_barthelemy <: Emoji +type bermuda <: Emoji +type brunei <: Emoji +type bolivia <: Emoji +type caribbean_netherlands <: Emoji +type brazil <: Emoji +type bahamas <: Emoji +type bhutan <: Emoji +type bouvet_island <: Emoji +type botswana <: Emoji +type belarus <: Emoji +type belize <: Emoji +type canada <: Emoji +type cocos_islands <: Emoji +type congo_kinshasa <: Emoji +type central_african_republic <: Emoji +type congo_brazzaville <: Emoji +type switzerland <: Emoji +type cote_divoire <: Emoji +type cook_islands <: Emoji +type chile <: Emoji +type cameroon <: Emoji +type cn <: Emoji +type colombia <: Emoji +type clipperton_island <: Emoji +type costa_rica <: Emoji +type cuba <: Emoji +type cape_verde <: Emoji +type curacao <: Emoji +type christmas_island <: Emoji +type cyprus <: Emoji +type czech_republic <: Emoji +type de <: Emoji +type diego_garcia <: Emoji +type djibouti <: Emoji +type denmark <: Emoji +type dominica <: Emoji +type dominican_republic <: Emoji +type algeria <: Emoji +type ceuta_melilla <: Emoji +type ecuador <: Emoji +type estonia <: Emoji +type egypt <: Emoji +type western_sahara <: Emoji +type eritrea <: Emoji +type es <: Emoji +type ethiopia <: Emoji +type eu <: Emoji +type finland <: Emoji +type fiji <: Emoji +type falkland_islands <: Emoji +type micronesia <: Emoji +type faroe_islands <: Emoji +type fr <: Emoji +type gabon <: Emoji +type gb <: Emoji +type grenada <: Emoji +type georgia <: Emoji +type french_guiana <: Emoji +type guernsey <: Emoji +type ghana <: Emoji +type gibraltar <: Emoji +type greenland <: Emoji +type gambia <: Emoji +type guinea <: Emoji +type guadeloupe <: Emoji +type equatorial_guinea <: Emoji +type greece <: Emoji +type south_georgia_south_sandwich_islands <: Emoji +type guatemala <: Emoji +type guam <: Emoji +type guinea_bissau <: Emoji +type guyana <: Emoji +type hong_kong <: Emoji +type heard_mcdonald_islands <: Emoji +type honduras <: Emoji +type croatia <: Emoji +type haiti <: Emoji +type hungary <: Emoji +type canary_islands <: Emoji +type indonesia <: Emoji +type ireland <: Emoji +type israel <: Emoji +type isle_of_man <: Emoji +type india <: Emoji +type british_indian_ocean_territory <: Emoji +type iraq <: Emoji +type iran <: Emoji +type iceland <: Emoji +type it <: Emoji +type jersey <: Emoji +type jamaica <: Emoji +type jordan <: Emoji +type jp <: Emoji +type kenya <: Emoji +type kyrgyzstan <: Emoji +type cambodia <: Emoji +type kiribati <: Emoji +type comoros <: Emoji +type st_kitts_nevis <: Emoji +type north_korea <: Emoji +type kr <: Emoji +type kuwait <: Emoji +type cayman_islands <: Emoji +type kazakhstan <: Emoji +type laos <: Emoji +type lebanon <: Emoji +type st_lucia <: Emoji +type liechtenstein <: Emoji +type sri_lanka <: Emoji +type liberia <: Emoji +type lesotho <: Emoji +type lithuania <: Emoji +type luxembourg <: Emoji +type latvia <: Emoji +type libya <: Emoji +type morocco <: Emoji +type monaco <: Emoji +type moldova <: Emoji +type montenegro <: Emoji +type st_martin <: Emoji +type madagascar <: Emoji +type marshall_islands <: Emoji +type macedonia <: Emoji +type mali <: Emoji +type myanmar <: Emoji +type mongolia <: Emoji +type macau <: Emoji +type northern_mariana_islands <: Emoji +type martinique <: Emoji +type mauritania <: Emoji +type montserrat <: Emoji +type malta <: Emoji +type mauritius <: Emoji +type maldives <: Emoji +type malawi <: Emoji +type mexico <: Emoji +type malaysia <: Emoji +type mozambique <: Emoji +type namibia <: Emoji +type new_caledonia <: Emoji +type niger <: Emoji +type norfolk_island <: Emoji +type nigeria <: Emoji +type nicaragua <: Emoji +type netherlands <: Emoji +type norway <: Emoji +type nepal <: Emoji +type nauru <: Emoji +type niue <: Emoji +type new_zealand <: Emoji +type oman <: Emoji +type panama <: Emoji +type peru <: Emoji +type french_polynesia <: Emoji +type papua_new_guinea <: Emoji +type philippines <: Emoji +type pakistan <: Emoji +type poland <: Emoji +type st_pierre_miquelon <: Emoji +type pitcairn_islands <: Emoji +type puerto_rico <: Emoji +type palestinian_territories <: Emoji +type portugal <: Emoji +type palau <: Emoji +type paraguay <: Emoji +type qatar <: Emoji +type reunion <: Emoji +type romania <: Emoji +type serbia <: Emoji +type ru <: Emoji +type rwanda <: Emoji +type saudi_arabia <: Emoji +type solomon_islands <: Emoji +type seychelles <: Emoji +type sudan <: Emoji +type sweden <: Emoji +type singapore <: Emoji +type st_helena <: Emoji +type slovenia <: Emoji +type svalbard_jan_mayen <: Emoji +type slovakia <: Emoji +type sierra_leone <: Emoji +type san_marino <: Emoji +type senegal <: Emoji +type somalia <: Emoji +type suriname <: Emoji +type south_sudan <: Emoji +type sao_tome_principe <: Emoji +type el_salvador <: Emoji +type sint_maarten <: Emoji +type syria <: Emoji +type swaziland <: Emoji +type tristan_da_cunha <: Emoji +type turks_caicos_islands <: Emoji +type chad <: Emoji +type french_southern_territories <: Emoji +type togo <: Emoji +type thailand <: Emoji +type tajikistan <: Emoji +type tokelau <: Emoji +type timor_leste <: Emoji +type turkmenistan <: Emoji +type tunisia <: Emoji +type tonga <: Emoji +type tr <: Emoji +type trinidad_tobago <: Emoji +type tuvalu <: Emoji +type taiwan <: Emoji +type tanzania <: Emoji +type ukraine <: Emoji +type uganda <: Emoji +type us_outlying_islands <: Emoji +type united_nations <: Emoji +type us <: Emoji +type uruguay <: Emoji +type uzbekistan <: Emoji +type vatican_city <: Emoji +type st_vincent_grenadines <: Emoji +type venezuela <: Emoji +type british_virgin_islands <: Emoji +type us_virgin_islands <: Emoji +type vietnam <: Emoji +type vanuatu <: Emoji +type wallis_futuna <: Emoji +type samoa <: Emoji +type kosovo <: Emoji +type yemen <: Emoji +type mayotte <: Emoji +type south_africa <: Emoji +type zambia <: Emoji +type zimbabwe <: Emoji +type england <: Emoji +type scotland <: Emoji +type wales <: Emoji +type accessibility <: Emoji +type atom <: Emoji +type basecamp <: Emoji +type basecampy <: Emoji +type bowtie <: Emoji +type dependabot <: Emoji +type electron <: Emoji +type feelsgood <: Emoji +type finnadie <: Emoji +type fishsticks <: Emoji +type goberserk <: Emoji +type godmode <: Emoji +type hurtrealbad <: Emoji +type neckbeard <: Emoji +type octocat <: Emoji +type rage1 <: Emoji +type rage2 <: Emoji +type rage3 <: Emoji +type rage4 <: Emoji +type shipit <: Emoji +type suspect <: Emoji +type trollface <: Emoji diff --git a/src/main/scala/typography/Quote.scala b/src/main/scala/typography/Quote.scala new file mode 100644 index 0000000..821a2c1 --- /dev/null +++ b/src/main/scala/typography/Quote.scala @@ -0,0 +1,10 @@ +package halotukozak.smark +package typography + +import typography.macros.quote + +inline def note(inline inner: String*): String = quote[Note](inner *) +inline def tip(inline inner: String*): String = quote[Tip](inner *) +inline def important(inline inner: String*): String = quote[Important](inner *) +inline def warning(inline inner: String*): String = quote[Warning](inner *) +inline def caution(inline inner: String*): String = quote[Caution](inner *) \ No newline at end of file diff --git a/src/main/scala/typography/Reference.scala b/src/main/scala/typography/Reference.scala index 50ef1a6..384d6ac 100644 --- a/src/main/scala/typography/Reference.scala +++ b/src/main/scala/typography/Reference.scala @@ -6,8 +6,9 @@ import utils.nameOf private inline def titleFrom[Title] = nameOf[Title].filterNot(_ == '"') match case "scala.Predef.String" => "" case t => t -inline def link[Title <: String](inline url: String): String = "[" + titleFrom[Title] + "](" + url + ")" -inline def link(inline url: String, inline title: String): String = "[" + title + "](" + url + ")" -inline def image[title <: String](inline url: String): String = "![" + titleFrom[title] + "](" + url + ")" -inline def image(inline url: String, inline title: String): String = "![" + title + "](" + url + ")" \ No newline at end of file +inline def link[Title <: String](inline url: String): String = s"[${titleFrom[Title]}]($url)" +inline def link(inline url: String, inline title: String): String = s"[$title]($url)" + +inline def image[title <: String](inline url: String): String = s"!${link[title](url)}" +inline def image(inline url: String, inline title: String): String = s"!${link(url, title)}" \ No newline at end of file diff --git a/src/main/scala/typography/macros/Code.scala b/src/main/scala/typography/macros/Code.scala new file mode 100644 index 0000000..15f6bc4 --- /dev/null +++ b/src/main/scala/typography/macros/Code.scala @@ -0,0 +1,7 @@ +package halotukozak.smark +package typography.macros + +import scala.quoted.{Expr, Quotes} + +inline def codeUnsafe(inline language: String, inline inner: String): String = ${ codeUnsafeImpl('{ language }, '{ inner }) } +def codeUnsafeImpl(language: Expr[String], inner: Expr[String])(using Quotes): Expr[String] = '{ "```" + $language + "\n" + $inner + "\n```" } diff --git a/src/main/scala/typography/macros/Emoji.scala b/src/main/scala/typography/macros/Emoji.scala new file mode 100644 index 0000000..300dfa5 --- /dev/null +++ b/src/main/scala/typography/macros/Emoji.scala @@ -0,0 +1,9 @@ +package halotukozak.smark +package typography.macros + +import typography.Emoji +import utils.nameOf + +inline def emoji[E <: Emoji] = s":${nameOf[E]}:" + +inline def emojiUnsafe(inline name: String): String = s":$name:" diff --git a/src/main/scala/typography/macros/Quote.scala b/src/main/scala/typography/macros/Quote.scala new file mode 100644 index 0000000..26be947 --- /dev/null +++ b/src/main/scala/typography/macros/Quote.scala @@ -0,0 +1,8 @@ +package halotukozak.smark +package typography.macros + +import typography.* +import utils.nameOf + +inline def quote[AlertType <: Alert](inline inner: String*): String = (s"[!${nameOf[AlertType].capitalize}]" +: inner) + .map(text[Quote]).mkString("\n") \ No newline at end of file diff --git a/src/main/scala/typography/other.scala b/src/main/scala/typography/other.scala index c231d64..7aaa2a6 100644 --- a/src/main/scala/typography/other.scala +++ b/src/main/scala/typography/other.scala @@ -2,4 +2,7 @@ package halotukozak.smark package typography -inline def hr: String = "***" \ No newline at end of file +inline def hr: String = "***" +inline def paragraph(inline inner: String*): String = "\n" + inner.mkString("\n\n") +inline def comment(inline inner: String*): String = s"" +inline def html(inline args: String*): String = "\n" + args.mkString("\n") + "\n" \ No newline at end of file diff --git a/src/main/scala/utils/NameOfType.scala b/src/main/scala/utils/NameOfType.scala index 7d61165..92c8928 100644 --- a/src/main/scala/utils/NameOfType.scala +++ b/src/main/scala/utils/NameOfType.scala @@ -6,5 +6,5 @@ import scala.quoted.{Expr, Quotes, Type} inline def nameOf[T]: String = ${ nameOfImpl[T] } def nameOfImpl[T](using Type[T], Quotes): Expr[String] = Expr { - Type.show[T].stripPrefix("halotukozak.smark.typography.Code$package.") + """halotukozak\.smark\.typography\.[A-Za-z]+\$package\.""".r.replaceAllIn(Type.show[T], "") } diff --git a/src/test/scala/integration/IntegrationTest.scala b/src/test/scala/integration/IntegrationTest.scala new file mode 100644 index 0000000..2337649 --- /dev/null +++ b/src/test/scala/integration/IntegrationTest.scala @@ -0,0 +1,78 @@ +package halotukozak.smark +package integration + +import typography.* +import typography.macros.* + +import org.scalatest.matchers.should.Matchers +import org.scalatest.wordspec.AnyWordSpec + +class IntegrationTest extends AnyWordSpec with Matchers { + + "Integration" should { + "work" in { + markdown( + text[Normal]("hello"), + text[Bold]("boldedHello"), + text[Normal](text[Italic]("world")), + heading[1]("heading1"), + heading[2](bold("heading2")), + code { + scala"""val x = 1""" + }, + emoji[joy], + quote[Caution]("read this!"), + paragraph( + text[Bold & Italic]("boldedHello"), + heading[4](bold("heading4")), + list[Ordered]( + "item1", + "item2", + ) + ), + taskList( + true -> "task1", + false -> "task2", + "task3" + ), + image["Google"](url = "https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png"), + link("https://www.google.com", "Google"), + ) shouldEqual + """hello + | + |**boldedHello** + | + |*world* + | + |#heading1 + | + |##**heading2** + | + |```scala + |val x = 1 + |``` + | + |:joy: + | + |> [!Caution] + |> read this! + | + | + |***boldedHello*** + | + |####**heading4** + | + |1. item1 + |2. item2 + | + |- [x] task1 + |- [ ] task2 + |- [ ] task3 + | + |![Google](https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png) + | + |[Google](https://www.google.com)""".stripMargin + } + } + +} diff --git a/src/test/scala/typography/CodeTest.scala b/src/test/scala/typography/CodeTest.scala index e11b01a..2036956 100644 --- a/src/test/scala/typography/CodeTest.scala +++ b/src/test/scala/typography/CodeTest.scala @@ -1,7 +1,7 @@ package halotukozak.smark package typography -import typography.macros.text +import typography.macros.{codeUnsafe, text} import org.scalatest.matchers.should.Matchers import org.scalatest.wordspec.AnyWordSpec @@ -9,7 +9,7 @@ import org.scalatest.wordspec.AnyWordSpec final class CodeTest extends AnyWordSpec with Matchers { "code text" should { "be evaluated correctly" when { - "no specified" in { + "not specified" in { text[Code]("HelloWorld") shouldBe "`HelloWorld`" text[Code] { """ @@ -43,53 +43,53 @@ final class CodeTest extends AnyWordSpec with Matchers { "python" in { code(python"""print("HelloWorld")""") shouldBe - """python``` + """```python |print("HelloWorld") |```""".stripMargin } "scala" in { code(scala"""println("HelloWorld")""") shouldBe - """scala``` + """```scala |println("HelloWorld") |```""".stripMargin } "java" in { code(java"""System.out.println("HelloWorld")""") shouldBe - """java``` + """```java |System.out.println("HelloWorld") |```""".stripMargin } "kotlin" in { code(kotlin"""println("HelloWorld")""") shouldBe - """kotlin``` + """```kotlin |println("HelloWorld") |```""".stripMargin } "sql" in { code(sql"""SELECT * FROM table""") shouldBe - """sql``` + """```sql |SELECT * FROM table |```""".stripMargin } "bash" in { code(bash"""echo "HelloWorld"""") shouldBe - """bash``` + """```bash |echo "HelloWorld" |```""".stripMargin } "html" in { - html"""

HelloWorld

""" shouldBe - """ + code(html"""

HelloWorld

""") shouldBe + """```html |

HelloWorld

- |""".stripMargin + |```""".stripMargin } - "Custom" in { + "custom" in { codeUnsafe( "custom", """ |println("HelloWorld") |""".stripMargin) shouldBe - """custom``` + """```custom | |println("HelloWorld") | diff --git a/src/test/scala/typography/EmojiTest.scala b/src/test/scala/typography/EmojiTest.scala new file mode 100644 index 0000000..3fe74ac --- /dev/null +++ b/src/test/scala/typography/EmojiTest.scala @@ -0,0 +1,25 @@ +package halotukozak.smark +package typography + +import typography.macros.{emoji, emojiUnsafe} + +import org.scalatest.matchers.should.Matchers +import org.scalatest.wordspec.AnyWordSpec + +class EmojiTest extends AnyWordSpec with Matchers { + + "emoji" should { + "be evaluated correctly" in { + emoji[smile] shouldBe ":smile:" + emoji[`+1`] shouldBe ":+1:" + } + } + + "unsafeEmoji" should { + "be evaluated correctly" in { + emojiUnsafe("smile") shouldBe ":smile:" + emojiUnsafe("+1") shouldBe ":+1:" + } + } + +} diff --git a/src/test/scala/typography/QuoteTest.scala b/src/test/scala/typography/QuoteTest.scala new file mode 100644 index 0000000..77dccfd --- /dev/null +++ b/src/test/scala/typography/QuoteTest.scala @@ -0,0 +1,41 @@ +package halotukozak.smark +package typography + +import typography.* +import typography.macros.quote + +import org.scalatest.matchers.should.Matchers +import org.scalatest.wordspec.AnyWordSpec + +final class QuoteTest extends AnyWordSpec with Matchers { + "quote" should { + "be evaluated correctly" in { + quote[Note]("Hello, World!") shouldBe + """|> [!Note] + |> Hello, World!""".stripMargin + quote[Tip]("Hello, World!") shouldBe + """|> [!Tip] + |> Hello, World!""".stripMargin + quote[Warning]("Hello, World!") shouldBe + """|> [!Warning] + |> Hello, World!""".stripMargin + quote[Caution]("Hello, World!") shouldBe + """|> [!Caution] + |> Hello, World!""".stripMargin + + typography.note("Hello, World!") shouldBe + """|> [!Note] + |> Hello, World!""".stripMargin + tip("Hello, World!") shouldBe + """|> [!Tip] + |> Hello, World!""".stripMargin + warning("Hello, World!") shouldBe + """|> [!Warning] + |> Hello, World!""".stripMargin + caution("Hello, World!") shouldBe + """|> [!Caution] + |> Hello, World!""".stripMargin + + } + } +}