From 94d515678563ba9cb8a61759b4ae4f5f515619d4 Mon Sep 17 00:00:00 2001 From: TxcA <447358255@qq.com> Date: Thu, 31 Mar 2022 17:58:14 +0800 Subject: [PATCH] Initial commit --- .github/workflows/android_ci.yml | 26 + .github/workflows/mkdocs.yml | 16 + .gitignore | 17 + LICENSE | 174 +++ README.md | 104 ++ app/.gitignore | 1 + app/build.gradle | 51 + app/proguard-rules.pro | 21 + .../spannable/ExampleInstrumentedTest.kt | 22 + app/src/main/AndroidManifest.xml | 23 + app/src/main/assets/Inconsolata-Regular.ttf | Bin 0 -> 96964 bytes app/src/main/assets/code.txt | 25 + .../itxca/sample/spannable/CodeFragment.kt | 136 ++ .../itxca/sample/spannable/JavaFragment.java | 174 +++ .../itxca/sample/spannable/KotlinFragment.kt | 158 +++ .../itxca/sample/spannable/MainActivity.kt | 36 + .../java/com/itxca/sample/spannable/Utils.kt | 18 + app/src/main/res/drawable/bg_rounded.xml | 7 + app/src/main/res/layout/code_fragment.xml | 12 + app/src/main/res/layout/main_activity.xml | 28 + app/src/main/res/layout/sample_fragment.xml | 47 + .../main/res/mipmap-xhdpi/ic_launcher.webp | Bin 0 -> 1900 bytes .../res/mipmap-xhdpi/ic_launcher_round.webp | Bin 0 -> 3918 bytes app/src/main/res/values/colors.xml | 7 + app/src/main/res/values/strings.xml | 4 + app/src/main/res/values/themes.xml | 17 + .../itxca/sample/spannable/ExampleUnitTest.kt | 16 + build.gradle | 11 + .../-conversion-unit/-companion/-d-p.html | 37 + .../-companion/-n-o-t_-c-o-n-v-e-r-t.html | 37 + .../-conversion-unit/-companion/-s-p.html | 37 + .../-conversion-unit/-companion/index.html | 89 ++ .../-conversion-unit/-conversion-unit.html | 37 + .../-conversion-unit/index.html | 59 + .../-text-style/-text-style.html | 37 + .../-text-style/index.html | 59 + .../index.html | 73 ++ .../-on-span-click-listener/index.html | 59 + .../-on-span-click-listener/on-click.html | 37 + .../-on-span-replacement-match/index.html | 59 + .../-on-span-replacement-match/on-match.html | 37 + .../index.html | 73 ++ .../-simple-clickable-config.html | 37 + .../-simple-clickable-config/index.html | 59 + .../-simple-clickable-config/underline.html | 37 + .../-simple-clickable-span.html | 37 + .../-simple-clickable-span/index.html | 106 ++ .../-simple-clickable-span/on-click.html | 37 + .../update-draw-state.html | 37 + .../-size-image-span/-companion/index.html | 41 + .../-size-image-span/-size-image-span.html | 37 + .../clear-drawable-cache.html | 37 + .../-size-image-span/draw.html | 37 + .../-size-image-span/drawable-height.html | 37 + .../-size-image-span/drawable-size.html | 37 + .../-size-image-span/drawable-width.html | 37 + .../-size-image-span/get-size.html | 37 + .../-size-image-span/index.html | 365 ++++++ .../com.itxca.spannablex.span/index.html | 103 ++ .../-drawable-size/-drawable-size.html | 37 + .../-drawable-size/height.html | 37 + .../-drawable-size/index.html | 91 ++ .../-drawable-size/width.html | 37 + .../com.itxca.spannablex.utils/color.html | 37 + .../config-text-view-size.html | 37 + .../com.itxca.spannablex.utils/dp.html | 37 + .../drawable-size.html | 37 + .../com.itxca.spannablex.utils/index.html | 167 +++ .../com.itxca.spannablex.utils/sp.html | 37 + .../text-size-int.html | 37 + .../-replace-rule/-replace-rule.html | 37 + .../-replace-rule/index.html | 136 ++ .../-replace-rule/is-regex.html | 37 + .../-replace-rule/match-range.html | 37 + .../-replace-rule/new-string.html | 37 + .../-replace-rule/replace-string.html | 37 + .../-replace-rule/replacement-match.html | 37 + .../-span-dsl/-companion/create.html | 37 + .../-span-dsl/-companion/index.html | 59 + .../-span-dsl/absolute-size.html | 37 + .../-span-dsl/background.html | 37 + .../-span-dsl/blur-mask.html | 37 + .../-span-dsl/clickable.html | 37 + .../com.itxca.spannablex/-span-dsl/color.html | 37 + .../com.itxca.spannablex/-span-dsl/image.html | 37 + .../com.itxca.spannablex/-span-dsl/index.html | 393 ++++++ .../-span-dsl/mask-filter.html | 37 + .../-span-dsl/newline.html | 37 + .../-span-dsl/relative-size.html | 37 + .../-span-dsl/scale-x.html | 37 + .../com.itxca.spannablex/-span-dsl/span.html | 37 + .../-span-dsl/strikethrough.html | 37 + .../com.itxca.spannablex/-span-dsl/style.html | 37 + .../-span-dsl/subscript.html | 37 + .../-span-dsl/suggestion.html | 37 + .../-span-dsl/superscript.html | 37 + .../-span-dsl/text-appearance.html | 37 + .../-span-dsl/text-spannable.html | 37 + .../com.itxca.spannablex/-span-dsl/text.html | 37 + .../-span-dsl/typeface.html | 37 + .../-span-dsl/underline.html | 37 + .../com.itxca.spannablex/-span-dsl/url.html | 37 + .../-span/-companion/activate-click.html | 37 + .../-span/-companion/create.html | 37 + .../-span/-companion/dp.html | 37 + .../-span/-companion/drawable-size.html | 37 + .../-span/-companion/index.html | 179 +++ .../-span/-companion/remove-all-spans.html | 37 + .../-span/-companion/remove-spans.html | 37 + .../-span/-companion/sp.html | 37 + .../-span/-companion/spanned-string.html | 37 + .../-span/-companion/to-replace-rule.html | 37 + .../-span/absolute-size.html | 37 + .../-span/background.html | 37 + .../com.itxca.spannablex/-span/blur-mask.html | 37 + .../com.itxca.spannablex/-span/clickable.html | 37 + .../com.itxca.spannablex/-span/color.html | 37 + .../com.itxca.spannablex/-span/image.html | 37 + .../com.itxca.spannablex/-span/index.html | 397 ++++++ .../-span/mask-filter.html | 37 + .../com.itxca.spannablex/-span/newline.html | 37 + .../-span/relative-size.html | 37 + .../-span/save-cache.html | 37 + .../com.itxca.spannablex/-span/scale-x.html | 37 + .../com.itxca.spannablex/-span/spannable.html | 37 + .../-span/strikethrough.html | 37 + .../com.itxca.spannablex/-span/style.html | 37 + .../com.itxca.spannablex/-span/subscript.html | 37 + .../-span/suggestion.html | 37 + .../-span/superscript.html | 37 + .../-span/text-appearance.html | 37 + .../com.itxca.spannablex/-span/text.html | 37 + .../com.itxca.spannablex/-span/typeface.html | 37 + .../com.itxca.spannablex/-span/underline.html | 37 + .../com.itxca.spannablex/-span/url.html | 37 + .../-spannable-dsl/-companion/create.html | 37 + .../-spannable-dsl/-companion/index.html | 59 + .../-spannable-dsl/absolute-size.html | 37 + .../-spannable-dsl/background.html | 37 + .../-spannable-dsl/blur-mask.html | 37 + .../-spannable-dsl/clickable.html | 37 + .../-spannable-dsl/color.html | 37 + .../-spannable-dsl/image.html | 37 + .../-spannable-dsl/index.html | 393 ++++++ .../-spannable-dsl/mask-filter.html | 37 + .../-spannable-dsl/newline.html | 37 + .../-spannable-dsl/relative-size.html | 37 + .../-spannable-dsl/scale-x.html | 37 + .../-spannable-dsl/span.html | 37 + .../-spannable-dsl/strikethrough.html | 37 + .../-spannable-dsl/style.html | 37 + .../-spannable-dsl/subscript.html | 37 + .../-spannable-dsl/suggestion.html | 37 + .../-spannable-dsl/superscript.html | 37 + .../-spannable-dsl/text-appearance.html | 37 + .../-spannable-dsl/text-spannable.html | 37 + .../-spannable-dsl/text.html | 37 + .../-spannable-dsl/typeface.html | 37 + .../-spannable-dsl/underline.html | 37 + .../-spannable-dsl/url.html | 37 + .../activate-all-text-view-click.html | 37 + .../com.itxca.spannablex/activate-click.html | 37 + .../auto-activate-click.html | 37 + .../com.itxca.spannablex/index.html | 233 ++++ .../com.itxca.spannablex/plus.html | 37 + .../remove-all-spans.html | 37 + .../com.itxca.spannablex/remove-spans.html | 37 + .../com.itxca.spannablex/span.html | 37 + .../com.itxca.spannablex/spannable.html | 37 + .../com.itxca.spannablex/to-replace-rule.html | 37 + docs/api/-spannable-x/package-list | 143 ++ docs/api/images/anchor-copy-button.svg | 4 + docs/api/images/arrow_down.svg | 3 + docs/api/images/copy-icon.svg | 3 + docs/api/images/copy-successful-icon.svg | 3 + docs/api/images/footer-go-to-link.svg | 3 + docs/api/images/go-to-top-icon.svg | 4 + docs/api/images/logo-icon.svg | 10 + docs/api/images/theme-toggle.svg | 4 + docs/api/index.html | 108 ++ docs/api/navigation.html | 97 ++ docs/api/scripts/clipboard.js | 52 + docs/api/scripts/main.js | 44 + docs/api/scripts/navigation-loader.js | 64 + docs/api/scripts/pages.json | 1 + docs/api/scripts/platform-content-handler.js | 358 +++++ docs/api/scripts/prism.js | 13 + docs/api/scripts/sourceset_dependencies.js | 1 + docs/api/styles/jetbrains-mono.css | 17 + docs/api/styles/logo-styles.css | 15 + docs/api/styles/main.css | 118 ++ docs/api/styles/prism.css | 103 ++ docs/api/styles/style.css | 1168 +++++++++++++++++ docs/chain.md | 86 ++ docs/change.md | 4 + docs/dsl.md | 89 ++ docs/index.md | 58 + docs/replace.md | 179 +++ docs/res/logo.png | Bin 0 -> 8177 bytes docs/res/replace_sample.png | Bin 0 -> 109437 bytes docs/res/sample_code.gif | Bin 0 -> 1500394 bytes docs/res/sample_java.png | Bin 0 -> 2462939 bytes docs/res/sample_kotlin.png | Bin 0 -> 2462939 bytes docs/spans.md | 50 + docs/stylesheets/extra.css | 18 + docs/utils.md | 134 ++ gradle.properties | 23 + gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59203 bytes gradle/wrapper/gradle-wrapper.properties | 6 + gradlew | 185 +++ gradlew.bat | 89 ++ library/.gitignore | 1 + library/build.gradle | 51 + library/consumer-rules.pro | 0 library/proguard-rules.pro | 21 + library/src/main/AndroidManifest.xml | 2 + .../java/com/itxca/spannablex/ReplaceRule.kt | 74 ++ .../main/java/com/itxca/spannablex/Span.kt | 477 +++++++ .../main/java/com/itxca/spannablex/SpanDsl.kt | 460 +++++++ .../java/com/itxca/spannablex/SpanInternal.kt | 540 ++++++++ .../java/com/itxca/spannablex/SpannableX.kt | 145 ++ .../spannablex/annotation/ConversionUnit.kt | 45 + .../itxca/spannablex/annotation/TextStyle.kt | 27 + .../interfaces/OnSpanClickListener.java | 37 + .../interfaces/OnSpanReplacementMatch.java | 34 + .../spannablex/span/SimpleClickableSpan.kt | 57 + .../itxca/spannablex/span/SizeImageSpan.kt | 128 ++ .../itxca/spannablex/utils/DrawableSize.kt | 57 + .../com/itxca/spannablex/utils/SpanUtils.kt | 52 + mkdocs.yml | 41 + settings.gradle | 19 + 231 files changed, 14368 insertions(+) create mode 100644 .github/workflows/android_ci.yml create mode 100644 .github/workflows/mkdocs.yml create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README.md create mode 100644 app/.gitignore create mode 100644 app/build.gradle create mode 100644 app/proguard-rules.pro create mode 100644 app/src/androidTest/java/com/itxca/sample/spannable/ExampleInstrumentedTest.kt create mode 100644 app/src/main/AndroidManifest.xml create mode 100644 app/src/main/assets/Inconsolata-Regular.ttf create mode 100644 app/src/main/assets/code.txt create mode 100644 app/src/main/java/com/itxca/sample/spannable/CodeFragment.kt create mode 100644 app/src/main/java/com/itxca/sample/spannable/JavaFragment.java create mode 100644 app/src/main/java/com/itxca/sample/spannable/KotlinFragment.kt create mode 100644 app/src/main/java/com/itxca/sample/spannable/MainActivity.kt create mode 100644 app/src/main/java/com/itxca/sample/spannable/Utils.kt create mode 100644 app/src/main/res/drawable/bg_rounded.xml create mode 100644 app/src/main/res/layout/code_fragment.xml create mode 100644 app/src/main/res/layout/main_activity.xml create mode 100644 app/src/main/res/layout/sample_fragment.xml create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/values/colors.xml create mode 100644 app/src/main/res/values/strings.xml create mode 100644 app/src/main/res/values/themes.xml create mode 100644 app/src/test/java/com/itxca/sample/spannable/ExampleUnitTest.kt create mode 100644 build.gradle create mode 100644 docs/api/-spannable-x/com.itxca.spannablex.annotation/-conversion-unit/-companion/-d-p.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex.annotation/-conversion-unit/-companion/-n-o-t_-c-o-n-v-e-r-t.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex.annotation/-conversion-unit/-companion/-s-p.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex.annotation/-conversion-unit/-companion/index.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex.annotation/-conversion-unit/-conversion-unit.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex.annotation/-conversion-unit/index.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex.annotation/-text-style/-text-style.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex.annotation/-text-style/index.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex.annotation/index.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex.interfaces/-on-span-click-listener/index.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex.interfaces/-on-span-click-listener/on-click.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex.interfaces/-on-span-replacement-match/index.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex.interfaces/-on-span-replacement-match/on-match.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex.interfaces/index.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex.span/-simple-clickable-config/-simple-clickable-config.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex.span/-simple-clickable-config/index.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex.span/-simple-clickable-config/underline.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex.span/-simple-clickable-span/-simple-clickable-span.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex.span/-simple-clickable-span/index.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex.span/-simple-clickable-span/on-click.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex.span/-simple-clickable-span/update-draw-state.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex.span/-size-image-span/-companion/index.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex.span/-size-image-span/-size-image-span.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex.span/-size-image-span/clear-drawable-cache.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex.span/-size-image-span/draw.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex.span/-size-image-span/drawable-height.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex.span/-size-image-span/drawable-size.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex.span/-size-image-span/drawable-width.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex.span/-size-image-span/get-size.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex.span/-size-image-span/index.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex.span/index.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex.utils/-drawable-size/-drawable-size.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex.utils/-drawable-size/height.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex.utils/-drawable-size/index.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex.utils/-drawable-size/width.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex.utils/color.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex.utils/config-text-view-size.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex.utils/dp.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex.utils/drawable-size.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex.utils/index.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex.utils/sp.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex.utils/text-size-int.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-replace-rule/-replace-rule.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-replace-rule/index.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-replace-rule/is-regex.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-replace-rule/match-range.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-replace-rule/new-string.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-replace-rule/replace-string.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-replace-rule/replacement-match.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/-companion/create.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/-companion/index.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/absolute-size.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/background.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/blur-mask.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/clickable.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/color.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/image.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/index.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/mask-filter.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/newline.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/relative-size.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/scale-x.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/span.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/strikethrough.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/style.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/subscript.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/suggestion.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/superscript.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/text-appearance.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/text-spannable.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/text.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/typeface.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/underline.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/url.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-span/-companion/activate-click.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-span/-companion/create.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-span/-companion/dp.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-span/-companion/drawable-size.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-span/-companion/index.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-span/-companion/remove-all-spans.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-span/-companion/remove-spans.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-span/-companion/sp.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-span/-companion/spanned-string.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-span/-companion/to-replace-rule.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-span/absolute-size.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-span/background.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-span/blur-mask.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-span/clickable.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-span/color.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-span/image.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-span/index.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-span/mask-filter.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-span/newline.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-span/relative-size.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-span/save-cache.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-span/scale-x.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-span/spannable.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-span/strikethrough.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-span/style.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-span/subscript.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-span/suggestion.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-span/superscript.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-span/text-appearance.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-span/text.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-span/typeface.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-span/underline.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-span/url.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/-companion/create.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/-companion/index.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/absolute-size.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/background.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/blur-mask.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/clickable.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/color.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/image.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/index.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/mask-filter.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/newline.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/relative-size.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/scale-x.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/span.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/strikethrough.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/style.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/subscript.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/suggestion.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/superscript.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/text-appearance.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/text-spannable.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/text.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/typeface.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/underline.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/url.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/activate-all-text-view-click.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/activate-click.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/auto-activate-click.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/index.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/plus.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/remove-all-spans.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/remove-spans.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/span.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/spannable.html create mode 100644 docs/api/-spannable-x/com.itxca.spannablex/to-replace-rule.html create mode 100644 docs/api/-spannable-x/package-list create mode 100644 docs/api/images/anchor-copy-button.svg create mode 100644 docs/api/images/arrow_down.svg create mode 100644 docs/api/images/copy-icon.svg create mode 100644 docs/api/images/copy-successful-icon.svg create mode 100644 docs/api/images/footer-go-to-link.svg create mode 100644 docs/api/images/go-to-top-icon.svg create mode 100644 docs/api/images/logo-icon.svg create mode 100644 docs/api/images/theme-toggle.svg create mode 100644 docs/api/index.html create mode 100644 docs/api/navigation.html create mode 100644 docs/api/scripts/clipboard.js create mode 100644 docs/api/scripts/main.js create mode 100644 docs/api/scripts/navigation-loader.js create mode 100644 docs/api/scripts/pages.json create mode 100644 docs/api/scripts/platform-content-handler.js create mode 100644 docs/api/scripts/prism.js create mode 100644 docs/api/scripts/sourceset_dependencies.js create mode 100644 docs/api/styles/jetbrains-mono.css create mode 100644 docs/api/styles/logo-styles.css create mode 100644 docs/api/styles/main.css create mode 100644 docs/api/styles/prism.css create mode 100644 docs/api/styles/style.css create mode 100644 docs/chain.md create mode 100644 docs/change.md create mode 100644 docs/dsl.md create mode 100644 docs/index.md create mode 100644 docs/replace.md create mode 100644 docs/res/logo.png create mode 100644 docs/res/replace_sample.png create mode 100644 docs/res/sample_code.gif create mode 100644 docs/res/sample_java.png create mode 100644 docs/res/sample_kotlin.png create mode 100644 docs/spans.md create mode 100644 docs/stylesheets/extra.css create mode 100644 docs/utils.md create mode 100644 gradle.properties create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100644 gradlew create mode 100644 gradlew.bat create mode 100644 library/.gitignore create mode 100644 library/build.gradle create mode 100644 library/consumer-rules.pro create mode 100644 library/proguard-rules.pro create mode 100644 library/src/main/AndroidManifest.xml create mode 100644 library/src/main/java/com/itxca/spannablex/ReplaceRule.kt create mode 100644 library/src/main/java/com/itxca/spannablex/Span.kt create mode 100644 library/src/main/java/com/itxca/spannablex/SpanDsl.kt create mode 100644 library/src/main/java/com/itxca/spannablex/SpanInternal.kt create mode 100644 library/src/main/java/com/itxca/spannablex/SpannableX.kt create mode 100644 library/src/main/java/com/itxca/spannablex/annotation/ConversionUnit.kt create mode 100644 library/src/main/java/com/itxca/spannablex/annotation/TextStyle.kt create mode 100644 library/src/main/java/com/itxca/spannablex/interfaces/OnSpanClickListener.java create mode 100644 library/src/main/java/com/itxca/spannablex/interfaces/OnSpanReplacementMatch.java create mode 100644 library/src/main/java/com/itxca/spannablex/span/SimpleClickableSpan.kt create mode 100644 library/src/main/java/com/itxca/spannablex/span/SizeImageSpan.kt create mode 100644 library/src/main/java/com/itxca/spannablex/utils/DrawableSize.kt create mode 100644 library/src/main/java/com/itxca/spannablex/utils/SpanUtils.kt create mode 100644 mkdocs.yml create mode 100644 settings.gradle diff --git a/.github/workflows/android_ci.yml b/.github/workflows/android_ci.yml new file mode 100644 index 0000000..b1813dc --- /dev/null +++ b/.github/workflows/android_ci.yml @@ -0,0 +1,26 @@ +name: CI + +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] + +jobs: + build: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + - name: set up JDK 11 + uses: actions/setup-java@v3 + with: + java-version: '11' + distribution: 'temurin' + cache: gradle + + - name: Grant execute permission for gradlew + run: chmod +x gradlew + - name: Build with Gradle + run: ./gradlew build diff --git a/.github/workflows/mkdocs.yml b/.github/workflows/mkdocs.yml new file mode 100644 index 0000000..5df5ec2 --- /dev/null +++ b/.github/workflows/mkdocs.yml @@ -0,0 +1,16 @@ +name: MkDocs +on: + push: + branches: + - master + - main +jobs: + deploy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-python@v2 + with: + python-version: 3.x + - run: pip install mkdocs-material + - run: mkdocs gh-deploy --force \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a952d87 --- /dev/null +++ b/.gitignore @@ -0,0 +1,17 @@ +*.iml +.gradle +.idea +/local.properties +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.DS_Store +/build +/captures +.externalNativeBuild +.cxx +local.properties +/site/ \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..895657b --- /dev/null +++ b/LICENSE @@ -0,0 +1,174 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..7671716 --- /dev/null +++ b/README.md @@ -0,0 +1,104 @@ +

+ +

简单易用的Spannable扩展

+ +

+ + + + +

