@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.
- package/LICENSE +20 -0
- package/README.md +343 -0
- package/ReactNativeEnriched.podspec +31 -0
- package/android/build.gradle +106 -0
- package/android/generated/java/com/facebook/react/viewmanagers/EnrichedTextInputViewManagerDelegate.java +197 -0
- package/android/generated/java/com/facebook/react/viewmanagers/EnrichedTextInputViewManagerInterface.java +72 -0
- package/android/generated/jni/react/renderer/components/ReactNativeEnrichedSpec/ComponentDescriptors.cpp +22 -0
- package/android/generated/jni/react/renderer/components/ReactNativeEnrichedSpec/ComponentDescriptors.h +24 -0
- package/android/generated/jni/react/renderer/components/ReactNativeEnrichedSpec/EventEmitters.cpp +434 -0
- package/android/generated/jni/react/renderer/components/ReactNativeEnrichedSpec/EventEmitters.h +391 -0
- package/android/generated/jni/react/renderer/components/ReactNativeEnrichedSpec/Props.cpp +173 -0
- package/android/generated/jni/react/renderer/components/ReactNativeEnrichedSpec/Props.h +833 -0
- package/android/generated/jni/react/renderer/components/ReactNativeEnrichedSpec/ShadowNodes.cpp +17 -0
- package/android/generated/jni/react/renderer/components/ReactNativeEnrichedSpec/ShadowNodes.h +23 -0
- package/android/generated/jni/react/renderer/components/ReactNativeEnrichedSpec/States.cpp +16 -0
- package/android/generated/jni/react/renderer/components/ReactNativeEnrichedSpec/States.h +20 -0
- package/android/gradle.properties +5 -0
- package/android/lint.gradle +70 -0
- package/android/src/main/AndroidManifest.xml +3 -0
- package/android/src/main/AndroidManifestNew.xml +2 -0
- package/android/src/main/java/com/swmansion/enriched/ReactNativeEnrichedPackage.kt +20 -0
- package/android/src/main/java/com/swmansion/enriched/common/AsyncDrawable.kt +126 -0
- 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/common/ForceRedrawSpan.kt +14 -0
- package/android/src/main/java/com/swmansion/enriched/common/GumboNormalizer.kt +5 -0
- package/android/src/main/java/com/swmansion/enriched/common/MentionStyle.kt +7 -0
- package/android/src/main/java/com/swmansion/enriched/common/ResourceManager.kt +26 -0
- package/android/src/main/java/com/swmansion/enriched/common/parser/EnrichedParser.java +956 -0
- 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 +92 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedCodeBlockSpan.kt +81 -0
- 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/common/spans/EnrichedImageSpan.kt +184 -0
- 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 +29 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedMentionSpan.kt +35 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedOrderedListSpan.kt +79 -0
- 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/common/spans/EnrichedUnorderedListSpan.kt +62 -0
- 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/common/spans/interfaces/EnrichedZeroWidthSpaceSpan.kt +4 -0
- 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/textinput/EnrichedTextInputView.kt +1120 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/EnrichedTextInputViewLayoutManager.kt +27 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/EnrichedTextInputViewManager.kt +478 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/MeasurementStore.kt +225 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/events/MentionHandler.kt +55 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/events/OnChangeHtmlEvent.kt +27 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/events/OnChangeSelectionEvent.kt +30 -0
- 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/OnContextMenuItemPressEvent.kt +35 -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/textinput/events/OnMentionDetectedEvent.kt +30 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/events/OnMentionEvent.kt +34 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/events/OnPasteImagesEvent.kt +47 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/events/OnRequestHtmlResultEvent.kt +32 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/events/OnSubmitEditingEvent.kt +29 -0
- 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 +16 -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/EnrichedLineHeightSpan.kt +44 -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/textinput/styles/HtmlStyle.kt +372 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/styles/InlineStyles.kt +164 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/styles/ListStyles.kt +263 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/styles/ParagraphStyles.kt +434 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/styles/ParametrizedStyles.kt +394 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/utils/EnrichedEditableFactory.kt +17 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/utils/EnrichedSelection.kt +320 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/utils/EnrichedSpanState.kt +310 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/utils/EnrichedSpannable.kt +106 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/utils/EnrichedSpannableStringBuilder.kt +24 -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/textinput/watchers/EnrichedSpanWatcher.kt +107 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/watchers/EnrichedTextWatcher.kt +74 -0
- package/android/src/main/new_arch/CMakeLists.txt +62 -0
- package/android/src/main/new_arch/GumboNormalizerJni.cpp +14 -0
- 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/ReactNativeEnrichedSpec/EnrichedTextInputComponentDescriptor.h +35 -0
- package/android/src/main/new_arch/react/renderer/components/ReactNativeEnrichedSpec/EnrichedTextInputMeasurementManager.cpp +53 -0
- package/android/src/main/new_arch/react/renderer/components/ReactNativeEnrichedSpec/EnrichedTextInputMeasurementManager.h +25 -0
- package/android/src/main/new_arch/react/renderer/components/ReactNativeEnrichedSpec/EnrichedTextInputShadowNode.cpp +35 -0
- package/android/src/main/new_arch/react/renderer/components/ReactNativeEnrichedSpec/EnrichedTextInputShadowNode.h +53 -0
- package/android/src/main/new_arch/react/renderer/components/ReactNativeEnrichedSpec/EnrichedTextInputState.cpp +9 -0
- package/android/src/main/new_arch/react/renderer/components/ReactNativeEnrichedSpec/EnrichedTextInputState.h +24 -0
- package/android/src/main/new_arch/react/renderer/components/ReactNativeEnrichedSpec/conversions.h +27 -0
- package/android/src/main/res/drawable/broken_image.xml +10 -0
- package/cpp/CMakeLists.txt +50 -0
- package/cpp/GumboParser/GumboParser.h +34043 -0
- package/cpp/README.md +59 -0
- package/cpp/parser/GumboNormalizer.c +915 -0
- package/cpp/parser/GumboParser.cpp +16 -0
- package/cpp/parser/GumboParser.hpp +23 -0
- package/cpp/tests/GumboParserTest.cpp +457 -0
- package/ios/EnrichedTextInputView.h +53 -0
- package/ios/EnrichedTextInputView.mm +2360 -0
- package/ios/EnrichedTextInputViewManager.mm +13 -0
- package/ios/attributesManager/AttributesManager.h +17 -0
- package/ios/attributesManager/AttributesManager.mm +195 -0
- package/ios/config/InputConfig.h +104 -0
- package/ios/config/InputConfig.mm +664 -0
- package/ios/extensions/ColorExtension.h +7 -0
- package/ios/extensions/ColorExtension.mm +38 -0
- package/ios/extensions/FontExtension.h +11 -0
- package/ios/extensions/FontExtension.mm +72 -0
- package/ios/extensions/ImageExtension.h +34 -0
- package/ios/extensions/ImageExtension.mm +165 -0
- package/ios/extensions/LayoutManagerExtension.h +6 -0
- package/ios/extensions/LayoutManagerExtension.mm +443 -0
- package/ios/extensions/StringExtension.h +15 -0
- package/ios/extensions/StringExtension.mm +69 -0
- package/ios/generated/ReactNativeEnrichedSpec/ComponentDescriptors.cpp +22 -0
- package/ios/generated/ReactNativeEnrichedSpec/ComponentDescriptors.h +24 -0
- package/ios/generated/ReactNativeEnrichedSpec/EventEmitters.cpp +434 -0
- package/ios/generated/ReactNativeEnrichedSpec/EventEmitters.h +391 -0
- package/ios/generated/ReactNativeEnrichedSpec/Props.cpp +173 -0
- package/ios/generated/ReactNativeEnrichedSpec/Props.h +833 -0
- package/ios/generated/ReactNativeEnrichedSpec/RCTComponentViewHelpers.h +582 -0
- package/ios/generated/ReactNativeEnrichedSpec/ShadowNodes.cpp +17 -0
- package/ios/generated/ReactNativeEnrichedSpec/ShadowNodes.h +23 -0
- package/ios/generated/ReactNativeEnrichedSpec/States.cpp +16 -0
- package/ios/generated/ReactNativeEnrichedSpec/States.h +20 -0
- package/ios/inputParser/InputParser.h +11 -0
- package/ios/inputParser/InputParser.mm +1463 -0
- package/ios/inputTextView/InputTextView.h +6 -0
- package/ios/inputTextView/InputTextView.mm +285 -0
- package/ios/interfaces/AttributeEntry.h +9 -0
- package/ios/interfaces/AttributeEntry.mm +4 -0
- package/ios/interfaces/BaseStyleProtocol.h +17 -0
- package/ios/interfaces/ImageAttachment.h +11 -0
- package/ios/interfaces/ImageAttachment.mm +107 -0
- package/ios/interfaces/ImageData.h +10 -0
- package/ios/interfaces/ImageData.mm +4 -0
- package/ios/interfaces/LinkData.h +11 -0
- package/ios/interfaces/LinkData.mm +29 -0
- package/ios/interfaces/LinkRegexConfig.h +19 -0
- package/ios/interfaces/LinkRegexConfig.mm +37 -0
- package/ios/interfaces/MediaAttachment.h +23 -0
- package/ios/interfaces/MediaAttachment.mm +31 -0
- package/ios/interfaces/MentionParams.h +8 -0
- package/ios/interfaces/MentionParams.mm +4 -0
- package/ios/interfaces/MentionStyleProps.h +13 -0
- package/ios/interfaces/MentionStyleProps.mm +63 -0
- package/ios/interfaces/StyleBase.h +36 -0
- package/ios/interfaces/StyleBase.mm +256 -0
- package/ios/interfaces/StyleHeaders.h +102 -0
- package/ios/interfaces/StylePair.h +9 -0
- package/ios/interfaces/StylePair.mm +4 -0
- package/ios/interfaces/StyleTypeEnum.h +26 -0
- package/ios/interfaces/TextDecorationLineEnum.h +6 -0
- package/ios/interfaces/TextDecorationLineEnum.mm +4 -0
- package/ios/internals/EnrichedTextInputViewComponentDescriptor.h +19 -0
- package/ios/internals/EnrichedTextInputViewShadowNode.h +44 -0
- package/ios/internals/EnrichedTextInputViewShadowNode.mm +103 -0
- package/ios/internals/EnrichedTextInputViewState.cpp +10 -0
- package/ios/internals/EnrichedTextInputViewState.h +22 -0
- package/ios/styles/BlockQuoteStyle.mm +55 -0
- package/ios/styles/BoldStyle.mm +37 -0
- package/ios/styles/CheckboxListStyle.mm +153 -0
- package/ios/styles/CodeBlockStyle.mm +49 -0
- package/ios/styles/H1Style.mm +20 -0
- package/ios/styles/H2Style.mm +20 -0
- package/ios/styles/H3Style.mm +20 -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 +65 -0
- package/ios/styles/ImageStyle.mm +146 -0
- package/ios/styles/InlineCodeStyle.mm +65 -0
- package/ios/styles/ItalicStyle.mm +37 -0
- package/ios/styles/LinkStyle.mm +532 -0
- package/ios/styles/MentionStyle.mm +538 -0
- package/ios/styles/OrderedListStyle.mm +86 -0
- package/ios/styles/StrikethroughStyle.mm +25 -0
- package/ios/styles/UnderlineStyle.mm +24 -0
- package/ios/styles/UnorderedListStyle.mm +86 -0
- package/ios/utils/CheckboxHitTestUtils.h +10 -0
- package/ios/utils/CheckboxHitTestUtils.mm +122 -0
- package/ios/utils/DotReplacementUtils.h +10 -0
- package/ios/utils/DotReplacementUtils.mm +68 -0
- package/ios/utils/KeyboardUtils.h +7 -0
- package/ios/utils/KeyboardUtils.mm +31 -0
- package/ios/utils/OccurenceUtils.h +44 -0
- package/ios/utils/OccurenceUtils.mm +179 -0
- package/ios/utils/ParagraphAttributesUtils.h +15 -0
- package/ios/utils/ParagraphAttributesUtils.mm +257 -0
- package/ios/utils/RangeUtils.h +12 -0
- package/ios/utils/RangeUtils.mm +183 -0
- package/ios/utils/TextBlockTapGestureRecognizer.h +17 -0
- package/ios/utils/TextBlockTapGestureRecognizer.mm +56 -0
- package/ios/utils/TextInsertionUtils.h +17 -0
- package/ios/utils/TextInsertionUtils.mm +64 -0
- package/ios/utils/WordsUtils.h +7 -0
- package/ios/utils/WordsUtils.mm +98 -0
- package/ios/utils/ZeroWidthSpaceUtils.h +9 -0
- package/ios/utils/ZeroWidthSpaceUtils.mm +270 -0
- package/lib/module/index.js +4 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/native/EnrichedTextInput.js +304 -0
- package/lib/module/native/EnrichedTextInput.js.map +1 -0
- package/lib/module/package.json +1 -0
- package/lib/module/spec/EnrichedTextInputNativeComponent.ts +517 -0
- package/lib/module/types.js +4 -0
- package/lib/module/types.js.map +1 -0
- package/lib/module/utils/EnrichedTextInputDefaultProps.js +12 -0
- package/lib/module/utils/EnrichedTextInputDefaultProps.js.map +1 -0
- package/lib/module/utils/normalizeHtmlStyle.js +155 -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/package.json +1 -0
- package/lib/typescript/src/index.d.ts +3 -0
- package/lib/typescript/src/index.d.ts.map +1 -0
- package/lib/typescript/src/native/EnrichedTextInput.d.ts +3 -0
- package/lib/typescript/src/native/EnrichedTextInput.d.ts.map +1 -0
- package/lib/typescript/src/spec/EnrichedTextInputNativeComponent.d.ts +397 -0
- package/lib/typescript/src/spec/EnrichedTextInputNativeComponent.d.ts.map +1 -0
- package/lib/typescript/src/types.d.ts +447 -0
- package/lib/typescript/src/types.d.ts.map +1 -0
- package/lib/typescript/src/utils/EnrichedTextInputDefaultProps.d.ts +10 -0
- package/lib/typescript/src/utils/EnrichedTextInputDefaultProps.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 +226 -0
- package/react-native.config.js +13 -0
- package/src/index.tsx +20 -0
- package/src/native/EnrichedTextInput.tsx +370 -0
- package/src/spec/EnrichedTextInputNativeComponent.ts +517 -0
- package/src/types.ts +499 -0
- package/src/utils/EnrichedTextInputDefaultProps.ts +9 -0
- package/src/utils/normalizeHtmlStyle.ts +199 -0
- package/src/utils/nullthrows.ts +7 -0
- package/src/utils/regexParser.ts +56 -0
|
@@ -0,0 +1,443 @@
|
|
|
1
|
+
#import "LayoutManagerExtension.h"
|
|
2
|
+
#import "ColorExtension.h"
|
|
3
|
+
#import "EnrichedTextInputView.h"
|
|
4
|
+
#import "RangeUtils.h"
|
|
5
|
+
#import "StyleHeaders.h"
|
|
6
|
+
#import <objc/runtime.h>
|
|
7
|
+
|
|
8
|
+
@implementation NSLayoutManager (LayoutManagerExtension)
|
|
9
|
+
|
|
10
|
+
static void const *kInputKey = &kInputKey;
|
|
11
|
+
|
|
12
|
+
- (id)input {
|
|
13
|
+
return objc_getAssociatedObject(self, kInputKey);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
- (void)setInput:(id)value {
|
|
17
|
+
objc_setAssociatedObject(self, kInputKey, value,
|
|
18
|
+
OBJC_ASSOCIATION_RETAIN_NONATOMIC);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
+ (void)load {
|
|
22
|
+
static dispatch_once_t onceToken;
|
|
23
|
+
dispatch_once(&onceToken, ^{
|
|
24
|
+
Class myClass = [NSLayoutManager class];
|
|
25
|
+
SEL originalSelector = @selector(drawBackgroundForGlyphRange:atPoint:);
|
|
26
|
+
SEL swizzledSelector = @selector(my_drawBackgroundForGlyphRange:atPoint:);
|
|
27
|
+
Method originalMethod = class_getInstanceMethod(myClass, originalSelector);
|
|
28
|
+
Method swizzledMethod = class_getInstanceMethod(myClass, swizzledSelector);
|
|
29
|
+
|
|
30
|
+
BOOL didAddMethod = class_addMethod(
|
|
31
|
+
myClass, originalSelector, method_getImplementation(swizzledMethod),
|
|
32
|
+
method_getTypeEncoding(swizzledMethod));
|
|
33
|
+
|
|
34
|
+
if (didAddMethod) {
|
|
35
|
+
class_replaceMethod(myClass, swizzledSelector,
|
|
36
|
+
method_getImplementation(originalMethod),
|
|
37
|
+
method_getTypeEncoding(originalMethod));
|
|
38
|
+
} else {
|
|
39
|
+
method_exchangeImplementations(originalMethod, swizzledMethod);
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
- (void)my_drawBackgroundForGlyphRange:(NSRange)glyphRange
|
|
45
|
+
atPoint:(CGPoint)origin {
|
|
46
|
+
[self my_drawBackgroundForGlyphRange:glyphRange atPoint:origin];
|
|
47
|
+
|
|
48
|
+
EnrichedTextInputView *typedInput = (EnrichedTextInputView *)self.input;
|
|
49
|
+
if (typedInput == nullptr) {
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
NSRange visibleCharRange = [self characterRangeForGlyphRange:glyphRange
|
|
54
|
+
actualGlyphRange:NULL];
|
|
55
|
+
|
|
56
|
+
[self drawBlockQuotes:typedInput
|
|
57
|
+
origin:origin
|
|
58
|
+
visibleCharRange:visibleCharRange];
|
|
59
|
+
[self drawLists:typedInput origin:origin visibleCharRange:visibleCharRange];
|
|
60
|
+
[self drawCodeBlocks:typedInput
|
|
61
|
+
origin:origin
|
|
62
|
+
visibleCharRange:visibleCharRange];
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
- (void)drawCodeBlocks:(EnrichedTextInputView *)typedInput
|
|
66
|
+
origin:(CGPoint)origin
|
|
67
|
+
visibleCharRange:(NSRange)visibleCharRange {
|
|
68
|
+
CodeBlockStyle *codeBlockStyle =
|
|
69
|
+
typedInput->stylesDict[@([CodeBlockStyle getType])];
|
|
70
|
+
if (codeBlockStyle == nullptr) {
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
NSArray<StylePair *> *allCodeBlocks = [codeBlockStyle all:visibleCharRange];
|
|
75
|
+
NSArray<StylePair *> *mergedCodeBlocks =
|
|
76
|
+
[self mergeContiguousStylePairs:allCodeBlocks];
|
|
77
|
+
UIColor *bgColor = [[typedInput->config codeBlockBgColor]
|
|
78
|
+
colorWithAlphaIfNotTransparent:0.4];
|
|
79
|
+
CGFloat radius = [typedInput->config codeBlockBorderRadius];
|
|
80
|
+
[bgColor setFill];
|
|
81
|
+
|
|
82
|
+
for (StylePair *pair in mergedCodeBlocks) {
|
|
83
|
+
NSRange blockCharacterRange = [pair.rangeValue rangeValue];
|
|
84
|
+
if (blockCharacterRange.length == 0)
|
|
85
|
+
continue;
|
|
86
|
+
|
|
87
|
+
NSArray *paragraphs =
|
|
88
|
+
[RangeUtils getSeparateParagraphsRangesIn:typedInput->textView
|
|
89
|
+
range:blockCharacterRange];
|
|
90
|
+
if (paragraphs.count == 0)
|
|
91
|
+
continue;
|
|
92
|
+
|
|
93
|
+
NSRange firstParagraphRange =
|
|
94
|
+
[((NSValue *)[paragraphs firstObject]) rangeValue];
|
|
95
|
+
NSRange lastParagraphRange =
|
|
96
|
+
[((NSValue *)[paragraphs lastObject]) rangeValue];
|
|
97
|
+
|
|
98
|
+
for (NSValue *paragraphValue in paragraphs) {
|
|
99
|
+
NSRange paragraphCharacterRange = [paragraphValue rangeValue];
|
|
100
|
+
|
|
101
|
+
BOOL isFirstParagraph =
|
|
102
|
+
NSEqualRanges(paragraphCharacterRange, firstParagraphRange);
|
|
103
|
+
BOOL isLastParagraph =
|
|
104
|
+
NSEqualRanges(paragraphCharacterRange, lastParagraphRange);
|
|
105
|
+
|
|
106
|
+
NSRange paragraphGlyphRange =
|
|
107
|
+
[self glyphRangeForCharacterRange:paragraphCharacterRange
|
|
108
|
+
actualCharacterRange:NULL];
|
|
109
|
+
|
|
110
|
+
__block BOOL isFirstLineOfParagraph = YES;
|
|
111
|
+
|
|
112
|
+
[self
|
|
113
|
+
enumerateLineFragmentsForGlyphRange:paragraphGlyphRange
|
|
114
|
+
usingBlock:^(
|
|
115
|
+
CGRect rect, CGRect usedRect,
|
|
116
|
+
NSTextContainer *_Nonnull textContainer,
|
|
117
|
+
NSRange glyphRange,
|
|
118
|
+
BOOL *_Nonnull stop) {
|
|
119
|
+
CGRect lineBgRect = rect;
|
|
120
|
+
lineBgRect.origin.x = origin.x;
|
|
121
|
+
lineBgRect.origin.y += origin.y;
|
|
122
|
+
lineBgRect.size.width =
|
|
123
|
+
textContainer.size.width;
|
|
124
|
+
|
|
125
|
+
UIRectCorner cornersForThisLine = 0;
|
|
126
|
+
|
|
127
|
+
if (isFirstParagraph &&
|
|
128
|
+
isFirstLineOfParagraph) {
|
|
129
|
+
cornersForThisLine =
|
|
130
|
+
UIRectCornerTopLeft |
|
|
131
|
+
UIRectCornerTopRight;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
BOOL isLastLineOfParagraph =
|
|
135
|
+
(NSMaxRange(glyphRange) >=
|
|
136
|
+
NSMaxRange(paragraphGlyphRange));
|
|
137
|
+
|
|
138
|
+
if (isLastParagraph &&
|
|
139
|
+
isLastLineOfParagraph) {
|
|
140
|
+
cornersForThisLine =
|
|
141
|
+
cornersForThisLine |
|
|
142
|
+
UIRectCornerBottomLeft |
|
|
143
|
+
UIRectCornerBottomRight;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
UIBezierPath *path = [UIBezierPath
|
|
147
|
+
bezierPathWithRoundedRect:lineBgRect
|
|
148
|
+
byRoundingCorners:
|
|
149
|
+
cornersForThisLine
|
|
150
|
+
cornerRadii:CGSizeMake(
|
|
151
|
+
radius,
|
|
152
|
+
radius)];
|
|
153
|
+
[path fill];
|
|
154
|
+
|
|
155
|
+
isFirstLineOfParagraph = NO;
|
|
156
|
+
}];
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
- (NSArray<StylePair *> *)mergeContiguousStylePairs:
|
|
162
|
+
(NSArray<StylePair *> *)pairs {
|
|
163
|
+
if (pairs.count == 0) {
|
|
164
|
+
return @[];
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
NSMutableArray<StylePair *> *mergedPairs = [[NSMutableArray alloc] init];
|
|
168
|
+
StylePair *currentPair = pairs[0];
|
|
169
|
+
NSRange currentRange = [currentPair.rangeValue rangeValue];
|
|
170
|
+
for (NSUInteger i = 1; i < pairs.count; i++) {
|
|
171
|
+
StylePair *nextPair = pairs[i];
|
|
172
|
+
NSRange nextRange = [nextPair.rangeValue rangeValue];
|
|
173
|
+
|
|
174
|
+
// The Gap Check:
|
|
175
|
+
// NSMaxRange(currentRange) is where the current block ends.
|
|
176
|
+
// nextRange.location is where the next block starts.
|
|
177
|
+
if (NSMaxRange(currentRange) == nextRange.location) {
|
|
178
|
+
// They touch perfectly (no gap). Merge them.
|
|
179
|
+
currentRange.length += nextRange.length;
|
|
180
|
+
} else {
|
|
181
|
+
// There is a gap (indices don't match).
|
|
182
|
+
// 1. Save the finished block.
|
|
183
|
+
StylePair *mergedPair = [[StylePair alloc] init];
|
|
184
|
+
mergedPair.rangeValue = [NSValue valueWithRange:currentRange];
|
|
185
|
+
mergedPair.styleValue = currentPair.styleValue;
|
|
186
|
+
[mergedPairs addObject:mergedPair];
|
|
187
|
+
|
|
188
|
+
// 2. Start a brand new block.
|
|
189
|
+
currentPair = nextPair;
|
|
190
|
+
currentRange = nextRange;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
// Add the final block
|
|
195
|
+
StylePair *lastPair = [[StylePair alloc] init];
|
|
196
|
+
lastPair.rangeValue = [NSValue valueWithRange:currentRange];
|
|
197
|
+
lastPair.styleValue = currentPair.styleValue;
|
|
198
|
+
[mergedPairs addObject:lastPair];
|
|
199
|
+
|
|
200
|
+
return mergedPairs;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
- (void)drawBlockQuotes:(EnrichedTextInputView *)typedInput
|
|
204
|
+
origin:(CGPoint)origin
|
|
205
|
+
visibleCharRange:(NSRange)visibleCharRange {
|
|
206
|
+
BlockQuoteStyle *bqStyle =
|
|
207
|
+
typedInput->stylesDict[@([BlockQuoteStyle getType])];
|
|
208
|
+
if (bqStyle == nullptr) {
|
|
209
|
+
return;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
NSArray *allBlockquotes = [bqStyle all:visibleCharRange];
|
|
213
|
+
|
|
214
|
+
for (StylePair *pair in allBlockquotes) {
|
|
215
|
+
NSRange paragraphRange = [typedInput->textView.textStorage.string
|
|
216
|
+
paragraphRangeForRange:[pair.rangeValue rangeValue]];
|
|
217
|
+
NSRange paragraphGlyphRange =
|
|
218
|
+
[self glyphRangeForCharacterRange:paragraphRange
|
|
219
|
+
actualCharacterRange:nullptr];
|
|
220
|
+
[self
|
|
221
|
+
enumerateLineFragmentsForGlyphRange:paragraphGlyphRange
|
|
222
|
+
usingBlock:^(
|
|
223
|
+
CGRect rect, CGRect usedRect,
|
|
224
|
+
NSTextContainer *_Nonnull textContainer,
|
|
225
|
+
NSRange glyphRange, BOOL *_Nonnull stop) {
|
|
226
|
+
CGFloat paddingLeft = origin.x;
|
|
227
|
+
CGFloat paddingTop = origin.y;
|
|
228
|
+
CGFloat x = paddingLeft;
|
|
229
|
+
CGFloat y = paddingTop + rect.origin.y;
|
|
230
|
+
CGFloat width =
|
|
231
|
+
[typedInput
|
|
232
|
+
->config blockquoteBorderWidth];
|
|
233
|
+
CGFloat height = rect.size.height;
|
|
234
|
+
|
|
235
|
+
CGRect lineRect =
|
|
236
|
+
CGRectMake(x, y, width, height);
|
|
237
|
+
[[typedInput->config blockquoteBorderColor]
|
|
238
|
+
setFill];
|
|
239
|
+
UIRectFill(lineRect);
|
|
240
|
+
}];
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
- (void)drawLists:(EnrichedTextInputView *)typedInput
|
|
245
|
+
origin:(CGPoint)origin
|
|
246
|
+
visibleCharRange:(NSRange)visibleCharRange {
|
|
247
|
+
UnorderedListStyle *ulStyle =
|
|
248
|
+
typedInput->stylesDict[@([UnorderedListStyle getType])];
|
|
249
|
+
OrderedListStyle *olStyle =
|
|
250
|
+
typedInput->stylesDict[@([OrderedListStyle getType])];
|
|
251
|
+
CheckboxListStyle *cbStyle =
|
|
252
|
+
typedInput->stylesDict[@([CheckboxListStyle getType])];
|
|
253
|
+
if (ulStyle == nullptr || olStyle == nullptr || cbStyle == nullptr) {
|
|
254
|
+
return;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
NSMutableArray *allLists = [[NSMutableArray alloc] init];
|
|
258
|
+
|
|
259
|
+
[allLists addObjectsFromArray:[ulStyle all:visibleCharRange]];
|
|
260
|
+
[allLists addObjectsFromArray:[olStyle all:visibleCharRange]];
|
|
261
|
+
[allLists addObjectsFromArray:[cbStyle all:visibleCharRange]];
|
|
262
|
+
|
|
263
|
+
for (StylePair *pair in allLists) {
|
|
264
|
+
NSParagraphStyle *pStyle = (NSParagraphStyle *)pair.styleValue;
|
|
265
|
+
NSDictionary *markerAttributes = @{
|
|
266
|
+
NSFontAttributeName : [typedInput->config orderedListMarkerFont],
|
|
267
|
+
NSForegroundColorAttributeName :
|
|
268
|
+
[typedInput->config orderedListMarkerColor]
|
|
269
|
+
};
|
|
270
|
+
|
|
271
|
+
NSArray *paragraphs =
|
|
272
|
+
[RangeUtils getSeparateParagraphsRangesIn:typedInput->textView
|
|
273
|
+
range:[pair.rangeValue rangeValue]];
|
|
274
|
+
|
|
275
|
+
for (NSValue *paragraph in paragraphs) {
|
|
276
|
+
NSRange paragraphGlyphRange =
|
|
277
|
+
[self glyphRangeForCharacterRange:[paragraph rangeValue]
|
|
278
|
+
actualCharacterRange:nullptr];
|
|
279
|
+
|
|
280
|
+
[self
|
|
281
|
+
enumerateLineFragmentsForGlyphRange:paragraphGlyphRange
|
|
282
|
+
usingBlock:^(CGRect rect, CGRect usedRect,
|
|
283
|
+
NSTextContainer *container,
|
|
284
|
+
NSRange lineGlyphRange,
|
|
285
|
+
BOOL *stop) {
|
|
286
|
+
NSUInteger charIdx =
|
|
287
|
+
[self characterIndexForGlyphAtIndex:
|
|
288
|
+
lineGlyphRange.location];
|
|
289
|
+
UIFont *font =
|
|
290
|
+
[typedInput->textView.textStorage
|
|
291
|
+
attribute:NSFontAttributeName
|
|
292
|
+
atIndex:charIdx
|
|
293
|
+
effectiveRange:nil];
|
|
294
|
+
CGRect textUsedRect =
|
|
295
|
+
[self getTextAlignedUsedRect:usedRect
|
|
296
|
+
font:font];
|
|
297
|
+
|
|
298
|
+
NSString *markerFormat =
|
|
299
|
+
pStyle.textLists.firstObject
|
|
300
|
+
.markerFormat;
|
|
301
|
+
|
|
302
|
+
if ([markerFormat
|
|
303
|
+
isEqualToString:
|
|
304
|
+
@"EnrichedOrderedList"]) {
|
|
305
|
+
NSString *marker = [self
|
|
306
|
+
getDecimalMarkerForList:typedInput
|
|
307
|
+
charIndex:charIdx];
|
|
308
|
+
[self drawDecimal:typedInput
|
|
309
|
+
marker:marker
|
|
310
|
+
markerAttributes:markerAttributes
|
|
311
|
+
origin:origin
|
|
312
|
+
usedRect:usedRect];
|
|
313
|
+
} else if ([markerFormat
|
|
314
|
+
isEqualToString:
|
|
315
|
+
@"EnrichedUnorderedLis"
|
|
316
|
+
@"t"]) {
|
|
317
|
+
[self drawBullet:typedInput
|
|
318
|
+
origin:origin
|
|
319
|
+
usedRect:textUsedRect];
|
|
320
|
+
} else if ([markerFormat
|
|
321
|
+
hasPrefix:
|
|
322
|
+
@"EnrichedCheckbox"]) {
|
|
323
|
+
[self drawCheckbox:typedInput
|
|
324
|
+
markerFormat:markerFormat
|
|
325
|
+
origin:origin
|
|
326
|
+
usedRect:textUsedRect];
|
|
327
|
+
}
|
|
328
|
+
// only first line of a list gets its
|
|
329
|
+
// marker drawn
|
|
330
|
+
*stop = YES;
|
|
331
|
+
}];
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
- (NSString *)getDecimalMarkerForList:(EnrichedTextInputView *)input
|
|
337
|
+
charIndex:(NSUInteger)index {
|
|
338
|
+
NSString *fullText = input->textView.textStorage.string;
|
|
339
|
+
NSInteger itemNumber = 1;
|
|
340
|
+
|
|
341
|
+
NSRange currentParagraph =
|
|
342
|
+
[fullText paragraphRangeForRange:NSMakeRange(index, 0)];
|
|
343
|
+
if (currentParagraph.location > 0) {
|
|
344
|
+
OrderedListStyle *olStyle =
|
|
345
|
+
input->stylesDict[@([OrderedListStyle getType])];
|
|
346
|
+
|
|
347
|
+
NSInteger prevParagraphsCount = 0;
|
|
348
|
+
NSInteger recentParagraphLocation =
|
|
349
|
+
[fullText paragraphRangeForRange:NSMakeRange(
|
|
350
|
+
currentParagraph.location - 1, 0)]
|
|
351
|
+
.location;
|
|
352
|
+
|
|
353
|
+
// seek for previous lists
|
|
354
|
+
while (true) {
|
|
355
|
+
if ([olStyle detect:NSMakeRange(recentParagraphLocation, 0)]) {
|
|
356
|
+
prevParagraphsCount += 1;
|
|
357
|
+
|
|
358
|
+
if (recentParagraphLocation > 0) {
|
|
359
|
+
recentParagraphLocation =
|
|
360
|
+
[fullText
|
|
361
|
+
paragraphRangeForRange:NSMakeRange(
|
|
362
|
+
recentParagraphLocation - 1, 0)]
|
|
363
|
+
.location;
|
|
364
|
+
} else {
|
|
365
|
+
break;
|
|
366
|
+
}
|
|
367
|
+
} else {
|
|
368
|
+
break;
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
itemNumber = prevParagraphsCount + 1;
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
return [NSString stringWithFormat:@"%ld.", (long)(itemNumber)];
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
// Returns a usedRect adjusted to cover only the text portion of the line.
|
|
379
|
+
// When minimumLineHeight expands the line box, extra space is added at the top
|
|
380
|
+
// and text stays at the bottom. This strips that padding so markers align with
|
|
381
|
+
// the text, not the full line box.
|
|
382
|
+
- (CGRect)getTextAlignedUsedRect:(CGRect)usedRect font:(UIFont *)font {
|
|
383
|
+
if (font && usedRect.size.height > font.lineHeight) {
|
|
384
|
+
CGFloat extraSpace = usedRect.size.height - font.lineHeight;
|
|
385
|
+
usedRect.origin.y += extraSpace;
|
|
386
|
+
usedRect.size.height = font.lineHeight;
|
|
387
|
+
}
|
|
388
|
+
return usedRect;
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
- (void)drawCheckbox:(EnrichedTextInputView *)typedInput
|
|
392
|
+
markerFormat:(NSString *)markerFormat
|
|
393
|
+
origin:(CGPoint)origin
|
|
394
|
+
usedRect:(CGRect)usedRect {
|
|
395
|
+
BOOL isChecked = [markerFormat isEqualToString:@"EnrichedCheckbox1"];
|
|
396
|
+
|
|
397
|
+
UIImage *image = isChecked ? typedInput->config.checkboxCheckedImage
|
|
398
|
+
: typedInput->config.checkboxUncheckedImage;
|
|
399
|
+
CGFloat gapWidth = [typedInput->config checkboxListGapWidth];
|
|
400
|
+
CGFloat boxSize = [typedInput->config checkboxListBoxSize];
|
|
401
|
+
|
|
402
|
+
CGFloat centerY = CGRectGetMidY(usedRect) + origin.y;
|
|
403
|
+
CGFloat boxX = origin.x + usedRect.origin.x - gapWidth - boxSize;
|
|
404
|
+
CGFloat boxY = centerY - boxSize / 2.0;
|
|
405
|
+
|
|
406
|
+
[image drawAtPoint:CGPointMake(boxX, boxY)];
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
- (void)drawBullet:(EnrichedTextInputView *)typedInput
|
|
410
|
+
origin:(CGPoint)origin
|
|
411
|
+
usedRect:(CGRect)usedRect {
|
|
412
|
+
CGFloat gapWidth = [typedInput->config unorderedListGapWidth];
|
|
413
|
+
CGFloat bulletSize = [typedInput->config unorderedListBulletSize];
|
|
414
|
+
CGFloat bulletX = origin.x + usedRect.origin.x - gapWidth - bulletSize / 2;
|
|
415
|
+
CGFloat centerY = CGRectGetMidY(usedRect) + origin.y;
|
|
416
|
+
|
|
417
|
+
CGContextRef context = UIGraphicsGetCurrentContext();
|
|
418
|
+
CGContextSaveGState(context);
|
|
419
|
+
{
|
|
420
|
+
[[typedInput->config unorderedListBulletColor] setFill];
|
|
421
|
+
CGContextAddArc(context, bulletX, centerY, bulletSize / 2, 0, 2 * M_PI,
|
|
422
|
+
YES);
|
|
423
|
+
CGContextFillPath(context);
|
|
424
|
+
}
|
|
425
|
+
CGContextRestoreGState(context);
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
- (void)drawDecimal:(EnrichedTextInputView *)typedInput
|
|
429
|
+
marker:(NSString *)marker
|
|
430
|
+
markerAttributes:(NSDictionary *)markerAttributes
|
|
431
|
+
origin:(CGPoint)origin
|
|
432
|
+
usedRect:(CGRect)usedRect {
|
|
433
|
+
CGFloat gapWidth = [typedInput->config orderedListGapWidth];
|
|
434
|
+
CGSize markerSize = [marker sizeWithAttributes:markerAttributes];
|
|
435
|
+
CGFloat markerX = usedRect.origin.x - gapWidth - markerSize.width / 2;
|
|
436
|
+
CGFloat centerY = CGRectGetMidY(usedRect) + origin.y;
|
|
437
|
+
CGFloat markerY = centerY - markerSize.height / 2.0;
|
|
438
|
+
|
|
439
|
+
[marker drawAtPoint:CGPointMake(markerX, markerY)
|
|
440
|
+
withAttributes:markerAttributes];
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
@end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
#include "string"
|
|
2
|
+
#import <UIKit/UIKit.h>
|
|
3
|
+
#pragma once
|
|
4
|
+
|
|
5
|
+
@interface NSString (StringExtension)
|
|
6
|
+
- (std::string)toCppString;
|
|
7
|
+
+ (NSString *)fromCppString:(std::string)string;
|
|
8
|
+
+ (NSString *)stringByEscapingHtml:(NSString *)html;
|
|
9
|
+
+ (NSDictionary *)getEscapedCharactersInfoFrom:(NSString *)text;
|
|
10
|
+
@end
|
|
11
|
+
|
|
12
|
+
@interface NSMutableString (StringExtension)
|
|
13
|
+
- (std::string)toCppString;
|
|
14
|
+
+ (NSMutableString *)fromCppString:(std::string)string;
|
|
15
|
+
@end
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
#import "StringExtension.h"
|
|
2
|
+
|
|
3
|
+
@implementation NSString (StringExtension)
|
|
4
|
+
|
|
5
|
+
- (std::string)toCppString {
|
|
6
|
+
return std::string([self UTF8String]);
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
+ (NSString *)fromCppString:(std::string)string {
|
|
10
|
+
return [NSString stringWithUTF8String:string.c_str()];
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
+ (NSString *)stringByEscapingHtml:(NSString *)html {
|
|
14
|
+
NSMutableString *escaped = [html mutableCopy];
|
|
15
|
+
NSDictionary *escapeMap = @{
|
|
16
|
+
@"&" : @"&",
|
|
17
|
+
@"<" : @"<",
|
|
18
|
+
@">" : @">",
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
for (NSString *key in escapeMap) {
|
|
22
|
+
[escaped replaceOccurrencesOfString:key
|
|
23
|
+
withString:escapeMap[key]
|
|
24
|
+
options:NSLiteralSearch
|
|
25
|
+
range:NSMakeRange(0, escaped.length)];
|
|
26
|
+
}
|
|
27
|
+
return escaped;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
+ (NSDictionary *)getEscapedCharactersInfoFrom:(NSString *)text {
|
|
31
|
+
NSDictionary *unescapeMap = @{
|
|
32
|
+
@"&" : @"&",
|
|
33
|
+
@"<" : @"<",
|
|
34
|
+
@">" : @">",
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
NSMutableDictionary *results = [[NSMutableDictionary alloc] init];
|
|
38
|
+
|
|
39
|
+
for (NSString *key in unescapeMap) {
|
|
40
|
+
NSRange searchRange = NSMakeRange(0, text.length);
|
|
41
|
+
NSRange foundRange;
|
|
42
|
+
|
|
43
|
+
while (searchRange.location < text.length) {
|
|
44
|
+
foundRange = [text rangeOfString:key options:0 range:searchRange];
|
|
45
|
+
if (foundRange.location == NSNotFound) {
|
|
46
|
+
break;
|
|
47
|
+
}
|
|
48
|
+
results[@(foundRange.location)] = @[ key, unescapeMap[key] ];
|
|
49
|
+
searchRange.location = foundRange.location + foundRange.length;
|
|
50
|
+
searchRange.length = text.length - searchRange.location;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
return results;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
@end
|
|
58
|
+
|
|
59
|
+
@implementation NSMutableString (StringExtension)
|
|
60
|
+
|
|
61
|
+
- (std::string)toCppString {
|
|
62
|
+
return std::string([self UTF8String]);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
+ (NSMutableString *)fromCppString:(std::string)string {
|
|
66
|
+
return [NSMutableString stringWithUTF8String:string.c_str()];
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
@end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
|
|
2
|
+
/**
|
|
3
|
+
* This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
|
|
4
|
+
*
|
|
5
|
+
* Do not edit this file as changes may cause incorrect behavior and will be lost
|
|
6
|
+
* once the code is regenerated.
|
|
7
|
+
*
|
|
8
|
+
* @generated by codegen project: GenerateComponentDescriptorCpp.js
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
#include "ComponentDescriptors.h"
|
|
12
|
+
#include <react/renderer/core/ConcreteComponentDescriptor.h>
|
|
13
|
+
#include <react/renderer/componentregistry/ComponentDescriptorProviderRegistry.h>
|
|
14
|
+
|
|
15
|
+
namespace facebook::react {
|
|
16
|
+
|
|
17
|
+
void ReactNativeEnrichedSpec_registerComponentDescriptorsFromCodegen(
|
|
18
|
+
std::shared_ptr<const ComponentDescriptorProviderRegistry> registry) {
|
|
19
|
+
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
} // namespace facebook::react
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
|
|
2
|
+
/**
|
|
3
|
+
* This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
|
|
4
|
+
*
|
|
5
|
+
* Do not edit this file as changes may cause incorrect behavior and will be lost
|
|
6
|
+
* once the code is regenerated.
|
|
7
|
+
*
|
|
8
|
+
* @generated by codegen project: GenerateComponentDescriptorH.js
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
#pragma once
|
|
12
|
+
|
|
13
|
+
#include "ShadowNodes.h"
|
|
14
|
+
#include <react/renderer/core/ConcreteComponentDescriptor.h>
|
|
15
|
+
#include <react/renderer/componentregistry/ComponentDescriptorProviderRegistry.h>
|
|
16
|
+
|
|
17
|
+
namespace facebook::react {
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
void ReactNativeEnrichedSpec_registerComponentDescriptorsFromCodegen(
|
|
22
|
+
std::shared_ptr<const ComponentDescriptorProviderRegistry> registry);
|
|
23
|
+
|
|
24
|
+
} // namespace facebook::react
|