react-native-enriched 0.3.0 → 0.4.1

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