react-native-enriched 0.2.1 → 0.4.0
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/README.md +21 -16
- package/android/build.gradle +77 -72
- package/android/generated/java/com/facebook/react/viewmanagers/EnrichedTextInputViewManagerDelegate.java +21 -0
- package/android/generated/java/com/facebook/react/viewmanagers/EnrichedTextInputViewManagerInterface.java +7 -0
- package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ComponentDescriptors.cpp +1 -1
- package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ComponentDescriptors.h +1 -1
- package/android/generated/jni/react/renderer/components/ReactNativeEnrichedSpec/EventEmitters.cpp +276 -0
- package/android/generated/jni/react/renderer/components/ReactNativeEnrichedSpec/EventEmitters.h +239 -0
- package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/Props.cpp +10 -0
- package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/Props.h +251 -0
- package/android/gradle.properties +5 -5
- package/android/lint.gradle +70 -0
- package/android/src/main/java/com/swmansion/enriched/{EnrichedTextInputViewPackage.kt → ReactNativeEnrichedPackage.kt} +4 -5
- package/android/src/main/java/com/swmansion/enriched/{utils → common}/AsyncDrawable.kt +50 -15
- 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/{spans/utils → common}/ForceRedrawSpan.kt +3 -2
- package/android/src/main/java/com/swmansion/enriched/common/MentionStyle.kt +7 -0
- package/android/src/main/java/com/swmansion/enriched/{utils → common}/ResourceManager.kt +1 -1
- package/android/src/main/java/com/swmansion/enriched/{utils → common/parser}/EnrichedParser.java +228 -160
- 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 +91 -0
- package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/EnrichedCodeBlockSpan.kt +12 -14
- 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/{spans → common/spans}/EnrichedImageSpan.kt +68 -51
- 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 +26 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedMentionSpan.kt +35 -0
- package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/EnrichedOrderedListSpan.kt +21 -29
- 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/{spans → common/spans}/EnrichedUnorderedListSpan.kt +13 -17
- 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/{spans → common/spans}/interfaces/EnrichedZeroWidthSpaceSpan.kt +2 -3
- 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/{EnrichedTextInputView.kt → textinput/EnrichedTextInputView.kt} +322 -157
- package/android/src/main/java/com/swmansion/enriched/{EnrichedTextInputViewLayoutManager.kt → textinput/EnrichedTextInputViewLayoutManager.kt} +4 -2
- package/android/src/main/java/com/swmansion/enriched/{EnrichedTextInputViewManager.kt → textinput/EnrichedTextInputViewManager.kt} +182 -66
- package/android/src/main/java/com/swmansion/enriched/{MeasurementStore.kt → textinput/MeasurementStore.kt} +75 -25
- package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/MentionHandler.kt +22 -12
- package/android/src/main/java/com/swmansion/enriched/textinput/events/OnChangeHtmlEvent.kt +27 -0
- package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnChangeSelectionEvent.kt +11 -10
- 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/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/{events → textinput/events}/OnMentionDetectedEvent.kt +11 -10
- package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnMentionEvent.kt +10 -9
- package/android/src/main/java/com/swmansion/enriched/textinput/events/OnPasteImagesEvent.kt +47 -0
- package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnRequestHtmlResultEvent.kt +2 -3
- 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 +15 -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/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/{styles → textinput/styles}/HtmlStyle.kt +129 -57
- package/android/src/main/java/com/swmansion/enriched/{styles → textinput/styles}/InlineStyles.kt +30 -13
- package/android/src/main/java/com/swmansion/enriched/textinput/styles/ListStyles.kt +263 -0
- package/android/src/main/java/com/swmansion/enriched/{styles → textinput/styles}/ParagraphStyles.kt +94 -34
- package/android/src/main/java/com/swmansion/enriched/{styles → textinput/styles}/ParametrizedStyles.kt +143 -67
- package/android/src/main/java/com/swmansion/enriched/textinput/utils/EnrichedEditableFactory.kt +17 -0
- package/android/src/main/java/com/swmansion/enriched/{utils → textinput/utils}/EnrichedSelection.kt +84 -54
- package/android/src/main/java/com/swmansion/enriched/textinput/utils/EnrichedSpanState.kt +304 -0
- package/android/src/main/java/com/swmansion/enriched/{utils/Utils.kt → textinput/utils/EnrichedSpannable.kt} +22 -31
- package/android/src/main/java/com/swmansion/enriched/textinput/utils/EnrichedSpannableStringBuilder.kt +16 -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/{watchers → textinput/watchers}/EnrichedSpanWatcher.kt +56 -24
- package/android/src/main/java/com/swmansion/enriched/{watchers → textinput/watchers}/EnrichedTextWatcher.kt +37 -14
- package/android/src/main/new_arch/CMakeLists.txt +7 -1
- 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/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/EnrichedTextInputMeasurementManager.h +1 -1
- package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/EnrichedTextInputShadowNode.h +2 -2
- package/android/src/main/new_arch/react/renderer/components/ReactNativeEnrichedSpec/conversions.h +46 -0
- package/ios/EnrichedTextInputView.h +2 -1
- package/ios/EnrichedTextInputView.mm +603 -60
- package/ios/config/InputConfig.h +28 -0
- package/ios/config/InputConfig.mm +237 -8
- package/ios/extensions/ImageExtension.h +35 -0
- package/ios/extensions/ImageExtension.mm +156 -0
- package/ios/{utils → extensions}/LayoutManagerExtension.mm +115 -95
- package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ComponentDescriptors.cpp +1 -1
- package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ComponentDescriptors.h +1 -1
- package/ios/generated/ReactNativeEnrichedSpec/EventEmitters.cpp +276 -0
- package/ios/generated/ReactNativeEnrichedSpec/EventEmitters.h +239 -0
- package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/Props.cpp +10 -0
- package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/Props.h +251 -0
- package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/RCTComponentViewHelpers.h +95 -0
- package/ios/inputParser/InputParser.mm +218 -18
- package/ios/inputTextView/InputTextView.mm +118 -0
- package/ios/{attachments → interfaces}/ImageAttachment.h +1 -0
- package/ios/interfaces/ImageAttachment.mm +46 -0
- package/ios/interfaces/LinkRegexConfig.h +19 -0
- package/ios/interfaces/LinkRegexConfig.mm +37 -0
- package/ios/{utils → interfaces}/MentionStyleProps.mm +2 -2
- package/ios/{utils → interfaces}/StyleHeaders.h +22 -1
- package/ios/{utils → interfaces}/StyleTypeEnum.h +4 -0
- package/ios/internals/EnrichedTextInputViewState.cpp +6 -6
- package/ios/styles/BlockQuoteStyle.mm +5 -5
- package/ios/styles/BoldStyle.mm +21 -6
- package/ios/styles/CheckboxListStyle.mm +321 -0
- package/ios/styles/CodeBlockStyle.mm +5 -5
- package/ios/styles/H1Style.mm +3 -0
- package/ios/styles/H2Style.mm +3 -0
- package/ios/styles/H3Style.mm +3 -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 +161 -72
- package/ios/styles/ImageStyle.mm +5 -5
- package/ios/styles/InlineCodeStyle.mm +30 -19
- package/ios/styles/ItalicStyle.mm +5 -5
- package/ios/styles/LinkStyle.mm +98 -40
- package/ios/styles/MentionStyle.mm +4 -4
- package/ios/styles/OrderedListStyle.mm +5 -5
- package/ios/styles/StrikethroughStyle.mm +5 -5
- package/ios/styles/UnderlineStyle.mm +5 -5
- package/ios/styles/UnorderedListStyle.mm +5 -5
- package/ios/utils/CheckboxHitTestUtils.h +10 -0
- package/ios/utils/CheckboxHitTestUtils.mm +123 -0
- package/ios/utils/ParagraphAttributesUtils.h +4 -0
- package/ios/utils/ParagraphAttributesUtils.mm +142 -45
- package/ios/utils/ParagraphsUtils.mm +4 -4
- package/ios/utils/TextBlockTapGestureRecognizer.h +17 -0
- package/ios/utils/TextBlockTapGestureRecognizer.mm +56 -0
- package/ios/utils/ZeroWidthSpaceUtils.mm +14 -3
- package/lib/module/EnrichedTextInput.js +57 -11
- package/lib/module/EnrichedTextInput.js.map +1 -1
- package/lib/module/{EnrichedTextInputNativeComponent.ts → spec/EnrichedTextInputNativeComponent.ts} +175 -18
- package/lib/module/types.js +4 -0
- package/lib/module/types.js.map +1 -0
- package/lib/module/{normalizeHtmlStyle.js → utils/normalizeHtmlStyle.js} +18 -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/src/EnrichedTextInput.d.ts +20 -51
- package/lib/typescript/src/EnrichedTextInput.d.ts.map +1 -1
- package/lib/typescript/src/index.d.ts +2 -1
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/lib/typescript/src/{EnrichedTextInputNativeComponent.d.ts → spec/EnrichedTextInputNativeComponent.d.ts} +154 -18
- package/lib/typescript/src/spec/EnrichedTextInputNativeComponent.d.ts.map +1 -0
- package/lib/typescript/src/types.d.ts +58 -0
- package/lib/typescript/src/types.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 +13 -9
- package/src/EnrichedTextInput.tsx +88 -63
- package/src/index.tsx +5 -1
- package/src/{EnrichedTextInputNativeComponent.ts → spec/EnrichedTextInputNativeComponent.ts} +175 -18
- package/src/types.ts +59 -0
- package/src/{normalizeHtmlStyle.ts → utils/normalizeHtmlStyle.ts} +20 -5
- package/src/utils/nullthrows.ts +7 -0
- package/src/utils/regexParser.ts +56 -0
- package/android/generated/jni/react/renderer/components/RNEnrichedTextInputViewSpec/EventEmitters.cpp +0 -128
- package/android/generated/jni/react/renderer/components/RNEnrichedTextInputViewSpec/EventEmitters.h +0 -102
- package/android/src/main/java/com/swmansion/enriched/events/OnChangeHtmlEvent.kt +0 -28
- package/android/src/main/java/com/swmansion/enriched/events/OnChangeStateEvent.kt +0 -24
- package/android/src/main/java/com/swmansion/enriched/events/OnChangeTextEvent.kt +0 -30
- package/android/src/main/java/com/swmansion/enriched/events/OnInputBlurEvent.kt +0 -27
- package/android/src/main/java/com/swmansion/enriched/events/OnInputFocusEvent.kt +0 -27
- package/android/src/main/java/com/swmansion/enriched/events/OnLinkDetectedEvent.kt +0 -30
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedBlockQuoteSpan.kt +0 -44
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedBoldSpan.kt +0 -16
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedH1Span.kt +0 -23
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedH2Span.kt +0 -23
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedH3Span.kt +0 -23
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedInlineCodeSpan.kt +0 -27
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedItalicSpan.kt +0 -15
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedLinkSpan.kt +0 -30
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedMentionSpan.kt +0 -42
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedSpans.kt +0 -136
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedStrikeThroughSpan.kt +0 -14
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedUnderlineSpan.kt +0 -14
- package/android/src/main/java/com/swmansion/enriched/spans/interfaces/EnrichedBlockSpan.kt +0 -4
- package/android/src/main/java/com/swmansion/enriched/spans/interfaces/EnrichedHeadingSpan.kt +0 -4
- package/android/src/main/java/com/swmansion/enriched/spans/interfaces/EnrichedInlineSpan.kt +0 -4
- package/android/src/main/java/com/swmansion/enriched/spans/interfaces/EnrichedParagraphSpan.kt +0 -4
- package/android/src/main/java/com/swmansion/enriched/spans/interfaces/EnrichedSpan.kt +0 -8
- package/android/src/main/java/com/swmansion/enriched/styles/ListStyles.kt +0 -172
- package/android/src/main/java/com/swmansion/enriched/utils/EnrichedSpanState.kt +0 -204
- package/android/src/main/new_arch/RNEnrichedTextInputViewSpec.cpp +0 -22
- package/android/src/main/new_arch/RNEnrichedTextInputViewSpec.h +0 -26
- package/android/src/main/new_arch/react/renderer/components/RNEnrichedTextInputViewSpec/conversions.h +0 -26
- package/ios/attachments/ImageAttachment.mm +0 -34
- package/ios/generated/RNEnrichedTextInputViewSpec/EventEmitters.cpp +0 -128
- package/ios/generated/RNEnrichedTextInputViewSpec/EventEmitters.h +0 -102
- package/lib/module/normalizeHtmlStyle.js.map +0 -1
- package/lib/typescript/src/EnrichedTextInputNativeComponent.d.ts.map +0 -1
- package/lib/typescript/src/normalizeHtmlStyle.d.ts +0 -4
- package/lib/typescript/src/normalizeHtmlStyle.d.ts.map +0 -1
- /package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ShadowNodes.cpp +0 -0
- /package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ShadowNodes.h +0 -0
- /package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/States.cpp +0 -0
- /package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/States.h +0 -0
- /package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/EnrichedTextInputComponentDescriptor.h +0 -0
- /package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/EnrichedTextInputMeasurementManager.cpp +0 -0
- /package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/EnrichedTextInputShadowNode.cpp +0 -0
- /package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/EnrichedTextInputState.cpp +0 -0
- /package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/EnrichedTextInputState.h +0 -0
- /package/ios/{utils → extensions}/ColorExtension.h +0 -0
- /package/ios/{utils → extensions}/ColorExtension.mm +0 -0
- /package/ios/{utils → extensions}/FontExtension.h +0 -0
- /package/ios/{utils → extensions}/FontExtension.mm +0 -0
- /package/ios/{utils → extensions}/LayoutManagerExtension.h +0 -0
- /package/ios/{utils → extensions}/StringExtension.h +0 -0
- /package/ios/{utils → extensions}/StringExtension.mm +0 -0
- /package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ShadowNodes.cpp +0 -0
- /package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ShadowNodes.h +0 -0
- /package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/States.cpp +0 -0
- /package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/States.h +0 -0
- /package/ios/{utils → interfaces}/BaseStyleProtocol.h +0 -0
- /package/ios/{utils → interfaces}/ImageData.h +0 -0
- /package/ios/{utils → interfaces}/ImageData.mm +0 -0
- /package/ios/{utils → interfaces}/LinkData.h +0 -0
- /package/ios/{utils → interfaces}/LinkData.mm +0 -0
- /package/ios/{attachments → interfaces}/MediaAttachment.h +0 -0
- /package/ios/{attachments → interfaces}/MediaAttachment.mm +0 -0
- /package/ios/{utils → interfaces}/MentionParams.h +0 -0
- /package/ios/{utils → interfaces}/MentionParams.mm +0 -0
- /package/ios/{utils → interfaces}/MentionStyleProps.h +0 -0
- /package/ios/{utils → interfaces}/StylePair.h +0 -0
- /package/ios/{utils → interfaces}/StylePair.mm +0 -0
- /package/ios/{utils → interfaces}/TextDecorationLineEnum.h +0 -0
- /package/ios/{utils → interfaces}/TextDecorationLineEnum.mm +0 -0
|
@@ -1,28 +1,37 @@
|
|
|
1
|
-
package com.swmansion.enriched.styles
|
|
1
|
+
package com.swmansion.enriched.textinput.styles
|
|
2
2
|
|
|
3
3
|
import android.text.Editable
|
|
4
4
|
import android.text.Spannable
|
|
5
5
|
import android.text.SpannableStringBuilder
|
|
6
6
|
import android.text.Spanned
|
|
7
|
-
import com.swmansion.enriched.
|
|
8
|
-
import com.swmansion.enriched.
|
|
9
|
-
import com.swmansion.enriched.spans.
|
|
10
|
-
import com.swmansion.enriched.spans.
|
|
11
|
-
import com.swmansion.enriched.spans.
|
|
12
|
-
import com.swmansion.enriched.
|
|
13
|
-
|
|
14
|
-
|
|
7
|
+
import com.swmansion.enriched.common.EnrichedConstants
|
|
8
|
+
import com.swmansion.enriched.textinput.EnrichedTextInputView
|
|
9
|
+
import com.swmansion.enriched.textinput.spans.EnrichedInputImageSpan
|
|
10
|
+
import com.swmansion.enriched.textinput.spans.EnrichedInputLinkSpan
|
|
11
|
+
import com.swmansion.enriched.textinput.spans.EnrichedInputMentionSpan
|
|
12
|
+
import com.swmansion.enriched.textinput.spans.EnrichedSpans
|
|
13
|
+
import com.swmansion.enriched.textinput.utils.getSafeSpanBoundaries
|
|
14
|
+
import com.swmansion.enriched.textinput.utils.removeZWS
|
|
15
|
+
|
|
16
|
+
class ParametrizedStyles(
|
|
17
|
+
private val view: EnrichedTextInputView,
|
|
18
|
+
) {
|
|
15
19
|
private var mentionStart: Int? = null
|
|
16
20
|
private var isSettingLinkSpan = false
|
|
17
21
|
|
|
18
22
|
var mentionIndicators: Array<String> = emptyArray<String>()
|
|
19
23
|
|
|
20
|
-
fun <T>removeSpansForRange(
|
|
24
|
+
fun <T> removeSpansForRange(
|
|
25
|
+
spannable: Spannable,
|
|
26
|
+
start: Int,
|
|
27
|
+
end: Int,
|
|
28
|
+
clazz: Class<T>,
|
|
29
|
+
): Boolean {
|
|
21
30
|
val ssb = spannable as SpannableStringBuilder
|
|
22
31
|
val spans = ssb.getSpans(start, end, clazz)
|
|
23
32
|
if (spans.isEmpty()) return false
|
|
24
33
|
|
|
25
|
-
ssb.
|
|
34
|
+
ssb.removeZWS(start, end)
|
|
26
35
|
|
|
27
36
|
for (span in spans) {
|
|
28
37
|
ssb.removeSpan(span)
|
|
@@ -31,11 +40,16 @@ class ParametrizedStyles(private val view: EnrichedTextInputView) {
|
|
|
31
40
|
return true
|
|
32
41
|
}
|
|
33
42
|
|
|
34
|
-
fun setLinkSpan(
|
|
43
|
+
fun setLinkSpan(
|
|
44
|
+
start: Int,
|
|
45
|
+
end: Int,
|
|
46
|
+
text: String,
|
|
47
|
+
url: String,
|
|
48
|
+
) {
|
|
35
49
|
isSettingLinkSpan = true
|
|
36
50
|
|
|
37
51
|
val spannable = view.text as SpannableStringBuilder
|
|
38
|
-
val spans = spannable.getSpans(start, end,
|
|
52
|
+
val spans = spannable.getSpans(start, end, EnrichedInputLinkSpan::class.java)
|
|
39
53
|
for (span in spans) {
|
|
40
54
|
spannable.removeSpan(span)
|
|
41
55
|
}
|
|
@@ -47,7 +61,7 @@ class ParametrizedStyles(private val view: EnrichedTextInputView) {
|
|
|
47
61
|
}
|
|
48
62
|
|
|
49
63
|
val spanEnd = start + text.length
|
|
50
|
-
val span =
|
|
64
|
+
val span = EnrichedInputLinkSpan(url, view.htmlStyle)
|
|
51
65
|
val (safeStart, safeEnd) = spannable.getSafeSpanBoundaries(start, spanEnd)
|
|
52
66
|
spannable.setSpan(span, safeStart, safeEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
|
|
53
67
|
|
|
@@ -55,36 +69,66 @@ class ParametrizedStyles(private val view: EnrichedTextInputView) {
|
|
|
55
69
|
isSettingLinkSpan = false
|
|
56
70
|
}
|
|
57
71
|
|
|
58
|
-
fun afterTextChanged(
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
72
|
+
fun afterTextChanged(
|
|
73
|
+
s: Editable,
|
|
74
|
+
startCursorPosition: Int,
|
|
75
|
+
endCursorPosition: Int,
|
|
76
|
+
) {
|
|
77
|
+
afterTextChangedLinks(startCursorPosition, endCursorPosition)
|
|
78
|
+
afterTextChangedMentions(s, startCursorPosition)
|
|
63
79
|
}
|
|
64
80
|
|
|
65
|
-
fun
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
81
|
+
fun detectLinksInRange(
|
|
82
|
+
spannable: Spannable,
|
|
83
|
+
start: Int,
|
|
84
|
+
end: Int,
|
|
85
|
+
) {
|
|
86
|
+
val regex = view.linkRegex ?: return
|
|
87
|
+
val contextText = spannable.subSequence(start, end).toString()
|
|
70
88
|
|
|
71
|
-
val spans = spannable.getSpans(
|
|
89
|
+
val spans = spannable.getSpans(start, end, EnrichedInputLinkSpan::class.java)
|
|
72
90
|
for (span in spans) {
|
|
73
91
|
spannable.removeSpan(span)
|
|
74
92
|
}
|
|
75
93
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
94
|
+
val wordsRegex = Regex("\\S+")
|
|
95
|
+
for (wordMatch in wordsRegex.findAll(contextText)) {
|
|
96
|
+
var word = wordMatch.value
|
|
97
|
+
var wordStart = wordMatch.range.first
|
|
98
|
+
|
|
99
|
+
// Do not include zero-width space in link detection
|
|
100
|
+
if (word.startsWith(EnrichedConstants.ZWS_STRING)) {
|
|
101
|
+
word = word.substring(1)
|
|
102
|
+
wordStart += 1
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// Loop over words and detect links
|
|
106
|
+
val matcher = regex.matcher(word)
|
|
107
|
+
while (matcher.find()) {
|
|
108
|
+
val linkStart = matcher.start()
|
|
109
|
+
val linkEnd = matcher.end()
|
|
110
|
+
|
|
111
|
+
val spanStart = start + wordStart + linkStart
|
|
112
|
+
val spanEnd = start + wordStart + linkEnd
|
|
113
|
+
|
|
114
|
+
val span = EnrichedInputLinkSpan(matcher.group(), view.htmlStyle)
|
|
115
|
+
val (safeStart, safeEnd) = spannable.getSafeSpanBoundaries(spanStart, spanEnd)
|
|
116
|
+
|
|
117
|
+
spannable.setSpan(
|
|
118
|
+
span,
|
|
119
|
+
safeStart,
|
|
120
|
+
safeEnd,
|
|
121
|
+
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE,
|
|
122
|
+
)
|
|
123
|
+
}
|
|
83
124
|
}
|
|
84
125
|
}
|
|
85
126
|
|
|
86
|
-
private fun getWordAtIndex(
|
|
87
|
-
|
|
127
|
+
private fun getWordAtIndex(
|
|
128
|
+
s: CharSequence,
|
|
129
|
+
index: Int,
|
|
130
|
+
): TextRange? {
|
|
131
|
+
if (index < 0) return null
|
|
88
132
|
|
|
89
133
|
var start = index
|
|
90
134
|
var end = index
|
|
@@ -102,8 +146,31 @@ class ParametrizedStyles(private val view: EnrichedTextInputView) {
|
|
|
102
146
|
return TextRange(result, start, end)
|
|
103
147
|
}
|
|
104
148
|
|
|
149
|
+
// After editing text we want to automatically detect links in the affected range
|
|
150
|
+
// Affected range is range + previous word + next word
|
|
151
|
+
private fun getLinksAffectedRange(
|
|
152
|
+
s: CharSequence,
|
|
153
|
+
start: Int,
|
|
154
|
+
end: Int,
|
|
155
|
+
): IntRange {
|
|
156
|
+
var actualStart = start
|
|
157
|
+
var actualEnd = end
|
|
158
|
+
|
|
159
|
+
// Expand backward to find the start of the first affected word
|
|
160
|
+
while (actualStart > 0 && !Character.isWhitespace(s[actualStart - 1])) {
|
|
161
|
+
actualStart--
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
// Expand forward to find the end of the last affected word
|
|
165
|
+
while (actualEnd < s.length && !Character.isWhitespace(s[actualEnd])) {
|
|
166
|
+
actualEnd++
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
return actualStart..actualEnd
|
|
170
|
+
}
|
|
171
|
+
|
|
105
172
|
private fun canLinkBeApplied(): Boolean {
|
|
106
|
-
val mergingConfig = EnrichedSpans.getMergingConfigForStyle(EnrichedSpans.LINK, view.htmlStyle)?: return true
|
|
173
|
+
val mergingConfig = EnrichedSpans.getMergingConfigForStyle(EnrichedSpans.LINK, view.htmlStyle) ?: return true
|
|
107
174
|
val conflictingStyles = mergingConfig.conflictingStyles
|
|
108
175
|
val blockingStyles = mergingConfig.blockingStyles
|
|
109
176
|
|
|
@@ -118,36 +185,31 @@ class ParametrizedStyles(private val view: EnrichedTextInputView) {
|
|
|
118
185
|
return true
|
|
119
186
|
}
|
|
120
187
|
|
|
121
|
-
private fun afterTextChangedLinks(
|
|
188
|
+
private fun afterTextChangedLinks(
|
|
189
|
+
editStart: Int,
|
|
190
|
+
editEnd: Int,
|
|
191
|
+
) {
|
|
122
192
|
// Do not detect link if it's applied manually
|
|
123
193
|
if (isSettingLinkSpan || !canLinkBeApplied()) return
|
|
124
194
|
|
|
125
|
-
val spannable = view.text as Spannable
|
|
126
|
-
val (
|
|
127
|
-
|
|
128
|
-
// TODO: Consider using more reliable regex, this one matches almost anything
|
|
129
|
-
val urlPattern = android.util.Patterns.WEB_URL.matcher(word)
|
|
130
|
-
val spans = spannable.getSpans(start, end, EnrichedLinkSpan::class.java)
|
|
131
|
-
for (span in spans) {
|
|
132
|
-
spannable.removeSpan(span)
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
if (urlPattern.matches()) {
|
|
136
|
-
val span = EnrichedLinkSpan(word, view.htmlStyle)
|
|
137
|
-
val (safeStart, safeEnd) = spannable.getSafeSpanBoundaries(start, end)
|
|
138
|
-
spannable.setSpan(span, safeStart, safeEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
|
|
139
|
-
}
|
|
195
|
+
val spannable = view.text as? Spannable ?: return
|
|
196
|
+
val affectedRange = getLinksAffectedRange(spannable, editStart, editEnd)
|
|
197
|
+
detectLinksInRange(spannable, affectedRange.first, affectedRange.last)
|
|
140
198
|
}
|
|
141
199
|
|
|
142
|
-
private fun afterTextChangedMentions(
|
|
200
|
+
private fun afterTextChangedMentions(
|
|
201
|
+
s: CharSequence,
|
|
202
|
+
endCursorPosition: Int,
|
|
203
|
+
) {
|
|
143
204
|
val mentionHandler = view.mentionHandler ?: return
|
|
205
|
+
val currentWord = getWordAtIndex(s, endCursorPosition) ?: return
|
|
144
206
|
val spannable = view.text as Spannable
|
|
145
207
|
|
|
146
208
|
val indicatorsPattern = mentionIndicators.joinToString("|") { Regex.escape(it) }
|
|
147
209
|
val mentionIndicatorRegex = Regex("^($indicatorsPattern)")
|
|
148
|
-
val mentionRegex= Regex("^($indicatorsPattern)\\w*")
|
|
210
|
+
val mentionRegex = Regex("^($indicatorsPattern)\\w*")
|
|
149
211
|
|
|
150
|
-
val spans = spannable.getSpans(currentWord.start, currentWord.end,
|
|
212
|
+
val spans = spannable.getSpans(currentWord.start, currentWord.end, EnrichedInputMentionSpan::class.java)
|
|
151
213
|
for (span in spans) {
|
|
152
214
|
spannable.removeSpan(span)
|
|
153
215
|
}
|
|
@@ -192,24 +254,28 @@ class ParametrizedStyles(private val view: EnrichedTextInputView) {
|
|
|
192
254
|
mentionHandler.onMention(indicator, text)
|
|
193
255
|
}
|
|
194
256
|
|
|
195
|
-
fun setImageSpan(
|
|
257
|
+
fun setImageSpan(
|
|
258
|
+
src: String,
|
|
259
|
+
width: Float,
|
|
260
|
+
height: Float,
|
|
261
|
+
) {
|
|
196
262
|
if (view.selection == null) return
|
|
197
263
|
val spannable = view.text as SpannableStringBuilder
|
|
198
264
|
val (start, originalEnd) = view.selection.getInlineSelection()
|
|
199
265
|
|
|
200
266
|
if (start == originalEnd) {
|
|
201
|
-
spannable.insert(start,
|
|
267
|
+
spannable.insert(start, EnrichedConstants.ORC_STRING)
|
|
202
268
|
} else {
|
|
203
|
-
val spans = spannable.getSpans(start, originalEnd,
|
|
269
|
+
val spans = spannable.getSpans(start, originalEnd, EnrichedInputImageSpan::class.java)
|
|
204
270
|
for (s in spans) {
|
|
205
271
|
spannable.removeSpan(s)
|
|
206
272
|
}
|
|
207
273
|
|
|
208
|
-
spannable.replace(start, originalEnd,
|
|
274
|
+
spannable.replace(start, originalEnd, EnrichedConstants.ORC_STRING)
|
|
209
275
|
}
|
|
210
276
|
|
|
211
277
|
val (imageStart, imageEnd) = spannable.getSafeSpanBoundaries(start, start + 1)
|
|
212
|
-
val span =
|
|
278
|
+
val span = EnrichedInputImageSpan.createEnrichedImageSpan(src, width.toInt(), height.toInt())
|
|
213
279
|
span.observeAsyncDrawableLoaded(view.text)
|
|
214
280
|
|
|
215
281
|
spannable.setSpan(span, imageStart, imageEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
|
|
@@ -228,12 +294,16 @@ class ParametrizedStyles(private val view: EnrichedTextInputView) {
|
|
|
228
294
|
}
|
|
229
295
|
}
|
|
230
296
|
|
|
231
|
-
fun setMentionSpan(
|
|
297
|
+
fun setMentionSpan(
|
|
298
|
+
indicator: String,
|
|
299
|
+
text: String,
|
|
300
|
+
attributes: Map<String, String>,
|
|
301
|
+
) {
|
|
232
302
|
val selection = view.selection ?: return
|
|
233
303
|
|
|
234
304
|
val spannable = view.text as SpannableStringBuilder
|
|
235
305
|
val (selectionStart, selectionEnd) = selection.getInlineSelection()
|
|
236
|
-
val spans = spannable.getSpans(selectionStart, selectionEnd,
|
|
306
|
+
val spans = spannable.getSpans(selectionStart, selectionEnd, EnrichedInputMentionSpan::class.java)
|
|
237
307
|
|
|
238
308
|
for (span in spans) {
|
|
239
309
|
spannable.removeSpan(span)
|
|
@@ -244,7 +314,7 @@ class ParametrizedStyles(private val view: EnrichedTextInputView) {
|
|
|
244
314
|
view.runAsATransaction {
|
|
245
315
|
spannable.replace(start, selectionEnd, text)
|
|
246
316
|
|
|
247
|
-
val span =
|
|
317
|
+
val span = EnrichedInputMentionSpan(text, indicator, attributes, view.htmlStyle)
|
|
248
318
|
val spanEnd = start + text.length
|
|
249
319
|
val (safeStart, safeEnd) = spannable.getSafeSpanBoundaries(start, spanEnd)
|
|
250
320
|
spannable.setSpan(span, safeStart, safeEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
|
|
@@ -259,17 +329,23 @@ class ParametrizedStyles(private val view: EnrichedTextInputView) {
|
|
|
259
329
|
view.selection.validateStyles()
|
|
260
330
|
}
|
|
261
331
|
|
|
262
|
-
fun getStyleRange(): Pair<Int, Int>
|
|
263
|
-
return view.selection?.getInlineSelection() ?: Pair(0, 0)
|
|
264
|
-
}
|
|
332
|
+
fun getStyleRange(): Pair<Int, Int> = view.selection?.getInlineSelection() ?: Pair(0, 0)
|
|
265
333
|
|
|
266
|
-
fun removeStyle(
|
|
334
|
+
fun removeStyle(
|
|
335
|
+
name: String,
|
|
336
|
+
start: Int,
|
|
337
|
+
end: Int,
|
|
338
|
+
): Boolean {
|
|
267
339
|
val config = EnrichedSpans.parametrizedStyles[name] ?: return false
|
|
268
340
|
val spannable = view.text as Spannable
|
|
269
341
|
return removeSpansForRange(spannable, start, end, config.clazz)
|
|
270
342
|
}
|
|
271
343
|
|
|
272
344
|
companion object {
|
|
273
|
-
data class TextRange(
|
|
345
|
+
data class TextRange(
|
|
346
|
+
val text: String,
|
|
347
|
+
val start: Int,
|
|
348
|
+
val end: Int,
|
|
349
|
+
)
|
|
274
350
|
}
|
|
275
351
|
}
|
package/android/src/main/java/com/swmansion/enriched/textinput/utils/EnrichedEditableFactory.kt
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
package com.swmansion.enriched.textinput.utils
|
|
2
|
+
|
|
3
|
+
import android.text.Editable
|
|
4
|
+
import android.text.Spannable
|
|
5
|
+
import android.text.SpannableStringBuilder
|
|
6
|
+
import com.swmansion.enriched.textinput.watchers.EnrichedSpanWatcher
|
|
7
|
+
|
|
8
|
+
class EnrichedEditableFactory(
|
|
9
|
+
private val watcher: EnrichedSpanWatcher,
|
|
10
|
+
) : Editable.Factory() {
|
|
11
|
+
override fun newEditable(source: CharSequence): Editable {
|
|
12
|
+
val s = source as? SpannableStringBuilder ?: SpannableStringBuilder(source)
|
|
13
|
+
s.removeSpan(watcher)
|
|
14
|
+
s.setSpan(watcher, 0, s.length, Spannable.SPAN_INCLUSIVE_INCLUSIVE)
|
|
15
|
+
return s
|
|
16
|
+
}
|
|
17
|
+
}
|
package/android/src/main/java/com/swmansion/enriched/{utils → textinput/utils}/EnrichedSelection.kt
RENAMED
|
@@ -1,26 +1,32 @@
|
|
|
1
|
-
package com.swmansion.enriched.utils
|
|
1
|
+
package com.swmansion.enriched.textinput.utils
|
|
2
2
|
|
|
3
3
|
import android.text.Editable
|
|
4
4
|
import android.text.Spannable
|
|
5
5
|
import com.facebook.react.bridge.ReactContext
|
|
6
6
|
import com.facebook.react.uimanager.UIManagerHelper
|
|
7
|
-
import com.swmansion.enriched.
|
|
8
|
-
import com.swmansion.enriched.
|
|
9
|
-
import com.swmansion.enriched.events.
|
|
10
|
-
import com.swmansion.enriched.events.
|
|
11
|
-
import com.swmansion.enriched.
|
|
12
|
-
import com.swmansion.enriched.spans.
|
|
13
|
-
import com.swmansion.enriched.spans.
|
|
7
|
+
import com.swmansion.enriched.common.EnrichedConstants
|
|
8
|
+
import com.swmansion.enriched.textinput.EnrichedTextInputView
|
|
9
|
+
import com.swmansion.enriched.textinput.events.OnChangeSelectionEvent
|
|
10
|
+
import com.swmansion.enriched.textinput.events.OnLinkDetectedEvent
|
|
11
|
+
import com.swmansion.enriched.textinput.events.OnMentionDetectedEvent
|
|
12
|
+
import com.swmansion.enriched.textinput.spans.EnrichedInputLinkSpan
|
|
13
|
+
import com.swmansion.enriched.textinput.spans.EnrichedInputMentionSpan
|
|
14
|
+
import com.swmansion.enriched.textinput.spans.EnrichedSpans
|
|
14
15
|
import org.json.JSONObject
|
|
15
16
|
|
|
16
|
-
class EnrichedSelection(
|
|
17
|
+
class EnrichedSelection(
|
|
18
|
+
private val view: EnrichedTextInputView,
|
|
19
|
+
) {
|
|
17
20
|
var start: Int = 0
|
|
18
21
|
var end: Int = 0
|
|
19
22
|
|
|
20
23
|
private var previousLinkDetectedEvent: MutableMap<String, String> = mutableMapOf("text" to "", "url" to "")
|
|
21
24
|
private var previousMentionDetectedEvent: MutableMap<String, String> = mutableMapOf("text" to "", "payload" to "")
|
|
22
25
|
|
|
23
|
-
fun onSelection(
|
|
26
|
+
fun onSelection(
|
|
27
|
+
selStart: Int,
|
|
28
|
+
selEnd: Int,
|
|
29
|
+
) {
|
|
24
30
|
var shouldValidateStyles = false
|
|
25
31
|
var newStart = start
|
|
26
32
|
var newEnd = end
|
|
@@ -52,19 +58,23 @@ class EnrichedSelection(private val view: EnrichedTextInputView) {
|
|
|
52
58
|
emitSelectionChangeEvent(view.text, finalStart, finalEnd)
|
|
53
59
|
}
|
|
54
60
|
|
|
55
|
-
private fun isZeroWidthSelection(
|
|
61
|
+
private fun isZeroWidthSelection(
|
|
62
|
+
start: Int,
|
|
63
|
+
end: Int,
|
|
64
|
+
): Boolean {
|
|
56
65
|
val text = view.text ?: return false
|
|
57
66
|
|
|
58
67
|
if (start != end) {
|
|
59
|
-
return text.substring(start, end) ==
|
|
68
|
+
return text.substring(start, end) == EnrichedConstants.ZWS_STRING
|
|
60
69
|
}
|
|
61
70
|
|
|
62
|
-
val isNewLine = if (start > 0
|
|
63
|
-
val isNextCharacterZeroWidth =
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
71
|
+
val isNewLine = if (start > 0) text.substring(start - 1, start) == "\n" else true
|
|
72
|
+
val isNextCharacterZeroWidth =
|
|
73
|
+
if (start < text.length) {
|
|
74
|
+
text.substring(start, start + 1) == EnrichedConstants.ZWS_STRING
|
|
75
|
+
} else {
|
|
76
|
+
false
|
|
77
|
+
}
|
|
68
78
|
|
|
69
79
|
return isNewLine && isNextCharacterZeroWidth
|
|
70
80
|
}
|
|
@@ -103,7 +113,7 @@ class EnrichedSelection(private val view: EnrichedTextInputView) {
|
|
|
103
113
|
return Pair(finalStart, finalEnd)
|
|
104
114
|
}
|
|
105
115
|
|
|
106
|
-
private fun <T>getInlineStyleStart(type: Class<T>): Int? {
|
|
116
|
+
private fun <T> getInlineStyleStart(type: Class<T>): Int? {
|
|
107
117
|
val (start, end) = getInlineSelection()
|
|
108
118
|
val spannable = view.text as Spannable
|
|
109
119
|
val spans = spannable.getSpans(start, end, type)
|
|
@@ -129,7 +139,7 @@ class EnrichedSelection(private val view: EnrichedTextInputView) {
|
|
|
129
139
|
return spannable.getParagraphBounds(currentStart, currentEnd)
|
|
130
140
|
}
|
|
131
141
|
|
|
132
|
-
private fun <T>getParagraphStyleStart(type: Class<T>): Int? {
|
|
142
|
+
private fun <T> getParagraphStyleStart(type: Class<T>): Int? {
|
|
133
143
|
val (start, end) = getParagraphSelection()
|
|
134
144
|
val spannable = view.text as Spannable
|
|
135
145
|
val spans = spannable.getSpans(start, end, type)
|
|
@@ -148,7 +158,7 @@ class EnrichedSelection(private val view: EnrichedTextInputView) {
|
|
|
148
158
|
return styleStart
|
|
149
159
|
}
|
|
150
160
|
|
|
151
|
-
private fun <T>getListStyleStart(type: Class<T>): Int? {
|
|
161
|
+
private fun <T> getListStyleStart(type: Class<T>): Int? {
|
|
152
162
|
val (start, end) = getParagraphSelection()
|
|
153
163
|
val spannable = view.text as Spannable
|
|
154
164
|
var styleStart: Int? = null
|
|
@@ -177,12 +187,12 @@ class EnrichedSelection(private val view: EnrichedTextInputView) {
|
|
|
177
187
|
return styleStart
|
|
178
188
|
}
|
|
179
189
|
|
|
180
|
-
private fun <T>getParametrizedStyleStart(type: Class<T>): Int? {
|
|
190
|
+
private fun <T> getParametrizedStyleStart(type: Class<T>): Int? {
|
|
181
191
|
val (start, end) = getInlineSelection()
|
|
182
192
|
val spannable = view.text as Spannable
|
|
183
193
|
val spans = spannable.getSpans(start, end, type)
|
|
184
|
-
val isLinkType = type ==
|
|
185
|
-
val isMentionType = type ==
|
|
194
|
+
val isLinkType = type == EnrichedInputLinkSpan::class.java
|
|
195
|
+
val isMentionType = type == EnrichedInputMentionSpan::class.java
|
|
186
196
|
|
|
187
197
|
if (isLinkType && spans.isEmpty()) {
|
|
188
198
|
emitLinkDetectedEvent(spannable, null, start, end)
|
|
@@ -199,9 +209,9 @@ class EnrichedSelection(private val view: EnrichedTextInputView) {
|
|
|
199
209
|
val spanEnd = spannable.getSpanEnd(span)
|
|
200
210
|
|
|
201
211
|
if (start >= spanStart && end <= spanEnd) {
|
|
202
|
-
if (isLinkType && span is
|
|
212
|
+
if (isLinkType && span is EnrichedInputLinkSpan) {
|
|
203
213
|
emitLinkDetectedEvent(spannable, span, spanStart, spanEnd)
|
|
204
|
-
} else if (isMentionType && span is
|
|
214
|
+
} else if (isMentionType && span is EnrichedInputMentionSpan) {
|
|
205
215
|
emitMentionDetectedEvent(spannable, span, spanStart, spanEnd)
|
|
206
216
|
}
|
|
207
217
|
|
|
@@ -212,7 +222,11 @@ class EnrichedSelection(private val view: EnrichedTextInputView) {
|
|
|
212
222
|
return null
|
|
213
223
|
}
|
|
214
224
|
|
|
215
|
-
private fun emitSelectionChangeEvent(
|
|
225
|
+
private fun emitSelectionChangeEvent(
|
|
226
|
+
editable: Editable?,
|
|
227
|
+
start: Int,
|
|
228
|
+
end: Int,
|
|
229
|
+
) {
|
|
216
230
|
if (editable == null) return
|
|
217
231
|
|
|
218
232
|
val context = view.context as ReactContext
|
|
@@ -220,17 +234,24 @@ class EnrichedSelection(private val view: EnrichedTextInputView) {
|
|
|
220
234
|
val dispatcher = UIManagerHelper.getEventDispatcherForReactTag(context, view.id)
|
|
221
235
|
|
|
222
236
|
val text = editable.substring(start, end)
|
|
223
|
-
dispatcher?.dispatchEvent(
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
237
|
+
dispatcher?.dispatchEvent(
|
|
238
|
+
OnChangeSelectionEvent(
|
|
239
|
+
surfaceId,
|
|
240
|
+
view.id,
|
|
241
|
+
text,
|
|
242
|
+
start,
|
|
243
|
+
end,
|
|
244
|
+
view.experimentalSynchronousEvents,
|
|
245
|
+
),
|
|
246
|
+
)
|
|
231
247
|
}
|
|
232
248
|
|
|
233
|
-
private fun emitLinkDetectedEvent(
|
|
249
|
+
private fun emitLinkDetectedEvent(
|
|
250
|
+
spannable: Spannable,
|
|
251
|
+
span: EnrichedInputLinkSpan?,
|
|
252
|
+
start: Int,
|
|
253
|
+
end: Int,
|
|
254
|
+
) {
|
|
234
255
|
val text = spannable.substring(start, end)
|
|
235
256
|
val url = span?.getUrl() ?: ""
|
|
236
257
|
|
|
@@ -243,18 +264,25 @@ class EnrichedSelection(private val view: EnrichedTextInputView) {
|
|
|
243
264
|
val context = view.context as ReactContext
|
|
244
265
|
val surfaceId = UIManagerHelper.getSurfaceId(context)
|
|
245
266
|
val dispatcher = UIManagerHelper.getEventDispatcherForReactTag(context, view.id)
|
|
246
|
-
dispatcher?.dispatchEvent(
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
267
|
+
dispatcher?.dispatchEvent(
|
|
268
|
+
OnLinkDetectedEvent(
|
|
269
|
+
surfaceId,
|
|
270
|
+
view.id,
|
|
271
|
+
text,
|
|
272
|
+
url,
|
|
273
|
+
start,
|
|
274
|
+
end,
|
|
275
|
+
view.experimentalSynchronousEvents,
|
|
276
|
+
),
|
|
277
|
+
)
|
|
255
278
|
}
|
|
256
279
|
|
|
257
|
-
private fun emitMentionDetectedEvent(
|
|
280
|
+
private fun emitMentionDetectedEvent(
|
|
281
|
+
spannable: Spannable,
|
|
282
|
+
span: EnrichedInputMentionSpan?,
|
|
283
|
+
start: Int,
|
|
284
|
+
end: Int,
|
|
285
|
+
) {
|
|
258
286
|
val text = spannable.substring(start, end)
|
|
259
287
|
val attributes = span?.getAttributes() ?: emptyMap()
|
|
260
288
|
val indicator = span?.getIndicator() ?: ""
|
|
@@ -273,13 +301,15 @@ class EnrichedSelection(private val view: EnrichedTextInputView) {
|
|
|
273
301
|
val context = view.context as ReactContext
|
|
274
302
|
val surfaceId = UIManagerHelper.getSurfaceId(context)
|
|
275
303
|
val dispatcher = UIManagerHelper.getEventDispatcherForReactTag(context, view.id)
|
|
276
|
-
dispatcher?.dispatchEvent(
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
304
|
+
dispatcher?.dispatchEvent(
|
|
305
|
+
OnMentionDetectedEvent(
|
|
306
|
+
surfaceId,
|
|
307
|
+
view.id,
|
|
308
|
+
text,
|
|
309
|
+
indicator,
|
|
310
|
+
payload,
|
|
311
|
+
view.experimentalSynchronousEvents,
|
|
312
|
+
),
|
|
313
|
+
)
|
|
284
314
|
}
|
|
285
315
|
}
|