react-native-enriched 0.3.0 → 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 +6 -4
- package/android/build.gradle +3 -3
- package/android/generated/java/com/facebook/react/viewmanagers/EnrichedTextInputViewManagerDelegate.java +3 -0
- package/android/generated/java/com/facebook/react/viewmanagers/EnrichedTextInputViewManagerInterface.java +1 -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/{ios/generated/RNEnrichedTextInputViewSpec → android/generated/jni/react/renderer/components/ReactNativeEnrichedSpec}/EventEmitters.cpp +31 -29
- package/{ios/generated/RNEnrichedTextInputViewSpec → android/generated/jni/react/renderer/components/ReactNativeEnrichedSpec}/EventEmitters.h +22 -25
- package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/Props.h +57 -0
- package/android/gradle.properties +5 -5
- package/android/src/main/java/com/swmansion/enriched/{EnrichedTextInputViewPackage.kt → ReactNativeEnrichedPackage.kt} +3 -2
- package/android/src/main/java/com/swmansion/enriched/{utils → common}/AsyncDrawable.kt +40 -8
- package/android/src/main/java/com/swmansion/enriched/common/CheckboxDrawable.kt +81 -0
- package/android/src/main/java/com/swmansion/enriched/{utils → common}/EnrichedConstants.kt +1 -1
- 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 +1 -1
- 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 +126 -99
- package/android/src/main/java/com/swmansion/enriched/common/parser/EnrichedSpanFactory.kt +79 -0
- package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/EnrichedBlockQuoteSpan.kt +9 -13
- 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 +8 -12
- 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 +43 -38
- package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/EnrichedInlineCodeSpan.kt +7 -11
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedItalicSpan.kt +12 -0
- package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/EnrichedLinkSpan.kt +7 -11
- package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/EnrichedMentionSpan.kt +6 -10
- package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/EnrichedOrderedListSpan.kt +12 -21
- 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 +9 -13
- package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/interfaces/EnrichedBlockSpan.kt +1 -1
- package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/interfaces/EnrichedHeadingSpan.kt +1 -1
- package/android/src/main/java/com/swmansion/enriched/common/spans/interfaces/EnrichedInlineSpan.kt +3 -0
- package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/interfaces/EnrichedParagraphSpan.kt +1 -1
- 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 +1 -1
- package/android/src/main/java/com/swmansion/enriched/{EnrichedTextInputConnectionWrapper.kt → textinput/EnrichedTextInputConnectionWrapper.kt} +2 -2
- 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} +87 -51
- package/android/src/main/java/com/swmansion/enriched/{EnrichedTextInputViewLayoutManager.kt → textinput/EnrichedTextInputViewLayoutManager.kt} +1 -1
- package/android/src/main/java/com/swmansion/enriched/{EnrichedTextInputViewManager.kt → textinput/EnrichedTextInputViewManager.kt} +24 -17
- package/android/src/main/java/com/swmansion/enriched/{MeasurementStore.kt → textinput/MeasurementStore.kt} +5 -4
- package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/MentionHandler.kt +2 -2
- package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnChangeHtmlEvent.kt +1 -1
- package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnChangeSelectionEvent.kt +1 -1
- package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnChangeStateEvent.kt +1 -1
- package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnChangeTextEvent.kt +2 -2
- package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnInputBlurEvent.kt +1 -1
- package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnInputFocusEvent.kt +1 -1
- package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnInputKeyPressEvent.kt +1 -1
- package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnLinkDetectedEvent.kt +1 -1
- package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnMentionDetectedEvent.kt +1 -1
- package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnMentionEvent.kt +1 -1
- 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 +1 -1
- 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/{spans → textinput/spans}/EnrichedSpans.kt +39 -30
- 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 +58 -43
- package/android/src/main/java/com/swmansion/enriched/{styles → textinput/styles}/InlineStyles.kt +4 -4
- package/android/src/main/java/com/swmansion/enriched/{styles → textinput/styles}/ListStyles.kt +77 -26
- package/android/src/main/java/com/swmansion/enriched/{styles → textinput/styles}/ParagraphStyles.kt +11 -11
- package/android/src/main/java/com/swmansion/enriched/{styles → textinput/styles}/ParametrizedStyles.kt +19 -19
- package/android/src/main/java/com/swmansion/enriched/{utils → textinput/utils}/EnrichedEditableFactory.kt +2 -2
- package/android/src/main/java/com/swmansion/enriched/{utils → textinput/utils}/EnrichedSelection.kt +15 -14
- package/android/src/main/java/com/swmansion/enriched/{utils → textinput/utils}/EnrichedSpanState.kt +15 -50
- package/android/src/main/java/com/swmansion/enriched/{utils → textinput/utils}/EnrichedSpannable.kt +3 -3
- package/android/src/main/java/com/swmansion/enriched/{utils → textinput/utils}/EnrichedSpannableStringBuilder.kt +2 -1
- 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 +10 -10
- package/android/src/main/java/com/swmansion/enriched/{watchers → textinput/watchers}/EnrichedTextWatcher.kt +3 -3
- package/android/src/main/new_arch/CMakeLists.txt +1 -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/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/conversions.h +1 -1
- package/ios/EnrichedTextInputView.h +1 -0
- package/ios/EnrichedTextInputView.mm +266 -55
- package/ios/config/InputConfig.h +10 -0
- package/ios/config/InputConfig.mm +119 -0
- package/ios/extensions/ImageExtension.h +35 -0
- package/ios/extensions/ImageExtension.mm +156 -0
- package/ios/extensions/LayoutManagerExtension.mm +115 -95
- package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ComponentDescriptors.cpp +1 -1
- package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ComponentDescriptors.h +1 -1
- package/{android/generated/jni/react/renderer/components/RNEnrichedTextInputViewSpec → ios/generated/ReactNativeEnrichedSpec}/EventEmitters.cpp +31 -29
- package/{android/generated/jni/react/renderer/components/RNEnrichedTextInputViewSpec → ios/generated/ReactNativeEnrichedSpec}/EventEmitters.h +22 -25
- package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/Props.h +57 -0
- package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/RCTComponentViewHelpers.h +21 -0
- package/ios/inputParser/InputParser.mm +135 -8
- package/ios/inputTextView/InputTextView.mm +118 -0
- package/ios/interfaces/ImageAttachment.h +1 -0
- package/ios/interfaces/ImageAttachment.mm +14 -4
- package/ios/interfaces/StyleHeaders.h +13 -2
- package/ios/interfaces/StyleTypeEnum.h +1 -0
- package/ios/internals/EnrichedTextInputViewState.cpp +6 -6
- package/ios/styles/CheckboxListStyle.mm +321 -0
- 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 +3 -0
- package/ios/styles/H5Style.mm +3 -0
- package/ios/styles/H6Style.mm +3 -0
- package/ios/styles/HeadingStyleBase.mm +150 -78
- package/ios/utils/CheckboxHitTestUtils.h +10 -0
- package/ios/utils/CheckboxHitTestUtils.mm +123 -0
- package/ios/utils/ParagraphAttributesUtils.mm +83 -53
- 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 +36 -11
- package/lib/module/EnrichedTextInput.js.map +1 -1
- package/lib/module/{EnrichedTextInputNativeComponent.ts → spec/EnrichedTextInputNativeComponent.ts} +40 -9
- package/lib/module/types.js +4 -0
- package/lib/module/types.js.map +1 -0
- package/lib/module/utils/normalizeHtmlStyle.js +6 -0
- package/lib/module/utils/normalizeHtmlStyle.js.map +1 -1
- package/lib/module/utils/nullthrows.js +9 -0
- package/lib/module/utils/nullthrows.js.map +1 -0
- package/lib/typescript/src/EnrichedTextInput.d.ts +9 -49
- 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} +33 -8
- 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 +2 -2
- package/lib/typescript/src/utils/normalizeHtmlStyle.d.ts.map +1 -1
- 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 +1 -1
- package/lib/typescript/src/utils/regexParser.d.ts.map +1 -1
- package/package.json +4 -4
- package/src/EnrichedTextInput.tsx +49 -62
- package/src/index.tsx +3 -1
- package/src/{EnrichedTextInputNativeComponent.ts → spec/EnrichedTextInputNativeComponent.ts} +40 -9
- package/src/types.ts +59 -0
- package/src/utils/normalizeHtmlStyle.ts +8 -5
- package/src/utils/nullthrows.ts +7 -0
- package/src/utils/regexParser.ts +1 -1
- package/android/src/main/java/com/swmansion/enriched/events/OnChangeStateDeprecatedEvent.kt +0 -21
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedBoldSpan.kt +0 -17
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedH1Span.kt +0 -24
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedH2Span.kt +0 -24
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedH3Span.kt +0 -24
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedH4Span.kt +0 -24
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedH5Span.kt +0 -24
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedH6Span.kt +0 -24
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedItalicSpan.kt +0 -16
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedStrikeThroughSpan.kt +0 -15
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedUnderlineSpan.kt +0 -15
- package/android/src/main/java/com/swmansion/enriched/spans/interfaces/EnrichedInlineSpan.kt +0 -3
- package/android/src/main/java/com/swmansion/enriched/spans/interfaces/EnrichedSpan.kt +0 -9
- package/android/src/main/java/com/swmansion/enriched/utils/Utils.kt +0 -21
- package/android/src/main/new_arch/RNEnrichedTextInputViewSpec.cpp +0 -22
- package/android/src/main/new_arch/RNEnrichedTextInputViewSpec.h +0 -26
- package/lib/typescript/src/EnrichedTextInputNativeComponent.d.ts.map +0 -1
- /package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/Props.cpp +0 -0
- /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/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/Props.cpp +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
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
package com.swmansion.enriched.spans
|
|
1
|
+
package com.swmansion.enriched.common.spans
|
|
2
2
|
|
|
3
3
|
import android.graphics.Canvas
|
|
4
4
|
import android.graphics.Paint
|
|
@@ -7,17 +7,15 @@ import android.text.Spanned
|
|
|
7
7
|
import android.text.TextPaint
|
|
8
8
|
import android.text.style.LeadingMarginSpan
|
|
9
9
|
import android.text.style.MetricAffectingSpan
|
|
10
|
-
import com.swmansion.enriched.
|
|
11
|
-
import com.swmansion.enriched.
|
|
10
|
+
import com.swmansion.enriched.common.EnrichedStyle
|
|
11
|
+
import com.swmansion.enriched.common.spans.interfaces.EnrichedParagraphSpan
|
|
12
12
|
|
|
13
13
|
// https://android.googlesource.com/platform/frameworks/base/+/refs/heads/main/core/java/android/text/style/BulletSpan.java
|
|
14
|
-
class EnrichedUnorderedListSpan(
|
|
15
|
-
private val
|
|
14
|
+
open class EnrichedUnorderedListSpan(
|
|
15
|
+
private val enrichedStyle: EnrichedStyle,
|
|
16
16
|
) : MetricAffectingSpan(),
|
|
17
17
|
LeadingMarginSpan,
|
|
18
18
|
EnrichedParagraphSpan {
|
|
19
|
-
override val dependsOnHtmlStyle: Boolean = true
|
|
20
|
-
|
|
21
19
|
override fun updateMeasureState(p0: TextPaint) {
|
|
22
20
|
// Do nothing, but inform layout that this span affects text metrics
|
|
23
21
|
}
|
|
@@ -26,7 +24,7 @@ class EnrichedUnorderedListSpan(
|
|
|
26
24
|
// Do nothing, but inform layout that this span affects text metrics
|
|
27
25
|
}
|
|
28
26
|
|
|
29
|
-
override fun getLeadingMargin(p0: Boolean): Int =
|
|
27
|
+
override fun getLeadingMargin(p0: Boolean): Int = enrichedStyle.ulBulletSize + enrichedStyle.ulGapWidth + enrichedStyle.ulMarginLeft
|
|
30
28
|
|
|
31
29
|
override fun drawLeadingMargin(
|
|
32
30
|
canvas: Canvas,
|
|
@@ -47,12 +45,12 @@ class EnrichedUnorderedListSpan(
|
|
|
47
45
|
if (spannedText.getSpanStart(this) == start) {
|
|
48
46
|
val style = paint.style
|
|
49
47
|
val oldColor = paint.color
|
|
50
|
-
paint.color =
|
|
48
|
+
paint.color = enrichedStyle.ulBulletColor
|
|
51
49
|
paint.style = Paint.Style.FILL
|
|
52
50
|
|
|
53
|
-
val bulletRadius =
|
|
51
|
+
val bulletRadius = enrichedStyle.ulBulletSize / 2f
|
|
54
52
|
val yPosition = (top + bottom) / 2f
|
|
55
|
-
val xPosition = x + dir * bulletRadius +
|
|
53
|
+
val xPosition = x + dir * bulletRadius + enrichedStyle.ulMarginLeft
|
|
56
54
|
|
|
57
55
|
canvas.drawCircle(xPosition, yPosition, bulletRadius, paint)
|
|
58
56
|
|
|
@@ -60,6 +58,4 @@ class EnrichedUnorderedListSpan(
|
|
|
60
58
|
paint.style = style
|
|
61
59
|
}
|
|
62
60
|
}
|
|
63
|
-
|
|
64
|
-
override fun rebuildWithStyle(htmlStyle: HtmlStyle): EnrichedUnorderedListSpan = EnrichedUnorderedListSpan(htmlStyle)
|
|
65
61
|
}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
package com.swmansion.enriched
|
|
1
|
+
package com.swmansion.enriched.textinput
|
|
2
2
|
|
|
3
3
|
import android.view.KeyEvent
|
|
4
4
|
import android.view.inputmethod.InputConnection
|
|
5
5
|
import android.view.inputmethod.InputConnectionWrapper
|
|
6
6
|
import com.facebook.react.bridge.ReactContext
|
|
7
7
|
import com.facebook.react.uimanager.UIManagerHelper
|
|
8
|
-
import com.swmansion.enriched.events.OnInputKeyPressEvent
|
|
8
|
+
import com.swmansion.enriched.textinput.events.OnInputKeyPressEvent
|
|
9
9
|
|
|
10
10
|
// This class is based on the implementation from Facebook React Native to provide 'onKeyPress' API on android.
|
|
11
11
|
// Original source:
|
package/android/src/main/java/com/swmansion/enriched/textinput/EnrichedTextInputSpannableFactory.kt
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
package com.swmansion.enriched.textinput
|
|
2
|
+
|
|
3
|
+
import com.swmansion.enriched.common.parser.EnrichedSpanFactory
|
|
4
|
+
import com.swmansion.enriched.common.spans.EnrichedCheckboxListSpan
|
|
5
|
+
import com.swmansion.enriched.common.spans.EnrichedImageSpan
|
|
6
|
+
import com.swmansion.enriched.textinput.spans.EnrichedInputBlockQuoteSpan
|
|
7
|
+
import com.swmansion.enriched.textinput.spans.EnrichedInputBoldSpan
|
|
8
|
+
import com.swmansion.enriched.textinput.spans.EnrichedInputCheckboxListSpan
|
|
9
|
+
import com.swmansion.enriched.textinput.spans.EnrichedInputCodeBlockSpan
|
|
10
|
+
import com.swmansion.enriched.textinput.spans.EnrichedInputH1Span
|
|
11
|
+
import com.swmansion.enriched.textinput.spans.EnrichedInputH2Span
|
|
12
|
+
import com.swmansion.enriched.textinput.spans.EnrichedInputH3Span
|
|
13
|
+
import com.swmansion.enriched.textinput.spans.EnrichedInputH4Span
|
|
14
|
+
import com.swmansion.enriched.textinput.spans.EnrichedInputH5Span
|
|
15
|
+
import com.swmansion.enriched.textinput.spans.EnrichedInputH6Span
|
|
16
|
+
import com.swmansion.enriched.textinput.spans.EnrichedInputImageSpan
|
|
17
|
+
import com.swmansion.enriched.textinput.spans.EnrichedInputInlineCodeSpan
|
|
18
|
+
import com.swmansion.enriched.textinput.spans.EnrichedInputItalicSpan
|
|
19
|
+
import com.swmansion.enriched.textinput.spans.EnrichedInputLinkSpan
|
|
20
|
+
import com.swmansion.enriched.textinput.spans.EnrichedInputMentionSpan
|
|
21
|
+
import com.swmansion.enriched.textinput.spans.EnrichedInputOrderedListSpan
|
|
22
|
+
import com.swmansion.enriched.textinput.spans.EnrichedInputStrikeThroughSpan
|
|
23
|
+
import com.swmansion.enriched.textinput.spans.EnrichedInputUnderlineSpan
|
|
24
|
+
import com.swmansion.enriched.textinput.spans.EnrichedInputUnorderedListSpan
|
|
25
|
+
import com.swmansion.enriched.textinput.styles.HtmlStyle
|
|
26
|
+
|
|
27
|
+
class EnrichedTextInputSpannableFactory : EnrichedSpanFactory<HtmlStyle> {
|
|
28
|
+
override fun createBoldSpan(style: HtmlStyle) = EnrichedInputBoldSpan(style)
|
|
29
|
+
|
|
30
|
+
override fun createItalicSpan(style: HtmlStyle) = EnrichedInputItalicSpan(style)
|
|
31
|
+
|
|
32
|
+
override fun createUnderlineSpan(style: HtmlStyle) = EnrichedInputUnderlineSpan(style)
|
|
33
|
+
|
|
34
|
+
override fun createStrikeThroughSpan(style: HtmlStyle) = EnrichedInputStrikeThroughSpan(style)
|
|
35
|
+
|
|
36
|
+
override fun createInlineCodeSpan(style: HtmlStyle) = EnrichedInputInlineCodeSpan(style)
|
|
37
|
+
|
|
38
|
+
override fun createLinkSpan(
|
|
39
|
+
url: String,
|
|
40
|
+
style: HtmlStyle,
|
|
41
|
+
) = EnrichedInputLinkSpan(url, style)
|
|
42
|
+
|
|
43
|
+
override fun createMentionSpan(
|
|
44
|
+
text: String,
|
|
45
|
+
indicator: String,
|
|
46
|
+
attributes: Map<String, String>,
|
|
47
|
+
style: HtmlStyle,
|
|
48
|
+
) = EnrichedInputMentionSpan(text, indicator, attributes, style)
|
|
49
|
+
|
|
50
|
+
override fun createImageSpan(
|
|
51
|
+
source: String,
|
|
52
|
+
width: Int,
|
|
53
|
+
height: Int,
|
|
54
|
+
): EnrichedImageSpan = EnrichedInputImageSpan.createEnrichedImageSpan(source, width, height)
|
|
55
|
+
|
|
56
|
+
override fun createH1Span(style: HtmlStyle) = EnrichedInputH1Span(style)
|
|
57
|
+
|
|
58
|
+
override fun createH2Span(style: HtmlStyle) = EnrichedInputH2Span(style)
|
|
59
|
+
|
|
60
|
+
override fun createH3Span(style: HtmlStyle) = EnrichedInputH3Span(style)
|
|
61
|
+
|
|
62
|
+
override fun createH4Span(style: HtmlStyle) = EnrichedInputH4Span(style)
|
|
63
|
+
|
|
64
|
+
override fun createH5Span(style: HtmlStyle) = EnrichedInputH5Span(style)
|
|
65
|
+
|
|
66
|
+
override fun createH6Span(style: HtmlStyle) = EnrichedInputH6Span(style)
|
|
67
|
+
|
|
68
|
+
override fun createOrderedListSpan(
|
|
69
|
+
index: Int,
|
|
70
|
+
style: HtmlStyle,
|
|
71
|
+
) = EnrichedInputOrderedListSpan(index, style)
|
|
72
|
+
|
|
73
|
+
override fun createUnorderedListSpan(style: HtmlStyle) = EnrichedInputUnorderedListSpan(style)
|
|
74
|
+
|
|
75
|
+
override fun createCheckboxListSpan(
|
|
76
|
+
isChecked: Boolean,
|
|
77
|
+
style: HtmlStyle,
|
|
78
|
+
) = EnrichedInputCheckboxListSpan(isChecked, style)
|
|
79
|
+
|
|
80
|
+
override fun createBlockQuoteSpan(style: HtmlStyle) = EnrichedInputBlockQuoteSpan(style)
|
|
81
|
+
|
|
82
|
+
override fun createCodeBlockSpan(style: HtmlStyle) = EnrichedInputCodeBlockSpan(style)
|
|
83
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
package com.swmansion.enriched
|
|
1
|
+
package com.swmansion.enriched.textinput
|
|
2
2
|
|
|
3
3
|
import android.content.ClipData
|
|
4
4
|
import android.content.ClipboardManager
|
|
@@ -21,6 +21,9 @@ import android.view.inputmethod.EditorInfo
|
|
|
21
21
|
import android.view.inputmethod.InputConnection
|
|
22
22
|
import android.view.inputmethod.InputMethodManager
|
|
23
23
|
import androidx.appcompat.widget.AppCompatEditText
|
|
24
|
+
import androidx.core.view.ViewCompat
|
|
25
|
+
import androidx.core.view.inputmethod.EditorInfoCompat
|
|
26
|
+
import androidx.core.view.inputmethod.InputConnectionCompat
|
|
24
27
|
import com.facebook.react.bridge.ReactContext
|
|
25
28
|
import com.facebook.react.bridge.ReadableMap
|
|
26
29
|
import com.facebook.react.common.ReactConstants
|
|
@@ -30,29 +33,34 @@ import com.facebook.react.uimanager.UIManagerHelper
|
|
|
30
33
|
import com.facebook.react.views.text.ReactTypefaceUtils.applyStyles
|
|
31
34
|
import com.facebook.react.views.text.ReactTypefaceUtils.parseFontStyle
|
|
32
35
|
import com.facebook.react.views.text.ReactTypefaceUtils.parseFontWeight
|
|
33
|
-
import com.swmansion.enriched.
|
|
34
|
-
import com.swmansion.enriched.
|
|
35
|
-
import com.swmansion.enriched.events.
|
|
36
|
-
import com.swmansion.enriched.events.
|
|
37
|
-
import com.swmansion.enriched.
|
|
38
|
-
import com.swmansion.enriched.
|
|
39
|
-
import com.swmansion.enriched.spans.
|
|
40
|
-
import com.swmansion.enriched.spans.
|
|
41
|
-
import com.swmansion.enriched.spans.
|
|
42
|
-
import com.swmansion.enriched.spans.
|
|
43
|
-
import com.swmansion.enriched.
|
|
44
|
-
import com.swmansion.enriched.
|
|
45
|
-
import com.swmansion.enriched.
|
|
46
|
-
import com.swmansion.enriched.
|
|
47
|
-
import com.swmansion.enriched.
|
|
48
|
-
import com.swmansion.enriched.
|
|
49
|
-
import com.swmansion.enriched.
|
|
50
|
-
import com.swmansion.enriched.
|
|
51
|
-
import com.swmansion.enriched.
|
|
52
|
-
import com.swmansion.enriched.
|
|
53
|
-
import com.swmansion.enriched.utils.
|
|
54
|
-
import com.swmansion.enriched.
|
|
55
|
-
import com.swmansion.enriched.
|
|
36
|
+
import com.swmansion.enriched.common.EnrichedConstants
|
|
37
|
+
import com.swmansion.enriched.common.parser.EnrichedParser
|
|
38
|
+
import com.swmansion.enriched.textinput.events.MentionHandler
|
|
39
|
+
import com.swmansion.enriched.textinput.events.OnInputBlurEvent
|
|
40
|
+
import com.swmansion.enriched.textinput.events.OnInputFocusEvent
|
|
41
|
+
import com.swmansion.enriched.textinput.events.OnRequestHtmlResultEvent
|
|
42
|
+
import com.swmansion.enriched.textinput.spans.EnrichedInputH1Span
|
|
43
|
+
import com.swmansion.enriched.textinput.spans.EnrichedInputH2Span
|
|
44
|
+
import com.swmansion.enriched.textinput.spans.EnrichedInputH3Span
|
|
45
|
+
import com.swmansion.enriched.textinput.spans.EnrichedInputH4Span
|
|
46
|
+
import com.swmansion.enriched.textinput.spans.EnrichedInputH5Span
|
|
47
|
+
import com.swmansion.enriched.textinput.spans.EnrichedInputH6Span
|
|
48
|
+
import com.swmansion.enriched.textinput.spans.EnrichedInputImageSpan
|
|
49
|
+
import com.swmansion.enriched.textinput.spans.EnrichedSpans
|
|
50
|
+
import com.swmansion.enriched.textinput.spans.interfaces.EnrichedInputSpan
|
|
51
|
+
import com.swmansion.enriched.textinput.styles.HtmlStyle
|
|
52
|
+
import com.swmansion.enriched.textinput.styles.InlineStyles
|
|
53
|
+
import com.swmansion.enriched.textinput.styles.ListStyles
|
|
54
|
+
import com.swmansion.enriched.textinput.styles.ParagraphStyles
|
|
55
|
+
import com.swmansion.enriched.textinput.styles.ParametrizedStyles
|
|
56
|
+
import com.swmansion.enriched.textinput.utils.EnrichedEditableFactory
|
|
57
|
+
import com.swmansion.enriched.textinput.utils.EnrichedSelection
|
|
58
|
+
import com.swmansion.enriched.textinput.utils.EnrichedSpanState
|
|
59
|
+
import com.swmansion.enriched.textinput.utils.RichContentReceiver
|
|
60
|
+
import com.swmansion.enriched.textinput.utils.mergeSpannables
|
|
61
|
+
import com.swmansion.enriched.textinput.utils.setCheckboxClickListener
|
|
62
|
+
import com.swmansion.enriched.textinput.watchers.EnrichedSpanWatcher
|
|
63
|
+
import com.swmansion.enriched.textinput.watchers.EnrichedTextWatcher
|
|
56
64
|
import java.util.regex.Pattern
|
|
57
65
|
import java.util.regex.PatternSyntaxException
|
|
58
66
|
import kotlin.math.ceil
|
|
@@ -99,6 +107,7 @@ class EnrichedTextInputView : AppCompatEditText {
|
|
|
99
107
|
private var defaultValueDirty: Boolean = false
|
|
100
108
|
|
|
101
109
|
private var inputMethodManager: InputMethodManager? = null
|
|
110
|
+
private val spannableFactory = EnrichedTextInputSpannableFactory()
|
|
102
111
|
|
|
103
112
|
constructor(context: Context) : super(context) {
|
|
104
113
|
prepareComponent()
|
|
@@ -133,6 +142,11 @@ class EnrichedTextInputView : AppCompatEditText {
|
|
|
133
142
|
|
|
134
143
|
init {
|
|
135
144
|
inputMethodManager = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
|
|
145
|
+
ViewCompat.setOnReceiveContentListener(
|
|
146
|
+
this,
|
|
147
|
+
RichContentReceiver.MIME_TYPES,
|
|
148
|
+
RichContentReceiver(this, context as ReactContext),
|
|
149
|
+
)
|
|
136
150
|
}
|
|
137
151
|
|
|
138
152
|
private fun prepareComponent() {
|
|
@@ -152,9 +166,12 @@ class EnrichedTextInputView : AppCompatEditText {
|
|
|
152
166
|
// Ensure that every time new editable is created, it has EnrichedSpanWatcher attached
|
|
153
167
|
val spanWatcher = EnrichedSpanWatcher(this)
|
|
154
168
|
this.spanWatcher = spanWatcher
|
|
155
|
-
setEditableFactory(EnrichedEditableFactory(spanWatcher))
|
|
156
169
|
|
|
170
|
+
setEditableFactory(EnrichedEditableFactory(spanWatcher))
|
|
157
171
|
addTextChangedListener(EnrichedTextWatcher(this))
|
|
172
|
+
|
|
173
|
+
// Handle checkbox list item clicks
|
|
174
|
+
this.setCheckboxClickListener()
|
|
158
175
|
}
|
|
159
176
|
|
|
160
177
|
// https://github.com/facebook/react-native/blob/36df97f500aa0aa8031098caf7526db358b6ddc1/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactEditText.kt#L295C1-L296C1
|
|
@@ -225,11 +242,6 @@ class EnrichedTextInputView : AppCompatEditText {
|
|
|
225
242
|
handleCustomCopy()
|
|
226
243
|
return true
|
|
227
244
|
}
|
|
228
|
-
|
|
229
|
-
android.R.id.paste -> {
|
|
230
|
-
handleCustomPaste()
|
|
231
|
-
return true
|
|
232
|
-
}
|
|
233
245
|
}
|
|
234
246
|
return super.onTextContextMenuItem(id)
|
|
235
247
|
}
|
|
@@ -249,16 +261,11 @@ class EnrichedTextInputView : AppCompatEditText {
|
|
|
249
261
|
}
|
|
250
262
|
}
|
|
251
263
|
|
|
252
|
-
|
|
253
|
-
val
|
|
254
|
-
if (!clipboard.hasPrimaryClip()) return
|
|
255
|
-
|
|
256
|
-
val clip = clipboard.primaryClip
|
|
257
|
-
val item = clip?.getItemAt(0)
|
|
258
|
-
val htmlText = item?.htmlText
|
|
264
|
+
fun handleTextPaste(item: ClipData.Item) {
|
|
265
|
+
val htmlText = item.htmlText
|
|
259
266
|
val currentText = text as Spannable
|
|
260
|
-
val start =
|
|
261
|
-
val end =
|
|
267
|
+
val start = selectionStart.coerceAtLeast(0)
|
|
268
|
+
val end = selectionEnd.coerceAtLeast(0)
|
|
262
269
|
|
|
263
270
|
if (htmlText != null) {
|
|
264
271
|
val parsedText = parseText(htmlText)
|
|
@@ -269,8 +276,7 @@ class EnrichedTextInputView : AppCompatEditText {
|
|
|
269
276
|
}
|
|
270
277
|
}
|
|
271
278
|
|
|
272
|
-
|
|
273
|
-
if (item?.text == null) return
|
|
279
|
+
if (item.text == null) return
|
|
274
280
|
val lengthBefore = currentText.length
|
|
275
281
|
val finalText = currentText.mergeSpannables(start, end, item.text.toString())
|
|
276
282
|
setValue(finalText)
|
|
@@ -291,7 +297,7 @@ class EnrichedTextInputView : AppCompatEditText {
|
|
|
291
297
|
if (!isHtml) return text
|
|
292
298
|
|
|
293
299
|
try {
|
|
294
|
-
val parsed = EnrichedParser.fromHtml(text.toString(), htmlStyle,
|
|
300
|
+
val parsed = EnrichedParser.fromHtml(text.toString(), htmlStyle, spannableFactory)
|
|
295
301
|
val withoutLastNewLine = parsed.trimEnd('\n')
|
|
296
302
|
return withoutLastNewLine
|
|
297
303
|
} catch (e: Exception) {
|
|
@@ -352,7 +358,7 @@ class EnrichedTextInputView : AppCompatEditText {
|
|
|
352
358
|
private fun observeAsyncImages() {
|
|
353
359
|
val liveText = text ?: return
|
|
354
360
|
|
|
355
|
-
val spans = liveText.getSpans(0, liveText.length,
|
|
361
|
+
val spans = liveText.getSpans(0, liveText.length, EnrichedInputImageSpan::class.java)
|
|
356
362
|
|
|
357
363
|
for (span in spans) {
|
|
358
364
|
span.observeAsyncDrawableLoaded(liveText)
|
|
@@ -543,6 +549,7 @@ class EnrichedTextInputView : AppCompatEditText {
|
|
|
543
549
|
EnrichedSpans.BLOCK_QUOTE -> paragraphStyles?.toggleStyle(EnrichedSpans.BLOCK_QUOTE)
|
|
544
550
|
EnrichedSpans.ORDERED_LIST -> listStyles?.toggleStyle(EnrichedSpans.ORDERED_LIST)
|
|
545
551
|
EnrichedSpans.UNORDERED_LIST -> listStyles?.toggleStyle(EnrichedSpans.UNORDERED_LIST)
|
|
552
|
+
EnrichedSpans.CHECKBOX_LIST -> listStyles?.toggleStyle(EnrichedSpans.CHECKBOX_LIST)
|
|
546
553
|
else -> Log.w("EnrichedTextInputView", "Unknown style: $name")
|
|
547
554
|
}
|
|
548
555
|
|
|
@@ -571,6 +578,7 @@ class EnrichedTextInputView : AppCompatEditText {
|
|
|
571
578
|
EnrichedSpans.BLOCK_QUOTE -> paragraphStyles?.removeStyle(EnrichedSpans.BLOCK_QUOTE, start, end)
|
|
572
579
|
EnrichedSpans.ORDERED_LIST -> listStyles?.removeStyle(EnrichedSpans.ORDERED_LIST, start, end)
|
|
573
580
|
EnrichedSpans.UNORDERED_LIST -> listStyles?.removeStyle(EnrichedSpans.UNORDERED_LIST, start, end)
|
|
581
|
+
EnrichedSpans.CHECKBOX_LIST -> listStyles?.removeStyle(EnrichedSpans.CHECKBOX_LIST, start, end)
|
|
574
582
|
EnrichedSpans.LINK -> parametrizedStyles?.removeStyle(EnrichedSpans.LINK, start, end)
|
|
575
583
|
EnrichedSpans.IMAGE -> parametrizedStyles?.removeStyle(EnrichedSpans.IMAGE, start, end)
|
|
576
584
|
EnrichedSpans.MENTION -> parametrizedStyles?.removeStyle(EnrichedSpans.MENTION, start, end)
|
|
@@ -598,6 +606,7 @@ class EnrichedTextInputView : AppCompatEditText {
|
|
|
598
606
|
EnrichedSpans.BLOCK_QUOTE -> paragraphStyles?.getStyleRange()
|
|
599
607
|
EnrichedSpans.ORDERED_LIST -> listStyles?.getStyleRange()
|
|
600
608
|
EnrichedSpans.UNORDERED_LIST -> listStyles?.getStyleRange()
|
|
609
|
+
EnrichedSpans.CHECKBOX_LIST -> listStyles?.getStyleRange()
|
|
601
610
|
EnrichedSpans.LINK -> parametrizedStyles?.getStyleRange()
|
|
602
611
|
EnrichedSpans.IMAGE -> parametrizedStyles?.getStyleRange()
|
|
603
612
|
EnrichedSpans.MENTION -> parametrizedStyles?.getStyleRange()
|
|
@@ -657,6 +666,13 @@ class EnrichedTextInputView : AppCompatEditText {
|
|
|
657
666
|
toggleStyle(name)
|
|
658
667
|
}
|
|
659
668
|
|
|
669
|
+
fun toggleCheckboxListItem(checked: Boolean) {
|
|
670
|
+
val isValid = verifyStyle(EnrichedSpans.CHECKBOX_LIST)
|
|
671
|
+
if (!isValid) return
|
|
672
|
+
|
|
673
|
+
listStyles?.toggleCheckboxListStyle(checked)
|
|
674
|
+
}
|
|
675
|
+
|
|
660
676
|
fun addLink(
|
|
661
677
|
start: Int,
|
|
662
678
|
end: Int,
|
|
@@ -752,21 +768,42 @@ class EnrichedTextInputView : AppCompatEditText {
|
|
|
752
768
|
scrollTo(scrollX, targetScrollY)
|
|
753
769
|
}
|
|
754
770
|
|
|
771
|
+
private fun isHeadingBold(
|
|
772
|
+
style: HtmlStyle,
|
|
773
|
+
span: EnrichedInputSpan,
|
|
774
|
+
): Boolean =
|
|
775
|
+
when (span) {
|
|
776
|
+
is EnrichedInputH1Span -> style.h1Bold
|
|
777
|
+
is EnrichedInputH2Span -> style.h2Bold
|
|
778
|
+
is EnrichedInputH3Span -> style.h3Bold
|
|
779
|
+
is EnrichedInputH4Span -> style.h4Bold
|
|
780
|
+
is EnrichedInputH5Span -> style.h5Bold
|
|
781
|
+
is EnrichedInputH6Span -> style.h6Bold
|
|
782
|
+
else -> false
|
|
783
|
+
}
|
|
784
|
+
|
|
785
|
+
private fun shouldRemoveBoldFromHeading(
|
|
786
|
+
span: EnrichedInputSpan,
|
|
787
|
+
prevStyle: HtmlStyle,
|
|
788
|
+
nextStyle: HtmlStyle,
|
|
789
|
+
): Boolean {
|
|
790
|
+
val wasBold = isHeadingBold(prevStyle, span)
|
|
791
|
+
val isNowBold = isHeadingBold(nextStyle, span)
|
|
792
|
+
|
|
793
|
+
return !wasBold && isNowBold
|
|
794
|
+
}
|
|
795
|
+
|
|
755
796
|
private fun reApplyHtmlStyleForSpans(
|
|
756
797
|
previousHtmlStyle: HtmlStyle,
|
|
757
798
|
nextHtmlStyle: HtmlStyle,
|
|
758
799
|
) {
|
|
759
|
-
val shouldRemoveBoldSpanFromH1Span = !previousHtmlStyle.h1Bold && nextHtmlStyle.h1Bold
|
|
760
|
-
val shouldRemoveBoldSpanFromH2Span = !previousHtmlStyle.h2Bold && nextHtmlStyle.h2Bold
|
|
761
|
-
val shouldRemoveBoldSpanFromH3Span = !previousHtmlStyle.h3Bold && nextHtmlStyle.h3Bold
|
|
762
|
-
|
|
763
800
|
val spannable = text as? Spannable ?: return
|
|
764
801
|
if (spannable.isEmpty()) return
|
|
765
802
|
|
|
766
803
|
var shouldEmitStateChange = false
|
|
767
804
|
|
|
768
805
|
runAsATransaction {
|
|
769
|
-
val spans = spannable.getSpans(0, spannable.length,
|
|
806
|
+
val spans = spannable.getSpans(0, spannable.length, EnrichedInputSpan::class.java)
|
|
770
807
|
for (span in spans) {
|
|
771
808
|
if (!span.dependsOnHtmlStyle) continue
|
|
772
809
|
|
|
@@ -776,9 +813,8 @@ class EnrichedTextInputView : AppCompatEditText {
|
|
|
776
813
|
|
|
777
814
|
if (start == -1 || end == -1) continue
|
|
778
815
|
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
) {
|
|
816
|
+
// Check if we need to remove explicit bold spans
|
|
817
|
+
if (shouldRemoveBoldFromHeading(span, previousHtmlStyle, nextHtmlStyle)) {
|
|
782
818
|
val isRemoved = removeStyle(EnrichedSpans.BOLD, start, end)
|
|
783
819
|
if (isRemoved) shouldEmitStateChange = true
|
|
784
820
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
package com.swmansion.enriched
|
|
1
|
+
package com.swmansion.enriched.textinput
|
|
2
2
|
|
|
3
3
|
import android.content.Context
|
|
4
4
|
import com.facebook.react.bridge.ReadableArray
|
|
@@ -15,21 +15,21 @@ import com.facebook.react.uimanager.annotations.ReactProp
|
|
|
15
15
|
import com.facebook.react.viewmanagers.EnrichedTextInputViewManagerDelegate
|
|
16
16
|
import com.facebook.react.viewmanagers.EnrichedTextInputViewManagerInterface
|
|
17
17
|
import com.facebook.yoga.YogaMeasureMode
|
|
18
|
-
import com.swmansion.enriched.events.OnChangeHtmlEvent
|
|
19
|
-
import com.swmansion.enriched.events.OnChangeSelectionEvent
|
|
20
|
-
import com.swmansion.enriched.events.
|
|
21
|
-
import com.swmansion.enriched.events.
|
|
22
|
-
import com.swmansion.enriched.events.
|
|
23
|
-
import com.swmansion.enriched.events.
|
|
24
|
-
import com.swmansion.enriched.events.
|
|
25
|
-
import com.swmansion.enriched.events.
|
|
26
|
-
import com.swmansion.enriched.events.
|
|
27
|
-
import com.swmansion.enriched.events.
|
|
28
|
-
import com.swmansion.enriched.events.
|
|
29
|
-
import com.swmansion.enriched.events.OnRequestHtmlResultEvent
|
|
30
|
-
import com.swmansion.enriched.spans.EnrichedSpans
|
|
31
|
-
import com.swmansion.enriched.styles.HtmlStyle
|
|
32
|
-
import com.swmansion.enriched.utils.jsonStringToStringMap
|
|
18
|
+
import com.swmansion.enriched.textinput.events.OnChangeHtmlEvent
|
|
19
|
+
import com.swmansion.enriched.textinput.events.OnChangeSelectionEvent
|
|
20
|
+
import com.swmansion.enriched.textinput.events.OnChangeStateEvent
|
|
21
|
+
import com.swmansion.enriched.textinput.events.OnChangeTextEvent
|
|
22
|
+
import com.swmansion.enriched.textinput.events.OnInputBlurEvent
|
|
23
|
+
import com.swmansion.enriched.textinput.events.OnInputFocusEvent
|
|
24
|
+
import com.swmansion.enriched.textinput.events.OnInputKeyPressEvent
|
|
25
|
+
import com.swmansion.enriched.textinput.events.OnLinkDetectedEvent
|
|
26
|
+
import com.swmansion.enriched.textinput.events.OnMentionDetectedEvent
|
|
27
|
+
import com.swmansion.enriched.textinput.events.OnMentionEvent
|
|
28
|
+
import com.swmansion.enriched.textinput.events.OnPasteImagesEvent
|
|
29
|
+
import com.swmansion.enriched.textinput.events.OnRequestHtmlResultEvent
|
|
30
|
+
import com.swmansion.enriched.textinput.spans.EnrichedSpans
|
|
31
|
+
import com.swmansion.enriched.textinput.styles.HtmlStyle
|
|
32
|
+
import com.swmansion.enriched.textinput.utils.jsonStringToStringMap
|
|
33
33
|
|
|
34
34
|
@ReactModule(name = EnrichedTextInputViewManager.NAME)
|
|
35
35
|
class EnrichedTextInputViewManager :
|
|
@@ -65,13 +65,13 @@ class EnrichedTextInputViewManager :
|
|
|
65
65
|
map.put(OnChangeTextEvent.EVENT_NAME, mapOf("registrationName" to OnChangeTextEvent.EVENT_NAME))
|
|
66
66
|
map.put(OnChangeHtmlEvent.EVENT_NAME, mapOf("registrationName" to OnChangeHtmlEvent.EVENT_NAME))
|
|
67
67
|
map.put(OnChangeStateEvent.EVENT_NAME, mapOf("registrationName" to OnChangeStateEvent.EVENT_NAME))
|
|
68
|
-
map.put(OnChangeStateDeprecatedEvent.EVENT_NAME, mapOf("registrationName" to OnChangeStateDeprecatedEvent.EVENT_NAME))
|
|
69
68
|
map.put(OnLinkDetectedEvent.EVENT_NAME, mapOf("registrationName" to OnLinkDetectedEvent.EVENT_NAME))
|
|
70
69
|
map.put(OnMentionDetectedEvent.EVENT_NAME, mapOf("registrationName" to OnMentionDetectedEvent.EVENT_NAME))
|
|
71
70
|
map.put(OnMentionEvent.EVENT_NAME, mapOf("registrationName" to OnMentionEvent.EVENT_NAME))
|
|
72
71
|
map.put(OnChangeSelectionEvent.EVENT_NAME, mapOf("registrationName" to OnChangeSelectionEvent.EVENT_NAME))
|
|
73
72
|
map.put(OnRequestHtmlResultEvent.EVENT_NAME, mapOf("registrationName" to OnRequestHtmlResultEvent.EVENT_NAME))
|
|
74
73
|
map.put(OnInputKeyPressEvent.EVENT_NAME, mapOf("registrationName" to OnInputKeyPressEvent.EVENT_NAME))
|
|
74
|
+
map.put(OnPasteImagesEvent.EVENT_NAME, mapOf("registrationName" to OnPasteImagesEvent.EVENT_NAME))
|
|
75
75
|
|
|
76
76
|
return map
|
|
77
77
|
}
|
|
@@ -340,6 +340,13 @@ class EnrichedTextInputViewManager :
|
|
|
340
340
|
view?.verifyAndToggleStyle(EnrichedSpans.UNORDERED_LIST)
|
|
341
341
|
}
|
|
342
342
|
|
|
343
|
+
override fun toggleCheckboxList(
|
|
344
|
+
view: EnrichedTextInputView?,
|
|
345
|
+
isChecked: Boolean,
|
|
346
|
+
) {
|
|
347
|
+
view?.toggleCheckboxListItem(isChecked)
|
|
348
|
+
}
|
|
349
|
+
|
|
343
350
|
override fun addLink(
|
|
344
351
|
view: EnrichedTextInputView?,
|
|
345
352
|
start: Int,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
package com.swmansion.enriched
|
|
1
|
+
package com.swmansion.enriched.textinput
|
|
2
2
|
|
|
3
3
|
import android.content.Context
|
|
4
4
|
import android.graphics.Typeface
|
|
@@ -15,8 +15,8 @@ import com.facebook.react.views.text.ReactTypefaceUtils.parseFontStyle
|
|
|
15
15
|
import com.facebook.react.views.text.ReactTypefaceUtils.parseFontWeight
|
|
16
16
|
import com.facebook.yoga.YogaMeasureMode
|
|
17
17
|
import com.facebook.yoga.YogaMeasureOutput
|
|
18
|
-
import com.swmansion.enriched.
|
|
19
|
-
import com.swmansion.enriched.
|
|
18
|
+
import com.swmansion.enriched.common.parser.EnrichedParser
|
|
19
|
+
import com.swmansion.enriched.textinput.styles.HtmlStyle
|
|
20
20
|
import java.util.concurrent.ConcurrentHashMap
|
|
21
21
|
import kotlin.math.ceil
|
|
22
22
|
|
|
@@ -112,7 +112,8 @@ object MeasurementStore {
|
|
|
112
112
|
|
|
113
113
|
try {
|
|
114
114
|
val htmlStyle = HtmlStyle(defaultView, props.getMap("htmlStyle"))
|
|
115
|
-
val
|
|
115
|
+
val factory = EnrichedTextInputSpannableFactory()
|
|
116
|
+
val parsed = EnrichedParser.fromHtml(defaultValue, htmlStyle, factory)
|
|
116
117
|
return parsed.trimEnd('\n')
|
|
117
118
|
} catch (e: Exception) {
|
|
118
119
|
Log.w("MeasurementStore", "Error parsing initial HTML text: ${e.message}")
|
package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/MentionHandler.kt
RENAMED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
package com.swmansion.enriched.events
|
|
1
|
+
package com.swmansion.enriched.textinput.events
|
|
2
2
|
|
|
3
3
|
import com.facebook.react.bridge.ReactContext
|
|
4
4
|
import com.facebook.react.uimanager.UIManagerHelper
|
|
5
|
-
import com.swmansion.enriched.EnrichedTextInputView
|
|
5
|
+
import com.swmansion.enriched.textinput.EnrichedTextInputView
|
|
6
6
|
|
|
7
7
|
class MentionHandler(
|
|
8
8
|
private val view: EnrichedTextInputView,
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
package com.swmansion.enriched.events
|
|
1
|
+
package com.swmansion.enriched.textinput.events
|
|
2
2
|
|
|
3
3
|
import android.text.Editable
|
|
4
4
|
import com.facebook.react.bridge.Arguments
|
|
5
5
|
import com.facebook.react.bridge.WritableMap
|
|
6
6
|
import com.facebook.react.uimanager.events.Event
|
|
7
|
-
import com.swmansion.enriched.
|
|
7
|
+
import com.swmansion.enriched.common.EnrichedConstants
|
|
8
8
|
|
|
9
9
|
class OnChangeTextEvent(
|
|
10
10
|
surfaceId: Int,
|