react-native-enriched 0.2.1 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +21 -16
- package/android/build.gradle +77 -72
- package/android/generated/java/com/facebook/react/viewmanagers/EnrichedTextInputViewManagerDelegate.java +21 -0
- package/android/generated/java/com/facebook/react/viewmanagers/EnrichedTextInputViewManagerInterface.java +7 -0
- package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ComponentDescriptors.cpp +1 -1
- package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ComponentDescriptors.h +1 -1
- package/android/generated/jni/react/renderer/components/ReactNativeEnrichedSpec/EventEmitters.cpp +276 -0
- package/android/generated/jni/react/renderer/components/ReactNativeEnrichedSpec/EventEmitters.h +239 -0
- package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/Props.cpp +10 -0
- package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/Props.h +251 -0
- package/android/gradle.properties +5 -5
- package/android/lint.gradle +70 -0
- package/android/src/main/java/com/swmansion/enriched/{EnrichedTextInputViewPackage.kt → ReactNativeEnrichedPackage.kt} +4 -5
- package/android/src/main/java/com/swmansion/enriched/{utils → common}/AsyncDrawable.kt +50 -15
- package/android/src/main/java/com/swmansion/enriched/common/CheckboxDrawable.kt +81 -0
- package/android/src/main/java/com/swmansion/enriched/common/EnrichedConstants.kt +11 -0
- package/android/src/main/java/com/swmansion/enriched/common/EnrichedStyle.kt +57 -0
- package/android/src/main/java/com/swmansion/enriched/{spans/utils → common}/ForceRedrawSpan.kt +3 -2
- package/android/src/main/java/com/swmansion/enriched/common/MentionStyle.kt +7 -0
- package/android/src/main/java/com/swmansion/enriched/{utils → common}/ResourceManager.kt +1 -1
- package/android/src/main/java/com/swmansion/enriched/{utils → common/parser}/EnrichedParser.java +228 -160
- package/android/src/main/java/com/swmansion/enriched/common/parser/EnrichedSpanFactory.kt +79 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedBlockQuoteSpan.kt +53 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedBoldSpan.kt +12 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedCheckboxListSpan.kt +91 -0
- package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/EnrichedCodeBlockSpan.kt +12 -14
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH1Span.kt +20 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH2Span.kt +20 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH3Span.kt +20 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH4Span.kt +21 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH5Span.kt +20 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH6Span.kt +20 -0
- package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/EnrichedImageSpan.kt +68 -51
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedInlineCodeSpan.kt +24 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedItalicSpan.kt +12 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedLinkSpan.kt +26 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedMentionSpan.kt +35 -0
- package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/EnrichedOrderedListSpan.kt +21 -29
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedStrikeThroughSpan.kt +11 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedUnderlineSpan.kt +11 -0
- package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/EnrichedUnorderedListSpan.kt +13 -17
- package/android/src/main/java/com/swmansion/enriched/common/spans/interfaces/EnrichedBlockSpan.kt +5 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/interfaces/EnrichedHeadingSpan.kt +3 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/interfaces/EnrichedInlineSpan.kt +3 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/interfaces/EnrichedParagraphSpan.kt +5 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/interfaces/EnrichedSpan.kt +3 -0
- package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/interfaces/EnrichedZeroWidthSpaceSpan.kt +2 -3
- package/android/src/main/java/com/swmansion/enriched/textinput/EnrichedTextInputConnectionWrapper.kt +140 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/EnrichedTextInputSpannableFactory.kt +83 -0
- package/android/src/main/java/com/swmansion/enriched/{EnrichedTextInputView.kt → textinput/EnrichedTextInputView.kt} +322 -157
- package/android/src/main/java/com/swmansion/enriched/{EnrichedTextInputViewLayoutManager.kt → textinput/EnrichedTextInputViewLayoutManager.kt} +4 -2
- package/android/src/main/java/com/swmansion/enriched/{EnrichedTextInputViewManager.kt → textinput/EnrichedTextInputViewManager.kt} +182 -66
- package/android/src/main/java/com/swmansion/enriched/{MeasurementStore.kt → textinput/MeasurementStore.kt} +75 -25
- package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/MentionHandler.kt +22 -12
- package/android/src/main/java/com/swmansion/enriched/textinput/events/OnChangeHtmlEvent.kt +27 -0
- package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnChangeSelectionEvent.kt +11 -10
- package/android/src/main/java/com/swmansion/enriched/textinput/events/OnChangeStateEvent.kt +21 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/events/OnChangeTextEvent.kt +30 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/events/OnInputBlurEvent.kt +25 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/events/OnInputFocusEvent.kt +25 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/events/OnInputKeyPressEvent.kt +27 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/events/OnLinkDetectedEvent.kt +32 -0
- package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnMentionDetectedEvent.kt +11 -10
- package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnMentionEvent.kt +10 -9
- package/android/src/main/java/com/swmansion/enriched/textinput/events/OnPasteImagesEvent.kt +47 -0
- package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnRequestHtmlResultEvent.kt +2 -3
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputBlockQuoteSpan.kt +14 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputBoldSpan.kt +14 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputCheckboxListSpan.kt +15 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputCodeBlockSpan.kt +14 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH1Span.kt +14 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH2Span.kt +14 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH3Span.kt +14 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH4Span.kt +14 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH5Span.kt +14 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH6Span.kt +14 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputImageSpan.kt +36 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputInlineCodeSpan.kt +14 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputItalicSpan.kt +14 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputLinkSpan.kt +15 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputMentionSpan.kt +18 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputOrderedListSpan.kt +21 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputStrikeThroughSpan.kt +14 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputUnderlineSpan.kt +14 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputUnorderedListSpan.kt +14 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedSpans.kt +241 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/interfaces/EnrichedInputSpan.kt +10 -0
- package/android/src/main/java/com/swmansion/enriched/{styles → textinput/styles}/HtmlStyle.kt +129 -57
- package/android/src/main/java/com/swmansion/enriched/{styles → textinput/styles}/InlineStyles.kt +30 -13
- package/android/src/main/java/com/swmansion/enriched/textinput/styles/ListStyles.kt +263 -0
- package/android/src/main/java/com/swmansion/enriched/{styles → textinput/styles}/ParagraphStyles.kt +94 -34
- package/android/src/main/java/com/swmansion/enriched/{styles → textinput/styles}/ParametrizedStyles.kt +143 -67
- package/android/src/main/java/com/swmansion/enriched/textinput/utils/EnrichedEditableFactory.kt +17 -0
- package/android/src/main/java/com/swmansion/enriched/{utils → textinput/utils}/EnrichedSelection.kt +84 -54
- package/android/src/main/java/com/swmansion/enriched/textinput/utils/EnrichedSpanState.kt +304 -0
- package/android/src/main/java/com/swmansion/enriched/{utils/Utils.kt → textinput/utils/EnrichedSpannable.kt} +22 -31
- package/android/src/main/java/com/swmansion/enriched/textinput/utils/EnrichedSpannableStringBuilder.kt +16 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/utils/RichContentReceiver.kt +127 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/utils/Utils.kt +106 -0
- package/android/src/main/java/com/swmansion/enriched/{watchers → textinput/watchers}/EnrichedSpanWatcher.kt +56 -24
- package/android/src/main/java/com/swmansion/enriched/{watchers → textinput/watchers}/EnrichedTextWatcher.kt +37 -14
- package/android/src/main/new_arch/CMakeLists.txt +7 -1
- package/android/src/main/new_arch/ReactNativeEnrichedSpec.cpp +11 -0
- package/android/src/main/new_arch/ReactNativeEnrichedSpec.h +15 -0
- package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/EnrichedTextInputMeasurementManager.h +1 -1
- package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/EnrichedTextInputShadowNode.h +2 -2
- package/android/src/main/new_arch/react/renderer/components/ReactNativeEnrichedSpec/conversions.h +46 -0
- package/ios/EnrichedTextInputView.h +2 -1
- package/ios/EnrichedTextInputView.mm +603 -60
- package/ios/config/InputConfig.h +28 -0
- package/ios/config/InputConfig.mm +237 -8
- package/ios/extensions/ImageExtension.h +35 -0
- package/ios/extensions/ImageExtension.mm +156 -0
- package/ios/{utils → extensions}/LayoutManagerExtension.mm +115 -95
- package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ComponentDescriptors.cpp +1 -1
- package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ComponentDescriptors.h +1 -1
- package/ios/generated/ReactNativeEnrichedSpec/EventEmitters.cpp +276 -0
- package/ios/generated/ReactNativeEnrichedSpec/EventEmitters.h +239 -0
- package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/Props.cpp +10 -0
- package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/Props.h +251 -0
- package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/RCTComponentViewHelpers.h +95 -0
- package/ios/inputParser/InputParser.mm +218 -18
- package/ios/inputTextView/InputTextView.mm +118 -0
- package/ios/{attachments → interfaces}/ImageAttachment.h +1 -0
- package/ios/interfaces/ImageAttachment.mm +46 -0
- package/ios/interfaces/LinkRegexConfig.h +19 -0
- package/ios/interfaces/LinkRegexConfig.mm +37 -0
- package/ios/{utils → interfaces}/MentionStyleProps.mm +2 -2
- package/ios/{utils → interfaces}/StyleHeaders.h +22 -1
- package/ios/{utils → interfaces}/StyleTypeEnum.h +4 -0
- package/ios/internals/EnrichedTextInputViewState.cpp +6 -6
- package/ios/styles/BlockQuoteStyle.mm +5 -5
- package/ios/styles/BoldStyle.mm +21 -6
- package/ios/styles/CheckboxListStyle.mm +321 -0
- package/ios/styles/CodeBlockStyle.mm +5 -5
- package/ios/styles/H1Style.mm +3 -0
- package/ios/styles/H2Style.mm +3 -0
- package/ios/styles/H3Style.mm +3 -0
- package/ios/styles/H4Style.mm +20 -0
- package/ios/styles/H5Style.mm +20 -0
- package/ios/styles/H6Style.mm +20 -0
- package/ios/styles/HeadingStyleBase.mm +161 -72
- package/ios/styles/ImageStyle.mm +5 -5
- package/ios/styles/InlineCodeStyle.mm +30 -19
- package/ios/styles/ItalicStyle.mm +5 -5
- package/ios/styles/LinkStyle.mm +98 -40
- package/ios/styles/MentionStyle.mm +4 -4
- package/ios/styles/OrderedListStyle.mm +5 -5
- package/ios/styles/StrikethroughStyle.mm +5 -5
- package/ios/styles/UnderlineStyle.mm +5 -5
- package/ios/styles/UnorderedListStyle.mm +5 -5
- package/ios/utils/CheckboxHitTestUtils.h +10 -0
- package/ios/utils/CheckboxHitTestUtils.mm +123 -0
- package/ios/utils/ParagraphAttributesUtils.h +4 -0
- package/ios/utils/ParagraphAttributesUtils.mm +142 -45
- package/ios/utils/ParagraphsUtils.mm +4 -4
- package/ios/utils/TextBlockTapGestureRecognizer.h +17 -0
- package/ios/utils/TextBlockTapGestureRecognizer.mm +56 -0
- package/ios/utils/ZeroWidthSpaceUtils.mm +14 -3
- package/lib/module/EnrichedTextInput.js +57 -11
- package/lib/module/EnrichedTextInput.js.map +1 -1
- package/lib/module/{EnrichedTextInputNativeComponent.ts → spec/EnrichedTextInputNativeComponent.ts} +175 -18
- package/lib/module/types.js +4 -0
- package/lib/module/types.js.map +1 -0
- package/lib/module/{normalizeHtmlStyle.js → utils/normalizeHtmlStyle.js} +18 -0
- package/lib/module/utils/normalizeHtmlStyle.js.map +1 -0
- package/lib/module/utils/nullthrows.js +9 -0
- package/lib/module/utils/nullthrows.js.map +1 -0
- package/lib/module/utils/regexParser.js +46 -0
- package/lib/module/utils/regexParser.js.map +1 -0
- package/lib/typescript/src/EnrichedTextInput.d.ts +20 -51
- package/lib/typescript/src/EnrichedTextInput.d.ts.map +1 -1
- package/lib/typescript/src/index.d.ts +2 -1
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/lib/typescript/src/{EnrichedTextInputNativeComponent.d.ts → spec/EnrichedTextInputNativeComponent.d.ts} +154 -18
- package/lib/typescript/src/spec/EnrichedTextInputNativeComponent.d.ts.map +1 -0
- package/lib/typescript/src/types.d.ts +58 -0
- package/lib/typescript/src/types.d.ts.map +1 -0
- package/lib/typescript/src/utils/normalizeHtmlStyle.d.ts +4 -0
- package/lib/typescript/src/utils/normalizeHtmlStyle.d.ts.map +1 -0
- package/lib/typescript/src/utils/nullthrows.d.ts +2 -0
- package/lib/typescript/src/utils/nullthrows.d.ts.map +1 -0
- package/lib/typescript/src/utils/regexParser.d.ts +3 -0
- package/lib/typescript/src/utils/regexParser.d.ts.map +1 -0
- package/package.json +13 -9
- package/src/EnrichedTextInput.tsx +88 -63
- package/src/index.tsx +5 -1
- package/src/{EnrichedTextInputNativeComponent.ts → spec/EnrichedTextInputNativeComponent.ts} +175 -18
- package/src/types.ts +59 -0
- package/src/{normalizeHtmlStyle.ts → utils/normalizeHtmlStyle.ts} +20 -5
- package/src/utils/nullthrows.ts +7 -0
- package/src/utils/regexParser.ts +56 -0
- package/android/generated/jni/react/renderer/components/RNEnrichedTextInputViewSpec/EventEmitters.cpp +0 -128
- package/android/generated/jni/react/renderer/components/RNEnrichedTextInputViewSpec/EventEmitters.h +0 -102
- package/android/src/main/java/com/swmansion/enriched/events/OnChangeHtmlEvent.kt +0 -28
- package/android/src/main/java/com/swmansion/enriched/events/OnChangeStateEvent.kt +0 -24
- package/android/src/main/java/com/swmansion/enriched/events/OnChangeTextEvent.kt +0 -30
- package/android/src/main/java/com/swmansion/enriched/events/OnInputBlurEvent.kt +0 -27
- package/android/src/main/java/com/swmansion/enriched/events/OnInputFocusEvent.kt +0 -27
- package/android/src/main/java/com/swmansion/enriched/events/OnLinkDetectedEvent.kt +0 -30
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedBlockQuoteSpan.kt +0 -44
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedBoldSpan.kt +0 -16
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedH1Span.kt +0 -23
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedH2Span.kt +0 -23
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedH3Span.kt +0 -23
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedInlineCodeSpan.kt +0 -27
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedItalicSpan.kt +0 -15
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedLinkSpan.kt +0 -30
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedMentionSpan.kt +0 -42
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedSpans.kt +0 -136
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedStrikeThroughSpan.kt +0 -14
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedUnderlineSpan.kt +0 -14
- package/android/src/main/java/com/swmansion/enriched/spans/interfaces/EnrichedBlockSpan.kt +0 -4
- package/android/src/main/java/com/swmansion/enriched/spans/interfaces/EnrichedHeadingSpan.kt +0 -4
- package/android/src/main/java/com/swmansion/enriched/spans/interfaces/EnrichedInlineSpan.kt +0 -4
- package/android/src/main/java/com/swmansion/enriched/spans/interfaces/EnrichedParagraphSpan.kt +0 -4
- package/android/src/main/java/com/swmansion/enriched/spans/interfaces/EnrichedSpan.kt +0 -8
- package/android/src/main/java/com/swmansion/enriched/styles/ListStyles.kt +0 -172
- package/android/src/main/java/com/swmansion/enriched/utils/EnrichedSpanState.kt +0 -204
- package/android/src/main/new_arch/RNEnrichedTextInputViewSpec.cpp +0 -22
- package/android/src/main/new_arch/RNEnrichedTextInputViewSpec.h +0 -26
- package/android/src/main/new_arch/react/renderer/components/RNEnrichedTextInputViewSpec/conversions.h +0 -26
- package/ios/attachments/ImageAttachment.mm +0 -34
- package/ios/generated/RNEnrichedTextInputViewSpec/EventEmitters.cpp +0 -128
- package/ios/generated/RNEnrichedTextInputViewSpec/EventEmitters.h +0 -102
- package/lib/module/normalizeHtmlStyle.js.map +0 -1
- package/lib/typescript/src/EnrichedTextInputNativeComponent.d.ts.map +0 -1
- package/lib/typescript/src/normalizeHtmlStyle.d.ts +0 -4
- package/lib/typescript/src/normalizeHtmlStyle.d.ts.map +0 -1
- /package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ShadowNodes.cpp +0 -0
- /package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ShadowNodes.h +0 -0
- /package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/States.cpp +0 -0
- /package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/States.h +0 -0
- /package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/EnrichedTextInputComponentDescriptor.h +0 -0
- /package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/EnrichedTextInputMeasurementManager.cpp +0 -0
- /package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/EnrichedTextInputShadowNode.cpp +0 -0
- /package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/EnrichedTextInputState.cpp +0 -0
- /package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/EnrichedTextInputState.h +0 -0
- /package/ios/{utils → extensions}/ColorExtension.h +0 -0
- /package/ios/{utils → extensions}/ColorExtension.mm +0 -0
- /package/ios/{utils → extensions}/FontExtension.h +0 -0
- /package/ios/{utils → extensions}/FontExtension.mm +0 -0
- /package/ios/{utils → extensions}/LayoutManagerExtension.h +0 -0
- /package/ios/{utils → extensions}/StringExtension.h +0 -0
- /package/ios/{utils → extensions}/StringExtension.mm +0 -0
- /package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ShadowNodes.cpp +0 -0
- /package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ShadowNodes.h +0 -0
- /package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/States.cpp +0 -0
- /package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/States.h +0 -0
- /package/ios/{utils → interfaces}/BaseStyleProtocol.h +0 -0
- /package/ios/{utils → interfaces}/ImageData.h +0 -0
- /package/ios/{utils → interfaces}/ImageData.mm +0 -0
- /package/ios/{utils → interfaces}/LinkData.h +0 -0
- /package/ios/{utils → interfaces}/LinkData.mm +0 -0
- /package/ios/{attachments → interfaces}/MediaAttachment.h +0 -0
- /package/ios/{attachments → interfaces}/MediaAttachment.mm +0 -0
- /package/ios/{utils → interfaces}/MentionParams.h +0 -0
- /package/ios/{utils → interfaces}/MentionParams.mm +0 -0
- /package/ios/{utils → interfaces}/MentionStyleProps.h +0 -0
- /package/ios/{utils → interfaces}/StylePair.h +0 -0
- /package/ios/{utils → interfaces}/StylePair.mm +0 -0
- /package/ios/{utils → interfaces}/TextDecorationLineEnum.h +0 -0
- /package/ios/{utils → interfaces}/TextDecorationLineEnum.mm +0 -0
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
package com.swmansion.enriched.textinput.spans
|
|
2
|
+
|
|
3
|
+
import com.swmansion.enriched.common.spans.EnrichedUnorderedListSpan
|
|
4
|
+
import com.swmansion.enriched.textinput.spans.interfaces.EnrichedInputSpan
|
|
5
|
+
import com.swmansion.enriched.textinput.styles.HtmlStyle
|
|
6
|
+
|
|
7
|
+
class EnrichedInputUnorderedListSpan(
|
|
8
|
+
htmlStyle: HtmlStyle,
|
|
9
|
+
) : EnrichedUnorderedListSpan(htmlStyle),
|
|
10
|
+
EnrichedInputSpan {
|
|
11
|
+
override val dependsOnHtmlStyle: Boolean = true
|
|
12
|
+
|
|
13
|
+
override fun rebuildWithStyle(htmlStyle: HtmlStyle): EnrichedInputUnorderedListSpan = EnrichedInputUnorderedListSpan(htmlStyle)
|
|
14
|
+
}
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
package com.swmansion.enriched.textinput.spans
|
|
2
|
+
|
|
3
|
+
import com.swmansion.enriched.textinput.styles.HtmlStyle
|
|
4
|
+
|
|
5
|
+
interface ISpanConfig {
|
|
6
|
+
val clazz: Class<*>
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
data class BaseSpanConfig(
|
|
10
|
+
override val clazz: Class<*>,
|
|
11
|
+
) : ISpanConfig
|
|
12
|
+
|
|
13
|
+
data class ParagraphSpanConfig(
|
|
14
|
+
override val clazz: Class<*>,
|
|
15
|
+
val isContinuous: Boolean,
|
|
16
|
+
) : ISpanConfig
|
|
17
|
+
|
|
18
|
+
data class ListSpanConfig(
|
|
19
|
+
override val clazz: Class<*>,
|
|
20
|
+
val shortcut: String?,
|
|
21
|
+
) : ISpanConfig
|
|
22
|
+
|
|
23
|
+
data class StylesMergingConfig(
|
|
24
|
+
// styles that should be removed when we apply specific style
|
|
25
|
+
val conflictingStyles: Array<String> = emptyArray(),
|
|
26
|
+
// styles that should block setting specific style
|
|
27
|
+
val blockingStyles: Array<String> = emptyArray(),
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
object EnrichedSpans {
|
|
31
|
+
// inline styles
|
|
32
|
+
const val BOLD = "bold"
|
|
33
|
+
const val ITALIC = "italic"
|
|
34
|
+
const val UNDERLINE = "underline"
|
|
35
|
+
const val STRIKETHROUGH = "strikethrough"
|
|
36
|
+
const val INLINE_CODE = "inline_code"
|
|
37
|
+
|
|
38
|
+
// paragraph styles
|
|
39
|
+
const val H1 = "h1"
|
|
40
|
+
const val H2 = "h2"
|
|
41
|
+
const val H3 = "h3"
|
|
42
|
+
const val H4 = "h4"
|
|
43
|
+
const val H5 = "h5"
|
|
44
|
+
const val H6 = "h6"
|
|
45
|
+
const val BLOCK_QUOTE = "block_quote"
|
|
46
|
+
const val CODE_BLOCK = "code_block"
|
|
47
|
+
|
|
48
|
+
// list styles
|
|
49
|
+
const val UNORDERED_LIST = "unordered_list"
|
|
50
|
+
const val ORDERED_LIST = "ordered_list"
|
|
51
|
+
const val CHECKBOX_LIST = "checkbox_list"
|
|
52
|
+
|
|
53
|
+
// parametrized styles
|
|
54
|
+
const val LINK = "link"
|
|
55
|
+
const val IMAGE = "image"
|
|
56
|
+
const val MENTION = "mention"
|
|
57
|
+
|
|
58
|
+
val inlineSpans: Map<String, BaseSpanConfig> =
|
|
59
|
+
mapOf(
|
|
60
|
+
BOLD to BaseSpanConfig(EnrichedInputBoldSpan::class.java),
|
|
61
|
+
ITALIC to BaseSpanConfig(EnrichedInputItalicSpan::class.java),
|
|
62
|
+
UNDERLINE to BaseSpanConfig(EnrichedInputUnderlineSpan::class.java),
|
|
63
|
+
STRIKETHROUGH to BaseSpanConfig(EnrichedInputStrikeThroughSpan::class.java),
|
|
64
|
+
INLINE_CODE to BaseSpanConfig(EnrichedInputInlineCodeSpan::class.java),
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
val paragraphSpans: Map<String, ParagraphSpanConfig> =
|
|
68
|
+
mapOf(
|
|
69
|
+
H1 to ParagraphSpanConfig(EnrichedInputH1Span::class.java, false),
|
|
70
|
+
H2 to ParagraphSpanConfig(EnrichedInputH2Span::class.java, false),
|
|
71
|
+
H3 to ParagraphSpanConfig(EnrichedInputH3Span::class.java, false),
|
|
72
|
+
H4 to ParagraphSpanConfig(EnrichedInputH4Span::class.java, false),
|
|
73
|
+
H5 to ParagraphSpanConfig(EnrichedInputH5Span::class.java, false),
|
|
74
|
+
H6 to ParagraphSpanConfig(EnrichedInputH6Span::class.java, false),
|
|
75
|
+
BLOCK_QUOTE to ParagraphSpanConfig(EnrichedInputBlockQuoteSpan::class.java, true),
|
|
76
|
+
CODE_BLOCK to ParagraphSpanConfig(EnrichedInputCodeBlockSpan::class.java, true),
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
val listSpans: Map<String, ListSpanConfig> =
|
|
80
|
+
mapOf(
|
|
81
|
+
UNORDERED_LIST to ListSpanConfig(EnrichedInputUnorderedListSpan::class.java, "- "),
|
|
82
|
+
ORDERED_LIST to ListSpanConfig(EnrichedInputOrderedListSpan::class.java, "1. "),
|
|
83
|
+
CHECKBOX_LIST to ListSpanConfig(EnrichedInputCheckboxListSpan::class.java, null),
|
|
84
|
+
)
|
|
85
|
+
|
|
86
|
+
val parametrizedStyles: Map<String, BaseSpanConfig> =
|
|
87
|
+
mapOf(
|
|
88
|
+
LINK to BaseSpanConfig(EnrichedInputLinkSpan::class.java),
|
|
89
|
+
IMAGE to BaseSpanConfig(EnrichedInputImageSpan::class.java),
|
|
90
|
+
MENTION to BaseSpanConfig(EnrichedInputMentionSpan::class.java),
|
|
91
|
+
)
|
|
92
|
+
|
|
93
|
+
val allSpans: Map<String, ISpanConfig> = inlineSpans + paragraphSpans + listSpans + parametrizedStyles
|
|
94
|
+
|
|
95
|
+
fun getMergingConfigForStyle(
|
|
96
|
+
style: String,
|
|
97
|
+
htmlStyle: HtmlStyle,
|
|
98
|
+
): StylesMergingConfig? =
|
|
99
|
+
when (style) {
|
|
100
|
+
BOLD -> {
|
|
101
|
+
val blockingStyles = mutableListOf(CODE_BLOCK)
|
|
102
|
+
if (htmlStyle.h1Bold) blockingStyles.add(H1)
|
|
103
|
+
if (htmlStyle.h2Bold) blockingStyles.add(H2)
|
|
104
|
+
if (htmlStyle.h3Bold) blockingStyles.add(H3)
|
|
105
|
+
if (htmlStyle.h4Bold) blockingStyles.add(H4)
|
|
106
|
+
if (htmlStyle.h5Bold) blockingStyles.add(H5)
|
|
107
|
+
if (htmlStyle.h6Bold) blockingStyles.add(H6)
|
|
108
|
+
StylesMergingConfig(blockingStyles = blockingStyles.toTypedArray())
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
ITALIC -> {
|
|
112
|
+
StylesMergingConfig(
|
|
113
|
+
blockingStyles = arrayOf(CODE_BLOCK),
|
|
114
|
+
)
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
UNDERLINE -> {
|
|
118
|
+
StylesMergingConfig(
|
|
119
|
+
blockingStyles = arrayOf(CODE_BLOCK),
|
|
120
|
+
)
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
STRIKETHROUGH -> {
|
|
124
|
+
StylesMergingConfig(
|
|
125
|
+
blockingStyles = arrayOf(CODE_BLOCK),
|
|
126
|
+
)
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
INLINE_CODE -> {
|
|
130
|
+
StylesMergingConfig(
|
|
131
|
+
conflictingStyles = arrayOf(MENTION, LINK),
|
|
132
|
+
blockingStyles = arrayOf(CODE_BLOCK),
|
|
133
|
+
)
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
H1 -> {
|
|
137
|
+
val conflictingStyles = mutableListOf(H2, H3, H4, H5, H6, ORDERED_LIST, UNORDERED_LIST, CHECKBOX_LIST, BLOCK_QUOTE, CODE_BLOCK)
|
|
138
|
+
if (htmlStyle.h1Bold) conflictingStyles.add(BOLD)
|
|
139
|
+
StylesMergingConfig(conflictingStyles = conflictingStyles.toTypedArray())
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
H2 -> {
|
|
143
|
+
val conflictingStyles = mutableListOf(H1, H3, H4, H5, H6, ORDERED_LIST, UNORDERED_LIST, CHECKBOX_LIST, BLOCK_QUOTE, CODE_BLOCK)
|
|
144
|
+
if (htmlStyle.h2Bold) conflictingStyles.add(BOLD)
|
|
145
|
+
StylesMergingConfig(conflictingStyles = conflictingStyles.toTypedArray())
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
H3 -> {
|
|
149
|
+
val conflictingStyles = mutableListOf(H1, H2, H4, H5, H6, ORDERED_LIST, UNORDERED_LIST, CHECKBOX_LIST, BLOCK_QUOTE, CODE_BLOCK)
|
|
150
|
+
if (htmlStyle.h3Bold) conflictingStyles.add(BOLD)
|
|
151
|
+
StylesMergingConfig(conflictingStyles = conflictingStyles.toTypedArray())
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
H4 -> {
|
|
155
|
+
val conflictingStyles = mutableListOf(H1, H2, H3, H5, H6, ORDERED_LIST, UNORDERED_LIST, CHECKBOX_LIST, BLOCK_QUOTE, CODE_BLOCK)
|
|
156
|
+
if (htmlStyle.h4Bold) conflictingStyles.add(BOLD)
|
|
157
|
+
StylesMergingConfig(conflictingStyles = conflictingStyles.toTypedArray())
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
H5 -> {
|
|
161
|
+
val conflictingStyles = mutableListOf(H1, H2, H3, H4, H6, ORDERED_LIST, UNORDERED_LIST, CHECKBOX_LIST, BLOCK_QUOTE, CODE_BLOCK)
|
|
162
|
+
if (htmlStyle.h5Bold) conflictingStyles.add(BOLD)
|
|
163
|
+
StylesMergingConfig(conflictingStyles = conflictingStyles.toTypedArray())
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
H6 -> {
|
|
167
|
+
val conflictingStyles = mutableListOf(H1, H2, H3, H4, H5, ORDERED_LIST, UNORDERED_LIST, CHECKBOX_LIST, BLOCK_QUOTE, CODE_BLOCK)
|
|
168
|
+
if (htmlStyle.h6Bold) conflictingStyles.add(BOLD)
|
|
169
|
+
StylesMergingConfig(conflictingStyles = conflictingStyles.toTypedArray())
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
BLOCK_QUOTE -> {
|
|
173
|
+
StylesMergingConfig(
|
|
174
|
+
conflictingStyles = arrayOf(H1, H2, H3, H4, H5, H6, CODE_BLOCK, ORDERED_LIST, UNORDERED_LIST, CHECKBOX_LIST),
|
|
175
|
+
)
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
CODE_BLOCK -> {
|
|
179
|
+
StylesMergingConfig(
|
|
180
|
+
conflictingStyles =
|
|
181
|
+
arrayOf(
|
|
182
|
+
H1,
|
|
183
|
+
H2,
|
|
184
|
+
H3,
|
|
185
|
+
H4,
|
|
186
|
+
H5,
|
|
187
|
+
H6,
|
|
188
|
+
BOLD,
|
|
189
|
+
ITALIC,
|
|
190
|
+
UNDERLINE,
|
|
191
|
+
STRIKETHROUGH,
|
|
192
|
+
UNORDERED_LIST,
|
|
193
|
+
ORDERED_LIST,
|
|
194
|
+
CHECKBOX_LIST,
|
|
195
|
+
BLOCK_QUOTE,
|
|
196
|
+
INLINE_CODE,
|
|
197
|
+
),
|
|
198
|
+
)
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
UNORDERED_LIST -> {
|
|
202
|
+
StylesMergingConfig(
|
|
203
|
+
conflictingStyles = arrayOf(H1, H2, H3, H4, H5, H6, ORDERED_LIST, CHECKBOX_LIST, CODE_BLOCK, BLOCK_QUOTE),
|
|
204
|
+
)
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
ORDERED_LIST -> {
|
|
208
|
+
StylesMergingConfig(
|
|
209
|
+
conflictingStyles = arrayOf(H1, H2, H3, H4, H5, H6, UNORDERED_LIST, CHECKBOX_LIST, CODE_BLOCK, BLOCK_QUOTE),
|
|
210
|
+
)
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
CHECKBOX_LIST -> {
|
|
214
|
+
StylesMergingConfig(
|
|
215
|
+
conflictingStyles = arrayOf(H1, H2, H3, H4, H5, H6, UNORDERED_LIST, ORDERED_LIST, CODE_BLOCK, BLOCK_QUOTE),
|
|
216
|
+
)
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
LINK -> {
|
|
220
|
+
StylesMergingConfig(
|
|
221
|
+
blockingStyles = arrayOf(INLINE_CODE, CODE_BLOCK, MENTION),
|
|
222
|
+
)
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
IMAGE -> {
|
|
226
|
+
StylesMergingConfig()
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
MENTION -> {
|
|
230
|
+
StylesMergingConfig(
|
|
231
|
+
blockingStyles = arrayOf(INLINE_CODE, CODE_BLOCK, LINK),
|
|
232
|
+
)
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
else -> {
|
|
236
|
+
null
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
fun isTypeContinuous(type: Class<*>): Boolean = paragraphSpans.values.find { it.clazz == type }?.isContinuous == true
|
|
241
|
+
}
|
package/android/src/main/java/com/swmansion/enriched/textinput/spans/interfaces/EnrichedInputSpan.kt
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
package com.swmansion.enriched.textinput.spans.interfaces
|
|
2
|
+
|
|
3
|
+
import com.swmansion.enriched.common.spans.interfaces.EnrichedSpan
|
|
4
|
+
import com.swmansion.enriched.textinput.styles.HtmlStyle
|
|
5
|
+
|
|
6
|
+
interface EnrichedInputSpan : EnrichedSpan {
|
|
7
|
+
val dependsOnHtmlStyle: Boolean
|
|
8
|
+
|
|
9
|
+
fun rebuildWithStyle(htmlStyle: HtmlStyle): EnrichedInputSpan
|
|
10
|
+
}
|
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,54 +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
|
|
32
|
-
var
|
|
33
|
-
var blockquoteStripeWidth: Int = 2
|
|
34
|
-
var blockquoteGapWidth: Int = 16
|
|
33
|
+
override var h4FontSize: Int = 48
|
|
34
|
+
override var h4Bold: Boolean = false
|
|
35
35
|
|
|
36
|
-
var
|
|
37
|
-
var
|
|
38
|
-
var olMarkerFontWeight: Int? = null
|
|
39
|
-
var olMarkerColor: Int? = null
|
|
36
|
+
override var h5FontSize: Int = 40
|
|
37
|
+
override var h5Bold: Boolean = false
|
|
40
38
|
|
|
41
|
-
var
|
|
42
|
-
var
|
|
43
|
-
var ulBulletSize: Int = 8
|
|
44
|
-
var ulBulletColor: Int = Color.BLACK
|
|
39
|
+
override var h6FontSize: Int = 32
|
|
40
|
+
override var h6Bold: Boolean = false
|
|
45
41
|
|
|
46
|
-
var
|
|
47
|
-
var
|
|
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
|
|
48
46
|
|
|
49
|
-
var
|
|
50
|
-
var
|
|
51
|
-
var
|
|
47
|
+
override var olGapWidth: Int = 16
|
|
48
|
+
override var olMarginLeft: Int = 24
|
|
49
|
+
override var olMarkerFontWeight: Int? = null
|
|
50
|
+
override var olMarkerColor: Int? = null
|
|
52
51
|
|
|
53
|
-
var
|
|
54
|
-
var
|
|
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
|
|
55
56
|
|
|
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
|
|
61
|
+
|
|
62
|
+
override var aColor: Int = Color.BLACK
|
|
63
|
+
override var aUnderline: Boolean = true
|
|
64
|
+
|
|
65
|
+
override var codeBlockColor: Int = Color.BLACK
|
|
66
|
+
override var codeBlockBackgroundColor: Int = Color.BLACK
|
|
67
|
+
override var codeBlockRadius: Float = 4f
|
|
68
|
+
|
|
69
|
+
override var inlineCodeColor: Int = Color.BLACK
|
|
70
|
+
override var inlineCodeBackgroundColor: Int = Color.BLACK
|
|
71
|
+
|
|
72
|
+
override var mentionsStyle: MutableMap<String, MentionStyle> = mutableMapOf()
|
|
57
73
|
|
|
58
74
|
constructor(view: EnrichedTextInputView?, style: ReadableMap?) {
|
|
59
75
|
this.view = view
|
|
@@ -77,6 +93,18 @@ class HtmlStyle {
|
|
|
77
93
|
h3FontSize = parseFloat(h3Style, "fontSize").toInt()
|
|
78
94
|
h3Bold = h3Style?.getBoolean("bold") == true
|
|
79
95
|
|
|
96
|
+
val h4Style = style.getMap("h4")
|
|
97
|
+
h4FontSize = parseFloat(h4Style, "fontSize").toInt()
|
|
98
|
+
h4Bold = h4Style?.getBoolean("bold") == true
|
|
99
|
+
|
|
100
|
+
val h5Style = style.getMap("h5")
|
|
101
|
+
h5FontSize = parseFloat(h5Style, "fontSize").toInt()
|
|
102
|
+
h5Bold = h5Style?.getBoolean("bold") == true
|
|
103
|
+
|
|
104
|
+
val h6Style = style.getMap("h6")
|
|
105
|
+
h6FontSize = parseFloat(h6Style, "fontSize").toInt()
|
|
106
|
+
h6Bold = h6Style?.getBoolean("bold") == true
|
|
107
|
+
|
|
80
108
|
val blockquoteStyle = style.getMap("blockquote")
|
|
81
109
|
blockquoteColor = parseOptionalColor(blockquoteStyle, "color")
|
|
82
110
|
blockquoteBorderColor = parseColor(blockquoteStyle, "borderColor")
|
|
@@ -97,6 +125,12 @@ class HtmlStyle {
|
|
|
97
125
|
ulMarginLeft = parseFloat(ulStyle, "marginLeft").toInt()
|
|
98
126
|
ulBulletSize = parseFloat(ulStyle, "bulletSize").toInt()
|
|
99
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
|
+
|
|
100
134
|
val aStyle = style.getMap("a")
|
|
101
135
|
aColor = parseColor(aStyle, "color")
|
|
102
136
|
aUnderline = parseIsUnderline(aStyle)
|
|
@@ -114,19 +148,29 @@ class HtmlStyle {
|
|
|
114
148
|
mentionsStyle = parseMentionsStyle(mentionStyle)
|
|
115
149
|
}
|
|
116
150
|
|
|
117
|
-
private fun parseFloat(
|
|
151
|
+
private fun parseFloat(
|
|
152
|
+
map: ReadableMap?,
|
|
153
|
+
key: String,
|
|
154
|
+
): Float {
|
|
118
155
|
val safeMap = ensureValueIsSet(map, key)
|
|
119
156
|
|
|
120
157
|
val value = safeMap.getDouble(key)
|
|
121
158
|
return ceil(PixelUtil.toPixelFromSP(value))
|
|
122
159
|
}
|
|
123
160
|
|
|
124
|
-
private fun parseColorWithOpacity(
|
|
161
|
+
private fun parseColorWithOpacity(
|
|
162
|
+
map: ReadableMap?,
|
|
163
|
+
key: String,
|
|
164
|
+
opacity: Int,
|
|
165
|
+
): Int {
|
|
125
166
|
val color = parseColor(map, key)
|
|
126
167
|
return withOpacity(color, opacity)
|
|
127
168
|
}
|
|
128
169
|
|
|
129
|
-
private fun parseOptionalColor(
|
|
170
|
+
private fun parseOptionalColor(
|
|
171
|
+
map: ReadableMap?,
|
|
172
|
+
key: String,
|
|
173
|
+
): Int? {
|
|
130
174
|
if (map == null) return null
|
|
131
175
|
if (!map.hasKey(key)) return null
|
|
132
176
|
if (map.isNull(key)) return null
|
|
@@ -134,7 +178,10 @@ class HtmlStyle {
|
|
|
134
178
|
return parseColor(map, key)
|
|
135
179
|
}
|
|
136
180
|
|
|
137
|
-
private fun parseColor(
|
|
181
|
+
private fun parseColor(
|
|
182
|
+
map: ReadableMap?,
|
|
183
|
+
key: String,
|
|
184
|
+
): Int {
|
|
138
185
|
val safeMap = ensureValueIsSet(map, key)
|
|
139
186
|
|
|
140
187
|
val color = safeMap.getDouble(key)
|
|
@@ -146,7 +193,10 @@ class HtmlStyle {
|
|
|
146
193
|
return parsedColor
|
|
147
194
|
}
|
|
148
195
|
|
|
149
|
-
private fun withOpacity(
|
|
196
|
+
private fun withOpacity(
|
|
197
|
+
color: Int,
|
|
198
|
+
alpha: Int,
|
|
199
|
+
): Int {
|
|
150
200
|
// Do not apply opacity to transparent color
|
|
151
201
|
if (Color.alpha(color) == 0) return color
|
|
152
202
|
val a = alpha.coerceIn(0, 255)
|
|
@@ -164,14 +214,20 @@ class HtmlStyle {
|
|
|
164
214
|
throw Error("Specified textDecorationLine value is not supported: $underline. Supported values are 'underline' and 'none'.")
|
|
165
215
|
}
|
|
166
216
|
|
|
167
|
-
private fun calculateOlMarginLeft(
|
|
217
|
+
private fun calculateOlMarginLeft(
|
|
218
|
+
view: EnrichedTextInputView?,
|
|
219
|
+
userMargin: Int,
|
|
220
|
+
): Int {
|
|
168
221
|
val fontSize = view?.fontSize?.toInt() ?: 0
|
|
169
222
|
val leadMargin = fontSize / 2
|
|
170
223
|
|
|
171
224
|
return leadMargin + userMargin
|
|
172
225
|
}
|
|
173
226
|
|
|
174
|
-
private fun ensureValueIsSet(
|
|
227
|
+
private fun ensureValueIsSet(
|
|
228
|
+
map: ReadableMap?,
|
|
229
|
+
key: String,
|
|
230
|
+
): ReadableMap {
|
|
175
231
|
if (map == null) throw Error("Style map cannot be null")
|
|
176
232
|
|
|
177
233
|
if (!map.hasKey(key)) throw Error("Style map must contain key: $key")
|
|
@@ -186,24 +242,27 @@ class HtmlStyle {
|
|
|
186
242
|
|
|
187
243
|
val parsedMentionsStyle: MutableMap<String, MentionStyle> = mutableMapOf()
|
|
188
244
|
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
245
|
+
val iterator = mentionsStyle.keySetIterator()
|
|
246
|
+
while (iterator.hasNextKey()) {
|
|
247
|
+
val key = iterator.nextKey()
|
|
248
|
+
val value = mentionsStyle.getMap(key)
|
|
193
249
|
|
|
194
|
-
|
|
250
|
+
if (value == null) throw Error("Mention style for key '$key' cannot be null")
|
|
195
251
|
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
252
|
+
val color = parseColor(value, "color")
|
|
253
|
+
val backgroundColor = parseColorWithOpacity(value, "backgroundColor", 80)
|
|
254
|
+
val isUnderline = parseIsUnderline(value)
|
|
255
|
+
val parsedStyle = MentionStyle(color, backgroundColor, isUnderline)
|
|
256
|
+
parsedMentionsStyle.put(key, parsedStyle)
|
|
257
|
+
}
|
|
202
258
|
|
|
203
259
|
return parsedMentionsStyle
|
|
204
260
|
}
|
|
205
261
|
|
|
206
|
-
private fun parseOptionalFontWeight(
|
|
262
|
+
private fun parseOptionalFontWeight(
|
|
263
|
+
map: ReadableMap?,
|
|
264
|
+
key: String,
|
|
265
|
+
): Int? {
|
|
207
266
|
if (map == null) return null
|
|
208
267
|
if (!map.hasKey(key)) return null
|
|
209
268
|
if (map.isNull(key)) return null
|
|
@@ -222,6 +281,12 @@ class HtmlStyle {
|
|
|
222
281
|
h2Bold == other.h2Bold &&
|
|
223
282
|
h3FontSize == other.h3FontSize &&
|
|
224
283
|
h3Bold == other.h3Bold &&
|
|
284
|
+
h4FontSize == other.h4FontSize &&
|
|
285
|
+
h4Bold == other.h4Bold &&
|
|
286
|
+
h5FontSize == other.h5FontSize &&
|
|
287
|
+
h5Bold == other.h5Bold &&
|
|
288
|
+
h6FontSize == other.h6FontSize &&
|
|
289
|
+
h6Bold == other.h6Bold &&
|
|
225
290
|
|
|
226
291
|
blockquoteColor == other.blockquoteColor &&
|
|
227
292
|
blockquoteBorderColor == other.blockquoteBorderColor &&
|
|
@@ -238,6 +303,11 @@ class HtmlStyle {
|
|
|
238
303
|
ulBulletSize == other.ulBulletSize &&
|
|
239
304
|
ulBulletColor == other.ulBulletColor &&
|
|
240
305
|
|
|
306
|
+
ulCheckboxBoxSize == other.ulCheckboxBoxSize &&
|
|
307
|
+
ulCheckboxGapWidth == other.ulCheckboxGapWidth &&
|
|
308
|
+
ulCheckboxMarginLeft == other.ulCheckboxMarginLeft &&
|
|
309
|
+
ulCheckboxBoxColor == other.ulCheckboxBoxColor &&
|
|
310
|
+
|
|
241
311
|
aColor == other.aColor &&
|
|
242
312
|
aUnderline == other.aUnderline &&
|
|
243
313
|
|
|
@@ -251,7 +321,6 @@ class HtmlStyle {
|
|
|
251
321
|
mentionsStyle == other.mentionsStyle
|
|
252
322
|
}
|
|
253
323
|
|
|
254
|
-
|
|
255
324
|
override fun hashCode(): Int {
|
|
256
325
|
var result = h1FontSize.hashCode()
|
|
257
326
|
result = 31 * result + h1Bold.hashCode()
|
|
@@ -259,6 +328,12 @@ class HtmlStyle {
|
|
|
259
328
|
result = 31 * result + h2Bold.hashCode()
|
|
260
329
|
result = 31 * result + h3FontSize.hashCode()
|
|
261
330
|
result = 31 * result + h3Bold.hashCode()
|
|
331
|
+
result = 31 * result + h4FontSize.hashCode()
|
|
332
|
+
result = 31 * result + h4Bold.hashCode()
|
|
333
|
+
result = 31 * result + h5FontSize.hashCode()
|
|
334
|
+
result = 31 * result + h5Bold.hashCode()
|
|
335
|
+
result = 31 * result + h6FontSize.hashCode()
|
|
336
|
+
result = 31 * result + h6Bold.hashCode()
|
|
262
337
|
|
|
263
338
|
result = 31 * result + (blockquoteColor ?: 0)
|
|
264
339
|
result = 31 * result + blockquoteBorderColor.hashCode()
|
|
@@ -275,6 +350,11 @@ class HtmlStyle {
|
|
|
275
350
|
result = 31 * result + ulBulletSize.hashCode()
|
|
276
351
|
result = 31 * result + ulBulletColor.hashCode()
|
|
277
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
|
+
|
|
278
358
|
result = 31 * result + aColor.hashCode()
|
|
279
359
|
result = 31 * result + aUnderline.hashCode()
|
|
280
360
|
|
|
@@ -289,12 +369,4 @@ class HtmlStyle {
|
|
|
289
369
|
|
|
290
370
|
return result
|
|
291
371
|
}
|
|
292
|
-
|
|
293
|
-
companion object {
|
|
294
|
-
data class MentionStyle(
|
|
295
|
-
val color: Int,
|
|
296
|
-
val backgroundColor: Int,
|
|
297
|
-
val underline: Boolean
|
|
298
|
-
)
|
|
299
|
-
}
|
|
300
372
|
}
|
package/android/src/main/java/com/swmansion/enriched/{styles → textinput/styles}/InlineStyles.kt
RENAMED
|
@@ -1,13 +1,20 @@
|
|
|
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
|
|
8
|
-
|
|
9
|
-
class InlineStyles(
|
|
10
|
-
private
|
|
5
|
+
import com.swmansion.enriched.textinput.EnrichedTextInputView
|
|
6
|
+
import com.swmansion.enriched.textinput.spans.EnrichedSpans
|
|
7
|
+
import com.swmansion.enriched.textinput.utils.getSafeSpanBoundaries
|
|
8
|
+
|
|
9
|
+
class InlineStyles(
|
|
10
|
+
private val view: EnrichedTextInputView,
|
|
11
|
+
) {
|
|
12
|
+
private fun <T> setSpan(
|
|
13
|
+
spannable: Spannable,
|
|
14
|
+
type: Class<T>,
|
|
15
|
+
start: Int,
|
|
16
|
+
end: Int,
|
|
17
|
+
) {
|
|
11
18
|
val previousSpanStart = (start - 1).coerceAtLeast(0)
|
|
12
19
|
val previousSpanEnd = previousSpanStart + 1
|
|
13
20
|
val nextSpanStart = (end + 1).coerceAtMost(spannable.length)
|
|
@@ -37,7 +44,12 @@ class InlineStyles(private val view: EnrichedTextInputView) {
|
|
|
37
44
|
spannable.setSpan(span, safeStart, safeEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
|
|
38
45
|
}
|
|
39
46
|
|
|
40
|
-
private fun <T>setAndMergeSpans(
|
|
47
|
+
private fun <T> setAndMergeSpans(
|
|
48
|
+
spannable: Spannable,
|
|
49
|
+
type: Class<T>,
|
|
50
|
+
start: Int,
|
|
51
|
+
end: Int,
|
|
52
|
+
) {
|
|
41
53
|
val spans = spannable.getSpans(start, end, type)
|
|
42
54
|
|
|
43
55
|
// No spans setup for current selection, means we just need to assign new span
|
|
@@ -89,7 +101,10 @@ class InlineStyles(private val view: EnrichedTextInputView) {
|
|
|
89
101
|
}
|
|
90
102
|
}
|
|
91
103
|
|
|
92
|
-
fun afterTextChanged(
|
|
104
|
+
fun afterTextChanged(
|
|
105
|
+
s: Editable,
|
|
106
|
+
endCursorPosition: Int,
|
|
107
|
+
) {
|
|
93
108
|
for ((style, config) in EnrichedSpans.inlineSpans) {
|
|
94
109
|
val start = view.spanState?.getStart(style) ?: continue
|
|
95
110
|
var end = endCursorPosition
|
|
@@ -128,7 +143,11 @@ class InlineStyles(private val view: EnrichedTextInputView) {
|
|
|
128
143
|
view.selection.validateStyles()
|
|
129
144
|
}
|
|
130
145
|
|
|
131
|
-
fun removeStyle(
|
|
146
|
+
fun removeStyle(
|
|
147
|
+
name: String,
|
|
148
|
+
start: Int,
|
|
149
|
+
end: Int,
|
|
150
|
+
): Boolean {
|
|
132
151
|
val config = EnrichedSpans.inlineSpans[name] ?: return false
|
|
133
152
|
val spannable = view.text as Spannable
|
|
134
153
|
val spans = spannable.getSpans(start, end, config.clazz)
|
|
@@ -141,7 +160,5 @@ class InlineStyles(private val view: EnrichedTextInputView) {
|
|
|
141
160
|
return true
|
|
142
161
|
}
|
|
143
162
|
|
|
144
|
-
fun getStyleRange(): Pair<Int, Int>
|
|
145
|
-
return view.selection?.getInlineSelection() ?: Pair(0, 0)
|
|
146
|
-
}
|
|
163
|
+
fun getStyleRange(): Pair<Int, Int> = view.selection?.getInlineSelection() ?: Pair(0, 0)
|
|
147
164
|
}
|