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,79 @@
|
|
|
1
|
+
package com.swmansion.enriched.common.parser
|
|
2
|
+
|
|
3
|
+
import com.swmansion.enriched.common.spans.EnrichedBlockQuoteSpan
|
|
4
|
+
import com.swmansion.enriched.common.spans.EnrichedBoldSpan
|
|
5
|
+
import com.swmansion.enriched.common.spans.EnrichedCheckboxListSpan
|
|
6
|
+
import com.swmansion.enriched.common.spans.EnrichedCodeBlockSpan
|
|
7
|
+
import com.swmansion.enriched.common.spans.EnrichedH1Span
|
|
8
|
+
import com.swmansion.enriched.common.spans.EnrichedH2Span
|
|
9
|
+
import com.swmansion.enriched.common.spans.EnrichedH3Span
|
|
10
|
+
import com.swmansion.enriched.common.spans.EnrichedH4Span
|
|
11
|
+
import com.swmansion.enriched.common.spans.EnrichedH5Span
|
|
12
|
+
import com.swmansion.enriched.common.spans.EnrichedH6Span
|
|
13
|
+
import com.swmansion.enriched.common.spans.EnrichedImageSpan
|
|
14
|
+
import com.swmansion.enriched.common.spans.EnrichedInlineCodeSpan
|
|
15
|
+
import com.swmansion.enriched.common.spans.EnrichedItalicSpan
|
|
16
|
+
import com.swmansion.enriched.common.spans.EnrichedLinkSpan
|
|
17
|
+
import com.swmansion.enriched.common.spans.EnrichedMentionSpan
|
|
18
|
+
import com.swmansion.enriched.common.spans.EnrichedOrderedListSpan
|
|
19
|
+
import com.swmansion.enriched.common.spans.EnrichedStrikeThroughSpan
|
|
20
|
+
import com.swmansion.enriched.common.spans.EnrichedUnderlineSpan
|
|
21
|
+
import com.swmansion.enriched.common.spans.EnrichedUnorderedListSpan
|
|
22
|
+
|
|
23
|
+
interface EnrichedSpanFactory<T> {
|
|
24
|
+
fun createBoldSpan(style: T): EnrichedBoldSpan
|
|
25
|
+
|
|
26
|
+
fun createItalicSpan(style: T): EnrichedItalicSpan
|
|
27
|
+
|
|
28
|
+
fun createUnderlineSpan(style: T): EnrichedUnderlineSpan
|
|
29
|
+
|
|
30
|
+
fun createStrikeThroughSpan(style: T): EnrichedStrikeThroughSpan
|
|
31
|
+
|
|
32
|
+
fun createInlineCodeSpan(style: T): EnrichedInlineCodeSpan
|
|
33
|
+
|
|
34
|
+
fun createLinkSpan(
|
|
35
|
+
url: String,
|
|
36
|
+
style: T,
|
|
37
|
+
): EnrichedLinkSpan
|
|
38
|
+
|
|
39
|
+
fun createMentionSpan(
|
|
40
|
+
text: String,
|
|
41
|
+
indicator: String,
|
|
42
|
+
attributes: Map<String, String>,
|
|
43
|
+
style: T,
|
|
44
|
+
): EnrichedMentionSpan
|
|
45
|
+
|
|
46
|
+
fun createImageSpan(
|
|
47
|
+
source: String,
|
|
48
|
+
width: Int,
|
|
49
|
+
height: Int,
|
|
50
|
+
): EnrichedImageSpan
|
|
51
|
+
|
|
52
|
+
fun createH1Span(style: T): EnrichedH1Span
|
|
53
|
+
|
|
54
|
+
fun createH2Span(style: T): EnrichedH2Span
|
|
55
|
+
|
|
56
|
+
fun createH3Span(style: T): EnrichedH3Span
|
|
57
|
+
|
|
58
|
+
fun createH4Span(style: T): EnrichedH4Span
|
|
59
|
+
|
|
60
|
+
fun createH5Span(style: T): EnrichedH5Span
|
|
61
|
+
|
|
62
|
+
fun createH6Span(style: T): EnrichedH6Span
|
|
63
|
+
|
|
64
|
+
fun createOrderedListSpan(
|
|
65
|
+
index: Int,
|
|
66
|
+
style: T,
|
|
67
|
+
): EnrichedOrderedListSpan
|
|
68
|
+
|
|
69
|
+
fun createUnorderedListSpan(style: T): EnrichedUnorderedListSpan
|
|
70
|
+
|
|
71
|
+
fun createCheckboxListSpan(
|
|
72
|
+
isChecked: Boolean,
|
|
73
|
+
style: T,
|
|
74
|
+
): EnrichedCheckboxListSpan
|
|
75
|
+
|
|
76
|
+
fun createBlockQuoteSpan(style: T): EnrichedBlockQuoteSpan
|
|
77
|
+
|
|
78
|
+
fun createCodeBlockSpan(style: T): EnrichedCodeBlockSpan
|
|
79
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
package com.swmansion.enriched.common.spans
|
|
2
|
+
|
|
3
|
+
import android.graphics.Canvas
|
|
4
|
+
import android.graphics.Paint
|
|
5
|
+
import android.text.Layout
|
|
6
|
+
import android.text.TextPaint
|
|
7
|
+
import android.text.style.LeadingMarginSpan
|
|
8
|
+
import android.text.style.MetricAffectingSpan
|
|
9
|
+
import com.swmansion.enriched.common.EnrichedStyle
|
|
10
|
+
import com.swmansion.enriched.common.spans.interfaces.EnrichedBlockSpan
|
|
11
|
+
|
|
12
|
+
// https://android.googlesource.com/platform/frameworks/base/+/refs/heads/main/core/java/android/text/style/QuoteSpan.java
|
|
13
|
+
open class EnrichedBlockQuoteSpan(
|
|
14
|
+
private val enrichedStyle: EnrichedStyle,
|
|
15
|
+
) : MetricAffectingSpan(),
|
|
16
|
+
LeadingMarginSpan,
|
|
17
|
+
EnrichedBlockSpan {
|
|
18
|
+
override fun updateMeasureState(p0: TextPaint) {
|
|
19
|
+
// Do nothing, but inform layout that this span affects text metrics
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
override fun getLeadingMargin(p0: Boolean): Int = enrichedStyle.blockquoteStripeWidth + enrichedStyle.blockquoteGapWidth
|
|
23
|
+
|
|
24
|
+
override fun drawLeadingMargin(
|
|
25
|
+
c: Canvas,
|
|
26
|
+
p: Paint,
|
|
27
|
+
x: Int,
|
|
28
|
+
dir: Int,
|
|
29
|
+
top: Int,
|
|
30
|
+
baseline: Int,
|
|
31
|
+
bottom: Int,
|
|
32
|
+
text: CharSequence?,
|
|
33
|
+
start: Int,
|
|
34
|
+
end: Int,
|
|
35
|
+
first: Boolean,
|
|
36
|
+
layout: Layout?,
|
|
37
|
+
) {
|
|
38
|
+
val style = p.style
|
|
39
|
+
val color = p.color
|
|
40
|
+
p.style = Paint.Style.FILL
|
|
41
|
+
p.color = enrichedStyle.blockquoteBorderColor
|
|
42
|
+
c.drawRect(x.toFloat(), top.toFloat(), x + dir * enrichedStyle.blockquoteStripeWidth.toFloat(), bottom.toFloat(), p)
|
|
43
|
+
p.style = style
|
|
44
|
+
p.color = color
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
override fun updateDrawState(textPaint: TextPaint?) {
|
|
48
|
+
val color = enrichedStyle.blockquoteColor
|
|
49
|
+
if (color != null) {
|
|
50
|
+
textPaint?.color = color
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
package com.swmansion.enriched.common.spans
|
|
2
|
+
|
|
3
|
+
import android.graphics.Typeface
|
|
4
|
+
import android.text.style.StyleSpan
|
|
5
|
+
import com.swmansion.enriched.common.EnrichedStyle
|
|
6
|
+
import com.swmansion.enriched.common.spans.interfaces.EnrichedInlineSpan
|
|
7
|
+
|
|
8
|
+
@Suppress("UNUSED_PARAMETER")
|
|
9
|
+
open class EnrichedBoldSpan(
|
|
10
|
+
enrichedStyle: EnrichedStyle,
|
|
11
|
+
) : StyleSpan(Typeface.BOLD),
|
|
12
|
+
EnrichedInlineSpan
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
package com.swmansion.enriched.common.spans
|
|
2
|
+
|
|
3
|
+
import android.graphics.Canvas
|
|
4
|
+
import android.graphics.Paint
|
|
5
|
+
import android.text.Layout
|
|
6
|
+
import android.text.Spanned
|
|
7
|
+
import android.text.TextPaint
|
|
8
|
+
import android.text.style.LeadingMarginSpan
|
|
9
|
+
import android.text.style.LineHeightSpan
|
|
10
|
+
import android.text.style.MetricAffectingSpan
|
|
11
|
+
import androidx.core.graphics.withTranslation
|
|
12
|
+
import com.swmansion.enriched.common.CheckboxDrawable
|
|
13
|
+
import com.swmansion.enriched.common.EnrichedStyle
|
|
14
|
+
import com.swmansion.enriched.common.spans.interfaces.EnrichedParagraphSpan
|
|
15
|
+
import com.swmansion.enriched.textinput.styles.HtmlStyle
|
|
16
|
+
|
|
17
|
+
open class EnrichedCheckboxListSpan(
|
|
18
|
+
open var isChecked: Boolean,
|
|
19
|
+
private val enrichedStyle: EnrichedStyle,
|
|
20
|
+
) : MetricAffectingSpan(),
|
|
21
|
+
LineHeightSpan,
|
|
22
|
+
LeadingMarginSpan,
|
|
23
|
+
EnrichedParagraphSpan {
|
|
24
|
+
private val checkboxDrawable =
|
|
25
|
+
CheckboxDrawable(enrichedStyle.ulCheckboxBoxSize, enrichedStyle.ulCheckboxBoxColor, isChecked).apply {
|
|
26
|
+
setBounds(0, 0, enrichedStyle.ulCheckboxBoxSize, enrichedStyle.ulCheckboxBoxSize)
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
override fun updateMeasureState(tp: TextPaint) {
|
|
30
|
+
// Do nothing, but inform layout that this span affects text metrics
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
override fun updateDrawState(tp: TextPaint) {
|
|
34
|
+
// Do nothing, but inform layout that this span affects text metrics
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// Include checkbox size in text measurements to avoid clipping
|
|
38
|
+
override fun chooseHeight(
|
|
39
|
+
text: CharSequence,
|
|
40
|
+
start: Int,
|
|
41
|
+
end: Int,
|
|
42
|
+
spanstartv: Int,
|
|
43
|
+
v: Int,
|
|
44
|
+
fm: Paint.FontMetricsInt,
|
|
45
|
+
) {
|
|
46
|
+
val checkboxSize = enrichedStyle.ulCheckboxBoxSize
|
|
47
|
+
val currentLineHeight = fm.descent - fm.ascent
|
|
48
|
+
|
|
49
|
+
if (checkboxSize > currentLineHeight) {
|
|
50
|
+
val extraSpace = checkboxSize - currentLineHeight
|
|
51
|
+
val halfExtra = extraSpace / 2
|
|
52
|
+
|
|
53
|
+
fm.ascent -= halfExtra
|
|
54
|
+
fm.descent += (extraSpace - halfExtra)
|
|
55
|
+
|
|
56
|
+
fm.top -= halfExtra
|
|
57
|
+
fm.bottom += (extraSpace - halfExtra)
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
override fun getLeadingMargin(first: Boolean): Int =
|
|
62
|
+
enrichedStyle.ulCheckboxBoxSize + enrichedStyle.ulCheckboxMarginLeft + enrichedStyle.ulCheckboxGapWidth
|
|
63
|
+
|
|
64
|
+
override fun drawLeadingMargin(
|
|
65
|
+
canvas: Canvas,
|
|
66
|
+
paint: Paint,
|
|
67
|
+
x: Int,
|
|
68
|
+
dir: Int,
|
|
69
|
+
top: Int,
|
|
70
|
+
baseline: Int,
|
|
71
|
+
bottom: Int,
|
|
72
|
+
text: CharSequence,
|
|
73
|
+
start: Int,
|
|
74
|
+
end: Int,
|
|
75
|
+
first: Boolean,
|
|
76
|
+
layout: Layout?,
|
|
77
|
+
) {
|
|
78
|
+
val spannedText = text as Spanned
|
|
79
|
+
|
|
80
|
+
if (spannedText.getSpanStart(this) == start) {
|
|
81
|
+
checkboxDrawable.update(isChecked)
|
|
82
|
+
|
|
83
|
+
val lineCenter = (top + bottom) / 2f
|
|
84
|
+
val drawableTop = lineCenter - (enrichedStyle.ulCheckboxBoxSize / 2f)
|
|
85
|
+
|
|
86
|
+
canvas.withTranslation(x.toFloat() + enrichedStyle.ulCheckboxMarginLeft, drawableTop) {
|
|
87
|
+
checkboxDrawable.draw(this)
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/EnrichedCodeBlockSpan.kt
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
package com.swmansion.enriched.spans
|
|
1
|
+
package com.swmansion.enriched.common.spans
|
|
2
2
|
|
|
3
3
|
import android.graphics.Canvas
|
|
4
4
|
import android.graphics.Paint
|
|
@@ -9,15 +9,17 @@ import android.text.Spanned
|
|
|
9
9
|
import android.text.TextPaint
|
|
10
10
|
import android.text.style.LineBackgroundSpan
|
|
11
11
|
import android.text.style.MetricAffectingSpan
|
|
12
|
-
import com.swmansion.enriched.
|
|
13
|
-
import com.swmansion.enriched.
|
|
14
|
-
|
|
15
|
-
class EnrichedCodeBlockSpan(private val htmlStyle: HtmlStyle) : MetricAffectingSpan(), LineBackgroundSpan, EnrichedBlockSpan {
|
|
16
|
-
override val dependsOnHtmlStyle: Boolean = true
|
|
12
|
+
import com.swmansion.enriched.common.EnrichedStyle
|
|
13
|
+
import com.swmansion.enriched.common.spans.interfaces.EnrichedBlockSpan
|
|
17
14
|
|
|
15
|
+
open class EnrichedCodeBlockSpan(
|
|
16
|
+
private val enrichedStyle: EnrichedStyle,
|
|
17
|
+
) : MetricAffectingSpan(),
|
|
18
|
+
LineBackgroundSpan,
|
|
19
|
+
EnrichedBlockSpan {
|
|
18
20
|
override fun updateDrawState(paint: TextPaint) {
|
|
19
21
|
paint.typeface = Typeface.MONOSPACE
|
|
20
|
-
paint.color =
|
|
22
|
+
paint.color = enrichedStyle.codeBlockColor
|
|
21
23
|
}
|
|
22
24
|
|
|
23
25
|
override fun updateMeasureState(paint: TextPaint) {
|
|
@@ -35,16 +37,16 @@ class EnrichedCodeBlockSpan(private val htmlStyle: HtmlStyle) : MetricAffectingS
|
|
|
35
37
|
text: CharSequence,
|
|
36
38
|
start: Int,
|
|
37
39
|
end: Int,
|
|
38
|
-
lineNum: Int
|
|
40
|
+
lineNum: Int,
|
|
39
41
|
) {
|
|
40
42
|
if (text !is Spanned) {
|
|
41
43
|
return
|
|
42
44
|
}
|
|
43
45
|
|
|
44
46
|
val previousColor = p.color
|
|
45
|
-
p.color =
|
|
47
|
+
p.color = enrichedStyle.codeBlockBackgroundColor
|
|
46
48
|
|
|
47
|
-
val radius =
|
|
49
|
+
val radius = enrichedStyle.codeBlockRadius
|
|
48
50
|
|
|
49
51
|
val spanStart = text.getSpanStart(this)
|
|
50
52
|
val spanEnd = text.getSpanEnd(this)
|
|
@@ -76,8 +78,4 @@ class EnrichedCodeBlockSpan(private val htmlStyle: HtmlStyle) : MetricAffectingS
|
|
|
76
78
|
canvas.drawPath(path, p)
|
|
77
79
|
p.color = previousColor
|
|
78
80
|
}
|
|
79
|
-
|
|
80
|
-
override fun rebuildWithStyle(htmlStyle: HtmlStyle): EnrichedCodeBlockSpan {
|
|
81
|
-
return EnrichedCodeBlockSpan(htmlStyle)
|
|
82
|
-
}
|
|
83
81
|
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
package com.swmansion.enriched.common.spans
|
|
2
|
+
|
|
3
|
+
import android.graphics.Typeface
|
|
4
|
+
import android.text.TextPaint
|
|
5
|
+
import android.text.style.AbsoluteSizeSpan
|
|
6
|
+
import com.swmansion.enriched.common.EnrichedStyle
|
|
7
|
+
import com.swmansion.enriched.common.spans.interfaces.EnrichedHeadingSpan
|
|
8
|
+
|
|
9
|
+
open class EnrichedH1Span(
|
|
10
|
+
private val enrichedStyle: EnrichedStyle,
|
|
11
|
+
) : AbsoluteSizeSpan(enrichedStyle.h1FontSize),
|
|
12
|
+
EnrichedHeadingSpan {
|
|
13
|
+
override fun updateDrawState(tp: TextPaint) {
|
|
14
|
+
super.updateDrawState(tp)
|
|
15
|
+
val bold = enrichedStyle.h1Bold
|
|
16
|
+
if (bold) {
|
|
17
|
+
tp.typeface = Typeface.create(tp.typeface, Typeface.BOLD)
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
package com.swmansion.enriched.common.spans
|
|
2
|
+
|
|
3
|
+
import android.graphics.Typeface
|
|
4
|
+
import android.text.TextPaint
|
|
5
|
+
import android.text.style.AbsoluteSizeSpan
|
|
6
|
+
import com.swmansion.enriched.common.EnrichedStyle
|
|
7
|
+
import com.swmansion.enriched.common.spans.interfaces.EnrichedHeadingSpan
|
|
8
|
+
|
|
9
|
+
open class EnrichedH2Span(
|
|
10
|
+
private val enrichedStyle: EnrichedStyle,
|
|
11
|
+
) : AbsoluteSizeSpan(enrichedStyle.h2FontSize),
|
|
12
|
+
EnrichedHeadingSpan {
|
|
13
|
+
override fun updateDrawState(tp: TextPaint) {
|
|
14
|
+
super.updateDrawState(tp)
|
|
15
|
+
val bold = enrichedStyle.h2Bold
|
|
16
|
+
if (bold) {
|
|
17
|
+
tp.typeface = Typeface.create(tp.typeface, Typeface.BOLD)
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
package com.swmansion.enriched.common.spans
|
|
2
|
+
|
|
3
|
+
import android.graphics.Typeface
|
|
4
|
+
import android.text.TextPaint
|
|
5
|
+
import android.text.style.AbsoluteSizeSpan
|
|
6
|
+
import com.swmansion.enriched.common.EnrichedStyle
|
|
7
|
+
import com.swmansion.enriched.common.spans.interfaces.EnrichedHeadingSpan
|
|
8
|
+
|
|
9
|
+
open class EnrichedH3Span(
|
|
10
|
+
private val enrichedStyle: EnrichedStyle,
|
|
11
|
+
) : AbsoluteSizeSpan(enrichedStyle.h3FontSize),
|
|
12
|
+
EnrichedHeadingSpan {
|
|
13
|
+
override fun updateDrawState(tp: TextPaint) {
|
|
14
|
+
super.updateDrawState(tp)
|
|
15
|
+
val bold = enrichedStyle.h3Bold
|
|
16
|
+
if (bold) {
|
|
17
|
+
tp.typeface = Typeface.create(tp.typeface, Typeface.BOLD)
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
package com.swmansion.enriched.common.spans
|
|
2
|
+
|
|
3
|
+
import android.graphics.Typeface
|
|
4
|
+
import android.text.TextPaint
|
|
5
|
+
import android.text.style.AbsoluteSizeSpan
|
|
6
|
+
import com.swmansion.enriched.common.EnrichedStyle
|
|
7
|
+
import com.swmansion.enriched.common.spans.interfaces.EnrichedHeadingSpan
|
|
8
|
+
import com.swmansion.enriched.textinput.styles.HtmlStyle
|
|
9
|
+
|
|
10
|
+
open class EnrichedH4Span(
|
|
11
|
+
private val enrichedStyle: EnrichedStyle,
|
|
12
|
+
) : AbsoluteSizeSpan(enrichedStyle.h4FontSize),
|
|
13
|
+
EnrichedHeadingSpan {
|
|
14
|
+
override fun updateDrawState(tp: TextPaint) {
|
|
15
|
+
super.updateDrawState(tp)
|
|
16
|
+
val bold = enrichedStyle.h4Bold
|
|
17
|
+
if (bold) {
|
|
18
|
+
tp.typeface = Typeface.create(tp.typeface, Typeface.BOLD)
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
package com.swmansion.enriched.common.spans
|
|
2
|
+
|
|
3
|
+
import android.graphics.Typeface
|
|
4
|
+
import android.text.TextPaint
|
|
5
|
+
import android.text.style.AbsoluteSizeSpan
|
|
6
|
+
import com.swmansion.enriched.common.EnrichedStyle
|
|
7
|
+
import com.swmansion.enriched.common.spans.interfaces.EnrichedHeadingSpan
|
|
8
|
+
|
|
9
|
+
open class EnrichedH5Span(
|
|
10
|
+
private val enrichedStyle: EnrichedStyle,
|
|
11
|
+
) : AbsoluteSizeSpan(enrichedStyle.h5FontSize),
|
|
12
|
+
EnrichedHeadingSpan {
|
|
13
|
+
override fun updateDrawState(tp: TextPaint) {
|
|
14
|
+
super.updateDrawState(tp)
|
|
15
|
+
val bold = enrichedStyle.h5Bold
|
|
16
|
+
if (bold) {
|
|
17
|
+
tp.typeface = Typeface.create(tp.typeface, Typeface.BOLD)
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
package com.swmansion.enriched.common.spans
|
|
2
|
+
|
|
3
|
+
import android.graphics.Typeface
|
|
4
|
+
import android.text.TextPaint
|
|
5
|
+
import android.text.style.AbsoluteSizeSpan
|
|
6
|
+
import com.swmansion.enriched.common.EnrichedStyle
|
|
7
|
+
import com.swmansion.enriched.common.spans.interfaces.EnrichedHeadingSpan
|
|
8
|
+
|
|
9
|
+
open class EnrichedH6Span(
|
|
10
|
+
private val enrichedStyle: EnrichedStyle,
|
|
11
|
+
) : AbsoluteSizeSpan(enrichedStyle.h6FontSize),
|
|
12
|
+
EnrichedHeadingSpan {
|
|
13
|
+
override fun updateDrawState(tp: TextPaint) {
|
|
14
|
+
super.updateDrawState(tp)
|
|
15
|
+
val bold = enrichedStyle.h6Bold
|
|
16
|
+
if (bold) {
|
|
17
|
+
tp.typeface = Typeface.create(tp.typeface, Typeface.BOLD)
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/EnrichedImageSpan.kt
RENAMED
|
@@ -1,29 +1,29 @@
|
|
|
1
|
-
package com.swmansion.enriched.spans
|
|
1
|
+
package com.swmansion.enriched.common.spans
|
|
2
2
|
|
|
3
|
-
import android.annotation.SuppressLint
|
|
4
3
|
import android.content.res.Resources
|
|
5
4
|
import android.graphics.BitmapFactory
|
|
6
5
|
import android.graphics.Canvas
|
|
6
|
+
import android.graphics.ImageDecoder
|
|
7
7
|
import android.graphics.Paint
|
|
8
|
-
import android.graphics.drawable.
|
|
8
|
+
import android.graphics.drawable.AnimatedImageDrawable
|
|
9
9
|
import android.graphics.drawable.Drawable
|
|
10
|
+
import android.os.Build
|
|
10
11
|
import android.text.Editable
|
|
11
12
|
import android.text.Spannable
|
|
12
13
|
import android.text.style.ImageSpan
|
|
13
14
|
import android.util.Log
|
|
14
|
-
import androidx.core.graphics.drawable.DrawableCompat
|
|
15
|
-
import androidx.core.graphics.withSave
|
|
16
|
-
import com.swmansion.enriched.spans.interfaces.EnrichedInlineSpan
|
|
17
|
-
import com.swmansion.enriched.utils.AsyncDrawable
|
|
18
15
|
import androidx.core.graphics.drawable.toDrawable
|
|
16
|
+
import androidx.core.graphics.withSave
|
|
19
17
|
import com.swmansion.enriched.R
|
|
20
|
-
import com.swmansion.enriched.
|
|
21
|
-
import com.swmansion.enriched.
|
|
22
|
-
import com.swmansion.enriched.
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
18
|
+
import com.swmansion.enriched.common.AsyncDrawable
|
|
19
|
+
import com.swmansion.enriched.common.ForceRedrawSpan
|
|
20
|
+
import com.swmansion.enriched.common.ResourceManager
|
|
21
|
+
import com.swmansion.enriched.common.spans.interfaces.EnrichedInlineSpan
|
|
22
|
+
import java.io.File
|
|
23
|
+
|
|
24
|
+
open class EnrichedImageSpan :
|
|
25
|
+
ImageSpan,
|
|
26
|
+
EnrichedInlineSpan {
|
|
27
27
|
private var width: Int = 0
|
|
28
28
|
private var height: Int = 0
|
|
29
29
|
|
|
@@ -33,11 +33,18 @@ class EnrichedImageSpan : ImageSpan, EnrichedInlineSpan {
|
|
|
33
33
|
}
|
|
34
34
|
|
|
35
35
|
override fun draw(
|
|
36
|
-
canvas: Canvas,
|
|
37
|
-
|
|
36
|
+
canvas: Canvas,
|
|
37
|
+
text: CharSequence?,
|
|
38
|
+
start: Int,
|
|
39
|
+
end: Int,
|
|
40
|
+
x: Float,
|
|
41
|
+
top: Int,
|
|
42
|
+
y: Int,
|
|
43
|
+
bottom: Int,
|
|
44
|
+
paint: Paint,
|
|
38
45
|
) {
|
|
39
46
|
val drawable = drawable
|
|
40
|
-
canvas.withSave
|
|
47
|
+
canvas.withSave {
|
|
41
48
|
val transY = bottom - drawable.bounds.bottom - paint.fontMetricsInt.descent
|
|
42
49
|
translate(x, transY.toFloat())
|
|
43
50
|
drawable.draw(this)
|
|
@@ -48,7 +55,7 @@ class EnrichedImageSpan : ImageSpan, EnrichedInlineSpan {
|
|
|
48
55
|
val drawable = super.getDrawable()
|
|
49
56
|
val scale = Resources.getSystem().displayMetrics.density
|
|
50
57
|
|
|
51
|
-
drawable.setBounds(0, 0, (width * scale).toInt()
|
|
58
|
+
drawable.setBounds(0, 0, (width * scale).toInt(), (height * scale).toInt())
|
|
52
59
|
return drawable
|
|
53
60
|
}
|
|
54
61
|
|
|
@@ -57,7 +64,7 @@ class EnrichedImageSpan : ImageSpan, EnrichedInlineSpan {
|
|
|
57
64
|
text: CharSequence?,
|
|
58
65
|
start: Int,
|
|
59
66
|
end: Int,
|
|
60
|
-
fm: Paint.FontMetricsInt
|
|
67
|
+
fm: Paint.FontMetricsInt?,
|
|
61
68
|
): Int {
|
|
62
69
|
val d = drawable
|
|
63
70
|
val rect = d.bounds
|
|
@@ -79,7 +86,10 @@ class EnrichedImageSpan : ImageSpan, EnrichedInlineSpan {
|
|
|
79
86
|
return rect.right
|
|
80
87
|
}
|
|
81
88
|
|
|
82
|
-
private fun registerDrawableLoadCallback
|
|
89
|
+
private fun registerDrawableLoadCallback(
|
|
90
|
+
d: AsyncDrawable,
|
|
91
|
+
text: Editable?,
|
|
92
|
+
) {
|
|
83
93
|
d.onLoaded = onLoaded@{
|
|
84
94
|
val spannable = text as? Spannable
|
|
85
95
|
|
|
@@ -114,28 +124,16 @@ class EnrichedImageSpan : ImageSpan, EnrichedInlineSpan {
|
|
|
114
124
|
}
|
|
115
125
|
}
|
|
116
126
|
|
|
117
|
-
fun getWidth(): Int
|
|
118
|
-
return width
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
fun getHeight(): Int {
|
|
122
|
-
return height
|
|
123
|
-
}
|
|
127
|
+
fun getWidth(): Int = width
|
|
124
128
|
|
|
125
|
-
|
|
129
|
+
fun getHeight(): Int = height
|
|
126
130
|
|
|
127
131
|
companion object {
|
|
128
|
-
fun
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
return EnrichedImageSpan(imgDrawable, src, width, height)
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
private fun prepareDrawableForImage(src: String): Drawable? {
|
|
132
|
+
fun prepareDrawableForImage(
|
|
133
|
+
src: String,
|
|
134
|
+
width: Int,
|
|
135
|
+
height: Int,
|
|
136
|
+
): Drawable? {
|
|
139
137
|
var cleanPath = src
|
|
140
138
|
|
|
141
139
|
if (cleanPath.startsWith("http://") || cleanPath.startsWith("https://")) {
|
|
@@ -146,22 +144,41 @@ class EnrichedImageSpan : ImageSpan, EnrichedInlineSpan {
|
|
|
146
144
|
cleanPath = cleanPath.substring(7)
|
|
147
145
|
}
|
|
148
146
|
|
|
149
|
-
|
|
147
|
+
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P) {
|
|
148
|
+
return try {
|
|
149
|
+
val bitmap = BitmapFactory.decodeFile(cleanPath) ?: return null
|
|
150
|
+
val drawable = bitmap.toDrawable(Resources.getSystem())
|
|
151
|
+
drawable.setBounds(0, 0, bitmap.width, bitmap.height)
|
|
152
|
+
return drawable
|
|
153
|
+
} catch (e: Exception) {
|
|
154
|
+
Log.e("EnrichedImageSpan", "Failed to load legacy image: $cleanPath", e)
|
|
155
|
+
null
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
return try {
|
|
160
|
+
val file = File(cleanPath)
|
|
161
|
+
val source = ImageDecoder.createSource(file)
|
|
162
|
+
|
|
163
|
+
val density = Resources.getSystem().displayMetrics.density
|
|
164
|
+
val targetWidthPx = (width * density).toInt()
|
|
165
|
+
val targetHeightPx = (height * density).toInt()
|
|
150
166
|
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
drawable.setBounds(0, 0,
|
|
167
|
+
val drawable =
|
|
168
|
+
ImageDecoder.decodeDrawable(source) { decoder, info, source ->
|
|
169
|
+
decoder.setTargetSize(targetWidthPx, targetHeightPx)
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
if (drawable is AnimatedImageDrawable) {
|
|
173
|
+
drawable.setBounds(0, 0, drawable.intrinsicWidth, drawable.intrinsicHeight)
|
|
174
|
+
drawable.repeatCount = AnimatedImageDrawable.REPEAT_INFINITE
|
|
175
|
+
drawable.start()
|
|
158
176
|
}
|
|
177
|
+
drawable
|
|
159
178
|
} catch (e: Exception) {
|
|
160
|
-
|
|
161
|
-
|
|
179
|
+
Log.e("EnrichedImageSpan", "Failed to load image: $cleanPath", e)
|
|
180
|
+
null
|
|
162
181
|
}
|
|
163
|
-
|
|
164
|
-
return drawable
|
|
165
182
|
}
|
|
166
183
|
}
|
|
167
184
|
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
package com.swmansion.enriched.common.spans
|
|
2
|
+
|
|
3
|
+
import android.graphics.Typeface
|
|
4
|
+
import android.text.TextPaint
|
|
5
|
+
import android.text.style.MetricAffectingSpan
|
|
6
|
+
import com.swmansion.enriched.common.EnrichedStyle
|
|
7
|
+
import com.swmansion.enriched.common.spans.interfaces.EnrichedInlineSpan
|
|
8
|
+
|
|
9
|
+
open class EnrichedInlineCodeSpan(
|
|
10
|
+
private val enrichedStyle: EnrichedStyle,
|
|
11
|
+
) : MetricAffectingSpan(),
|
|
12
|
+
EnrichedInlineSpan {
|
|
13
|
+
override fun updateDrawState(textPaint: TextPaint) {
|
|
14
|
+
val typeface = Typeface.create(Typeface.MONOSPACE, Typeface.NORMAL)
|
|
15
|
+
textPaint.typeface = typeface
|
|
16
|
+
textPaint.color = enrichedStyle.inlineCodeColor
|
|
17
|
+
textPaint.bgColor = enrichedStyle.inlineCodeBackgroundColor
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
override fun updateMeasureState(textPaint: TextPaint) {
|
|
21
|
+
val typeface = Typeface.create(Typeface.MONOSPACE, Typeface.NORMAL)
|
|
22
|
+
textPaint.typeface = typeface
|
|
23
|
+
}
|
|
24
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
package com.swmansion.enriched.common.spans
|
|
2
|
+
|
|
3
|
+
import android.graphics.Typeface
|
|
4
|
+
import android.text.style.StyleSpan
|
|
5
|
+
import com.swmansion.enriched.common.EnrichedStyle
|
|
6
|
+
import com.swmansion.enriched.common.spans.interfaces.EnrichedInlineSpan
|
|
7
|
+
|
|
8
|
+
@Suppress("UNUSED_PARAMETER")
|
|
9
|
+
open class EnrichedItalicSpan(
|
|
10
|
+
private val enrichedStyle: EnrichedStyle,
|
|
11
|
+
) : StyleSpan(Typeface.ITALIC),
|
|
12
|
+
EnrichedInlineSpan
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
package com.swmansion.enriched.common.spans
|
|
2
|
+
|
|
3
|
+
import android.text.TextPaint
|
|
4
|
+
import android.text.style.ClickableSpan
|
|
5
|
+
import android.view.View
|
|
6
|
+
import com.swmansion.enriched.common.EnrichedStyle
|
|
7
|
+
import com.swmansion.enriched.common.spans.interfaces.EnrichedInlineSpan
|
|
8
|
+
|
|
9
|
+
open class EnrichedLinkSpan(
|
|
10
|
+
private val url: String,
|
|
11
|
+
private val enrichedStyle: EnrichedStyle,
|
|
12
|
+
) : ClickableSpan(),
|
|
13
|
+
EnrichedInlineSpan {
|
|
14
|
+
override fun onClick(view: View) {
|
|
15
|
+
// Do nothing, links inside the input are not clickable.
|
|
16
|
+
// We are using `ClickableSpan` to allow the text to be styled as a link.
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
override fun updateDrawState(textPaint: TextPaint) {
|
|
20
|
+
super.updateDrawState(textPaint)
|
|
21
|
+
textPaint.color = enrichedStyle.aColor
|
|
22
|
+
textPaint.isUnderlineText = enrichedStyle.aUnderline
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
fun getUrl(): String = url
|
|
26
|
+
}
|