-
Notifications
You must be signed in to change notification settings - Fork 66
Expand file tree
/
Copy pathEnrichedSpans.kt
More file actions
126 lines (114 loc) · 4.9 KB
/
Copy pathEnrichedSpans.kt
File metadata and controls
126 lines (114 loc) · 4.9 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
package com.swmansion.enriched.spans
import com.swmansion.enriched.styles.HtmlStyle
data class BaseSpanConfig(val clazz: Class<*>)
data class ParagraphSpanConfig(val clazz: Class<*>, val isContinuous: Boolean)
data class ListSpanConfig(val clazz: Class<*>, val shortcut: String)
data class StylesMergingConfig(
// styles that should be removed when we apply specific style
val conflictingStyles: Array<String> = emptyArray(),
// styles that should block setting specific style
val blockingStyles: Array<String> = emptyArray(),
)
object EnrichedSpans {
// inline styles
const val BOLD = "bold"
const val ITALIC = "italic"
const val UNDERLINE = "underline"
const val STRIKETHROUGH = "strikethrough"
const val INLINE_CODE = "inline_code"
// paragraph styles
const val H1 = "h1"
const val H2 = "h2"
const val H3 = "h3"
const val BLOCK_QUOTE = "block_quote"
const val CODE_BLOCK = "code_block"
// list styles
const val UNORDERED_LIST = "unordered_list"
const val ORDERED_LIST = "ordered_list"
// parametrized styles
const val LINK = "link"
const val IMAGE = "image"
const val MENTION = "mention"
val inlineSpans: Map<String, BaseSpanConfig> = mapOf(
BOLD to BaseSpanConfig(EnrichedBoldSpan::class.java),
ITALIC to BaseSpanConfig(EnrichedItalicSpan::class.java),
UNDERLINE to BaseSpanConfig(EnrichedUnderlineSpan::class.java),
STRIKETHROUGH to BaseSpanConfig(EnrichedStrikeThroughSpan::class.java),
INLINE_CODE to BaseSpanConfig(EnrichedInlineCodeSpan::class.java),
)
val paragraphSpans: Map<String, ParagraphSpanConfig> = mapOf(
H1 to ParagraphSpanConfig(EnrichedH1Span::class.java, false),
H2 to ParagraphSpanConfig(EnrichedH2Span::class.java, false),
H3 to ParagraphSpanConfig(EnrichedH3Span::class.java, false),
BLOCK_QUOTE to ParagraphSpanConfig(EnrichedBlockQuoteSpan::class.java, true),
CODE_BLOCK to ParagraphSpanConfig(EnrichedCodeBlockSpan::class.java, true),
)
val listSpans: Map<String, ListSpanConfig> = mapOf(
UNORDERED_LIST to ListSpanConfig(EnrichedUnorderedListSpan::class.java, "- "),
ORDERED_LIST to ListSpanConfig(EnrichedOrderedListSpan::class.java, "1. "),
)
val parametrizedStyles: Map<String, BaseSpanConfig> = mapOf(
LINK to BaseSpanConfig(EnrichedLinkSpan::class.java),
IMAGE to BaseSpanConfig(EnrichedImageSpan::class.java),
MENTION to BaseSpanConfig(EnrichedMentionSpan::class.java),
)
fun getMergingConfigForStyle(style: String, htmlStyle: HtmlStyle): StylesMergingConfig? {
return when (style) {
BOLD -> {
val blockingStyles = mutableListOf(CODE_BLOCK)
if (htmlStyle.h1Bold) blockingStyles.add(H1)
if (htmlStyle.h2Bold) blockingStyles.add(H2)
if (htmlStyle.h3Bold) blockingStyles.add(H3)
StylesMergingConfig(blockingStyles = blockingStyles.toTypedArray())
}
ITALIC -> StylesMergingConfig(
blockingStyles = arrayOf(CODE_BLOCK)
)
UNDERLINE -> StylesMergingConfig(
blockingStyles = arrayOf(CODE_BLOCK)
)
STRIKETHROUGH -> StylesMergingConfig(
blockingStyles = arrayOf(CODE_BLOCK)
)
INLINE_CODE -> StylesMergingConfig(
conflictingStyles = arrayOf(MENTION, LINK),
blockingStyles = arrayOf(CODE_BLOCK)
)
H1 -> {
val conflictingStyles = mutableListOf(H2, H3, ORDERED_LIST, UNORDERED_LIST, BLOCK_QUOTE, CODE_BLOCK)
if (htmlStyle.h1Bold) conflictingStyles.add(BOLD)
StylesMergingConfig(conflictingStyles = conflictingStyles.toTypedArray())
}
H2 -> {
val conflictingStyles = mutableListOf(H1, H3, ORDERED_LIST, UNORDERED_LIST, BLOCK_QUOTE, CODE_BLOCK)
if (htmlStyle.h2Bold) conflictingStyles.add(BOLD)
StylesMergingConfig(conflictingStyles = conflictingStyles.toTypedArray())
}
H3 -> {
val conflictingStyles = mutableListOf(H1, H2, ORDERED_LIST, UNORDERED_LIST, BLOCK_QUOTE, CODE_BLOCK)
if (htmlStyle.h3Bold) conflictingStyles.add(BOLD)
StylesMergingConfig(conflictingStyles = conflictingStyles.toTypedArray())
}
BLOCK_QUOTE -> StylesMergingConfig(
conflictingStyles = arrayOf(H1, H2, H3, CODE_BLOCK, ORDERED_LIST, UNORDERED_LIST)
)
CODE_BLOCK -> StylesMergingConfig(
conflictingStyles = arrayOf(H1, H2, H3, BOLD, ITALIC, UNDERLINE, STRIKETHROUGH, UNORDERED_LIST, ORDERED_LIST, BLOCK_QUOTE, INLINE_CODE)
)
UNORDERED_LIST -> StylesMergingConfig(
conflictingStyles = arrayOf(H1, H2, H3, ORDERED_LIST, CODE_BLOCK, BLOCK_QUOTE)
)
ORDERED_LIST -> StylesMergingConfig(
conflictingStyles = arrayOf(H1, H2, H3, UNORDERED_LIST, CODE_BLOCK, BLOCK_QUOTE),
)
LINK -> StylesMergingConfig(
blockingStyles = arrayOf(INLINE_CODE, CODE_BLOCK, MENTION)
)
IMAGE -> StylesMergingConfig()
MENTION -> StylesMergingConfig(
blockingStyles = arrayOf(INLINE_CODE, CODE_BLOCK, LINK)
)
else -> null
}
}
}