react-native-enriched 0.2.0 → 0.3.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 +16 -17
- 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/EventEmitters.cpp +156 -0
- package/android/generated/jni/react/renderer/components/RNEnrichedTextInputViewSpec/EventEmitters.h +147 -0
- package/android/generated/jni/react/renderer/components/RNEnrichedTextInputViewSpec/Props.cpp +10 -0
- package/android/generated/jni/react/renderer/components/RNEnrichedTextInputViewSpec/Props.h +194 -0
- package/android/lint.gradle +70 -0
- package/android/src/main/java/com/swmansion/enriched/EnrichedTextInputConnectionWrapper.kt +140 -0
- package/android/src/main/java/com/swmansion/enriched/EnrichedTextInputView.kt +304 -83
- package/android/src/main/java/com/swmansion/enriched/EnrichedTextInputViewLayoutManager.kt +3 -1
- package/android/src/main/java/com/swmansion/enriched/EnrichedTextInputViewManager.kt +166 -51
- package/android/src/main/java/com/swmansion/enriched/EnrichedTextInputViewPackage.kt +1 -3
- package/android/src/main/java/com/swmansion/enriched/MeasurementStore.kt +70 -21
- package/android/src/main/java/com/swmansion/enriched/events/MentionHandler.kt +21 -11
- package/android/src/main/java/com/swmansion/enriched/events/OnChangeHtmlEvent.kt +8 -9
- package/android/src/main/java/com/swmansion/enriched/events/OnChangeSelectionEvent.kt +10 -9
- package/android/src/main/java/com/swmansion/enriched/events/OnChangeStateDeprecatedEvent.kt +21 -0
- package/android/src/main/java/com/swmansion/enriched/events/OnChangeStateEvent.kt +9 -12
- package/android/src/main/java/com/swmansion/enriched/events/OnChangeTextEvent.kt +10 -10
- package/android/src/main/java/com/swmansion/enriched/events/OnInputBlurEvent.kt +7 -9
- package/android/src/main/java/com/swmansion/enriched/events/OnInputFocusEvent.kt +7 -9
- package/android/src/main/java/com/swmansion/enriched/events/OnInputKeyPressEvent.kt +27 -0
- package/android/src/main/java/com/swmansion/enriched/events/OnLinkDetectedEvent.kt +13 -11
- package/android/src/main/java/com/swmansion/enriched/events/OnMentionDetectedEvent.kt +10 -9
- package/android/src/main/java/com/swmansion/enriched/events/OnMentionEvent.kt +9 -8
- package/android/src/main/java/com/swmansion/enriched/events/OnRequestHtmlResultEvent.kt +32 -0
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedBlockQuoteSpan.kt +24 -5
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedBoldSpan.kt +8 -1
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedCodeBlockSpan.kt +10 -2
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedH1Span.kt +8 -1
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedH2Span.kt +8 -1
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedH3Span.kt +8 -1
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedH4Span.kt +24 -0
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedH5Span.kt +24 -0
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedH6Span.kt +24 -0
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedImageSpan.kt +34 -17
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedInlineCodeSpan.kt +8 -1
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedItalicSpan.kt +7 -1
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedLinkSpan.kt +10 -4
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedMentionSpan.kt +14 -11
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedOrderedListSpan.kt +18 -11
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedSpans.kt +174 -72
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedStrikeThroughSpan.kt +7 -1
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedUnderlineSpan.kt +7 -1
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedUnorderedListSpan.kt +11 -5
- package/android/src/main/java/com/swmansion/enriched/spans/interfaces/EnrichedBlockSpan.kt +3 -2
- package/android/src/main/java/com/swmansion/enriched/spans/interfaces/EnrichedHeadingSpan.kt +1 -2
- package/android/src/main/java/com/swmansion/enriched/spans/interfaces/EnrichedInlineSpan.kt +1 -2
- package/android/src/main/java/com/swmansion/enriched/spans/interfaces/EnrichedParagraphSpan.kt +3 -2
- package/android/src/main/java/com/swmansion/enriched/spans/interfaces/EnrichedSpan.kt +5 -0
- package/android/src/main/java/com/swmansion/enriched/spans/interfaces/EnrichedZeroWidthSpaceSpan.kt +1 -2
- package/android/src/main/java/com/swmansion/enriched/spans/utils/ForceRedrawSpan.kt +2 -1
- package/android/src/main/java/com/swmansion/enriched/styles/HtmlStyle.kt +155 -20
- package/android/src/main/java/com/swmansion/enriched/styles/InlineStyles.kt +25 -8
- package/android/src/main/java/com/swmansion/enriched/styles/ListStyles.kt +60 -20
- package/android/src/main/java/com/swmansion/enriched/styles/ParagraphStyles.kt +161 -25
- package/android/src/main/java/com/swmansion/enriched/styles/ParametrizedStyles.kt +128 -52
- package/android/src/main/java/com/swmansion/enriched/utils/AsyncDrawable.kt +10 -7
- package/android/src/main/java/com/swmansion/enriched/utils/EnrichedConstants.kt +11 -0
- package/android/src/main/java/com/swmansion/enriched/utils/EnrichedEditableFactory.kt +17 -0
- package/android/src/main/java/com/swmansion/enriched/utils/EnrichedParser.java +136 -87
- package/android/src/main/java/com/swmansion/enriched/utils/EnrichedSelection.kt +71 -42
- package/android/src/main/java/com/swmansion/enriched/utils/EnrichedSpanState.kt +183 -48
- package/android/src/main/java/com/swmansion/enriched/utils/EnrichedSpannable.kt +82 -0
- package/android/src/main/java/com/swmansion/enriched/utils/EnrichedSpannableStringBuilder.kt +15 -0
- package/android/src/main/java/com/swmansion/enriched/utils/Utils.kt +0 -70
- package/android/src/main/java/com/swmansion/enriched/watchers/EnrichedSpanWatcher.kt +46 -14
- package/android/src/main/java/com/swmansion/enriched/watchers/EnrichedTextWatcher.kt +34 -11
- package/android/src/main/new_arch/CMakeLists.txt +6 -0
- package/android/src/main/new_arch/RNEnrichedTextInputViewSpec.cpp +6 -6
- package/android/src/main/new_arch/RNEnrichedTextInputViewSpec.h +6 -6
- package/android/src/main/new_arch/react/renderer/components/RNEnrichedTextInputViewSpec/EnrichedTextInputComponentDescriptor.h +19 -19
- package/android/src/main/new_arch/react/renderer/components/RNEnrichedTextInputViewSpec/EnrichedTextInputMeasurementManager.cpp +40 -51
- package/android/src/main/new_arch/react/renderer/components/RNEnrichedTextInputViewSpec/EnrichedTextInputMeasurementManager.h +13 -15
- package/android/src/main/new_arch/react/renderer/components/RNEnrichedTextInputViewSpec/EnrichedTextInputShadowNode.cpp +23 -21
- package/android/src/main/new_arch/react/renderer/components/RNEnrichedTextInputViewSpec/EnrichedTextInputShadowNode.h +35 -36
- package/android/src/main/new_arch/react/renderer/components/RNEnrichedTextInputViewSpec/EnrichedTextInputState.cpp +4 -4
- package/android/src/main/new_arch/react/renderer/components/RNEnrichedTextInputViewSpec/EnrichedTextInputState.h +13 -14
- package/android/src/main/new_arch/react/renderer/components/RNEnrichedTextInputViewSpec/conversions.h +33 -14
- package/ios/EnrichedTextInputView.h +26 -14
- package/ios/EnrichedTextInputView.mm +1209 -586
- package/ios/config/InputConfig.h +24 -6
- package/ios/config/InputConfig.mm +154 -38
- package/ios/{utils → extensions}/ColorExtension.mm +7 -5
- package/ios/extensions/FontExtension.mm +106 -0
- package/ios/{utils → extensions}/LayoutManagerExtension.h +1 -1
- package/ios/extensions/LayoutManagerExtension.mm +396 -0
- package/ios/{utils → extensions}/StringExtension.mm +19 -16
- package/ios/generated/RNEnrichedTextInputViewSpec/EventEmitters.cpp +156 -0
- package/ios/generated/RNEnrichedTextInputViewSpec/EventEmitters.h +147 -0
- package/ios/generated/RNEnrichedTextInputViewSpec/Props.cpp +10 -0
- package/ios/generated/RNEnrichedTextInputViewSpec/Props.h +194 -0
- package/ios/generated/RNEnrichedTextInputViewSpec/RCTComponentViewHelpers.h +95 -0
- package/ios/inputParser/InputParser.h +5 -5
- package/ios/inputParser/InputParser.mm +864 -380
- package/ios/inputTextView/InputTextView.h +1 -1
- package/ios/inputTextView/InputTextView.mm +100 -59
- package/ios/{utils → interfaces}/BaseStyleProtocol.h +2 -2
- package/ios/interfaces/ImageAttachment.h +10 -0
- package/ios/interfaces/ImageAttachment.mm +36 -0
- package/ios/interfaces/LinkRegexConfig.h +19 -0
- package/ios/interfaces/LinkRegexConfig.mm +37 -0
- package/ios/interfaces/MediaAttachment.h +23 -0
- package/ios/interfaces/MediaAttachment.mm +31 -0
- package/ios/{utils → interfaces}/MentionParams.h +0 -1
- package/ios/{utils → interfaces}/MentionStyleProps.mm +27 -20
- package/ios/{utils → interfaces}/StyleHeaders.h +37 -15
- package/ios/{utils → interfaces}/StyleTypeEnum.h +3 -0
- package/ios/internals/EnrichedTextInputViewComponentDescriptor.h +11 -9
- package/ios/internals/EnrichedTextInputViewShadowNode.h +28 -25
- package/ios/internals/EnrichedTextInputViewShadowNode.mm +45 -40
- package/ios/internals/EnrichedTextInputViewState.h +3 -1
- package/ios/styles/BlockQuoteStyle.mm +189 -118
- package/ios/styles/BoldStyle.mm +110 -63
- package/ios/styles/CodeBlockStyle.mm +204 -128
- package/ios/styles/H1Style.mm +10 -4
- package/ios/styles/H2Style.mm +10 -4
- package/ios/styles/H3Style.mm +10 -4
- package/ios/styles/H4Style.mm +17 -0
- package/ios/styles/H5Style.mm +17 -0
- package/ios/styles/H6Style.mm +17 -0
- package/ios/styles/HeadingStyleBase.mm +148 -86
- package/ios/styles/ImageStyle.mm +75 -73
- package/ios/styles/InlineCodeStyle.mm +162 -88
- package/ios/styles/ItalicStyle.mm +76 -52
- package/ios/styles/LinkStyle.mm +411 -232
- package/ios/styles/MentionStyle.mm +363 -246
- package/ios/styles/OrderedListStyle.mm +171 -106
- package/ios/styles/StrikethroughStyle.mm +52 -35
- package/ios/styles/UnderlineStyle.mm +68 -46
- package/ios/styles/UnorderedListStyle.mm +169 -106
- package/ios/utils/OccurenceUtils.h +42 -42
- package/ios/utils/OccurenceUtils.mm +142 -119
- package/ios/utils/ParagraphAttributesUtils.h +10 -2
- package/ios/utils/ParagraphAttributesUtils.mm +182 -71
- package/ios/utils/ParagraphsUtils.h +2 -1
- package/ios/utils/ParagraphsUtils.mm +41 -27
- package/ios/utils/TextInsertionUtils.h +13 -2
- package/ios/utils/TextInsertionUtils.mm +38 -20
- package/ios/utils/WordsUtils.h +2 -1
- package/ios/utils/WordsUtils.mm +32 -22
- package/ios/utils/ZeroWidthSpaceUtils.h +3 -1
- package/ios/utils/ZeroWidthSpaceUtils.mm +145 -79
- package/lib/module/EnrichedTextInput.js +61 -2
- package/lib/module/EnrichedTextInput.js.map +1 -1
- package/lib/module/EnrichedTextInputNativeComponent.ts +149 -12
- package/lib/module/{normalizeHtmlStyle.js → utils/normalizeHtmlStyle.js} +12 -0
- package/lib/module/utils/normalizeHtmlStyle.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 +24 -14
- package/lib/typescript/src/EnrichedTextInput.d.ts.map +1 -1
- package/lib/typescript/src/EnrichedTextInputNativeComponent.d.ts +129 -12
- package/lib/typescript/src/EnrichedTextInputNativeComponent.d.ts.map +1 -1
- package/lib/typescript/src/index.d.ts +1 -1
- package/lib/typescript/src/index.d.ts.map +1 -1
- 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/regexParser.d.ts +3 -0
- package/lib/typescript/src/utils/regexParser.d.ts.map +1 -0
- package/package.json +17 -6
- package/src/EnrichedTextInput.tsx +96 -13
- package/src/EnrichedTextInputNativeComponent.ts +149 -12
- package/src/index.tsx +2 -0
- package/src/{normalizeHtmlStyle.ts → utils/normalizeHtmlStyle.ts} +14 -2
- package/src/utils/regexParser.ts +56 -0
- package/ios/utils/FontExtension.mm +0 -91
- package/ios/utils/LayoutManagerExtension.mm +0 -286
- package/lib/module/normalizeHtmlStyle.js.map +0 -1
- package/lib/typescript/src/normalizeHtmlStyle.d.ts +0 -4
- package/lib/typescript/src/normalizeHtmlStyle.d.ts.map +0 -1
- package/ios/{utils → extensions}/ColorExtension.h +0 -0
- package/ios/{utils → extensions}/FontExtension.h +0 -0
- package/ios/{utils → extensions}/StringExtension.h +1 -1
- 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/{utils → interfaces}/MentionParams.mm +0 -0
- package/ios/{utils → interfaces}/MentionStyleProps.h +1 -1
- /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
|
@@ -6,7 +6,12 @@ import android.text.style.MetricAffectingSpan
|
|
|
6
6
|
import com.swmansion.enriched.spans.interfaces.EnrichedInlineSpan
|
|
7
7
|
import com.swmansion.enriched.styles.HtmlStyle
|
|
8
8
|
|
|
9
|
-
class EnrichedInlineCodeSpan(
|
|
9
|
+
class EnrichedInlineCodeSpan(
|
|
10
|
+
private val htmlStyle: HtmlStyle,
|
|
11
|
+
) : MetricAffectingSpan(),
|
|
12
|
+
EnrichedInlineSpan {
|
|
13
|
+
override val dependsOnHtmlStyle: Boolean = true
|
|
14
|
+
|
|
10
15
|
override fun updateDrawState(textPaint: TextPaint) {
|
|
11
16
|
val typeface = Typeface.create(Typeface.MONOSPACE, Typeface.NORMAL)
|
|
12
17
|
textPaint.typeface = typeface
|
|
@@ -18,4 +23,6 @@ class EnrichedInlineCodeSpan(private val htmlStyle: HtmlStyle) : MetricAffecting
|
|
|
18
23
|
val typeface = Typeface.create(Typeface.MONOSPACE, Typeface.NORMAL)
|
|
19
24
|
textPaint.typeface = typeface
|
|
20
25
|
}
|
|
26
|
+
|
|
27
|
+
override fun rebuildWithStyle(htmlStyle: HtmlStyle): EnrichedInlineCodeSpan = EnrichedInlineCodeSpan(htmlStyle)
|
|
21
28
|
}
|
|
@@ -6,5 +6,11 @@ import com.swmansion.enriched.spans.interfaces.EnrichedInlineSpan
|
|
|
6
6
|
import com.swmansion.enriched.styles.HtmlStyle
|
|
7
7
|
|
|
8
8
|
@Suppress("UNUSED_PARAMETER")
|
|
9
|
-
class EnrichedItalicSpan(
|
|
9
|
+
class EnrichedItalicSpan(
|
|
10
|
+
private val htmlStyle: HtmlStyle,
|
|
11
|
+
) : StyleSpan(Typeface.ITALIC),
|
|
12
|
+
EnrichedInlineSpan {
|
|
13
|
+
override val dependsOnHtmlStyle: Boolean = false
|
|
14
|
+
|
|
15
|
+
override fun rebuildWithStyle(htmlStyle: HtmlStyle): EnrichedItalicSpan = EnrichedItalicSpan(htmlStyle)
|
|
10
16
|
}
|
|
@@ -6,7 +6,13 @@ import android.view.View
|
|
|
6
6
|
import com.swmansion.enriched.spans.interfaces.EnrichedInlineSpan
|
|
7
7
|
import com.swmansion.enriched.styles.HtmlStyle
|
|
8
8
|
|
|
9
|
-
class EnrichedLinkSpan(
|
|
9
|
+
class EnrichedLinkSpan(
|
|
10
|
+
private val url: String,
|
|
11
|
+
private val htmlStyle: HtmlStyle,
|
|
12
|
+
) : ClickableSpan(),
|
|
13
|
+
EnrichedInlineSpan {
|
|
14
|
+
override val dependsOnHtmlStyle: Boolean = true
|
|
15
|
+
|
|
10
16
|
override fun onClick(view: View) {
|
|
11
17
|
// Do nothing, links inside the input are not clickable.
|
|
12
18
|
// We are using `ClickableSpan` to allow the text to be styled as a link.
|
|
@@ -18,7 +24,7 @@ class EnrichedLinkSpan(private val url: String, private val htmlStyle: HtmlStyle
|
|
|
18
24
|
textPaint.isUnderlineText = htmlStyle.aUnderline
|
|
19
25
|
}
|
|
20
26
|
|
|
21
|
-
fun getUrl(): String
|
|
22
|
-
|
|
23
|
-
|
|
27
|
+
fun getUrl(): String = url
|
|
28
|
+
|
|
29
|
+
override fun rebuildWithStyle(htmlStyle: HtmlStyle): EnrichedLinkSpan = EnrichedLinkSpan(url, htmlStyle)
|
|
24
30
|
}
|
|
@@ -6,8 +6,15 @@ import android.view.View
|
|
|
6
6
|
import com.swmansion.enriched.spans.interfaces.EnrichedInlineSpan
|
|
7
7
|
import com.swmansion.enriched.styles.HtmlStyle
|
|
8
8
|
|
|
9
|
-
class EnrichedMentionSpan(
|
|
10
|
-
|
|
9
|
+
class EnrichedMentionSpan(
|
|
10
|
+
private val text: String,
|
|
11
|
+
private val indicator: String,
|
|
12
|
+
private val attributes: Map<String, String>,
|
|
13
|
+
private val htmlStyle: HtmlStyle,
|
|
14
|
+
) : ClickableSpan(),
|
|
15
|
+
EnrichedInlineSpan {
|
|
16
|
+
override val dependsOnHtmlStyle: Boolean = true
|
|
17
|
+
|
|
11
18
|
override fun onClick(view: View) {
|
|
12
19
|
// Do nothing. Mentions inside the input are not clickable.
|
|
13
20
|
// We are using `ClickableSpan` to allow the text to be styled as a clickable element.
|
|
@@ -22,15 +29,11 @@ class EnrichedMentionSpan(private val text: String, private val indicator: Strin
|
|
|
22
29
|
textPaint.isUnderlineText = mentionsStyle.underline
|
|
23
30
|
}
|
|
24
31
|
|
|
25
|
-
fun getAttributes(): Map<String, String>
|
|
26
|
-
return attributes
|
|
27
|
-
}
|
|
32
|
+
fun getAttributes(): Map<String, String> = attributes
|
|
28
33
|
|
|
29
|
-
fun getText(): String
|
|
30
|
-
return text
|
|
31
|
-
}
|
|
34
|
+
fun getText(): String = text
|
|
32
35
|
|
|
33
|
-
fun getIndicator(): String
|
|
34
|
-
|
|
35
|
-
|
|
36
|
+
fun getIndicator(): String = indicator
|
|
37
|
+
|
|
38
|
+
override fun rebuildWithStyle(htmlStyle: HtmlStyle): EnrichedMentionSpan = EnrichedMentionSpan(text, indicator, attributes, htmlStyle)
|
|
36
39
|
}
|
|
@@ -10,7 +10,14 @@ import android.text.style.MetricAffectingSpan
|
|
|
10
10
|
import com.swmansion.enriched.spans.interfaces.EnrichedParagraphSpan
|
|
11
11
|
import com.swmansion.enriched.styles.HtmlStyle
|
|
12
12
|
|
|
13
|
-
class EnrichedOrderedListSpan(
|
|
13
|
+
class EnrichedOrderedListSpan(
|
|
14
|
+
private var index: Int,
|
|
15
|
+
private val htmlStyle: HtmlStyle,
|
|
16
|
+
) : MetricAffectingSpan(),
|
|
17
|
+
LeadingMarginSpan,
|
|
18
|
+
EnrichedParagraphSpan {
|
|
19
|
+
override val dependsOnHtmlStyle: Boolean = true
|
|
20
|
+
|
|
14
21
|
override fun updateMeasureState(p0: TextPaint) {
|
|
15
22
|
// Do nothing, but inform layout that this span affects text metrics
|
|
16
23
|
}
|
|
@@ -19,9 +26,7 @@ class EnrichedOrderedListSpan(private var index: Int, private val htmlStyle: Htm
|
|
|
19
26
|
// Do nothing, but inform layout that this span affects text metrics
|
|
20
27
|
}
|
|
21
28
|
|
|
22
|
-
override fun getLeadingMargin(first: Boolean): Int
|
|
23
|
-
return htmlStyle.olMarginLeft + htmlStyle.olGapWidth
|
|
24
|
-
}
|
|
29
|
+
override fun getLeadingMargin(first: Boolean): Int = htmlStyle.olMarginLeft + htmlStyle.olGapWidth
|
|
25
30
|
|
|
26
31
|
override fun drawLeadingMargin(
|
|
27
32
|
canvas: Canvas,
|
|
@@ -35,7 +40,7 @@ class EnrichedOrderedListSpan(private var index: Int, private val htmlStyle: Htm
|
|
|
35
40
|
start: Int,
|
|
36
41
|
end: Int,
|
|
37
42
|
first: Boolean,
|
|
38
|
-
layout: Layout
|
|
43
|
+
layout: Layout?,
|
|
39
44
|
) {
|
|
40
45
|
if (first) {
|
|
41
46
|
val text = "$index."
|
|
@@ -56,8 +61,11 @@ class EnrichedOrderedListSpan(private var index: Int, private val htmlStyle: Htm
|
|
|
56
61
|
}
|
|
57
62
|
}
|
|
58
63
|
|
|
59
|
-
private fun getTypeface(
|
|
60
|
-
|
|
64
|
+
private fun getTypeface(
|
|
65
|
+
fontWeight: Int?,
|
|
66
|
+
originalTypeface: Typeface,
|
|
67
|
+
): Typeface =
|
|
68
|
+
if (fontWeight == null) {
|
|
61
69
|
originalTypeface
|
|
62
70
|
} else if (android.os.Build.VERSION.SDK_INT >= 28) {
|
|
63
71
|
Typeface.create(originalTypeface, fontWeight, false)
|
|
@@ -69,13 +77,12 @@ class EnrichedOrderedListSpan(private var index: Int, private val htmlStyle: Htm
|
|
|
69
77
|
Typeface.create(originalTypeface, Typeface.NORMAL)
|
|
70
78
|
}
|
|
71
79
|
}
|
|
72
|
-
}
|
|
73
80
|
|
|
74
|
-
fun getIndex(): Int
|
|
75
|
-
return index
|
|
76
|
-
}
|
|
81
|
+
fun getIndex(): Int = index
|
|
77
82
|
|
|
78
83
|
fun setIndex(i: Int) {
|
|
79
84
|
index = i
|
|
80
85
|
}
|
|
86
|
+
|
|
87
|
+
override fun rebuildWithStyle(htmlStyle: HtmlStyle): EnrichedOrderedListSpan = EnrichedOrderedListSpan(index, htmlStyle)
|
|
81
88
|
}
|
|
@@ -2,9 +2,23 @@ package com.swmansion.enriched.spans
|
|
|
2
2
|
|
|
3
3
|
import com.swmansion.enriched.styles.HtmlStyle
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
interface ISpanConfig {
|
|
6
|
+
val clazz: Class<*>
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
data class BaseSpanConfig(
|
|
10
|
+
override val clazz: Class<*>,
|
|
11
|
+
) : ISpanConfig
|
|
12
|
+
|
|
13
|
+
data class ParagraphSpanConfig(
|
|
14
|
+
override val clazz: Class<*>,
|
|
15
|
+
val isContinuous: Boolean,
|
|
16
|
+
) : ISpanConfig
|
|
17
|
+
|
|
18
|
+
data class ListSpanConfig(
|
|
19
|
+
override val clazz: Class<*>,
|
|
20
|
+
val shortcut: String,
|
|
21
|
+
) : ISpanConfig
|
|
8
22
|
|
|
9
23
|
data class StylesMergingConfig(
|
|
10
24
|
// styles that should be removed when we apply specific style
|
|
@@ -25,6 +39,9 @@ object EnrichedSpans {
|
|
|
25
39
|
const val H1 = "h1"
|
|
26
40
|
const val H2 = "h2"
|
|
27
41
|
const val H3 = "h3"
|
|
42
|
+
const val H4 = "h4"
|
|
43
|
+
const val H5 = "h5"
|
|
44
|
+
const val H6 = "h6"
|
|
28
45
|
const val BLOCK_QUOTE = "block_quote"
|
|
29
46
|
const val CODE_BLOCK = "code_block"
|
|
30
47
|
|
|
@@ -37,94 +54,179 @@ object EnrichedSpans {
|
|
|
37
54
|
const val IMAGE = "image"
|
|
38
55
|
const val MENTION = "mention"
|
|
39
56
|
|
|
40
|
-
val inlineSpans: Map<String, BaseSpanConfig> =
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
val
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
57
|
+
val inlineSpans: Map<String, BaseSpanConfig> =
|
|
58
|
+
mapOf(
|
|
59
|
+
BOLD to BaseSpanConfig(EnrichedBoldSpan::class.java),
|
|
60
|
+
ITALIC to BaseSpanConfig(EnrichedItalicSpan::class.java),
|
|
61
|
+
UNDERLINE to BaseSpanConfig(EnrichedUnderlineSpan::class.java),
|
|
62
|
+
STRIKETHROUGH to BaseSpanConfig(EnrichedStrikeThroughSpan::class.java),
|
|
63
|
+
INLINE_CODE to BaseSpanConfig(EnrichedInlineCodeSpan::class.java),
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
val paragraphSpans: Map<String, ParagraphSpanConfig> =
|
|
67
|
+
mapOf(
|
|
68
|
+
H1 to ParagraphSpanConfig(EnrichedH1Span::class.java, false),
|
|
69
|
+
H2 to ParagraphSpanConfig(EnrichedH2Span::class.java, false),
|
|
70
|
+
H3 to ParagraphSpanConfig(EnrichedH3Span::class.java, false),
|
|
71
|
+
H4 to ParagraphSpanConfig(EnrichedH4Span::class.java, false),
|
|
72
|
+
H5 to ParagraphSpanConfig(EnrichedH5Span::class.java, false),
|
|
73
|
+
H6 to ParagraphSpanConfig(EnrichedH6Span::class.java, false),
|
|
74
|
+
BLOCK_QUOTE to ParagraphSpanConfig(EnrichedBlockQuoteSpan::class.java, true),
|
|
75
|
+
CODE_BLOCK to ParagraphSpanConfig(EnrichedCodeBlockSpan::class.java, true),
|
|
76
|
+
)
|
|
77
|
+
|
|
78
|
+
val listSpans: Map<String, ListSpanConfig> =
|
|
79
|
+
mapOf(
|
|
80
|
+
UNORDERED_LIST to ListSpanConfig(EnrichedUnorderedListSpan::class.java, "- "),
|
|
81
|
+
ORDERED_LIST to ListSpanConfig(EnrichedOrderedListSpan::class.java, "1. "),
|
|
82
|
+
)
|
|
83
|
+
|
|
84
|
+
val parametrizedStyles: Map<String, BaseSpanConfig> =
|
|
85
|
+
mapOf(
|
|
86
|
+
LINK to BaseSpanConfig(EnrichedLinkSpan::class.java),
|
|
87
|
+
IMAGE to BaseSpanConfig(EnrichedImageSpan::class.java),
|
|
88
|
+
MENTION to BaseSpanConfig(EnrichedMentionSpan::class.java),
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
val allSpans: Map<String, ISpanConfig> = inlineSpans + paragraphSpans + listSpans + parametrizedStyles
|
|
92
|
+
|
|
93
|
+
fun getMergingConfigForStyle(
|
|
94
|
+
style: String,
|
|
95
|
+
htmlStyle: HtmlStyle,
|
|
96
|
+
): StylesMergingConfig? =
|
|
97
|
+
when (style) {
|
|
69
98
|
BOLD -> {
|
|
70
99
|
val blockingStyles = mutableListOf(CODE_BLOCK)
|
|
71
100
|
if (htmlStyle.h1Bold) blockingStyles.add(H1)
|
|
72
101
|
if (htmlStyle.h2Bold) blockingStyles.add(H2)
|
|
73
102
|
if (htmlStyle.h3Bold) blockingStyles.add(H3)
|
|
103
|
+
if (htmlStyle.h4Bold) blockingStyles.add(H4)
|
|
104
|
+
if (htmlStyle.h5Bold) blockingStyles.add(H5)
|
|
105
|
+
if (htmlStyle.h6Bold) blockingStyles.add(H6)
|
|
74
106
|
StylesMergingConfig(blockingStyles = blockingStyles.toTypedArray())
|
|
75
107
|
}
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
108
|
+
|
|
109
|
+
ITALIC -> {
|
|
110
|
+
StylesMergingConfig(
|
|
111
|
+
blockingStyles = arrayOf(CODE_BLOCK),
|
|
112
|
+
)
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
UNDERLINE -> {
|
|
116
|
+
StylesMergingConfig(
|
|
117
|
+
blockingStyles = arrayOf(CODE_BLOCK),
|
|
118
|
+
)
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
STRIKETHROUGH -> {
|
|
122
|
+
StylesMergingConfig(
|
|
123
|
+
blockingStyles = arrayOf(CODE_BLOCK),
|
|
124
|
+
)
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
INLINE_CODE -> {
|
|
128
|
+
StylesMergingConfig(
|
|
129
|
+
conflictingStyles = arrayOf(MENTION, LINK),
|
|
130
|
+
blockingStyles = arrayOf(CODE_BLOCK),
|
|
131
|
+
)
|
|
132
|
+
}
|
|
133
|
+
|
|
89
134
|
H1 -> {
|
|
90
|
-
val conflictingStyles = mutableListOf(H2, H3, ORDERED_LIST, UNORDERED_LIST, BLOCK_QUOTE, CODE_BLOCK)
|
|
135
|
+
val conflictingStyles = mutableListOf(H2, H3, H4, H5, H6, ORDERED_LIST, UNORDERED_LIST, BLOCK_QUOTE, CODE_BLOCK)
|
|
91
136
|
if (htmlStyle.h1Bold) conflictingStyles.add(BOLD)
|
|
92
137
|
StylesMergingConfig(conflictingStyles = conflictingStyles.toTypedArray())
|
|
93
138
|
}
|
|
139
|
+
|
|
94
140
|
H2 -> {
|
|
95
|
-
val conflictingStyles = mutableListOf(H1, H3, ORDERED_LIST, UNORDERED_LIST, BLOCK_QUOTE, CODE_BLOCK)
|
|
141
|
+
val conflictingStyles = mutableListOf(H1, H3, H4, H5, H6, ORDERED_LIST, UNORDERED_LIST, BLOCK_QUOTE, CODE_BLOCK)
|
|
96
142
|
if (htmlStyle.h2Bold) conflictingStyles.add(BOLD)
|
|
97
143
|
StylesMergingConfig(conflictingStyles = conflictingStyles.toTypedArray())
|
|
98
144
|
}
|
|
145
|
+
|
|
99
146
|
H3 -> {
|
|
100
|
-
val conflictingStyles = mutableListOf(H1, H2, ORDERED_LIST, UNORDERED_LIST, BLOCK_QUOTE, CODE_BLOCK)
|
|
147
|
+
val conflictingStyles = mutableListOf(H1, H2, H4, H5, H6, ORDERED_LIST, UNORDERED_LIST, BLOCK_QUOTE, CODE_BLOCK)
|
|
101
148
|
if (htmlStyle.h3Bold) conflictingStyles.add(BOLD)
|
|
102
149
|
StylesMergingConfig(conflictingStyles = conflictingStyles.toTypedArray())
|
|
103
150
|
}
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
conflictingStyles =
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
conflictingStyles =
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
151
|
+
|
|
152
|
+
H4 -> {
|
|
153
|
+
val conflictingStyles = mutableListOf(H1, H2, H3, H5, H6, ORDERED_LIST, UNORDERED_LIST, BLOCK_QUOTE, CODE_BLOCK)
|
|
154
|
+
if (htmlStyle.h4Bold) conflictingStyles.add(BOLD)
|
|
155
|
+
StylesMergingConfig(conflictingStyles = conflictingStyles.toTypedArray())
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
H5 -> {
|
|
159
|
+
val conflictingStyles = mutableListOf(H1, H2, H3, H4, H6, ORDERED_LIST, UNORDERED_LIST, BLOCK_QUOTE, CODE_BLOCK)
|
|
160
|
+
if (htmlStyle.h5Bold) conflictingStyles.add(BOLD)
|
|
161
|
+
StylesMergingConfig(conflictingStyles = conflictingStyles.toTypedArray())
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
H6 -> {
|
|
165
|
+
val conflictingStyles = mutableListOf(H1, H2, H3, H4, H5, ORDERED_LIST, UNORDERED_LIST, BLOCK_QUOTE, CODE_BLOCK)
|
|
166
|
+
if (htmlStyle.h6Bold) conflictingStyles.add(BOLD)
|
|
167
|
+
StylesMergingConfig(conflictingStyles = conflictingStyles.toTypedArray())
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
BLOCK_QUOTE -> {
|
|
171
|
+
StylesMergingConfig(
|
|
172
|
+
conflictingStyles = arrayOf(H1, H2, H3, H4, H5, H6, CODE_BLOCK, ORDERED_LIST, UNORDERED_LIST),
|
|
173
|
+
)
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
CODE_BLOCK -> {
|
|
177
|
+
StylesMergingConfig(
|
|
178
|
+
conflictingStyles =
|
|
179
|
+
arrayOf(
|
|
180
|
+
H1,
|
|
181
|
+
H2,
|
|
182
|
+
H3,
|
|
183
|
+
H4,
|
|
184
|
+
H5,
|
|
185
|
+
H6,
|
|
186
|
+
BOLD,
|
|
187
|
+
ITALIC,
|
|
188
|
+
UNDERLINE,
|
|
189
|
+
STRIKETHROUGH,
|
|
190
|
+
UNORDERED_LIST,
|
|
191
|
+
ORDERED_LIST,
|
|
192
|
+
BLOCK_QUOTE,
|
|
193
|
+
INLINE_CODE,
|
|
194
|
+
),
|
|
195
|
+
)
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
UNORDERED_LIST -> {
|
|
199
|
+
StylesMergingConfig(
|
|
200
|
+
conflictingStyles = arrayOf(H1, H2, H3, H4, H5, H6, ORDERED_LIST, CODE_BLOCK, BLOCK_QUOTE),
|
|
201
|
+
)
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
ORDERED_LIST -> {
|
|
205
|
+
StylesMergingConfig(
|
|
206
|
+
conflictingStyles = arrayOf(H1, H2, H3, H4, H5, H6, UNORDERED_LIST, CODE_BLOCK, BLOCK_QUOTE),
|
|
207
|
+
)
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
LINK -> {
|
|
211
|
+
StylesMergingConfig(
|
|
212
|
+
blockingStyles = arrayOf(INLINE_CODE, CODE_BLOCK, MENTION),
|
|
213
|
+
)
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
IMAGE -> {
|
|
217
|
+
StylesMergingConfig()
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
MENTION -> {
|
|
221
|
+
StylesMergingConfig(
|
|
222
|
+
blockingStyles = arrayOf(INLINE_CODE, CODE_BLOCK, LINK),
|
|
223
|
+
)
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
else -> {
|
|
227
|
+
null
|
|
228
|
+
}
|
|
124
229
|
}
|
|
125
|
-
}
|
|
126
230
|
|
|
127
|
-
fun isTypeContinuous(type: Class<*>): Boolean {
|
|
128
|
-
return paragraphSpans.values.find { it.clazz == type }?.isContinuous == true
|
|
129
|
-
}
|
|
231
|
+
fun isTypeContinuous(type: Class<*>): Boolean = paragraphSpans.values.find { it.clazz == type }?.isContinuous == true
|
|
130
232
|
}
|
|
@@ -5,5 +5,11 @@ import com.swmansion.enriched.spans.interfaces.EnrichedInlineSpan
|
|
|
5
5
|
import com.swmansion.enriched.styles.HtmlStyle
|
|
6
6
|
|
|
7
7
|
@Suppress("UNUSED_PARAMETER")
|
|
8
|
-
class EnrichedStrikeThroughSpan(
|
|
8
|
+
class EnrichedStrikeThroughSpan(
|
|
9
|
+
private val htmlStyle: HtmlStyle,
|
|
10
|
+
) : StrikethroughSpan(),
|
|
11
|
+
EnrichedInlineSpan {
|
|
12
|
+
override val dependsOnHtmlStyle: Boolean = false
|
|
13
|
+
|
|
14
|
+
override fun rebuildWithStyle(htmlStyle: HtmlStyle): EnrichedStrikeThroughSpan = EnrichedStrikeThroughSpan(htmlStyle)
|
|
9
15
|
}
|
|
@@ -5,5 +5,11 @@ import com.swmansion.enriched.spans.interfaces.EnrichedInlineSpan
|
|
|
5
5
|
import com.swmansion.enriched.styles.HtmlStyle
|
|
6
6
|
|
|
7
7
|
@Suppress("UNUSED_PARAMETER")
|
|
8
|
-
class EnrichedUnderlineSpan(
|
|
8
|
+
class EnrichedUnderlineSpan(
|
|
9
|
+
private val htmlStyle: HtmlStyle,
|
|
10
|
+
) : UnderlineSpan(),
|
|
11
|
+
EnrichedInlineSpan {
|
|
12
|
+
override val dependsOnHtmlStyle: Boolean = false
|
|
13
|
+
|
|
14
|
+
override fun rebuildWithStyle(htmlStyle: HtmlStyle): EnrichedUnderlineSpan = EnrichedUnderlineSpan(htmlStyle)
|
|
9
15
|
}
|
|
@@ -11,7 +11,13 @@ import com.swmansion.enriched.spans.interfaces.EnrichedParagraphSpan
|
|
|
11
11
|
import com.swmansion.enriched.styles.HtmlStyle
|
|
12
12
|
|
|
13
13
|
// https://android.googlesource.com/platform/frameworks/base/+/refs/heads/main/core/java/android/text/style/BulletSpan.java
|
|
14
|
-
class EnrichedUnorderedListSpan(
|
|
14
|
+
class EnrichedUnorderedListSpan(
|
|
15
|
+
private val htmlStyle: HtmlStyle,
|
|
16
|
+
) : MetricAffectingSpan(),
|
|
17
|
+
LeadingMarginSpan,
|
|
18
|
+
EnrichedParagraphSpan {
|
|
19
|
+
override val dependsOnHtmlStyle: Boolean = true
|
|
20
|
+
|
|
15
21
|
override fun updateMeasureState(p0: TextPaint) {
|
|
16
22
|
// Do nothing, but inform layout that this span affects text metrics
|
|
17
23
|
}
|
|
@@ -20,9 +26,7 @@ class EnrichedUnorderedListSpan(private val htmlStyle: HtmlStyle) : MetricAffect
|
|
|
20
26
|
// Do nothing, but inform layout that this span affects text metrics
|
|
21
27
|
}
|
|
22
28
|
|
|
23
|
-
override fun getLeadingMargin(p0: Boolean): Int
|
|
24
|
-
return htmlStyle.ulBulletSize + htmlStyle.ulGapWidth + htmlStyle.ulMarginLeft
|
|
25
|
-
}
|
|
29
|
+
override fun getLeadingMargin(p0: Boolean): Int = htmlStyle.ulBulletSize + htmlStyle.ulGapWidth + htmlStyle.ulMarginLeft
|
|
26
30
|
|
|
27
31
|
override fun drawLeadingMargin(
|
|
28
32
|
canvas: Canvas,
|
|
@@ -36,7 +40,7 @@ class EnrichedUnorderedListSpan(private val htmlStyle: HtmlStyle) : MetricAffect
|
|
|
36
40
|
start: Int,
|
|
37
41
|
end: Int,
|
|
38
42
|
first: Boolean,
|
|
39
|
-
layout: Layout
|
|
43
|
+
layout: Layout?,
|
|
40
44
|
) {
|
|
41
45
|
val spannedText = text as Spanned
|
|
42
46
|
|
|
@@ -56,4 +60,6 @@ class EnrichedUnorderedListSpan(private val htmlStyle: HtmlStyle) : MetricAffect
|
|
|
56
60
|
paint.style = style
|
|
57
61
|
}
|
|
58
62
|
}
|
|
63
|
+
|
|
64
|
+
override fun rebuildWithStyle(htmlStyle: HtmlStyle): EnrichedUnorderedListSpan = EnrichedUnorderedListSpan(htmlStyle)
|
|
59
65
|
}
|
|
@@ -3,10 +3,11 @@ package com.swmansion.enriched.spans.utils
|
|
|
3
3
|
import android.text.TextPaint
|
|
4
4
|
import android.text.style.MetricAffectingSpan
|
|
5
5
|
|
|
6
|
-
class ForceRedrawSpan:
|
|
6
|
+
class ForceRedrawSpan : MetricAffectingSpan() {
|
|
7
7
|
override fun updateMeasureState(tp: TextPaint) {
|
|
8
8
|
// Do nothing, we don't actually want to change how it looks
|
|
9
9
|
}
|
|
10
|
+
|
|
10
11
|
override fun updateDrawState(tp: TextPaint?) {
|
|
11
12
|
// Do nothing
|
|
12
13
|
}
|