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
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
package com.swmansion.enriched.textinput.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.common.EnrichedConstants
|
|
8
|
+
import com.swmansion.enriched.textinput.EnrichedTextInputView
|
|
9
|
+
import com.swmansion.enriched.textinput.spans.EnrichedInputCheckboxListSpan
|
|
10
|
+
import com.swmansion.enriched.textinput.spans.EnrichedInputOrderedListSpan
|
|
11
|
+
import com.swmansion.enriched.textinput.spans.EnrichedInputUnorderedListSpan
|
|
12
|
+
import com.swmansion.enriched.textinput.spans.EnrichedSpans
|
|
13
|
+
import com.swmansion.enriched.textinput.utils.getParagraphBounds
|
|
14
|
+
import com.swmansion.enriched.textinput.utils.getSafeSpanBoundaries
|
|
15
|
+
import com.swmansion.enriched.textinput.utils.removeZWS
|
|
16
|
+
|
|
17
|
+
class ListStyles(
|
|
18
|
+
private val view: EnrichedTextInputView,
|
|
19
|
+
) {
|
|
20
|
+
private fun <T> getPreviousParagraphSpan(
|
|
21
|
+
spannable: Spannable,
|
|
22
|
+
s: Int,
|
|
23
|
+
type: Class<T>,
|
|
24
|
+
): T? {
|
|
25
|
+
if (s <= 0) return null
|
|
26
|
+
|
|
27
|
+
val (previousParagraphStart, previousParagraphEnd) = spannable.getParagraphBounds(s - 1)
|
|
28
|
+
val spans = spannable.getSpans(previousParagraphStart, previousParagraphEnd, type)
|
|
29
|
+
|
|
30
|
+
if (spans.isNotEmpty()) {
|
|
31
|
+
return spans.last()
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
return null
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
private fun <T> isPreviousParagraphList(
|
|
38
|
+
spannable: Spannable,
|
|
39
|
+
s: Int,
|
|
40
|
+
type: Class<T>,
|
|
41
|
+
): Boolean {
|
|
42
|
+
val previousSpan = getPreviousParagraphSpan(spannable, s, type)
|
|
43
|
+
|
|
44
|
+
return previousSpan != null
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
private fun getOrderedListIndex(
|
|
48
|
+
spannable: Spannable,
|
|
49
|
+
s: Int,
|
|
50
|
+
): Int {
|
|
51
|
+
val span = getPreviousParagraphSpan(spannable, s, EnrichedInputOrderedListSpan::class.java)
|
|
52
|
+
val index = span?.getListIndex() ?: 0
|
|
53
|
+
return index + 1
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
private fun setSpan(
|
|
57
|
+
spannable: Spannable,
|
|
58
|
+
name: String,
|
|
59
|
+
start: Int,
|
|
60
|
+
end: Int,
|
|
61
|
+
isChecked: Boolean? = false,
|
|
62
|
+
) {
|
|
63
|
+
val (safeStart, safeEnd) = spannable.getSafeSpanBoundaries(start, end)
|
|
64
|
+
|
|
65
|
+
when (name) {
|
|
66
|
+
EnrichedSpans.UNORDERED_LIST -> {
|
|
67
|
+
val span = EnrichedInputUnorderedListSpan(view.htmlStyle)
|
|
68
|
+
spannable.setSpan(span, safeStart, safeEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
EnrichedSpans.ORDERED_LIST -> {
|
|
72
|
+
val index = getOrderedListIndex(spannable, safeStart)
|
|
73
|
+
val span = EnrichedInputOrderedListSpan(index, view.htmlStyle)
|
|
74
|
+
spannable.setSpan(span, safeStart, safeEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
EnrichedSpans.CHECKBOX_LIST -> {
|
|
78
|
+
val span = EnrichedInputCheckboxListSpan(isChecked ?: false, view.htmlStyle)
|
|
79
|
+
spannable.setSpan(span, safeStart, safeEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
|
|
80
|
+
|
|
81
|
+
// Invalidate layout to update checkbox drawing in case checkbox is bigger than line height
|
|
82
|
+
view.layoutManager.invalidateLayout()
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
private fun <T> removeSpansForRange(
|
|
88
|
+
spannable: Spannable,
|
|
89
|
+
start: Int,
|
|
90
|
+
end: Int,
|
|
91
|
+
clazz: Class<T>,
|
|
92
|
+
): Boolean {
|
|
93
|
+
val ssb = spannable as SpannableStringBuilder
|
|
94
|
+
val spans = ssb.getSpans(start, end, clazz)
|
|
95
|
+
if (spans.isEmpty()) return false
|
|
96
|
+
|
|
97
|
+
for (span in spans) {
|
|
98
|
+
ssb.removeSpan(span)
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
ssb.removeZWS(start, end)
|
|
102
|
+
return true
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
fun updateOrderedListIndexes(
|
|
106
|
+
text: Spannable,
|
|
107
|
+
position: Int,
|
|
108
|
+
) {
|
|
109
|
+
val spans = text.getSpans(position + 1, text.length, EnrichedInputOrderedListSpan::class.java)
|
|
110
|
+
val sortedSpans = spans.sortedBy { text.getSpanStart(it) }
|
|
111
|
+
for (span in sortedSpans) {
|
|
112
|
+
val spanStart = text.getSpanStart(span)
|
|
113
|
+
val index = getOrderedListIndex(text, spanStart)
|
|
114
|
+
span.setListIndex(index)
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
private fun toggleStyle(
|
|
119
|
+
name: String,
|
|
120
|
+
checkboxState: Boolean?,
|
|
121
|
+
) {
|
|
122
|
+
if (view.selection == null) return
|
|
123
|
+
val config = EnrichedSpans.listSpans[name] ?: return
|
|
124
|
+
val spannable = view.text as SpannableStringBuilder
|
|
125
|
+
val (start, end) = view.selection.getParagraphSelection()
|
|
126
|
+
val styleStart = view.spanState?.getStart(name)
|
|
127
|
+
|
|
128
|
+
if (styleStart != null) {
|
|
129
|
+
view.spanState.setStart(name, null)
|
|
130
|
+
removeSpansForRange(spannable, start, end, config.clazz)
|
|
131
|
+
view.selection.validateStyles()
|
|
132
|
+
|
|
133
|
+
return
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
if (start == end) {
|
|
137
|
+
spannable.insert(start, EnrichedConstants.ZWS_STRING)
|
|
138
|
+
view.spanState?.setStart(name, start + 1)
|
|
139
|
+
removeSpansForRange(spannable, start, end, config.clazz)
|
|
140
|
+
setSpan(spannable, name, start, end + 1, checkboxState)
|
|
141
|
+
|
|
142
|
+
return
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
var currentStart = start
|
|
146
|
+
val paragraphs = spannable.substring(start, end).split("\n")
|
|
147
|
+
removeSpansForRange(spannable, start, end, config.clazz)
|
|
148
|
+
|
|
149
|
+
for (paragraph in paragraphs) {
|
|
150
|
+
spannable.insert(currentStart, EnrichedConstants.ZWS_STRING)
|
|
151
|
+
val currentEnd = currentStart + paragraph.length + 1
|
|
152
|
+
setSpan(spannable, name, currentStart, currentEnd, checkboxState)
|
|
153
|
+
|
|
154
|
+
currentStart = currentEnd + 1
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
view.spanState?.setStart(name, currentStart)
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
fun toggleStyle(name: String) {
|
|
161
|
+
toggleStyle(name, false)
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
fun toggleCheckboxListStyle(checked: Boolean) {
|
|
165
|
+
toggleStyle(EnrichedSpans.CHECKBOX_LIST, checked)
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
private fun handleAfterTextChanged(
|
|
169
|
+
s: Editable,
|
|
170
|
+
name: String,
|
|
171
|
+
endCursorPosition: Int,
|
|
172
|
+
previousTextLength: Int,
|
|
173
|
+
) {
|
|
174
|
+
val config = EnrichedSpans.listSpans[name] ?: return
|
|
175
|
+
val cursorPosition = endCursorPosition.coerceAtMost(s.length)
|
|
176
|
+
val (start, end) = s.getParagraphBounds(cursorPosition)
|
|
177
|
+
|
|
178
|
+
val isBackspace = previousTextLength > s.length
|
|
179
|
+
val isNewLine = cursorPosition > 0 && s[cursorPosition - 1] == '\n'
|
|
180
|
+
val isShortcut = config.shortcut?.let { s.substring(start, end).startsWith(it) } ?: false
|
|
181
|
+
val spans = s.getSpans(start, end, config.clazz)
|
|
182
|
+
|
|
183
|
+
// Remove spans if cursor is at the start of the paragraph and spans exist
|
|
184
|
+
if (isBackspace && start == cursorPosition && spans.isNotEmpty()) {
|
|
185
|
+
removeSpansForRange(s, start, end, config.clazz)
|
|
186
|
+
return
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
if (!isBackspace && isShortcut) {
|
|
190
|
+
s.replace(start, cursorPosition, EnrichedConstants.ZWS_STRING)
|
|
191
|
+
setSpan(s, name, start, start + 1)
|
|
192
|
+
// Inform that new span has been added
|
|
193
|
+
view.selection?.validateStyles()
|
|
194
|
+
return
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
if (!isBackspace && isNewLine && isPreviousParagraphList(s, start, config.clazz)) {
|
|
198
|
+
// Check if the span from the previous line "leaked" into this one
|
|
199
|
+
if (spans.isNotEmpty()) {
|
|
200
|
+
val existingSpan = spans[0]
|
|
201
|
+
val spanStart = s.getSpanStart(existingSpan)
|
|
202
|
+
|
|
203
|
+
// If the span started before the current paragraph (belongs to the previous item)
|
|
204
|
+
// update it to end at the newline (start - 1)
|
|
205
|
+
if (spanStart < start) {
|
|
206
|
+
val spanFlags = s.getSpanFlags(existingSpan)
|
|
207
|
+
s.setSpan(existingSpan, spanStart, start - 1, spanFlags)
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
s.insert(cursorPosition, EnrichedConstants.ZWS_STRING)
|
|
212
|
+
setSpan(s, name, start, end + 1)
|
|
213
|
+
// Inform that new span has been added
|
|
214
|
+
view.selection?.validateStyles()
|
|
215
|
+
return
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
if (name === EnrichedSpans.CHECKBOX_LIST) {
|
|
219
|
+
if (spans.isNotEmpty()) {
|
|
220
|
+
val previousSpan = spans[0] as EnrichedInputCheckboxListSpan
|
|
221
|
+
val isChecked = previousSpan.isChecked
|
|
222
|
+
|
|
223
|
+
for (span in spans) {
|
|
224
|
+
s.removeSpan(span)
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
setSpan(s, EnrichedSpans.CHECKBOX_LIST, start, end, isChecked)
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
return
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
if (spans.isNotEmpty()) {
|
|
234
|
+
for (span in spans) {
|
|
235
|
+
s.removeSpan(span)
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
setSpan(s, name, start, end)
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
fun afterTextChanged(
|
|
243
|
+
s: Editable,
|
|
244
|
+
endCursorPosition: Int,
|
|
245
|
+
previousTextLength: Int,
|
|
246
|
+
) {
|
|
247
|
+
handleAfterTextChanged(s, EnrichedSpans.ORDERED_LIST, endCursorPosition, previousTextLength)
|
|
248
|
+
handleAfterTextChanged(s, EnrichedSpans.UNORDERED_LIST, endCursorPosition, previousTextLength)
|
|
249
|
+
handleAfterTextChanged(s, EnrichedSpans.CHECKBOX_LIST, endCursorPosition, previousTextLength)
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
fun getStyleRange(): Pair<Int, Int> = view.selection?.getParagraphSelection() ?: Pair(0, 0)
|
|
253
|
+
|
|
254
|
+
fun removeStyle(
|
|
255
|
+
name: String,
|
|
256
|
+
start: Int,
|
|
257
|
+
end: Int,
|
|
258
|
+
): Boolean {
|
|
259
|
+
val config = EnrichedSpans.listSpans[name] ?: return false
|
|
260
|
+
val spannable = view.text as Spannable
|
|
261
|
+
return removeSpansForRange(spannable, start, end, config.clazz)
|
|
262
|
+
}
|
|
263
|
+
}
|
package/android/src/main/java/com/swmansion/enriched/{styles → textinput/styles}/ParagraphStyles.kt
RENAMED
|
@@ -1,17 +1,25 @@
|
|
|
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.util.Log
|
|
7
|
-
import com.swmansion.enriched.
|
|
8
|
-
import com.swmansion.enriched.
|
|
9
|
-
import com.swmansion.enriched.spans.
|
|
10
|
-
import com.swmansion.enriched.
|
|
11
|
-
import com.swmansion.enriched.utils.
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
7
|
+
import com.swmansion.enriched.common.EnrichedConstants
|
|
8
|
+
import com.swmansion.enriched.textinput.EnrichedTextInputView
|
|
9
|
+
import com.swmansion.enriched.textinput.spans.EnrichedSpans
|
|
10
|
+
import com.swmansion.enriched.textinput.spans.interfaces.EnrichedInputSpan
|
|
11
|
+
import com.swmansion.enriched.textinput.utils.getParagraphBounds
|
|
12
|
+
import com.swmansion.enriched.textinput.utils.getSafeSpanBoundaries
|
|
13
|
+
import com.swmansion.enriched.textinput.utils.removeZWS
|
|
14
|
+
|
|
15
|
+
class ParagraphStyles(
|
|
16
|
+
private val view: EnrichedTextInputView,
|
|
17
|
+
) {
|
|
18
|
+
private fun <T> getPreviousParagraphSpan(
|
|
19
|
+
spannable: Spannable,
|
|
20
|
+
paragraphStart: Int,
|
|
21
|
+
type: Class<T>,
|
|
22
|
+
): T? {
|
|
15
23
|
if (paragraphStart <= 0) return null
|
|
16
24
|
|
|
17
25
|
val (previousParagraphStart, previousParagraphEnd) = spannable.getParagraphBounds(paragraphStart - 1)
|
|
@@ -30,7 +38,11 @@ class ParagraphStyles(private val view: EnrichedTextInputView) {
|
|
|
30
38
|
return null
|
|
31
39
|
}
|
|
32
40
|
|
|
33
|
-
private fun <T>getNextParagraphSpan(
|
|
41
|
+
private fun <T> getNextParagraphSpan(
|
|
42
|
+
spannable: Spannable,
|
|
43
|
+
paragraphEnd: Int,
|
|
44
|
+
type: Class<T>,
|
|
45
|
+
): T? {
|
|
34
46
|
if (paragraphEnd >= spannable.length - 1) return null
|
|
35
47
|
|
|
36
48
|
val (nextParagraphStart, nextParagraphEnd) = spannable.getParagraphBounds(paragraphEnd + 1)
|
|
@@ -54,7 +66,12 @@ class ParagraphStyles(private val view: EnrichedTextInputView) {
|
|
|
54
66
|
* Applies a continuous span to the specified range.
|
|
55
67
|
* If the new range touches existing continuous spans, they are coalesced into a single span
|
|
56
68
|
*/
|
|
57
|
-
private fun <T>setContinuousSpan(
|
|
69
|
+
private fun <T> setContinuousSpan(
|
|
70
|
+
spannable: Spannable,
|
|
71
|
+
start: Int,
|
|
72
|
+
end: Int,
|
|
73
|
+
type: Class<T>,
|
|
74
|
+
) {
|
|
58
75
|
val span = type.getDeclaredConstructor(HtmlStyle::class.java).newInstance(view.htmlStyle)
|
|
59
76
|
val previousSpan = getPreviousParagraphSpan(spannable, start, type)
|
|
60
77
|
val nextSpan = getNextParagraphSpan(spannable, end, type)
|
|
@@ -75,8 +92,12 @@ class ParagraphStyles(private val view: EnrichedTextInputView) {
|
|
|
75
92
|
spannable.setSpan(span, safeStart, safeEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
|
|
76
93
|
}
|
|
77
94
|
|
|
78
|
-
|
|
79
|
-
|
|
95
|
+
private fun <T> setSpan(
|
|
96
|
+
spannable: Spannable,
|
|
97
|
+
type: Class<T>,
|
|
98
|
+
start: Int,
|
|
99
|
+
end: Int,
|
|
100
|
+
) {
|
|
80
101
|
if (EnrichedSpans.isTypeContinuous(type)) {
|
|
81
102
|
setContinuousSpan(spannable, start, end, type)
|
|
82
103
|
return
|
|
@@ -87,7 +108,12 @@ class ParagraphStyles(private val view: EnrichedTextInputView) {
|
|
|
87
108
|
spannable.setSpan(span, safeStart, safeEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
|
|
88
109
|
}
|
|
89
110
|
|
|
90
|
-
private fun <T>removeSpansForRange(
|
|
111
|
+
private fun <T> removeSpansForRange(
|
|
112
|
+
spannable: Spannable,
|
|
113
|
+
start: Int,
|
|
114
|
+
end: Int,
|
|
115
|
+
clazz: Class<T>,
|
|
116
|
+
): Boolean {
|
|
91
117
|
val ssb = spannable as SpannableStringBuilder
|
|
92
118
|
var finalStart = start
|
|
93
119
|
var finalEnd = end
|
|
@@ -102,11 +128,17 @@ class ParagraphStyles(private val view: EnrichedTextInputView) {
|
|
|
102
128
|
ssb.removeSpan(span)
|
|
103
129
|
}
|
|
104
130
|
|
|
105
|
-
ssb.
|
|
131
|
+
ssb.removeZWS(finalStart, finalEnd)
|
|
132
|
+
|
|
106
133
|
return true
|
|
107
134
|
}
|
|
108
135
|
|
|
109
|
-
private fun <T>setAndMergeSpans(
|
|
136
|
+
private fun <T> setAndMergeSpans(
|
|
137
|
+
spannable: Spannable,
|
|
138
|
+
type: Class<T>,
|
|
139
|
+
start: Int,
|
|
140
|
+
end: Int,
|
|
141
|
+
) {
|
|
110
142
|
val spans = spannable.getSpans(start, end, type)
|
|
111
143
|
|
|
112
144
|
// No spans setup for current selection, means we just need to assign new span
|
|
@@ -157,7 +189,11 @@ class ParagraphStyles(private val view: EnrichedTextInputView) {
|
|
|
157
189
|
}
|
|
158
190
|
}
|
|
159
191
|
|
|
160
|
-
private fun <T>isSpanEnabledInNextLine(
|
|
192
|
+
private fun <T> isSpanEnabledInNextLine(
|
|
193
|
+
spannable: Spannable,
|
|
194
|
+
index: Int,
|
|
195
|
+
type: Class<T>,
|
|
196
|
+
): Boolean {
|
|
161
197
|
val selection = view.selection ?: return false
|
|
162
198
|
if (index + 1 >= spannable.length) return false
|
|
163
199
|
val (start, end) = selection.getParagraphSelection()
|
|
@@ -166,7 +202,11 @@ class ParagraphStyles(private val view: EnrichedTextInputView) {
|
|
|
166
202
|
return spans.isNotEmpty()
|
|
167
203
|
}
|
|
168
204
|
|
|
169
|
-
private fun <T>mergeAdjacentStyleSpans(
|
|
205
|
+
private fun <T> mergeAdjacentStyleSpans(
|
|
206
|
+
s: Editable,
|
|
207
|
+
endCursorPosition: Int,
|
|
208
|
+
type: Class<T>,
|
|
209
|
+
) {
|
|
170
210
|
val (start, end) = s.getParagraphBounds(endCursorPosition)
|
|
171
211
|
val currParagraphSpans = s.getSpans(start, end, type)
|
|
172
212
|
|
|
@@ -193,7 +233,12 @@ class ParagraphStyles(private val view: EnrichedTextInputView) {
|
|
|
193
233
|
s.setSpan(span, safeStart, safeEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
|
|
194
234
|
}
|
|
195
235
|
|
|
196
|
-
private fun handleConflictsDuringNewlineDeletion(
|
|
236
|
+
private fun handleConflictsDuringNewlineDeletion(
|
|
237
|
+
s: Editable,
|
|
238
|
+
style: String,
|
|
239
|
+
paragraphStart: Int,
|
|
240
|
+
paragraphEnd: Int,
|
|
241
|
+
): Boolean {
|
|
197
242
|
val spanState = view.spanState ?: return false
|
|
198
243
|
val mergingConfig = EnrichedSpans.getMergingConfigForStyle(style, view.htmlStyle) ?: return false
|
|
199
244
|
var isConflicting = false
|
|
@@ -214,12 +259,12 @@ class ParagraphStyles(private val view: EnrichedTextInputView) {
|
|
|
214
259
|
}
|
|
215
260
|
|
|
216
261
|
for (span in spans) {
|
|
217
|
-
extendStyleOnWholeParagraph(s, span as
|
|
262
|
+
extendStyleOnWholeParagraph(s, span as EnrichedInputSpan, conflictingType, paragraphEnd)
|
|
218
263
|
}
|
|
219
264
|
}
|
|
220
265
|
|
|
221
266
|
if (isConflicting) {
|
|
222
|
-
val styleStart =
|
|
267
|
+
val styleStart = spanState.getStart(style) ?: return false
|
|
223
268
|
spanState.setStart(style, null)
|
|
224
269
|
removeStyle(style, styleStart, paragraphEnd)
|
|
225
270
|
return true
|
|
@@ -228,8 +273,12 @@ class ParagraphStyles(private val view: EnrichedTextInputView) {
|
|
|
228
273
|
return false
|
|
229
274
|
}
|
|
230
275
|
|
|
231
|
-
|
|
232
|
-
|
|
276
|
+
private fun deleteConflictingAndBlockingStyles(
|
|
277
|
+
s: Editable,
|
|
278
|
+
style: String,
|
|
279
|
+
paragraphStart: Int,
|
|
280
|
+
paragraphEnd: Int,
|
|
281
|
+
) {
|
|
233
282
|
val mergingConfig = EnrichedSpans.getMergingConfigForStyle(style, view.htmlStyle) ?: return
|
|
234
283
|
val stylesToCheck = mergingConfig.blockingStyles + mergingConfig.conflictingStyles
|
|
235
284
|
|
|
@@ -243,17 +292,26 @@ class ParagraphStyles(private val view: EnrichedTextInputView) {
|
|
|
243
292
|
}
|
|
244
293
|
}
|
|
245
294
|
|
|
246
|
-
private fun <T>extendStyleOnWholeParagraph(
|
|
295
|
+
private fun <T> extendStyleOnWholeParagraph(
|
|
296
|
+
s: Editable,
|
|
297
|
+
span: EnrichedInputSpan,
|
|
298
|
+
type: Class<T>,
|
|
299
|
+
paragraphEnd: Int,
|
|
300
|
+
) {
|
|
247
301
|
val currStyleStart = s.getSpanStart(span)
|
|
248
302
|
s.removeSpan(span)
|
|
249
303
|
val (safeStart, safeEnd) = s.getSafeSpanBoundaries(currStyleStart, paragraphEnd)
|
|
250
304
|
setSpan(s, type, safeStart, safeEnd)
|
|
251
305
|
}
|
|
252
306
|
|
|
253
|
-
fun afterTextChanged(
|
|
307
|
+
fun afterTextChanged(
|
|
308
|
+
s: Editable,
|
|
309
|
+
endPosition: Int,
|
|
310
|
+
previousTextLength: Int,
|
|
311
|
+
) {
|
|
254
312
|
var endCursorPosition = endPosition
|
|
255
313
|
val isBackspace = s.length < previousTextLength
|
|
256
|
-
val isNewLine = endCursorPosition == 0 || endCursorPosition > 0 && s[endCursorPosition - 1] == '\n'
|
|
314
|
+
val isNewLine = endCursorPosition == 0 || (endCursorPosition > 0 && s[endCursorPosition - 1] == '\n')
|
|
257
315
|
val spanState = view.spanState ?: return
|
|
258
316
|
|
|
259
317
|
for ((style, config) in EnrichedSpans.paragraphSpans) {
|
|
@@ -267,7 +325,7 @@ class ParagraphStyles(private val view: EnrichedTextInputView) {
|
|
|
267
325
|
for (span in spans) {
|
|
268
326
|
// handle conflicts when entering paragraph with some paragraph style applied
|
|
269
327
|
deleteConflictingAndBlockingStyles(s, style, start, end)
|
|
270
|
-
extendStyleOnWholeParagraph(s, span as
|
|
328
|
+
extendStyleOnWholeParagraph(s, span as EnrichedInputSpan, config.clazz, end)
|
|
271
329
|
}
|
|
272
330
|
}
|
|
273
331
|
|
|
@@ -287,7 +345,7 @@ class ParagraphStyles(private val view: EnrichedTextInputView) {
|
|
|
287
345
|
endCursorPosition -= 1
|
|
288
346
|
spanState.setStart(style, null)
|
|
289
347
|
} else {
|
|
290
|
-
s.insert(endCursorPosition,
|
|
348
|
+
s.insert(endCursorPosition, EnrichedConstants.ZWS_STRING)
|
|
291
349
|
endCursorPosition += 1
|
|
292
350
|
}
|
|
293
351
|
}
|
|
@@ -336,7 +394,7 @@ class ParagraphStyles(private val view: EnrichedTextInputView) {
|
|
|
336
394
|
}
|
|
337
395
|
|
|
338
396
|
if (start == end) {
|
|
339
|
-
spannable.insert(start,
|
|
397
|
+
spannable.insert(start, EnrichedConstants.ZWS_STRING)
|
|
340
398
|
setAndMergeSpans(spannable, type, start, end + 1)
|
|
341
399
|
view.selection.validateStyles()
|
|
342
400
|
|
|
@@ -348,7 +406,7 @@ class ParagraphStyles(private val view: EnrichedTextInputView) {
|
|
|
348
406
|
val paragraphs = spannable.substring(start, end).split("\n")
|
|
349
407
|
|
|
350
408
|
for (paragraph in paragraphs) {
|
|
351
|
-
spannable.insert(currentStart,
|
|
409
|
+
spannable.insert(currentStart, EnrichedConstants.ZWS_STRING)
|
|
352
410
|
currentEnd = currentStart + paragraph.length + 1
|
|
353
411
|
currentStart = currentEnd + 1
|
|
354
412
|
}
|
|
@@ -357,11 +415,13 @@ class ParagraphStyles(private val view: EnrichedTextInputView) {
|
|
|
357
415
|
view.selection.validateStyles()
|
|
358
416
|
}
|
|
359
417
|
|
|
360
|
-
fun getStyleRange(): Pair<Int, Int>
|
|
361
|
-
return view.selection?.getParagraphSelection() ?: Pair(0, 0)
|
|
362
|
-
}
|
|
418
|
+
fun getStyleRange(): Pair<Int, Int> = view.selection?.getParagraphSelection() ?: Pair(0, 0)
|
|
363
419
|
|
|
364
|
-
fun removeStyle(
|
|
420
|
+
fun removeStyle(
|
|
421
|
+
name: String,
|
|
422
|
+
start: Int,
|
|
423
|
+
end: Int,
|
|
424
|
+
): Boolean {
|
|
365
425
|
val config = EnrichedSpans.paragraphSpans[name] ?: return false
|
|
366
426
|
val spannable = view.text as Spannable
|
|
367
427
|
return removeSpansForRange(spannable, start, end, config.clazz)
|