react-native-enriched 0.2.1 → 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 +15 -12
- package/android/build.gradle +77 -72
- package/android/generated/java/com/facebook/react/viewmanagers/EnrichedTextInputViewManagerDelegate.java +18 -0
- package/android/generated/java/com/facebook/react/viewmanagers/EnrichedTextInputViewManagerInterface.java +6 -0
- package/android/generated/jni/react/renderer/components/RNEnrichedTextInputViewSpec/EventEmitters.cpp +146 -0
- package/android/generated/jni/react/renderer/components/RNEnrichedTextInputViewSpec/EventEmitters.h +140 -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 +245 -116
- package/android/src/main/java/com/swmansion/enriched/EnrichedTextInputViewLayoutManager.kt +3 -1
- package/android/src/main/java/com/swmansion/enriched/EnrichedTextInputViewManager.kt +162 -53
- 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 +20 -10
- 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 +1 -2
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedBlockQuoteSpan.kt +21 -8
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedBoldSpan.kt +5 -4
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedCodeBlockSpan.kt +7 -5
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedH1Span.kt +5 -4
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedH2Span.kt +5 -4
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedH3Span.kt +5 -4
- 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 +29 -17
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedInlineCodeSpan.kt +5 -4
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedItalicSpan.kt +5 -4
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedLinkSpan.kt +7 -7
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedMentionSpan.kt +11 -14
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedOrderedListSpan.kt +15 -14
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedSpans.kt +167 -71
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedStrikeThroughSpan.kt +5 -4
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedUnderlineSpan.kt +5 -4
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedUnorderedListSpan.kt +8 -8
- 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 +1 -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 +78 -21
- 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 +86 -26
- 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 +128 -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/react/renderer/components/RNEnrichedTextInputViewSpec/conversions.h +21 -1
- package/ios/EnrichedTextInputView.h +1 -1
- package/ios/EnrichedTextInputView.mm +381 -49
- package/ios/config/InputConfig.h +18 -0
- package/ios/config/InputConfig.mm +118 -8
- package/ios/generated/RNEnrichedTextInputViewSpec/EventEmitters.cpp +146 -0
- package/ios/generated/RNEnrichedTextInputViewSpec/EventEmitters.h +140 -0
- package/ios/generated/RNEnrichedTextInputViewSpec/Props.cpp +10 -0
- package/ios/generated/RNEnrichedTextInputViewSpec/Props.h +194 -0
- package/ios/generated/RNEnrichedTextInputViewSpec/RCTComponentViewHelpers.h +74 -0
- package/ios/inputParser/InputParser.mm +83 -10
- package/ios/{attachments → interfaces}/ImageAttachment.mm +3 -1
- 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 +10 -0
- package/ios/{utils → interfaces}/StyleTypeEnum.h +3 -0
- package/ios/styles/BlockQuoteStyle.mm +5 -5
- package/ios/styles/BoldStyle.mm +21 -6
- package/ios/styles/CodeBlockStyle.mm +5 -5
- 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 +27 -10
- 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/ParagraphAttributesUtils.h +4 -0
- package/ios/utils/ParagraphAttributesUtils.mm +67 -0
- package/ios/utils/ParagraphsUtils.mm +4 -4
- package/lib/module/EnrichedTextInput.js +22 -1
- package/lib/module/EnrichedTextInput.js.map +1 -1
- package/lib/module/EnrichedTextInputNativeComponent.ts +138 -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 +23 -14
- package/lib/typescript/src/EnrichedTextInput.d.ts.map +1 -1
- package/lib/typescript/src/EnrichedTextInputNativeComponent.d.ts +123 -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 +10 -6
- package/src/EnrichedTextInput.tsx +51 -13
- package/src/EnrichedTextInputNativeComponent.ts +138 -12
- package/src/index.tsx +2 -0
- package/src/{normalizeHtmlStyle.ts → utils/normalizeHtmlStyle.ts} +14 -2
- package/src/utils/regexParser.ts +56 -0
- 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}/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}/LayoutManagerExtension.mm +0 -0
- /package/ios/{utils → extensions}/StringExtension.h +0 -0
- /package/ios/{utils → extensions}/StringExtension.mm +0 -0
- /package/ios/{utils → interfaces}/BaseStyleProtocol.h +0 -0
- /package/ios/{attachments → interfaces}/ImageAttachment.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
|
@@ -6,10 +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 {
|
|
10
13
|
override val dependsOnHtmlStyle: Boolean = false
|
|
11
14
|
|
|
12
|
-
override fun rebuildWithStyle(htmlStyle: HtmlStyle): EnrichedItalicSpan
|
|
13
|
-
return EnrichedItalicSpan(htmlStyle)
|
|
14
|
-
}
|
|
15
|
+
override fun rebuildWithStyle(htmlStyle: HtmlStyle): EnrichedItalicSpan = EnrichedItalicSpan(htmlStyle)
|
|
15
16
|
}
|
|
@@ -6,7 +6,11 @@ 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 {
|
|
10
14
|
override val dependsOnHtmlStyle: Boolean = true
|
|
11
15
|
|
|
12
16
|
override fun onClick(view: View) {
|
|
@@ -20,11 +24,7 @@ class EnrichedLinkSpan(private val url: String, private val htmlStyle: HtmlStyle
|
|
|
20
24
|
textPaint.isUnderlineText = htmlStyle.aUnderline
|
|
21
25
|
}
|
|
22
26
|
|
|
23
|
-
fun getUrl(): String
|
|
24
|
-
return url
|
|
25
|
-
}
|
|
27
|
+
fun getUrl(): String = url
|
|
26
28
|
|
|
27
|
-
override fun rebuildWithStyle(htmlStyle: HtmlStyle): EnrichedLinkSpan
|
|
28
|
-
return EnrichedLinkSpan(url, htmlStyle)
|
|
29
|
-
}
|
|
29
|
+
override fun rebuildWithStyle(htmlStyle: HtmlStyle): EnrichedLinkSpan = EnrichedLinkSpan(url, htmlStyle)
|
|
30
30
|
}
|
|
@@ -6,8 +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 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 {
|
|
11
16
|
override val dependsOnHtmlStyle: Boolean = true
|
|
12
17
|
|
|
13
18
|
override fun onClick(view: View) {
|
|
@@ -24,19 +29,11 @@ class EnrichedMentionSpan(private val text: String, private val indicator: Strin
|
|
|
24
29
|
textPaint.isUnderlineText = mentionsStyle.underline
|
|
25
30
|
}
|
|
26
31
|
|
|
27
|
-
fun getAttributes(): Map<String, String>
|
|
28
|
-
return attributes
|
|
29
|
-
}
|
|
32
|
+
fun getAttributes(): Map<String, String> = attributes
|
|
30
33
|
|
|
31
|
-
fun getText(): String
|
|
32
|
-
return text
|
|
33
|
-
}
|
|
34
|
+
fun getText(): String = text
|
|
34
35
|
|
|
35
|
-
fun getIndicator(): String
|
|
36
|
-
return indicator
|
|
37
|
-
}
|
|
36
|
+
fun getIndicator(): String = indicator
|
|
38
37
|
|
|
39
|
-
override fun rebuildWithStyle(htmlStyle: HtmlStyle): EnrichedMentionSpan
|
|
40
|
-
return EnrichedMentionSpan(text, indicator, attributes, htmlStyle)
|
|
41
|
-
}
|
|
38
|
+
override fun rebuildWithStyle(htmlStyle: HtmlStyle): EnrichedMentionSpan = EnrichedMentionSpan(text, indicator, attributes, htmlStyle)
|
|
42
39
|
}
|
|
@@ -10,7 +10,12 @@ 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 {
|
|
14
19
|
override val dependsOnHtmlStyle: Boolean = true
|
|
15
20
|
|
|
16
21
|
override fun updateMeasureState(p0: TextPaint) {
|
|
@@ -21,9 +26,7 @@ class EnrichedOrderedListSpan(private var index: Int, private val htmlStyle: Htm
|
|
|
21
26
|
// Do nothing, but inform layout that this span affects text metrics
|
|
22
27
|
}
|
|
23
28
|
|
|
24
|
-
override fun getLeadingMargin(first: Boolean): Int
|
|
25
|
-
return htmlStyle.olMarginLeft + htmlStyle.olGapWidth
|
|
26
|
-
}
|
|
29
|
+
override fun getLeadingMargin(first: Boolean): Int = htmlStyle.olMarginLeft + htmlStyle.olGapWidth
|
|
27
30
|
|
|
28
31
|
override fun drawLeadingMargin(
|
|
29
32
|
canvas: Canvas,
|
|
@@ -37,7 +40,7 @@ class EnrichedOrderedListSpan(private var index: Int, private val htmlStyle: Htm
|
|
|
37
40
|
start: Int,
|
|
38
41
|
end: Int,
|
|
39
42
|
first: Boolean,
|
|
40
|
-
layout: Layout
|
|
43
|
+
layout: Layout?,
|
|
41
44
|
) {
|
|
42
45
|
if (first) {
|
|
43
46
|
val text = "$index."
|
|
@@ -58,8 +61,11 @@ class EnrichedOrderedListSpan(private var index: Int, private val htmlStyle: Htm
|
|
|
58
61
|
}
|
|
59
62
|
}
|
|
60
63
|
|
|
61
|
-
private fun getTypeface(
|
|
62
|
-
|
|
64
|
+
private fun getTypeface(
|
|
65
|
+
fontWeight: Int?,
|
|
66
|
+
originalTypeface: Typeface,
|
|
67
|
+
): Typeface =
|
|
68
|
+
if (fontWeight == null) {
|
|
63
69
|
originalTypeface
|
|
64
70
|
} else if (android.os.Build.VERSION.SDK_INT >= 28) {
|
|
65
71
|
Typeface.create(originalTypeface, fontWeight, false)
|
|
@@ -71,17 +77,12 @@ class EnrichedOrderedListSpan(private var index: Int, private val htmlStyle: Htm
|
|
|
71
77
|
Typeface.create(originalTypeface, Typeface.NORMAL)
|
|
72
78
|
}
|
|
73
79
|
}
|
|
74
|
-
}
|
|
75
80
|
|
|
76
|
-
fun getIndex(): Int
|
|
77
|
-
return index
|
|
78
|
-
}
|
|
81
|
+
fun getIndex(): Int = index
|
|
79
82
|
|
|
80
83
|
fun setIndex(i: Int) {
|
|
81
84
|
index = i
|
|
82
85
|
}
|
|
83
86
|
|
|
84
|
-
override fun rebuildWithStyle(htmlStyle: HtmlStyle): EnrichedOrderedListSpan
|
|
85
|
-
return EnrichedOrderedListSpan(index, htmlStyle)
|
|
86
|
-
}
|
|
87
|
+
override fun rebuildWithStyle(htmlStyle: HtmlStyle): EnrichedOrderedListSpan = EnrichedOrderedListSpan(index, htmlStyle)
|
|
87
88
|
}
|
|
@@ -6,9 +6,19 @@ interface ISpanConfig {
|
|
|
6
6
|
val clazz: Class<*>
|
|
7
7
|
}
|
|
8
8
|
|
|
9
|
-
data class BaseSpanConfig(
|
|
10
|
-
|
|
11
|
-
|
|
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
|
|
12
22
|
|
|
13
23
|
data class StylesMergingConfig(
|
|
14
24
|
// styles that should be removed when we apply specific style
|
|
@@ -29,6 +39,9 @@ object EnrichedSpans {
|
|
|
29
39
|
const val H1 = "h1"
|
|
30
40
|
const val H2 = "h2"
|
|
31
41
|
const val H3 = "h3"
|
|
42
|
+
const val H4 = "h4"
|
|
43
|
+
const val H5 = "h5"
|
|
44
|
+
const val H6 = "h6"
|
|
32
45
|
const val BLOCK_QUOTE = "block_quote"
|
|
33
46
|
const val CODE_BLOCK = "code_block"
|
|
34
47
|
|
|
@@ -41,96 +54,179 @@ object EnrichedSpans {
|
|
|
41
54
|
const val IMAGE = "image"
|
|
42
55
|
const val MENTION = "mention"
|
|
43
56
|
|
|
44
|
-
val inlineSpans: Map<String, BaseSpanConfig> =
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
val
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
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
|
+
)
|
|
70
90
|
|
|
71
91
|
val allSpans: Map<String, ISpanConfig> = inlineSpans + paragraphSpans + listSpans + parametrizedStyles
|
|
72
92
|
|
|
73
|
-
fun getMergingConfigForStyle(
|
|
74
|
-
|
|
93
|
+
fun getMergingConfigForStyle(
|
|
94
|
+
style: String,
|
|
95
|
+
htmlStyle: HtmlStyle,
|
|
96
|
+
): StylesMergingConfig? =
|
|
97
|
+
when (style) {
|
|
75
98
|
BOLD -> {
|
|
76
99
|
val blockingStyles = mutableListOf(CODE_BLOCK)
|
|
77
100
|
if (htmlStyle.h1Bold) blockingStyles.add(H1)
|
|
78
101
|
if (htmlStyle.h2Bold) blockingStyles.add(H2)
|
|
79
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)
|
|
80
106
|
StylesMergingConfig(blockingStyles = blockingStyles.toTypedArray())
|
|
81
107
|
}
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
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
|
+
|
|
95
134
|
H1 -> {
|
|
96
|
-
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)
|
|
97
136
|
if (htmlStyle.h1Bold) conflictingStyles.add(BOLD)
|
|
98
137
|
StylesMergingConfig(conflictingStyles = conflictingStyles.toTypedArray())
|
|
99
138
|
}
|
|
139
|
+
|
|
100
140
|
H2 -> {
|
|
101
|
-
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)
|
|
102
142
|
if (htmlStyle.h2Bold) conflictingStyles.add(BOLD)
|
|
103
143
|
StylesMergingConfig(conflictingStyles = conflictingStyles.toTypedArray())
|
|
104
144
|
}
|
|
145
|
+
|
|
105
146
|
H3 -> {
|
|
106
|
-
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)
|
|
107
148
|
if (htmlStyle.h3Bold) conflictingStyles.add(BOLD)
|
|
108
149
|
StylesMergingConfig(conflictingStyles = conflictingStyles.toTypedArray())
|
|
109
150
|
}
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
conflictingStyles =
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
conflictingStyles =
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
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
|
+
}
|
|
130
229
|
}
|
|
131
|
-
}
|
|
132
230
|
|
|
133
|
-
fun isTypeContinuous(type: Class<*>): Boolean {
|
|
134
|
-
return paragraphSpans.values.find { it.clazz == type }?.isContinuous == true
|
|
135
|
-
}
|
|
231
|
+
fun isTypeContinuous(type: Class<*>): Boolean = paragraphSpans.values.find { it.clazz == type }?.isContinuous == true
|
|
136
232
|
}
|
|
@@ -5,10 +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 {
|
|
9
12
|
override val dependsOnHtmlStyle: Boolean = false
|
|
10
13
|
|
|
11
|
-
override fun rebuildWithStyle(htmlStyle: HtmlStyle): EnrichedStrikeThroughSpan
|
|
12
|
-
return EnrichedStrikeThroughSpan(htmlStyle)
|
|
13
|
-
}
|
|
14
|
+
override fun rebuildWithStyle(htmlStyle: HtmlStyle): EnrichedStrikeThroughSpan = EnrichedStrikeThroughSpan(htmlStyle)
|
|
14
15
|
}
|
|
@@ -5,10 +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 {
|
|
9
12
|
override val dependsOnHtmlStyle: Boolean = false
|
|
10
13
|
|
|
11
|
-
override fun rebuildWithStyle(htmlStyle: HtmlStyle): EnrichedUnderlineSpan
|
|
12
|
-
return EnrichedUnderlineSpan(htmlStyle)
|
|
13
|
-
}
|
|
14
|
+
override fun rebuildWithStyle(htmlStyle: HtmlStyle): EnrichedUnderlineSpan = EnrichedUnderlineSpan(htmlStyle)
|
|
14
15
|
}
|
|
@@ -11,7 +11,11 @@ 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 {
|
|
15
19
|
override val dependsOnHtmlStyle: Boolean = true
|
|
16
20
|
|
|
17
21
|
override fun updateMeasureState(p0: TextPaint) {
|
|
@@ -22,9 +26,7 @@ class EnrichedUnorderedListSpan(private val htmlStyle: HtmlStyle) : MetricAffect
|
|
|
22
26
|
// Do nothing, but inform layout that this span affects text metrics
|
|
23
27
|
}
|
|
24
28
|
|
|
25
|
-
override fun getLeadingMargin(p0: Boolean): Int
|
|
26
|
-
return htmlStyle.ulBulletSize + htmlStyle.ulGapWidth + htmlStyle.ulMarginLeft
|
|
27
|
-
}
|
|
29
|
+
override fun getLeadingMargin(p0: Boolean): Int = htmlStyle.ulBulletSize + htmlStyle.ulGapWidth + htmlStyle.ulMarginLeft
|
|
28
30
|
|
|
29
31
|
override fun drawLeadingMargin(
|
|
30
32
|
canvas: Canvas,
|
|
@@ -38,7 +40,7 @@ class EnrichedUnorderedListSpan(private val htmlStyle: HtmlStyle) : MetricAffect
|
|
|
38
40
|
start: Int,
|
|
39
41
|
end: Int,
|
|
40
42
|
first: Boolean,
|
|
41
|
-
layout: Layout
|
|
43
|
+
layout: Layout?,
|
|
42
44
|
) {
|
|
43
45
|
val spannedText = text as Spanned
|
|
44
46
|
|
|
@@ -59,7 +61,5 @@ class EnrichedUnorderedListSpan(private val htmlStyle: HtmlStyle) : MetricAffect
|
|
|
59
61
|
}
|
|
60
62
|
}
|
|
61
63
|
|
|
62
|
-
override fun rebuildWithStyle(htmlStyle: HtmlStyle): EnrichedUnorderedListSpan
|
|
63
|
-
return EnrichedUnorderedListSpan(htmlStyle)
|
|
64
|
-
}
|
|
64
|
+
override fun rebuildWithStyle(htmlStyle: HtmlStyle): EnrichedUnorderedListSpan = EnrichedUnorderedListSpan(htmlStyle)
|
|
65
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
|
}
|