+ + +| Code Sample | Kotlin | Java | +| :---------------------------------------: | :-------------------------------: | ------------------------------- | +| ![Gif 1.43MB](./docs/res/sample_code.gif) | ![](./docs/res/sample_kotlin.png) | ![](./docs/res/sample_java.png) | + +✨ 本框架基于 ***liangjingkanji/spannable*** 驱动,此外 **新增以下特性** : + +- **封装常用Span** + + [🛠 查看常用Spans文档](https://txca.github.io/SpannableX/spans/) + +- **Kotlin DSL** + + ```kotlin + TextView.text = spannable { + "this is real text.".text() + "spannable".color(Color.BLUE).style(Typeface.BOLD) + } + ``` + +- **Kotlin|Java 链式** + + ```java + TextView.setText(Span.create() + .text("this is real text.") + .text("spannable").color(Color.BLUE).style(Typeface.BOLD) + .spannable()); + ``` + +- **更方便的替换规则** + + 支持String、正则、[ReplaceRule]()及相应的Array|List 替换规则 + +*更多详情参考:* + +**[ ⭐ 使用文档 ](https://txca.github.io/SpannableX/)** **[ ⚙ API文档 ](https://txca.github.io/SpannableX/api/)** + +--- + +### 使用 + +框架存储在`mavenCentral`,大部分情况不需要手动配置,添加远程仓库根据创建项目的 Android Studio 版本有所不同。 + +```groovy +// 项目根目录build.gradle +allprojects { + repositories { + mavenCentral() + } +} +``` + +```kotlin +// 项目根目录settings.gradle +dependencyResolutionManagement { + repositories { + mavenCentral() + } +} +``` + +然后在 module 的 build.gradle 添加依赖框架 + +```groovy +dependencies { + // https://github.com/TxcA/SpannableX + implementation 'com.itxca.spannablex:spannablex:1.0.0' +} +``` + +### 鸣谢 + +[@liangjingkanji](https://github.com/liangjingkanji) + +[spannable](https://github.com/liangjingkanji/spannable) + +### License + +``` +Apache-2.0 Copyright 2022 TxcA + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +``` diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..d6fed3a --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,51 @@ +plugins { + id 'com.android.application' + id 'org.jetbrains.kotlin.android' + id 'kotlin-kapt' +} + +android { + compileSdk 30 + + defaultConfig { + applicationId "com.itxca.sample.spannable" + minSdk 19 + targetSdk 30 + versionCode 1 + versionName "1.0" + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + kotlinOptions { + jvmTarget = '1.8' + } + + viewBinding.enabled = true + dataBinding.enabled = true +} + +dependencies { + implementation 'androidx.core:core-ktx:1.6.0' + implementation 'androidx.appcompat:appcompat:1.3.1' + implementation 'com.google.android.material:material:1.4.0' + implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1' + + testImplementation 'junit:junit:4.13.2' + androidTestImplementation 'androidx.test.ext:junit:1.1.3' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' + + implementation project(path: ":library") +} \ No newline at end of file diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/app/src/androidTest/java/com/itxca/sample/spannable/ExampleInstrumentedTest.kt b/app/src/androidTest/java/com/itxca/sample/spannable/ExampleInstrumentedTest.kt new file mode 100644 index 0000000..e5ced5a --- /dev/null +++ b/app/src/androidTest/java/com/itxca/sample/spannable/ExampleInstrumentedTest.kt @@ -0,0 +1,22 @@ +package com.itxca.sample.spannable + +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.platform.app.InstrumentationRegistry +import org.junit.Assert.assertEquals +import org.junit.Test +import org.junit.runner.RunWith + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("com.itxca.sample.spannable", appContext.packageName) + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..41aa37f --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/assets/Inconsolata-Regular.ttf b/app/src/main/assets/Inconsolata-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..fc981ce7ad6c42d2384f0ef74b73174b9302ee65 GIT binary patch literal 96964 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

bO)#R zarzLak8t`Vr_XWv_sz#`+U$Id(>I;Yv322Nge>_%4srx8xe zIj!Nek<)fgh0a>G=2uO;bqtxZPrJ?Y@O?Hed@@WKJ*a29xL00JQM$&Mq;JFxps0bkailezmU9|0 zQ|R1AOk}7um98>WrW&EL)JT=B+{Ξ29ypp!R(LOYK$fsCU(S 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 YaFbT>1t<8 literal 0 HcmV?d00001 diff --git a/app/src/main/assets/code.txt b/app/src/main/assets/code.txt new file mode 100644 index 0000000..d568aab --- /dev/null +++ b/app/src/main/assets/code.txt @@ -0,0 +1,25 @@ +class MainActivity : AppCompatActivity() { + + private val fragments = listOf( + "Code Sample" to CodeFragment.newInstance(), + "Kotlin" to KotlinFragment.newInstance(), + "Java" to JavaFragment.newInstance(), + ) + + private val viewBinding by lazy { MainActivityBinding.inflate(layoutInflater) } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(viewBinding.root) + + repeat(fragments.size) { viewBinding.tab.addTab(viewBinding.tab.newTab()) } + viewBinding.container.adapter = object : FragmentStateAdapter(this) { + override fun getItemCount(): Int = fragments.size + override fun createFragment(position: Int): Fragment = fragments[position].second + } + + TabLayoutMediator(viewBinding.tab, viewBinding.container) { layoutTab, position -> + layoutTab.text = fragments[position].first + }.attach() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/itxca/sample/spannable/CodeFragment.kt b/app/src/main/java/com/itxca/sample/spannable/CodeFragment.kt new file mode 100644 index 0000000..ab6a1f3 --- /dev/null +++ b/app/src/main/java/com/itxca/sample/spannable/CodeFragment.kt @@ -0,0 +1,136 @@ +package com.itxca.sample.spannable + +import android.graphics.Typeface +import android.os.Bundle +import android.text.Editable +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.core.widget.addTextChangedListener +import androidx.fragment.app.Fragment +import androidx.lifecycle.lifecycleScope +import com.itxca.sample.spannable.databinding.CodeFragmentBinding +import com.itxca.spannablex.ReplaceRule +import com.itxca.spannablex.removeAllSpans +import com.itxca.spannablex.spannable +import com.itxca.spannablex.toReplaceRule +import com.itxca.spannablex.utils.color +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext + + +class CodeFragment : Fragment() { + + + // + /** + * 正则替换 + */ + private val functionArray = + "\\b(class|private|val|override|fun|by|this|super|object)\\b".toRegex() + private val stringArray = "\"([^\"]*)\"".toRegex() + + /** + * [Array] [String] 替换 + */ + private val valArray = arrayOf( + "fragments", + "layoutInflater", + "viewBinding", + "root", + "tab", + "container", + "adapter", + "text", + "size", + "first", + "second" + ) + + /** + * [Array] [ReplaceRule] 替换 + */ + private val operatorArray = arrayOf( + "onCreate".toReplaceRule(true, matchIndex = 0), + "\\sto\\s".toReplaceRule(true), + "getItemCount".toReplaceRule(), + "createFragment".toReplaceRule(), + "(".toReplaceRule(), + ")".toReplaceRule(), + "{".toReplaceRule(), + "}".toReplaceRule() + ) + + /** + * [List] [String] 替换 + */ + private val italicsArray = listOf("listOf", " to ", "lazy", "layoutInflater", "root") + + /** + * 颜色 + */ + private val functionColor = "#cc7832".color + private val stringColor = "#6a8759".color + private val valColor = "#9876aa".color + private val operatorColor = "#ffc66d".color + // + + private lateinit var viewBinding: CodeFragmentBinding + + private var lastRefreshTime = 0L + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View = CodeFragmentBinding.inflate(inflater, container, false).apply { + viewBinding = this + }.root + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + viewBinding.etCode.run { + setTextColor("#a9b7c6".color) + typeface = Typeface.createFromAsset(requireContext().assets, "Inconsolata-Regular.ttf") + addTextChangedListener(afterTextChanged = ::refreshSpan) + lifecycleScope.launch(Dispatchers.IO) { + delay(4000L) + val codeText = requireContext().assets.open("code.txt").use { + String(it.readBytes()) + } + withContext(Dispatchers.Main) { + for (c in codeText) { + append(c.toString()) + delay(20) + } + refreshSpan(viewBinding.etCode.text) + } + } + } + } + + private fun refreshSpan(editable: Editable?) { + editable ?: return + if (System.currentTimeMillis() - lastRefreshTime > REFRESH_TIME_INTERVAL) { + editable.removeAllSpans() + editable.spannable { + color(functionColor, functionArray) + color(stringColor, stringArray) + color(operatorColor, operatorArray) + color(valColor, valArray) + style(Typeface.ITALIC, italicsArray) + } + lastRefreshTime = System.currentTimeMillis() + } + } + + companion object { + + private const val REFRESH_TIME_INTERVAL = 300L + + fun newInstance() = CodeFragment() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/itxca/sample/spannable/JavaFragment.java b/app/src/main/java/com/itxca/sample/spannable/JavaFragment.java new file mode 100644 index 0000000..52f8c9e --- /dev/null +++ b/app/src/main/java/com/itxca/sample/spannable/JavaFragment.java @@ -0,0 +1,174 @@ +package com.itxca.sample.spannable; + +import android.content.res.ColorStateList; +import android.graphics.Color; +import android.graphics.Typeface; +import android.os.Bundle; +import android.text.Editable; +import android.text.TextWatcher; +import android.text.style.SuggestionSpan; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.core.content.ContextCompat; +import androidx.fragment.app.Fragment; + +import com.itxca.sample.spannable.databinding.SampleFragmentBinding; +import com.itxca.spannablex.Span; +import com.itxca.spannablex.annotation.ConversionUnit; + +import java.util.Locale; + + +public class JavaFragment extends Fragment { + + public static JavaFragment newInstance() { + return new JavaFragment(); + } + + private SampleFragmentBinding viewBinding; + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + viewBinding = SampleFragmentBinding.inflate(inflater, container, false); + return viewBinding.getRoot(); + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + + viewBinding.tvTitle.setText(Span.create() + .text("x SpannableX").relativeSize(1.2f) + .style(Typeface.BOLD) + .image(requireContext(), R.mipmap.ic_launcher, viewBinding.tvTitle, null, "x") + .color("#ff0000", "S") + .color("#ffa500", "p") + .color("#ffff00", Span.toReplaceRule("a", false, 0)) + .color("#00ff00", Span.toReplaceRule("n", false, 0)) + .color("#00f7ff", Span.toReplaceRule("n", false, 1)) + .color("#0000ff", Span.toReplaceRule("a", false, 1)) + .color("#8b00ff", "b") + .color("#ff0000", "l") + .color("#ffa500", "e") + .color("#ffff00", "X") + .spannable()); + + Span.activateClick(viewBinding.tvMixed).setText(Span.create() + .text("all spannable mixed") + .style(Typeface.ITALIC, "spannable") + .typeface(null, "serif", new String[]{"all", "mix"}) + .color(Color.parseColor("#da4f49"), "all") + .color(Color.parseColor("#faa732"), "spannable") + .color(Color.parseColor("#0088CC"), "mixed") + .background(Color.parseColor("#eaeaea")) + .scaleX(1.1f, "spannable") + .blurMask(1.1f, null, "spannable") + .superscript("all") + .subscript("mixed") + .absoluteSize(12, true) + .relativeSize(1.2f) + .strikethrough("all") + .underline("spannable") + .clickable(null, null, null, null, null, (v, matchText) -> + Utils.toast(this, "点击: " + matchText) + ) + .spannable() + ); + + Span.activateClick(viewBinding.tvSample).setText(Span.create() + .text("TextView.setText(Span.create()") + .style(Typeface.ITALIC) + .style(Typeface.BOLD, "Span.create()") + .color(Color.BLACK, "Span.create()") + .newline() + .text(" .style()").newline().style(Typeface.BOLD | Typeface.ITALIC) + .text(" .typeface()").newline().typeface( + Typeface.createFromAsset(requireContext().getAssets(), "Inconsolata-Regular.ttf"), + null, Utils.getUnSpaceRegex() + ) + .text(" .textAppearance()").newline().textAppearance( + Typeface.ITALIC, + Span.sp(14), + Color.RED, + "serif", + ColorStateList.valueOf(Color.BLUE), + Utils.getUnSpaceRegex() + ) + .text(" .color()").newline().color( + ContextCompat.getColor(requireContext(), R.color.colorPrimary) + ) + .text(" .background()").newline().background( + ContextCompat.getColor(requireContext(), R.color.colorPrimaryVariant), Utils.getUnSpaceRegex() + ) + + .text(" .image() x").image( + requireContext(), R.mipmap.ic_launcher, viewBinding.tvSample, null, "x" + ) + .image(requireContext(), R.mipmap.ic_launcher, null, Span.drawableSize(18, ConversionUnit.SP)) + .image(requireContext(), R.mipmap.ic_launcher, null, Span.drawableSize(24, ConversionUnit.SP)) + .newline() + .text(" .scaleX()").newline().scaleX(2.0f, Span.toReplaceRule("X", false, 0)) + .text(" .blurMask()").newline().blurMask(5.0f) + .text(" .superscript() > Top").newline().superscript("Top") + .text(" .subscript() > Bottom").newline().subscript("Bottom") + .text(" .absoluteSize()").newline().absoluteSize(11, true, Utils.getUnSpaceRegex()) + .text(" .relativeSize()").newline().relativeSize(1.5f, Utils.getUnSpaceRegex()) + .text(" .strikethrough()").newline().strikethrough(Utils.getUnSpaceRegex()) + .text(" .underline()").newline().underline(Utils.getUnSpaceRegex()) + .text(" .url()").newline().url("https://github.com/TxcA/SpannableX", Utils.getUnSpaceRegex()) + .text(" .suggestion() // click").newline().clickable(null, null, null, null, null, (v, matchText) -> + { + viewBinding.et.setText("T"); + Utils.toast(this, requireContext().getString(R.string.input_tip)); + }) + .color(Color.BLUE, "// click") + .underline("click") + .text(" .clickable()").clickable( + Color.BLUE, + null, + Typeface.BOLD | Typeface.ITALIC, + null, + null, + (v, matchText) -> + Utils.toast(this, "点击: " + matchText) + ) + .newline() + .text(" .spannable()").style(Typeface.ITALIC) + .style(Typeface.BOLD) + .color(Color.BLACK) + .text(");") + .spannable()); + + viewBinding.et.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + + } + + @Override + public void afterTextChanged(Editable s) { + if (s == null) { + return; + } + if (s.toString().toUpperCase(Locale.ROOT).contains("T")) { + Span.create().text(s).suggestion( + requireContext(), + new String[]{"TxcA", "https://github.com/TxcA/", "https://github.com/TxcA/SpannableX"}, + 1); + } else { + Span.removeSpans(s, SuggestionSpan.class); + } + } + }); + } +} diff --git a/app/src/main/java/com/itxca/sample/spannable/KotlinFragment.kt b/app/src/main/java/com/itxca/sample/spannable/KotlinFragment.kt new file mode 100644 index 0000000..cef002b --- /dev/null +++ b/app/src/main/java/com/itxca/sample/spannable/KotlinFragment.kt @@ -0,0 +1,158 @@ +package com.itxca.sample.spannable + +import android.annotation.SuppressLint +import android.content.res.ColorStateList +import android.graphics.Color +import android.graphics.Typeface +import android.os.Bundle +import android.text.style.SuggestionSpan +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.core.content.ContextCompat +import androidx.core.widget.addTextChangedListener +import androidx.fragment.app.Fragment +import com.itxca.sample.spannable.databinding.SampleFragmentBinding +import com.itxca.spannablex.* +import com.itxca.spannablex.utils.color +import com.itxca.spannablex.utils.drawableSize +import com.itxca.spannablex.utils.sp + + +class KotlinFragment : Fragment() { + + private lateinit var viewBinding: SampleFragmentBinding + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View = SampleFragmentBinding.inflate(inflater, container, false).apply { + viewBinding = this + }.root + + @SuppressLint("SetTextI18n") + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + viewBinding.tvTitle.text = "x SpannableX".spannable { + relativeSize(1.2f) + style(Typeface.BOLD) + + image(requireContext(), R.mipmap.ic_launcher, viewBinding.tvTitle, replaceRule = "x") + color("#ff0000", "S") + color("#ffa500", "p") + color("#ffff00", "a".toReplaceRule(matchIndex = 0)) + color("#00ff00", "n".toReplaceRule(matchIndex = 0)) + color("#00f7ff", "n".toReplaceRule(matchIndex = 1)) + color("#0000ff", "a".toReplaceRule(matchIndex = 1)) + color("#8b00ff", "b") + color("#ff0000", "l") + color("#ffa500", "e") + color("#ffff00", "X") + } + + viewBinding.tvMixed.activateClick().text = "all spannable mixed".spannable { + style(Typeface.ITALIC, "spannable") + typeface(family = "serif", replaceRule = arrayOf("all", "mix")) + color("#da4f49".color, "all") + color("#faa732".color, "spannable") + color("#0088CC".color, "mixed") + background("#eaeaea".color) + scaleX(1.1f, "spannable") + blurMask(1.1f, replaceRule = "spannable") + superscript("all") + subscript("mixed") + absoluteSize(12, true) + relativeSize(1.2f) + strikethrough("all") + underline("spannable") + clickable { _, matchText -> + toast("点击: $matchText") + } + } + + viewBinding.tvSample.activateClick(true).text = "TextView.text = spannable {".spannable { + style(Typeface.ITALIC) + style(Typeface.BOLD, "spannable {") + color(Color.BLACK, "spannable {") + + newline() + " style".newline().style(Typeface.BOLD or Typeface.ITALIC) + " typeface".newline().typeface( + Typeface.createFromAsset(requireContext().assets, "Inconsolata-Regular.ttf"), + replaceRule = unSpaceRegex + ) + " textAppearance".newline().textAppearance( + style = Typeface.ITALIC, + size = 14.sp, + color = Color.RED, + family = "serif", + linkColor = ColorStateList.valueOf(Color.BLUE), + replaceRule = unSpaceRegex + ) + " color".newline().color( + ContextCompat.getColor(requireContext(), R.color.colorPrimary) + ) + " background".newline().background( + ContextCompat.getColor(requireContext(), R.color.colorPrimaryVariant), unSpaceRegex + ) + + " image x".image( + requireContext(), R.mipmap.ic_launcher, viewBinding.tvSample, replaceRule = "x" + ) + image(requireContext(), R.mipmap.ic_launcher, size = 18.sp.drawableSize) + image(requireContext(), R.mipmap.ic_launcher, size = 24.sp.drawableSize) + newline() + " scaleX".newline().scaleX(2.0f, "X".toReplaceRule(matchIndex = 0)) + " blurMask".newline().blurMask(5.0f) + " superscript > Top".newline().superscript("Top") + " subscript > Bottom".newline().subscript("Bottom") + " absoluteSize".newline().absoluteSize(11, true, unSpaceRegex) + " relativeSize".newline().relativeSize(1.5f, unSpaceRegex) + " strikethrough".newline().strikethrough(unSpaceRegex) + " underline".newline().underline(unSpaceRegex) + " url".newline().url("https://github.com/TxcA/SpannableX", unSpaceRegex) + " suggestion // click".newline().span { + clickable { _, _ -> + viewBinding.et.setText("T") + toast(requireContext().getString(R.string.input_tip)) + } + color(Color.BLUE, "// click") + underline("click") + } + " clickable".clickable( + color = Color.BLUE, + typeStyle = Typeface.BOLD or Typeface.ITALIC + ) { _, matchText -> + toast("点击: $matchText") + } + newline() + } + " }".spannable { + style(Typeface.ITALIC) + style(Typeface.BOLD) + color(Color.BLACK) + } + + // 输入提示 + viewBinding.et.addTextChangedListener { + it ?: return@addTextChangedListener + if (it.contains("T", true)) { + it.spannable { + suggestion( + requireContext(), + arrayOf( + "TxcA", + "https://github.com/TxcA/", + "https://github.com/TxcA/SpannableX", + ), 1 + ) + } + } else it.removeSpans() + } + } + + companion object { + fun newInstance() = KotlinFragment() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/itxca/sample/spannable/MainActivity.kt b/app/src/main/java/com/itxca/sample/spannable/MainActivity.kt new file mode 100644 index 0000000..435cd21 --- /dev/null +++ b/app/src/main/java/com/itxca/sample/spannable/MainActivity.kt @@ -0,0 +1,36 @@ +package com.itxca.sample.spannable + +import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity +import androidx.fragment.app.Fragment +import androidx.viewpager2.adapter.FragmentStateAdapter +import com.google.android.material.tabs.TabLayoutMediator +import com.itxca.sample.spannable.databinding.MainActivityBinding + + +class MainActivity : AppCompatActivity() { + + private val fragments = listOf( + "Code Sample" to CodeFragment.newInstance(), + "Kotlin" to KotlinFragment.newInstance(), + "Java" to JavaFragment.newInstance(), + ) + + private val viewBinding by lazy { MainActivityBinding.inflate(layoutInflater) } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(viewBinding.root) + + repeat(fragments.size) { viewBinding.tab.addTab(viewBinding.tab.newTab()) } + viewBinding.container.adapter = object : FragmentStateAdapter(this) { + override fun getItemCount(): Int = fragments.size + override fun createFragment(position: Int): Fragment = fragments[position].second + } + + TabLayoutMediator(viewBinding.tab, viewBinding.container) { layoutTab, position -> + layoutTab.text = fragments[position].first + }.attach() + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/itxca/sample/spannable/Utils.kt b/app/src/main/java/com/itxca/sample/spannable/Utils.kt new file mode 100644 index 0000000..23bd030 --- /dev/null +++ b/app/src/main/java/com/itxca/sample/spannable/Utils.kt @@ -0,0 +1,18 @@ +@file:JvmName("Utils") + +package com.itxca.sample.spannable + +import android.widget.Toast +import androidx.fragment.app.Fragment + +/** + * 简单toast + */ +fun Fragment.toast(msg: String) { + Toast.makeText(requireContext(), msg, Toast.LENGTH_SHORT).show() +} + +/** + * 非空白字符正则 + */ +val unSpaceRegex = "\\S+".toRegex() diff --git a/app/src/main/res/drawable/bg_rounded.xml b/app/src/main/res/drawable/bg_rounded.xml new file mode 100644 index 0000000..8a66239 --- /dev/null +++ b/app/src/main/res/drawable/bg_rounded.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/code_fragment.xml b/app/src/main/res/layout/code_fragment.xml new file mode 100644 index 0000000..9dead5f --- /dev/null +++ b/app/src/main/res/layout/code_fragment.xml @@ -0,0 +1,12 @@ + + \ No newline at end of file diff --git a/app/src/main/res/layout/main_activity.xml b/app/src/main/res/layout/main_activity.xml new file mode 100644 index 0000000..03337ac --- /dev/null +++ b/app/src/main/res/layout/main_activity.xml @@ -0,0 +1,28 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/sample_fragment.xml b/app/src/main/res/layout/sample_fragment.xml new file mode 100644 index 0000000..6ec0317 --- /dev/null +++ b/app/src/main/res/layout/sample_fragment.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher.webp new file mode 100644 index 0000000000000000000000000000000000000000..948a3070fe34c611c42c0d3ad3013a0dce358be0 GIT binary patch literal 1900 zcmV-y2b1_xNk&Fw2LJ$9MM6+kP&il$0000G0001A003VA06|PpNH75a00DqwTbm-~ zullQTcXxO9ki!OCRx^i?oR|n!<8G0=kI^!JSjFi-LL*`V;ET0H2IXfU0*i>o6o6Gy zRq6Ap5(_{XLdXcL-MzlN`ugSdZY_`jXhcENAu)N_0?GhF))9R;E`!bo9p?g?SRgw_ zEXHhFG$0{qYOqhdX<(wE4N@es3VIo$%il%6xP9gjiBri+2pI6aY4 zJbgh-Ud|V%3O!IcHKQx1FQH(_*TK;1>FQWbt^$K1zNn^cczkBs=QHCYZ8b&l!UV{K z{L0$KCf_&KR^}&2Fe|L&?1I7~pBENnCtCuH3sjcx6$c zwqkNkru);ie``q+_QI;IYLD9OV0ZxkuyBz|5<$1BH|vtey$> z5oto4=l-R-Aaq`Dk0}o9N0VrkqW_#;!u{!bJLDq%0092{Ghe=F;(kn} z+sQ@1=UlX30+2nWjkL$B^b!H2^QYO@iFc0{(-~yXj2TWz?VG{v`Jg zg}WyYnwGgn>{HFaG7E~pt=)sOO}*yd(UU-D(E&x{xKEl6OcU?pl)K%#U$dn1mDF19 zSw@l8G!GNFB3c3VVK0?uyqN&utT-D5%NM4g-3@Sii9tSXKtwce~uF zS&Jn746EW^wV~8zdQ1XC28~kXu8+Yo9p!<8h&(Q({J*4DBglPdpe4M_mD8AguZFn~ ztiuO~{6Bx?SfO~_ZV(GIboeR9~hAym{{fV|VM=77MxDrbW6`ujX z<3HF(>Zr;#*uCvC*bpoSr~C$h?_%nXps@A)=l_;({Fo#6Y1+Zv`!T5HB+)#^-Ud_; zBwftPN=d8Vx)*O1Mj+0oO=mZ+NVH*ptNDC-&zZ7Hwho6UQ#l-yNvc0Cm+2$$6YUk2D2t#vdZX-u3>-Be1u9gtTBiMB^xwWQ_rgvGpZ6(C@e23c!^K=>ai-Rqu zhqT`ZQof;9Bu!AD(i^PCbYV%yha9zuoKMp`U^z;3!+&d@Hud&_iy!O-$b9ZLcSRh? z)R|826w}TU!J#X6P%@Zh=La$I6zXa#h!B;{qfug}O%z@K{EZECu6zl)7CiNi%xti0 zB{OKfAj83~iJvmpTU|&q1^?^cIMn2RQ?jeSB95l}{DrEPTW{_gmU_pqTc)h@4T>~& zluq3)GM=xa(#^VU5}@FNqpc$?#SbVsX!~RH*5p0p@w z;~v{QMX0^bFT1!cXGM8K9FP+=9~-d~#TK#ZE{4umGT=;dfvWi?rYj;^l_Zxywze`W z^Cr{55U@*BalS}K%Czii_80e0#0#Zkhlij4-~I@}`-JFJ7$5{>LnoJSs??J8kWVl6|8A}RCGAu9^rAsfCE=2}tHwl93t0C?#+jMpvr7O3`2=tr{Hg$=HlnjVG^ewm|Js0J*kfPa6*GhtB>`fN!m#9J(sU!?(OSfzY*zS(FJ<-Vb zfAIg+`U)YaXv#sY(c--|X zEB+TVyZ%Ie4L$gi#Fc++`h6%vzsS$pjz9aLt+ZL(g;n$Dzy5=m=_TV(3H8^C{r0xd zp#a%}ht55dOq?yhwYPrtp-m1xXp;4X;)NhxxUpgP%XTLmO zcjaFva^}dP3$&sfFTIR_jC=2pHh9kpI@2(6V*GQo7Ws)`j)hd+tr@P~gR*2gO@+1? zG<`_tB+LJuF|SZ9tIec;h%}}6WClT`L>HSW?E{Hp1h^+mlbf_$9zA>!ug>NALJsO{ mU%z=YwVD?}XMya)Bp;vlyE5&E_6!fzx9pwrdz474!~g(M6R?N? literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..1b9a6956b3acdc11f40ce2bb3f6efbd845cc243f GIT binary patch literal 3918 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 + + #FF018786 + #FF03DAC5 + #FF000000 + #FFFFFFFF + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..fc26084 --- /dev/null +++ b/app/src/main/res/values/strings.xml @@ -0,0 +1,4 @@ + + SpannableX + Input \'T\' then touch the \'T\'. + \ No newline at end of file diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml new file mode 100644 index 0000000..3362a8d --- /dev/null +++ b/app/src/main/res/values/themes.xml @@ -0,0 +1,17 @@ + + + + + + \ No newline at end of file diff --git a/app/src/test/java/com/itxca/sample/spannable/ExampleUnitTest.kt b/app/src/test/java/com/itxca/sample/spannable/ExampleUnitTest.kt new file mode 100644 index 0000000..84a7c37 --- /dev/null +++ b/app/src/test/java/com/itxca/sample/spannable/ExampleUnitTest.kt @@ -0,0 +1,16 @@ +package com.itxca.sample.spannable + +import org.junit.Assert.assertEquals +import org.junit.Test + +/** + * Example local unit test, which will execute on the development machine (host). + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +class ExampleUnitTest { + @Test + fun addition_isCorrect() { + assertEquals(4, 2 + 2) + } +} \ No newline at end of file diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..2f121ed --- /dev/null +++ b/build.gradle @@ -0,0 +1,11 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. +plugins { + id 'com.android.application' version '7.1.2' apply false + id 'com.android.library' version '7.1.2' apply false + id 'org.jetbrains.kotlin.android' version '1.6.10' apply false + id 'org.jetbrains.dokka' version "1.6.10" +} + +task clean(type: Delete) { + delete rootProject.buildDir +} \ No newline at end of file diff --git a/docs/api/-spannable-x/com.itxca.spannablex.annotation/-conversion-unit/-companion/-d-p.html b/docs/api/-spannable-x/com.itxca.spannablex.annotation/-conversion-unit/-companion/-d-p.html new file mode 100644 index 0000000..3e472f1 --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex.annotation/-conversion-unit/-companion/-d-p.html @@ -0,0 +1,37 @@ + + + + DP + + + +

+
+
+
+
+
+
+ +
+

DP

+
+
const val DP: Int = 2

转换为dp

+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex.annotation/-conversion-unit/-companion/-n-o-t_-c-o-n-v-e-r-t.html b/docs/api/-spannable-x/com.itxca.spannablex.annotation/-conversion-unit/-companion/-n-o-t_-c-o-n-v-e-r-t.html new file mode 100644 index 0000000..7659580 --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex.annotation/-conversion-unit/-companion/-n-o-t_-c-o-n-v-e-r-t.html @@ -0,0 +1,37 @@ + + + + NOT_CONVERT + + + + +
+
+
+
+
+
+ +
+

NOT_CONVERT

+
+
const val NOT_CONVERT: Int = 0

不转换单位

+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex.annotation/-conversion-unit/-companion/-s-p.html b/docs/api/-spannable-x/com.itxca.spannablex.annotation/-conversion-unit/-companion/-s-p.html new file mode 100644 index 0000000..ea332bf --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex.annotation/-conversion-unit/-companion/-s-p.html @@ -0,0 +1,37 @@ + + + + SP + + + + +
+
+
+
+
+
+ +
+

SP

+
+
const val SP: Int = 1

转换为sp

+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex.annotation/-conversion-unit/-companion/index.html b/docs/api/-spannable-x/com.itxca.spannablex.annotation/-conversion-unit/-companion/index.html new file mode 100644 index 0000000..d5cd6d4 --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex.annotation/-conversion-unit/-companion/index.html @@ -0,0 +1,89 @@ + + + + Companion + + + + +
+
+
+
+
+
+ +
+

Companion

+
object Companion
+
+
+
+
+

Properties

+
+
+
+
+ + +
Link copied to clipboard
+
+
+
+
const val DP: Int = 2

转换为dp

+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
const val NOT_CONVERT: Int = 0

不转换单位

+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
const val SP: Int = 1

转换为sp

+
+
+
+
+
+
+
+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex.annotation/-conversion-unit/-conversion-unit.html b/docs/api/-spannable-x/com.itxca.spannablex.annotation/-conversion-unit/-conversion-unit.html new file mode 100644 index 0000000..5c79438 --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex.annotation/-conversion-unit/-conversion-unit.html @@ -0,0 +1,37 @@ + + + + ConversionUnit + + + + +
+
+
+
+
+
+ +
+

ConversionUnit

+
+
fun ConversionUnit()
+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex.annotation/-conversion-unit/index.html b/docs/api/-spannable-x/com.itxca.spannablex.annotation/-conversion-unit/index.html new file mode 100644 index 0000000..782c25d --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex.annotation/-conversion-unit/index.html @@ -0,0 +1,59 @@ + + + + ConversionUnit + + + + +
+
+
+
+
+
+ +
+

ConversionUnit

+
annotation class ConversionUnit
+
+
+
+
+

Types

+
+
+
+
+ + +
Link copied to clipboard
+
+
+
+
object Companion
+
+
+
+
+
+
+
+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex.annotation/-text-style/-text-style.html b/docs/api/-spannable-x/com.itxca.spannablex.annotation/-text-style/-text-style.html new file mode 100644 index 0000000..9fec3cc --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex.annotation/-text-style/-text-style.html @@ -0,0 +1,37 @@ + + + + TextStyle + + + + +
+
+
+
+
+
+ +
+

TextStyle

+
+
fun TextStyle()
+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex.annotation/-text-style/index.html b/docs/api/-spannable-x/com.itxca.spannablex.annotation/-text-style/index.html new file mode 100644 index 0000000..6b547e6 --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex.annotation/-text-style/index.html @@ -0,0 +1,59 @@ + + + + TextStyle + + + + +
+
+
+
+
+
+ +
+

TextStyle

+
annotation class TextStyle

copy form android.graphics.Typeface.Style, it's is SOURCE annotation

+
+
+
+
+

Constructors

+
+
+
+
+ + +
Link copied to clipboard
+
+
+
+
fun TextStyle()
+
+
+
+
+
+
+
+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex.annotation/index.html b/docs/api/-spannable-x/com.itxca.spannablex.annotation/index.html new file mode 100644 index 0000000..2be0b93 --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex.annotation/index.html @@ -0,0 +1,73 @@ + + + + com.itxca.spannablex.annotation + + + + +
+
+
+
+
+
+ +
+

Package com.itxca.spannablex.annotation

+
+
+
+
+

Types

+
+
+
+
+ + +
Link copied to clipboard
+
+
+
+
annotation class ConversionUnit
+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
annotation class TextStyle

copy form android.graphics.Typeface.Style, it's is SOURCE annotation

