Skip to content

Commit

Permalink
✨ Add categories
Browse files Browse the repository at this point in the history
  • Loading branch information
maxoumime committed May 23, 2017
1 parent d54d2cf commit ed8373c
Show file tree
Hide file tree
Showing 6 changed files with 96 additions and 7 deletions.
29 changes: 29 additions & 0 deletions src/main/java/com/maximebertheau/emoji/Category.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package com.maximebertheau.emoji;

/**
* Created by Maxime Bertheau on 5/22/17.
*/
public enum Category {
SYMBOLS,
OBJECTS,
NATURE,
PEOPLE,
FOODS,
PLACES,
ACTIVITY,
FLAGS,
;

public static Category parse(String input) {
if(input == null) return null;

input = input.toUpperCase();

for (Category category : values()) {
if (category.name().equals(input))
return category;
}

return null;
}
}
24 changes: 24 additions & 0 deletions src/main/java/com/maximebertheau/emoji/Emoji.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,15 @@
* @author Vincent DURMONT [vdurmont@gmail.com]
*/
public class Emoji {
private final String name;
private final boolean supportsFitzpatrick;
private final List<String> aliases;
private final String unicode;
private final String htmlDec;
private final String htmlHex;
private final boolean isObsoleted;
private final Category category;
private final int sortOrder;

/**
* Constructor for the Emoji.
Expand All @@ -27,14 +30,20 @@ public class Emoji {
* @param bytes the emoji variations as byte array
*/
protected Emoji(
String name,
boolean supportsFitzpatrick,
List<String> aliases,
boolean isObsoleted,
Category category,
int sortOrder,
byte... bytes
) {
this.name = name;
this.supportsFitzpatrick = supportsFitzpatrick;
this.aliases = Collections.unmodifiableList(aliases);
this.isObsoleted = isObsoleted;
this.category = category;
this.sortOrder = sortOrder;

int count = 0;
try {
Expand Down Expand Up @@ -71,6 +80,10 @@ private String stringJoin(String[] array, int count) {
return joined;
}

public String getName() {
return name;
}

/**
* Returns wether the emoji supports the Fitzpatrick modifiers or not
*
Expand Down Expand Up @@ -153,6 +166,14 @@ public boolean isObsoleted() {
return isObsoleted;
}

public Category getCategory() {
return category;
}

public int getSortOrder() {
return sortOrder;
}

@Override
public boolean equals(Object other) {
return !(other == null || !(other instanceof Emoji)) &&
Expand Down Expand Up @@ -188,6 +209,9 @@ public String toString() {
", unicode='" + unicode + '\'' +
", htmlDec='" + htmlDec + '\'' +
", htmlHex='" + htmlHex + '\'' +
", isObsolete='" + isObsoleted + '\'' +
", category='" + category.name() + '\'' +
", sortOrder='" + sortOrder + '\'' +
'}';
}
}
4 changes: 3 additions & 1 deletion src/main/java/com/maximebertheau/emoji/EmojiLoader.java
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,9 @@ protected static Emoji buildEmojiFromJSON(JSONObject json) throws UnsupportedEnc
boolean supportsFitzpatrick = json.has("skin_variations");
List<String> aliases = jsonArrayToStringList(json.getJSONArray("short_names"));

return new Emoji(supportsFitzpatrick, aliases, json.has("obsoleted_by"), bytes);
Category category = Category.parse(json.optString("category"));

return new Emoji(json.optString("name"), supportsFitzpatrick, aliases, json.has("obsoleted_by"), category, json.optInt("sort_order"), bytes);
}

private static List<String> jsonArrayToStringList(JSONArray array) {
Expand Down
36 changes: 31 additions & 5 deletions src/main/java/com/maximebertheau/emoji/EmojiManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ public class EmojiManager {
new HashMap<String, List<Emoji>>();
private static final List<Emoji> ALL_EMOJIS;
private static final EmojiTrie EMOJI_TRIE;

private static final Map<Category, List<Emoji>> EMOJIS_BY_CATEGORY = new HashMap<Category, List<Emoji>>();
static {
try {
InputStream stream = EmojiLoader.class.getResourceAsStream(PATH);
Expand Down Expand Up @@ -43,23 +43,45 @@ public int compare(Emoji o1, Emoji o2) {
}
};

Comparator<Emoji> sortOrderComparator = new Comparator<Emoji>() {
public int compare(Emoji o1, Emoji o2) {
return o1.getSortOrder() - o2.getSortOrder();
}
};

Set<String> namesInsertedInCategories = new HashSet<String>();
for (Emoji emoji : emojis) {

// Add to category dictionary
Category category = emoji.getCategory();
if (category != null && !namesInsertedInCategories.contains(emoji.getName())) {

List<Emoji> emojiListForCategory = EMOJIS_BY_CATEGORY.get(category);
if (emojiListForCategory == null) emojiListForCategory = new LinkedList<Emoji>();

emojiListForCategory.add(emoji);
Collections.sort(emojiListForCategory, sortOrderComparator);

if (emoji.getName() != null) // Add all the null names
namesInsertedInCategories.add(emoji.getName());

EMOJIS_BY_CATEGORY.put(category, emojiListForCategory);
}

for (String alias : emoji.getAliases()) {

// Add to alias dictionary
List<Emoji> emojiList = EMOJIS_BY_ALIAS.get(alias);

if (emojiList == null) emojiList = new LinkedList<Emoji>();

emojiList.add(emoji);

// Make shorter unicode first
Collections.sort(emojiList, shorterUnicodeFirst);

EMOJIS_BY_ALIAS.put(alias, emojiList);
}
}

EMOJI_TRIE = new EmojiTrie(emojis);

stream.close();
} catch (IOException e) {
throw new RuntimeException(e);
Expand Down Expand Up @@ -142,6 +164,10 @@ public static boolean isOnlyEmojis(String string) {
return string != null && EmojiParser.removeAllEmojis(string).isEmpty();
}

public static List<Emoji> getByCategory(Category category) {
return EMOJIS_BY_CATEGORY.get(category);
}

/**
* Checks if sequence of chars contain an emoji.
*
Expand Down
2 changes: 1 addition & 1 deletion src/main/resources/emojis.json

Large diffs are not rendered by default.

8 changes: 8 additions & 0 deletions src/test/java/com/maximebertheau/emoji/EmojiManagerTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -138,4 +138,12 @@ public void getAll_doesnt_return_duplicates() {
}
assertEquals(unicodes.size(), emojis.size());
}

@Test
public void getAllCategories() {
for (Category category : Category.values()) {
List<Emoji> emojis = EmojiManager.getByCategory(category);
assertNotNull(emojis);
}
}
}

0 comments on commit ed8373c

Please sign in to comment.