@fendent/react-native-enriched 0.5.2-fork.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 (278) hide show
  1. package/LICENSE +20 -0
  2. package/README.md +343 -0
  3. package/ReactNativeEnriched.podspec +31 -0
  4. package/android/build.gradle +106 -0
  5. package/android/generated/java/com/facebook/react/viewmanagers/EnrichedTextInputViewManagerDelegate.java +197 -0
  6. package/android/generated/java/com/facebook/react/viewmanagers/EnrichedTextInputViewManagerInterface.java +72 -0
  7. package/android/generated/jni/react/renderer/components/ReactNativeEnrichedSpec/ComponentDescriptors.cpp +22 -0
  8. package/android/generated/jni/react/renderer/components/ReactNativeEnrichedSpec/ComponentDescriptors.h +24 -0
  9. package/android/generated/jni/react/renderer/components/ReactNativeEnrichedSpec/EventEmitters.cpp +434 -0
  10. package/android/generated/jni/react/renderer/components/ReactNativeEnrichedSpec/EventEmitters.h +391 -0
  11. package/android/generated/jni/react/renderer/components/ReactNativeEnrichedSpec/Props.cpp +173 -0
  12. package/android/generated/jni/react/renderer/components/ReactNativeEnrichedSpec/Props.h +833 -0
  13. package/android/generated/jni/react/renderer/components/ReactNativeEnrichedSpec/ShadowNodes.cpp +17 -0
  14. package/android/generated/jni/react/renderer/components/ReactNativeEnrichedSpec/ShadowNodes.h +23 -0
  15. package/android/generated/jni/react/renderer/components/ReactNativeEnrichedSpec/States.cpp +16 -0
  16. package/android/generated/jni/react/renderer/components/ReactNativeEnrichedSpec/States.h +20 -0
  17. package/android/gradle.properties +5 -0
  18. package/android/lint.gradle +70 -0
  19. package/android/src/main/AndroidManifest.xml +3 -0
  20. package/android/src/main/AndroidManifestNew.xml +2 -0
  21. package/android/src/main/java/com/swmansion/enriched/ReactNativeEnrichedPackage.kt +20 -0
  22. package/android/src/main/java/com/swmansion/enriched/common/AsyncDrawable.kt +126 -0
  23. package/android/src/main/java/com/swmansion/enriched/common/CheckboxDrawable.kt +81 -0
  24. package/android/src/main/java/com/swmansion/enriched/common/EnrichedConstants.kt +11 -0
  25. package/android/src/main/java/com/swmansion/enriched/common/EnrichedStyle.kt +57 -0
  26. package/android/src/main/java/com/swmansion/enriched/common/ForceRedrawSpan.kt +14 -0
  27. package/android/src/main/java/com/swmansion/enriched/common/GumboNormalizer.kt +5 -0
  28. package/android/src/main/java/com/swmansion/enriched/common/MentionStyle.kt +7 -0
  29. package/android/src/main/java/com/swmansion/enriched/common/ResourceManager.kt +26 -0
  30. package/android/src/main/java/com/swmansion/enriched/common/parser/EnrichedParser.java +956 -0
  31. package/android/src/main/java/com/swmansion/enriched/common/parser/EnrichedSpanFactory.kt +79 -0
  32. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedBlockQuoteSpan.kt +53 -0
  33. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedBoldSpan.kt +12 -0
  34. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedCheckboxListSpan.kt +92 -0
  35. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedCodeBlockSpan.kt +81 -0
  36. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH1Span.kt +20 -0
  37. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH2Span.kt +20 -0
  38. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH3Span.kt +20 -0
  39. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH4Span.kt +21 -0
  40. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH5Span.kt +20 -0
  41. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH6Span.kt +20 -0
  42. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedImageSpan.kt +184 -0
  43. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedInlineCodeSpan.kt +24 -0
  44. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedItalicSpan.kt +12 -0
  45. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedLinkSpan.kt +29 -0
  46. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedMentionSpan.kt +35 -0
  47. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedOrderedListSpan.kt +79 -0
  48. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedStrikeThroughSpan.kt +11 -0
  49. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedUnderlineSpan.kt +11 -0
  50. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedUnorderedListSpan.kt +62 -0
  51. package/android/src/main/java/com/swmansion/enriched/common/spans/interfaces/EnrichedBlockSpan.kt +5 -0
  52. package/android/src/main/java/com/swmansion/enriched/common/spans/interfaces/EnrichedHeadingSpan.kt +3 -0
  53. package/android/src/main/java/com/swmansion/enriched/common/spans/interfaces/EnrichedInlineSpan.kt +3 -0
  54. package/android/src/main/java/com/swmansion/enriched/common/spans/interfaces/EnrichedParagraphSpan.kt +5 -0
  55. package/android/src/main/java/com/swmansion/enriched/common/spans/interfaces/EnrichedSpan.kt +3 -0
  56. package/android/src/main/java/com/swmansion/enriched/common/spans/interfaces/EnrichedZeroWidthSpaceSpan.kt +4 -0
  57. package/android/src/main/java/com/swmansion/enriched/textinput/EnrichedTextInputConnectionWrapper.kt +140 -0
  58. package/android/src/main/java/com/swmansion/enriched/textinput/EnrichedTextInputSpannableFactory.kt +83 -0
  59. package/android/src/main/java/com/swmansion/enriched/textinput/EnrichedTextInputView.kt +1120 -0
  60. package/android/src/main/java/com/swmansion/enriched/textinput/EnrichedTextInputViewLayoutManager.kt +27 -0
  61. package/android/src/main/java/com/swmansion/enriched/textinput/EnrichedTextInputViewManager.kt +478 -0
  62. package/android/src/main/java/com/swmansion/enriched/textinput/MeasurementStore.kt +225 -0
  63. package/android/src/main/java/com/swmansion/enriched/textinput/events/MentionHandler.kt +55 -0
  64. package/android/src/main/java/com/swmansion/enriched/textinput/events/OnChangeHtmlEvent.kt +27 -0
  65. package/android/src/main/java/com/swmansion/enriched/textinput/events/OnChangeSelectionEvent.kt +30 -0
  66. package/android/src/main/java/com/swmansion/enriched/textinput/events/OnChangeStateEvent.kt +21 -0
  67. package/android/src/main/java/com/swmansion/enriched/textinput/events/OnChangeTextEvent.kt +30 -0
  68. package/android/src/main/java/com/swmansion/enriched/textinput/events/OnContextMenuItemPressEvent.kt +35 -0
  69. package/android/src/main/java/com/swmansion/enriched/textinput/events/OnInputBlurEvent.kt +25 -0
  70. package/android/src/main/java/com/swmansion/enriched/textinput/events/OnInputFocusEvent.kt +25 -0
  71. package/android/src/main/java/com/swmansion/enriched/textinput/events/OnInputKeyPressEvent.kt +27 -0
  72. package/android/src/main/java/com/swmansion/enriched/textinput/events/OnLinkDetectedEvent.kt +32 -0
  73. package/android/src/main/java/com/swmansion/enriched/textinput/events/OnMentionDetectedEvent.kt +30 -0
  74. package/android/src/main/java/com/swmansion/enriched/textinput/events/OnMentionEvent.kt +34 -0
  75. package/android/src/main/java/com/swmansion/enriched/textinput/events/OnPasteImagesEvent.kt +47 -0
  76. package/android/src/main/java/com/swmansion/enriched/textinput/events/OnRequestHtmlResultEvent.kt +32 -0
  77. package/android/src/main/java/com/swmansion/enriched/textinput/events/OnSubmitEditingEvent.kt +29 -0
  78. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputBlockQuoteSpan.kt +14 -0
  79. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputBoldSpan.kt +14 -0
  80. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputCheckboxListSpan.kt +15 -0
  81. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputCodeBlockSpan.kt +14 -0
  82. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH1Span.kt +14 -0
  83. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH2Span.kt +14 -0
  84. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH3Span.kt +14 -0
  85. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH4Span.kt +14 -0
  86. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH5Span.kt +14 -0
  87. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH6Span.kt +14 -0
  88. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputImageSpan.kt +36 -0
  89. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputInlineCodeSpan.kt +14 -0
  90. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputItalicSpan.kt +14 -0
  91. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputLinkSpan.kt +16 -0
  92. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputMentionSpan.kt +18 -0
  93. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputOrderedListSpan.kt +21 -0
  94. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputStrikeThroughSpan.kt +14 -0
  95. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputUnderlineSpan.kt +14 -0
  96. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputUnorderedListSpan.kt +14 -0
  97. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedLineHeightSpan.kt +44 -0
  98. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedSpans.kt +241 -0
  99. package/android/src/main/java/com/swmansion/enriched/textinput/spans/interfaces/EnrichedInputSpan.kt +10 -0
  100. package/android/src/main/java/com/swmansion/enriched/textinput/styles/HtmlStyle.kt +372 -0
  101. package/android/src/main/java/com/swmansion/enriched/textinput/styles/InlineStyles.kt +164 -0
  102. package/android/src/main/java/com/swmansion/enriched/textinput/styles/ListStyles.kt +263 -0
  103. package/android/src/main/java/com/swmansion/enriched/textinput/styles/ParagraphStyles.kt +434 -0
  104. package/android/src/main/java/com/swmansion/enriched/textinput/styles/ParametrizedStyles.kt +394 -0
  105. package/android/src/main/java/com/swmansion/enriched/textinput/utils/EnrichedEditableFactory.kt +17 -0
  106. package/android/src/main/java/com/swmansion/enriched/textinput/utils/EnrichedSelection.kt +320 -0
  107. package/android/src/main/java/com/swmansion/enriched/textinput/utils/EnrichedSpanState.kt +310 -0
  108. package/android/src/main/java/com/swmansion/enriched/textinput/utils/EnrichedSpannable.kt +106 -0
  109. package/android/src/main/java/com/swmansion/enriched/textinput/utils/EnrichedSpannableStringBuilder.kt +24 -0
  110. package/android/src/main/java/com/swmansion/enriched/textinput/utils/RichContentReceiver.kt +127 -0
  111. package/android/src/main/java/com/swmansion/enriched/textinput/utils/Utils.kt +106 -0
  112. package/android/src/main/java/com/swmansion/enriched/textinput/watchers/EnrichedSpanWatcher.kt +107 -0
  113. package/android/src/main/java/com/swmansion/enriched/textinput/watchers/EnrichedTextWatcher.kt +74 -0
  114. package/android/src/main/new_arch/CMakeLists.txt +62 -0
  115. package/android/src/main/new_arch/GumboNormalizerJni.cpp +14 -0
  116. package/android/src/main/new_arch/ReactNativeEnrichedSpec.cpp +11 -0
  117. package/android/src/main/new_arch/ReactNativeEnrichedSpec.h +15 -0
  118. package/android/src/main/new_arch/react/renderer/components/ReactNativeEnrichedSpec/EnrichedTextInputComponentDescriptor.h +35 -0
  119. package/android/src/main/new_arch/react/renderer/components/ReactNativeEnrichedSpec/EnrichedTextInputMeasurementManager.cpp +53 -0
  120. package/android/src/main/new_arch/react/renderer/components/ReactNativeEnrichedSpec/EnrichedTextInputMeasurementManager.h +25 -0
  121. package/android/src/main/new_arch/react/renderer/components/ReactNativeEnrichedSpec/EnrichedTextInputShadowNode.cpp +35 -0
  122. package/android/src/main/new_arch/react/renderer/components/ReactNativeEnrichedSpec/EnrichedTextInputShadowNode.h +53 -0
  123. package/android/src/main/new_arch/react/renderer/components/ReactNativeEnrichedSpec/EnrichedTextInputState.cpp +9 -0
  124. package/android/src/main/new_arch/react/renderer/components/ReactNativeEnrichedSpec/EnrichedTextInputState.h +24 -0
  125. package/android/src/main/new_arch/react/renderer/components/ReactNativeEnrichedSpec/conversions.h +27 -0
  126. package/android/src/main/res/drawable/broken_image.xml +10 -0
  127. package/cpp/CMakeLists.txt +50 -0
  128. package/cpp/GumboParser/GumboParser.h +34043 -0
  129. package/cpp/README.md +59 -0
  130. package/cpp/parser/GumboNormalizer.c +915 -0
  131. package/cpp/parser/GumboParser.cpp +16 -0
  132. package/cpp/parser/GumboParser.hpp +23 -0
  133. package/cpp/tests/GumboParserTest.cpp +457 -0
  134. package/ios/EnrichedTextInputView.h +53 -0
  135. package/ios/EnrichedTextInputView.mm +2360 -0
  136. package/ios/EnrichedTextInputViewManager.mm +13 -0
  137. package/ios/attributesManager/AttributesManager.h +17 -0
  138. package/ios/attributesManager/AttributesManager.mm +195 -0
  139. package/ios/config/InputConfig.h +104 -0
  140. package/ios/config/InputConfig.mm +664 -0
  141. package/ios/extensions/ColorExtension.h +7 -0
  142. package/ios/extensions/ColorExtension.mm +38 -0
  143. package/ios/extensions/FontExtension.h +11 -0
  144. package/ios/extensions/FontExtension.mm +72 -0
  145. package/ios/extensions/ImageExtension.h +34 -0
  146. package/ios/extensions/ImageExtension.mm +165 -0
  147. package/ios/extensions/LayoutManagerExtension.h +6 -0
  148. package/ios/extensions/LayoutManagerExtension.mm +443 -0
  149. package/ios/extensions/StringExtension.h +15 -0
  150. package/ios/extensions/StringExtension.mm +69 -0
  151. package/ios/generated/ReactNativeEnrichedSpec/ComponentDescriptors.cpp +22 -0
  152. package/ios/generated/ReactNativeEnrichedSpec/ComponentDescriptors.h +24 -0
  153. package/ios/generated/ReactNativeEnrichedSpec/EventEmitters.cpp +434 -0
  154. package/ios/generated/ReactNativeEnrichedSpec/EventEmitters.h +391 -0
  155. package/ios/generated/ReactNativeEnrichedSpec/Props.cpp +173 -0
  156. package/ios/generated/ReactNativeEnrichedSpec/Props.h +833 -0
  157. package/ios/generated/ReactNativeEnrichedSpec/RCTComponentViewHelpers.h +582 -0
  158. package/ios/generated/ReactNativeEnrichedSpec/ShadowNodes.cpp +17 -0
  159. package/ios/generated/ReactNativeEnrichedSpec/ShadowNodes.h +23 -0
  160. package/ios/generated/ReactNativeEnrichedSpec/States.cpp +16 -0
  161. package/ios/generated/ReactNativeEnrichedSpec/States.h +20 -0
  162. package/ios/inputParser/InputParser.h +11 -0
  163. package/ios/inputParser/InputParser.mm +1463 -0
  164. package/ios/inputTextView/InputTextView.h +6 -0
  165. package/ios/inputTextView/InputTextView.mm +285 -0
  166. package/ios/interfaces/AttributeEntry.h +9 -0
  167. package/ios/interfaces/AttributeEntry.mm +4 -0
  168. package/ios/interfaces/BaseStyleProtocol.h +17 -0
  169. package/ios/interfaces/ImageAttachment.h +11 -0
  170. package/ios/interfaces/ImageAttachment.mm +107 -0
  171. package/ios/interfaces/ImageData.h +10 -0
  172. package/ios/interfaces/ImageData.mm +4 -0
  173. package/ios/interfaces/LinkData.h +11 -0
  174. package/ios/interfaces/LinkData.mm +29 -0
  175. package/ios/interfaces/LinkRegexConfig.h +19 -0
  176. package/ios/interfaces/LinkRegexConfig.mm +37 -0
  177. package/ios/interfaces/MediaAttachment.h +23 -0
  178. package/ios/interfaces/MediaAttachment.mm +31 -0
  179. package/ios/interfaces/MentionParams.h +8 -0
  180. package/ios/interfaces/MentionParams.mm +4 -0
  181. package/ios/interfaces/MentionStyleProps.h +13 -0
  182. package/ios/interfaces/MentionStyleProps.mm +63 -0
  183. package/ios/interfaces/StyleBase.h +36 -0
  184. package/ios/interfaces/StyleBase.mm +256 -0
  185. package/ios/interfaces/StyleHeaders.h +102 -0
  186. package/ios/interfaces/StylePair.h +9 -0
  187. package/ios/interfaces/StylePair.mm +4 -0
  188. package/ios/interfaces/StyleTypeEnum.h +26 -0
  189. package/ios/interfaces/TextDecorationLineEnum.h +6 -0
  190. package/ios/interfaces/TextDecorationLineEnum.mm +4 -0
  191. package/ios/internals/EnrichedTextInputViewComponentDescriptor.h +19 -0
  192. package/ios/internals/EnrichedTextInputViewShadowNode.h +44 -0
  193. package/ios/internals/EnrichedTextInputViewShadowNode.mm +103 -0
  194. package/ios/internals/EnrichedTextInputViewState.cpp +10 -0
  195. package/ios/internals/EnrichedTextInputViewState.h +22 -0
  196. package/ios/styles/BlockQuoteStyle.mm +55 -0
  197. package/ios/styles/BoldStyle.mm +37 -0
  198. package/ios/styles/CheckboxListStyle.mm +153 -0
  199. package/ios/styles/CodeBlockStyle.mm +49 -0
  200. package/ios/styles/H1Style.mm +20 -0
  201. package/ios/styles/H2Style.mm +20 -0
  202. package/ios/styles/H3Style.mm +20 -0
  203. package/ios/styles/H4Style.mm +20 -0
  204. package/ios/styles/H5Style.mm +20 -0
  205. package/ios/styles/H6Style.mm +20 -0
  206. package/ios/styles/HeadingStyleBase.mm +65 -0
  207. package/ios/styles/ImageStyle.mm +146 -0
  208. package/ios/styles/InlineCodeStyle.mm +65 -0
  209. package/ios/styles/ItalicStyle.mm +37 -0
  210. package/ios/styles/LinkStyle.mm +532 -0
  211. package/ios/styles/MentionStyle.mm +538 -0
  212. package/ios/styles/OrderedListStyle.mm +86 -0
  213. package/ios/styles/StrikethroughStyle.mm +25 -0
  214. package/ios/styles/UnderlineStyle.mm +24 -0
  215. package/ios/styles/UnorderedListStyle.mm +86 -0
  216. package/ios/utils/CheckboxHitTestUtils.h +10 -0
  217. package/ios/utils/CheckboxHitTestUtils.mm +122 -0
  218. package/ios/utils/DotReplacementUtils.h +10 -0
  219. package/ios/utils/DotReplacementUtils.mm +68 -0
  220. package/ios/utils/KeyboardUtils.h +7 -0
  221. package/ios/utils/KeyboardUtils.mm +31 -0
  222. package/ios/utils/OccurenceUtils.h +44 -0
  223. package/ios/utils/OccurenceUtils.mm +179 -0
  224. package/ios/utils/ParagraphAttributesUtils.h +15 -0
  225. package/ios/utils/ParagraphAttributesUtils.mm +257 -0
  226. package/ios/utils/RangeUtils.h +12 -0
  227. package/ios/utils/RangeUtils.mm +183 -0
  228. package/ios/utils/TextBlockTapGestureRecognizer.h +17 -0
  229. package/ios/utils/TextBlockTapGestureRecognizer.mm +56 -0
  230. package/ios/utils/TextInsertionUtils.h +17 -0
  231. package/ios/utils/TextInsertionUtils.mm +64 -0
  232. package/ios/utils/WordsUtils.h +7 -0
  233. package/ios/utils/WordsUtils.mm +98 -0
  234. package/ios/utils/ZeroWidthSpaceUtils.h +9 -0
  235. package/ios/utils/ZeroWidthSpaceUtils.mm +270 -0
  236. package/lib/module/index.js +4 -0
  237. package/lib/module/index.js.map +1 -0
  238. package/lib/module/native/EnrichedTextInput.js +304 -0
  239. package/lib/module/native/EnrichedTextInput.js.map +1 -0
  240. package/lib/module/package.json +1 -0
  241. package/lib/module/spec/EnrichedTextInputNativeComponent.ts +517 -0
  242. package/lib/module/types.js +4 -0
  243. package/lib/module/types.js.map +1 -0
  244. package/lib/module/utils/EnrichedTextInputDefaultProps.js +12 -0
  245. package/lib/module/utils/EnrichedTextInputDefaultProps.js.map +1 -0
  246. package/lib/module/utils/normalizeHtmlStyle.js +155 -0
  247. package/lib/module/utils/normalizeHtmlStyle.js.map +1 -0
  248. package/lib/module/utils/nullthrows.js +9 -0
  249. package/lib/module/utils/nullthrows.js.map +1 -0
  250. package/lib/module/utils/regexParser.js +46 -0
  251. package/lib/module/utils/regexParser.js.map +1 -0
  252. package/lib/typescript/package.json +1 -0
  253. package/lib/typescript/src/index.d.ts +3 -0
  254. package/lib/typescript/src/index.d.ts.map +1 -0
  255. package/lib/typescript/src/native/EnrichedTextInput.d.ts +3 -0
  256. package/lib/typescript/src/native/EnrichedTextInput.d.ts.map +1 -0
  257. package/lib/typescript/src/spec/EnrichedTextInputNativeComponent.d.ts +397 -0
  258. package/lib/typescript/src/spec/EnrichedTextInputNativeComponent.d.ts.map +1 -0
  259. package/lib/typescript/src/types.d.ts +447 -0
  260. package/lib/typescript/src/types.d.ts.map +1 -0
  261. package/lib/typescript/src/utils/EnrichedTextInputDefaultProps.d.ts +10 -0
  262. package/lib/typescript/src/utils/EnrichedTextInputDefaultProps.d.ts.map +1 -0
  263. package/lib/typescript/src/utils/normalizeHtmlStyle.d.ts +4 -0
  264. package/lib/typescript/src/utils/normalizeHtmlStyle.d.ts.map +1 -0
  265. package/lib/typescript/src/utils/nullthrows.d.ts +2 -0
  266. package/lib/typescript/src/utils/nullthrows.d.ts.map +1 -0
  267. package/lib/typescript/src/utils/regexParser.d.ts +3 -0
  268. package/lib/typescript/src/utils/regexParser.d.ts.map +1 -0
  269. package/package.json +226 -0
  270. package/react-native.config.js +13 -0
  271. package/src/index.tsx +20 -0
  272. package/src/native/EnrichedTextInput.tsx +370 -0
  273. package/src/spec/EnrichedTextInputNativeComponent.ts +517 -0
  274. package/src/types.ts +499 -0
  275. package/src/utils/EnrichedTextInputDefaultProps.ts +9 -0
  276. package/src/utils/normalizeHtmlStyle.ts +199 -0
  277. package/src/utils/nullthrows.ts +7 -0
  278. package/src/utils/regexParser.ts +56 -0