+
+
+
+
+
+
+
+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex.interfaces/-on-span-click-listener/index.html b/docs/api/-spannable-x/com.itxca.spannablex.interfaces/-on-span-click-listener/index.html new file mode 100644 index 0000000..fc1e473 --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex.interfaces/-on-span-click-listener/index.html @@ -0,0 +1,59 @@ + + + + OnSpanClickListener + + + + +
+
+
+
+
+
+ +
+

OnSpanClickListener

+
interface OnSpanClickListener

SimpleClickableSpan 点击回调

spanClickable

+
+
+
+
+

Functions

+
+
+
+
+ + +
Link copied to clipboard
+
+
+
+
abstract fun onClick(v: View, matchText: String)
SimpleClickableSpan被点击时回调
+
+
+
+
+
+
+
+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex.interfaces/-on-span-click-listener/on-click.html b/docs/api/-spannable-x/com.itxca.spannablex.interfaces/-on-span-click-listener/on-click.html new file mode 100644 index 0000000..e4a0273 --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex.interfaces/-on-span-click-listener/on-click.html @@ -0,0 +1,37 @@ + + + + onClick + + + + +
+
+
+
+
+
+ +
+

onClick

+
+
abstract fun onClick(v: View, matchText: String)

SimpleClickableSpan被点击时回调

Parameters

v

点击的当前View

matchText

点击时匹配上的文本

+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex.interfaces/-on-span-replacement-match/index.html b/docs/api/-spannable-x/com.itxca.spannablex.interfaces/-on-span-replacement-match/index.html new file mode 100644 index 0000000..f17bf9f --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex.interfaces/-on-span-replacement-match/index.html @@ -0,0 +1,59 @@ + + + + OnSpanReplacementMatch + + + + +
+
+
+
+
+
+ +
+

OnSpanReplacementMatch

+
interface OnSpanReplacementMatch

ReplaceRule 有匹配项时回调 详细说明: replaceSpan

+
+
+
+
+

Functions

+
+
+
+
+ + +
Link copied to clipboard
+
+
+
+
abstract fun onMatch(result: MatchResult)
+
+
+
+
+
+
+
+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex.interfaces/-on-span-replacement-match/on-match.html b/docs/api/-spannable-x/com.itxca.spannablex.interfaces/-on-span-replacement-match/on-match.html new file mode 100644 index 0000000..5b1cf88 --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex.interfaces/-on-span-replacement-match/on-match.html @@ -0,0 +1,37 @@ + + + + onMatch + + + + +
+
+
+
+
+
+ +
+

onMatch

+
+
abstract fun onMatch(result: MatchResult)

Parameters

result

当前 @Regex 匹配到的结果

+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex.interfaces/index.html b/docs/api/-spannable-x/com.itxca.spannablex.interfaces/index.html new file mode 100644 index 0000000..3a5e8f2 --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex.interfaces/index.html @@ -0,0 +1,73 @@ + + + + com.itxca.spannablex.interfaces + + + + +
+
+
+
+
+
+ +
+

Package com.itxca.spannablex.interfaces

+
+
+
+
+

Types

+
+
+
+
+ + +
Link copied to clipboard
+
+
+
+
interface OnSpanClickListener
SimpleClickableSpan 点击回调 spanClickable
+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
interface OnSpanReplacementMatch
ReplaceRule 有匹配项时回调 详细说明: replaceSpan
+
+
+
+
+
+
+
+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex.span/-simple-clickable-config/-simple-clickable-config.html b/docs/api/-spannable-x/com.itxca.spannablex.span/-simple-clickable-config/-simple-clickable-config.html new file mode 100644 index 0000000..77010f5 --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex.span/-simple-clickable-config/-simple-clickable-config.html @@ -0,0 +1,37 @@ + + + + SimpleClickableConfig + + + + +
+
+
+
+
+
+ +
+

SimpleClickableConfig

+
+
fun SimpleClickableConfig(underline: Boolean? = null)
+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex.span/-simple-clickable-config/index.html b/docs/api/-spannable-x/com.itxca.spannablex.span/-simple-clickable-config/index.html new file mode 100644 index 0000000..1006278 --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex.span/-simple-clickable-config/index.html @@ -0,0 +1,59 @@ + + + + SimpleClickableConfig + + + + +
+
+
+
+
+
+ +
+

SimpleClickableConfig

+
data class SimpleClickableConfig(underline: Boolean?)
+
+
+
+
+

Properties

+
+
+
+
+ + +
Link copied to clipboard
+
+
+
+
val underline: Boolean? = null

下划线

+
+
+
+
+
+
+
+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex.span/-simple-clickable-config/underline.html b/docs/api/-spannable-x/com.itxca.spannablex.span/-simple-clickable-config/underline.html new file mode 100644 index 0000000..a11609a --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex.span/-simple-clickable-config/underline.html @@ -0,0 +1,37 @@ + + + + underline + + + + +
+
+
+
+
+
+ +
+

underline

+
+
val underline: Boolean? = null

下划线

+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex.span/-simple-clickable-span/-simple-clickable-span.html b/docs/api/-spannable-x/com.itxca.spannablex.span/-simple-clickable-span/-simple-clickable-span.html new file mode 100644 index 0000000..ad34a3f --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex.span/-simple-clickable-span/-simple-clickable-span.html @@ -0,0 +1,37 @@ + + + + SimpleClickableSpan + + + + +
+
+
+
+
+
+ +
+

SimpleClickableSpan

+
+
fun SimpleClickableSpan(colorString: String?, backgroundColorString: String?, typeStyle: Int? = null, config: SimpleClickableConfig? = null, onClick: OnSimpleClickListener? = null)
fun SimpleClickableSpan(@ColorInt color: Int? = null, @ColorInt backgroundColor: Int? = null, typeStyle: Int? = null, config: SimpleClickableConfig? = null, onClick: OnSimpleClickListener? = null)
+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex.span/-simple-clickable-span/index.html b/docs/api/-spannable-x/com.itxca.spannablex.span/-simple-clickable-span/index.html new file mode 100644 index 0000000..6605eec --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex.span/-simple-clickable-span/index.html @@ -0,0 +1,106 @@ + + + + SimpleClickableSpan + + + + +
+
+
+
+
+
+ +
+

SimpleClickableSpan

+
class SimpleClickableSpan(@ColorInt color: Int?, @ColorInt backgroundColor: Int?, typeStyle: Int?, config: SimpleClickableConfig?, onClick: OnSimpleClickListener?) : ClickableSpan
+
+
+
+
+

Constructors

+
+
+
+
+ + +
Link copied to clipboard
+
+
+
+
fun SimpleClickableSpan(colorString: String?, backgroundColorString: String?, typeStyle: Int? = null, config: SimpleClickableConfig? = null, onClick: OnSimpleClickListener? = null)
+
+
+
+
+
+

Functions

+
+
+
+
+ + +
Link copied to clipboard
+
+
+
+
open fun getUnderlying(): CharacterStyle
+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
open override fun onClick(widget: View)
+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
open override fun updateDrawState(ds: TextPaint)
+
+
+
+
+
+
+
+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex.span/-simple-clickable-span/on-click.html b/docs/api/-spannable-x/com.itxca.spannablex.span/-simple-clickable-span/on-click.html new file mode 100644 index 0000000..28b16fe --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex.span/-simple-clickable-span/on-click.html @@ -0,0 +1,37 @@ + + + + onClick + + + + +
+
+
+
+
+
+ +
+

onClick

+
+
open override fun onClick(widget: View)
+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex.span/-simple-clickable-span/update-draw-state.html b/docs/api/-spannable-x/com.itxca.spannablex.span/-simple-clickable-span/update-draw-state.html new file mode 100644 index 0000000..c42597c --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex.span/-simple-clickable-span/update-draw-state.html @@ -0,0 +1,37 @@ + + + + updateDrawState + + + + +
+
+
+
+
+
+ +
+

updateDrawState

+
+
open override fun updateDrawState(ds: TextPaint)
+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex.span/-size-image-span/-companion/index.html b/docs/api/-spannable-x/com.itxca.spannablex.span/-size-image-span/-companion/index.html new file mode 100644 index 0000000..f4d119a --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex.span/-size-image-span/-companion/index.html @@ -0,0 +1,41 @@ + + + + Companion + + + + +
+
+
+
+
+
+ +
+

Companion

+
object Companion
+
+
+
+
+
+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex.span/-size-image-span/-size-image-span.html b/docs/api/-spannable-x/com.itxca.spannablex.span/-size-image-span/-size-image-span.html new file mode 100644 index 0000000..5bfae61 --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex.span/-size-image-span/-size-image-span.html @@ -0,0 +1,37 @@ + + + + SizeImageSpan + + + + +
+
+
+
+
+
+ +
+

SizeImageSpan

+
+
fun SizeImageSpan(drawable: Drawable)
fun SizeImageSpan(drawable: Drawable, source: String)
fun SizeImageSpan(context: Context, uri: Uri)
fun SizeImageSpan(context: Context, resourceId: Int)
fun SizeImageSpan(context: Context, bitmap: Bitmap)
+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex.span/-size-image-span/clear-drawable-cache.html b/docs/api/-spannable-x/com.itxca.spannablex.span/-size-image-span/clear-drawable-cache.html new file mode 100644 index 0000000..b349299 --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex.span/-size-image-span/clear-drawable-cache.html @@ -0,0 +1,37 @@ + + + + clearDrawableCache + + + + +
+
+
+
+
+
+ +
+

clearDrawableCache

+
+
fun clearDrawableCache()

清理 drawableRef 缓存

+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex.span/-size-image-span/draw.html b/docs/api/-spannable-x/com.itxca.spannablex.span/-size-image-span/draw.html new file mode 100644 index 0000000..0cd690a --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex.span/-size-image-span/draw.html @@ -0,0 +1,37 @@ + + + + draw + + + + +
+
+
+
+
+
+ +
+

draw

+
+
open override fun draw(canvas: Canvas, text: CharSequence?, start: Int, end: Int, x: Float, top: Int, y: Int, bottom: Int, paint: Paint)
+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex.span/-size-image-span/drawable-height.html b/docs/api/-spannable-x/com.itxca.spannablex.span/-size-image-span/drawable-height.html new file mode 100644 index 0000000..562b477 --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex.span/-size-image-span/drawable-height.html @@ -0,0 +1,37 @@ + + + + drawableHeight + + + + +
+
+
+
+
+
+ +
+

drawableHeight

+
+
var drawableHeight: Int

See also

DRAWABLE_AUTO_SIZE 等于 Drawable.getIntrinsicHeight

+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex.span/-size-image-span/drawable-size.html b/docs/api/-spannable-x/com.itxca.spannablex.span/-size-image-span/drawable-size.html new file mode 100644 index 0000000..9dc8aaf --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex.span/-size-image-span/drawable-size.html @@ -0,0 +1,37 @@ + + + + drawableSize + + + + +
+
+
+
+
+
+ +
+

drawableSize

+
+
fun drawableSize(width: Int, height: Int = width): SizeImageSpan

设置图片大小

+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex.span/-size-image-span/drawable-width.html b/docs/api/-spannable-x/com.itxca.spannablex.span/-size-image-span/drawable-width.html new file mode 100644 index 0000000..e9ab88d --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex.span/-size-image-span/drawable-width.html @@ -0,0 +1,37 @@ + + + + drawableWidth + + + + +
+
+
+
+
+
+ +
+

drawableWidth

+
+
var drawableWidth: Int

See also

DRAWABLE_AUTO_SIZE 等于 Drawable.getIntrinsicWidth

+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex.span/-size-image-span/get-size.html b/docs/api/-spannable-x/com.itxca.spannablex.span/-size-image-span/get-size.html new file mode 100644 index 0000000..0be90a1 --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex.span/-size-image-span/get-size.html @@ -0,0 +1,37 @@ + + + + getSize + + + + +
+
+
+
+
+
+ +
+

getSize

+
+
open override fun getSize(paint: Paint, text: CharSequence?, start: Int, end: Int, fm: Paint.FontMetricsInt?): Int
+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex.span/-size-image-span/index.html b/docs/api/-spannable-x/com.itxca.spannablex.span/-size-image-span/index.html new file mode 100644 index 0000000..a621289 --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex.span/-size-image-span/index.html @@ -0,0 +1,365 @@ + + + + SizeImageSpan + + + + +
+
+
+
+
+
+ +
+

SizeImageSpan

+
class SizeImageSpan : ImageSpan

Clone modify : spannablespannable/src/main/java/com/drake/spannable/span/CenterImageSpan.kt

可设置图片大小的ImageSpan

+
+
+
+
+

Constructors

+
+
+
+
+ + +
Link copied to clipboard
+
+
+
+
fun SizeImageSpan(drawable: Drawable)
+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
fun SizeImageSpan(drawable: Drawable, source: String)
+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
fun SizeImageSpan(context: Context, uri: Uri)
+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
fun SizeImageSpan(context: Context, resourceId: Int)
+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
fun SizeImageSpan(context: Context, bitmap: Bitmap)
+
+
+
+
+
+

Types

+
+
+
+
+ + +
Link copied to clipboard
+
+
+
+
object Companion
+
+
+
+
+
+

Functions

+
+
+
+
+ + +
Link copied to clipboard
+
+
+
+
fun clearDrawableCache()

清理 drawableRef 缓存

+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
open override fun draw(canvas: Canvas, text: CharSequence?, start: Int, end: Int, x: Float, top: Int, y: Int, bottom: Int, paint: Paint)
+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
fun drawableSize(width: Int, height: Int = width): SizeImageSpan

设置图片大小

+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
open fun getContentDescription(): CharSequence?
+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
open override fun getDrawable(): Drawable
+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
open override fun getSize(paint: Paint, text: CharSequence?, start: Int, end: Int, fm: Paint.FontMetricsInt?): Int
+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
open fun getSource(): String?
+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
open override fun getUnderlying(): MetricAffectingSpan
+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
open fun getVerticalAlignment(): Int
+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
open fun setContentDescription(p0: CharSequence?)
+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
open override fun updateDrawState(p0: TextPaint)
+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
open override fun updateMeasureState(p0: TextPaint)
+
+
+
+
+
+

Properties

+
+
+
+
+ + +
Link copied to clipboard
+
+
+
+
var drawableHeight: Int
+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
var drawableWidth: Int
+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
val mVerticalAlignment: Int
+
+
+
+
+
+
+
+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex.span/index.html b/docs/api/-spannable-x/com.itxca.spannablex.span/index.html new file mode 100644 index 0000000..235b158 --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex.span/index.html @@ -0,0 +1,103 @@ + + + + com.itxca.spannablex.span + + + + +
+
+
+
+
+
+ +
+

Package com.itxca.spannablex.span

+
+
+
+
+

Types

+
+
+
+
+ + +
Link copied to clipboard
+
+
+
+
typealias OnSimpleClickListener = (widget: View) -> Unit
+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
data class SimpleClickableConfig(underline: Boolean?)
+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
class SimpleClickableSpan(@ColorInt color: Int?, @ColorInt backgroundColor: Int?, typeStyle: Int?, config: SimpleClickableConfig?, onClick: OnSimpleClickListener?) : ClickableSpan
+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
class SizeImageSpan : ImageSpan

Clone modify : spannablespannable/src/main/java/com/drake/spannable/span/CenterImageSpan.kt

+
+
+
+
+
+
+
+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex.utils/-drawable-size/-drawable-size.html b/docs/api/-spannable-x/com.itxca.spannablex.utils/-drawable-size/-drawable-size.html new file mode 100644 index 0000000..eb3abc0 --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex.utils/-drawable-size/-drawable-size.html @@ -0,0 +1,37 @@ + + + + DrawableSize + + + + +
+
+
+
+
+
+ +
+

DrawableSize

+
+
fun DrawableSize(@IntRange(from = 0) width: Int, @IntRange(from = 0) height: Int = width)
+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex.utils/-drawable-size/height.html b/docs/api/-spannable-x/com.itxca.spannablex.utils/-drawable-size/height.html new file mode 100644 index 0000000..0a1fca3 --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex.utils/-drawable-size/height.html @@ -0,0 +1,37 @@ + + + + height + + + + +
+
+
+
+
+
+ +
+

height

+
+
val height: Int
+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex.utils/-drawable-size/index.html b/docs/api/-spannable-x/com.itxca.spannablex.utils/-drawable-size/index.html new file mode 100644 index 0000000..0ffa5ff --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex.utils/-drawable-size/index.html @@ -0,0 +1,91 @@ + + + + DrawableSize + + + + +
+
+
+
+
+
+ +
+

DrawableSize

+
data class DrawableSize(@IntRange(from = 0) width: Int, @IntRange(from = 0) height: Int)

SizeImageSpan 的大小配置辅助类

+
+
+
+
+

Constructors

+
+
+
+
+ + +
Link copied to clipboard
+
+
+
+
fun DrawableSize(@IntRange(from = 0) width: Int, @IntRange(from = 0) height: Int = width)
+
+
+
+
+
+

Properties

+
+
+
+
+ + +
Link copied to clipboard
+
+
+
+
val height: Int
+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
val width: Int
+
+
+
+
+
+
+
+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex.utils/-drawable-size/width.html b/docs/api/-spannable-x/com.itxca.spannablex.utils/-drawable-size/width.html new file mode 100644 index 0000000..d2f3e17 --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex.utils/-drawable-size/width.html @@ -0,0 +1,37 @@ + + + + width + + + + +
+
+
+
+
+
+ +
+

width

+
+
val width: Int
+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex.utils/color.html b/docs/api/-spannable-x/com.itxca.spannablex.utils/color.html new file mode 100644 index 0000000..d16e254 --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex.utils/color.html @@ -0,0 +1,37 @@ + + + + color + + + + +
+
+
+
+
+
+ +
+

color

+
+
val String.color: Int

ColorString 2 ColorInt error default is Color.RED

+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex.utils/config-text-view-size.html b/docs/api/-spannable-x/com.itxca.spannablex.utils/config-text-view-size.html new file mode 100644 index 0000000..af672cb --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex.utils/config-text-view-size.html @@ -0,0 +1,37 @@ + + + + configTextViewSize + + + + +
+
+
+
+
+
+ +
+

configTextViewSize

+
+
fun <T : TextView> Drawable.configTextViewSize(view: T?): Drawable

设置Drawable 大小为TextView 的字体大小

Parameters

view

参考文字大小的textSize view

+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex.utils/dp.html b/docs/api/-spannable-x/com.itxca.spannablex.utils/dp.html new file mode 100644 index 0000000..e980f09 --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex.utils/dp.html @@ -0,0 +1,37 @@ + + + + dp + + + + +
+
+
+
+
+
+ +
+

dp

+
+
val Int.dp: Int

Receiver

to dp

+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex.utils/drawable-size.html b/docs/api/-spannable-x/com.itxca.spannablex.utils/drawable-size.html new file mode 100644 index 0000000..ca575de --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex.utils/drawable-size.html @@ -0,0 +1,37 @@ + + + + drawableSize + + + + +
+
+
+
+
+
+ +
+

drawableSize

+
+
fun Drawable.drawableSize(width: Int, height: Int = width): Drawable

设置Drawable 大小


val Int.drawableSize: DrawableSize

快速构建 DrawableSize

+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex.utils/index.html b/docs/api/-spannable-x/com.itxca.spannablex.utils/index.html new file mode 100644 index 0000000..0cc13df --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex.utils/index.html @@ -0,0 +1,167 @@ + + + + com.itxca.spannablex.utils + + + + +
+
+
+
+
+
+ +
+

Package com.itxca.spannablex.utils

+
+
+
+
+

Types

+
+
+
+
+ + +
Link copied to clipboard
+
+
+
+
data class DrawableSize(@IntRange(from = 0) width: Int, @IntRange(from = 0) height: Int)

SizeImageSpan 的大小配置辅助类

+
+
+
+
+
+

Functions

+
+
+
+
+ + +
Link copied to clipboard
+
+
+
+
fun <T : TextView> Drawable.configTextViewSize(view: T?): Drawable

设置Drawable 大小为TextView 的字体大小

+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
fun Drawable.drawableSize(width: Int, height: Int = width): Drawable

设置Drawable 大小

+
+
+
+
+
+

Properties

+
+
+
+
+ + +
Link copied to clipboard
+
+
+
+
val String.color: Int

ColorString 2 ColorInt error default is Color.RED

+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
val Int.dp: Int
+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
val Int.drawableSize: DrawableSize

快速构建 DrawableSize

+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
val Int.sp: Int
+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
val TextView.textSizeInt: Int

获取Int型TextView.getTextSize

+
+
+
+
+
+
+
+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex.utils/sp.html b/docs/api/-spannable-x/com.itxca.spannablex.utils/sp.html new file mode 100644 index 0000000..5efe8c1 --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex.utils/sp.html @@ -0,0 +1,37 @@ + + + + sp + + + + +
+
+
+
+
+
+ +
+

sp

+
+
val Int.sp: Int

Receiver

to sp

+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex.utils/text-size-int.html b/docs/api/-spannable-x/com.itxca.spannablex.utils/text-size-int.html new file mode 100644 index 0000000..8f95508 --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex.utils/text-size-int.html @@ -0,0 +1,37 @@ + + + + textSizeInt + + + + +
+
+
+
+
+
+ +
+

textSizeInt

+
+
val TextView.textSizeInt: Int

获取Int型TextView.getTextSize

+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-replace-rule/-replace-rule.html b/docs/api/-spannable-x/com.itxca.spannablex/-replace-rule/-replace-rule.html new file mode 100644 index 0000000..1075a0d --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-replace-rule/-replace-rule.html @@ -0,0 +1,37 @@ + + + + ReplaceRule + + + + +
+
+
+
+
+
+ +
+

ReplaceRule

+
+
fun ReplaceRule(replaceString: String, isRegex: Boolean, matchRange: IntRange?, newString: CharSequence?, replacementMatch: OnSpanReplacementMatch?)
+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-replace-rule/index.html b/docs/api/-spannable-x/com.itxca.spannablex/-replace-rule/index.html new file mode 100644 index 0000000..54bcdc7 --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-replace-rule/index.html @@ -0,0 +1,136 @@ + + + + ReplaceRule + + + + +
+
+
+
+
+
+ +
+

ReplaceRule

+
data class ReplaceRule(replaceString: String, isRegex: Boolean, matchRange: IntRange?, newString: CharSequence?, replacementMatch: OnSpanReplacementMatch?)

替换规则

+
+
+
+
+

Constructors

+
+
+
+
+ + +
Link copied to clipboard
+
+
+
+
fun ReplaceRule(replaceString: String, isRegex: Boolean, matchRange: IntRange?, newString: CharSequence?, replacementMatch: OnSpanReplacementMatch?)
+
+
+
+
+
+

Properties

+
+
+
+
+ + +
Link copied to clipboard
+
+
+
+
val isRegex: Boolean

replaceString是否为正则

+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
val matchRange: IntRange?

匹配范围

+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
val newString: CharSequence?

替换文本(null 为不替换)

+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
val replacementMatch: OnSpanReplacementMatch?

匹配时回调

+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
val replaceString: String

查找的字符串或正则文本

+
+
+
+
+
+
+
+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-replace-rule/is-regex.html b/docs/api/-spannable-x/com.itxca.spannablex/-replace-rule/is-regex.html new file mode 100644 index 0000000..2cf71b8 --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-replace-rule/is-regex.html @@ -0,0 +1,37 @@ + + + + isRegex + + + + +
+
+
+
+
+
+ +
+

isRegex

+
+
val isRegex: Boolean

replaceString是否为正则

+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-replace-rule/match-range.html b/docs/api/-spannable-x/com.itxca.spannablex/-replace-rule/match-range.html new file mode 100644 index 0000000..a04ea9c --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-replace-rule/match-range.html @@ -0,0 +1,37 @@ + + + + matchRange + + + + +
+
+
+
+
+
+ +
+

matchRange

+
+
val matchRange: IntRange?

匹配范围

+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-replace-rule/new-string.html b/docs/api/-spannable-x/com.itxca.spannablex/-replace-rule/new-string.html new file mode 100644 index 0000000..4ef55bc --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-replace-rule/new-string.html @@ -0,0 +1,37 @@ + + + + newString + + + + +
+
+
+
+
+
+ +
+

newString

+
+
val newString: CharSequence?

替换文本(null 为不替换)

+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-replace-rule/replace-string.html b/docs/api/-spannable-x/com.itxca.spannablex/-replace-rule/replace-string.html new file mode 100644 index 0000000..b56bfe9 --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-replace-rule/replace-string.html @@ -0,0 +1,37 @@ + + + + replaceString + + + + +
+
+
+
+
+
+ +
+

replaceString

+
+
val replaceString: String

查找的字符串或正则文本

+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-replace-rule/replacement-match.html b/docs/api/-spannable-x/com.itxca.spannablex/-replace-rule/replacement-match.html new file mode 100644 index 0000000..1ede6e1 --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-replace-rule/replacement-match.html @@ -0,0 +1,37 @@ + + + + replacementMatch + + + + +
+
+
+
+
+
+ +
+

replacementMatch

+
+
val replacementMatch: OnSpanReplacementMatch?

匹配时回调

+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/-companion/create.html b/docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/-companion/create.html new file mode 100644 index 0000000..0126635 --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/-companion/create.html @@ -0,0 +1,37 @@ + + + + create + + + + +
+
+
+
+
+
+ +
+

create

+
+
fun create(text: CharSequence?, replaceRule: Any?): SpanDsl

See also

+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/-companion/index.html b/docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/-companion/index.html new file mode 100644 index 0000000..55eb8a3 --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/-companion/index.html @@ -0,0 +1,59 @@ + + + + Companion + + + + +
+
+
+
+
+
+ +
+

Companion

+
object Companion
+
+
+
+
+

Functions

+
+
+
+
+ + +
Link copied to clipboard
+
+
+
+
fun create(text: CharSequence?, replaceRule: Any?): SpanDsl
+
+
+
+
+
+
+
+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/absolute-size.html b/docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/absolute-size.html new file mode 100644 index 0000000..c7f92ce --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/absolute-size.html @@ -0,0 +1,37 @@ + + + + absoluteSize + + + + +
+
+
+
+
+
+ +
+

absoluteSize

+
+
fun Any?.absoluteSize(size: Int, dip: Boolean = true, replaceRule: Any? = null)

AbsoluteSizeSpan 文本绝对大小

See also

CharSequence.spanAbsoluteSize

Parameters

replaceRule

ReplaceRule 替换规则

+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/background.html b/docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/background.html new file mode 100644 index 0000000..6723bfb --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/background.html @@ -0,0 +1,37 @@ + + + + background + + + + +
+
+
+
+
+
+ +
+

background

+
+
fun Any?.background(colorString: String, replaceRule: Any? = null)
fun Any?.background(@ColorInt color: Int, replaceRule: Any? = null)

BackgroundColorSpan 背景颜色

See also

CharSequence.spanBackground

Parameters

replaceRule

ReplaceRule 替换规则

+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/blur-mask.html b/docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/blur-mask.html new file mode 100644 index 0000000..bdd8278 --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/blur-mask.html @@ -0,0 +1,37 @@ + + + + blurMask + + + + +
+
+
+
+
+
+ +
+

blurMask

+
+
fun Any?.blurMask(@FloatRange(from = 0.0) radius: Float, style: BlurMaskFilter.Blur = BlurMaskFilter.Blur.NORMAL, replaceRule: Any? = null)

BlurMaskFilter 文本模糊滤镜蒙版效果

See also

CharSequence.spanBlurMask

Parameters

replaceRule

ReplaceRule 替换规则

+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/clickable.html b/docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/clickable.html new file mode 100644 index 0000000..5eaa928 --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/clickable.html @@ -0,0 +1,37 @@ + + + + clickable + + + + +
+
+
+
+
+
+ +
+

clickable

+
+
fun Any?.clickable(@ColorInt color: Int? = null, @ColorInt backgroundColor: Int? = null, typeStyle: Int? = null, config: SimpleClickableConfig? = null, replaceRule: Any? = null, onClick: OnSpanClickListener? = null)

SimpleClickableSpan 可点击文本

See also

CharSequence.spanClickable

Parameters

replaceRule

ReplaceRule 替换规则

+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/color.html b/docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/color.html new file mode 100644 index 0000000..13cd47f --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/color.html @@ -0,0 +1,37 @@ + + + + color + + + + +
+
+
+
+
+
+ +
+

color

