diff --git a/README.md b/README.md index 4930bd43..f107fd78 100644 --- a/README.md +++ b/README.md @@ -66,6 +66,12 @@ const FONT_FAMILY_MONOSPACE = Platform.select({ default: 'monospace', }); +const FONT_FAMILY_EMOJI = Platform.select({ + ios: 'Apple Color Emoji', + android: 'Noto Color Emoji', + default: 'Apple Color Emoji, Segoe UI Emoji, Noto Color Emoji', +}); + const markdownStyle: MarkdownStyle = { syntax: { color: 'gray', @@ -78,6 +84,7 @@ const markdownStyle: MarkdownStyle = { }, emoji: { fontSize: 20, + fontFamily: FONT_FAMILY_EMOJI, }, blockquote: { borderColor: 'gray', diff --git a/android/src/main/java/com/expensify/livemarkdown/MarkdownFormatter.java b/android/src/main/java/com/expensify/livemarkdown/MarkdownFormatter.java index 2ef8ccf9..78b554cd 100644 --- a/android/src/main/java/com/expensify/livemarkdown/MarkdownFormatter.java +++ b/android/src/main/java/com/expensify/livemarkdown/MarkdownFormatter.java @@ -70,7 +70,8 @@ private void applyRange(@NonNull SpannableStringBuilder ssb, @NonNull MarkdownRa setSpan(ssb, new MarkdownStrikethroughSpan(), start, end); break; case "emoji": - setSpan(ssb, new MarkdownEmojiSpan(markdownStyle.getEmojiFontSize()), start, end); + setSpan(ssb, new MarkdownFontFamilySpan(markdownStyle.getEmojiFontFamily(), mAssetManager), start, end); + setSpan(ssb, new MarkdownFontSizeSpan(markdownStyle.getEmojiFontSize()), start, end); break; case "mention-here": setSpan(ssb, new MarkdownForegroundColorSpan(markdownStyle.getMentionHereColor()), start, end); diff --git a/android/src/main/java/com/expensify/livemarkdown/MarkdownStyle.java b/android/src/main/java/com/expensify/livemarkdown/MarkdownStyle.java index 50606f98..ca71e51c 100644 --- a/android/src/main/java/com/expensify/livemarkdown/MarkdownStyle.java +++ b/android/src/main/java/com/expensify/livemarkdown/MarkdownStyle.java @@ -21,6 +21,9 @@ public class MarkdownStyle { private final float mH1FontSize; + @NonNull + private final String mEmojiFontFamily; + private final float mEmojiFontSize; @ColorInt @@ -77,6 +80,7 @@ public MarkdownStyle(@NonNull ReadableMap map, @NonNull Context context) { mLinkColor = parseColor(map, "link", "color", context); mH1FontSize = parseFloat(map, "h1", "fontSize"); mEmojiFontSize = parseFloat(map, "emoji", "fontSize"); + mEmojiFontFamily = parseString(map, "emoji", "fontFamily"); mBlockquoteBorderColor = parseColor(map, "blockquote", "borderColor", context); mBlockquoteBorderWidth = parseFloat(map, "blockquote", "borderWidth"); mBlockquoteMarginLeft = parseFloat(map, "blockquote", "marginLeft"); @@ -142,6 +146,10 @@ public float getEmojiFontSize() { return mEmojiFontSize; } + public String getEmojiFontFamily() { + return mEmojiFontFamily; + } + @ColorInt public int getBlockquoteBorderColor() { return mBlockquoteBorderColor; diff --git a/android/src/main/java/com/expensify/livemarkdown/spans/MarkdownEmojiSpan.java b/android/src/main/java/com/expensify/livemarkdown/spans/MarkdownEmojiSpan.java deleted file mode 100644 index e6654327..00000000 --- a/android/src/main/java/com/expensify/livemarkdown/spans/MarkdownEmojiSpan.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.expensify.livemarkdown.spans; - -import android.text.style.AbsoluteSizeSpan; - -import com.facebook.react.uimanager.PixelUtil; - -public class MarkdownEmojiSpan extends AbsoluteSizeSpan implements MarkdownSpan { - public MarkdownEmojiSpan(float fontSize) { - super((int) PixelUtil.toPixelFromDIP(fontSize), false); - } -} diff --git a/apple/MarkdownFormatter.mm b/apple/MarkdownFormatter.mm index fdb4116f..942a0a9f 100644 --- a/apple/MarkdownFormatter.mm +++ b/apple/MarkdownFormatter.mm @@ -74,7 +74,7 @@ - (void)applyRangeToAttributedString:(NSMutableAttributedString *)attributedStri variant:nil scaleMultiplier:0]; } else if (type == "emoji") { - font = [RCTFont updateFont:font withFamily:nil + font = [RCTFont updateFont:font withFamily:markdownStyle.emojiFontFamily size:[NSNumber numberWithFloat:markdownStyle.emojiFontSize] weight:nil style:nil diff --git a/apple/RCTMarkdownStyle.h b/apple/RCTMarkdownStyle.h index 2e3e9fad..fd88fcaf 100644 --- a/apple/RCTMarkdownStyle.h +++ b/apple/RCTMarkdownStyle.h @@ -10,6 +10,7 @@ NS_ASSUME_NONNULL_BEGIN @property (nonatomic) UIColor *linkColor; @property (nonatomic) CGFloat h1FontSize; @property (nonatomic) CGFloat emojiFontSize; +@property (nonatomic) NSString *emojiFontFamily; @property (nonatomic) UIColor *blockquoteBorderColor; @property (nonatomic) CGFloat blockquoteBorderWidth; @property (nonatomic) CGFloat blockquoteMarginLeft; diff --git a/apple/RCTMarkdownStyle.mm b/apple/RCTMarkdownStyle.mm index 42f647cb..f56f01ae 100644 --- a/apple/RCTMarkdownStyle.mm +++ b/apple/RCTMarkdownStyle.mm @@ -14,6 +14,7 @@ - (instancetype)initWithStruct:(const facebook::react::MarkdownTextInputDecorato _h1FontSize = style.h1.fontSize; _emojiFontSize = style.emoji.fontSize; + _emojiFontFamily = RCTNSStringFromString(style.emoji.fontFamily); _blockquoteBorderColor = RCTUIColorFromSharedColor(style.blockquote.borderColor); _blockquoteBorderWidth = style.blockquote.borderWidth; diff --git a/src/MarkdownTextInputDecoratorViewNativeComponent.ts b/src/MarkdownTextInputDecoratorViewNativeComponent.ts index 73d46cb5..5f8a827b 100644 --- a/src/MarkdownTextInputDecoratorViewNativeComponent.ts +++ b/src/MarkdownTextInputDecoratorViewNativeComponent.ts @@ -9,6 +9,7 @@ interface MarkdownStyle { }; emoji: { fontSize: Float; + fontFamily: string; }; link: { color: ColorValue; diff --git a/src/styleUtils.ts b/src/styleUtils.ts index 47cfa529..0592c75c 100644 --- a/src/styleUtils.ts +++ b/src/styleUtils.ts @@ -10,6 +10,12 @@ const FONT_FAMILY_MONOSPACE = Platform.select({ default: 'monospace', }); +const FONT_FAMILY_EMOJI = Platform.select({ + ios: 'Apple Color Emoji', + android: 'Noto Color Emoji', + default: 'Apple Color Emoji, Segoe UI Emoji, Noto Color Emoji', +}); + function makeDefaultMarkdownStyle(): MarkdownStyle { return { syntax: { @@ -23,6 +29,7 @@ function makeDefaultMarkdownStyle(): MarkdownStyle { }, emoji: { fontSize: 20, + fontFamily: FONT_FAMILY_EMOJI, }, blockquote: { borderColor: 'gray',