@fendent/react-native-enriched 0.5.2-fork.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.
- package/LICENSE +20 -0
- package/README.md +343 -0
- package/ReactNativeEnriched.podspec +31 -0
- package/android/build.gradle +106 -0
- package/android/generated/java/com/facebook/react/viewmanagers/EnrichedTextInputViewManagerDelegate.java +197 -0
- package/android/generated/java/com/facebook/react/viewmanagers/EnrichedTextInputViewManagerInterface.java +72 -0
- package/android/generated/jni/react/renderer/components/ReactNativeEnrichedSpec/ComponentDescriptors.cpp +22 -0
- package/android/generated/jni/react/renderer/components/ReactNativeEnrichedSpec/ComponentDescriptors.h +24 -0
- package/android/generated/jni/react/renderer/components/ReactNativeEnrichedSpec/EventEmitters.cpp +434 -0
- package/android/generated/jni/react/renderer/components/ReactNativeEnrichedSpec/EventEmitters.h +391 -0
- package/android/generated/jni/react/renderer/components/ReactNativeEnrichedSpec/Props.cpp +173 -0
- package/android/generated/jni/react/renderer/components/ReactNativeEnrichedSpec/Props.h +833 -0
- package/android/generated/jni/react/renderer/components/ReactNativeEnrichedSpec/ShadowNodes.cpp +17 -0
- package/android/generated/jni/react/renderer/components/ReactNativeEnrichedSpec/ShadowNodes.h +23 -0
- package/android/generated/jni/react/renderer/components/ReactNativeEnrichedSpec/States.cpp +16 -0
- package/android/generated/jni/react/renderer/components/ReactNativeEnrichedSpec/States.h +20 -0
- package/android/gradle.properties +5 -0
- package/android/lint.gradle +70 -0
- package/android/src/main/AndroidManifest.xml +3 -0
- package/android/src/main/AndroidManifestNew.xml +2 -0
- package/android/src/main/java/com/swmansion/enriched/ReactNativeEnrichedPackage.kt +20 -0
- package/android/src/main/java/com/swmansion/enriched/common/AsyncDrawable.kt +126 -0
- package/android/src/main/java/com/swmansion/enriched/common/CheckboxDrawable.kt +81 -0
- package/android/src/main/java/com/swmansion/enriched/common/EnrichedConstants.kt +11 -0
- package/android/src/main/java/com/swmansion/enriched/common/EnrichedStyle.kt +57 -0
- package/android/src/main/java/com/swmansion/enriched/common/ForceRedrawSpan.kt +14 -0
- package/android/src/main/java/com/swmansion/enriched/common/GumboNormalizer.kt +5 -0
- package/android/src/main/java/com/swmansion/enriched/common/MentionStyle.kt +7 -0
- package/android/src/main/java/com/swmansion/enriched/common/ResourceManager.kt +26 -0
- package/android/src/main/java/com/swmansion/enriched/common/parser/EnrichedParser.java +956 -0
- package/android/src/main/java/com/swmansion/enriched/common/parser/EnrichedSpanFactory.kt +79 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedBlockQuoteSpan.kt +53 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedBoldSpan.kt +12 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedCheckboxListSpan.kt +92 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedCodeBlockSpan.kt +81 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH1Span.kt +20 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH2Span.kt +20 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH3Span.kt +20 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH4Span.kt +21 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH5Span.kt +20 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH6Span.kt +20 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedImageSpan.kt +184 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedInlineCodeSpan.kt +24 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedItalicSpan.kt +12 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedLinkSpan.kt +29 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedMentionSpan.kt +35 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedOrderedListSpan.kt +79 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedStrikeThroughSpan.kt +11 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedUnderlineSpan.kt +11 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedUnorderedListSpan.kt +62 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/interfaces/EnrichedBlockSpan.kt +5 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/interfaces/EnrichedHeadingSpan.kt +3 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/interfaces/EnrichedInlineSpan.kt +3 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/interfaces/EnrichedParagraphSpan.kt +5 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/interfaces/EnrichedSpan.kt +3 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/interfaces/EnrichedZeroWidthSpaceSpan.kt +4 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/EnrichedTextInputConnectionWrapper.kt +140 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/EnrichedTextInputSpannableFactory.kt +83 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/EnrichedTextInputView.kt +1120 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/EnrichedTextInputViewLayoutManager.kt +27 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/EnrichedTextInputViewManager.kt +478 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/MeasurementStore.kt +225 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/events/MentionHandler.kt +55 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/events/OnChangeHtmlEvent.kt +27 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/events/OnChangeSelectionEvent.kt +30 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/events/OnChangeStateEvent.kt +21 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/events/OnChangeTextEvent.kt +30 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/events/OnContextMenuItemPressEvent.kt +35 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/events/OnInputBlurEvent.kt +25 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/events/OnInputFocusEvent.kt +25 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/events/OnInputKeyPressEvent.kt +27 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/events/OnLinkDetectedEvent.kt +32 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/events/OnMentionDetectedEvent.kt +30 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/events/OnMentionEvent.kt +34 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/events/OnPasteImagesEvent.kt +47 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/events/OnRequestHtmlResultEvent.kt +32 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/events/OnSubmitEditingEvent.kt +29 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputBlockQuoteSpan.kt +14 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputBoldSpan.kt +14 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputCheckboxListSpan.kt +15 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputCodeBlockSpan.kt +14 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH1Span.kt +14 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH2Span.kt +14 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH3Span.kt +14 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH4Span.kt +14 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH5Span.kt +14 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH6Span.kt +14 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputImageSpan.kt +36 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputInlineCodeSpan.kt +14 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputItalicSpan.kt +14 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputLinkSpan.kt +16 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputMentionSpan.kt +18 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputOrderedListSpan.kt +21 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputStrikeThroughSpan.kt +14 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputUnderlineSpan.kt +14 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputUnorderedListSpan.kt +14 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedLineHeightSpan.kt +44 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedSpans.kt +241 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/interfaces/EnrichedInputSpan.kt +10 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/styles/HtmlStyle.kt +372 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/styles/InlineStyles.kt +164 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/styles/ListStyles.kt +263 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/styles/ParagraphStyles.kt +434 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/styles/ParametrizedStyles.kt +394 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/utils/EnrichedEditableFactory.kt +17 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/utils/EnrichedSelection.kt +320 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/utils/EnrichedSpanState.kt +310 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/utils/EnrichedSpannable.kt +106 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/utils/EnrichedSpannableStringBuilder.kt +24 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/utils/RichContentReceiver.kt +127 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/utils/Utils.kt +106 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/watchers/EnrichedSpanWatcher.kt +107 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/watchers/EnrichedTextWatcher.kt +74 -0
- package/android/src/main/new_arch/CMakeLists.txt +62 -0
- package/android/src/main/new_arch/GumboNormalizerJni.cpp +14 -0
- package/android/src/main/new_arch/ReactNativeEnrichedSpec.cpp +11 -0
- package/android/src/main/new_arch/ReactNativeEnrichedSpec.h +15 -0
- package/android/src/main/new_arch/react/renderer/components/ReactNativeEnrichedSpec/EnrichedTextInputComponentDescriptor.h +35 -0
- package/android/src/main/new_arch/react/renderer/components/ReactNativeEnrichedSpec/EnrichedTextInputMeasurementManager.cpp +53 -0
- package/android/src/main/new_arch/react/renderer/components/ReactNativeEnrichedSpec/EnrichedTextInputMeasurementManager.h +25 -0
- package/android/src/main/new_arch/react/renderer/components/ReactNativeEnrichedSpec/EnrichedTextInputShadowNode.cpp +35 -0
- package/android/src/main/new_arch/react/renderer/components/ReactNativeEnrichedSpec/EnrichedTextInputShadowNode.h +53 -0
- package/android/src/main/new_arch/react/renderer/components/ReactNativeEnrichedSpec/EnrichedTextInputState.cpp +9 -0
- package/android/src/main/new_arch/react/renderer/components/ReactNativeEnrichedSpec/EnrichedTextInputState.h +24 -0
- package/android/src/main/new_arch/react/renderer/components/ReactNativeEnrichedSpec/conversions.h +27 -0
- package/android/src/main/res/drawable/broken_image.xml +10 -0
- package/cpp/CMakeLists.txt +50 -0
- package/cpp/GumboParser/GumboParser.h +34043 -0
- package/cpp/README.md +59 -0
- package/cpp/parser/GumboNormalizer.c +915 -0
- package/cpp/parser/GumboParser.cpp +16 -0
- package/cpp/parser/GumboParser.hpp +23 -0
- package/cpp/tests/GumboParserTest.cpp +457 -0
- package/ios/EnrichedTextInputView.h +53 -0
- package/ios/EnrichedTextInputView.mm +2360 -0
- package/ios/EnrichedTextInputViewManager.mm +13 -0
- package/ios/attributesManager/AttributesManager.h +17 -0
- package/ios/attributesManager/AttributesManager.mm +195 -0
- package/ios/config/InputConfig.h +104 -0
- package/ios/config/InputConfig.mm +664 -0
- package/ios/extensions/ColorExtension.h +7 -0
- package/ios/extensions/ColorExtension.mm +38 -0
- package/ios/extensions/FontExtension.h +11 -0
- package/ios/extensions/FontExtension.mm +72 -0
- package/ios/extensions/ImageExtension.h +34 -0
- package/ios/extensions/ImageExtension.mm +165 -0
- package/ios/extensions/LayoutManagerExtension.h +6 -0
- package/ios/extensions/LayoutManagerExtension.mm +443 -0
- package/ios/extensions/StringExtension.h +15 -0
- package/ios/extensions/StringExtension.mm +69 -0
- package/ios/generated/ReactNativeEnrichedSpec/ComponentDescriptors.cpp +22 -0
- package/ios/generated/ReactNativeEnrichedSpec/ComponentDescriptors.h +24 -0
- package/ios/generated/ReactNativeEnrichedSpec/EventEmitters.cpp +434 -0
- package/ios/generated/ReactNativeEnrichedSpec/EventEmitters.h +391 -0
- package/ios/generated/ReactNativeEnrichedSpec/Props.cpp +173 -0
- package/ios/generated/ReactNativeEnrichedSpec/Props.h +833 -0
- package/ios/generated/ReactNativeEnrichedSpec/RCTComponentViewHelpers.h +582 -0
- package/ios/generated/ReactNativeEnrichedSpec/ShadowNodes.cpp +17 -0
- package/ios/generated/ReactNativeEnrichedSpec/ShadowNodes.h +23 -0
- package/ios/generated/ReactNativeEnrichedSpec/States.cpp +16 -0
- package/ios/generated/ReactNativeEnrichedSpec/States.h +20 -0
- package/ios/inputParser/InputParser.h +11 -0
- package/ios/inputParser/InputParser.mm +1463 -0
- package/ios/inputTextView/InputTextView.h +6 -0
- package/ios/inputTextView/InputTextView.mm +285 -0
- package/ios/interfaces/AttributeEntry.h +9 -0
- package/ios/interfaces/AttributeEntry.mm +4 -0
- package/ios/interfaces/BaseStyleProtocol.h +17 -0
- package/ios/interfaces/ImageAttachment.h +11 -0
- package/ios/interfaces/ImageAttachment.mm +107 -0
- package/ios/interfaces/ImageData.h +10 -0
- package/ios/interfaces/ImageData.mm +4 -0
- package/ios/interfaces/LinkData.h +11 -0
- package/ios/interfaces/LinkData.mm +29 -0
- package/ios/interfaces/LinkRegexConfig.h +19 -0
- package/ios/interfaces/LinkRegexConfig.mm +37 -0
- package/ios/interfaces/MediaAttachment.h +23 -0
- package/ios/interfaces/MediaAttachment.mm +31 -0
- package/ios/interfaces/MentionParams.h +8 -0
- package/ios/interfaces/MentionParams.mm +4 -0
- package/ios/interfaces/MentionStyleProps.h +13 -0
- package/ios/interfaces/MentionStyleProps.mm +63 -0
- package/ios/interfaces/StyleBase.h +36 -0
- package/ios/interfaces/StyleBase.mm +256 -0
- package/ios/interfaces/StyleHeaders.h +102 -0
- package/ios/interfaces/StylePair.h +9 -0
- package/ios/interfaces/StylePair.mm +4 -0
- package/ios/interfaces/StyleTypeEnum.h +26 -0
- package/ios/interfaces/TextDecorationLineEnum.h +6 -0
- package/ios/interfaces/TextDecorationLineEnum.mm +4 -0
- package/ios/internals/EnrichedTextInputViewComponentDescriptor.h +19 -0
- package/ios/internals/EnrichedTextInputViewShadowNode.h +44 -0
- package/ios/internals/EnrichedTextInputViewShadowNode.mm +103 -0
- package/ios/internals/EnrichedTextInputViewState.cpp +10 -0
- package/ios/internals/EnrichedTextInputViewState.h +22 -0
- package/ios/styles/BlockQuoteStyle.mm +55 -0
- package/ios/styles/BoldStyle.mm +37 -0
- package/ios/styles/CheckboxListStyle.mm +153 -0
- package/ios/styles/CodeBlockStyle.mm +49 -0
- package/ios/styles/H1Style.mm +20 -0
- package/ios/styles/H2Style.mm +20 -0
- package/ios/styles/H3Style.mm +20 -0
- package/ios/styles/H4Style.mm +20 -0
- package/ios/styles/H5Style.mm +20 -0
- package/ios/styles/H6Style.mm +20 -0
- package/ios/styles/HeadingStyleBase.mm +65 -0
- package/ios/styles/ImageStyle.mm +146 -0
- package/ios/styles/InlineCodeStyle.mm +65 -0
- package/ios/styles/ItalicStyle.mm +37 -0
- package/ios/styles/LinkStyle.mm +532 -0
- package/ios/styles/MentionStyle.mm +538 -0
- package/ios/styles/OrderedListStyle.mm +86 -0
- package/ios/styles/StrikethroughStyle.mm +25 -0
- package/ios/styles/UnderlineStyle.mm +24 -0
- package/ios/styles/UnorderedListStyle.mm +86 -0
- package/ios/utils/CheckboxHitTestUtils.h +10 -0
- package/ios/utils/CheckboxHitTestUtils.mm +122 -0
- package/ios/utils/DotReplacementUtils.h +10 -0
- package/ios/utils/DotReplacementUtils.mm +68 -0
- package/ios/utils/KeyboardUtils.h +7 -0
- package/ios/utils/KeyboardUtils.mm +31 -0
- package/ios/utils/OccurenceUtils.h +44 -0
- package/ios/utils/OccurenceUtils.mm +179 -0
- package/ios/utils/ParagraphAttributesUtils.h +15 -0
- package/ios/utils/ParagraphAttributesUtils.mm +257 -0
- package/ios/utils/RangeUtils.h +12 -0
- package/ios/utils/RangeUtils.mm +183 -0
- package/ios/utils/TextBlockTapGestureRecognizer.h +17 -0
- package/ios/utils/TextBlockTapGestureRecognizer.mm +56 -0
- package/ios/utils/TextInsertionUtils.h +17 -0
- package/ios/utils/TextInsertionUtils.mm +64 -0
- package/ios/utils/WordsUtils.h +7 -0
- package/ios/utils/WordsUtils.mm +98 -0
- package/ios/utils/ZeroWidthSpaceUtils.h +9 -0
- package/ios/utils/ZeroWidthSpaceUtils.mm +270 -0
- package/lib/module/index.js +4 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/native/EnrichedTextInput.js +304 -0
- package/lib/module/native/EnrichedTextInput.js.map +1 -0
- package/lib/module/package.json +1 -0
- package/lib/module/spec/EnrichedTextInputNativeComponent.ts +517 -0
- package/lib/module/types.js +4 -0
- package/lib/module/types.js.map +1 -0
- package/lib/module/utils/EnrichedTextInputDefaultProps.js +12 -0
- package/lib/module/utils/EnrichedTextInputDefaultProps.js.map +1 -0
- package/lib/module/utils/normalizeHtmlStyle.js +155 -0
- package/lib/module/utils/normalizeHtmlStyle.js.map +1 -0
- package/lib/module/utils/nullthrows.js +9 -0
- package/lib/module/utils/nullthrows.js.map +1 -0
- package/lib/module/utils/regexParser.js +46 -0
- package/lib/module/utils/regexParser.js.map +1 -0
- package/lib/typescript/package.json +1 -0
- package/lib/typescript/src/index.d.ts +3 -0
- package/lib/typescript/src/index.d.ts.map +1 -0
- package/lib/typescript/src/native/EnrichedTextInput.d.ts +3 -0
- package/lib/typescript/src/native/EnrichedTextInput.d.ts.map +1 -0
- package/lib/typescript/src/spec/EnrichedTextInputNativeComponent.d.ts +397 -0
- package/lib/typescript/src/spec/EnrichedTextInputNativeComponent.d.ts.map +1 -0
- package/lib/typescript/src/types.d.ts +447 -0
- package/lib/typescript/src/types.d.ts.map +1 -0
- package/lib/typescript/src/utils/EnrichedTextInputDefaultProps.d.ts +10 -0
- package/lib/typescript/src/utils/EnrichedTextInputDefaultProps.d.ts.map +1 -0
- package/lib/typescript/src/utils/normalizeHtmlStyle.d.ts +4 -0
- package/lib/typescript/src/utils/normalizeHtmlStyle.d.ts.map +1 -0
- package/lib/typescript/src/utils/nullthrows.d.ts +2 -0
- package/lib/typescript/src/utils/nullthrows.d.ts.map +1 -0
- package/lib/typescript/src/utils/regexParser.d.ts +3 -0
- package/lib/typescript/src/utils/regexParser.d.ts.map +1 -0
- package/package.json +226 -0
- package/react-native.config.js +13 -0
- package/src/index.tsx +20 -0
- package/src/native/EnrichedTextInput.tsx +370 -0
- package/src/spec/EnrichedTextInputNativeComponent.ts +517 -0
- package/src/types.ts +499 -0
- package/src/utils/EnrichedTextInputDefaultProps.ts +9 -0
- package/src/utils/normalizeHtmlStyle.ts +199 -0
- package/src/utils/nullthrows.ts +7 -0
- package/src/utils/regexParser.ts +56 -0
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
#import "FontExtension.h"
|
|
2
|
+
#import <React/RCTLog.h>
|
|
3
|
+
|
|
4
|
+
@implementation UIFont (FontExtension)
|
|
5
|
+
|
|
6
|
+
- (BOOL)isBold {
|
|
7
|
+
return (self.fontDescriptor.symbolicTraits & UIFontDescriptorTraitBold) ==
|
|
8
|
+
UIFontDescriptorTraitBold;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
- (UIFont *)setBold {
|
|
12
|
+
if ([self isBold]) {
|
|
13
|
+
return self;
|
|
14
|
+
}
|
|
15
|
+
UIFontDescriptorSymbolicTraits newTraits =
|
|
16
|
+
(self.fontDescriptor.symbolicTraits | UIFontDescriptorTraitBold);
|
|
17
|
+
UIFontDescriptor *fontDescriptor =
|
|
18
|
+
[self.fontDescriptor fontDescriptorWithSymbolicTraits:newTraits];
|
|
19
|
+
if (fontDescriptor != nullptr) {
|
|
20
|
+
return [UIFont fontWithDescriptor:fontDescriptor size:0];
|
|
21
|
+
} else {
|
|
22
|
+
RCTLogWarn(@"[EnrichedTextInput]: Couldn't apply bold trait to the font.");
|
|
23
|
+
return self;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
- (BOOL)isItalic {
|
|
28
|
+
return (self.fontDescriptor.symbolicTraits & UIFontDescriptorTraitItalic) ==
|
|
29
|
+
UIFontDescriptorTraitItalic;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
- (UIFont *)setItalic {
|
|
33
|
+
if ([self isItalic]) {
|
|
34
|
+
return self;
|
|
35
|
+
}
|
|
36
|
+
UIFontDescriptorSymbolicTraits newTraits =
|
|
37
|
+
(self.fontDescriptor.symbolicTraits | UIFontDescriptorTraitItalic);
|
|
38
|
+
UIFontDescriptor *fontDescriptor =
|
|
39
|
+
[self.fontDescriptor fontDescriptorWithSymbolicTraits:newTraits];
|
|
40
|
+
if (fontDescriptor != nullptr) {
|
|
41
|
+
return [UIFont fontWithDescriptor:fontDescriptor size:0];
|
|
42
|
+
} else {
|
|
43
|
+
RCTLogWarn(
|
|
44
|
+
@"[EnrichedTextInput]: Couldn't apply italic trait to the font.");
|
|
45
|
+
return self;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
- (UIFont *)withFontTraits:(UIFont *)from {
|
|
50
|
+
UIFont *newFont = self;
|
|
51
|
+
if ([from isBold]) {
|
|
52
|
+
newFont = [newFont setBold];
|
|
53
|
+
}
|
|
54
|
+
if ([from isItalic]) {
|
|
55
|
+
newFont = [newFont setItalic];
|
|
56
|
+
}
|
|
57
|
+
return newFont;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
- (UIFont *)setSize:(CGFloat)size {
|
|
61
|
+
UIFontDescriptor *newFontDescriptor =
|
|
62
|
+
[self.fontDescriptor fontDescriptorWithSize:size];
|
|
63
|
+
if (newFontDescriptor != nullptr) {
|
|
64
|
+
return [UIFont fontWithDescriptor:newFontDescriptor size:0];
|
|
65
|
+
} else {
|
|
66
|
+
RCTLogWarn(
|
|
67
|
+
@"[EnrichedTextInput]: Couldn't apply heading style to the font.");
|
|
68
|
+
return self;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
@end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
#import <UIKit/UIKit.h>
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
UIImage (ImageExtension)
|
|
5
|
+
|
|
6
|
+
This category adds class methods to `UIImage` to create an animated
|
|
7
|
+
`UIImage` from animated image data (GIF or WebP).
|
|
8
|
+
*/
|
|
9
|
+
@interface UIImage (ImageExtension)
|
|
10
|
+
|
|
11
|
+
/*
|
|
12
|
+
UIImage *animation = [UIImage animatedImageWithAnimatedGIFData:theData];
|
|
13
|
+
|
|
14
|
+
I interpret `theData` as an animated image (GIF or WebP). I create an
|
|
15
|
+
animated `UIImage` using the source images and frame delays from the data.
|
|
16
|
+
|
|
17
|
+
The image stores a separate duration for each frame, in units of
|
|
18
|
+
centiseconds (hundredths of a second). However, a `UIImage` only has a
|
|
19
|
+
single, total `duration` property, which is a floating-point number.
|
|
20
|
+
|
|
21
|
+
To handle this mismatch, I add each source image to `animation` a varying
|
|
22
|
+
number of times to match the ratios between the frame durations.
|
|
23
|
+
|
|
24
|
+
For example, suppose the image contains three frames. Frame 0 has duration
|
|
25
|
+
3. Frame 1 has duration 9. Frame 2 has duration 15. I divide each
|
|
26
|
+
duration by the greatest common denominator of all the durations, which is 3,
|
|
27
|
+
and add each frame the resulting number of times. Thus `animation` will
|
|
28
|
+
contain frame 0 3/3 = 1 time, then frame 1 9/3 = 3 times, then frame 2
|
|
29
|
+
15/3 = 5 times. I set `animation.duration` to (3+9+15)/100 = 0.27 seconds.
|
|
30
|
+
*/
|
|
31
|
+
+ (UIImage *_Nullable)animatedImageWithAnimatedGIFData:
|
|
32
|
+
(NSData *_Nonnull)theData;
|
|
33
|
+
|
|
34
|
+
@end
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
#import "ImageExtension.h"
|
|
2
|
+
#import <ImageIO/ImageIO.h>
|
|
3
|
+
#include <cmath>
|
|
4
|
+
#include <vector>
|
|
5
|
+
|
|
6
|
+
#if __has_feature(objc_arc)
|
|
7
|
+
#define toCF (__bridge CFTypeRef)
|
|
8
|
+
#define fromCF (__bridge id)
|
|
9
|
+
#else
|
|
10
|
+
#define toCF (CFTypeRef)
|
|
11
|
+
#define fromCF (id)
|
|
12
|
+
#endif
|
|
13
|
+
|
|
14
|
+
// implementation from:
|
|
15
|
+
// https://github.com/mayoff/uiimage-from-animated-gif/blob/master/uiimage-from-animated-gif/UIImage%2BanimatedGIF.m
|
|
16
|
+
@implementation UIImage (ImageExtension)
|
|
17
|
+
|
|
18
|
+
static int delayCentisecondsForImageAtIndex(CGImageSourceRef const source,
|
|
19
|
+
size_t const i) {
|
|
20
|
+
int delayCentiseconds = 1;
|
|
21
|
+
CFDictionaryRef const properties =
|
|
22
|
+
CGImageSourceCopyPropertiesAtIndex(source, i, NULL);
|
|
23
|
+
if (properties) {
|
|
24
|
+
// Try GIF frame delay first
|
|
25
|
+
CFDictionaryRef formatDict = (CFDictionaryRef)CFDictionaryGetValue(
|
|
26
|
+
properties, kCGImagePropertyGIFDictionary);
|
|
27
|
+
CFStringRef unclampedKey = kCGImagePropertyGIFUnclampedDelayTime;
|
|
28
|
+
CFStringRef delayKey = kCGImagePropertyGIFDelayTime;
|
|
29
|
+
|
|
30
|
+
// Fall back to WebP frame delay
|
|
31
|
+
if (!formatDict) {
|
|
32
|
+
formatDict = (CFDictionaryRef)CFDictionaryGetValue(
|
|
33
|
+
properties, kCGImagePropertyWebPDictionary);
|
|
34
|
+
unclampedKey = kCGImagePropertyWebPUnclampedDelayTime;
|
|
35
|
+
delayKey = kCGImagePropertyWebPDelayTime;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
if (formatDict) {
|
|
39
|
+
NSNumber *number = fromCF CFDictionaryGetValue(formatDict, unclampedKey);
|
|
40
|
+
if (number == NULL || [number doubleValue] == 0) {
|
|
41
|
+
number = fromCF CFDictionaryGetValue(formatDict, delayKey);
|
|
42
|
+
}
|
|
43
|
+
if ([number doubleValue] > 0) {
|
|
44
|
+
// ImageIO exposes frame delays in seconds; convert to centiseconds.
|
|
45
|
+
delayCentiseconds = (int)lrint([number doubleValue] * 100);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
CFRelease(properties);
|
|
49
|
+
}
|
|
50
|
+
return delayCentiseconds;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Changed to use std::vector references instead of C-arrays
|
|
54
|
+
static void createImagesAndDelays(CGImageSourceRef source, size_t count,
|
|
55
|
+
std::vector<CGImageRef> &imagesOut,
|
|
56
|
+
std::vector<int> &delayCentisecondsOut) {
|
|
57
|
+
for (size_t i = 0; i < count; ++i) {
|
|
58
|
+
imagesOut[i] = CGImageSourceCreateImageAtIndex(source, i, NULL);
|
|
59
|
+
delayCentisecondsOut[i] = delayCentisecondsForImageAtIndex(source, i);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
static int sum(const std::vector<int> &values) {
|
|
64
|
+
int theSum = 0;
|
|
65
|
+
for (int value : values) {
|
|
66
|
+
theSum += value;
|
|
67
|
+
}
|
|
68
|
+
return theSum;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
static int pairGCD(int a, int b) {
|
|
72
|
+
if (a < b)
|
|
73
|
+
return pairGCD(b, a);
|
|
74
|
+
while (true) {
|
|
75
|
+
int const r = a % b;
|
|
76
|
+
if (r == 0)
|
|
77
|
+
return b;
|
|
78
|
+
a = b;
|
|
79
|
+
b = r;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
static int vectorGCD(const std::vector<int> &values) {
|
|
84
|
+
if (values.empty())
|
|
85
|
+
return 1;
|
|
86
|
+
|
|
87
|
+
int gcd = values[0];
|
|
88
|
+
for (size_t i = 1; i < values.size(); ++i) {
|
|
89
|
+
// Note that after I process the first few elements of the vector, `gcd`
|
|
90
|
+
// will probably be smaller than any remaining element. By passing the
|
|
91
|
+
// smaller value as the second argument to `pairGCD`, I avoid making it swap
|
|
92
|
+
// the arguments.
|
|
93
|
+
gcd = pairGCD(values[i], gcd);
|
|
94
|
+
}
|
|
95
|
+
return gcd;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
static NSArray *frameArray(const std::vector<CGImageRef> &images,
|
|
99
|
+
const std::vector<int> &delayCentiseconds,
|
|
100
|
+
int const totalDurationCentiseconds) {
|
|
101
|
+
int const gcd = vectorGCD(delayCentiseconds);
|
|
102
|
+
size_t const frameCount = totalDurationCentiseconds / gcd;
|
|
103
|
+
|
|
104
|
+
// Replaced VLA with NSMutableArray for safety and OBJ-C++ compatibility
|
|
105
|
+
NSMutableArray *frames = [NSMutableArray arrayWithCapacity:frameCount];
|
|
106
|
+
|
|
107
|
+
for (size_t i = 0; i < images.size(); ++i) {
|
|
108
|
+
UIImage *const frame = [UIImage imageWithCGImage:images[i]];
|
|
109
|
+
for (size_t j = delayCentiseconds[i] / gcd; j > 0; --j) {
|
|
110
|
+
[frames addObject:frame];
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return frames;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
static void releaseImages(const std::vector<CGImageRef> &images) {
|
|
117
|
+
for (CGImageRef image : images) {
|
|
118
|
+
if (image)
|
|
119
|
+
CGImageRelease(image);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
static UIImage *
|
|
124
|
+
animatedImageWithAnimatedGIFImageSource(CGImageSourceRef const source) {
|
|
125
|
+
size_t const count = CGImageSourceGetCount(source);
|
|
126
|
+
if (count == 0) {
|
|
127
|
+
return nil;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// Replaced VLAs (variable length arrays) with std::vector
|
|
131
|
+
std::vector<CGImageRef> images(count);
|
|
132
|
+
std::vector<int> delayCentiseconds(count); // in centiseconds
|
|
133
|
+
|
|
134
|
+
createImagesAndDelays(source, count, images, delayCentiseconds);
|
|
135
|
+
|
|
136
|
+
int const totalDurationCentiseconds = sum(delayCentiseconds);
|
|
137
|
+
NSArray *const frames =
|
|
138
|
+
frameArray(images, delayCentiseconds, totalDurationCentiseconds);
|
|
139
|
+
|
|
140
|
+
UIImage *const animation = [UIImage
|
|
141
|
+
animatedImageWithImages:frames
|
|
142
|
+
duration:(NSTimeInterval)totalDurationCentiseconds /
|
|
143
|
+
100.0];
|
|
144
|
+
|
|
145
|
+
releaseImages(images);
|
|
146
|
+
return animation;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
static UIImage *animatedImageWithAnimatedGIFReleasingImageSource(
|
|
150
|
+
CGImageSourceRef CF_RELEASES_ARGUMENT source) {
|
|
151
|
+
if (source) {
|
|
152
|
+
UIImage *const image = animatedImageWithAnimatedGIFImageSource(source);
|
|
153
|
+
CFRelease(source);
|
|
154
|
+
return image;
|
|
155
|
+
} else {
|
|
156
|
+
return nil;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
+ (UIImage *)animatedImageWithAnimatedGIFData:(NSData *)data {
|
|
161
|
+
return animatedImageWithAnimatedGIFReleasingImageSource(
|
|
162
|
+
CGImageSourceCreateWithData((__bridge CFDataRef)data, NULL));
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
@end
|