+
+
fun Any?.color(colorString: String, replaceRule: Any? = null)
fun Any?.color(@ColorInt color: Int, replaceRule: Any? = null)

ForegroundColorSpan 文本颜色

See also

CharSequence.spanColor

Parameters

replaceRule

ReplaceRule 替换规则

+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/image.html b/docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/image.html new file mode 100644 index 0000000..5082a0a --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/image.html @@ -0,0 +1,37 @@ + + + + image + + + + +
+
+
+
+
+
+ +
+

image

+
+
fun Any?.image(drawable: Drawable, source: String? = null, useTextViewSize: TextView? = null, size: DrawableSize? = null, replaceRule: Any? = null)
fun Any?.image(context: Context, uri: Uri, useTextViewSize: TextView? = null, size: DrawableSize? = null, replaceRule: Any? = null)
fun Any?.image(context: Context, @DrawableRes resourceId: Int, useTextViewSize: TextView? = null, size: DrawableSize? = null, replaceRule: Any? = null)
fun Any?.image(context: Context, bitmap: Bitmap, useTextViewSize: TextView? = null, size: DrawableSize? = null, replaceRule: Any? = null)

SizeImageSpan 图片

See also

Parameters

replaceRule

ReplaceRule 替换规则

+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/index.html b/docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/index.html new file mode 100644 index 0000000..8182c11 --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/index.html @@ -0,0 +1,393 @@ + + + + SpanDsl + + + + +
+
+
+
+
+
+ +
+

SpanDsl

+
class SpanDsl

DSL Spannable

sample: ```kotlin TextView.text = spannable { "this is real text.".text() "spannable".color(Color.BLUE).style(Typeface.BOLD) }

+
+
+
+
+

Types

+
+
+
+
+ + +
Link copied to clipboard
+
+
+
+
object Companion
+
+
+
+
+
+

Functions

+
+
+
+
+ + +
Link copied to clipboard
+
+
+
+
fun Any?.absoluteSize(size: Int, dip: Boolean = true, replaceRule: Any? = null)

AbsoluteSizeSpan 文本绝对大小

+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
fun Any?.background(@ColorInt color: Int, replaceRule: Any? = null)
fun Any?.background(colorString: String, replaceRule: Any? = null)

BackgroundColorSpan 背景颜色

+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
fun Any?.blurMask(@FloatRange(from = 0.0) radius: Float, style: BlurMaskFilter.Blur = BlurMaskFilter.Blur.NORMAL, replaceRule: Any? = null)

BlurMaskFilter 文本模糊滤镜蒙版效果

+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
fun Any?.clickable(@ColorInt color: Int? = null, @ColorInt backgroundColor: Int? = null, typeStyle: Int? = null, config: SimpleClickableConfig? = null, replaceRule: Any? = null, onClick: OnSpanClickListener? = null)

SimpleClickableSpan 可点击文本

+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
fun Any?.color(@ColorInt color: Int, replaceRule: Any? = null)
fun Any?.color(colorString: String, replaceRule: Any? = null)

ForegroundColorSpan 文本颜色

+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
fun Any?.image(context: Context, bitmap: Bitmap, useTextViewSize: TextView? = null, size: DrawableSize? = null, replaceRule: Any? = null)
fun Any?.image(context: Context, uri: Uri, useTextViewSize: TextView? = null, size: DrawableSize? = null, replaceRule: Any? = null)
fun Any?.image(context: Context, @DrawableRes resourceId: Int, useTextViewSize: TextView? = null, size: DrawableSize? = null, replaceRule: Any? = null)
fun Any?.image(drawable: Drawable, source: String? = null, useTextViewSize: TextView? = null, size: DrawableSize? = null, replaceRule: Any? = null)
+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
fun Any?.maskFilter(filter: MaskFilter, replaceRule: Any? = null)

MaskFilterSpan 文本蒙版效果

+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
fun <T> T?.newline(@IntRange(from = 1) lines: Int = 1): CharSequence?

换行(可自行处理\n)

+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
fun Any?.relativeSize(@FloatRange(from = 0.0) proportion: Float, replaceRule: Any? = null)

RelativeSizeSpan 文本相对大小

+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
fun Any?.scaleX(@FloatRange(from = 0.0) proportion: Float, replaceRule: Any? = null)

ScaleXSpan X轴文本缩放

+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
fun CharSequence?.span(replaceRule: Any? = null, span: SpanDsl.() -> Unit = {})

为 @receiver 设置多个Span

+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
fun Any?.strikethrough(replaceRule: Any? = null)

StrikethroughSpan 删除线

+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
fun Any?.style(style: Int, replaceRule: Any? = null)

StyleSpan 设置文本样式

+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
fun Any?.subscript(replaceRule: Any? = null)

SubscriptSpan 文本下标

+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
fun Any?.suggestion(context: Context, suggestions: Array<String>, flags: Int = SuggestionSpan.SUGGESTIONS_MAX_SIZE, locale: Locale? = null, notificationTargetClass: Class<*>? = null, replaceRule: Any? = null)

SuggestionSpan 文本输入提示

+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
fun Any?.superscript(replaceRule: Any? = null)

SuperscriptSpan 文本上标

+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
fun CharSequence?.text()

添加文本(无Spannable效果)

+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
fun Any?.textAppearance(style: Int = Typeface.NORMAL, size: Int = -1, @ColorInt color: Int? = null, family: String? = null, linkColor: ColorStateList? = null, replaceRule: Any? = null)

TextAppearanceSpan 设置字体效果

+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
fun Any?.typeface(typeface: Typeface? = null, family: String? = null, replaceRule: Any? = null)

TypefaceSpan 设置字体样式

+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
fun Any?.underline(replaceRule: Any? = null)

UnderlineSpan 下划线

+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
fun Any?.url(url: String, replaceRule: Any? = null)

URLSpan 超链接

+
+
+
+
+
+

Properties

+
+
+
+
+ + +
Link copied to clipboard
+
+
+
+
var textSpannable: Spanned?

text SpannedString

+
+
+
+
+
+
+
+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/mask-filter.html b/docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/mask-filter.html new file mode 100644 index 0000000..c150d47 --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/mask-filter.html @@ -0,0 +1,37 @@ + + + + maskFilter + + + + +
+
+
+
+
+
+ +
+

maskFilter

+
+
fun Any?.maskFilter(filter: MaskFilter, replaceRule: Any? = null)

MaskFilterSpan 文本蒙版效果

See also

CharSequence.spanMaskFilter

Parameters

replaceRule

ReplaceRule 替换规则

+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/newline.html b/docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/newline.html new file mode 100644 index 0000000..98d1138 --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/newline.html @@ -0,0 +1,37 @@ + + + + newline + + + + +
+
+
+
+
+
+ +
+

newline

+
+
fun <T> T?.newline(@IntRange(from = 1) lines: Int = 1): CharSequence?

换行(可自行处理\n)

+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/relative-size.html b/docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/relative-size.html new file mode 100644 index 0000000..9217f31 --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/relative-size.html @@ -0,0 +1,37 @@ + + + + relativeSize + + + + +
+
+
+
+
+
+ +
+

relativeSize

+
+
fun Any?.relativeSize(@FloatRange(from = 0.0) proportion: Float, replaceRule: Any? = null)

RelativeSizeSpan 文本相对大小

See also

CharSequence.spanRelativeSize

Parameters

replaceRule

ReplaceRule 替换规则

+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/scale-x.html b/docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/scale-x.html new file mode 100644 index 0000000..0682989 --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/scale-x.html @@ -0,0 +1,37 @@ + + + + scaleX + + + + +
+
+
+
+
+
+ +
+

scaleX

+
+
fun Any?.scaleX(@FloatRange(from = 0.0) proportion: Float, replaceRule: Any? = null)

ScaleXSpan X轴文本缩放

See also

CharSequence.spanScaleX

Parameters

replaceRule

ReplaceRule 替换规则

+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/span.html b/docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/span.html new file mode 100644 index 0000000..4e348d6 --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/span.html @@ -0,0 +1,37 @@ + + + + span + + + + +
+
+
+
+
+
+ +
+

span

+
+
fun CharSequence?.span(replaceRule: Any? = null, span: SpanDsl.() -> Unit = {})

为 @receiver 设置多个Span

+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/strikethrough.html b/docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/strikethrough.html new file mode 100644 index 0000000..81b58f0 --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/strikethrough.html @@ -0,0 +1,37 @@ + + + + strikethrough + + + + +
+
+
+
+
+
+ +
+

strikethrough

+
+
fun Any?.strikethrough(replaceRule: Any? = null)

StrikethroughSpan 删除线

See also

CharSequence.spanStrikethrough

Parameters

replaceRule

ReplaceRule 替换规则

+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/style.html b/docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/style.html new file mode 100644 index 0000000..cbabb1b --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/style.html @@ -0,0 +1,37 @@ + + + + style + + + + +
+
+
+
+
+
+ +
+

style

+
+
fun Any?.style(style: Int, replaceRule: Any? = null)

StyleSpan 设置文本样式

See also

CharSequence.spanStyle

Parameters

replaceRule

ReplaceRule 替换规则

+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/subscript.html b/docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/subscript.html new file mode 100644 index 0000000..8fe627b --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/subscript.html @@ -0,0 +1,37 @@ + + + + subscript + + + + +
+
+
+
+
+
+ +
+

subscript

+
+
fun Any?.subscript(replaceRule: Any? = null)

SubscriptSpan 文本下标

See also

CharSequence.spanSubscript

Parameters

replaceRule

ReplaceRule 替换规则

+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/suggestion.html b/docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/suggestion.html new file mode 100644 index 0000000..e353d03 --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/suggestion.html @@ -0,0 +1,37 @@ + + + + suggestion + + + + +
+
+
+
+
+
+ +
+

suggestion

+
+
fun Any?.suggestion(context: Context, suggestions: Array<String>, flags: Int = SuggestionSpan.SUGGESTIONS_MAX_SIZE, locale: Locale? = null, notificationTargetClass: Class<*>? = null, replaceRule: Any? = null)

SuggestionSpan 文本输入提示

See also

CharSequence.spanSuggestion

Parameters

replaceRule

ReplaceRule 替换规则

+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/superscript.html b/docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/superscript.html new file mode 100644 index 0000000..ced6740 --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/superscript.html @@ -0,0 +1,37 @@ + + + + superscript + + + + +
+
+
+
+
+
+ +
+

superscript

+
+
fun Any?.superscript(replaceRule: Any? = null)

SuperscriptSpan 文本上标

See also

CharSequence.spanSuperscript

Parameters

replaceRule

ReplaceRule 替换规则

+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/text-appearance.html b/docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/text-appearance.html new file mode 100644 index 0000000..3b15573 --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/text-appearance.html @@ -0,0 +1,37 @@ + + + + textAppearance + + + + +
+
+
+
+
+
+ +
+

textAppearance

+
+
fun Any?.textAppearance(style: Int = Typeface.NORMAL, size: Int = -1, @ColorInt color: Int? = null, family: String? = null, linkColor: ColorStateList? = null, replaceRule: Any? = null)

TextAppearanceSpan 设置字体效果

See also

CharSequence.spanTextAppearance

Parameters

replaceRule

ReplaceRule 替换规则

+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/text-spannable.html b/docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/text-spannable.html new file mode 100644 index 0000000..db438d4 --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/text-spannable.html @@ -0,0 +1,37 @@ + + + + textSpannable + + + + +
+
+
+
+
+
+ +
+

textSpannable

+
+
var textSpannable: Spanned?

text SpannedString

+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/text.html b/docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/text.html new file mode 100644 index 0000000..0da3bdf --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/text.html @@ -0,0 +1,37 @@ + + + + text + + + + +
+
+
+
+
+
+ +
+

text

+
+
fun CharSequence?.text()

添加文本(无Spannable效果)

+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/typeface.html b/docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/typeface.html new file mode 100644 index 0000000..b17361d --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/typeface.html @@ -0,0 +1,37 @@ + + + + typeface + + + + +
+
+
+
+
+
+ +
+

typeface

+
+
fun Any?.typeface(typeface: Typeface? = null, family: String? = null, replaceRule: Any? = null)

TypefaceSpan 设置字体样式

See also

CharSequence.spanTypeface

Parameters

replaceRule

ReplaceRule 替换规则

+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/underline.html b/docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/underline.html new file mode 100644 index 0000000..db59fbc --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/underline.html @@ -0,0 +1,37 @@ + + + + underline + + + + +
+
+
+
+
+
+ +
+

underline

+
+
fun Any?.underline(replaceRule: Any? = null)

UnderlineSpan 下划线

See also

CharSequence.spanUnderline

Parameters

replaceRule

ReplaceRule 替换规则

+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/url.html b/docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/url.html new file mode 100644 index 0000000..05350fa --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-span-dsl/url.html @@ -0,0 +1,37 @@ + + + + url + + + + +
+
+
+
+
+
+ +
+

url

+
+
fun Any?.url(url: String, replaceRule: Any? = null)

URLSpan 超链接

See also

CharSequence.spanURL

Parameters

replaceRule

ReplaceRule 替换规则

+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-span/-companion/activate-click.html b/docs/api/-spannable-x/com.itxca.spannablex/-span/-companion/activate-click.html new file mode 100644 index 0000000..19bb911 --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-span/-companion/activate-click.html @@ -0,0 +1,37 @@ + + + + activateClick + + + + +
+
+
+
+
+
+ +
+

activateClick

+
+
@JvmStatic
@JvmOverloads
fun activateClick(textView: TextView, background: Boolean = true): TextView

兼容Java 适配

See also

+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-span/-companion/create.html b/docs/api/-spannable-x/com.itxca.spannablex/-span/-companion/create.html new file mode 100644 index 0000000..f94e44c --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-span/-companion/create.html @@ -0,0 +1,37 @@ + + + + create + + + + +
+
+
+
+
+
+ +
+

create

+
+
@JvmStatic
fun create(): Span

构建Span

See also

+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-span/-companion/dp.html b/docs/api/-spannable-x/com.itxca.spannablex/-span/-companion/dp.html new file mode 100644 index 0000000..c7ba62a --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-span/-companion/dp.html @@ -0,0 +1,37 @@ + + + + dp + + + + +
+
+
+
+
+
+ +
+

dp

+
+
@JvmStatic
fun dp(value: Int): Int
+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-span/-companion/drawable-size.html b/docs/api/-spannable-x/com.itxca.spannablex/-span/-companion/drawable-size.html new file mode 100644 index 0000000..68f8641 --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-span/-companion/drawable-size.html @@ -0,0 +1,37 @@ + + + + drawableSize + + + + +
+
+
+
+
+
+ +
+

drawableSize

+
+
@JvmStatic
@JvmOverloads
fun drawableSize(size: Int, unit: Int = ConversionUnit.NOT_CONVERT): DrawableSize
+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-span/-companion/index.html b/docs/api/-spannable-x/com.itxca.spannablex/-span/-companion/index.html new file mode 100644 index 0000000..ef49f28 --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-span/-companion/index.html @@ -0,0 +1,179 @@ + + + + Companion + + + + +
+
+
+
+
+
+ +
+

Companion

+
object Companion
+
+
+
+
+

Functions

+
+
+
+
+ + +
Link copied to clipboard
+
+
+
+
@JvmStatic
@JvmOverloads
fun activateClick(textView: TextView, background: Boolean = true): TextView

兼容Java 适配

+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
@JvmStatic
fun create(): Span

构建Span

+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
@JvmStatic
fun dp(value: Int): Int
+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
@JvmStatic
@JvmOverloads
fun drawableSize(size: Int, unit: Int = ConversionUnit.NOT_CONVERT): DrawableSize
+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
@JvmStatic
fun removeAllSpans(span: Spannable)
+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
@JvmStatic
fun removeSpans(text: CharSequence, type: Class<*>): CharSequence
+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
@JvmStatic
fun sp(value: Int): Int
+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
@JvmStatic
fun spannedString(vararg texts: CharSequence): SpannedString

适配Java不支持CharSequence operator plus eg. SpanExtension.spannedString(spanImage(...),spanColor(..))

+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
@JvmStatic
@JvmOverloads
fun toReplaceRule(replaceString: String, isRegex: Boolean = false, matchIndex: Int? = null, matchRange: IntRange? = null, newString: CharSequence? = null, replacementMatch: OnSpanReplacementMatch? = null): ReplaceRule

兼容Java 适配

+
+
+
+
+
+
+
+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-span/-companion/remove-all-spans.html b/docs/api/-spannable-x/com.itxca.spannablex/-span/-companion/remove-all-spans.html new file mode 100644 index 0000000..7909365 --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-span/-companion/remove-all-spans.html @@ -0,0 +1,37 @@ + + + + removeAllSpans + + + + +
+
+
+
+
+
+ +
+

removeAllSpans

+
+
@JvmStatic
fun removeAllSpans(span: Spannable)
+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-span/-companion/remove-spans.html b/docs/api/-spannable-x/com.itxca.spannablex/-span/-companion/remove-spans.html new file mode 100644 index 0000000..2ffe48a --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-span/-companion/remove-spans.html @@ -0,0 +1,37 @@ + + + + removeSpans + + + + +
+
+
+
+
+
+ +
+

removeSpans

+
+
@JvmStatic
fun removeSpans(text: CharSequence, type: Class<*>): CharSequence
+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-span/-companion/sp.html b/docs/api/-spannable-x/com.itxca.spannablex/-span/-companion/sp.html new file mode 100644 index 0000000..8180003 --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-span/-companion/sp.html @@ -0,0 +1,37 @@ + + + + sp + + + + +
+
+
+
+
+
+ +
+

sp

+
+
@JvmStatic
fun sp(value: Int): Int
+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-span/-companion/spanned-string.html b/docs/api/-spannable-x/com.itxca.spannablex/-span/-companion/spanned-string.html new file mode 100644 index 0000000..fb8b963 --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-span/-companion/spanned-string.html @@ -0,0 +1,37 @@ + + + + spannedString + + + + +
+
+
+
+
+
+ +
+

spannedString

+
+
@JvmStatic
fun spannedString(vararg texts: CharSequence): SpannedString

适配Java不支持CharSequence operator plus eg. SpanExtension.spannedString(spanImage(...),spanColor(..))

+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-span/-companion/to-replace-rule.html b/docs/api/-spannable-x/com.itxca.spannablex/-span/-companion/to-replace-rule.html new file mode 100644 index 0000000..347d165 --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-span/-companion/to-replace-rule.html @@ -0,0 +1,37 @@ + + + + toReplaceRule + + + + +
+
+
+
+
+
+ +
+

toReplaceRule

+
+
@JvmStatic
@JvmOverloads
fun toReplaceRule(replaceString: String, isRegex: Boolean = false, matchIndex: Int? = null, matchRange: IntRange? = null, newString: CharSequence? = null, replacementMatch: OnSpanReplacementMatch? = null): ReplaceRule

兼容Java 适配

See also

+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-span/absolute-size.html b/docs/api/-spannable-x/com.itxca.spannablex/-span/absolute-size.html new file mode 100644 index 0000000..8cee846 --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-span/absolute-size.html @@ -0,0 +1,37 @@ + + + + absoluteSize + + + + +
+
+
+
+
+
+ +
+

absoluteSize

+
+
@JvmOverloads
fun absoluteSize(size: Int, dip: Boolean = true, replaceRule: Any? = null): Span

See also

CharSequence.spanAbsoluteSize
+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-span/background.html b/docs/api/-spannable-x/com.itxca.spannablex/-span/background.html new file mode 100644 index 0000000..0b3429f --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-span/background.html @@ -0,0 +1,37 @@ + + + + background + + + + +
+
+
+
+
+
+ +
+

background

+
+
@JvmOverloads
fun background(colorString: String, replaceRule: Any? = null): Span
@JvmOverloads
fun background(@ColorInt color: Int, replaceRule: Any? = null): Span

See also

CharSequence.spanBackground
+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-span/blur-mask.html b/docs/api/-spannable-x/com.itxca.spannablex/-span/blur-mask.html new file mode 100644 index 0000000..86da5a6 --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-span/blur-mask.html @@ -0,0 +1,37 @@ + + + + blurMask + + + + +
+
+
+
+
+
+ +
+

blurMask

+
+
@JvmOverloads
fun blurMask(@FloatRange(from = 0.0) radius: Float, style: BlurMaskFilter.Blur? = null, replaceRule: Any? = null): Span

See also

CharSequence.spanBlurMask
+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-span/clickable.html b/docs/api/-spannable-x/com.itxca.spannablex/-span/clickable.html new file mode 100644 index 0000000..e982f70 --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-span/clickable.html @@ -0,0 +1,37 @@ + + + + clickable + + + + +
+
+
+
+
+
+ +
+

clickable

+
+
@JvmOverloads
fun clickable(@ColorInt color: Int? = null, @ColorInt backgroundColor: Int? = null, typeStyle: Int? = null, config: SimpleClickableConfig? = null, replaceRule: Any? = null, onClick: OnSpanClickListener? = null): Span

See also

CharSequence.spanClickable
+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-span/color.html b/docs/api/-spannable-x/com.itxca.spannablex/-span/color.html new file mode 100644 index 0000000..e3e7ffd --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-span/color.html @@ -0,0 +1,37 @@ + + + + color + + + + +
+
+
+
+
+
+ +
+

color

+
+
@JvmOverloads
fun color(colorString: String, replaceRule: Any? = null): Span
@JvmOverloads
fun color(@ColorInt color: Int, replaceRule: Any? = null): Span

See also

CharSequence.spanColor
+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-span/image.html b/docs/api/-spannable-x/com.itxca.spannablex/-span/image.html new file mode 100644 index 0000000..47f0ff6 --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-span/image.html @@ -0,0 +1,37 @@ + + + + image + + + + +
+
+
+
+
+
+ +
+

image

+
+
@JvmOverloads
fun image(drawable: Drawable, source: String? = null, useTextViewSize: TextView? = null, size: DrawableSize? = null, replaceRule: Any? = null): Span
@JvmOverloads
fun image(context: Context, uri: Uri, useTextViewSize: TextView? = null, size: DrawableSize? = null, replaceRule: Any? = null): Span
@JvmOverloads
fun image(context: Context, @DrawableRes resourceId: Int, useTextViewSize: TextView? = null, size: DrawableSize? = null, replaceRule: Any? = null): Span
@JvmOverloads
fun image(context: Context, bitmap: Bitmap, useTextViewSize: TextView? = null, size: DrawableSize? = null, replaceRule: Any? = null): Span

See also

CharSequence.spanImage
+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-span/index.html b/docs/api/-spannable-x/com.itxca.spannablex/-span/index.html new file mode 100644 index 0000000..677774b --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-span/index.html @@ -0,0 +1,397 @@ + + + + Span + + + + +
+
+
+
+
+
+ +
+

Span

+
class Span

Chain Spannable

+sample: +
+
TextView.setText(Span.create() +
.text("this is real text.") +
.text("spannable").color(Color.BLUE).style(Typeface.BOLD) +
.spannable())
+
+
+
+
+

Types

+
+
+
+
+ + +
Link copied to clipboard
+
+
+
+
object Companion
+
+
+
+
+
+

Functions

+
+
+
+
+ + +
Link copied to clipboard
+
+
+
+
@JvmOverloads
fun absoluteSize(size: Int, dip: Boolean = true, replaceRule: Any? = null): Span
+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
@JvmOverloads
fun background(@ColorInt color: Int, replaceRule: Any? = null): Span
@JvmOverloads
fun background(colorString: String, replaceRule: Any? = null): Span
+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
@JvmOverloads
fun blurMask(@FloatRange(from = 0.0) radius: Float, style: BlurMaskFilter.Blur? = null, replaceRule: Any? = null): Span
+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
@JvmOverloads
fun clickable(@ColorInt color: Int? = null, @ColorInt backgroundColor: Int? = null, typeStyle: Int? = null, config: SimpleClickableConfig? = null, replaceRule: Any? = null, onClick: OnSpanClickListener? = null): Span
+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
@JvmOverloads
fun color(@ColorInt color: Int, replaceRule: Any? = null): Span
@JvmOverloads
fun color(colorString: String, replaceRule: Any? = null): Span
+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
@JvmOverloads
fun image(context: Context, bitmap: Bitmap, useTextViewSize: TextView? = null, size: DrawableSize? = null, replaceRule: Any? = null): Span
@JvmOverloads
fun image(context: Context, uri: Uri, useTextViewSize: TextView? = null, size: DrawableSize? = null, replaceRule: Any? = null): Span
@JvmOverloads
fun image(context: Context, @DrawableRes resourceId: Int, useTextViewSize: TextView? = null, size: DrawableSize? = null, replaceRule: Any? = null): Span
@JvmOverloads
fun image(drawable: Drawable, source: String? = null, useTextViewSize: TextView? = null, size: DrawableSize? = null, replaceRule: Any? = null): Span
+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
@JvmOverloads
fun maskFilter(filter: MaskFilter, replaceRule: Any? = null): Span
+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
@JvmOverloads
fun newline(@IntRange(from = 1) lines: Int = 1): Span

换行(可自行处理\n)

+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
@JvmOverloads
fun relativeSize(@FloatRange(from = 0.0) proportion: Float, replaceRule: Any? = null): Span
+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
fun saveCache(): Span

保存当前 text spannable(大部分情况不需要手动调用)

+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
@JvmOverloads
fun scaleX(@FloatRange(from = 0.0) proportion: Float, replaceRule: Any? = null): Span
+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
fun spannable(): CharSequence

构建Spannable

+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
@JvmOverloads
fun strikethrough(replaceRule: Any? = null): Span
+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
@JvmOverloads
fun style(style: Int, replaceRule: Any? = null): Span
+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
@JvmOverloads
fun subscript(replaceRule: Any? = null): Span
+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
@JvmOverloads
fun suggestion(context: Context, suggestions: Array<String>, flags: Int = SuggestionSpan.SUGGESTIONS_MAX_SIZE, locale: Locale? = null, notificationTargetClass: Class<*>? = null, replaceRule: Any? = null): Span
+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
@JvmOverloads
fun superscript(replaceRule: Any? = null): Span
+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
fun text(text: CharSequence): Span

插入待处理字符串 在使用stylecolor... 等等之前,需调用该方法插入当前需要处理的字符串

+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
@JvmOverloads
fun textAppearance(style: Int = Typeface.NORMAL, size: Int = -1, @ColorInt color: Int? = null, family: String? = null, linkColor: ColorStateList? = null, replaceRule: Any? = null): Span
+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
@JvmOverloads
fun typeface(typeface: Typeface? = null, family: String? = null, replaceRule: Any? = null): Span
+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
@JvmOverloads
fun underline(replaceRule: Any? = null): Span
+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
@JvmOverloads
fun url(url: String, replaceRule: Any? = null): Span
+
+
+
+
+
+
+
+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-span/mask-filter.html b/docs/api/-spannable-x/com.itxca.spannablex/-span/mask-filter.html new file mode 100644 index 0000000..d28694a --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-span/mask-filter.html @@ -0,0 +1,37 @@ + + + + maskFilter + + + + +
+
+
+
+
+
+ +
+

maskFilter

+
+
@JvmOverloads
fun maskFilter(filter: MaskFilter, replaceRule: Any? = null): Span

See also

CharSequence.spanMaskFilter
+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-span/newline.html b/docs/api/-spannable-x/com.itxca.spannablex/-span/newline.html new file mode 100644 index 0000000..7942201 --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-span/newline.html @@ -0,0 +1,37 @@ + + + + newline + + + + +
+
+
+
+
+
+ +
+

newline

+
+
@JvmOverloads
fun newline(@IntRange(from = 1) lines: Int = 1): Span

换行(可自行处理\n)

+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-span/relative-size.html b/docs/api/-spannable-x/com.itxca.spannablex/-span/relative-size.html new file mode 100644 index 0000000..528be8e --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-span/relative-size.html @@ -0,0 +1,37 @@ + + + + relativeSize + + + + +
+
+
+
+
+
+ +
+

relativeSize

+
+
@JvmOverloads
fun relativeSize(@FloatRange(from = 0.0) proportion: Float, replaceRule: Any? = null): Span

See also

CharSequence.spanRelativeSize
+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-span/save-cache.html b/docs/api/-spannable-x/com.itxca.spannablex/-span/save-cache.html new file mode 100644 index 0000000..bebfc3a --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-span/save-cache.html @@ -0,0 +1,37 @@ + + + + saveCache + + + + +
+
+
+
+
+
+ +
+

saveCache

+
+
fun saveCache(): Span

保存当前 text spannable(大部分情况不需要手动调用)

+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-span/scale-x.html b/docs/api/-spannable-x/com.itxca.spannablex/-span/scale-x.html new file mode 100644 index 0000000..dd47492 --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-span/scale-x.html @@ -0,0 +1,37 @@ + + + + scaleX + + + + +
+
+
+
+
+
+ +
+

scaleX

+
+
@JvmOverloads
fun scaleX(@FloatRange(from = 0.0) proportion: Float, replaceRule: Any? = null): Span

See also

CharSequence.spanScaleX
+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-span/spannable.html b/docs/api/-spannable-x/com.itxca.spannablex/-span/spannable.html new file mode 100644 index 0000000..381d4af --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-span/spannable.html @@ -0,0 +1,37 @@ + + + + spannable + + + + +
+
+
+
+
+
+ +
+

spannable

+
+
fun spannable(): CharSequence

构建Spannable

+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-span/strikethrough.html b/docs/api/-spannable-x/com.itxca.spannablex/-span/strikethrough.html new file mode 100644 index 0000000..4b3f848 --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-span/strikethrough.html @@ -0,0 +1,37 @@ + + + + strikethrough + + + + +
+
+
+
+
+
+ +
+

strikethrough

+
+
@JvmOverloads
fun strikethrough(replaceRule: Any? = null): Span

See also

CharSequence.spanStrikethrough
+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-span/style.html b/docs/api/-spannable-x/com.itxca.spannablex/-span/style.html new file mode 100644 index 0000000..59f17df --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-span/style.html @@ -0,0 +1,37 @@ + + + + style + + + + +
+
+
+
+
+
+ +
+

style

+
+
@JvmOverloads
fun style(style: Int, replaceRule: Any? = null): Span

See also

CharSequence.spanStyle
+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-span/subscript.html b/docs/api/-spannable-x/com.itxca.spannablex/-span/subscript.html new file mode 100644 index 0000000..432a40a --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-span/subscript.html @@ -0,0 +1,37 @@ + + + + subscript + + + + +
+
+
+
+
+
+ +
+

subscript

+
+
@JvmOverloads
fun subscript(replaceRule: Any? = null): Span

See also

CharSequence.spanSubscript
+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-span/suggestion.html b/docs/api/-spannable-x/com.itxca.spannablex/-span/suggestion.html new file mode 100644 index 0000000..cec0f00 --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-span/suggestion.html @@ -0,0 +1,37 @@ + + + + suggestion + + + + +
+
+
+
+
+
+ +
+

suggestion

+
+
@JvmOverloads
fun suggestion(context: Context, suggestions: Array<String>, flags: Int = SuggestionSpan.SUGGESTIONS_MAX_SIZE, locale: Locale? = null, notificationTargetClass: Class<*>? = null, replaceRule: Any? = null): Span

See also

CharSequence.spanSuggestion
+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-span/superscript.html b/docs/api/-spannable-x/com.itxca.spannablex/-span/superscript.html new file mode 100644 index 0000000..6fa19c2 --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-span/superscript.html @@ -0,0 +1,37 @@ + + + + superscript + + + + +
+
+
+
+
+
+ +
+

superscript

+
+
@JvmOverloads
fun superscript(replaceRule: Any? = null): Span

See also

CharSequence.spanSuperscript
+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-span/text-appearance.html b/docs/api/-spannable-x/com.itxca.spannablex/-span/text-appearance.html new file mode 100644 index 0000000..4d7f81d --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-span/text-appearance.html @@ -0,0 +1,37 @@ + + + + textAppearance + + + + +
+
+
+
+
+
+ +
+

textAppearance

+
+
@JvmOverloads
fun textAppearance(style: Int = Typeface.NORMAL, size: Int = -1, @ColorInt color: Int? = null, family: String? = null, linkColor: ColorStateList? = null, replaceRule: Any? = null): Span

See also

CharSequence.spanTextAppearance
+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-span/text.html b/docs/api/-spannable-x/com.itxca.spannablex/-span/text.html new file mode 100644 index 0000000..0a08ac8 --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-span/text.html @@ -0,0 +1,37 @@ + + + + text + + + + +
+
+
+
+
+
+ +
+

text

+
+
fun text(text: CharSequence): Span

插入待处理字符串 在使用stylecolor... 等等之前,需调用该方法插入当前需要处理的字符串

+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-span/typeface.html b/docs/api/-spannable-x/com.itxca.spannablex/-span/typeface.html new file mode 100644 index 0000000..d5f5885 --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-span/typeface.html @@ -0,0 +1,37 @@ + + + + typeface + + + + +
+
+
+
+
+
+ +
+

typeface

+
+
@JvmOverloads
fun typeface(typeface: Typeface? = null, family: String? = null, replaceRule: Any? = null): Span

See also

CharSequence.spanTypeface
+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-span/underline.html b/docs/api/-spannable-x/com.itxca.spannablex/-span/underline.html new file mode 100644 index 0000000..645022c --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-span/underline.html @@ -0,0 +1,37 @@ + + + + underline + + + + +
+
+
+
+
+
+ +
+

underline

+
+
@JvmOverloads
fun underline(replaceRule: Any? = null): Span

See also

CharSequence.spanUnderline
+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-span/url.html b/docs/api/-spannable-x/com.itxca.spannablex/-span/url.html new file mode 100644 index 0000000..ef3830d --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-span/url.html @@ -0,0 +1,37 @@ + + + + url + + + + +
+
+
+
+
+
+ +
+

url

+
+
@JvmOverloads
fun url(url: String, replaceRule: Any? = null): Span

See also

CharSequence.spanURL
+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/-companion/create.html b/docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/-companion/create.html new file mode 100644 index 0000000..6de208b --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/-companion/create.html @@ -0,0 +1,37 @@ + + + + create + + + + +
+
+
+
+
+
+ +
+

create

+
+
fun create(text: CharSequence?): SpannableDsl

See also

+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/-companion/index.html b/docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/-companion/index.html new file mode 100644 index 0000000..f2277c2 --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/-companion/index.html @@ -0,0 +1,59 @@ + + + + Companion + + + + +
+
+
+
+
+
+ +
+

Companion

+
object Companion
+
+
+
+
+

Functions

+
+
+
+
+ + +
Link copied to clipboard
+
+
+
+
fun create(text: CharSequence?): SpannableDsl
+
+
+
+
+
+
+
+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/absolute-size.html b/docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/absolute-size.html new file mode 100644 index 0000000..c47d2c5 --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/absolute-size.html @@ -0,0 +1,37 @@ + + + + absoluteSize + + + + +
+
+
+
+
+
+ +
+

absoluteSize

+
+
fun Any?.absoluteSize(size: Int, dip: Boolean = true, replaceRule: Any? = null)

AbsoluteSizeSpan 文本绝对大小

See also

CharSequence.spanAbsoluteSize

Parameters

replaceRule

ReplaceRule 替换规则

+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/background.html b/docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/background.html new file mode 100644 index 0000000..1172568 --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/background.html @@ -0,0 +1,37 @@ + + + + background + + + + +
+
+
+
+
+
+ +
+

background

+
+
fun Any?.background(colorString: String, replaceRule: Any? = null)
fun Any?.background(@ColorInt color: Int, replaceRule: Any? = null)

BackgroundColorSpan 背景颜色

See also

CharSequence.spanBackground

Parameters

replaceRule

ReplaceRule 替换规则

+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/blur-mask.html b/docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/blur-mask.html new file mode 100644 index 0000000..9f2fe36 --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/blur-mask.html @@ -0,0 +1,37 @@ + + + + blurMask + + + + +
+
+
+
+
+
+ +
+

blurMask

+
+
fun Any?.blurMask(@FloatRange(from = 0.0) radius: Float, style: BlurMaskFilter.Blur = BlurMaskFilter.Blur.NORMAL, replaceRule: Any? = null)

BlurMaskFilter 文本模糊滤镜蒙版效果

See also

CharSequence.spanBlurMask

Parameters

replaceRule

ReplaceRule 替换规则

+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/clickable.html b/docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/clickable.html new file mode 100644 index 0000000..97e7f34 --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/clickable.html @@ -0,0 +1,37 @@ + + + + clickable + + + + +
+
+
+
+
+
+ +
+

clickable

+
+
fun Any?.clickable(@ColorInt color: Int? = null, @ColorInt backgroundColor: Int? = null, typeStyle: Int? = null, config: SimpleClickableConfig? = null, replaceRule: Any? = null, onClick: OnSpanClickListener? = null)

SimpleClickableConfig 文本点击效果

See also

CharSequence.spanClickable

Parameters

replaceRule

ReplaceRule 替换规则

+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/color.html b/docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/color.html new file mode 100644 index 0000000..2901a2f --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/color.html @@ -0,0 +1,37 @@ + + + + color + + + + +
+
+
+
+
+
+ +
+

color

+
+
fun Any?.color(colorString: String, replaceRule: Any? = null)
fun Any?.color(@ColorInt color: Int, replaceRule: Any? = null)

ForegroundColorSpan 文本颜色

See also

CharSequence.spanColor

Parameters

replaceRule

ReplaceRule 替换规则

+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/image.html b/docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/image.html new file mode 100644 index 0000000..6cde3a2 --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/image.html @@ -0,0 +1,37 @@ + + + + image + + + + +
+
+
+
+
+
+ +
+

image

+
+
fun Any?.image(drawable: Drawable, source: String? = null, useTextViewSize: TextView? = null, size: DrawableSize? = null, replaceRule: Any? = null)
fun Any?.image(context: Context, uri: Uri, useTextViewSize: TextView? = null, size: DrawableSize? = null, replaceRule: Any? = null)
fun Any?.image(context: Context, @DrawableRes resourceId: Int, useTextViewSize: TextView? = null, size: DrawableSize? = null, replaceRule: Any? = null)
fun Any?.image(context: Context, bitmap: Bitmap, useTextViewSize: TextView? = null, size: DrawableSize? = null, replaceRule: Any? = null)

SizeImageSpan 图片

See also

Parameters

replaceRule

ReplaceRule 替换规则

+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/index.html b/docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/index.html new file mode 100644 index 0000000..588a218 --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/index.html @@ -0,0 +1,393 @@ + + + + SpannableDsl + + + + +
+
+
+
+
+
+ +
+

SpannableDsl

+
class SpannableDsl

DSL Spannable

sample: ```kotlin TextView.text = spannable { "this is real text.".text() "spannable".color(Color.BLUE).style(Typeface.BOLD) }

