react-native-enriched 0.3.0 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/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 +30 -25
- 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 +274 -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 +43 -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
package/android/src/main/java/com/swmansion/enriched/{styles → textinput/styles}/HtmlStyle.kt
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
package com.swmansion.enriched.styles
|
|
1
|
+
package com.swmansion.enriched.textinput.styles
|
|
2
2
|
|
|
3
3
|
import android.graphics.Color
|
|
4
4
|
import com.facebook.react.bridge.ColorPropConverter
|
|
@@ -6,63 +6,70 @@ import com.facebook.react.bridge.ReactContext
|
|
|
6
6
|
import com.facebook.react.bridge.ReadableMap
|
|
7
7
|
import com.facebook.react.uimanager.PixelUtil
|
|
8
8
|
import com.facebook.react.views.text.ReactTypefaceUtils.parseFontWeight
|
|
9
|
-
import com.swmansion.enriched.
|
|
9
|
+
import com.swmansion.enriched.common.EnrichedStyle
|
|
10
|
+
import com.swmansion.enriched.common.MentionStyle
|
|
11
|
+
import com.swmansion.enriched.textinput.EnrichedTextInputView
|
|
10
12
|
import kotlin.Float
|
|
11
13
|
import kotlin.Int
|
|
12
14
|
import kotlin.String
|
|
13
15
|
import kotlin.math.ceil
|
|
14
16
|
|
|
15
|
-
class HtmlStyle {
|
|
17
|
+
class HtmlStyle : EnrichedStyle {
|
|
16
18
|
private var style: ReadableMap? = null
|
|
17
19
|
private var view: EnrichedTextInputView? = null
|
|
18
20
|
|
|
19
21
|
// Default values are ignored as they are specified on the JS side.
|
|
20
22
|
// They are specified only because they are required by the constructor.
|
|
21
23
|
// JS passes them as a prop - so they are initialized after the constructor is called.
|
|
22
|
-
var h1FontSize: Int = 72
|
|
23
|
-
var h1Bold: Boolean = false
|
|
24
|
+
override var h1FontSize: Int = 72
|
|
25
|
+
override var h1Bold: Boolean = false
|
|
24
26
|
|
|
25
|
-
var h2FontSize: Int = 64
|
|
26
|
-
var h2Bold: Boolean = false
|
|
27
|
+
override var h2FontSize: Int = 64
|
|
28
|
+
override var h2Bold: Boolean = false
|
|
27
29
|
|
|
28
|
-
var h3FontSize: Int = 56
|
|
29
|
-
var h3Bold: Boolean = false
|
|
30
|
+
override var h3FontSize: Int = 56
|
|
31
|
+
override var h3Bold: Boolean = false
|
|
30
32
|
|
|
31
|
-
var h4FontSize: Int = 48
|
|
32
|
-
var h4Bold: Boolean = false
|
|
33
|
+
override var h4FontSize: Int = 48
|
|
34
|
+
override var h4Bold: Boolean = false
|
|
33
35
|
|
|
34
|
-
var h5FontSize: Int = 40
|
|
35
|
-
var h5Bold: Boolean = false
|
|
36
|
+
override var h5FontSize: Int = 40
|
|
37
|
+
override var h5Bold: Boolean = false
|
|
36
38
|
|
|
37
|
-
var h6FontSize: Int = 32
|
|
38
|
-
var h6Bold: Boolean = false
|
|
39
|
+
override var h6FontSize: Int = 32
|
|
40
|
+
override var h6Bold: Boolean = false
|
|
39
41
|
|
|
40
|
-
var blockquoteColor: Int? = null
|
|
41
|
-
var blockquoteBorderColor: Int = Color.BLACK
|
|
42
|
-
var blockquoteStripeWidth: Int = 2
|
|
43
|
-
var blockquoteGapWidth: Int = 16
|
|
42
|
+
override var blockquoteColor: Int? = null
|
|
43
|
+
override var blockquoteBorderColor: Int = Color.BLACK
|
|
44
|
+
override var blockquoteStripeWidth: Int = 2
|
|
45
|
+
override var blockquoteGapWidth: Int = 16
|
|
44
46
|
|
|
45
|
-
var olGapWidth: Int = 16
|
|
46
|
-
var olMarginLeft: Int = 24
|
|
47
|
-
var olMarkerFontWeight: Int? = null
|
|
48
|
-
var olMarkerColor: Int? = null
|
|
47
|
+
override var olGapWidth: Int = 16
|
|
48
|
+
override var olMarginLeft: Int = 24
|
|
49
|
+
override var olMarkerFontWeight: Int? = null
|
|
50
|
+
override var olMarkerColor: Int? = null
|
|
49
51
|
|
|
50
|
-
var ulGapWidth: Int = 16
|
|
51
|
-
var ulMarginLeft: Int = 24
|
|
52
|
-
var ulBulletSize: Int = 8
|
|
53
|
-
var ulBulletColor: Int = Color.BLACK
|
|
52
|
+
override var ulGapWidth: Int = 16
|
|
53
|
+
override var ulMarginLeft: Int = 24
|
|
54
|
+
override var ulBulletSize: Int = 8
|
|
55
|
+
override var ulBulletColor: Int = Color.BLACK
|
|
54
56
|
|
|
55
|
-
var
|
|
56
|
-
var
|
|
57
|
+
override var ulCheckboxBoxSize: Int = 50
|
|
58
|
+
override var ulCheckboxGapWidth: Int = 16
|
|
59
|
+
override var ulCheckboxMarginLeft: Int = 24
|
|
60
|
+
override var ulCheckboxBoxColor: Int = Color.BLACK
|
|
57
61
|
|
|
58
|
-
var
|
|
59
|
-
var
|
|
60
|
-
var codeBlockRadius: Float = 4f
|
|
62
|
+
override var aColor: Int = Color.BLACK
|
|
63
|
+
override var aUnderline: Boolean = true
|
|
61
64
|
|
|
62
|
-
var
|
|
63
|
-
var
|
|
65
|
+
override var codeBlockColor: Int = Color.BLACK
|
|
66
|
+
override var codeBlockBackgroundColor: Int = Color.BLACK
|
|
67
|
+
override var codeBlockRadius: Float = 4f
|
|
64
68
|
|
|
65
|
-
var
|
|
69
|
+
override var inlineCodeColor: Int = Color.BLACK
|
|
70
|
+
override var inlineCodeBackgroundColor: Int = Color.BLACK
|
|
71
|
+
|
|
72
|
+
override var mentionsStyle: MutableMap<String, MentionStyle> = mutableMapOf()
|
|
66
73
|
|
|
67
74
|
constructor(view: EnrichedTextInputView?, style: ReadableMap?) {
|
|
68
75
|
this.view = view
|
|
@@ -118,6 +125,12 @@ class HtmlStyle {
|
|
|
118
125
|
ulMarginLeft = parseFloat(ulStyle, "marginLeft").toInt()
|
|
119
126
|
ulBulletSize = parseFloat(ulStyle, "bulletSize").toInt()
|
|
120
127
|
|
|
128
|
+
val ulCheckboxStyle = style.getMap("ulCheckbox")
|
|
129
|
+
ulCheckboxBoxSize = parseFloat(ulCheckboxStyle, "boxSize").toInt()
|
|
130
|
+
ulCheckboxGapWidth = parseFloat(ulCheckboxStyle, "gapWidth").toInt()
|
|
131
|
+
ulCheckboxMarginLeft = parseFloat(ulCheckboxStyle, "marginLeft").toInt()
|
|
132
|
+
ulCheckboxBoxColor = parseColor(ulCheckboxStyle, "boxColor")
|
|
133
|
+
|
|
121
134
|
val aStyle = style.getMap("a")
|
|
122
135
|
aColor = parseColor(aStyle, "color")
|
|
123
136
|
aUnderline = parseIsUnderline(aStyle)
|
|
@@ -290,6 +303,11 @@ class HtmlStyle {
|
|
|
290
303
|
ulBulletSize == other.ulBulletSize &&
|
|
291
304
|
ulBulletColor == other.ulBulletColor &&
|
|
292
305
|
|
|
306
|
+
ulCheckboxBoxSize == other.ulCheckboxBoxSize &&
|
|
307
|
+
ulCheckboxGapWidth == other.ulCheckboxGapWidth &&
|
|
308
|
+
ulCheckboxMarginLeft == other.ulCheckboxMarginLeft &&
|
|
309
|
+
ulCheckboxBoxColor == other.ulCheckboxBoxColor &&
|
|
310
|
+
|
|
293
311
|
aColor == other.aColor &&
|
|
294
312
|
aUnderline == other.aUnderline &&
|
|
295
313
|
|
|
@@ -332,6 +350,11 @@ class HtmlStyle {
|
|
|
332
350
|
result = 31 * result + ulBulletSize.hashCode()
|
|
333
351
|
result = 31 * result + ulBulletColor.hashCode()
|
|
334
352
|
|
|
353
|
+
result = 31 * result + ulCheckboxBoxSize.hashCode()
|
|
354
|
+
result = 31 * result + ulCheckboxGapWidth.hashCode()
|
|
355
|
+
result = 31 * result + ulCheckboxMarginLeft.hashCode()
|
|
356
|
+
result = 31 * result + ulCheckboxBoxColor.hashCode()
|
|
357
|
+
|
|
335
358
|
result = 31 * result + aColor.hashCode()
|
|
336
359
|
result = 31 * result + aUnderline.hashCode()
|
|
337
360
|
|
|
@@ -346,12 +369,4 @@ class HtmlStyle {
|
|
|
346
369
|
|
|
347
370
|
return result
|
|
348
371
|
}
|
|
349
|
-
|
|
350
|
-
companion object {
|
|
351
|
-
data class MentionStyle(
|
|
352
|
-
val color: Int,
|
|
353
|
-
val backgroundColor: Int,
|
|
354
|
-
val underline: Boolean,
|
|
355
|
-
)
|
|
356
|
-
}
|
|
357
372
|
}
|
package/android/src/main/java/com/swmansion/enriched/{styles → textinput/styles}/InlineStyles.kt
RENAMED
|
@@ -1,10 +1,10 @@
|
|
|
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
|
-
import com.swmansion.enriched.EnrichedTextInputView
|
|
6
|
-
import com.swmansion.enriched.spans.EnrichedSpans
|
|
7
|
-
import com.swmansion.enriched.utils.getSafeSpanBoundaries
|
|
5
|
+
import com.swmansion.enriched.textinput.EnrichedTextInputView
|
|
6
|
+
import com.swmansion.enriched.textinput.spans.EnrichedSpans
|
|
7
|
+
import com.swmansion.enriched.textinput.utils.getSafeSpanBoundaries
|
|
8
8
|
|
|
9
9
|
class InlineStyles(
|
|
10
10
|
private val view: EnrichedTextInputView,
|
package/android/src/main/java/com/swmansion/enriched/{styles → textinput/styles}/ListStyles.kt
RENAMED
|
@@ -1,17 +1,18 @@
|
|
|
1
|
-
package com.swmansion.enriched.styles
|
|
1
|
+
package com.swmansion.enriched.textinput.styles
|
|
2
2
|
|
|
3
3
|
import android.text.Editable
|
|
4
4
|
import android.text.Spannable
|
|
5
5
|
import android.text.SpannableStringBuilder
|
|
6
6
|
import android.text.Spanned
|
|
7
|
-
import com.swmansion.enriched.
|
|
8
|
-
import com.swmansion.enriched.
|
|
9
|
-
import com.swmansion.enriched.spans.
|
|
10
|
-
import com.swmansion.enriched.spans.
|
|
11
|
-
import com.swmansion.enriched.
|
|
12
|
-
import com.swmansion.enriched.
|
|
13
|
-
import com.swmansion.enriched.utils.
|
|
14
|
-
import com.swmansion.enriched.utils.
|
|
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
|
|
15
16
|
|
|
16
17
|
class ListStyles(
|
|
17
18
|
private val view: EnrichedTextInputView,
|
|
@@ -47,8 +48,8 @@ class ListStyles(
|
|
|
47
48
|
spannable: Spannable,
|
|
48
49
|
s: Int,
|
|
49
50
|
): Int {
|
|
50
|
-
val span = getPreviousParagraphSpan(spannable, s,
|
|
51
|
-
val index = span?.
|
|
51
|
+
val span = getPreviousParagraphSpan(spannable, s, EnrichedInputOrderedListSpan::class.java)
|
|
52
|
+
val index = span?.getListIndex() ?: 0
|
|
52
53
|
return index + 1
|
|
53
54
|
}
|
|
54
55
|
|
|
@@ -57,19 +58,29 @@ class ListStyles(
|
|
|
57
58
|
name: String,
|
|
58
59
|
start: Int,
|
|
59
60
|
end: Int,
|
|
61
|
+
isChecked: Boolean? = false,
|
|
60
62
|
) {
|
|
61
63
|
val (safeStart, safeEnd) = spannable.getSafeSpanBoundaries(start, end)
|
|
62
64
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
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)
|
|
68
80
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
spannable.setSpan(span, safeStart, safeEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
|
|
81
|
+
// Invalidate layout to update checkbox drawing in case checkbox is bigger than line height
|
|
82
|
+
view.layoutManager.invalidateLayout()
|
|
83
|
+
}
|
|
73
84
|
}
|
|
74
85
|
}
|
|
75
86
|
|
|
@@ -95,16 +106,19 @@ class ListStyles(
|
|
|
95
106
|
text: Spannable,
|
|
96
107
|
position: Int,
|
|
97
108
|
) {
|
|
98
|
-
val spans = text.getSpans(position + 1, text.length,
|
|
109
|
+
val spans = text.getSpans(position + 1, text.length, EnrichedInputOrderedListSpan::class.java)
|
|
99
110
|
val sortedSpans = spans.sortedBy { text.getSpanStart(it) }
|
|
100
111
|
for (span in sortedSpans) {
|
|
101
112
|
val spanStart = text.getSpanStart(span)
|
|
102
113
|
val index = getOrderedListIndex(text, spanStart)
|
|
103
|
-
span.
|
|
114
|
+
span.setListIndex(index)
|
|
104
115
|
}
|
|
105
116
|
}
|
|
106
117
|
|
|
107
|
-
fun toggleStyle(
|
|
118
|
+
private fun toggleStyle(
|
|
119
|
+
name: String,
|
|
120
|
+
checkboxState: Boolean?,
|
|
121
|
+
) {
|
|
108
122
|
if (view.selection == null) return
|
|
109
123
|
val config = EnrichedSpans.listSpans[name] ?: return
|
|
110
124
|
val spannable = view.text as SpannableStringBuilder
|
|
@@ -123,7 +137,7 @@ class ListStyles(
|
|
|
123
137
|
spannable.insert(start, EnrichedConstants.ZWS_STRING)
|
|
124
138
|
view.spanState?.setStart(name, start + 1)
|
|
125
139
|
removeSpansForRange(spannable, start, end, config.clazz)
|
|
126
|
-
setSpan(spannable, name, start, end + 1)
|
|
140
|
+
setSpan(spannable, name, start, end + 1, checkboxState)
|
|
127
141
|
|
|
128
142
|
return
|
|
129
143
|
}
|
|
@@ -135,7 +149,7 @@ class ListStyles(
|
|
|
135
149
|
for (paragraph in paragraphs) {
|
|
136
150
|
spannable.insert(currentStart, EnrichedConstants.ZWS_STRING)
|
|
137
151
|
val currentEnd = currentStart + paragraph.length + 1
|
|
138
|
-
setSpan(spannable, name, currentStart, currentEnd)
|
|
152
|
+
setSpan(spannable, name, currentStart, currentEnd, checkboxState)
|
|
139
153
|
|
|
140
154
|
currentStart = currentEnd + 1
|
|
141
155
|
}
|
|
@@ -143,6 +157,14 @@ class ListStyles(
|
|
|
143
157
|
view.spanState?.setStart(name, currentStart)
|
|
144
158
|
}
|
|
145
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
|
+
|
|
146
168
|
private fun handleAfterTextChanged(
|
|
147
169
|
s: Editable,
|
|
148
170
|
name: String,
|
|
@@ -155,7 +177,7 @@ class ListStyles(
|
|
|
155
177
|
|
|
156
178
|
val isBackspace = previousTextLength > s.length
|
|
157
179
|
val isNewLine = cursorPosition > 0 && s[cursorPosition - 1] == '\n'
|
|
158
|
-
val isShortcut = s.substring(start, end).startsWith(
|
|
180
|
+
val isShortcut = config.shortcut?.let { s.substring(start, end).startsWith(it) } ?: false
|
|
159
181
|
val spans = s.getSpans(start, end, config.clazz)
|
|
160
182
|
|
|
161
183
|
// Remove spans if cursor is at the start of the paragraph and spans exist
|
|
@@ -173,6 +195,19 @@ class ListStyles(
|
|
|
173
195
|
}
|
|
174
196
|
|
|
175
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
|
+
|
|
176
211
|
s.insert(cursorPosition, EnrichedConstants.ZWS_STRING)
|
|
177
212
|
setSpan(s, name, start, end + 1)
|
|
178
213
|
// Inform that new span has been added
|
|
@@ -180,6 +215,21 @@ class ListStyles(
|
|
|
180
215
|
return
|
|
181
216
|
}
|
|
182
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
|
+
|
|
183
233
|
if (spans.isNotEmpty()) {
|
|
184
234
|
for (span in spans) {
|
|
185
235
|
s.removeSpan(span)
|
|
@@ -196,6 +246,7 @@ class ListStyles(
|
|
|
196
246
|
) {
|
|
197
247
|
handleAfterTextChanged(s, EnrichedSpans.ORDERED_LIST, endCursorPosition, previousTextLength)
|
|
198
248
|
handleAfterTextChanged(s, EnrichedSpans.UNORDERED_LIST, endCursorPosition, previousTextLength)
|
|
249
|
+
handleAfterTextChanged(s, EnrichedSpans.CHECKBOX_LIST, endCursorPosition, previousTextLength)
|
|
199
250
|
}
|
|
200
251
|
|
|
201
252
|
fun getStyleRange(): Pair<Int, Int> = view.selection?.getParagraphSelection() ?: Pair(0, 0)
|
package/android/src/main/java/com/swmansion/enriched/{styles → textinput/styles}/ParagraphStyles.kt
RENAMED
|
@@ -1,16 +1,16 @@
|
|
|
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.getParagraphBounds
|
|
12
|
-
import com.swmansion.enriched.utils.getSafeSpanBoundaries
|
|
13
|
-
import com.swmansion.enriched.utils.removeZWS
|
|
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
14
|
|
|
15
15
|
class ParagraphStyles(
|
|
16
16
|
private val view: EnrichedTextInputView,
|
|
@@ -108,6 +108,9 @@ class ParagraphStyles(
|
|
|
108
108
|
spannable.setSpan(span, safeStart, safeEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
|
|
109
109
|
}
|
|
110
110
|
|
|
111
|
+
// Removes spans of the given type in the specified range.
|
|
112
|
+
// If the removed span intersects with the range, it will be split and the remaining part will be re-applied after the removal
|
|
113
|
+
// Returns true if any spans were removed, false otherwise
|
|
111
114
|
private fun <T> removeSpansForRange(
|
|
112
115
|
spannable: Spannable,
|
|
113
116
|
start: Int,
|
|
@@ -115,21 +118,24 @@ class ParagraphStyles(
|
|
|
115
118
|
clazz: Class<T>,
|
|
116
119
|
): Boolean {
|
|
117
120
|
val ssb = spannable as SpannableStringBuilder
|
|
118
|
-
var finalStart = start
|
|
119
|
-
var finalEnd = end
|
|
120
|
-
|
|
121
121
|
val spans = ssb.getSpans(start, end, clazz)
|
|
122
122
|
if (spans.isEmpty()) return false
|
|
123
123
|
|
|
124
124
|
for (span in spans) {
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
125
|
+
val spanStart = ssb.getSpanStart(span)
|
|
126
|
+
val spanEnd = ssb.getSpanEnd(span)
|
|
128
127
|
ssb.removeSpan(span)
|
|
129
|
-
}
|
|
130
128
|
|
|
131
|
-
|
|
129
|
+
if (spanStart < start) {
|
|
130
|
+
setSpan(ssb, clazz, spanStart, start - 1)
|
|
131
|
+
}
|
|
132
132
|
|
|
133
|
+
if (spanEnd > end) {
|
|
134
|
+
setSpan(ssb, clazz, end + 1, spanEnd)
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
ssb.removeZWS(start, end)
|
|
133
139
|
return true
|
|
134
140
|
}
|
|
135
141
|
|
|
@@ -215,11 +221,7 @@ class ParagraphStyles(
|
|
|
215
221
|
}
|
|
216
222
|
|
|
217
223
|
val currSpan = currParagraphSpans[0]
|
|
218
|
-
val nextSpan = getNextParagraphSpan(s, end, type)
|
|
219
|
-
|
|
220
|
-
if (nextSpan == null) {
|
|
221
|
-
return
|
|
222
|
-
}
|
|
224
|
+
val nextSpan = getNextParagraphSpan(s, end, type) ?: return
|
|
223
225
|
|
|
224
226
|
val newStart = s.getSpanStart(currSpan)
|
|
225
227
|
val newEnd = s.getSpanEnd(nextSpan)
|
|
@@ -259,7 +261,7 @@ class ParagraphStyles(
|
|
|
259
261
|
}
|
|
260
262
|
|
|
261
263
|
for (span in spans) {
|
|
262
|
-
extendStyleOnWholeParagraph(s, span as
|
|
264
|
+
extendStyleOnWholeParagraph(s, span as EnrichedInputSpan, conflictingType, paragraphEnd)
|
|
263
265
|
}
|
|
264
266
|
}
|
|
265
267
|
|
|
@@ -294,7 +296,7 @@ class ParagraphStyles(
|
|
|
294
296
|
|
|
295
297
|
private fun <T> extendStyleOnWholeParagraph(
|
|
296
298
|
s: Editable,
|
|
297
|
-
span:
|
|
299
|
+
span: EnrichedInputSpan,
|
|
298
300
|
type: Class<T>,
|
|
299
301
|
paragraphEnd: Int,
|
|
300
302
|
) {
|
|
@@ -325,7 +327,7 @@ class ParagraphStyles(
|
|
|
325
327
|
for (span in spans) {
|
|
326
328
|
// handle conflicts when entering paragraph with some paragraph style applied
|
|
327
329
|
deleteConflictingAndBlockingStyles(s, style, start, end)
|
|
328
|
-
extendStyleOnWholeParagraph(s, span as
|
|
330
|
+
extendStyleOnWholeParagraph(s, span as EnrichedInputSpan, config.clazz, end)
|
|
329
331
|
}
|
|
330
332
|
}
|
|
331
333
|
|
|
@@ -341,9 +343,12 @@ class ParagraphStyles(
|
|
|
341
343
|
continue
|
|
342
344
|
}
|
|
343
345
|
|
|
346
|
+
// If removing text at the beginning of the line, we want to remove the span for the whole paragraph
|
|
344
347
|
if (isBackspace) {
|
|
345
|
-
|
|
348
|
+
val currentParagraphBounds = s.getParagraphBounds(endCursorPosition)
|
|
349
|
+
removeSpansForRange(s, currentParagraphBounds.first, currentParagraphBounds.second, config.clazz)
|
|
346
350
|
spanState.setStart(style, null)
|
|
351
|
+
continue
|
|
347
352
|
} else {
|
|
348
353
|
s.insert(endCursorPosition, EnrichedConstants.ZWS_STRING)
|
|
349
354
|
endCursorPosition += 1
|
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
package com.swmansion.enriched.styles
|
|
1
|
+
package com.swmansion.enriched.textinput.styles
|
|
2
2
|
|
|
3
3
|
import android.text.Editable
|
|
4
4
|
import android.text.Spannable
|
|
5
5
|
import android.text.SpannableStringBuilder
|
|
6
6
|
import android.text.Spanned
|
|
7
|
-
import com.swmansion.enriched.
|
|
8
|
-
import com.swmansion.enriched.
|
|
9
|
-
import com.swmansion.enriched.spans.
|
|
10
|
-
import com.swmansion.enriched.spans.
|
|
11
|
-
import com.swmansion.enriched.spans.
|
|
12
|
-
import com.swmansion.enriched.
|
|
13
|
-
import com.swmansion.enriched.utils.getSafeSpanBoundaries
|
|
14
|
-
import com.swmansion.enriched.utils.removeZWS
|
|
7
|
+
import com.swmansion.enriched.common.EnrichedConstants
|
|
8
|
+
import com.swmansion.enriched.textinput.EnrichedTextInputView
|
|
9
|
+
import com.swmansion.enriched.textinput.spans.EnrichedInputImageSpan
|
|
10
|
+
import com.swmansion.enriched.textinput.spans.EnrichedInputLinkSpan
|
|
11
|
+
import com.swmansion.enriched.textinput.spans.EnrichedInputMentionSpan
|
|
12
|
+
import com.swmansion.enriched.textinput.spans.EnrichedSpans
|
|
13
|
+
import com.swmansion.enriched.textinput.utils.getSafeSpanBoundaries
|
|
14
|
+
import com.swmansion.enriched.textinput.utils.removeZWS
|
|
15
15
|
|
|
16
16
|
class ParametrizedStyles(
|
|
17
17
|
private val view: EnrichedTextInputView,
|
|
@@ -49,7 +49,7 @@ class ParametrizedStyles(
|
|
|
49
49
|
isSettingLinkSpan = true
|
|
50
50
|
|
|
51
51
|
val spannable = view.text as SpannableStringBuilder
|
|
52
|
-
val spans = spannable.getSpans(start, end,
|
|
52
|
+
val spans = spannable.getSpans(start, end, EnrichedInputLinkSpan::class.java)
|
|
53
53
|
for (span in spans) {
|
|
54
54
|
spannable.removeSpan(span)
|
|
55
55
|
}
|
|
@@ -61,7 +61,7 @@ class ParametrizedStyles(
|
|
|
61
61
|
}
|
|
62
62
|
|
|
63
63
|
val spanEnd = start + text.length
|
|
64
|
-
val span =
|
|
64
|
+
val span = EnrichedInputLinkSpan(url, view.htmlStyle)
|
|
65
65
|
val (safeStart, safeEnd) = spannable.getSafeSpanBoundaries(start, spanEnd)
|
|
66
66
|
spannable.setSpan(span, safeStart, safeEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
|
|
67
67
|
|
|
@@ -86,7 +86,7 @@ class ParametrizedStyles(
|
|
|
86
86
|
val regex = view.linkRegex ?: return
|
|
87
87
|
val contextText = spannable.subSequence(start, end).toString()
|
|
88
88
|
|
|
89
|
-
val spans = spannable.getSpans(start, end,
|
|
89
|
+
val spans = spannable.getSpans(start, end, EnrichedInputLinkSpan::class.java)
|
|
90
90
|
for (span in spans) {
|
|
91
91
|
spannable.removeSpan(span)
|
|
92
92
|
}
|
|
@@ -97,7 +97,7 @@ class ParametrizedStyles(
|
|
|
97
97
|
var wordStart = wordMatch.range.first
|
|
98
98
|
|
|
99
99
|
// Do not include zero-width space in link detection
|
|
100
|
-
if (word.startsWith(
|
|
100
|
+
if (word.startsWith(EnrichedConstants.ZWS_STRING)) {
|
|
101
101
|
word = word.substring(1)
|
|
102
102
|
wordStart += 1
|
|
103
103
|
}
|
|
@@ -111,7 +111,7 @@ class ParametrizedStyles(
|
|
|
111
111
|
val spanStart = start + wordStart + linkStart
|
|
112
112
|
val spanEnd = start + wordStart + linkEnd
|
|
113
113
|
|
|
114
|
-
val span =
|
|
114
|
+
val span = EnrichedInputLinkSpan(matcher.group(), view.htmlStyle)
|
|
115
115
|
val (safeStart, safeEnd) = spannable.getSafeSpanBoundaries(spanStart, spanEnd)
|
|
116
116
|
|
|
117
117
|
spannable.setSpan(
|
|
@@ -209,7 +209,7 @@ class ParametrizedStyles(
|
|
|
209
209
|
val mentionIndicatorRegex = Regex("^($indicatorsPattern)")
|
|
210
210
|
val mentionRegex = Regex("^($indicatorsPattern)\\w*")
|
|
211
211
|
|
|
212
|
-
val spans = spannable.getSpans(currentWord.start, currentWord.end,
|
|
212
|
+
val spans = spannable.getSpans(currentWord.start, currentWord.end, EnrichedInputMentionSpan::class.java)
|
|
213
213
|
for (span in spans) {
|
|
214
214
|
spannable.removeSpan(span)
|
|
215
215
|
}
|
|
@@ -266,7 +266,7 @@ class ParametrizedStyles(
|
|
|
266
266
|
if (start == originalEnd) {
|
|
267
267
|
spannable.insert(start, EnrichedConstants.ORC_STRING)
|
|
268
268
|
} else {
|
|
269
|
-
val spans = spannable.getSpans(start, originalEnd,
|
|
269
|
+
val spans = spannable.getSpans(start, originalEnd, EnrichedInputImageSpan::class.java)
|
|
270
270
|
for (s in spans) {
|
|
271
271
|
spannable.removeSpan(s)
|
|
272
272
|
}
|
|
@@ -275,7 +275,7 @@ class ParametrizedStyles(
|
|
|
275
275
|
}
|
|
276
276
|
|
|
277
277
|
val (imageStart, imageEnd) = spannable.getSafeSpanBoundaries(start, start + 1)
|
|
278
|
-
val span =
|
|
278
|
+
val span = EnrichedInputImageSpan.createEnrichedImageSpan(src, width.toInt(), height.toInt())
|
|
279
279
|
span.observeAsyncDrawableLoaded(view.text)
|
|
280
280
|
|
|
281
281
|
spannable.setSpan(span, imageStart, imageEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
|
|
@@ -303,7 +303,7 @@ class ParametrizedStyles(
|
|
|
303
303
|
|
|
304
304
|
val spannable = view.text as SpannableStringBuilder
|
|
305
305
|
val (selectionStart, selectionEnd) = selection.getInlineSelection()
|
|
306
|
-
val spans = spannable.getSpans(selectionStart, selectionEnd,
|
|
306
|
+
val spans = spannable.getSpans(selectionStart, selectionEnd, EnrichedInputMentionSpan::class.java)
|
|
307
307
|
|
|
308
308
|
for (span in spans) {
|
|
309
309
|
spannable.removeSpan(span)
|
|
@@ -314,7 +314,7 @@ class ParametrizedStyles(
|
|
|
314
314
|
view.runAsATransaction {
|
|
315
315
|
spannable.replace(start, selectionEnd, text)
|
|
316
316
|
|
|
317
|
-
val span =
|
|
317
|
+
val span = EnrichedInputMentionSpan(text, indicator, attributes, view.htmlStyle)
|
|
318
318
|
val spanEnd = start + text.length
|
|
319
319
|
val (safeStart, safeEnd) = spannable.getSafeSpanBoundaries(start, spanEnd)
|
|
320
320
|
spannable.setSpan(span, safeStart, safeEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
package com.swmansion.enriched.utils
|
|
1
|
+
package com.swmansion.enriched.textinput.utils
|
|
2
2
|
|
|
3
3
|
import android.text.Editable
|
|
4
4
|
import android.text.Spannable
|
|
5
5
|
import android.text.SpannableStringBuilder
|
|
6
|
-
import com.swmansion.enriched.watchers.EnrichedSpanWatcher
|
|
6
|
+
import com.swmansion.enriched.textinput.watchers.EnrichedSpanWatcher
|
|
7
7
|
|
|
8
8
|
class EnrichedEditableFactory(
|
|
9
9
|
private val watcher: EnrichedSpanWatcher,
|
package/android/src/main/java/com/swmansion/enriched/{utils → textinput/utils}/EnrichedSelection.kt
RENAMED
|
@@ -1,16 +1,17 @@
|
|
|
1
|
-
package com.swmansion.enriched.utils
|
|
1
|
+
package com.swmansion.enriched.textinput.utils
|
|
2
2
|
|
|
3
3
|
import android.text.Editable
|
|
4
4
|
import android.text.Spannable
|
|
5
5
|
import com.facebook.react.bridge.ReactContext
|
|
6
6
|
import com.facebook.react.uimanager.UIManagerHelper
|
|
7
|
-
import com.swmansion.enriched.
|
|
8
|
-
import com.swmansion.enriched.
|
|
9
|
-
import com.swmansion.enriched.events.
|
|
10
|
-
import com.swmansion.enriched.events.
|
|
11
|
-
import com.swmansion.enriched.
|
|
12
|
-
import com.swmansion.enriched.spans.
|
|
13
|
-
import com.swmansion.enriched.spans.
|
|
7
|
+
import com.swmansion.enriched.common.EnrichedConstants
|
|
8
|
+
import com.swmansion.enriched.textinput.EnrichedTextInputView
|
|
9
|
+
import com.swmansion.enriched.textinput.events.OnChangeSelectionEvent
|
|
10
|
+
import com.swmansion.enriched.textinput.events.OnLinkDetectedEvent
|
|
11
|
+
import com.swmansion.enriched.textinput.events.OnMentionDetectedEvent
|
|
12
|
+
import com.swmansion.enriched.textinput.spans.EnrichedInputLinkSpan
|
|
13
|
+
import com.swmansion.enriched.textinput.spans.EnrichedInputMentionSpan
|
|
14
|
+
import com.swmansion.enriched.textinput.spans.EnrichedSpans
|
|
14
15
|
import org.json.JSONObject
|
|
15
16
|
|
|
16
17
|
class EnrichedSelection(
|
|
@@ -190,8 +191,8 @@ class EnrichedSelection(
|
|
|
190
191
|
val (start, end) = getInlineSelection()
|
|
191
192
|
val spannable = view.text as Spannable
|
|
192
193
|
val spans = spannable.getSpans(start, end, type)
|
|
193
|
-
val isLinkType = type ==
|
|
194
|
-
val isMentionType = type ==
|
|
194
|
+
val isLinkType = type == EnrichedInputLinkSpan::class.java
|
|
195
|
+
val isMentionType = type == EnrichedInputMentionSpan::class.java
|
|
195
196
|
|
|
196
197
|
if (isLinkType && spans.isEmpty()) {
|
|
197
198
|
emitLinkDetectedEvent(spannable, null, start, end)
|
|
@@ -208,9 +209,9 @@ class EnrichedSelection(
|
|
|
208
209
|
val spanEnd = spannable.getSpanEnd(span)
|
|
209
210
|
|
|
210
211
|
if (start >= spanStart && end <= spanEnd) {
|
|
211
|
-
if (isLinkType && span is
|
|
212
|
+
if (isLinkType && span is EnrichedInputLinkSpan) {
|
|
212
213
|
emitLinkDetectedEvent(spannable, span, spanStart, spanEnd)
|
|
213
|
-
} else if (isMentionType && span is
|
|
214
|
+
} else if (isMentionType && span is EnrichedInputMentionSpan) {
|
|
214
215
|
emitMentionDetectedEvent(spannable, span, spanStart, spanEnd)
|
|
215
216
|
}
|
|
216
217
|
|
|
@@ -247,7 +248,7 @@ class EnrichedSelection(
|
|
|
247
248
|
|
|
248
249
|
private fun emitLinkDetectedEvent(
|
|
249
250
|
spannable: Spannable,
|
|
250
|
-
span:
|
|
251
|
+
span: EnrichedInputLinkSpan?,
|
|
251
252
|
start: Int,
|
|
252
253
|
end: Int,
|
|
253
254
|
) {
|
|
@@ -278,7 +279,7 @@ class EnrichedSelection(
|
|
|
278
279
|
|
|
279
280
|
private fun emitMentionDetectedEvent(
|
|
280
281
|
spannable: Spannable,
|
|
281
|
-
span:
|
|
282
|
+
span: EnrichedInputMentionSpan?,
|
|
282
283
|
start: Int,
|
|
283
284
|
end: Int,
|
|
284
285
|
) {
|