react-native-enriched 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -4
- package/android/build.gradle +3 -3
- package/android/generated/java/com/facebook/react/viewmanagers/EnrichedTextInputViewManagerDelegate.java +3 -0
- package/android/generated/java/com/facebook/react/viewmanagers/EnrichedTextInputViewManagerInterface.java +1 -0
- package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ComponentDescriptors.cpp +1 -1
- package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ComponentDescriptors.h +1 -1
- package/{ios/generated/RNEnrichedTextInputViewSpec → android/generated/jni/react/renderer/components/ReactNativeEnrichedSpec}/EventEmitters.cpp +31 -29
- package/{ios/generated/RNEnrichedTextInputViewSpec → android/generated/jni/react/renderer/components/ReactNativeEnrichedSpec}/EventEmitters.h +22 -25
- package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/Props.h +57 -0
- package/android/gradle.properties +5 -5
- package/android/src/main/java/com/swmansion/enriched/{EnrichedTextInputViewPackage.kt → ReactNativeEnrichedPackage.kt} +3 -2
- package/android/src/main/java/com/swmansion/enriched/{utils → common}/AsyncDrawable.kt +40 -8
- package/android/src/main/java/com/swmansion/enriched/common/CheckboxDrawable.kt +81 -0
- package/android/src/main/java/com/swmansion/enriched/{utils → common}/EnrichedConstants.kt +1 -1
- package/android/src/main/java/com/swmansion/enriched/common/EnrichedStyle.kt +57 -0
- package/android/src/main/java/com/swmansion/enriched/{spans/utils → common}/ForceRedrawSpan.kt +1 -1
- package/android/src/main/java/com/swmansion/enriched/common/MentionStyle.kt +7 -0
- package/android/src/main/java/com/swmansion/enriched/{utils → common}/ResourceManager.kt +1 -1
- package/android/src/main/java/com/swmansion/enriched/{utils → common/parser}/EnrichedParser.java +126 -99
- package/android/src/main/java/com/swmansion/enriched/common/parser/EnrichedSpanFactory.kt +79 -0
- package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/EnrichedBlockQuoteSpan.kt +9 -13
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedBoldSpan.kt +12 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedCheckboxListSpan.kt +91 -0
- package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/EnrichedCodeBlockSpan.kt +8 -12
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH1Span.kt +20 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH2Span.kt +20 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH3Span.kt +20 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH4Span.kt +21 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH5Span.kt +20 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH6Span.kt +20 -0
- package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/EnrichedImageSpan.kt +43 -38
- package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/EnrichedInlineCodeSpan.kt +7 -11
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedItalicSpan.kt +12 -0
- package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/EnrichedLinkSpan.kt +7 -11
- package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/EnrichedMentionSpan.kt +6 -10
- package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/EnrichedOrderedListSpan.kt +12 -21
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedStrikeThroughSpan.kt +11 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedUnderlineSpan.kt +11 -0
- package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/EnrichedUnorderedListSpan.kt +9 -13
- package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/interfaces/EnrichedBlockSpan.kt +1 -1
- package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/interfaces/EnrichedHeadingSpan.kt +1 -1
- package/android/src/main/java/com/swmansion/enriched/common/spans/interfaces/EnrichedInlineSpan.kt +3 -0
- package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/interfaces/EnrichedParagraphSpan.kt +1 -1
- package/android/src/main/java/com/swmansion/enriched/common/spans/interfaces/EnrichedSpan.kt +3 -0
- package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/interfaces/EnrichedZeroWidthSpaceSpan.kt +1 -1
- package/android/src/main/java/com/swmansion/enriched/{EnrichedTextInputConnectionWrapper.kt → textinput/EnrichedTextInputConnectionWrapper.kt} +2 -2
- package/android/src/main/java/com/swmansion/enriched/textinput/EnrichedTextInputSpannableFactory.kt +83 -0
- package/android/src/main/java/com/swmansion/enriched/{EnrichedTextInputView.kt → textinput/EnrichedTextInputView.kt} +87 -51
- package/android/src/main/java/com/swmansion/enriched/{EnrichedTextInputViewLayoutManager.kt → textinput/EnrichedTextInputViewLayoutManager.kt} +1 -1
- package/android/src/main/java/com/swmansion/enriched/{EnrichedTextInputViewManager.kt → textinput/EnrichedTextInputViewManager.kt} +24 -17
- package/android/src/main/java/com/swmansion/enriched/{MeasurementStore.kt → textinput/MeasurementStore.kt} +5 -4
- package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/MentionHandler.kt +2 -2
- package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnChangeHtmlEvent.kt +1 -1
- package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnChangeSelectionEvent.kt +1 -1
- package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnChangeStateEvent.kt +1 -1
- package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnChangeTextEvent.kt +2 -2
- package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnInputBlurEvent.kt +1 -1
- package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnInputFocusEvent.kt +1 -1
- package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnInputKeyPressEvent.kt +1 -1
- package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnLinkDetectedEvent.kt +1 -1
- package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnMentionDetectedEvent.kt +1 -1
- package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnMentionEvent.kt +1 -1
- package/android/src/main/java/com/swmansion/enriched/textinput/events/OnPasteImagesEvent.kt +47 -0
- package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnRequestHtmlResultEvent.kt +1 -1
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputBlockQuoteSpan.kt +14 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputBoldSpan.kt +14 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputCheckboxListSpan.kt +15 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputCodeBlockSpan.kt +14 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH1Span.kt +14 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH2Span.kt +14 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH3Span.kt +14 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH4Span.kt +14 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH5Span.kt +14 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH6Span.kt +14 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputImageSpan.kt +36 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputInlineCodeSpan.kt +14 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputItalicSpan.kt +14 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputLinkSpan.kt +15 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputMentionSpan.kt +18 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputOrderedListSpan.kt +21 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputStrikeThroughSpan.kt +14 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputUnderlineSpan.kt +14 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputUnorderedListSpan.kt +14 -0
- package/android/src/main/java/com/swmansion/enriched/{spans → textinput/spans}/EnrichedSpans.kt +39 -30
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/interfaces/EnrichedInputSpan.kt +10 -0
- package/android/src/main/java/com/swmansion/enriched/{styles → textinput/styles}/HtmlStyle.kt +58 -43
- package/android/src/main/java/com/swmansion/enriched/{styles → textinput/styles}/InlineStyles.kt +4 -4
- package/android/src/main/java/com/swmansion/enriched/{styles → textinput/styles}/ListStyles.kt +77 -26
- package/android/src/main/java/com/swmansion/enriched/{styles → textinput/styles}/ParagraphStyles.kt +11 -11
- package/android/src/main/java/com/swmansion/enriched/{styles → textinput/styles}/ParametrizedStyles.kt +19 -19
- package/android/src/main/java/com/swmansion/enriched/{utils → textinput/utils}/EnrichedEditableFactory.kt +2 -2
- package/android/src/main/java/com/swmansion/enriched/{utils → textinput/utils}/EnrichedSelection.kt +15 -14
- package/android/src/main/java/com/swmansion/enriched/{utils → textinput/utils}/EnrichedSpanState.kt +15 -50
- package/android/src/main/java/com/swmansion/enriched/{utils → textinput/utils}/EnrichedSpannable.kt +3 -3
- package/android/src/main/java/com/swmansion/enriched/{utils → textinput/utils}/EnrichedSpannableStringBuilder.kt +2 -1
- package/android/src/main/java/com/swmansion/enriched/textinput/utils/RichContentReceiver.kt +127 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/utils/Utils.kt +106 -0
- package/android/src/main/java/com/swmansion/enriched/{watchers → textinput/watchers}/EnrichedSpanWatcher.kt +10 -10
- package/android/src/main/java/com/swmansion/enriched/{watchers → textinput/watchers}/EnrichedTextWatcher.kt +3 -3
- package/android/src/main/new_arch/CMakeLists.txt +1 -1
- package/android/src/main/new_arch/ReactNativeEnrichedSpec.cpp +11 -0
- package/android/src/main/new_arch/ReactNativeEnrichedSpec.h +15 -0
- package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/EnrichedTextInputMeasurementManager.h +1 -1
- package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/EnrichedTextInputShadowNode.h +2 -2
- package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/conversions.h +1 -1
- package/ios/EnrichedTextInputView.h +1 -0
- package/ios/EnrichedTextInputView.mm +266 -55
- package/ios/config/InputConfig.h +10 -0
- package/ios/config/InputConfig.mm +119 -0
- package/ios/extensions/ImageExtension.h +35 -0
- package/ios/extensions/ImageExtension.mm +156 -0
- package/ios/extensions/LayoutManagerExtension.mm +115 -95
- package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ComponentDescriptors.cpp +1 -1
- package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ComponentDescriptors.h +1 -1
- package/{android/generated/jni/react/renderer/components/RNEnrichedTextInputViewSpec → ios/generated/ReactNativeEnrichedSpec}/EventEmitters.cpp +31 -29
- package/{android/generated/jni/react/renderer/components/RNEnrichedTextInputViewSpec → ios/generated/ReactNativeEnrichedSpec}/EventEmitters.h +22 -25
- package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/Props.h +57 -0
- package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/RCTComponentViewHelpers.h +21 -0
- package/ios/inputParser/InputParser.mm +135 -8
- package/ios/inputTextView/InputTextView.mm +118 -0
- package/ios/interfaces/ImageAttachment.h +1 -0
- package/ios/interfaces/ImageAttachment.mm +14 -4
- package/ios/interfaces/StyleHeaders.h +13 -2
- package/ios/interfaces/StyleTypeEnum.h +1 -0
- package/ios/internals/EnrichedTextInputViewState.cpp +6 -6
- package/ios/styles/CheckboxListStyle.mm +321 -0
- package/ios/styles/H1Style.mm +3 -0
- package/ios/styles/H2Style.mm +3 -0
- package/ios/styles/H3Style.mm +3 -0
- package/ios/styles/H4Style.mm +3 -0
- package/ios/styles/H5Style.mm +3 -0
- package/ios/styles/H6Style.mm +3 -0
- package/ios/styles/HeadingStyleBase.mm +150 -78
- package/ios/utils/CheckboxHitTestUtils.h +10 -0
- package/ios/utils/CheckboxHitTestUtils.mm +123 -0
- package/ios/utils/ParagraphAttributesUtils.mm +83 -53
- package/ios/utils/TextBlockTapGestureRecognizer.h +17 -0
- package/ios/utils/TextBlockTapGestureRecognizer.mm +56 -0
- package/ios/utils/ZeroWidthSpaceUtils.mm +14 -3
- package/lib/module/EnrichedTextInput.js +36 -11
- package/lib/module/EnrichedTextInput.js.map +1 -1
- package/lib/module/{EnrichedTextInputNativeComponent.ts → spec/EnrichedTextInputNativeComponent.ts} +40 -9
- package/lib/module/types.js +4 -0
- package/lib/module/types.js.map +1 -0
- package/lib/module/utils/normalizeHtmlStyle.js +6 -0
- package/lib/module/utils/normalizeHtmlStyle.js.map +1 -1
- package/lib/module/utils/nullthrows.js +9 -0
- package/lib/module/utils/nullthrows.js.map +1 -0
- package/lib/typescript/src/EnrichedTextInput.d.ts +9 -49
- package/lib/typescript/src/EnrichedTextInput.d.ts.map +1 -1
- package/lib/typescript/src/index.d.ts +2 -1
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/lib/typescript/src/{EnrichedTextInputNativeComponent.d.ts → spec/EnrichedTextInputNativeComponent.d.ts} +33 -8
- package/lib/typescript/src/spec/EnrichedTextInputNativeComponent.d.ts.map +1 -0
- package/lib/typescript/src/types.d.ts +58 -0
- package/lib/typescript/src/types.d.ts.map +1 -0
- package/lib/typescript/src/utils/normalizeHtmlStyle.d.ts +2 -2
- package/lib/typescript/src/utils/normalizeHtmlStyle.d.ts.map +1 -1
- package/lib/typescript/src/utils/nullthrows.d.ts +2 -0
- package/lib/typescript/src/utils/nullthrows.d.ts.map +1 -0
- package/lib/typescript/src/utils/regexParser.d.ts +1 -1
- package/lib/typescript/src/utils/regexParser.d.ts.map +1 -1
- package/package.json +4 -4
- package/src/EnrichedTextInput.tsx +49 -62
- package/src/index.tsx +3 -1
- package/src/{EnrichedTextInputNativeComponent.ts → spec/EnrichedTextInputNativeComponent.ts} +40 -9
- package/src/types.ts +59 -0
- package/src/utils/normalizeHtmlStyle.ts +8 -5
- package/src/utils/nullthrows.ts +7 -0
- package/src/utils/regexParser.ts +1 -1
- package/android/src/main/java/com/swmansion/enriched/events/OnChangeStateDeprecatedEvent.kt +0 -21
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedBoldSpan.kt +0 -17
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedH1Span.kt +0 -24
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedH2Span.kt +0 -24
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedH3Span.kt +0 -24
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedH4Span.kt +0 -24
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedH5Span.kt +0 -24
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedH6Span.kt +0 -24
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedItalicSpan.kt +0 -16
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedStrikeThroughSpan.kt +0 -15
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedUnderlineSpan.kt +0 -15
- package/android/src/main/java/com/swmansion/enriched/spans/interfaces/EnrichedInlineSpan.kt +0 -3
- package/android/src/main/java/com/swmansion/enriched/spans/interfaces/EnrichedSpan.kt +0 -9
- package/android/src/main/java/com/swmansion/enriched/utils/Utils.kt +0 -21
- package/android/src/main/new_arch/RNEnrichedTextInputViewSpec.cpp +0 -22
- package/android/src/main/new_arch/RNEnrichedTextInputViewSpec.h +0 -26
- package/lib/typescript/src/EnrichedTextInputNativeComponent.d.ts.map +0 -1
- /package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/Props.cpp +0 -0
- /package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ShadowNodes.cpp +0 -0
- /package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ShadowNodes.h +0 -0
- /package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/States.cpp +0 -0
- /package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/States.h +0 -0
- /package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/EnrichedTextInputComponentDescriptor.h +0 -0
- /package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/EnrichedTextInputMeasurementManager.cpp +0 -0
- /package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/EnrichedTextInputShadowNode.cpp +0 -0
- /package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/EnrichedTextInputState.cpp +0 -0
- /package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/EnrichedTextInputState.h +0 -0
- /package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/Props.cpp +0 -0
- /package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ShadowNodes.cpp +0 -0
- /package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ShadowNodes.h +0 -0
- /package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/States.cpp +0 -0
- /package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/States.h +0 -0
package/android/src/main/java/com/swmansion/enriched/{utils → common/parser}/EnrichedParser.java
RENAMED
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
package com.swmansion.enriched.
|
|
1
|
+
package com.swmansion.enriched.common.parser;
|
|
2
2
|
|
|
3
|
-
import android.graphics.drawable.Drawable;
|
|
4
3
|
import android.text.Editable;
|
|
5
4
|
import android.text.Layout;
|
|
6
5
|
import android.text.Spannable;
|
|
@@ -9,29 +8,29 @@ import android.text.Spanned;
|
|
|
9
8
|
import android.text.TextUtils;
|
|
10
9
|
import android.text.style.AlignmentSpan;
|
|
11
10
|
import android.text.style.ParagraphStyle;
|
|
12
|
-
import com.swmansion.enriched.
|
|
13
|
-
import com.swmansion.enriched.spans.EnrichedBoldSpan;
|
|
14
|
-
import com.swmansion.enriched.spans.
|
|
15
|
-
import com.swmansion.enriched.spans.
|
|
16
|
-
import com.swmansion.enriched.spans.
|
|
17
|
-
import com.swmansion.enriched.spans.
|
|
18
|
-
import com.swmansion.enriched.spans.
|
|
19
|
-
import com.swmansion.enriched.spans.
|
|
20
|
-
import com.swmansion.enriched.spans.
|
|
21
|
-
import com.swmansion.enriched.spans.
|
|
22
|
-
import com.swmansion.enriched.spans.
|
|
23
|
-
import com.swmansion.enriched.spans.
|
|
24
|
-
import com.swmansion.enriched.spans.
|
|
25
|
-
import com.swmansion.enriched.spans.
|
|
26
|
-
import com.swmansion.enriched.spans.
|
|
27
|
-
import com.swmansion.enriched.spans.
|
|
28
|
-
import com.swmansion.enriched.spans.
|
|
29
|
-
import com.swmansion.enriched.spans.
|
|
30
|
-
import com.swmansion.enriched.spans.
|
|
31
|
-
import com.swmansion.enriched.spans.interfaces.
|
|
32
|
-
import com.swmansion.enriched.spans.interfaces.
|
|
33
|
-
import com.swmansion.enriched.spans.interfaces.
|
|
34
|
-
import com.swmansion.enriched.
|
|
11
|
+
import com.swmansion.enriched.common.EnrichedConstants;
|
|
12
|
+
import com.swmansion.enriched.common.spans.EnrichedBoldSpan;
|
|
13
|
+
import com.swmansion.enriched.common.spans.EnrichedCheckboxListSpan;
|
|
14
|
+
import com.swmansion.enriched.common.spans.EnrichedCodeBlockSpan;
|
|
15
|
+
import com.swmansion.enriched.common.spans.EnrichedH1Span;
|
|
16
|
+
import com.swmansion.enriched.common.spans.EnrichedH2Span;
|
|
17
|
+
import com.swmansion.enriched.common.spans.EnrichedH3Span;
|
|
18
|
+
import com.swmansion.enriched.common.spans.EnrichedH4Span;
|
|
19
|
+
import com.swmansion.enriched.common.spans.EnrichedH5Span;
|
|
20
|
+
import com.swmansion.enriched.common.spans.EnrichedH6Span;
|
|
21
|
+
import com.swmansion.enriched.common.spans.EnrichedImageSpan;
|
|
22
|
+
import com.swmansion.enriched.common.spans.EnrichedInlineCodeSpan;
|
|
23
|
+
import com.swmansion.enriched.common.spans.EnrichedItalicSpan;
|
|
24
|
+
import com.swmansion.enriched.common.spans.EnrichedLinkSpan;
|
|
25
|
+
import com.swmansion.enriched.common.spans.EnrichedMentionSpan;
|
|
26
|
+
import com.swmansion.enriched.common.spans.EnrichedOrderedListSpan;
|
|
27
|
+
import com.swmansion.enriched.common.spans.EnrichedStrikeThroughSpan;
|
|
28
|
+
import com.swmansion.enriched.common.spans.EnrichedUnderlineSpan;
|
|
29
|
+
import com.swmansion.enriched.common.spans.EnrichedUnorderedListSpan;
|
|
30
|
+
import com.swmansion.enriched.common.spans.interfaces.EnrichedBlockSpan;
|
|
31
|
+
import com.swmansion.enriched.common.spans.interfaces.EnrichedInlineSpan;
|
|
32
|
+
import com.swmansion.enriched.common.spans.interfaces.EnrichedParagraphSpan;
|
|
33
|
+
import com.swmansion.enriched.common.spans.interfaces.EnrichedZeroWidthSpaceSpan;
|
|
35
34
|
import java.io.IOException;
|
|
36
35
|
import java.io.StringReader;
|
|
37
36
|
import java.util.HashMap;
|
|
@@ -54,16 +53,6 @@ import org.xml.sax.XMLReader;
|
|
|
54
53
|
*/
|
|
55
54
|
public class EnrichedParser {
|
|
56
55
|
/** Retrieves images for HTML <img> tags. */
|
|
57
|
-
public interface ImageGetter {
|
|
58
|
-
/**
|
|
59
|
-
* This method is called when the HTML parser encounters an <img> tag. The <code>source
|
|
60
|
-
* </code> argument is the string from the "src" attribute; the return value should be a
|
|
61
|
-
* Drawable representation of the image or <code>null</code> for a generic replacement image.
|
|
62
|
-
* Make sure you call setBounds() on your Drawable if it doesn't already have its bounds set.
|
|
63
|
-
*/
|
|
64
|
-
Drawable getDrawable(String source);
|
|
65
|
-
}
|
|
66
|
-
|
|
67
56
|
private EnrichedParser() {}
|
|
68
57
|
|
|
69
58
|
/**
|
|
@@ -74,15 +63,7 @@ public class EnrichedParser {
|
|
|
74
63
|
private static final HTMLSchema schema = new HTMLSchema();
|
|
75
64
|
}
|
|
76
65
|
|
|
77
|
-
|
|
78
|
-
* Returns displayable styled text from the provided HTML string. Any <img> tags in the HTML
|
|
79
|
-
* will use the specified ImageGetter to request a representation of the image (use null if you
|
|
80
|
-
* don't want this) and the specified TagHandler to handle unknown tags (specify null if you don't
|
|
81
|
-
* want this).
|
|
82
|
-
*
|
|
83
|
-
* <p>This uses TagSoup to handle real HTML, including all of the brokenness found in the wild.
|
|
84
|
-
*/
|
|
85
|
-
public static Spanned fromHtml(String source, HtmlStyle style, ImageGetter imageGetter) {
|
|
66
|
+
public static <T> Spanned fromHtml(String source, T style, EnrichedSpanFactory<T> spanFactory) {
|
|
86
67
|
Parser parser = new Parser();
|
|
87
68
|
try {
|
|
88
69
|
parser.setProperty(Parser.schemaProperty, HtmlParser.schema);
|
|
@@ -91,7 +72,7 @@ public class EnrichedParser {
|
|
|
91
72
|
throw new RuntimeException(e);
|
|
92
73
|
}
|
|
93
74
|
HtmlToSpannedConverter converter =
|
|
94
|
-
new HtmlToSpannedConverter(source, style,
|
|
75
|
+
new HtmlToSpannedConverter(source, style, parser, spanFactory);
|
|
95
76
|
return converter.convert();
|
|
96
77
|
}
|
|
97
78
|
|
|
@@ -156,6 +137,8 @@ public class EnrichedParser {
|
|
|
156
137
|
return "ul";
|
|
157
138
|
} else if (span instanceof EnrichedOrderedListSpan) {
|
|
158
139
|
return "ol";
|
|
140
|
+
} else if (span instanceof EnrichedCheckboxListSpan) {
|
|
141
|
+
return "ul data-type=\"checkbox\"";
|
|
159
142
|
} else if (span instanceof EnrichedH1Span) {
|
|
160
143
|
return "h1";
|
|
161
144
|
} else if (span instanceof EnrichedH2Span) {
|
|
@@ -177,6 +160,8 @@ public class EnrichedParser {
|
|
|
177
160
|
private static void withinBlock(StringBuilder out, Spanned text, int start, int end) {
|
|
178
161
|
boolean isInUlList = false;
|
|
179
162
|
boolean isInOlList = false;
|
|
163
|
+
boolean isInCheckboxList = false;
|
|
164
|
+
|
|
180
165
|
int next;
|
|
181
166
|
for (int i = start; i <= end; i = next) {
|
|
182
167
|
next = TextUtils.indexOf(text, '\n', i, end);
|
|
@@ -192,6 +177,10 @@ public class EnrichedParser {
|
|
|
192
177
|
// Current paragraph is no longer a list item; close the previously opened list
|
|
193
178
|
isInOlList = false;
|
|
194
179
|
out.append("</ol>\n");
|
|
180
|
+
} else if (isInCheckboxList) {
|
|
181
|
+
// Current paragraph is no longer a list item; close the previously opened list
|
|
182
|
+
isInCheckboxList = false;
|
|
183
|
+
out.append("</ul>\n");
|
|
195
184
|
}
|
|
196
185
|
out.append("<br>\n");
|
|
197
186
|
} else {
|
|
@@ -200,6 +189,7 @@ public class EnrichedParser {
|
|
|
200
189
|
String tag = getBlockTag(paragraphStyles);
|
|
201
190
|
boolean isUlListItem = tag.equals("ul");
|
|
202
191
|
boolean isOlListItem = tag.equals("ol");
|
|
192
|
+
boolean isCheckboxListItem = tag.equals("ul data-type=\"checkbox\"");
|
|
203
193
|
|
|
204
194
|
if (isInUlList && !isUlListItem) {
|
|
205
195
|
// Current paragraph is no longer a list item; close the previously opened list
|
|
@@ -209,6 +199,10 @@ public class EnrichedParser {
|
|
|
209
199
|
// Current paragraph is no longer a list item; close the previously opened list
|
|
210
200
|
isInOlList = false;
|
|
211
201
|
out.append("</ol>\n");
|
|
202
|
+
} else if (isInCheckboxList && !isCheckboxListItem) {
|
|
203
|
+
// Current paragraph is no longer a list item; close the previously opened list
|
|
204
|
+
isInCheckboxList = false;
|
|
205
|
+
out.append("</ul>\n");
|
|
212
206
|
}
|
|
213
207
|
|
|
214
208
|
if (isUlListItem && !isInUlList) {
|
|
@@ -219,14 +213,27 @@ public class EnrichedParser {
|
|
|
219
213
|
// Current paragraph is the first item in a list
|
|
220
214
|
isInOlList = true;
|
|
221
215
|
out.append("<ol").append(">\n");
|
|
216
|
+
} else if (isCheckboxListItem && !isInCheckboxList) {
|
|
217
|
+
// Current paragraph is the first item in a list
|
|
218
|
+
isInCheckboxList = true;
|
|
219
|
+
out.append("<ul data-type=\"checkbox\">\n");
|
|
222
220
|
}
|
|
223
221
|
|
|
224
|
-
boolean isList = isUlListItem || isOlListItem;
|
|
222
|
+
boolean isList = isUlListItem || isOlListItem || isCheckboxListItem;
|
|
225
223
|
String tagType = isList ? "li" : tag;
|
|
226
|
-
out.append("<");
|
|
227
224
|
|
|
225
|
+
out.append("<");
|
|
228
226
|
out.append(tagType);
|
|
229
227
|
|
|
228
|
+
if (isCheckboxListItem) {
|
|
229
|
+
EnrichedCheckboxListSpan[] checkboxSpans =
|
|
230
|
+
text.getSpans(i, next, EnrichedCheckboxListSpan.class);
|
|
231
|
+
if (checkboxSpans.length > 0) {
|
|
232
|
+
boolean isChecked = checkboxSpans[0].isChecked();
|
|
233
|
+
if (isChecked) out.append(" checked");
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
|
|
230
237
|
out.append(">");
|
|
231
238
|
withinParagraph(out, text, i, next);
|
|
232
239
|
out.append("</");
|
|
@@ -238,6 +245,9 @@ public class EnrichedParser {
|
|
|
238
245
|
} else if (next == end && isInOlList) {
|
|
239
246
|
isInOlList = false;
|
|
240
247
|
out.append("</ol>\n");
|
|
248
|
+
} else if (next == end && isInCheckboxList) {
|
|
249
|
+
isInCheckboxList = false;
|
|
250
|
+
out.append("</ul>\n");
|
|
241
251
|
}
|
|
242
252
|
}
|
|
243
253
|
next++;
|
|
@@ -370,23 +380,24 @@ public class EnrichedParser {
|
|
|
370
380
|
}
|
|
371
381
|
}
|
|
372
382
|
|
|
373
|
-
class HtmlToSpannedConverter implements ContentHandler {
|
|
374
|
-
private final
|
|
383
|
+
class HtmlToSpannedConverter<T> implements ContentHandler {
|
|
384
|
+
private final EnrichedSpanFactory<T> mSpanFactory;
|
|
385
|
+
private final T mStyle;
|
|
375
386
|
private final String mSource;
|
|
376
387
|
private final XMLReader mReader;
|
|
377
388
|
private final SpannableStringBuilder mSpannableStringBuilder;
|
|
378
|
-
private final EnrichedParser.ImageGetter mImageGetter;
|
|
379
389
|
private static Integer currentOrderedListItemIndex = 0;
|
|
380
390
|
private static Boolean isInOrderedList = false;
|
|
391
|
+
private static Boolean isInCheckboxList = false;
|
|
381
392
|
private static Boolean isEmptyTag = false;
|
|
382
393
|
|
|
383
394
|
public HtmlToSpannedConverter(
|
|
384
|
-
String source,
|
|
395
|
+
String source, T style, Parser parser, EnrichedSpanFactory<T> spanFactory) {
|
|
385
396
|
mStyle = style;
|
|
386
397
|
mSource = source;
|
|
387
398
|
mSpannableStringBuilder = new SpannableStringBuilder();
|
|
388
|
-
mImageGetter = imageGetter;
|
|
389
399
|
mReader = parser;
|
|
400
|
+
mSpanFactory = spanFactory;
|
|
390
401
|
}
|
|
391
402
|
|
|
392
403
|
public Spanned convert() {
|
|
@@ -454,6 +465,8 @@ class HtmlToSpannedConverter implements ContentHandler {
|
|
|
454
465
|
startBlockElement(mSpannableStringBuilder);
|
|
455
466
|
} else if (tag.equalsIgnoreCase("ul")) {
|
|
456
467
|
isInOrderedList = false;
|
|
468
|
+
String dataType = attributes.getValue("", "data-type");
|
|
469
|
+
isInCheckboxList = "checkbox".equals(dataType);
|
|
457
470
|
startBlockElement(mSpannableStringBuilder);
|
|
458
471
|
} else if (tag.equalsIgnoreCase("ol")) {
|
|
459
472
|
isInOrderedList = true;
|
|
@@ -461,7 +474,7 @@ class HtmlToSpannedConverter implements ContentHandler {
|
|
|
461
474
|
startBlockElement(mSpannableStringBuilder);
|
|
462
475
|
} else if (tag.equalsIgnoreCase("li")) {
|
|
463
476
|
isEmptyTag = true;
|
|
464
|
-
startLi(mSpannableStringBuilder);
|
|
477
|
+
startLi(mSpannableStringBuilder, attributes);
|
|
465
478
|
} else if (tag.equalsIgnoreCase("b")) {
|
|
466
479
|
start(mSpannableStringBuilder, new Bold());
|
|
467
480
|
} else if (tag.equalsIgnoreCase("i")) {
|
|
@@ -493,7 +506,7 @@ class HtmlToSpannedConverter implements ContentHandler {
|
|
|
493
506
|
} else if (tag.equalsIgnoreCase("h6")) {
|
|
494
507
|
startHeading(mSpannableStringBuilder, 6);
|
|
495
508
|
} else if (tag.equalsIgnoreCase("img")) {
|
|
496
|
-
startImg(mSpannableStringBuilder, attributes,
|
|
509
|
+
startImg(mSpannableStringBuilder, attributes, mSpanFactory);
|
|
497
510
|
} else if (tag.equalsIgnoreCase("code")) {
|
|
498
511
|
start(mSpannableStringBuilder, new Code());
|
|
499
512
|
} else if (tag.equalsIgnoreCase("mention")) {
|
|
@@ -509,37 +522,40 @@ class HtmlToSpannedConverter implements ContentHandler {
|
|
|
509
522
|
} else if (tag.equalsIgnoreCase("ul")) {
|
|
510
523
|
endBlockElement(mSpannableStringBuilder);
|
|
511
524
|
} else if (tag.equalsIgnoreCase("li")) {
|
|
512
|
-
endLi(mSpannableStringBuilder, mStyle);
|
|
525
|
+
endLi(mSpannableStringBuilder, mStyle, mSpanFactory);
|
|
513
526
|
} else if (tag.equalsIgnoreCase("b")) {
|
|
514
|
-
end(mSpannableStringBuilder, Bold.class,
|
|
527
|
+
end(mSpannableStringBuilder, Bold.class, mSpanFactory.createBoldSpan(mStyle));
|
|
515
528
|
} else if (tag.equalsIgnoreCase("i")) {
|
|
516
|
-
end(mSpannableStringBuilder, Italic.class,
|
|
529
|
+
end(mSpannableStringBuilder, Italic.class, mSpanFactory.createItalicSpan(mStyle));
|
|
517
530
|
} else if (tag.equalsIgnoreCase("blockquote")) {
|
|
518
|
-
endBlockquote(mSpannableStringBuilder, mStyle);
|
|
531
|
+
endBlockquote(mSpannableStringBuilder, mStyle, mSpanFactory);
|
|
519
532
|
} else if (tag.equalsIgnoreCase("codeblock")) {
|
|
520
|
-
endCodeBlock(mSpannableStringBuilder, mStyle);
|
|
533
|
+
endCodeBlock(mSpannableStringBuilder, mStyle, mSpanFactory);
|
|
521
534
|
} else if (tag.equalsIgnoreCase("a")) {
|
|
522
|
-
endA(mSpannableStringBuilder, mStyle);
|
|
535
|
+
endA(mSpannableStringBuilder, mStyle, mSpanFactory);
|
|
523
536
|
} else if (tag.equalsIgnoreCase("u")) {
|
|
524
|
-
end(mSpannableStringBuilder, Underline.class,
|
|
537
|
+
end(mSpannableStringBuilder, Underline.class, mSpanFactory.createUnderlineSpan(mStyle));
|
|
525
538
|
} else if (tag.equalsIgnoreCase("s")) {
|
|
526
|
-
end(
|
|
539
|
+
end(
|
|
540
|
+
mSpannableStringBuilder,
|
|
541
|
+
Strikethrough.class,
|
|
542
|
+
mSpanFactory.createStrikeThroughSpan(mStyle));
|
|
527
543
|
} else if (tag.equalsIgnoreCase("h1")) {
|
|
528
|
-
endHeading(mSpannableStringBuilder, mStyle, 1);
|
|
544
|
+
endHeading(mSpannableStringBuilder, mStyle, mSpanFactory, 1);
|
|
529
545
|
} else if (tag.equalsIgnoreCase("h2")) {
|
|
530
|
-
endHeading(mSpannableStringBuilder, mStyle, 2);
|
|
546
|
+
endHeading(mSpannableStringBuilder, mStyle, mSpanFactory, 2);
|
|
531
547
|
} else if (tag.equalsIgnoreCase("h3")) {
|
|
532
|
-
endHeading(mSpannableStringBuilder, mStyle, 3);
|
|
548
|
+
endHeading(mSpannableStringBuilder, mStyle, mSpanFactory, 3);
|
|
533
549
|
} else if (tag.equalsIgnoreCase("h4")) {
|
|
534
|
-
endHeading(mSpannableStringBuilder, mStyle, 4);
|
|
550
|
+
endHeading(mSpannableStringBuilder, mStyle, mSpanFactory, 4);
|
|
535
551
|
} else if (tag.equalsIgnoreCase("h5")) {
|
|
536
|
-
endHeading(mSpannableStringBuilder, mStyle, 5);
|
|
552
|
+
endHeading(mSpannableStringBuilder, mStyle, mSpanFactory, 5);
|
|
537
553
|
} else if (tag.equalsIgnoreCase("h6")) {
|
|
538
|
-
endHeading(mSpannableStringBuilder, mStyle, 6);
|
|
554
|
+
endHeading(mSpannableStringBuilder, mStyle, mSpanFactory, 6);
|
|
539
555
|
} else if (tag.equalsIgnoreCase("code")) {
|
|
540
|
-
end(mSpannableStringBuilder, Code.class,
|
|
556
|
+
end(mSpannableStringBuilder, Code.class, mSpanFactory.createInlineCodeSpan(mStyle));
|
|
541
557
|
} else if (tag.equalsIgnoreCase("mention")) {
|
|
542
|
-
endMention(mSpannableStringBuilder, mStyle);
|
|
558
|
+
endMention(mSpannableStringBuilder, mStyle, mSpanFactory);
|
|
543
559
|
}
|
|
544
560
|
}
|
|
545
561
|
|
|
@@ -578,26 +594,31 @@ class HtmlToSpannedConverter implements ContentHandler {
|
|
|
578
594
|
text.append('\n');
|
|
579
595
|
}
|
|
580
596
|
|
|
581
|
-
private void startLi(Editable text) {
|
|
597
|
+
private void startLi(Editable text, Attributes attributes) {
|
|
582
598
|
startBlockElement(text);
|
|
583
599
|
|
|
584
600
|
if (isInOrderedList) {
|
|
585
601
|
currentOrderedListItemIndex++;
|
|
586
|
-
start(text, new List("
|
|
602
|
+
start(text, new List("ordered", currentOrderedListItemIndex, false));
|
|
603
|
+
} else if (isInCheckboxList) {
|
|
604
|
+
String isChecked = attributes.getValue("", "checked");
|
|
605
|
+
start(text, new List("checked", 0, "checked".equals(isChecked)));
|
|
587
606
|
} else {
|
|
588
|
-
start(text, new List("
|
|
607
|
+
start(text, new List("unordered", 0, false));
|
|
589
608
|
}
|
|
590
609
|
}
|
|
591
610
|
|
|
592
|
-
private static void endLi(Editable text,
|
|
611
|
+
private static <T> void endLi(Editable text, T style, EnrichedSpanFactory<T> spanFactory) {
|
|
593
612
|
endBlockElement(text);
|
|
594
613
|
|
|
595
614
|
List l = getLast(text, List.class);
|
|
596
615
|
if (l != null) {
|
|
597
|
-
if (l.mType.equals("
|
|
598
|
-
setParagraphSpanFromMark(text, l,
|
|
616
|
+
if (l.mType.equals("ordered")) {
|
|
617
|
+
setParagraphSpanFromMark(text, l, spanFactory.createOrderedListSpan(l.mIndex, style));
|
|
618
|
+
} else if (l.mType.equals("checked")) {
|
|
619
|
+
setParagraphSpanFromMark(text, l, spanFactory.createCheckboxListSpan(l.mChecked, style));
|
|
599
620
|
} else {
|
|
600
|
-
setParagraphSpanFromMark(text, l,
|
|
621
|
+
setParagraphSpanFromMark(text, l, spanFactory.createUnorderedListSpan(style));
|
|
601
622
|
}
|
|
602
623
|
}
|
|
603
624
|
|
|
@@ -609,10 +630,11 @@ class HtmlToSpannedConverter implements ContentHandler {
|
|
|
609
630
|
start(text, new Blockquote());
|
|
610
631
|
}
|
|
611
632
|
|
|
612
|
-
private static void endBlockquote(
|
|
633
|
+
private static <T> void endBlockquote(
|
|
634
|
+
Editable text, T style, EnrichedSpanFactory<T> spanFactory) {
|
|
613
635
|
endBlockElement(text);
|
|
614
636
|
Blockquote last = getLast(text, Blockquote.class);
|
|
615
|
-
setParagraphSpanFromMark(text, last,
|
|
637
|
+
setParagraphSpanFromMark(text, last, spanFactory.createBlockQuoteSpan(style));
|
|
616
638
|
}
|
|
617
639
|
|
|
618
640
|
private void startCodeBlock(Editable text) {
|
|
@@ -620,10 +642,10 @@ class HtmlToSpannedConverter implements ContentHandler {
|
|
|
620
642
|
start(text, new CodeBlock());
|
|
621
643
|
}
|
|
622
644
|
|
|
623
|
-
private static void endCodeBlock(Editable text,
|
|
645
|
+
private static <T> void endCodeBlock(Editable text, T style, EnrichedSpanFactory<T> spanFactory) {
|
|
624
646
|
endBlockElement(text);
|
|
625
647
|
CodeBlock last = getLast(text, CodeBlock.class);
|
|
626
|
-
setParagraphSpanFromMark(text, last,
|
|
648
|
+
setParagraphSpanFromMark(text, last, spanFactory.createCodeBlockSpan(style));
|
|
627
649
|
}
|
|
628
650
|
|
|
629
651
|
private void startHeading(Editable text, int level) {
|
|
@@ -653,33 +675,34 @@ class HtmlToSpannedConverter implements ContentHandler {
|
|
|
653
675
|
}
|
|
654
676
|
}
|
|
655
677
|
|
|
656
|
-
private static void endHeading(
|
|
678
|
+
private static <T> void endHeading(
|
|
679
|
+
Editable text, T style, EnrichedSpanFactory<T> spanFactory, int level) {
|
|
657
680
|
endBlockElement(text);
|
|
658
681
|
|
|
659
682
|
switch (level) {
|
|
660
683
|
case 1:
|
|
661
684
|
H1 lastH1 = getLast(text, H1.class);
|
|
662
|
-
setParagraphSpanFromMark(text, lastH1,
|
|
685
|
+
setParagraphSpanFromMark(text, lastH1, spanFactory.createH1Span(style));
|
|
663
686
|
break;
|
|
664
687
|
case 2:
|
|
665
688
|
H2 lastH2 = getLast(text, H2.class);
|
|
666
|
-
setParagraphSpanFromMark(text, lastH2,
|
|
689
|
+
setParagraphSpanFromMark(text, lastH2, spanFactory.createH2Span(style));
|
|
667
690
|
break;
|
|
668
691
|
case 3:
|
|
669
692
|
H3 lastH3 = getLast(text, H3.class);
|
|
670
|
-
setParagraphSpanFromMark(text, lastH3,
|
|
693
|
+
setParagraphSpanFromMark(text, lastH3, spanFactory.createH3Span(style));
|
|
671
694
|
break;
|
|
672
695
|
case 4:
|
|
673
696
|
H4 lastH4 = getLast(text, H4.class);
|
|
674
|
-
setParagraphSpanFromMark(text, lastH4,
|
|
697
|
+
setParagraphSpanFromMark(text, lastH4, spanFactory.createH4Span(style));
|
|
675
698
|
break;
|
|
676
699
|
case 5:
|
|
677
700
|
H5 lastH5 = getLast(text, H5.class);
|
|
678
|
-
setParagraphSpanFromMark(text, lastH5,
|
|
701
|
+
setParagraphSpanFromMark(text, lastH5, spanFactory.createH5Span(style));
|
|
679
702
|
break;
|
|
680
703
|
case 6:
|
|
681
704
|
H6 lastH6 = getLast(text, H6.class);
|
|
682
|
-
setParagraphSpanFromMark(text, lastH6,
|
|
705
|
+
setParagraphSpanFromMark(text, lastH6, spanFactory.createH6Span(style));
|
|
683
706
|
break;
|
|
684
707
|
default:
|
|
685
708
|
throw new IllegalArgumentException("Unsupported heading level: " + level);
|
|
@@ -745,18 +768,19 @@ class HtmlToSpannedConverter implements ContentHandler {
|
|
|
745
768
|
}
|
|
746
769
|
}
|
|
747
770
|
|
|
748
|
-
private static void startImg(
|
|
749
|
-
Editable text, Attributes attributes,
|
|
771
|
+
private static <T> void startImg(
|
|
772
|
+
Editable text, Attributes attributes, EnrichedSpanFactory<T> spanFactory) {
|
|
750
773
|
String src = attributes.getValue("", "src");
|
|
751
774
|
String width = attributes.getValue("", "width");
|
|
752
775
|
String height = attributes.getValue("", "height");
|
|
753
776
|
|
|
754
777
|
int len = text.length();
|
|
755
|
-
EnrichedImageSpan span =
|
|
756
|
-
EnrichedImageSpan.Companion.createEnrichedImageSpan(
|
|
757
|
-
src, Integer.parseInt(width), Integer.parseInt(height));
|
|
758
778
|
text.append("");
|
|
759
|
-
text.setSpan(
|
|
779
|
+
text.setSpan(
|
|
780
|
+
spanFactory.createImageSpan(src, Integer.parseInt(width), Integer.parseInt(height)),
|
|
781
|
+
len,
|
|
782
|
+
text.length(),
|
|
783
|
+
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
|
|
760
784
|
}
|
|
761
785
|
|
|
762
786
|
private static void startA(Editable text, Attributes attributes) {
|
|
@@ -764,11 +788,11 @@ class HtmlToSpannedConverter implements ContentHandler {
|
|
|
764
788
|
start(text, new Href(href));
|
|
765
789
|
}
|
|
766
790
|
|
|
767
|
-
private void endA(Editable text,
|
|
791
|
+
private static <T> void endA(Editable text, T style, EnrichedSpanFactory<T> spanFactory) {
|
|
768
792
|
Href h = getLast(text, Href.class);
|
|
769
793
|
if (h != null) {
|
|
770
794
|
if (h.mHref != null) {
|
|
771
|
-
setSpanFromMark(text, h,
|
|
795
|
+
setSpanFromMark(text, h, spanFactory.createLinkSpan(h.mHref, style));
|
|
772
796
|
}
|
|
773
797
|
}
|
|
774
798
|
}
|
|
@@ -789,13 +813,14 @@ class HtmlToSpannedConverter implements ContentHandler {
|
|
|
789
813
|
start(mention, new Mention(indicator, text, attributesMap));
|
|
790
814
|
}
|
|
791
815
|
|
|
792
|
-
private void endMention(Editable text,
|
|
816
|
+
private static <T> void endMention(Editable text, T style, EnrichedSpanFactory<T> spanFactory) {
|
|
793
817
|
Mention m = getLast(text, Mention.class);
|
|
794
818
|
|
|
795
819
|
if (m == null) return;
|
|
796
820
|
if (m.mText == null) return;
|
|
797
821
|
|
|
798
|
-
setSpanFromMark(
|
|
822
|
+
setSpanFromMark(
|
|
823
|
+
text, m, spanFactory.createMentionSpan(m.mText, m.mIndicator, m.mAttributes, style));
|
|
799
824
|
}
|
|
800
825
|
|
|
801
826
|
public void setDocumentLocator(Locator locator) {}
|
|
@@ -884,10 +909,12 @@ class HtmlToSpannedConverter implements ContentHandler {
|
|
|
884
909
|
private static class List {
|
|
885
910
|
public int mIndex;
|
|
886
911
|
public String mType;
|
|
912
|
+
public boolean mChecked;
|
|
887
913
|
|
|
888
|
-
public List(String type, int index) {
|
|
914
|
+
public List(String type, int index, boolean checked) {
|
|
889
915
|
mType = type;
|
|
890
916
|
mIndex = index;
|
|
917
|
+
mChecked = checked;
|
|
891
918
|
}
|
|
892
919
|
}
|
|
893
920
|
|
|
@@ -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
|
+
}
|
|
@@ -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
|
|
@@ -6,22 +6,20 @@ import android.text.Layout
|
|
|
6
6
|
import android.text.TextPaint
|
|
7
7
|
import android.text.style.LeadingMarginSpan
|
|
8
8
|
import android.text.style.MetricAffectingSpan
|
|
9
|
-
import com.swmansion.enriched.
|
|
10
|
-
import com.swmansion.enriched.
|
|
9
|
+
import com.swmansion.enriched.common.EnrichedStyle
|
|
10
|
+
import com.swmansion.enriched.common.spans.interfaces.EnrichedBlockSpan
|
|
11
11
|
|
|
12
12
|
// https://android.googlesource.com/platform/frameworks/base/+/refs/heads/main/core/java/android/text/style/QuoteSpan.java
|
|
13
|
-
class EnrichedBlockQuoteSpan(
|
|
14
|
-
private val
|
|
13
|
+
open class EnrichedBlockQuoteSpan(
|
|
14
|
+
private val enrichedStyle: EnrichedStyle,
|
|
15
15
|
) : MetricAffectingSpan(),
|
|
16
16
|
LeadingMarginSpan,
|
|
17
17
|
EnrichedBlockSpan {
|
|
18
|
-
override val dependsOnHtmlStyle: Boolean = true
|
|
19
|
-
|
|
20
18
|
override fun updateMeasureState(p0: TextPaint) {
|
|
21
19
|
// Do nothing, but inform layout that this span affects text metrics
|
|
22
20
|
}
|
|
23
21
|
|
|
24
|
-
override fun getLeadingMargin(p0: Boolean): Int =
|
|
22
|
+
override fun getLeadingMargin(p0: Boolean): Int = enrichedStyle.blockquoteStripeWidth + enrichedStyle.blockquoteGapWidth
|
|
25
23
|
|
|
26
24
|
override fun drawLeadingMargin(
|
|
27
25
|
c: Canvas,
|
|
@@ -40,18 +38,16 @@ class EnrichedBlockQuoteSpan(
|
|
|
40
38
|
val style = p.style
|
|
41
39
|
val color = p.color
|
|
42
40
|
p.style = Paint.Style.FILL
|
|
43
|
-
p.color =
|
|
44
|
-
c.drawRect(x.toFloat(), top.toFloat(), x + dir *
|
|
41
|
+
p.color = enrichedStyle.blockquoteBorderColor
|
|
42
|
+
c.drawRect(x.toFloat(), top.toFloat(), x + dir * enrichedStyle.blockquoteStripeWidth.toFloat(), bottom.toFloat(), p)
|
|
45
43
|
p.style = style
|
|
46
44
|
p.color = color
|
|
47
45
|
}
|
|
48
46
|
|
|
49
47
|
override fun updateDrawState(textPaint: TextPaint?) {
|
|
50
|
-
val color =
|
|
48
|
+
val color = enrichedStyle.blockquoteColor
|
|
51
49
|
if (color != null) {
|
|
52
50
|
textPaint?.color = color
|
|
53
51
|
}
|
|
54
52
|
}
|
|
55
|
-
|
|
56
|
-
override fun rebuildWithStyle(htmlStyle: HtmlStyle): EnrichedBlockQuoteSpan = EnrichedBlockQuoteSpan(htmlStyle)
|
|
57
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
|