+
+
+
+
+

Types

+
+
+
+
+ + +
Link copied to clipboard
+
+
+
+
object Companion
+
+
+
+
+
+

Functions

+
+
+
+
+ + +
Link copied to clipboard
+
+
+
+
fun Any?.absoluteSize(size: Int, dip: Boolean = true, replaceRule: Any? = null)

AbsoluteSizeSpan 文本绝对大小

+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
fun Any?.background(@ColorInt color: Int, replaceRule: Any? = null)
fun Any?.background(colorString: String, replaceRule: Any? = null)

BackgroundColorSpan 背景颜色

+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
fun Any?.blurMask(@FloatRange(from = 0.0) radius: Float, style: BlurMaskFilter.Blur = BlurMaskFilter.Blur.NORMAL, replaceRule: Any? = null)

BlurMaskFilter 文本模糊滤镜蒙版效果

+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
fun Any?.clickable(@ColorInt color: Int? = null, @ColorInt backgroundColor: Int? = null, typeStyle: Int? = null, config: SimpleClickableConfig? = null, replaceRule: Any? = null, onClick: OnSpanClickListener? = null)

SimpleClickableConfig 文本点击效果

+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
fun Any?.color(@ColorInt color: Int, replaceRule: Any? = null)
fun Any?.color(colorString: String, replaceRule: Any? = null)

ForegroundColorSpan 文本颜色

+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
fun Any?.image(context: Context, bitmap: Bitmap, useTextViewSize: TextView? = null, size: DrawableSize? = null, replaceRule: Any? = null)
fun Any?.image(context: Context, uri: Uri, useTextViewSize: TextView? = null, size: DrawableSize? = null, replaceRule: Any? = null)
fun Any?.image(context: Context, @DrawableRes resourceId: Int, useTextViewSize: TextView? = null, size: DrawableSize? = null, replaceRule: Any? = null)
fun Any?.image(drawable: Drawable, source: String? = null, useTextViewSize: TextView? = null, size: DrawableSize? = null, replaceRule: Any? = null)
+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
fun Any?.maskFilter(filter: MaskFilter, replaceRule: Any? = null)

MaskFilterSpan 文本蒙版效果

+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
fun <T> T?.newline(): CharSequence?

换行(可自行处理\n)

+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
fun Any?.relativeSize(@FloatRange(from = 0.0) proportion: Float, replaceRule: Any? = null)

RelativeSizeSpan 文本相对大小

+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
fun Any?.scaleX(@FloatRange(from = 0.0) proportion: Float, replaceRule: Any? = null)

ScaleXSpan X轴文本缩放

+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
fun CharSequence?.span(span: SpannableDsl.() -> Unit = {})

为 @receiver 设置多个Span

+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
fun Any?.strikethrough(replaceRule: Any? = null)

StrikethroughSpan 文本删除线

+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
fun Any?.style(style: Int, replaceRule: Any? = null)

StyleSpan 设置文本样式

+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
fun Any?.subscript(replaceRule: Any? = null)

SubscriptSpan 文本下标

+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
fun Any?.suggestion(context: Context, suggestions: Array<String>, flags: Int = SuggestionSpan.SUGGESTIONS_MAX_SIZE, locale: Locale? = null, notificationTargetClass: Class<*>? = null, replaceRule: Any? = null)

SuggestionSpan 文本输入提示

+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
fun Any?.superscript(replaceRule: Any? = null)

SuperscriptSpan 文本上标

+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
fun CharSequence?.text()

添加文本(无Spannable效果)

+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
fun Any?.textAppearance(style: Int = Typeface.NORMAL, size: Int = -1, @ColorInt color: Int? = null, family: String? = null, linkColor: ColorStateList? = null, replaceRule: Any? = null)

TextAppearanceSpan 设置字体效果spanTypeface

+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
fun Any?.typeface(typeface: Typeface? = null, family: String? = null, replaceRule: Any? = null)

TypefaceSpan 设置字体样式

+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
fun Any?.underline(replaceRule: Any? = null)

UnderlineSpan 文本下划线

+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
fun Any?.url(url: String, replaceRule: Any? = null)

URLSpan 文本超链接

+
+
+
+
+
+

Properties

+
+
+
+
+ + +
Link copied to clipboard
+
+
+
+
var textSpannable: Spanned?

text SpannedString

+
+
+
+
+
+
+
+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/mask-filter.html b/docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/mask-filter.html new file mode 100644 index 0000000..a9b6961 --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/mask-filter.html @@ -0,0 +1,37 @@ + + + + maskFilter + + + + +
+
+
+
+
+
+ +
+

maskFilter

+
+
fun Any?.maskFilter(filter: MaskFilter, replaceRule: Any? = null)

MaskFilterSpan 文本蒙版效果

See also

CharSequence.spanMaskFilter

Parameters

replaceRule

ReplaceRule 替换规则

+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/newline.html b/docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/newline.html new file mode 100644 index 0000000..2185841 --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/newline.html @@ -0,0 +1,37 @@ + + + + newline + + + + +
+
+
+
+
+
+ +
+

newline

+
+
fun <T> T?.newline(): CharSequence?

换行(可自行处理\n)

+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/relative-size.html b/docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/relative-size.html new file mode 100644 index 0000000..edf1688 --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/relative-size.html @@ -0,0 +1,37 @@ + + + + relativeSize + + + + +
+
+
+
+
+
+ +
+

relativeSize

+
+
fun Any?.relativeSize(@FloatRange(from = 0.0) proportion: Float, replaceRule: Any? = null)

RelativeSizeSpan 文本相对大小

See also

CharSequence.spanRelativeSize

Parameters

replaceRule

ReplaceRule 替换规则

+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/scale-x.html b/docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/scale-x.html new file mode 100644 index 0000000..eb63f42 --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/scale-x.html @@ -0,0 +1,37 @@ + + + + scaleX + + + + +
+
+
+
+
+
+ +
+

scaleX

+
+
fun Any?.scaleX(@FloatRange(from = 0.0) proportion: Float, replaceRule: Any? = null)

ScaleXSpan X轴文本缩放

See also

CharSequence.spanScaleX

Parameters

replaceRule

ReplaceRule 替换规则

+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/span.html b/docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/span.html new file mode 100644 index 0000000..01c608a --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/span.html @@ -0,0 +1,37 @@ + + + + span + + + + +
+
+
+
+
+
+ +
+

span

+
+
fun CharSequence?.span(span: SpannableDsl.() -> Unit = {})

为 @receiver 设置多个Span

+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/strikethrough.html b/docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/strikethrough.html new file mode 100644 index 0000000..863f754 --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/strikethrough.html @@ -0,0 +1,37 @@ + + + + strikethrough + + + + +
+
+
+
+
+
+ +
+

strikethrough

+
+
fun Any?.strikethrough(replaceRule: Any? = null)

StrikethroughSpan 文本删除线

See also

CharSequence.spanStrikethrough

Parameters

replaceRule

ReplaceRule 替换规则

+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/style.html b/docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/style.html new file mode 100644 index 0000000..a63cf67 --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/style.html @@ -0,0 +1,37 @@ + + + + style + + + + +
+
+
+
+
+
+ +
+

style

+
+
fun Any?.style(style: Int, replaceRule: Any? = null)

StyleSpan 设置文本样式

See also

CharSequence.spanStyle

Parameters

replaceRule

ReplaceRule 替换规则

+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/subscript.html b/docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/subscript.html new file mode 100644 index 0000000..e08efee --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/subscript.html @@ -0,0 +1,37 @@ + + + + subscript + + + + +
+
+
+
+
+
+ +
+

subscript

+
+
fun Any?.subscript(replaceRule: Any? = null)

SubscriptSpan 文本下标

See also

CharSequence.spanSubscript

Parameters

replaceRule

ReplaceRule 替换规则

+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/suggestion.html b/docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/suggestion.html new file mode 100644 index 0000000..8ad3a53 --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/suggestion.html @@ -0,0 +1,37 @@ + + + + suggestion + + + + +
+
+
+
+
+
+ +
+

suggestion

+
+
fun Any?.suggestion(context: Context, suggestions: Array<String>, flags: Int = SuggestionSpan.SUGGESTIONS_MAX_SIZE, locale: Locale? = null, notificationTargetClass: Class<*>? = null, replaceRule: Any? = null)

SuggestionSpan 文本输入提示

See also

CharSequence.spanSuggestion

Parameters

replaceRule

ReplaceRule 替换规则

+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/superscript.html b/docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/superscript.html new file mode 100644 index 0000000..154768d --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/superscript.html @@ -0,0 +1,37 @@ + + + + superscript + + + + +
+
+
+
+
+
+ +
+

superscript

+
+
fun Any?.superscript(replaceRule: Any? = null)

SuperscriptSpan 文本上标

See also

CharSequence.spanSuperscript

Parameters

replaceRule

ReplaceRule 替换规则

+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/text-appearance.html b/docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/text-appearance.html new file mode 100644 index 0000000..fd534cf --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/text-appearance.html @@ -0,0 +1,37 @@ + + + + textAppearance + + + + +
+
+
+
+
+
+ +
+

textAppearance

+
+
fun Any?.textAppearance(style: Int = Typeface.NORMAL, size: Int = -1, @ColorInt color: Int? = null, family: String? = null, linkColor: ColorStateList? = null, replaceRule: Any? = null)

TextAppearanceSpan 设置字体效果spanTypeface

See also

CharSequence.spanTextAppearance

Parameters

replaceRule

ReplaceRule 替换规则

+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/text-spannable.html b/docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/text-spannable.html new file mode 100644 index 0000000..eda08fa --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/text-spannable.html @@ -0,0 +1,37 @@ + + + + textSpannable + + + + +
+
+
+
+
+
+ +
+

textSpannable

+
+
var textSpannable: Spanned?

text SpannedString

+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/text.html b/docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/text.html new file mode 100644 index 0000000..39fffa7 --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/text.html @@ -0,0 +1,37 @@ + + + + text + + + + +
+
+
+
+
+
+ +
+

text

+
+
fun CharSequence?.text()

添加文本(无Spannable效果)

+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/typeface.html b/docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/typeface.html new file mode 100644 index 0000000..8711752 --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/typeface.html @@ -0,0 +1,37 @@ + + + + typeface + + + + +
+
+
+
+
+
+ +
+

typeface

+
+
fun Any?.typeface(typeface: Typeface? = null, family: String? = null, replaceRule: Any? = null)

TypefaceSpan 设置字体样式

See also

CharSequence.spanTypeface

Parameters

replaceRule

ReplaceRule 替换规则

+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/underline.html b/docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/underline.html new file mode 100644 index 0000000..4bc9228 --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/underline.html @@ -0,0 +1,37 @@ + + + + underline + + + + +
+
+
+
+
+
+ +
+

underline

+
+
fun Any?.underline(replaceRule: Any? = null)

UnderlineSpan 文本下划线

See also

CharSequence.spanUnderline

Parameters

replaceRule

ReplaceRule 替换规则

+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/url.html b/docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/url.html new file mode 100644 index 0000000..3d3825c --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/-spannable-dsl/url.html @@ -0,0 +1,37 @@ + + + + url + + + + +
+
+
+
+
+
+ +
+

url

+
+
fun Any?.url(url: String, replaceRule: Any? = null)

URLSpan 文本超链接

See also

CharSequence.spanURL

Parameters

replaceRule

ReplaceRule 替换规则

+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/activate-all-text-view-click.html b/docs/api/-spannable-x/com.itxca.spannablex/activate-all-text-view-click.html new file mode 100644 index 0000000..f31524e --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/activate-all-text-view-click.html @@ -0,0 +1,37 @@ + + + + activateAllTextViewClick + + + + +
+
+
+
+
+
+ +
+

activateAllTextViewClick

+
+
fun ViewBinding.activateAllTextViewClick(background: Boolean = true, @IdRes vararg ignoreId: Int)

循环 ViewBinding 控件并配置 LinkMovementMethodClickableMovementMethod

Parameters

background

是否显示点击背景

ignoreId

忽略配置movementMethod的ViewId


fun Activity.activateAllTextViewClick(background: Boolean = true, @IdRes vararg ignoreId: Int)

循环 Activity 控件并配置 LinkMovementMethodClickableMovementMethod

Parameters

background

是否显示点击背景

ignoreId

忽略配置movementMethod的ViewId


fun Fragment.activateAllTextViewClick(background: Boolean = true, @IdRes vararg ignoreId: Int)

循环 Fragment 控件并配置 LinkMovementMethodClickableMovementMethod

Parameters

background

是否显示点击背景

ignoreId

忽略配置movementMethod的ViewId

+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/activate-click.html b/docs/api/-spannable-x/com.itxca.spannablex/activate-click.html new file mode 100644 index 0000000..17d4081 --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/activate-click.html @@ -0,0 +1,37 @@ + + + + activateClick + + + + +
+
+
+
+
+
+ +
+

activateClick

+
+
fun TextView.activateClick(background: Boolean = true): TextView

配置 LinkMovementMethodClickableMovementMethod

Parameters

background

是否显示点击背景

+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/auto-activate-click.html b/docs/api/-spannable-x/com.itxca.spannablex/auto-activate-click.html new file mode 100644 index 0000000..caa596a --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/auto-activate-click.html @@ -0,0 +1,37 @@ + + + + autoActivateClick + + + + +
+
+
+
+
+
+ +
+

autoActivateClick

+
+
fun View?.autoActivateClick(background: Boolean, @IdRes vararg ignoreId: Int)

循环获取控件并配置 LinkMovementMethodClickableMovementMethod

Parameters

background

是否显示点击背景

ignoreId

忽略配置movementMethod的ViewId

+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/index.html b/docs/api/-spannable-x/com.itxca.spannablex/index.html new file mode 100644 index 0000000..de9e9ae --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/index.html @@ -0,0 +1,233 @@ + + + + com.itxca.spannablex + + + + +
+
+
+
+
+
+ +
+

Package com.itxca.spannablex

+
+
+
+
+

Types

+
+
+
+
+ + +
Link copied to clipboard
+
+
+
+
data class ReplaceRule(replaceString: String, isRegex: Boolean, matchRange: IntRange?, newString: CharSequence?, replacementMatch: OnSpanReplacementMatch?)

替换规则

+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
class Span

Chain Spannable

+sample: +
+
TextView.setText(Span.create() +
.text("this is real text.") +
.text("spannable").color(Color.BLUE).style(Typeface.BOLD) +
.spannable())
+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
class SpanDsl

DSL Spannable

+
+
+
+
+
+

Functions

+
+
+
+
+ + +
Link copied to clipboard
+
+
+
+
fun Activity.activateAllTextViewClick(background: Boolean = true, @IdRes vararg ignoreId: Int)

循环 Activity 控件并配置 LinkMovementMethodClickableMovementMethod

fun Fragment.activateAllTextViewClick(background: Boolean = true, @IdRes vararg ignoreId: Int)

循环 Fragment 控件并配置 LinkMovementMethodClickableMovementMethod

fun ViewBinding.activateAllTextViewClick(background: Boolean = true, @IdRes vararg ignoreId: Int)

循环 ViewBinding 控件并配置 LinkMovementMethodClickableMovementMethod

+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
fun TextView.activateClick(background: Boolean = true): TextView

配置 LinkMovementMethodClickableMovementMethod

+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
fun View?.autoActivateClick(background: Boolean, @IdRes vararg ignoreId: Int)

循环获取控件并配置 LinkMovementMethodClickableMovementMethod

+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
operator fun Spanned.plus(other: CharSequence): SpannableStringBuilder

扩展Spanned +, 保留样式 operator Spannable + CharSequence

+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
fun CharSequence.removeAllSpans(): CharSequence

删除所有CharacterStyle Span

+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
inline fun <T> CharSequence.removeSpans(): CharSequence

删除指定Span

+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
fun Any?.spannable(builderAction: SpanDsl.() -> Unit): SpannableStringBuilder

构建Spannable

+
+
+
+
+ +
+
+
+ + +
Link copied to clipboard
+
+
+
+
fun String.toReplaceRule(isRegex: Boolean = false, matchIndex: Int? = null, matchRange: IntRange? = null, newString: CharSequence? = null, replacementMatch: OnSpanReplacementMatch? = null): ReplaceRule

创建替换规则

+
+
+
+
+
+

Properties

+
+
+
+
+ + +
Link copied to clipboard
+
+
+
+
val String.span: SpannedString

String 转为 Spannable, 以便进行plus操作

+
+
+
+
+
+
+
+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/plus.html b/docs/api/-spannable-x/com.itxca.spannablex/plus.html new file mode 100644 index 0000000..67ee8bc --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/plus.html @@ -0,0 +1,37 @@ + + + + plus + + + + +
+
+
+
+
+
+ +
+

plus

+
+
operator fun Spanned.plus(other: CharSequence): SpannableStringBuilder

扩展Spanned +, 保留样式 operator Spannable + CharSequence

Return

Spannable

+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/remove-all-spans.html b/docs/api/-spannable-x/com.itxca.spannablex/remove-all-spans.html new file mode 100644 index 0000000..bee57fb --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/remove-all-spans.html @@ -0,0 +1,37 @@ + + + + removeAllSpans + + + + +
+
+
+
+
+
+ +
+

removeAllSpans

+
+
fun CharSequence.removeAllSpans(): CharSequence

删除所有CharacterStyle Span

+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/remove-spans.html b/docs/api/-spannable-x/com.itxca.spannablex/remove-spans.html new file mode 100644 index 0000000..f1cfd1f --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/remove-spans.html @@ -0,0 +1,37 @@ + + + + removeSpans + + + + +
+
+
+
+
+
+ +
+

removeSpans

+
+
inline fun <T> CharSequence.removeSpans(): CharSequence

删除指定Span

+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/span.html b/docs/api/-spannable-x/com.itxca.spannablex/span.html new file mode 100644 index 0000000..f1fa8ec --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/span.html @@ -0,0 +1,37 @@ + + + + span + + + + +
+
+
+
+
+
+ +
+

span

+
+
val String.span: SpannedString

String 转为 Spannable, 以便进行plus操作

