react-native-enriched-markdown 0.1.0 → 0.2.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/LICENSE +20 -0
- package/README.md +551 -0
- package/ReactNativeEnrichedMarkdown.podspec +27 -0
- package/android/build.gradle +101 -0
- package/android/generated/java/com/facebook/react/viewmanagers/EnrichedMarkdownTextManagerDelegate.java +54 -0
- package/android/generated/java/com/facebook/react/viewmanagers/EnrichedMarkdownTextManagerInterface.java +26 -0
- package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/ComponentDescriptors.cpp +22 -0
- package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/ComponentDescriptors.h +24 -0
- package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/EventEmitters.cpp +33 -0
- package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/EventEmitters.h +31 -0
- package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/Props.cpp +82 -0
- package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/Props.h +1388 -0
- package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/ShadowNodes.cpp +17 -0
- package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/ShadowNodes.h +32 -0
- package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/States.cpp +16 -0
- package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/States.h +20 -0
- package/android/gradle.properties +5 -0
- package/android/src/main/AndroidManifest.xml +2 -0
- package/android/src/main/baseline-prof.txt +65 -0
- package/android/src/main/cpp/jni-adapter.cpp +220 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdownText.kt +270 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdownTextLayoutManager.kt +15 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdownTextManager.kt +173 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdownTextPackage.kt +17 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/MeasurementStore.kt +385 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/accessibility/MarkdownAccessibilityHelper.kt +279 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/events/LinkLongPressEvent.kt +23 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/events/LinkPressEvent.kt +23 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/parser/MarkdownASTNode.kt +31 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/parser/Parser.kt +62 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/renderer/BlockStyleContext.kt +166 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/renderer/BlockquoteRenderer.kt +84 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/renderer/CodeBlockRenderer.kt +104 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/renderer/CodeRenderer.kt +36 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/renderer/DocumentRenderer.kt +16 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/renderer/EmphasisRenderer.kt +27 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/renderer/HeadingRenderer.kt +70 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/renderer/ImageRenderer.kt +68 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/renderer/LineBreakRenderer.kt +16 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/renderer/LinkRenderer.kt +29 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/renderer/ListContextManager.kt +105 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/renderer/ListItemRenderer.kt +59 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/renderer/ListRenderer.kt +76 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/renderer/NodeRenderer.kt +103 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/renderer/ParagraphRenderer.kt +80 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/renderer/Renderer.kt +109 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/renderer/SpanStyleCache.kt +86 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/renderer/StrikethroughRenderer.kt +27 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/renderer/StrongRenderer.kt +27 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/renderer/TextRenderer.kt +30 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/renderer/ThematicBreakRenderer.kt +45 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/renderer/UnderlineRenderer.kt +27 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/spans/BaseListSpan.kt +136 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/spans/BlockquoteSpan.kt +135 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/spans/CodeBackgroundSpan.kt +180 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/spans/CodeBlockSpan.kt +196 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/spans/CodeSpan.kt +27 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/spans/EmphasisSpan.kt +34 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/spans/HeadingSpan.kt +38 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/spans/ImageSpan.kt +321 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/spans/LineHeightSpan.kt +27 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/spans/LinkSpan.kt +51 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/spans/MarginBottomSpan.kt +76 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/spans/OrderedListSpan.kt +87 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/spans/StrikethroughSpan.kt +12 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/spans/StrongSpan.kt +37 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/spans/TextSpan.kt +26 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/spans/ThematicBreakSpan.kt +69 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/spans/UnorderedListSpan.kt +69 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/styles/BaseBlockStyle.kt +11 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/styles/BlockquoteStyle.kt +51 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/styles/CodeBlockStyle.kt +54 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/styles/CodeStyle.kt +21 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/styles/EmphasisStyle.kt +17 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/styles/HeadingStyle.kt +33 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/styles/ImageStyle.kt +23 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/styles/InlineImageStyle.kt +17 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/styles/LinkStyle.kt +19 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/styles/ListStyle.kt +57 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/styles/ParagraphStyle.kt +33 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/styles/StrikethroughStyle.kt +17 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/styles/StrongStyle.kt +17 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/styles/StyleConfig.kt +211 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/styles/StyleParser.kt +92 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/styles/TextAlignment.kt +32 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/styles/ThematicBreakStyle.kt +23 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/styles/UnderlineStyle.kt +17 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/utils/AsyncDrawable.kt +91 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/utils/HTMLGenerator.kt +827 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/utils/LinkLongPressMovementMethod.kt +121 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/utils/MarkdownExtractor.kt +375 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/utils/SelectionActionMode.kt +139 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/utils/Utils.kt +183 -0
- package/android/src/main/jni/CMakeLists.txt +70 -0
- package/android/src/main/jni/EnrichedMarkdownTextSpec.cpp +21 -0
- package/android/src/main/jni/EnrichedMarkdownTextSpec.h +25 -0
- package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownTextComponentDescriptor.h +29 -0
- package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownTextMeasurementManager.cpp +45 -0
- package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownTextMeasurementManager.h +21 -0
- package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownTextShadowNode.cpp +20 -0
- package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownTextShadowNode.h +37 -0
- package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/conversions.h +22 -0
- package/cpp/md4c/md4c.c +6492 -0
- package/cpp/md4c/md4c.h +402 -0
- package/cpp/parser/MD4CParser.cpp +327 -0
- package/cpp/parser/MD4CParser.hpp +27 -0
- package/cpp/parser/MarkdownASTNode.hpp +51 -0
- package/ios/EnrichedMarkdownText.h +18 -0
- package/ios/EnrichedMarkdownText.mm +1401 -0
- package/ios/attachments/EnrichedMarkdownImageAttachment.h +23 -0
- package/ios/attachments/EnrichedMarkdownImageAttachment.m +185 -0
- package/ios/attachments/ThematicBreakAttachment.h +15 -0
- package/ios/attachments/ThematicBreakAttachment.m +33 -0
- package/ios/generated/EnrichedMarkdownTextSpec/ComponentDescriptors.cpp +22 -0
- package/ios/generated/EnrichedMarkdownTextSpec/ComponentDescriptors.h +24 -0
- package/ios/generated/EnrichedMarkdownTextSpec/EventEmitters.cpp +33 -0
- package/ios/generated/EnrichedMarkdownTextSpec/EventEmitters.h +31 -0
- package/ios/generated/EnrichedMarkdownTextSpec/Props.cpp +82 -0
- package/ios/generated/EnrichedMarkdownTextSpec/Props.h +1388 -0
- package/ios/generated/EnrichedMarkdownTextSpec/RCTComponentViewHelpers.h +20 -0
- package/ios/generated/EnrichedMarkdownTextSpec/ShadowNodes.cpp +17 -0
- package/ios/generated/EnrichedMarkdownTextSpec/ShadowNodes.h +32 -0
- package/ios/generated/EnrichedMarkdownTextSpec/States.cpp +16 -0
- package/ios/generated/EnrichedMarkdownTextSpec/States.h +20 -0
- package/ios/internals/EnrichedMarkdownTextComponentDescriptor.h +19 -0
- package/ios/internals/EnrichedMarkdownTextShadowNode.h +43 -0
- package/ios/internals/EnrichedMarkdownTextShadowNode.mm +85 -0
- package/ios/internals/EnrichedMarkdownTextState.h +24 -0
- package/ios/parser/MarkdownASTNode.h +35 -0
- package/ios/parser/MarkdownASTNode.m +32 -0
- package/ios/parser/MarkdownParser.h +17 -0
- package/ios/parser/MarkdownParser.mm +42 -0
- package/ios/parser/MarkdownParserBridge.mm +120 -0
- package/ios/renderer/AttributedRenderer.h +11 -0
- package/ios/renderer/AttributedRenderer.m +152 -0
- package/ios/renderer/BlockquoteRenderer.h +7 -0
- package/ios/renderer/BlockquoteRenderer.m +160 -0
- package/ios/renderer/CodeBlockRenderer.h +10 -0
- package/ios/renderer/CodeBlockRenderer.m +90 -0
- package/ios/renderer/CodeRenderer.h +10 -0
- package/ios/renderer/CodeRenderer.m +60 -0
- package/ios/renderer/EmphasisRenderer.h +6 -0
- package/ios/renderer/EmphasisRenderer.m +96 -0
- package/ios/renderer/HeadingRenderer.h +7 -0
- package/ios/renderer/HeadingRenderer.m +105 -0
- package/ios/renderer/ImageRenderer.h +12 -0
- package/ios/renderer/ImageRenderer.m +83 -0
- package/ios/renderer/LinkRenderer.h +7 -0
- package/ios/renderer/LinkRenderer.m +69 -0
- package/ios/renderer/ListItemRenderer.h +16 -0
- package/ios/renderer/ListItemRenderer.m +103 -0
- package/ios/renderer/ListRenderer.h +13 -0
- package/ios/renderer/ListRenderer.m +70 -0
- package/ios/renderer/NodeRenderer.h +8 -0
- package/ios/renderer/ParagraphRenderer.h +7 -0
- package/ios/renderer/ParagraphRenderer.m +80 -0
- package/ios/renderer/RenderContext.h +105 -0
- package/ios/renderer/RenderContext.m +312 -0
- package/ios/renderer/RendererFactory.h +12 -0
- package/ios/renderer/RendererFactory.m +116 -0
- package/ios/renderer/StrikethroughRenderer.h +6 -0
- package/ios/renderer/StrikethroughRenderer.m +40 -0
- package/ios/renderer/StrongRenderer.h +6 -0
- package/ios/renderer/StrongRenderer.m +83 -0
- package/ios/renderer/TextRenderer.h +6 -0
- package/ios/renderer/TextRenderer.m +16 -0
- package/ios/renderer/ThematicBreakRenderer.h +5 -0
- package/ios/renderer/ThematicBreakRenderer.m +53 -0
- package/ios/renderer/UnderlineRenderer.h +6 -0
- package/ios/renderer/UnderlineRenderer.m +39 -0
- package/ios/styles/StyleConfig.h +274 -0
- package/ios/styles/StyleConfig.mm +1806 -0
- package/ios/utils/AccessibilityInfo.h +35 -0
- package/ios/utils/AccessibilityInfo.m +24 -0
- package/ios/utils/BlockquoteBorder.h +20 -0
- package/ios/utils/BlockquoteBorder.m +92 -0
- package/ios/utils/CodeBackground.h +19 -0
- package/ios/utils/CodeBackground.m +191 -0
- package/ios/utils/CodeBlockBackground.h +17 -0
- package/ios/utils/CodeBlockBackground.m +82 -0
- package/ios/utils/EditMenuUtils.h +22 -0
- package/ios/utils/EditMenuUtils.m +118 -0
- package/ios/utils/FontUtils.h +25 -0
- package/ios/utils/FontUtils.m +27 -0
- package/ios/utils/HTMLGenerator.h +20 -0
- package/ios/utils/HTMLGenerator.m +793 -0
- package/ios/utils/LastElementUtils.h +53 -0
- package/ios/utils/ListMarkerDrawer.h +15 -0
- package/ios/utils/ListMarkerDrawer.m +127 -0
- package/ios/utils/MarkdownAccessibilityElementBuilder.h +45 -0
- package/ios/utils/MarkdownAccessibilityElementBuilder.m +323 -0
- package/ios/utils/MarkdownExtractor.h +17 -0
- package/ios/utils/MarkdownExtractor.m +308 -0
- package/ios/utils/ParagraphStyleUtils.h +21 -0
- package/ios/utils/ParagraphStyleUtils.m +111 -0
- package/ios/utils/PasteboardUtils.h +36 -0
- package/ios/utils/PasteboardUtils.m +134 -0
- package/ios/utils/RTFExportUtils.h +24 -0
- package/ios/utils/RTFExportUtils.m +297 -0
- package/ios/utils/RuntimeKeys.h +38 -0
- package/ios/utils/RuntimeKeys.m +11 -0
- package/ios/utils/TextViewLayoutManager.h +14 -0
- package/ios/utils/TextViewLayoutManager.mm +113 -0
- package/lib/module/EnrichedMarkdownText.js +65 -0
- package/lib/module/EnrichedMarkdownText.js.map +1 -0
- package/lib/module/EnrichedMarkdownTextNativeComponent.ts +210 -0
- package/lib/module/index.js +4 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/normalizeMarkdownStyle.js +384 -0
- package/lib/module/normalizeMarkdownStyle.js.map +1 -0
- package/lib/module/package.json +1 -0
- package/lib/typescript/package.json +1 -0
- package/lib/typescript/src/EnrichedMarkdownText.d.ts +183 -0
- package/lib/typescript/src/EnrichedMarkdownText.d.ts.map +1 -0
- package/lib/typescript/src/EnrichedMarkdownTextNativeComponent.d.ts +185 -0
- package/lib/typescript/src/EnrichedMarkdownTextNativeComponent.d.ts.map +1 -0
- package/lib/typescript/src/index.d.ts +4 -0
- package/lib/typescript/src/index.d.ts.map +1 -0
- package/lib/typescript/src/normalizeMarkdownStyle.d.ts +6 -0
- package/lib/typescript/src/normalizeMarkdownStyle.d.ts.map +1 -0
- package/package.json +186 -1
- package/react-native.config.js +13 -0
- package/src/EnrichedMarkdownText.tsx +280 -0
- package/src/EnrichedMarkdownTextNativeComponent.ts +210 -0
- package/src/index.tsx +10 -0
- package/src/normalizeMarkdownStyle.ts +423 -0
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
package com.swmansion.enriched.markdown.styles
|
|
2
|
+
|
|
3
|
+
import android.content.Context
|
|
4
|
+
import com.facebook.react.bridge.ColorPropConverter
|
|
5
|
+
import com.facebook.react.bridge.ReadableMap
|
|
6
|
+
import com.facebook.react.uimanager.PixelUtil
|
|
7
|
+
|
|
8
|
+
class StyleParser(
|
|
9
|
+
private val context: Context,
|
|
10
|
+
private val allowFontScaling: Boolean,
|
|
11
|
+
private val maxFontSizeMultiplier: Float,
|
|
12
|
+
) {
|
|
13
|
+
fun parseOptionalColor(
|
|
14
|
+
map: ReadableMap,
|
|
15
|
+
key: String,
|
|
16
|
+
): Int? {
|
|
17
|
+
if (!map.hasKey(key) || map.isNull(key)) {
|
|
18
|
+
return null
|
|
19
|
+
}
|
|
20
|
+
val colorValue = map.getDouble(key)
|
|
21
|
+
return ColorPropConverter.getColor(colorValue, context)
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
fun parseColor(
|
|
25
|
+
map: ReadableMap,
|
|
26
|
+
key: String,
|
|
27
|
+
): Int =
|
|
28
|
+
parseOptionalColor(map, key)
|
|
29
|
+
?: throw IllegalArgumentException("Color key '$key' is missing, null, or invalid")
|
|
30
|
+
|
|
31
|
+
fun parseOptionalDouble(
|
|
32
|
+
map: ReadableMap,
|
|
33
|
+
key: String,
|
|
34
|
+
default: Double = 0.0,
|
|
35
|
+
): Double =
|
|
36
|
+
if (map.hasKey(key) && !map.isNull(key)) {
|
|
37
|
+
map.getDouble(key)
|
|
38
|
+
} else {
|
|
39
|
+
default
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
fun parseOptionalInt(
|
|
43
|
+
map: ReadableMap,
|
|
44
|
+
key: String,
|
|
45
|
+
default: Int = 0,
|
|
46
|
+
): Int =
|
|
47
|
+
if (map.hasKey(key) && !map.isNull(key)) {
|
|
48
|
+
map.getInt(key)
|
|
49
|
+
} else {
|
|
50
|
+
default
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
fun parseString(
|
|
54
|
+
map: ReadableMap,
|
|
55
|
+
key: String,
|
|
56
|
+
default: String = "",
|
|
57
|
+
): String = map.getString(key) ?: default
|
|
58
|
+
|
|
59
|
+
fun parseBoolean(
|
|
60
|
+
map: ReadableMap,
|
|
61
|
+
key: String,
|
|
62
|
+
default: Boolean = false,
|
|
63
|
+
): Boolean =
|
|
64
|
+
if (map.hasKey(key) && !map.isNull(key)) {
|
|
65
|
+
map.getBoolean(key)
|
|
66
|
+
} else {
|
|
67
|
+
default
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
fun toPixelFromSP(value: Float): Float {
|
|
71
|
+
val metrics = context.resources.displayMetrics
|
|
72
|
+
val baseDensity = metrics.density
|
|
73
|
+
|
|
74
|
+
if (!allowFontScaling) {
|
|
75
|
+
return value * baseDensity
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
var fontScale = metrics.scaledDensity / baseDensity
|
|
79
|
+
if (maxFontSizeMultiplier >= 1.0f && fontScale > maxFontSizeMultiplier) {
|
|
80
|
+
fontScale = maxFontSizeMultiplier
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
return value * baseDensity * fontScale
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
fun toPixelFromDIP(value: Float): Float = PixelUtil.toPixelFromDIP(value)
|
|
87
|
+
|
|
88
|
+
fun parseTextAlign(
|
|
89
|
+
map: ReadableMap,
|
|
90
|
+
key: String,
|
|
91
|
+
): TextAlignment = TextAlignment.fromString(parseString(map, key, "left"))
|
|
92
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
package com.swmansion.enriched.markdown.styles
|
|
2
|
+
|
|
3
|
+
import android.text.Layout
|
|
4
|
+
|
|
5
|
+
enum class TextAlignment(
|
|
6
|
+
val layoutAlignment: Layout.Alignment,
|
|
7
|
+
val needsJustify: Boolean,
|
|
8
|
+
) {
|
|
9
|
+
LEFT(Layout.Alignment.ALIGN_NORMAL, false),
|
|
10
|
+
CENTER(Layout.Alignment.ALIGN_CENTER, false),
|
|
11
|
+
RIGHT(Layout.Alignment.ALIGN_OPPOSITE, false),
|
|
12
|
+
JUSTIFY(Layout.Alignment.ALIGN_NORMAL, true),
|
|
13
|
+
AUTO(Layout.Alignment.ALIGN_NORMAL, false),
|
|
14
|
+
;
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Whether an AlignmentSpan is needed.
|
|
18
|
+
* Only CENTER and RIGHT need explicit spans; LEFT/AUTO use default, JUSTIFY is handled at TextView level.
|
|
19
|
+
*/
|
|
20
|
+
val needsAlignmentSpan: Boolean get() = this == CENTER || this == RIGHT
|
|
21
|
+
|
|
22
|
+
companion object {
|
|
23
|
+
fun fromString(value: String): TextAlignment =
|
|
24
|
+
when (value.lowercase()) {
|
|
25
|
+
"center" -> CENTER
|
|
26
|
+
"right" -> RIGHT
|
|
27
|
+
"justify" -> JUSTIFY
|
|
28
|
+
"auto" -> AUTO
|
|
29
|
+
else -> LEFT
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
package com.swmansion.enriched.markdown.styles
|
|
2
|
+
|
|
3
|
+
import com.facebook.react.bridge.ReadableMap
|
|
4
|
+
|
|
5
|
+
data class ThematicBreakStyle(
|
|
6
|
+
val color: Int,
|
|
7
|
+
val height: Float,
|
|
8
|
+
val marginTop: Float,
|
|
9
|
+
val marginBottom: Float,
|
|
10
|
+
) {
|
|
11
|
+
companion object {
|
|
12
|
+
fun fromReadableMap(
|
|
13
|
+
map: ReadableMap,
|
|
14
|
+
parser: StyleParser,
|
|
15
|
+
): ThematicBreakStyle {
|
|
16
|
+
val color = parser.parseColor(map, "color")
|
|
17
|
+
val height = parser.toPixelFromDIP(map.getDouble("height").toFloat())
|
|
18
|
+
val marginTop = parser.toPixelFromDIP(map.getDouble("marginTop").toFloat())
|
|
19
|
+
val marginBottom = parser.toPixelFromDIP(map.getDouble("marginBottom").toFloat())
|
|
20
|
+
return ThematicBreakStyle(color, height, marginTop, marginBottom)
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
package com.swmansion.enriched.markdown.styles
|
|
2
|
+
|
|
3
|
+
import com.facebook.react.bridge.ReadableMap
|
|
4
|
+
|
|
5
|
+
data class UnderlineStyle(
|
|
6
|
+
val color: Int,
|
|
7
|
+
) {
|
|
8
|
+
companion object {
|
|
9
|
+
fun fromReadableMap(
|
|
10
|
+
map: ReadableMap,
|
|
11
|
+
parser: StyleParser,
|
|
12
|
+
): UnderlineStyle {
|
|
13
|
+
val color = parser.parseColor(map, "color")
|
|
14
|
+
return UnderlineStyle(color)
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
package com.swmansion.enriched.markdown.utils
|
|
2
|
+
|
|
3
|
+
import android.content.res.Resources
|
|
4
|
+
import android.graphics.BitmapFactory
|
|
5
|
+
import android.graphics.Canvas
|
|
6
|
+
import android.graphics.Color
|
|
7
|
+
import android.graphics.ColorFilter
|
|
8
|
+
import android.graphics.drawable.Drawable
|
|
9
|
+
import android.os.Handler
|
|
10
|
+
import android.os.Looper
|
|
11
|
+
import android.util.Log
|
|
12
|
+
import androidx.core.graphics.drawable.toDrawable
|
|
13
|
+
import java.net.URL
|
|
14
|
+
import java.util.concurrent.Executors
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Custom Drawable that loads images asynchronously from URLs.
|
|
18
|
+
*/
|
|
19
|
+
class AsyncDrawable(
|
|
20
|
+
private val url: String,
|
|
21
|
+
) : Drawable() {
|
|
22
|
+
// 1. Use a shared companion executor to avoid thread leakage per instance
|
|
23
|
+
companion object {
|
|
24
|
+
private val sharedExecutor = Executors.newFixedThreadPool(4)
|
|
25
|
+
private val mainHandler = Handler(Looper.getMainLooper())
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
var internalDrawable: Drawable = Color.TRANSPARENT.toDrawable()
|
|
29
|
+
|
|
30
|
+
// 2. Track loading state more granularly
|
|
31
|
+
var isLoaded = false
|
|
32
|
+
private set
|
|
33
|
+
|
|
34
|
+
var onLoaded: (() -> Unit)? = null
|
|
35
|
+
|
|
36
|
+
init {
|
|
37
|
+
load()
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
private fun load() {
|
|
41
|
+
sharedExecutor.execute {
|
|
42
|
+
try {
|
|
43
|
+
// 3. Proper Resource Management: Use 'use' to close the stream automatically
|
|
44
|
+
val bitmap =
|
|
45
|
+
URL(url).openStream().use {
|
|
46
|
+
BitmapFactory.decodeStream(it)
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
mainHandler.post {
|
|
50
|
+
bitmap?.let {
|
|
51
|
+
val drawable = it.toDrawable(Resources.getSystem())
|
|
52
|
+
drawable.bounds = bounds
|
|
53
|
+
internalDrawable = drawable
|
|
54
|
+
}
|
|
55
|
+
isLoaded = true
|
|
56
|
+
onLoaded?.invoke()
|
|
57
|
+
invalidateSelf() // 4. Critical: Tell the system to redraw
|
|
58
|
+
}
|
|
59
|
+
} catch (e: Exception) {
|
|
60
|
+
Log.e("AsyncDrawable", "Failed to load image from: $url", e)
|
|
61
|
+
mainHandler.post {
|
|
62
|
+
isLoaded = true
|
|
63
|
+
onLoaded?.invoke()
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
override fun draw(canvas: Canvas) = internalDrawable.draw(canvas)
|
|
70
|
+
|
|
71
|
+
override fun setAlpha(alpha: Int) {
|
|
72
|
+
internalDrawable.alpha = alpha
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
override fun setColorFilter(colorFilter: ColorFilter?) {
|
|
76
|
+
internalDrawable.colorFilter = colorFilter
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
@Deprecated("Deprecated in Java")
|
|
80
|
+
override fun getOpacity(): Int = internalDrawable.opacity
|
|
81
|
+
|
|
82
|
+
override fun setBounds(
|
|
83
|
+
left: Int,
|
|
84
|
+
top: Int,
|
|
85
|
+
right: Int,
|
|
86
|
+
bottom: Int,
|
|
87
|
+
) {
|
|
88
|
+
super.setBounds(left, top, right, bottom)
|
|
89
|
+
internalDrawable.setBounds(left, top, right, bottom)
|
|
90
|
+
}
|
|
91
|
+
}
|