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,42 +0,0 @@
|
|
|
1
|
-
package com.swmansion.enriched.spans
|
|
2
|
-
|
|
3
|
-
import android.text.TextPaint
|
|
4
|
-
import android.text.style.ClickableSpan
|
|
5
|
-
import android.view.View
|
|
6
|
-
import com.swmansion.enriched.spans.interfaces.EnrichedInlineSpan
|
|
7
|
-
import com.swmansion.enriched.styles.HtmlStyle
|
|
8
|
-
|
|
9
|
-
class EnrichedMentionSpan(private val text: String, private val indicator: String, private val attributes: Map<String, String>, private val htmlStyle: HtmlStyle) :
|
|
10
|
-
ClickableSpan(), EnrichedInlineSpan {
|
|
11
|
-
override val dependsOnHtmlStyle: Boolean = true
|
|
12
|
-
|
|
13
|
-
override fun onClick(view: View) {
|
|
14
|
-
// Do nothing. Mentions inside the input are not clickable.
|
|
15
|
-
// We are using `ClickableSpan` to allow the text to be styled as a clickable element.
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
override fun updateDrawState(textPaint: TextPaint) {
|
|
19
|
-
super.updateDrawState(textPaint)
|
|
20
|
-
|
|
21
|
-
val mentionsStyle = htmlStyle.mentionsStyle[indicator] ?: return
|
|
22
|
-
textPaint.color = mentionsStyle.color
|
|
23
|
-
textPaint.bgColor = mentionsStyle.backgroundColor
|
|
24
|
-
textPaint.isUnderlineText = mentionsStyle.underline
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
fun getAttributes(): Map<String, String> {
|
|
28
|
-
return attributes
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
fun getText(): String {
|
|
32
|
-
return text
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
fun getIndicator(): String {
|
|
36
|
-
return indicator
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
override fun rebuildWithStyle(htmlStyle: HtmlStyle): EnrichedMentionSpan {
|
|
40
|
-
return EnrichedMentionSpan(text, indicator, attributes, htmlStyle)
|
|
41
|
-
}
|
|
42
|
-
}
|
|
@@ -1,136 +0,0 @@
|
|
|
1
|
-
package com.swmansion.enriched.spans
|
|
2
|
-
|
|
3
|
-
import com.swmansion.enriched.styles.HtmlStyle
|
|
4
|
-
|
|
5
|
-
interface ISpanConfig {
|
|
6
|
-
val clazz: Class<*>
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
data class BaseSpanConfig(override val clazz: Class<*>): ISpanConfig
|
|
10
|
-
data class ParagraphSpanConfig(override val clazz: Class<*>, val isContinuous: Boolean): ISpanConfig
|
|
11
|
-
data class ListSpanConfig(override val clazz: Class<*>, val shortcut: String) : ISpanConfig
|
|
12
|
-
|
|
13
|
-
data class StylesMergingConfig(
|
|
14
|
-
// styles that should be removed when we apply specific style
|
|
15
|
-
val conflictingStyles: Array<String> = emptyArray(),
|
|
16
|
-
// styles that should block setting specific style
|
|
17
|
-
val blockingStyles: Array<String> = emptyArray(),
|
|
18
|
-
)
|
|
19
|
-
|
|
20
|
-
object EnrichedSpans {
|
|
21
|
-
// inline styles
|
|
22
|
-
const val BOLD = "bold"
|
|
23
|
-
const val ITALIC = "italic"
|
|
24
|
-
const val UNDERLINE = "underline"
|
|
25
|
-
const val STRIKETHROUGH = "strikethrough"
|
|
26
|
-
const val INLINE_CODE = "inline_code"
|
|
27
|
-
|
|
28
|
-
// paragraph styles
|
|
29
|
-
const val H1 = "h1"
|
|
30
|
-
const val H2 = "h2"
|
|
31
|
-
const val H3 = "h3"
|
|
32
|
-
const val BLOCK_QUOTE = "block_quote"
|
|
33
|
-
const val CODE_BLOCK = "code_block"
|
|
34
|
-
|
|
35
|
-
// list styles
|
|
36
|
-
const val UNORDERED_LIST = "unordered_list"
|
|
37
|
-
const val ORDERED_LIST = "ordered_list"
|
|
38
|
-
|
|
39
|
-
// parametrized styles
|
|
40
|
-
const val LINK = "link"
|
|
41
|
-
const val IMAGE = "image"
|
|
42
|
-
const val MENTION = "mention"
|
|
43
|
-
|
|
44
|
-
val inlineSpans: Map<String, BaseSpanConfig> = mapOf(
|
|
45
|
-
BOLD to BaseSpanConfig(EnrichedBoldSpan::class.java),
|
|
46
|
-
ITALIC to BaseSpanConfig(EnrichedItalicSpan::class.java),
|
|
47
|
-
UNDERLINE to BaseSpanConfig(EnrichedUnderlineSpan::class.java),
|
|
48
|
-
STRIKETHROUGH to BaseSpanConfig(EnrichedStrikeThroughSpan::class.java),
|
|
49
|
-
INLINE_CODE to BaseSpanConfig(EnrichedInlineCodeSpan::class.java),
|
|
50
|
-
)
|
|
51
|
-
|
|
52
|
-
val paragraphSpans: Map<String, ParagraphSpanConfig> = mapOf(
|
|
53
|
-
H1 to ParagraphSpanConfig(EnrichedH1Span::class.java, false),
|
|
54
|
-
H2 to ParagraphSpanConfig(EnrichedH2Span::class.java, false),
|
|
55
|
-
H3 to ParagraphSpanConfig(EnrichedH3Span::class.java, false),
|
|
56
|
-
BLOCK_QUOTE to ParagraphSpanConfig(EnrichedBlockQuoteSpan::class.java, true),
|
|
57
|
-
CODE_BLOCK to ParagraphSpanConfig(EnrichedCodeBlockSpan::class.java, true),
|
|
58
|
-
)
|
|
59
|
-
|
|
60
|
-
val listSpans: Map<String, ListSpanConfig> = mapOf(
|
|
61
|
-
UNORDERED_LIST to ListSpanConfig(EnrichedUnorderedListSpan::class.java, "- "),
|
|
62
|
-
ORDERED_LIST to ListSpanConfig(EnrichedOrderedListSpan::class.java, "1. "),
|
|
63
|
-
)
|
|
64
|
-
|
|
65
|
-
val parametrizedStyles: Map<String, BaseSpanConfig> = mapOf(
|
|
66
|
-
LINK to BaseSpanConfig(EnrichedLinkSpan::class.java),
|
|
67
|
-
IMAGE to BaseSpanConfig(EnrichedImageSpan::class.java),
|
|
68
|
-
MENTION to BaseSpanConfig(EnrichedMentionSpan::class.java),
|
|
69
|
-
)
|
|
70
|
-
|
|
71
|
-
val allSpans: Map<String, ISpanConfig> = inlineSpans + paragraphSpans + listSpans + parametrizedStyles
|
|
72
|
-
|
|
73
|
-
fun getMergingConfigForStyle(style: String, htmlStyle: HtmlStyle): StylesMergingConfig? {
|
|
74
|
-
return when (style) {
|
|
75
|
-
BOLD -> {
|
|
76
|
-
val blockingStyles = mutableListOf(CODE_BLOCK)
|
|
77
|
-
if (htmlStyle.h1Bold) blockingStyles.add(H1)
|
|
78
|
-
if (htmlStyle.h2Bold) blockingStyles.add(H2)
|
|
79
|
-
if (htmlStyle.h3Bold) blockingStyles.add(H3)
|
|
80
|
-
StylesMergingConfig(blockingStyles = blockingStyles.toTypedArray())
|
|
81
|
-
}
|
|
82
|
-
ITALIC -> StylesMergingConfig(
|
|
83
|
-
blockingStyles = arrayOf(CODE_BLOCK)
|
|
84
|
-
)
|
|
85
|
-
UNDERLINE -> StylesMergingConfig(
|
|
86
|
-
blockingStyles = arrayOf(CODE_BLOCK)
|
|
87
|
-
)
|
|
88
|
-
STRIKETHROUGH -> StylesMergingConfig(
|
|
89
|
-
blockingStyles = arrayOf(CODE_BLOCK)
|
|
90
|
-
)
|
|
91
|
-
INLINE_CODE -> StylesMergingConfig(
|
|
92
|
-
conflictingStyles = arrayOf(MENTION, LINK),
|
|
93
|
-
blockingStyles = arrayOf(CODE_BLOCK)
|
|
94
|
-
)
|
|
95
|
-
H1 -> {
|
|
96
|
-
val conflictingStyles = mutableListOf(H2, H3, ORDERED_LIST, UNORDERED_LIST, BLOCK_QUOTE, CODE_BLOCK)
|
|
97
|
-
if (htmlStyle.h1Bold) conflictingStyles.add(BOLD)
|
|
98
|
-
StylesMergingConfig(conflictingStyles = conflictingStyles.toTypedArray())
|
|
99
|
-
}
|
|
100
|
-
H2 -> {
|
|
101
|
-
val conflictingStyles = mutableListOf(H1, H3, ORDERED_LIST, UNORDERED_LIST, BLOCK_QUOTE, CODE_BLOCK)
|
|
102
|
-
if (htmlStyle.h2Bold) conflictingStyles.add(BOLD)
|
|
103
|
-
StylesMergingConfig(conflictingStyles = conflictingStyles.toTypedArray())
|
|
104
|
-
}
|
|
105
|
-
H3 -> {
|
|
106
|
-
val conflictingStyles = mutableListOf(H1, H2, ORDERED_LIST, UNORDERED_LIST, BLOCK_QUOTE, CODE_BLOCK)
|
|
107
|
-
if (htmlStyle.h3Bold) conflictingStyles.add(BOLD)
|
|
108
|
-
StylesMergingConfig(conflictingStyles = conflictingStyles.toTypedArray())
|
|
109
|
-
}
|
|
110
|
-
BLOCK_QUOTE -> StylesMergingConfig(
|
|
111
|
-
conflictingStyles = arrayOf(H1, H2, H3, CODE_BLOCK, ORDERED_LIST, UNORDERED_LIST)
|
|
112
|
-
)
|
|
113
|
-
CODE_BLOCK -> StylesMergingConfig(
|
|
114
|
-
conflictingStyles = arrayOf(H1, H2, H3, BOLD, ITALIC, UNDERLINE, STRIKETHROUGH, UNORDERED_LIST, ORDERED_LIST, BLOCK_QUOTE, INLINE_CODE)
|
|
115
|
-
)
|
|
116
|
-
UNORDERED_LIST -> StylesMergingConfig(
|
|
117
|
-
conflictingStyles = arrayOf(H1, H2, H3, ORDERED_LIST, CODE_BLOCK, BLOCK_QUOTE)
|
|
118
|
-
)
|
|
119
|
-
ORDERED_LIST -> StylesMergingConfig(
|
|
120
|
-
conflictingStyles = arrayOf(H1, H2, H3, UNORDERED_LIST, CODE_BLOCK, BLOCK_QUOTE),
|
|
121
|
-
)
|
|
122
|
-
LINK -> StylesMergingConfig(
|
|
123
|
-
blockingStyles = arrayOf(INLINE_CODE, CODE_BLOCK, MENTION)
|
|
124
|
-
)
|
|
125
|
-
IMAGE -> StylesMergingConfig()
|
|
126
|
-
MENTION -> StylesMergingConfig(
|
|
127
|
-
blockingStyles = arrayOf(INLINE_CODE, CODE_BLOCK, LINK)
|
|
128
|
-
)
|
|
129
|
-
else -> null
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
fun isTypeContinuous(type: Class<*>): Boolean {
|
|
134
|
-
return paragraphSpans.values.find { it.clazz == type }?.isContinuous == true
|
|
135
|
-
}
|
|
136
|
-
}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
package com.swmansion.enriched.spans
|
|
2
|
-
|
|
3
|
-
import android.text.style.StrikethroughSpan
|
|
4
|
-
import com.swmansion.enriched.spans.interfaces.EnrichedInlineSpan
|
|
5
|
-
import com.swmansion.enriched.styles.HtmlStyle
|
|
6
|
-
|
|
7
|
-
@Suppress("UNUSED_PARAMETER")
|
|
8
|
-
class EnrichedStrikeThroughSpan(private val htmlStyle: HtmlStyle) : StrikethroughSpan(), EnrichedInlineSpan {
|
|
9
|
-
override val dependsOnHtmlStyle: Boolean = false
|
|
10
|
-
|
|
11
|
-
override fun rebuildWithStyle(htmlStyle: HtmlStyle): EnrichedStrikeThroughSpan {
|
|
12
|
-
return EnrichedStrikeThroughSpan(htmlStyle)
|
|
13
|
-
}
|
|
14
|
-
}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
package com.swmansion.enriched.spans
|
|
2
|
-
|
|
3
|
-
import android.text.style.UnderlineSpan
|
|
4
|
-
import com.swmansion.enriched.spans.interfaces.EnrichedInlineSpan
|
|
5
|
-
import com.swmansion.enriched.styles.HtmlStyle
|
|
6
|
-
|
|
7
|
-
@Suppress("UNUSED_PARAMETER")
|
|
8
|
-
class EnrichedUnderlineSpan(private val htmlStyle: HtmlStyle) : UnderlineSpan(), EnrichedInlineSpan {
|
|
9
|
-
override val dependsOnHtmlStyle: Boolean = false
|
|
10
|
-
|
|
11
|
-
override fun rebuildWithStyle(htmlStyle: HtmlStyle): EnrichedUnderlineSpan {
|
|
12
|
-
return EnrichedUnderlineSpan(htmlStyle)
|
|
13
|
-
}
|
|
14
|
-
}
|
|
@@ -1,172 +0,0 @@
|
|
|
1
|
-
package com.swmansion.enriched.styles
|
|
2
|
-
|
|
3
|
-
import android.text.Editable
|
|
4
|
-
import android.text.Spannable
|
|
5
|
-
import android.text.SpannableStringBuilder
|
|
6
|
-
import android.text.Spanned
|
|
7
|
-
import com.swmansion.enriched.EnrichedTextInputView
|
|
8
|
-
import com.swmansion.enriched.spans.EnrichedOrderedListSpan
|
|
9
|
-
import com.swmansion.enriched.spans.EnrichedSpans
|
|
10
|
-
import com.swmansion.enriched.spans.EnrichedUnorderedListSpan
|
|
11
|
-
import com.swmansion.enriched.utils.getParagraphBounds
|
|
12
|
-
import com.swmansion.enriched.utils.getSafeSpanBoundaries
|
|
13
|
-
|
|
14
|
-
class ListStyles(private val view: EnrichedTextInputView) {
|
|
15
|
-
private fun <T>getPreviousParagraphSpan(spannable: Spannable, s: Int, type: Class<T>): T? {
|
|
16
|
-
if (s <= 0) return null
|
|
17
|
-
|
|
18
|
-
val (previousParagraphStart, previousParagraphEnd) = spannable.getParagraphBounds(s - 1)
|
|
19
|
-
val spans = spannable.getSpans(previousParagraphStart, previousParagraphEnd, type)
|
|
20
|
-
|
|
21
|
-
if (spans.isNotEmpty()) {
|
|
22
|
-
return spans.last()
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
return null
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
private fun <T>isPreviousParagraphList(spannable: Spannable, s: Int, type: Class<T>): Boolean {
|
|
29
|
-
val previousSpan = getPreviousParagraphSpan(spannable, s, type)
|
|
30
|
-
|
|
31
|
-
return previousSpan != null
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
private fun getOrderedListIndex(spannable: Spannable, s: Int): Int {
|
|
35
|
-
val span = getPreviousParagraphSpan(spannable, s, EnrichedOrderedListSpan::class.java)
|
|
36
|
-
val index = span?.getIndex() ?: 0
|
|
37
|
-
return index + 1
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
private fun setSpan(spannable: Spannable, name: String, start: Int, end: Int) {
|
|
41
|
-
val (safeStart, safeEnd) = spannable.getSafeSpanBoundaries(start, end)
|
|
42
|
-
|
|
43
|
-
if (name == EnrichedSpans.UNORDERED_LIST) {
|
|
44
|
-
val span = EnrichedUnorderedListSpan(view.htmlStyle)
|
|
45
|
-
spannable.setSpan(span, safeStart, safeEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
|
|
46
|
-
return
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
if (name == EnrichedSpans.ORDERED_LIST) {
|
|
50
|
-
val index = getOrderedListIndex(spannable, safeStart)
|
|
51
|
-
val span = EnrichedOrderedListSpan(index, view.htmlStyle)
|
|
52
|
-
spannable.setSpan(span, safeStart, safeEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
private fun <T>removeSpansForRange(spannable: Spannable, start: Int, end: Int, clazz: Class<T>): Boolean {
|
|
57
|
-
val ssb = spannable as SpannableStringBuilder
|
|
58
|
-
val spans = ssb.getSpans(start, end, clazz)
|
|
59
|
-
if (spans.isEmpty()) return false
|
|
60
|
-
|
|
61
|
-
for (span in spans) {
|
|
62
|
-
ssb.removeSpan(span)
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
ssb.replace(start, end, ssb.substring(start, end).replace("\u200B", ""))
|
|
66
|
-
return true
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
fun updateOrderedListIndexes(text: Spannable, position: Int) {
|
|
70
|
-
val spans = text.getSpans(position + 1, text.length, EnrichedOrderedListSpan::class.java)
|
|
71
|
-
for (span in spans) {
|
|
72
|
-
val spanStart = text.getSpanStart(span)
|
|
73
|
-
val index = getOrderedListIndex(text, spanStart)
|
|
74
|
-
span.setIndex(index)
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
fun toggleStyle(name: String) {
|
|
79
|
-
if (view.selection == null) return
|
|
80
|
-
val config = EnrichedSpans.listSpans[name] ?: return
|
|
81
|
-
val spannable = view.text as SpannableStringBuilder
|
|
82
|
-
val (start, end) = view.selection.getParagraphSelection()
|
|
83
|
-
val styleStart = view.spanState?.getStart(name)
|
|
84
|
-
|
|
85
|
-
if (styleStart != null) {
|
|
86
|
-
view.spanState.setStart(name, null)
|
|
87
|
-
removeSpansForRange(spannable, start, end, config.clazz)
|
|
88
|
-
view.selection.validateStyles()
|
|
89
|
-
|
|
90
|
-
return
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
if (start == end) {
|
|
94
|
-
spannable.insert(start, "\u200B")
|
|
95
|
-
view.spanState?.setStart(name, start + 1)
|
|
96
|
-
removeSpansForRange(spannable, start, end, config.clazz)
|
|
97
|
-
setSpan(spannable, name, start, end + 1)
|
|
98
|
-
|
|
99
|
-
return
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
var currentStart = start
|
|
103
|
-
val paragraphs = spannable.substring(start, end).split("\n")
|
|
104
|
-
removeSpansForRange(spannable, start, end, config.clazz)
|
|
105
|
-
|
|
106
|
-
for (paragraph in paragraphs) {
|
|
107
|
-
spannable.insert(currentStart, "\u200B")
|
|
108
|
-
val currentEnd = currentStart + paragraph.length + 1
|
|
109
|
-
setSpan(spannable, name, currentStart, currentEnd)
|
|
110
|
-
|
|
111
|
-
currentStart = currentEnd + 1
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
view.spanState?.setStart(name, currentStart)
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
private fun handleAfterTextChanged(s: Editable, name: String, endCursorPosition: Int, previousTextLength: Int) {
|
|
118
|
-
val config = EnrichedSpans.listSpans[name] ?: return
|
|
119
|
-
val cursorPosition = endCursorPosition.coerceAtMost(s.length)
|
|
120
|
-
val (start, end) = s.getParagraphBounds(cursorPosition)
|
|
121
|
-
|
|
122
|
-
val isBackspace = previousTextLength > s.length
|
|
123
|
-
val isNewLine = cursorPosition > 0 && s[cursorPosition - 1] == '\n'
|
|
124
|
-
val isShortcut = s.substring(start, end).startsWith(config.shortcut)
|
|
125
|
-
val spans = s.getSpans(start, end, config.clazz)
|
|
126
|
-
|
|
127
|
-
// Remove spans if cursor is at the start of the paragraph and spans exist
|
|
128
|
-
if (isBackspace && start == cursorPosition && spans.isNotEmpty()) {
|
|
129
|
-
removeSpansForRange(s, start, end, config.clazz)
|
|
130
|
-
return
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
if (!isBackspace && isShortcut) {
|
|
134
|
-
s.replace(start, cursorPosition, "\u200B")
|
|
135
|
-
setSpan(s, name, start, start + 1)
|
|
136
|
-
// Inform that new span has been added
|
|
137
|
-
view.selection?.validateStyles()
|
|
138
|
-
return
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
if (!isBackspace && isNewLine && isPreviousParagraphList(s, start, config.clazz)) {
|
|
142
|
-
s.insert(cursorPosition, "\u200B")
|
|
143
|
-
setSpan(s, name, start, end + 1)
|
|
144
|
-
// Inform that new span has been added
|
|
145
|
-
view.selection?.validateStyles()
|
|
146
|
-
return
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
if (spans.isNotEmpty()) {
|
|
150
|
-
for (span in spans) {
|
|
151
|
-
s.removeSpan(span)
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
setSpan(s, name, start, end)
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
fun afterTextChanged(s: Editable, endCursorPosition: Int, previousTextLength: Int) {
|
|
159
|
-
handleAfterTextChanged(s, EnrichedSpans.ORDERED_LIST, endCursorPosition, previousTextLength)
|
|
160
|
-
handleAfterTextChanged(s, EnrichedSpans.UNORDERED_LIST, endCursorPosition, previousTextLength)
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
fun getStyleRange(): Pair<Int, Int> {
|
|
164
|
-
return view.selection?.getParagraphSelection() ?: Pair(0, 0)
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
fun removeStyle(name: String, start: Int, end: Int): Boolean {
|
|
168
|
-
val config = EnrichedSpans.listSpans[name] ?: return false
|
|
169
|
-
val spannable = view.text as Spannable
|
|
170
|
-
return removeSpansForRange(spannable, start, end, config.clazz)
|
|
171
|
-
}
|
|
172
|
-
}
|
|
@@ -1,204 +0,0 @@
|
|
|
1
|
-
package com.swmansion.enriched.utils
|
|
2
|
-
|
|
3
|
-
import com.facebook.react.bridge.Arguments
|
|
4
|
-
import com.facebook.react.bridge.ReactContext
|
|
5
|
-
import com.facebook.react.bridge.WritableMap
|
|
6
|
-
import com.facebook.react.uimanager.UIManagerHelper
|
|
7
|
-
import com.swmansion.enriched.EnrichedTextInputView
|
|
8
|
-
import com.swmansion.enriched.events.OnChangeStateEvent
|
|
9
|
-
import com.swmansion.enriched.spans.EnrichedSpans
|
|
10
|
-
|
|
11
|
-
class EnrichedSpanState(private val view: EnrichedTextInputView) {
|
|
12
|
-
private var previousPayload: WritableMap? = null
|
|
13
|
-
|
|
14
|
-
var boldStart: Int? = null
|
|
15
|
-
private set
|
|
16
|
-
var italicStart: Int? = null
|
|
17
|
-
private set
|
|
18
|
-
var underlineStart: Int? = null
|
|
19
|
-
private set
|
|
20
|
-
var strikethroughStart: Int? = null
|
|
21
|
-
private set
|
|
22
|
-
var inlineCodeStart: Int? = null
|
|
23
|
-
private set
|
|
24
|
-
var h1Start: Int? = null
|
|
25
|
-
private set
|
|
26
|
-
var h2Start: Int? = null
|
|
27
|
-
private set
|
|
28
|
-
var h3Start: Int? = null
|
|
29
|
-
private set
|
|
30
|
-
var codeBlockStart: Int? = null
|
|
31
|
-
private set
|
|
32
|
-
var blockQuoteStart: Int? = null
|
|
33
|
-
private set
|
|
34
|
-
var orderedListStart: Int? = null
|
|
35
|
-
private set
|
|
36
|
-
var unorderedListStart: Int? = null
|
|
37
|
-
private set
|
|
38
|
-
var linkStart: Int? = null
|
|
39
|
-
private set
|
|
40
|
-
var imageStart: Int? = null
|
|
41
|
-
private set
|
|
42
|
-
var mentionStart: Int? = null
|
|
43
|
-
private set
|
|
44
|
-
|
|
45
|
-
fun setBoldStart(start: Int?) {
|
|
46
|
-
this.boldStart = start
|
|
47
|
-
emitStateChangeEvent()
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
fun setItalicStart(start: Int?) {
|
|
51
|
-
this.italicStart = start
|
|
52
|
-
emitStateChangeEvent()
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
fun setUnderlineStart(start: Int?) {
|
|
56
|
-
this.underlineStart = start
|
|
57
|
-
emitStateChangeEvent()
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
fun setStrikethroughStart(start: Int?) {
|
|
61
|
-
this.strikethroughStart = start
|
|
62
|
-
emitStateChangeEvent()
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
fun setInlineCodeStart(start: Int?) {
|
|
66
|
-
this.inlineCodeStart = start
|
|
67
|
-
emitStateChangeEvent()
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
fun setH1Start(start: Int?) {
|
|
71
|
-
this.h1Start = start
|
|
72
|
-
emitStateChangeEvent()
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
fun setH2Start(start: Int?) {
|
|
76
|
-
this.h2Start = start
|
|
77
|
-
emitStateChangeEvent()
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
fun setH3Start(start: Int?) {
|
|
81
|
-
this.h3Start = start
|
|
82
|
-
emitStateChangeEvent()
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
fun setCodeBlockStart(start: Int?) {
|
|
86
|
-
this.codeBlockStart = start
|
|
87
|
-
emitStateChangeEvent()
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
fun setBlockQuoteStart(start: Int?) {
|
|
91
|
-
this.blockQuoteStart = start
|
|
92
|
-
emitStateChangeEvent()
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
fun setOrderedListStart(start: Int?) {
|
|
96
|
-
this.orderedListStart = start
|
|
97
|
-
emitStateChangeEvent()
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
fun setUnorderedListStart(start: Int?) {
|
|
101
|
-
this.unorderedListStart = start
|
|
102
|
-
emitStateChangeEvent()
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
fun setLinkStart(start: Int?) {
|
|
106
|
-
this.linkStart = start
|
|
107
|
-
emitStateChangeEvent()
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
fun setImageStart(start: Int?) {
|
|
111
|
-
this.imageStart = start
|
|
112
|
-
emitStateChangeEvent()
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
fun setMentionStart(start: Int?) {
|
|
116
|
-
this.mentionStart = start
|
|
117
|
-
emitStateChangeEvent()
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
fun getStart(name: String): Int? {
|
|
121
|
-
val start = when (name) {
|
|
122
|
-
EnrichedSpans.BOLD -> boldStart
|
|
123
|
-
EnrichedSpans.ITALIC -> italicStart
|
|
124
|
-
EnrichedSpans.UNDERLINE -> underlineStart
|
|
125
|
-
EnrichedSpans.STRIKETHROUGH -> strikethroughStart
|
|
126
|
-
EnrichedSpans.INLINE_CODE -> inlineCodeStart
|
|
127
|
-
EnrichedSpans.H1 -> h1Start
|
|
128
|
-
EnrichedSpans.H2 -> h2Start
|
|
129
|
-
EnrichedSpans.H3 -> h3Start
|
|
130
|
-
EnrichedSpans.CODE_BLOCK -> codeBlockStart
|
|
131
|
-
EnrichedSpans.BLOCK_QUOTE -> blockQuoteStart
|
|
132
|
-
EnrichedSpans.ORDERED_LIST -> orderedListStart
|
|
133
|
-
EnrichedSpans.UNORDERED_LIST -> unorderedListStart
|
|
134
|
-
EnrichedSpans.LINK -> linkStart
|
|
135
|
-
EnrichedSpans.IMAGE -> imageStart
|
|
136
|
-
EnrichedSpans.MENTION -> mentionStart
|
|
137
|
-
else -> null
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
return start
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
fun setStart(name: String, start: Int?) {
|
|
144
|
-
when (name) {
|
|
145
|
-
EnrichedSpans.BOLD -> setBoldStart(start)
|
|
146
|
-
EnrichedSpans.ITALIC -> setItalicStart(start)
|
|
147
|
-
EnrichedSpans.UNDERLINE -> setUnderlineStart(start)
|
|
148
|
-
EnrichedSpans.STRIKETHROUGH -> setStrikethroughStart(start)
|
|
149
|
-
EnrichedSpans.INLINE_CODE -> setInlineCodeStart(start)
|
|
150
|
-
EnrichedSpans.H1 -> setH1Start(start)
|
|
151
|
-
EnrichedSpans.H2 -> setH2Start(start)
|
|
152
|
-
EnrichedSpans.H3 -> setH3Start(start)
|
|
153
|
-
EnrichedSpans.CODE_BLOCK -> setCodeBlockStart(start)
|
|
154
|
-
EnrichedSpans.BLOCK_QUOTE -> setBlockQuoteStart(start)
|
|
155
|
-
EnrichedSpans.ORDERED_LIST -> setOrderedListStart(start)
|
|
156
|
-
EnrichedSpans.UNORDERED_LIST -> setUnorderedListStart(start)
|
|
157
|
-
EnrichedSpans.LINK -> setLinkStart(start)
|
|
158
|
-
EnrichedSpans.IMAGE -> setImageStart(start)
|
|
159
|
-
EnrichedSpans.MENTION -> setMentionStart(start)
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
private fun emitStateChangeEvent() {
|
|
164
|
-
val payload: WritableMap = Arguments.createMap()
|
|
165
|
-
payload.putBoolean("isBold", boldStart != null)
|
|
166
|
-
payload.putBoolean("isItalic", italicStart != null)
|
|
167
|
-
payload.putBoolean("isUnderline", underlineStart != null)
|
|
168
|
-
payload.putBoolean("isStrikeThrough", strikethroughStart != null)
|
|
169
|
-
payload.putBoolean("isInlineCode", inlineCodeStart != null)
|
|
170
|
-
payload.putBoolean("isH1", h1Start != null)
|
|
171
|
-
payload.putBoolean("isH2", h2Start != null)
|
|
172
|
-
payload.putBoolean("isH3", h3Start != null)
|
|
173
|
-
payload.putBoolean("isCodeBlock", codeBlockStart != null)
|
|
174
|
-
payload.putBoolean("isBlockQuote", blockQuoteStart != null)
|
|
175
|
-
payload.putBoolean("isOrderedList", orderedListStart != null)
|
|
176
|
-
payload.putBoolean("isUnorderedList", unorderedListStart != null)
|
|
177
|
-
payload.putBoolean("isLink", linkStart != null)
|
|
178
|
-
payload.putBoolean("isImage", imageStart != null)
|
|
179
|
-
payload.putBoolean("isMention", mentionStart != null)
|
|
180
|
-
|
|
181
|
-
// Do not emit event if payload is the same
|
|
182
|
-
if (previousPayload == payload) {
|
|
183
|
-
return
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
previousPayload = Arguments.createMap().apply {
|
|
187
|
-
merge(payload)
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
val context = view.context as ReactContext
|
|
191
|
-
val surfaceId = UIManagerHelper.getSurfaceId(context)
|
|
192
|
-
val dispatcher = UIManagerHelper.getEventDispatcherForReactTag(context, view.id)
|
|
193
|
-
dispatcher?.dispatchEvent(OnChangeStateEvent(
|
|
194
|
-
surfaceId,
|
|
195
|
-
view.id,
|
|
196
|
-
payload,
|
|
197
|
-
view.experimentalSynchronousEvents,
|
|
198
|
-
))
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
companion object {
|
|
202
|
-
const val NAME = "ReactNativeEnrichedView"
|
|
203
|
-
}
|
|
204
|
-
}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
/**
|
|
3
|
-
* This code was generated by
|
|
4
|
-
* [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
|
|
5
|
-
*
|
|
6
|
-
* Do not edit this file as changes may cause incorrect behavior and will be
|
|
7
|
-
* lost once the code is regenerated.
|
|
8
|
-
*
|
|
9
|
-
* @generated by codegen project: GenerateModuleJniCpp.js
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
#include "RNEnrichedTextInputViewSpec.h"
|
|
13
|
-
|
|
14
|
-
namespace facebook::react {
|
|
15
|
-
|
|
16
|
-
std::shared_ptr<TurboModule> RNEnrichedTextInputViewSpec_ModuleProvider(
|
|
17
|
-
const std::string &moduleName, const JavaTurboModule::InitParams ¶ms) {
|
|
18
|
-
|
|
19
|
-
return nullptr;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
} // namespace facebook::react
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
/**
|
|
3
|
-
* This code was generated by
|
|
4
|
-
* [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
|
|
5
|
-
*
|
|
6
|
-
* Do not edit this file as changes may cause incorrect behavior and will be
|
|
7
|
-
* lost once the code is regenerated.
|
|
8
|
-
*
|
|
9
|
-
* @generated by codegen project: GenerateModuleJniH.js
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
#pragma once
|
|
13
|
-
|
|
14
|
-
#include <ReactCommon/JavaTurboModule.h>
|
|
15
|
-
#include <ReactCommon/TurboModule.h>
|
|
16
|
-
#include <jsi/jsi.h>
|
|
17
|
-
|
|
18
|
-
#include <react/renderer/components/RNEnrichedTextInputViewSpec/EnrichedTextInputComponentDescriptor.h>
|
|
19
|
-
|
|
20
|
-
namespace facebook::react {
|
|
21
|
-
|
|
22
|
-
JSI_EXPORT
|
|
23
|
-
std::shared_ptr<TurboModule> RNEnrichedTextInputViewSpec_ModuleProvider(
|
|
24
|
-
const std::string &moduleName, const JavaTurboModule::InitParams ¶ms);
|
|
25
|
-
|
|
26
|
-
} // namespace facebook::react
|