+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/spannable.html b/docs/api/-spannable-x/com.itxca.spannablex/spannable.html new file mode 100644 index 0000000..e3157a5 --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/spannable.html @@ -0,0 +1,37 @@ + + + + spannable + + + + +
+
+
+
+
+
+ +
+

spannable

+
+
fun Any?.spannable(builderAction: SpanDsl.() -> Unit): SpannableStringBuilder

构建Spannable

See also

+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/com.itxca.spannablex/to-replace-rule.html b/docs/api/-spannable-x/com.itxca.spannablex/to-replace-rule.html new file mode 100644 index 0000000..dc38e5e --- /dev/null +++ b/docs/api/-spannable-x/com.itxca.spannablex/to-replace-rule.html @@ -0,0 +1,37 @@ + + + + toReplaceRule + + + + +
+
+
+
+
+
+ +
+

toReplaceRule

+
+
fun String.toReplaceRule(isRegex: Boolean = false, matchIndex: Int? = null, matchRange: IntRange? = null, newString: CharSequence? = null, replacementMatch: OnSpanReplacementMatch? = null): ReplaceRule

创建替换规则

Receiver

查找的字符串或正则文本

Parameters

isRegex

receiver是否为正则

matchIndex

单一匹配位置 (matchRange不为null时优先使用matchRange)

matchRange

匹配范围

newString

替换文本(null 为不替换)

replacementMatch

匹配时回调

+
+ +
+
+ + + diff --git a/docs/api/-spannable-x/package-list b/docs/api/-spannable-x/package-list new file mode 100644 index 0000000..78fde3c --- /dev/null +++ b/docs/api/-spannable-x/package-list @@ -0,0 +1,143 @@ +$dokka.format:html-v1 +$dokka.linkExtension:html +$dokka.location:com.itxca.spannablex.annotation////PointingToDeclaration/-spannable-x/com.itxca.spannablex.annotation/index.html +$dokka.location:com.itxca.spannablex.annotation/ConversionUnit.Companion///PointingToDeclaration/-spannable-x/com.itxca.spannablex.annotation/-conversion-unit/-companion/index.html +$dokka.location:com.itxca.spannablex.annotation/ConversionUnit.Companion/DP/#/PointingToDeclaration/-spannable-x/com.itxca.spannablex.annotation/-conversion-unit/-companion/-d-p.html +$dokka.location:com.itxca.spannablex.annotation/ConversionUnit.Companion/NOT_CONVERT/#/PointingToDeclaration/-spannable-x/com.itxca.spannablex.annotation/-conversion-unit/-companion/-n-o-t_-c-o-n-v-e-r-t.html +$dokka.location:com.itxca.spannablex.annotation/ConversionUnit.Companion/SP/#/PointingToDeclaration/-spannable-x/com.itxca.spannablex.annotation/-conversion-unit/-companion/-s-p.html +$dokka.location:com.itxca.spannablex.annotation/ConversionUnit///PointingToDeclaration/-spannable-x/com.itxca.spannablex.annotation/-conversion-unit/index.html +$dokka.location:com.itxca.spannablex.annotation/ConversionUnit/ConversionUnit/#/PointingToDeclaration/-spannable-x/com.itxca.spannablex.annotation/-conversion-unit/-conversion-unit.html +$dokka.location:com.itxca.spannablex.annotation/TextStyle///PointingToDeclaration/-spannable-x/com.itxca.spannablex.annotation/-text-style/index.html +$dokka.location:com.itxca.spannablex.annotation/TextStyle/TextStyle/#/PointingToDeclaration/-spannable-x/com.itxca.spannablex.annotation/-text-style/-text-style.html +$dokka.location:com.itxca.spannablex.interfaces////PointingToDeclaration/-spannable-x/com.itxca.spannablex.interfaces/index.html +$dokka.location:com.itxca.spannablex.interfaces/OnSpanClickListener///PointingToDeclaration/-spannable-x/com.itxca.spannablex.interfaces/-on-span-click-listener/index.html +$dokka.location:com.itxca.spannablex.interfaces/OnSpanClickListener/onClick/#android.view.View#java.lang.String/PointingToDeclaration/-spannable-x/com.itxca.spannablex.interfaces/-on-span-click-listener/on-click.html +$dokka.location:com.itxca.spannablex.interfaces/OnSpanReplacementMatch///PointingToDeclaration/-spannable-x/com.itxca.spannablex.interfaces/-on-span-replacement-match/index.html +$dokka.location:com.itxca.spannablex.interfaces/OnSpanReplacementMatch/onMatch/#kotlin.text.MatchResult/PointingToDeclaration/-spannable-x/com.itxca.spannablex.interfaces/-on-span-replacement-match/on-match.html +$dokka.location:com.itxca.spannablex.span////PointingToDeclaration/-spannable-x/com.itxca.spannablex.span/index.html +$dokka.location:com.itxca.spannablex.span/SimpleClickableConfig///PointingToDeclaration/-spannable-x/com.itxca.spannablex.span/-simple-clickable-config/index.html +$dokka.location:com.itxca.spannablex.span/SimpleClickableConfig/SimpleClickableConfig/#kotlin.Boolean?/PointingToDeclaration/-spannable-x/com.itxca.spannablex.span/-simple-clickable-config/-simple-clickable-config.html +$dokka.location:com.itxca.spannablex.span/SimpleClickableConfig/underline/#/PointingToDeclaration/-spannable-x/com.itxca.spannablex.span/-simple-clickable-config/underline.html +$dokka.location:com.itxca.spannablex.span/SimpleClickableSpan///PointingToDeclaration/-spannable-x/com.itxca.spannablex.span/-simple-clickable-span/index.html +$dokka.location:com.itxca.spannablex.span/SimpleClickableSpan/SimpleClickableSpan/#kotlin.Int?#kotlin.Int?#kotlin.Int?#com.itxca.spannablex.span.SimpleClickableConfig?#kotlin.Function1[android.view.View,kotlin.Unit]?/PointingToDeclaration/-spannable-x/com.itxca.spannablex.span/-simple-clickable-span/-simple-clickable-span.html +$dokka.location:com.itxca.spannablex.span/SimpleClickableSpan/SimpleClickableSpan/#kotlin.String?#kotlin.String?#kotlin.Int?#com.itxca.spannablex.span.SimpleClickableConfig?#kotlin.Function1[android.view.View,kotlin.Unit]?/PointingToDeclaration/-spannable-x/com.itxca.spannablex.span/-simple-clickable-span/-simple-clickable-span.html +$dokka.location:com.itxca.spannablex.span/SimpleClickableSpan/onClick/#android.view.View/PointingToDeclaration/-spannable-x/com.itxca.spannablex.span/-simple-clickable-span/on-click.html +$dokka.location:com.itxca.spannablex.span/SimpleClickableSpan/updateDrawState/#android.text.TextPaint/PointingToDeclaration/-spannable-x/com.itxca.spannablex.span/-simple-clickable-span/update-draw-state.html +$dokka.location:com.itxca.spannablex.span/SizeImageSpan.Companion///PointingToDeclaration/-spannable-x/com.itxca.spannablex.span/-size-image-span/-companion/index.html +$dokka.location:com.itxca.spannablex.span/SizeImageSpan///PointingToDeclaration/-spannable-x/com.itxca.spannablex.span/-size-image-span/index.html +$dokka.location:com.itxca.spannablex.span/SizeImageSpan/SizeImageSpan/#android.content.Context#android.graphics.Bitmap/PointingToDeclaration/-spannable-x/com.itxca.spannablex.span/-size-image-span/-size-image-span.html +$dokka.location:com.itxca.spannablex.span/SizeImageSpan/SizeImageSpan/#android.content.Context#android.net.Uri/PointingToDeclaration/-spannable-x/com.itxca.spannablex.span/-size-image-span/-size-image-span.html +$dokka.location:com.itxca.spannablex.span/SizeImageSpan/SizeImageSpan/#android.content.Context#kotlin.Int/PointingToDeclaration/-spannable-x/com.itxca.spannablex.span/-size-image-span/-size-image-span.html +$dokka.location:com.itxca.spannablex.span/SizeImageSpan/SizeImageSpan/#android.graphics.drawable.Drawable#kotlin.String/PointingToDeclaration/-spannable-x/com.itxca.spannablex.span/-size-image-span/-size-image-span.html +$dokka.location:com.itxca.spannablex.span/SizeImageSpan/SizeImageSpan/#android.graphics.drawable.Drawable/PointingToDeclaration/-spannable-x/com.itxca.spannablex.span/-size-image-span/-size-image-span.html +$dokka.location:com.itxca.spannablex.span/SizeImageSpan/clearDrawableCache/#/PointingToDeclaration/-spannable-x/com.itxca.spannablex.span/-size-image-span/clear-drawable-cache.html +$dokka.location:com.itxca.spannablex.span/SizeImageSpan/draw/#android.graphics.Canvas#kotlin.CharSequence?#kotlin.Int#kotlin.Int#kotlin.Float#kotlin.Int#kotlin.Int#kotlin.Int#android.graphics.Paint/PointingToDeclaration/-spannable-x/com.itxca.spannablex.span/-size-image-span/draw.html +$dokka.location:com.itxca.spannablex.span/SizeImageSpan/drawableHeight/#/PointingToDeclaration/-spannable-x/com.itxca.spannablex.span/-size-image-span/drawable-height.html +$dokka.location:com.itxca.spannablex.span/SizeImageSpan/drawableSize/#kotlin.Int#kotlin.Int/PointingToDeclaration/-spannable-x/com.itxca.spannablex.span/-size-image-span/drawable-size.html +$dokka.location:com.itxca.spannablex.span/SizeImageSpan/drawableWidth/#/PointingToDeclaration/-spannable-x/com.itxca.spannablex.span/-size-image-span/drawable-width.html +$dokka.location:com.itxca.spannablex.span/SizeImageSpan/getSize/#android.graphics.Paint#kotlin.CharSequence?#kotlin.Int#kotlin.Int#android.graphics.Paint.FontMetricsInt?/PointingToDeclaration/-spannable-x/com.itxca.spannablex.span/-size-image-span/get-size.html +$dokka.location:com.itxca.spannablex.utils////PointingToDeclaration/-spannable-x/com.itxca.spannablex.utils/index.html +$dokka.location:com.itxca.spannablex.utils//color/kotlin.String#/PointingToDeclaration/-spannable-x/com.itxca.spannablex.utils/color.html +$dokka.location:com.itxca.spannablex.utils//configTextViewSize/android.graphics.drawable.Drawable#TypeParam(bounds=[android.widget.TextView])?/PointingToDeclaration/-spannable-x/com.itxca.spannablex.utils/config-text-view-size.html +$dokka.location:com.itxca.spannablex.utils//dp/kotlin.Int#/PointingToDeclaration/-spannable-x/com.itxca.spannablex.utils/dp.html +$dokka.location:com.itxca.spannablex.utils//drawableSize/android.graphics.drawable.Drawable#kotlin.Int#kotlin.Int/PointingToDeclaration/-spannable-x/com.itxca.spannablex.utils/drawable-size.html +$dokka.location:com.itxca.spannablex.utils//drawableSize/kotlin.Int#/PointingToDeclaration/-spannable-x/com.itxca.spannablex.utils/drawable-size.html +$dokka.location:com.itxca.spannablex.utils//sp/kotlin.Int#/PointingToDeclaration/-spannable-x/com.itxca.spannablex.utils/sp.html +$dokka.location:com.itxca.spannablex.utils//textSizeInt/android.widget.TextView#/PointingToDeclaration/-spannable-x/com.itxca.spannablex.utils/text-size-int.html +$dokka.location:com.itxca.spannablex.utils/DrawableSize///PointingToDeclaration/-spannable-x/com.itxca.spannablex.utils/-drawable-size/index.html +$dokka.location:com.itxca.spannablex.utils/DrawableSize/DrawableSize/#kotlin.Int#kotlin.Int/PointingToDeclaration/-spannable-x/com.itxca.spannablex.utils/-drawable-size/-drawable-size.html +$dokka.location:com.itxca.spannablex.utils/DrawableSize/height/#/PointingToDeclaration/-spannable-x/com.itxca.spannablex.utils/-drawable-size/height.html +$dokka.location:com.itxca.spannablex.utils/DrawableSize/width/#/PointingToDeclaration/-spannable-x/com.itxca.spannablex.utils/-drawable-size/width.html +$dokka.location:com.itxca.spannablex////PointingToDeclaration/-spannable-x/com.itxca.spannablex/index.html +$dokka.location:com.itxca.spannablex//activateAllTextViewClick/android.app.Activity#kotlin.Boolean#kotlin.IntArray/PointingToDeclaration/-spannable-x/com.itxca.spannablex/activate-all-text-view-click.html +$dokka.location:com.itxca.spannablex//activateAllTextViewClick/android.app.Fragment#kotlin.Boolean#kotlin.IntArray/PointingToDeclaration/-spannable-x/com.itxca.spannablex/activate-all-text-view-click.html +$dokka.location:com.itxca.spannablex//activateAllTextViewClick/androidx.viewbinding.ViewBinding#kotlin.Boolean#kotlin.IntArray/PointingToDeclaration/-spannable-x/com.itxca.spannablex/activate-all-text-view-click.html +$dokka.location:com.itxca.spannablex//activateClick/android.widget.TextView#kotlin.Boolean/PointingToDeclaration/-spannable-x/com.itxca.spannablex/activate-click.html +$dokka.location:com.itxca.spannablex//autoActivateClick/android.view.View?#kotlin.Boolean#kotlin.IntArray/PointingToDeclaration/-spannable-x/com.itxca.spannablex/auto-activate-click.html +$dokka.location:com.itxca.spannablex//plus/android.text.Spanned#kotlin.CharSequence/PointingToDeclaration/-spannable-x/com.itxca.spannablex/plus.html +$dokka.location:com.itxca.spannablex//removeAllSpans/kotlin.CharSequence#/PointingToDeclaration/-spannable-x/com.itxca.spannablex/remove-all-spans.html +$dokka.location:com.itxca.spannablex//removeSpans/kotlin.CharSequence#/PointingToDeclaration/-spannable-x/com.itxca.spannablex/remove-spans.html +$dokka.location:com.itxca.spannablex//span/kotlin.String#/PointingToDeclaration/-spannable-x/com.itxca.spannablex/span.html +$dokka.location:com.itxca.spannablex//spannable/kotlin.Any?#kotlin.Function1[com.itxca.spannablex.SpanDsl,kotlin.Unit]/PointingToDeclaration/-spannable-x/com.itxca.spannablex/spannable.html +$dokka.location:com.itxca.spannablex//toReplaceRule/kotlin.String#kotlin.Boolean#kotlin.Int?#kotlin.ranges.IntRange?#kotlin.CharSequence?#com.itxca.spannablex.interfaces.OnSpanReplacementMatch?/PointingToDeclaration/-spannable-x/com.itxca.spannablex/to-replace-rule.html +$dokka.location:com.itxca.spannablex/ReplaceRule///PointingToDeclaration/-spannable-x/com.itxca.spannablex/-replace-rule/index.html +$dokka.location:com.itxca.spannablex/ReplaceRule/ReplaceRule/#kotlin.String#kotlin.Boolean#kotlin.ranges.IntRange?#kotlin.CharSequence?#com.itxca.spannablex.interfaces.OnSpanReplacementMatch?/PointingToDeclaration/-spannable-x/com.itxca.spannablex/-replace-rule/-replace-rule.html +$dokka.location:com.itxca.spannablex/ReplaceRule/isRegex/#/PointingToDeclaration/-spannable-x/com.itxca.spannablex/-replace-rule/is-regex.html +$dokka.location:com.itxca.spannablex/ReplaceRule/matchRange/#/PointingToDeclaration/-spannable-x/com.itxca.spannablex/-replace-rule/match-range.html +$dokka.location:com.itxca.spannablex/ReplaceRule/newString/#/PointingToDeclaration/-spannable-x/com.itxca.spannablex/-replace-rule/new-string.html +$dokka.location:com.itxca.spannablex/ReplaceRule/replaceString/#/PointingToDeclaration/-spannable-x/com.itxca.spannablex/-replace-rule/replace-string.html +$dokka.location:com.itxca.spannablex/ReplaceRule/replacementMatch/#/PointingToDeclaration/-spannable-x/com.itxca.spannablex/-replace-rule/replacement-match.html +$dokka.location:com.itxca.spannablex/Span.Companion///PointingToDeclaration/-spannable-x/com.itxca.spannablex/-span/-companion/index.html +$dokka.location:com.itxca.spannablex/Span.Companion/activateClick/#android.widget.TextView#kotlin.Boolean/PointingToDeclaration/-spannable-x/com.itxca.spannablex/-span/-companion/activate-click.html +$dokka.location:com.itxca.spannablex/Span.Companion/create/#/PointingToDeclaration/-spannable-x/com.itxca.spannablex/-span/-companion/create.html +$dokka.location:com.itxca.spannablex/Span.Companion/dp/#kotlin.Int/PointingToDeclaration/-spannable-x/com.itxca.spannablex/-span/-companion/dp.html +$dokka.location:com.itxca.spannablex/Span.Companion/drawableSize/#kotlin.Int#kotlin.Int/PointingToDeclaration/-spannable-x/com.itxca.spannablex/-span/-companion/drawable-size.html +$dokka.location:com.itxca.spannablex/Span.Companion/removeAllSpans/#android.text.Spannable/PointingToDeclaration/-spannable-x/com.itxca.spannablex/-span/-companion/remove-all-spans.html +$dokka.location:com.itxca.spannablex/Span.Companion/removeSpans/#kotlin.CharSequence#java.lang.Class[*]/PointingToDeclaration/-spannable-x/com.itxca.spannablex/-span/-companion/remove-spans.html +$dokka.location:com.itxca.spannablex/Span.Companion/sp/#kotlin.Int/PointingToDeclaration/-spannable-x/com.itxca.spannablex/-span/-companion/sp.html +$dokka.location:com.itxca.spannablex/Span.Companion/spannedString/#kotlin.Array[kotlin.CharSequence]/PointingToDeclaration/-spannable-x/com.itxca.spannablex/-span/-companion/spanned-string.html +$dokka.location:com.itxca.spannablex/Span.Companion/toReplaceRule/#kotlin.String#kotlin.Boolean#kotlin.Int?#kotlin.ranges.IntRange?#kotlin.CharSequence?#com.itxca.spannablex.interfaces.OnSpanReplacementMatch?/PointingToDeclaration/-spannable-x/com.itxca.spannablex/-span/-companion/to-replace-rule.html +$dokka.location:com.itxca.spannablex/Span///PointingToDeclaration/-spannable-x/com.itxca.spannablex/-span/index.html +$dokka.location:com.itxca.spannablex/Span/absoluteSize/#kotlin.Int#kotlin.Boolean#kotlin.Any?/PointingToDeclaration/-spannable-x/com.itxca.spannablex/-span/absolute-size.html +$dokka.location:com.itxca.spannablex/Span/background/#kotlin.Int#kotlin.Any?/PointingToDeclaration/-spannable-x/com.itxca.spannablex/-span/background.html +$dokka.location:com.itxca.spannablex/Span/background/#kotlin.String#kotlin.Any?/PointingToDeclaration/-spannable-x/com.itxca.spannablex/-span/background.html +$dokka.location:com.itxca.spannablex/Span/blurMask/#kotlin.Float#android.graphics.BlurMaskFilter.Blur?#kotlin.Any?/PointingToDeclaration/-spannable-x/com.itxca.spannablex/-span/blur-mask.html +$dokka.location:com.itxca.spannablex/Span/clickable/#kotlin.Int?#kotlin.Int?#kotlin.Int?#com.itxca.spannablex.span.SimpleClickableConfig?#kotlin.Any?#com.itxca.spannablex.interfaces.OnSpanClickListener?/PointingToDeclaration/-spannable-x/com.itxca.spannablex/-span/clickable.html +$dokka.location:com.itxca.spannablex/Span/color/#kotlin.Int#kotlin.Any?/PointingToDeclaration/-spannable-x/com.itxca.spannablex/-span/color.html +$dokka.location:com.itxca.spannablex/Span/color/#kotlin.String#kotlin.Any?/PointingToDeclaration/-spannable-x/com.itxca.spannablex/-span/color.html +$dokka.location:com.itxca.spannablex/Span/image/#android.content.Context#android.graphics.Bitmap#android.widget.TextView?#com.itxca.spannablex.utils.DrawableSize?#kotlin.Any?/PointingToDeclaration/-spannable-x/com.itxca.spannablex/-span/image.html +$dokka.location:com.itxca.spannablex/Span/image/#android.content.Context#android.net.Uri#android.widget.TextView?#com.itxca.spannablex.utils.DrawableSize?#kotlin.Any?/PointingToDeclaration/-spannable-x/com.itxca.spannablex/-span/image.html +$dokka.location:com.itxca.spannablex/Span/image/#android.content.Context#kotlin.Int#android.widget.TextView?#com.itxca.spannablex.utils.DrawableSize?#kotlin.Any?/PointingToDeclaration/-spannable-x/com.itxca.spannablex/-span/image.html +$dokka.location:com.itxca.spannablex/Span/image/#android.graphics.drawable.Drawable#kotlin.String?#android.widget.TextView?#com.itxca.spannablex.utils.DrawableSize?#kotlin.Any?/PointingToDeclaration/-spannable-x/com.itxca.spannablex/-span/image.html +$dokka.location:com.itxca.spannablex/Span/maskFilter/#android.graphics.MaskFilter#kotlin.Any?/PointingToDeclaration/-spannable-x/com.itxca.spannablex/-span/mask-filter.html +$dokka.location:com.itxca.spannablex/Span/newline/#kotlin.Int/PointingToDeclaration/-spannable-x/com.itxca.spannablex/-span/newline.html +$dokka.location:com.itxca.spannablex/Span/relativeSize/#kotlin.Float#kotlin.Any?/PointingToDeclaration/-spannable-x/com.itxca.spannablex/-span/relative-size.html +$dokka.location:com.itxca.spannablex/Span/saveCache/#/PointingToDeclaration/-spannable-x/com.itxca.spannablex/-span/save-cache.html +$dokka.location:com.itxca.spannablex/Span/scaleX/#kotlin.Float#kotlin.Any?/PointingToDeclaration/-spannable-x/com.itxca.spannablex/-span/scale-x.html +$dokka.location:com.itxca.spannablex/Span/spannable/#/PointingToDeclaration/-spannable-x/com.itxca.spannablex/-span/spannable.html +$dokka.location:com.itxca.spannablex/Span/strikethrough/#kotlin.Any?/PointingToDeclaration/-spannable-x/com.itxca.spannablex/-span/strikethrough.html +$dokka.location:com.itxca.spannablex/Span/style/#kotlin.Int#kotlin.Any?/PointingToDeclaration/-spannable-x/com.itxca.spannablex/-span/style.html +$dokka.location:com.itxca.spannablex/Span/subscript/#kotlin.Any?/PointingToDeclaration/-spannable-x/com.itxca.spannablex/-span/subscript.html +$dokka.location:com.itxca.spannablex/Span/suggestion/#android.content.Context#kotlin.Array[kotlin.String]#kotlin.Int#java.util.Locale?#java.lang.Class[*]?#kotlin.Any?/PointingToDeclaration/-spannable-x/com.itxca.spannablex/-span/suggestion.html +$dokka.location:com.itxca.spannablex/Span/superscript/#kotlin.Any?/PointingToDeclaration/-spannable-x/com.itxca.spannablex/-span/superscript.html +$dokka.location:com.itxca.spannablex/Span/text/#kotlin.CharSequence/PointingToDeclaration/-spannable-x/com.itxca.spannablex/-span/text.html +$dokka.location:com.itxca.spannablex/Span/textAppearance/#kotlin.Int#kotlin.Int#kotlin.Int?#kotlin.String?#android.content.res.ColorStateList?#kotlin.Any?/PointingToDeclaration/-spannable-x/com.itxca.spannablex/-span/text-appearance.html +$dokka.location:com.itxca.spannablex/Span/typeface/#android.graphics.Typeface?#kotlin.String?#kotlin.Any?/PointingToDeclaration/-spannable-x/com.itxca.spannablex/-span/typeface.html +$dokka.location:com.itxca.spannablex/Span/underline/#kotlin.Any?/PointingToDeclaration/-spannable-x/com.itxca.spannablex/-span/underline.html +$dokka.location:com.itxca.spannablex/Span/url/#kotlin.String#kotlin.Any?/PointingToDeclaration/-spannable-x/com.itxca.spannablex/-span/url.html +$dokka.location:com.itxca.spannablex/SpanDsl.Companion///PointingToDeclaration/-spannable-x/com.itxca.spannablex/-span-dsl/-companion/index.html +$dokka.location:com.itxca.spannablex/SpanDsl.Companion/create/#kotlin.CharSequence?#kotlin.Any?/PointingToDeclaration/-spannable-x/com.itxca.spannablex/-span-dsl/-companion/create.html +$dokka.location:com.itxca.spannablex/SpanDsl///PointingToDeclaration/-spannable-x/com.itxca.spannablex/-span-dsl/index.html +$dokka.location:com.itxca.spannablex/SpanDsl/absoluteSize/kotlin.Any?#kotlin.Int#kotlin.Boolean#kotlin.Any?/PointingToDeclaration/-spannable-x/com.itxca.spannablex/-span-dsl/absolute-size.html +$dokka.location:com.itxca.spannablex/SpanDsl/background/kotlin.Any?#kotlin.Int#kotlin.Any?/PointingToDeclaration/-spannable-x/com.itxca.spannablex/-span-dsl/background.html +$dokka.location:com.itxca.spannablex/SpanDsl/background/kotlin.Any?#kotlin.String#kotlin.Any?/PointingToDeclaration/-spannable-x/com.itxca.spannablex/-span-dsl/background.html +$dokka.location:com.itxca.spannablex/SpanDsl/blurMask/kotlin.Any?#kotlin.Float#android.graphics.BlurMaskFilter.Blur#kotlin.Any?/PointingToDeclaration/-spannable-x/com.itxca.spannablex/-span-dsl/blur-mask.html +$dokka.location:com.itxca.spannablex/SpanDsl/clickable/kotlin.Any?#kotlin.Int?#kotlin.Int?#kotlin.Int?#com.itxca.spannablex.span.SimpleClickableConfig?#kotlin.Any?#com.itxca.spannablex.interfaces.OnSpanClickListener?/PointingToDeclaration/-spannable-x/com.itxca.spannablex/-span-dsl/clickable.html +$dokka.location:com.itxca.spannablex/SpanDsl/color/kotlin.Any?#kotlin.Int#kotlin.Any?/PointingToDeclaration/-spannable-x/com.itxca.spannablex/-span-dsl/color.html +$dokka.location:com.itxca.spannablex/SpanDsl/color/kotlin.Any?#kotlin.String#kotlin.Any?/PointingToDeclaration/-spannable-x/com.itxca.spannablex/-span-dsl/color.html +$dokka.location:com.itxca.spannablex/SpanDsl/image/kotlin.Any?#android.content.Context#android.graphics.Bitmap#android.widget.TextView?#com.itxca.spannablex.utils.DrawableSize?#kotlin.Any?/PointingToDeclaration/-spannable-x/com.itxca.spannablex/-span-dsl/image.html +$dokka.location:com.itxca.spannablex/SpanDsl/image/kotlin.Any?#android.content.Context#android.net.Uri#android.widget.TextView?#com.itxca.spannablex.utils.DrawableSize?#kotlin.Any?/PointingToDeclaration/-spannable-x/com.itxca.spannablex/-span-dsl/image.html +$dokka.location:com.itxca.spannablex/SpanDsl/image/kotlin.Any?#android.content.Context#kotlin.Int#android.widget.TextView?#com.itxca.spannablex.utils.DrawableSize?#kotlin.Any?/PointingToDeclaration/-spannable-x/com.itxca.spannablex/-span-dsl/image.html +$dokka.location:com.itxca.spannablex/SpanDsl/image/kotlin.Any?#android.graphics.drawable.Drawable#kotlin.String?#android.widget.TextView?#com.itxca.spannablex.utils.DrawableSize?#kotlin.Any?/PointingToDeclaration/-spannable-x/com.itxca.spannablex/-span-dsl/image.html +$dokka.location:com.itxca.spannablex/SpanDsl/maskFilter/kotlin.Any?#android.graphics.MaskFilter#kotlin.Any?/PointingToDeclaration/-spannable-x/com.itxca.spannablex/-span-dsl/mask-filter.html +$dokka.location:com.itxca.spannablex/SpanDsl/newline/TypeParam(bounds=[kotlin.Any?])?#kotlin.Int/PointingToDeclaration/-spannable-x/com.itxca.spannablex/-span-dsl/newline.html +$dokka.location:com.itxca.spannablex/SpanDsl/relativeSize/kotlin.Any?#kotlin.Float#kotlin.Any?/PointingToDeclaration/-spannable-x/com.itxca.spannablex/-span-dsl/relative-size.html +$dokka.location:com.itxca.spannablex/SpanDsl/scaleX/kotlin.Any?#kotlin.Float#kotlin.Any?/PointingToDeclaration/-spannable-x/com.itxca.spannablex/-span-dsl/scale-x.html +$dokka.location:com.itxca.spannablex/SpanDsl/span/kotlin.CharSequence?#kotlin.Any?#kotlin.Function1[com.itxca.spannablex.SpanDsl,kotlin.Unit]/PointingToDeclaration/-spannable-x/com.itxca.spannablex/-span-dsl/span.html +$dokka.location:com.itxca.spannablex/SpanDsl/strikethrough/kotlin.Any?#kotlin.Any?/PointingToDeclaration/-spannable-x/com.itxca.spannablex/-span-dsl/strikethrough.html +$dokka.location:com.itxca.spannablex/SpanDsl/style/kotlin.Any?#kotlin.Int#kotlin.Any?/PointingToDeclaration/-spannable-x/com.itxca.spannablex/-span-dsl/style.html +$dokka.location:com.itxca.spannablex/SpanDsl/subscript/kotlin.Any?#kotlin.Any?/PointingToDeclaration/-spannable-x/com.itxca.spannablex/-span-dsl/subscript.html +$dokka.location:com.itxca.spannablex/SpanDsl/suggestion/kotlin.Any?#android.content.Context#kotlin.Array[kotlin.String]#kotlin.Int#java.util.Locale?#java.lang.Class[*]?#kotlin.Any?/PointingToDeclaration/-spannable-x/com.itxca.spannablex/-span-dsl/suggestion.html +$dokka.location:com.itxca.spannablex/SpanDsl/superscript/kotlin.Any?#kotlin.Any?/PointingToDeclaration/-spannable-x/com.itxca.spannablex/-span-dsl/superscript.html +$dokka.location:com.itxca.spannablex/SpanDsl/text/kotlin.CharSequence?#/PointingToDeclaration/-spannable-x/com.itxca.spannablex/-span-dsl/text.html +$dokka.location:com.itxca.spannablex/SpanDsl/textAppearance/kotlin.Any?#kotlin.Int#kotlin.Int#kotlin.Int?#kotlin.String?#android.content.res.ColorStateList?#kotlin.Any?/PointingToDeclaration/-spannable-x/com.itxca.spannablex/-span-dsl/text-appearance.html +$dokka.location:com.itxca.spannablex/SpanDsl/textSpannable/#/PointingToDeclaration/-spannable-x/com.itxca.spannablex/-span-dsl/text-spannable.html +$dokka.location:com.itxca.spannablex/SpanDsl/typeface/kotlin.Any?#android.graphics.Typeface?#kotlin.String?#kotlin.Any?/PointingToDeclaration/-spannable-x/com.itxca.spannablex/-span-dsl/typeface.html +$dokka.location:com.itxca.spannablex/SpanDsl/underline/kotlin.Any?#kotlin.Any?/PointingToDeclaration/-spannable-x/com.itxca.spannablex/-span-dsl/underline.html +$dokka.location:com.itxca.spannablex/SpanDsl/url/kotlin.Any?#kotlin.String#kotlin.Any?/PointingToDeclaration/-spannable-x/com.itxca.spannablex/-span-dsl/url.html +com.itxca.spannablex +com.itxca.spannablex.annotation +com.itxca.spannablex.interfaces +com.itxca.spannablex.span +com.itxca.spannablex.utils + diff --git a/docs/api/images/anchor-copy-button.svg b/docs/api/images/anchor-copy-button.svg new file mode 100644 index 0000000..bab9d74 --- /dev/null +++ b/docs/api/images/anchor-copy-button.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/docs/api/images/arrow_down.svg b/docs/api/images/arrow_down.svg new file mode 100644 index 0000000..c0388de --- /dev/null +++ b/docs/api/images/arrow_down.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/docs/api/images/copy-icon.svg b/docs/api/images/copy-icon.svg new file mode 100644 index 0000000..61440f0 --- /dev/null +++ b/docs/api/images/copy-icon.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/docs/api/images/copy-successful-icon.svg b/docs/api/images/copy-successful-icon.svg new file mode 100644 index 0000000..1865f73 --- /dev/null +++ b/docs/api/images/copy-successful-icon.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/docs/api/images/footer-go-to-link.svg b/docs/api/images/footer-go-to-link.svg new file mode 100644 index 0000000..0137e22 --- /dev/null +++ b/docs/api/images/footer-go-to-link.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/docs/api/images/go-to-top-icon.svg b/docs/api/images/go-to-top-icon.svg new file mode 100644 index 0000000..d987f3e --- /dev/null +++ b/docs/api/images/go-to-top-icon.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/docs/api/images/logo-icon.svg b/docs/api/images/logo-icon.svg new file mode 100644 index 0000000..1fea087 --- /dev/null +++ b/docs/api/images/logo-icon.svg @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/docs/api/images/theme-toggle.svg b/docs/api/images/theme-toggle.svg new file mode 100644 index 0000000..2a8d750 --- /dev/null +++ b/docs/api/images/theme-toggle.svg @@ -0,0 +1,4 @@ + + + \ No newline at end of file diff --git a/docs/api/index.html b/docs/api/index.html new file mode 100644 index 0000000..a946b15 --- /dev/null +++ b/docs/api/index.html @@ -0,0 +1,108 @@ + + + + SpannableX + + + + +
+
+
+
+
+
+ +
+