@@ -0,0 +1,664 @@
1
+ #import <InputConfig.h>
2
+ #import <React/RCTFont.h>
3
+
4
+ @implementation InputConfig {
5
+ UIColor *_primaryColor;
6
+ NSNumber *_primaryFontSize;
7
+ CGFloat _primaryLineHeight;
8
+ NSString *_primaryFontWeight;
9
+ NSString *_primaryFontFamily;
10
+ UIFont *_primaryFont;
11
+ UIFont *_monospacedFont;
12
+ BOOL _primaryFontNeedsRecreation;
13
+ BOOL _monospacedFontNeedsRecreation;
14
+ NSSet<NSNumber *> *_mentionIndicators;
15
+ CGFloat _h1FontSize;
16
+ BOOL _h1Bold;
17
+ CGFloat _h2FontSize;
18
+ BOOL _h2Bold;
19
+ CGFloat _h3FontSize;
20
+ BOOL _h3Bold;
21
+ CGFloat _h4FontSize;
22
+ BOOL _h4Bold;
23
+ CGFloat _h5FontSize;
24
+ BOOL _h5Bold;
25
+ CGFloat _h6FontSize;
26
+ BOOL _h6Bold;
27
+ UIColor *_blockquoteBorderColor;
28
+ CGFloat _blockquoteBorderWidth;
29
+ CGFloat _blockquoteGapWidth;
30
+ UIColor *_blockquoteColor;
31
+ UIColor *_inlineCodeFgColor;
32
+ UIColor *_inlineCodeBgColor;
33
+ CGFloat _orderedListGapWidth;
34
+ CGFloat _orderedListMarginLeft;
35
+ NSString *_orderedListMarkerFontWeight;
36
+ UIColor *_orderedListMarkerColor;
37
+ UIFont *_orderedListMarkerFont;
38
+ BOOL _olMarkerFontNeedsRecreation;
39
+ UIColor *_unorderedListBulletColor;
40
+ CGFloat _unorderedListBulletSize;
41
+ CGFloat _unorderedListGapWidth;
42
+ CGFloat _unorderedListMarginLeft;
43
+ UIColor *_linkColor;
44
+ TextDecorationLineEnum _linkDecorationLine;
45
+ NSDictionary *_mentionProperties;
46
+ UIColor *_codeBlockFgColor;
47
+ CGFloat _codeBlockBorderRadius;
48
+ UIColor *_codeBlockBgColor;
49
+ LinkRegexConfig *_linkRegexConfig;
50
+ NSRegularExpression *_parsedLinkRegex;
51
+ CGFloat _checkboxListBoxSize;
52
+ CGFloat _checkboxListGapWidth;
53
+ CGFloat _checkboxListMarginLeft;
54
+ UIColor *_checkboxListBoxColor;
55
+ UIImage *_checkboxCheckedImage;
56
+ UIImage *_checkboxUncheckedImage;
57
+ }
58
+
59
+ - (instancetype)init {
60
+ self = [super init];
61
+ _primaryFontNeedsRecreation = YES;
62
+ _monospacedFontNeedsRecreation = YES;
63
+ _olMarkerFontNeedsRecreation = YES;
64
+ return self;
65
+ }
66
+
67
+ - (id)copyWithZone:(NSZone *)zone {
68
+ InputConfig *copy = [[[self class] allocWithZone:zone] init];
69
+ copy->_primaryColor = [_primaryColor copy];
70
+ copy->_primaryFontSize = [_primaryFontSize copy];
71
+ copy->_primaryLineHeight = _primaryLineHeight;
72
+ copy->_primaryFontWeight = [_primaryFontWeight copy];
73
+ copy->_primaryFontFamily = [_primaryFontFamily copy];
74
+ copy->_primaryFont = [_primaryFont copy];
75
+ copy->_monospacedFont = [_monospacedFont copy];
76
+ copy->_mentionIndicators = [_mentionIndicators copy];
77
+ copy->_h1FontSize = _h1FontSize;
78
+ copy->_h1Bold = _h1Bold;
79
+ copy->_h2FontSize = _h2FontSize;
80
+ copy->_h2Bold = _h2Bold;
81
+ copy->_h3FontSize = _h3FontSize;
82
+ copy->_h3Bold = _h3Bold;
83
+ copy->_h4FontSize = _h4FontSize;
84
+ copy->_h4Bold = _h4Bold;
85
+ copy->_h5FontSize = _h5FontSize;
86
+ copy->_h5Bold = _h5Bold;
87
+ copy->_h6FontSize = _h6FontSize;
88
+ copy->_h6Bold = _h6Bold;
89
+ copy->_blockquoteBorderColor = [_blockquoteBorderColor copy];
90
+ copy->_blockquoteBorderWidth = _blockquoteBorderWidth;
91
+ copy->_blockquoteGapWidth = _blockquoteGapWidth;
92
+ copy->_blockquoteColor = [_blockquoteColor copy];
93
+ copy->_inlineCodeFgColor = [_inlineCodeFgColor copy];
94
+ copy->_inlineCodeBgColor = [_inlineCodeBgColor copy];
95
+ copy->_orderedListGapWidth = _orderedListGapWidth;
96
+ copy->_orderedListMarginLeft = _orderedListMarginLeft;
97
+ copy->_orderedListMarkerFontWeight = [_orderedListMarkerFontWeight copy];
98
+ copy->_orderedListMarkerColor = [_orderedListMarkerColor copy];
99
+ copy->_orderedListMarkerFont = [_orderedListMarkerFont copy];
100
+ copy->_unorderedListBulletColor = [_unorderedListBulletColor copy];
101
+ copy->_unorderedListBulletSize = _unorderedListBulletSize;
102
+ copy->_unorderedListGapWidth = _unorderedListGapWidth;
103
+ copy->_unorderedListMarginLeft = _unorderedListMarginLeft;
104
+ copy->_linkColor = [_linkColor copy];
105
+ copy->_linkDecorationLine = [_linkDecorationLine copy];
106
+ copy->_mentionProperties = [_mentionProperties mutableCopy];
107
+ copy->_codeBlockFgColor = [_codeBlockFgColor copy];
108
+ copy->_codeBlockBgColor = [_codeBlockBgColor copy];
109
+ copy->_codeBlockBorderRadius = _codeBlockBorderRadius;
110
+ copy->_linkRegexConfig = [_linkRegexConfig copy];
111
+ copy->_parsedLinkRegex = [_parsedLinkRegex copy];
112
+ copy->_checkboxListBoxSize = _checkboxListBoxSize;
113
+ copy->_checkboxListGapWidth = _checkboxListGapWidth;
114
+ copy->_checkboxListMarginLeft = _checkboxListMarginLeft;
115
+ copy->_checkboxListBoxColor = [_checkboxListBoxColor copy];
116
+ copy->_checkboxCheckedImage = _checkboxCheckedImage;
117
+ copy->_checkboxUncheckedImage = _checkboxUncheckedImage;
118
+ return copy;
119
+ }
120
+
121
+ - (UIColor *)primaryColor {
122
+ return _primaryColor != nullptr ? _primaryColor : UIColor.blackColor;
123
+ }
124
+
125
+ - (void)setPrimaryColor:(UIColor *)newValue {
126
+ _primaryColor = newValue;
127
+ }
128
+
129
+ - (NSNumber *)primaryFontSize {
130
+ return _primaryFontSize != nullptr ? _primaryFontSize : @(14);
131
+ }
132
+
133
+ - (void)setPrimaryFontSize:(NSNumber *)newValue {
134
+ _primaryFontSize = newValue;
135
+ _primaryFontNeedsRecreation = YES;
136
+ _monospacedFontNeedsRecreation = YES;
137
+ _olMarkerFontNeedsRecreation = YES;
138
+ }
139
+
140
+ - (CGFloat)primaryLineHeight {
141
+ return _primaryLineHeight;
142
+ }
143
+
144
+ - (void)setPrimaryLineHeight:(CGFloat)newValue {
145
+ _primaryLineHeight = newValue;
146
+ }
147
+
148
+ - (CGFloat)scaledPrimaryLineHeight {
149
+ return [[UIFontMetrics defaultMetrics]
150
+ scaledValueForValue:[self primaryLineHeight]];
151
+ }
152
+
153
+ - (NSString *)primaryFontWeight {
154
+ return _primaryFontWeight != nullptr
155
+ ? _primaryFontWeight
156
+ : [NSString stringWithFormat:@"%@", @(UIFontWeightRegular)];
157
+ }
158
+
159
+ - (void)setPrimaryFontWeight:(NSString *)newValue {
160
+ _primaryFontWeight = newValue;
161
+ _primaryFontNeedsRecreation = YES;
162
+ _monospacedFontNeedsRecreation = YES;
163
+ }
164
+
165
+ - (NSString *)primaryFontFamily {
166
+ return _primaryFontFamily;
167
+ }
168
+
169
+ - (void)setPrimaryFontFamily:(NSString *)newValue {
170
+ _primaryFontFamily = newValue;
171
+ _primaryFontNeedsRecreation = YES;
172
+ _olMarkerFontNeedsRecreation = YES;
173
+ }
174
+
175
+ - (UIFont *)primaryFont {
176
+ if (_primaryFontNeedsRecreation) {
177
+ _primaryFontNeedsRecreation = NO;
178
+
179
+ NSString *newFontWeight = [self primaryFontWeight];
180
+ // fix RCTFontWeight conversion warnings:
181
+ // sometimes changing font family comes with weight '0' if not specified
182
+ // RCTConvert doesn't recognize this value so we just nullify it and it gets
183
+ // a default value
184
+ if ([newFontWeight isEqualToString:@"0"]) {
185
+ newFontWeight = nullptr;
186
+ }
187
+
188
+ _primaryFont = [RCTFont updateFont:nullptr
189
+ withFamily:[self primaryFontFamily]
190
+ size:[self scaledPrimaryFontSize]
191
+ weight:newFontWeight
192
+ style:nullptr
193
+ variant:nullptr
194
+ scaleMultiplier:1];
195
+ }
196
+ return _primaryFont;
197
+ }
198
+
199
+ - (UIFont *)monospacedFont {
200
+ if (_monospacedFontNeedsRecreation) {
201
+ _monospacedFontNeedsRecreation = NO;
202
+ _monospacedFont = [UIFont
203
+ monospacedSystemFontOfSize:[[self scaledPrimaryFontSize] floatValue]
204
+ weight:[[self primaryFontWeight] floatValue]];
205
+ }
206
+ return _monospacedFont;
207
+ }
208
+
209
+ - (NSSet<NSNumber *> *)mentionIndicators {
210
+ return _mentionIndicators != nullptr ? _mentionIndicators
211
+ : [[NSSet alloc] init];
212
+ }
213
+
214
+ - (void)setMentionIndicators:(NSSet<NSNumber *> *)newValue {
215
+ _mentionIndicators = newValue;
216
+ }
217
+
218
+ - (CGFloat)h1FontSize {
219
+ return [[UIFontMetrics defaultMetrics] scaledValueForValue:_h1FontSize];
220
+ }
221
+
222
+ - (void)setH1FontSize:(CGFloat)newValue {
223
+ _h1FontSize = newValue;
224
+ }
225
+
226
+ - (BOOL)h1Bold {
227
+ return _h1Bold;
228
+ }
229
+
230
+ - (void)setH1Bold:(BOOL)newValue {
231
+ _h1Bold = newValue;
232
+ }
233
+
234
+ - (CGFloat)h2FontSize {
235
+ return [[UIFontMetrics defaultMetrics] scaledValueForValue:_h2FontSize];
236
+ }
237
+
238
+ - (void)setH2FontSize:(CGFloat)newValue {
239
+ _h2FontSize = newValue;
240
+ }
241
+
242
+ - (BOOL)h2Bold {
243
+ return _h2Bold;
244
+ }
245
+
246
+ - (void)setH2Bold:(BOOL)newValue {
247
+ _h2Bold = newValue;
248
+ }
249
+
250
+ - (CGFloat)h3FontSize {
251
+ return [[UIFontMetrics defaultMetrics] scaledValueForValue:_h3FontSize];
252
+ }
253
+
254
+ - (void)setH3FontSize:(CGFloat)newValue {
255
+ _h3FontSize = newValue;
256
+ }
257
+
258
+ - (BOOL)h3Bold {
259
+ return _h3Bold;
260
+ }
261
+
262
+ - (void)setH3Bold:(BOOL)newValue {
263
+ _h3Bold = newValue;
264
+ }
265
+
266
+ - (CGFloat)h4FontSize {
267
+ return [[UIFontMetrics defaultMetrics] scaledValueForValue:_h4FontSize];
268
+ }
269
+
270
+ - (void)setH4FontSize:(CGFloat)newValue {
271
+ _h4FontSize = newValue;
272
+ }
273
+
274
+ - (BOOL)h4Bold {
275
+ return _h4Bold;
276
+ }
277
+
278
+ - (void)setH4Bold:(BOOL)newValue {
279
+ _h4Bold = newValue;
280
+ }
281
+
282
+ - (CGFloat)h5FontSize {
283
+ return [[UIFontMetrics defaultMetrics] scaledValueForValue:_h5FontSize];
284
+ }
285
+
286
+ - (void)setH5FontSize:(CGFloat)newValue {
287
+ _h5FontSize = newValue;
288
+ }
289
+
290
+ - (BOOL)h5Bold {
291
+ return _h5Bold;
292
+ }
293
+
294
+ - (void)setH5Bold:(BOOL)newValue {
295
+ _h5Bold = newValue;
296
+ }
297
+
298
+ - (CGFloat)h6FontSize {
299
+ return [[UIFontMetrics defaultMetrics] scaledValueForValue:_h6FontSize];
300
+ }
301
+
302
+ - (void)setH6FontSize:(CGFloat)newValue {
303
+ _h6FontSize = newValue;
304
+ }
305
+
306
+ - (BOOL)h6Bold {
307
+ return _h6Bold;
308
+ }
309
+
310
+ - (void)setH6Bold:(BOOL)newValue {
311
+ _h6Bold = newValue;
312
+ }
313
+
314
+ - (UIColor *)blockquoteBorderColor {
315
+ return _blockquoteBorderColor;
316
+ }
317
+
318
+ - (void)setBlockquoteBorderColor:(UIColor *)newValue {
319
+ _blockquoteBorderColor = newValue;
320
+ }
321
+
322
+ - (CGFloat)blockquoteBorderWidth {
323
+ return _blockquoteBorderWidth;
324
+ }
325
+
326
+ - (void)setBlockquoteBorderWidth:(CGFloat)newValue {
327
+ _blockquoteBorderWidth = newValue;
328
+ }
329
+
330
+ - (CGFloat)blockquoteGapWidth {
331
+ return _blockquoteGapWidth;
332
+ }
333
+
334
+ - (void)setBlockquoteGapWidth:(CGFloat)newValue {
335
+ _blockquoteGapWidth = newValue;
336
+ }
337
+
338
+ - (UIColor *)blockquoteColor {
339
+ return _blockquoteColor;
340
+ }
341
+
342
+ - (void)setBlockquoteColor:(UIColor *)newValue {
343
+ _blockquoteColor = newValue;
344
+ }
345
+
346
+ - (UIColor *)inlineCodeFgColor {
347
+ return _inlineCodeFgColor;
348
+ }
349
+
350
+ - (void)setInlineCodeFgColor:(UIColor *)newValue {
351
+ _inlineCodeFgColor = newValue;
352
+ }
353
+
354
+ - (UIColor *)inlineCodeBgColor {
355
+ return _inlineCodeBgColor;
356
+ }
357
+
358
+ - (void)setInlineCodeBgColor:(UIColor *)newValue {
359
+ _inlineCodeBgColor = newValue;
360
+ }
361
+
362
+ - (CGFloat)orderedListGapWidth {
363
+ return _orderedListGapWidth;
364
+ }
365
+
366
+ - (void)setOrderedListGapWidth:(CGFloat)newValue {
367
+ _orderedListGapWidth = newValue;
368
+ }
369
+
370
+ - (CGFloat)orderedListMarginLeft {
371
+ return _orderedListMarginLeft;
372
+ }
373
+
374
+ - (void)setOrderedListMarginLeft:(CGFloat)newValue {
375
+ _orderedListMarginLeft = newValue;
376
+ }
377
+
378
+ - (NSString *)orderedListMarkerFontWeight {
379
+ return _orderedListMarkerFontWeight;
380
+ }
381
+
382
+ - (void)setOrderedListMarkerFontWeight:(NSString *)newValue {
383
+ _orderedListMarkerFontWeight = newValue;
384
+ _olMarkerFontNeedsRecreation = YES;
385
+ }
386
+
387
+ - (UIColor *)orderedListMarkerColor {
388
+ return _orderedListMarkerColor;
389
+ }
390
+
391
+ - (void)setOrderedListMarkerColor:(UIColor *)newValue {
392
+ _orderedListMarkerColor = newValue;
393
+ }
394
+
395
+ - (UIFont *)orderedListMarkerFont {
396
+ if (_olMarkerFontNeedsRecreation) {
397
+ _olMarkerFontNeedsRecreation = NO;
398
+
399
+ NSString *newFontWeight = [self orderedListMarkerFontWeight];
400
+ // fix RCTFontWeight conversion warnings:
401
+ // sometimes changing font family comes with weight '0' if not specified
402
+ // RCTConvert doesn't recognize this value so we just nullify it and it gets
403
+ // a default value
404
+ if ([newFontWeight isEqualToString:@"0"]) {
405
+ newFontWeight = nullptr;
406
+ }
407
+
408
+ _orderedListMarkerFont = [RCTFont updateFont:nullptr
409
+ withFamily:[self primaryFontFamily]
410
+ size:[self scaledPrimaryFontSize]
411
+ weight:newFontWeight
412
+ style:nullptr
413
+ variant:nullptr
414
+ scaleMultiplier:1];
415
+ }
416
+ return _orderedListMarkerFont;
417
+ }
418
+
419
+ - (UIColor *)unorderedListBulletColor {
420
+ return _unorderedListBulletColor;
421
+ }
422
+
423
+ - (void)setUnorderedListBulletColor:(UIColor *)newValue {
424
+ _unorderedListBulletColor = newValue;
425
+ }
426
+
427
+ - (CGFloat)unorderedListBulletSize {
428
+ return _unorderedListBulletSize;
429
+ }
430
+
431
+ - (void)setUnorderedListBulletSize:(CGFloat)newValue {
432
+ _unorderedListBulletSize = newValue;
433
+ }
434
+
435
+ - (CGFloat)unorderedListGapWidth {
436
+ return _unorderedListGapWidth;
437
+ }
438
+
439
+ - (void)setUnorderedListGapWidth:(CGFloat)newValue {
440
+ _unorderedListGapWidth = newValue;
441
+ }
442
+
443
+ - (CGFloat)unorderedListMarginLeft {
444
+ return _unorderedListMarginLeft;
445
+ }
446
+
447
+ - (void)setUnorderedListMarginLeft:(CGFloat)newValue {
448
+ _unorderedListMarginLeft = newValue;
449
+ }
450
+
451
+ - (UIColor *)linkColor {
452
+ return _linkColor;
453
+ }
454
+
455
+ - (void)setLinkColor:(UIColor *)newValue {
456
+ _linkColor = newValue;
457
+ }
458
+
459
+ - (TextDecorationLineEnum)linkDecorationLine {
460
+ return _linkDecorationLine;
461
+ }
462
+
463
+ - (void)setLinkDecorationLine:(TextDecorationLineEnum)newValue {
464
+ _linkDecorationLine = newValue;
465
+ }
466
+
467
+ - (void)setMentionStyleProps:(NSDictionary *)newValue {
468
+ _mentionProperties = [newValue mutableCopy];
469
+ }
470
+
471
+ - (MentionStyleProps *)mentionStylePropsForIndicator:(NSString *)indicator {
472
+ if (_mentionProperties.count == 1 && _mentionProperties[@"all"] != nullptr) {
473
+ // single props for all the indicators
474
+ return _mentionProperties[@"all"];
475
+ } else if (_mentionProperties[indicator] != nullptr) {
476
+ return _mentionProperties[indicator];
477
+ }
478
+ MentionStyleProps *fallbackProps = [[MentionStyleProps alloc] init];
479
+ fallbackProps.color = [UIColor blueColor];
480
+ fallbackProps.backgroundColor = [UIColor yellowColor];
481
+ fallbackProps.decorationLine = DecorationUnderline;
482
+ return fallbackProps;
483
+ }
484
+
485
+ - (UIColor *)codeBlockFgColor {
486
+ return _codeBlockFgColor;
487
+ }
488
+
489
+ - (void)setCodeBlockFgColor:(UIColor *)newValue {
490
+ _codeBlockFgColor = newValue;
491
+ }
492
+
493
+ - (UIColor *)codeBlockBgColor {
494
+ return _codeBlockBgColor;
495
+ }
496
+
497
+ - (void)setCodeBlockBgColor:(UIColor *)newValue {
498
+ _codeBlockBgColor = newValue;
499
+ }
500
+
501
+ - (CGFloat)codeBlockBorderRadius {
502
+ return _codeBlockBorderRadius;
503
+ }
504
+
505
+ - (void)setCodeBlockBorderRadius:(CGFloat)newValue {
506
+ _codeBlockBorderRadius = newValue;
507
+ }
508
+
509
+ - (LinkRegexConfig *)linkRegexConfig {
510
+ return _linkRegexConfig;
511
+ }
512
+
513
+ - (void)setLinkRegexConfig:(LinkRegexConfig *)newValue {
514
+ _linkRegexConfig = newValue;
515
+
516
+ // try initializing the native regular expression if it applies
517
+ if (_linkRegexConfig.isDefault || _linkRegexConfig.isDisabled) {
518
+ return;
519
+ }
520
+
521
+ NSError *regexInitError;
522
+ NSRegularExpressionOptions options =
523
+ (_linkRegexConfig.caseInsensitive ? NSRegularExpressionCaseInsensitive
524
+ : 0) |
525
+ (_linkRegexConfig.dotAll ? NSRegularExpressionDotMatchesLineSeparators
526
+ : 0);
527
+ NSRegularExpression *userRegex =
528
+ [NSRegularExpression regularExpressionWithPattern:_linkRegexConfig.pattern
529
+ options:options
530
+ error:&regexInitError];
531
+
532
+ if (regexInitError) {
533
+ RCTLogWarn(@"[EnrichedTextInput]: Couldn't parse the user-defined link "
534
+ @"regex, falling back to a default regex.");
535
+ _parsedLinkRegex = nullptr;
536
+ } else {
537
+ _parsedLinkRegex = userRegex;
538
+ }
539
+ }
540
+
541
+ - (NSRegularExpression *)parsedLinkRegex {
542
+ return _parsedLinkRegex;
543
+ }
544
+
545
+ - (void)invalidateFonts {
546
+ _primaryFontNeedsRecreation = YES;
547
+ _monospacedFontNeedsRecreation = YES;
548
+ _olMarkerFontNeedsRecreation = YES;
549
+ }
550
+
551
+ - (NSNumber *)scaledPrimaryFontSize {
552
+ CGFloat scaledSize = [[UIFontMetrics defaultMetrics]
553
+ scaledValueForValue:[[self primaryFontSize] floatValue]];
554
+ return @(scaledSize);
555
+ }
556
+
557
+ - (CGFloat)checkboxListBoxSize {
558
+ return _checkboxListBoxSize;
559
+ }
560
+
561
+ - (void)setCheckboxListBoxSize:(CGFloat)newValue {
562
+ if (_checkboxListBoxSize != newValue) {
563
+ _checkboxListBoxSize = newValue;
564
+ // Invalidate checkbox images because box size changed
565
+ _checkboxCheckedImage = nil;
566
+ _checkboxUncheckedImage = nil;
567
+ }
568
+ }
569
+
570
+ - (CGFloat)checkboxListGapWidth {
571
+ return _checkboxListGapWidth;
572
+ }
573
+
574
+ - (void)setCheckboxListGapWidth:(CGFloat)newValue {
575
+ _checkboxListGapWidth = newValue;
576
+ }
577
+
578
+ - (CGFloat)checkboxListMarginLeft {
579
+ return _checkboxListMarginLeft;
580
+ }
581
+
582
+ - (void)setCheckboxListMarginLeft:(CGFloat)newValue {
583
+ _checkboxListMarginLeft = newValue;
584
+ }
585
+
586
+ - (UIColor *)checkboxListBoxColor {
587
+ return _checkboxListBoxColor;
588
+ }
589
+
590
+ - (void)setCheckboxListBoxColor:(UIColor *)newValue {
591
+ if (_checkboxListBoxColor != newValue) {
592
+ _checkboxListBoxColor = newValue;
593
+ // Invalidate checkbox images because color changed
594
+ _checkboxCheckedImage = nil;
595
+ _checkboxUncheckedImage = nil;
596
+ }
597
+ }
598
+
599
+ - (UIImage *)checkboxCheckedImage {
600
+ if (!_checkboxCheckedImage) {
601
+ _checkboxCheckedImage = [self generateCheckboxImage:YES];
602
+ }
603
+ return _checkboxCheckedImage;
604
+ }
605
+
606
+ - (UIImage *)checkboxUncheckedImage {
607
+ if (!_checkboxUncheckedImage) {
608
+ _checkboxUncheckedImage = [self generateCheckboxImage:NO];
609
+ }
610
+ return _checkboxUncheckedImage;
611
+ }
612
+
613
+ - (UIImage *)generateCheckboxImage:(BOOL)isChecked {
614
+ CGFloat boxSize = self.checkboxListBoxSize;
615
+ UIColor *boxColor = self.checkboxListBoxColor ?: [UIColor blackColor];
616
+
617
+ UIGraphicsBeginImageContextWithOptions(CGSizeMake(boxSize, boxSize), NO, 0.0);
618
+ CGRect localRect = CGRectMake(0, 0, boxSize, boxSize);
619
+ CGFloat cornerRadius = boxSize * 0.15f;
620
+ CGFloat strokeWidth = boxSize * 0.1f;
621
+ CGRect insetRect =
622
+ CGRectInset(localRect, strokeWidth / 2.0, strokeWidth / 2.0);
623
+
624
+ // Draw Box
625
+ UIBezierPath *boxPath = [UIBezierPath bezierPathWithRoundedRect:insetRect
626
+ cornerRadius:cornerRadius];
627
+ [boxPath setLineWidth:strokeWidth];
628
+
629
+ if (isChecked) {
630
+ [[boxColor colorWithAlphaComponent:1.0] setFill];
631
+ [boxPath fill];
632
+ [[boxColor colorWithAlphaComponent:1.0] setStroke];
633
+ [boxPath stroke];
634
+
635
+ // Draw Checkmark
636
+ UIBezierPath *checkPath = [UIBezierPath bezierPath];
637
+ CGFloat startX = insetRect.origin.x + insetRect.size.width * 0.25;
638
+ CGFloat startY = insetRect.origin.y + insetRect.size.height * 0.5;
639
+ CGFloat midX = insetRect.origin.x + insetRect.size.width * 0.45;
640
+ CGFloat midY = insetRect.origin.y + insetRect.size.height * 0.65;
641
+ CGFloat endX = insetRect.origin.x + insetRect.size.width * 0.75;
642
+ CGFloat endY = insetRect.origin.y + insetRect.size.height * 0.35;
643
+
644
+ [checkPath moveToPoint:CGPointMake(startX, startY)];
645
+ [checkPath addLineToPoint:CGPointMake(midX, midY)];
646
+ [checkPath addLineToPoint:CGPointMake(endX, endY)];
647
+
648
+ [checkPath setLineWidth:strokeWidth * 1.5];
649
+ [[UIColor whiteColor] setStroke];
650
+ [checkPath setLineCapStyle:kCGLineCapRound];
651
+ [checkPath setLineJoinStyle:kCGLineJoinRound];
652
+ [checkPath stroke];
653
+ } else {
654
+ [[boxColor colorWithAlphaComponent:1.0] setStroke];
655
+ [boxPath stroke];
656
+ }
657
+
658
+ UIImage *result = UIGraphicsGetImageFromCurrentImageContext();
659
+ UIGraphicsEndImageContext();
660
+
661
+ return result;
662
+ }
663
+
664
+ @end
@@ -0,0 +1,7 @@
1
+ #import <UIKit/UIKit.h>
2
+ #pragma once
3
+
4
+ @interface UIColor (ColorExtension)
5
+ - (BOOL)isEqualToColor:(UIColor *)otherColor;
6
+ - (UIColor *)colorWithAlphaIfNotTransparent:(CGFloat)newAlpha;
7
+ @end
@@ -0,0 +1,38 @@
1
+ #import "ColorExtension.h"
2
+
3
+ @implementation UIColor (ColorExtension)
4
+ - (BOOL)isEqualToColor:(UIColor *)otherColor {
5
+ CGColorSpaceRef colorSpaceRGB = CGColorSpaceCreateDeviceRGB();
6
+
7
+ UIColor * (^convertColorToRGBSpace)(UIColor *) = ^(UIColor *color) {
8
+ if (CGColorSpaceGetModel(CGColorGetColorSpace(color.CGColor)) ==
9
+ kCGColorSpaceModelMonochrome) {
10
+ const CGFloat *oldComponents = CGColorGetComponents(color.CGColor);
11
+ CGFloat components[4] = {oldComponents[0], oldComponents[0],
12
+ oldComponents[0], oldComponents[1]};
13
+ CGColorRef colorRef = CGColorCreate(colorSpaceRGB, components);
14
+
15
+ UIColor *color = [UIColor colorWithCGColor:colorRef];
16
+ CGColorRelease(colorRef);
17
+ return color;
18
+ } else {
19
+ return color;
20
+ }
21
+ };
22
+
23
+ UIColor *selfColor = convertColorToRGBSpace(self);
24
+ otherColor = convertColorToRGBSpace(otherColor);
25
+ CGColorSpaceRelease(colorSpaceRGB);
26
+
27
+ return [selfColor isEqual:otherColor];
28
+ }
29
+
30
+ - (UIColor *)colorWithAlphaIfNotTransparent:(CGFloat)newAlpha {
31
+ CGFloat alpha = 0.0;
32
+ [self getRed:nil green:nil blue:nil alpha:&alpha];
33
+ if (alpha > 0.0) {
34
+ return [self colorWithAlphaComponent:newAlpha];
35
+ }
36
+ return self;
37
+ }
38
+ @end
@@ -0,0 +1,11 @@
1
+ #import <UIKit/UIKit.h>
2
+ #pragma once
3
+
4
+ @interface UIFont (FontExtension)
5
+ - (BOOL)isBold;
6
+ - (UIFont *)setBold;
7
+ - (BOOL)isItalic;
8
+ - (UIFont *)setItalic;
9
+ - (UIFont *)withFontTraits:(UIFont *)from;
10
+ - (UIFont *)setSize:(CGFloat)size;
11
+ @end