react-native-enriched 0.2.1 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +21 -16
- package/android/build.gradle +77 -72
- package/android/generated/java/com/facebook/react/viewmanagers/EnrichedTextInputViewManagerDelegate.java +21 -0
- package/android/generated/java/com/facebook/react/viewmanagers/EnrichedTextInputViewManagerInterface.java +7 -0
- package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ComponentDescriptors.cpp +1 -1
- package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ComponentDescriptors.h +1 -1
- package/android/generated/jni/react/renderer/components/ReactNativeEnrichedSpec/EventEmitters.cpp +276 -0
- package/android/generated/jni/react/renderer/components/ReactNativeEnrichedSpec/EventEmitters.h +239 -0
- package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/Props.cpp +10 -0
- package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/Props.h +251 -0
- package/android/gradle.properties +5 -5
- package/android/lint.gradle +70 -0
- package/android/src/main/java/com/swmansion/enriched/{EnrichedTextInputViewPackage.kt → ReactNativeEnrichedPackage.kt} +4 -5
- package/android/src/main/java/com/swmansion/enriched/{utils → common}/AsyncDrawable.kt +50 -15
- package/android/src/main/java/com/swmansion/enriched/common/CheckboxDrawable.kt +81 -0
- package/android/src/main/java/com/swmansion/enriched/common/EnrichedConstants.kt +11 -0
- package/android/src/main/java/com/swmansion/enriched/common/EnrichedStyle.kt +57 -0
- package/android/src/main/java/com/swmansion/enriched/{spans/utils → common}/ForceRedrawSpan.kt +3 -2
- package/android/src/main/java/com/swmansion/enriched/common/MentionStyle.kt +7 -0
- package/android/src/main/java/com/swmansion/enriched/{utils → common}/ResourceManager.kt +1 -1
- package/android/src/main/java/com/swmansion/enriched/{utils → common/parser}/EnrichedParser.java +228 -160
- package/android/src/main/java/com/swmansion/enriched/common/parser/EnrichedSpanFactory.kt +79 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedBlockQuoteSpan.kt +53 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedBoldSpan.kt +12 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedCheckboxListSpan.kt +91 -0
- package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/EnrichedCodeBlockSpan.kt +12 -14
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH1Span.kt +20 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH2Span.kt +20 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH3Span.kt +20 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH4Span.kt +21 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH5Span.kt +20 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH6Span.kt +20 -0
- package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/EnrichedImageSpan.kt +68 -51
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedInlineCodeSpan.kt +24 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedItalicSpan.kt +12 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedLinkSpan.kt +26 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedMentionSpan.kt +35 -0
- package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/EnrichedOrderedListSpan.kt +21 -29
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedStrikeThroughSpan.kt +11 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedUnderlineSpan.kt +11 -0
- package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/EnrichedUnorderedListSpan.kt +13 -17
- package/android/src/main/java/com/swmansion/enriched/common/spans/interfaces/EnrichedBlockSpan.kt +5 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/interfaces/EnrichedHeadingSpan.kt +3 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/interfaces/EnrichedInlineSpan.kt +3 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/interfaces/EnrichedParagraphSpan.kt +5 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/interfaces/EnrichedSpan.kt +3 -0
- package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/interfaces/EnrichedZeroWidthSpaceSpan.kt +2 -3
- package/android/src/main/java/com/swmansion/enriched/textinput/EnrichedTextInputConnectionWrapper.kt +140 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/EnrichedTextInputSpannableFactory.kt +83 -0
- package/android/src/main/java/com/swmansion/enriched/{EnrichedTextInputView.kt → textinput/EnrichedTextInputView.kt} +322 -157
- package/android/src/main/java/com/swmansion/enriched/{EnrichedTextInputViewLayoutManager.kt → textinput/EnrichedTextInputViewLayoutManager.kt} +4 -2
- package/android/src/main/java/com/swmansion/enriched/{EnrichedTextInputViewManager.kt → textinput/EnrichedTextInputViewManager.kt} +182 -66
- package/android/src/main/java/com/swmansion/enriched/{MeasurementStore.kt → textinput/MeasurementStore.kt} +75 -25
- package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/MentionHandler.kt +22 -12
- package/android/src/main/java/com/swmansion/enriched/textinput/events/OnChangeHtmlEvent.kt +27 -0
- package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnChangeSelectionEvent.kt +11 -10
- package/android/src/main/java/com/swmansion/enriched/textinput/events/OnChangeStateEvent.kt +21 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/events/OnChangeTextEvent.kt +30 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/events/OnInputBlurEvent.kt +25 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/events/OnInputFocusEvent.kt +25 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/events/OnInputKeyPressEvent.kt +27 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/events/OnLinkDetectedEvent.kt +32 -0
- package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnMentionDetectedEvent.kt +11 -10
- package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnMentionEvent.kt +10 -9
- package/android/src/main/java/com/swmansion/enriched/textinput/events/OnPasteImagesEvent.kt +47 -0
- package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnRequestHtmlResultEvent.kt +2 -3
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputBlockQuoteSpan.kt +14 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputBoldSpan.kt +14 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputCheckboxListSpan.kt +15 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputCodeBlockSpan.kt +14 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH1Span.kt +14 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH2Span.kt +14 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH3Span.kt +14 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH4Span.kt +14 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH5Span.kt +14 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH6Span.kt +14 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputImageSpan.kt +36 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputInlineCodeSpan.kt +14 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputItalicSpan.kt +14 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputLinkSpan.kt +15 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputMentionSpan.kt +18 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputOrderedListSpan.kt +21 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputStrikeThroughSpan.kt +14 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputUnderlineSpan.kt +14 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputUnorderedListSpan.kt +14 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedSpans.kt +241 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/interfaces/EnrichedInputSpan.kt +10 -0
- package/android/src/main/java/com/swmansion/enriched/{styles → textinput/styles}/HtmlStyle.kt +129 -57
- package/android/src/main/java/com/swmansion/enriched/{styles → textinput/styles}/InlineStyles.kt +30 -13
- package/android/src/main/java/com/swmansion/enriched/textinput/styles/ListStyles.kt +263 -0
- package/android/src/main/java/com/swmansion/enriched/{styles → textinput/styles}/ParagraphStyles.kt +94 -34
- package/android/src/main/java/com/swmansion/enriched/{styles → textinput/styles}/ParametrizedStyles.kt +143 -67
- package/android/src/main/java/com/swmansion/enriched/textinput/utils/EnrichedEditableFactory.kt +17 -0
- package/android/src/main/java/com/swmansion/enriched/{utils → textinput/utils}/EnrichedSelection.kt +84 -54
- package/android/src/main/java/com/swmansion/enriched/textinput/utils/EnrichedSpanState.kt +304 -0
- package/android/src/main/java/com/swmansion/enriched/{utils/Utils.kt → textinput/utils/EnrichedSpannable.kt} +22 -31
- package/android/src/main/java/com/swmansion/enriched/textinput/utils/EnrichedSpannableStringBuilder.kt +16 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/utils/RichContentReceiver.kt +127 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/utils/Utils.kt +106 -0
- package/android/src/main/java/com/swmansion/enriched/{watchers → textinput/watchers}/EnrichedSpanWatcher.kt +56 -24
- package/android/src/main/java/com/swmansion/enriched/{watchers → textinput/watchers}/EnrichedTextWatcher.kt +37 -14
- package/android/src/main/new_arch/CMakeLists.txt +7 -1
- package/android/src/main/new_arch/ReactNativeEnrichedSpec.cpp +11 -0
- package/android/src/main/new_arch/ReactNativeEnrichedSpec.h +15 -0
- package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/EnrichedTextInputMeasurementManager.h +1 -1
- package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/EnrichedTextInputShadowNode.h +2 -2
- package/android/src/main/new_arch/react/renderer/components/ReactNativeEnrichedSpec/conversions.h +46 -0
- package/ios/EnrichedTextInputView.h +2 -1
- package/ios/EnrichedTextInputView.mm +603 -60
- package/ios/config/InputConfig.h +28 -0
- package/ios/config/InputConfig.mm +237 -8
- package/ios/extensions/ImageExtension.h +35 -0
- package/ios/extensions/ImageExtension.mm +156 -0
- package/ios/{utils → extensions}/LayoutManagerExtension.mm +115 -95
- package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ComponentDescriptors.cpp +1 -1
- package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ComponentDescriptors.h +1 -1
- package/ios/generated/ReactNativeEnrichedSpec/EventEmitters.cpp +276 -0
- package/ios/generated/ReactNativeEnrichedSpec/EventEmitters.h +239 -0
- package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/Props.cpp +10 -0
- package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/Props.h +251 -0
- package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/RCTComponentViewHelpers.h +95 -0
- package/ios/inputParser/InputParser.mm +218 -18
- package/ios/inputTextView/InputTextView.mm +118 -0
- package/ios/{attachments → interfaces}/ImageAttachment.h +1 -0
- package/ios/interfaces/ImageAttachment.mm +46 -0
- package/ios/interfaces/LinkRegexConfig.h +19 -0
- package/ios/interfaces/LinkRegexConfig.mm +37 -0
- package/ios/{utils → interfaces}/MentionStyleProps.mm +2 -2
- package/ios/{utils → interfaces}/StyleHeaders.h +22 -1
- package/ios/{utils → interfaces}/StyleTypeEnum.h +4 -0
- package/ios/internals/EnrichedTextInputViewState.cpp +6 -6
- package/ios/styles/BlockQuoteStyle.mm +5 -5
- package/ios/styles/BoldStyle.mm +21 -6
- package/ios/styles/CheckboxListStyle.mm +321 -0
- package/ios/styles/CodeBlockStyle.mm +5 -5
- package/ios/styles/H1Style.mm +3 -0
- package/ios/styles/H2Style.mm +3 -0
- package/ios/styles/H3Style.mm +3 -0
- package/ios/styles/H4Style.mm +20 -0
- package/ios/styles/H5Style.mm +20 -0
- package/ios/styles/H6Style.mm +20 -0
- package/ios/styles/HeadingStyleBase.mm +161 -72
- package/ios/styles/ImageStyle.mm +5 -5
- package/ios/styles/InlineCodeStyle.mm +30 -19
- package/ios/styles/ItalicStyle.mm +5 -5
- package/ios/styles/LinkStyle.mm +98 -40
- package/ios/styles/MentionStyle.mm +4 -4
- package/ios/styles/OrderedListStyle.mm +5 -5
- package/ios/styles/StrikethroughStyle.mm +5 -5
- package/ios/styles/UnderlineStyle.mm +5 -5
- package/ios/styles/UnorderedListStyle.mm +5 -5
- package/ios/utils/CheckboxHitTestUtils.h +10 -0
- package/ios/utils/CheckboxHitTestUtils.mm +123 -0
- package/ios/utils/ParagraphAttributesUtils.h +4 -0
- package/ios/utils/ParagraphAttributesUtils.mm +142 -45
- package/ios/utils/ParagraphsUtils.mm +4 -4
- package/ios/utils/TextBlockTapGestureRecognizer.h +17 -0
- package/ios/utils/TextBlockTapGestureRecognizer.mm +56 -0
- package/ios/utils/ZeroWidthSpaceUtils.mm +14 -3
- package/lib/module/EnrichedTextInput.js +57 -11
- package/lib/module/EnrichedTextInput.js.map +1 -1
- package/lib/module/{EnrichedTextInputNativeComponent.ts → spec/EnrichedTextInputNativeComponent.ts} +175 -18
- package/lib/module/types.js +4 -0
- package/lib/module/types.js.map +1 -0
- package/lib/module/{normalizeHtmlStyle.js → utils/normalizeHtmlStyle.js} +18 -0
- package/lib/module/utils/normalizeHtmlStyle.js.map +1 -0
- package/lib/module/utils/nullthrows.js +9 -0
- package/lib/module/utils/nullthrows.js.map +1 -0
- package/lib/module/utils/regexParser.js +46 -0
- package/lib/module/utils/regexParser.js.map +1 -0
- package/lib/typescript/src/EnrichedTextInput.d.ts +20 -51
- package/lib/typescript/src/EnrichedTextInput.d.ts.map +1 -1
- package/lib/typescript/src/index.d.ts +2 -1
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/lib/typescript/src/{EnrichedTextInputNativeComponent.d.ts → spec/EnrichedTextInputNativeComponent.d.ts} +154 -18
- package/lib/typescript/src/spec/EnrichedTextInputNativeComponent.d.ts.map +1 -0
- package/lib/typescript/src/types.d.ts +58 -0
- package/lib/typescript/src/types.d.ts.map +1 -0
- package/lib/typescript/src/utils/normalizeHtmlStyle.d.ts +4 -0
- package/lib/typescript/src/utils/normalizeHtmlStyle.d.ts.map +1 -0
- package/lib/typescript/src/utils/nullthrows.d.ts +2 -0
- package/lib/typescript/src/utils/nullthrows.d.ts.map +1 -0
- package/lib/typescript/src/utils/regexParser.d.ts +3 -0
- package/lib/typescript/src/utils/regexParser.d.ts.map +1 -0
- package/package.json +13 -9
- package/src/EnrichedTextInput.tsx +88 -63
- package/src/index.tsx +5 -1
- package/src/{EnrichedTextInputNativeComponent.ts → spec/EnrichedTextInputNativeComponent.ts} +175 -18
- package/src/types.ts +59 -0
- package/src/{normalizeHtmlStyle.ts → utils/normalizeHtmlStyle.ts} +20 -5
- package/src/utils/nullthrows.ts +7 -0
- package/src/utils/regexParser.ts +56 -0
- package/android/generated/jni/react/renderer/components/RNEnrichedTextInputViewSpec/EventEmitters.cpp +0 -128
- package/android/generated/jni/react/renderer/components/RNEnrichedTextInputViewSpec/EventEmitters.h +0 -102
- package/android/src/main/java/com/swmansion/enriched/events/OnChangeHtmlEvent.kt +0 -28
- package/android/src/main/java/com/swmansion/enriched/events/OnChangeStateEvent.kt +0 -24
- package/android/src/main/java/com/swmansion/enriched/events/OnChangeTextEvent.kt +0 -30
- package/android/src/main/java/com/swmansion/enriched/events/OnInputBlurEvent.kt +0 -27
- package/android/src/main/java/com/swmansion/enriched/events/OnInputFocusEvent.kt +0 -27
- package/android/src/main/java/com/swmansion/enriched/events/OnLinkDetectedEvent.kt +0 -30
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedBlockQuoteSpan.kt +0 -44
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedBoldSpan.kt +0 -16
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedH1Span.kt +0 -23
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedH2Span.kt +0 -23
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedH3Span.kt +0 -23
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedInlineCodeSpan.kt +0 -27
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedItalicSpan.kt +0 -15
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedLinkSpan.kt +0 -30
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedMentionSpan.kt +0 -42
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedSpans.kt +0 -136
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedStrikeThroughSpan.kt +0 -14
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedUnderlineSpan.kt +0 -14
- package/android/src/main/java/com/swmansion/enriched/spans/interfaces/EnrichedBlockSpan.kt +0 -4
- package/android/src/main/java/com/swmansion/enriched/spans/interfaces/EnrichedHeadingSpan.kt +0 -4
- package/android/src/main/java/com/swmansion/enriched/spans/interfaces/EnrichedInlineSpan.kt +0 -4
- package/android/src/main/java/com/swmansion/enriched/spans/interfaces/EnrichedParagraphSpan.kt +0 -4
- package/android/src/main/java/com/swmansion/enriched/spans/interfaces/EnrichedSpan.kt +0 -8
- package/android/src/main/java/com/swmansion/enriched/styles/ListStyles.kt +0 -172
- package/android/src/main/java/com/swmansion/enriched/utils/EnrichedSpanState.kt +0 -204
- package/android/src/main/new_arch/RNEnrichedTextInputViewSpec.cpp +0 -22
- package/android/src/main/new_arch/RNEnrichedTextInputViewSpec.h +0 -26
- package/android/src/main/new_arch/react/renderer/components/RNEnrichedTextInputViewSpec/conversions.h +0 -26
- package/ios/attachments/ImageAttachment.mm +0 -34
- package/ios/generated/RNEnrichedTextInputViewSpec/EventEmitters.cpp +0 -128
- package/ios/generated/RNEnrichedTextInputViewSpec/EventEmitters.h +0 -102
- package/lib/module/normalizeHtmlStyle.js.map +0 -1
- package/lib/typescript/src/EnrichedTextInputNativeComponent.d.ts.map +0 -1
- package/lib/typescript/src/normalizeHtmlStyle.d.ts +0 -4
- package/lib/typescript/src/normalizeHtmlStyle.d.ts.map +0 -1
- /package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ShadowNodes.cpp +0 -0
- /package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ShadowNodes.h +0 -0
- /package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/States.cpp +0 -0
- /package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/States.h +0 -0
- /package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/EnrichedTextInputComponentDescriptor.h +0 -0
- /package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/EnrichedTextInputMeasurementManager.cpp +0 -0
- /package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/EnrichedTextInputShadowNode.cpp +0 -0
- /package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/EnrichedTextInputState.cpp +0 -0
- /package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/EnrichedTextInputState.h +0 -0
- /package/ios/{utils → extensions}/ColorExtension.h +0 -0
- /package/ios/{utils → extensions}/ColorExtension.mm +0 -0
- /package/ios/{utils → extensions}/FontExtension.h +0 -0
- /package/ios/{utils → extensions}/FontExtension.mm +0 -0
- /package/ios/{utils → extensions}/LayoutManagerExtension.h +0 -0
- /package/ios/{utils → extensions}/StringExtension.h +0 -0
- /package/ios/{utils → extensions}/StringExtension.mm +0 -0
- /package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ShadowNodes.cpp +0 -0
- /package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ShadowNodes.h +0 -0
- /package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/States.cpp +0 -0
- /package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/States.h +0 -0
- /package/ios/{utils → interfaces}/BaseStyleProtocol.h +0 -0
- /package/ios/{utils → interfaces}/ImageData.h +0 -0
- /package/ios/{utils → interfaces}/ImageData.mm +0 -0
- /package/ios/{utils → interfaces}/LinkData.h +0 -0
- /package/ios/{utils → interfaces}/LinkData.mm +0 -0
- /package/ios/{attachments → interfaces}/MediaAttachment.h +0 -0
- /package/ios/{attachments → interfaces}/MediaAttachment.mm +0 -0
- /package/ios/{utils → interfaces}/MentionParams.h +0 -0
- /package/ios/{utils → interfaces}/MentionParams.mm +0 -0
- /package/ios/{utils → interfaces}/MentionStyleProps.h +0 -0
- /package/ios/{utils → interfaces}/StylePair.h +0 -0
- /package/ios/{utils → interfaces}/StylePair.mm +0 -0
- /package/ios/{utils → interfaces}/TextDecorationLineEnum.h +0 -0
- /package/ios/{utils → interfaces}/TextDecorationLineEnum.mm +0 -0
|
@@ -17,6 +17,7 @@ NS_ASSUME_NONNULL_BEGIN
|
|
|
17
17
|
- (void)focus;
|
|
18
18
|
- (void)blur;
|
|
19
19
|
- (void)setValue:(NSString *)text;
|
|
20
|
+
- (void)setSelection:(NSInteger)start end:(NSInteger)end;
|
|
20
21
|
- (void)toggleBold;
|
|
21
22
|
- (void)toggleItalic;
|
|
22
23
|
- (void)toggleUnderline;
|
|
@@ -25,10 +26,14 @@ NS_ASSUME_NONNULL_BEGIN
|
|
|
25
26
|
- (void)toggleH1;
|
|
26
27
|
- (void)toggleH2;
|
|
27
28
|
- (void)toggleH3;
|
|
29
|
+
- (void)toggleH4;
|
|
30
|
+
- (void)toggleH5;
|
|
31
|
+
- (void)toggleH6;
|
|
28
32
|
- (void)toggleCodeBlock;
|
|
29
33
|
- (void)toggleBlockQuote;
|
|
30
34
|
- (void)toggleOrderedList;
|
|
31
35
|
- (void)toggleUnorderedList;
|
|
36
|
+
- (void)toggleCheckboxList:(BOOL)checked;
|
|
32
37
|
- (void)addLink:(NSInteger)start end:(NSInteger)end text:(NSString *)text url:(NSString *)url;
|
|
33
38
|
- (void)addImage:(NSString *)uri width:(float)width height:(float)height;
|
|
34
39
|
- (void)startMention:(NSString *)indicator;
|
|
@@ -89,6 +94,34 @@ if ([commandName isEqualToString:@"setValue"]) {
|
|
|
89
94
|
return;
|
|
90
95
|
}
|
|
91
96
|
|
|
97
|
+
if ([commandName isEqualToString:@"setSelection"]) {
|
|
98
|
+
#if RCT_DEBUG
|
|
99
|
+
if ([args count] != 2) {
|
|
100
|
+
RCTLogError(@"%@ command %@ received %d arguments, expected %d.", @"EnrichedTextInputView", commandName, (int)[args count], 2);
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
#endif
|
|
104
|
+
|
|
105
|
+
NSObject *arg0 = args[0];
|
|
106
|
+
#if RCT_DEBUG
|
|
107
|
+
if (!RCTValidateTypeOfViewCommandArgument(arg0, [NSNumber class], @"number", @"EnrichedTextInputView", commandName, @"1st")) {
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
#endif
|
|
111
|
+
NSInteger start = [(NSNumber *)arg0 intValue];
|
|
112
|
+
|
|
113
|
+
NSObject *arg1 = args[1];
|
|
114
|
+
#if RCT_DEBUG
|
|
115
|
+
if (!RCTValidateTypeOfViewCommandArgument(arg1, [NSNumber class], @"number", @"EnrichedTextInputView", commandName, @"2nd")) {
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
#endif
|
|
119
|
+
NSInteger end = [(NSNumber *)arg1 intValue];
|
|
120
|
+
|
|
121
|
+
[componentView setSelection:start end:end];
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
|
|
92
125
|
if ([commandName isEqualToString:@"toggleBold"]) {
|
|
93
126
|
#if RCT_DEBUG
|
|
94
127
|
if ([args count] != 0) {
|
|
@@ -201,6 +234,48 @@ if ([commandName isEqualToString:@"toggleH3"]) {
|
|
|
201
234
|
return;
|
|
202
235
|
}
|
|
203
236
|
|
|
237
|
+
if ([commandName isEqualToString:@"toggleH4"]) {
|
|
238
|
+
#if RCT_DEBUG
|
|
239
|
+
if ([args count] != 0) {
|
|
240
|
+
RCTLogError(@"%@ command %@ received %d arguments, expected %d.", @"EnrichedTextInputView", commandName, (int)[args count], 0);
|
|
241
|
+
return;
|
|
242
|
+
}
|
|
243
|
+
#endif
|
|
244
|
+
|
|
245
|
+
|
|
246
|
+
|
|
247
|
+
[componentView toggleH4];
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
if ([commandName isEqualToString:@"toggleH5"]) {
|
|
252
|
+
#if RCT_DEBUG
|
|
253
|
+
if ([args count] != 0) {
|
|
254
|
+
RCTLogError(@"%@ command %@ received %d arguments, expected %d.", @"EnrichedTextInputView", commandName, (int)[args count], 0);
|
|
255
|
+
return;
|
|
256
|
+
}
|
|
257
|
+
#endif
|
|
258
|
+
|
|
259
|
+
|
|
260
|
+
|
|
261
|
+
[componentView toggleH5];
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
if ([commandName isEqualToString:@"toggleH6"]) {
|
|
266
|
+
#if RCT_DEBUG
|
|
267
|
+
if ([args count] != 0) {
|
|
268
|
+
RCTLogError(@"%@ command %@ received %d arguments, expected %d.", @"EnrichedTextInputView", commandName, (int)[args count], 0);
|
|
269
|
+
return;
|
|
270
|
+
}
|
|
271
|
+
#endif
|
|
272
|
+
|
|
273
|
+
|
|
274
|
+
|
|
275
|
+
[componentView toggleH6];
|
|
276
|
+
return;
|
|
277
|
+
}
|
|
278
|
+
|
|
204
279
|
if ([commandName isEqualToString:@"toggleCodeBlock"]) {
|
|
205
280
|
#if RCT_DEBUG
|
|
206
281
|
if ([args count] != 0) {
|
|
@@ -257,6 +332,26 @@ if ([commandName isEqualToString:@"toggleUnorderedList"]) {
|
|
|
257
332
|
return;
|
|
258
333
|
}
|
|
259
334
|
|
|
335
|
+
if ([commandName isEqualToString:@"toggleCheckboxList"]) {
|
|
336
|
+
#if RCT_DEBUG
|
|
337
|
+
if ([args count] != 1) {
|
|
338
|
+
RCTLogError(@"%@ command %@ received %d arguments, expected %d.", @"EnrichedTextInputView", commandName, (int)[args count], 1);
|
|
339
|
+
return;
|
|
340
|
+
}
|
|
341
|
+
#endif
|
|
342
|
+
|
|
343
|
+
NSObject *arg0 = args[0];
|
|
344
|
+
#if RCT_DEBUG
|
|
345
|
+
if (!RCTValidateTypeOfViewCommandArgument(arg0, [NSNumber class], @"boolean", @"EnrichedTextInputView", commandName, @"1st")) {
|
|
346
|
+
return;
|
|
347
|
+
}
|
|
348
|
+
#endif
|
|
349
|
+
BOOL checked = [(NSNumber *)arg0 boolValue];
|
|
350
|
+
|
|
351
|
+
[componentView toggleCheckboxList:checked];
|
|
352
|
+
return;
|
|
353
|
+
}
|
|
354
|
+
|
|
260
355
|
if ([commandName isEqualToString:@"addLink"]) {
|
|
261
356
|
#if RCT_DEBUG
|
|
262
357
|
if ([args count] != 4) {
|
|
@@ -7,11 +7,13 @@
|
|
|
7
7
|
|
|
8
8
|
@implementation InputParser {
|
|
9
9
|
EnrichedTextInputView *_input;
|
|
10
|
+
NSInteger _precedingImageCount;
|
|
10
11
|
}
|
|
11
12
|
|
|
12
13
|
- (instancetype)initWithInput:(id)input {
|
|
13
14
|
self = [super init];
|
|
14
15
|
_input = (EnrichedTextInputView *)input;
|
|
16
|
+
_precedingImageCount = 0;
|
|
15
17
|
return self;
|
|
16
18
|
}
|
|
17
19
|
|
|
@@ -31,6 +33,7 @@
|
|
|
31
33
|
BOOL inOrderedList = NO;
|
|
32
34
|
BOOL inBlockQuote = NO;
|
|
33
35
|
BOOL inCodeBlock = NO;
|
|
36
|
+
BOOL inCheckboxList = NO;
|
|
34
37
|
unichar lastCharacter = 0;
|
|
35
38
|
|
|
36
39
|
for (int i = 0; i < text.length; i++) {
|
|
@@ -105,6 +108,21 @@
|
|
|
105
108
|
[result appendString:@"\n</codeblock>\n<br>"];
|
|
106
109
|
inCodeBlock = NO;
|
|
107
110
|
}
|
|
111
|
+
} else if (inCheckboxList) {
|
|
112
|
+
CheckboxListStyle *cbLStyle = _input->stylesDict[@(CheckboxList)];
|
|
113
|
+
BOOL detected =
|
|
114
|
+
[cbLStyle detectStyle:NSMakeRange(currentRange.location, 0)];
|
|
115
|
+
if (detected) {
|
|
116
|
+
BOOL checked = [cbLStyle getCheckboxStateAt:currentRange.location];
|
|
117
|
+
if (checked) {
|
|
118
|
+
[result appendString:@"\n<li checked></li>"];
|
|
119
|
+
} else {
|
|
120
|
+
[result appendString:@"\n<li></li>"];
|
|
121
|
+
}
|
|
122
|
+
} else {
|
|
123
|
+
[result appendString:@"\n</ul>\n<br>"];
|
|
124
|
+
inCheckboxList = NO;
|
|
125
|
+
}
|
|
108
126
|
} else {
|
|
109
127
|
[result appendString:@"\n<br>"];
|
|
110
128
|
}
|
|
@@ -137,10 +155,15 @@
|
|
|
137
155
|
[previousActiveStyles containsObject:@([H1Style getStyleType])] ||
|
|
138
156
|
[previousActiveStyles containsObject:@([H2Style getStyleType])] ||
|
|
139
157
|
[previousActiveStyles containsObject:@([H3Style getStyleType])] ||
|
|
158
|
+
[previousActiveStyles containsObject:@([H4Style getStyleType])] ||
|
|
159
|
+
[previousActiveStyles containsObject:@([H5Style getStyleType])] ||
|
|
160
|
+
[previousActiveStyles containsObject:@([H6Style getStyleType])] ||
|
|
140
161
|
[previousActiveStyles
|
|
141
162
|
containsObject:@([BlockQuoteStyle getStyleType])] ||
|
|
142
163
|
[previousActiveStyles
|
|
143
|
-
containsObject:@([CodeBlockStyle getStyleType])]
|
|
164
|
+
containsObject:@([CodeBlockStyle getStyleType])] ||
|
|
165
|
+
[previousActiveStyles
|
|
166
|
+
containsObject:@([CheckboxListStyle getStyleType])]) {
|
|
144
167
|
// do nothing, proper closing paragraph tags have been already
|
|
145
168
|
// appended
|
|
146
169
|
} else {
|
|
@@ -186,6 +209,13 @@
|
|
|
186
209
|
inCodeBlock = NO;
|
|
187
210
|
[result appendString:@"\n</codeblock>"];
|
|
188
211
|
}
|
|
212
|
+
// handle ending checkbox list
|
|
213
|
+
if (inCheckboxList &&
|
|
214
|
+
![currentActiveStyles
|
|
215
|
+
containsObject:@([CheckboxListStyle getStyleType])]) {
|
|
216
|
+
inCheckboxList = NO;
|
|
217
|
+
[result appendString:@"\n</ul>"];
|
|
218
|
+
}
|
|
189
219
|
|
|
190
220
|
// handle starting unordered list
|
|
191
221
|
if (!inUnorderedList &&
|
|
@@ -215,6 +245,13 @@
|
|
|
215
245
|
inCodeBlock = YES;
|
|
216
246
|
[result appendString:@"\n<codeblock>"];
|
|
217
247
|
}
|
|
248
|
+
// handle starting checkbox list
|
|
249
|
+
if (!inCheckboxList &&
|
|
250
|
+
[currentActiveStyles
|
|
251
|
+
containsObject:@([CheckboxListStyle getStyleType])]) {
|
|
252
|
+
inCheckboxList = YES;
|
|
253
|
+
[result appendString:@"\n<ul data-type=\"checkbox\">"];
|
|
254
|
+
}
|
|
218
255
|
|
|
219
256
|
// don't add the <p> tag if some paragraph styles are present
|
|
220
257
|
if ([currentActiveStyles
|
|
@@ -224,10 +261,15 @@
|
|
|
224
261
|
[currentActiveStyles containsObject:@([H1Style getStyleType])] ||
|
|
225
262
|
[currentActiveStyles containsObject:@([H2Style getStyleType])] ||
|
|
226
263
|
[currentActiveStyles containsObject:@([H3Style getStyleType])] ||
|
|
264
|
+
[currentActiveStyles containsObject:@([H4Style getStyleType])] ||
|
|
265
|
+
[currentActiveStyles containsObject:@([H5Style getStyleType])] ||
|
|
266
|
+
[currentActiveStyles containsObject:@([H6Style getStyleType])] ||
|
|
227
267
|
[currentActiveStyles
|
|
228
268
|
containsObject:@([BlockQuoteStyle getStyleType])] ||
|
|
229
269
|
[currentActiveStyles
|
|
230
|
-
containsObject:@([CodeBlockStyle getStyleType])]
|
|
270
|
+
containsObject:@([CodeBlockStyle getStyleType])] ||
|
|
271
|
+
[currentActiveStyles
|
|
272
|
+
containsObject:@([CheckboxListStyle getStyleType])]) {
|
|
231
273
|
[result appendString:@"\n"];
|
|
232
274
|
} else {
|
|
233
275
|
[result appendString:@"\n<p>"];
|
|
@@ -373,13 +415,22 @@
|
|
|
373
415
|
} else if ([previousActiveStyles
|
|
374
416
|
containsObject:@([CodeBlockStyle getStyleType])]) {
|
|
375
417
|
[result appendString:@"\n</codeblock>"];
|
|
418
|
+
} else if ([previousActiveStyles
|
|
419
|
+
containsObject:@([CheckboxListStyle getStyleType])]) {
|
|
420
|
+
[result appendString:@"\n</ul>"];
|
|
376
421
|
} else if ([previousActiveStyles
|
|
377
422
|
containsObject:@([H1Style getStyleType])] ||
|
|
378
423
|
[previousActiveStyles
|
|
379
424
|
containsObject:@([H2Style getStyleType])] ||
|
|
380
425
|
[previousActiveStyles
|
|
381
|
-
containsObject:@([H3Style getStyleType])]
|
|
382
|
-
|
|
426
|
+
containsObject:@([H3Style getStyleType])] ||
|
|
427
|
+
[previousActiveStyles
|
|
428
|
+
containsObject:@([H4Style getStyleType])] ||
|
|
429
|
+
[previousActiveStyles
|
|
430
|
+
containsObject:@([H5Style getStyleType])] ||
|
|
431
|
+
[previousActiveStyles
|
|
432
|
+
containsObject:@([H6Style getStyleType])]) {
|
|
433
|
+
// do nothing, heading closing tag has already been appended
|
|
383
434
|
} else {
|
|
384
435
|
[result appendString:@"</p>"];
|
|
385
436
|
}
|
|
@@ -401,10 +452,20 @@
|
|
|
401
452
|
inCodeBlock = NO;
|
|
402
453
|
[result appendString:@"\n</codeblock>"];
|
|
403
454
|
}
|
|
455
|
+
if (inCheckboxList) {
|
|
456
|
+
inCheckboxList = NO;
|
|
457
|
+
[result appendString:@"\n</ul>"];
|
|
458
|
+
}
|
|
404
459
|
}
|
|
405
460
|
|
|
406
461
|
[result appendString:@"\n</html>"];
|
|
407
462
|
|
|
463
|
+
// remove Object Replacement Characters in the very end
|
|
464
|
+
[result replaceOccurrencesOfString:@"\uFFFC"
|
|
465
|
+
withString:@""
|
|
466
|
+
options:0
|
|
467
|
+
range:NSMakeRange(0, result.length)];
|
|
468
|
+
|
|
408
469
|
// remove zero width spaces in the very end
|
|
409
470
|
[result replaceOccurrencesOfString:@"\u200B"
|
|
410
471
|
withString:@""
|
|
@@ -507,9 +568,29 @@
|
|
|
507
568
|
return @"h2";
|
|
508
569
|
} else if ([style isEqualToNumber:@([H3Style getStyleType])]) {
|
|
509
570
|
return @"h3";
|
|
571
|
+
} else if ([style isEqualToNumber:@([H4Style getStyleType])]) {
|
|
572
|
+
return @"h4";
|
|
573
|
+
} else if ([style isEqualToNumber:@([H5Style getStyleType])]) {
|
|
574
|
+
return @"h5";
|
|
575
|
+
} else if ([style isEqualToNumber:@([H6Style getStyleType])]) {
|
|
576
|
+
return @"h6";
|
|
510
577
|
} else if ([style isEqualToNumber:@([UnorderedListStyle getStyleType])] ||
|
|
511
578
|
[style isEqualToNumber:@([OrderedListStyle getStyleType])]) {
|
|
512
579
|
return @"li";
|
|
580
|
+
} else if ([style isEqualToNumber:@([CheckboxListStyle getStyleType])]) {
|
|
581
|
+
if (openingTag) {
|
|
582
|
+
CheckboxListStyle *checkboxListStyleClass =
|
|
583
|
+
(CheckboxListStyle *)
|
|
584
|
+
_input->stylesDict[@([CheckboxListStyle getStyleType])];
|
|
585
|
+
BOOL checked = [checkboxListStyleClass getCheckboxStateAt:location];
|
|
586
|
+
|
|
587
|
+
if (checked) {
|
|
588
|
+
return @"li checked";
|
|
589
|
+
}
|
|
590
|
+
return @"li";
|
|
591
|
+
} else {
|
|
592
|
+
return @"li";
|
|
593
|
+
}
|
|
513
594
|
} else if ([style isEqualToNumber:@([BlockQuoteStyle getStyleType])] ||
|
|
514
595
|
[style isEqualToNumber:@([CodeBlockStyle getStyleType])]) {
|
|
515
596
|
// blockquotes and codeblock use <p> tags the same way lists use <li>
|
|
@@ -608,6 +689,28 @@
|
|
|
608
689
|
[((ImageStyle *)baseStyle) addImageAtRange:styleRange
|
|
609
690
|
imageData:imgData
|
|
610
691
|
withSelection:NO];
|
|
692
|
+
} else if ([styleType
|
|
693
|
+
isEqualToNumber:@([CheckboxListStyle getStyleType])]) {
|
|
694
|
+
NSDictionary *checkboxStates = (NSDictionary *)stylePair.styleValue;
|
|
695
|
+
CheckboxListStyle *cbLStyle = (CheckboxListStyle *)baseStyle;
|
|
696
|
+
|
|
697
|
+
// First apply the checkbox list style to the entire range with
|
|
698
|
+
// unchecked value
|
|
699
|
+
BOOL shouldAddTypingAttr =
|
|
700
|
+
styleRange.location + styleRange.length == plainTextLength;
|
|
701
|
+
[cbLStyle addAttributes:styleRange withTypingAttr:shouldAddTypingAttr];
|
|
702
|
+
|
|
703
|
+
if (!checkboxStates && checkboxStates.count == 0) {
|
|
704
|
+
continue;
|
|
705
|
+
}
|
|
706
|
+
// Then toggle checked checkboxes
|
|
707
|
+
for (NSNumber *key in checkboxStates) {
|
|
708
|
+
NSUInteger checkboxPosition = offset + [key unsignedIntegerValue];
|
|
709
|
+
BOOL isChecked = [checkboxStates[key] boolValue];
|
|
710
|
+
if (isChecked) {
|
|
711
|
+
[cbLStyle toggleCheckedAt:checkboxPosition];
|
|
712
|
+
}
|
|
713
|
+
}
|
|
611
714
|
} else {
|
|
612
715
|
BOOL shouldAddTypingAttr =
|
|
613
716
|
styleRange.location + styleRange.length == plainTextLength;
|
|
@@ -726,6 +829,10 @@
|
|
|
726
829
|
inString:fixedHtml
|
|
727
830
|
leading:YES
|
|
728
831
|
trailing:NO];
|
|
832
|
+
fixedHtml = [self stringByAddingNewlinesToTag:@"<li checked>"
|
|
833
|
+
inString:fixedHtml
|
|
834
|
+
leading:YES
|
|
835
|
+
trailing:NO];
|
|
729
836
|
fixedHtml = [self stringByAddingNewlinesToTag:@"<h1>"
|
|
730
837
|
inString:fixedHtml
|
|
731
838
|
leading:YES
|
|
@@ -738,6 +845,18 @@
|
|
|
738
845
|
inString:fixedHtml
|
|
739
846
|
leading:YES
|
|
740
847
|
trailing:NO];
|
|
848
|
+
fixedHtml = [self stringByAddingNewlinesToTag:@"<h4>"
|
|
849
|
+
inString:fixedHtml
|
|
850
|
+
leading:YES
|
|
851
|
+
trailing:NO];
|
|
852
|
+
fixedHtml = [self stringByAddingNewlinesToTag:@"<h5>"
|
|
853
|
+
inString:fixedHtml
|
|
854
|
+
leading:YES
|
|
855
|
+
trailing:NO];
|
|
856
|
+
fixedHtml = [self stringByAddingNewlinesToTag:@"<h6>"
|
|
857
|
+
inString:fixedHtml
|
|
858
|
+
leading:YES
|
|
859
|
+
trailing:NO];
|
|
741
860
|
|
|
742
861
|
// line closing tags
|
|
743
862
|
fixedHtml = [self stringByAddingNewlinesToTag:@"</p>"
|
|
@@ -760,6 +879,18 @@
|
|
|
760
879
|
inString:fixedHtml
|
|
761
880
|
leading:NO
|
|
762
881
|
trailing:YES];
|
|
882
|
+
fixedHtml = [self stringByAddingNewlinesToTag:@"</h4>"
|
|
883
|
+
inString:fixedHtml
|
|
884
|
+
leading:NO
|
|
885
|
+
trailing:YES];
|
|
886
|
+
fixedHtml = [self stringByAddingNewlinesToTag:@"</h5>"
|
|
887
|
+
inString:fixedHtml
|
|
888
|
+
leading:NO
|
|
889
|
+
trailing:YES];
|
|
890
|
+
fixedHtml = [self stringByAddingNewlinesToTag:@"</h6>"
|
|
891
|
+
inString:fixedHtml
|
|
892
|
+
leading:NO
|
|
893
|
+
trailing:YES];
|
|
763
894
|
|
|
764
895
|
// this is more like a hack but for some reason the last <br> in
|
|
765
896
|
// <blockquote> and <codeblock> are not properly changed into zero width
|
|
@@ -788,11 +919,11 @@
|
|
|
788
919
|
* APPROACH:
|
|
789
920
|
* This function treats the HTML as having two distinct states:
|
|
790
921
|
* 1. Structure Mode (Depth == 0): We are inside or between container tags (like
|
|
791
|
-
*
|
|
922
|
+
* blockquote, ul, codeblock). In this mode whitespace and newlines are
|
|
792
923
|
* considered layout artifacts and are REMOVED to prevent the parser from
|
|
793
924
|
* creating unwanted spaces.
|
|
794
|
-
* 2. Content Mode (Depth > 0): We are inside a text-containing tag (like
|
|
795
|
-
*
|
|
925
|
+
* 2. Content Mode (Depth > 0): We are inside a text-containing tag (like p,
|
|
926
|
+
* b, li). In this mode, all whitespace is PRESERVED exactly as is, ensuring
|
|
796
927
|
* that sentences and inline formatting remain readable.
|
|
797
928
|
*
|
|
798
929
|
* The function iterates character-by-character, using a depth counter to track
|
|
@@ -800,13 +931,13 @@
|
|
|
800
931
|
*
|
|
801
932
|
* IMPORTANT:
|
|
802
933
|
* The `textTags` set acts as a whitelist for "Content Mode". If you add support
|
|
803
|
-
* for a new HTML tag that contains visible text (e.g.,
|
|
934
|
+
* for a new HTML tag that contains visible text (e.g., h4, h5, h6),
|
|
804
935
|
* you MUST add it to the `textTags` set below.
|
|
805
936
|
*/
|
|
806
937
|
- (NSString *)stripExtraWhiteSpacesAndNewlines:(NSString *)html {
|
|
807
|
-
NSSet *textTags =
|
|
808
|
-
|
|
809
|
-
|
|
938
|
+
NSSet *textTags = [NSSet setWithObjects:@"p", @"h1", @"h2", @"h3", @"h4",
|
|
939
|
+
@"h5", @"h6", @"li", @"b", @"a", @"s",
|
|
940
|
+
@"mention", @"code", @"u", @"i", nil];
|
|
810
941
|
|
|
811
942
|
NSMutableString *output = [NSMutableString stringWithCapacity:html.length];
|
|
812
943
|
NSMutableString *currentTagBuffer = [NSMutableString string];
|
|
@@ -901,7 +1032,19 @@
|
|
|
901
1032
|
|
|
902
1033
|
NSArray *tagData = ongoingTags[tagName];
|
|
903
1034
|
NSInteger tagLocation = [((NSNumber *)tagData[0]) intValue];
|
|
904
|
-
|
|
1035
|
+
|
|
1036
|
+
// 'tagLocation' is an index based on 'plainText' which currently only holds
|
|
1037
|
+
// raw text.
|
|
1038
|
+
//
|
|
1039
|
+
// Since 'plainText' does not yet contain the special placeholders for images,
|
|
1040
|
+
// the indices for any text following an image are lower than they will be
|
|
1041
|
+
// in the final NSTextStorage.
|
|
1042
|
+
//
|
|
1043
|
+
// We add '_precedingImageCount' to shift the start index forward, aligning
|
|
1044
|
+
// this style's range with the actual position in the final text (where each
|
|
1045
|
+
// image adds 1 character).
|
|
1046
|
+
NSRange tagRange = NSMakeRange(tagLocation + _precedingImageCount,
|
|
1047
|
+
plainText.length - tagLocation);
|
|
905
1048
|
|
|
906
1049
|
[tagEntry addObject:[tagName copy]];
|
|
907
1050
|
[tagEntry addObject:[NSValue valueWithRange:tagRange]];
|
|
@@ -911,12 +1054,19 @@
|
|
|
911
1054
|
|
|
912
1055
|
[processedTags addObject:tagEntry];
|
|
913
1056
|
[ongoingTags removeObjectForKey:tagName];
|
|
1057
|
+
|
|
1058
|
+
if ([tagName isEqualToString:@"img"]) {
|
|
1059
|
+
_precedingImageCount++;
|
|
1060
|
+
}
|
|
914
1061
|
}
|
|
915
1062
|
|
|
916
1063
|
- (NSArray *)getTextAndStylesFromHtml:(NSString *)fixedHtml {
|
|
917
1064
|
NSMutableString *plainText = [[NSMutableString alloc] initWithString:@""];
|
|
918
1065
|
NSMutableDictionary *ongoingTags = [[NSMutableDictionary alloc] init];
|
|
919
1066
|
NSMutableArray *initiallyProcessedTags = [[NSMutableArray alloc] init];
|
|
1067
|
+
NSMutableDictionary *checkboxStates = [[NSMutableDictionary alloc] init];
|
|
1068
|
+
BOOL insideCheckboxList = NO;
|
|
1069
|
+
_precedingImageCount = 0;
|
|
920
1070
|
BOOL insideTag = NO;
|
|
921
1071
|
BOOL gettingTagName = NO;
|
|
922
1072
|
BOOL gettingTagParams = NO;
|
|
@@ -956,9 +1106,14 @@
|
|
|
956
1106
|
}
|
|
957
1107
|
|
|
958
1108
|
if ([currentTagName isEqualToString:@"p"] ||
|
|
959
|
-
[currentTagName isEqualToString:@"br"]
|
|
960
|
-
[currentTagName isEqualToString:@"li"]) {
|
|
1109
|
+
[currentTagName isEqualToString:@"br"]) {
|
|
961
1110
|
// do nothing, we don't include these tags in styles
|
|
1111
|
+
} else if ([currentTagName isEqualToString:@"li"]) {
|
|
1112
|
+
// Only track checkbox state if we're inside a checkbox list
|
|
1113
|
+
if (insideCheckboxList && !closingTag) {
|
|
1114
|
+
BOOL isChecked = [currentTagParams containsString:@"checked"];
|
|
1115
|
+
checkboxStates[@(plainText.length)] = @(isChecked);
|
|
1116
|
+
}
|
|
962
1117
|
} else if (!closingTag) {
|
|
963
1118
|
// we finish opening tag - get its location and optionally params and
|
|
964
1119
|
// put them under tag name key in ongoingTags
|
|
@@ -969,6 +1124,12 @@
|
|
|
969
1124
|
}
|
|
970
1125
|
ongoingTags[currentTagName] = tagArr;
|
|
971
1126
|
|
|
1127
|
+
// Check if this is a checkbox list
|
|
1128
|
+
if ([currentTagName isEqualToString:@"ul"] &&
|
|
1129
|
+
[self isUlCheckboxList:currentTagParams]) {
|
|
1130
|
+
insideCheckboxList = YES;
|
|
1131
|
+
}
|
|
1132
|
+
|
|
972
1133
|
// skip one newline after opening tags that are in separate lines
|
|
973
1134
|
// intentionally
|
|
974
1135
|
if ([currentTagName isEqualToString:@"ul"] ||
|
|
@@ -988,6 +1149,12 @@
|
|
|
988
1149
|
// we finish closing tags - pack tag name, tag range and optionally tag
|
|
989
1150
|
// params into an entry that goes inside initiallyProcessedTags
|
|
990
1151
|
|
|
1152
|
+
// Check if we're closing a checkbox list by looking at the params
|
|
1153
|
+
if ([currentTagName isEqualToString:@"ul"] &&
|
|
1154
|
+
[self isUlCheckboxList:currentTagParams]) {
|
|
1155
|
+
insideCheckboxList = NO;
|
|
1156
|
+
}
|
|
1157
|
+
|
|
991
1158
|
// skip one newline that was added before some closing tags that are in
|
|
992
1159
|
// separate lines
|
|
993
1160
|
if ([currentTagName isEqualToString:@"ul"] ||
|
|
@@ -1148,7 +1315,7 @@
|
|
|
1148
1315
|
[styleArr addObject:@([MentionStyle getStyleType])];
|
|
1149
1316
|
// extract html expression into dict using some regex
|
|
1150
1317
|
NSMutableDictionary *paramsDict = [[NSMutableDictionary alloc] init];
|
|
1151
|
-
NSString *pattern = @"(\\w+)
|
|
1318
|
+
NSString *pattern = @"(\\w+)=(['\"])(.*?)\\2";
|
|
1152
1319
|
NSRegularExpression *regex =
|
|
1153
1320
|
[NSRegularExpression regularExpressionWithPattern:pattern
|
|
1154
1321
|
options:0
|
|
@@ -1160,11 +1327,11 @@
|
|
|
1160
1327
|
usingBlock:^(NSTextCheckingResult *_Nullable result,
|
|
1161
1328
|
NSMatchingFlags flags,
|
|
1162
1329
|
BOOL *_Nonnull stop) {
|
|
1163
|
-
if (result.numberOfRanges ==
|
|
1330
|
+
if (result.numberOfRanges == 4) {
|
|
1164
1331
|
NSString *key = [params
|
|
1165
1332
|
substringWithRange:[result rangeAtIndex:1]];
|
|
1166
1333
|
NSString *value = [params
|
|
1167
|
-
substringWithRange:[result rangeAtIndex:
|
|
1334
|
+
substringWithRange:[result rangeAtIndex:3]];
|
|
1168
1335
|
paramsDict[key] = value;
|
|
1169
1336
|
}
|
|
1170
1337
|
}];
|
|
@@ -1192,9 +1359,22 @@
|
|
|
1192
1359
|
[styleArr addObject:@([H2Style getStyleType])];
|
|
1193
1360
|
} else if ([tagName isEqualToString:@"h3"]) {
|
|
1194
1361
|
[styleArr addObject:@([H3Style getStyleType])];
|
|
1362
|
+
} else if ([tagName isEqualToString:@"h4"]) {
|
|
1363
|
+
[styleArr addObject:@([H4Style getStyleType])];
|
|
1364
|
+
} else if ([tagName isEqualToString:@"h5"]) {
|
|
1365
|
+
[styleArr addObject:@([H5Style getStyleType])];
|
|
1366
|
+
} else if ([tagName isEqualToString:@"h6"]) {
|
|
1367
|
+
[styleArr addObject:@([H6Style getStyleType])];
|
|
1195
1368
|
}
|
|
1196
1369
|
} else if ([tagName isEqualToString:@"ul"]) {
|
|
1197
|
-
|
|
1370
|
+
if ([self isUlCheckboxList:params]) {
|
|
1371
|
+
[styleArr addObject:@([CheckboxListStyle getStyleType])];
|
|
1372
|
+
stylePair.styleValue =
|
|
1373
|
+
[self prepareCheckboxListStyleValue:tagRangeValue
|
|
1374
|
+
checkboxStates:checkboxStates];
|
|
1375
|
+
} else {
|
|
1376
|
+
[styleArr addObject:@([UnorderedListStyle getStyleType])];
|
|
1377
|
+
}
|
|
1198
1378
|
} else if ([tagName isEqualToString:@"ol"]) {
|
|
1199
1379
|
[styleArr addObject:@([OrderedListStyle getStyleType])];
|
|
1200
1380
|
} else if ([tagName isEqualToString:@"blockquote"]) {
|
|
@@ -1215,4 +1395,24 @@
|
|
|
1215
1395
|
return @[ plainText, processedStyles ];
|
|
1216
1396
|
}
|
|
1217
1397
|
|
|
1398
|
+
- (BOOL)isUlCheckboxList:(NSString *)params {
|
|
1399
|
+
return ([params containsString:@"data-type=\"checkbox\""] ||
|
|
1400
|
+
[params containsString:@"data-type='checkbox'"]);
|
|
1401
|
+
}
|
|
1402
|
+
|
|
1403
|
+
- (NSDictionary *)prepareCheckboxListStyleValue:(NSValue *)rangeValue
|
|
1404
|
+
checkboxStates:(NSDictionary *)checkboxStates {
|
|
1405
|
+
NSRange range = [rangeValue rangeValue];
|
|
1406
|
+
NSMutableDictionary *statesInRange = [[NSMutableDictionary alloc] init];
|
|
1407
|
+
|
|
1408
|
+
for (NSNumber *key in checkboxStates) {
|
|
1409
|
+
NSUInteger pos = [key unsignedIntegerValue];
|
|
1410
|
+
if (pos >= range.location && pos < range.location + range.length) {
|
|
1411
|
+
[statesInRange setObject:checkboxStates[key] forKey:key];
|
|
1412
|
+
}
|
|
1413
|
+
}
|
|
1414
|
+
|
|
1415
|
+
return statesInRange;
|
|
1416
|
+
}
|
|
1417
|
+
|
|
1218
1418
|
@end
|