SpannableX

+
+

Packages

+
+
+
+
+
+ + +
Link copied to clipboard
+
+
+
+
+
+
+ +
+
+
+
+ + +
Link copied to clipboard
+
+
+
+
+
+
+ +
+
+
+
+ + +
Link copied to clipboard
+
+
+
+
+
+
+ +
+
+
+
+ + +
Link copied to clipboard
+
+
+
+
+
+
+ +
+
+
+
+ + +
Link copied to clipboard
+
+
+
+
+
+
+
+
+ +
+
+ + + diff --git a/docs/api/navigation.html b/docs/api/navigation.html new file mode 100644 index 0000000..a4d38bf --- /dev/null +++ b/docs/api/navigation.html @@ -0,0 +1,97 @@ + + diff --git a/docs/api/scripts/clipboard.js b/docs/api/scripts/clipboard.js new file mode 100644 index 0000000..b00ce24 --- /dev/null +++ b/docs/api/scripts/clipboard.js @@ -0,0 +1,52 @@ +window.addEventListener('load', () => { + document.querySelectorAll('span.copy-icon').forEach(element => { + element.addEventListener('click', (el) => copyElementsContentToClipboard(element)); + }) + + document.querySelectorAll('span.anchor-icon').forEach(element => { + element.addEventListener('click', (el) => { + if(element.hasAttribute('pointing-to')){ + const location = hrefWithoutCurrentlyUsedAnchor() + '#' + element.getAttribute('pointing-to') + copyTextToClipboard(element, location) + } + }); + }) +}) + +const copyElementsContentToClipboard = (element) => { + const selection = window.getSelection(); + const range = document.createRange(); + range.selectNodeContents(element.parentNode.parentNode); + selection.removeAllRanges(); + selection.addRange(range); + + copyAndShowPopup(element, () => selection.removeAllRanges()) +} + +const copyTextToClipboard = (element, text) => { + var textarea = document.createElement("textarea"); + textarea.textContent = text; + textarea.style.position = "fixed"; + document.body.appendChild(textarea); + textarea.select(); + + copyAndShowPopup(element, () => document.body.removeChild(textarea)) +} + +const copyAndShowPopup = (element, after) => { + try { + document.execCommand('copy'); + element.nextElementSibling.classList.add('active-popup'); + setTimeout(() => { + element.nextElementSibling.classList.remove('active-popup'); + }, 1200); + } catch (e) { + console.error('Failed to write to clipboard:', e) + } + finally { + if(after) after() + } +} + +const hrefWithoutCurrentlyUsedAnchor = () => window.location.href.split('#')[0] + diff --git a/docs/api/scripts/main.js b/docs/api/scripts/main.js new file mode 100644 index 0000000..b3ee88c --- /dev/null +++ b/docs/api/scripts/main.js @@ -0,0 +1,44 @@ +(()=>{var e={8527:e=>{e.exports=''},5570:e=>{e.exports=''},107:e=>{e.exports=''},7224:e=>{e.exports=''},538:e=>{e.exports=''},1924:(e,n,t)=>{"use strict";var r=t(210),o=t(5559),i=o(r("String.prototype.indexOf"));e.exports=function(e,n){var t=r(e,!!n);return"function"==typeof t&&i(e,".prototype.")>-1?o(t):t}},5559:(e,n,t)=>{"use strict";var r=t(8612),o=t(210),i=o("%Function.prototype.apply%"),a=o("%Function.prototype.call%"),l=o("%Reflect.apply%",!0)||r.call(a,i),c=o("%Object.getOwnPropertyDescriptor%",!0),u=o("%Object.defineProperty%",!0),s=o("%Math.max%");if(u)try{u({},"a",{value:1})}catch(e){u=null}e.exports=function(e){var n=l(r,a,arguments);if(c&&u){var t=c(n,"length");t.configurable&&u(n,"length",{value:1+s(0,e.length-(arguments.length-1))})}return n};var f=function(){return l(r,i,arguments)};u?u(e.exports,"apply",{value:f}):e.exports.apply=f},4184:(e,n)=>{var t; +/*! + Copyright (c) 2018 Jed Watson. + Licensed under the MIT License (MIT), see + http://jedwatson.github.io/classnames +*/!function(){"use strict";var r={}.hasOwnProperty;function o(){for(var e=[],n=0;n{"use strict";e.exports=function(e,n){var t=this,r=t.constructor;return t.options=Object.assign({storeInstancesGlobally:!0},n||{}),t.callbacks={},t.directMap={},t.sequenceLevels={},t.resetTimer=null,t.ignoreNextKeyup=!1,t.ignoreNextKeypress=!1,t.nextExpectedAction=!1,t.element=e,t.addEvents(),t.options.storeInstancesGlobally&&r.instances.push(t),t},e.exports.prototype.bind=t(2207),e.exports.prototype.bindMultiple=t(3396),e.exports.prototype.unbind=t(9208),e.exports.prototype.trigger=t(9855),e.exports.prototype.reset=t(6214),e.exports.prototype.stopCallback=t(3450),e.exports.prototype.handleKey=t(3067),e.exports.prototype.addEvents=t(718),e.exports.prototype.bindSingle=t(8763),e.exports.prototype.getKeyInfo=t(5825),e.exports.prototype.pickBestAction=t(8608),e.exports.prototype.getReverseMap=t(3956),e.exports.prototype.getMatches=t(3373),e.exports.prototype.resetSequences=t(3346),e.exports.prototype.fireCallback=t(2684),e.exports.prototype.bindSequence=t(7103),e.exports.prototype.resetSequenceTimer=t(7309),e.exports.prototype.detach=t(7554),e.exports.instances=[],e.exports.reset=t(1822),e.exports.REVERSE_MAP=null},718:(e,n,t)=>{"use strict";e.exports=function(){var e=this,n=t(4323),r=e.element;e.eventHandler=t(9646).bind(e),n(r,"keypress",e.eventHandler),n(r,"keydown",e.eventHandler),n(r,"keyup",e.eventHandler)}},2207:e=>{"use strict";e.exports=function(e,n,t){return e=e instanceof Array?e:[e],this.bindMultiple(e,n,t),this}},3396:e=>{"use strict";e.exports=function(e,n,t){for(var r=0;r{"use strict";e.exports=function(e,n,r,o){var i=this;function a(n){return function(){i.nextExpectedAction=n,++i.sequenceLevels[e],i.resetSequenceTimer()}}function l(n){var a;i.fireCallback(r,n,e),"keyup"!==o&&(a=t(6770),i.ignoreNextKeyup=a(n)),setTimeout((function(){i.resetSequences()}),10)}i.sequenceLevels[e]=0;for(var c=0;c{"use strict";e.exports=function(e,n,t,r,o){var i=this;i.directMap[e+":"+t]=n;var a,l=(e=e.replace(/\s+/g," ")).split(" ");l.length>1?i.bindSequence(e,l,n,t):(a=i.getKeyInfo(e,t),i.callbacks[a.key]=i.callbacks[a.key]||[],i.getMatches(a.key,a.modifiers,{type:a.action},r,e,o),i.callbacks[a.key][r?"unshift":"push"]({callback:n,modifiers:a.modifiers,action:a.action,seq:r,level:o,combo:e}))}},7554:(e,n,t)=>{var r=t(4323).off;e.exports=function(){var e=this,n=e.element;r(n,"keypress",e.eventHandler),r(n,"keydown",e.eventHandler),r(n,"keyup",e.eventHandler)}},4323:e=>{function n(e,n,t,r){return!e.addEventListener&&(n="on"+n),(e.addEventListener||e.attachEvent).call(e,n,t,r),t}e.exports=n,e.exports.on=n,e.exports.off=function(e,n,t,r){return!e.removeEventListener&&(n="on"+n),(e.removeEventListener||e.detachEvent).call(e,n,t,r),t}},2684:(e,n,t)=>{"use strict";e.exports=function(e,n,r,o){this.stopCallback(n,n.target||n.srcElement,r,o)||!1===e(n,r)&&(t(1350)(n),t(6103)(n))}},5825:(e,n,t)=>{"use strict";e.exports=function(e,n){var r,o,i,a,l,c,u=[];for(r=t(4520)(e),a=t(7549),l=t(5355),c=t(8581),i=0;i{"use strict";e.exports=function(e,n,r,o,i,a){var l,c,u,s,f=this,p=[],d=r.type;"keypress"!==d||r.code&&"Arrow"===r.code.slice(0,5)||(f.callbacks["any-character"]||[]).forEach((function(e){p.push(e)}));if(!f.callbacks[e])return p;for(u=t(8581),"keyup"===d&&u(e)&&(n=[e]),l=0;l{"use strict";e.exports=function(){var e,n=this.constructor;if(!n.REVERSE_MAP)for(var r in n.REVERSE_MAP={},e=t(4766))r>95&&r<112||e.hasOwnProperty(r)&&(n.REVERSE_MAP[e[r]]=r);return n.REVERSE_MAP}},3067:(e,n,t)=>{"use strict";e.exports=function(e,n,r){var o,i,a,l,c=this,u={},s=0,f=!1;for(o=c.getMatches(e,n,r),i=0;i{"use strict";e.exports=function(e){var n,r=this;"number"!=typeof e.which&&(e.which=e.keyCode);var o=t(6770)(e);void 0!==o&&("keyup"!==e.type||r.ignoreNextKeyup!==o?(n=t(4610),r.handleKey(o,n(e),e)):r.ignoreNextKeyup=!1)}},5532:e=>{"use strict";e.exports=function(e,n){return e.sort().join(",")===n.sort().join(",")}},8608:e=>{"use strict";e.exports=function(e,n,t){return t||(t=this.getReverseMap()[e]?"keydown":"keypress"),"keypress"===t&&n.length&&(t="keydown"),t}},6214:e=>{"use strict";e.exports=function(){return this.callbacks={},this.directMap={},this}},7309:e=>{"use strict";e.exports=function(){var e=this;clearTimeout(e.resetTimer),e.resetTimer=setTimeout((function(){e.resetSequences()}),1e3)}},3346:e=>{"use strict";e.exports=function(e){var n=this;e=e||{};var t,r=!1;for(t in n.sequenceLevels)e[t]?r=!0:n.sequenceLevels[t]=0;r||(n.nextExpectedAction=!1)}},3450:e=>{"use strict";e.exports=function(e,n){if((" "+n.className+" ").indexOf(" combokeys ")>-1)return!1;var t=n.tagName.toLowerCase();return"input"===t||"select"===t||"textarea"===t||n.isContentEditable}},9855:e=>{"use strict";e.exports=function(e,n){return this.directMap[e+":"+n]&&this.directMap[e+":"+n]({},e),this}},9208:e=>{"use strict";e.exports=function(e,n){return this.bind(e,(function(){}),n)}},1822:e=>{"use strict";e.exports=function(){this.instances.forEach((function(e){e.reset()}))}},6770:(e,n,t)=>{"use strict";e.exports=function(e){var n,r;if(n=t(4766),r=t(5295),"keypress"===e.type){var o=String.fromCharCode(e.which);return e.shiftKey||(o=o.toLowerCase()),o}return void 0!==n[e.which]?n[e.which]:void 0!==r[e.which]?r[e.which]:String.fromCharCode(e.which).toLowerCase()}},4610:e=>{"use strict";e.exports=function(e){var n=[];return e.shiftKey&&n.push("shift"),e.altKey&&n.push("alt"),e.ctrlKey&&n.push("ctrl"),e.metaKey&&n.push("meta"),n}},8581:e=>{"use strict";e.exports=function(e){return"shift"===e||"ctrl"===e||"alt"===e||"meta"===e}},4520:e=>{"use strict";e.exports=function(e){return"+"===e?["+"]:e.split("+")}},1350:e=>{"use strict";e.exports=function(e){e.preventDefault?e.preventDefault():e.returnValue=!1}},5355:e=>{"use strict";e.exports={"~":"`","!":"1","@":"2","#":"3",$:"4","%":"5","^":"6","&":"7","*":"8","(":"9",")":"0",_:"-","+":"=",":":";",'"':"'","<":",",">":".","?":"/","|":"\\"}},7549:e=>{"use strict";e.exports={option:"alt",command:"meta",return:"enter",escape:"esc",mod:/Mac|iPod|iPhone|iPad/.test(navigator.platform)?"meta":"ctrl"}},5295:e=>{"use strict";e.exports={106:"*",107:"plus",109:"minus",110:".",111:"/",186:";",187:"=",188:",",189:"-",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:"'"}},4766:e=>{"use strict";e.exports={8:"backspace",9:"tab",13:"enter",16:"shift",17:"ctrl",18:"alt",20:"capslock",27:"esc",32:"space",33:"pageup",34:"pagedown",35:"end",36:"home",37:"left",38:"up",39:"right",40:"down",45:"ins",46:"del",91:"meta",93:"meta",173:"minus",187:"plus",189:"minus",224:"meta"};for(var n=1;n<20;++n)e.exports[111+n]="f"+n;for(n=0;n<=9;++n)e.exports[n+96]=n},6103:e=>{"use strict";e.exports=function(e){e.stopPropagation?e.stopPropagation():e.cancelBubble=!0}},3362:()=>{var e;!function(){var e=Math.PI,n=2*e,t=e/180,r=document.createElement("div");document.head.appendChild(r);var o=self.ConicGradient=function(e){o.all.push(this),e=e||{},this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),this.repeating=!!e.repeating,this.size=e.size||Math.max(innerWidth,innerHeight),this.canvas.width=this.canvas.height=this.size;var n=e.stops;this.stops=(n||"").split(/\s*,(?![^(]*\))\s*/),this.from=0;for(var t=0;t0){var i=this.stops[0].clone();i.pos=0,this.stops.unshift(i)}if(void 0===this.stops[this.stops.length-1].pos)this.stops[this.stops.length-1].pos=1;else if(!this.repeating&&this.stops[this.stops.length-1].pos<1){var a=this.stops[this.stops.length-1].clone();a.pos=1,this.stops.push(a)}if(this.stops.forEach((function(e,n){if(void 0===e.pos){for(var t=n+1;this[t];t++)if(void 0!==this[t].pos){e.pos=this[n-1].pos+(this[t].pos-this[n-1].pos)/(t-n+1);break}}else n>0&&(e.pos=Math.max(e.pos,this[n-1].pos))}),this.stops),this.repeating){var l=(n=this.stops.slice())[n.length-1].pos-n[0].pos;for(t=0;this.stops[this.stops.length-1].pos<1&&t<1e4;t++)for(var c=0;c'},get png(){return this.canvas.toDataURL()},get r(){return Math.sqrt(2)*this.size/2},paint:function(){var e,n,r,o=this.context,i=this.r,a=this.size/2,l=0,c=this.stops[l];o.translate(this.size/2,this.size/2),o.rotate(-90*t),o.rotate(this.from*t),o.translate(-this.size/2,-this.size/2);for(var u=0;u<360;){if(u/360+1e-5>=c.pos){do{e=c,l++,c=this.stops[l]}while(c&&c!=e&&c.pos===e.pos);if(!c)break;var s=e.color+""==c.color+""&&e!=c;n=e.color.map((function(e,n){return c.color[n]-e}))}r=(u/360-e.pos)/(c.pos-e.pos);var f=s?c.color:n.map((function(n,t){var o=n*r+e.color[t];return t<3?255&o:o}));if(o.fillStyle="rgba("+f.join(",")+")",o.beginPath(),o.moveTo(a,a),s)var p=360*(c.pos-e.pos);else p=.5;var d=u*t,h=(d=Math.min(360*t,d))+p*t;h=Math.min(360*t,h+.02),o.arc(a,a,i,d,h),o.closePath(),o.fill(),u+=p}}},o.ColorStop=function(e,t){if(this.gradient=e,t){var r=t.match(/^(.+?)(?:\s+([\d.]+)(%|deg|turn|grad|rad)?)?(?:\s+([\d.]+)(%|deg|turn|grad|rad)?)?\s*$/);if(this.color=o.ColorStop.colorToRGBA(r[1]),r[2]){var i=r[3];"%"==i||"0"===r[2]&&!i?this.pos=r[2]/100:"turn"==i?this.pos=+r[2]:"deg"==i?this.pos=r[2]/360:"grad"==i?this.pos=r[2]/400:"rad"==i&&(this.pos=r[2]/n)}r[4]&&(this.next=new o.ColorStop(e,r[1]+" "+r[4]+r[5]))}},o.ColorStop.prototype={clone:function(){var e=new o.ColorStop(this.gradient);return e.color=this.color,e.pos=this.pos,e},toString:function(){return"rgba("+this.color.join(", ")+") "+100*this.pos+"%"}},o.ColorStop.colorToRGBA=function(e){if(!Array.isArray(e)&&-1==e.indexOf("from")){r.style.color=e;var n=getComputedStyle(r).color.match(/rgba?\(([\d.]+), ([\d.]+), ([\d.]+)(?:, ([\d.]+))?\)/);return n&&(n.shift(),(n=n.map((function(e){return+e})))[3]=isNaN(n[3])?1:n[3]),n||[0,0,0,0]}return e}}(),self.StyleFix&&((e=document.createElement("p")).style.backgroundImage="conic-gradient(white, black)",e.style.backgroundImage=PrefixFree.prefix+"conic-gradient(white, black)",e.style.backgroundImage||StyleFix.register((function(e,n){return e.indexOf("conic-gradient")>-1&&(e=e.replace(/(?:repeating-)?conic-gradient\(\s*((?:\([^()]+\)|[^;()}])+?)\)/g,(function(e,n){return new ConicGradient({stops:n,repeating:e.indexOf("repeating-")>-1})}))),e})))},9662:(e,n,t)=>{var r=t(7854),o=t(614),i=t(6330),a=r.TypeError;e.exports=function(e){if(o(e))return e;throw a(i(e)+" is not a function")}},9483:(e,n,t)=>{var r=t(7854),o=t(4411),i=t(6330),a=r.TypeError;e.exports=function(e){if(o(e))return e;throw a(i(e)+" is not a constructor")}},6077:(e,n,t)=>{var r=t(7854),o=t(614),i=r.String,a=r.TypeError;e.exports=function(e){if("object"==typeof e||o(e))return e;throw a("Can't set "+i(e)+" as a prototype")}},1223:(e,n,t)=>{var r=t(5112),o=t(30),i=t(3070),a=r("unscopables"),l=Array.prototype;null==l[a]&&i.f(l,a,{configurable:!0,value:o(null)}),e.exports=function(e){l[a][e]=!0}},1530:(e,n,t)=>{"use strict";var r=t(8710).charAt;e.exports=function(e,n,t){return n+(t?r(e,n).length:1)}},5787:(e,n,t)=>{var r=t(7854),o=t(7976),i=r.TypeError;e.exports=function(e,n){if(o(n,e))return e;throw i("Incorrect invocation")}},9670:(e,n,t)=>{var r=t(7854),o=t(111),i=r.String,a=r.TypeError;e.exports=function(e){if(o(e))return e;throw a(i(e)+" is not an object")}},7556:(e,n,t)=>{var r=t(7293);e.exports=r((function(){if("function"==typeof ArrayBuffer){var e=new ArrayBuffer(8);Object.isExtensible(e)&&Object.defineProperty(e,"a",{value:8})}}))},8533:(e,n,t)=>{"use strict";var r=t(2092).forEach,o=t(9341)("forEach");e.exports=o?[].forEach:function(e){return r(this,e,arguments.length>1?arguments[1]:void 0)}},8457:(e,n,t)=>{"use strict";var r=t(7854),o=t(9974),i=t(6916),a=t(7908),l=t(3411),c=t(7659),u=t(4411),s=t(6244),f=t(6135),p=t(8554),d=t(1246),h=r.Array;e.exports=function(e){var n=a(e),t=u(this),r=arguments.length,g=r>1?arguments[1]:void 0,v=void 0!==g;v&&(g=o(g,r>2?arguments[2]:void 0));var A,b,m,y,E,_,C=d(n),w=0;if(!C||this==h&&c(C))for(A=s(n),b=t?new this(A):h(A);A>w;w++)_=v?g(n[w],w):n[w],f(b,w,_);else for(E=(y=p(n,C)).next,b=t?new this:[];!(m=i(E,y)).done;w++)_=v?l(y,g,[m.value,w],!0):m.value,f(b,w,_);return b.length=w,b}},1318:(e,n,t)=>{var r=t(5656),o=t(1400),i=t(6244),a=function(e){return function(n,t,a){var l,c=r(n),u=i(c),s=o(a,u);if(e&&t!=t){for(;u>s;)if((l=c[s++])!=l)return!0}else for(;u>s;s++)if((e||s in c)&&c[s]===t)return e||s||0;return!e&&-1}};e.exports={includes:a(!0),indexOf:a(!1)}},2092:(e,n,t)=>{var r=t(9974),o=t(1702),i=t(8361),a=t(7908),l=t(6244),c=t(5417),u=o([].push),s=function(e){var n=1==e,t=2==e,o=3==e,s=4==e,f=6==e,p=7==e,d=5==e||f;return function(h,g,v,A){for(var b,m,y=a(h),E=i(y),_=r(g,v),C=l(E),w=0,x=A||c,k=n?x(h,C):t||p?x(h,0):void 0;C>w;w++)if((d||w in E)&&(m=_(b=E[w],w,y),e))if(n)k[w]=m;else if(m)switch(e){case 3:return!0;case 5:return b;case 6:return w;case 2:u(k,b)}else switch(e){case 4:return!1;case 7:u(k,b)}return f?-1:o||s?s:k}};e.exports={forEach:s(0),map:s(1),filter:s(2),some:s(3),every:s(4),find:s(5),findIndex:s(6),filterReject:s(7)}},1194:(e,n,t)=>{var r=t(7293),o=t(5112),i=t(7392),a=o("species");e.exports=function(e){return i>=51||!r((function(){var n=[];return(n.constructor={})[a]=function(){return{foo:1}},1!==n[e](Boolean).foo}))}},9341:(e,n,t)=>{"use strict";var r=t(7293);e.exports=function(e,n){var t=[][e];return!!t&&r((function(){t.call(null,n||function(){throw 1},1)}))}},3671:(e,n,t)=>{var r=t(7854),o=t(9662),i=t(7908),a=t(8361),l=t(6244),c=r.TypeError,u=function(e){return function(n,t,r,u){o(t);var s=i(n),f=a(s),p=l(s),d=e?p-1:0,h=e?-1:1;if(r<2)for(;;){if(d in f){u=f[d],d+=h;break}if(d+=h,e?d<0:p<=d)throw c("Reduce of empty array with no initial value")}for(;e?d>=0:p>d;d+=h)d in f&&(u=t(u,f[d],d,s));return u}};e.exports={left:u(!1),right:u(!0)}},206:(e,n,t)=>{var r=t(1702);e.exports=r([].slice)},4362:(e,n,t)=>{var r=t(206),o=Math.floor,i=function(e,n){var t=e.length,c=o(t/2);return t<8?a(e,n):l(e,i(r(e,0,c),n),i(r(e,c),n),n)},a=function(e,n){for(var t,r,o=e.length,i=1;i0;)e[r]=e[--r];r!==i++&&(e[r]=t)}return e},l=function(e,n,t,r){for(var o=n.length,i=t.length,a=0,l=0;a{var r=t(7854),o=t(3157),i=t(4411),a=t(111),l=t(5112)("species"),c=r.Array;e.exports=function(e){var n;return o(e)&&(n=e.constructor,(i(n)&&(n===c||o(n.prototype))||a(n)&&null===(n=n[l]))&&(n=void 0)),void 0===n?c:n}},5417:(e,n,t)=>{var r=t(7475);e.exports=function(e,n){return new(r(e))(0===n?0:n)}},3411:(e,n,t)=>{var r=t(9670),o=t(9212);e.exports=function(e,n,t,i){try{return i?n(r(t)[0],t[1]):n(t)}catch(n){o(e,"throw",n)}}},7072:(e,n,t)=>{var r=t(5112)("iterator"),o=!1;try{var i=0,a={next:function(){return{done:!!i++}},return:function(){o=!0}};a[r]=function(){return this},Array.from(a,(function(){throw 2}))}catch(e){}e.exports=function(e,n){if(!n&&!o)return!1;var t=!1;try{var i={};i[r]=function(){return{next:function(){return{done:t=!0}}}},e(i)}catch(e){}return t}},4326:(e,n,t)=>{var r=t(1702),o=r({}.toString),i=r("".slice);e.exports=function(e){return i(o(e),8,-1)}},648:(e,n,t)=>{var r=t(7854),o=t(1694),i=t(614),a=t(4326),l=t(5112)("toStringTag"),c=r.Object,u="Arguments"==a(function(){return arguments}());e.exports=o?a:function(e){var n,t,r;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(t=function(e,n){try{return e[n]}catch(e){}}(n=c(e),l))?t:u?a(n):"Object"==(r=a(n))&&i(n.callee)?"Arguments":r}},5631:(e,n,t)=>{"use strict";var r=t(3070).f,o=t(30),i=t(2248),a=t(9974),l=t(5787),c=t(408),u=t(654),s=t(6340),f=t(9781),p=t(2423).fastKey,d=t(9909),h=d.set,g=d.getterFor;e.exports={getConstructor:function(e,n,t,u){var s=e((function(e,r){l(e,d),h(e,{type:n,index:o(null),first:void 0,last:void 0,size:0}),f||(e.size=0),null!=r&&c(r,e[u],{that:e,AS_ENTRIES:t})})),d=s.prototype,v=g(n),A=function(e,n,t){var r,o,i=v(e),a=b(e,n);return a?a.value=t:(i.last=a={index:o=p(n,!0),key:n,value:t,previous:r=i.last,next:void 0,removed:!1},i.first||(i.first=a),r&&(r.next=a),f?i.size++:e.size++,"F"!==o&&(i.index[o]=a)),e},b=function(e,n){var t,r=v(e),o=p(n);if("F"!==o)return r.index[o];for(t=r.first;t;t=t.next)if(t.key==n)return t};return i(d,{clear:function(){for(var e=v(this),n=e.index,t=e.first;t;)t.removed=!0,t.previous&&(t.previous=t.previous.next=void 0),delete n[t.index],t=t.next;e.first=e.last=void 0,f?e.size=0:this.size=0},delete:function(e){var n=this,t=v(n),r=b(n,e);if(r){var o=r.next,i=r.previous;delete t.index[r.index],r.removed=!0,i&&(i.next=o),o&&(o.previous=i),t.first==r&&(t.first=o),t.last==r&&(t.last=i),f?t.size--:n.size--}return!!r},forEach:function(e){for(var n,t=v(this),r=a(e,arguments.length>1?arguments[1]:void 0);n=n?n.next:t.first;)for(r(n.value,n.key,this);n&&n.removed;)n=n.previous},has:function(e){return!!b(this,e)}}),i(d,t?{get:function(e){var n=b(this,e);return n&&n.value},set:function(e,n){return A(this,0===e?0:e,n)}}:{add:function(e){return A(this,e=0===e?0:e,e)}}),f&&r(d,"size",{get:function(){return v(this).size}}),s},setStrong:function(e,n,t){var r=n+" Iterator",o=g(n),i=g(r);u(e,n,(function(e,n){h(this,{type:r,target:e,state:o(e),kind:n,last:void 0})}),(function(){for(var e=i(this),n=e.kind,t=e.last;t&&t.removed;)t=t.previous;return e.target&&(e.last=t=t?t.next:e.state.first)?"keys"==n?{value:t.key,done:!1}:"values"==n?{value:t.value,done:!1}:{value:[t.key,t.value],done:!1}:(e.target=void 0,{value:void 0,done:!0})}),t?"entries":"values",!t,!0),s(n)}}},9320:(e,n,t)=>{"use strict";var r=t(1702),o=t(2248),i=t(2423).getWeakData,a=t(9670),l=t(111),c=t(5787),u=t(408),s=t(2092),f=t(2597),p=t(9909),d=p.set,h=p.getterFor,g=s.find,v=s.findIndex,A=r([].splice),b=0,m=function(e){return e.frozen||(e.frozen=new y)},y=function(){this.entries=[]},E=function(e,n){return g(e.entries,(function(e){return e[0]===n}))};y.prototype={get:function(e){var n=E(this,e);if(n)return n[1]},has:function(e){return!!E(this,e)},set:function(e,n){var t=E(this,e);t?t[1]=n:this.entries.push([e,n])},delete:function(e){var n=v(this.entries,(function(n){return n[0]===e}));return~n&&A(this.entries,n,1),!!~n}},e.exports={getConstructor:function(e,n,t,r){var s=e((function(e,o){c(e,p),d(e,{type:n,id:b++,frozen:void 0}),null!=o&&u(o,e[r],{that:e,AS_ENTRIES:t})})),p=s.prototype,g=h(n),v=function(e,n,t){var r=g(e),o=i(a(n),!0);return!0===o?m(r).set(n,t):o[r.id]=t,e};return o(p,{delete:function(e){var n=g(this);if(!l(e))return!1;var t=i(e);return!0===t?m(n).delete(e):t&&f(t,n.id)&&delete t[n.id]},has:function(e){var n=g(this);if(!l(e))return!1;var t=i(e);return!0===t?m(n).has(e):t&&f(t,n.id)}}),o(p,t?{get:function(e){var n=g(this);if(l(e)){var t=i(e);return!0===t?m(n).get(e):t?t[n.id]:void 0}},set:function(e,n){return v(this,e,n)}}:{add:function(e){return v(this,e,!0)}}),s}}},7710:(e,n,t)=>{"use strict";var r=t(2109),o=t(7854),i=t(1702),a=t(4705),l=t(1320),c=t(2423),u=t(408),s=t(5787),f=t(614),p=t(111),d=t(7293),h=t(7072),g=t(8003),v=t(9587);e.exports=function(e,n,t){var A=-1!==e.indexOf("Map"),b=-1!==e.indexOf("Weak"),m=A?"set":"add",y=o[e],E=y&&y.prototype,_=y,C={},w=function(e){var n=i(E[e]);l(E,e,"add"==e?function(e){return n(this,0===e?0:e),this}:"delete"==e?function(e){return!(b&&!p(e))&&n(this,0===e?0:e)}:"get"==e?function(e){return b&&!p(e)?void 0:n(this,0===e?0:e)}:"has"==e?function(e){return!(b&&!p(e))&&n(this,0===e?0:e)}:function(e,t){return n(this,0===e?0:e,t),this})};if(a(e,!f(y)||!(b||E.forEach&&!d((function(){(new y).entries().next()})))))_=t.getConstructor(n,e,A,m),c.enable();else if(a(e,!0)){var x=new _,k=x[m](b?{}:-0,1)!=x,S=d((function(){x.has(1)})),O=h((function(e){new y(e)})),B=!b&&d((function(){for(var e=new y,n=5;n--;)e[m](n,n);return!e.has(-0)}));O||((_=n((function(e,n){s(e,E);var t=v(new y,e,_);return null!=n&&u(n,t[m],{that:t,AS_ENTRIES:A}),t}))).prototype=E,E.constructor=_),(S||B)&&(w("delete"),w("has"),A&&w("get")),(B||k)&&w(m),b&&E.clear&&delete E.clear}return C[e]=_,r({global:!0,forced:_!=y},C),g(_,e),b||t.setStrong(_,e,A),_}},9920:(e,n,t)=>{var r=t(2597),o=t(3887),i=t(1236),a=t(3070);e.exports=function(e,n){for(var t=o(n),l=a.f,c=i.f,u=0;u{var r=t(5112)("match");e.exports=function(e){var n=/./;try{"/./"[e](n)}catch(t){try{return n[r]=!1,"/./"[e](n)}catch(e){}}return!1}},8544:(e,n,t)=>{var r=t(7293);e.exports=!r((function(){function e(){}return e.prototype.constructor=null,Object.getPrototypeOf(new e)!==e.prototype}))},4230:(e,n,t)=>{var r=t(1702),o=t(4488),i=t(1340),a=/"/g,l=r("".replace);e.exports=function(e,n,t,r){var c=i(o(e)),u="<"+n;return""!==t&&(u+=" "+t+'="'+l(i(r),a,""")+'"'),u+">"+c+""}},4994:(e,n,t)=>{"use strict";var r=t(3383).IteratorPrototype,o=t(30),i=t(9114),a=t(8003),l=t(7497),c=function(){return this};e.exports=function(e,n,t){var u=n+" Iterator";return e.prototype=o(r,{next:i(1,t)}),a(e,u,!1,!0),l[u]=c,e}},8880:(e,n,t)=>{var r=t(9781),o=t(3070),i=t(9114);e.exports=r?function(e,n,t){return o.f(e,n,i(1,t))}:function(e,n,t){return e[n]=t,e}},9114:e=>{e.exports=function(e,n){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:n}}},6135:(e,n,t)=>{"use strict";var r=t(4948),o=t(3070),i=t(9114);e.exports=function(e,n,t){var a=r(n);a in e?o.f(e,a,i(0,t)):e[a]=t}},8709:(e,n,t)=>{"use strict";var r=t(7854),o=t(9670),i=t(2140),a=r.TypeError;e.exports=function(e){if(o(this),"string"===e||"default"===e)e="string";else if("number"!==e)throw a("Incorrect hint");return i(this,e)}},654:(e,n,t)=>{"use strict";var r=t(2109),o=t(6916),i=t(1913),a=t(6530),l=t(614),c=t(4994),u=t(9518),s=t(7674),f=t(8003),p=t(8880),d=t(1320),h=t(5112),g=t(7497),v=t(3383),A=a.PROPER,b=a.CONFIGURABLE,m=v.IteratorPrototype,y=v.BUGGY_SAFARI_ITERATORS,E=h("iterator"),_="keys",C="values",w="entries",x=function(){return this};e.exports=function(e,n,t,a,h,v,k){c(t,n,a);var S,O,B,I=function(e){if(e===h&&R)return R;if(!y&&e in j)return j[e];switch(e){case _:case C:case w:return function(){return new t(this,e)}}return function(){return new t(this)}},T=n+" Iterator",P=!1,j=e.prototype,z=j[E]||j["@@iterator"]||h&&j[h],R=!y&&z||I(h),M="Array"==n&&j.entries||z;if(M&&(S=u(M.call(new e)))!==Object.prototype&&S.next&&(i||u(S)===m||(s?s(S,m):l(S[E])||d(S,E,x)),f(S,T,!0,!0),i&&(g[T]=x)),A&&h==C&&z&&z.name!==C&&(!i&&b?p(j,"name",C):(P=!0,R=function(){return o(z,this)})),h)if(O={values:I(C),keys:v?R:I(_),entries:I(w)},k)for(B in O)(y||P||!(B in j))&&d(j,B,O[B]);else r({target:n,proto:!0,forced:y||P},O);return i&&!k||j[E]===R||d(j,E,R,{name:h}),g[n]=R,O}},7235:(e,n,t)=>{var r=t(857),o=t(2597),i=t(6061),a=t(3070).f;e.exports=function(e){var n=r.Symbol||(r.Symbol={});o(n,e)||a(n,e,{value:i.f(e)})}},9781:(e,n,t)=>{var r=t(7293);e.exports=!r((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]}))},317:(e,n,t)=>{var r=t(7854),o=t(111),i=r.document,a=o(i)&&o(i.createElement);e.exports=function(e){return a?i.createElement(e):{}}},8324:e=>{e.exports={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0}},8509:(e,n,t)=>{var r=t(317)("span").classList,o=r&&r.constructor&&r.constructor.prototype;e.exports=o===Object.prototype?void 0:o},8886:(e,n,t)=>{var r=t(8113).match(/firefox\/(\d+)/i);e.exports=!!r&&+r[1]},256:(e,n,t)=>{var r=t(8113);e.exports=/MSIE|Trident/.test(r)},5268:(e,n,t)=>{var r=t(4326),o=t(7854);e.exports="process"==r(o.process)},8113:(e,n,t)=>{var r=t(5005);e.exports=r("navigator","userAgent")||""},7392:(e,n,t)=>{var r,o,i=t(7854),a=t(8113),l=i.process,c=i.Deno,u=l&&l.versions||c&&c.version,s=u&&u.v8;s&&(o=(r=s.split("."))[0]>0&&r[0]<4?1:+(r[0]+r[1])),!o&&a&&(!(r=a.match(/Edge\/(\d+)/))||r[1]>=74)&&(r=a.match(/Chrome\/(\d+)/))&&(o=+r[1]),e.exports=o},8008:(e,n,t)=>{var r=t(8113).match(/AppleWebKit\/(\d+)\./);e.exports=!!r&&+r[1]},748:e=>{e.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},2109:(e,n,t)=>{var r=t(7854),o=t(1236).f,i=t(8880),a=t(1320),l=t(3505),c=t(9920),u=t(4705);e.exports=function(e,n){var t,s,f,p,d,h=e.target,g=e.global,v=e.stat;if(t=g?r:v?r[h]||l(h,{}):(r[h]||{}).prototype)for(s in n){if(p=n[s],f=e.noTargetGet?(d=o(t,s))&&d.value:t[s],!u(g?s:h+(v?".":"#")+s,e.forced)&&void 0!==f){if(typeof p==typeof f)continue;c(p,f)}(e.sham||f&&f.sham)&&i(p,"sham",!0),a(t,s,p,e)}}},7293:e=>{e.exports=function(e){try{return!!e()}catch(e){return!0}}},7007:(e,n,t)=>{"use strict";t(4916);var r=t(1702),o=t(1320),i=t(2261),a=t(7293),l=t(5112),c=t(8880),u=l("species"),s=RegExp.prototype;e.exports=function(e,n,t,f){var p=l(e),d=!a((function(){var n={};return n[p]=function(){return 7},7!=""[e](n)})),h=d&&!a((function(){var n=!1,t=/a/;return"split"===e&&((t={}).constructor={},t.constructor[u]=function(){return t},t.flags="",t[p]=/./[p]),t.exec=function(){return n=!0,null},t[p](""),!n}));if(!d||!h||t){var g=r(/./[p]),v=n(p,""[e],(function(e,n,t,o,a){var l=r(e),c=n.exec;return c===i||c===s.exec?d&&!a?{done:!0,value:g(n,t,o)}:{done:!0,value:l(t,n,o)}:{done:!1}}));o(String.prototype,e,v[0]),o(s,p,v[1])}f&&c(s[p],"sham",!0)}},6677:(e,n,t)=>{var r=t(7293);e.exports=!r((function(){return Object.isExtensible(Object.preventExtensions({}))}))},2104:e=>{var n=Function.prototype,t=n.apply,r=n.bind,o=n.call;e.exports="object"==typeof Reflect&&Reflect.apply||(r?o.bind(t):function(){return o.apply(t,arguments)})},9974:(e,n,t)=>{var r=t(1702),o=t(9662),i=r(r.bind);e.exports=function(e,n){return o(e),void 0===n?e:i?i(e,n):function(){return e.apply(n,arguments)}}},7065:(e,n,t)=>{"use strict";var r=t(7854),o=t(1702),i=t(9662),a=t(111),l=t(2597),c=t(206),u=r.Function,s=o([].concat),f=o([].join),p={},d=function(e,n,t){if(!l(p,n)){for(var r=[],o=0;o{var n=Function.prototype.call;e.exports=n.bind?n.bind(n):function(){return n.apply(n,arguments)}},6530:(e,n,t)=>{var r=t(9781),o=t(2597),i=Function.prototype,a=r&&Object.getOwnPropertyDescriptor,l=o(i,"name"),c=l&&"something"===function(){}.name,u=l&&(!r||r&&a(i,"name").configurable);e.exports={EXISTS:l,PROPER:c,CONFIGURABLE:u}},1702:e=>{var n=Function.prototype,t=n.bind,r=n.call,o=t&&t.bind(r);e.exports=t?function(e){return e&&o(r,e)}:function(e){return e&&function(){return r.apply(e,arguments)}}},5005:(e,n,t)=>{var r=t(7854),o=t(614),i=function(e){return o(e)?e:void 0};e.exports=function(e,n){return arguments.length<2?i(r[e]):r[e]&&r[e][n]}},1246:(e,n,t)=>{var r=t(648),o=t(8173),i=t(7497),a=t(5112)("iterator");e.exports=function(e){if(null!=e)return o(e,a)||o(e,"@@iterator")||i[r(e)]}},8554:(e,n,t)=>{var r=t(7854),o=t(6916),i=t(9662),a=t(9670),l=t(6330),c=t(1246),u=r.TypeError;e.exports=function(e,n){var t=arguments.length<2?c(e):n;if(i(t))return a(o(t,e));throw u(l(e)+" is not iterable")}},8173:(e,n,t)=>{var r=t(9662);e.exports=function(e,n){var t=e[n];return null==t?void 0:r(t)}},647:(e,n,t)=>{var r=t(1702),o=t(7908),i=Math.floor,a=r("".charAt),l=r("".replace),c=r("".slice),u=/\$([$&'`]|\d{1,2}|<[^>]*>)/g,s=/\$([$&'`]|\d{1,2})/g;e.exports=function(e,n,t,r,f,p){var d=t+e.length,h=r.length,g=s;return void 0!==f&&(f=o(f),g=u),l(p,g,(function(o,l){var u;switch(a(l,0)){case"$":return"$";case"&":return e;case"`":return c(n,0,t);case"'":return c(n,d);case"<":u=f[c(l,1,-1)];break;default:var s=+l;if(0===s)return o;if(s>h){var p=i(s/10);return 0===p?o:p<=h?void 0===r[p-1]?a(l,1):r[p-1]+a(l,1):o}u=r[s-1]}return void 0===u?"":u}))}},7854:(e,n,t)=>{var r=function(e){return e&&e.Math==Math&&e};e.exports=r("object"==typeof globalThis&&globalThis)||r("object"==typeof window&&window)||r("object"==typeof self&&self)||r("object"==typeof t.g&&t.g)||function(){return this}()||Function("return this")()},2597:(e,n,t)=>{var r=t(1702),o=t(7908),i=r({}.hasOwnProperty);e.exports=Object.hasOwn||function(e,n){return i(o(e),n)}},3501:e=>{e.exports={}},490:(e,n,t)=>{var r=t(5005);e.exports=r("document","documentElement")},4664:(e,n,t)=>{var r=t(9781),o=t(7293),i=t(317);e.exports=!r&&!o((function(){return 7!=Object.defineProperty(i("div"),"a",{get:function(){return 7}}).a}))},8361:(e,n,t)=>{var r=t(7854),o=t(1702),i=t(7293),a=t(4326),l=r.Object,c=o("".split);e.exports=i((function(){return!l("z").propertyIsEnumerable(0)}))?function(e){return"String"==a(e)?c(e,""):l(e)}:l},9587:(e,n,t)=>{var r=t(614),o=t(111),i=t(7674);e.exports=function(e,n,t){var a,l;return i&&r(a=n.constructor)&&a!==t&&o(l=a.prototype)&&l!==t.prototype&&i(e,l),e}},2788:(e,n,t)=>{var r=t(1702),o=t(614),i=t(5465),a=r(Function.toString);o(i.inspectSource)||(i.inspectSource=function(e){return a(e)}),e.exports=i.inspectSource},2423:(e,n,t)=>{var r=t(2109),o=t(1702),i=t(3501),a=t(111),l=t(2597),c=t(3070).f,u=t(8006),s=t(1156),f=t(2050),p=t(9711),d=t(6677),h=!1,g=p("meta"),v=0,A=function(e){c(e,g,{value:{objectID:"O"+v++,weakData:{}}})},b=e.exports={enable:function(){b.enable=function(){},h=!0;var e=u.f,n=o([].splice),t={};t[g]=1,e(t).length&&(u.f=function(t){for(var r=e(t),o=0,i=r.length;o{var r,o,i,a=t(8536),l=t(7854),c=t(1702),u=t(111),s=t(8880),f=t(2597),p=t(5465),d=t(6200),h=t(3501),g="Object already initialized",v=l.TypeError,A=l.WeakMap;if(a||p.state){var b=p.state||(p.state=new A),m=c(b.get),y=c(b.has),E=c(b.set);r=function(e,n){if(y(b,e))throw new v(g);return n.facade=e,E(b,e,n),n},o=function(e){return m(b,e)||{}},i=function(e){return y(b,e)}}else{var _=d("state");h[_]=!0,r=function(e,n){if(f(e,_))throw new v(g);return n.facade=e,s(e,_,n),n},o=function(e){return f(e,_)?e[_]:{}},i=function(e){return f(e,_)}}e.exports={set:r,get:o,has:i,enforce:function(e){return i(e)?o(e):r(e,{})},getterFor:function(e){return function(n){var t;if(!u(n)||(t=o(n)).type!==e)throw v("Incompatible receiver, "+e+" required");return t}}}},7659:(e,n,t)=>{var r=t(5112),o=t(7497),i=r("iterator"),a=Array.prototype;e.exports=function(e){return void 0!==e&&(o.Array===e||a[i]===e)}},3157:(e,n,t)=>{var r=t(4326);e.exports=Array.isArray||function(e){return"Array"==r(e)}},614:e=>{e.exports=function(e){return"function"==typeof e}},4411:(e,n,t)=>{var r=t(1702),o=t(7293),i=t(614),a=t(648),l=t(5005),c=t(2788),u=function(){},s=[],f=l("Reflect","construct"),p=/^\s*(?:class|function)\b/,d=r(p.exec),h=!p.exec(u),g=function(e){if(!i(e))return!1;try{return f(u,s,e),!0}catch(e){return!1}};e.exports=!f||o((function(){var e;return g(g.call)||!g(Object)||!g((function(){e=!0}))||e}))?function(e){if(!i(e))return!1;switch(a(e)){case"AsyncFunction":case"GeneratorFunction":case"AsyncGeneratorFunction":return!1}return h||!!d(p,c(e))}:g},4705:(e,n,t)=>{var r=t(7293),o=t(614),i=/#|\.prototype\./,a=function(e,n){var t=c[l(e)];return t==s||t!=u&&(o(n)?r(n):!!n)},l=a.normalize=function(e){return String(e).replace(i,".").toLowerCase()},c=a.data={},u=a.NATIVE="N",s=a.POLYFILL="P";e.exports=a},111:(e,n,t)=>{var r=t(614);e.exports=function(e){return"object"==typeof e?null!==e:r(e)}},1913:e=>{e.exports=!1},7850:(e,n,t)=>{var r=t(111),o=t(4326),i=t(5112)("match");e.exports=function(e){var n;return r(e)&&(void 0!==(n=e[i])?!!n:"RegExp"==o(e))}},2190:(e,n,t)=>{var r=t(7854),o=t(5005),i=t(614),a=t(7976),l=t(3307),c=r.Object;e.exports=l?function(e){return"symbol"==typeof e}:function(e){var n=o("Symbol");return i(n)&&a(n.prototype,c(e))}},408:(e,n,t)=>{var r=t(7854),o=t(9974),i=t(6916),a=t(9670),l=t(6330),c=t(7659),u=t(6244),s=t(7976),f=t(8554),p=t(1246),d=t(9212),h=r.TypeError,g=function(e,n){this.stopped=e,this.result=n},v=g.prototype;e.exports=function(e,n,t){var r,A,b,m,y,E,_,C=t&&t.that,w=!(!t||!t.AS_ENTRIES),x=!(!t||!t.IS_ITERATOR),k=!(!t||!t.INTERRUPTED),S=o(n,C),O=function(e){return r&&d(r,"normal",e),new g(!0,e)},B=function(e){return w?(a(e),k?S(e[0],e[1],O):S(e[0],e[1])):k?S(e,O):S(e)};if(x)r=e;else{if(!(A=p(e)))throw h(l(e)+" is not iterable");if(c(A)){for(b=0,m=u(e);m>b;b++)if((y=B(e[b]))&&s(v,y))return y;return new g(!1)}r=f(e,A)}for(E=r.next;!(_=i(E,r)).done;){try{y=B(_.value)}catch(e){d(r,"throw",e)}if("object"==typeof y&&y&&s(v,y))return y}return new g(!1)}},9212:(e,n,t)=>{var r=t(6916),o=t(9670),i=t(8173);e.exports=function(e,n,t){var a,l;o(e);try{if(!(a=i(e,"return"))){if("throw"===n)throw t;return t}a=r(a,e)}catch(e){l=!0,a=e}if("throw"===n)throw t;if(l)throw a;return o(a),t}},3383:(e,n,t)=>{"use strict";var r,o,i,a=t(7293),l=t(614),c=t(30),u=t(9518),s=t(1320),f=t(5112),p=t(1913),d=f("iterator"),h=!1;[].keys&&("next"in(i=[].keys())?(o=u(u(i)))!==Object.prototype&&(r=o):h=!0),null==r||a((function(){var e={};return r[d].call(e)!==e}))?r={}:p&&(r=c(r)),l(r[d])||s(r,d,(function(){return this})),e.exports={IteratorPrototype:r,BUGGY_SAFARI_ITERATORS:h}},7497:e=>{e.exports={}},6244:(e,n,t)=>{var r=t(7466);e.exports=function(e){return r(e.length)}},133:(e,n,t)=>{var r=t(7392),o=t(7293);e.exports=!!Object.getOwnPropertySymbols&&!o((function(){var e=Symbol();return!String(e)||!(Object(e)instanceof Symbol)||!Symbol.sham&&r&&r<41}))},8536:(e,n,t)=>{var r=t(7854),o=t(614),i=t(2788),a=r.WeakMap;e.exports=o(a)&&/native code/.test(i(a))},3929:(e,n,t)=>{var r=t(7854),o=t(7850),i=r.TypeError;e.exports=function(e){if(o(e))throw i("The method doesn't accept regular expressions");return e}},1574:(e,n,t)=>{"use strict";var r=t(9781),o=t(1702),i=t(6916),a=t(7293),l=t(1956),c=t(5181),u=t(5296),s=t(7908),f=t(8361),p=Object.assign,d=Object.defineProperty,h=o([].concat);e.exports=!p||a((function(){if(r&&1!==p({b:1},p(d({},"a",{enumerable:!0,get:function(){d(this,"b",{value:3,enumerable:!1})}}),{b:2})).b)return!0;var e={},n={},t=Symbol(),o="abcdefghijklmnopqrst";return e[t]=7,o.split("").forEach((function(e){n[e]=e})),7!=p({},e)[t]||l(p({},n)).join("")!=o}))?function(e,n){for(var t=s(e),o=arguments.length,a=1,p=c.f,d=u.f;o>a;)for(var g,v=f(arguments[a++]),A=p?h(l(v),p(v)):l(v),b=A.length,m=0;b>m;)g=A[m++],r&&!i(d,v,g)||(t[g]=v[g]);return t}:p},30:(e,n,t)=>{var r,o=t(9670),i=t(6048),a=t(748),l=t(3501),c=t(490),u=t(317),s=t(6200),f=s("IE_PROTO"),p=function(){},d=function(e){return"